/*************************************************************************** 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 XQVIEWMODEL_H #define XQVIEWMODEL_H #include #include #include #include #include #include #include #include #include class XQTreeTable; class XQItem; class XQCommand; //! ein erweitertes QStandardItemModel welches 'seine' view bereits enthält. class XQViewModel : public QStandardItemModel { Q_OBJECT QML_ELEMENT public: XQViewModel(QObject* parent = nullptr); virtual ~XQViewModel() = default; QHash roleNames() const override; XQTreeTable* treeTable(); virtual void setTreeTable( XQTreeTable* mainView ); QUndoStack* undoStack(); void setUndoStack( QUndoStack* undoStack ); virtual void initModel( const QString& modelName); //little helpers const XQItem& xqRootItem(); XQItem& xqItemFromIndex(const QModelIndex& index) const; XQItem& xqFirstItem(int row) const; // undo-/redo-able stuff virtual void cmdToggleSection( const XQCommand& command ); virtual void cmdCut( const XQCommand& command ); virtual void cmdCutUndo( const XQCommand& command ); virtual void cmdPaste( const XQCommand& command ); virtual void cmdPasteUndo( const XQCommand& command ); virtual void cmdDelete( const XQCommand& command ); virtual void cmdDeleteUndo( const XQCommand& command ); virtual void cmdNew( const XQCommand& command ); virtual void cmdNewUndo( const XQCommand& command ); /*! Derzeit wird die default-implementierung von data/setData genutzt. hier wäre dann die Stelle um setData & data an externe 'handler' umzubiegen, siehe giovannies 'model-injection' QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override { return QStandardItemModel::data( index, role ); } bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) override { qDebug() << " --- setData: " << value.toString(); return QStandardItemModel::setData( index, value, role ); } */ public slots: virtual void onShowContextMenu(const QPoint& point); virtual void onActionTriggered(QAction* action); // handle XQCommands ( == UndoCommand ) virtual void onCommandRedo( const XQCommand& command ); virtual void onCommandUndo( const XQCommand& command ); signals: void itemCreated( XQItem* newItem ); void sectionCreated( const XQModelSection& section ); void sectionToggled( const XQModelSection& section ); protected: void addSection(const XQItemList& list, const XQNodePtr& sheetNode ); virtual void initContextMenu(){} // __fixme: should be created from xml virtual void setupViewProperties(); protected: using MemCall = void (XQViewModel::*)(const XQCommand&); using MemCallMap = QMap; // das eine reference auf ein globales singleton XQItemFactory& _itemFactory; XQSimpleClipBoard _clipBoard; XQModelSectionList _sections; XQTreeTable* _treeTable{}; //QAbstractItemView* _treeTable{}; QUndoStack* _undoStack{}; XQContextMenu* _contextMenu{}; //! Die Modelbeschreibung XQNodePtr _modelSheet{}; //! Der eigentliche Inhalt XQNodePtr _contentRoot{}; }; #endif // XQVIEWMODEL_H