improved files scanning, built navigation, further widget improvements
This commit is contained in:
		| @@ -6,6 +6,7 @@ use FML\Controls\Frame; | |||||||
| use FML\Controls\Labels\Label_Button; | use FML\Controls\Labels\Label_Button; | ||||||
| use FML\Controls\Labels\Label_Text; | use FML\Controls\Labels\Label_Text; | ||||||
| use FML\Controls\Quads\Quad_BgsPlayerCard; | use FML\Controls\Quads\Quad_BgsPlayerCard; | ||||||
|  | use FML\Controls\Quads\Quad_Icons64x64_1; | ||||||
| use FML\ManiaLink; | use FML\ManiaLink; | ||||||
| use FML\Script\Features\Paging; | use FML\Script\Features\Paging; | ||||||
| use ManiaControl\ManiaControl; | use ManiaControl\ManiaControl; | ||||||
| @@ -25,9 +26,13 @@ class DirectoryBrowser implements ManialinkPageAnswerListener { | |||||||
| 	 * Constants | 	 * Constants | ||||||
| 	 */ | 	 */ | ||||||
| 	const ACTION_SHOW          = 'Maps.DirectoryBrowser.Show'; | 	const ACTION_SHOW          = 'Maps.DirectoryBrowser.Show'; | ||||||
|  | 	const ACTION_OPEN_FOLDER   = 'Maps.DirectoryBrowser.OpenFolder.'; | ||||||
|  | 	const ACTION_NAVIGATE_UP   = 'Maps.DirectoryBrowser.NavigateUp'; | ||||||
|  | 	const ACTION_NAVIGATE_ROOT = 'Maps.DirectoryBrowser.NavigateRoot'; | ||||||
| 	const ACTION_ADD_FILE      = 'Maps.DirectoryBrowser.AddFile.'; | 	const ACTION_ADD_FILE      = 'Maps.DirectoryBrowser.AddFile.'; | ||||||
| 	const ACTION_ERASE_FILE    = 'Maps.DirectoryBrowser.EraseFile'; | 	const ACTION_ERASE_FILE    = 'Maps.DirectoryBrowser.EraseFile'; | ||||||
| 	const WIDGET_NAME          = 'Maps.DirectoryBrowser.Widget'; | 	const WIDGET_NAME          = 'Maps.DirectoryBrowser.Widget'; | ||||||
|  | 	const CACHE_FOLDER_PATH    = 'FolderPath'; | ||||||
|  |  | ||||||
| 	/* | 	/* | ||||||
| 	 * Private properties | 	 * Private properties | ||||||
| @@ -44,10 +49,22 @@ class DirectoryBrowser implements ManialinkPageAnswerListener { | |||||||
|  |  | ||||||
| 		// Register for ManiaLink Actions | 		// Register for ManiaLink Actions | ||||||
| 		$this->maniaControl->manialinkManager->registerManialinkPageAnswerListener(self::ACTION_SHOW, $this, 'handleActionShow'); | 		$this->maniaControl->manialinkManager->registerManialinkPageAnswerListener(self::ACTION_SHOW, $this, 'handleActionShow'); | ||||||
|  | 		$this->maniaControl->manialinkManager->registerManialinkPageAnswerListener(self::ACTION_NAVIGATE_UP, $this, 'handleNavigateUp'); | ||||||
|  | 		$this->maniaControl->manialinkManager->registerManialinkPageAnswerListener(self::ACTION_NAVIGATE_ROOT, $this, 'handleNavigateRoot'); | ||||||
|  | 		$this->maniaControl->manialinkManager->registerManialinkPageAnswerRegexListener($this->buildOpenFolderActionRegex(), $this, 'handleOpenFolder'); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Handle 'Show' Page Action | 	 * Build the regex to register for 'OpenFolder' action | ||||||
|  | 	 * | ||||||
|  | 	 * @return string | ||||||
|  | 	 */ | ||||||
|  | 	private function buildOpenFolderActionRegex() { | ||||||
|  | 		return '/' . self::ACTION_OPEN_FOLDER . '*/'; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * Handle 'Show' action | ||||||
| 	 * | 	 * | ||||||
| 	 * @param array  $actionCallback | 	 * @param array  $actionCallback | ||||||
| 	 * @param Player $player | 	 * @param Player $player | ||||||
| @@ -60,8 +77,23 @@ class DirectoryBrowser implements ManialinkPageAnswerListener { | |||||||
| 	 * Build and show the Browser ManiaLink to the given Player | 	 * Build and show the Browser ManiaLink to the given Player | ||||||
| 	 * | 	 * | ||||||
| 	 * @param Player $player | 	 * @param Player $player | ||||||
|  | 	 * @param mixed  $nextFolder | ||||||
| 	 */ | 	 */ | ||||||
| 	public function showManiaLink(Player $player) { | 	public function showManiaLink(Player $player, $nextFolder = null) { | ||||||
|  | 		$oldFolderPath = $player->getCache($this, self::CACHE_FOLDER_PATH); | ||||||
|  | 		if (!$oldFolderPath) { | ||||||
|  | 			$oldFolderPath = $this->maniaControl->server->directory->getMapsFolder(); | ||||||
|  | 		} | ||||||
|  | 		$folderPath = $oldFolderPath; | ||||||
|  | 		if (is_string($nextFolder)) { | ||||||
|  | 			$newFolderPath = $oldFolderPath . $nextFolder . DIRECTORY_SEPARATOR; | ||||||
|  | 			$realPath      = realpath($newFolderPath); | ||||||
|  | 			if ($realPath) { | ||||||
|  | 				$folderPath = $realPath . DIRECTORY_SEPARATOR; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		$player->setCache($this, self::CACHE_FOLDER_PATH, $folderPath); | ||||||
|  |  | ||||||
| 		$maniaLink = new ManiaLink(ManialinkManager::MAIN_MLID); | 		$maniaLink = new ManiaLink(ManialinkManager::MAIN_MLID); | ||||||
| 		$script    = $maniaLink->getScript(); | 		$script    = $maniaLink->getScript(); | ||||||
| 		$paging    = new Paging(); | 		$paging    = new Paging(); | ||||||
| @@ -69,15 +101,42 @@ class DirectoryBrowser implements ManialinkPageAnswerListener { | |||||||
| 		$frame = $this->maniaControl->manialinkManager->styleManager->getDefaultListFrame($script, $paging); | 		$frame = $this->maniaControl->manialinkManager->styleManager->getDefaultListFrame($script, $paging); | ||||||
| 		$maniaLink->add($frame); | 		$maniaLink->add($frame); | ||||||
|  |  | ||||||
| 		$mapFiles = $this->getFilteredMapFiles(); |  | ||||||
|  |  | ||||||
| 		$width     = $this->maniaControl->manialinkManager->styleManager->getListWidgetsWidth(); | 		$width     = $this->maniaControl->manialinkManager->styleManager->getListWidgetsWidth(); | ||||||
| 		$height    = $this->maniaControl->manialinkManager->styleManager->getListWidgetsHeight(); | 		$height    = $this->maniaControl->manialinkManager->styleManager->getListWidgetsHeight(); | ||||||
| 		$index     = 0; | 		$index     = 0; | ||||||
| 		$posY      = $height / 2 - 10; | 		$posY      = $height / 2 - 10; | ||||||
| 		$pageFrame = null; | 		$pageFrame = null; | ||||||
|  |  | ||||||
| 		foreach ($mapFiles as $fileName) { | 		$navigateRootQuad = new Quad_Icons64x64_1(); | ||||||
|  | 		$frame->add($navigateRootQuad); | ||||||
|  | 		$navigateRootQuad->setPosition($width * -0.47, $height * 0.45) | ||||||
|  | 		                 ->setSize(4, 4) | ||||||
|  | 		                 ->setSubStyle($navigateRootQuad::SUBSTYLE_ToolRoot) | ||||||
|  | 		                 ->setAction(self::ACTION_NAVIGATE_ROOT); | ||||||
|  |  | ||||||
|  | 		$navigateUpQuad = new Quad_Icons64x64_1(); | ||||||
|  | 		$frame->add($navigateUpQuad); | ||||||
|  | 		$navigateUpQuad->setPosition($width * -0.44, $height * 0.45) | ||||||
|  | 		               ->setSize(4, 4) | ||||||
|  | 		               ->setSubStyle($navigateUpQuad::SUBSTYLE_ToolUp) | ||||||
|  | 		               ->setAction(self::ACTION_NAVIGATE_UP); | ||||||
|  |  | ||||||
|  | 		$directoryLabel = new Label_Text(); | ||||||
|  | 		$frame->add($directoryLabel); | ||||||
|  | 		$dataFolder    = $this->maniaControl->server->directory->getGameDataFolder(); | ||||||
|  | 		$directoryText = substr($folderPath, strlen($dataFolder)); | ||||||
|  | 		$directoryLabel->setPosition($width * -0.41, $height * 0.45) | ||||||
|  | 		               ->setSize($width * 0.85, 4) | ||||||
|  | 		               ->setHAlign($directoryLabel::LEFT) | ||||||
|  | 		               ->setText($directoryText) | ||||||
|  | 		               ->setTextSize(2); | ||||||
|  |  | ||||||
|  | 		$mapFiles = $this->scanMapFiles($folderPath); | ||||||
|  |  | ||||||
|  | 		if (is_array($mapFiles)) { | ||||||
|  | 			foreach ($mapFiles as $filePath => $fileName) { | ||||||
|  | 				$shortFilePath = substr($filePath, strlen($folderPath)); | ||||||
|  |  | ||||||
| 				if ($index % 15 === 0) { | 				if ($index % 15 === 0) { | ||||||
| 					// New Page | 					// New Page | ||||||
| 					$pageFrame = new Frame(); | 					$pageFrame = new Frame(); | ||||||
| @@ -89,80 +148,67 @@ class DirectoryBrowser implements ManialinkPageAnswerListener { | |||||||
| 				// Map Frame | 				// Map Frame | ||||||
| 				$mapFrame = new Frame(); | 				$mapFrame = new Frame(); | ||||||
| 				$pageFrame->add($mapFrame); | 				$pageFrame->add($mapFrame); | ||||||
| 			$mapFrame->setPosition(0, $posY, 0.1); | 				$mapFrame->setY($posY); | ||||||
|  |  | ||||||
| 				if ($index % 2 !== 0) { | 				if ($index % 2 !== 0) { | ||||||
| 					// Striped background line | 					// Striped background line | ||||||
| 					$lineQuad = new Quad_BgsPlayerCard(); | 					$lineQuad = new Quad_BgsPlayerCard(); | ||||||
| 					$mapFrame->add($lineQuad); | 					$mapFrame->add($lineQuad); | ||||||
| 				$lineQuad->setSize($width, 4); | 					$lineQuad->setSize($width, 4) | ||||||
| 				$lineQuad->setSubStyle($lineQuad::SUBSTYLE_BgPlayerCardBig); | 					         ->setSubStyle($lineQuad::SUBSTYLE_BgPlayerCardBig); | ||||||
| 				$lineQuad->setZ(0.001); |  | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
| 				// File name Label | 				// File name Label | ||||||
| 				$nameLabel = new Label_Text(); | 				$nameLabel = new Label_Text(); | ||||||
| 				$mapFrame->add($nameLabel); | 				$mapFrame->add($nameLabel); | ||||||
| 			$nameLabel->setX($width * -0.2); | 				$nameLabel->setX($width * -0.48) | ||||||
| 			$nameLabel->setText($fileName); | 				          ->setSize($width * 0.8, 4) | ||||||
|  | 				          ->setHAlign($nameLabel::LEFT) | ||||||
|  | 				          ->setTextSize(1) | ||||||
|  | 				          ->setText($fileName) | ||||||
|  | 				          ->setAreaColor('f00') | ||||||
|  | 				          ->setAreaFocusColor('0f0'); | ||||||
|  |  | ||||||
|  | 				if (is_dir($filePath)) { | ||||||
|  | 					// Folder | ||||||
|  | 					$folderAction = self::ACTION_OPEN_FOLDER . substr($shortFilePath, 0, -1); | ||||||
|  | 					$nameLabel->setAction($folderAction); | ||||||
|  | 				} else { | ||||||
|  | 					// File | ||||||
|  |  | ||||||
| 					if ($this->maniaControl->authenticationManager->checkPermission($player, MapManager::SETTING_PERMISSION_ADD_MAP)) { | 					if ($this->maniaControl->authenticationManager->checkPermission($player, MapManager::SETTING_PERMISSION_ADD_MAP)) { | ||||||
| 						// Add file button | 						// Add file button | ||||||
| 						$addButton = new Label_Button(); | 						$addButton = new Label_Button(); | ||||||
| 						$mapFrame->add($addButton); | 						$mapFrame->add($addButton); | ||||||
| 				$addButton->setPosition($width / 2 - 9, 0, 0.2); | 						$addButton->setPosition($width / 2 - 9, 0, 0.2) | ||||||
| 				$addButton->setSize(3, 3); | 						          ->setSize(3, 3) | ||||||
| 				$addButton->setTextSize(2); | 						          ->setTextSize(2) | ||||||
| 				$addButton->setText('Add'); | 						          ->setText('Add') | ||||||
| 				$addButton->setAction(self::ACTION_ADD_FILE); | 						          ->setAction(self::ACTION_ADD_FILE); | ||||||
| 					} | 					} | ||||||
|  |  | ||||||
| 					if ($this->maniaControl->authenticationManager->checkPermission($player, MapManager::SETTING_PERMISSION_REMOVE_MAP)) { | 					if ($this->maniaControl->authenticationManager->checkPermission($player, MapManager::SETTING_PERMISSION_REMOVE_MAP)) { | ||||||
| 						// Erase file button | 						// Erase file button | ||||||
| 						$eraseButton = new Label_Button(); | 						$eraseButton = new Label_Button(); | ||||||
| 						$mapFrame->add($eraseButton); | 						$mapFrame->add($eraseButton); | ||||||
| 				$eraseButton->setPosition($width / 2 - 9, 0, 0.2); | 						$eraseButton->setPosition($width / 2 - 9, 0, 0.2) | ||||||
| 				$eraseButton->setSize(3, 3); | 						            ->setSize(3, 3) | ||||||
| 				$eraseButton->setTextSize(2); | 						            ->setTextSize(2) | ||||||
| 				$eraseButton->setText('Add'); | 						            ->setText('Erase') | ||||||
| 				$eraseButton->setAction(self::ACTION_ERASE_FILE); | 						            ->setAction(self::ACTION_ERASE_FILE); | ||||||
|  | 					} | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
| 				$posY -= 4; | 				$posY -= 4; | ||||||
| 				$index++; | 				$index++; | ||||||
| 			} | 			} | ||||||
|  | 		} else { | ||||||
|  | 			// TODO: show error label | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		$this->maniaControl->manialinkManager->displayWidget($maniaLink, $player, self::WIDGET_NAME); | 		$this->maniaControl->manialinkManager->displayWidget($maniaLink, $player, self::WIDGET_NAME); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Get the list of not yet added Map files |  | ||||||
| 	 * |  | ||||||
| 	 * @return array|bool |  | ||||||
| 	 */ |  | ||||||
| 	protected function getFilteredMapFiles() { |  | ||||||
| 		$mapFiles = $this->getMapFiles(); |  | ||||||
| 		if (!is_array($mapFiles)) { |  | ||||||
| 			return false; |  | ||||||
| 		} |  | ||||||
| 		$filteredMapFiles = array(); |  | ||||||
| 		foreach ($mapFiles as $mapFile) { |  | ||||||
| 			// TODO: filter already added maps |  | ||||||
| 			array_push($filteredMapFiles, $mapFile); |  | ||||||
| 		} |  | ||||||
| 		return $filteredMapFiles; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * Get the list of Map files |  | ||||||
| 	 * |  | ||||||
| 	 * @return array|bool |  | ||||||
| 	 */ |  | ||||||
| 	protected function getMapFiles() { |  | ||||||
| 		$mapsDirectory = $this->maniaControl->server->directory->getMapsFolder(); |  | ||||||
| 		return $this->scanMapFiles($mapsDirectory); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Scan the given directory for Map files | 	 * Scan the given directory for Map files | ||||||
| 	 * | 	 * | ||||||
| @@ -180,15 +226,15 @@ class DirectoryBrowser implements ManialinkPageAnswerListener { | |||||||
| 				continue; | 				continue; | ||||||
| 			} | 			} | ||||||
| 			$fullFileName = $directory . $fileName; | 			$fullFileName = $directory . $fileName; | ||||||
| 			if (is_dir($fullFileName)) { | 			if (!is_readable($fullFileName)) { | ||||||
| 				$subDirectory = $fullFileName . DIRECTORY_SEPARATOR; | 				continue; | ||||||
| 				$subMapFiles  = $this->scanMapFiles($subDirectory); |  | ||||||
| 				if (is_array($subMapFiles)) { |  | ||||||
| 					$mapFiles = array_merge($mapFiles, $subMapFiles); |  | ||||||
| 			} | 			} | ||||||
|  | 			if (is_dir($fullFileName)) { | ||||||
|  | 				$mapFiles[$fullFileName . DIRECTORY_SEPARATOR] = $fileName . DIRECTORY_SEPARATOR; | ||||||
|  | 				continue; | ||||||
| 			} else { | 			} else { | ||||||
| 				if ($this->isMapFileName($fileName)) { | 				if ($this->isMapFileName($fileName)) { | ||||||
| 					array_push($mapFiles, $fullFileName); | 					$mapFiles[$fullFileName] = $fileName; | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| @@ -206,4 +252,37 @@ class DirectoryBrowser implements ManialinkPageAnswerListener { | |||||||
| 		$fileNameEnding    = strtolower(substr($fileName, -strlen($mapFileNameEnding))); | 		$fileNameEnding    = strtolower(substr($fileName, -strlen($mapFileNameEnding))); | ||||||
| 		return ($fileNameEnding === $mapFileNameEnding); | 		return ($fileNameEnding === $mapFileNameEnding); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * Handle 'NavigateRoot' action | ||||||
|  | 	 * | ||||||
|  | 	 * @param array  $actionCallback | ||||||
|  | 	 * @param Player $player | ||||||
|  | 	 */ | ||||||
|  | 	public function handleNavigateRoot(array $actionCallback, Player $player) { | ||||||
|  | 		$player->destroyCache($this, self::CACHE_FOLDER_PATH); | ||||||
|  | 		$this->showManiaLink($player); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * Handle 'NavigateUp' action | ||||||
|  | 	 * | ||||||
|  | 	 * @param array  $actionCallback | ||||||
|  | 	 * @param Player $player | ||||||
|  | 	 */ | ||||||
|  | 	public function handleNavigateUp(array $actionCallback, Player $player) { | ||||||
|  | 		$this->showManiaLink($player, '..'); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * Handle 'OpenFolder' Page Action | ||||||
|  | 	 * | ||||||
|  | 	 * @param array  $actionCallback | ||||||
|  | 	 * @param Player $player | ||||||
|  | 	 */ | ||||||
|  | 	public function handleOpenFolder(array $actionCallback, Player $player) { | ||||||
|  | 		$actionName = $actionCallback[1][2]; | ||||||
|  | 		$folderName = substr($actionName, strlen(self::ACTION_OPEN_FOLDER)); | ||||||
|  | 		$this->showManiaLink($player, $folderName); | ||||||
|  | 	} | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user