#include "toonz/tpalettehandle.h"
#include "tundo.h"
#include "historytypes.h"
//=============================================================================
// AutopaintToggleUndo
//-----------------------------------------------------------------------------
namespace {
class AutopaintToggleUndo final : public TUndo {
TPaletteHandle *m_paletteHandle;
TPaletteP m_palette;
int m_styleId;
bool m_flag;
public:
AutopaintToggleUndo(TPaletteHandle *paletteHandle, int styleId)
: m_paletteHandle(paletteHandle)
, m_palette(paletteHandle->getPalette())
, m_styleId(styleId) {}
void toggleAutopaint() const {
TColorStyle *s = m_palette->getStyle(m_styleId);
s->setFlags(s->getFlags() == 0 ? 1 : 0);
m_paletteHandle->notifyColorStyleChanged();
}
void undo() const override { toggleAutopaint(); }
void redo() const override { toggleAutopaint(); }
void onAdd() override { redo(); }
int getSize() const override { return sizeof(*this); }
QString getHistoryString() override {
return QObject::tr("Toggle Autopaint Option Palette : %1 Style#%2")
.arg(QString::fromStdWString(m_palette->getPaletteName()))
.arg(QString::number(m_styleId));
}
int getHistoryType() override { return HistoryType::Palette; }
};
} // namespace
//=============================================================================
// TPaletteHandle
//-----------------------------------------------------------------------------
TPaletteHandle::TPaletteHandle()
: m_palette(0), m_styleIndex(-1), m_styleParamIndex(-1) {
connectBroadcasts(this);
}
//-----------------------------------------------------------------------------
TPaletteHandle::~TPaletteHandle() {}
//-----------------------------------------------------------------------------
TPalette *TPaletteHandle::getPalette() const { return m_palette; }
//-----------------------------------------------------------------------------
int TPaletteHandle::getStyleIndex() const { return m_styleIndex; }
//-----------------------------------------------------------------------------
int TPaletteHandle::getStyleParamIndex() const { return m_styleParamIndex; }
//-----------------------------------------------------------------------------
TColorStyle *TPaletteHandle::getStyle() const {
if (!m_palette || m_styleIndex == -1) return 0;
return m_palette->getStyle(m_styleIndex);
}
//-----------------------------------------------------------------------------
bool TPaletteHandle::connectBroadcasts(const QObject *receiver) {
bool ret = true;
ret = connect(this, SIGNAL(broadcastPaletteChanged()), receiver,
SIGNAL(paletteChanged())) &&
ret;
ret = connect(this, SIGNAL(broadcastPaletteTitleChanged()), receiver,
SIGNAL(paletteTitleChanged())) &&
ret;
ret = connect(this, SIGNAL(broadcastColorStyleSwitched()), receiver,
SIGNAL(colorStyleSwitched())) &&
ret;
ret = connect(this, SIGNAL(broadcastColorStyleChanged(bool)), receiver,
SIGNAL(colorStyleChanged(bool))) &&
ret;
ret = connect(this, SIGNAL(broadcastColorStyleChangedOnMouseRelease()),
receiver, SIGNAL(colorStyleChangedOnMouseRelease())) &&
ret;
return ret;
}
//-----------------------------------------------------------------------------
bool TPaletteHandle::disconnectBroadcasts(const QObject *receiver) {
bool ret = true;
ret = disconnect(this, SIGNAL(broadcastPaletteChanged()), receiver,
SIGNAL(paletteChanged())) &&
ret;
ret = disconnect(this, SIGNAL(broadcastPaletteTitleChanged()), receiver,
SIGNAL(paletteTitleChanged())) &&
ret;
ret = disconnect(this, SIGNAL(broadcastColorStyleSwitched()), receiver,
SIGNAL(colorStyleSwitched())) &&
ret;
ret = disconnect(this, SIGNAL(broadcastColorStyleChanged(bool)), receiver,
SIGNAL(colorStyleChanged(bool))) &&
ret;
ret = disconnect(this, SIGNAL(broadcastColorStyleChangedOnMouseRelease()),
receiver, SIGNAL(colorStyleChangedOnMouseRelease())) &&
ret;
return ret;
}
//-----------------------------------------------------------------------------
void TPaletteHandle::setPalette(TPalette *palette, int styleIndex) {
if (palette) {
if (styleIndex < 0) {
styleIndex = palette->getCurrentStyleId();
if (!palette->getStylePage(styleIndex)) { // in case the style is deleted
styleIndex = 1;
palette->setCurrentStyleId(styleIndex);
}
} else
palette->setCurrentStyleId(styleIndex);
}
if (m_palette == palette)
setStyleIndex(styleIndex);
else {
m_palette = palette;
m_styleIndex = styleIndex;
m_styleParamIndex = 0;
emit paletteSwitched();
// to let ToonzCheck to update the current index
emit broadcastColorStyleSwitched();
}
}
//-----------------------------------------------------------------------------
// forceEmit flag is used in PageViewer and StylePicker tool.
// See the function PageViewer::setCurrentStyleIndex() in paletteviewergui.cpp
// Also see the function StylePickerTool::pick() in stylepickertool.cpp
void TPaletteHandle::setStyleIndex(int index, bool forceEmit) {
if (m_styleIndex != index || m_styleParamIndex != 0 || forceEmit) {
if (m_palette) m_palette->setCurrentStyleId(index);
m_styleIndex = index;
m_styleParamIndex = 0;
emit broadcastColorStyleSwitched();
}
}
//-----------------------------------------------------------------------------
void TPaletteHandle::setStyleParamIndex(int index) {
if (m_styleParamIndex != index) {
m_styleParamIndex = index;
emit broadcastColorStyleSwitched();
}
}
//-----------------------------------------------------------------------------
void TPaletteHandle::notifyPaletteChanged() { emit broadcastPaletteChanged(); }
//-----------------------------------------------------------------------------
void TPaletteHandle::notifyPaletteTitleChanged() {
emit broadcastPaletteTitleChanged();
}
//-----------------------------------------------------------------------------
void TPaletteHandle::notifyColorStyleSwitched() {
emit broadcastColorStyleSwitched();
}
//-----------------------------------------------------------------------------
void TPaletteHandle::notifyColorStyleChanged(bool onDragging,
bool setDirtyFlag) {
if (setDirtyFlag && getPalette() && !getPalette()->getDirtyFlag())
getPalette()->setDirtyFlag(true);
emit broadcastColorStyleChanged(onDragging);
if (!onDragging) emit broadcastColorStyleChangedOnMouseRelease();
}
//-----------------------------------------------------------------------------
void TPaletteHandle::toggleAutopaint() {
int index = getStyleIndex();
if (index > 0) {
TUndoManager::manager()->add(new AutopaintToggleUndo(this, index));
}
}