Changed: #1306 Implemented add/removing parent sheets, moved everything out of Plugin and into GeorgesQt namespace to eliminate ambiguity with other plugins.

This commit is contained in:
sfb 2012-04-26 13:05:53 -05:00
parent f3363e0aeb
commit c032c58b43
23 changed files with 192 additions and 58 deletions

View file

@ -22,7 +22,7 @@
#include <QMouseEvent> #include <QMouseEvent>
#include <QPainter> #include <QPainter>
namespace Plugin namespace GeorgesQt
{ {
ExpandableHeaderView::ExpandableHeaderView(Qt::Orientation orientation, QWidget * parent) ExpandableHeaderView::ExpandableHeaderView(Qt::Orientation orientation, QWidget * parent)

View file

@ -20,7 +20,7 @@
// Qt includes // Qt includes
#include <QHeaderView> #include <QHeaderView>
namespace Plugin namespace GeorgesQt
{ {
class ExpandableHeaderView : public QHeaderView class ExpandableHeaderView : public QHeaderView
{ {

View file

@ -37,7 +37,7 @@
#include "georgesform_proxy_model.h" #include "georgesform_proxy_model.h"
#include "formitem.h" #include "formitem.h"
namespace Plugin namespace GeorgesQt
{ {
FormDelegate::FormDelegate(QObject *parent) FormDelegate::FormDelegate(QObject *parent)
@ -275,4 +275,4 @@ namespace Plugin
QRect r = option.rect; QRect r = option.rect;
editor->setGeometry(r); editor->setGeometry(r);
} }
} /* namespace Plugin */ } /* namespace GeorgesQt */

View file

@ -19,7 +19,7 @@
#include <QStyledItemDelegate> #include <QStyledItemDelegate>
namespace Plugin namespace GeorgesQt
{ {
class FormDelegate : public QStyledItemDelegate class FormDelegate : public QStyledItemDelegate

View file

@ -23,7 +23,7 @@
#include <nel/georges/u_type.h> #include <nel/georges/u_type.h>
#include <nel/georges/form.h> #include <nel/georges/form.h>
namespace Plugin namespace GeorgesQt
{ {
CFormItem::CFormItem(NLGEORGES::UFormElm* elm, const QList<QVariant> &data, CFormItem *parent, CFormItem::CFormItem(NLGEORGES::UFormElm* elm, const QList<QVariant> &data, CFormItem *parent,

View file

@ -24,7 +24,7 @@
#include <QList> #include <QList>
#include <QVariant> #include <QVariant>
namespace Plugin namespace GeorgesQt
{ {
class CFormItem class CFormItem

View file

@ -28,7 +28,7 @@
using namespace NLGEORGES; using namespace NLGEORGES;
namespace Plugin namespace GeorgesQt
{ {
CGeorges::CGeorges(): FormLoader(0) CGeorges::CGeorges(): FormLoader(0)
@ -61,4 +61,4 @@ namespace Plugin
return type; return type;
} }
} /* namespace Plugin */ } /* namespace GeorgesQt */

View file

@ -38,7 +38,7 @@ namespace NLGEORGES
using namespace NLGEORGES; using namespace NLGEORGES;
namespace Plugin namespace GeorgesQt
{ {
/** /**
@ -64,6 +64,6 @@ namespace Plugin
};/* class CGeorges */ };/* class CGeorges */
} /* namespace Plugin */ } /* namespace GeorgesQt */
#endif // GEORGES_H #endif // GEORGES_H

View file

@ -23,7 +23,7 @@
// NeL includes // NeL includes
namespace Plugin namespace GeorgesQt
{ {
CGeorgesDirTreeDialog::CGeorgesDirTreeDialog(QString ldPath, QWidget *parent) CGeorgesDirTreeDialog::CGeorgesDirTreeDialog(QString ldPath, QWidget *parent)
@ -109,4 +109,4 @@ void CGeorgesDirTreeDialog::ldPathChanged(QString path)
} }
} }
} /* namespace NLQT */ } /* namespace GeorgesQt */

View file

@ -28,7 +28,7 @@
#include "ui_georges_dirtree_form.h" #include "ui_georges_dirtree_form.h"
#include "georges_filesystem_model.h" #include "georges_filesystem_model.h"
namespace Plugin namespace GeorgesQt
{ {
class CGeorgesDirTreeDialog: public QDockWidget class CGeorgesDirTreeDialog: public QDockWidget
@ -57,6 +57,6 @@ private Q_SLOTS:
}; /* CGEorgesDirTreeDialog */ }; /* CGEorgesDirTreeDialog */
} /* namespace NLQT */ } /* namespace GeorgesQt */
#endif // GEORGES_DIRTREE_DIALOG_H #endif // GEORGES_DIRTREE_DIALOG_H

View file

@ -17,7 +17,7 @@
#ifndef GEORGES_EDITOR_CONSTANTS_H #ifndef GEORGES_EDITOR_CONSTANTS_H
#define GEORGES_EDITOR_CONSTANTS_H #define GEORGES_EDITOR_CONSTANTS_H
namespace Plugin namespace GeorgesQt
{ {
namespace Constants namespace Constants
{ {
@ -26,6 +26,6 @@ const char * const GEORGES_EDITOR_SECTION = "GeorgesEditor";
} // namespace Constants } // namespace Constants
} // namespace Plugin } // namespace GeorgesQt
#endif // GEORGES_EDITOR_CONSTANTS_H #endif // GEORGES_EDITOR_CONSTANTS_H

View file

@ -33,7 +33,7 @@
#include <QToolBar> #include <QToolBar>
#include <QDebug> #include <QDebug>
namespace Plugin namespace GeorgesQt
{ {
GeorgesEditorForm::GeorgesEditorForm(QWidget *parent) GeorgesEditorForm::GeorgesEditorForm(QWidget *parent)
@ -271,4 +271,4 @@ namespace Plugin
} }
} }
} }
} /* namespace Plugin */ } /* namespace GeorgesQt */

View file

@ -23,7 +23,7 @@
// Qt includes // Qt includes
#include <QtGui/QUndoStack> #include <QtGui/QUndoStack>
namespace Plugin namespace GeorgesQt
{ {
class CGeorgesDirTreeDialog; class CGeorgesDirTreeDialog;
@ -70,6 +70,6 @@ private:
CGeorgesTreeViewDialog *m_lastActiveDock; CGeorgesTreeViewDialog *m_lastActiveDock;
}; /* class GeorgesEditorForm */ }; /* class GeorgesEditorForm */
} /* namespace Plugin */ } /* namespace GeorgesQt */
#endif // GEORGES_EDITOR_FORM_H #endif // GEORGES_EDITOR_FORM_H

View file

@ -27,7 +27,7 @@
// Qt includes // Qt includes
#include <QtCore/QObject> #include <QtCore/QObject>
namespace Plugin namespace GeorgesQt
{ {
GeorgesEditorPlugin::~GeorgesEditorPlugin() GeorgesEditorPlugin::~GeorgesEditorPlugin()
@ -97,4 +97,4 @@ QWidget *GeorgesEditorContext::widget()
} }
Q_EXPORT_PLUGIN(Plugin::GeorgesEditorPlugin) Q_EXPORT_PLUGIN(GeorgesQt::GeorgesEditorPlugin)

View file

@ -38,7 +38,7 @@ namespace ExtensionSystem
class IPluginSpec; class IPluginSpec;
} }
namespace Plugin namespace GeorgesQt
{ {
class GeorgesEditorForm; class GeorgesEditorForm;
class GeorgesEditorPlugin : public QObject, public ExtensionSystem::IPlugin class GeorgesEditorPlugin : public QObject, public ExtensionSystem::IPlugin
@ -93,6 +93,6 @@ public:
GeorgesEditorForm *m_georgesEditorForm; GeorgesEditorForm *m_georgesEditorForm;
}; };
} // namespace Plugin } // namespace GeorgesQt
#endif // LANDSCAPE_EDITOR_PLUGIN_H #endif // LANDSCAPE_EDITOR_PLUGIN_H

View file

@ -19,7 +19,7 @@
#include <QApplication> #include <QApplication>
#include <QStyle> #include <QStyle>
namespace Plugin namespace GeorgesQt
{ {
CGeorgesFileSystemModel::CGeorgesFileSystemModel(QString ldPath, QObject *parent) CGeorgesFileSystemModel::CGeorgesFileSystemModel(QString ldPath, QObject *parent)
@ -159,6 +159,6 @@ void CGeorgesFileSystemModel::checkLDPath()
// } // }
// return QSortFilterProxyModel::data(index, role); // return QSortFilterProxyModel::data(index, role);
//} //}
} /* namespace NLQT */ } /* namespace GeorgesQt */
/* end of file */ /* end of file */

View file

@ -20,7 +20,7 @@
#include <QtGui/QFileSystemModel> #include <QtGui/QFileSystemModel>
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
namespace Plugin namespace GeorgesQt
{ {
class CGeorgesFileSystemModel : public QFileSystemModel class CGeorgesFileSystemModel : public QFileSystemModel
@ -74,6 +74,6 @@ private Q_SLOTS:
// bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const; // bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;
//}; //};
} /* namespace NLQT */ } /* namespace GeorgesQt */
#endif // GEORGES_FILESYSTEM_MODEL_H #endif // GEORGES_FILESYSTEM_MODEL_H

View file

@ -27,7 +27,14 @@
#include <nel/misc/path.h> #include <nel/misc/path.h>
#include <nel/misc/file.h> #include <nel/misc/file.h>
#include <nel/misc/o_xml.h> #include <nel/misc/o_xml.h>
#include <nel/georges/u_form_loader.h>
#include <nel/georges/form.h> #include <nel/georges/form.h>
#include <nel/georges/u_form.h>
#include <nel/georges/u_type.h>
// OVQT Includes
#include "../core/icore.h"
#include "../core/core_constants.h"
// Project includes // Project includes
#include "georges.h" #include "georges.h"
@ -40,7 +47,7 @@
using namespace NLMISC; using namespace NLMISC;
using namespace NLGEORGES; using namespace NLGEORGES;
namespace Plugin namespace GeorgesQt
{ {
CGeorgesTreeViewDialog::CGeorgesTreeViewDialog(QWidget *parent /*= 0*/) CGeorgesTreeViewDialog::CGeorgesTreeViewDialog(QWidget *parent /*= 0*/)
@ -51,6 +58,11 @@ namespace Plugin
m_georges = new CGeorges; m_georges = new CGeorges;
loadedForm = ""; loadedForm = "";
// Set the default sheet dir dir to the level design path.
m_lastSheetDir = ".";
QSettings *settings = Core::ICore::instance()->settings();
m_lastSheetDir = settings->value(Core::Constants::LEVELDESIGN_PATH, "l:/leveldesign").toString();
settings->endGroup();
m_ui.setupUi(this); m_ui.setupUi(this);
m_header = new ExpandableHeaderView(Qt::Horizontal, m_ui.treeView); m_header = new ExpandableHeaderView(Qt::Horizontal, m_ui.treeView);
@ -208,9 +220,34 @@ namespace Plugin
} }
} }
void CGeorgesTreeViewDialog::addParentForm(CForm *form) void CGeorgesTreeViewDialog::addParentForm(QString parentFormNm)
{ {
//((CForm*)_form)->insertParent(((CForm*)_form)->getParentCount(), form->getFilename().c_str(), form); // Try to load the form
NLGEORGES::UForm *uParentForm = m_georges->loadForm(parentFormNm.toStdString());
NLGEORGES::CForm *parentForm = dynamic_cast<NLGEORGES::CForm*>(uParentForm);
NLGEORGES::CForm *mainForm = static_cast<NLGEORGES::CForm*>(m_form);
CGeorgesFormProxyModel * proxyModel = dynamic_cast<CGeorgesFormProxyModel *>(m_ui.treeView->model());
CGeorgesFormModel *model = dynamic_cast<CGeorgesFormModel *>(proxyModel->sourceModel());
if(parentForm)
{
if (mainForm != parentForm)
{
// Check it is the same dfn
if (parentForm->Elements.FormDfn == mainForm->Elements.FormDfn)
{
// This is the parent form selector
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.toStdString().c_str());
model->addParentForm(parentFormNm);
}
}
}
}
} }
void CGeorgesTreeViewDialog::modifiedFile( ) void CGeorgesTreeViewDialog::modifiedFile( )
@ -393,6 +430,7 @@ namespace Plugin
void CGeorgesTreeViewDialog::showContextMenu(const QPoint &pos) void CGeorgesTreeViewDialog::showContextMenu(const QPoint &pos)
{ {
QMenu contextMenu; QMenu contextMenu;
QMenu *structContext = NULL;
QPoint globalPos = this->mapToGlobal(pos); QPoint globalPos = this->mapToGlobal(pos);
// Fisrt we're going to see if we've right clicked on a new item and select it. // Fisrt we're going to see if we've right clicked on a new item and select it.
@ -410,32 +448,100 @@ namespace Plugin
CFormItem *item = m->getItem(sourceIndex); CFormItem *item = m->getItem(sourceIndex);
if ((item->parent() && item->parent()->data(0) == "parents") || item->data(0) == "parents") // Right click on the "parents" item
if (item->data(0) == "parents")
contextMenu.addAction("Add parent..."); 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");
}
else if(item->getFormElm()->isArray()) else if(item->getFormElm()->isArray())
contextMenu.addAction("Add array entry..."); contextMenu.addAction("Add array entry...");
else if(item->getFormElm()->isStruct()) else if(item->getFormElm()->isStruct())
contextMenu.addAction("Add element..."); {
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;
}
}
}
else if(item->getFormElm()->isAtom() && item->valueFrom() == NLGEORGES::UFormElm::ValueForm) else if(item->getFormElm()->isAtom() && item->valueFrom() == NLGEORGES::UFormElm::ValueForm)
contextMenu.addAction("Revert to parent/default..."); contextMenu.addAction("Revert to parent/default...");
else if(item->getFormElm()->isAtom() && item->valueFrom() == NLGEORGES::UFormElm::ValueParentForm)
contextMenu.addAction("Override parent/default value...");
else
contextMenu.addAction("Add element...");
QAction *selectedItem = contextMenu.exec(globalPos); QAction *selectedItem = contextMenu.exec(globalPos);
if(selectedItem) if(selectedItem)
{ {
if(selectedItem->text() == "Add parent...") if(selectedItem->text() == "Add parent...")
{ {
QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("Select parent sheets...")); // 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()) if(!fileNames.isEmpty())
{ {
// add some parents. 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<NLGEORGES::CForm *>(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;
} }
} }
} /* namespace NLQT */ m_ui.treeView->expandAll();
}
} // if selected context menu item is valid.
} // if 'm' model valid.
if(structContext)
delete structContext;
}
} /* namespace GeorgesQt */

View file

@ -40,7 +40,7 @@ namespace NLGEORGES
using namespace NLGEORGES; using namespace NLGEORGES;
namespace Plugin namespace GeorgesQt
{ {
class CGeorges; class CGeorges;
@ -57,7 +57,7 @@ namespace Plugin
void setModified(bool m) {m_modified = m;} void setModified(bool m) {m_modified = m;}
CForm* getFormByName(const QString); CForm* getFormByName(const QString);
void addParentForm(CForm *form); void addParentForm(QString parentFormNm);
void write ( ); void write ( );
@ -97,10 +97,13 @@ namespace Plugin
QUndoStack *m_undoStack; QUndoStack *m_undoStack;
/// Contains a record of the last directory a sheet file dialog was opened for.
QString m_lastSheetDir;
bool m_modified; bool m_modified;
}; /* CGeorgesTreeViewDialog */ }; /* CGeorgesTreeViewDialog */
} /* namespace NLQT */ } /* namespace GeorgesQt */
#endif // GEORGES_TREEVIEWER_DIALOG_H #endif // GEORGES_TREEVIEWER_DIALOG_H

View file

@ -40,16 +40,16 @@
using namespace NLGEORGES; using namespace NLGEORGES;
namespace Plugin namespace GeorgesQt
{ {
CGeorgesFormModel::CGeorgesFormModel(UFormElm *rootElm, QMap< QString, QStringList> deps, CGeorgesFormModel::CGeorgesFormModel(UFormElm *rootElm, QMap< QString, QStringList> deps,
QString comment, QStringList parents, bool *expanded, QObject *parent) : QAbstractItemModel(parent) QString comment, QStringList parents, bool *expanded, QObject *parent) : QAbstractItemModel(parent)
{ {
QList<QVariant> rootData;
rootData << "Value" << "Data" << "Extra";// << "Type"; m_rootData << "Value" << "Data" << "Extra";// << "Type";
m_rootElm = rootElm; m_rootElm = rootElm;
m_rootItem = new CFormItem(m_rootElm, rootData); m_rootItem = new CFormItem(m_rootElm, m_rootData);
m_dependencies = deps; m_dependencies = deps;
m_comments = comment; m_comments = comment;
m_parents = parents; m_parents = parents;
@ -669,6 +669,27 @@ namespace Plugin
Q_EMIT layoutAboutToBeChanged(); Q_EMIT layoutAboutToBeChanged();
Q_EMIT layoutChanged(); Q_EMIT layoutChanged();
} }
} /* namespace Plugin */
void CGeorgesFormModel::addParentForm(QString parentForm)
{
beginResetModel();
m_parents.push_back(parentForm);
delete m_rootItem;
m_rootItem = new CFormItem(m_rootElm, m_rootData);
setupModelData();
endResetModel();
}
void CGeorgesFormModel::removeParentForm(QString parentForm)
{
beginResetModel();
m_parents.removeOne(parentForm);
delete m_rootItem;
m_rootItem = new CFormItem(m_rootElm, m_rootData);
setupModelData();
endResetModel();
}
} /* namespace GeorgesQt */
/* end of file */ /* end of file */

View file

@ -29,7 +29,7 @@ namespace NLGEORGES {
class UFormElm; class UFormElm;
} }
namespace Plugin namespace GeorgesQt
{ {
class CFormItem; class CFormItem;
@ -56,6 +56,9 @@ namespace Plugin
bool showDefaults() { return m_showDefaults;} bool showDefaults() { return m_showDefaults;}
void setShowParents( bool show ); void setShowParents( bool show );
void setShowDefaults( bool show ); void setShowDefaults( bool show );
void addParentForm(QString parentForm);
void removeParentForm(QString parentForm);
NLGEORGES::UFormElm *getRootForm() { return m_rootElm; }
private: private:
void setupModelData(); void setupModelData();
@ -64,6 +67,7 @@ namespace Plugin
CFormItem* m_rootItem; CFormItem* m_rootItem;
NLGEORGES::UFormElm* m_rootElm; NLGEORGES::UFormElm* m_rootElm;
QList<QVariant> m_rootData;
QMap< QString, QStringList> m_dependencies; QMap< QString, QStringList> m_dependencies;
QString m_comments; QString m_comments;
QStringList m_parents; QStringList m_parents;
@ -75,6 +79,6 @@ namespace Plugin
};/* class CGeorgesFormModel */ };/* class CGeorgesFormModel */
} /* namespace Plugin */ } /* namespace GeorgesQt */
#endif // GEORGESFORM_MODEL_H #endif // GEORGESFORM_MODEL_H

View file

@ -23,7 +23,7 @@
#include "georgesform_proxy_model.h" #include "georgesform_proxy_model.h"
#include "georgesform_model.h" #include "georgesform_model.h"
namespace Plugin namespace GeorgesQt
{ {
bool CGeorgesFormProxyModel::filterAcceptsRow(int sourceRow, bool CGeorgesFormProxyModel::filterAcceptsRow(int sourceRow,
@ -76,6 +76,6 @@ namespace Plugin
{ {
return QSortFilterProxyModel::filterAcceptsColumn(sourceRow, sourceParent); return QSortFilterProxyModel::filterAcceptsColumn(sourceRow, sourceParent);
} }
} /* namespace Plugin */ } /* namespace GeorgesQt */
/* end of file */ /* end of file */

View file

@ -20,7 +20,7 @@
// Qt includes // Qt includes
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
namespace Plugin namespace GeorgesQt
{ {
class CGeorgesFormProxyModel : public QSortFilterProxyModel class CGeorgesFormProxyModel : public QSortFilterProxyModel
@ -40,6 +40,6 @@ namespace Plugin
};/* class CGeorgesFormProxyModel */ };/* class CGeorgesFormProxyModel */
} /* namespace NLQT */ } /* namespace GeorgesQt */
#endif // GEORGESFORM_PROXY_MODEL_H #endif // GEORGESFORM_PROXY_MODEL_H