From 6dfd6d6f98dd2a8335912bc1be91de9aefb1b0c1 Mon Sep 17 00:00:00 2001 From: Ivan Mahonin Date: Aug 26 2023 14:51:25 +0000 Subject: #assistants: show with all tools --- diff --git a/toonz/sources/include/tools/assistant.h b/toonz/sources/include/tools/assistant.h index 14931aa..5be247d 100644 --- a/toonz/sources/include/tools/assistant.h +++ b/toonz/sources/include/tools/assistant.h @@ -39,6 +39,7 @@ class TProperty; class TPropertyGroup; +class TTool; class TToolViewer; class TAssistant; class TAssistantPoint; @@ -340,6 +341,17 @@ public: double &outK, double &outMin, double &outMax ); + + static bool scanAssistants( + TTool *tool, + const TPointD *positions, + int positionsCount, + TGuidelineList *outGuidelines, + bool draw, + bool enabledOnly, + bool markEnabled, + bool drawGuidelines, + TImage *skipImage ); }; diff --git a/toonz/sources/include/tools/modifiers/modifierassistants.h b/toonz/sources/include/tools/modifiers/modifierassistants.h index a040a8c..35a286a 100644 --- a/toonz/sources/include/tools/modifiers/modifierassistants.h +++ b/toonz/sources/include/tools/modifiers/modifierassistants.h @@ -44,7 +44,8 @@ private: int positionsCount, TGuidelineList *outGuidelines, bool draw, - bool enabledOnly ) const; + bool enabledOnly, + bool drawGuidelines ) const; public: double magnetism; diff --git a/toonz/sources/include/tools/tool.h b/toonz/sources/include/tools/tool.h index fde613e..2be17c8 100644 --- a/toonz/sources/include/tools/tool.h +++ b/toonz/sources/include/tools/tool.h @@ -300,6 +300,17 @@ public: AllTargets = 0xffffffff, }; + enum ToolHints //! Misc flags related with tool + { HintNone = 0, + HintAssistants = 1 << 0, //!< Draw asistants when tool active + HintGuidelines = 1 << 1, //!< Draw asistant guidelines + HintAssistantsEnabled = 1 << 2, //!< Tool will use assisnats + + HintAssistantsAll = HintAssistants + | HintGuidelines + | HintAssistantsEnabled, + }; + public: static TTool *getTool(std::string toolName, ToolTargetType targetType); @@ -346,6 +357,7 @@ public: virtual ToolType getToolType() const = 0; ToolTargetType getTargetType() const { return (ToolTargetType)m_targetType; } + virtual unsigned int getToolHints() const; std::string getName() const { return m_name; } diff --git a/toonz/sources/tnztools/assistant.cpp b/toonz/sources/tnztools/assistant.cpp index 826ab4e..d43d4c8 100644 --- a/toonz/sources/tnztools/assistant.cpp +++ b/toonz/sources/tnztools/assistant.cpp @@ -1,12 +1,24 @@ #include +#include + +#include +#include +#include +#include +#include +#include +#include + #include #include #include #include + + #ifdef MACOSX const double line_width_scale = 1.5; #else @@ -594,3 +606,83 @@ TAssistant::calcPerspectiveStep( outMax = (dx1 > 0.0 ? maxX : minX) - x0; return true; } + + +bool +TAssistant::scanAssistants( + TTool *tool, + const TPointD *positions, + int positionsCount, + TGuidelineList *outGuidelines, + bool draw, + bool enabledOnly, + bool markEnabled, + bool drawGuidelines, + TImage *skipImage ) +{ + TGuidelineList guidelines; + if (drawGuidelines && !outGuidelines) + outGuidelines = &guidelines; + + bool found = false; + bool findGuidelines = (positions && positionsCount > 0 && outGuidelines); + if (!findGuidelines) drawGuidelines = false; + bool doSomething = findGuidelines || draw; + + if (tool) + if (TToolViewer *viewer = tool->getViewer()) + if (TApplication *application = tool->getApplication()) + if (TXshLevelHandle *levelHandle = application->getCurrentLevel()) + if (TXshLevel *level = levelHandle->getLevel()) + if (TXshSimpleLevel *simpleLevel = level->getSimpleLevel()) + if (TFrameHandle *frameHandle = application->getCurrentFrame()) + if (TXsheetHandle *XsheetHandle = application->getCurrentXsheet()) + if (TXsheet *Xsheet = XsheetHandle->getXsheet()) + { + TPointD dpiScale = getCurrentDpiScale(simpleLevel, tool->getCurrentFid()); + int frame = frameHandle->getFrame(); + int count = Xsheet->getColumnCount(); + TAffine worldToTrack; + if ( tool->getToolType() & TTool::LevelTool + && !application->getCurrentObject()->isSpline() ) + { + worldToTrack.a11 /= dpiScale.x; + worldToTrack.a22 /= dpiScale.y; + } + + for(int i = 0; i < count; ++i) + if (TXshColumn *column = Xsheet->getColumn(i)) + if (column->isCamstandVisible()) + if (column->isPreviewVisible()) + if (TImageP image = Xsheet->getCell(frame, i).getImage(false)) + if (image != skipImage) + if (image->getType() == TImage::META) + if (TMetaImage *metaImage = dynamic_cast(image.getPointer())) + { + TAffine imageToTrack = worldToTrack * tool->getColumnMatrix(i); + if (draw) { glPushMatrix(); tglMultMatrix(imageToTrack); } + + TMetaImage::Reader reader(*metaImage); + for(TMetaObjectListCW::iterator i = reader->begin(); i != reader->end(); ++i) + if (*i) + if (const TAssistant *assistant = (*i)->getHandler()) + if (!enabledOnly || assistant->getEnabled()) + { + found = true; + if (findGuidelines) + for(int i = 0; i < positionsCount; ++i) + assistant->getGuidelines(positions[i], imageToTrack, *outGuidelines); + if (draw) assistant->draw(viewer, assistant->getEnabled() && markEnabled); + if (!doSomething) return true; + } + + if (draw) glPopMatrix(); + } + } + + if (drawGuidelines) + for(TGuidelineList::const_iterator i = outGuidelines->begin(); i != outGuidelines->end(); ++i) + (*i)->draw(); + + return found; +} diff --git a/toonz/sources/tnztools/editassistantstool.cpp b/toonz/sources/tnztools/editassistantstool.cpp index 25299d9..ed217b9 100644 --- a/toonz/sources/tnztools/editassistantstool.cpp +++ b/toonz/sources/tnztools/editassistantstool.cpp @@ -200,6 +200,8 @@ public: ToolType getToolType() const override { return TTool::LevelWriteTool; } + unsigned int getToolHints() const override + { return TTool::getToolHints() & ~HintAssistantsAll; } int getCursorId() const override { return ToolCursor::StrokeSelectCursor; } void onImageChanged() override { @@ -599,56 +601,21 @@ public: { assistant->drawEdit(getViewer()); assistant->getGuidelines( - m_currentPosition + m_currentPointOffset, + position, TAffine(), m_currentGuidelines ); } - // draw assistans from other layers - TImage *currentImage = getImage(false); - if (TToolViewer *viewer = getViewer()) - if (TApplication *application = getApplication()) - if (TXshLevelHandle *levelHandle = application->getCurrentLevel()) - if (TXshLevel *level = levelHandle->getLevel()) - if (TXshSimpleLevel *simpleLevel = level->getSimpleLevel()) - if (TFrameHandle *frameHandle = application->getCurrentFrame()) - if (TXsheetHandle *XsheetHandle = application->getCurrentXsheet()) - if (TXsheet *Xsheet = XsheetHandle->getXsheet()) - { - TPointD dpiScale = getCurrentDpiScale(simpleLevel, getCurrentFid()); - int frame = frameHandle->getFrame(); - int count = Xsheet->getColumnCount(); - TAffine worldToTrack; - worldToTrack.a11 /= dpiScale.x; - worldToTrack.a22 /= dpiScale.y; - - for(int i = 0; i < count; ++i) - if (TXshColumn *column = Xsheet->getColumn(i)) - if (column->isCamstandVisible()) - if (column->isPreviewVisible()) - if (TImageP image = Xsheet->getCell(frame, i).getImage(false)) - if (image->getType() == TImage::META) - if (image != currentImage) - if (TMetaImage *metaImage = dynamic_cast(image.getPointer())) - { - TAffine imageToTrack = worldToTrack * getColumnMatrix(i); - glPushMatrix(); tglMultMatrix(imageToTrack); - - TMetaImage::Reader reader(*metaImage); - for(TMetaObjectListCW::iterator i = reader->begin(); i != reader->end(); ++i) - if (*i) - if (const TAssistant *assistant = (*i)->getHandler()) { - assistant->getGuidelines(position, imageToTrack, m_currentGuidelines); - assistant->draw(viewer, false); - } - - glPopMatrix(); - } - } - - // draw guidelines - for(TGuidelineList::const_iterator i = m_currentGuidelines.begin(); i != m_currentGuidelines.end(); ++i) - (*i)->draw(); + // draw assistans and guidelines from other layers + TAssistant::scanAssistants( + this, // tool + &position, 1, // pointer positions + nullptr, // out guidelines + true, // draw + false, // enabled only + false, // mark enabled + true, // draw guidelines + nullptr ); // skip image } }; diff --git a/toonz/sources/tnztools/fullcolorbrushtool.h b/toonz/sources/tnztools/fullcolorbrushtool.h index 903ccbd..dd9b831 100644 --- a/toonz/sources/tnztools/fullcolorbrushtool.h +++ b/toonz/sources/tnztools/fullcolorbrushtool.h @@ -59,7 +59,10 @@ private: public: FullColorBrushTool(std::string name); - ToolType getToolType() const override { return TTool::LevelWriteTool; } + ToolType getToolType() const override + { return TTool::LevelWriteTool; } + unsigned int getToolHints() const override + { return TTool::getToolHints() & ~HintAssistantsAll; } ToolOptionsBox *createOptionsBox() override; diff --git a/toonz/sources/tnztools/modifiers/modifierassistants.cpp b/toonz/sources/tnztools/modifiers/modifierassistants.cpp index c6fec6f..3613446 100644 --- a/toonz/sources/tnztools/modifiers/modifierassistants.cpp +++ b/toonz/sources/tnztools/modifiers/modifierassistants.cpp @@ -48,60 +48,22 @@ TModifierAssistants::scanAssistants( int positionsCount, TGuidelineList *outGuidelines, bool draw, - bool enabledOnly ) const + bool enabledOnly, + bool drawGuidelines ) const { - bool found = false; if (TInputManager *manager = getManager()) if (TInputHandler *handler = manager->getHandler()) - if (TTool *tool = handler->inputGetTool()) - if (TToolViewer *viewer = tool->getViewer()) - if (TApplication *application = tool->getApplication()) - if (TXshLevelHandle *levelHandle = application->getCurrentLevel()) - if (TXshLevel *level = levelHandle->getLevel()) - if (TXshSimpleLevel *simpleLevel = level->getSimpleLevel()) - if (TFrameHandle *frameHandle = application->getCurrentFrame()) - if (TXsheetHandle *XsheetHandle = application->getCurrentXsheet()) - if (TXsheet *Xsheet = XsheetHandle->getXsheet()) - { - TPointD dpiScale = getCurrentDpiScale(simpleLevel, tool->getCurrentFid()); - bool findGuidelines = (positions && positionsCount > 0 && outGuidelines); - bool doSomething = findGuidelines || draw; - - int frame = frameHandle->getFrame(); - int count = Xsheet->getColumnCount(); - TAffine worldToTrack; - worldToTrack.a11 /= dpiScale.x; - worldToTrack.a22 /= dpiScale.y; - - for(int i = 0; i < count; ++i) - if (TXshColumn *column = Xsheet->getColumn(i)) - if (column->isCamstandVisible()) - if (column->isPreviewVisible()) - if (TImageP image = Xsheet->getCell(frame, i).getImage(false)) - if (image->getType() == TImage::META) - if (TMetaImage *metaImage = dynamic_cast(image.getPointer())) - { - TAffine imageToTrack = worldToTrack * tool->getColumnMatrix(i); - if (draw) { glPushMatrix(); tglMultMatrix(imageToTrack); } - - TMetaImage::Reader reader(*metaImage); - for(TMetaObjectListCW::iterator i = reader->begin(); i != reader->end(); ++i) - if (*i) - if (const TAssistant *assistant = (*i)->getHandler()) - if (!enabledOnly || assistant->getEnabled()) - { - found = true; - if (findGuidelines) - for(int i = 0; i < positionsCount; ++i) - assistant->getGuidelines(positions[i], imageToTrack, *outGuidelines); - if (draw) assistant->draw(viewer, magnetism > 0); - if (!doSomething) return true; - } - - if (draw) glPopMatrix(); - } - } - return found; + return TAssistant::scanAssistants( + handler->inputGetTool(), + positions, + positionsCount, + outGuidelines, + draw, + enabledOnly, + magnetism > 0, + drawGuidelines, + nullptr ); + return false; } @@ -136,7 +98,7 @@ TModifierAssistants::modifyTrack( if (intr->magnetism && start <= 0) { intr->guidelines.clear(); - scanAssistants(&track[0].position, 1, &intr->guidelines, false, true); + scanAssistants(&track[0].position, 1, &intr->guidelines, false, true, false); } bool fixed = subTrack.fixedSize() || intr->guidelines.size() <= 1; @@ -178,7 +140,7 @@ TModifierAssistants::modifyTrack( TRectD TModifierAssistants::calcDrawBounds(const TTrackList&, const THoverList&) { - if (scanAssistants(NULL, 0, NULL, false, false)) + if (scanAssistants(NULL, 0, NULL, false, false, false)) return TConsts::infiniteRectD; return TRectD(); } @@ -213,18 +175,14 @@ TModifierAssistants::draw(const TTrackList &tracks, const THoverList &hovers) { if (Handler *handler = dynamic_cast((*i)->handler.getPointer())) allHovers.push_back( handler->track->back().position ); - // draw assistants - TGuidelineList guidelines; + // draw assistants and guidelines scanAssistants( allHovers.empty() ? NULL : &allHovers.front(), (int)allHovers.size(), - &guidelines, + nullptr, true, - false ); - - // draw guidelines - for(TGuidelineList::const_iterator i = guidelines.begin(); i != guidelines.end(); ++i) - (*i)->draw(false, magnetism > 0); + false, + true ); // draw tracks TInputModifier::drawTracks(tracks); diff --git a/toonz/sources/tnztools/tool.cpp b/toonz/sources/tnztools/tool.cpp index 38434c5..0f730fe 100644 --- a/toonz/sources/tnztools/tool.cpp +++ b/toonz/sources/tnztools/tool.cpp @@ -179,6 +179,11 @@ TTool::TTool(std::string name) //------------------------------------------------------------------- +unsigned int TTool::getToolHints() const + { return HintAssistants | HintGuidelines; } + +//------------------------------------------------------------------- + TTool *TTool::getTool(std::string toolName, ToolTargetType targetType) { if (!toolTable) return 0; diff --git a/toonz/sources/tnztools/toonzrasterbrushtool.h b/toonz/sources/tnztools/toonzrasterbrushtool.h index 7bbe6b5..65bc306 100644 --- a/toonz/sources/tnztools/toonzrasterbrushtool.h +++ b/toonz/sources/tnztools/toonzrasterbrushtool.h @@ -106,8 +106,11 @@ class ToonzRasterBrushTool final : public TTool, public: ToonzRasterBrushTool(std::string name, int targetType); - ToolType getToolType() const override { return TTool::LevelWriteTool; } - + ToolType getToolType() const override + { return TTool::LevelWriteTool; } + unsigned int getToolHints() const override + { return TTool::getToolHints() & ~HintAssistantsAll; } + ToolOptionsBox *createOptionsBox() override; void updateTranslation() override; diff --git a/toonz/sources/tnztools/toonzvectorbrushtool.h b/toonz/sources/tnztools/toonzvectorbrushtool.h index 579894a..2aff0b4 100644 --- a/toonz/sources/tnztools/toonzvectorbrushtool.h +++ b/toonz/sources/tnztools/toonzvectorbrushtool.h @@ -97,7 +97,10 @@ class ToonzVectorBrushTool final : public TTool, public: ToonzVectorBrushTool(std::string name, int targetType); - ToolType getToolType() const override { return TTool::LevelWriteTool; } + ToolType getToolType() const override + { return TTool::LevelWriteTool; } + unsigned int getToolHints() const override + { return TTool::getToolHints() & ~HintAssistantsAll; } ToolOptionsBox *createOptionsBox() override; diff --git a/toonz/sources/toonz/sceneviewer.cpp b/toonz/sources/toonz/sceneviewer.cpp index a7cfaa1..7b8dab6 100644 --- a/toonz/sources/toonz/sceneviewer.cpp +++ b/toonz/sources/toonz/sceneviewer.cpp @@ -23,6 +23,7 @@ #include "tools/toolhandle.h" #include "tools/toolcommandids.h" #include "tools/toolutils.h" +#include "tools/assistant.h" // TnzQt includes #include "toonzqt/icongenerator.h" @@ -1831,7 +1832,25 @@ void SceneViewer::drawOverlay() { !app->getCurrentObject()->isSpline()) glScaled(m_dpiScale.x, m_dpiScale.y, 1); m_pixelSize = sqrt(tglGetPixelSize2()) * getDevPixRatio(); + + // draw assistans and guidelines + m_toolHasAssistants = false; + unsigned int hints = tool->getToolHints(); + if (hints & TTool::HintAssistantsAll) { + m_toolHasAssistants = TAssistant::scanAssistants( + tool, // tool + &m_toolPos, 1, // pointer positions + nullptr, // out guidelines + true, // draw + false, // enabled only + hints & TTool::HintAssistantsEnabled, // mark enabled + true, // draw guidelines + nullptr ); // skip image + } + + // draw tool tool->draw(); + glPopMatrix(); // Used (only in the T_RGBPicker tool) to notify and set the currentColor // outside the draw() methods: @@ -3307,6 +3326,7 @@ TAffine SceneViewer::getNormalZoomScale() { //----------------------------------------------------------------------------- void SceneViewer::invalidateToolStatus() { + m_toolHasAssistants = false; TTool *tool = TApp::instance()->getCurrentTool()->getTool(); if (tool) { m_toolDisableReason = tool->updateEnabled(); diff --git a/toonz/sources/toonz/sceneviewer.h b/toonz/sources/toonz/sceneviewer.h index e93cfd3..dcb22d7 100644 --- a/toonz/sources/toonz/sceneviewer.h +++ b/toonz/sources/toonz/sceneviewer.h @@ -71,6 +71,8 @@ class SceneViewer final : public GLWidgetForHighDpi, double m_pressure; QPointF m_lastMousePos; QPointF m_pos; + TPointD m_toolPos; + bool m_toolHasAssistants = false; Qt::MouseButton m_mouseButton; bool m_foregroundDrawing; bool m_tabletEvent, m_tabletMove; diff --git a/toonz/sources/toonz/sceneviewerevents.cpp b/toonz/sources/toonz/sceneviewerevents.cpp index fd8d085..d0a46dd 100644 --- a/toonz/sources/toonz/sceneviewerevents.cpp +++ b/toonz/sources/toonz/sceneviewerevents.cpp @@ -656,6 +656,12 @@ void SceneViewer::onMove(const TMouseEvent &event) { } if (!cursorSet) setToolCursor(this, tool->getCursorId()); + if ( m_toolHasAssistants + && (tool->getToolHints() & TTool::HintGuidelines) + && !areAlmostEqual(m_toolPos, pos) ) + invalidateAll(); + m_toolPos = pos; + #ifdef WITH_CANON if (StopMotion::instance()->m_canon->m_pickLiveViewZoom) setToolCursor(this, ToolCursor::ZoomCursor);