Add Toggle Interface feature
This commit is contained in:
		@@ -26,6 +26,7 @@ use ManiaControl\Files\FileUtil;
 | 
			
		||||
use ManiaControl\General\UsageInformationAble;
 | 
			
		||||
use ManiaControl\General\UsageInformationTrait;
 | 
			
		||||
use ManiaControl\Manialinks\ManialinkManager;
 | 
			
		||||
use ManiaControl\Manialinks\ToggleInterfaceManager;
 | 
			
		||||
use ManiaControl\Maps\MapManager;
 | 
			
		||||
use ManiaControl\Players\Player;
 | 
			
		||||
use ManiaControl\Players\PlayerManager;
 | 
			
		||||
@@ -127,6 +128,10 @@ class ManiaControl implements CallbackListener, CommandListener, TimerListener,
 | 
			
		||||
	 * @see getManialinkManager
 | 
			
		||||
	 */
 | 
			
		||||
	private $manialinkManager = null;
 | 
			
		||||
	/** @var ToggleInterfaceManager $toggleInterfaceManager
 | 
			
		||||
	 * @see getToggleInterfaceManager
 | 
			
		||||
	 */
 | 
			
		||||
	private $toggleInterfaceManager = null;
 | 
			
		||||
	/** @var MapManager $mapManager
 | 
			
		||||
	 * @see getMapManager()
 | 
			
		||||
	 */
 | 
			
		||||
@@ -206,6 +211,7 @@ class ManiaControl implements CallbackListener, CommandListener, TimerListener,
 | 
			
		||||
		$this->settingManager         = new SettingManager($this);
 | 
			
		||||
		$this->statisticManager       = new StatisticManager($this);
 | 
			
		||||
		$this->manialinkManager       = new ManialinkManager($this);
 | 
			
		||||
		$this->toggleInterfaceManager = new ToggleInterfaceManager($this);
 | 
			
		||||
		$this->actionsMenu            = new ActionsMenu($this);
 | 
			
		||||
		$this->chat                   = new Chat($this);
 | 
			
		||||
		$this->commandManager         = new CommandManager($this);
 | 
			
		||||
@@ -455,6 +461,15 @@ class ManiaControl implements CallbackListener, CommandListener, TimerListener,
 | 
			
		||||
		return $this->manialinkManager;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Return the ToggleInterface manager
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return ToggleInterfaceManager
 | 
			
		||||
	 */
 | 
			
		||||
	public function getToggleInterfaceManager() {
 | 
			
		||||
		return $this->toggleInterfaceManager;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Return the map manager
 | 
			
		||||
	 *
 | 
			
		||||
 
 | 
			
		||||
@@ -248,13 +248,12 @@ class ManialinkManager implements ManialinkPageAnswerListener, CallbackListener,
 | 
			
		||||
	 * @param bool   $hideOnClick
 | 
			
		||||
	 * @return bool
 | 
			
		||||
	 */
 | 
			
		||||
	public function sendManialink($manialinkText, $logins = null, $timeout = 0, $hideOnClick = false) {
 | 
			
		||||
	public function sendManialink($manialinkText, $logins = null, $timeout = 0, $hideOnClick = false, $ToggleUIFeature = true) {
 | 
			
		||||
		//Add Toggle Feature
 | 
			
		||||
		if($manialinkText instanceof ManiaLink){
 | 
			
		||||
			/*$toggleInterfaceF9 = new \FML\Script\Features\ToggleInterface("F9");
 | 
			
		||||
			$manialinkText->getScript()
 | 
			
		||||
			          ->addFeature($toggleInterfaceF9); (not working yet) */
 | 
			
		||||
		}
 | 
			
		||||
		if($ToggleUIFeature && $manialinkText instanceof ManiaLink){
 | 
			
		||||
			$toggleInterface = new \FML\Script\Features\ToggleInterface;
 | 
			
		||||
			$script = $manialinkText->getScript()->addFeature($toggleInterface);
 | 
			
		||||
		}		
 | 
			
		||||
 | 
			
		||||
		$manialinkText = (string) $manialinkText;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										81
									
								
								core/Manialinks/ToggleInterfaceManager.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								core/Manialinks/ToggleInterfaceManager.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,81 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace ManiaControl\Manialinks;
 | 
			
		||||
 | 
			
		||||
use ManiaControl\ManiaControl;
 | 
			
		||||
use ManiaControl\Callbacks\Callbacks;
 | 
			
		||||
use ManiaControl\Callbacks\CallbackListener;
 | 
			
		||||
use ManiaControl\Players\Player;
 | 
			
		||||
use ManiaControl\Players\PlayerManager;
 | 
			
		||||
 | 
			
		||||
use FML\ManiaLink;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class managing the Custom UI in ManiaPlanet
 | 
			
		||||
 *
 | 
			
		||||
 * @author    ManiaControl Team <mail@maniacontrol.com>
 | 
			
		||||
 * @copyright 2014-2020 ManiaControl Team
 | 
			
		||||
 * @license   http://www.gnu.org/licenses/ GNU General Public License, Version 3
 | 
			
		||||
 */
 | 
			
		||||
class ToggleInterfaceManager implements CallbackListener {
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Constants
 | 
			
		||||
	 */
 | 
			
		||||
	const MLID                    = 'ToggleInterface.KeyListener';
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Private properties
 | 
			
		||||
	 */
 | 
			
		||||
	/** @var ManiaControl $maniaControl */
 | 
			
		||||
	private $maniaControl = null;
 | 
			
		||||
 | 
			
		||||
	private $manialink = "";
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Create a custom UI manager instance
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param ManiaControl $maniaControl
 | 
			
		||||
	 */
 | 
			
		||||
	public function __construct(ManiaControl $maniaControl) {
 | 
			
		||||
		$this->maniaControl = $maniaControl;
 | 
			
		||||
 | 
			
		||||
		$this->buildManiaLink();
 | 
			
		||||
 | 
			
		||||
		// Callbacks
 | 
			
		||||
		$this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::AFTERINIT, $this, 'handleAfterInit');
 | 
			
		||||
		$this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERCONNECT, $this, 'handlePlayerJoined');
 | 
			
		||||
		//$this->maniaControl->getCallbackManager()->registerCallbackListener(SettingManager::CB_SETTING_CHANGED, $this, 'handleSettingChanged'); // TODO Setting Change Key
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Handle ManiaControl AfterInit callback
 | 
			
		||||
	 *
 | 
			
		||||
	 * @internal
 | 
			
		||||
	 */
 | 
			
		||||
	public function handleAfterInit() {		
 | 
			
		||||
		$players = $this->maniaControl->getPlayerManager()->getPlayers();
 | 
			
		||||
		if (!empty($players)) {
 | 
			
		||||
			$this->maniaControl->getManialinkManager()->sendManialink($this->manialink , $players, 0, false, false);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Handle PlayerJoined Callback
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param Player $player
 | 
			
		||||
	 */
 | 
			
		||||
	public function handlePlayerJoined(Player $player) {
 | 
			
		||||
		$this->maniaControl->getManialinkManager()->sendManialink($this->manialink , $player, 0, false, false);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Build the Manialink with only the Toggle Interface script feature
 | 
			
		||||
	 */
 | 
			
		||||
	private function buildManiaLink() {
 | 
			
		||||
		$manialink = new ManiaLink(self::MLID);
 | 
			
		||||
		$manialink->getScript()->addFeature(new \FML\Script\Features\ToggleInterface("F9"));
 | 
			
		||||
		$this->manialink = (string) $manialink;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -19,7 +19,8 @@ class ToggleInterface extends ScriptFeature
 | 
			
		||||
    /*
 | 
			
		||||
     * Constants
 | 
			
		||||
     */
 | 
			
		||||
    const VAR_STATE = "FML_ToggleInterface_State";
 | 
			
		||||
    const VAR_ISVISIBLE = "FML_ToggleInterface_IsVisible";
 | 
			
		||||
    const VAR_WASVISIBLE = "FML_ToggleInterface_WasVisible";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var string $keyName Key name
 | 
			
		||||
@@ -31,26 +32,19 @@ class ToggleInterface extends ScriptFeature
 | 
			
		||||
     */
 | 
			
		||||
    protected $keyCode = null;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var bool $rememberState Remember the current state
 | 
			
		||||
     */
 | 
			
		||||
    protected $rememberState = true;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Construct a new ToggleInterface
 | 
			
		||||
     *
 | 
			
		||||
     * @api
 | 
			
		||||
     * @param string|int $keyNameOrCode (optional) Key name or code
 | 
			
		||||
     * @param bool       $rememberState (optional) Remember the current state
 | 
			
		||||
     */
 | 
			
		||||
    public function __construct($keyNameOrCode = null, $rememberState = true)
 | 
			
		||||
    public function __construct($keyNameOrCode = null)
 | 
			
		||||
    {
 | 
			
		||||
        if (is_string($keyNameOrCode)) {
 | 
			
		||||
            $this->setKeyName($keyNameOrCode);
 | 
			
		||||
        } else if (is_int($keyNameOrCode)) {
 | 
			
		||||
            $this->setKeyCode($keyNameOrCode);
 | 
			
		||||
        }
 | 
			
		||||
        $this->setRememberState($rememberState);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -103,38 +97,16 @@ class ToggleInterface extends ScriptFeature
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get if the state should get remembered
 | 
			
		||||
     *
 | 
			
		||||
     * @api
 | 
			
		||||
     * @return bool
 | 
			
		||||
     */
 | 
			
		||||
    public function getRememberState()
 | 
			
		||||
    {
 | 
			
		||||
        return $this->rememberState;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set if the state should get remembered
 | 
			
		||||
     *
 | 
			
		||||
     * @api
 | 
			
		||||
     * @param bool $rememberState Remember the current state
 | 
			
		||||
     * @return static
 | 
			
		||||
     */
 | 
			
		||||
    public function setRememberState($rememberState)
 | 
			
		||||
    {
 | 
			
		||||
        $this->rememberState = (bool)$rememberState;
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @see ScriptFeature::prepare()
 | 
			
		||||
     */
 | 
			
		||||
    public function prepare(Script $script)
 | 
			
		||||
    {
 | 
			
		||||
        $script->appendGenericScriptLabel(ScriptLabel::KEYPRESS, $this->getKeyPressScriptText());
 | 
			
		||||
        if ($this->rememberState) {
 | 
			
		||||
            $script->appendGenericScriptLabel(ScriptLabel::ONINIT, $this->getOnInitScriptText());
 | 
			
		||||
        $script->appendGenericScriptLabel(ScriptLabel::ONINIT, $this->getOnInitScriptText());
 | 
			
		||||
        if ($this->keyCode != null || $this->keyName != null) {
 | 
			
		||||
            $script->appendGenericScriptLabel(ScriptLabel::KEYPRESS, $this->getKeyPressScriptText());
 | 
			
		||||
        } else {
 | 
			
		||||
            $script->appendGenericScriptLabel(ScriptLabel::TICK, $this->getTickScriptText());
 | 
			
		||||
        }
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
@@ -146,10 +118,11 @@ class ToggleInterface extends ScriptFeature
 | 
			
		||||
     */
 | 
			
		||||
    protected function getOnInitScriptText()
 | 
			
		||||
    {
 | 
			
		||||
        $stateVariableName = $this::VAR_STATE;
 | 
			
		||||
        $VarIsVisible = $this::VAR_ISVISIBLE;
 | 
			
		||||
        $VarWasVisible = $this::VAR_WASVISIBLE;
 | 
			
		||||
        return "
 | 
			
		||||
declare persistent {$stateVariableName} as CurrentState for LocalUser = True;
 | 
			
		||||
Page.MainFrame.Visible = CurrentState;
 | 
			
		||||
declare Boolean {$VarIsVisible} for UI = True;
 | 
			
		||||
declare Boolean Last_IsVisible = True;
 | 
			
		||||
";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -169,19 +142,38 @@ Page.MainFrame.Visible = CurrentState;
 | 
			
		||||
            $keyProperty = "KeyCode";
 | 
			
		||||
            $keyValue    = Builder::getInteger($this->keyCode);
 | 
			
		||||
        }
 | 
			
		||||
        $VarIsVisible = $this::VAR_ISVISIBLE;
 | 
			
		||||
        $VarWasVisible = $this::VAR_WASVISIBLE;
 | 
			
		||||
        $scriptText = "
 | 
			
		||||
if (Event.{$keyProperty} == {$keyValue}) {
 | 
			
		||||
    Page.MainFrame.Visible = !Page.MainFrame.Visible;
 | 
			
		||||
";
 | 
			
		||||
        if ($this->rememberState) {
 | 
			
		||||
            $stateVariableName = $this::VAR_STATE;
 | 
			
		||||
            $scriptText        .= "
 | 
			
		||||
    declare persistent {$stateVariableName} as CurrentState for LocalUser = True;
 | 
			
		||||
    CurrentState = Page.MainFrame.Visible;
 | 
			
		||||
";
 | 
			
		||||
        }
 | 
			
		||||
        return $scriptText . "
 | 
			
		||||
    {$VarIsVisible} = !{$VarIsVisible};
 | 
			
		||||
}";
 | 
			
		||||
        return $scriptText ;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
     /**
 | 
			
		||||
     * Get the key press script text
 | 
			
		||||
     *
 | 
			
		||||
     * @return string
 | 
			
		||||
     */
 | 
			
		||||
    protected function getTickScriptText()
 | 
			
		||||
    {
 | 
			
		||||
        $VarIsVisible = $this::VAR_ISVISIBLE;
 | 
			
		||||
        $VarWasVisible = $this::VAR_WASVISIBLE;
 | 
			
		||||
        return "
 | 
			
		||||
if (Last_IsVisible != {$VarIsVisible}) {
 | 
			
		||||
    Last_IsVisible = {$VarIsVisible};
 | 
			
		||||
    foreach (Control in Page.MainFrame.Controls) {
 | 
			
		||||
        declare Boolean {$VarWasVisible} for Control = False;
 | 
			
		||||
        if (Last_IsVisible && {$VarWasVisible}) {
 | 
			
		||||
            Control.Visible = True;
 | 
			
		||||
            {$VarWasVisible} = False;
 | 
			
		||||
        } else if (!Last_IsVisible){
 | 
			
		||||
            {$VarWasVisible} = Control.Visible;
 | 
			
		||||
            Control.Visible = False;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user