|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "vectorizerpopup.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// Tnz6 includes
|
|
Toshihiro Shimizu |
890ddd |
#include "tapp.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "fileselection.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "castselection.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "cellselection.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "overwritepopup.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "vectorizerswatch.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "filebrowserpopup.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "menubarcommandids.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// TnzQt includes
|
|
Toshihiro Shimizu |
890ddd |
#include "toonzqt/menubarcommand.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonzqt/intfield.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonzqt/colorfield.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonzqt/checkbox.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonzqt/gutil.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// TnzLib includes
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/namebuilder.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/txshsimplelevel.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/txshleveltypes.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/txsheet.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/txshcell.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/toonzscene.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tcenterlinevectorizer.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/dpiscale.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/txshchildlevel.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/levelset.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tscenehandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/txsheethandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/txshlevelhandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/sceneproperties.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/imagemanager.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/Naa2TlvConverter.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// TnzCore includes
|
|
Toshihiro Shimizu |
890ddd |
#include "tsystem.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tconvert.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tpalette.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "trasterimage.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "ttoonzimage.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tcolorstyles.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tstroke.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tpersistset.h"
|
|
Martin van Zijl |
9cb413 |
#include "columncommand.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// Qt includes
|
|
Toshihiro Shimizu |
890ddd |
#include <qframe></qframe>
|
|
Toshihiro Shimizu |
890ddd |
#include <qcombobox></qcombobox>
|
|
Toshihiro Shimizu |
890ddd |
#include <qcoreapplication></qcoreapplication>
|
|
Toshihiro Shimizu |
890ddd |
#include <qpushbutton></qpushbutton>
|
|
Toshihiro Shimizu |
890ddd |
#include <qhboxlayout></qhboxlayout>
|
|
Toshihiro Shimizu |
890ddd |
#include <qvboxlayout></qvboxlayout>
|
|
Toshihiro Shimizu |
890ddd |
#include <qstring></qstring>
|
|
Toshihiro Shimizu |
890ddd |
#include <qlabel></qlabel>
|
|
Toshihiro Shimizu |
890ddd |
#include <qsplitter></qsplitter>
|
|
Toshihiro Shimizu |
890ddd |
#include <qgridlayout></qgridlayout>
|
|
Toshihiro Shimizu |
890ddd |
#include <qscrollarea></qscrollarea>
|
|
Toshihiro Shimizu |
890ddd |
#include <qaction></qaction>
|
|
Toshihiro Shimizu |
890ddd |
#include <qmainwindow></qmainwindow>
|
|
Toshihiro Shimizu |
890ddd |
#include <qtoolbutton></qtoolbutton>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
using namespace DVGui;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//********************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// Local namespace classes
|
|
Toshihiro Shimizu |
890ddd |
//********************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
namespace {
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
struct Param {
|
|
Shinya Kitaoka |
120a6e |
QString m_name;
|
|
Shinya Kitaoka |
120a6e |
int m_bit;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
Param(const QString &name, int bit) : m_name(name), m_bit(bit) {}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
struct ParamGroup {
|
|
Shinya Kitaoka |
120a6e |
int m_startRow, m_separatorRow;
|
|
Shinya Kitaoka |
120a6e |
std::vector<param> m_params;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
ParamGroup(int startRow, int separatorRow)
|
|
Shinya Kitaoka |
120a6e |
: m_startRow(startRow), m_separatorRow(separatorRow) {}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
} // namespace
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//********************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// Local namespace stuff
|
|
Toshihiro Shimizu |
890ddd |
//********************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
namespace {
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
std::vector<paramgroup> l_centerlineParamGroups;</paramgroup>
|
|
Toshihiro Shimizu |
890ddd |
std::vector<paramgroup> l_outlineParamGroups;</paramgroup>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool l_quitLoop = false;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
VectorizerParameters *getCurrentVectorizerParameters() {
|
|
Shinya Kitaoka |
120a6e |
return TApp::instance()
|
|
Shinya Kitaoka |
120a6e |
->getCurrentScene()
|
|
Shinya Kitaoka |
120a6e |
->getScene()
|
|
Shinya Kitaoka |
120a6e |
->getProperties()
|
|
Shinya Kitaoka |
120a6e |
->getVectorizerParameters();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
bool getSelectedLevels(std::set<txshlevel *=""> &levels, int &r0, int &c0, int &r1,</txshlevel>
|
|
Shinya Kitaoka |
120a6e |
int &c1) {
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsheet = TApp::instance()->getCurrentXsheet()->getXsheet();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
CastSelection *castSelection =
|
|
Shinya Kitaoka |
120a6e |
dynamic_cast<castselection *="">(TSelection::getCurrent());</castselection>
|
|
Shinya Kitaoka |
120a6e |
TCellSelection *cellSelection =
|
|
Shinya Kitaoka |
120a6e |
dynamic_cast<tcellselection *="">(TSelection::getCurrent());</tcellselection>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (castSelection) {
|
|
Shinya Kitaoka |
120a6e |
std::vector<txshlevel *=""> selectedLevels;</txshlevel>
|
|
Shinya Kitaoka |
120a6e |
castSelection->getSelectedLevels(selectedLevels);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
for (int i = 0; i < (int)selectedLevels.size(); ++i)
|
|
Shinya Kitaoka |
120a6e |
levels.insert(selectedLevels[i]);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
return false;
|
|
Shinya Kitaoka |
120a6e |
} else if (cellSelection) {
|
|
Shinya Kitaoka |
120a6e |
cellSelection->getSelectedCells(r0, c0, r1, c1);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
for (int c = c0; c <= c1; ++c) {
|
|
Shinya Kitaoka |
120a6e |
for (int r = r0; r <= r1; ++r) {
|
|
Shinya Kitaoka |
120a6e |
TXshCell cell = xsheet->getCell(r, c);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (TXshLevel *level = cell.isEmpty() ? 0 : cell.getSimpleLevel())
|
|
Shinya Kitaoka |
120a6e |
levels.insert(level);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
return true;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
return false;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TXshLevel *getSelectedLevel() {
|
|
Shinya Kitaoka |
120a6e |
std::set<txshlevel *=""> levels;</txshlevel>
|
|
Shinya Kitaoka |
120a6e |
int r0, c0, r1, c1;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
getSelectedLevels(levels, r0, c0, r1, c1);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
return (levels.size() == 1) ? *levels.begin() : (TXshLevel *)0;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TFilePath getSelectedLevelPath() {
|
|
Shinya Kitaoka |
120a6e |
TXshLevel *level = getSelectedLevel();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
return level
|
|
Shinya Kitaoka |
120a6e |
? TApp::instance()->getCurrentScene()->getScene()->decodeFilePath(
|
|
Shinya Kitaoka |
120a6e |
level->getPath())
|
|
Shinya Kitaoka |
120a6e |
: TFilePath();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void getSelectedFids(std::vector<tframeid> &fids, TXshSimpleLevel *level,</tframeid>
|
|
Shinya Kitaoka |
120a6e |
int r0, int c0, int r1, int c1) {
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsheet = TApp::instance()->getCurrentXsheet()->getXsheet();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
std::set<tframeid> fidsSet;</tframeid>
|
|
Shinya Kitaoka |
120a6e |
for (int c = c0; c <= c1; ++c) {
|
|
Shinya Kitaoka |
120a6e |
for (int r = r0; r <= r1; ++r) {
|
|
Shinya Kitaoka |
120a6e |
TXshCell cell = xsheet->getCell(r, c);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TXshSimpleLevel *curLevel = cell.isEmpty() ? 0 : cell.getSimpleLevel();
|
|
Shinya Kitaoka |
120a6e |
if (curLevel != level) continue;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
fidsSet.insert(cell.getFrameId());
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
std::set<tframeid>::iterator fst, fsEnd = fidsSet.end();</tframeid>
|
|
Shinya Kitaoka |
120a6e |
for (fst = fidsSet.begin(); fst != fsEnd; ++fst) fids.push_back(*fst);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
shun_iwasawa |
a6d284 |
// Toonz Raster Level may have palette including MyPaint styles,
|
|
shun_iwasawa |
a6d284 |
// which cannot be rendered in vector levels.
|
|
shun_iwasawa |
a6d284 |
// In such case replace MyPaint styles by solid color styles.
|
|
shun_iwasawa |
a6d284 |
void replaceMyPaintBrushStyles(TPalette *palette) {
|
|
shun_iwasawa |
a6d284 |
for (int s = 0; s < palette->getStyleCount(); s++) {
|
|
shun_iwasawa |
a6d284 |
TColorStyle *style = palette->getStyle(s);
|
|
shun_iwasawa |
a6d284 |
if (style->getTagId() == 4001) // TMyPaintBrushStyle
|
|
shun_iwasawa |
a6d284 |
palette->setStyle(s, style->getMainColor());
|
|
shun_iwasawa |
a6d284 |
}
|
|
shun_iwasawa |
a6d284 |
}
|
|
shun_iwasawa |
a6d284 |
|
|
Shinya Kitaoka |
120a6e |
} // namespace
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//*****************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// Vectorizer implementation
|
|
Toshihiro Shimizu |
890ddd |
//*****************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
Vectorizer::Vectorizer()
|
|
Shinya Kitaoka |
120a6e |
: m_dialog(new OverwriteDialog)
|
|
Shinya Kitaoka |
120a6e |
, m_isCanceled(false)
|
|
Shinya Kitaoka |
120a6e |
, m_dialogShown(false) {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
Vectorizer::~Vectorizer() {
|
|
Shinya Kitaoka |
120a6e |
// DO NOT REMOVE - DESTRUCTS INCOMPLETE TYPES IN THE HEADER FILE
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TVectorImageP Vectorizer::doVectorize(TImageP img, TPalette *palette,
|
|
Shinya Kitaoka |
120a6e |
const VectorizerConfiguration &conf) {
|
|
Shinya Kitaoka |
120a6e |
TToonzImageP ti = img;
|
|
Shinya Kitaoka |
120a6e |
TRasterImageP ri = img;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (!ti && !ri) return TVectorImageP();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
VectorizerCore vCore;
|
|
Shinya Kitaoka |
120a6e |
connect(&vCore, SIGNAL(partialDone(int, int)), this,
|
|
Shinya Kitaoka |
120a6e |
SIGNAL(partialDone(int, int)));
|
|
Shinya Kitaoka |
120a6e |
connect(this, SIGNAL(transmitCancel()), &vCore, SLOT(onCancel()),
|
|
Shinya Kitaoka |
120a6e |
Qt::DirectConnection); // Direct connection *must* be
|
|
Shinya Kitaoka |
120a6e |
// established for child cancels
|
|
Shinya Kitaoka |
120a6e |
return vCore.vectorize(img, conf, palette);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void Vectorizer::setLevel(const TXshSimpleLevelP &level) {
|
|
Shinya Kitaoka |
120a6e |
m_level = level;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Creo il livello pli
|
|
Shinya Kitaoka |
120a6e |
TXshSimpleLevel *sl = m_level.getPointer();
|
|
Shinya Kitaoka |
120a6e |
if (!sl) return;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int rowCount = sl->getFrameCount();
|
|
Shinya Kitaoka |
120a6e |
if (rowCount <= 0 || sl->isEmpty()) return;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TXshLevel *xl;
|
|
Shinya Kitaoka |
120a6e |
ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Build the new level name
|
|
Shinya Kitaoka |
120a6e |
std::wstring levelName = sl->getName() + L"v";
|
|
Shinya Kitaoka |
120a6e |
{
|
|
Shinya Kitaoka |
2a7129 |
std::unique_ptr<namebuilder> nameBuilder(</namebuilder>
|
|
Shinya Kitaoka |
2a7129 |
NameBuilder::getBuilder(levelName));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
for (;;) {
|
|
Shinya Kitaoka |
120a6e |
levelName = nameBuilder->getNext();
|
|
Shinya Kitaoka |
120a6e |
if (scene->getLevelSet()->getLevel(levelName) == 0) break;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TFilePath dstPath = sl->getPath().withName(levelName).withType("pli");
|
|
Shinya Kitaoka |
120a6e |
dstPath = scene->decodeFilePath(dstPath);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
bool overWrite = false;
|
|
Shinya Kitaoka |
120a6e |
if (TSystem::doesExistFileOrLevel(dstPath)) {
|
|
Shinya Kitaoka |
120a6e |
m_dialogShown = true;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
std::wstring name = m_dialog->execute(scene, dstPath, true);
|
|
Shinya Kitaoka |
120a6e |
if (m_dialog->cancelPressed()) return;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
switch (m_dialog->getChoice()) {
|
|
Shinya Kitaoka |
120a6e |
case OverwriteDialog::KEEP_OLD:
|
|
shun-iwasawa |
21f942 |
xl = scene->getLevelSet()->getLevel(levelName);
|
|
Shinya Kitaoka |
120a6e |
if (!xl) xl = scene->loadLevel(dstPath);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_vLevel = xl->getSimpleLevel();
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
case OverwriteDialog::OVERWRITE:
|
|
Shinya Kitaoka |
120a6e |
overWrite = true;
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
default:
|
|
Shinya Kitaoka |
120a6e |
levelName = name;
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
xl = scene->createNewLevel(PLI_XSHLEVEL, levelName);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TXshSimpleLevel *vl = xl->getSimpleLevel();
|
|
Shinya Kitaoka |
120a6e |
assert(vl);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (overWrite) {
|
|
Shinya Kitaoka |
120a6e |
vl->setPath(scene->codeFilePath(dstPath));
|
|
Shinya Kitaoka |
120a6e |
vl->setName(levelName);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
shun_iwasawa |
a6d284 |
TPalette *palette = 0;
|
|
shun_iwasawa |
a6d284 |
if (sl->getType() == TZP_XSHLEVEL) {
|
|
shun_iwasawa |
a6d284 |
palette = sl->getPalette()->clone();
|
|
shun_iwasawa |
a6d284 |
replaceMyPaintBrushStyles(palette);
|
|
shun_iwasawa |
a6d284 |
} else
|
|
shun_iwasawa |
a6d284 |
palette = new TPalette;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
palette->setPaletteName(vl->getName());
|
|
Shinya Kitaoka |
120a6e |
vl->setPalette(palette);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_vLevel = vl;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int Vectorizer::doVectorize() {
|
|
Shinya Kitaoka |
120a6e |
struct {
|
|
Shinya Kitaoka |
120a6e |
Vectorizer *m_this;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
CenterlineConfiguration m_cConf;
|
|
Shinya Kitaoka |
120a6e |
NewOutlineConfiguration m_oConf;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void updateConfig(double weight) {
|
|
Shinya Kitaoka |
120a6e |
if (m_this->m_params.m_isOutline)
|
|
Shinya Kitaoka |
120a6e |
m_oConf = m_this->m_params.getOutlineConfiguration(weight);
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
m_cConf = m_this->m_params.getCenterlineConfiguration(weight);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
} locals = {this};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
VectorizerConfiguration &configuration =
|
|
Shinya Kitaoka |
120a6e |
m_params.m_isOutline
|
|
Shinya Kitaoka |
120a6e |
? static_cast<vectorizerconfiguration &="">(locals.m_oConf)</vectorizerconfiguration>
|
|
Shinya Kitaoka |
120a6e |
: static_cast<vectorizerconfiguration &="">(locals.m_cConf);</vectorizerconfiguration>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (!m_vLevel) return 0;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (m_dialog->getChoice() == OverwriteDialog::KEEP_OLD && m_dialogShown)
|
|
Shinya Kitaoka |
120a6e |
return m_fids.size();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TXshSimpleLevel *sl = m_level.getPointer();
|
|
Shinya Kitaoka |
120a6e |
if (!sl) return 0;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int rowCount = sl->getFrameCount();
|
|
Shinya Kitaoka |
120a6e |
if (rowCount <= 0 || sl->isEmpty()) return 0;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
double frameRange[2] = {static_cast<double>(m_fids.front().getNumber()) - 1,</double>
|
|
Shinya Kitaoka |
120a6e |
static_cast<double>(m_fids.back().getNumber()) - 1};</double>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int count = 0;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
std::vector<tframeid>::const_iterator ft, fEnd = m_fids.end();</tframeid>
|
|
Shinya Kitaoka |
120a6e |
for (ft = m_fids.begin(); ft != fEnd; ++ft) {
|
|
Shinya Kitaoka |
120a6e |
// Retrieve the image to be vectorized
|
|
Shinya Kitaoka |
120a6e |
TImageP img;
|
|
Shinya Kitaoka |
120a6e |
if (sl->getType() == OVL_XSHLEVEL || sl->getType() == TZP_XSHLEVEL ||
|
|
Shinya Kitaoka |
120a6e |
sl->getType() == TZI_XSHLEVEL)
|
|
Shinya Kitaoka |
120a6e |
img = sl->getFullsampledFrame(*ft, ImageManager::dontPutInCache);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (!img) continue;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Build image-toonz coordinate transformation
|
|
Shinya Kitaoka |
120a6e |
TAffine dpiAff = getDpiAffine(sl, *ft, true);
|
|
Shinya Kitaoka |
120a6e |
double factor = norm(dpiAff * TPointD(1, 0));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPointD center;
|
|
Shinya Kitaoka |
120a6e |
if (TToonzImageP ti = img)
|
|
Shinya Kitaoka |
120a6e |
center = ti->getRaster()->getCenterD();
|
|
Shinya Kitaoka |
120a6e |
else if (TRasterImageP ri = img)
|
|
Shinya Kitaoka |
120a6e |
center = ri->getRaster()->getCenterD();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Build vectorizer configuration
|
|
Shinya Kitaoka |
120a6e |
double weight = (ft->getNumber() - 1 - frameRange[0]) /
|
|
Shinya Kitaoka |
120a6e |
std::max(frameRange[1] - frameRange[0], 1.0);
|
|
Shinya Kitaoka |
120a6e |
weight = tcrop(weight, 0.0, 1.0);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
locals.updateConfig(weight); // TEMPORARY
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
configuration.m_affine = dpiAff * TTranslation(-center);
|
|
Shinya Kitaoka |
120a6e |
configuration.m_thickScale = factor;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Build vectorization label to be displayed
|
|
Shinya Kitaoka |
120a6e |
QString labelName = QString::fromStdWString(sl->getShortName());
|
|
Shinya Kitaoka |
120a6e |
labelName.push_back(' ');
|
|
Shinya Kitaoka |
120a6e |
labelName.append(QString::fromStdString(ft->expand(TFrameId::NO_PAD)));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
emit frameName(labelName);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Perform vectorization
|
|
Shinya Kitaoka |
120a6e |
if (TVectorImageP vi =
|
|
Shinya Kitaoka |
120a6e |
doVectorize(img, m_vLevel->getPalette(), configuration)) {
|
|
Shinya Kitaoka |
120a6e |
TFrameId fid = *ft;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (fid.getNumber() < 0) fid = TFrameId(1, ft->getLetter());
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_vLevel->setFrame(fid, vi);
|
|
Shinya Kitaoka |
120a6e |
vi->setPalette(m_vLevel->getPalette());
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
emit frameDone(++count);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Stop if canceled
|
|
Shinya Kitaoka |
120a6e |
if (m_isCanceled) break;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_dialogShown = false;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
return count;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void Vectorizer::run() { doVectorize(); }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
//*****************************************************************************
|
|
luz paz |
6454c4 |
// VectorizerPopup implementation
|
|
Shinya Kitaoka |
120a6e |
//*****************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
VectorizerPopup::VectorizerPopup(QWidget *parent, Qt::WindowFlags flags)
|
|
Shinya Kitaoka |
120a6e |
: Dialog(TApp::instance()->getMainWindow(), true, false, "Vectorizer")
|
|
Shinya Kitaoka |
120a6e |
, m_sceneHandle(TApp::instance()->getCurrentScene()) {
|
|
Shinya Kitaoka |
120a6e |
struct Locals {
|
|
Shinya Kitaoka |
120a6e |
int m_bit;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
Locals() : m_bit() {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
static void addParameterGroup(std::vector<paramgroup> ¶mGroups,</paramgroup>
|
|
Shinya Kitaoka |
120a6e |
int group, int startRow,
|
|
Shinya Kitaoka |
120a6e |
int separatorRow = -1) {
|
|
Shinya Kitaoka |
120a6e |
assert(group <= paramGroups.size());
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (group == paramGroups.size())
|
|
Shinya Kitaoka |
120a6e |
paramGroups.push_back(ParamGroup(startRow, separatorRow));
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void addParameter(std::vector<paramgroup> ¶mGroups,</paramgroup>
|
|
Shinya Kitaoka |
120a6e |
const QString ¶mName) {
|
|
Shinya Kitaoka |
120a6e |
paramGroups.back().m_params.push_back(Param(paramName, m_bit++));
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
} locals;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Su MAC i dialog modali non hanno bottoni di chiusura nella titleBar
|
|
Shinya Kitaoka |
120a6e |
setModal(false);
|
|
Shinya Kitaoka |
120a6e |
setWindowTitle(tr("Convert-to-Vector Settings"));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
setLabelWidth(125);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
setTopMargin(0);
|
|
Shinya Kitaoka |
120a6e |
setTopSpacing(0);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Build vertical layout
|
|
Shinya Kitaoka |
120a6e |
beginVLayout();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
QSplitter *splitter = new QSplitter(Qt::Vertical, this);
|
|
Shinya Kitaoka |
120a6e |
splitter->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding,
|
|
Shinya Kitaoka |
120a6e |
QSizePolicy::MinimumExpanding));
|
|
Shinya Kitaoka |
120a6e |
addWidget(splitter);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
QToolBar *leftToolBar = new QToolBar, *rightToolBar = new QToolBar;
|
|
shun_iwasawa |
4a5f42 |
leftToolBar->setObjectName("MediumPaddingToolBar");
|
|
shun_iwasawa |
4a5f42 |
rightToolBar->setObjectName("MediumPaddingToolBar");
|
|
shun_iwasawa |
4a5f42 |
leftToolBar->setIconSize(QSize(17, 17));
|
|
shun_iwasawa |
4a5f42 |
rightToolBar->setIconSize(QSize(17, 17));
|
|
Shinya Kitaoka |
120a6e |
{
|
|
Shinya Kitaoka |
120a6e |
QWidget *toolbarsContainer = new QWidget(this);
|
|
Shinya Kitaoka |
120a6e |
toolbarsContainer->setFixedHeight(22);
|
|
Shinya Kitaoka |
120a6e |
addWidget(toolbarsContainer);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
QHBoxLayout *toolbarsLayout = new QHBoxLayout(toolbarsContainer);
|
|
Shinya Kitaoka |
120a6e |
toolbarsContainer->setLayout(toolbarsLayout);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
toolbarsLayout->setMargin(0);
|
|
Shinya Kitaoka |
120a6e |
toolbarsLayout->setSpacing(0);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
QToolBar *spacingToolBar = new QToolBar(
|
|
Shinya Kitaoka |
120a6e |
toolbarsContainer); // The spacer object must be a toolbar.
|
|
Shinya Kitaoka |
120a6e |
spacingToolBar->setFixedHeight(
|
|
Shinya Kitaoka |
120a6e |
22); // It's related to qss choices... I know it's stinky
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
toolbarsLayout->addWidget(leftToolBar, 0, Qt::AlignLeft);
|
|
Shinya Kitaoka |
120a6e |
toolbarsLayout->addWidget(spacingToolBar, 1);
|
|
Shinya Kitaoka |
120a6e |
toolbarsLayout->addWidget(rightToolBar, 0, Qt::AlignRight);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
endVLayout();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Build parameters area
|
|
Shinya Kitaoka |
120a6e |
QScrollArea *paramsArea = new QScrollArea(splitter);
|
|
Shinya Kitaoka |
120a6e |
paramsArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
|
Shinya Kitaoka |
120a6e |
paramsArea->setWidgetResizable(true);
|
|
Shinya Kitaoka |
120a6e |
splitter->addWidget(paramsArea);
|
|
Shinya Kitaoka |
120a6e |
splitter->setStretchFactor(0, 1);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_paramsWidget = new QFrame(paramsArea);
|
|
Shinya Kitaoka |
120a6e |
paramsArea->setWidget(m_paramsWidget);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout = new QGridLayout;
|
|
Shinya Kitaoka |
120a6e |
m_paramsWidget->setLayout(m_paramsLayout);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int group = 0, row = 0;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
locals.addParameterGroup(::l_centerlineParamGroups, group, row);
|
|
Shinya Kitaoka |
120a6e |
locals.addParameterGroup(::l_outlineParamGroups, group++, row);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Vectorization mode
|
|
Shinya Kitaoka |
120a6e |
m_typeMenu = new QComboBox(this);
|
|
Shinya Kitaoka |
120a6e |
m_typeMenu->setFixedSize(245, WidgetHeight);
|
|
Shinya Kitaoka |
120a6e |
QStringList formats;
|
|
Shinya Kitaoka |
120a6e |
formats << tr("Centerline") << tr("Outline");
|
|
Shinya Kitaoka |
120a6e |
m_typeMenu->addItems(formats);
|
|
Shinya Kitaoka |
120a6e |
m_typeMenu->setMinimumHeight(WidgetHeight);
|
|
Shinya Kitaoka |
120a6e |
bool isOutline = m_sceneHandle->getScene()
|
|
Shinya Kitaoka |
120a6e |
->getProperties()
|
|
Shinya Kitaoka |
120a6e |
->getVectorizerParameters()
|
|
Shinya Kitaoka |
120a6e |
->m_isOutline;
|
|
Shinya Kitaoka |
120a6e |
m_typeMenu->setCurrentIndex(isOutline ? 1 : 0);
|
|
Shinya Kitaoka |
120a6e |
connect(m_typeMenu, SIGNAL(currentIndexChanged(int)), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onTypeChange(int)));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(new QLabel(tr("Mode")), row, 0, Qt::AlignRight);
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_typeMenu, row++, 1);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
locals.addParameter(l_centerlineParamGroups, tr("Mode"));
|
|
Shinya Kitaoka |
120a6e |
locals.addParameter(l_outlineParamGroups, tr("Mode"));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
//-------------------- Parameters area - Centerline ------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
locals.addParameterGroup(l_centerlineParamGroups, group++, row);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Threshold
|
|
Shinya Kitaoka |
120a6e |
m_cThresholdLabel = new QLabel(tr("Threshold"));
|
|
Shinya Kitaoka |
120a6e |
m_cThreshold = new IntField(this);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_cThresholdLabel, row, 0, Qt::AlignRight);
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_cThreshold, row++, 1);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
locals.addParameter(l_centerlineParamGroups, tr("Threshold"));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Accuracy
|
|
Shinya Kitaoka |
120a6e |
m_cAccuracyLabel = new QLabel(tr("Accuracy"));
|
|
Shinya Kitaoka |
120a6e |
m_cAccuracy = new IntField(this);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_cAccuracyLabel, row, 0, Qt::AlignRight);
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_cAccuracy, row++, 1);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
locals.addParameter(l_centerlineParamGroups, tr("Accuracy"));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Despeckling
|
|
Shinya Kitaoka |
120a6e |
m_cDespecklingLabel = new QLabel(tr("Despeckling"));
|
|
Shinya Kitaoka |
120a6e |
m_cDespeckling = new IntField(this);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_cDespecklingLabel, row, 0, Qt::AlignRight);
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_cDespeckling, row++, 1);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
locals.addParameter(l_centerlineParamGroups, tr("Despeckling"));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Max Thickness
|
|
Shinya Kitaoka |
120a6e |
m_cMaxThicknessLabel = new QLabel(tr("Max Thickness"));
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_cMaxThicknessLabel, row, 0, Qt::AlignRight);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_cMaxThickness = new IntField(this);
|
|
Shinya Kitaoka |
120a6e |
m_cMaxThickness->enableSlider(false);
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_cMaxThickness, row++, 1, Qt::AlignLeft);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
locals.addParameter(l_centerlineParamGroups, tr("Max Thickness"));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Thickness Calibration
|
|
Shinya Kitaoka |
120a6e |
m_cThicknessRatioLabel = new QLabel(tr("Thickness Calibration"));
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_cThicknessRatioLabel, row, 0, Qt::AlignRight);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
/*m_cThicknessRatio = new IntField(this);
|
|
Shinya Kitaoka |
120a6e |
paramsLayout->addWidget(m_cThicknessRatio, row++, 1);*/
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
QHBoxLayout *cThicknessRatioLayout = new QHBoxLayout;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
cThicknessRatioLayout->addSpacing(20);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_cThicknessRatioFirstLabel = new QLabel(tr("Start:"));
|
|
Shinya Kitaoka |
120a6e |
cThicknessRatioLayout->addWidget(m_cThicknessRatioFirstLabel);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_cThicknessRatioFirst = new MeasuredDoubleLineEdit(this);
|
|
Shinya Kitaoka |
120a6e |
m_cThicknessRatioFirst->setMeasure("percentage");
|
|
Shinya Kitaoka |
120a6e |
cThicknessRatioLayout->addWidget(m_cThicknessRatioFirst);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_cThicknessRatioLastLabel = new QLabel(tr("End:"));
|
|
Shinya Kitaoka |
120a6e |
cThicknessRatioLayout->addWidget(m_cThicknessRatioLastLabel);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_cThicknessRatioLast = new MeasuredDoubleLineEdit(this);
|
|
Shinya Kitaoka |
120a6e |
m_cThicknessRatioLast->setMeasure("percentage");
|
|
Shinya Kitaoka |
120a6e |
cThicknessRatioLayout->addWidget(m_cThicknessRatioLast);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
cThicknessRatioLayout->addStretch(1);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addLayout(cThicknessRatioLayout, row++, 1);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
locals.addParameter(l_centerlineParamGroups, tr("Thickness Calibration"));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Checkboxes
|
|
Shinya Kitaoka |
120a6e |
{
|
|
Shinya Kitaoka |
120a6e |
static const QString name = tr("Preserve Painted Areas");
|
|
Shinya Kitaoka |
120a6e |
locals.addParameter(l_centerlineParamGroups, name);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_cPaintFill = new CheckBox(name, this);
|
|
Shinya Kitaoka |
120a6e |
m_cPaintFill->setFixedHeight(WidgetHeight);
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_cPaintFill, row++, 1);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
{
|
|
shun-iwasawa |
21f942 |
static const QString name = tr("Align Boundary Strokes Direction");
|
|
shun-iwasawa |
21f942 |
locals.addParameter(l_centerlineParamGroups, name);
|
|
shun-iwasawa |
21f942 |
|
|
shun-iwasawa |
21f942 |
m_cAlignBoundaryStrokesDirection = new CheckBox(name, this);
|
|
shun-iwasawa |
21f942 |
m_cAlignBoundaryStrokesDirection->setFixedHeight(WidgetHeight);
|
|
shun-iwasawa |
21f942 |
m_cAlignBoundaryStrokesDirection->setToolTip(
|
|
shun-iwasawa |
21f942 |
tr("Align boundary strokes direction to be the same.\n(clockwise, i.e. "
|
|
shun-iwasawa |
21f942 |
"left to right as viewed from inside of the shape)"));
|
|
shun-iwasawa |
21f942 |
m_paramsLayout->addWidget(m_cAlignBoundaryStrokesDirection, row++, 1);
|
|
shun-iwasawa |
21f942 |
}
|
|
shun-iwasawa |
21f942 |
|
|
shun-iwasawa |
21f942 |
{
|
|
Shinya Kitaoka |
120a6e |
static const QString name = tr("Add Border");
|
|
Shinya Kitaoka |
120a6e |
locals.addParameter(l_centerlineParamGroups, name);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_cMakeFrame = new CheckBox(name, this);
|
|
Shinya Kitaoka |
120a6e |
m_cMakeFrame->setFixedHeight(WidgetHeight);
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_cMakeFrame, row++, 1);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
locals.addParameterGroup(l_centerlineParamGroups, group++, row + 1, row);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_cNaaSourceSeparator = new Separator(tr("Full color non-AA images"));
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_cNaaSourceSeparator, row++, 0, 1, 2);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
{
|
|
Shinya Kitaoka |
120a6e |
static const QString name = tr("Enhanced ink recognition");
|
|
Shinya Kitaoka |
120a6e |
locals.addParameter(l_centerlineParamGroups, name);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_cNaaSource = new CheckBox(name, this);
|
|
Shinya Kitaoka |
120a6e |
m_cNaaSource->setFixedHeight(WidgetHeight);
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_cNaaSource, row++, 1);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
//-------------------- Parameters area - Outline ------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
group = 1;
|
|
Shinya Kitaoka |
120a6e |
locals.addParameterGroup(l_outlineParamGroups, group++, row);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Accuracy
|
|
Shinya Kitaoka |
120a6e |
m_oAccuracyLabel = new QLabel(tr("Accuracy"));
|
|
Shinya Kitaoka |
120a6e |
m_oAccuracy = new IntField(this);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_oAccuracyLabel, row, 0, Qt::AlignRight);
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_oAccuracy, row++, 1);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
locals.addParameter(l_outlineParamGroups, tr("Accuracy"));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Despeckling
|
|
Shinya Kitaoka |
120a6e |
m_oDespecklingLabel = new QLabel(tr("Despeckling"));
|
|
Shinya Kitaoka |
120a6e |
m_oDespeckling = new IntField(this);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_oDespecklingLabel, row, 0, Qt::AlignRight);
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_oDespeckling, row++, 1);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
locals.addParameter(l_outlineParamGroups, tr("Despeckling"));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Paint Fill
|
|
Shinya Kitaoka |
120a6e |
{
|
|
Shinya Kitaoka |
120a6e |
static const QString name = tr("Preserve Painted Areas");
|
|
Shinya Kitaoka |
120a6e |
locals.addParameter(l_outlineParamGroups, name);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_oPaintFill = new CheckBox(name, this);
|
|
Shinya Kitaoka |
120a6e |
m_oPaintFill->setFixedHeight(WidgetHeight);
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_oPaintFill, row++, 1);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
shun-iwasawa |
21f942 |
{
|
|
shun-iwasawa |
21f942 |
static const QString name = tr("Align Boundary Strokes Direction");
|
|
shun-iwasawa |
21f942 |
locals.addParameter(l_outlineParamGroups, name);
|
|
shun-iwasawa |
21f942 |
|
|
shun-iwasawa |
21f942 |
m_oAlignBoundaryStrokesDirection = new CheckBox(name, this);
|
|
shun-iwasawa |
21f942 |
m_oAlignBoundaryStrokesDirection->setFixedHeight(WidgetHeight);
|
|
shun-iwasawa |
21f942 |
m_oAlignBoundaryStrokesDirection->setToolTip(
|
|
shun-iwasawa |
21f942 |
tr("Align boundary strokes direction to be the same.\n(clockwise, i.e. "
|
|
shun-iwasawa |
21f942 |
"left to right as viewed from inside of the shape)"));
|
|
shun-iwasawa |
21f942 |
m_paramsLayout->addWidget(m_oAlignBoundaryStrokesDirection, row++, 1);
|
|
shun-iwasawa |
21f942 |
}
|
|
Shinya Kitaoka |
120a6e |
locals.addParameterGroup(l_outlineParamGroups, group++, row + 1, row);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_oCornersSeparator = new Separator(tr("Corners"));
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_oCornersSeparator, row++, 0, 1, 2);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Adherence
|
|
Shinya Kitaoka |
120a6e |
m_oAdherenceLabel = new QLabel(tr("Adherence"));
|
|
Shinya Kitaoka |
120a6e |
m_oAdherence = new IntField(this);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_oAdherenceLabel, row, 0, Qt::AlignRight);
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_oAdherence, row++, 1);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
locals.addParameter(l_outlineParamGroups, tr("Adherence"));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Angle
|
|
Shinya Kitaoka |
120a6e |
m_oAngleLabel = new QLabel(tr("Angle"));
|
|
Shinya Kitaoka |
120a6e |
m_oAngle = new IntField(this);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_oAngleLabel, row, 0, Qt::AlignRight);
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_oAngle, row++, 1);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
locals.addParameter(l_outlineParamGroups, tr("Angle"));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Relative
|
|
Shinya Kitaoka |
120a6e |
m_oRelativeLabel = new QLabel(tr("Curve Radius"));
|
|
Shinya Kitaoka |
120a6e |
m_oRelative = new IntField(this);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_oRelativeLabel, row, 0, Qt::AlignRight);
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_oRelative, row++, 1);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
locals.addParameter(l_outlineParamGroups, tr("Curve Radius"));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
locals.addParameterGroup(l_outlineParamGroups, group++, row + 1, row);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_oFullColorSeparator = new Separator(tr("Raster Levels"));
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_oFullColorSeparator, row++, 0, 1, 2);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Max Colors
|
|
Shinya Kitaoka |
120a6e |
m_oMaxColorsLabel = new QLabel(tr("Max Colors"));
|
|
Shinya Kitaoka |
120a6e |
m_oMaxColors = new IntField(this);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_oMaxColorsLabel, row, 0, Qt::AlignRight);
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_oMaxColors, row++, 1);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
locals.addParameter(l_outlineParamGroups, tr("Max Colors"));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Transparent Color
|
|
Shinya Kitaoka |
120a6e |
m_oTransparentColorLabel = new QLabel(tr("Transparent Color"), this);
|
|
Shinya Kitaoka |
120a6e |
m_oTransparentColor = new ColorField(this, true, TPixel32::Transparent, 48);
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_oTransparentColorLabel, row, 0, Qt::AlignRight);
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_oTransparentColor, row++, 1);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
locals.addParameter(l_outlineParamGroups, tr("Transparent Color"));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
locals.addParameterGroup(l_outlineParamGroups, group++, row + 1, row);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_oTlvSeparator = new Separator(tr("TLV Levels"));
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_oTlvSeparator, row++, 0, 1, 2);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Tone Threshold
|
|
Shinya Kitaoka |
120a6e |
m_oToneThresholdLabel = new QLabel(tr("Tone Threshold"));
|
|
Shinya Kitaoka |
120a6e |
m_oToneThreshold = new IntField(this);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_oToneThresholdLabel, row, 0, Qt::AlignRight);
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->addWidget(m_oToneThreshold, row++, 1);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
locals.addParameter(l_outlineParamGroups, tr("Tone Threshold"));
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_paramsLayout->setRowStretch(row, 1);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//-------------------- Swatch area ------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_swatchArea = new VectorizerSwatchArea(this);
|
|
Shinya Kitaoka |
120a6e |
splitter->addWidget(m_swatchArea);
|
|
luz paz |
6454c4 |
m_swatchArea->setEnabled(false); // Initially not enabled
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
connect(this, SIGNAL(valuesChanged()), m_swatchArea,
|
|
Shinya Kitaoka |
120a6e |
SLOT(invalidateContents()));
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//---------------------- Toolbar --------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Kite |
521c84 |
QAction *swatchAct =
|
|
Kite |
521c84 |
new QAction(createQIcon("preview"), tr("Toggle Swatch Preview"), this);
|
|
Shinya Kitaoka |
120a6e |
swatchAct->setCheckable(true);
|
|
Shinya Kitaoka |
120a6e |
leftToolBar->addAction(swatchAct);
|
|
Shinya Kitaoka |
120a6e |
|
|
Kite |
99f71d |
QAction *centerlineAct = new QAction(createQIcon("centerline"),
|
|
shun_iwasawa |
4a5f42 |
tr("Toggle Centerlines Check"), this);
|
|
Shinya Kitaoka |
120a6e |
centerlineAct->setCheckable(true);
|
|
Shinya Kitaoka |
120a6e |
leftToolBar->addAction(centerlineAct);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
QToolButton *visibilityButton = new QToolButton(this);
|
|
Kite |
99f71d |
visibilityButton->setIcon(createQIcon("menu"));
|
|
Kite |
99f71d |
visibilityButton->setText(tr("Options"));
|
|
Shinya Kitaoka |
120a6e |
visibilityButton->setPopupMode(QToolButton::InstantPopup);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
QMenu *visibilityMenu = new QMenu(visibilityButton);
|
|
Shinya Kitaoka |
120a6e |
visibilityButton->setMenu(visibilityMenu);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
rightToolBar->addWidget(visibilityButton);
|
|
Shinya Kitaoka |
120a6e |
rightToolBar->addSeparator();
|
|
Shinya Kitaoka |
120a6e |
|
|
shun_iwasawa |
4a5f42 |
QAction *saveAct =
|
|
Kite |
521c84 |
new QAction(createQIcon("save"), tr("Save Settings"), this);
|
|
Shinya Kitaoka |
120a6e |
rightToolBar->addAction(saveAct);
|
|
shun_iwasawa |
4a5f42 |
QAction *loadAct =
|
|
Kite |
521c84 |
new QAction(createQIcon("load"), tr("Load Settings"), this);
|
|
Shinya Kitaoka |
120a6e |
rightToolBar->addAction(loadAct);
|
|
Shinya Kitaoka |
120a6e |
rightToolBar->addSeparator();
|
|
Shinya Kitaoka |
120a6e |
|
|
Kite |
521c84 |
QAction *resetAct =
|
|
Kite |
99f71d |
new QAction(createQIcon("settings_reset"), tr("Reset Settings"), this);
|
|
Shinya Kitaoka |
120a6e |
rightToolBar->addAction(resetAct);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
connect(swatchAct, SIGNAL(triggered(bool)), m_swatchArea,
|
|
Shinya Kitaoka |
120a6e |
SLOT(enablePreview(bool)));
|
|
Shinya Kitaoka |
120a6e |
connect(centerlineAct, SIGNAL(triggered(bool)), m_swatchArea,
|
|
Shinya Kitaoka |
120a6e |
SLOT(enableDrawCenterlines(bool)));
|
|
Shinya Kitaoka |
120a6e |
connect(visibilityMenu, SIGNAL(aboutToShow()), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(populateVisibilityMenu()));
|
|
Shinya Kitaoka |
120a6e |
connect(saveAct, SIGNAL(triggered()), this, SLOT(saveParameters()));
|
|
Shinya Kitaoka |
120a6e |
connect(loadAct, SIGNAL(triggered()), this, SLOT(loadParameters()));
|
|
Shinya Kitaoka |
120a6e |
connect(resetAct, SIGNAL(triggered()), this, SLOT(resetParameters()));
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------- Convert Button ----------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Convert Button
|
|
Shinya Kitaoka |
120a6e |
m_okBtn = new QPushButton(QString(tr("Convert")), this);
|
|
Shinya Kitaoka |
120a6e |
connect(m_okBtn, SIGNAL(clicked()), this, SLOT(onOk()));
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
addButtonBarWidget(m_okBtn);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// All detailed signals convey to the unique valuesChanged() signal. That
|
|
Shinya Kitaoka |
120a6e |
// makes it easier
|
|
Shinya Kitaoka |
120a6e |
// to disconnect update notifications whenever we loadConfiguration(..).
|
|
Shinya Kitaoka |
120a6e |
connect(this, SIGNAL(valuesChanged()), this, SLOT(updateSceneSettings()));
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Connect value changes to update the global
|
|
Shinya Kitaoka |
120a6e |
// VectorizerPopUpSettingsContainer.
|
|
Shinya Kitaoka |
120a6e |
// connect(m_typeMenu,SIGNAL(currentIndexChanged(const QString
|
|
Shinya Kitaoka |
120a6e |
// &)),this,SLOT(updateSceneSettings()));
|
|
Shinya Kitaoka |
120a6e |
connect(m_cThreshold, SIGNAL(valueChanged(bool)), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onValueEdited(bool)));
|
|
Shinya Kitaoka |
120a6e |
connect(m_cAccuracy, SIGNAL(valueChanged(bool)), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onValueEdited(bool)));
|
|
Shinya Kitaoka |
120a6e |
connect(m_cDespeckling, SIGNAL(valueChanged(bool)), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onValueEdited(bool)));
|
|
Shinya Kitaoka |
120a6e |
connect(m_cMaxThickness, SIGNAL(valueChanged(bool)), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onValueEdited(bool)));
|
|
Shinya Kitaoka |
120a6e |
// connect(m_cThicknessRatio,SIGNAL(valueChanged(bool)),this,SLOT(onValueEdited(bool)));
|
|
Shinya Kitaoka |
120a6e |
connect(m_cThicknessRatioFirst, SIGNAL(valueChanged()), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onValueEdited()));
|
|
Shinya Kitaoka |
120a6e |
connect(m_cThicknessRatioLast, SIGNAL(valueChanged()), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onValueEdited()));
|
|
Shinya Kitaoka |
120a6e |
connect(m_cMakeFrame, SIGNAL(stateChanged(int)), this, SLOT(onValueEdited()));
|
|
Shinya Kitaoka |
120a6e |
connect(m_cPaintFill, SIGNAL(stateChanged(int)), this, SLOT(onValueEdited()));
|
|
shun-iwasawa |
21f942 |
connect(m_cAlignBoundaryStrokesDirection, SIGNAL(stateChanged(int)), this,
|
|
shun-iwasawa |
21f942 |
SLOT(onValueEdited()));
|
|
Shinya Kitaoka |
120a6e |
connect(m_cNaaSource, SIGNAL(stateChanged(int)), this, SLOT(onValueEdited()));
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
connect(m_oAccuracy, SIGNAL(valueChanged(bool)), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onValueEdited(bool)));
|
|
Shinya Kitaoka |
120a6e |
connect(m_oDespeckling, SIGNAL(valueChanged(bool)), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onValueEdited(bool)));
|
|
Shinya Kitaoka |
120a6e |
connect(m_oPaintFill, SIGNAL(stateChanged(int)), this, SLOT(onValueEdited()));
|
|
shun-iwasawa |
21f942 |
connect(m_oAlignBoundaryStrokesDirection, SIGNAL(stateChanged(int)), this,
|
|
shun-iwasawa |
21f942 |
SLOT(onValueEdited()));
|
|
Shinya Kitaoka |
120a6e |
connect(m_oAdherence, SIGNAL(valueChanged(bool)), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onValueEdited(bool)));
|
|
Shinya Kitaoka |
120a6e |
connect(m_oAngle, SIGNAL(valueChanged(bool)), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onValueEdited(bool)));
|
|
Shinya Kitaoka |
120a6e |
connect(m_oRelative, SIGNAL(valueChanged(bool)), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onValueEdited(bool)));
|
|
Shinya Kitaoka |
120a6e |
connect(m_oDespeckling, SIGNAL(valueChanged(bool)), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onValueEdited(bool)));
|
|
Shinya Kitaoka |
120a6e |
connect(m_oMaxColors, SIGNAL(valueChanged(bool)), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onValueEdited(bool)));
|
|
Shinya Kitaoka |
120a6e |
connect(m_oTransparentColor, SIGNAL(colorChanged(const TPixel32 &, bool)),
|
|
Shinya Kitaoka |
120a6e |
this, SLOT(onValueEdited(const TPixel32 &, bool)));
|
|
Shinya Kitaoka |
120a6e |
connect(m_oToneThreshold, SIGNAL(valueChanged(bool)), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onValueEdited(bool)));
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
refreshPopup();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Non e' corretto: manca la possibilita' di aggiornare la selezione del
|
|
Shinya Kitaoka |
120a6e |
// livello corrente
|
|
Shinya Kitaoka |
120a6e |
// connect(TApp::instance()->getCurrentLevel(), SIGNAL(xshLevelChanged()),
|
|
Shinya Kitaoka |
120a6e |
// this, SLOT(updateValues()));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
VectorizerParameters *VectorizerPopup::getParameters() const {
|
|
Shinya Kitaoka |
120a6e |
assert(m_sceneHandle);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
ToonzScene *scene = m_sceneHandle->getScene();
|
|
Shinya Kitaoka |
120a6e |
assert(scene);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TSceneProperties *sceneProp = scene->getProperties();
|
|
Shinya Kitaoka |
120a6e |
assert(sceneProp);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
assert(sceneProp->getVectorizerParameters());
|
|
Shinya Kitaoka |
120a6e |
return sceneProp->getVectorizerParameters();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void VectorizerPopup::onValueEdited(bool isDrag) {
|
|
Shinya Kitaoka |
120a6e |
if (!isDrag) emit valuesChanged();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
bool VectorizerPopup::isLevelToConvert(TXshSimpleLevel *sl) {
|
|
Shinya Kitaoka |
120a6e |
return (sl->getPath().getType() != "pli");
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
bool VectorizerPopup::apply() {
|
|
Shinya Kitaoka |
120a6e |
std::set<txshlevel *=""> levels;</txshlevel>
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
ToonzScene *scene = m_sceneHandle->getScene();
|
|
Shinya Kitaoka |
120a6e |
if (!scene) {
|
|
Shinya Kitaoka |
120a6e |
assert(scene);
|
|
Shinya Kitaoka |
120a6e |
return false;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TSceneProperties *sceneProp = scene->getProperties();
|
|
Shinya Kitaoka |
120a6e |
if (!sceneProp) return false;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
VectorizerParameters *vectorizerParameters =
|
|
Shinya Kitaoka |
120a6e |
sceneProp->getVectorizerParameters();
|
|
Shinya Kitaoka |
120a6e |
if (!vectorizerParameters) return false;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
int r0 = 0;
|
|
Shinya Kitaoka |
120a6e |
int c0 = 0;
|
|
Shinya Kitaoka |
120a6e |
int r1 = 0;
|
|
Shinya Kitaoka |
120a6e |
int c1 = 0;
|
|
Shinya Kitaoka |
120a6e |
bool isCellSelection = getSelectedLevels(levels, r0, c0, r1, c1);
|
|
shun-iwasawa |
21f942 |
if (c0 < 0) c0 = 0;
|
|
Shinya Kitaoka |
120a6e |
if (levels.empty()) {
|
|
Shinya Kitaoka |
120a6e |
error(tr("The current selection is invalid."));
|
|
Shinya Kitaoka |
120a6e |
return false;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Initialize Progress bar
|
|
Shinya Kitaoka |
120a6e |
m_progressDialog = new DVGui::ProgressDialog("", "Cancel", 0, 1);
|
|
Shinya Kitaoka |
120a6e |
m_progressDialog->setWindowFlags(
|
|
Shinya Kitaoka |
120a6e |
Qt::Dialog | Qt::WindowTitleHint); // Don't show ? and X buttons
|
|
Shinya Kitaoka |
120a6e |
m_progressDialog->setWindowTitle(QString("Convert To Vector..."));
|
|
Shinya Kitaoka |
120a6e |
m_progressDialog->setAttribute(Qt::WA_DeleteOnClose);
|
|
Shinya Kitaoka |
120a6e |
m_progressDialog->setWindowModality(
|
|
Shinya Kitaoka |
120a6e |
Qt::WindowModal); // No user interaction is allowed during vectorization
|
|
Shinya Kitaoka |
120a6e |
m_progressDialog->setFixedSize(200, 100);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Initialize vectorizer
|
|
Shinya Kitaoka |
120a6e |
m_vectorizer = new Vectorizer;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_vectorizer->setParameters(*vectorizerParameters);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
connect(m_vectorizer, SIGNAL(frameName(QString)), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onFrameName(QString)), Qt::QueuedConnection);
|
|
Shinya Kitaoka |
120a6e |
connect(m_vectorizer, SIGNAL(frameDone(int)), this, SLOT(onFrameDone(int)),
|
|
Shinya Kitaoka |
120a6e |
Qt::QueuedConnection);
|
|
Shinya Kitaoka |
120a6e |
connect(m_vectorizer, SIGNAL(partialDone(int, int)), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onPartialDone(int, int)), Qt::QueuedConnection);
|
|
Shinya Kitaoka |
120a6e |
// We DON'T want the progress bar to be hidden at cancel press - since its
|
|
Shinya Kitaoka |
120a6e |
// modal
|
|
Shinya Kitaoka |
120a6e |
// behavior prevents the user to interfere with a possibly still active
|
|
Shinya Kitaoka |
120a6e |
// vectorization.
|
|
Shinya Kitaoka |
120a6e |
disconnect(m_progressDialog, SIGNAL(canceled()), m_progressDialog,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onCancel()));
|
|
Shinya Kitaoka |
120a6e |
// We first inform the vectorizer of a cancel press;
|
|
Shinya Kitaoka |
120a6e |
bool ret = connect(m_progressDialog, SIGNAL(canceled()), m_vectorizer,
|
|
Shinya Kitaoka |
120a6e |
SLOT(cancel()));
|
|
Shinya Kitaoka |
120a6e |
// which eventually transmits the command to vectorization core, allowing
|
|
Shinya Kitaoka |
120a6e |
// full-time cancels
|
|
Shinya Kitaoka |
120a6e |
ret = ret && connect(m_progressDialog, SIGNAL(canceled()), m_vectorizer,
|
|
Shinya Kitaoka |
120a6e |
SIGNAL(transmitCancel()));
|
|
Shinya Kitaoka |
120a6e |
// Only after the vectorizer has terminated its process - or got cancelled, we
|
|
Shinya Kitaoka |
120a6e |
// are allowed
|
|
Shinya Kitaoka |
120a6e |
// to proceed here.
|
|
Shinya Kitaoka |
120a6e |
ret = ret && connect(m_vectorizer, SIGNAL(finished()), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onFinished()), Qt::QueuedConnection);
|
|
Shinya Kitaoka |
120a6e |
assert(ret);
|
|
Shinya Kitaoka |
120a6e |
|
|
Martin van Zijl |
9cb413 |
std::set<int> newColumnIndices;</int>
|
|
Shinya Kitaoka |
120a6e |
int newIndexColumn = c1 + 1;
|
|
Shinya Kitaoka |
120a6e |
for (auto const level : levels) {
|
|
Shinya Kitaoka |
120a6e |
TXshSimpleLevel *sl = dynamic_cast<txshsimplelevel *="">(level);</txshsimplelevel>
|
|
Shinya Kitaoka |
120a6e |
if (!sl || !sl->getSimpleLevel() || !isLevelToConvert(sl)) {
|
|
Shinya Kitaoka |
120a6e |
QString levelName = tr(::to_string(sl->getName()).c_str());
|
|
Shinya Kitaoka |
120a6e |
QString errorMsg =
|
|
Shinya Kitaoka |
120a6e |
tr("Cannot convert to vector the current selection.") + levelName;
|
|
Shinya Kitaoka |
120a6e |
error(errorMsg);
|
|
Shinya Kitaoka |
120a6e |
continue;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
std::vector<tframeid> fids;</tframeid>
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (isCellSelection)
|
|
Shinya Kitaoka |
120a6e |
getSelectedFids(fids, sl, r0, c0, r1, c1);
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
sl->getFids(fids);
|
|
Shinya Kitaoka |
120a6e |
assert(fids.size() > 0);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
close();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Re-initialize progress Bar
|
|
Shinya Kitaoka |
120a6e |
m_progressDialog->setMaximum(fids.size() * 100);
|
|
Shinya Kitaoka |
120a6e |
m_progressDialog->setValue(0);
|
|
Shinya Kitaoka |
120a6e |
m_currFrame = 0;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Re-initialize vectorizer
|
|
Shinya Kitaoka |
120a6e |
m_vectorizer->setLevel(sl);
|
|
Shinya Kitaoka |
120a6e |
m_vectorizer->setFids(fids);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Start vectorizing
|
|
Shinya Kitaoka |
120a6e |
m_vectorizer->start();
|
|
Shinya Kitaoka |
120a6e |
m_progressDialog->show();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Wait the vectorizer...
|
|
Shinya Kitaoka |
120a6e |
while (!l_quitLoop)
|
|
Shinya Kitaoka |
120a6e |
QCoreApplication::processEvents(QEventLoop::AllEvents |
|
|
Shinya Kitaoka |
120a6e |
QEventLoop::WaitForMoreEvents);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
l_quitLoop = false;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Assign output X-sheet cells
|
|
Shinya Kitaoka |
120a6e |
TXshSimpleLevel *vl = m_vectorizer->getVectorizedLevel();
|
|
Shinya Kitaoka |
120a6e |
if (isCellSelection && vl) {
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsheet = TApp::instance()->getCurrentXsheet()->getXsheet();
|
|
Shinya Kitaoka |
120a6e |
xsheet->insertColumn(newIndexColumn);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
int r, c;
|
|
Shinya Kitaoka |
120a6e |
for (c = c0; c <= c1; c++) {
|
|
Shinya Kitaoka |
120a6e |
for (r = r0; r <= r1; r++) {
|
|
Shinya Kitaoka |
120a6e |
TXshCell cell = xsheet->getCell(r, c);
|
|
Shinya Kitaoka |
120a6e |
TXshSimpleLevel *level =
|
|
Shinya Kitaoka |
120a6e |
(!cell.isEmpty()) ? cell.getSimpleLevel() : 0;
|
|
Shinya Kitaoka |
120a6e |
if (level != sl) continue;
|
|
Shinya Kitaoka |
120a6e |
TFrameId curFid = cell.getFrameId();
|
|
Shinya Kitaoka |
120a6e |
std::vector<tframeid> newFids;</tframeid>
|
|
Shinya Kitaoka |
120a6e |
vl->getFids(newFids);
|
|
Shinya Kitaoka |
120a6e |
for (auto const &fid : newFids) {
|
|
Shinya Kitaoka |
120a6e |
if (fid.getNumber() ==
|
|
Shinya Kitaoka |
120a6e |
curFid.getNumber() || // Hanno stesso numero di frame
|
|
Shinya Kitaoka |
120a6e |
(fid.getNumber() == 1 &&
|
|
Shinya Kitaoka |
120a6e |
curFid.getNumber() ==
|
|
Shinya Kitaoka |
120a6e |
-2)) // La vecchia cella non ha numero di frame
|
|
Shinya Kitaoka |
120a6e |
xsheet->setCell(r, newIndexColumn, TXshCell(vl, fid));
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Martin van Zijl |
9cb413 |
newColumnIndices.insert(newIndexColumn);
|
|
Shinya Kitaoka |
120a6e |
newIndexColumn += 1;
|
|
Shinya Kitaoka |
120a6e |
} else if (vl) {
|
|
Shinya Kitaoka |
120a6e |
std::vector<tframeid> gomi;</tframeid>
|
|
Martin van Zijl |
9cb413 |
newColumnIndices.insert(scene->getXsheet()->getFirstFreeColumnIndex());
|
|
Shinya Kitaoka |
120a6e |
scene->getXsheet()->exposeLevel(
|
|
Shinya Kitaoka |
120a6e |
0, scene->getXsheet()->getFirstFreeColumnIndex(), vl, gomi);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (m_vectorizer->isCanceled()) break;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Martin van Zijl |
9cb413 |
// Add undo object
|
|
Martin van Zijl |
9cb413 |
if (!m_vectorizer->isCanceled())
|
|
Martin van Zijl |
9cb413 |
ColumnCmd::addConvertToVectorUndo(newColumnIndices);
|
|
Martin van Zijl |
9cb413 |
|
|
Shinya Kitaoka |
120a6e |
m_progressDialog->close();
|
|
Shinya Kitaoka |
120a6e |
delete m_vectorizer;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TApp::instance()->getCurrentScene()->notifyCastChange();
|
|
Shinya Kitaoka |
120a6e |
TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
return true;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void VectorizerPopup::onFinished() { l_quitLoop = true; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void VectorizerPopup::onFrameName(QString frameName) {
|
|
Shinya Kitaoka |
120a6e |
QString label = tr("Conversion in progress: ") + frameName;
|
|
Shinya Kitaoka |
120a6e |
m_progressDialog->setLabelText(label);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void VectorizerPopup::onFrameDone(int frameCount) {
|
|
Shinya Kitaoka |
120a6e |
m_progressDialog->setValue(
|
|
Shinya Kitaoka |
120a6e |
frameCount * 100); // 100 multiplier stands for partial progresses
|
|
Shinya Kitaoka |
120a6e |
m_currFrame = frameCount;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void VectorizerPopup::onPartialDone(int partial, int total) {
|
|
Shinya Kitaoka |
120a6e |
int value = (m_currFrame + partial / (double)total) * 100.0;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// NOTA: Puo' essere che la seguente non sia vera - dipende dall'ordine di
|
|
Shinya Kitaoka |
120a6e |
// esecuzione dei segnali
|
|
Shinya Kitaoka |
120a6e |
// onFrameDone e onPartialDone - se i primi si fanno in massa prima... Puo'
|
|
Shinya Kitaoka |
120a6e |
// generare uno stack overflow...
|
|
Shinya Kitaoka |
120a6e |
// NOTA: Non va ancora bene. Cosi' si attenua largamente il problema, ma a
|
|
Shinya Kitaoka |
120a6e |
// volte puo' ancora succedere.
|
|
Shinya Kitaoka |
120a6e |
if (value > m_progressDialog->value() + 5 &&
|
|
Shinya Kitaoka |
120a6e |
value < m_progressDialog->maximum()) {
|
|
Shinya Kitaoka |
120a6e |
// qDebug("Partial %d of %d; Value %d of %d", partial, total, value,
|
|
Shinya Kitaoka |
120a6e |
// m_progressDialog->maximum());
|
|
Shinya Kitaoka |
120a6e |
m_progressDialog->setValue(value);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
/*else
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Shinya Kitaoka |
120a6e |
if(value != m_progressDialog->value())
|
|
Shinya Kitaoka |
120a6e |
qDebug("ERRORE: VALORE PB= %d; Valore: %d",m_progressDialog->value(),value);
|
|
Shinya Kitaoka |
120a6e |
}*/
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void VectorizerPopup::onOk() { apply(); }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//! Copies the pop-up settings into scene settings.
|
|
Shinya Kitaoka |
120a6e |
void VectorizerPopup::updateSceneSettings() {
|
|
Shinya Kitaoka |
120a6e |
VectorizerParameters *vParams = getParameters();
|
|
Shinya Kitaoka |
120a6e |
assert(vParams);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
bool outline = (m_typeMenu->currentIndex() == 1);
|
|
Shinya Kitaoka |
120a6e |
vParams->m_isOutline = outline;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (outline) {
|
|
Shinya Kitaoka |
120a6e |
vParams->m_oDespeckling = m_oDespeckling->getValue();
|
|
Shinya Kitaoka |
120a6e |
vParams->m_oAccuracy = m_oAccuracy->getValue();
|
|
Shinya Kitaoka |
120a6e |
vParams->m_oAdherence = m_oAdherence->getValue();
|
|
Shinya Kitaoka |
120a6e |
vParams->m_oAngle = m_oAngle->getValue();
|
|
Shinya Kitaoka |
120a6e |
vParams->m_oRelative = m_oRelative->getValue();
|
|
Shinya Kitaoka |
120a6e |
vParams->m_oMaxColors = m_oMaxColors->getValue();
|
|
Shinya Kitaoka |
120a6e |
vParams->m_oToneThreshold = m_oToneThreshold->getValue();
|
|
Shinya Kitaoka |
120a6e |
vParams->m_oTransparentColor = m_oTransparentColor->getColor();
|
|
Shinya Kitaoka |
120a6e |
vParams->m_oPaintFill = m_oPaintFill->isChecked();
|
|
shun-iwasawa |
21f942 |
vParams->m_oAlignBoundaryStrokesDirection =
|
|
shun-iwasawa |
21f942 |
m_oAlignBoundaryStrokesDirection->isChecked();
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
vParams->m_cThreshold = m_cThreshold->getValue();
|
|
Shinya Kitaoka |
120a6e |
vParams->m_cAccuracy = m_cAccuracy->getValue();
|
|
Shinya Kitaoka |
120a6e |
vParams->m_cDespeckling = m_cDespeckling->getValue();
|
|
Shinya Kitaoka |
120a6e |
vParams->m_cMaxThickness = m_cMaxThickness->getValue();
|
|
Shinya Kitaoka |
120a6e |
vParams->m_cThicknessRatioFirst =
|
|
Shinya Kitaoka |
120a6e |
m_cThicknessRatioFirst->getValue() * 100.0;
|
|
Shinya Kitaoka |
120a6e |
vParams->m_cThicknessRatioLast = m_cThicknessRatioLast->getValue() * 100.0;
|
|
Shinya Kitaoka |
120a6e |
vParams->m_cMakeFrame = m_cMakeFrame->isChecked();
|
|
Shinya Kitaoka |
120a6e |
vParams->m_cPaintFill = m_cPaintFill->isChecked();
|
|
shun-iwasawa |
21f942 |
vParams->m_cAlignBoundaryStrokesDirection =
|
|
shun-iwasawa |
21f942 |
m_cAlignBoundaryStrokesDirection->isChecked();
|
|
shun-iwasawa |
21f942 |
vParams->m_cNaaSource = m_cNaaSource->isChecked();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void VectorizerPopup::refreshPopup() { setType(getParameters()->m_isOutline); }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void VectorizerPopup::updateVisibility() {
|
|
Shinya Kitaoka |
120a6e |
struct Locals {
|
|
Shinya Kitaoka |
120a6e |
QGridLayout *const m_paramsLayout;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void setVisible(QLayoutItem *item, bool visible) {
|
|
Shinya Kitaoka |
120a6e |
if (item) {
|
|
Shinya Kitaoka |
120a6e |
if (QWidget *w = item->widget())
|
|
Shinya Kitaoka |
120a6e |
w->setVisible(visible);
|
|
Shinya Kitaoka |
120a6e |
else if (QLayout *l = item->layout()) {
|
|
Shinya Kitaoka |
120a6e |
int i, iCount = l->count();
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i != iCount; ++i) setVisible(l->itemAt(i), visible);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void setVisible(int row, bool visible) {
|
|
Shinya Kitaoka |
120a6e |
int c, cCount = m_paramsLayout->columnCount();
|
|
Shinya Kitaoka |
120a6e |
for (c = 0; c != cCount; ++c)
|
|
Shinya Kitaoka |
120a6e |
setVisible(m_paramsLayout->itemAtPosition(row, c), visible);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void setVisible(const std::vector<paramgroup> ¶mGroups,</paramgroup>
|
|
Shinya Kitaoka |
120a6e |
int visibilityBits) {
|
|
Shinya Kitaoka |
120a6e |
// Iterate parameter groups
|
|
Shinya Kitaoka |
120a6e |
std::vector<paramgroup>::const_iterator pgt, pgEnd = paramGroups.end();</paramgroup>
|
|
Shinya Kitaoka |
120a6e |
for (pgt = paramGroups.begin(); pgt != pgEnd; ++pgt) {
|
|
Shinya Kitaoka |
120a6e |
bool groupVisible = false;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Iterate parameters
|
|
Shinya Kitaoka |
120a6e |
int r, rCount = int(pgt->m_params.size());
|
|
Shinya Kitaoka |
120a6e |
for (r = 0; r != rCount; ++r) {
|
|
Shinya Kitaoka |
120a6e |
bool visible = (visibilityBits >> pgt->m_params[r].m_bit) & 1;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
setVisible(pgt->m_startRow + r, visible);
|
|
Shinya Kitaoka |
120a6e |
groupVisible = visible | groupVisible;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Finally, set group header's visibility
|
|
Shinya Kitaoka |
120a6e |
if (pgt->m_separatorRow >= 0)
|
|
Shinya Kitaoka |
120a6e |
setVisible(pgt->m_separatorRow, groupVisible);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
} locals = {m_paramsLayout};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
VectorizerParameters *vParams = getParameters();
|
|
Shinya Kitaoka |
120a6e |
assert(vParams);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
locals.setVisible(
|
|
Shinya Kitaoka |
120a6e |
vParams->m_isOutline ? l_outlineParamGroups : l_centerlineParamGroups,
|
|
Shinya Kitaoka |
120a6e |
vParams->m_visibilityBits);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void VectorizerPopup::onTypeChange(int indexType) {
|
|
Shinya Kitaoka |
120a6e |
ToonzScene *scene = m_sceneHandle->getScene();
|
|
Shinya Kitaoka |
120a6e |
if (!scene) return;
|
|
Shinya Kitaoka |
120a6e |
TSceneProperties *sceneProp = scene->getProperties();
|
|
Shinya Kitaoka |
120a6e |
if (!sceneProp) return;
|
|
Shinya Kitaoka |
120a6e |
VectorizerParameters *vectorizerParameters =
|
|
Shinya Kitaoka |
120a6e |
sceneProp->getVectorizerParameters();
|
|
Shinya Kitaoka |
120a6e |
if (!vectorizerParameters) return;
|
|
Shinya Kitaoka |
120a6e |
bool isOutline = vectorizerParameters->m_isOutline;
|
|
Shinya Kitaoka |
120a6e |
bool isNewTypeOutline = (indexType == 0) ? false : true;
|
|
Shinya Kitaoka |
120a6e |
if (isNewTypeOutline == isOutline) return;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
vectorizerParameters->m_isOutline = isNewTypeOutline;
|
|
Shinya Kitaoka |
120a6e |
setType(isNewTypeOutline);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_swatchArea->invalidateContents();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void VectorizerPopup::setType(bool outline) {
|
|
Shinya Kitaoka |
120a6e |
disconnect(m_typeMenu, SIGNAL(currentIndexChanged(int)), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onTypeChange(int)));
|
|
Shinya Kitaoka |
120a6e |
|
|
luz paz |
6454c4 |
// Setting child visibility a lot invokes several layout updates - causing
|
|
Shinya Kitaoka |
120a6e |
// extensive flickering
|
|
Shinya Kitaoka |
120a6e |
m_paramsWidget->layout()->setEnabled(false);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
bool centerline = !outline;
|
|
Shinya Kitaoka |
120a6e |
m_typeMenu->setCurrentIndex((int)outline);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_cThresholdLabel->setVisible(centerline);
|
|
Shinya Kitaoka |
120a6e |
m_cThreshold->setVisible(centerline);
|
|
Shinya Kitaoka |
120a6e |
m_cAccuracyLabel->setVisible(centerline);
|
|
Shinya Kitaoka |
120a6e |
m_cAccuracy->setVisible(centerline);
|
|
Shinya Kitaoka |
120a6e |
m_cDespecklingLabel->setVisible(centerline);
|
|
Shinya Kitaoka |
120a6e |
m_cDespeckling->setVisible(centerline);
|
|
Shinya Kitaoka |
120a6e |
m_cMaxThicknessLabel->setVisible(centerline);
|
|
Shinya Kitaoka |
120a6e |
m_cMaxThickness->setVisible(centerline);
|
|
Shinya Kitaoka |
120a6e |
// m_cThicknessRatio->setVisible(centerline);
|
|
Shinya Kitaoka |
120a6e |
m_cThicknessRatioLabel->setVisible(centerline);
|
|
Shinya Kitaoka |
120a6e |
m_cThicknessRatioFirstLabel->setVisible(centerline);
|
|
Shinya Kitaoka |
120a6e |
m_cThicknessRatioFirst->setVisible(centerline);
|
|
Shinya Kitaoka |
120a6e |
m_cThicknessRatioLastLabel->setVisible(centerline);
|
|
Shinya Kitaoka |
120a6e |
m_cThicknessRatioLast->setVisible(centerline);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_cPaintFill->setVisible(centerline);
|
|
shun-iwasawa |
21f942 |
m_cAlignBoundaryStrokesDirection->setVisible(centerline);
|
|
Shinya Kitaoka |
120a6e |
m_cMakeFrame->setVisible(centerline);
|
|
Shinya Kitaoka |
120a6e |
m_cNaaSourceSeparator->setVisible(centerline);
|
|
Shinya Kitaoka |
120a6e |
m_cNaaSource->setVisible(centerline);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_oAccuracyLabel->setVisible(outline);
|
|
Shinya Kitaoka |
120a6e |
m_oAccuracy->setVisible(outline);
|
|
Shinya Kitaoka |
120a6e |
m_oDespecklingLabel->setVisible(outline);
|
|
Shinya Kitaoka |
120a6e |
m_oDespeckling->setVisible(outline);
|
|
Shinya Kitaoka |
120a6e |
m_oPaintFill->setVisible(outline);
|
|
shun-iwasawa |
21f942 |
m_oAlignBoundaryStrokesDirection->setVisible(outline);
|
|
Shinya Kitaoka |
120a6e |
m_oCornersSeparator->setVisible(outline);
|
|
Shinya Kitaoka |
120a6e |
m_oAngleLabel->setVisible(outline);
|
|
Shinya Kitaoka |
120a6e |
m_oAngle->setVisible(outline);
|
|
Shinya Kitaoka |
120a6e |
m_oAdherenceLabel->setVisible(outline);
|
|
Shinya Kitaoka |
120a6e |
m_oAdherence->setVisible(outline);
|
|
Shinya Kitaoka |
120a6e |
m_oRelativeLabel->setVisible(outline);
|
|
Shinya Kitaoka |
120a6e |
m_oRelative->setVisible(outline);
|
|
Shinya Kitaoka |
120a6e |
m_oFullColorSeparator->setVisible(outline);
|
|
Shinya Kitaoka |
120a6e |
m_oMaxColorsLabel->setVisible(outline);
|
|
Shinya Kitaoka |
120a6e |
m_oMaxColors->setVisible(outline);
|
|
Shinya Kitaoka |
120a6e |
m_oTransparentColorLabel->setVisible(outline);
|
|
Shinya Kitaoka |
120a6e |
m_oTransparentColor->setVisible(outline);
|
|
Shinya Kitaoka |
120a6e |
m_oTlvSeparator->setVisible(outline);
|
|
Shinya Kitaoka |
120a6e |
m_oToneThresholdLabel->setVisible(outline);
|
|
Shinya Kitaoka |
120a6e |
m_oToneThreshold->setVisible(outline);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_paramsWidget->layout()->setEnabled(true);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
loadConfiguration(outline);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
connect(m_typeMenu, SIGNAL(currentIndexChanged(int)), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onTypeChange(int)));
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
updateVisibility();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// This is essentially the inverse of the previous one.
|
|
Shinya Kitaoka |
120a6e |
void VectorizerPopup::loadConfiguration(bool isOutline) {
|
|
Shinya Kitaoka |
120a6e |
disconnect(SIGNAL(valuesChanged())); // Avoid notifications for value changes
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
ToonzScene *scene = m_sceneHandle->getScene();
|
|
Shinya Kitaoka |
120a6e |
assert(scene);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TSceneProperties *sceneProp = scene->getProperties();
|
|
Shinya Kitaoka |
120a6e |
assert(sceneProp);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
VectorizerParameters *vParams = sceneProp->getVectorizerParameters();
|
|
Shinya Kitaoka |
120a6e |
assert(vParams);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
loadRanges(isOutline);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (isOutline) {
|
|
Shinya Kitaoka |
120a6e |
m_oDespeckling->setValue(vParams->m_oDespeckling);
|
|
Shinya Kitaoka |
120a6e |
m_oAdherence->setValue(vParams->m_oAdherence);
|
|
Shinya Kitaoka |
120a6e |
m_oAngle->setValue(vParams->m_oAngle);
|
|
Shinya Kitaoka |
120a6e |
m_oRelative->setValue(vParams->m_oRelative);
|
|
Shinya Kitaoka |
120a6e |
m_oAccuracy->setValue(vParams->m_oAccuracy);
|
|
Shinya Kitaoka |
120a6e |
m_oPaintFill->setChecked(vParams->m_oPaintFill);
|
|
shun-iwasawa |
21f942 |
m_oAlignBoundaryStrokesDirection->setChecked(
|
|
shun-iwasawa |
21f942 |
vParams->m_oAlignBoundaryStrokesDirection);
|
|
Shinya Kitaoka |
120a6e |
m_oMaxColors->setValue(vParams->m_oMaxColors);
|
|
Shinya Kitaoka |
120a6e |
m_oTransparentColor->setColor(vParams->m_oTransparentColor);
|
|
Shinya Kitaoka |
120a6e |
m_oToneThreshold->setValue(vParams->m_oToneThreshold);
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
m_cThreshold->setValue(vParams->m_cThreshold);
|
|
Shinya Kitaoka |
120a6e |
m_cDespeckling->setValue(vParams->m_cDespeckling);
|
|
Shinya Kitaoka |
120a6e |
m_cPaintFill->setChecked(vParams->m_cPaintFill);
|
|
shun-iwasawa |
21f942 |
m_cAlignBoundaryStrokesDirection->setChecked(
|
|
shun-iwasawa |
21f942 |
vParams->m_cAlignBoundaryStrokesDirection);
|
|
Shinya Kitaoka |
120a6e |
m_cMakeFrame->setChecked(vParams->m_cMakeFrame);
|
|
Shinya Kitaoka |
120a6e |
m_cNaaSource->setChecked(vParams->m_cNaaSource);
|
|
Shinya Kitaoka |
120a6e |
m_cMaxThickness->setValue(vParams->m_cMaxThickness);
|
|
Shinya Kitaoka |
120a6e |
m_cAccuracy->setValue(vParams->m_cAccuracy);
|
|
Shinya Kitaoka |
120a6e |
// m_cThicknessRatio->setValue(vParams->m_cThicknessRatio);
|
|
Shinya Kitaoka |
120a6e |
m_cThicknessRatioFirst->setValue(vParams->m_cThicknessRatioFirst / 100.0);
|
|
Shinya Kitaoka |
120a6e |
m_cThicknessRatioLast->setValue(vParams->m_cThicknessRatioLast / 100.0);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Reconnect changes update
|
|
Shinya Kitaoka |
120a6e |
connect(this, SIGNAL(valuesChanged()), this, SLOT(updateSceneSettings()));
|
|
Shinya Kitaoka |
120a6e |
connect(this, SIGNAL(valuesChanged()), m_swatchArea,
|
|
Shinya Kitaoka |
120a6e |
SLOT(invalidateContents()));
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_swatchArea->updateContents();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void VectorizerPopup::loadRanges(int outline) {
|
|
Shinya Kitaoka |
120a6e |
if (outline) {
|
|
Shinya Kitaoka |
120a6e |
m_oAccuracy->setRange(0, 10);
|
|
Shinya Kitaoka |
120a6e |
m_oDespeckling->setRange(0, 10);
|
|
Shinya Kitaoka |
120a6e |
m_oAdherence->setRange(0, 100);
|
|
Shinya Kitaoka |
120a6e |
m_oAngle->setRange(0, 180);
|
|
Shinya Kitaoka |
120a6e |
m_oRelative->setRange(0, 100);
|
|
Shinya Kitaoka |
120a6e |
m_oMaxColors->setRange(1, 256);
|
|
Shinya Kitaoka |
120a6e |
m_oToneThreshold->setRange(0, 255);
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
m_cThreshold->setRange(1, 10);
|
|
Shinya Kitaoka |
120a6e |
m_cAccuracy->setRange(1, 10);
|
|
Shinya Kitaoka |
120a6e |
m_cDespeckling->setRange(1, 10);
|
|
Shinya Kitaoka |
120a6e |
m_cMaxThickness->setRange(0, (std::numeric_limits<int>::max)());</int>
|
|
Shinya Kitaoka |
120a6e |
// m_cThicknessRatio->setRange(0,100);
|
|
Shinya Kitaoka |
120a6e |
m_cThicknessRatioFirst->setRange(0, 1.0);
|
|
Shinya Kitaoka |
120a6e |
m_cThicknessRatioLast->setRange(0, 1.0);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void VectorizerPopup::showEvent(QShowEvent *se) {
|
|
Shinya Kitaoka |
120a6e |
refreshPopup();
|
|
Shinya Kitaoka |
120a6e |
connect(m_sceneHandle, SIGNAL(sceneSwitched()), SLOT(refreshPopup()));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void VectorizerPopup::hideEvent(QHideEvent *he) {
|
|
Shinya Kitaoka |
120a6e |
refreshPopup();
|
|
Shinya Kitaoka |
120a6e |
disconnect(m_sceneHandle, SIGNAL(sceneSwitched()), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(refreshPopup()));
|
|
Shinya Kitaoka |
120a6e |
Dialog::hideEvent(he);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void VectorizerPopup::populateVisibilityMenu() {
|
|
Shinya Kitaoka |
120a6e |
struct Locals {
|
|
Shinya Kitaoka |
120a6e |
VectorizerPopup *m_this;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void addActions(QMenu *menu, const std::vector<paramgroup> ¶mGroups,</paramgroup>
|
|
Shinya Kitaoka |
120a6e |
int visibilityBits) {
|
|
Shinya Kitaoka |
120a6e |
std::vector<paramgroup>::const_iterator gt, gEnd = paramGroups.end();</paramgroup>
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
for (gt = paramGroups.begin(); gt != gEnd; ++gt) {
|
|
Shinya Kitaoka |
120a6e |
if (gt->m_separatorRow >= 0) menu->addSeparator();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
std::vector<param>::const_iterator pt, pEnd = gt->m_params.end();
|
|
Shinya Kitaoka |
120a6e |
for (pt = gt->m_params.begin(); pt != pEnd; ++pt) {
|
|
Shinya Kitaoka |
120a6e |
QAction *visibleParam = menu->addAction(pt->m_name);
|
|
Shinya Kitaoka |
120a6e |
visibleParam->setCheckable(true);
|
|
Shinya Kitaoka |
120a6e |
visibleParam->setChecked(visibilityBits & (1 << pt->m_bit));
|
|
Shinya Kitaoka |
120a6e |
visibleParam->setData(pt->m_bit);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
bool ret = connect(visibleParam, SIGNAL(toggled(bool)), m_this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(visibilityToggled()));
|
|
Shinya Kitaoka |
120a6e |
assert(ret);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
} locals = {this};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
QMenu *menu = qobject_cast<qmenu *="">(sender());</qmenu>
|
|
Shinya Kitaoka |
120a6e |
menu->clear();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
VectorizerParameters *vParams = getParameters();
|
|
shun-iwasawa |
21f942 |
locals.addActions(
|
|
shun-iwasawa |
21f942 |
menu,
|
|
shun-iwasawa |
21f942 |
vParams->m_isOutline ? l_outlineParamGroups : l_centerlineParamGroups,
|
|
shun-iwasawa |
21f942 |
vParams->m_visibilityBits);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void VectorizerPopup::visibilityToggled() {
|
|
Shinya Kitaoka |
120a6e |
QAction *action = qobject_cast<qaction *="">(sender());</qaction>
|
|
Shinya Kitaoka |
120a6e |
assert(action);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
const QVariant &data = action->data();
|
|
Shinya Kitaoka |
120a6e |
assert(data.canConvert<int>());</int>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int row = action->data().toInt();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
VectorizerParameters *vParams = getParameters();
|
|
Shinya Kitaoka |
120a6e |
vParams->m_visibilityBits ^= (1 << row);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
updateVisibility();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void VectorizerPopup::saveParameters() {
|
|
Shinya Kitaoka |
120a6e |
struct {
|
|
Shinya Kitaoka |
120a6e |
VectorizerPopup *m_this;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
static bool vectorizerType(TPersist *persist) {
|
|
Shinya Kitaoka |
120a6e |
return (dynamic_cast<vectorizerparameters *="">(persist) != 0);</vectorizerparameters>
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void saveParams(const TFilePath &fp) // May throw due to I/O failure
|
|
Shinya Kitaoka |
120a6e |
{
|
|
Shinya Kitaoka |
120a6e |
// Read the complete file first
|
|
Shinya Kitaoka |
120a6e |
TPersistSet levelSettings;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (TSystem::doesExistFileOrLevel(fp)) {
|
|
Shinya Kitaoka |
120a6e |
TIStream is(fp);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (!is)
|
|
Shinya Kitaoka |
120a6e |
throw TException(
|
|
Shinya Kitaoka |
120a6e |
tr("File could not be opened for read").toStdWString());
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
is >> levelSettings;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Replace data to be saved
|
|
Shinya Kitaoka |
120a6e |
VectorizerParameters *params = getCurrentVectorizerParameters();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
2a7129 |
levelSettings.insert(
|
|
Shinya Kitaoka |
2a7129 |
std::unique_ptr<tpersist>(new VectorizerParameters(*params)));</tpersist>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Save the new settings
|
|
Shinya Kitaoka |
120a6e |
TOStream os(fp);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (!os)
|
|
Shinya Kitaoka |
120a6e |
throw TException(
|
|
Shinya Kitaoka |
120a6e |
tr("File could not be opened for write").toStdWString());
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
os << levelSettings;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
} locals = {this};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Retrieve current level path
|
|
Shinya Kitaoka |
120a6e |
TFilePath folder, fileName;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
const TFilePath &levelPath = getSelectedLevelPath();
|
|
Shinya Kitaoka |
120a6e |
if (!levelPath.isEmpty()) {
|
|
Shinya Kitaoka |
120a6e |
folder = levelPath.getParentDir();
|
|
Shinya Kitaoka |
120a6e |
fileName = TFilePath(levelPath.getWideName()).withType("tnzsettings");
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Open save popup with defaulted path
|
|
Shinya Kitaoka |
120a6e |
static GenericSaveFilePopup *popup =
|
|
Shinya Kitaoka |
120a6e |
new GenericSaveFilePopup(tr("Save Vectorizer Parameters"));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
popup->setFilterTypes(QStringList("tnzsettings"));
|
|
Shinya Kitaoka |
120a6e |
popup->setFolder(folder);
|
|
Shinya Kitaoka |
120a6e |
popup->setFilename(fileName);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
fileName = popup->getPath();
|
|
Shinya Kitaoka |
120a6e |
if (!fileName.isEmpty()) {
|
|
Shinya Kitaoka |
120a6e |
try {
|
|
Shinya Kitaoka |
120a6e |
locals.saveParams(fileName);
|
|
Shinya Kitaoka |
120a6e |
} catch (const TException &e) {
|
|
Shinya Kitaoka |
120a6e |
DVGui::error(QString::fromStdWString(e.getMessage()));
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void VectorizerPopup::loadParameters() {
|
|
Shinya Kitaoka |
120a6e |
struct {
|
|
Shinya Kitaoka |
120a6e |
VectorizerPopup *m_this;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void loadParams(const TFilePath &fp) // May throw due to I/O failure
|
|
Shinya Kitaoka |
120a6e |
{
|
|
Shinya Kitaoka |
120a6e |
TIStream is(fp);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (!is)
|
|
Shinya Kitaoka |
120a6e |
throw TException(
|
|
Shinya Kitaoka |
120a6e |
tr("File could not be opened for read").toStdWString());
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
VectorizerParameters *vParams = getCurrentVectorizerParameters();
|
|
Shinya Kitaoka |
120a6e |
const std::string &vParamsTag = vParams->getStreamTag();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
std::string tagName;
|
|
Shinya Kitaoka |
120a6e |
while (is.matchTag(tagName)) {
|
|
Shinya Kitaoka |
120a6e |
if (tagName == vParamsTag)
|
|
Shinya Kitaoka |
120a6e |
is >> *vParams, is.matchEndTag();
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
is.skipCurrentTag();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
} locals = {this};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Retrieve current level path
|
|
Shinya Kitaoka |
120a6e |
TFilePath folder, fileName;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
const TFilePath &levelPath = getSelectedLevelPath();
|
|
Shinya Kitaoka |
120a6e |
if (!levelPath.isEmpty()) {
|
|
Shinya Kitaoka |
120a6e |
folder = levelPath.getParentDir();
|
|
Shinya Kitaoka |
120a6e |
fileName = TFilePath(levelPath.getWideName()).withType("tnzsettings");
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Open load popup with defaulted path
|
|
Shinya Kitaoka |
120a6e |
static GenericLoadFilePopup *popup =
|
|
Shinya Kitaoka |
120a6e |
new GenericLoadFilePopup(tr("Load Vectorizer Parameters"));
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
popup->setFilterTypes(QStringList("tnzsettings"));
|
|
Shinya Kitaoka |
120a6e |
popup->setFolder(folder);
|
|
Shinya Kitaoka |
120a6e |
popup->setFilename(fileName);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
fileName = popup->getPath();
|
|
Shinya Kitaoka |
120a6e |
if (!fileName.isEmpty()) {
|
|
Shinya Kitaoka |
120a6e |
try {
|
|
Shinya Kitaoka |
120a6e |
locals.loadParams(fileName);
|
|
Shinya Kitaoka |
120a6e |
refreshPopup(); // Update GUI to reflect changes
|
|
Shinya Kitaoka |
120a6e |
} catch (const TException &e) {
|
|
Shinya Kitaoka |
120a6e |
DVGui::error(QString::fromStdWString(e.getMessage()));
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void VectorizerPopup::resetParameters() {
|
|
Shinya Kitaoka |
120a6e |
*getCurrentVectorizerParameters() = VectorizerParameters();
|
|
Shinya Kitaoka |
120a6e |
refreshPopup();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//*****************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// VectorizerPopupCommand instantiation
|
|
Toshihiro Shimizu |
890ddd |
//*****************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
OpenPopupCommandHandler<vectorizerpopup> openVectorizerPopup(</vectorizerpopup>
|
|
Shinya Kitaoka |
120a6e |
MI_ConvertToVectors);
|