/*************************************************************************** source::worx xtree Copyright © 2024-2025 c.holzheuer christoph.holzheuer@gmail.com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. ***************************************************************************/ #ifndef XQITEM_H #define XQITEM_H #include #include #include #include #include using XQItemList = QList; class XQItemFactory; class XQItemType; /** * @brief Extends QStandardItem to hold additional * settings. */ class XQItem : public QStandardItem { QML_ELEMENT friend class XQItemFactory; public: /// Die data(enum role) Infrastruktur wird sowohl für XQItem als auch /// für den XQItemType verwendet, deshalb definieren wir hier _alle_ /// notwendigen Roles enum ItemDataRole { NoRole = Qt::UserRole + 1, // das ist ein pointer auf den original-string aus dem XML ContentRole, ItemTypeRole, RenderStyleRole, EditorTypeRole, UnitTypeRole, ContentFormatRole, // @see qstandarditemmodel.cpp, stolen from there FlagsRole = Qt::ItemDataRole(Qt::UserRole - 1), IconRole = Qt::DecorationRole, // re-start count FixedChoicesRole = ContentFormatRole+1, ContentNodeRole, //?? werden beide gebraucht? SheetNodeRole, // das ist der Schlüssel um den content string aus dem contentNode zu holen //ContentKeyRole, // weitere, weniger gebräuchlichen Rollen für XQItemType::data() TypeKeyRole, //TypeNameRole, nicht so wichtig RoleEnd }; // wie wirds gemalt enum RenderStyle { NoRenderStyle, HiddenStyle, HeaderStyle, PlainStyle, CheckBoxStyle, ComboBoxStyle, PickerStyle, SpinBoxStyle, ProgressBarStyle, FormattedStyle, TreeHeaderStyle, CustomRenderStyle, RenderStyleEnd //!< Not a special editor. Keep at end of this enumeration! // ... }; // wie wirds editiert enum EditorType { NoEditorType, LineEditType, ComboBoxType, PickerType, ProgressBarType, SpinBoxType, CustomEditorType, EditorTypeEnd }; // typische Einheiten enum UnitType { NoUnitType, Ampere, Volt, Ohm, Watt, WattPeak, WattHour, Farad, Tesla, Henry, Hertz, Coulomb, Kelvin, Percent, Second, Meter, Kg, ISODate, UnitTypeEnd }; XQItem(); XQItem( XQItemType* itemType ); XQItem( XQItemType* itemType, const QString* content ); XQItem( XQItemType* itemType, const QString& content ); virtual ~XQItem() = default; //! creates not a clone but a new default item, \see QStandardItemModel::setItemPrototype() //! -- not used at the moment -- XQItem* clone() const override; //! __fix Tested, ob ein itemtype vorhanden ist. bool isValidX() const; bool hasContentNode() const; //! gibt den zu diesem item gehörigen datenknoten zurück XQNodePtr contentNode() const; XQNodePtr sheetNode() const; void setSheetNode( const XQNodePtr& sheetNode ); XQItemType& itemType() const; void setItemType( XQItemType* itemTypePtr ); // shortcuts für die itemFlags // __fix! das können die selber !? void addFlag( Qt::ItemFlag newFlag ); void clearFlag( Qt::ItemFlag newFlag ); QString itemFlagsToString() const; // das ist die EditRole: unformatierter Text QString rawText() const; // changed: gibt jetzt den pointer zurück. //QString* content() const; //void setContent( const QString* content ); // // Convenience-Funktionen zum Memberzugriff, die Implementierung // läuft über die data()-Methode wie in den QStandardItems. So // ist sie für XQItem und auch für XQItemType als Deirvat von XQItem gültig. // RenderStyle renderStyle() const; QString renderStyleToString() const; void setRenderStyle(RenderStyle renderStyle ); EditorType editorType() const; QString editorTypeToString() const; void setEditorType(EditorType editorType); UnitType unitType() const; QString unitTypeToString() const; void setUnitType(UnitType unitType); QString contentFormat() const; void setContentFormat(const QString& contentFormat); QStandardItemModel* fixedChoices() const; QString fixedChoicesToString() const; //! setzt das auswahl-model für read-only comboboxes void setfixedChoices( QStandardItemModel* newModel ); // //shortCuts // bool isHeaderStyle(); QString dataRoleName(int role) const; QVariant data(int role = Qt::DisplayRole ) const override; void setData(const QVariant &value, int role ) override; /* template void setToVariant(T entry, QtExtUserRoles::NTDataRoles role) { setData(QVariant::fromValue(entry), role); } template T getFromVariant(QtExtUserRoles::NTDataRoles role) { return data(role).value(); } */ /// /// Static convenience methods /// static XQItem& xqItemFromIndex( const QModelIndex& index ); static XQItem& fallBackDummyItem(); static int fetchItemDataRole( const QString& dataRoleKey ); static QString fetchItemDataRoleName( int dataRole ); static Qt::ItemFlag fetchItemFlag( const QString& flagKey ); static QString fetchItemFlagName( int flag ); static RenderStyle fetchRenderStyle( const QString& styleKey ); static QString fetchRenderStyleToString( RenderStyle renderStyle ); static EditorType fetchEditorType( const QString& editorTypeKey ); static QString fetchEditorTypeToString( EditorType editorType ); static UnitType fetchUnitType( const QString& typeKey ); static QString fetchUnitTypeToString( UnitType ); protected: XQItem(const XQItem& other) = default; XQItem& operator=(const XQItem& other) = default; bool hasContentPtr() const; QString contentFallBackText() const; // das ist protected, weil damit der content()-zugriff demoliert werden kann void setContentNode(const XQNodePtr& contentNode ); using XQItemFlagMap = QMap; using XQItemDataRoleMap = QMap; using XQRenderStyleMap = QMap; using XQEditorTypeMap = QMap; using XQUnitTypeMap = QMap; using XQPrefixExponentMap = QMap; static XQItemFlagMap s_ItemFlagMap; static XQItemDataRoleMap s_ItemDataRoleMap; static XQRenderStyleMap s_RenderStyleMap; static XQEditorTypeMap s_EditorTypeMap; static XQUnitTypeMap s_UnitTypeMap; static XQPrefixExponentMap s_PrefixExponentMap; //! leerer itemtype als mockup für den xqitem default constructor static XQItemType s_DummyItemType; }; Q_DECLARE_METATYPE(XQItem::RenderStyle); Q_DECLARE_METATYPE(XQItem::EditorType); Q_DECLARE_METATYPE(XQItem::UnitType); Q_DECLARE_METATYPE(const QString*); #endif // XQITEM_H