diff --git a/toonz/sources/include/tools/cursors.h b/toonz/sources/include/tools/cursors.h index b156997..a741def 100644 --- a/toonz/sources/include/tools/cursors.h +++ b/toonz/sources/include/tools/cursors.h @@ -99,6 +99,7 @@ enum { Ex_Precise = 0x200000, Ex_Prev = 0x400000, Ex_Next = 0x800000, + Ex_FreePick = 0x1000000, // This section is for cursors that have fixed text that needs to // be handled separately when flipping for left-handed cursors. diff --git a/toonz/sources/tnztools/Resources/ex_freepick.png b/toonz/sources/tnztools/Resources/ex_freepick.png new file mode 100644 index 0000000..b47c3ca Binary files /dev/null and b/toonz/sources/tnztools/Resources/ex_freepick.png differ diff --git a/toonz/sources/tnztools/Resources/ex_freepick_left.png b/toonz/sources/tnztools/Resources/ex_freepick_left.png new file mode 100644 index 0000000..3aabc35 Binary files /dev/null and b/toonz/sources/tnztools/Resources/ex_freepick_left.png differ diff --git a/toonz/sources/tnztools/cursormanager.cpp b/toonz/sources/tnztools/cursormanager.cpp index 24531fa..4d08188 100644 --- a/toonz/sources/tnztools/cursormanager.cpp +++ b/toonz/sources/tnztools/cursormanager.cpp @@ -119,6 +119,7 @@ const struct { {ToolCursor::Ex_Precise, "ex_precise"}, {ToolCursor::Ex_Prev, "ex_prev"}, {ToolCursor::Ex_Next, "ex_next"}, + {ToolCursor::Ex_FreePick, "ex_freepick"}, {0, 0}}; }; // namespace diff --git a/toonz/sources/tnztools/filltool.cpp b/toonz/sources/tnztools/filltool.cpp index ee942be..2b6d78f 100644 --- a/toonz/sources/tnztools/filltool.cpp +++ b/toonz/sources/tnztools/filltool.cpp @@ -58,6 +58,7 @@ using namespace ToolUtils; #define RECTFILL L"Rectangular" #define FREEHANDFILL L"Freehand" #define POLYLINEFILL L"Polyline" +#define FREEPICKFILL L"Freepick" TEnv::IntVar MinFillDepth("InknpaintMinFillDepth", 0); TEnv::IntVar MaxFillDepth("InknpaintMaxFillDepth", 10); @@ -1229,7 +1230,8 @@ void AreaFillTool::draw() { drawRect(m_firstRect, color, 0x3F33, true); if (m_selecting || (m_frameRange && !m_firstFrameSelected)) drawRect(m_selectingRect, color, 0xFFFF, true); - } else if ((m_type == FREEHAND || m_type == POLYLINE) && m_frameRange) { + } else if ((m_type == FREEHAND || m_type == POLYLINE || m_type == FREEPICK) && + m_frameRange) { tglColor(color); if (m_firstStroke) drawStrokeCenterline(*m_firstStroke, 1); } @@ -1243,7 +1245,7 @@ void AreaFillTool::draw() { tglVertex(m_mousePosition); glEnd(); glPopMatrix(); - } else if (m_type == FREEHAND && !m_track.isEmpty()) { + } else if ((m_type == FREEHAND || m_type == FREEPICK) && !m_track.isEmpty()) { tglColor(TPixel::Red); glPushMatrix(); m_track.drawAllFragments(); @@ -1251,6 +1253,36 @@ void AreaFillTool::draw() { } } +int AreaFillTool::pick(const TImageP &image, const TPointD &pos, + const int frame, int mode) { + TToonzImageP ti = image; + TVectorImageP vi = image; + if (!ti && !vi) return 0; + + TTool::Viewer *viewer = m_parent->getViewer(); + + StylePicker picker(viewer->viewerWidget(), image); + double scale2 = 1.0; + if (vi) { + TAffine aff = + viewer->getViewMatrix() * m_parent->getCurrentColumnMatrix(frame); + scale2 = aff.det(); + } + TPointD pickPos = pos; + // in case that the column is animated in scene-editing mode + if (frame > 0) { + TPointD dpiScale = viewer->getDpiScale(); + pickPos.x *= dpiScale.x; + pickPos.y *= dpiScale.y; + TPointD worldPos = m_parent->getCurrentColumnMatrix() * pickPos; + pickPos = m_parent->getCurrentColumnMatrix(frame).inv() * worldPos; + pickPos.x /= dpiScale.x; + pickPos.y /= dpiScale.y; + } + // thin stroke can be picked with 10 pixel range + return picker.pickStyleId(pickPos, 10.0, scale2, mode); +} + void AreaFillTool::resetMulti() { m_firstFrameSelected = false; m_firstRect.empty(); @@ -1265,7 +1297,7 @@ void AreaFillTool::resetMulti() { } } -void AreaFillTool::leftButtonDown(const TPointD &pos, const TMouseEvent &, +void AreaFillTool::leftButtonDown(const TPointD &pos, const TMouseEvent &e, TImage *img) { TVectorImageP vi = TImageP(img); TToonzImageP ti = TToonzImageP(img); @@ -1275,13 +1307,23 @@ void AreaFillTool::leftButtonDown(const TPointD &pos, const TMouseEvent &, return; } + if (m_type == FREEPICK) { + TTool::Application *app = TTool::getApplication(); + if (!app) return; + + int fllmode = e.isCtrlPressed() ? 2 : 0; // Line+Area : Area + int styleId = pick(img, pos, -1, fllmode); + if (!m_isLeftButtonPressed) m_bckStyleId = app->getCurrentLevelStyleIndex(); + app->setCurrentLevelStyleIndex(styleId); + } + m_selecting = true; if (m_type == RECT) { m_selectingRect.x0 = pos.x; m_selectingRect.y0 = pos.y; m_selectingRect.x1 = pos.x + 1; m_selectingRect.y1 = pos.y + 1; - } else if (m_type == FREEHAND || m_type == POLYLINE) { + } else if (m_type == FREEHAND || m_type == POLYLINE || m_type == FREEPICK) { int col = TTool::getApplication()->getCurrentColumn()->getColumnIndex(); m_isPath = TTool::getApplication() ->getCurrentObject() @@ -1389,7 +1431,7 @@ void AreaFillTool::leftButtonDrag(const TPointD &pos, const TMouseEvent &e) { m_selectingRect.x1 = pos.x; m_selectingRect.y1 = pos.y; m_parent->invalidate(); - } else if (m_type == FREEHAND) { + } else if (m_type == FREEHAND || m_type == FREEPICK) { if (!m_enabled || !m_active) return; double pixelSize2 = m_parent->getPixelSize() * m_parent->getPixelSize(); @@ -1463,7 +1505,7 @@ void AreaFillTool::leftButtonUp(const TPointD &pos, const TMouseEvent &e) { TTool *t = app->getCurrentTool()->getTool(); if (t) t->notifyImageChanged(); } - } else if (m_type == FREEHAND) { + } else if (m_type == FREEHAND || m_type == FREEPICK) { #if defined(MACOSX) // m_parent->m_viewer->enableRedraw(true); #endif @@ -1527,6 +1569,8 @@ void AreaFillTool::leftButtonUp(const TPointD &pos, const TMouseEvent &e) { m_parent->invalidate(); } } + + if (m_type == FREEPICK) app->setCurrentLevelStyleIndex(m_bckStyleId); } void AreaFillTool::onImageChanged() { @@ -1544,7 +1588,7 @@ void AreaFillTool::onImageChanged() { // stato iniziale else { // cambio stato. m_firstFrameSelected = true; - if (m_type != FREEHAND && m_type != POLYLINE) { + if (m_type != FREEHAND && m_type != POLYLINE && m_type != FREEPICK) { assert(!m_selectingRect.isEmpty()); m_firstRect = m_selectingRect; } @@ -1740,6 +1784,7 @@ FillTool::FillTool(int targetType) m_fillType.addValue(RECTFILL); m_fillType.addValue(FREEHANDFILL); m_fillType.addValue(POLYLINEFILL); + m_fillType.addValue(FREEPICKFILL); m_prop.bind(m_colorType); m_colorType.addValue(LINES); @@ -1784,6 +1829,8 @@ int FillTool::getCursorId() const { ret = ret | ToolCursor::Ex_PolyLine; else if (m_fillType.getValue() == RECTFILL) ret = ret | ToolCursor::Ex_Rectangle; + if (m_fillType.getValue() == FREEPICKFILL) + ret = ret | ToolCursor::Ex_FreePick; if (ToonzCheck::instance()->getChecks() & ToonzCheck::eBlackBg) ret = ret | ToolCursor::Ex_Negate; @@ -1800,6 +1847,7 @@ void FillTool::updateTranslation() { m_fillType.setItemUIName(RECTFILL, tr("Rectangular")); m_fillType.setItemUIName(FREEHANDFILL, tr("Freehand")); m_fillType.setItemUIName(POLYLINEFILL, tr("Polyline")); + m_fillType.setItemUIName(FREEPICKFILL, tr("Pick+Freehand")); m_selective.setQStringName(tr("Selective")); @@ -2090,6 +2138,8 @@ bool FillTool::onPropertyChanged(std::string propertyName) { type = AreaFillTool::FREEHAND; else if (m_fillType.getValue() == POLYLINEFILL) type = AreaFillTool::POLYLINE; + else if (m_fillType.getValue() == FREEPICKFILL) + type = AreaFillTool::FREEPICK; else assert(false); @@ -2294,6 +2344,8 @@ void FillTool::onActivate() { type = AreaFillTool::FREEHAND; else if (m_fillType.getValue() == POLYLINEFILL) type = AreaFillTool::POLYLINE; + else if (m_fillType.getValue() == FREEPICKFILL) + type = AreaFillTool::FREEPICK; else assert(false); diff --git a/toonz/sources/tnztools/filltool.h b/toonz/sources/tnztools/filltool.h index 32342b7..80bdd67 100644 --- a/toonz/sources/tnztools/filltool.h +++ b/toonz/sources/tnztools/filltool.h @@ -24,7 +24,7 @@ class NormalLineFillTool; namespace { class AreaFillTool { public: - enum Type { RECT, FREEHAND, POLYLINE }; + enum Type { RECT, FREEHAND, POLYLINE, FREEPICK }; private: bool m_frameRange; @@ -54,9 +54,12 @@ private: bool m_isLeftButtonPressed; bool m_autopaintLines; + int m_bckStyleId; + public: AreaFillTool(TTool *Parent); void draw(); + int pick(const TImageP &image, const TPointD &pos, const int frame, int mode); void resetMulti(); void leftButtonDown(const TPointD &pos, const TMouseEvent &, TImage *img); void leftButtonDoubleClick(const TPointD &pos, const TMouseEvent &e); diff --git a/toonz/sources/tnztools/tnztools.qrc b/toonz/sources/tnztools/tnztools.qrc index 7370ccc..e333b83 100644 --- a/toonz/sources/tnztools/tnztools.qrc +++ b/toonz/sources/tnztools/tnztools.qrc @@ -1,5 +1,5 @@ <RCC> - <qresource prefix="/" > + <qresource prefix="/" > <file>Resources/brush.png</file> <file>Resources/bender.png</file> <file>Resources/cutter.png</file> @@ -33,59 +33,61 @@ <file>Resources/selection_add.png</file> <file>Resources/selection_convert.png</file> <file>Resources/selection_distort.png</file> - <file>Resources/move_ew.png</file> - <file>Resources/move_ns.png</file> - <file>Resources/disable.png</file> - <file>Resources/move_z.png</file> - <file>Resources/picker_style_line.png</file> - <file>Resources/picker_style_area.png</file> - <file>Resources/picker_style.png</file> - <file>Resources/scale_global.png</file> - <file>Resources/scale_hv.png</file> - <file>Resources/normaleraser.png</file> - <file>Resources/recteraser.png</file> - <file>Resources/picker_style_organize.png</file> - <file>Resources/picker_rgb.png</file> - <file>Resources/picker_rgb_white.png</file> - <file>Resources/pointing_hand.png</file> - <file>Resources/karasu.png</file> - <file>Resources/ruler_modify.png</file> - <file>Resources/ruler_new.png</file> - <file>Resources/ex_freehand.png</file> - <file>Resources/ex_freehand_left.png</file> - <file>Resources/ex_polyline.png</file> - <file>Resources/ex_polyline_left.png</file> - <file>Resources/ex_rectangle.png</file> - <file>Resources/ex_rectangle_left.png</file> - <file>Resources/ex_line.png</file> - <file>Resources/ex_line_left.png</file> - <file>Resources/ex_area.png</file> - <file>Resources/ex_area_left.png</file> - <file>Resources/ex_fill_no_autopaint.png</file> - <file>Resources/ex_fill_no_autopaint_left.png</file> - <file>Resources/edit_FX_notext.png</file> - <file>Resources/move_z_notext.png</file> - <file>Resources/scale_hv_notext.png</file> - <file>Resources/ex_FX.png</file> - <file>Resources/ex_FX_left.png</file> - <file>Resources/ex_hv.png</file> - <file>Resources/ex_hv_left.png</file> - <file>Resources/ex_rgb.png</file> - <file>Resources/ex_rgb_left.png</file> - <file>Resources/ex_style_area.png</file> - <file>Resources/ex_style_area_left.png</file> - <file>Resources/ex_style_line.png</file> - <file>Resources/ex_style_line_left.png</file> - <file>Resources/ex_z.png</file> - <file>Resources/ex_z_left.png</file> - <file>Resources/ex_precise.png</file> - <file>Resources/ex_precise_left.png</file> - <file>Resources/brush_large.png</file> - <file>Resources/brush_crosshair.png</file> - <file>Resources/tracker.png</file> - <file>Resources/ex_prev.png</file> - <file>Resources/ex_prev_left.png</file> - <file>Resources/ex_next.png</file> - <file>Resources/ex_next_left.png</file> - </qresource> + <file>Resources/move_ew.png</file> + <file>Resources/move_ns.png</file> + <file>Resources/disable.png</file> + <file>Resources/move_z.png</file> + <file>Resources/picker_style_line.png</file> + <file>Resources/picker_style_area.png</file> + <file>Resources/picker_style.png</file> + <file>Resources/scale_global.png</file> + <file>Resources/scale_hv.png</file> + <file>Resources/normaleraser.png</file> + <file>Resources/recteraser.png</file> + <file>Resources/picker_style_organize.png</file> + <file>Resources/picker_rgb.png</file> + <file>Resources/picker_rgb_white.png</file> + <file>Resources/pointing_hand.png</file> + <file>Resources/karasu.png</file> + <file>Resources/ruler_modify.png</file> + <file>Resources/ruler_new.png</file> + <file>Resources/ex_freehand.png</file> + <file>Resources/ex_freehand_left.png</file> + <file>Resources/ex_freepick.png</file> + <file>Resources/ex_freepick_left.png</file> + <file>Resources/ex_polyline.png</file> + <file>Resources/ex_polyline_left.png</file> + <file>Resources/ex_rectangle.png</file> + <file>Resources/ex_rectangle_left.png</file> + <file>Resources/ex_line.png</file> + <file>Resources/ex_line_left.png</file> + <file>Resources/ex_area.png</file> + <file>Resources/ex_area_left.png</file> + <file>Resources/ex_fill_no_autopaint.png</file> + <file>Resources/ex_fill_no_autopaint_left.png</file> + <file>Resources/edit_FX_notext.png</file> + <file>Resources/move_z_notext.png</file> + <file>Resources/scale_hv_notext.png</file> + <file>Resources/ex_FX.png</file> + <file>Resources/ex_FX_left.png</file> + <file>Resources/ex_hv.png</file> + <file>Resources/ex_hv_left.png</file> + <file>Resources/ex_rgb.png</file> + <file>Resources/ex_rgb_left.png</file> + <file>Resources/ex_style_area.png</file> + <file>Resources/ex_style_area_left.png</file> + <file>Resources/ex_style_line.png</file> + <file>Resources/ex_style_line_left.png</file> + <file>Resources/ex_z.png</file> + <file>Resources/ex_z_left.png</file> + <file>Resources/ex_precise.png</file> + <file>Resources/ex_precise_left.png</file> + <file>Resources/brush_large.png</file> + <file>Resources/brush_crosshair.png</file> + <file>Resources/tracker.png</file> + <file>Resources/ex_prev.png</file> + <file>Resources/ex_prev_left.png</file> + <file>Resources/ex_next.png</file> + <file>Resources/ex_next_left.png</file> + </qresource> </RCC> \ No newline at end of file diff --git a/toonz/sources/toonz/icons/dark/actions/20/type_pickerlasso.svg b/toonz/sources/toonz/icons/dark/actions/20/type_pickerlasso.svg new file mode 100644 index 0000000..412ea70 --- /dev/null +++ b/toonz/sources/toonz/icons/dark/actions/20/type_pickerlasso.svg @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="20px" height="20px" clip-rule="evenodd" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="1.5" version="1.1" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"> + <g transform="translate(-10 -40)"> + <g id="type_freehand"> + <g transform="translate(0 30)"> + <rect x="10" y="10" width="20" height="20" fill-opacity="0"/> + </g> + <g transform="matrix(.88271 0 0 .8265 10.313 40.592)"> + <path d="m4.177 21.062s1.8468-0.57385 2.2658-2.4198c0.479-2.111-0.5638-3.0479-2.9428-5.1419-0.321-0.283-0.556-0.624-0.722-1.002-0.86-1.969 0.171-4.941 0.749-5.899 0.531-0.88 1.904-3.161 5.157-4.015 2.919-0.766 7.9547-0.88103 10.22 3.9587" fill="none" stroke="#000" stroke-width="1px"/> + </g> + <g transform="matrix(.88271 0 0 1.1237 11.083 35.081)"> + <ellipse cx="5.534" cy="16.339" rx="3.034" ry="1.839" fill="none" stroke="#000" stroke-width=".84px"/> + </g> + <g transform="translate(2.2793e-10 30)"> + <path d="m25 29.5c0 0.133 0.053 0.26 0.146 0.354 0.094 0.093 0.221 0.146 0.354 0.146h2.5c1.105 0 2-0.895 2-2v-2.5c0-0.133-0.053-0.26-0.146-0.354-0.094-0.093-0.221-0.146-0.354-0.146s-0.26 0.053-0.354 0.146c-0.093 0.094-0.146 0.221-0.146 0.354v2.5c0 0.265-0.105 0.52-0.293 0.707-0.187 0.188-0.442 0.293-0.707 0.293h-2.5c-0.133 0-0.26 0.053-0.354 0.146-0.093 0.094-0.146 0.221-0.146 0.354zm-14.5-4.5c-0.133 0-0.26 0.053-0.354 0.146-0.093 0.094-0.146 0.221-0.146 0.354v2.5c0 1.105 0.895 2 2 2h2.5c0.133 0 0.26-0.053 0.354-0.146 0.093-0.094 0.146-0.221 0.146-0.354s-0.053-0.26-0.146-0.354c-0.094-0.093-0.221-0.146-0.354-0.146h-2.5c-0.265 0-0.52-0.105-0.707-0.293-0.188-0.187-0.293-0.442-0.293-0.707v-2.5c0-0.133-0.053-0.26-0.146-0.354-0.094-0.093-0.221-0.146-0.354-0.146zm19-10c0.133 0 0.26-0.053 0.354-0.146 0.093-0.094 0.146-0.221 0.146-0.354v-2.5c0-1.105-0.895-2-2-2h-2.5c-0.133 0-0.26 0.053-0.354 0.146-0.093 0.094-0.146 0.221-0.146 0.354s0.053 0.26 0.146 0.354c0.094 0.093 0.221 0.146 0.354 0.146h2.5c0.265 0 0.52 0.105 0.707 0.293 0.188 0.187 0.293 0.442 0.293 0.707v2.5c0 0.133 0.053 0.26 0.146 0.354 0.094 0.093 0.221 0.146 0.354 0.146zm-14.5-4.5c0-0.133-0.053-0.26-0.146-0.354-0.094-0.093-0.221-0.146-0.354-0.146h-2.5c-1.105 0-2 0.895-2 2v2.5c0 0.133 0.053 0.26 0.146 0.354 0.094 0.093 0.221 0.146 0.354 0.146s0.26-0.053 0.354-0.146c0.093-0.094 0.146-0.221 0.146-0.354v-2.5c0-0.265 0.105-0.52 0.293-0.707 0.187-0.188 0.442-0.293 0.707-0.293h2.5c0.133 0 0.26-0.053 0.354-0.146 0.093-0.094 0.146-0.221 0.146-0.354z"/> + </g><g transform="matrix(.66599 0 0 .66599 15.668 45.668)" clip-rule="evenodd" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2"> + <path d="m11.306 7.176-1.049-1.049 2.116-2.115 1.402 1.402 2.829-2.828c0.78-0.781 2.047-0.781 2.828 0 0.781 0.78 0.781 2.047 0 2.828l-2.828 2.828 1.414 1.415-2.116 2.115-1.06-1.06-8.528 8.528c-0.993 0.992-2.601 0.992-3.593 0-1e-3 0-1e-3 -1e-3 -2e-3 -1e-3 -0.959-0.96-0.96-2.516 1e-3 -3.477zm0.707 0.707-8.586 8.587c-0.569 0.569-0.569 1.491 0 2.061 1e-3 0 1e-3 1e-3 2e-3 1e-3 0.601 0.602 1.576 0.602 2.177 1e-3l8.528-8.528z"/> + </g> + </g> + </g> +</svg> diff --git a/toonz/sources/toonz/mainwindow.cpp b/toonz/sources/toonz/mainwindow.cpp index 0c6712a..12e90d6 100644 --- a/toonz/sources/toonz/mainwindow.cpp +++ b/toonz/sources/toonz/mainwindow.cpp @@ -2484,6 +2484,8 @@ void MainWindow::defineActions() { ToolCommandType, "fill_freehand"); createAction(MI_FillPolyline, QT_TR_NOOP("Fill Tool - Polyline"), "", ToolCommandType, "fill_polyline"); + createAction(MI_FillFreepick, QT_TR_NOOP("Fill Tool - Pick+Freehand"), "", + ToolCommandType, "fill_freepick"); createAction(MI_FillNextMode, QT_TR_NOOP("Fill Tool - Next Mode"), "", ToolCommandType); createAction(MI_FillAreas, QT_TR_NOOP("Fill Tool - Areas"), "", @@ -2710,6 +2712,11 @@ void MainWindow::defineActions() { menuAct = createToolOptionsAction("A_ToolOption_Type:Polyline", QT_TR_NOOP("Type - Polyline"), ""); menuAct->setIcon(createQIcon("type_polyline")); + + menuAct = createToolOptionsAction("A_ToolOption_Type:Freepick", + QT_TR_NOOP("Type - Pick+Freehand"), ""); + menuAct->setIcon(createQIcon("type_pickerlasso")); + menuAct = createToolOptionsAction("A_ToolOption_Type:Segment", QT_TR_NOOP("Type - Segment"), ""); menuAct->setIcon(createQIcon("type_erase_segment")); diff --git a/toonz/sources/toonz/menubarcommandids.h b/toonz/sources/toonz/menubarcommandids.h index ccc43ac..11ee0b3 100644 --- a/toonz/sources/toonz/menubarcommandids.h +++ b/toonz/sources/toonz/menubarcommandids.h @@ -364,6 +364,7 @@ #define MI_FillRectangular "MI_FillRectangular" #define MI_FillFreehand "MI_FillFreehand" #define MI_FillPolyline "MI_FillPolyline" +#define MI_FillFreepick "MI_FillFreepick" #define MI_FillNextMode "MI_FillNextMode" #define MI_FillAreas "MI_FillAreas" #define MI_FillLines "MI_FillLines" diff --git a/toonz/sources/toonz/tooloptionsshortcutinvoker.cpp b/toonz/sources/toonz/tooloptionsshortcutinvoker.cpp index f181fe9..e3fd0b9 100644 --- a/toonz/sources/toonz/tooloptionsshortcutinvoker.cpp +++ b/toonz/sources/toonz/tooloptionsshortcutinvoker.cpp @@ -492,6 +492,8 @@ void ToolOptionsShortcutInvoker::initialize() { &ToolOptionsShortcutInvoker::toggleFillFreehand); setCommandHandler(MI_FillPolyline, this, &ToolOptionsShortcutInvoker::toggleFillPolyline); + setCommandHandler(MI_FillFreepick, this, + &ToolOptionsShortcutInvoker::toggleFillFreepick); setCommandHandler(MI_FillNextMode, this, &ToolOptionsShortcutInvoker::toggleFillNextMode); setCommandHandler(MI_FillAreas, this, @@ -850,6 +852,14 @@ void ToolOptionsShortcutInvoker::toggleFillPolyline() { ->trigger(); } +void ToolOptionsShortcutInvoker::toggleFillFreepick() { + CommandManager::instance()->getAction(T_Fill)->trigger(); + CommandManager::instance()->getAction("A_ToolOption_Type:Normal")->trigger(); + CommandManager::instance() + ->getAction("A_ToolOption_Type:Freepick") + ->trigger(); +} + void ToolOptionsShortcutInvoker::toggleFillNextMode() { if (TApp::instance()->getCurrentTool()->getTool()->getName() == T_Fill) CommandManager::instance()->getAction("A_ToolOption_Mode")->trigger(); diff --git a/toonz/sources/toonz/tooloptionsshortcutinvoker.h b/toonz/sources/toonz/tooloptionsshortcutinvoker.h index f372e1d..2c83a02 100644 --- a/toonz/sources/toonz/tooloptionsshortcutinvoker.h +++ b/toonz/sources/toonz/tooloptionsshortcutinvoker.h @@ -196,6 +196,7 @@ protected slots: void toggleFillRectangular(); void toggleFillFreehand(); void toggleFillPolyline(); + void toggleFillFreepick(); void toggleFillNextMode(); void toggleFillAreas(); void toggleFillLines(); diff --git a/toonz/sources/toonz/toonz.qrc b/toonz/sources/toonz/toonz.qrc index efa8e8a..264cc31 100644 --- a/toonz/sources/toonz/toonz.qrc +++ b/toonz/sources/toonz/toonz.qrc @@ -418,6 +418,7 @@ <file>icons/dark/actions/20/selection_freehand.svg</file> <file>icons/dark/actions/20/type_lasso.svg</file> + <file>icons/dark/actions/20/type_pickerlasso.svg</file> <file>icons/dark/actions/20/type_rectangular.svg</file> <file>icons/dark/actions/20/type_polyline.svg</file> <file>icons/dark/actions/20/type_normal.svg</file> diff --git a/toonz/sources/toonzlib/fillutil.cpp b/toonz/sources/toonzlib/fillutil.cpp index 523098f..f4e66ce 100644 --- a/toonz/sources/toonzlib/fillutil.cpp +++ b/toonz/sources/toonzlib/fillutil.cpp @@ -149,7 +149,7 @@ void fillautoInks(TRasterCM32P &rin, TRect &rect, const TRasterCM32P &rbefore, int paint = pix->getPaint(); int tone = pix->getTone(); int ink = pix->getInk(); - if (paint != pixb->getPaint() && tone > 0 && tone < 255 && ink != paint && + if (paint != pixb->getPaint() && ink != paint && plt->getStyle(ink)->getFlags() != 0) inkFill(rin, TPoint(j, i) + rect.getP00(), paint, 0, NULL, &rect); }