//----------------------------------------------------------------------------- // $Id: QtSCT/EditSctSlotListTreeView.hpp 2014/11/07 19:53:29 philw $ //----------------------------------------------------------------------------- // // CLASSES: // class EditSctSlotListTreeView : public QTreeWidget // class EditSctSlotListTreeView::SlotItem : public QTreeWidgetItem // // SEE COMMENTS in EditSctSlotListTreeView.cpp. // //-- #ifndef EditSctSlotListTreeViewINCLUDED #define EditSctSlotListTreeViewINCLUDED #ifndef EditSctSlotListPanelINCLUDED #include "EditSctSlotListPanel.hpp" #endif #ifndef SctConfigINCLUDED #include "SctConfig.hpp" #endif #include #include #include #include #include #include #include class QAction; class QColor; class QComboBox; class QLineEdit; class QMouseEvent; class QSpinBox; class QTimer; class Account; class SimObj; class Slot; // ***************************************************** // *** class EditSctSlotListTreeView : QTreeWidget *** // ***************************************************** class EditSctSlotListTreeView : public QTreeWidget { Q_OBJECT private: class SlotItem; // public QTreeWidget private: EditSctSlotListPanel* _parentPanel; QList _slotDataList; QList _slotItemList; QList _topLevelRows; bool _rebuildTree_inProgress; bool _setSelection_inProgress; bool _setExpanded_inProgress; public: EditSctSlotListTreeView (EditSctSlotListPanel* parentPanel); virtual ~EditSctSlotListTreeView(); SctConfig* sctConfig() const; void loadSctConfigSlotDataList (const QList&); void rebuildTree(); QList sctConfigSlotDataList() const; QSet sctConfigSlotDataListSerNums() const; void showSlotNameColumn (bool); const QList& slotItemListRef() const { return _slotItemList; } void saveTreeWidgetItemSelections(); void selectRowsBySerialNum (const QSet& serialNums); QSet selectedRowSerialNums() const; QList locateSelectedSlots() const; static void selectOnlySerNum (QList&, int serialNum); QSet openRowSerialNums() const; void scrollToSerialNum (int serNum, QAbstractItemView::ScrollHint scrollHint); // Note: The "impl" (implied) selection counts include all slots // within _closed_ selected groups. void computeRowStats ( int& itemCnt, int& selItemCnt, int& implSelItemCnt, int& slotCnt, int& selSlotCnt, int& implSelSlotCnt, int& divCnt, int& selDivCnt, int& orphSelSlotCnt, int& openDivCnt, int& selOpenDivCnt, QSet& selGroupRows) const; QList slotItemGroupRowsAtRow (int rowInx, bool flatGroups=false) const; int singleSelGroupRow() const; int rowChildrenBaseObjTypeId (int rowInx, QString& objNameRet) const; int firstSelectedRow (bool* isSlot=NULL) const; QList selectedRowIndices() const; // QList selectedRowIndices_Slots() const; // QList selectedRowIndices_Divs() const; void applyItemExpandedStates(); void resizeAllColumns(); void scrollToSelection (bool padBottom=true); void expandGroups (bool onlySelectedDivs); void collapseGroups (bool onlySelectedDivs); int deselectChildren (int row); static bool moveSelItemsUpOrDown (QList& slotItems, char upOrDown, // 'U' or 'D' bool checkValidOnly=false); bool moveSelSlotItemsUpOrDown (char UorD, bool checkValidOnly); bool moveSelectedSlotItemsUp (bool checkValidOnly); bool moveSelectedSlotItemsDown (bool checkValidOnly); bool moveSelGroupItemsUpOrDown (char UorD, bool checkValidOnly); bool moveSelectedSlotGroupsUp (bool checkValidOnly); bool moveSelectedSlotGroupsDown (bool checkValidOnly); int copySelItems (bool forCut=false); // including 'implied' selected items int cutSelItems(); // including 'implied' selected items int removeSelItems(); // including 'implied' selected items int copySelGroups (bool forCut=false); int cutSelGroups(); int removeSelGroups(); void insertSeriesSlots (const QList&, const SctConfig* sctCfg); void appendSeriesSlots (const QList&, const SctConfig* sctCfg); void reassignSeriesSlot (SlotColRef, const SctConfig* sctCfg); void insertDivider (bool forSerTab); void appendDivider (bool forSerTab); void insertSlotDataList (const QList&); void appendSlotDataList (const QList&); public: // Object Type Operations static QString slotContainerName (const Slot*); static int slotContainerTypeId (const Slot*, bool baseType); static QString typeIdStr (int typeId, bool plural=false); static bool isAccountTypeId (int typeId); // Create groups similar to the specified group for the given list // of SimObj or Account names. void createSimilarGroups (int groupInx, const QList& newObjNameList); private: void initConnections(); private slots: void slotItemChanged (QTreeWidgetItem*, int col); void slotItemClicked (QTreeWidgetItem*, int col); void slotItemCollapsed (QTreeWidgetItem*); void slotItemDoubleClicked (QTreeWidgetItem*, int col); void slotItemExpanded (QTreeWidgetItem*); void slotItemPressed (QTreeWidgetItem*, int col); void slotItemSelectionChanged(); protected: // virtual from QWidget void mousePressEvent (QMouseEvent*) override; void mouseReleaseEvent (QMouseEvent*) override; // ************************************************************ // *** Application Utilities (moved from ItemModel class) *** // ************************************************************ public: QColor dividerBgColor (bool forSerTab) const; QString cellStr (int row, int col, bool forEdit=false) const; QString cellTipStr (int row, int col) const; QIcon cellIcon (int row, int col, QSize& retSize) const; bool cellEditable (int row, int col) const; void emitDataChangedExcludingCell (const QModelIndex&); int findSerialNumRow (int serNum) const; bool isSlotDividerRow (int row) const; bool isTabDividerRow (int row) const; QIcon slotTypeIcon (int row, QSize& retSize) const; QString unitTypeStr (int row) const; QString stepSizeStr (int row) const; QString itemLabelStr (int row) const; QString slotNameStr (int row) const; QString slotDescStr (int row) const; QWidget* cellEditorWidget() const; const QModelIndex& cellEditorIndexRef() const; void ensureFirstItemIsDivider (bool doRebuildTree=true); QSize maxIconSize() const; }; // *************************************************** // *** class EditSctSlotListTreeView :: SlotItem *** // *************************************************** class EditSctSlotListTreeView::SlotItem : public QTreeWidgetItem { private: EditSctSlotListTreeView* _parentTree; SctConfigSlotData _slotData; QPixmap _slotTypePixmap; QString _unitTypeStr; QString _containerName; // SimObj or Account Name int _objTypeId; // SimObj or Account Type ID int _baseTypeId; // .. all Reservoirs: RESERVOIR_ID bool _slotVisible; int _itemRow; // row index for this item int _parentRow; // row index for this item's tree parent int _sibInx; // index of this item among item's parent's children. public: SlotItem (EditSctSlotListTreeView* parentTree = NULL, const SctConfigSlotData& slotData = SctConfigSlotData()); const SctConfigSlotData& slotDataRef() const { return _slotData; } void updateCells(); bool isVisibleSlot() const { return _slotVisible; } bool dataIsExpanded() const { return _slotData._dividerTreeIsExpanded; } void dataSetExpanded (bool exp) { _slotData._dividerTreeIsExpanded = exp; } int serNum() const { return _slotData.serNum(); } QString unitTypeStr() const { return _unitTypeStr; } QString containerName() const { return _containerName; } int objTypeId() const { return _objTypeId; } int baseTypeId() const { return _baseTypeId; } bool isSlotDivider() const { return (_slotData._itemType == 'D'); } bool isTabDivider() const { return (_slotData._itemType == 'T'); } bool isDivider() const { return isSlotDivider() || isTabDivider(); } void setItemLabelStr (const QString&); QString itemLabelStr() const; QString slotNameStr() const; QString indexDebugStr() const; QPixmap slotTypePixmap() const; QString stepSizeStr() const; QString slotDescStr() const; void setItemLabel (const QString&); // Item Tree Data int itemRow() const { return _itemRow; } int parentRow() const { return _parentRow; } int sibInx() const { return _sibInx; } void setItemTreeData (int itemRow, int parentRow, int sibInx); }; #endif // EditSctSlotListTreeViewINCLUDED //--- (end EditSctSlotListTreeView.hpp) ---