diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/CMakeLists.txt b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/CMakeLists.txt
index 40a8dcbfe..af33f5311 100644
--- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/CMakeLists.txt
+++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/CMakeLists.txt
@@ -1,12 +1,14 @@
INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
${LIBXML2_INCLUDE_DIR}
- ${QT_INCLUDES})
+ ${QT_INCLUDES}
+ ${CMAKE_CURRENT_SOURCE_DIR}/../../3rdparty/qtpropertybrowser)
FILE(GLOB SRC *.cpp *.h)
SET(OVQT_EXT_SYS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin.h
${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin_manager.h
- ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin_spec.h)
+ ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin_spec.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin_spec.h)
SET(OVQT_PLUG_GEORGES_EDITOR_HDR georges_editor_plugin.h
georges_editor_form.h
@@ -36,7 +38,7 @@ SOURCE_GROUP("OVQT Extension System" FILES ${OVQT_EXT_SYS_SRC})
ADD_LIBRARY(ovqt_plugin_georges_editor MODULE ${SRC} ${OVQT_PLUG_GEORGES_EDITOR_MOC_SRC} ${OVQT_EXT_SYS_SRC} ${OVQT_PLUG_GEORGES_EDITOR_UI_HDRS} ${OVQT_PLUGIN_GEORGES_EDITOR_RC_SRCS})
-TARGET_LINK_LIBRARIES(ovqt_plugin_georges_editor ovqt_plugin_core nelmisc nelgeorges ${QT_LIBRARIES})
+TARGET_LINK_LIBRARIES(ovqt_plugin_georges_editor ovqt_plugin_core nelmisc nelgeorges qt_property_browser ${QT_LIBRARIES})
NL_DEFAULT_PROPS(ovqt_plugin_georges_editor "NeL, Tools, 3D: Object Viewer Qt Plugin: Georges Editor")
NL_ADD_RUNTIME_FLAGS(ovqt_plugin_georges_editor)
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/actions.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/actions.cpp
new file mode 100644
index 000000000..9fe3b0fa6
--- /dev/null
+++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/actions.cpp
@@ -0,0 +1,103 @@
+// Object Viewer Qt - Georges Editor Plugin - MMORPG Framework
+// Copyright (C) 2011 Adrian Jaekel
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see .
+
+// Project includes
+#include "actions.h"
+#include "formitem.h"
+#include "georgesform_model.h"
+
+// Qt includes
+
+
+// NeL includes
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+namespace GeorgesQt
+{
+
+ CUndoFormArrayRenameCommand::CUndoFormArrayRenameCommand(CGeorgesFormModel *model, CFormItem *item, const QVariant &value, QUndoCommand *parent)
+ : QUndoCommand("Rename Form Array Member", parent), m_model(model), m_item(item)
+ {
+ m_newValue = value.toString();
+ }
+
+ void CUndoFormArrayRenameCommand::redo()
+ {
+ update(true);
+ }
+
+ void CUndoFormArrayRenameCommand::undo()
+ {
+ update(false);
+ }
+
+ void CUndoFormArrayRenameCommand::update(bool redo)
+ {
+ // Get the parent node
+ const NLGEORGES::CFormDfn *parentDfn;
+ uint indexDfn;
+ const NLGEORGES::CFormDfn *nodeDfn;
+ const NLGEORGES::CType *nodeType;
+ NLGEORGES::CFormElm *node;
+ NLGEORGES::UFormDfn::TEntryType type;
+ bool isArray;
+ bool vdfnArray;
+ NLGEORGES::CForm *form=static_cast(m_item->form());
+ NLGEORGES::CFormElm *elm = static_cast(&form->Elements);
+
+ nlverify ( elm->getNodeByName (m_item->formName().c_str (), &parentDfn, indexDfn, &nodeDfn, &nodeType, &node, type, isArray, vdfnArray, true, NLGEORGES_FIRST_ROUND) );
+ if (node)
+ {
+ std::string tmpName;
+ node->getFormName(tmpName);
+
+ NLGEORGES::CFormElmArray* array = static_cast (node->getParent ());
+
+ // In the redo stage save the old value, just in case.
+ if(redo)
+ {
+ // If the name of the element is empty then give it a nice default.
+ if(array->Elements[m_item->structId()].Name.empty())
+ {
+ m_oldValue.append("#");
+ m_oldValue.append(QString("%1").arg(m_item->structId()));
+ }
+ else
+ {
+ m_oldValue = QString::fromStdString(array->Elements[m_item->structId()].Name);
+ }
+ }
+
+ QString value;
+ if(redo)
+ value = m_newValue;
+ else
+ value = m_oldValue;
+
+
+ array->Elements[m_item->structId()].Name = value.toStdString();
+ m_item->setName(value.toStdString());
+
+ m_model->emitDataChanged(m_model->index(m_item->row(), 0, m_item));
+ }
+ }
+}
\ No newline at end of file
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/actions.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/actions.h
new file mode 100644
index 000000000..0c57b0577
--- /dev/null
+++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/actions.h
@@ -0,0 +1,48 @@
+// Object Viewer Qt - Georges Editor Plugin - MMORPG Framework
+// Copyright (C) 2011 Adrian Jaekel
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see .
+
+#ifndef ACTIONS_H
+#define ACTIONS_H
+
+#include
+#include
+
+namespace GeorgesQt
+{
+ class CFormItem;
+ class CGeorgesFormModel;
+
+ class CUndoFormArrayRenameCommand : public QUndoCommand
+ {
+ public:
+ CUndoFormArrayRenameCommand(CGeorgesFormModel *model, CFormItem *item, const QVariant &value, QUndoCommand *parent = 0);
+ ~CUndoFormArrayRenameCommand() {}
+
+ void redo();
+ void undo();
+
+ void update(bool redo);
+
+ protected:
+ CFormItem *m_item;
+ CGeorgesFormModel *m_model;
+
+ QString m_newValue;
+ QString m_oldValue;
+ };
+}
+
+#endif // ACTIONS_H
\ No newline at end of file
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formdelegate.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formdelegate.cpp
index 91f62c24b..f2a2ba6c3 100644
--- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formdelegate.cpp
+++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formdelegate.cpp
@@ -38,6 +38,8 @@
#include "georgesform_proxy_model.h"
#include "formitem.h"
+#if 0
+
namespace GeorgesQt
{
@@ -277,3 +279,5 @@ namespace GeorgesQt
editor->setGeometry(r);
}
} /* namespace GeorgesQt */
+
+#endif // 0
\ No newline at end of file
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formdelegate.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formdelegate.h
index b6885833e..42b10ef3d 100644
--- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formdelegate.h
+++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formdelegate.h
@@ -19,6 +19,8 @@
#include
+#if 0
+
namespace GeorgesQt
{
@@ -38,4 +40,6 @@ namespace GeorgesQt
};
}
+#endif // 0
+
#endif // FORMDELEGATE_H
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formitem.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formitem.cpp
index 744bb58da..426009ca3 100644
--- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formitem.cpp
+++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formitem.cpp
@@ -14,27 +14,26 @@
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
-#include "stdpch.h"
+// Project includes
#include "formitem.h"
+#include "actions.h"
+#include "georges_editor_form.h"
// Qt includes
+#include
// NeL includes
#include
+#include
#include
#include
+using namespace NLGEORGES;
+
namespace GeorgesQt
{
-
- CFormItem::CFormItem(NLGEORGES::UFormElm* elm, const QList &data, CFormItem *parent,
- NLGEORGES::UFormElm::TWhereIsValue wV, NLGEORGES::UFormElm::TWhereIsNode wN)
+ CFormItem::CFormItem()
{
- parentItem = parent;
- itemData = data;
- formElm = elm;
- whereV = wV;
- whereN = wN;
}
CFormItem::~CFormItem()
@@ -60,12 +59,14 @@ namespace GeorgesQt
int CFormItem::columnCount() const
{
//nlinfo("columnCount %d",itemData.count());
- return itemData.count();
+ //return itemData.count();
+ return 1;
}
QVariant CFormItem::data(int column) const
{
- return itemData.value(column);
+ //return itemData.value(column);
+ return QVariant(_Name.c_str());
}
CFormItem *CFormItem::parent()
@@ -83,81 +84,149 @@ namespace GeorgesQt
bool CFormItem::setData(int column, const QVariant &value)
{
- if (column < 0 || column >= itemData.size())
+ nlwarning("This should not be called anymore.");
+ return false;
+ }
+
+ bool CFormItem::isEditable(int column)
+ {
+ // Ensure only valid types can be edited.
+ if(_Type == Null)
return false;
- // TODO: default values
- if (!formElm)
+ // Make sure only the first column (name) can be editted.
+ if (column != 0)
return false;
- itemData[column] = value;
- if (formElm->isAtom())
+ if(isArrayMember())
+ return true;
+
+ return false;
+ }
+
+ bool CFormItem::isArray()
+ {
+ // If it wasn't a root node then lets check the node type.
+ const NLGEORGES::CFormDfn *parentDfn;
+ uint indexDfn;
+ const NLGEORGES::CFormDfn *nodeDfn;
+ const NLGEORGES::CType *nodeType;
+ NLGEORGES::CFormElm *node;
+ NLGEORGES::UFormDfn::TEntryType type;
+ bool array;
+ bool parentVDfnArray;
+ NLGEORGES::CForm *form = static_cast(m_form);
+ NLGEORGES::CFormElm *elm = static_cast(&form->getRootNode());
+ nlverify ( elm->getNodeByName (_FormName.c_str(), &parentDfn, indexDfn,
+ &nodeDfn, &nodeType, &node, type, array, parentVDfnArray, true, NLGEORGES_FIRST_ROUND) );
+
+ if(array && node)
+ return true;
+
+ return false;
+ }
+
+ bool CFormItem::isArrayMember()
+ {
+ CFormItem *parent = this->parent();
+
+ // If it wasn't a root node then lets check the node type.
+ const NLGEORGES::CFormDfn *parentDfn;
+ uint indexDfn;
+ const NLGEORGES::CFormDfn *nodeDfn;
+ const NLGEORGES::CType *nodeType;
+ NLGEORGES::CFormElm *parentNode;
+ NLGEORGES::UFormDfn::TEntryType type;
+ bool array;
+ bool parentVDfnArray;
+ NLGEORGES::CForm *form = static_cast(m_form);
+ NLGEORGES::CFormElm *elm = static_cast(&form->getRootNode());
+ nlverify ( elm->getNodeByName (parent->formName ().c_str (), &parentDfn, indexDfn,
+ &nodeDfn, &nodeType, &parentNode, type, array, parentVDfnArray, true, NLGEORGES_FIRST_ROUND) );
+
+ if(array && parentNode)
+ return true;
+
+ return false;
+ }
+
+ QIcon CFormItem::getItemImage(CFormItem *rootItem)
+ {
+ if(_Type == CFormItem::Null)
{
- const NLGEORGES::UType *type = formElm->getType();
- if (type)
- {
- switch (type->getType())
- {
- case NLGEORGES::UType::UnsignedInt:
- case NLGEORGES::UType::SignedInt:
- case NLGEORGES::UType::Double:
- case NLGEORGES::UType::String:
- if (parentItem->formElm->isArray())
- {
- //((NLGEORGES::CFormElm*)parentItem->formElm);//->arrayInsertNodeByName(
- //if(parentItem->formElm->getArrayNode(elmName, num))
- //{
- //}
+ return QIcon(":/images/root.ico");
+ }
+ else if(_Type == CFormItem::Form)
+ {
+ // If the parent is the root item then this is the content.
+ if(parentItem == rootItem)
+ return QIcon(":/images/root.ico");
- bool ok;
- // TODO: the node can be renamed from eg "#0" to "foobar"
- int arrayIndex = itemData[0].toString().remove("#").toInt(&ok);
- if(ok)
- {
- NLGEORGES::UFormElm *elmt = 0;
- if(parentItem->formElm->getArrayNode(&elmt, arrayIndex) && elmt)
- {
- if (elmt->isAtom())
- {
- ((NLGEORGES::CFormElmAtom*)elmt)->setValue(value.toString().toUtf8().constData());
- nldebug(QString("array element string %1 %2")
- .arg(itemData[0].toString()).arg(value.toString())
- .toUtf8().constData());
- }
- }
- }
- }
- else
+ // If it wasn't a root node then lets check the node type.
+ const NLGEORGES::CFormDfn *parentDfn;
+ uint indexDfn;
+ const NLGEORGES::CFormDfn *nodeDfn;
+ const NLGEORGES::CType *nodeType;
+ NLGEORGES::CFormElm *node;
+ NLGEORGES::UFormDfn::TEntryType type;
+ bool array;
+ bool parentVDfnArray;
+ NLGEORGES::CForm *form = static_cast(m_form);
+ NLGEORGES::CFormElm *elm = static_cast(&form->getRootNode());
+ nlverify ( elm->getNodeByName (_FormName.c_str(), &parentDfn, indexDfn, &nodeDfn, &nodeType, &node, type, array, parentVDfnArray, true, NLGEORGES_FIRST_ROUND) );
+
+ if(array)
+ {
+ return QIcon(":/images/array.ico");
+ }
+ else
+ {
+ if(type == NLGEORGES::UFormDfn::EntryType)
+ {
+ if(parentDfn)
{
- if(parentItem->formElm->setValueByName(
- value.toString().toUtf8().constData(),
- itemData[0].toString().toUtf8().constData()))
- {
- nldebug(QString("string %1 %2")
- .arg(itemData[0].toString()).arg(value.toString())
- .toUtf8().constData());
- }
- else
- {
- nldebug(QString("FAILED string %1 %2")
- .arg(itemData[0].toString()).arg(value.toString())
- .toUtf8().constData());
- }
+ // Not sure what the hell to do with this. Gets filename from parent dfn?
}
- break;
- case NLGEORGES::UType::Color:
- nldebug("Color is TODO");
- break;
- default:
- break;
+ return QIcon(":/images/zfee51.ico");
+ }
+ else if(type == NLGEORGES::UFormDfn::EntryDfn)
+ {
+ if(parentDfn)
+ {
+ // Not sure what the hell to do with this. Gets filename from parent dfn?
+ }
+ return QIcon(":/images/struct.ico");
+ }
+ else if(type == NLGEORGES::UFormDfn::EntryVirtualDfn)
+ {
+ if(node)
+ {
+ // Not sure what the hell to do with this. Gets filename from parent dfn?
+ std::string dfnName;
+ NLMISC::safe_cast(node)->getDfnName(dfnName);
+ // return dfnName.c_str() ?
+ }
+ return QIcon(":/images/vstruct.ico");
}
}
+ //return QIcon(":/images/struct.ico");
}
- else
- {
- nldebug("setting sth other than Atom");
- }
- //formElm->setValueByName();
- return true;
+ return QIcon();
}
+
+ CFormItem *CFormItem::add (TSub type, const char *name, uint structId, const char *formName, uint slot, NLGEORGES::UForm *formPtr)
+ {
+ CFormItem *newNode = new CFormItem();
+ newNode->_Type = type;
+ newNode->_Name = name;
+ newNode->parentItem = this;
+ newNode->_StructId = structId;
+ newNode->_FormName = formName;
+ newNode->_Slot = slot;
+ newNode->m_form = formPtr;
+
+ appendChild(newNode);
+ return newNode;
+ }
+
}
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formitem.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formitem.h
index f440d1cf4..cc2dafece 100644
--- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formitem.h
+++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formitem.h
@@ -18,6 +18,7 @@
#define FORMITEM_H
// NeL includes
+#include
#include
// Qt includes
@@ -28,17 +29,25 @@ namespace GeorgesQt
{
class CFormItem
-
{
public:
- CFormItem(NLGEORGES::UFormElm *elm, const QList &data,
- CFormItem *parent = 0,
- NLGEORGES::UFormElm::TWhereIsValue = NLGEORGES::UFormElm::ValueForm,
- NLGEORGES::UFormElm::TWhereIsNode = NLGEORGES::UFormElm::NodeForm);
+ // What is the sub object ?
+ enum TSub
+ {
+ Null, // Nothing in this node (root ?)
+ Header, // Header node
+ Type, // This node is a type
+ Dfn, // This node is a dfn
+ Form, // This node is a form
+ };
+
+ CFormItem();
~CFormItem();
void appendChild(CFormItem *child);
+ CFormItem *add (TSub type, const char *name, uint structId, const char *formName, uint slot, NLGEORGES::UForm *formPtr);
+
CFormItem *child(int row);
int childCount() const;
int columnCount() const;
@@ -46,23 +55,36 @@ namespace GeorgesQt
int row() const;
CFormItem *parent();
bool setData(int column, const QVariant &value);
- NLGEORGES::UFormElm* getFormElm() {return formElm;}
- NLGEORGES::UFormElm::TWhereIsValue valueFrom()
- {
- return whereV;
- }
- NLGEORGES::UFormElm::TWhereIsNode nodeFrom()
- {
- return whereN;
- }
- private:
+ TSub nodeType() { return _Type; }
+ std::string formName() { return _FormName; }
+
+ std::string name() { return _Name; }
+ void setName(std::string name) { _Name = name; }
+
+ uint structId() { return _StructId; }
+
+ NLGEORGES::UForm *form() { return m_form; }
+
+ bool isEditable(int column);
+ bool isArray();
+ bool isArrayMember();
+
+ QIcon getItemImage(CFormItem *rootItem);
+
+ private:
QList childItems;
QList itemData;
CFormItem *parentItem;
NLGEORGES::UFormElm* formElm;
- NLGEORGES::UFormElm::TWhereIsValue whereV;
- NLGEORGES::UFormElm::TWhereIsNode whereN;
+ NLGEORGES::UForm *m_form;
+
+ uint _StructId;
+ std::string _Name;
+ std::string _FormName;
+ TSub _Type;
+ uint _Slot;
+
}; // CFormItem
}
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor.qrc b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor.qrc
index 3d514dbc0..8d71d1438 100644
--- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor.qrc
+++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor.qrc
@@ -1,5 +1,12 @@
+ images/array.ico
+ images/header.ico
+ images/hold.ico
+ images/root.ico
+ images/struct.ico
+ images/vstruct.ico
+ images/zfee51.ico
images/ic_nel_georges_editor.png
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.cpp
index 6c46d4964..a0240eef8 100644
--- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.cpp
+++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.cpp
@@ -36,6 +36,7 @@
namespace GeorgesQt
{
+ QUndoStack *GeorgesEditorForm::UndoStack = NULL;
GeorgesEditorForm::GeorgesEditorForm(QWidget *parent)
: QMainWindow(parent),
@@ -62,7 +63,7 @@ namespace GeorgesQt
m_mainDock->setDockNestingEnabled(true);
layout->addWidget(m_mainDock);
- m_undoStack = new QUndoStack(this);
+ UndoStack = new QUndoStack(this);
Core::MenuManager *menuManager = Core::ICore::instance()->menuManager();
m_openAction = menuManager->action(Core::Constants::OPEN);
@@ -115,7 +116,7 @@ namespace GeorgesQt
QUndoStack *GeorgesEditorForm::undoStack() const
{
- return m_undoStack;
+ return UndoStack;
}
void GeorgesEditorForm::open()
@@ -212,7 +213,7 @@ namespace GeorgesQt
}
CGeorgesTreeViewDialog *dock = new CGeorgesTreeViewDialog(m_mainDock);
- dock->setUndoStack(m_undoStack);
+ dock->setUndoStack(UndoStack);
m_lastActiveDock = dock;
m_dockedWidgets.append(dock);
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.h
index 77fdd1ec8..c9cef964c 100644
--- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.h
+++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.h
@@ -38,6 +38,8 @@ public:
QUndoStack *undoStack() const;
+ static QUndoStack *UndoStack;
+
public Q_SLOTS:
void open();
void loadFile(const QString fileName);
@@ -54,7 +56,6 @@ private:
void readSettings();
void writeSettings();
- QUndoStack *m_undoStack;
Ui::GeorgesEditorForm m_ui;
CGeorgesDirTreeDialog *m_georgesDirTreeDialog;
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_dialog.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_dialog.cpp
index c19a01fd7..fa417019b 100644
--- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_dialog.cpp
+++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_dialog.cpp
@@ -14,14 +14,7 @@
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
-#include "stdpch.h"
#include "georges_treeview_dialog.h"
-#include "georges.h"
-#include "georgesform_model.h"
-#include "georgesform_proxy_model.h"
-#include "formitem.h"
-#include "formdelegate.h"
-#include "expandable_headerview.h"
// Qt includes
#include
@@ -43,6 +36,14 @@
#include "../core/icore.h"
#include "../core/core_constants.h"
+// Project includes
+#include "georges.h"
+#include "georgesform_model.h"
+#include "georgesform_proxy_model.h"
+#include "formitem.h"
+#include "formdelegate.h"
+#include "expandable_headerview.h"
+
using namespace NLMISC;
using namespace NLGEORGES;
@@ -60,7 +61,7 @@ namespace GeorgesQt
// Set the default sheet dir dir to the level design path.
m_lastSheetDir = ".";
QSettings *settings = Core::ICore::instance()->settings();
- settings->beginGroup(Core::Constants::DATA_PATH_SECTION);
+ settings->beginGroup(Core::Constants::DATA_PATH_SECTION);
m_lastSheetDir = settings->value(Core::Constants::LEVELDESIGN_PATH, "l:/leveldesign").toString();
settings->endGroup();
@@ -71,23 +72,14 @@ namespace GeorgesQt
m_ui.treeView->header()->setStretchLastSection(true);
m_ui.treeViewTabWidget->setTabEnabled (2,false);
- m_ui.checkBoxParent->setStyleSheet("background-color: rgba(0,255,0,30)");
- m_ui.checkBoxDefaults->setStyleSheet("background-color: rgba(255,0,0,30)");
m_form = 0;
- FormDelegate *formdelegate = new FormDelegate(this);
- m_ui.treeView->setItemDelegateForColumn(1, formdelegate);
-
- // Set up custom context menu.
- setContextMenuPolicy(Qt::CustomContextMenu);
- connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showContextMenu(const QPoint&)));
+ m_ui.treeView->setContextMenuPolicy(Qt::CustomContextMenu);
+ connect(m_ui.treeView, SIGNAL(customContextMenuRequested(const QPoint&)),
+ this, SLOT(showContextMenu(const QPoint&)));
connect(m_ui.treeView, SIGNAL(doubleClicked (QModelIndex)),
this, SLOT(doubleClicked (QModelIndex)));
- connect(m_ui.checkBoxParent, SIGNAL(toggled(bool)),
- this, SLOT(filterRows()));
- connect(m_ui.checkBoxDefaults, SIGNAL(toggled(bool)),
- this, SLOT(filterRows()));
connect(m_header, SIGNAL(headerClicked(int)),
this, SLOT(headerClicked(int)));
}
@@ -101,12 +93,12 @@ namespace GeorgesQt
void CGeorgesTreeViewDialog::headerClicked(int section)
{
if (section == 0)
- {
+ {
if (*(m_header->expanded()))
m_ui.treeView->expandAll();
else
m_ui.treeView->collapseAll();
- }
+ }
}
void CGeorgesTreeViewDialog::setForm(const CForm *form)
@@ -116,30 +108,30 @@ namespace GeorgesQt
NLGEORGES::CForm* CGeorgesTreeViewDialog::getFormByName(const QString formName)
{
- if(NLMISC::CPath::exists(formName.toUtf8().constData()))
+ if(NLMISC::CPath::exists(formName.toStdString()))
{
- //NLGEORGES::CForm *form = dynamic_cast(m_georges->loadForm(formName.toUtf8()));
- return (NLGEORGES::CForm *)m_georges->loadForm(formName.toUtf8().constData());
+ //NLGEORGES::CForm *form = dynamic_cast(m_georges->loadForm(formName.toStdString()));
+ return (NLGEORGES::CForm *)m_georges->loadForm(formName.toStdString());
}
//else
//{
// CForm *form = 0;
// // Load the DFN
- // std::string extStr = NLMISC::CFile::getExtension( formName.toUtf8() );
+ // std::string extStr = NLMISC::CFile::getExtension( formName.toStdString() );
// QString dfnName = QString("%1.dfn").arg(extStr.c_str());
// UFormDfn *formdfn;
- // if (NLMISC::CPath::exists(dfnName.toUtf8()))
+ // if (NLMISC::CPath::exists(dfnName.toStdString()))
// {
- // formdfn = _georges->loadFormDfn (dfnName.toUtf8());
+ // formdfn = _georges->loadFormDfn (dfnName.toStdString());
// if (!formdfn)
// {
- // nlwarning("Failed to load dfn: %s", dfnName.toUtf8());
+ // nlwarning("Failed to load dfn: %s", dfnName.toStdString().c_str());
// return 0;
// }
// }
// else
// {
- // nlwarning("Cannot find dfn: %s", dfnName.toUtf8());
+ // nlwarning("Cannot find dfn: %s", dfnName.toStdString().c_str());
// return 0;
// }
@@ -155,56 +147,56 @@ namespace GeorgesQt
// }
// return form;
//}
- nlinfo("File '%s' does not exist!", formName.toUtf8().constData());
+ nlinfo("File '%s' does not exist!", formName.toStdString().c_str());
return 0;
}
NLGEORGES::CForm* CGeorgesTreeViewDialog::getFormByDfnName(const QString dfnName)
{
- if(NLMISC::CPath::exists(dfnName.toUtf8().constData()))
- {
- // Create a new form object.
- NLGEORGES::CForm *form = new NLGEORGES::CForm();
- m_form = form;
+ if(NLMISC::CPath::exists(dfnName.toStdString()))
+ {
+ // Create a new form object.
+ NLGEORGES::CForm *form = new NLGEORGES::CForm();
+ m_form = form;
- // Retrieve a copy of the root definition.
- NLGEORGES::CFormDfn *formDfn = dynamic_cast(m_georges->loadFormDfn(dfnName.toUtf8().constData()));
+ // Retrieve a copy of the root definition.
+ NLGEORGES::CFormDfn *formDfn = dynamic_cast(m_georges->loadFormDfn(dfnName.toStdString()));
- // Next we'll use the root node to build a new form.
- NLGEORGES::CFormElmStruct *fes = dynamic_cast(getRootNode(0));
- fes->build(formDfn);
+ // Next we'll use the root node to build a new form.
+ NLGEORGES::CFormElmStruct *fes = dynamic_cast(getRootNode(0));
+ fes->build(formDfn);
- // And then initialize the held elements;
- for(uint i = 0; i(getRootNode(i+1));
- fes->build(formDfn);
- }
+ // And then initialize the held elements;
+ for(uint i = 0; i(getRootNode(i+1));
+ fes->build(formDfn);
+ }
- return form;
- }
- nlinfo("File '%s' does not exist!", dfnName.toUtf8().constData());
- return NULL;
+ return form;
+ }
+ nlinfo("File '%s' does not exist!", dfnName.toStdString().c_str());
+ return NULL;
}
NLGEORGES::CFormElm *CGeorgesTreeViewDialog::getRootNode(uint slot)
{
- NLGEORGES::CForm *form = getFormPtr();
+ NLGEORGES::CForm *form = getFormPtr();
- if(slot == 0)
- {
- const NLGEORGES::UFormElm &formElm = form->getRootNode();
- return (NLGEORGES::CFormElm *)&formElm;
- }
+ if(slot == 0)
+ {
+ const NLGEORGES::UFormElm &formElm = form->getRootNode();
+ return (NLGEORGES::CFormElm *)&formElm;
+ }
- // Make sure the slot value is valid and then return the corresponding element.
- nlassert(slot < NLGEORGES::CForm::HeldElementCount+1);
- return getFormPtr()->HeldElements[slot-1];
+ // Make sure the slot value is valid and then return the corresponding element.
+ nlassert(slot < NLGEORGES::CForm::HeldElementCount+1);
+ return getFormPtr()->HeldElements[slot-1];
}
NLGEORGES::CForm *CGeorgesTreeViewDialog::getFormPtr()
{
- return dynamic_cast(m_form);
+ return dynamic_cast(m_form);
}
void CGeorgesTreeViewDialog::loadFormIntoDialog(CForm *form)
@@ -218,14 +210,16 @@ namespace GeorgesQt
UFormElm *root = 0;
root = &m_form->getRootNode();
+ // Extract the parent forms into the list of parents in the dialog.
QStringList parents;
- uint cnt = form->getParentCount();
- for (uint i = 0; i < cnt /*form->getParentCount()*/; i++)
+ uint cnt = form->getParentCount();
+ for (uint i = 0; i < cnt /*form->getParentCount()*/; i++)
{
UForm *u = m_form->getParentForm(i);
parents << u->getFilename().c_str();
}
+ // Exact the comment box for the dialog.
QString comments;
comments = m_form->getComment().c_str();
@@ -249,22 +243,15 @@ namespace GeorgesQt
nlinfo("typ's %d",deps["typ"].count());
nlinfo("dfn's %d",deps["dfn"].count());
- //nlwarning(strList.join(";").toUtf8());
+ //nlwarning(strList.join(";").toStdString().c_str());
if (root)
{
loadedForm = m_form->getFilename().c_str();
- CGeorgesFormModel *model = new CGeorgesFormModel(root,deps,comments,parents,m_header->expanded());
- CGeorgesFormProxyModel *proxyModel = new CGeorgesFormProxyModel();
- proxyModel->setSourceModel(model);
- m_ui.treeView->setModel(proxyModel);
+ CGeorgesFormModel *model = new CGeorgesFormModel(m_form,deps,comments,parents,m_header->expanded());
+ m_ui.treeView->setModel(model);
m_ui.treeView->expandAll();
- // this is a debug output row
- m_ui.treeView->hideColumn(3);
- filterRows();
-
- // //_ui.treeView->setRowHidden(0,QModelIndex(),true);
connect(model, SIGNAL(dataChanged(const QModelIndex, const QModelIndex)),
this, SLOT(modifiedFile()));
@@ -276,12 +263,11 @@ namespace GeorgesQt
void CGeorgesTreeViewDialog::addParentForm(QString parentFormNm)
{
// Try to load the form
- NLGEORGES::UForm *uParentForm = m_georges->loadForm(parentFormNm.toUtf8().constData());
+ NLGEORGES::UForm *uParentForm = m_georges->loadForm(parentFormNm.toStdString());
NLGEORGES::CForm *parentForm = dynamic_cast(uParentForm);
NLGEORGES::CForm *mainForm = static_cast(m_form);
- CGeorgesFormProxyModel * proxyModel = dynamic_cast(m_ui.treeView->model());
- CGeorgesFormModel *model = dynamic_cast(proxyModel->sourceModel());
+ CGeorgesFormModel *model = dynamic_cast(m_ui.treeView->model());
if(parentForm)
{
@@ -291,11 +277,11 @@ namespace GeorgesQt
if (parentForm->Elements.FormDfn == mainForm->Elements.FormDfn)
{
// This is the parent form selector
- if(!mainForm->insertParent(mainForm->getParentCount(),parentFormNm.toUtf8(), parentForm))
- nlwarning("Failed to add parent form: %s", parentFormNm.toUtf8().constData());
+ if(!mainForm->insertParent(mainForm->getParentCount(),parentFormNm.toStdString().c_str(), parentForm))
+ nlwarning("Failed to add parent form: %s", parentFormNm.toStdString().c_str());
else
{
- nlinfo("Successfullyadded parent form: %s", parentFormNm.toUtf8().constData());
+ nlinfo("Successfullyadded parent form: %s", parentFormNm.toStdString().c_str());
model->addParentForm(parentFormNm);
}
}
@@ -316,12 +302,12 @@ namespace GeorgesQt
void CGeorgesTreeViewDialog::write( )
{
- NLMISC::COFile file;
- std::string s = NLMISC::CPath::lookup(loadedForm.toUtf8().constData(), false);
- if(file.open (s))
- {
- try
- {
+ NLMISC::COFile file;
+ std::string s = NLMISC::CPath::lookup(loadedForm.toStdString(), false);
+ if(file.open (s))
+ {
+ try
+ {
// if (loadedForm.contains(".typ"))
// {
// //nlassert (Type != NULL);
@@ -334,7 +320,7 @@ namespace GeorgesQt
// // flushValueChange ();
// //}
// //Type->write (xmlStream.getDocument (), theApp.Georges4CVS);
- // //modify (NULL, NULL, false);
+ // //modify (NULL, NULL, false);
// //flushValueChange ();
// //UpdateAllViews (NULL);
// //return TRUE;
@@ -356,9 +342,9 @@ namespace GeorgesQt
// }
// else
// {
- nlassert (m_form != NULL);
+ nlassert (m_form != NULL);
- // Write the file
+ // Write the file
// /*if (IsModified ())
// {
// ((CForm*)(UForm*)Form)->Header.MinorVersion++;
@@ -380,33 +366,29 @@ namespace GeorgesQt
// // Get the left view
// //CView* pView = getLeftView ();
// }
- }
- catch (Exception &e)
- {
- nlerror("Error while loading file: %s", e.what());
- }
- }
- else
- {
- nlerror("Can't open the file %s for writing.", s.c_str());
- }
+ }
+ catch (Exception &e)
+ {
+ nlerror("Error while loading file: %s", e.what());
+ }
+ }
+ else
+ {
+ nlerror("Can't open the file %s for writing.", s.c_str());
+ }
}
void CGeorgesTreeViewDialog::doubleClicked ( const QModelIndex & index )
{
- // TODO: this is messy :( perhaps this can be done better
- CGeorgesFormProxyModel * proxyModel =
- dynamic_cast(m_ui.treeView->model());
- CGeorgesFormModel *model =
- dynamic_cast(proxyModel->sourceModel());
- QModelIndex sourceIndex = proxyModel->mapToSource(index);
+ //CGeorgesFormModel *model =
+ // dynamic_cast((m_ui.treeView->model());
- CFormItem *item = model->getItem(sourceIndex);
+ //CFormItem *item = model->getItem(index);
- if (item->parent() && item->parent()->data(0) == "parents")
- {
- Q_EMIT changeFile(CPath::lookup(item->data(0).toString().toUtf8().constData(),false).c_str());
- }
+ //if (item->parent() && item->parent()->data(0) == "parents")
+ //{
+ // Q_EMIT changeFile(CPath::lookup(item->data(0).toString().toStdString(),false).c_str());
+ //}
//// col containing additional stuff like icons
//if (index.column() == 2)
@@ -415,7 +397,7 @@ namespace GeorgesQt
// CFormItem *item = m->getItem(in2);
// QString value = item->data(1).toString();
- // QString path = CPath::lookup(value.toUtf8(),false).c_str();
+ // QString path = CPath::lookup(value.toStdString(),false).c_str();
// if(value.contains(".tga") || value.contains(".png"))
// {
@@ -443,7 +425,7 @@ namespace GeorgesQt
// {
// Modules::objViewInt()->resetScene();
// //Modules::config().configRemapExtensions();
- // Modules::objViewInt()->loadMesh(path.toUtf8(),"");
+ // Modules::objViewInt()->loadMesh(path.toStdString(),"");
// }
// return;
// }
@@ -472,12 +454,12 @@ namespace GeorgesQt
void CGeorgesTreeViewDialog::filterRows()
{
- CGeorgesFormProxyModel * mp = dynamic_cast(m_ui.treeView->model());
- CGeorgesFormModel *m = dynamic_cast(mp->sourceModel());
- if (m) {
- m->setShowParents(m_ui.checkBoxParent->isChecked());
- m->setShowDefaults(m_ui.checkBoxDefaults->isChecked());
- }
+ //CGeorgesFormProxyModel * mp = dynamic_cast(m_ui.treeView->model());
+ //CGeorgesFormModel *m = dynamic_cast(mp->sourceModel());
+ //if (m) {
+ // m->setShowParents(m_ui.checkBoxParent->isChecked());
+ // m->setShowDefaults(m_ui.checkBoxDefaults->isChecked());
+ //}
}
void CGeorgesTreeViewDialog::showContextMenu(const QPoint &pos)
@@ -485,116 +467,135 @@ namespace GeorgesQt
QMenu contextMenu;
QMenu *structContext = NULL;
QPoint globalPos = this->mapToGlobal(pos);
-
+
// Fisrt we're going to see if we've right clicked on a new item and select it.
const QModelIndex &index = this->m_ui.treeView->currentIndex();
if(!index.isValid())
return;
- CGeorgesFormProxyModel * mp = dynamic_cast(m_ui.treeView->model());
- CGeorgesFormModel *m = dynamic_cast(mp->sourceModel());
- QModelIndex sourceIndex = mp->mapToSource(index);
+ CGeorgesFormModel *m = dynamic_cast(m_ui.treeView->model());
- if (m)
+ if(m)
{
-
- CFormItem *item = m->getItem(sourceIndex);
+ CFormItem *item = m->getItem(index);
// Right click on the "parents" item
- if (item->data(0) == "parents")
- contextMenu.addAction("Add parent...");
- // Right click on a parent item
- else if(item->parent() && item->parent()->data(0) == "parents")
+ // if (item->data(0) == "parents")
+ // contextMenu.addAction("Add parent...");
+ // // Right click on a parent item
+ // else if(item->parent() && item->parent()->data(0) == "parents")
+ // {
+ // contextMenu.addAction("Add parent...");
+ // contextMenu.addAction("Remove parent");
+ // }
+ if(item->isArray())
{
- contextMenu.addAction("Add parent...");
- contextMenu.addAction("Remove parent");
+ contextMenu.addAction("Append array entry...");
}
- else if(item->getFormElm()->isArray())
- contextMenu.addAction("Add array entry...");
- else if(item->getFormElm()->isStruct())
+ else if(item->isArrayMember())
{
- QMenu *structContext = new QMenu("Add struct element...", this);
- contextMenu.addMenu(structContext);
-
- NLGEORGES::UFormDfn *defn = item->getFormElm()->getStructDfn();
- if(defn)
- {
- for(uint defnNum=0; defnNum < defn->getNumEntry(); defnNum++)
- {
- std::string entryName;
- std::string dummy;
- UFormElm::TWhereIsValue *whereV = new UFormElm::TWhereIsValue;
- bool result = defn->getEntryName(defnNum, entryName);
- bool result2 = item->getFormElm()->getValueByName(dummy, entryName.c_str(), NLGEORGES::UFormElm::Eval, whereV);
-
-
- if(result2 && *whereV != UFormElm::ValueForm)
- {
- structContext->addAction(entryName.c_str());
- }
- delete whereV;
- }
- }
+ contextMenu.addAction("Delete array entry...");
+ contextMenu.addAction("Insert after array entry...");
}
- else if(item->getFormElm()->isAtom() && item->valueFrom() == NLGEORGES::UFormElm::ValueForm)
- contextMenu.addAction("Revert to parent/default...");
+ // else if(item->getFormElm()->isStruct())
+ // {
+ // QMenu *structContext = new QMenu("Add struct element...", this);
+ // contextMenu.addMenu(structContext);
- QAction *selectedItem = contextMenu.exec(globalPos);
- if(selectedItem)
- {
- if(selectedItem->text() == "Add parent...")
- {
- // Get the file extension of the form so we can build a dialog pattern.
- QString file = m_form->getFilename().c_str();
- file = file.remove(0,file.indexOf(".")+1);
- QString filePattern = "Parent Sheets (*."+file+")";
-
- nlinfo("parent defn name '%s'", file.toUtf8().constData());
- QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("Select parent sheets..."), m_lastSheetDir, filePattern);
- if(!fileNames.isEmpty())
- {
- Q_FOREACH(QString fileToParent, fileNames)
- {
- // Get just the filename. Georges doesn't want the path.
- QFileInfo pathInfo( fileToParent );
- QString tmpFileName( pathInfo.fileName() );
+ // NLGEORGES::UFormDfn *defn = item->getFormElm()->getStructDfn();
+ // if(defn)
+ // {
+ // for(uint defnNum=0; defnNum < defn->getNumEntry(); defnNum++)
+ // {
+ // std::string entryName;
+ // std::string dummy;
+ // UFormElm::TWhereIsValue *whereV = new UFormElm::TWhereIsValue;
+ // bool result = defn->getEntryName(defnNum, entryName);
+ // bool result2 = item->getFormElm()->getValueByName(dummy, entryName.c_str(), NLGEORGES::UFormElm::Eval, whereV);
- nlinfo("requesting to add parent form '%s'", tmpFileName.toUtf8().constData());
-
- // Call to add the form and load it into the Georges form.
- addParentForm(tmpFileName);
+ //
+ // if(result2 && *whereV != UFormElm::ValueForm)
+ // {
+ // structContext->addAction(entryName.c_str());
+ // }
+ // delete whereV;
+ // }
+ // }
+ // }
+ // else if(item->getFormElm()->isAtom() && item->valueFrom() == NLGEORGES::UFormElm::ValueForm)
+ // contextMenu.addAction("Revert to parent/default...");
- // Save the file lookup path for future dialog boxes.
- m_lastSheetDir = pathInfo.absolutePath();
- }
- }
- m_ui.treeView->expandAll();
- }
- else if(selectedItem->text() == "Remove parent")
- {
- NLGEORGES::CForm *form = static_cast(m_form);
- QString parentFileName = item->data(0).toString();
+ QAction *selectedItem = contextMenu.exec(QCursor::pos());
+ if(selectedItem)
+ {
+ if(selectedItem->text() == "Append array entry...")
+ {
- for(uint num = 0; num < form->getParentCount(); num++)
- {
- QString curParentName = form->getParent(num)->getFilename().c_str();
- if(parentFileName == curParentName)
- {
- form->removeParent(num);
- m->removeParentForm(parentFileName);
- break;
- }
- }
- m_ui.treeView->expandAll();
- }
+ } // Append an array entry...
+ else if(selectedItem->text() == "Delete array entry...")
+ {
- } // if selected context menu item is valid.
+ }
+ else if(selectedItem->text() == "Insert after array entry...")
+ {
+
+ }
+
+
+ // if(selectedItem->text() == "Add parent...")
+ // {
+ // // Get the file extension of the form so we can build a dialog pattern.
+ // QString file = m_form->getFilename().c_str();
+ // file = file.remove(0,file.indexOf(".")+1);
+ // QString filePattern = "Parent Sheets (*."+file+")";
+ //
+ // nlinfo("parent defn name '%s'", file.toStdString().c_str());
+ // QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("Select parent sheets..."), m_lastSheetDir, filePattern);
+ // if(!fileNames.isEmpty())
+ // {
+ // Q_FOREACH(QString fileToParent, fileNames)
+ // {
+ // // Get just the filename. Georges doesn't want the path.
+ // QFileInfo pathInfo( fileToParent );
+ // QString tmpFileName( pathInfo.fileName() );
+
+ // nlinfo("requesting to add parent form '%s'", tmpFileName.toStdString().c_str());
+ //
+ // // Call to add the form and load it into the Georges form.
+ // addParentForm(tmpFileName);
+
+ // // Save the file lookup path for future dialog boxes.
+ // m_lastSheetDir = pathInfo.absolutePath();
+ // }
+ // }
+ // m_ui.treeView->expandAll();
+ // }
+ // else if(selectedItem->text() == "Remove parent")
+ // {
+ // NLGEORGES::CForm *form = static_cast(m_form);
+ // QString parentFileName = item->data(0).toString();
+
+ // for(uint num = 0; num < form->getParentCount(); num++)
+ // {
+ // QString curParentName = form->getParent(num)->getFilename().c_str();
+ // if(parentFileName == curParentName)
+ // {
+ // form->removeParent(num);
+ // m->removeParentForm(parentFileName);
+ // break;
+ // }
+ // }
+
+ // m_ui.treeView->expandAll();
+ // }
+
+ } // if selected context menu item is valid.
} // if 'm' model valid.
- if(structContext)
- delete structContext;
+ //if(structContext)
+ // delete structContext;
}
} /* namespace GeorgesQt */
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_dialog.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_dialog.h
index e34ab572b..6f7b57acc 100644
--- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_dialog.h
+++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_dialog.h
@@ -57,14 +57,14 @@ namespace GeorgesQt
bool isModified() {return m_modified;}
void setModified(bool m) {m_modified = m;}
- NLGEORGES::CForm* getFormByName(const QString formName);
- NLGEORGES::CForm* getFormByDfnName(const QString dfnName);
+ NLGEORGES::CForm* getFormByName(const QString formName);
+ NLGEORGES::CForm* getFormByDfnName(const QString dfnName);
- /// Retrieves the root element based on the slot (document or held elements.)
- NLGEORGES::CFormElm *getRootNode(uint slot);
+ /// Retrieves the root element based on the slot (document or held elements.)
+ NLGEORGES::CFormElm *getRootNode(uint slot);
- /// Returns the form as a CForm pointer.
- NLGEORGES::CForm *getFormPtr();
+ /// Returns the form as a CForm pointer.
+ NLGEORGES::CForm *getFormPtr();
void addParentForm(QString parentFormNm);
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_form.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_form.ui
index 8d53bfdd6..0bf52a3ea 100644
--- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_form.ui
+++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_form.ui
@@ -6,8 +6,8 @@
0
0
- 400
- 300
+ 564
+ 525
@@ -18,8 +18,8 @@
- 199
- 165
+ 280
+ 242
@@ -29,9 +29,21 @@
-
+
+
+ 0
+ 0
+
+
+
-
+
+
+ 0
+ 0
+
+
QTabWidget::West
@@ -39,60 +51,40 @@
0
-
- Qt::NoFocus
-
Form
-
-
- 0
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- 0
- 0
-
-
-
- true
-
-
-
- -
-
-
- Parent
-
-
-
- -
-
+
+
-
+
Qt::Horizontal
-
-
- 40
- 20
-
-
-
-
- -
-
-
- Defaults
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 0
+
+
+
+ true
+
+
+
+
+
+ 0
+ 0
+
+
+
@@ -126,8 +118,14 @@
-
-
-
+
+
+ QtTreePropertyBrowser
+ QWidget
+
+ 1
+
+
+
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_model.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_model.cpp
index dd0220bbf..387bc8917 100644
--- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_model.cpp
+++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_model.cpp
@@ -14,17 +14,20 @@
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
-#include "stdpch.h"
#include "georgesform_model.h"
-#include "formitem.h"
+
+// System Includes
+#include
// NeL includes
#include
#include
#include
+#include
#include
#include
#include
+#include
// Qt includes
#include
@@ -37,668 +40,522 @@
#include
#include
+// project includes
+#include "formitem.h"
+#include "georges_editor_form.h"
+#include "actions.h"
+
using namespace NLGEORGES;
namespace GeorgesQt
{
- CGeorgesFormModel::CGeorgesFormModel(UFormElm *rootElm, QMap< QString, QStringList> deps,
- QString comment, QStringList parents, bool *expanded, QObject *parent) : QAbstractItemModel(parent)
- {
-
- m_rootData << "Value" << "Data" << "Extra";// << "Type";
- m_rootElm = rootElm;
- m_rootItem = new CFormItem(m_rootElm, m_rootData);
- m_dependencies = deps;
- m_comments = comment;
- m_parents = parents;
- m_parentRows = new QList;
- m_expanded = expanded;
+ CGeorgesFormModel::CGeorgesFormModel(UForm *form, QMap< QString, QStringList> deps,
+ QString comment, QStringList parents, bool *expanded, QObject *parent) : QAbstractItemModel(parent)
+ {
+ m_form = form;
+ m_rootData << "Value" << "Data" << "Extra";// << "Type";
+ m_rootItem = new CFormItem();
+ m_dependencies = deps;
+ m_comments = comment;
+ m_parents = parents;
+ m_parentRows = new QList;
+ m_expanded = expanded;
- setupModelData();
- }
+ setupModelData();
+ }
- CGeorgesFormModel::~CGeorgesFormModel()
- {
- delete m_rootItem;
- }
+ CGeorgesFormModel::~CGeorgesFormModel()
+ {
+ delete m_rootItem;
+ }
- /******************************************************************************/
+ /******************************************************************************/
- QVariant CGeorgesFormModel::data(const QModelIndex &p_index, int p_role) const
- {
- if (!p_index.isValid())
- return QVariant();
+ QVariant CGeorgesFormModel::data(const QModelIndex &p_index, int p_role) const
+ {
+ if (!p_index.isValid())
+ return QVariant();
- switch (p_role)
- {
- case Qt::DisplayRole:
- {
- return getItem(p_index)->data(p_index.column());
- }
- case Qt::BackgroundRole:
- {
- QBrush defaultBrush = QBrush(QColor(255,0,0,30));
- QBrush parentBrush = QBrush(QColor(0,255,0,30));
-
- // if elm not existing it must be some kind of default or type value
- if(!getItem(p_index)->getFormElm())
- {
- return defaultBrush;
- }
-
- // else it might be some parent elm
- switch (getItem(p_index)->nodeFrom())
- {
- case NLGEORGES::UFormElm::NodeParentForm:
- {
- return parentBrush;
- }
- case NLGEORGES::UFormElm::NodeForm:
- {
- switch (getItem(p_index)->valueFrom())
- {
- case NLGEORGES::UFormElm::ValueParentForm:
- {
- return parentBrush;
- }
- default:
- {
- // parent status test kindof ugly, testing only 2 steps deep
- // only needed for colorization as treeview default hides childs
- // when parent is hidden
- CFormItem *parent = getItem(p_index)->parent();
- if (parent)
- {
- if (parent->nodeFrom() == NLGEORGES::UFormElm::NodeParentForm)
- {
- return parentBrush;
- }
-
- CFormItem *parentParent = parent->parent();
- if (parentParent)
- {
- if (parentParent->nodeFrom() == NLGEORGES::UFormElm::NodeParentForm)
- {
- return parentBrush;
- }
- } // endif parentParent
- } // endif parent
- } // end default
- } // end switch valueFrom
- } // end case nodeForm
- } // end switch nodeFrom
- return QVariant();
- }
+ switch (p_role)
+ {
+ case Qt::DisplayRole:
+ {
+ return getItem(p_index)->data(p_index.column());
+ }
case Qt::DecorationRole:
{
- if (p_index.column() == 2)
- {
- //p_index.
- QModelIndex in = index(p_index.row(),p_index.column()-1,p_index.parent());
- CFormItem *item = getItem(in);
-
- QString value = item->data(1).toString();
- //QString path = NLMISC::CPath::lookup(value.toUtf8().constData(),false).c_str();
-
- /*if (value.contains(".shape"))
- {
- if (Modules::objViewInt())
- {
- QIcon *icon = Modules::objViewInt()->saveOneImage(value.toUtf8().constData());
- if (icon)
- {
- if(icon->isNull())
- return QIcon(":/images/pqrticles.png");
- else
- return QIcon(*icon);
- }
- else
- {
- return QIcon();
- }
- }
- }*/
- if(value.contains(".tga") || value.contains(".png"))
- {
- QString path = NLMISC::CPath::lookup(value.toUtf8().constData(),false).c_str();
- if(path.isEmpty())
- {
- path = ":/images/pqrticles.png";
- }
- return QIcon(path);
- }
- }
- return QVariant();
- break;
+ // Based on the _Type return a QIcon from resources.
+ CFormItem *item = getItem(p_index);
+ return item->getItemImage(m_rootItem);
}
- case Qt::ToolTipRole:
- {
- if (p_index.column() == 2)
- {
- QModelIndex in = index(p_index.row(),p_index.column()-1,p_index.parent());
- CFormItem *item = getItem(in);
- QString value = item->data(1).toString();
-
- /*if (value.contains(".shape"))
- {
- if (Modules::objViewInt())
- {
- QIcon *icon = Modules::objViewInt()->saveOneImage(value.toUtf8().constData());
- if (icon)
- {
- if(icon->isNull())
- return QIcon(":/images/pqrticles.png");
- else
- return QIcon(*icon);
- }
- else
- {
- return QIcon();
- }
- }
- }*/
- if(value.contains(".tga") || value.contains(".png"))
- {
- QString path = NLMISC::CPath::lookup(value.toUtf8().constData(),false).c_str();
- if(path.isEmpty())
- {
- path = ":/images/pqrticles.png";
- }
+ default:
+ return QVariant();
+ }
+ }
- QString imageTooltip = QString("").arg(path);
-
- return imageTooltip;
- }
- }
- return QVariant();
- break;
- }
- default:
- return QVariant();
- }
- }
+ /******************************************************************************/
- /******************************************************************************/
+ CFormItem *CGeorgesFormModel::getItem(const QModelIndex &index) const
+ {
+ if (index.isValid())
+ {
+ CFormItem *item = static_cast(index.internalPointer());
+ if (item)
+ return item;
+ }
+ return m_rootItem;
+ }
- CFormItem *CGeorgesFormModel::getItem(const QModelIndex &index) const
- {
- if (index.isValid())
- {
- CFormItem *item = static_cast(index.internalPointer());
- if (item)
- return item;
- }
- return m_rootItem;
- }
+ /******************************************************************************/
- /******************************************************************************/
+ bool CGeorgesFormModel::setData(const QModelIndex &index, const QVariant &value, int role)
+ {
- bool CGeorgesFormModel::setData(const QModelIndex &index, const QVariant &value,
- int role)
- {
+ if (role != Qt::EditRole)
+ return false;
+
+ CFormItem *item = getItem(index);
- if (role != Qt::EditRole)
+ if(!item->isEditable(index.column()))
return false;
+ GeorgesEditorForm::UndoStack->push(new CUndoFormArrayRenameCommand(this,item,value));
+
+ Q_EMIT dataChanged(index, index);
+
+ //setupModelData();
+ return true;
+ }
+
+ /******************************************************************************/
+
+ Qt::ItemFlags CGeorgesFormModel::flags(const QModelIndex& index) const {
+
+ if (!index.isValid())
+ return 0;
+
+ Qt::ItemFlags returnValue = Qt::ItemIsSelectable | Qt::ItemIsEnabled;
+
CFormItem *item = getItem(index);
- bool result = item->setData(index.column(), value);
-
- Q_EMIT dataChanged(index, index);
-
- //setupModelData();
- return result;
- }
-
- /******************************************************************************/
-
- Qt::ItemFlags CGeorgesFormModel::flags(const QModelIndex& index) const {
-
- if (!index.isValid())
- return 0;
-
- Qt::ItemFlags returnValue = Qt::ItemIsSelectable | Qt::ItemIsEnabled;
-
- if(index.column() == 1)
- returnValue |= Qt::ItemIsEditable;
-
- return returnValue;
-
- }
-
- /******************************************************************************/
-
- QVariant CGeorgesFormModel::headerData(int section,
- Qt::Orientation orientation, int role) const
- {
- if (orientation == Qt::Horizontal)
- {
- if (role == Qt::DisplayRole)
- return m_rootItem->data(section);
- if (role == Qt::TextAlignmentRole)
- return Qt::AlignLeft;
- if (section == 0 && role == Qt::DecorationRole)
- {
- // transparent pixmap as we paint it ourself with tree brach
- // if we extend the HeaderView::paintSection for the CE_HeaderLabel
- // we could drop this
- QPixmap pixmap = QPixmap(
- QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize),
- QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize));
- // Create new picture for transparent
- QPixmap transparent(pixmap.size());
-
- // Do transparency
- transparent.fill(Qt::transparent);
- QPainter p(&transparent);
- p.setCompositionMode(QPainter::CompositionMode_Source);
- p.drawPixmap(0, 0, pixmap);
- p.setCompositionMode(QPainter::CompositionMode_DestinationIn);
- // Set transparency level to 150 (possible values are 0-255)
- // The alpha channel of a color specifies the transparency effect,
- // 0 represents a fully transparent color, while 255 represents
- // a fully opaque color.
- p.fillRect(transparent.rect(), QColor(0, 0, 0, 0));
- p.end();
-
- // Set original picture's reference to new transparent one
- pixmap = transparent;
- return pixmap;
- }
- }
- return QVariant();
- }
-
- /******************************************************************************/
-
- QModelIndex CGeorgesFormModel::index(int row, int column, const QModelIndex &parent)
- const
- {
- if (!hasIndex(row, column, parent))
- return QModelIndex();
-
- CFormItem *parentItem;
-
- if (!parent.isValid())
- parentItem = m_rootItem;
- else
- parentItem = static_cast(parent.internalPointer());
-
- CFormItem *childItem = parentItem->child(row);
- if (childItem)
- return createIndex(row, column, childItem);
- else
- return QModelIndex();
- }
-
- /******************************************************************************/
-
- QModelIndex CGeorgesFormModel::parent(const QModelIndex &index) const
- {
- if (!index.isValid())
- return QModelIndex();
-
- CFormItem *childItem = static_cast(index.internalPointer());
- CFormItem *parentItem = childItem->parent();
-
- if (parentItem == m_rootItem)
- return QModelIndex();
-
- return createIndex(parentItem->row(), 0, parentItem);
- }
-
- /******************************************************************************/
-
- int CGeorgesFormModel::rowCount(const QModelIndex &parent) const {
-
- CFormItem *parentItem;
- if (parent.column() > 0)
- return 0;
-
- if (!parent.isValid())
- parentItem = m_rootItem;
- else
- parentItem = static_cast(parent.internalPointer());
-
- return parentItem->childCount();
-
- }
-
- /******************************************************************************/
-
- int CGeorgesFormModel::columnCount(const QModelIndex &parent) const {
-
- if (parent.isValid())
- return static_cast(parent.internalPointer())->columnCount();
- else
- return m_rootItem->columnCount();
-
- }
-
- /******************************************************************************/
-
- void CGeorgesFormModel::loadFormData(UFormElm *root, CFormItem *parent) {
-
- if (!root)
- return;
-
- uint num = 0;
-
- if (root->isStruct())
- {
- //((CFormElm*)root)->getForm()->getComment();
- uint structSize = 0;
- root->getStructSize(structSize);
- while (num < structSize)
- {
- UFormElm::TWhereIsNode *whereN = new UFormElm::TWhereIsNode;
- UFormElm::TWhereIsValue *whereV = new UFormElm::TWhereIsValue;
- // Append a new item to the current parent's list of children.
- std::string elmName;
- if(root->getStructNodeName(num, elmName))
- {
- QList columnData;
- //QVariant value;
- std::string value;
- //NLMISC::CRGBA value_color;
- //uint value_uint;
- //sint value_sint;
- //double value_double;
- QString elmtType;
- UFormElm *elmt = 0;
- if(root->getNodeByName(&elmt, elmName.c_str(), whereN, true))
- {
- if (elmt)
- {
- if (elmt->isArray())
- elmtType = "Array";
- if (elmt->isStruct())
- elmtType = "Struct";
- if (elmt->isAtom())
- {
- elmtType = "Atom";
- uint numDefinitions = 0;
- const UType *type = elmt->getType();
- if (type)
- {
- numDefinitions = type->getNumDefinition();
- root->getValueByName(value, elmName.c_str(),UFormElm::Eval,whereV);
- switch (type->getType())
- {
- case UType::UnsignedInt:
- {
- uint v;
- NLMISC::fromString(value, v);
- value = NLMISC::toString(v);
- elmtType.append("_uint");break;
- }
- case UType::SignedInt:
- {
- sint v;
- NLMISC::fromString(value, v);
- value = NLMISC::toString(v);
- elmtType.append("_sint");break;
- }
- case UType::Double:
- float v;
- NLMISC::fromString(value, v);
- value = NLMISC::toString(v);
- elmtType.append("_double");break;
- case UType::String:
- elmtType.append("_string");break;
- case UType::Color:
- elmtType.append("_color");break;
- default:
- elmtType.append("_unknownType");
- }
- }
- else
- {
- elmtType.append("_noType");
- }
-
- if (numDefinitions)
- {
- std::string l, v;
- QString tmpLabel, tmpValue;
- for (uint i = 0; i < numDefinitions; i++)
- {
- type->getDefinition(i,l,v);
- tmpLabel = l.c_str();
- tmpValue = v.c_str();
- if (type->getType() == UType::SignedInt)
- {
- if (QString("%1").arg(value.c_str()).toDouble() == tmpValue.toDouble()) {
- value = l;
- break;
- }
- }
- if (type->getType() == UType::String)
- {
- if (QString(value.c_str()) == tmpValue)
- {
- value = l;
- break;
- }
- }
- }
- }
- }
- if (elmt->isVirtualStruct())
- {
- root->getValueByName(value, elmName.c_str(),UFormElm::Eval,whereV);
- elmtType = "VirtualStruct";
- }
- switch (*whereN)
- {
- case UFormElm::NodeForm:
- elmtType.append("_fromForm"); break;
- case UFormElm::NodeParentForm:
- elmtType.append("_fromParentForm"); break;
- case UFormElm::NodeDfn:
- elmtType.append("_isDFN"); break;
- case UFormElm::NodeType:
- elmtType.append("_isType"); break;
- default:
- elmtType.append("_noNode");
- }
- switch (*whereV)
- {
- case UFormElm::ValueForm:
- elmtType.append("_formValue"); break;
- case UFormElm::ValueParentForm:
- elmtType.append("_parentValue"); break;
- case UFormElm::ValueDefaultDfn:
- elmtType.append("_dfnValue"); break;
- case UFormElm::ValueDefaultType:
- elmtType.append("_typeValue"); break;
- default:
- elmtType.append("_noValue");
- }
- columnData << QString(elmName.c_str()) << QString(value.c_str()) << "";// << elmtType;
- parent->appendChild(new CFormItem(elmt, columnData, parent, *whereV, *whereN));
- //if (parents.last()->childCount() > 0) {
- // parents << parents.last()->child(parents.last()->childCount()-1);
- //}
- loadFormData(elmt, parent->child(parent->childCount()-1));
- }
- else
- {
- // add Defaults
- // TODO: spams warnings for non ATOM values but i dont get type of non existing nodes
- bool success = root->getValueByName(value, elmName.c_str(),UFormElm::Eval,whereV);
- switch (*whereN)
- {
- case UFormElm::NodeForm:
- elmtType.append("_fromForm"); break;
- case UFormElm::NodeParentForm:
- elmtType.append("_fromParentForm"); break;
- case UFormElm::NodeDfn:
- elmtType.append("_isDFN"); break;
- case UFormElm::NodeType:
- elmtType.append("_isType"); break;
- default:
- elmtType.append("_noNode");
- }
- switch (*whereV)
- {
- case UFormElm::ValueForm:
- elmtType.append("_formValue"); break;
- case UFormElm::ValueParentForm:
- elmtType.append("_parentValue"); break;
- case UFormElm::ValueDefaultDfn:
- elmtType.append("_dfnValue"); break;
- case UFormElm::ValueDefaultType:
- elmtType.append("_typeValue"); break;
- default:
- elmtType.append("_noValue");
- }
-
- columnData << QString(elmName.c_str()) << QString(value.c_str()) << "";// << elmtType;
- parent->appendChild(new CFormItem(elmt, columnData, parent, *whereV, *whereN));
- }
- }
- else
- {
- nlinfo("getNodeByName returned false");
- }
- }
- num++;
- }
+ if(item->isEditable(index.column()))
+ {
+ returnValue |= Qt::ItemIsEditable;
}
- if (root->isArray())
- {
- uint arraySize = 0;
- root->getArraySize(arraySize);
- while (num < arraySize)
- {
- std::string elmName;
- if(root->getArrayNodeName(elmName, num))
- {
- QList columnData;
- std::string value;
- QString elmtType;
- UFormElm *elmt = 0;
- if(root->getArrayNode(&elmt,0) && elmt)
- {
- if (elmt->isArray())
- elmtType = "Array";
- if (elmt->isStruct()) {
- elmtType = "Struct";
- }
- if (elmt->isAtom())
- {
- elmt->getValue(value);
- elmtType = "Atom";
- }
- if (elmt->isVirtualStruct())
- elmtType = "VirtualStruct";
+ return returnValue;
- elmtType.append("_arrayValue");
- columnData << QString(elmName.c_str()) << QString(value.c_str()) << "";// << elmtType;
- parent->appendChild(new CFormItem(elmt, columnData, parent));
- loadFormData(elmt, parent->child(parent->childCount()-1));
- }
- }
- num++;
- }
- }
- }
+ }
- /******************************************************************************/
+ /******************************************************************************/
- void CGeorgesFormModel::loadFormHeader()
+ QVariant CGeorgesFormModel::headerData(int section,
+ Qt::Orientation orientation, int role) const
+ {
+ if (orientation == Qt::Horizontal)
+ {
+ if (role == Qt::DisplayRole)
+ return m_rootItem->data(section);
+ if (role == Qt::TextAlignmentRole)
+ return Qt::AlignLeft;
+ if (section == 0 && role == Qt::DecorationRole)
+ {
+ // transparent pixmap as we paint it ourself with tree brach
+ // if we extend the HeaderView::paintSection for the CE_HeaderLabel
+ // we could drop this
+ QPixmap pixmap = QPixmap(
+ QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize),
+ QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize));
+ // Create new picture for transparent
+ QPixmap transparent(pixmap.size());
+
+ // Do transparency
+ transparent.fill(Qt::transparent);
+ QPainter p(&transparent);
+ p.setCompositionMode(QPainter::CompositionMode_Source);
+ p.drawPixmap(0, 0, pixmap);
+ p.setCompositionMode(QPainter::CompositionMode_DestinationIn);
+ // Set transparency level to 150 (possible values are 0-255)
+ // The alpha channel of a color specifies the transparency effect,
+ // 0 represents a fully transparent color, while 255 represents
+ // a fully opaque color.
+ p.fillRect(transparent.rect(), QColor(0, 0, 0, 0));
+ p.end();
+
+ // Set original picture's reference to new transparent one
+ pixmap = transparent;
+ return pixmap;
+ }
+ }
+ return QVariant();
+ }
+
+ /******************************************************************************/
+
+ QModelIndex CGeorgesFormModel::index(int row, int column, const QModelIndex &parent)
+ const
+ {
+ if (!hasIndex(row, column, parent))
+ return QModelIndex();
+
+ CFormItem *parentItem;
+
+ if (!parent.isValid())
+ parentItem = m_rootItem;
+ else
+ parentItem = static_cast(parent.internalPointer());
+
+ CFormItem *childItem = parentItem->child(row);
+ if (childItem)
+ return createIndex(row, column, childItem);
+ else
+ return QModelIndex();
+ }
+
+ QModelIndex CGeorgesFormModel::index(int row, int column, CFormItem *item) const
{
+ if(item == m_rootItem)
+ return QModelIndex();
- if (m_parents.size())
- {
- CFormItem *fi_pars = new CFormItem(m_rootElm, QList() << "parents" << "" << "", m_rootItem);
- m_rootItem->appendChild(fi_pars);
-
- Q_FOREACH(QString str, m_parents)
- {
- fi_pars->appendChild(new CFormItem(m_rootElm, QList() << str << "" << "", fi_pars));
- }
- }
-
- /*QStringList dfns = _dependencies["dfn"];
- QStringList typs = _dependencies["typ"];
-
- _dependencies.remove("dfn");
- _dependencies.remove("typ");
-
- CFormItem *fi_dep = new CFormItem(_rootElm, QList() << "dependencies", _rootItem);
- _rootItem->appendChild(fi_dep);
-
- if (!dfns.isEmpty()) {
- CFormItem *fi_dfn = new CFormItem(_rootElm, QList() << "dfn", fi_dep);
- fi_dep->appendChild(fi_dfn);
- foreach(QString str, dfns) {
- fi_dfn->appendChild(new CFormItem(_rootElm, QList() << str, fi_dfn));
- }
- }
- if (!typs.isEmpty()) {
- CFormItem *fi_typ = new CFormItem(_rootElm, QList() << "typ", fi_dep);
- fi_dep->appendChild(fi_typ);
- foreach(QString str, typs) {
- fi_typ->appendChild(new CFormItem(_rootElm, QList() << str, fi_typ));
- }
- }
- if (!_dependencies.isEmpty()) {
- CFormItem *fi_other = new CFormItem(_rootElm, QList() << "other", fi_dep);
- fi_dep->appendChild(fi_other);
- foreach(QStringList list, _dependencies) {
- foreach(QString str, list) {
- fi_other->appendChild(new CFormItem(_rootElm, QList() << str, fi_other));
- }
- }
- }*/
+ return createIndex(row, 0, item);
}
- /******************************************************************************/
+ /******************************************************************************/
- void CGeorgesFormModel::setupModelData()
- {
- loadFormHeader();
- loadFormData(m_rootElm, m_rootItem);
- }
+ QModelIndex CGeorgesFormModel::parent(const QModelIndex &index) const
+ {
+ if (!index.isValid())
+ return QModelIndex();
- /******************************************************************************/
+ CFormItem *childItem = static_cast(index.internalPointer());
+ CFormItem *parentItem = childItem->parent();
- void CGeorgesFormModel::setShowParents( bool show ) {
- m_showParents = show;
- Q_EMIT layoutAboutToBeChanged();
- Q_EMIT layoutChanged();
- }
- void CGeorgesFormModel::setShowDefaults( bool show )
- {
- m_showDefaults = show;
- Q_EMIT layoutAboutToBeChanged();
- Q_EMIT layoutChanged();
- }
+ if (parentItem == m_rootItem)
+ return QModelIndex();
- void CGeorgesFormModel::addParentForm(QString parentForm)
- {
- beginResetModel();
- m_parents.push_back(parentForm);
- delete m_rootItem;
- m_rootItem = new CFormItem(m_rootElm, m_rootData);
- setupModelData();
- endResetModel();
- }
+ return createIndex(parentItem->row(), 0, parentItem);
+ }
- void CGeorgesFormModel::removeParentForm(QString parentForm)
- {
- beginResetModel();
- m_parents.removeOne(parentForm);
+ /******************************************************************************/
- delete m_rootItem;
- m_rootItem = new CFormItem(m_rootElm, m_rootData);
- setupModelData();
- endResetModel();
- }
+ int CGeorgesFormModel::rowCount(const QModelIndex &parent) const {
+
+ CFormItem *parentItem;
+ if (parent.column() > 0)
+ return 0;
+
+ if (!parent.isValid())
+ parentItem = m_rootItem;
+ else
+ parentItem = static_cast(parent.internalPointer());
+
+ return parentItem->childCount();
+
+ }
+
+ /******************************************************************************/
+
+ int CGeorgesFormModel::columnCount(const QModelIndex &parent) const {
+
+ if (parent.isValid())
+ return static_cast(parent.internalPointer())->columnCount();
+ else
+ return m_rootItem->columnCount();
+
+ }
+
+ /******************************************************************************/
+
+ void CGeorgesFormModel::loadFormData(UFormElm *root, CFormItem *parent) {
+ return;
+ }
+
+ CFormItem *CGeorgesFormModel::addStruct (CFormItem *parent,
+ NLGEORGES::CFormElmStruct *_struct,
+ NLGEORGES::CFormDfn *parentDfn,
+ const char *name,
+ uint structId,
+ const char *formName,
+ uint slot)
+{
+ // The form pointer
+ NLGEORGES::CForm *formPtr = static_cast(m_form);
+
+ // Add the new node
+ CFormItem *newNode = parent->add(CFormItem::Form, name, structId, formName, slot, m_form);
+
+ // Can be NULL in virtual DFN
+ if (parentDfn)
+ {
+ // Get the parents
+ std::vector arrayDfn;
+ arrayDfn.reserve (parentDfn->countParentDfn ());
+ parentDfn->getParentDfn (arrayDfn);
+
+ // For each child
+ uint elm=0;
+ for (uint dfn=0; dfngetNumEntry (); i++)
+ {
+ // Get the entry ref
+ NLGEORGES::CFormDfn::CEntry &entry = arrayDfn[dfn]->getEntry (i);
+
+ // Form entry name
+ std::string entryName = (std::string (formName)+"."+entry.getName ());
+
+ // Is a struct ?
+ if ( (entry.getType () == NLGEORGES::UFormDfn::EntryDfn) || (entry.getType () == NLGEORGES::UFormDfn::EntryVirtualDfn) )
+ {
+ // Is an array of struct ?
+ if (entry.getArrayFlag ())
+ {
+ // Get it from the form
+ CFormElmArray *nextArray = NULL;
+ if (_struct && _struct->Elements[elm].Element)
+ nextArray = NLMISC::safe_cast (_struct->Elements[elm].Element);
+
+ // Else, get it from the parent if we are not a virtual DFN (don't inheritate)
+
+ // todo array of virtual struct
+ if (!nextArray && (entry.getType () != NLGEORGES::UFormDfn::EntryVirtualDfn) )
+ {
+ // For each parent form
+ for (uint parent=0; parentgetParentCount (); parent++)
+ {
+ // Get the node by name
+ NLGEORGES::UFormElm *uNode;
+ if (formPtr->getParent (parent)->getRootNode ().getNodeByName (&uNode, entryName.c_str(), NULL, false) && uNode)
+ {
+ nextArray = NLMISC::safe_cast (uNode);
+ }
+ }
+ }
+
+ // Add the new struct
+ addArray (newNode, nextArray, entry.getDfnPtr (), entry.getName().c_str(), elm, entryName.c_str (), slot);
+ }
+ else
+ {
+ // Add it
+ NLGEORGES::CFormElmStruct *nextForm = NULL;
+
+ // Get it from the form
+ if (_struct && _struct->Elements[elm].Element)
+ nextForm = NLMISC::safe_cast (_struct->Elements[elm].Element);
+
+ // Else, get it from the parent
+ if (!nextForm)
+ {
+ // For each parent form
+ for (uint parent=0; parentgetParentCount (); parent++)
+ {
+ // Get the node by name
+ NLGEORGES::UFormElm *uNode;
+ if (formPtr->getParent (parent)->getRootNode ().getNodeByName (&uNode, entryName.c_str(), NULL, false) && uNode)
+ {
+ nextForm = NLMISC::safe_cast (uNode);
+ }
+ }
+ }
+
+ // Virtual Dfn pointer
+ NLGEORGES::CFormElmVirtualStruct *vStruct = ((entry.getType () == NLGEORGES::UFormDfn::EntryVirtualDfn) && nextForm) ?
+ NLMISC::safe_cast (nextForm) : NULL;
+
+ NLGEORGES::CFormDfn *tmpDfn = vStruct ?
+ ((NLGEORGES::CFormDfn*)vStruct->FormDfn) : entry.getDfnPtr();
+ // Add the new struct
+ addStruct (newNode, nextForm, tmpDfn, entry.getName().c_str(), elm, entryName.c_str(), slot);
+ }
+ }
+ // Array of type ?
+ else if ( entry.getArrayFlag () )
+ {
+ NLGEORGES::CFormElmArray *nextArray = NULL;
+
+ // Get it from the form
+ if (_struct && _struct->Elements[elm].Element)
+ nextArray = NLMISC::safe_cast (_struct->Elements[elm].Element);
+
+ // Else, get it from the parent
+ if (!nextArray)
+ {
+ // For each parent form
+ for (uint parent=0; parentgetParentCount (); parent++)
+ {
+ // Get the node by name
+ NLGEORGES::UFormElm *uNode;
+ if (formPtr->getParent (parent)->getRootNode ().getNodeByName (&uNode, entryName.c_str(), NULL, false) && uNode)
+ {
+ nextArray = NLMISC::safe_cast (uNode);
+ }
+ }
+ }
+
+ // Add the new array
+ addArray ( newNode, nextArray, NULL, entry.getName().c_str(), elm, entryName.c_str(), slot );
+ }
+
+ // Next element
+ elm++;
+ }
+ }
+ }
+
+ return newNode;
+}
+
+// ***************************************************************************
+
+CFormItem *CGeorgesFormModel::addArray(CFormItem *parent,
+ NLGEORGES::CFormElmArray *array,
+ NLGEORGES::CFormDfn *rootDfn,
+ const char *name,
+ uint structId,
+ const char *formName,
+ uint slot)
+{
+ // Add the new node
+ CFormItem *newNode = parent->add (CFormItem::Form, name, structId, formName, slot, m_form);
+
+ // The array exist
+ if (array)
+ {
+ // For each array element
+ for (uint elm=0; elmElements.size(); elm++)
+ {
+ // The form name
+ char formArrayElmName[512];
+ NLMISC::smprintf (formArrayElmName, 512, "%s[%d]", formName, elm);
+
+ // The name
+ char formArrayName[512];
+ if (array->Elements[elm].Name.empty ())
+ {
+ NLMISC::smprintf (formArrayName, 512, "#%d", elm);
+ }
+ else
+ {
+ NLMISC::smprintf (formArrayName, 512, "%s", array->Elements[elm].Name.c_str());
+ }
+
+ // Is a struct
+ if (rootDfn)
+ {
+ // Get struct ptr
+ NLGEORGES::CFormElmStruct *elmPtr = array->Elements[elm].Element ? static_cast(array->Elements[elm].Element) : NULL;
+ addStruct (newNode, elmPtr, rootDfn, formArrayName, elm, formArrayElmName, slot);
+ }
+ else
+ {
+ NLGEORGES::CFormElmArray *elmPtr = array->Elements[elm].Element ? static_cast(array->Elements[elm].Element) : NULL;
+ newNode->add (CFormItem::Form, formArrayName, elm, formArrayElmName, slot, m_form);
+ }
+ }
+ }
+
+ return newNode;
+}
+
+
+
+ /******************************************************************************/
+
+ void CGeorgesFormModel::loadFormHeader()
+ {
+
+ /* if (m_parents.size())
+ {
+ CFormItem *fi_pars = new CFormItem(m_rootElm, QList() << "parents" << "" << "", m_rootItem);
+ m_rootItem->appendChild(fi_pars);
+
+ Q_FOREACH(QString str, m_parents)
+ {
+ fi_pars->appendChild(new CFormItem(m_rootElm, QList() << str << "" << "", fi_pars));
+ }
+ }*/
+
+ /*QStringList dfns = _dependencies["dfn"];
+ QStringList typs = _dependencies["typ"];
+
+ _dependencies.remove("dfn");
+ _dependencies.remove("typ");
+
+ CFormItem *fi_dep = new CFormItem(_rootElm, QList() << "dependencies", _rootItem);
+ _rootItem->appendChild(fi_dep);
+
+ if (!dfns.isEmpty()) {
+ CFormItem *fi_dfn = new CFormItem(_rootElm, QList() << "dfn", fi_dep);
+ fi_dep->appendChild(fi_dfn);
+ foreach(QString str, dfns) {
+ fi_dfn->appendChild(new CFormItem(_rootElm, QList() << str, fi_dfn));
+ }
+ }
+ if (!typs.isEmpty()) {
+ CFormItem *fi_typ = new CFormItem(_rootElm, QList() << "typ", fi_dep);
+ fi_dep->appendChild(fi_typ);
+ foreach(QString str, typs) {
+ fi_typ->appendChild(new CFormItem(_rootElm, QList() << str, fi_typ));
+ }
+ }
+ if (!_dependencies.isEmpty()) {
+ CFormItem *fi_other = new CFormItem(_rootElm, QList() << "other", fi_dep);
+ fi_dep->appendChild(fi_other);
+ foreach(QStringList list, _dependencies) {
+ foreach(QString str, list) {
+ fi_other->appendChild(new CFormItem(_rootElm, QList() << str, fi_other));
+ }
+ }
+ }*/
+ }
+
+ /******************************************************************************/
+
+ void CGeorgesFormModel::setupModelData()
+ {
+ m_rootElm = &((NLGEORGES::CForm*)m_form)->Elements;
+ NLGEORGES::CFormElmStruct *rootstruct = &((NLGEORGES::CForm*)m_form)->Elements;
+ //loadFormHeader();
+ addStruct(m_rootItem, rootstruct, rootstruct->FormDfn, "Content", 0xffffffff, "", 0);
+ //loadFormData(m_rootElm, m_rootItem);
+ }
+
+ /******************************************************************************/
+
+ void CGeorgesFormModel::setShowParents( bool show ) {
+ m_showParents = show;
+ Q_EMIT layoutAboutToBeChanged();
+ Q_EMIT layoutChanged();
+ }
+ void CGeorgesFormModel::setShowDefaults( bool show )
+ {
+ m_showDefaults = show;
+ Q_EMIT layoutAboutToBeChanged();
+ Q_EMIT layoutChanged();
+ }
+
+ void CGeorgesFormModel::addParentForm(QString parentForm)
+ {
+ beginResetModel();
+ m_parents.push_back(parentForm);
+ delete m_rootItem;
+ m_rootItem = new CFormItem();
+ setupModelData();
+ endResetModel();
+ }
+
+ void CGeorgesFormModel::removeParentForm(QString parentForm)
+ {
+ beginResetModel();
+ m_parents.removeOne(parentForm);
+
+ delete m_rootItem;
+ m_rootItem = new CFormItem();
+ setupModelData();
+ endResetModel();
+ }
} /* namespace GeorgesQt */
/* end of file */
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_model.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_model.h
index 710598236..07589b63c 100644
--- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_model.h
+++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_model.h
@@ -27,6 +27,10 @@
namespace NLGEORGES {
class UFormElm;
+ class UForm;
+ class CFormElmStruct;
+ class CFormDfn;
+ class CFormElmArray;
}
namespace GeorgesQt
@@ -36,9 +40,8 @@ namespace GeorgesQt
class CGeorgesFormModel : public QAbstractItemModel
{
-
public:
- CGeorgesFormModel(NLGEORGES::UFormElm *root, QMap< QString, QStringList> deps,
+ CGeorgesFormModel(NLGEORGES::UForm *form, QMap< QString, QStringList> deps,
QString comment, QStringList parents, bool* expanded, QObject *parent = 0);
~CGeorgesFormModel();
@@ -47,6 +50,7 @@ namespace GeorgesQt
Qt::ItemFlags flags(const QModelIndex &index) const;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
+ QModelIndex index(int row, int column, CFormItem *item) const;
QModelIndex parent(const QModelIndex &index) const;
int rowCount(const QModelIndex &parent = QModelIndex()) const;
int columnCount(const QModelIndex &parent = QModelIndex()) const;
@@ -58,15 +62,26 @@ namespace GeorgesQt
void setShowDefaults( bool show );
void addParentForm(QString parentForm);
void removeParentForm(QString parentForm);
- NLGEORGES::UFormElm *getRootForm() { return m_rootElm; }
+ NLGEORGES::UFormElm *getRootForm() { return m_rootElm; }
+ CFormItem *addStruct (CFormItem *parent, NLGEORGES::CFormElmStruct *_struct, NLGEORGES::CFormDfn *parentDfn,
+ const char *name, uint structId, const char *formName, uint slot);
+
+ CFormItem *addArray(CFormItem *parent, NLGEORGES::CFormElmArray *array, NLGEORGES::CFormDfn *rootDfn,
+ const char *name, uint structId, const char *formName, uint slot);
+
+ void emitDataChanged(const QModelIndex &index)
+ {
+ Q_EMIT dataChanged(index, index);
+ }
private:
void setupModelData();
void loadFormData(NLGEORGES::UFormElm *rootElm, CFormItem *parent);
void loadFormHeader();
+ NLGEORGES::UForm* m_form;
CFormItem* m_rootItem;
- NLGEORGES::UFormElm* m_rootElm;
+ NLGEORGES::UFormElm* m_rootElm;
QList m_rootData;
QMap< QString, QStringList> m_dependencies;
QString m_comments;
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_proxy_model.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_proxy_model.cpp
index 2792699b0..81179f61c 100644
--- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_proxy_model.cpp
+++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_proxy_model.cpp
@@ -14,15 +14,17 @@
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
-#include "stdpch.h"
-#include "georgesform_proxy_model.h"
-#include "formitem.h"
-#include "georgesform_model.h"
-
// NeL includes
#include
#include
+// project includes
+#include "formitem.h"
+#include "georgesform_proxy_model.h"
+#include "georgesform_model.h"
+
+#if 0
+
namespace GeorgesQt
{
@@ -78,4 +80,5 @@ namespace GeorgesQt
}
} /* namespace GeorgesQt */
+#endif // 0
/* end of file */
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_proxy_model.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_proxy_model.h
index cfe7fcca6..f4c968f80 100644
--- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_proxy_model.h
+++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_proxy_model.h
@@ -20,6 +20,7 @@
// Qt includes
#include
+#if 0
namespace GeorgesQt
{
@@ -41,5 +42,5 @@ namespace GeorgesQt
};/* class CGeorgesFormProxyModel */
} /* namespace GeorgesQt */
-
+#endif // 0
#endif // GEORGESFORM_PROXY_MODEL_H
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/images/array.ico b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/images/array.ico
new file mode 100644
index 000000000..923bec0bd
Binary files /dev/null and b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/images/array.ico differ
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/images/header.ico b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/images/header.ico
new file mode 100644
index 000000000..5ebb3632a
Binary files /dev/null and b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/images/header.ico differ
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/images/hold.ico b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/images/hold.ico
new file mode 100644
index 000000000..4b7f115f1
Binary files /dev/null and b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/images/hold.ico differ
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/images/root.ico b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/images/root.ico
new file mode 100644
index 000000000..3fa430766
Binary files /dev/null and b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/images/root.ico differ
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/images/struct.ico b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/images/struct.ico
new file mode 100644
index 000000000..7e2244dc3
Binary files /dev/null and b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/images/struct.ico differ
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/images/vstruct.ico b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/images/vstruct.ico
new file mode 100644
index 000000000..a184d8a37
Binary files /dev/null and b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/images/vstruct.ico differ
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/images/zfee51.ico b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/images/zfee51.ico
new file mode 100644
index 000000000..ad6bbb756
Binary files /dev/null and b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/images/zfee51.ico differ
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.cpp
index 2d45f0fb3..bccf7a6b1 100644
--- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.cpp
+++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.cpp
@@ -66,7 +66,7 @@ CMainWindow::CMainWindow(QWidget *parent)
_isGraphicsInitialized(false),
_isGraphicsEnabled(false),
_isSoundInitialized(false),
- _isSoundEnabled(true),
+ _isSoundEnabled(false), // MTR workaround for sheet id nonsense
_GraphicsViewport(NULL),
_lastDir("."),
_mouseMode(NL3D::U3dMouseListener::edit3d)