This commit is contained in:
Christoph Holzheuer
2025-09-15 16:37:35 +02:00
parent fa6499e3da
commit 28aa03b31a
2 changed files with 124 additions and 79 deletions

View File

@@ -103,6 +103,7 @@ void XQMainWindow::initMainWindow()
try
{
// hand over undostack
_mainModel.setUndoStack(&_undoStack);
// hand over left side navigation tree
@@ -110,11 +111,16 @@ void XQMainWindow::initMainWindow()
// #1. init the left side main tree view
_mainModel.initModel( c_MainModelName );
// 1: Wiebelbach
// 2: Gerbrunn
// 3: TBB
// #2. load demo data
loadDocument( c_DocumentFileName1 );
loadDocumentQML( c_DocumentFileName2 );
//loadDocument( c_DocumentFileName2, true );
//loadDocument( c_DocumentFileName2 );
//loadDocument( c_DocumentFileName3 );
loadDocument( c_DocumentFileName3 );
qDebug() << " --- all here: " << XQNode::s_Count;
@@ -297,18 +303,15 @@ void XQMainWindow::onSectionCreated( const XQModelSection& section )
//! SLOT, der aufgerufen wird, wenn eine section getoggelt wurde.
void XQMainWindow::onSectionToggled( const XQModelSection& section )
{
qDebug() << " --- XXX section toggled: " << section.contentType() << ":" << section.sheetRootNode()->to_string();
{
for (int row = 0; row < _currentProjectItem->rowCount(); ++row)
{
for (int row = 0; row < _currentProjectItem->rowCount(); ++row)
QStandardItem* child = _currentProjectItem->child(row);
if (child->text() == section.contentType() )
{
QStandardItem* child = _currentProjectItem->child(row);
if (child->text() == section.contentType() )
{
bool checked = (child->checkState() == Qt::Checked);
child->setCheckState( checked ? Qt::Unchecked :Qt::Checked );
break;
}
bool checked = (child->checkState() == Qt::Checked);
child->setCheckState( checked ? Qt::Unchecked :Qt::Checked );
break;
}
}
}
@@ -328,6 +331,103 @@ void XQMainWindow::setChildTabByName( const QString& key )
}
}
XQNodePtr XQMainWindow::createDataTree( const QString& fileName )
{
// gibts die Datei?
if( !QFile::exists( fileName) )
throw XQException( "no such file", fileName );
XQNodeFactory treeLoader;
// xml daten laden
XQNodePtr rawTree = treeLoader.load_tree( qPrintable(fileName) );
// versteckten root node ignorieren
return rawTree->first_child();
}
XQChildModel* XQMainWindow::createChildModel( const XQNodePtr& contentRoot )
{
// Ein neues Child-Model erzeugen
XQChildModel* childModel = new XQChildModel(this);
connect( childModel, SIGNAL(sectionCreated(XQModelSection)), this, SLOT(onSectionCreated(XQModelSection)) );
connect( childModel, SIGNAL(sectionToggled(XQModelSection)), this, SLOT(onSectionToggled(XQModelSection)) );
// Den globalen undo-stack ...
childModel->setUndoStack(&_undoStack);
// die Modelstruktur anlegen
childModel->initModel( c_ChildModelName );
// model inhalte laden
childModel->addModelData( contentRoot->first_child() );
return childModel;
}
//! liest eine XML datei namens 'fileName'
void XQMainWindow::loadDocument( const QString& fileName, bool useQML )
{
// Datenbaum laden
XQNodePtr contentRoot = createDataTree( fileName );
// Falls schon vorhanden ...
const QString& pID = contentRoot->attribute(c_ProjectID);
int idx = _documentStore.indexOf( pID );
if( idx > -1 )
{
const XQDocument& document = _documentStore.at(idx);
QMessageBox::warning( this, "Load Document", QString("File: %1 already loaded.").arg( fileName ) );
_mainTreeView->setCurrentIndex( document.treeItem->index() );
_tabWidget->setCurrentIndex( idx );
// ... wird nichts wieter unternommen
return;
}
// 'friendly Name' ist ein Link auf ein anderes Attribute
// das als Namen verwendet wird.
const QString& fName = contentRoot->friendly_name();
QString pTabTitle = QString("Project %1: %2").arg( pID, fName );
// neuen eintrag im übsichts-baum erzeugen
_currentProjectItem = _mainModel.addProjectItem( contentRoot );
// Kindmodel für den Datenbaum erzeugen.
XQChildModel* childModel = createChildModel(contentRoot);
_documentStore.addDocument( fileName, fName, _currentProjectItem, childModel );
QWidget* childView{};
if(useQML)
{
XQQuickWidget* quickView= new XQQuickWidget(_tabWidget);
//quickChild->setResizeMode(QQuickWidget::SizeViewToRootObject);
quickView->rootContext()->setContextProperty("xtrChildModel", childModel);
quickView->setSource(QUrl("qrc:/xqtreeview.qml"));
childView = quickView;
}
else
{
// Eine neue TreeView erzeugn und im TabWidget parken.
XQTreeTable* treeTable = new XQTreeTable(_tabWidget);
// und die TreeView übergeben
childModel->setTreeTable(treeTable);
childView = treeTable;
}
_tabWidget->addTab( childView, pTabTitle );
_tabWidget->setCurrentWidget( childView );
setWindowTitle( pTabTitle );
}
void XQMainWindow::loadDocumentQML( const QString& fileName )
{
// gibts die Datei?
@@ -356,74 +456,13 @@ void XQMainWindow::loadDocumentQML( const QString& fileName )
//quickChild->setResizeMode(QQuickWidget::SizeViewToRootObject);
quickChild->rootContext()->setContextProperty("xtrChildModel", childModel);
quickChild->setSource(QUrl("qrc:/xqtreeview.qml"));
quickChild->setSource(QUrl("qrc:/xqtreeview.qml"));
_tabWidget->addTab( quickChild, "QML:"+fName );
_tabWidget->setCurrentWidget( quickChild );
quickChild->setResizeMode(QQuickWidget::SizeRootObjectToView);
}
//! liest eine XML datei namens 'fileName'
void XQMainWindow::loadDocument( const QString& fileName )
{
// gibts die Datei?
if( !QFile::exists( fileName) )
throw XQException( "no such file", fileName );
XQNodeFactory treeLoader;
// xml daten laden
XQNodePtr rawTree = treeLoader.load_tree( qPrintable(fileName) );
// versteckten root node ignorieren
XQNodePtr contentRoot = rawTree->first_child();
// Project-ID behandeln
const QString& pID = contentRoot->attribute(c_ProjectID);
int idx = _documentStore.indexOf( pID );
if( idx > -1 )
{
const XQDocument& document = _documentStore.at(idx);
QMessageBox::warning( this, "Load Document", QString("File: %1 already loaded.").arg( fileName ) );
_mainTreeView->setCurrentIndex( document.treeItem->index() );
_tabWidget->setCurrentIndex( idx );
return;
}
// 'friendly Name' ist ein Link auf ein anderes Attribute
// das als Namen verwendet wird.
const QString& fName = contentRoot->friendly_name();
QString pTabTitle = QString("Project %1: %2").arg( pID, fName );
// Eine neue TreeView erzeugn und im TabWidget parken.
XQTreeTable* childTreeView = new XQTreeTable(_tabWidget);
_tabWidget->addTab( childTreeView, pTabTitle );
_tabWidget->setCurrentWidget( childTreeView );
setWindowTitle( pTabTitle );
// Ein neues Child-Model erzeugen
XQChildModel* childModel = new XQChildModel(this);
connect( childModel, SIGNAL(sectionCreated(XQModelSection)), this, SLOT(onSectionCreated(XQModelSection)) );
connect( childModel, SIGNAL(sectionToggled(XQModelSection)), this, SLOT(onSectionToggled(XQModelSection)) );
// Den globalen undo-stack ...
childModel->setUndoStack(&_undoStack);
// und die TreeView übergeben
childModel->setTreeTable(childTreeView);
// neuen eintrag im übsichts-baum erzeugen
_currentProjectItem = _mainModel.addProjectItem( contentRoot );
_documentStore.addDocument( fileName, fName, _currentProjectItem, childModel );
// die Modelstruktur anlegen
childModel->initModel( c_ChildModelName );
// model inhalte laden
childModel->addModelData( contentRoot->first_child() );
}
//! speichert ein XML unter dem 'filename'

View File

@@ -61,15 +61,21 @@ public slots:
void setChildTabByName( const QString& key );
// fixme implement
//void showDocument( const QString& key ){}
void loadDocument( const QString& fileName, bool useQML=false );
void loadDocumentQML( const QString& fileName );
void saveDocument( const QString& fileName );
static void setupWorkingDir();
protected:
// fixme implement
void showDocument( const QString& key ){}
void loadDocument( const QString& fileName );
void loadDocumentQML( const QString& fileName );
void saveDocument( const QString& fileName );
XQNodePtr createDataTree( const QString& fileName );
XQChildModel* createChildModel( const XQNodePtr& contentRoot );
QUndoStack _undoStack;
XQDocumentStore _documentStore;