Browse Source

support custom onClick messages for all uiml parts

Kolja Strohm 1 year ago
parent
commit
c033b8a036
3 changed files with 140 additions and 28 deletions
  1. 89 1
      FactoryCraft/Dialog.cpp
  2. 50 27
      FactoryCraft/ListView.cpp
  3. 1 0
      FactoryCraft/QuestGraph.h

+ 89 - 1
FactoryCraft/Dialog.cpp

@@ -1,6 +1,7 @@
 #include "Dialog.h"
 
 #include <DateiSystem.h>
+#include <InMemoryBuffer.h>
 #include <TastaturEreignis.h>
 #include <TextFeld.h>
 #include <XML.h>
@@ -25,7 +26,8 @@ UIMLDialog::UIMLDialog(
 {
     XML::Element* xml = new XML::Element(uiml);
     view = new UIMLView("<v/>", uiFactory);
-    view->setStyle(UIMLView::Style::Erlaubt | UIMLView::Style::Sichtbar);
+    view->setStyle(UIMLView::Style::Erlaubt | UIMLView::Style::Sichtbar
+                   | UIMLView::Style::GlobalMouseEvent);
     view->setMausEreignis(_ret1ME);
     view->addKnownElement(new InventoryElement());
     view->addKnownElement(new EquipmentElement());
@@ -38,6 +40,92 @@ UIMLDialog::UIMLDialog(
     view->addKnownElement(new ListViewElement());
     view->addKnownElement(new QuestGraphElement());
     view->addKnownElement(new QuestGraphItemElement());
+    view->setOnMemberMouseEvent([](Framework::XML::Element& element,
+                                    Framework::Zeichnung& z,
+                                    MausEreignis me) {
+        if (me.id == ME_RLinks)
+        {
+            Framework::Text onClick = element.getAttributeValue("onClick");
+            if (onClick.getLength() == 0)
+            {
+                return !element.hasAttribute("onClick");
+            }
+            Framework::Text* dialogName
+                = onClick.getTeilText(0, onClick.positionVon(";"));
+            Framework::Text* tail
+                = onClick.getTeilText(onClick.positionVon(";") + 1);
+            Framework::InMemoryBuffer buffer;
+            buffer.schreibe("\0", 1); // element message
+            while (tail->getLength() > 0)
+            {
+                Framework::Text* current = 0;
+                if (tail->positionVon(";") >= 0)
+                {
+                    current = tail->getTeilText(0, tail->positionVon(";"));
+                    Framework::Text* tmp
+                        = tail->getTeilText(tail->positionVon(";") + 1);
+                    tail->release();
+                    tail = tmp;
+                }
+                else
+                {
+                    current = new Text(*tail);
+                    tail->setText("");
+                }
+                if (current->positionVon("(char)") == 0)
+                {
+                    current->ersetzen("(char)", "");
+                    char d = (char)(int)*current;
+                    buffer.schreibe(&d, 1);
+                }
+                else if (current->positionVon("(short)") == 0)
+                {
+                    current->ersetzen("(short)", "");
+                    short d = (short)(int)*current;
+                    buffer.schreibe((char*)&d, 2);
+                }
+                else if (current->positionVon("(int)") == 0)
+                {
+                    current->ersetzen("(int)", "");
+                    int d = (int)*current;
+                    buffer.schreibe((char*)&d, 4);
+                }
+                else if (current->positionVon("(__int64)") == 0)
+                {
+                    current->ersetzen("(__int64)", "");
+                    __int64 d = (__int64)*current;
+                    buffer.schreibe((char*)&d, 8);
+                }
+                else if (current->positionVon("(float)") == 0)
+                {
+                    current->ersetzen("(float)", "");
+                    float d = (float)*current;
+                    buffer.schreibe((char*)&d, 4);
+                }
+                else if (current->positionVon("(double)") == 0)
+                {
+                    current->ersetzen("(double)", "");
+                    double d = (double)*current;
+                    buffer.schreibe((char*)&d, 8);
+                }
+                else
+                {
+                    unsigned char len = (unsigned char)current->getLength();
+                    buffer.schreibe((char*)&len, 1);
+                    buffer.schreibe(*current, len);
+                }
+                current->release();
+            }
+            char* message = new char[buffer.getSize()];
+            buffer.lese(message, (int)buffer.getSize());
+            World::INSTANCE->zClient()->uiRequest(
+                *dialogName, message, (int)buffer.getSize());
+            delete[] message;
+            dialogName->release();
+            tail->release();
+        }
+        return (bool)1;
+    });
     view->setUIML(xml);
     view->setSize((int)xml->getAttributeValue("width"),
         (int)xml->getAttributeValue("height"));

+ 50 - 27
FactoryCraft/ListView.cpp

@@ -21,20 +21,56 @@ bool ListViewElement::isApplicableFor(Framework::XML::Element& element)
 Framework::Zeichnung* ListViewElement::parseElement(
     Framework::XML::Element& element, Framework::UIMLContainer& generalFactory)
 {
-    Framework::Text elementId = element.getAttributeValue("id");
     ListView* result = new ListView();
     result->list->setSchriftZ(dynamic_cast<Framework::Schrift*>(
         generalFactory.getFactory().initParam.schrift->getThis()));
-    element.selectChildren().forEach(
-        [result, &generalFactory, &elementId](Framework::XML::Element* zChild) {
-            if (zChild->getName().istGleich("listItem"))
-            {
-                Framework::Text id = zChild->getAttributeValue("id");
-                result->ids.add(new Framework::Text(id));
-                result->list->addEintrag(zChild->getText());
-            }
-        });
+    updateElement(element, *result, generalFactory);
+    return result;
+}
 
+bool ListViewElement::updateElement(Framework::XML::Element& element,
+    Framework::Zeichnung& z,
+    Framework::UIMLContainer& generalFactory)
+{
+    ListView* view = dynamic_cast<ListView*>(&z);
+    if (!view) return false;
+    for (int index = 0; index < view->list->getEintragAnzahl(); index++)
+    {
+        if (!element.selectChildsByName("listItem")
+                 .whereAttributeEquals("id", *view->ids.z(index))
+                 .exists())
+        {
+            view->list->removeEintrag(index);
+            view->ids.remove(index);
+            index--;
+        }
+    }
+    int childIndex = 0;
+    for (Framework::XML::Element* zChild :
+        element.selectChildsByName("listItem"))
+    {
+        int index = view->ids.findIndex([zChild](const Framework::Text* zId) {
+            return zId->istGleich(zChild->getAttributeValue("id"));
+        });
+        if (index < 0)
+        {
+            Framework::Text id = zChild->getAttributeValue("id");
+            view->ids.add(new Framework::Text(id));
+            view->list->addEintrag(zChild->getText());
+        }
+        else
+        {
+            view->list->setEintrag(index, zChild->getText());
+            view->list->setEintragPos(index, childIndex);
+        }
+        childIndex++;
+    };
+    for (int i = 0; i < view->list->getEintragAnzahl(); i++)
+    {
+        view->list->zEintrag(i)->setSchriftSize(20);
+        view->list->zEintrag(i)->setSchriftFarbe(0XFFFFFFFF);
+        view->list->zEintrag(i)->setRahmenFarbe(0xFF52525E);
+    }
     int auswahl
         = element.selectChildsByAttribute("selected")
               .getFirstElement()
@@ -43,23 +79,10 @@ Framework::Zeichnung* ListViewElement::parseElement(
                       return child->zParent()->getChildIndex(child);
                   })
               .orElse(-1);
-    result->list->setAuswahl(auswahl);
-    result->lastSelection = auswahl;
-    for (int i = 0; i < result->list->getEintragAnzahl(); i++)
-    {
-        result->list->zEintrag(i)->setSchriftSize(20);
-        result->list->zEintrag(i)->setSchriftFarbe(0XFFFFFFFF);
-        result->list->zEintrag(i)->setRahmenFarbe(0xFF52525E);
-    }
-    result->onSelected = element.getAttributeValue("onSelectMessage");
-    return result;
-}
-
-bool ListViewElement::updateElement(Framework::XML::Element& element,
-    Framework::Zeichnung& z,
-    Framework::UIMLContainer& generalFactory)
-{
-    return false;
+    view->list->setAuswahl(auswahl);
+    view->lastSelection = auswahl;
+    view->onSelected = element.getAttributeValue("onSelectMessage");
+    return true;
 }
 
 void ListViewElement::layout(Framework::XML::Element& element,

+ 1 - 0
FactoryCraft/QuestGraph.h

@@ -55,6 +55,7 @@ private:
     Framework::Array<QuestGraphItem*> nextLayersConnections;
     Framework::Text id;
     Framework::Text requirements;
+    Framework::Text onClick;
     bool finished;
     bool mainQuest;
     bool virtualNode;