mirror of
https://port.numenaute.org/aleajactaest/khanat-opennel-code.git
synced 2024-11-27 01:26:30 +00:00
Changed: #1306 Added basic new form creation. Lots of bugs still.
This commit is contained in:
parent
0e8ef814c3
commit
a8a455fddd
4 changed files with 131 additions and 30 deletions
|
@ -92,6 +92,13 @@ namespace GeorgesQt
|
|||
addDockWidget(Qt::LeftDockWidgetArea, m_georgesDirTreeDialog);
|
||||
restoreDockWidget(m_georgesDirTreeDialog);
|
||||
|
||||
// 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);
|
||||
m_lastSheetDir = settings->value(Core::Constants::LEVELDESIGN_PATH, "l:/leveldesign").toString();
|
||||
settings->endGroup();
|
||||
|
||||
connect(Core::ICore::instance(), SIGNAL(changeSettings()),
|
||||
this, SLOT(settingsChanged()));
|
||||
connect(m_georgesDirTreeDialog, SIGNAL(selectedForm(const QString)),
|
||||
|
@ -117,9 +124,19 @@ namespace GeorgesQt
|
|||
loadFile(fileName);
|
||||
}
|
||||
|
||||
void GeorgesEditorForm::newFile()
|
||||
void GeorgesEditorForm::newFile()
|
||||
{
|
||||
// Assume it is a form, for now. We'll have to retrieve the DFN we'll be using as a base.
|
||||
QString fileName = QFileDialog::getOpenFileName(this, tr("Select Base Form Definition"), m_lastSheetDir, "Form Definition (*.dfn)");
|
||||
if(!fileName.isNull())
|
||||
{
|
||||
// Use the file loader to create the new form.
|
||||
loadFile(fileName, true);
|
||||
|
||||
// Save the folder we just opened for future dialogs.
|
||||
QFileInfo pathInfo( fileName );
|
||||
m_lastSheetDir = pathInfo.absolutePath();
|
||||
}
|
||||
}
|
||||
|
||||
void GeorgesEditorForm::save()
|
||||
|
@ -171,26 +188,18 @@ namespace GeorgesQt
|
|||
}
|
||||
}
|
||||
|
||||
void GeorgesEditorForm::loadFile(const QString fileName)
|
||||
void GeorgesEditorForm::loadFile(const QString fileName)
|
||||
{
|
||||
loadFile(fileName, false);
|
||||
}
|
||||
|
||||
void GeorgesEditorForm::loadFile(const QString fileName, bool loadFromDfn)
|
||||
{
|
||||
QFileInfo info(fileName);
|
||||
|
||||
if (!m_dockedWidgets.size())
|
||||
// Check to see if the form is already loaded, if it is just raise it.
|
||||
if (m_dockedWidgets.size())
|
||||
{
|
||||
CGeorgesTreeViewDialog *dock = new CGeorgesTreeViewDialog(m_mainDock);
|
||||
dock->setUndoStack(m_undoStack);
|
||||
m_lastActiveDock = dock;
|
||||
m_dockedWidgets.append(dock);
|
||||
|
||||
m_mainDock->addDockWidget(Qt::RightDockWidgetArea, m_dockedWidgets.last());
|
||||
connect(m_dockedWidgets.last(), SIGNAL(closing()),
|
||||
this, SLOT(closingTreeView()));
|
||||
connect(m_dockedWidgets.last(), SIGNAL(visibilityChanged(bool)),
|
||||
m_dockedWidgets.last(), SLOT(checkVisibility(bool)));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
Q_FOREACH(CGeorgesTreeViewDialog *wgt, m_dockedWidgets)
|
||||
{
|
||||
if (info.fileName() == wgt->loadedForm)
|
||||
|
@ -199,18 +208,38 @@ namespace GeorgesQt
|
|||
return;
|
||||
}
|
||||
}
|
||||
CGeorgesTreeViewDialog *dock = new CGeorgesTreeViewDialog(m_mainDock);
|
||||
dock->setUndoStack(m_undoStack);
|
||||
m_dockedWidgets.append(dock);
|
||||
}
|
||||
|
||||
connect(m_dockedWidgets.last(), SIGNAL(closing()),
|
||||
this, SLOT(closingTreeView()));
|
||||
connect(m_dockedWidgets.last(), SIGNAL(visibilityChanged(bool)),
|
||||
m_dockedWidgets.last(), SLOT(checkVisibility(bool)));
|
||||
Q_ASSERT(m_dockedWidgets.size() > 1);
|
||||
CGeorgesTreeViewDialog *dock = new CGeorgesTreeViewDialog(m_mainDock);
|
||||
dock->setUndoStack(m_undoStack);
|
||||
m_lastActiveDock = dock;
|
||||
m_dockedWidgets.append(dock);
|
||||
|
||||
connect(m_dockedWidgets.last(), SIGNAL(closing()), this, SLOT(closingTreeView()));
|
||||
connect(m_dockedWidgets.last(), SIGNAL(visibilityChanged(bool)), m_dockedWidgets.last(), SLOT(checkVisibility(bool)));
|
||||
|
||||
// If there is more than one form open - tabify the new form. If this is the first form open add it to the dock.
|
||||
if(m_dockedWidgets.size() > 1)
|
||||
{
|
||||
m_mainDock->tabifyDockWidget(m_dockedWidgets.at(m_dockedWidgets.size() - 2), m_dockedWidgets.last());
|
||||
}
|
||||
CForm *form = m_dockedWidgets.last()->getFormByName(info.fileName());
|
||||
else
|
||||
{
|
||||
m_mainDock->addDockWidget(Qt::RightDockWidgetArea, m_dockedWidgets.last());
|
||||
}
|
||||
|
||||
// Retrieve the form and load the form.
|
||||
NLGEORGES::CForm *form;
|
||||
if(loadFromDfn)
|
||||
{
|
||||
// Get the form by DFN name.
|
||||
form = m_dockedWidgets.last()->getFormByDfnName(info.fileName());
|
||||
}
|
||||
else
|
||||
{
|
||||
form = m_dockedWidgets.last()->getFormByName(info.fileName());
|
||||
}
|
||||
|
||||
if (form)
|
||||
{
|
||||
m_dockedWidgets.last()->setForm(form);
|
||||
|
@ -224,6 +253,7 @@ namespace GeorgesQt
|
|||
}
|
||||
else
|
||||
{
|
||||
nlwarning("Failed to load form: %s", info.fileName().toStdString().c_str());
|
||||
m_dockedWidgets.last()->close();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -41,6 +41,7 @@ public:
|
|||
public Q_SLOTS:
|
||||
void open();
|
||||
void loadFile(const QString fileName);
|
||||
void loadFile(const QString fileName, bool loadFromDfn);
|
||||
void newFile();
|
||||
void save();
|
||||
void settingsChanged();
|
||||
|
@ -66,8 +67,15 @@ private:
|
|||
|
||||
QMainWindow *m_mainDock;
|
||||
|
||||
/// Contains a list of all of the open forms.
|
||||
QList<CGeorgesTreeViewDialog*> m_dockedWidgets;
|
||||
|
||||
/// Contains a pointer to the last known focal change for active documents.
|
||||
CGeorgesTreeViewDialog *m_lastActiveDock;
|
||||
|
||||
/// Contains a record of the last directory a sheet file dialog was opened for.
|
||||
QString m_lastSheetDir;
|
||||
|
||||
}; /* class GeorgesEditorForm */
|
||||
|
||||
} /* namespace GeorgesQt */
|
||||
|
|
|
@ -61,6 +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);
|
||||
m_lastSheetDir = settings->value(Core::Constants::LEVELDESIGN_PATH, "l:/leveldesign").toString();
|
||||
settings->endGroup();
|
||||
|
||||
|
@ -114,11 +115,12 @@ namespace GeorgesQt
|
|||
m_form = (UForm*)form;
|
||||
}
|
||||
|
||||
CForm* CGeorgesTreeViewDialog::getFormByName(const QString formName)
|
||||
NLGEORGES::CForm* CGeorgesTreeViewDialog::getFormByName(const QString formName)
|
||||
{
|
||||
if(NLMISC::CPath::exists(formName.toStdString()))
|
||||
{
|
||||
return (CForm*)m_georges->loadForm(formName.toStdString());
|
||||
//NLGEORGES::CForm *form = dynamic_cast<NLGEORGES::CForm*>(m_georges->loadForm(formName.toStdString()));
|
||||
return (NLGEORGES::CForm *)m_georges->loadForm(formName.toStdString());
|
||||
}
|
||||
//else
|
||||
//{
|
||||
|
@ -154,9 +156,58 @@ namespace GeorgesQt
|
|||
// }
|
||||
// return form;
|
||||
//}
|
||||
nlinfo("File '%s' does not exist!", formName.toStdString().c_str());
|
||||
return 0;
|
||||
}
|
||||
|
||||
NLGEORGES::CForm* CGeorgesTreeViewDialog::getFormByDfnName(const QString dfnName)
|
||||
{
|
||||
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<NLGEORGES::CFormDfn *>(m_georges->loadFormDfn(dfnName.toStdString()));
|
||||
|
||||
// Next we'll use the root node to build a new form.
|
||||
NLGEORGES::CFormElmStruct *fes = dynamic_cast<NLGEORGES::CFormElmStruct *>(getRootNode(0));
|
||||
fes->build(formDfn);
|
||||
|
||||
// And then initialize the held elements;
|
||||
for(uint i = 0; i<NLGEORGES::CForm::HeldElementCount; i++)
|
||||
{
|
||||
fes = dynamic_cast<NLGEORGES::CFormElmStruct *>(getRootNode(i+1));
|
||||
fes->build(formDfn);
|
||||
}
|
||||
|
||||
return form;
|
||||
}
|
||||
nlinfo("File '%s' does not exist!", dfnName.toStdString().c_str());
|
||||
return NULL;
|
||||
}
|
||||
|
||||
NLGEORGES::CFormElm *CGeorgesTreeViewDialog::getRootNode(uint slot)
|
||||
{
|
||||
NLGEORGES::CForm *form = getFormPtr();
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
NLGEORGES::CForm *CGeorgesTreeViewDialog::getFormPtr()
|
||||
{
|
||||
return dynamic_cast<NLGEORGES::CForm *>(m_form);
|
||||
}
|
||||
|
||||
void CGeorgesTreeViewDialog::loadFormIntoDialog(CForm *form)
|
||||
{
|
||||
|
||||
|
@ -169,7 +220,8 @@ namespace GeorgesQt
|
|||
root = &m_form->getRootNode();
|
||||
|
||||
QStringList parents;
|
||||
for (uint i = 0; i < m_form->getNumParent(); 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();
|
||||
|
|
|
@ -36,6 +36,7 @@ namespace NLGEORGES
|
|||
{
|
||||
class UForm;
|
||||
class CForm;
|
||||
class CFormElm;
|
||||
}
|
||||
|
||||
using namespace NLGEORGES;
|
||||
|
@ -56,7 +57,15 @@ namespace GeorgesQt
|
|||
bool isModified() {return m_modified;}
|
||||
void setModified(bool m) {m_modified = m;}
|
||||
|
||||
CForm* getFormByName(const QString);
|
||||
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);
|
||||
|
||||
/// Returns the form as a CForm pointer.
|
||||
NLGEORGES::CForm *getFormPtr();
|
||||
|
||||
void addParentForm(QString parentFormNm);
|
||||
|
||||
void write ( );
|
||||
|
@ -67,6 +76,8 @@ namespace GeorgesQt
|
|||
m_undoStack = stack;
|
||||
}
|
||||
|
||||
|
||||
|
||||
QString loadedForm;
|
||||
|
||||
protected:
|
||||
|
|
Loading…
Reference in a new issue