Blob Blame Raw
#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 <QFrame>
#include <QTabBar>
#include <QShortcut>

#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