From fd411381759370c182587abdba0a3dce36179719 Mon Sep 17 00:00:00 2001 From: "PANIK\\chris" Date: Wed, 10 Sep 2025 23:32:00 +0200 Subject: [PATCH] Fix choice model. --- src/items/xqitem.cpp | 127 +++++++++++++++++++++++++++++++++++ src/items/xqitem.h | 2 + src/items/xqitemdelegate.cpp | 3 +- src/items/xqitemfactory.cpp | 122 ++------------------------------- src/items/xqitemfactory.h | 4 +- src/xtree.qrc | 22 +++--- xml/modelsheets.xml | 2 +- 7 files changed, 146 insertions(+), 136 deletions(-) diff --git a/src/items/xqitem.cpp b/src/items/xqitem.cpp index a1cbfdb..d4f24e0 100644 --- a/src/items/xqitem.cpp +++ b/src/items/xqitem.cpp @@ -647,6 +647,133 @@ void XQItem::setData(const QVariant& value, int role ) } +//! erzeugt eine QVariant zur gegebenen rolle aus dem gegebenen string. +//! Hack: Das Item wird hier als zusätzliche datenquelle übergeben, +//! um _vorher_ erzeugte eigenschaften des items als parameter für _jetzt_ +//! erzeugte eigenschaft verwenden zu können. +//! Beispiel + +QVariant XQItem::makeVariant( XQItem* item, int dataRole, const QString& source ) +{ + + QVariant value; + + //qDebug() << " ----- makeVariant: " << XQItem::fetchItemDataRoleName( dataRole ); + + switch(dataRole) + { + // das ist ein pointer auf den original-string aus dem XML + case XQItem::ContentRole: + { + // content() -> QString* + value = QVariant::fromValue(&source); + break; + } + + /* + case XQItem::ItemTypeRole: + { + // itemType() -> XQItemType* + XQItemType* itemType = findItemTypeTemplate( source ); + value = QVariant::fromValue(itemType); + break; + } + */ + + case XQItem::RenderStyleRole: + { + XQItem::RenderStyle renderStyle = XQItem::fetchRenderStyle( source ); + value = QVariant::fromValue(renderStyle); + break; + } + + case XQItem::EditorTypeRole: + { + XQItem::EditorType editorType = XQItem::fetchEditorType( source ); + value = QVariant::fromValue(editorType); + break; + } + + case XQItem::UnitTypeRole: + { + //qDebug() << " --- make unit type: " << source; + XQItem::UnitType unitType = XQItem::fetchUnitType( source ); + value = QVariant::fromValue(unitType); + break; + } + + case XQItem::ContentFormatRole: + { + // contentFormat() -> QString + value = QVariant::fromValue(source); + break; + } + + case XQItem::FlagsRole: + { + QFlags itemFlags = Qt::NoItemFlags; + const QStringList flagKeys = source.split( '|' ); + for( const QString& flagKey : flagKeys ) + { + Qt::ItemFlag flag = XQItem::fetchItemFlag( flagKey ); + itemFlags.setFlag( flag ); + } + value = QVariant::fromValue(itemFlags); + break; + } + + + case XQItem::IconRole: + { + QIcon typeIcon = XQAppData::typeIcon(source); + value = QVariant::fromValue(typeIcon); + break; + } + + + case XQItem::FixedChoicesRole: + { + const QStringList choices = source.split( '|' ); + + QStandardItemModel* fixedChoices = new QStandardItemModel(); + for( const QString& entry : choices ) + { + QString result = entry; + if( item->unitType() != XQItem::NoUnitType ) + result = XQItemType::formatToSI( entry, item->unitType() ); + fixedChoices->appendRow( new QStandardItem( result ) ); + } + value = QVariant::fromValue(fixedChoices); + break; + } + + /* + case XQItem::ContentNodeRole: + { + value = QVariant::fromValue(&source); + break; + } + + case XQItem::XQItem::SheetNodeRole: + { + value = QVariant::fromValue(&source); + break; + } + */ + + default: + case XQItem::XQItem::NoRole: + { + break; + } + }; + + //if( !value.toString().isEmpty()) + // setData( value, dataRole); + + return value; + +} //! gibt ein statisches invalid-item zurück, anstelle von nullptr diff --git a/src/items/xqitem.h b/src/items/xqitem.h index 8abcb36..734e0a2 100644 --- a/src/items/xqitem.h +++ b/src/items/xqitem.h @@ -224,6 +224,8 @@ public: /// Static convenience methods /// + static QVariant makeVariant( XQItem* item, int dataRole, const QString& source ); + static XQItem& xqItemFromIndex( const QModelIndex& index ); static XQItem& fallBackDummyItem(); diff --git a/src/items/xqitemdelegate.cpp b/src/items/xqitemdelegate.cpp index e4ede87..59e9974 100644 --- a/src/items/xqitemdelegate.cpp +++ b/src/items/xqitemdelegate.cpp @@ -135,10 +135,9 @@ void XQItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option return drawHeaderStyle( painter, option, item ); case XQItem::ComboBoxStyle : - return drawComboBoxStyle( painter, option, item ); + return drawComboBoxStyle( painter, option, item ); case XQItem::ColorBarStyle : - qDebug() << " --- JAJA: " << index.data().toString(); return drawColorBarStyle( painter, option, item ); /* case XQItem::SpinBoxStyle : diff --git a/src/items/xqitemfactory.cpp b/src/items/xqitemfactory.cpp index fcfc7ee..b780ee4 100644 --- a/src/items/xqitemfactory.cpp +++ b/src/items/xqitemfactory.cpp @@ -29,7 +29,7 @@ void XQItemFactory::initItemFactory( const QString& modelSheetFileName ) for( const auto& [key,value] : sheetNode->attributes() ) { //qDebug() << " --- conf item Type: " << key << " : " << value; - setItemDataFromString( *itemType, key, value ); + setItemTypeDataFromString( *itemType, key, value ); } }; @@ -91,7 +91,7 @@ XQItemType* XQItemFactory::makeItemType(const XQNodePtr& sheetEntry ) // wenn ja, überschreiben if( role != XQItem::NoRole ) { - QVariant newValue = makeVariant(role, attrEntry.second ); + QVariant newValue = XQItem::makeVariant( itemType, role, attrEntry.second ); itemType = itemType->replaceAttribute( newValue, role ); } @@ -124,133 +124,19 @@ XQNodePtr XQItemFactory::findModelSheet( const QString& modelName ) const //! erzeugt eine QVariant aus dem gegebenen string und setzt diese dann via role im item. -void XQItemFactory::setItemDataFromString( XQItem& item, const QString& roleKey, const QString& source ) const +void XQItemFactory::setItemTypeDataFromString( XQItem& item, const QString& roleKey, const QString& source ) const { int dataRole = XQItem::fetchItemDataRole( roleKey ); if( dataRole != XQItem::NoRole) { - QVariant variant = makeVariant( dataRole, source ); + QVariant variant = XQItem::makeVariant( &item, dataRole, source ); if( !variant.isNull() && variant.isValid() ) item.setData( variant, dataRole ); } } -//! erzeugt eine QVariant aus dem gegebenen string -QVariant XQItemFactory::makeVariant( int dataRole, const QString& source ) const -{ - - QVariant value; - - switch(dataRole) - { - // das ist ein pointer auf den original-string aus dem XML - case XQItem::ContentRole: - { - // content() -> QString* - value = QVariant::fromValue(&source); - break; - } - - case XQItem::ItemTypeRole: - { - // itemType() -> XQItemType* - //qDebug() << " --- makeVariant: make ItemType: " << source; - XQItemType* itemType = findItemTypeTemplate( source ); - value = QVariant::fromValue(itemType); - break; - } - - case XQItem::RenderStyleRole: - { - XQItem::RenderStyle renderStyle = XQItem::fetchRenderStyle( source ); - value = QVariant::fromValue(renderStyle); - break; - } - - case XQItem::EditorTypeRole: - { - XQItem::EditorType editorType = XQItem::fetchEditorType( source ); - value = QVariant::fromValue(editorType); - break; - } - - case XQItem::UnitTypeRole: - { - //qDebug() << " --- make unit type: " << source; - XQItem::UnitType unitType = XQItem::fetchUnitType( source ); - value = QVariant::fromValue(unitType); - break; - } - - case XQItem::ContentFormatRole: - { - // contentFormat() -> QString - value = QVariant::fromValue(source); - break; - } - - case XQItem::FlagsRole: - { - QFlags itemFlags = Qt::NoItemFlags; - const QStringList flagKeys = source.split( '|' ); - for( const QString& flagKey : flagKeys ) - { - Qt::ItemFlag flag = XQItem::fetchItemFlag( flagKey ); - itemFlags.setFlag( flag ); - } - value = QVariant::fromValue(itemFlags); - break; - } - - - case XQItem::IconRole: - { - QIcon typeIcon = XQAppData::typeIcon(source); - value = QVariant::fromValue(typeIcon); - break; - } - - - case XQItem::FixedChoicesRole: - { - const QStringList choices = source.split( '|' ); - - QStandardItemModel* fixedChoices = new QStandardItemModel(); - for( const QString& entry : choices ) - fixedChoices->appendRow( new QStandardItem( entry ) ); - value = QVariant::fromValue(fixedChoices); - break; - } - - /* - case XQItem::ContentNodeRole: - { - value = QVariant::fromValue(&source); - break; - } - - case XQItem::XQItem::SheetNodeRole: - { - value = QVariant::fromValue(&source); - break; - } - */ - - default: - case XQItem::XQItem::NoRole: - { - break; - } - }; - - //if( !value.toString().isEmpty()) - // setData( value, dataRole); - - return value; - -} /// /// ------------------------------------------------ diff --git a/src/items/xqitemfactory.h b/src/items/xqitemfactory.h index cf51a4e..31e44b3 100644 --- a/src/items/xqitemfactory.h +++ b/src/items/xqitemfactory.h @@ -35,11 +35,11 @@ public: XQItemList makeRow( const XQNodePtr& sheetNode, const XQNodePtr& contentNode ); XQItem* makeSingleItem( const XQNodePtr& sheetNode, const QString& caption ); - void setItemDataFromString( XQItem& item, const QString& roleKey, const QString& source ) const; + void setItemTypeDataFromString( XQItem& item, const QString& roleKey, const QString& source ) const; XQItemType* makeItemType(const XQNodePtr& sheetEntry ); XQItemType* findItemTypeTemplate(const QString& key ) const; - QVariant makeVariant(int dataRole, const QString &value ) const; + protected: diff --git a/src/xtree.qrc b/src/xtree.qrc index 5ddd828..7df0b75 100644 --- a/src/xtree.qrc +++ b/src/xtree.qrc @@ -1,14 +1,10 @@ - - ../xml/modeldata1.xtr - ../xml/modeldata2.xtr - ../xml/modeldata3.xtr - ../xml/modelsheets.xml - ../qml/xqtableview.qml - ../qml/HorizontalHeaderViewDelegate.qml - ../qml/XMain.qml - ../qml/VerticalHeaderViewDelegate.qml - ../qml/dummyview.qml - ../qml/xqtreeview.qml - - \ No newline at end of file + + ../xml/modeldata1.xtr + ../xml/modeldata2.xtr + ../xml/modeldata3.xtr + ../xml/modelsheets.xml + ../qml/xqtableview.qml + ../qml/xqtreeview.qml + + diff --git a/xml/modelsheets.xml b/xml/modelsheets.xml index e09f636..3f10178 100644 --- a/xml/modelsheets.xml +++ b/xml/modelsheets.xml @@ -19,7 +19,7 @@ - +