From 33f4db0d4bc73e22c1aab684be9f9ea6faf7e38c Mon Sep 17 00:00:00 2001 From: reinder Date: Sun, 15 Dec 2019 14:41:45 +0100 Subject: [PATCH] Keep property order --- client/src/network/interfaceitems.cpp | 3 ++- client/src/network/interfaceitems.hpp | 11 ++++++++++- client/src/network/object.cpp | 4 ++-- client/src/widget/objecteditwidget.cpp | 4 ++-- server/src/core/interfaceitems.cpp | 9 ++++++++- server/src/core/interfaceitems.hpp | 19 +++++++++++++++++-- server/src/core/object.cpp | 3 +-- server/src/core/session.cpp | 7 ++++--- 8 files changed, 46 insertions(+), 14 deletions(-) diff --git a/client/src/network/interfaceitems.cpp b/client/src/network/interfaceitems.cpp index 87a27ea3..a6c93232 100644 --- a/client/src/network/interfaceitems.cpp +++ b/client/src/network/interfaceitems.cpp @@ -25,5 +25,6 @@ void InterfaceItems::add(InterfaceItem& item) { - insert(item.name(), &item); + m_items.insert(item.name(), &item); + m_itemOrder.append(item.name()); } diff --git a/client/src/network/interfaceitems.hpp b/client/src/network/interfaceitems.hpp index 7aa92440..8651ace7 100644 --- a/client/src/network/interfaceitems.hpp +++ b/client/src/network/interfaceitems.hpp @@ -24,12 +24,21 @@ #define CLIENT_NETWORK_INTERFACEITEMS_HPP #include +#include class InterfaceItem; -class InterfaceItems : public QMap +class InterfaceItems { + protected: + QMap m_items; + QStringList m_itemOrder; + public: + const QStringList& names() const { return m_itemOrder; } + + inline InterfaceItem* find(const QString& name) const { return m_items.value(name, nullptr); } + void add(InterfaceItem& item); }; diff --git a/client/src/network/object.cpp b/client/src/network/object.cpp index 6e0707b7..f408f121 100644 --- a/client/src/network/object.cpp +++ b/client/src/network/object.cpp @@ -38,10 +38,10 @@ Object::~Object() const Property* Object::getProperty(const QString& name) const { - return dynamic_cast(m_interfaceItems.value(name, nullptr)); + return dynamic_cast(m_interfaceItems.find(name)); } Property* Object::getProperty(const QString& name) { - return dynamic_cast(m_interfaceItems.value(name, nullptr)); + return dynamic_cast(m_interfaceItems.find(name)); } diff --git a/client/src/widget/objecteditwidget.cpp b/client/src/widget/objecteditwidget.cpp index d31bbe07..840ed89e 100644 --- a/client/src/widget/objecteditwidget.cpp +++ b/client/src/widget/objecteditwidget.cpp @@ -69,8 +69,8 @@ void ObjectEditWidget::buildForm() { QMap tabs; - for(auto item : m_object->interfaceItems()) - if(Property* property = dynamic_cast(item)) + for(const QString& name : m_object->interfaceItems().names()) + if(Property* property = m_object->getProperty(name)) { QWidget* w = nullptr; diff --git a/server/src/core/interfaceitems.cpp b/server/src/core/interfaceitems.cpp index 81a7da23..4c04df7b 100644 --- a/server/src/core/interfaceitems.cpp +++ b/server/src/core/interfaceitems.cpp @@ -23,7 +23,14 @@ #include "interfaceitems.hpp" #include "interfaceitem.hpp" +InterfaceItem* InterfaceItems::find(const std::string& name) const +{ + auto it = m_items.find(name); + return (it != m_items.end()) ? &it->second : nullptr; +} + void InterfaceItems::add(InterfaceItem& item) { - emplace(item.name(), item); + m_items.emplace(item.name(), item); + m_itemOrder.push_back(item.name()); } diff --git a/server/src/core/interfaceitems.hpp b/server/src/core/interfaceitems.hpp index 5fec63b7..4007d04e 100644 --- a/server/src/core/interfaceitems.hpp +++ b/server/src/core/interfaceitems.hpp @@ -23,15 +23,30 @@ #ifndef SERVER_CORE_INTERFACEITEMS_HPP #define SERVER_CORE_INTERFACEITEMS_HPP -#include +#include +#include #include class InterfaceItem; -class InterfaceItems : public std::map +class InterfaceItems { + protected: + std::unordered_map m_items; + std::list m_itemOrder; + public: + using const_iterator = std::unordered_map::const_iterator; + + inline const_iterator begin() const { return m_items.cbegin(); } + inline const_iterator end() const { return m_items.cend(); } + + const std::list& names() const { return m_itemOrder; } + + InterfaceItem* find(const std::string& name) const; void add(InterfaceItem& item); + + inline InterfaceItem& operator[](const std::string& name) const { return m_items.at(name); } }; #endif diff --git a/server/src/core/object.cpp b/server/src/core/object.cpp index 53041273..48dfe42b 100644 --- a/server/src/core/object.cpp +++ b/server/src/core/object.cpp @@ -34,8 +34,7 @@ Object::~Object() InterfaceItem* Object::getItem(const std::string& name) { - auto it = m_interfaceItems.find(name); - return (it != m_interfaceItems.end()) ? &it->second : nullptr; + return m_interfaceItems.find(name); } //AbstractMethod* Object::getMethod(const std::string& name) diff --git a/server/src/core/session.cpp b/server/src/core/session.cpp index 2367c65e..a4f98394 100644 --- a/server/src/core/session.cpp +++ b/server/src/core/session.cpp @@ -245,14 +245,15 @@ void Session::writeObject(Message& message, const ObjectPtr& object) message.write(object->getClassId()); message.writeBlock(); // items - for(auto& it : object->interfaceItems()) + const InterfaceItems& interfaceItems = object->interfaceItems(); + for(const std::string& name : interfaceItems.names()) { - InterfaceItem& item = it.second; + InterfaceItem& item = interfaceItems[name]; // TODO: if(item. internal) message.writeBlock(); // item - message.write(item.name()); + message.write(name); if(AbstractProperty* property = dynamic_cast(&item)) {