.. _button: Button ++++++++ Beschreibung ============= Buttons sind :ref:`Elemente `, bei denen ein einmaliger Input zum Ausführen einer bestimmten Aktivität führt. Vom Button erben die Klassen :ref:`Button_Blank`, :ref:`Button_Rect` und :ref:`Button_Round`. Objekte dieser Klasse können in zwei verschiedenen Varianten erstellt werden: als Button oder als Switch. Dabei sind Buttons Objekte der ``Button`` Klasse, die beim Drücken ihr Aussehen bzw. nur kurz ändern oder durch durch Drücken andere :ref:`Screens` aufrufen können. Switches sind Objekte der ``Button`` Klasse, die nach Betätigung ihr Aussehen und Zustand so lange verändern, bis erneut auf dieses Objekt gedrückt wird. Funktionen ============= .. csv-table:: :widths: 100 1000 , ":ref:`Button ` (std::function button_callback, ExternalButtonValue* externalValue)" , ":ref:`Button ` (std::function button_callback, std::function longpress_callback, ExternalButtonValue* externalValue)" , ":ref:`Button ` (std::function swich_callback, ExternalButtonValue* externalValue)" , ":ref:`Button ` (std::function swich_callback, std::function longpress_callback, ExternalButtonValue* externalValue)" , ":ref:`Button ` (std::function button_callback, std::function swich_callback, std::function longpress_callback, const bool isButton, const bool hasLongPress, ExternalButtonValue* externalValue)" virtual, ":ref:`~Button ` ()" void, ":ref:`loop` (Inputs& input)" bool, ":ref:`select` ()" void, ":ref:`setTouch` (Inputs& input) override" bool, ":ref:`getValue` () const" bool, ":ref:`isInsideHitbox` (uint16_t x, uint16_t y, uint16_t posX, uint16_t posY, uint16_t sizeX, uint16_t sizeY)" Variablen und Konstanten ========================== .. csv-table:: :widths: 100 10000 const std::function, ":ref:`button_callback ` = [](){}" const std::function, ":ref:`switch_callback ` = [](bool){}" const std::function, ":ref:`longpress_callback ` = [](){}" ":ref:`ExternalButtonValue`", ":ref:`externalValue ` = nullptr" const bool, ":ref:`isButton`" const bool, ":ref:`hasLongPress` = false" bool, ":ref:`value` = false" bool, ":ref:`blocked` = false" bool, ":ref:`hasButtonAnimation` = true" unsigned long, ":ref:`animationTimer` = 0" unsigned long, ":ref:`longPressTimer` = 0" Makros ============= .. csv-table:: :widths: 100 10000 , ":ref:`TML_goTo `" , ":ref:`TML_goTo_without_History `" , ":ref:`TML_back `" , ":ref:`TML_empty_button `" , ":ref:`TML_empty_switch `" , ":ref:`BUTTON_ON_TIME `" , ":ref:`BUTTON_LONG_TIME `" Funktionen Beschreibung ========================= .. _buttonButton: Button(std::function button_callback, ExternalButtonValue* externalValue = nullptr) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. literalinclude:: ../../src/Elements/Button.cpp :lines: 3-8 :linenos: Diese Funktion ist ein Konstruktor für ein Objekt der Klasse ``Button``, welcher Buttons erzeugt. Als Parameter nimmt der Konstruktor eine Button Callback Funktion (siehe :ref:`button_callback `) und ein ``externalValue``, welches den Zustand des Objektes angibt (also ob es aktiviert oder deaktiviert ist). In der Initialisierungsliste werden :ref:`button_callback` und :ref:`externalValue` mit den entsprechenden Parametern initialisiert. Außerdem werden sowohl :ref:`isButton` und :ref:`value` mit ``true`` initialisiert, weil das Objekt ein Button und kein Switch ist und standarmäßig aktiviert sein soll, sollte kein :ref:`externalValue` vorliegen. .. _buttonButtonLongPress: Button(std::function button_callback, std::function longpress_callback, ExternalButtonValue* externalValue = nullptr) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. literalinclude:: ../../src/Elements/Button.cpp :lines: 10-17 :linenos: Diese Funktion ist ein Konstruktor für ein Objekt der Klasse ``Button``, welcher Buttons erzeugt. Als Parameter nimmt der Konstruktor eine Button Callback Funktion (siehe :ref:`button_callback`), eine Longpress Callback Funktion (siehe :ref:`longpress_callback`) und ein ``externalValue``, welches den Zustand des Objektes angibt (also ob es aktiviert oder deaktiviert ist). In der Initialisierungsliste werden :ref:`button_callback`, `longpress_callback` und :ref:`externalValue` mit den entsprechenden Parametern initialisiert. Außerdem werden sowohl :ref:`isButton`, :ref:`hasLongPress` und :ref:`value` mit ``true`` initialisiert, weil das Objekt ein Button und kein Switch ist, beim gedrückhalten eine Aktion ausführen soll und standarmäßig aktiviert sein soll, sollte kein :ref:`externalValue` vorliegen. .. _buttonSwitch: Button(std::function swich_callback, ExternalButtonValue* externalValue = nullptr) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. literalinclude:: ../../src/Elements/Button.cpp :lines: 19-23 :linenos: Diese Funktion ist ein Konstruktor für ein Objekt der Klasse ``Button``, welcher Switches erzeugt. Als Parameter nimmt der Konstruktor eine Switch Callback Funktion (siehe :ref:`switch_callback `) und ein ``externalValue``, welches den Zustand des Objektes angibt (also ob es aktiviert oder deaktiviert ist). In der Initialisierungsliste werden :ref:`switch_callback` und :ref:`externalValue` mit den entsprechenden Parametern initialisiert. Außerdem wird :ref:`isButton` mit ``false`` initialisiert, weil das Objekt ein Switch und kein Button ist. .. _buttonSwitchLongPress: Button(std::function swich_callback, std::function longpress_callback, ExternalButtonValue* externalValue = nullptr) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. literalinclude:: ../../src/Elements/Button.cpp :lines: 25-31 :linenos: Diese Funktion ist ein Konstruktor für ein Objekt der Klasse ``Button``, welcher Switches erzeugt. Als Parameter nimmt der Konstruktor eine SwitchCallback Funktion (siehe :ref:`switch_callback`), eine Longpress Callback Funktion (siehe :ref:`longpress_callback`) und ein ``externalValue``, welches den Zustand des Objektes angibt (also ob es aktiviert oder deaktiviert ist). In der Initialisierungsliste werden :ref:`switch_callback`, `longpress_callback` und :ref:`externalValue` mit den entsprechenden Parametern initialisiert. Außerdem wird :ref:`isButton` mit ``false`` initialisiert, weil das Objekt ein Switch und kein Button ist und :ref:`hasLongPress` mit ``true``, da das beim gedrückhalten eine Aktion ausführen soll. .. _buttonconstructorEverything: Button(std::function button_callback, std::function swich_callback, std::function longpress_callback, const bool isButton, const bool hasLongPress, ExternalButtonValue* externalValue = nullptr) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. literalinclude:: ../../src/Elements/Button.cpp :lines: 33-40 :linenos: Dieser Konstruktor unterscheidet sich von den anderen vier Konstruktoren der Klasse, da hier jede einzelne Variable per Hand festgelegt werden kann. Dies ermöglicht die unterschiedlichsten Objekte zu erstellen, um individuelle Bedürfnisse bei der Funktionsweise von Objekten der ``Button`` Klasse` zu erfüllen. .. _buttonDestructor: virtual ~Button() ~~~~~~~~~~~~~~~~~~~~ .. literalinclude:: ../../src/Elements/Button.cpp :lines: 42 :linenos: Der Destruktor wird bei der Zerstörung eines ``Button`` Objektes aufgerufen. .. _buttonLoopInput: void loop(Inputs& input) ~~~~~~~~~~~~~~~~~~~~~~~~ .. literalinclude:: ../../src/Elements/Button.cpp :lines: 66-78 :linenos: Diese Funktion dient dazu, den Zustand eines Buttons bzw. Switches zu aktualisieren, um auf Benuzereingaben zu reagieren. .. literalinclude:: ../../src/Elements/Button.cpp :lines: 67-70 Sollte der als Argument übergebene :ref:`Input` ``input.enter==true`` gelten, so wird mit ``input`` die :ref:`setTouch` Funktion aufgerufen. .. literalinclude:: ../../src/Elements/Button.cpp :lines: 72-78 Sollte :ref:`externalValue` nicht ``null`` sein und sollte der darin gespeicherte Wert nicht dem :ref:`value` entsprechen, so übernimmt :ref:`value` die Referenz auf den Wert von :ref:`externalValue`. Anschließend wird das Objekt mit :ref:`draw` gezeichnet. Sollte das aktuelle Objekt ein Button (und kein Switch) sein und sollte zusätzlich :ref:`value` nicht ``null`` sein, so wird :ref:`animationTimer` mit neuen Zeitangaben aktualisiert. Er speichert wie viele Millisekunden seit Start vergangen sind (siehe `millis() `_ ). .. literalinclude:: ../../src/Elements/Button.cpp :lines: 80-87 Sollte der :ref:`animationTimer` eines Buttons (keines Switches) im vorherigen Codeabschnitt aktualisiert worden sein und seitdem mehr Millisekunden vergangen sein, als in :ref:`BUTTON_ON_TIME`, so wird der :ref:`animationTimer` wieder zurückgesetzt und, sollte dies nicht schon der Fall sein, :ref:`value` auf ``true`` gesetzt, um den Button wieder in seinem aktivierten Zustand mit :ref:`draw` zu zeichnen. .. literalinclude:: ../../src/Elements/Button.cpp :lines: 90-94 Sollten Änderungen durch den :ref:`externalValue` vorgenommen worden sein (:ref:`hasUpdate`), so werden diese Änderungen mit :ref:`draw` gezeichnet und :ref:`resetUpdate` aufgerufen. .. literalinclude:: ../../src/Elements/Button.cpp :lines: 97-98 Sollte das Objekt nicht länger berührt werden, aber weiterhin ``blocked==true`` sein, so wird :ref:`blocked` wieder auf ``false`` gesetzt, um den Button wieder freizusetzen. .. literalinclude:: ../../src/Elements/Button.cpp :lines: 101-105 Dieser Codeabschnitt testet, ob das Objekt lange drückbar ist und lang genug gedrückt wurde, bereit ist und auch innerhalb der Grenzen des Buttons gedrückt wurde (:ref:`isInsideHitbox`). Wenn dies der Fall ist, wird der :ref:`longPressTimer` zurückgesetzt und die :ref:`longpress_callback` Funktion aufgerufen. .. literalinclude:: ../../src/Elements/Button.cpp :lines: 108-110 Wenn der Touchpoint allerdings nicht mehr innerhalb der Grenzen des Objektes liegt, wird der :ref:`longPressTimer` zurückgesetzt ohne die Callback Funktion aufzurufen. Der Prozess wurde vom Benutzer abgebrochen. .. literalinclude:: ../../src/Elements/Button.cpp :lines: 113-118 Drückt der Nutzer hingegen nicht kontinuierlich auf den Button, wird der Prozess ebenso abgebrochen und statt der Aktion, die durch langes Drücken ausgeführt wird, wird die Aktion für kurzes Drücken ausgeführt, indem :ref:`select` mit dem ``input`` aufgerufen wird. .. _buttonSelect: bool select () ~~~~~~~~~~~~~~~~~~~~~~~~~ .. literalinclude:: ../../src/Elements/Button.cpp :lines: 44-59 :linenos: Diese Funktion ist für den Aufruf der entsprechenden Callback Funktionen von Objekten der ``Button`` Klasse zuständig, wenn diese ausgewählt werden. .. literalinclude:: ../../src/Elements/Button.cpp :lines: 45-51 Dieser Codeabschnitt gilt für Buttons (also nicht für Switches). Wenn Buttons eine Button Animation haben(:ref:`hasButtonAnimation`), dann wird der :ref:`animationTimer` die Millisekunden seit Start speichert (siehe `millis() `_ ). Der Button wird außerdem deaktiviert (:ref:`value`). Es folgt der Aufruf der Callback Funktion :ref:`button_callback`. Sollte durch den :ref:`externalValue` ein gewünschter Zustand für den Button angegeben sein, so wird :ref:`setValue` aufgerufen. .. literalinclude:: ../../src/Elements/Button.cpp :lines: 52-55 Bei einem Switch, wird der aktuelle Zustand gewechselt, also vom aktivierten in den deaktivierten und umgekehrt. Danach wird die :ref:`switch_callback` Callback Funktion aufgerufen. .. literalinclude:: ../../src/Elements/Button.cpp :lines: 56 Das Objekt wird mit :ref:`draw` sofort neugezeichnet. .. _buttonSetTouch: void setTouch(Inputs& input) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. literalinclude:: ../../src/Elements/Button.cpp :lines: 121-131 :linenos: Diese Funktion verarbeitet Toucheingaben auf das ``Button`` Objekt auf dem :ref:`Display`. .. literalinclude:: ../../src/Elements/Button.cpp :lines: 122 Bei Toucheingaben, die außerhalb des Buttons geschehen, wird die Funktion abgebrochen. .. literalinclude:: ../../src/Elements/Button.cpp :lines: 124-126 Sollte es möglich sein, das Objekt länger gedrückt zu halten (:ref:`hasLongPress`), sollte noch kein :ref:`longPressTimer` gestartet worden sein und sollte :ref:`blocked` ``false`` sein, so wird der :ref:`longPressTimer` gestartet, indem dieser die Millisekunden seit Start (siehe `millis() `_ ) speichert. .. literalinclude:: ../../src/Elements/Button.cpp :lines: 127-130 Sollte man das Objekt allerdings nicht länger gedrückthalten können und sollte :ref:`blocked` ``false`` sein, so wird lediglich die :ref:`select` Funktion aufgerufen und :ref:`blocked` auf ``true`` gesetzt. .. _buttonGetValue: bool getValue() ~~~~~~~~~~~~~~~~~ .. literalinclude:: ../../src/Elements/Button.h :lines: 98 :linenos: Gibt den :ref:`value` des aktuellen Objektes zurück. .. _buttonisinsidehitbox: bool isInsideHitbox(uint16_t x, uint16_t y, uint16_t posX, uint16_t posY, uint16_t sizeX, uint16_t sizeY) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. literalinclude:: ../../src/Elements/Button.cpp :lines: 61-63 :linenos: Diese Funktion testet, ob, wenn das ``Display`` berührt wird, auch das aktuelle Objekt der ``Button`` Klasse berührt wird. Dabei sind ``x`` und ``y`` die Koordinaten, bei welchem das Display berührt wird, ``posX`` und ``posY`` die Position des Objektes und ``sizeX`` und ``sizeY`` die Breite und Höhe des Objektes. .. _buttonbuttoncallback: const std::function button_callback = [](){} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. literalinclude:: ../../src/Elements/Button.h :lines: 77 :linenos: Diese Funktion ist die Callback Funktion für Buttons (für Switches siehe :ref:`switch_callback`). Standardmäßig tut diese Funktion nichts, sie erhält erst eine Bedeutung, wenn bei der Erstellung eines ``Button`` Objektes eine Funktion als ``button_callback`` übergeben wird, die aufgerufen wird, wenn der Button aktiviert wird. .. _buttonSwitchCallback: const std::function switch_callback = [](bool){} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. literalinclude:: ../../src/Elements/Button.h :lines: 78 :linenos: Diese Funktion ist die Callback Funktion für Switches (für Buttons siehe :ref:`button_callback`). Standardmäßig tut diese Funktion nichts (akzeptiert aber ein ``bool`` Argument, da ein Switch einen aktivierten und deaktivierten Zustand hat), sie erhält erst eine Bedeutung, wenn bei der Erstellung eines ``Button`` Objektes eine Funktion als ``button_callback`` übergeben wird, die aufgerufen wird, wenn der Switch aktiviert wird. .. _buttonLongpressCallback: const std::function longpress_callback = [](){}; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. literalinclude:: ../../src/Elements/Button.h :lines: 79 :linenos: Diese Funktion ist die Callback Funktion für Buttons und Switches, welche beim längeren Gedrückthalten auf das Objekt verwendet wird. Standardmäßig tut diese Funktion nichts, sie erhält erst eine Bedeutung, wenn bei der Erstellung eines ``Button`` Objektes eine Funktion als ``longpress_callback`` übergeben wird, die aufgerufen wird, wenn der Button/Switch aktiviert wird. Variablen und Konstanten Beschreibung ===================================== .. _buttonVValue: bool value = false; ~~~~~~~~~~~~~~~~~~~~~~ Speichert den aktuellen Zustand des Buttons bzw. Switches. Standardmäßig befinden sie sich in einem deaktivierten Zustand. .. _buttonVExternalValue: ExternalButtonValue* externalValue = nullptr ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Ermöglicht eine externe Steuerung des Zustands des Buttons bzw. Switches, indem es auf einen bool-Wert zeigt, die den gewünschten Zustand repräsentiert. .. _buttonVisButton: const bool isButton ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Gibt an, ob ein Objekt der ``Button`` Klasse ein Button oder ein Switch ist. .. _buttonVhaslongpress: const bool hasLongPress = false ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Gibt an, ob bei einem Objekt der ``Button`` Klasse die :ref:`longpress_callback` Callback Funktion vorliegt, also ob man den Button/ Switch gedrückthalten kann. .. _buttonVblocked: bool blocked = false ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Gibt an, ob der Button gerade blockiert ist, also gerade nicht ausgelöst werden kann. .. _buttonVhasButtonAnimation: bool hasButtonAnimation = true ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Gibt an, ob beim Drücken des Objektes eine kleine Animation abgespielt wird. .. _buttonVanimationtimer: unsigned long animationTimer = 0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Gibt an, wie lang eine Animation beim Drücken eines Buttons dauert bzw. wie lange es dauert, einen Button zu drücken. .. _buttonVlongpresstimer: unsigned long longPressTimer = 0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Gibt an, wie lange ein Button gedrückt wird. Makros Beschreibung ==================== .. _buttonMTML_goTo: TML_goTo (tml, id) [](){tml.goTo(id);} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Mit diesem Macro lässt sich der aktuell angezeigte :ref:`Screen` schnell wechseln auf den :ref:`Screen` mit der eingetragenen ``id`` (siehe :ref:`goTo` der :ref:`TouchMenuLib` Klasse). Dabei ist ``tml`` eine Instanz der :ref:`TouchMenuLib` Klasse. .. _buttonMTML_goTo_without_History: TML_goTo_without_History (tml, id) [](){tml.goTo(id, false);} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Mit diesem Macro lässt sich der aktuell angezeigte :ref:`Screen` schnell wechseln auf den :ref:`Screen` mit der eingetragenen ``id``. Dabei ist ``tml`` eine Instanz der :ref:`TouchMenuLib` Klasse. Beim Verwenden dieses Macros wird der aufgerufene :ref:`Screen` nicht auf .. _buttonMTML_back: TML_back (tml) [](){tml.back();} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Mit diesem Macro wird die :ref:`back` Funktion ausgeführt. .. _buttonMTML_empty_button: TML_empty_button [](){} ~~~~~~~~~~~~~~~~~~~~~~~~~ Mit diesem Macro lässt sich ein ``Button`` erstellen, der keine weitere Funktionalität (also einen anderen Screen aufzurufen) haben soll. .. _buttonMTML_empty_switch: TML_empty_switch [](bool){} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Mit diesem Macro lässt sich ein ``Switch`` erstellen, der keine weitere Funktionalität (also einen anderen Screen aufzurufen) haben soll. .. _buttonMBButton_On_Time: BUTTON_ON_TIME 400 ~~~~~~~~~~~~~~~~~~~~~~ Stellt die Zeit in Millisekunden dar, die beim Drücken eines Buttons vergehen. .. _buttonMButton_Long_Time: BUTTON_LONG_TIME 500 ~~~~~~~~~~~~~~~~~~~~~~~~~ Stellt die Zeit in Millisekunden dar, die vergehen müssen, damit ein Drücken auf einem Button als Gedrückthalten gewertet wird