From 8b83825344571ad2a9311e028b6e15413fdfdad5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steffen=20Schro=CC=88der?= Date: Mon, 28 Apr 2014 16:59:55 +0200 Subject: [PATCH] added paging chunks to maplist --- .../core/Libs/FML/Script/Features/Paging.php | 75 +++++++++++-------- application/core/Libs/FML/Script/Script.php | 4 +- .../core/Libs/FML/Script/ScriptFunction.php | 9 --- application/core/Maps/MapList.php | 70 +++++++++++------ application/core/Maps/MapManager.php | 19 ++++- 5 files changed, 109 insertions(+), 68 deletions(-) diff --git a/application/core/Libs/FML/Script/Features/Paging.php b/application/core/Libs/FML/Script/Features/Paging.php index 11a2802d..4d06329e 100644 --- a/application/core/Libs/FML/Script/Features/Paging.php +++ b/application/core/Libs/FML/Script/Features/Paging.php @@ -11,7 +11,7 @@ use FML\Script\ScriptInclude; /** * Script Feature realising a Mechanism for browsing through Pages - * + * * @author steeffeen * @copyright FancyManiaLinks Copyright © 2014 Steffen Schröder * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 @@ -29,7 +29,7 @@ class Paging extends ScriptFeature { protected $pages = array(); protected $buttons = array(); protected $label = null; - protected $customMinPageNumber = null; + protected $startPageNumber = null; protected $customMaxPageNumber = null; protected $previousChunkAction = null; protected $nextChunkAction = null; @@ -37,7 +37,7 @@ class Paging extends ScriptFeature { /** * Construct a new Paging Script Feature - * + * * @param Label $label (optional) Page Number Label */ public function __construct(Label $label = null) { @@ -48,7 +48,7 @@ class Paging extends ScriptFeature { /** * Add a new Page Control - * + * * @param Control $pageControl Page Control * @param string $pageNumber (optional) Page Number * @return \FML\Script\Features\Paging @@ -64,7 +64,7 @@ class Paging extends ScriptFeature { /** * Append a Page - * + * * @param PagingPage $page Paging Page * @return \FML\Script\Features\Paging */ @@ -75,7 +75,7 @@ class Paging extends ScriptFeature { /** * Add a new Button to browse through the Pages - * + * * @param Control $buttonControl Button used for Browsing * @param int $browseAction (optional) Number of browsed Pages per Click * @return \FML\Script\Features\Paging @@ -97,7 +97,7 @@ class Paging extends ScriptFeature { /** * Append a Button to browse through Pages - * + * * @param PagingButton $button Paging Button * @return \FML\Script\Features\Paging */ @@ -108,7 +108,7 @@ class Paging extends ScriptFeature { /** * Set the Label showing the Page Number - * + * * @param Label $label Page Number Label * @return \FML\Script\Features\Paging */ @@ -119,19 +119,18 @@ class Paging extends ScriptFeature { } /** - * Set a custom Minimum Page Number for using Chunks - * - * @param int $minPageNumber Custom Minimum Page Number + * Set the Start Page Number + * + * @param int $startPageNumber Page Number to start with * @return \FML\Script\Features\Paging */ - public function setCustomMinPageNumber($minPageNumber) { - $this->customMinPageNumber = (int) $minPageNumber; - return $this; + public function setStartPageNumber($startPageNumber) { + $this->startPageNumber = (int) $startPageNumber; } /** * Set a custom Maximum Page Number for using Chunks - * + * * @param int $maxPageNumber Custom Maximum Page Number * @return \FML\Script\Features\Paging */ @@ -142,7 +141,7 @@ class Paging extends ScriptFeature { /** * Set the Action triggered when the previous Chunk is needed - * + * * @param string $previousChunkAction Triggered Action * @return \FML\Script\Features\Paging */ @@ -153,7 +152,7 @@ class Paging extends ScriptFeature { /** * Set the Action triggered when the next Chunk is needed - * + * * @param string $nextChunkAction Triggered Action * @return \FML\Script\Features\Paging */ @@ -162,9 +161,21 @@ class Paging extends ScriptFeature { return $this; } + /** + * Set the Actions triggered when another Chunk is needed + * + * @param string $chunkAction Triggered Action + * @return \FML\Script\Features\Paging + */ + public function setChunkActions($chunkAction) { + $this->setNextChunkAction($chunkAction); + $this->setPreviousChunkAction($chunkAction); + return $this; + } + /** * Set if the Chunk Action should get the needed Page Number appended - * + * * @param bool $appendPageNumber Whether to append the needed Page Number * @return \FML\Script\Features\Paging * @@ -187,19 +198,15 @@ class Paging extends ScriptFeature { $currentPageVariable = self::VAR_CURRENT_PAGE; $updatePageFunction = self::FUNCTION_UPDATE_CURRENT_PAGE; - $minPage = $this->getMinPage(); - $startPageNumber = $minPage->getPageNumber(); - $minPageNumber = $startPageNumber; - if (is_int($this->customMinPageNumber)) { - $minPageNumber = $this->customMinPageNumber; - } + $minPageNumber = 1; + $startPageNumber = (is_int($this->startPageNumber) ? $this->startPageNumber : $minPageNumber); $maxPage = $this->getMaxPage(); - $maxPageNumber = $maxPage->getPageNumber(); - if (is_int($this->customMaxPageNumber)) { - $maxPageNumber = $this->customMaxPageNumber; + $maxPageNumber = $this->customMaxPageNumber; + if (!is_int($maxPageNumber)) { + $maxPageNumber = $maxPage->getPageNumber(); } - $pagingId = $minPage->getControl()->getId(true); + $pagingId = $maxPage->getControl()->getId(true); $pageLabelId = ''; if ($this->label) { $pageLabelId = $this->label->getId(true); @@ -247,6 +254,7 @@ Void {$updatePageFunction}(Text _PagingId, Text _PageLabelId, Integer _BrowseAct PageFound = True; } } + log(Now^PageFound^CurrentPage^_Pages); if (!PageFound && _BrowseAction != 0) { declare Text ChunkAction; if (_BrowseAction < 0) { @@ -257,6 +265,7 @@ Void {$updatePageFunction}(Text _PagingId, Text _PageLabelId, Integer _BrowseAct if (_ChunkActionAppendPageNumber) { ChunkAction ^= CurrentPage; } + log(Now^ChunkAction); TriggerPageAction(ChunkAction); } if (_PageLabelId == \"\") return; @@ -267,10 +276,10 @@ Void {$updatePageFunction}(Text _PagingId, Text _PageLabelId, Integer _BrowseAct $script->addScriptFunction($updatePageFunction, $functionText); return $this; } - + /** * Get the minimum Page - * + * * @return \FML\Script\Features\PagingPage */ protected function getMinPage() { @@ -288,7 +297,7 @@ Void {$updatePageFunction}(Text _PagingId, Text _PageLabelId, Integer _BrowseAct /** * Get the maximum Page - * + * * @return \FML\Script\Features\PagingPage */ protected function getMaxPage() { @@ -306,7 +315,7 @@ Void {$updatePageFunction}(Text _PagingId, Text _PageLabelId, Integer _BrowseAct /** * Build the Array Text for the Pages - * + * * @return string */ protected function getPagesArrayText() { @@ -319,7 +328,7 @@ Void {$updatePageFunction}(Text _PagingId, Text _PageLabelId, Integer _BrowseAct /** * Build the Array Text for the Page Buttons - * + * * @return string */ protected function getPageButtonsArrayText() { diff --git a/application/core/Libs/FML/Script/Script.php b/application/core/Libs/FML/Script/Script.php index 0c0e055a..2ca8b878 100644 --- a/application/core/Libs/FML/Script/Script.php +++ b/application/core/Libs/FML/Script/Script.php @@ -81,7 +81,9 @@ class Script { else { $scriptFunction = new ScriptFunction($name, $text); } - $this->functions[$scriptFunction->getName()] = $scriptFunction; + if (!in_array($scriptFunction, $this->functions)) { + array_push($this->functions, $scriptFunction); + } return $this; } diff --git a/application/core/Libs/FML/Script/ScriptFunction.php b/application/core/Libs/FML/Script/ScriptFunction.php index b3217ceb..19eeccbc 100644 --- a/application/core/Libs/FML/Script/ScriptFunction.php +++ b/application/core/Libs/FML/Script/ScriptFunction.php @@ -38,15 +38,6 @@ class ScriptFunction { return $this; } - /** - * Get the Name - * - * @return string - */ - public function getName() { - return $this->name; - } - /** * Set the Text * diff --git a/application/core/Maps/MapList.php b/application/core/Maps/MapList.php index 7aac19c6..61a993df 100644 --- a/application/core/Maps/MapList.php +++ b/application/core/Maps/MapList.php @@ -28,7 +28,7 @@ use MCTeam\KarmaPlugin; /** * MapList Widget Class - * + * * @author steeffeen & kremsy * @copyright ManiaControl Copyright © 2014 ManiaControl Team * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 @@ -45,7 +45,9 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { const ACTION_UNQUEUE_MAP = 'MapList.UnQueueMap'; const ACTION_CHECK_UPDATE = 'MapList.CheckUpdate'; const ACTION_CLEAR_MAPQUEUE = 'MapList.ClearMapQueue'; + const ACTION_PAGING_CHUNKS = 'MapList.PagingChunk.'; const MAX_MAPS_PER_PAGE = 15; + const MAX_PAGES_PER_CHUNK = 2; const DEFAULT_KARMA_PLUGIN = 'MCTeam\KarmaPlugin'; const DEFAULT_CUSTOM_VOTE_PLUGIN = 'CustomVotesPlugin'; @@ -58,7 +60,7 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { /** * Create a new MapList Instance - * + * * @param ManiaControl $maniaControl */ public function __construct(ManiaControl $maniaControl) { @@ -79,7 +81,7 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { /** * Clears the Map Queue - * + * * @param array $chatCallback * @param Player $player */ @@ -90,7 +92,7 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { /** * Check for Map Updates - * + * * @param array $chatCallback * @param Player $player */ @@ -103,11 +105,14 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { } /** - * Displayes a MapList on the screen - * + * Display a MapList on the Screen + * * @param Player $player + * @param array $maps + * @param int $chunk + * @param int $startPage */ - public function showMapList(Player $player, $maps = null) { + public function showMapList(Player $player, $maps = null, $chunk = 0, $startPage = null) { $width = $this->maniaControl->manialinkManager->styleManager->getListWidgetsWidth(); $height = $this->maniaControl->manialinkManager->styleManager->getListWidgetsHeight(); @@ -115,16 +120,15 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $queueBuffer = $this->maniaControl->mapManager->mapQueue->getQueueBuffer(); // Get Maps - if (is_null($maps) && $maps != 'redirect') { - $mapList = $this->maniaControl->mapManager->getMaps(); + $mapList = array(); + if (is_array($maps)) { + $mapList = $maps; } - else { - if (array_key_exists($player->login, $this->mapsInListShown) && $maps == 'redirect') { - $mapList = $this->mapsInListShown[$player->login]; - } - else { - $mapList = $maps; - } + else if ($maps !== 'redirect') { + $mapList = $this->maniaControl->mapManager->getMaps($chunk * self::MAX_PAGES_PER_CHUNK * self::MAX_MAPS_PER_PAGE, self::MAX_PAGES_PER_CHUNK * self::MAX_MAPS_PER_PAGE); + } + else if (array_key_exists($player->login, $this->mapsInListShown)) { + $mapList = $this->mapsInListShown[$player->login]; } $this->mapsInListShown[$player->login] = $mapList; @@ -134,6 +138,9 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $script = $maniaLink->getScript(); $paging = new Paging(); $script->addFeature($paging); + $paging->setCustomMaxPageNumber($this->maniaControl->mapManager->getMapsCount() / self::MAX_MAPS_PER_PAGE); + $paging->setChunkActionAppendsPageNumber(true); + $paging->setChunkActions(self::ACTION_PAGING_CHUNKS); // Main frame $frame = $this->maniaControl->manialinkManager->styleManager->getDefaultListFrame($script, $paging); @@ -204,8 +211,12 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { * @var KarmaPlugin $karmaPlugin */ $karmaPlugin = $this->maniaControl->pluginManager->getPlugin(self::DEFAULT_KARMA_PLUGIN); + + $pageNumber = 1 + $chunk * self::MAX_PAGES_PER_CHUNK; + $startPageNumber = (is_int($startPage) ? $startPage : $pageNumber); + $paging->setStartPageNumber($startPageNumber); - $id = 1; + $id = 1 + $chunk * self::MAX_PAGES_PER_CHUNK * self::MAX_MAPS_PER_PAGE; $y = $height / 2 - 10; $pageFrames = array(); /** @@ -228,7 +239,8 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { array_push($pageFrames, $pageFrame); $y = $height / 2 - 10; - $paging->addPage($pageFrame); + $paging->addPage($pageFrame, $pageNumber); + $pageNumber++; } // Map Frame @@ -293,6 +305,7 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $labels = $this->maniaControl->manialinkManager->labelLine($mapFrame, $array); if (isset($labels[3])) { /** + * * @var Label $label */ $label = $labels[3]; @@ -440,7 +453,7 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { /** * Builds the confirmation frame - * + * * @param ManiaLink $maniaLink * @param $y * @param $id @@ -498,7 +511,7 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { /** * Unset the player if he opened another Main Widget - * + * * @param Player $player * @param $openedWidget */ @@ -511,7 +524,7 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { /** * Closes the widget - * + * * @param \ManiaControl\Players\Player $player */ public function closeWidget(Player $player) { @@ -520,7 +533,7 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { /** * Closes the widget - * + * * @param Player $player */ public function playerCloseWidget(Player $player) { @@ -530,12 +543,13 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { /** * Handle ManialinkPageAnswer Callback - * + * * @param array $callback */ public function handleManialinkPageAnswer(array $callback) { $actionId = $callback[1][2]; $actionArray = explode('.', $actionId); + if (count($actionArray) <= 2) { return; } @@ -575,6 +589,7 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { break; case self::ACTION_START_SWITCH_VOTE: /** + * * @var $votesPlugin CustomVotesPlugin */ $votesPlugin = $this->maniaControl->pluginManager->getPlugin(self::DEFAULT_CUSTOM_VOTE_PLUGIN); @@ -584,6 +599,7 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $message = '$<' . $player->nickname . '$>$s started a vote to switch to $<' . $map->name . '$>!'; /** + * * @var Map $map */ $votesPlugin->defineVote('switchmap', "Goto " . $map->name, true, $message); @@ -613,6 +629,14 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $this->maniaControl->mapManager->mapQueue->removeFromMapQueue($player, $actionArray[2]); $this->showMapList($player, 'redirect'); break; + default: + if (substr($actionId, 0, strlen(self::ACTION_PAGING_CHUNKS)) === self::ACTION_PAGING_CHUNKS) { + // Paging chunks + $neededPage = (int) substr($actionId, strlen(self::ACTION_PAGING_CHUNKS)); + $chunk = (int) ($neededPage / self::MAX_PAGES_PER_CHUNK - 0.5); + $this->showMapList($player, null, $chunk, $neededPage); + } + break; } } diff --git a/application/core/Maps/MapManager.php b/application/core/Maps/MapManager.php index f3fb6b9c..33c7cc79 100644 --- a/application/core/Maps/MapManager.php +++ b/application/core/Maps/MapManager.php @@ -562,8 +562,23 @@ class MapManager implements CallbackListener { * * @return array */ - public function getMaps() { - return array_values($this->maps); + public function getMaps($offset = null, $length = null) { + if ($offset === null) { + return array_values($this->maps); + } + if ($length === null) { + return array_slice($this->maps, $offset); + } + return array_slice($this->maps, $offset, $length); + } + + /** + * Get the Number of Maps + * + * @return int + */ + public function getMapsCount() { + return count($this->maps); } /**