Blob Blame Raw


#include "styleselection.h"
#include "menubarcommandids.h"
#include "toonz/tpalettehandle.h"
#include "toonz/tscenehandle.h"
#include "tapp.h"
#include "toonzutil.h"

#include "tcolorstyles.h"
#include "tpixelutils.h"
#include "styledata.h"

#include "tundo.h"
#include "toonzqt/gutil.h"
#include "tconvert.h"

#include "toonzqt/dvdialog.h"

#include "toonz/studiopalette.h"

#include <QApplication>
#include <QClipboard>
#include <QByteArray>
#include <QBuffer>

using namespace DVGui;

//-----------------------------------------------------------------------------
namespace {
//-----------------------------------------------------------------------------

void copyStylesWithoutUndo(TPaletteP palette, int pageIndex,
                           std::set<int> *styleIndicesInPage) {
  if (!palette || pageIndex < 0) return;
  int n = styleIndicesInPage->size();
  if (n == 0) return;
  TPalette::Page *page = palette->getPage(pageIndex);
  assert(page);
  TPaletteHandle *cph = TApp::instance()->getCurrentPalette();
  StyleData *data     = new StyleData();
  std::set<int>::iterator it;
  for (it = styleIndicesInPage->begin(); it != styleIndicesInPage->end();
       ++it) {
    int j              = *it;
    int styleId        = page->getStyleId(j);
    TColorStyle *style = page->getStyle(j)->clone();
    data->addStyle(styleId, style);
  }
  QApplication::clipboard()->setMimeData(data);
}

//-----------------------------------------------------------------------------

bool pasteStylesWithoutUndo(TPaletteP palette, int pageIndex,
                            std::set<int> *styleIndicesInPage) {
  // page = pagina corrente
  TPalette::Page *page = palette->getPage(pageIndex);
  assert(page);
  // cerco il punto di inserimento (primo stile selezionato oppure dopo l'ultimo
  // stile della pagina
  // se nulla e' selezionato)
  int indexInPage                               = page->getStyleCount();
  if (!styleIndicesInPage->empty()) indexInPage = *styleIndicesInPage->begin();
  // prendo i dati dalla clipboard
  const StyleData *data =
      dynamic_cast<const StyleData *>(QApplication::clipboard()->mimeData());
  if (!data) return false;
  // cancello la selezione
  styleIndicesInPage->clear();
  // comincio a fare paste
  int i;
  for (i = 0; i < data->getStyleCount(); i++) {
    int styleId        = data->getStyleIndex(i);
    TColorStyle *style = data->getStyle(i)->clone();
    if (palette->getStylePage(styleId) < 0) {
      // styleId non e' utilizzato: uso quello
      // (cut/paste utilizzato per spostare stili)
      palette->setStyle(styleId, style);
    } else {
      // styleId e' gia' utilizzato. ne devo prendere un altro
      styleId = palette->getFirstUnpagedStyle();
      if (styleId >= 0)
        palette->setStyle(styleId, style);
      else
        styleId = palette->addStyle(style);
    }
    // inserisco lo stile nella pagina
    page->insertStyle(indexInPage + i, styleId);
    // e lo seleziono
    styleIndicesInPage->insert(indexInPage + i);
  }
  TApp::instance()->getCurrentPalette()->notifyColorStyleChanged();
  return true;
}

//-----------------------------------------------------------------------------

void deleteStylesWithoutUndo(TPaletteP palette, int pageIndex,
                             std::set<int> *styleIndicesInPage) {
  int n = styleIndicesInPage->size();
  if (n == 0) return;
  TPalette::Page *page = palette->getPage(pageIndex);
  assert(page);
  TPaletteHandle *cph         = TApp::instance()->getCurrentPalette();
  int currentStyleIndexInPage = page->search(cph->getStyleIndex());
  bool mustChangeCurrentStyle =
      currentStyleIndexInPage >= 0 &&
      styleIndicesInPage->count(currentStyleIndexInPage) > 0;
  std::set<int>::reverse_iterator it;
  for (it = styleIndicesInPage->rbegin(); it != styleIndicesInPage->rend();
       ++it) {
    int j       = *it;
    int styleId = page->getStyleId(j);
    if (styleId < 2) {
      error("Can't delete color #" + QString::number(styleId));
    } else {
      if (styleId == cph->getStyleIndex()) cph->setStyleIndex(1);
      palette->setStyle(styleId, TPixel32::Red);
      page->removeStyle(j);
    }
  }
  styleIndicesInPage->clear();
  if (mustChangeCurrentStyle) {
    // ho cancellato lo stile corrente
    if (currentStyleIndexInPage < page->getStyleCount()) {
      // posso fare in modo che lo stile selezionato sia nella stessa posizione
      cph->setStyleIndex(page->getStyleId(currentStyleIndexInPage));
    } else if (page->getStyleCount() > 0) {
      // almeno faccio in modo che sia nella stessa pagina
      int styleId = page->getStyleId(page->getStyleCount() - 1);
      cph->setStyleIndex(styleId);
    } else {
      // seleziono lo stile #1 (che c'e' sempre). n.b. questo puo' comportare un
      // cambio pagina
      cph->setStyleIndex(1);
    }
  }
  cph->notifyColorStyleChanged();
}

//-----------------------------------------------------------------------------

void cutStylesWithoutUndo(TPaletteP palette, int pageIndex,
                          std::set<int> *styleIndicesInPage) {
  copyStylesWithoutUndo(palette, pageIndex, styleIndicesInPage);
  deleteStylesWithoutUndo(palette, pageIndex, styleIndicesInPage);
}

//=============================================================================
// CopyStylesUndo
//-----------------------------------------------------------------------------

class CopyStylesUndo : public TUndo {
  QMimeData *m_oldData;
  QMimeData *m_newData;

public:
  CopyStylesUndo(QMimeData *oldData, QMimeData *newData)
      : m_oldData(oldData), m_newData(newData) {}

  void undo() const {
    QClipboard *clipboard = QApplication::clipboard();
    clipboard->setMimeData(cloneData(m_oldData), QClipboard::Clipboard);
  }

  void redo() const {
    QClipboard *clipboard = QApplication::clipboard();
    clipboard->setMimeData(cloneData(m_newData), QClipboard::Clipboard);
  }

  int getSize() const { return sizeof(*this); }
};

//=============================================================================
// PasteStylesUndo
//-----------------------------------------------------------------------------

class PasteStylesUndo : public TUndo {
  TStyleSelection *m_selection;

public:
  PasteStylesUndo(TStyleSelection *selection) : m_selection(selection) {}

  ~PasteStylesUndo() { delete m_selection; }

  void undo() const {
    std::set<int> styleIndicesInPage = m_selection->getIndicesInPage();
    cutStylesWithoutUndo(m_selection->getPalette(), m_selection->getPageIndex(),
                         &styleIndicesInPage);
  }

  void redo() const {
    std::set<int> styleIndicesInPage = m_selection->getIndicesInPage();
    pasteStylesWithoutUndo(m_selection->getPalette(),
                           m_selection->getPageIndex(), &styleIndicesInPage);
  }

  int getSize() const { return sizeof(*this); }
};

//=============================================================================
// DeleteStylesUndo
//-----------------------------------------------------------------------------

class DeleteStylesUndo : public TUndo {
  TStyleSelection *m_selection;
  QMimeData *m_data;

public:
  DeleteStylesUndo(TStyleSelection *selection, QMimeData *data)
      : m_selection(selection), m_data(data) {}

  ~DeleteStylesUndo() { delete m_selection; }

  void undo() const {
    QClipboard *clipboard = QApplication::clipboard();
    QMimeData *oldData    = cloneData(clipboard->mimeData());

    clipboard->setMimeData(cloneData(m_data), QClipboard::Clipboard);

    std::set<int> styleIndicesInPage = m_selection->getIndicesInPage();
    pasteStylesWithoutUndo(m_selection->getPalette(),
                           m_selection->getPageIndex(), &styleIndicesInPage);

    clipboard->setMimeData(oldData, QClipboard::Clipboard);
  }

  void redo() const {
    std::set<int> styleIndicesInPage = m_selection->getIndicesInPage();
    deleteStylesWithoutUndo(m_selection->getPalette(),
                            m_selection->getPageIndex(), &styleIndicesInPage);
  }

  int getSize() const { return sizeof(*this); }
};

//=============================================================================
// CutStylesUndo
//-----------------------------------------------------------------------------

class CutStylesUndo : public TUndo {
  TStyleSelection *m_selection;
  QMimeData *m_oldData;

public:
  CutStylesUndo(TStyleSelection *selection, QMimeData *data)
      : m_selection(selection), m_oldData(data) {}

  ~CutStylesUndo() { delete m_selection; }

  void undo() const {
    std::set<int> styleIndicesInPage = m_selection->getIndicesInPage();
    pasteStylesWithoutUndo(m_selection->getPalette(),
                           m_selection->getPageIndex(), &styleIndicesInPage);
    QClipboard *clipboard = QApplication::clipboard();
    clipboard->setMimeData(cloneData(m_oldData), QClipboard::Clipboard);
  }

  void redo() const {
    std::set<int> styleIndicesInPage = m_selection->getIndicesInPage();
    cutStylesWithoutUndo(m_selection->getPalette(), m_selection->getPageIndex(),
                         &styleIndicesInPage);
  }

  int getSize() const { return sizeof(*this); }
};

//-----------------------------------------------------------------------------
}  // namespace
//-----------------------------------------------------------------------------

//=============================================================================
// TStyleSelection
//-----------------------------------------------------------------------------

TStyleSelection::TStyleSelection() : m_palette(0), m_pageIndex(-1) {}

//-------------------------------------------------------------------

TStyleSelection::~TStyleSelection() {}

//-----------------------------------------------------------------------------

void TStyleSelection::enableCommands() {
  enableCommand(this, MI_Cut, &TStyleSelection::cutStyles);
  enableCommand(this, MI_Copy, &TStyleSelection::copyStyles);
  enableCommand(this, MI_Paste, &TStyleSelection::pasteStyles);
  enableCommand(this, MI_PasteValues, &TStyleSelection::pasteStylesValue);
  enableCommand(this, MI_Clear, &TStyleSelection::deleteStyles);
  enableCommand(this, MI_BlendColors, &TStyleSelection::blendStyles);
}

//-------------------------------------------------------------------

void TStyleSelection::select(const TPaletteP &palette, int pageIndex) {
  m_palette   = palette;
  m_pageIndex = pageIndex;
  m_styleIndicesInPage.clear();
}

//-------------------------------------------------------------------

void TStyleSelection::select(const TPaletteP &palette, int pageIndex,
                             int styleIndexInPage, bool on) {
  if (on) {
    if (m_palette.getPointer() != palette.getPointer() ||
        pageIndex != m_pageIndex)
      m_styleIndicesInPage.clear();
    m_palette   = palette;
    m_pageIndex = pageIndex;
    m_styleIndicesInPage.insert(styleIndexInPage);
  } else if (m_palette.getPointer() == palette.getPointer() &&
             pageIndex == m_pageIndex)
    m_styleIndicesInPage.erase(styleIndexInPage);
}

//-------------------------------------------------------------------

bool TStyleSelection::isSelected(const TPaletteP &palette, int pageIndex,
                                 int id) const {
  return m_palette.getPointer() == palette.getPointer() &&
         m_pageIndex == pageIndex &&
         m_styleIndicesInPage.find(id) != m_styleIndicesInPage.end();
}

//------------------------------------------------------------------

bool TStyleSelection::isPageSelected(const TPaletteP &palette,
                                     int pageIndex) const {
  return m_palette.getPointer() == palette.getPointer() &&
         m_pageIndex == pageIndex;
}
//-------------------------------------------------------------------

void TStyleSelection::selectNone() {
  m_palette   = 0;
  m_pageIndex = -1;
  m_styleIndicesInPage.clear();
  notifyView();
}
//-------------------------------------------------------------------

bool TStyleSelection::isEmpty() const {
  return m_pageIndex < 0 && m_styleIndicesInPage.empty();
}

//-------------------------------------------------------------------

int TStyleSelection::getStyleCount() const {
  return m_styleIndicesInPage.size();
}

//-------------------------------------------------------------------

void TStyleSelection::cutStyles() {
  if (isEmpty()) return;
  QClipboard *clipboard      = QApplication::clipboard();
  QMimeData *oldData         = cloneData(clipboard->mimeData());
  TStyleSelection *selection = new TStyleSelection(this);
  if (m_pageIndex == 0 &&
      (isSelected(m_palette, 0, 0) || isSelected(m_palette, 0, 1))) {
    MsgBox(CRITICAL, "Can't delete colors #0 and #1");
    return;
  }
  cutStylesWithoutUndo(m_palette, m_pageIndex, &m_styleIndicesInPage);

  TUndoManager::manager()->add(new CutStylesUndo(selection, oldData));
}

//-------------------------------------------------------------------

void TStyleSelection::copyStyles() {
  if (isEmpty()) return;
  QClipboard *clipboard = QApplication::clipboard();
  QMimeData *oldData    = cloneData(clipboard->mimeData());
  copyStylesWithoutUndo(m_palette, m_pageIndex, &m_styleIndicesInPage);
  QMimeData *newData = cloneData(clipboard->mimeData());

  TUndoManager::manager()->add(new CopyStylesUndo(oldData, newData));
}

//-------------------------------------------------------------------

void TStyleSelection::pasteStyles() {
  // se non c'e' palette o pagina corrente esco
  if (!m_palette || m_pageIndex < 0) return;

  if (m_pageIndex == 0 && !m_styleIndicesInPage.empty() &&
      *m_styleIndicesInPage.begin() < 2) {
    MsgBox(CRITICAL, "Can't paste styles there");
    return;
  }

  pasteStylesWithoutUndo(m_palette, m_pageIndex, &m_styleIndicesInPage);
  TUndoManager::manager()->add(new PasteStylesUndo(new TStyleSelection(this)));
}

//-------------------------------------------------------------------

void TStyleSelection::deleteStyles() {
  if (!m_palette || m_pageIndex < 0) return;
  if (m_pageIndex == 0 &&
      (isSelected(m_palette, 0, 0) || isSelected(m_palette, 0, 1))) {
    MsgBox(CRITICAL, "Can't delete colors #0 and #1");
    return;
  }

  StyleData *data = new StyleData();
  std::set<int>::iterator it;
  TPalette::Page *page = m_palette->getPage(m_pageIndex);
  for (it = m_styleIndicesInPage.begin(); it != m_styleIndicesInPage.end();
       ++it) {
    int j       = *it;
    int styleId = page->getStyleId(j);
    if (styleId < 0) continue;
    TColorStyle *style = page->getStyle(j)->clone();
    data->addStyle(styleId, style);
  }
  TStyleSelection *selection = new TStyleSelection(this);

  deleteStylesWithoutUndo(m_palette, m_pageIndex, &m_styleIndicesInPage);

  TUndoManager::manager()->add(new DeleteStylesUndo(selection, data));
}

//-----------------------------------------------------------------------------
namespace {
//-----------------------------------------------------------------------------

//=============================================================================
// UndoPasteValues
//-----------------------------------------------------------------------------

class UndoPasteValues : public TUndo {
  TPaletteP m_palette;
  class Item {
  public:
    int m_index;
    TColorStyle *m_oldStyle;
    TColorStyle *m_newStyle;
    Item(int index, const TColorStyle *oldStyle, const TColorStyle *newStyle)
        : m_index(index)
        , m_oldStyle(oldStyle->clone())
        , m_newStyle(newStyle->clone()) {}
    ~Item() {
      delete m_oldStyle;
      delete m_newStyle;
    }
  };

  std::vector<Item *> m_items;

public:
  UndoPasteValues(const TPaletteP &palette) : m_palette(palette) {}

  ~UndoPasteValues() { clearPointerContainer(m_items); }

  void addItem(int index, const TColorStyle *oldStyle,
               const TColorStyle *newStyle) {
    m_items.push_back(new Item(index, oldStyle, newStyle));
  }

  void pasteValue(int styleId, const TColorStyle *newStyle) const {
    // preserva il vecchio nome
    wstring str = m_palette->getStyle(styleId)->getName();
    m_palette->setStyle(styleId, newStyle->clone());
    m_palette->getStyle(styleId)->setName(str);
  }

  void undo() const {
    int i;
    for (i = 0; i < (int)m_items.size(); i++)
      pasteValue(m_items[i]->m_index, m_items[i]->m_oldStyle);
    TApp::instance()->getCurrentPalette()->notifyColorStyleChanged();
  }

  void redo() const {
    int i;
    for (i = 0; i < (int)m_items.size(); i++)
      pasteValue(m_items[i]->m_index, m_items[i]->m_newStyle);
    TApp::instance()->getCurrentPalette()->notifyColorStyleChanged();
  }

  int getSize() const {
    return sizeof(*this) + (int)m_items.size() * 100;  // forfait
  }
};

//-----------------------------------------------------------------------------
}  // namespace
//-----------------------------------------------------------------------------

void TStyleSelection::pasteStylesValue() {
  if (!m_palette || m_pageIndex < 0) return;
  if (m_pageIndex == 0 && isSelected(m_palette, 0, 0)) {
    MsgBox(CRITICAL, "Can't modify color #0");
    return;
  }

  TPalette::Page *page = m_palette->getPage(m_pageIndex);
  assert(page);
  const StyleData *data =
      dynamic_cast<const StyleData *>(QApplication::clipboard()->mimeData());
  if (!data) return;
  int i                 = 0;
  UndoPasteValues *undo = new UndoPasteValues(m_palette);
  std::set<int>::iterator it;
  for (it = m_styleIndicesInPage.begin();
       it != m_styleIndicesInPage.end() && i < data->getStyleCount();
       ++it, i++) {
    int styleId = page->getStyleId(*it);
    undo->addItem(styleId, m_palette->getStyle(styleId), data->getStyle(i));
    m_palette->setStyle(styleId, data->getStyle(i)->clone());
  }
  TUndoManager::manager()->add(undo);

  TPaletteHandle *ph = TApp::instance()->getCurrentPalette();
  ph->notifyColorStyleChanged();
  ph->updateColor();
}

//-----------------------------------------------------------------------------
namespace {
//-----------------------------------------------------------------------------

//=============================================================================
// UndoBlendColor
//-----------------------------------------------------------------------------

class UndoBlendColor : public TUndo {
  TPaletteP m_palette;
  int m_pageIndex;
  std::vector<std::pair<int, TColorStyle *>> m_colorStyles;
  TPixel32 m_c0, m_c1;

public:
  UndoBlendColor(TPaletteP palette, int pageIndex,
                 std::vector<std::pair<int, TColorStyle *>> colorStyles,
                 const TPixel32 &c0, const TPixel32 &c1)
      : m_palette(palette)
      , m_pageIndex(pageIndex)
      , m_colorStyles(colorStyles)
      , m_c0(c0)
      , m_c1(c1) {}

  ~UndoBlendColor() {}

  void undo() const {
    if (!m_palette) return;
    TPalette::Page *page = m_palette->getPage(m_pageIndex);
    if (!page) return;
    int count = 0;

    for (UINT i = 0; i < m_colorStyles.size(); i++) {
      TColorStyle *st = page->getStyle(m_colorStyles[i].first);
      QString gname   = QString::fromStdWString(st->getGlobalName());
      if (!gname.isEmpty() && gname[0] != L'-') continue;
      m_palette->setStyle(page->getStyleId(m_colorStyles[i].first),
                          m_colorStyles[i].second->clone());
      m_colorStyles[i].second->invalidateIcon();
    }
    TApp::instance()->getCurrentPalette()->notifyColorStyleChanged();
  }

  void redo() const {
    if (!m_palette) return;
    TPalette::Page *page = m_palette->getPage(m_pageIndex);
    if (!page) return;
    for (UINT i = 0; i < m_colorStyles.size(); i++) {
      TColorStyle *cs = page->getStyle(m_colorStyles[i].first);
      QString gname   = QString::fromStdWString(cs->getGlobalName());
      if (!gname.isEmpty() && gname[0] != L'-') continue;
      assert(cs);
      if (!cs) continue;
      cs->setMainColor(
          blend(m_c0, m_c1, (double)i / (double)(m_colorStyles.size() - 1)));
      cs->invalidateIcon();
    }
    TApp::instance()->getCurrentPalette()->notifyColorStyleChanged();
  }

  int getSize() const {
    return sizeof(
        *this);  //+500*m_oldStyles.size(); //dipende da che stile ha salvato
  }
};

//-----------------------------------------------------------------------------
}  // namespace
//-----------------------------------------------------------------------------

void TStyleSelection::blendStyles() {
  if (!m_palette || m_pageIndex < 0) return;
  int n = m_styleIndicesInPage.size();
  if (n < 2) return;

  TPalette::Page *page = m_palette->getPage(m_pageIndex);
  assert(page);

  std::vector<TColorStyle *> styles;
  std::vector<std::pair<int, TColorStyle *>> oldStyles;
  for (std::set<int>::iterator it = m_styleIndicesInPage.begin();
       it != m_styleIndicesInPage.end(); ++it) {
    TColorStyle *cs = page->getStyle(*it);
    assert(cs);
    styles.push_back(cs);
    oldStyles.push_back(std::pair<int, TColorStyle *>(*it, cs->clone()));
  }
  assert(styles.size() >= 2);

  TPixel32 c0 = styles.front()->getMainColor();
  TPixel32 c1 = styles.back()->getMainColor();

  bool areAllStyleLincked = true;
  int i;
  for (i = 1; i < n - 1; i++) {
    QString gname = QString::fromStdWString(styles[i]->getGlobalName());
    if (!gname.isEmpty() && gname[0] != L'-') continue;
    areAllStyleLincked = false;
    styles[i]->setMainColor(blend(c0, c1, (double)i / (double)(n - 1)));
    styles[i]->invalidateIcon();
  }
  if (areAllStyleLincked) return;
  TApp::instance()->getCurrentPalette()->notifyColorStyleChanged();

  UndoBlendColor *undo =
      new UndoBlendColor(m_palette, m_pageIndex, oldStyles, c0, c1);
  TUndoManager::manager()->add(undo);
}

//-----------------------------------------------------------------------------

void TStyleSelection::toggleLink() {
  if (!m_palette || m_pageIndex < 0) return;
  int n = m_styleIndicesInPage.size();
  if (n <= 0) return;

  bool somethingHasBeenLinked = false;

  bool currentStyleIsInSelection = false;
  TApp *app                      = TApp::instance();
  TPaletteHandle *ph             = app->getCurrentPalette();

  TPalette::Page *page = m_palette->getPage(m_pageIndex);
  assert(page);

  for (std::set<int>::iterator it = m_styleIndicesInPage.begin();
       it != m_styleIndicesInPage.end(); ++it) {
    TColorStyle *cs = page->getStyle(*it);
    assert(cs);
    wstring name = cs->getGlobalName();
    if (name != L"" && (name[0] == L'-' || name[0] == L'+')) {
      name[0] = name[0] == L'-' ? L'+' : L'-';
      cs->setGlobalName(name);
      if (name[0] == L'+') somethingHasBeenLinked = true;
    }

    if (*it == m_palette->getPage(m_pageIndex)->search(ph->getStyleIndex()))
      currentStyleIsInSelection = true;
  }
  if (somethingHasBeenLinked)
    StudioPalette::instance()->updateLinkedColors(m_palette.getPointer());

  ph->notifyPaletteChanged();

  if (currentStyleIsInSelection) ph->notifyColorStyleSwitched();

  // DA FARE: e' giusto mettere la nofica del dirty flag a current scene
  // o e' meglio farlo al livello corrente!?
  app->getCurrentScene()->setDirtyFlag(true);
  //  extern void setPaletteDirtyFlag();
  //  setPaletteDirtyFlag();
}

//-----------------------------------------------------------------------------

QByteArray TStyleSelection::toByteArray(int pageIndex,
                                        const std::set<int> &indicesInPage,
                                        const QString paletteGlobalName) {
  QByteArray data;
  QBuffer dataBuffer(&data);
  dataBuffer.open(QIODevice::WriteOnly);
  QDataStream out(&dataBuffer);
  out << (int)pageIndex << (int)indicesInPage.size() << paletteGlobalName;

  std::set<int>::const_iterator it;
  for (it = indicesInPage.begin(); it != indicesInPage.end(); ++it)
    out << (int)*it;
  return data;
}

//-----------------------------------------------------------------------------

void TStyleSelection::fromByteArray(QByteArray &byteArray, int &pageIndex,
                                    std::set<int> &indicesInPage,
                                    QString &paletteGlobalName) {
  QBuffer dataBuffer(&byteArray);
  dataBuffer.open(QIODevice::ReadOnly);
  QDataStream in(&dataBuffer);
  int i, count = 0;
  in >> pageIndex >> count >> paletteGlobalName;
  for (i = 0; i < count; i++) {
    int indexInPage;
    in >> indexInPage;
    indicesInPage.insert(indexInPage);
  }
}

//-----------------------------------------------------------------------------

QByteArray TStyleSelection::toByteArray() const {
  QString globalName =
      QString::fromStdWString(m_palette->getGlobalName().c_str());
  return toByteArray(m_pageIndex, m_styleIndicesInPage, globalName);
}

//-----------------------------------------------------------------------------

const char *TStyleSelection::getMimeType() {
  return "application/vnd.toonz.style";
}