#pragma once #include "lc_context.h" class lcPartSelectionListModel; class lcPartSelectionListView; class lcPartSelectionWidget; enum class lcPartCategoryType { AllParts, PartsInUse, Submodels, Palette, Category, Count }; enum class lcPartCategoryRole { Type = Qt::UserRole, Index }; struct lcPartPalette { QString Name; std::vector Parts; }; class lcPartSelectionItemDelegate : public QStyledItemDelegate { Q_OBJECT public: lcPartSelectionItemDelegate(QObject* Parent, lcPartSelectionListModel* ListModel) : QStyledItemDelegate(Parent), mListModel(ListModel) { } void paint(QPainter* Painter, const QStyleOptionViewItem& Option, const QModelIndex& Index) const override; QSize sizeHint(const QStyleOptionViewItem& Option, const QModelIndex& Index) const override; protected: lcPartSelectionListModel* mListModel; }; class lcPartSelectionListModel : public QAbstractListModel { Q_OBJECT public: lcPartSelectionListModel(QObject* Parent); ~lcPartSelectionListModel(); int rowCount(const QModelIndex& Parent = QModelIndex()) const override; QVariant data(const QModelIndex& Index, int Role = Qt::DisplayRole) const override; QVariant headerData(int Section, Qt::Orientation Orientation, int Role = Qt::DisplayRole) const override; Qt::ItemFlags flags(const QModelIndex& Index) const override; PieceInfo* GetPieceInfo(const QModelIndex& Index) const { return Index.isValid() ? mParts[Index.row()].first : nullptr; } PieceInfo* GetPieceInfo(int Row) const { return mParts[Row].first; } bool GetShowDecoratedParts() const { return mShowDecoratedParts; } bool GetShowPartAliases() const { return mShowPartAliases; } int GetIconSize() const { return mIconSize; } bool GetShowPartNames() const { return mShowPartNames; } int GetColorIndex() const { return mColorIndex; } bool IsColorLocked() const { return mColorLocked; } bool IsListMode() const { return mListMode; } void Redraw(); void SetColorIndex(int ColorIndex); void ToggleColorLocked(); void ToggleListMode(); void SetCategory(int CategoryIndex); void SetModelsCategory(); void SetPaletteCategory(int SetIndex); void SetCurrentModelCategory(); void SetFilter(const QString& Filter); void RequestPreview(int InfoIndex); void SetShowDecoratedParts(bool Show); void SetShowPartAliases(bool Show); void SetIconSize(int Size); void SetShowPartNames(bool Show); protected slots: void PartLoaded(PieceInfo* Info); protected: void ClearRequests(); void DrawPreview(int InfoIndex); lcPartSelectionListView* mListView; std::vector> mParts; std::vector mRequestedPreviews; int mIconSize; bool mColorLocked; int mColorIndex; bool mShowPartNames; bool mListMode; bool mShowDecoratedParts; bool mShowPartAliases; QByteArray mFilter; std::unique_ptr mView; std::unique_ptr mModel; }; class lcPartSelectionListView : public QListView { Q_OBJECT public: lcPartSelectionListView(QWidget* Parent, lcPartSelectionWidget* PartSelectionWidget); void startDrag(Qt::DropActions SupportedActions) override; void SetCategory(lcPartCategoryType Type, int Index); PieceInfo* GetCurrentPart() const { return mListModel->GetPieceInfo(currentIndex()); } lcPartSelectionListModel* GetListModel() const { return mListModel; } lcPartSelectionWidget* GetPartSelectionWidget() const { return mPartSelectionWidget; } PieceInfo* GetContextInfo() const { return mContextInfo; } void UpdateViewMode(); public slots: void CustomContextMenuRequested(QPoint Pos); void SetNoIcons(); void SetSmallIcons(); void SetMediumIcons(); void SetLargeIcons(); void SetExtraLargeIcons(); void TogglePartNames(); void ToggleDecoratedParts(); void TogglePartAliases(); void ToggleListMode(); void ToggleFixedColor(); protected: void SetIconSize(int Size); void PreviewSelection(int InfoIndex); void mouseDoubleClickEvent(QMouseEvent* MouseEvent) override; lcPartSelectionListModel* mListModel; lcPartSelectionWidget* mPartSelectionWidget; PieceInfo* mContextInfo; lcPartCategoryType mCategoryType; int mCategoryIndex; }; class lcPartSelectionWidget : public QWidget { Q_OBJECT public: lcPartSelectionWidget(QWidget* Parent); void Redraw(); void SetDefaultPart(); void UpdateModels(); void UpdateCategories(); void LoadState(QSettings& Settings); void SaveState(QSettings& Settings); void DisableIconMode(); void SetColorIndex(int ColorIndex) { mPartsWidget->GetListModel()->SetColorIndex(ColorIndex); } const std::vector& GetPartPalettes() const { return mPartPalettes; } public slots: void AddToPalette(); void RemoveFromPalette(); protected slots: void DockLocationChanged(Qt::DockWidgetArea Area); void FilterChanged(const QString& Text); void FilterCategoriesChanged(const QString& Text); void FilterTriggered(); void FilterCaseTriggered(); void FilterCategoriesTriggered(); void CategoryChanged(QTreeWidgetItem* Current, QTreeWidgetItem* Previous); void PartChanged(const QModelIndex& Current, const QModelIndex& Previous); void OptionsMenuAboutToShow(); void EditPartPalettes(); protected: void LoadPartPalettes(); void SavePartPalettes(); void resizeEvent(QResizeEvent* Event) override; bool event(QEvent* Event) override; QTreeWidget* mCategoriesWidget; QLineEdit* mFilterCategoriesWidget; QAction* mFilterCategoriesAction; QAction* mFilterCaseAction; QLineEdit* mFilterWidget; QAction* mFilterAction; lcPartSelectionListView* mPartsWidget; QSplitter* mSplitter; std::vector mPartPalettes; };