diff --git a/toonz/sources/common/tgraphics.cpp b/toonz/sources/common/tgraphics.cpp deleted file mode 100644 index 9772b33..0000000 --- a/toonz/sources/common/tgraphics.cpp +++ /dev/null @@ -1,273 +0,0 @@ - - -#include "tgraphics.h" - -extern "C" { -#include "Tw/Gf.h" -#include "tvis.h" -} - -TGraphics::TGraphics(_TWIDGET *_gf, int ras_x0, int ras_y0, int ras_x1, - int ras_y1, int gf_x0, int gf_y0, int gf_x1, int gf_y1, - int zoom_level) - : gf(_gf) - , currentPoint(0, 0) - , gfRegion(gf_x0, gf_y0, gf_x1, gf_y1) - , rasterRegion(ras_x0 - 1, ras_y0 - 1, ras_x1 + 1, ras_y1 + 1) - //, rasterRegion(ras_x0,ras_y0,ras_x1,ras_y1) - , zoomFactor(1) - , pixelSize(1) { - double dx, dy; - int blx, bly; - - if (zoom_level > 0) - zoomFactor = 1 << zoom_level; - else if (zoom_level < 0) - zoomFactor = 1.0 / (1 << -zoom_level); - pixelSize = 1.0 / zoomFactor; - - blx = ras_x0 - gf_x0 / zoomFactor; - bly = ras_y0 - gf_y0 / zoomFactor; - dx = 0.5 - blx; - dy = 0.5 - bly; - - GfPushMatrix(gf); - GfTranslate(gf, -0.5, -0.5); - GfScale(gf, zoomFactor, zoomFactor); - GfTranslate(gf, dx, dy); -} - -//--------------------------------------------------- - -TGraphics::~TGraphics() { GfPopMatrix(gf); } - -//--------------------------------------------------- - -void TGraphics::setColor(int r, int g, int b) { - _r = r; - _g = g; - _b = b; - GfCpack(gf, r, g, b); -} - -//--------------------------------------------------- - -void TGraphics::drawLine(const TPointI &a, const TPointI &b) { - if (a.x < rasterRegion.x0 && b.x < rasterRegion.x0 || - a.x > rasterRegion.x1 && b.x > rasterRegion.x1 || - a.y < rasterRegion.y0 && b.y < rasterRegion.y0 || - a.y > rasterRegion.y1 && b.y > rasterRegion.y1) - return; - int v[2]; - GfBgnLine(gf); - v[0] = a.x; - v[1] = a.y; - GfV2i(gf, v); - v[0] = b.x; - v[1] = b.y; - GfV2i(gf, v); - GfEndLine(gf); -} - -//--------------------------------------------------- - -void TGraphics::drawLine(const TPointD &a, const TPointD &b) { - if (a.x < rasterRegion.x0 && b.x < rasterRegion.x0 || - a.x > rasterRegion.x1 && b.x > rasterRegion.x1 || - a.y < rasterRegion.y0 && b.y < rasterRegion.y0 || - a.y > rasterRegion.y1 && b.y > rasterRegion.y1) - return; - double v[2]; - GfBgnLine(gf); - v[0] = a.x; - v[1] = a.y; - GfV2d(gf, v); - v[0] = b.x; - v[1] = b.y; - GfV2d(gf, v); - GfEndLine(gf); -} - -//--------------------------------------------------- - -void TGraphics::beginPolygon() { GfBgnPolygon(gf); } - -//--------------------------------------------------- - -void TGraphics::endPolygon() { GfEndPolygon(gf); } - -//--------------------------------------------------- - -void TGraphics::beginLine() { GfBgnLine(gf); } - -//--------------------------------------------------- - -void TGraphics::endLine() { GfEndLine(gf); } - -//--------------------------------------------------- - -void TGraphics::vertex(const TPointI &a) { - int v[2]; - v[0] = a.x; - v[1] = a.y; - GfV2i(gf, v); -} - -//--------------------------------------------------- - -void TGraphics::vertex(const TPointD &a) { - double v[2]; - v[0] = a.x; - v[1] = a.y; - GfV2d(gf, v); -} - -//--------------------------------------------------- - -void TGraphics::drawRect(const TPointI &a, const TPointI &b) { - GfRecti(gf, a.x, a.y, b.x, b.y); -} - -//--------------------------------------------------- - -void TGraphics::drawRect(const TPointD &a, const TPointD &b) { - GfRect(gf, a.x, a.y, b.x, b.y); -} - -//--------------------------------------------------- - -void TGraphics::drawRect(const TRectI &rect) { - GfRecti(gf, rect.x0, rect.y0, rect.x1, rect.y1); -} - -//--------------------------------------------------- - -void TGraphics::drawRect(const TRectD &rect) { - GfRect(gf, rect.x0, rect.y0, rect.x1, rect.y1); -} - -//--------------------------------------------------- - -void TGraphics::drawArc(const TBezierArc &arc) { - int n = 50; - beginLine(); - for (int i = 0; i <= n; i++) vertex(arc.getPoint((double)i / (double)n)); - endLine(); -} - -//--------------------------------------------------- - -void TGraphics::drawArc(const TCubicCurve &arc) { - int n = 80; - beginLine(); - for (int i = 0; i <= n; i++) vertex(arc.getPoint((double)i / (double)n)); - endLine(); -} - -//--------------------------------------------------- - -void TGraphics::drawArcTo(const TPointD &d1, const TPointD &d2, - const TPointD &d3) { - TPointD oldPoint = currentPoint; - currentPoint += d1 + d2 + d3; - drawArc( - TBezierArc(oldPoint, oldPoint + d1, oldPoint + d1 + d2, currentPoint)); -} - -//--------------------------------------------------- - -void TGraphics::drawDiamond(const TPointD &p, double r) { - beginPolygon(); - vertex(p + TPointD(r, 0)); - vertex(p + TPointD(0, r)); - vertex(p + TPointD(-r, 0)); - vertex(p + TPointD(0, -r)); - endPolygon(); -} - -//--------------------------------------------------- - -void TGraphics::drawCross(const TPointD &p, double r) { - drawLine(p - TPointD(r, r), p + TPointD(r, r)); - drawLine(p - TPointD(-r, r), p + TPointD(-r, r)); -} - -//--------------------------------------------------- - -void TGraphics::drawSquare(const TPointD &p, double r) { - beginLine(); - vertex(p + TPointD(-r, -r)); - vertex(p + TPointD(-r, r)); - vertex(p + TPointD(r, r)); - vertex(p + TPointD(r, -r)); - vertex(p + TPointD(-r, -r)); - endLine(); -} - -//--------------------------------------------------- - -void TGraphics::drawArc(const TPointD &p0, const TPointD &p1, - const TPointD &p2) { - TRectD rect = convert(rasterRegion.enlarge(+10)); - // TRectD rect(rasterRegion.x0, rasterRegion.y0, rasterRegion.x1, - // rasterRegion.y1); - TRectD bBox = boundingBox(p0, p1, p2); - - if (!rect.overlaps(bBox)) { - /* -unsigned char tmp_r = _r; -unsigned char tmp_g = _g; -unsigned char tmp_b = _b; -setColor(100,100,100); -drawRect(bBox); -drawLine(TLineD(bBox.x0, bBox.y0, bBox.x1, bBox.y1)); -drawLine(TLineD(bBox.x0, bBox.y1, bBox.x1, bBox.y0)); -setColor(tmp_r, tmp_g, tmp_b); -*/ - return; - } - - double threshold = pixelSize * 0.125; - - TPointD v = p2 - p0; - TPointD u = p1 - p0; - TPointD r = rotate90(v); - - double sqr_tsh = (threshold * threshold) * (v * v); - double dist = r * u; - - if ((dist * dist) > sqr_tsh) { - TPointD l1 = 0.5 * (p0 + p1); - TPointD r1 = 0.5 * (p1 + p2); - TPointD l2 = 0.5 * (l1 + r1); - drawArc(p0, l1, l2); - drawArc(l2, r1, p2); - } else { - beginLine(); - vertex(p0); - vertex(p2); - endLine(); - } -} - -//--------------------------------------------------- - -void TGraphics::drawCircle(TPointD p, double radius) { - GfCirc(gf, p.x, p.y, radius); -} - -//--------------------------------------------------- - -void TGraphics::fillCircle(TPointD p, double radius) { - GfCircf(gf, p.x, p.y, radius); -} - -//--------------------------------------------------- - -void TGraphics::rectWrap(int wrap_pixels) { GfRectWrap(gf, wrap_pixels); } - -//--------------------------------------------------- - -void TGraphics::rectWrite(int x0, int y0, int x1, int y1, void *buffer) { - GfRectWrite(gf, x0, y0, x1, y1, buffer); -} diff --git a/toonz/sources/include/toonz/sceneresources.h b/toonz/sources/include/toonz/sceneresources.h index 91f98db..6f2370e 100644 --- a/toonz/sources/include/toonz/sceneresources.h +++ b/toonz/sources/include/toonz/sceneresources.h @@ -17,6 +17,7 @@ #endif #include +#include //============================================================================= // forward declarations @@ -112,8 +113,8 @@ If scene is untitled update save path. */ void updatePath(TFilePath &fp); - virtual bool isDirty() = 0; - virtual QString getResourceName() = 0; + virtual bool isDirty() = 0; + virtual QStringList getResourceName() = 0; }; //============================================================================= @@ -157,7 +158,7 @@ Set simple level path to old path. } bool isDirty() override; - QString getResourceName() override; + QStringList getResourceName() override; }; //============================================================================= @@ -203,7 +204,7 @@ Set simple level path to old path. } bool isDirty() override; - QString getResourceName() override; + QStringList getResourceName() override; }; //============================================================================= @@ -247,7 +248,7 @@ Set sound track path to old path. } bool isDirty() override { return false; } - QString getResourceName() override { return QString(); } + QStringList getResourceName() override { return QStringList(); } }; //============================================================================= @@ -316,7 +317,7 @@ If doesn't make \b commit() destroyer calls \b rollbackPaths(). void accept(ResourceProcessor *processor, bool autoCommit = true); // return the name list of dirty resources - void getDirtyResources(std::vector &dirtyResources); + void getDirtyResources(QStringList &dirtyResources); private: // not implemented diff --git a/toonz/sources/toonz/exportlevelpopup.cpp b/toonz/sources/toonz/exportlevelpopup.cpp index 6d85bae..05a286c 100644 --- a/toonz/sources/toonz/exportlevelpopup.cpp +++ b/toonz/sources/toonz/exportlevelpopup.cpp @@ -360,7 +360,7 @@ ExportLevelPopup::ExportLevelPopup() bool ret = true; ret = connect(tabBar, SIGNAL(currentChanged(int)), stackedWidget, SLOT(setCurrentIndex(int))); - ret = connect(m_format, SIGNAL(currentIndexChanged(const QString &)), + ret = connect(m_format, SIGNAL(currentIndexChanged(const QString &)), SLOT(onformatChanged(const QString &))) && ret; ret = connect(m_retas, SIGNAL(stateChanged(int)), SLOT(onRetas(int))) && ret; @@ -501,8 +501,8 @@ void ExportLevelPopup::checkAlpha() { for (int i = 0; i < props->getPropertyCount(); ++i) { TProperty *p = props->getProperty(i); - const QString &name = p->getQStringName(); - const QString &val = QString::fromStdString(p->getValueAsString()); + const std::string &name = p->getName(); + const QString &val = QString::fromStdString(p->getValueAsString()); if (name == "Bits Per Pixel") { withAlpha = (val.contains("32") || val.contains("64")); diff --git a/toonz/sources/toonz/iocommand.cpp b/toonz/sources/toonz/iocommand.cpp index 9ec4f66..558c55e 100644 --- a/toonz/sources/toonz/iocommand.cpp +++ b/toonz/sources/toonz/iocommand.cpp @@ -1202,21 +1202,29 @@ bool IoCmd::saveSceneIfNeeded(QString msg) { ToonzScene *scene = app->getCurrentScene()->getScene(); if (scene) { - std::vector dirtyResources; + QStringList dirtyResources; { SceneResources resources(scene, 0); resources.getDirtyResources(dirtyResources); } if (!dirtyResources.empty()) { + // show up to 5 items + int extraCount = dirtyResources.count() - 5; + if (extraCount > 0) { + dirtyResources = dirtyResources.mid(0, 5); + dirtyResources.append( + QObject::tr("and %1 more item(s).").arg(extraCount)); + } + QString question; question = msg + ":" + QObject::tr(" The following file(s) have been modified.\n\n"); - for (int i = 0; i < dirtyResources.size(); i++) { - question += " " + dirtyResources[i] + "\n"; - } - question += QObject::tr("\nWhat would you like to do? "); + + question += " " + dirtyResources.join("\n "); + + question += "\n" + QObject::tr("\nWhat would you like to do? "); int ret = DVGui::MsgBox(question, QObject::tr("Save Changes"), diff --git a/toonz/sources/toonz/penciltestpopup.cpp b/toonz/sources/toonz/penciltestpopup.cpp index 4d3b0e1..6909e4a 100644 --- a/toonz/sources/toonz/penciltestpopup.cpp +++ b/toonz/sources/toonz/penciltestpopup.cpp @@ -1494,10 +1494,6 @@ PencilTestPopup::PencilTestPopup() m_subHeightFld = new IntLineEdit(this); QWidget* subCamWidget = new QWidget(this); -#ifdef MACOSX - m_dummyViewFinder = new QCameraViewfinder(this); - m_dummyViewFinder->hide(); -#endif //---- m_resolutionCombo->setMaximumWidth(fontMetrics().width("0000 x 0000") + 25); @@ -1903,10 +1899,6 @@ void PencilTestPopup::onCameraListComboActivated(int comboIndex) { m_currentCamera = new QCamera(cameras.at(index), this); m_deviceName = cameras.at(index).deviceName(); -#ifdef MACOSX - // this line is needed only in macosx - m_currentCamera->setViewfinder(m_dummyViewFinder); -#endif // loading new camera m_currentCamera->load(); @@ -1952,22 +1944,22 @@ void PencilTestPopup::onResolutionComboActivated(const QString& itemText) { // the splited text must be "" "x" and "" if (texts.size() != 3) return; +#ifndef MACOSX m_currentCamera->stop(); m_currentCamera->unload(); +#endif + QCameraViewfinderSettings settings = m_currentCamera->viewfinderSettings(); QSize newResolution(texts[0].toInt(), texts[2].toInt()); settings.setResolution(newResolution); m_currentCamera->setViewfinderSettings(settings); -#ifdef MACOSX - m_dummyViewFinder->resize(newResolution); -#endif - // reset white bg m_whiteBGImg = QImage(); m_bgReductionFld->setDisabled(true); - +#ifndef MACOSX m_currentCamera->start(); +#endif m_videoWidget->setImage(QImage()); // update env @@ -2146,8 +2138,9 @@ void PencilTestPopup::onFrameCaptured(QImage& image) { m_videoWidget->setImage(image.copy()); if (m_captureCue) { +#ifndef MACOSX m_currentCamera->stop(); - +#endif m_captureCue = false; bool scanBtoT = @@ -2186,8 +2179,9 @@ void PencilTestPopup::onFrameCaptured(QImage& image) { m_captureButton->setChecked(false); onCaptureButtonClicked(false); } - +#ifndef MACOSX m_currentCamera->start(); +#endif } } diff --git a/toonz/sources/toonz/penciltestpopup.h b/toonz/sources/toonz/penciltestpopup.h index 235393f..7c27155 100644 --- a/toonz/sources/toonz/penciltestpopup.h +++ b/toonz/sources/toonz/penciltestpopup.h @@ -314,10 +314,6 @@ class PencilTestPopup : public DVGui::Dialog { DVGui::IntLineEdit *m_subWidthFld, *m_subHeightFld; QSize m_allowedCameraSize; -#ifdef MACOSX - QCameraViewfinder* m_dummyViewFinder; -#endif - bool m_captureWhiteBGCue; bool m_captureCue; bool m_alwaysOverwrite = false; diff --git a/toonz/sources/toonzlib/sceneresources.cpp b/toonz/sources/toonzlib/sceneresources.cpp index 9c7166a..1569d4e 100644 --- a/toonz/sources/toonzlib/sceneresources.cpp +++ b/toonz/sources/toonzlib/sceneresources.cpp @@ -121,7 +121,7 @@ TFilePath ResourceImportStrategy::process(ToonzScene *scene, if (srcPath.getWideString().find(L'+') == 0) dstPath = srcPath; else - dstPath = scene->getImportedLevelPath(srcPath); + dstPath = scene->getImportedLevelPath(srcPath); TFilePath actualDstPath = scene->decodeFilePath(dstPath); assert(actualDstPath != TFilePath()); @@ -334,7 +334,8 @@ bool SceneLevel::isDirty() { } //----------------------------------------------------------------------------- -QString SceneLevel::getResourceName() { +QStringList SceneLevel::getResourceName() { + QStringList ret; QString string; bool levelIsDirty = false; if (m_sl->getProperties()->getDirtyFlag()) { @@ -342,16 +343,23 @@ QString SceneLevel::getResourceName() { levelIsDirty = true; } if (m_sl->getPalette() && m_sl->getPalette()->getDirtyFlag()) { - if (levelIsDirty) string += " and "; - if (m_sl->getPath().getType() == "pli") - string += QString::fromStdWString(m_sl->getPalette()->getPaletteName()) + - ".pli (palette)"; - else - string += QString::fromStdWString(m_sl->getPalette()->getPaletteName()) + - ".tpl"; - } + QString paletteName = + QString::fromStdWString(m_sl->getPalette()->getPaletteName()); + if (m_sl->getType() & FULLCOLOR_TYPE) { + if (levelIsDirty) ret << string; + ret << paletteName + ".tpl"; + } else { + if (levelIsDirty) string += " and "; + if (m_sl->getPath().getType() == "pli") + string += paletteName + ".pli (palette)"; + else + string += paletteName + ".tpl"; + ret << string; + } + } else if (levelIsDirty) + ret << string; - return string; + return ret; } //============================================================================= @@ -403,8 +411,8 @@ bool ScenePalette::isDirty() { return m_pl->getPalette()->getDirtyFlag(); } //----------------------------------------------------------------------------- -QString ScenePalette::getResourceName() { - return QString::fromStdString(m_pl->getPath().getLevelName()); +QStringList ScenePalette::getResourceName() { + return QStringList(QString::fromStdString(m_pl->getPath().getLevelName())); } //============================================================================= @@ -496,19 +504,24 @@ void SceneResources::save(const TFilePath newScenePath) { TFilePath oldScenePath = m_scene->getScenePath(); m_scene->setScenePath(newScenePath); bool failedSave = false; - QString failedList; for (int i = 0; i < (int)m_resources.size(); i++) { m_resources[i]->save(); - if (m_resources[i]->isDirty()) // didn't save for some reason - { - failedList += "\n" + m_resources[i]->getResourceName(); - failedSave = true; - } } - if (failedSave) + QStringList failedList; + getDirtyResources(failedList); + + if (!failedList.isEmpty()) { // didn't save for some reason + // show up to 5 items + int extraCount = failedList.count() - 5; + if (extraCount > 0) { + failedList = failedList.mid(0, 5); + failedList.append(QObject::tr("and %1 more item(s).").arg(extraCount)); + } + DVGui::warning(QObject::tr("Failed to save the following resources:\n") + - failedList); + " " + failedList.join("\n ")); + } m_scene->setScenePath(oldScenePath); } @@ -536,11 +549,12 @@ void SceneResources::accept(ResourceProcessor *processor, bool autoCommit) { //----------------------------------------------------------------------------- // return the name list of dirty resources -void SceneResources::getDirtyResources(std::vector &dirtyResources) { - for (int i = 0; i < (int)m_resources.size(); i++) - if (m_resources[i]->isDirty()) { - dirtyResources.push_back(m_resources[i]->getResourceName()); +void SceneResources::getDirtyResources(QStringList &dirtyResources) { + for (SceneResource *resource : m_resources) + if (resource->isDirty()) { + dirtyResources << resource->getResourceName(); } + dirtyResources.removeDuplicates(); } //============================================================================= @@ -562,7 +576,7 @@ ResourceImporter::ResourceImporter(ToonzScene *scene, TProject *dstProject, scene->getScenePath() - scene->getProject()->getScenesPath(); if (relativeScenePath.isAbsolute()) relativeScenePath = scene->getScenePath().withoutParentDir(); - TFilePath newFp = dstProject->getScenesPath() + relativeScenePath; + TFilePath newFp = dstProject->getScenesPath() + relativeScenePath; makeUnique(newFp); m_dstScene->setScenePath(newFp); } @@ -680,7 +694,7 @@ void ResourceCollector::process(TXshSimpleLevel *sl) { std::string suffix = ResourceImporter::extractPsdSuffix(path); std::map::iterator it = m_collectedFiles.find(path); if (it != m_collectedFiles.end()) { - TFilePath destPath = it->second; + TFilePath destPath = it->second; if (suffix != "") destPath = ResourceImporter::buildPsd(destPath, suffix); sl->setPath(destPath); } else { @@ -696,7 +710,7 @@ void ResourceCollector::process(TXshSimpleLevel *sl) { } } ++m_count; - TFilePath destPath = collectedPath; + TFilePath destPath = collectedPath; if (suffix != "") destPath = ResourceImporter::buildPsd(destPath, suffix); sl->setPath(destPath); m_collectedFiles[path] = collectedPath; diff --git a/toonz/sources/toonzlib/stagevisitor.cpp b/toonz/sources/toonzlib/stagevisitor.cpp index e4711cb..b3ddb02 100644 --- a/toonz/sources/toonzlib/stagevisitor.cpp +++ b/toonz/sources/toonzlib/stagevisitor.cpp @@ -744,7 +744,13 @@ static void drawAutocloses(TVectorImage *vi, TVectorRenderData &rd) { rd.m_palette = plt; buildAutocloseImage(vaux, vi, startPoints, endPoints); + // temporarily disable fill check, to preserve the gap indicator color + bool tCheckEnabledOriginal = rd.m_tcheckEnabled; + rd.m_tcheckEnabled = false; + // draw tglDraw(rd, vaux); + // restore original value + rd.m_tcheckEnabled = tCheckEnabledOriginal; delete vaux; }