diff --git a/toonz/sources/include/tools/modifiers/modifiertest.h b/toonz/sources/include/tools/modifiers/modifiertest.h index fa308f5..91911af 100644 --- a/toonz/sources/include/tools/modifiers/modifiertest.h +++ b/toonz/sources/include/tools/modifiers/modifiertest.h @@ -1,3 +1,5 @@ + +#ifndef NDEBUG #pragma once #ifndef MODIFIERTEST_INCLUDED @@ -6,7 +8,6 @@ // TnzTools includes #include - #undef DVAPI #undef DVVAR #ifdef TNZTOOLS_EXPORTS @@ -17,28 +18,28 @@ #define DVVAR DV_IMPORT_VAR #endif - //=================================================================== //***************************************************************************************** // TModifierTest definition //***************************************************************************************** -class DVAPI TModifierTest: public TInputModifier { +class DVAPI TModifierTest : public TInputModifier { public: - class DVAPI Handler: public TTrackHandler { + class DVAPI Handler : public TTrackHandler { public: std::vector angles; - Handler(const TTrack &original): TTrackHandler(original) { } + Handler(const TTrack &original) : TTrackHandler(original) {} }; - class DVAPI Modifier: public TTrackModifier { + class DVAPI Modifier : public TTrackModifier { public: double angle; double radius; double speed; - Modifier(TTrackHandler &handler, double angle, double radius, double speed = 0.25); + Modifier(TTrackHandler &handler, double angle, double radius, + double speed = 0.25); TTrackPoint calcPoint(double originalIndex) override; }; @@ -48,11 +49,10 @@ public: TModifierTest(int count, double radius); - void modifyTrack( - const TTrack &track, - const TInputSavePoint::Holder &savePoint, - TTrackList &outTracks ) override; + void modifyTrack(const TTrack &track, + const TInputSavePoint::Holder &savePoint, + TTrackList &outTracks) override; }; - +#endif #endif diff --git a/toonz/sources/include/tools/tooloptions.h b/toonz/sources/include/tools/tooloptions.h index e2a51ee..a4f712b 100644 --- a/toonz/sources/include/tools/tooloptions.h +++ b/toonz/sources/include/tools/tooloptions.h @@ -557,6 +557,7 @@ class BrushToolOptionsBox final : public ToolOptionsBox { private: class PresetNamePopup; PresetNamePopup *m_presetNamePopup; + void filterControls(); public: BrushToolOptionsBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle, diff --git a/toonz/sources/tnztools/fullcolorbrushtool.cpp b/toonz/sources/tnztools/fullcolorbrushtool.cpp index 8675b4a..cdc7a4c 100644 --- a/toonz/sources/tnztools/fullcolorbrushtool.cpp +++ b/toonz/sources/tnztools/fullcolorbrushtool.cpp @@ -135,16 +135,31 @@ FullColorBrushTool::FullColorBrushTool(std::string name) , m_firstTime(true) , m_started(false) { bind(TTool::RasterImage | TTool::EmptyTarget); + m_thickness.setNonLinearSlider(); + + m_prop.bind(m_thickness); + m_prop.bind(m_hardness); + m_prop.bind(m_opacity); + m_prop.bind(m_modifierSize); + m_prop.bind(m_modifierOpacity); + m_prop.bind(m_modifierEraser); + m_prop.bind(m_modifierLockAlpha); + m_prop.bind(m_pressure); + m_prop.bind(m_assistants); + m_prop.bind(m_preset); m_inputmanager.setHandler(this); +#ifndef NDEBUG m_modifierTest = new TModifierTest(5, 40); - m_modifierLine = new TModifierLine(); - m_modifierTangents = new TModifierTangents(); - m_modifierAssistants = new TModifierAssistants(); +#endif + m_modifierLine = new TModifierLine(); + m_modifierTangents = new TModifierTangents(); + m_modifierAssistants = new TModifierAssistants(); m_modifierSegmentation = new TModifierSegmentation(); - m_inputmanager.addModifier( TInputModifierP(m_modifierAssistants.getPointer()) ); - + m_inputmanager.addModifier( + TInputModifierP(m_modifierAssistants.getPointer())); + m_thickness.setNonLinearSlider(); m_preset.setId("BrushPreset"); m_modifierEraser.setId("RasterEraser"); @@ -171,7 +186,6 @@ void FullColorBrushTool::onCanvasSizeChanged() { //--------------------------------------------------------------------------------------------------- void FullColorBrushTool::onColorStyleChanged() { - getApplication()->getCurrentTool()->notifyToolOptionsBoxChanged(); getApplication()->getCurrentTool()->notifyToolChanged(); } @@ -194,6 +208,7 @@ void FullColorBrushTool::updateTranslation() { void FullColorBrushTool::onActivate() { if (!m_notifier) m_notifier = new FullColorBrushToolNotifier(this); + m_notifier->onActivate(); updateCurrentStyle(); @@ -219,6 +234,8 @@ void FullColorBrushTool::onActivate() { //-------------------------------------------------------------------------------------------------- void FullColorBrushTool::onDeactivate() { + if (m_notifier) m_notifier->onDeactivate(); + m_inputmanager.finishTracks(); m_workRaster = TRaster32P(); m_backUpRas = TRasterP(); @@ -289,14 +306,18 @@ bool FullColorBrushTool::askWrite(const TRect &rect) { bool FullColorBrushTool::preLeftButtonDown() { m_modifierAssistants->drawOnly = !FullcolorAssistants; - m_inputmanager.drawPreview = false; //!m_modifierAssistants->drawOnly; - + m_inputmanager.drawPreview = false; //! m_modifierAssistants->drawOnly; + m_inputmanager.clearModifiers(); - m_inputmanager.addModifier( TInputModifierP(m_modifierTangents.getPointer()) ); - m_inputmanager.addModifier( TInputModifierP(m_modifierAssistants.getPointer()) ); - m_inputmanager.addModifier( TInputModifierP(m_modifierSegmentation.getPointer()) ); - m_inputmanager.addModifier( TInputModifierP(m_modifierTest.getPointer()) ); - + m_inputmanager.addModifier(TInputModifierP(m_modifierTangents.getPointer())); + m_inputmanager.addModifier( + TInputModifierP(m_modifierAssistants.getPointer())); + m_inputmanager.addModifier( + TInputModifierP(m_modifierSegmentation.getPointer())); +#ifndef NDEBUG + m_inputmanager.addModifier(TInputModifierP(m_modifierTest.getPointer())); +#endif + touchImage(); if (m_isFrameCreated) { @@ -312,56 +333,65 @@ bool FullColorBrushTool::preLeftButtonDown() { //--------------------------------------------------------------------------------------------------- -void FullColorBrushTool::handleMouseEvent(MouseEventType type, const TPointD &pos, const TMouseEvent &e) { +void FullColorBrushTool::handleMouseEvent(MouseEventType type, + const TPointD &pos, + const TMouseEvent &e) { TTimerTicks t = TToolTimer::ticks(); - bool alt = e.getModifiersMask() & TMouseEvent::ALT_KEY; - bool shift = e.getModifiersMask() & TMouseEvent::SHIFT_KEY; - bool control = e.getModifiersMask() & TMouseEvent::CTRL_KEY; - + bool alt = e.getModifiersMask() & TMouseEvent::ALT_KEY; + bool shift = e.getModifiersMask() & TMouseEvent::SHIFT_KEY; + bool control = e.getModifiersMask() & TMouseEvent::CTRL_KEY; + if (shift && type == ME_DOWN && e.button() == Qt::LeftButton && !m_started) { m_modifierAssistants->drawOnly = true; m_inputmanager.clearModifiers(); - m_inputmanager.addModifier( TInputModifierP(m_modifierLine.getPointer()) ); - m_inputmanager.addModifier( TInputModifierP(m_modifierAssistants.getPointer()) ); - m_inputmanager.addModifier( TInputModifierP(m_modifierSegmentation.getPointer()) ); + m_inputmanager.addModifier(TInputModifierP(m_modifierLine.getPointer())); + m_inputmanager.addModifier( + TInputModifierP(m_modifierAssistants.getPointer())); + m_inputmanager.addModifier( + TInputModifierP(m_modifierSegmentation.getPointer())); m_inputmanager.drawPreview = true; } - + if (alt != m_inputmanager.state.isKeyPressed(TKey::alt)) m_inputmanager.keyEvent(alt, TKey::alt, t, nullptr); if (shift != m_inputmanager.state.isKeyPressed(TKey::shift)) m_inputmanager.keyEvent(shift, TKey::shift, t, nullptr); if (control != m_inputmanager.state.isKeyPressed(TKey::control)) m_inputmanager.keyEvent(control, TKey::control, t, nullptr); - + if (type == ME_MOVE) { THoverList hovers(1, pos); m_inputmanager.hoverEvent(hovers); } else { - m_inputmanager.trackEvent( - e.isTablet(), 0, pos, - e.isTablet() ? &e.m_pressure : nullptr, nullptr, - type == ME_UP, t ); + m_inputmanager.trackEvent(e.isTablet(), 0, pos, + e.isTablet() ? &e.m_pressure : nullptr, nullptr, + type == ME_UP, t); m_inputmanager.processTracks(); } } //--------------------------------------------------------------------------------------------------- -void FullColorBrushTool::leftButtonDown(const TPointD &pos, const TMouseEvent &e) - { handleMouseEvent(ME_DOWN, pos, e); } -void FullColorBrushTool::leftButtonDrag(const TPointD &pos, const TMouseEvent &e) - { handleMouseEvent(ME_DRAG, pos, e); } -void FullColorBrushTool::leftButtonUp(const TPointD &pos, const TMouseEvent &e) - { handleMouseEvent(ME_UP, pos, e); } -void FullColorBrushTool::mouseMove(const TPointD &pos, const TMouseEvent &e) - { handleMouseEvent(ME_MOVE, pos, e); } +void FullColorBrushTool::leftButtonDown(const TPointD &pos, + const TMouseEvent &e) { + handleMouseEvent(ME_DOWN, pos, e); +} +void FullColorBrushTool::leftButtonDrag(const TPointD &pos, + const TMouseEvent &e) { + handleMouseEvent(ME_DRAG, pos, e); +} +void FullColorBrushTool::leftButtonUp(const TPointD &pos, + const TMouseEvent &e) { + handleMouseEvent(ME_UP, pos, e); +} +void FullColorBrushTool::mouseMove(const TPointD &pos, const TMouseEvent &e) { + handleMouseEvent(ME_MOVE, pos, e); +} //--------------------------------------------------------------------------------------------------------------- -void FullColorBrushTool::inputMouseMove( - const TPointD &position, const TInputState &state ) -{ +void FullColorBrushTool::inputMouseMove(const TPointD &position, + const TInputState &state) { struct Locals { FullColorBrushTool *m_this; @@ -390,7 +420,7 @@ void FullColorBrushTool::inputMouseMove( value.first += min; value.second += max; if (value.first > value.second) value.first = value.second; - value.first = tcrop(value.first, range.first, range.second); + value.first = tcrop(value.first, range.first, range.second); value.second = tcrop(value.second, range.first, range.second); prop.setValue(value); @@ -402,7 +432,8 @@ void FullColorBrushTool::inputMouseMove( if (x == 0.0) return; const TDoubleProperty::Range &range = prop.getRange(); - double value = tcrop(prop.getValue() + x, range.first, range.second); + double value = + tcrop(prop.getValue() + x, range.first, range.second); prop.setValue(value); notify(prop); @@ -412,9 +443,9 @@ void FullColorBrushTool::inputMouseMove( if (state.isKeyPressed(TKey::control) && state.isKeyPressed(TKey::alt)) { const TPointD &diff = position - m_mousePos; if (getBrushStyle()) { - locals.add(m_modifierSize, 0.01*diff.x); + locals.add(m_modifierSize, 0.01 * diff.x); } else { - locals.addMinMaxSeparate(m_thickness, int(diff.x/2), int(diff.y/2)); + locals.addMinMaxSeparate(m_thickness, int(diff.x / 2), int(diff.y / 2)); } } else { m_brushPos = position; @@ -431,7 +462,7 @@ void FullColorBrushTool::inputSetBusy(bool busy) { if (busy) { // begin paint TRasterImageP ri = (TRasterImageP)getImage(true); - if (!ri) ri = (TRasterImageP)touchImage(); + if (!ri) ri = (TRasterImageP)touchImage(); if (!ri) return; TRasterP ras = ri->getRaster(); @@ -472,12 +503,14 @@ void FullColorBrushTool::inputSetBusy(bool busy) { //------------------------------------------------------------------------------------------------------------- -void FullColorBrushTool::inputPaintTrackPoint(const TTrackPoint &point, const TTrack &track, bool firstTrack) { +void FullColorBrushTool::inputPaintTrackPoint(const TTrackPoint &point, + const TTrack &track, + bool firstTrack) { // get raster if (!m_started || !getViewer()) return; TRasterImageP ri = (TRasterImageP)getImage(true); if (!ri) return; - TRasterP ras = ri->getRaster(); + TRasterP ras = ri->getRaster(); TPointD rasCenter = ras->getCenterD(); // init brush @@ -489,18 +522,15 @@ void FullColorBrushTool::inputPaintTrackPoint(const TTrackPoint &point, const TT handler->brush.beginStroke(); track.toolHandler = handler; } - handler = dynamic_cast(track.toolHandler.getPointer()); + handler = dynamic_cast(track.toolHandler.getPointer()); if (!handler) return; // paint stroke m_strokeSegmentRect.empty(); - handler->brush.strokeTo( - point.position + rasCenter, - m_enabledPressure ? point.pressure : 0.5, - point.tilt, - point.time - track.previous().time ); - if (track.pointsAdded == 1 && track.finished()) - handler->brush.endStroke(); + handler->brush.strokeTo(point.position + rasCenter, + m_enabledPressure ? point.pressure : 0.5, point.tilt, + point.time - track.previous().time); + if (track.pointsAdded == 1 && track.finished()) handler->brush.endStroke(); // update affected area TRect updateRect = m_strokeSegmentRect * ras->getBounds(); @@ -509,8 +539,10 @@ void FullColorBrushTool::inputPaintTrackPoint(const TTrackPoint &point, const TT TRectD invalidateRect = convert(m_strokeSegmentRect) - rasCenter; if (firstTrack) { TPointD thickOffset(m_maxCursorThick * 0.5, m_maxCursorThick * 0.5); - invalidateRect += TRectD(m_brushPos - thickOffset, m_brushPos + thickOffset); - invalidateRect += TRectD(point.position - thickOffset, point.position + thickOffset); + invalidateRect += + TRectD(m_brushPos - thickOffset, m_brushPos + thickOffset); + invalidateRect += + TRectD(point.position - thickOffset, point.position + thickOffset); m_brushPos = m_mousePos = point.position; } invalidate(invalidateRect.enlarge(2.0)); @@ -518,8 +550,9 @@ void FullColorBrushTool::inputPaintTrackPoint(const TTrackPoint &point, const TT //------------------------------------------------------------------------------------------------------------- -void FullColorBrushTool::inputInvalidateRect(const TRectD &bounds) - { invalidate(bounds); } +void FullColorBrushTool::inputInvalidateRect(const TRectD &bounds) { + invalidate(bounds); +} //------------------------------------------------------------------------------------------------------------- @@ -577,24 +610,6 @@ void FullColorBrushTool::onLeave() { TPropertyGroup *FullColorBrushTool::getProperties(int targetType) { if (!m_presetsLoaded) initPresets(); - - bool noBrush = !getBrushStyle(); - - m_prop.clear(); - if (noBrush) { - m_prop.bind(m_thickness); - m_prop.bind(m_hardness); - m_prop.bind(m_opacity); - } else { - m_prop.bind(m_modifierSize); - m_prop.bind(m_modifierOpacity); - m_prop.bind(m_modifierEraser); - m_prop.bind(m_modifierLockAlpha); - } - m_prop.bind(m_pressure); - m_prop.bind(m_assistants); - m_prop.bind(m_preset); - return &m_prop; } @@ -700,8 +715,8 @@ void FullColorBrushTool::loadPreset() { try // Don't bother with RangeErrors { - m_thickness.setValue( - TIntPairProperty::Value(std::max((int)preset.m_min, 1), (int)preset.m_max)); + m_thickness.setValue(TIntPairProperty::Value(std::max((int)preset.m_min, 1), + (int)preset.m_max)); m_hardness.setValue(preset.m_hardness, true); m_opacity.setValue( TDoublePairProperty::Value(preset.m_opacityMin, preset.m_opacityMax)); @@ -960,7 +975,11 @@ void FullColorBrushTool::applyToonzBrushSettings(mypaint::Brush &mypaintBrush) { //========================================================================================================== FullColorBrushToolNotifier::FullColorBrushToolNotifier(FullColorBrushTool *tool) - : m_tool(tool) { + : m_tool(tool) {} + +//------------------------------------------------------------ + +void FullColorBrushToolNotifier::onActivate() { if (TTool::Application *app = m_tool->getApplication()) { if (TXshLevelHandle *levelHandle = app->getCurrentLevel()) { bool ret = connect(levelHandle, SIGNAL(xshCanvasSizeChanged()), this, @@ -968,15 +987,33 @@ FullColorBrushToolNotifier::FullColorBrushToolNotifier(FullColorBrushTool *tool) assert(ret); } if (TPaletteHandle *paletteHandle = app->getCurrentPalette()) { - bool ret; - ret = connect(paletteHandle, SIGNAL(colorStyleChanged(bool)), this, - SLOT(onColorStyleChanged())); + bool ret = connect(paletteHandle, SIGNAL(colorStyleChanged(bool)), this, + SLOT(onColorStyleChanged())); + ret = ret && connect(paletteHandle, SIGNAL(colorStyleSwitched()), this, + SLOT(onColorStyleChanged())); + ret = ret && connect(paletteHandle, SIGNAL(paletteSwitched()), this, + SLOT(onColorStyleChanged())); assert(ret); - ret = connect(paletteHandle, SIGNAL(colorStyleSwitched()), this, - SLOT(onColorStyleChanged())); + } + } +} + +//------------------------------------------------------------ + +void FullColorBrushToolNotifier::onDeactivate() { + if (TTool::Application *app = m_tool->getApplication()) { + if (TXshLevelHandle *levelHandle = app->getCurrentLevel()) { + bool ret = disconnect(levelHandle, SIGNAL(xshCanvasSizeChanged()), this, + SLOT(onCanvasSizeChanged())); assert(ret); - ret = connect(paletteHandle, SIGNAL(paletteSwitched()), this, - SLOT(onColorStyleChanged())); + } + if (TPaletteHandle *paletteHandle = app->getCurrentPalette()) { + bool ret = disconnect(paletteHandle, SIGNAL(colorStyleChanged(bool)), + this, SLOT(onColorStyleChanged())); + ret = ret && disconnect(paletteHandle, SIGNAL(colorStyleSwitched()), this, + SLOT(onColorStyleChanged())); + ret = ret && disconnect(paletteHandle, SIGNAL(paletteSwitched()), this, + SLOT(onColorStyleChanged())); assert(ret); } } diff --git a/toonz/sources/tnztools/fullcolorbrushtool.h b/toonz/sources/tnztools/fullcolorbrushtool.h index 13ca08f..239ea92 100644 --- a/toonz/sources/tnztools/fullcolorbrushtool.h +++ b/toonz/sources/tnztools/fullcolorbrushtool.h @@ -6,7 +6,9 @@ #include #include +#ifndef NDEBUG #include +#endif #include #include #include @@ -35,19 +37,18 @@ class Brush; // FullColor Brush Tool declaration //************************************************************************ -class FullColorBrushTool final : public TTool, public RasterController, public TInputHandler { +class FullColorBrushTool final : public TTool, + public RasterController, + public TInputHandler { Q_DECLARE_TR_FUNCTIONS(FullColorBrushTool) public: - class TrackHandler: public TTrackToolHandler { + class TrackHandler : public TTrackToolHandler { public: MyPaintToonzBrush brush; - TrackHandler( - const TRaster32P &ras, - RasterController &controller, - const mypaint::Brush &brush - ): - brush(ras, controller, brush) { } + TrackHandler(const TRaster32P &ras, RasterController &controller, + const mypaint::Brush &brush) + : brush(ras, controller, brush) {} }; private: @@ -76,11 +77,13 @@ public: void leftButtonUp(const TPointD &pos, const TMouseEvent &e) override; void mouseMove(const TPointD &pos, const TMouseEvent &e) override; - void inputMouseMove(const TPointD &position, const TInputState &state) override; + void inputMouseMove(const TPointD &position, + const TInputState &state) override; void inputSetBusy(bool busy) override; - void inputPaintTrackPoint(const TTrackPoint &point, const TTrack &track, bool firstTrack) override; + void inputPaintTrackPoint(const TTrackPoint &point, const TTrack &track, + bool firstTrack) override; void inputInvalidateRect(const TRectD &bounds) override; - TTool* inputGetTool() override { return this; }; + TTool *inputGetTool() override { return this; }; void draw() override; @@ -110,28 +113,31 @@ public: private: enum MouseEventType { ME_DOWN, ME_DRAG, ME_UP, ME_MOVE }; - void handleMouseEvent(MouseEventType type, const TPointD &pos, const TMouseEvent &e); - + void handleMouseEvent(MouseEventType type, const TPointD &pos, + const TMouseEvent &e); + protected: TInputManager m_inputmanager; +#ifndef NDEBUG TSmartPointerT m_modifierTest; +#endif TSmartPointerT m_modifierLine; TSmartPointerT m_modifierTangents; TSmartPointerT m_modifierAssistants; TSmartPointerT m_modifierSegmentation; - + TPropertyGroup m_prop; - TIntPairProperty m_thickness; - TBoolProperty m_pressure; + TIntPairProperty m_thickness; + TBoolProperty m_pressure; TDoublePairProperty m_opacity; - TDoubleProperty m_hardness; - TDoubleProperty m_modifierSize; - TDoubleProperty m_modifierOpacity; - TBoolProperty m_modifierEraser; - TBoolProperty m_modifierLockAlpha; - TBoolProperty m_assistants; - TEnumProperty m_preset; + TDoubleProperty m_hardness; + TDoubleProperty m_modifierSize; + TDoubleProperty m_modifierOpacity; + TBoolProperty m_modifierEraser; + TBoolProperty m_modifierLockAlpha; + TBoolProperty m_assistants; + TEnumProperty m_preset; TPixel32 m_currentColor; bool m_enabledPressure; @@ -169,6 +175,8 @@ class FullColorBrushToolNotifier final : public QObject { public: FullColorBrushToolNotifier(FullColorBrushTool *tool); + void onActivate(); + void onDeactivate(); protected slots: void onCanvasSizeChanged() { m_tool->onCanvasSizeChanged(); } diff --git a/toonz/sources/tnztools/modifiers/modifiertest.cpp b/toonz/sources/tnztools/modifiers/modifiertest.cpp index 6a4783e..2033a2b 100644 --- a/toonz/sources/tnztools/modifiers/modifiertest.cpp +++ b/toonz/sources/tnztools/modifiers/modifiertest.cpp @@ -1,4 +1,5 @@ +#ifndef NDEBUG #include @@ -9,22 +10,11 @@ // TModifierTest::Modifier implementation //***************************************************************************************** +TModifierTest::Modifier::Modifier(TTrackHandler &handler, double angle, + double radius, double speed) + : TTrackModifier(handler), angle(angle), radius(radius), speed(speed) {} -TModifierTest::Modifier::Modifier( - TTrackHandler &handler, - double angle, - double radius, - double speed -): - TTrackModifier(handler), - angle(angle), - radius(radius), - speed(speed) -{ } - - -TTrackPoint -TModifierTest::Modifier::calcPoint(double originalIndex) { +TTrackPoint TModifierTest::Modifier::calcPoint(double originalIndex) { TTrackPoint p = TTrackModifier::calcPoint(originalIndex); if (p.length > TConsts::epsilon) { @@ -33,17 +23,19 @@ TModifierTest::Modifier::calcPoint(double originalIndex) { int i1 = original.ceilIndex(originalIndex); if (i0 < 0) return p; - if (Handler *handler = dynamic_cast(&this->handler)) { - double angle = this->angle + speed*TTrack::interpolationLinear( - handler->angles[i0], handler->angles[i1], frac); - double radius = 2.0*this->radius*p.pressure; - double s = sin(angle); - double c = cos(angle); - - TPointD tangent = original.calcTangent(originalIndex, fabs(2.0*this->radius/speed)); - p.position.x -= tangent.y*s*radius; - p.position.y += tangent.x*s*radius; - p.pressure *= 1.0 - 0.5*c; + if (Handler *handler = dynamic_cast(&this->handler)) { + double angle = this->angle + speed * TTrack::interpolationLinear( + handler->angles[i0], + handler->angles[i1], frac); + double radius = 2.0 * this->radius * p.pressure; + double s = sin(angle); + double c = cos(angle); + + TPointD tangent = + original.calcTangent(originalIndex, fabs(2.0 * this->radius / speed)); + p.position.x -= tangent.y * s * radius; + p.position.y += tangent.x * s * radius; + p.pressure *= 1.0 - 0.5 * c; } } else { p.pressure = 0.0; @@ -52,103 +44,94 @@ TModifierTest::Modifier::calcPoint(double originalIndex) { return p; } - //***************************************************************************************** // TModifierTest implementation //***************************************************************************************** +TModifierTest::TModifierTest(int count, double radius) + : count(count), radius(radius) {} -TModifierTest::TModifierTest(int count, double radius): - count(count), - radius(radius) -{ } - - -void -TModifierTest::modifyTrack( - const TTrack &track, - const TInputSavePoint::Holder &savePoint, - TTrackList &outTracks ) -{ - const double segmentSize = 2.0*M_PI/10.0; +void TModifierTest::modifyTrack(const TTrack &track, + const TInputSavePoint::Holder &savePoint, + TTrackList &outTracks) { + const double segmentSize = 2.0 * M_PI / 10.0; if (!track.handler) { if (track.getKeyState(track.front().time).isPressed(TKey(Qt::Key_Alt))) { // TModifierTest::Handler for spiro track.handler = new Handler(track); - for(int i = 0; i < count; ++i) - track.handler->tracks.push_back( - new TTrack( - new Modifier( - *track.handler, - i*2.0*M_PI/(double)count, - radius, - 0.25 ))); + for (int i = 0; i < count; ++i) + track.handler->tracks.push_back(new TTrack(new Modifier( + *track.handler, i * 2.0 * M_PI / (double)count, radius, 0.25))); } } - Handler *handler = dynamic_cast(track.handler.getPointer()); + Handler *handler = dynamic_cast(track.handler.getPointer()); if (!handler) { TInputModifier::modifyTrack(track, savePoint, outTracks); return; } - outTracks.insert( - outTracks.end(), - track.handler->tracks.begin(), - track.handler->tracks.end() ); - if (!track.changed()) - return; + outTracks.insert(outTracks.end(), track.handler->tracks.begin(), + track.handler->tracks.end()); + if (!track.changed()) return; int start = track.size() - track.pointsAdded; if (start < 0) start = 0; // remove angles - double lastAngle = start < (int)handler->angles.size() ? handler->angles[start] - : handler->angles.empty() ? 0.0 - : handler->angles.back(); + double lastAngle = start < (int)handler->angles.size() + ? handler->angles[start] + : handler->angles.empty() ? 0.0 + : handler->angles.back(); handler->angles.resize(start, lastAngle); // add angles - for(int i = start; i < track.size(); ++i) { + for (int i = start; i < track.size(); ++i) { if (i > 0) { - double dl = track[i].length - track[i-1].length; + double dl = track[i].length - track[i - 1].length; double da = track[i].pressure > TConsts::epsilon - ? dl/(radius*track[i].pressure) : 0.0; - handler->angles.push_back(handler->angles[i-1] + da); + ? dl / (radius * track[i].pressure) + : 0.0; + handler->angles.push_back(handler->angles[i - 1] + da); } else { handler->angles.push_back(0.0); } } // process sub-tracks - for(TTrackList::const_iterator ti = handler->tracks.begin(); ti != handler->tracks.end(); ++ti) { - TTrack &subTrack = **ti; + for (TTrackList::const_iterator ti = handler->tracks.begin(); + ti != handler->tracks.end(); ++ti) { + TTrack &subTrack = **ti; double currentSegmentSize = segmentSize; - if (const Modifier *modifier = dynamic_cast(subTrack.modifier.getPointer())) + if (const Modifier *modifier = + dynamic_cast(subTrack.modifier.getPointer())) if (fabs(modifier->speed) > TConsts::epsilon) - currentSegmentSize = segmentSize/fabs(modifier->speed); + currentSegmentSize = segmentSize / fabs(modifier->speed); // remove points - int subStart = subTrack.floorIndex(subTrack.indexByOriginalIndex(start-1)) + 1; + int subStart = + subTrack.floorIndex(subTrack.indexByOriginalIndex(start - 1)) + 1; subTrack.truncate(subStart); // add points - for(int i = start; i < track.size(); ++i) { + for (int i = start; i < track.size(); ++i) { if (i > 0) { - double prevAngle = handler->angles[i-1]; + double prevAngle = handler->angles[i - 1]; double nextAngle = handler->angles[i]; - if (fabs(nextAngle - prevAngle) > 1.5*currentSegmentSize) { - double step = currentSegmentSize/fabs(nextAngle - prevAngle); - double end = 1.0 - 0.5*step; - for(double frac = step; frac < end; frac += step) - subTrack.push_back( subTrack.modifier->calcPoint((double)i - 1.0 + frac) ); + if (fabs(nextAngle - prevAngle) > 1.5 * currentSegmentSize) { + double step = currentSegmentSize / fabs(nextAngle - prevAngle); + double end = 1.0 - 0.5 * step; + for (double frac = step; frac < end; frac += step) + subTrack.push_back( + subTrack.modifier->calcPoint((double)i - 1.0 + frac)); } } - subTrack.push_back( subTrack.modifier->calcPoint(i) ); + subTrack.push_back(subTrack.modifier->calcPoint(i)); } } track.resetChanges(); } +#endif \ No newline at end of file diff --git a/toonz/sources/tnztools/tooloptions.cpp b/toonz/sources/tnztools/tooloptions.cpp index c9f2dd4..f268b02 100644 --- a/toonz/sources/tnztools/tooloptions.cpp +++ b/toonz/sources/tnztools/tooloptions.cpp @@ -1953,11 +1953,53 @@ BrushToolOptionsBox::BrushToolOptionsBox(QWidget *parent, TTool *tool, TStroke::OutlineOptions::MITER_JOIN); } hLayout()->addStretch(1); + filterControls(); +} + +//----------------------------------------------------------------------------- + +void BrushToolOptionsBox::filterControls() { + // show or hide widgets which modify imported brush (mypaint) + + bool showModifiers = false; + if (m_tool->getTargetType() & TTool::RasterImage) { + FullColorBrushTool *fullColorBrushTool = + dynamic_cast(m_tool); + showModifiers = fullColorBrushTool->getBrushStyle(); + } else if (m_tool->getTargetType() & TTool::ToonzImage) { + ToonzRasterBrushTool *toonzRasterBrushTool = + dynamic_cast(m_tool); + showModifiers = toonzRasterBrushTool->isMyPaintStyleSelected(); + } else { // (m_tool->getTargetType() & TTool::Vectors) + m_snapSensitivityCombo->setHidden(!m_snapCheckbox->isChecked()); + return; + } + + for (QMap::iterator it = m_labels.begin(); + it != m_labels.end(); it++) { + bool isModifier = (it.key().substr(0, 8) == "Modifier"); + bool isCommon = (it.key() == "Lock Alpha" || it.key() == "Pressure" || + it.key() == "Assistants" || it.key() == "Preset:"); + bool visible = isCommon || (isModifier == showModifiers); + it.value()->setVisible(visible); + } + + for (QMap::iterator it = m_controls.begin(); + it != m_controls.end(); it++) { + bool isModifier = (it.key().substr(0, 8) == "Modifier"); + bool isCommon = (it.key() == "Lock Alpha" || it.key() == "Pressure" || + it.key() == "Assistants" || it.key() == "Preset:"); + bool visible = isCommon || (isModifier == showModifiers); + if (QWidget *widget = dynamic_cast(it.value())) + widget->setVisible(visible); + } } //----------------------------------------------------------------------------- void BrushToolOptionsBox::updateStatus() { + filterControls(); + QMap::iterator it; for (it = m_controls.begin(); it != m_controls.end(); it++) it.value()->updateStatus(); @@ -2804,23 +2846,16 @@ ToolOptions::~ToolOptions() {} void ToolOptions::showEvent(QShowEvent *) { TTool::Application *app = TTool::getApplication(); - if (ToolHandle *currTool = app->getCurrentTool()) - currTool->disconnect(this); - if (TObjectHandle *currObject = app->getCurrentObject()) - currObject->disconnect(this); - if (TXshLevelHandle *currLevel = app->getCurrentLevel()) - currLevel->disconnect(this); - if (ToolHandle *currTool = app->getCurrentTool()) { currTool->disconnect(this); onToolSwitched(); connect(currTool, SIGNAL(toolSwitched()), SLOT(onToolSwitched())); - connect(currTool, SIGNAL(toolOptionsBoxChanged()), SLOT(onToolOptionsBoxChanged())); + connect(currTool, SIGNAL(toolOptionsBoxChanged()), + SLOT(onToolOptionsBoxChanged())); connect(currTool, SIGNAL(toolChanged()), SLOT(onToolChanged())); } if (TObjectHandle *currObject = app->getCurrentObject()) { - currObject->disconnect(this); onStageObjectChange(); connect(currObject, SIGNAL(objectSwitched()), SLOT(onStageObjectChange())); connect(currObject, SIGNAL(objectChanged(bool)), @@ -2848,7 +2883,7 @@ void ToolOptions::hideEvent(QShowEvent *) { } //----------------------------------------------------------------------------- - +// used for altering assistant tool options void ToolOptions::onToolOptionsBoxChanged() { TTool *tool = TTool::getApplication()->getCurrentTool()->getTool(); std::map::iterator it = m_panels.find(tool); diff --git a/toonz/sources/toonz/sceneviewerevents.cpp b/toonz/sources/toonz/sceneviewerevents.cpp index 43f0d00..fd8d085 100644 --- a/toonz/sources/toonz/sceneviewerevents.cpp +++ b/toonz/sources/toonz/sceneviewerevents.cpp @@ -344,10 +344,20 @@ void SceneViewer::tabletEvent(QTabletEvent *e) { #endif } break; case QEvent::TabletMove: { +#ifdef MACOSX + // for now OSX seems to fail to call enter/leaveEvent properly while + // the tablet is floating bool isHoveringInsideViewer = !rect().marginsRemoved(QMargins(5, 5, 5, 5)).contains(e->pos()); // call the fake enter event if (isHoveringInsideViewer) onEnter(); +#else + // for Windowsm, use tabletEvent only for the left Button + if (m_tabletState != StartStroke && m_tabletState != OnStroke) { + m_tabletEvent = false; + break; + } +#endif QPointF curPos = e->posF() * getDevPixRatio(); #if defined(_WIN32) && QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)