consider to extend the command handling protocol on UI-Bus (#1058)
This commit is contained in:
parent
38b908d510
commit
2e9bd78791
5 changed files with 97 additions and 62 deletions
|
|
@ -37,8 +37,6 @@
|
|||
** a delegate to implement those translation tasks on receipt of a
|
||||
** command related UI-bus message.
|
||||
**
|
||||
** @todo initial draft and WIP-WIP-WIP as of 1/2017
|
||||
**
|
||||
** @see AbstractTangible_test::invokeCommand()
|
||||
** @see gui::test::Nexus::prepareDiagnosticCommandHandler()
|
||||
**
|
||||
|
|
@ -50,33 +48,20 @@
|
|||
|
||||
|
||||
#include "lib/error.hpp"
|
||||
//#include "include/logging.h"
|
||||
//#include "lib/idi/entry-id.hpp"
|
||||
#include "include/session-command-facade.h"
|
||||
#include "proc/control/command-def.hpp"
|
||||
//#include "gui/notification-service.hpp"
|
||||
//#include "gui/ctrl/bus-term.hpp"
|
||||
//#include "gui/ctrl/nexus.hpp"
|
||||
//#include "lib/util.hpp"
|
||||
//#include "gui/model/tangible.hpp"
|
||||
#include "lib/diff/gen-node.hpp"
|
||||
//#include "lib/idi/entry-id.hpp"
|
||||
#include "include/session-command-facade.h"
|
||||
|
||||
#include <boost/noncopyable.hpp>
|
||||
//#include <string>
|
||||
|
||||
|
||||
namespace gui {
|
||||
namespace ctrl{
|
||||
namespace error = lumiera::error;
|
||||
|
||||
// using lib::HashVal;
|
||||
// using util::isnil;
|
||||
// using lib::idi::EntryID;
|
||||
using lib::diff::Rec;
|
||||
using lib::diff::GenNode;
|
||||
using lib::diff::DataCap;
|
||||
using proc::control::SessionCommand;
|
||||
// using std::string;
|
||||
|
||||
|
||||
/**
|
||||
|
|
@ -90,15 +75,35 @@ namespace ctrl{
|
|||
: public DataCap::Predicate
|
||||
, boost::noncopyable
|
||||
{
|
||||
|
||||
GenNode::ID const& commandID_;
|
||||
|
||||
/** @todo unimplemented extension of command protocol
|
||||
* to clone a given command definition prototype
|
||||
* @param subID additional identifier to extend command-ID
|
||||
* @return extended command ID, comprised of the basic ID, as given by
|
||||
* the GenNode::ID of the commandMsg (see CommandHandler(GenNode)),
|
||||
* extended by the subID and some random digits.
|
||||
* @throw error::Logic always, not yet implemented ///////////////////////////////////////////////////TICKET #1058 consider extension of UI-Bus protocol
|
||||
*/
|
||||
bool
|
||||
handle (Rec const& bindingArgs) override ///< the argument binding message
|
||||
handle (string const& subID) override ///< the "bang!" message (command invocation)
|
||||
{
|
||||
throw error::Logic ("Extended Protocol for cloning command prototypes (Ticket #1058)"
|
||||
, error::LUMIERA_ERROR_UNIMPLEMENTED);
|
||||
}
|
||||
|
||||
|
||||
/** handle command argument binding message */
|
||||
bool
|
||||
handle (Rec const& bindingArgs) override
|
||||
{
|
||||
SessionCommand::facade().bindArg (commandID_, bindingArgs);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/** handle the "bang!" message (trigger invocation) */
|
||||
bool
|
||||
handle (int const&) override ///< the "bang!" message (command invocation)
|
||||
{
|
||||
|
|
@ -106,6 +111,7 @@ namespace ctrl{
|
|||
return true;
|
||||
}
|
||||
|
||||
|
||||
public:
|
||||
CommandHandler (GenNode const& commandMsg)
|
||||
: commandID_{commandMsg.idi}
|
||||
|
|
|
|||
|
|
@ -39,9 +39,8 @@
|
|||
** both CoreService and Nexus are mutually interdependent from an operational
|
||||
** perspective, since they exchange messages in both directions.
|
||||
**
|
||||
** @todo initial draft and WIP-WIP-WIP as of 12/2015
|
||||
**
|
||||
** @see TODO_abstract-tangible-test.cpp
|
||||
** @see AbstractTangible_test
|
||||
** @see BusTerm_test
|
||||
**
|
||||
*/
|
||||
|
||||
|
|
@ -52,39 +51,26 @@
|
|||
|
||||
#include "lib/error.hpp"
|
||||
#include "include/logging.h"
|
||||
//#include "lib/idi/entry-id.hpp"
|
||||
#include "lib/idi/entry-id.hpp"
|
||||
#include "include/session-command-facade.h"
|
||||
#include "gui/notification-service.hpp"
|
||||
#include "gui/ctrl/command-handler.hpp"
|
||||
#include "gui/ctrl/bus-term.hpp"
|
||||
#include "gui/ctrl/nexus.hpp"
|
||||
//#include "lib/util.hpp"
|
||||
//#include "gui/model/tangible.hpp"
|
||||
//#include "lib/diff/record.hpp"
|
||||
#include "lib/idi/entry-id.hpp"
|
||||
|
||||
#include <boost/noncopyable.hpp>
|
||||
//#include <string>
|
||||
|
||||
|
||||
namespace gui {
|
||||
namespace ctrl{
|
||||
|
||||
// using lib::HashVal;
|
||||
// using util::isnil;
|
||||
// using lib::idi::EntryID;
|
||||
// using lib::diff::Record;
|
||||
// using std::string;
|
||||
|
||||
|
||||
/**
|
||||
* Attachment point to "central services" within the UI-Bus.
|
||||
* Attachment point to »central services« within the UI-Bus.
|
||||
* This special implementation of the [BusTerm] interface receives and
|
||||
* handles those messages to be processed by centralised services:
|
||||
* - commands need to be sent down to Proc-Layer
|
||||
* - presentation state messages need to be recorded and acted upon.
|
||||
*
|
||||
* @todo write type comment
|
||||
*/
|
||||
class CoreService
|
||||
: public BusTerm
|
||||
|
|
|
|||
|
|
@ -73,15 +73,15 @@ namespace gui {
|
|||
|
||||
/* === Interface Lifecycle === */
|
||||
|
||||
typedef lumiera::InstanceHandle< LUMIERA_INTERFACE_INAME(lumieraorg_GuiNotification, 0)
|
||||
, GuiNotification
|
||||
> ServiceInstanceHandle;
|
||||
using ServiceInstanceHandle = lumiera::InstanceHandle< LUMIERA_INTERFACE_INAME(lumieraorg_GuiNotification, 0)
|
||||
, GuiNotification
|
||||
> ;
|
||||
|
||||
lib::SingletonRef<GuiNotification> implInstance_;
|
||||
ServiceInstanceHandle serviceInstance_;
|
||||
|
||||
public:
|
||||
NotificationService();
|
||||
NotificationService(); /////////////////////////////////////////////////////////TICKET #1047 : define GuiNotification
|
||||
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -103,7 +103,8 @@ namespace ctrl {
|
|||
/* ==== standard implementation of the BusTerm interface ==== */
|
||||
|
||||
/** prepare or trigger invocation of a command.
|
||||
* @param command a GenNode holding parameters invocation trigger
|
||||
* @param command a GenNode either holding command parameters
|
||||
* or an int to signal actual command invocation
|
||||
* @remarks some commands can simply be invoked right away, but
|
||||
* in the general case, command preparation and invocation
|
||||
* is a multi-step process. The gui::interact::InvocationTrail
|
||||
|
|
|
|||
|
|
@ -296,7 +296,7 @@
|
|||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1481320847724" HGAP="42" ID="ID_545146501" MODIFIED="1481768822574" TEXT="wo ansiedeln" VSHIFT="-5">
|
||||
<node CREATED="1481320847724" HGAP="42" ID="ID_545146501" MODIFIED="1483927830295" TEXT="wo ansiedeln" VSHIFT="-6">
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1481509901926" ID="ID_1612540786" MODIFIED="1481509907305" TEXT="in proc::control"/>
|
||||
<node CREATED="1481767522123" FOLDED="true" ID="ID_789146708" MODIFIED="1483584068634">
|
||||
|
|
@ -407,8 +407,9 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1481320850779" ID="ID_1632600003" MODIFIED="1481320854143" TEXT="hochfahren">
|
||||
<node CREATED="1481509921211" ID="ID_1515469097" MODIFIED="1483584030011">
|
||||
<node CREATED="1481320850779" HGAP="45" ID="ID_1632600003" MODIFIED="1483927828448" TEXT="hochfahren" VSHIFT="-3">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1481509921211" FOLDED="true" ID="ID_1515469097" MODIFIED="1483927808469">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
|
|
@ -492,7 +493,8 @@
|
|||
<node CREATED="1482464436919" ID="ID_64274402" MODIFIED="1482464442042" TEXT="führt Commands aus"/>
|
||||
<node CREATED="1482464442438" ID="ID_1339868449" MODIFIED="1482464449049" TEXT="startet den Builder"/>
|
||||
</node>
|
||||
<node CREATED="1481599421021" ID="ID_461768132" MODIFIED="1481686898425" TEXT="Locking klären">
|
||||
<node CREATED="1481599421021" ID="ID_461768132" MODIFIED="1483927800437" TEXT="Locking klären">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1481684383530" ID="ID_236117" MODIFIED="1481684451657" TEXT="zwei unabhängige Locks">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1481684391921" ID="ID_138369898" MODIFIED="1481684442846" TEXT="Front-End">
|
||||
|
|
@ -705,7 +707,7 @@
|
|||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node CREATED="1483748323014" ID="ID_1031176077" MODIFIED="1483748339768" TEXT="Nachrichten vom UI-Bus entnehmen">
|
||||
<node COLOR="#520262" CREATED="1483908814960" HGAP="34" ID="ID_430949603" MODIFIED="1483910973175" TEXT="Design sinnvoll?" VSHIFT="6">
|
||||
<node COLOR="#520262" CREATED="1483908814960" FOLDED="true" HGAP="34" ID="ID_430949603" MODIFIED="1483927840787" TEXT="Design sinnvoll?" VSHIFT="6">
|
||||
<linktarget COLOR="#b694bf" DESTINATION="ID_430949603" ENDARROW="Default" ENDINCLINATION="178;425;" ID="Arrow_ID_1062305149" SOURCE="ID_329609486" STARTARROW="Default" STARTINCLINATION="-629;-2354;"/>
|
||||
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
|
||||
<icon BUILTIN="help"/>
|
||||
|
|
@ -740,8 +742,8 @@
|
|||
<node CREATED="1483909714201" ID="ID_1677179961" MODIFIED="1483909722659" TEXT="könnte UI-Abläufe abstrakt testbar machen"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1483755303243" HGAP="86" ID="ID_1425274731" MODIFIED="1483910253374" TEXT="Brauche Command-Handler" VSHIFT="11">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1483755303243" FOLDED="true" HGAP="86" ID="ID_1425274731" MODIFIED="1483927529180" TEXT="Brauche Command-Handler" VSHIFT="11">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1483755317105" ID="ID_775818551" MODIFIED="1483755319685" TEXT="ist ein Visitor"/>
|
||||
<node CREATED="1483755320136" ID="ID_1343109260" MODIFIED="1483755327580" TEXT="Knackpunkt: Command-ID">
|
||||
<node CREATED="1483755331671" FOLDED="true" ID="ID_1913103415" MODIFIED="1483910224790" TEXT="wird im Visitor gebraucht">
|
||||
|
|
@ -822,7 +824,7 @@
|
|||
<node CREATED="1483755360196" ID="ID_514688462" MODIFIED="1483755368542" TEXT="Nachrichten kommen ohne bestimmte Ordnung an"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1483910254385" HGAP="88" ID="ID_267402281" MODIFIED="1483910443222" TEXT="Command-Instanz-Management" VSHIFT="-8">
|
||||
<node CREATED="1483910254385" FOLDED="true" HGAP="88" ID="ID_267402281" MODIFIED="1483927533299" TEXT="Command-Instanz-Management" VSHIFT="-8">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1483910266799" ID="ID_86909318" MODIFIED="1483910282066" TEXT="wie funktioniert's?">
|
||||
<icon BUILTIN="help"/>
|
||||
|
|
@ -875,6 +877,20 @@
|
|||
<linktarget COLOR="#e0ac6d" DESTINATION="ID_242219866" ENDARROW="Default" ENDINCLINATION="-2132;93;" ID="Arrow_ID_1940592535" SOURCE="ID_876058329" STARTARROW="Default" STARTINCLINATION="2588;-604;"/>
|
||||
<linktarget COLOR="#e9ba2d" DESTINATION="ID_242219866" ENDARROW="Default" ENDINCLINATION="-784;1692;" ID="Arrow_ID_1617518648" SOURCE="ID_1479669922" STARTARROW="None" STARTINCLINATION="3436;-1136;"/>
|
||||
</node>
|
||||
<node CREATED="1483927472385" HGAP="30" ID="ID_774425061" MODIFIED="1483927503424" VSHIFT="13">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
vertagt; Ticket <font color="#c52a05">#1058</font>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<icon BUILTIN="bell"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1483755390640" ID="ID_1882657994" MODIFIED="1483755397495" TEXT="Vorlage">
|
||||
|
|
@ -915,6 +931,9 @@
|
|||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1483927552823" HGAP="-105" ID="ID_458362835" MODIFIED="1483927563707" TEXT="Unit-Test" VSHIFT="12">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1483748340524" ID="ID_841368846" MODIFIED="1483748346879" TEXT="API-Funktionen aufrufen"/>
|
||||
</node>
|
||||
|
|
@ -8279,7 +8298,7 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1448658726090" HGAP="18" ID="ID_37610818" MODIFIED="1483925094852" TEXT="Commands" VSHIFT="36">
|
||||
<node CREATED="1448658726090" FOLDED="true" HGAP="18" ID="ID_37610818" MODIFIED="1483927583127" TEXT="Commands" VSHIFT="36">
|
||||
<node CREATED="1448658755071" ID="ID_1033500384" MODIFIED="1448658767933" TEXT="wie definieren">
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1448658974985" ID="ID_974207484" MODIFIED="1448658989011" TEXT="Definition braucht Session-Modell"/>
|
||||
|
|
@ -8849,8 +8868,10 @@
|
|||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1453545968166" ID="ID_399884859" MODIFIED="1454718147309" TEXT="Command-Handler">
|
||||
<node CREATED="1453546129537" ID="ID_1926242869" MODIFIED="1453546137220" TEXT="empfängt "act"-Nachrichten">
|
||||
<node CREATED="1453545968166" ID="ID_399884859" MODIFIED="1483927661023" TEXT="Command-Handler">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1453546129537" FOLDED="true" ID="ID_1926242869" MODIFIED="1483927654562" TEXT="empfängt "act"-Nachrichten">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1453546367201" ID="ID_1473684366" MODIFIED="1453546575633" TEXT=""bang" -> HandlingPattern">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
|
|
@ -8959,8 +8980,17 @@
|
|||
<node CREATED="1483925338796" ID="ID_348930186" MODIFIED="1483925348375" TEXT="implementiert in SessionCommandService"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1453546138215" ID="ID_621186206" MODIFIED="1483910591582" TEXT="Verbindung zum ProcDispatcher">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node CREATED="1453546138215" FOLDED="true" ID="ID_621186206" MODIFIED="1483927648540" TEXT="Verbindung zum ProcDispatcher">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1483927603312" ID="ID_1803909975" MODIFIED="1483927622749" TEXT="Aufruf der SessionCommand facade">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node CREATED="1483927624157" ID="ID_86978128" MODIFIED="1483927636406" TEXT="in CommandHandler gepackt">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node CREATED="1483927637022" ID="ID_455471953" MODIFIED="1483927642261" TEXT="total einfach hier">
|
||||
<icon BUILTIN="ksmiletris"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1453546183561" ID="ID_1080090125" MODIFIED="1453546187900" TEXT="Mock-Variante">
|
||||
<node CREATED="1453546195240" ID="ID_1905175534" MODIFIED="1454711242234" TEXT="loggen">
|
||||
|
|
@ -8974,6 +9004,18 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1483927678318" HGAP="25" ID="ID_1324099152" MODIFIED="1483927692050" TEXT="Notification-Facade öffnen" VSHIFT="4">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1483927692988" ID="ID_354422174" MODIFIED="1483927756533" TEXT="Lebenszyklus-Fragen verifizieren">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1483927735679" ID="ID_783490676" MODIFIED="1483927757596" TEXT="Integration in UI-Main verifizieren">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1483927710450" ID="ID_1085939201" MODIFIED="1483927759044" TEXT="Hochfahren des UI / Schließen des UI">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1453546083296" ID="ID_1154674875" MODIFIED="1455421793848" TEXT="Presentation-State-Manager">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1455290707481" ID="ID_551153117" MODIFIED="1455290724712">
|
||||
|
|
@ -11479,13 +11521,13 @@
|
|||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1481688517437" ID="ID_241232196" MODIFIED="1483747248364" TEXT="Lifecycle">
|
||||
<node CREATED="1481688517437" HGAP="24" ID="ID_241232196" MODIFIED="1483927980740" TEXT="Lifecycle" VSHIFT="8">
|
||||
<icon BUILTIN="info"/>
|
||||
<node CREATED="1481688521532" ID="ID_1825349679" MODIFIED="1481688527391" TEXT="Session started on demand"/>
|
||||
<node CREATED="1481688521532" ID="ID_1825349679" MODIFIED="1483927971331" TEXT="Session startet on demand"/>
|
||||
<node CREATED="1481688529539" ID="ID_1972961763" MODIFIED="1481688540109" TEXT="SessionManager ist zuständig"/>
|
||||
<node CREATED="1481688544921" ID="ID_1934560784" MODIFIED="1481688561386" TEXT="wenn Session geladen, ist ProcDispatcher freigegeben"/>
|
||||
<node CREATED="1481688562830" ID="ID_708961458" MODIFIED="1481688582024" TEXT="SessionSubsystem startet processing loop im ProcDispatcher"/>
|
||||
<node CREATED="1481777252497" ID="ID_1789585729" MODIFIED="1483654905825" TEXT="Shutdown">
|
||||
<node CREATED="1481777252497" FOLDED="true" ID="ID_1789585729" MODIFIED="1483927959131" TEXT="Shutdown">
|
||||
<linktarget COLOR="#5a97df" DESTINATION="ID_1789585729" ENDARROW="Default" ENDINCLINATION="3216;0;" ID="Arrow_ID_1930701586" SOURCE="ID_1392452935" STARTARROW="None" STARTINCLINATION="8475;0;"/>
|
||||
<node CREATED="1481777297635" ID="ID_483368010" MODIFIED="1481777305432" TEXT="Deadlock-Gefahr">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
|
|
@ -11508,15 +11550,15 @@
|
|||
</node>
|
||||
<node CREATED="1481777397542" ID="ID_1147135932" MODIFIED="1481778447806" TEXT="DispatcherLoop stirbt"/>
|
||||
<node CREATED="1481777410972" ID="ID_457965735" MODIFIED="1481777418982" TEXT="sigTerm"/>
|
||||
<node CREATED="1481778453137" ID="ID_1895977623" MODIFIED="1481778465907" TEXT="bewirkt reapen des LoopThread">
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1482712050992" ID="ID_336551514" MODIFIED="1482712065548" TEXT="wie genau">
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1483927907096" ID="ID_1366384241" MODIFIED="1483927919263" TEXT="destruktor setzt auch PImpl auf NULL">
|
||||
<icon BUILTIN="idea"/>
|
||||
<node CREATED="1483927920718" ID="ID_409709261" MODIFIED="1483927929088" TEXT="niemand sonst faßt den PImpl an"/>
|
||||
<node CREATED="1483927929773" ID="ID_1082393310" MODIFIED="1483927945790" TEXT="atomar wg. Lock auf ProcDispatcher"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1481778538165" HGAP="37" ID="ID_522398894" MODIFIED="1483747241417" TEXT="ProcDispatcher" VSHIFT="12">
|
||||
<node CREATED="1481778538165" FOLDED="true" HGAP="37" ID="ID_522398894" MODIFIED="1483927987223" TEXT="ProcDispatcher" VSHIFT="12">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1481826274018" HGAP="18" ID="ID_1916296972" MODIFIED="1482430840977" TEXT="Requirements" VSHIFT="-7">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
|
|||
Loading…
Reference in a new issue