steeffffeen/FancyManiaLinks

View on GitHub
FML/Script/Features/ToggleInterface.php

Summary

Maintainability
B
4 hrs
Test Coverage
A
96%
<?php

namespace FML\Script\Features;

use FML\Controls\Control;
use FML\Script\Builder;
use FML\Script\Script;
use FML\Script\ScriptLabel;

/**
 * Script Feature for toggling the complete ManiaLink via Key Press
 *
 * @author    steeffeen <mail@steeffeen.com>
 * @copyright FancyManiaLinks Copyright © 2017 Steffen Schröder
 * @license   http://www.gnu.org/licenses/ GNU General Public License, Version 3
 */
class ToggleInterface extends ScriptFeature
{

    /*
     * Constants
     */
    const VAR_STATE = "FML_ToggleInterface_State";
    const DEFAULT_KEY_NAME = "F9";

    /**
     * @var Control $control Control
     */
    protected $control = null;

    /**
     * @var string $defaultKeyName Default key name
     */
    protected static $defaultKeyName = self::DEFAULT_KEY_NAME;

    /**
     * @var string $keyName Key name
     */
    protected $keyName = null;

    /**
     * @var int $defaultKeyCode Default key code
     */
    protected static $defaultKeyCode = null;

    /**
     * @var int $keyCode Key code
     */
    protected $keyCode = null;

    /**
     * @var bool $rememberState Remember the current state
     */
    protected $rememberState = true;

    /**
     * Construct a new ToggleInterface
     *
     * @api
     * @param Control    $control       (optional) Control
     * @param string|int $keyNameOrCode (optional) Key name or code
     * @param bool       $rememberState (optional) Remember the current state
     */
    public function __construct($control = null, $keyNameOrCode = null, $rememberState = true)
    {
        if ($control && !$control instanceof Control) {
            // backwards-compatibility - control parameter has been introduced later on
            $rememberState = $keyNameOrCode;
            $keyNameOrCode = $control;
            $control       = null;
        }
        if ($control) {
            $this->setControl($control);
        }
        if ($keyNameOrCode && is_string($keyNameOrCode)) {
            $this->setKeyName($keyNameOrCode);
        } else if ($keyNameOrCode && is_int($keyNameOrCode)) {
            $this->setKeyCode($keyNameOrCode);
        } else if (static::$defaultKeyName && is_string(static::$defaultKeyName)) {
            $this->setKeyName(static::$defaultKeyName);
        } else if (static::$defaultKeyCode && is_int(static::$defaultKeyCode)) {
            $this->setKeyCode(static::$defaultKeyCode);
        }
        $this->setRememberState($rememberState);
    }

    /**
     * Get the control
     *
     * @api
     * @return Control
     */
    public function getControl()
    {
        return $this->control;
    }

    /**
     * Get the control
     *
     * @api
     * @param Control $control Control
     * @return static
     */
    public function setControl(Control $control)
    {
        $this->control = $control;
        return $this;
    }

    /**
     * Get default key name
     *
     * @api
     * @return string
     */
    public static function getDefaultKeyName()
    {
        return static::$defaultKeyName;
    }

    /**
     * Set default key name
     *
     * @api
     * @param string $defaultKeyName Default key name
     */
    public static function setDefaultKeyName($defaultKeyName)
    {
        static::$defaultKeyName = (string)$defaultKeyName;
        static::$defaultKeyCode = null;
    }

    /**
     * Get the key name
     *
     * @api
     * @return string
     */
    public function getKeyName()
    {
        return $this->keyName;
    }

    /**
     * Set the key name
     *
     * @api
     * @param string $keyName Key name
     * @return static
     */
    public function setKeyName($keyName)
    {
        $this->keyName = (string)$keyName;
        $this->keyCode = null;
        return $this;
    }

    /**
     * Get default key code
     *
     * @api
     * @return int
     */
    public static function getDefaultKeyCode()
    {
        return static::$defaultKeyCode;
    }

    /**
     * Set default key code
     *
     * @api
     * @param int $defaultKeyCode Default key code
     */
    public static function setDefaultKeyCode($defaultKeyCode)
    {
        static::$defaultKeyCode = (int)$defaultKeyCode;
        static::$defaultKeyName = null;
    }

    /**
     * Get the key code
     *
     * @api
     * @return int
     */
    public function getKeyCode()
    {
        return $this->keyCode;
    }

    /**
     * Set the key code
     *
     * @api
     * @param int $keyCode Key code
     * @return static
     */
    public function setKeyCode($keyCode)
    {
        $this->keyCode = (int)$keyCode;
        $this->keyName = null;
        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());
        }
        return $this;
    }

    /**
     * Get the on init script text
     *
     * @return string
     */
    protected function getOnInitScriptText()
    {
        $scriptText = null;
        if ($this->control) {
            $controlId  = Builder::escapeText($this->control->getId());
            $scriptText = "declare ToggleInterfaceControl <=> Page.GetFirstChild({$controlId});";
        } else {
            $scriptText = "declare ToggleInterfaceControl <=> Page.MainFrame;";
        }
        $stateVariableName = $this::VAR_STATE;
        return $scriptText . "
declare persistent {$stateVariableName} as CurrentState for LocalUser = True;
ToggleInterfaceControl.Visible = CurrentState;
";
    }

    /**
     * Get the key press script text
     *
     * @return string
     */
    protected function getKeyPressScriptText()
    {
        $scriptText  = null;
        $keyProperty = null;
        $keyValue    = null;
        if ($this->keyName) {
            $keyProperty = "KeyName";
            $keyValue    = Builder::getText($this->keyName);
        } else if ($this->keyCode) {
            $keyProperty = "KeyCode";
            $keyValue    = Builder::getInteger($this->keyCode);
        }
        $scriptText = "
if (Event.{$keyProperty} == {$keyValue}) {
";
        if ($this->control) {
            $controlId  = Builder::escapeText($this->control->getId());
            $scriptText .= "
    declare ToggleInterfaceControl <=> Page.GetFirstChild({$controlId});";
        } else {
            $scriptText .= "
    declare ToggleInterfaceControl <=> Page.MainFrame;";
        }
        $scriptText .= "
    ToggleInterfaceControl.Visible = !ToggleInterfaceControl.Visible;";
        if ($this->rememberState) {
            $stateVariableName = static::VAR_STATE;
            $scriptText        .= "
    declare persistent {$stateVariableName} as CurrentState for LocalUser = True;
    CurrentState = ToggleInterfaceControl.Visible;
";
        }
        return $scriptText . "
}";
    }

}