|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "styleselection.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "menubarcommandids.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tpalettehandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tscenehandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tapp.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonzutil.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "tcolorstyles.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tpixelutils.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "styledata.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "tundo.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonzqt/gutil.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tconvert.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "toonzqt/dvdialog.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/studiopalette.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include <qapplication></qapplication>
|
|
Toshihiro Shimizu |
890ddd |
#include <qclipboard></qclipboard>
|
|
Toshihiro Shimizu |
890ddd |
#include <qbytearray></qbytearray>
|
|
Toshihiro Shimizu |
890ddd |
#include <qbuffer></qbuffer>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
using namespace DVGui;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
namespace {
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void copyStylesWithoutUndo(TPaletteP palette, int pageIndex,
|
|
Shinya Kitaoka |
120a6e |
std::set<int> *styleIndicesInPage) {</int>
|
|
Shinya Kitaoka |
120a6e |
if (!palette || pageIndex < 0) return;
|
|
Shinya Kitaoka |
120a6e |
int n = styleIndicesInPage->size();
|
|
Shinya Kitaoka |
120a6e |
if (n == 0) return;
|
|
Shinya Kitaoka |
120a6e |
TPalette::Page *page = palette->getPage(pageIndex);
|
|
Shinya Kitaoka |
120a6e |
assert(page);
|
|
Shinya Kitaoka |
120a6e |
TPaletteHandle *cph = TApp::instance()->getCurrentPalette();
|
|
Shinya Kitaoka |
120a6e |
StyleData *data = new StyleData();
|
|
Shinya Kitaoka |
120a6e |
std::set<int>::iterator it;</int>
|
|
Shinya Kitaoka |
120a6e |
for (it = styleIndicesInPage->begin(); it != styleIndicesInPage->end();
|
|
Shinya Kitaoka |
120a6e |
++it) {
|
|
Shinya Kitaoka |
120a6e |
int j = *it;
|
|
Shinya Kitaoka |
120a6e |
int styleId = page->getStyleId(j);
|
|
Shinya Kitaoka |
120a6e |
TColorStyle *style = page->getStyle(j)->clone();
|
|
Shinya Kitaoka |
120a6e |
data->addStyle(styleId, style);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
QApplication::clipboard()->setMimeData(data);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool pasteStylesWithoutUndo(TPaletteP palette, int pageIndex,
|
|
Shinya Kitaoka |
120a6e |
std::set<int> *styleIndicesInPage) {</int>
|
|
Shinya Kitaoka |
120a6e |
// page = pagina corrente
|
|
Shinya Kitaoka |
120a6e |
TPalette::Page *page = palette->getPage(pageIndex);
|
|
Shinya Kitaoka |
120a6e |
assert(page);
|
|
Shinya Kitaoka |
120a6e |
// cerco il punto di inserimento (primo stile selezionato oppure dopo l'ultimo
|
|
Shinya Kitaoka |
120a6e |
// stile della pagina
|
|
Shinya Kitaoka |
120a6e |
// se nulla e' selezionato)
|
|
Shinya Kitaoka |
120a6e |
int indexInPage = page->getStyleCount();
|
|
Shinya Kitaoka |
120a6e |
if (!styleIndicesInPage->empty()) indexInPage = *styleIndicesInPage->begin();
|
|
Shinya Kitaoka |
120a6e |
// prendo i dati dalla clipboard
|
|
Shinya Kitaoka |
120a6e |
const StyleData *data =
|
|
Shinya Kitaoka |
120a6e |
dynamic_cast<const *="" styledata="">(QApplication::clipboard()->mimeData());</const>
|
|
Shinya Kitaoka |
120a6e |
if (!data) return false;
|
|
Shinya Kitaoka |
120a6e |
// cancello la selezione
|
|
Shinya Kitaoka |
120a6e |
styleIndicesInPage->clear();
|
|
Shinya Kitaoka |
120a6e |
// comincio a fare paste
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < data->getStyleCount(); i++) {
|
|
Shinya Kitaoka |
120a6e |
int styleId = data->getStyleIndex(i);
|
|
Shinya Kitaoka |
120a6e |
TColorStyle *style = data->getStyle(i)->clone();
|
|
Shinya Kitaoka |
120a6e |
if (palette->getStylePage(styleId) < 0) {
|
|
Shinya Kitaoka |
120a6e |
// styleId non e' utilizzato: uso quello
|
|
Shinya Kitaoka |
120a6e |
// (cut/paste utilizzato per spostare stili)
|
|
Shinya Kitaoka |
120a6e |
palette->setStyle(styleId, style);
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
// styleId e' gia' utilizzato. ne devo prendere un altro
|
|
Shinya Kitaoka |
120a6e |
styleId = palette->getFirstUnpagedStyle();
|
|
Shinya Kitaoka |
120a6e |
if (styleId >= 0)
|
|
Shinya Kitaoka |
120a6e |
palette->setStyle(styleId, style);
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
styleId = palette->addStyle(style);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
// inserisco lo stile nella pagina
|
|
Shinya Kitaoka |
120a6e |
page->insertStyle(indexInPage + i, styleId);
|
|
Shinya Kitaoka |
120a6e |
// e lo seleziono
|
|
Shinya Kitaoka |
120a6e |
styleIndicesInPage->insert(indexInPage + i);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
TApp::instance()->getCurrentPalette()->notifyColorStyleChanged();
|
|
Shinya Kitaoka |
120a6e |
return true;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void deleteStylesWithoutUndo(TPaletteP palette, int pageIndex,
|
|
Shinya Kitaoka |
120a6e |
std::set<int> *styleIndicesInPage) {</int>
|
|
Shinya Kitaoka |
120a6e |
int n = styleIndicesInPage->size();
|
|
Shinya Kitaoka |
120a6e |
if (n == 0) return;
|
|
Shinya Kitaoka |
120a6e |
TPalette::Page *page = palette->getPage(pageIndex);
|
|
Shinya Kitaoka |
120a6e |
assert(page);
|
|
Shinya Kitaoka |
120a6e |
TPaletteHandle *cph = TApp::instance()->getCurrentPalette();
|
|
Shinya Kitaoka |
120a6e |
int currentStyleIndexInPage = page->search(cph->getStyleIndex());
|
|
Shinya Kitaoka |
120a6e |
bool mustChangeCurrentStyle =
|
|
Shinya Kitaoka |
120a6e |
currentStyleIndexInPage >= 0 &&
|
|
Shinya Kitaoka |
120a6e |
styleIndicesInPage->count(currentStyleIndexInPage) > 0;
|
|
Shinya Kitaoka |
120a6e |
std::set<int>::reverse_iterator it;</int>
|
|
Shinya Kitaoka |
120a6e |
for (it = styleIndicesInPage->rbegin(); it != styleIndicesInPage->rend();
|
|
Shinya Kitaoka |
120a6e |
++it) {
|
|
Shinya Kitaoka |
120a6e |
int j = *it;
|
|
Shinya Kitaoka |
120a6e |
int styleId = page->getStyleId(j);
|
|
Shinya Kitaoka |
120a6e |
if (styleId < 2) {
|
|
Shinya Kitaoka |
120a6e |
error("Can't delete color #" + QString::number(styleId));
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
if (styleId == cph->getStyleIndex()) cph->setStyleIndex(1);
|
|
Shinya Kitaoka |
120a6e |
palette->setStyle(styleId, TPixel32::Red);
|
|
Shinya Kitaoka |
120a6e |
page->removeStyle(j);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
styleIndicesInPage->clear();
|
|
Shinya Kitaoka |
120a6e |
if (mustChangeCurrentStyle) {
|
|
Shinya Kitaoka |
120a6e |
// ho cancellato lo stile corrente
|
|
Shinya Kitaoka |
120a6e |
if (currentStyleIndexInPage < page->getStyleCount()) {
|
|
Shinya Kitaoka |
120a6e |
// posso fare in modo che lo stile selezionato sia nella stessa posizione
|
|
Shinya Kitaoka |
120a6e |
cph->setStyleIndex(page->getStyleId(currentStyleIndexInPage));
|
|
Shinya Kitaoka |
120a6e |
} else if (page->getStyleCount() > 0) {
|
|
Shinya Kitaoka |
120a6e |
// almeno faccio in modo che sia nella stessa pagina
|
|
Shinya Kitaoka |
120a6e |
int styleId = page->getStyleId(page->getStyleCount() - 1);
|
|
Shinya Kitaoka |
120a6e |
cph->setStyleIndex(styleId);
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
// seleziono lo stile #1 (che c'e' sempre). n.b. questo puo' comportare un
|
|
Shinya Kitaoka |
120a6e |
// cambio pagina
|
|
Shinya Kitaoka |
120a6e |
cph->setStyleIndex(1);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
cph->notifyColorStyleChanged();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void cutStylesWithoutUndo(TPaletteP palette, int pageIndex,
|
|
Shinya Kitaoka |
120a6e |
std::set<int> *styleIndicesInPage) {</int>
|
|
Shinya Kitaoka |
120a6e |
copyStylesWithoutUndo(palette, pageIndex, styleIndicesInPage);
|
|
Shinya Kitaoka |
120a6e |
deleteStylesWithoutUndo(palette, pageIndex, styleIndicesInPage);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// CopyStylesUndo
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
class CopyStylesUndo : public TUndo {
|
|
Shinya Kitaoka |
120a6e |
QMimeData *m_oldData;
|
|
Shinya Kitaoka |
120a6e |
QMimeData *m_newData;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
CopyStylesUndo(QMimeData *oldData, QMimeData *newData)
|
|
Shinya Kitaoka |
120a6e |
: m_oldData(oldData), m_newData(newData) {}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void undo() const {
|
|
Shinya Kitaoka |
120a6e |
QClipboard *clipboard = QApplication::clipboard();
|
|
Shinya Kitaoka |
120a6e |
clipboard->setMimeData(cloneData(m_oldData), QClipboard::Clipboard);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void redo() const {
|
|
Shinya Kitaoka |
120a6e |
QClipboard *clipboard = QApplication::clipboard();
|
|
Shinya Kitaoka |
120a6e |
clipboard->setMimeData(cloneData(m_newData), QClipboard::Clipboard);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
int getSize() const { return sizeof(*this); }
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// PasteStylesUndo
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
class PasteStylesUndo : public TUndo {
|
|
Shinya Kitaoka |
120a6e |
TStyleSelection *m_selection;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
PasteStylesUndo(TStyleSelection *selection) : m_selection(selection) {}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
~PasteStylesUndo() { delete m_selection; }
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void undo() const {
|
|
Shinya Kitaoka |
120a6e |
std::set<int> styleIndicesInPage = m_selection->getIndicesInPage();</int>
|
|
Shinya Kitaoka |
120a6e |
cutStylesWithoutUndo(m_selection->getPalette(), m_selection->getPageIndex(),
|
|
Shinya Kitaoka |
120a6e |
&styleIndicesInPage);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void redo() const {
|
|
Shinya Kitaoka |
120a6e |
std::set<int> styleIndicesInPage = m_selection->getIndicesInPage();</int>
|
|
Shinya Kitaoka |
120a6e |
pasteStylesWithoutUndo(m_selection->getPalette(),
|
|
Shinya Kitaoka |
120a6e |
m_selection->getPageIndex(), &styleIndicesInPage);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
int getSize() const { return sizeof(*this); }
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// DeleteStylesUndo
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
class DeleteStylesUndo : public TUndo {
|
|
Shinya Kitaoka |
120a6e |
TStyleSelection *m_selection;
|
|
Shinya Kitaoka |
120a6e |
QMimeData *m_data;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
DeleteStylesUndo(TStyleSelection *selection, QMimeData *data)
|
|
Shinya Kitaoka |
120a6e |
: m_selection(selection), m_data(data) {}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
~DeleteStylesUndo() { delete m_selection; }
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void undo() const {
|
|
Shinya Kitaoka |
120a6e |
QClipboard *clipboard = QApplication::clipboard();
|
|
Shinya Kitaoka |
120a6e |
QMimeData *oldData = cloneData(clipboard->mimeData());
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
clipboard->setMimeData(cloneData(m_data), QClipboard::Clipboard);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
std::set<int> styleIndicesInPage = m_selection->getIndicesInPage();</int>
|
|
Shinya Kitaoka |
120a6e |
pasteStylesWithoutUndo(m_selection->getPalette(),
|
|
Shinya Kitaoka |
120a6e |
m_selection->getPageIndex(), &styleIndicesInPage);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
clipboard->setMimeData(oldData, QClipboard::Clipboard);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void redo() const {
|
|
Shinya Kitaoka |
120a6e |
std::set<int> styleIndicesInPage = m_selection->getIndicesInPage();</int>
|
|
Shinya Kitaoka |
120a6e |
deleteStylesWithoutUndo(m_selection->getPalette(),
|
|
Shinya Kitaoka |
120a6e |
m_selection->getPageIndex(), &styleIndicesInPage);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
int getSize() const { return sizeof(*this); }
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// CutStylesUndo
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
class CutStylesUndo : public TUndo {
|
|
Shinya Kitaoka |
120a6e |
TStyleSelection *m_selection;
|
|
Shinya Kitaoka |
120a6e |
QMimeData *m_oldData;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
CutStylesUndo(TStyleSelection *selection, QMimeData *data)
|
|
Shinya Kitaoka |
120a6e |
: m_selection(selection), m_oldData(data) {}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
~CutStylesUndo() { delete m_selection; }
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void undo() const {
|
|
Shinya Kitaoka |
120a6e |
std::set<int> styleIndicesInPage = m_selection->getIndicesInPage();</int>
|
|
Shinya Kitaoka |
120a6e |
pasteStylesWithoutUndo(m_selection->getPalette(),
|
|
Shinya Kitaoka |
120a6e |
m_selection->getPageIndex(), &styleIndicesInPage);
|
|
Shinya Kitaoka |
120a6e |
QClipboard *clipboard = QApplication::clipboard();
|
|
Shinya Kitaoka |
120a6e |
clipboard->setMimeData(cloneData(m_oldData), QClipboard::Clipboard);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void redo() const {
|
|
Shinya Kitaoka |
120a6e |
std::set<int> styleIndicesInPage = m_selection->getIndicesInPage();</int>
|
|
Shinya Kitaoka |
120a6e |
cutStylesWithoutUndo(m_selection->getPalette(), m_selection->getPageIndex(),
|
|
Shinya Kitaoka |
120a6e |
&styleIndicesInPage);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
int getSize() const { return sizeof(*this); }
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
} // namespace
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// TStyleSelection
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TStyleSelection::TStyleSelection() : m_palette(0), m_pageIndex(-1) {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TStyleSelection::~TStyleSelection() {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TStyleSelection::enableCommands() {
|
|
Shinya Kitaoka |
120a6e |
enableCommand(this, MI_Cut, &TStyleSelection::cutStyles);
|
|
Shinya Kitaoka |
120a6e |
enableCommand(this, MI_Copy, &TStyleSelection::copyStyles);
|
|
Shinya Kitaoka |
120a6e |
enableCommand(this, MI_Paste, &TStyleSelection::pasteStyles);
|
|
Shinya Kitaoka |
120a6e |
enableCommand(this, MI_PasteValues, &TStyleSelection::pasteStylesValue);
|
|
Shinya Kitaoka |
120a6e |
enableCommand(this, MI_Clear, &TStyleSelection::deleteStyles);
|
|
Shinya Kitaoka |
120a6e |
enableCommand(this, MI_BlendColors, &TStyleSelection::blendStyles);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TStyleSelection::select(const TPaletteP &palette, int pageIndex) {
|
|
Shinya Kitaoka |
120a6e |
m_palette = palette;
|
|
Shinya Kitaoka |
120a6e |
m_pageIndex = pageIndex;
|
|
Shinya Kitaoka |
120a6e |
m_styleIndicesInPage.clear();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TStyleSelection::select(const TPaletteP &palette, int pageIndex,
|
|
Shinya Kitaoka |
120a6e |
int styleIndexInPage, bool on) {
|
|
Shinya Kitaoka |
120a6e |
if (on) {
|
|
Shinya Kitaoka |
120a6e |
if (m_palette.getPointer() != palette.getPointer() ||
|
|
Shinya Kitaoka |
120a6e |
pageIndex != m_pageIndex)
|
|
Shinya Kitaoka |
120a6e |
m_styleIndicesInPage.clear();
|
|
Shinya Kitaoka |
120a6e |
m_palette = palette;
|
|
Shinya Kitaoka |
120a6e |
m_pageIndex = pageIndex;
|
|
Shinya Kitaoka |
120a6e |
m_styleIndicesInPage.insert(styleIndexInPage);
|
|
Shinya Kitaoka |
120a6e |
} else if (m_palette.getPointer() == palette.getPointer() &&
|
|
Shinya Kitaoka |
120a6e |
pageIndex == m_pageIndex)
|
|
Shinya Kitaoka |
120a6e |
m_styleIndicesInPage.erase(styleIndexInPage);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
bool TStyleSelection::isSelected(const TPaletteP &palette, int pageIndex,
|
|
Shinya Kitaoka |
120a6e |
int id) const {
|
|
Shinya Kitaoka |
120a6e |
return m_palette.getPointer() == palette.getPointer() &&
|
|
Shinya Kitaoka |
120a6e |
m_pageIndex == pageIndex &&
|
|
Shinya Kitaoka |
120a6e |
m_styleIndicesInPage.find(id) != m_styleIndicesInPage.end();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
bool TStyleSelection::isPageSelected(const TPaletteP &palette,
|
|
Shinya Kitaoka |
120a6e |
int pageIndex) const {
|
|
Shinya Kitaoka |
120a6e |
return m_palette.getPointer() == palette.getPointer() &&
|
|
Shinya Kitaoka |
120a6e |
m_pageIndex == pageIndex;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
//-------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TStyleSelection::selectNone() {
|
|
Shinya Kitaoka |
120a6e |
m_palette = 0;
|
|
Shinya Kitaoka |
120a6e |
m_pageIndex = -1;
|
|
Shinya Kitaoka |
120a6e |
m_styleIndicesInPage.clear();
|
|
Shinya Kitaoka |
120a6e |
notifyView();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
//-------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
bool TStyleSelection::isEmpty() const {
|
|
Shinya Kitaoka |
120a6e |
return m_pageIndex < 0 && m_styleIndicesInPage.empty();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int TStyleSelection::getStyleCount() const {
|
|
Shinya Kitaoka |
120a6e |
return m_styleIndicesInPage.size();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TStyleSelection::cutStyles() {
|
|
Shinya Kitaoka |
120a6e |
if (isEmpty()) return;
|
|
Shinya Kitaoka |
120a6e |
QClipboard *clipboard = QApplication::clipboard();
|
|
Shinya Kitaoka |
120a6e |
QMimeData *oldData = cloneData(clipboard->mimeData());
|
|
Shinya Kitaoka |
120a6e |
TStyleSelection *selection = new TStyleSelection(this);
|
|
Shinya Kitaoka |
120a6e |
if (m_pageIndex == 0 &&
|
|
Shinya Kitaoka |
120a6e |
(isSelected(m_palette, 0, 0) || isSelected(m_palette, 0, 1))) {
|
|
Shinya Kitaoka |
120a6e |
MsgBox(CRITICAL, "Can't delete colors #0 and #1");
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
cutStylesWithoutUndo(m_palette, m_pageIndex, &m_styleIndicesInPage);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TUndoManager::manager()->add(new CutStylesUndo(selection, oldData));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TStyleSelection::copyStyles() {
|
|
Shinya Kitaoka |
120a6e |
if (isEmpty()) return;
|
|
Shinya Kitaoka |
120a6e |
QClipboard *clipboard = QApplication::clipboard();
|
|
Shinya Kitaoka |
120a6e |
QMimeData *oldData = cloneData(clipboard->mimeData());
|
|
Shinya Kitaoka |
120a6e |
copyStylesWithoutUndo(m_palette, m_pageIndex, &m_styleIndicesInPage);
|
|
Shinya Kitaoka |
120a6e |
QMimeData *newData = cloneData(clipboard->mimeData());
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TUndoManager::manager()->add(new CopyStylesUndo(oldData, newData));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TStyleSelection::pasteStyles() {
|
|
Shinya Kitaoka |
120a6e |
// se non c'e' palette o pagina corrente esco
|
|
Shinya Kitaoka |
120a6e |
if (!m_palette || m_pageIndex < 0) return;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (m_pageIndex == 0 && !m_styleIndicesInPage.empty() &&
|
|
Shinya Kitaoka |
120a6e |
*m_styleIndicesInPage.begin() < 2) {
|
|
Shinya Kitaoka |
120a6e |
MsgBox(CRITICAL, "Can't paste styles there");
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
pasteStylesWithoutUndo(m_palette, m_pageIndex, &m_styleIndicesInPage);
|
|
Shinya Kitaoka |
120a6e |
TUndoManager::manager()->add(new PasteStylesUndo(new TStyleSelection(this)));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TStyleSelection::deleteStyles() {
|
|
Shinya Kitaoka |
120a6e |
if (!m_palette || m_pageIndex < 0) return;
|
|
Shinya Kitaoka |
120a6e |
if (m_pageIndex == 0 &&
|
|
Shinya Kitaoka |
120a6e |
(isSelected(m_palette, 0, 0) || isSelected(m_palette, 0, 1))) {
|
|
Shinya Kitaoka |
120a6e |
MsgBox(CRITICAL, "Can't delete colors #0 and #1");
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
StyleData *data = new StyleData();
|
|
Shinya Kitaoka |
120a6e |
std::set<int>::iterator it;</int>
|
|
Shinya Kitaoka |
120a6e |
TPalette::Page *page = m_palette->getPage(m_pageIndex);
|
|
Shinya Kitaoka |
120a6e |
for (it = m_styleIndicesInPage.begin(); it != m_styleIndicesInPage.end();
|
|
Shinya Kitaoka |
120a6e |
++it) {
|
|
Shinya Kitaoka |
120a6e |
int j = *it;
|
|
Shinya Kitaoka |
120a6e |
int styleId = page->getStyleId(j);
|
|
Shinya Kitaoka |
120a6e |
if (styleId < 0) continue;
|
|
Shinya Kitaoka |
120a6e |
TColorStyle *style = page->getStyle(j)->clone();
|
|
Shinya Kitaoka |
120a6e |
data->addStyle(styleId, style);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
TStyleSelection *selection = new TStyleSelection(this);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
deleteStylesWithoutUndo(m_palette, m_pageIndex, &m_styleIndicesInPage);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TUndoManager::manager()->add(new DeleteStylesUndo(selection, data));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
namespace {
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// UndoPasteValues
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
class UndoPasteValues : public TUndo {
|
|
Shinya Kitaoka |
120a6e |
TPaletteP m_palette;
|
|
Shinya Kitaoka |
120a6e |
class Item {
|
|
Shinya Kitaoka |
120a6e |
public:
|
|
Shinya Kitaoka |
120a6e |
int m_index;
|
|
Shinya Kitaoka |
120a6e |
TColorStyle *m_oldStyle;
|
|
Shinya Kitaoka |
120a6e |
TColorStyle *m_newStyle;
|
|
Shinya Kitaoka |
120a6e |
Item(int index, const TColorStyle *oldStyle, const TColorStyle *newStyle)
|
|
Shinya Kitaoka |
120a6e |
: m_index(index)
|
|
Shinya Kitaoka |
120a6e |
, m_oldStyle(oldStyle->clone())
|
|
Shinya Kitaoka |
120a6e |
, m_newStyle(newStyle->clone()) {}
|
|
Shinya Kitaoka |
120a6e |
~Item() {
|
|
Shinya Kitaoka |
120a6e |
delete m_oldStyle;
|
|
Shinya Kitaoka |
120a6e |
delete m_newStyle;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
std::vector<item *=""> m_items;</item>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
UndoPasteValues(const TPaletteP &palette) : m_palette(palette) {}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
~UndoPasteValues() { clearPointerContainer(m_items); }
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void addItem(int index, const TColorStyle *oldStyle,
|
|
Shinya Kitaoka |
120a6e |
const TColorStyle *newStyle) {
|
|
Shinya Kitaoka |
120a6e |
m_items.push_back(new Item(index, oldStyle, newStyle));
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void pasteValue(int styleId, const TColorStyle *newStyle) const {
|
|
Shinya Kitaoka |
120a6e |
// preserva il vecchio nome
|
|
Shinya Kitaoka |
120a6e |
wstring str = m_palette->getStyle(styleId)->getName();
|
|
Shinya Kitaoka |
120a6e |
m_palette->setStyle(styleId, newStyle->clone());
|
|
Shinya Kitaoka |
120a6e |
m_palette->getStyle(styleId)->setName(str);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void undo() const {
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < (int)m_items.size(); i++)
|
|
Shinya Kitaoka |
120a6e |
pasteValue(m_items[i]->m_index, m_items[i]->m_oldStyle);
|
|
Shinya Kitaoka |
120a6e |
TApp::instance()->getCurrentPalette()->notifyColorStyleChanged();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void redo() const {
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < (int)m_items.size(); i++)
|
|
Shinya Kitaoka |
120a6e |
pasteValue(m_items[i]->m_index, m_items[i]->m_newStyle);
|
|
Shinya Kitaoka |
120a6e |
TApp::instance()->getCurrentPalette()->notifyColorStyleChanged();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
int getSize() const {
|
|
Shinya Kitaoka |
120a6e |
return sizeof(*this) + (int)m_items.size() * 100; // forfait
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
} // namespace
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TStyleSelection::pasteStylesValue() {
|
|
Shinya Kitaoka |
120a6e |
if (!m_palette || m_pageIndex < 0) return;
|
|
Shinya Kitaoka |
120a6e |
if (m_pageIndex == 0 && isSelected(m_palette, 0, 0)) {
|
|
Shinya Kitaoka |
120a6e |
MsgBox(CRITICAL, "Can't modify color #0");
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TPalette::Page *page = m_palette->getPage(m_pageIndex);
|
|
Shinya Kitaoka |
120a6e |
assert(page);
|
|
Shinya Kitaoka |
120a6e |
const StyleData *data =
|
|
Shinya Kitaoka |
120a6e |
dynamic_cast<const *="" styledata="">(QApplication::clipboard()->mimeData());</const>
|
|
Shinya Kitaoka |
120a6e |
if (!data) return;
|
|
Shinya Kitaoka |
120a6e |
int i = 0;
|
|
Shinya Kitaoka |
120a6e |
UndoPasteValues *undo = new UndoPasteValues(m_palette);
|
|
Shinya Kitaoka |
120a6e |
std::set<int>::iterator it;</int>
|
|
Shinya Kitaoka |
120a6e |
for (it = m_styleIndicesInPage.begin();
|
|
Shinya Kitaoka |
120a6e |
it != m_styleIndicesInPage.end() && i < data->getStyleCount();
|
|
Shinya Kitaoka |
120a6e |
++it, i++) {
|
|
Shinya Kitaoka |
120a6e |
int styleId = page->getStyleId(*it);
|
|
Shinya Kitaoka |
120a6e |
undo->addItem(styleId, m_palette->getStyle(styleId), data->getStyle(i));
|
|
Shinya Kitaoka |
120a6e |
m_palette->setStyle(styleId, data->getStyle(i)->clone());
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
TUndoManager::manager()->add(undo);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TPaletteHandle *ph = TApp::instance()->getCurrentPalette();
|
|
Shinya Kitaoka |
120a6e |
ph->notifyColorStyleChanged();
|
|
Shinya Kitaoka |
120a6e |
ph->updateColor();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
namespace {
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// UndoBlendColor
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
class UndoBlendColor : public TUndo {
|
|
Shinya Kitaoka |
120a6e |
TPaletteP m_palette;
|
|
Shinya Kitaoka |
120a6e |
int m_pageIndex;
|
|
Shinya Kitaoka |
120a6e |
std::vector<std::pair<int, *="" tcolorstyle="">> m_colorStyles;</std::pair<int,>
|
|
Shinya Kitaoka |
120a6e |
TPixel32 m_c0, m_c1;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
UndoBlendColor(TPaletteP palette, int pageIndex,
|
|
Shinya Kitaoka |
120a6e |
std::vector<std::pair<int, *="" tcolorstyle="">> colorStyles,</std::pair<int,>
|
|
Shinya Kitaoka |
120a6e |
const TPixel32 &c0, const TPixel32 &c1)
|
|
Shinya Kitaoka |
120a6e |
: m_palette(palette)
|
|
Shinya Kitaoka |
120a6e |
, m_pageIndex(pageIndex)
|
|
Shinya Kitaoka |
120a6e |
, m_colorStyles(colorStyles)
|
|
Shinya Kitaoka |
120a6e |
, m_c0(c0)
|
|
Shinya Kitaoka |
120a6e |
, m_c1(c1) {}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
~UndoBlendColor() {}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void undo() const {
|
|
Shinya Kitaoka |
120a6e |
if (!m_palette) return;
|
|
Shinya Kitaoka |
120a6e |
TPalette::Page *page = m_palette->getPage(m_pageIndex);
|
|
Shinya Kitaoka |
120a6e |
if (!page) return;
|
|
Shinya Kitaoka |
120a6e |
int count = 0;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
for (UINT i = 0; i < m_colorStyles.size(); i++) {
|
|
Shinya Kitaoka |
120a6e |
TColorStyle *st = page->getStyle(m_colorStyles[i].first);
|
|
Shinya Kitaoka |
120a6e |
QString gname = QString::fromStdWString(st->getGlobalName());
|
|
Shinya Kitaoka |
120a6e |
if (!gname.isEmpty() && gname[0] != L'-') continue;
|
|
Shinya Kitaoka |
120a6e |
m_palette->setStyle(page->getStyleId(m_colorStyles[i].first),
|
|
Shinya Kitaoka |
120a6e |
m_colorStyles[i].second->clone());
|
|
Shinya Kitaoka |
120a6e |
m_colorStyles[i].second->invalidateIcon();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
TApp::instance()->getCurrentPalette()->notifyColorStyleChanged();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void redo() const {
|
|
Shinya Kitaoka |
120a6e |
if (!m_palette) return;
|
|
Shinya Kitaoka |
120a6e |
TPalette::Page *page = m_palette->getPage(m_pageIndex);
|
|
Shinya Kitaoka |
120a6e |
if (!page) return;
|
|
Shinya Kitaoka |
120a6e |
for (UINT i = 0; i < m_colorStyles.size(); i++) {
|
|
Shinya Kitaoka |
120a6e |
TColorStyle *cs = page->getStyle(m_colorStyles[i].first);
|
|
Shinya Kitaoka |
120a6e |
QString gname = QString::fromStdWString(cs->getGlobalName());
|
|
Shinya Kitaoka |
120a6e |
if (!gname.isEmpty() && gname[0] != L'-') continue;
|
|
Shinya Kitaoka |
120a6e |
assert(cs);
|
|
Shinya Kitaoka |
120a6e |
if (!cs) continue;
|
|
Shinya Kitaoka |
120a6e |
cs->setMainColor(
|
|
Shinya Kitaoka |
120a6e |
blend(m_c0, m_c1, (double)i / (double)(m_colorStyles.size() - 1)));
|
|
Shinya Kitaoka |
120a6e |
cs->invalidateIcon();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
TApp::instance()->getCurrentPalette()->notifyColorStyleChanged();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
int getSize() const {
|
|
Shinya Kitaoka |
120a6e |
return sizeof(
|
|
Shinya Kitaoka |
120a6e |
*this); //+500*m_oldStyles.size(); //dipende da che stile ha salvato
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
} // namespace
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TStyleSelection::blendStyles() {
|
|
Shinya Kitaoka |
120a6e |
if (!m_palette || m_pageIndex < 0) return;
|
|
Shinya Kitaoka |
120a6e |
int n = m_styleIndicesInPage.size();
|
|
Shinya Kitaoka |
120a6e |
if (n < 2) return;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TPalette::Page *page = m_palette->getPage(m_pageIndex);
|
|
Shinya Kitaoka |
120a6e |
assert(page);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
std::vector<tcolorstyle *=""> styles;</tcolorstyle>
|
|
Shinya Kitaoka |
120a6e |
std::vector<std::pair<int, *="" tcolorstyle="">> oldStyles;</std::pair<int,>
|
|
Shinya Kitaoka |
120a6e |
for (std::set<int>::iterator it = m_styleIndicesInPage.begin();</int>
|
|
Shinya Kitaoka |
120a6e |
it != m_styleIndicesInPage.end(); ++it) {
|
|
Shinya Kitaoka |
120a6e |
TColorStyle *cs = page->getStyle(*it);
|
|
Shinya Kitaoka |
120a6e |
assert(cs);
|
|
Shinya Kitaoka |
120a6e |
styles.push_back(cs);
|
|
Shinya Kitaoka |
120a6e |
oldStyles.push_back(std::pair<int, *="" tcolorstyle="">(*it, cs->clone()));</int,>
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
assert(styles.size() >= 2);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TPixel32 c0 = styles.front()->getMainColor();
|
|
Shinya Kitaoka |
120a6e |
TPixel32 c1 = styles.back()->getMainColor();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
bool areAllStyleLincked = true;
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 1; i < n - 1; i++) {
|
|
Shinya Kitaoka |
120a6e |
QString gname = QString::fromStdWString(styles[i]->getGlobalName());
|
|
Shinya Kitaoka |
120a6e |
if (!gname.isEmpty() && gname[0] != L'-') continue;
|
|
Shinya Kitaoka |
120a6e |
areAllStyleLincked = false;
|
|
Shinya Kitaoka |
120a6e |
styles[i]->setMainColor(blend(c0, c1, (double)i / (double)(n - 1)));
|
|
Shinya Kitaoka |
120a6e |
styles[i]->invalidateIcon();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
if (areAllStyleLincked) return;
|
|
Shinya Kitaoka |
120a6e |
TApp::instance()->getCurrentPalette()->notifyColorStyleChanged();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
UndoBlendColor *undo =
|
|
Shinya Kitaoka |
120a6e |
new UndoBlendColor(m_palette, m_pageIndex, oldStyles, c0, c1);
|
|
Shinya Kitaoka |
120a6e |
TUndoManager::manager()->add(undo);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TStyleSelection::toggleLink() {
|
|
Shinya Kitaoka |
120a6e |
if (!m_palette || m_pageIndex < 0) return;
|
|
Shinya Kitaoka |
120a6e |
int n = m_styleIndicesInPage.size();
|
|
Shinya Kitaoka |
120a6e |
if (n <= 0) return;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
bool somethingHasBeenLinked = false;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
bool currentStyleIsInSelection = false;
|
|
Shinya Kitaoka |
120a6e |
TApp *app = TApp::instance();
|
|
Shinya Kitaoka |
120a6e |
TPaletteHandle *ph = app->getCurrentPalette();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TPalette::Page *page = m_palette->getPage(m_pageIndex);
|
|
Shinya Kitaoka |
120a6e |
assert(page);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
for (std::set<int>::iterator it = m_styleIndicesInPage.begin();</int>
|
|
Shinya Kitaoka |
120a6e |
it != m_styleIndicesInPage.end(); ++it) {
|
|
Shinya Kitaoka |
120a6e |
TColorStyle *cs = page->getStyle(*it);
|
|
Shinya Kitaoka |
120a6e |
assert(cs);
|
|
Shinya Kitaoka |
120a6e |
wstring name = cs->getGlobalName();
|
|
Shinya Kitaoka |
120a6e |
if (name != L"" && (name[0] == L'-' || name[0] == L'+')) {
|
|
Shinya Kitaoka |
120a6e |
name[0] = name[0] == L'-' ? L'+' : L'-';
|
|
Shinya Kitaoka |
120a6e |
cs->setGlobalName(name);
|
|
Shinya Kitaoka |
120a6e |
if (name[0] == L'+') somethingHasBeenLinked = true;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (*it == m_palette->getPage(m_pageIndex)->search(ph->getStyleIndex()))
|
|
Shinya Kitaoka |
120a6e |
currentStyleIsInSelection = true;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
if (somethingHasBeenLinked)
|
|
Shinya Kitaoka |
120a6e |
StudioPalette::instance()->updateLinkedColors(m_palette.getPointer());
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
ph->notifyPaletteChanged();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (currentStyleIsInSelection) ph->notifyColorStyleSwitched();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// DA FARE: e' giusto mettere la nofica del dirty flag a current scene
|
|
Shinya Kitaoka |
120a6e |
// o e' meglio farlo al livello corrente!?
|
|
Shinya Kitaoka |
120a6e |
app->getCurrentScene()->setDirtyFlag(true);
|
|
Shinya Kitaoka |
120a6e |
// extern void setPaletteDirtyFlag();
|
|
Shinya Kitaoka |
120a6e |
// setPaletteDirtyFlag();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
QByteArray TStyleSelection::toByteArray(int pageIndex,
|
|
Shinya Kitaoka |
120a6e |
const std::set<int> &indicesInPage,</int>
|
|
Shinya Kitaoka |
120a6e |
const QString paletteGlobalName) {
|
|
Shinya Kitaoka |
120a6e |
QByteArray data;
|
|
Shinya Kitaoka |
120a6e |
QBuffer dataBuffer(&data);
|
|
Shinya Kitaoka |
120a6e |
dataBuffer.open(QIODevice::WriteOnly);
|
|
Shinya Kitaoka |
120a6e |
QDataStream out(&dataBuffer);
|
|
Shinya Kitaoka |
120a6e |
out << (int)pageIndex << (int)indicesInPage.size() << paletteGlobalName;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
std::set<int>::const_iterator it;</int>
|
|
Shinya Kitaoka |
120a6e |
for (it = indicesInPage.begin(); it != indicesInPage.end(); ++it)
|
|
Shinya Kitaoka |
120a6e |
out << (int)*it;
|
|
Shinya Kitaoka |
120a6e |
return data;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TStyleSelection::fromByteArray(QByteArray &byteArray, int &pageIndex,
|
|
Shinya Kitaoka |
120a6e |
std::set<int> &indicesInPage,</int>
|
|
Shinya Kitaoka |
120a6e |
QString &paletteGlobalName) {
|
|
Shinya Kitaoka |
120a6e |
QBuffer dataBuffer(&byteArray);
|
|
Shinya Kitaoka |
120a6e |
dataBuffer.open(QIODevice::ReadOnly);
|
|
Shinya Kitaoka |
120a6e |
QDataStream in(&dataBuffer);
|
|
Shinya Kitaoka |
120a6e |
int i, count = 0;
|
|
Shinya Kitaoka |
120a6e |
in >> pageIndex >> count >> paletteGlobalName;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < count; i++) {
|
|
Shinya Kitaoka |
120a6e |
int indexInPage;
|
|
Shinya Kitaoka |
120a6e |
in >> indexInPage;
|
|
Shinya Kitaoka |
120a6e |
indicesInPage.insert(indexInPage);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
QByteArray TStyleSelection::toByteArray() const {
|
|
Shinya Kitaoka |
120a6e |
QString globalName =
|
|
Shinya Kitaoka |
120a6e |
QString::fromStdWString(m_palette->getGlobalName().c_str());
|
|
Shinya Kitaoka |
120a6e |
return toByteArray(m_pageIndex, m_styleIndicesInPage, globalName);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
const char *TStyleSelection::getMimeType() {
|
|
Shinya Kitaoka |
120a6e |
return "application/vnd.toonz.style";
|
|
Toshihiro Shimizu |
890ddd |
}
|