#pragma once #ifndef PALETTEVIEWERGUI_H #define PALETTEVIEWERGUI_H // TnzQt includes #include "toonzqt/selection.h" #include "toonzqt/lineedit.h" // TnzCore includes #include "tpalette.h" // Qt includes #include #include #include #undef DVAPI #undef DVVAR #ifdef TOONZQT_EXPORTS #define DVAPI DV_EXPORT_API #define DVVAR DV_EXPORT_VAR #else #define DVAPI DV_IMPORT_API #define DVVAR DV_IMPORT_VAR #endif //============================================================== // Forward declarations class TXsheetHandle; class TFrameHandle; class TPaletteHandle; class TXshLevelHandle; class TStyleSelection; class TabBarContainter; class ChangeStyleCommand; class QMimeData; class StyleNameEditor; //============================================================== //**************************************************************************** // PaletteViewerGUI namespace //**************************************************************************** /*! \brief Contains classes pertaining the GUI of a Toonz Palette Viewer. */ namespace PaletteViewerGUI { // class for managing the palette's default style chip size class DVAPI ChipSizeManager { public: int chipSize_Palette; int chipSize_Cleanup; int chipSize_Studio; static ChipSizeManager *instance() { static ChipSizeManager _instance; return &_instance; } private: ChipSizeManager() : chipSize_Palette(2), chipSize_Cleanup(2), chipSize_Studio(2) {} }; enum PaletteViewType //! Possible palette contents of a Palette Viewer. { LEVEL_PALETTE, //!< Content palette is from a level. CLEANUP_PALETTE, //!< Content palette is from cleanup settings. STUDIO_PALETTE //!< Content palette is from a Studio Palette panel. }; //**************************************************************************** // PageViewer declaration //**************************************************************************** class DVAPI PageViewer : public QFrame, public TSelection::View { Q_OBJECT QColor m_textColor; // text color used for list view Q_PROPERTY(QColor TextColor READ getTextColor WRITE setTextColor) public: enum ViewMode //! Possible view modes for a Palette Viewer. { SmallChips, //!< Small icons. MediumChips, //!< Medium icons. LargeChips, //!< Large icons with style names. List, //!< Top-down list of all icons. SmallChipsWithName //!< Small icons with overlayed style names (if //!user-defined). }; // for displaying the linked style name from studio palette enum NameDisplayMode { Style, Original, StyleAndOriginal }; public: PageViewer(QWidget *parent = 0, PaletteViewType viewType = LEVEL_PALETTE, bool hasPasteColors = true); ~PageViewer(); void setPaletteHandle(TPaletteHandle *paletteHandle); TPaletteHandle *getPaletteHandle() const; void setXsheetHandle(TXsheetHandle *xsheetHandle); TXsheetHandle *getXsheetHandle() const; void setFrameHandle(TFrameHandle *xsheetHandle); TFrameHandle *getFrameHandle() const; // for clearing the cache when execute paste style command on styleSelection void setLevelHandle(TXshLevelHandle *levelHandle); void setCurrentStyleIndex(int index); int getCurrentStyleIndex() const; void setPage(TPalette::Page *page); TPalette::Page *getPage() const { return m_page; } void setChangeStyleCommand(ChangeStyleCommand *changeStyleCommand) { m_changeStyleCommand = changeStyleCommand; }; ChangeStyleCommand *getChangeStyleCommand() const { return m_changeStyleCommand; } int getChipCount() const; ViewMode getViewMode() const { return m_viewMode; } void setViewMode(ViewMode mode); void setNameDisplayMode(NameDisplayMode mode); PaletteViewerGUI::PaletteViewType getViewType() const { return m_viewType; } int posToIndex(const QPoint &pos) const; QRect getItemRect(int index) const; QRect getColorChipRect(int index) const; QRect getColorNameRect(int index) const; void drop(int indexInPage, const QMimeData *mimeData); void createDropPage(); void onSelectionChanged() { update(); } TStyleSelection *getSelection() const { return m_styleSelection; } void clearSelection(); // update the "lock"s for commands when the StyleSelection becomes current and // when the current palettte changed void updateCommandLocks(); void setTextColor(const QColor &color) { m_textColor = color; } QColor getTextColor() const { return m_textColor; } public slots: void computeSize(); void onFrameChanged(); void onStyleRenamed(); void addNewColor(); void addNewPage(); protected: QSize getChipSize() const; void drawColorChip(QPainter &p, QRect &chipRect, TColorStyle *style); void drawColorName(QPainter &p, QRect &nameRect, TColorStyle *style, int styleIndex); void drawToggleLink(QPainter &p, QRect &chipRect, TColorStyle *style); // event handlers void paintEvent(QPaintEvent *); void resizeEvent(QResizeEvent *); void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); void mouseDoubleClickEvent(QMouseEvent *event); void contextMenuEvent(QContextMenuEvent *event); void keyPressEvent(QKeyEvent *event); void dragEnterEvent(QDragEnterEvent *event); void dragMoveEvent(QDragMoveEvent *event); void dropEvent(QDropEvent *event); void dragLeaveEvent(QDragLeaveEvent *event); void startDragDrop(); void createMenuAction(QMenu &menu, const char *id, QString name, const char *slot); void showEvent(QShowEvent *); void hideEvent(QHideEvent *); bool event(QEvent *e); void select(int indexInPage, QMouseEvent *event); void zoomInChip(); void zoomOutChip(); protected slots: void toggleLink(); void eraseToggleLink(); void removeLink(); private: DVGui::LineEdit *m_renameTextField; QPoint m_dragStartPosition; TPalette::Page *m_page; QPoint m_chipsOrigin; int m_chipPerRow; ViewMode m_viewMode; NameDisplayMode m_nameDisplayMode; int m_dropPositionIndex; bool m_dropPageCreated; bool m_startDrag; TStyleSelection *m_styleSelection; TFrameHandle *m_frameHandle; bool m_hasPasteColors; PaletteViewType m_viewType; ChangeStyleCommand *m_changeStyleCommand; QShortcut *m_zoomInShortCut; QShortcut *m_zoomOutShortCut; StyleNameEditor *m_styleNameEditor; signals: void changeWindowTitleSignal(); }; //**************************************************************************** // PaletteTabBar declaration //**************************************************************************** class DVAPI PaletteTabBar : public QTabBar { Q_OBJECT public: PaletteTabBar(QWidget *parent, bool hasPageCommand); void setPageViewer(PageViewer *pageViewer) { m_pageViewer = pageViewer; } public slots: void updateTabName(); signals: void tabTextChanged(int index); void movePage(int srcIndex, int dstIndex); protected: void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void mouseDoubleClickEvent(QMouseEvent *event); void dragEnterEvent(QDragEnterEvent *event); void dragMoveEvent(QDragMoveEvent *event); void dropEvent(QDropEvent *event); private: DVGui::LineEdit *m_renameTextField; int m_renameTabIndex; PageViewer *m_pageViewer; bool m_hasPageCommand; }; //**************************************************************************** // PaletteIconWidget declaration //**************************************************************************** /*! \brief Special placeholder toolbar icon for \a starting a palette move through drag & drop. \details This widget is currently employed as a mere mouse event filter to propagate drag & drop starts to a PaletteViewer ancestor in the widgets hierarchy. */ class DVAPI PaletteIconWidget : public QWidget { Q_OBJECT public: #if QT_VERSION >= 0x050500 PaletteIconWidget(QWidget *parent = 0, Qt::WindowFlags flags = 0); #else PaletteIconWidget(QWidget *parent = 0, Qt::WFlags flags = 0); #endif ~PaletteIconWidget(); signals: void startDrag(); //!< Emitted \a once whenever the icon is sensibly dragged //! by the user. protected: void paintEvent(QPaintEvent *); void enterEvent(QEvent *event); void leaveEvent(QEvent *event); void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); private: QPoint m_mousePressPos; //!< Mouse position at mouse press. bool m_isOver, //!< Whether mouse is hovering on this widget. m_dragged; //!< Whether user has started a drag operation on the icon. }; } // namespace PaletteViewerGUI #endif // PALETTEVIEWERGUI_H