From 0c66191ab393d84bf043d182a2f1ccf359863f56 Mon Sep 17 00:00:00 2001 From: twanvl Date: Fri, 16 Feb 2007 00:07:14 +0000 Subject: [PATCH] Changed all resources to .png files; Added 'snap to grid' to symbol editor git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@207 0fc631ac-6414-0410-93d0-97cfa31319b6 --- src/data/action/symbol.cpp | 36 +++++-- src/data/action/symbol.hpp | 9 +- src/data/action/symbol_part.cpp | 70 ++++++++++--- src/data/action/symbol_part.hpp | 24 ++++- src/data/format/image_to_symbol.cpp | 6 +- src/data/settings.cpp | 6 ++ src/data/settings.hpp | 5 + src/gui/control/gallery_list.cpp | 4 +- src/gui/symbol/basic_shape_editor.cpp | 6 +- src/gui/symbol/control.cpp | 41 +++++++- src/gui/symbol/point_editor.cpp | 21 +++- src/gui/symbol/select_editor.cpp | 106 +++++++++++++------- src/gui/symbol/select_editor.hpp | 2 + src/gui/symbol/window.cpp | 3 + src/gui/util.cpp | 2 +- src/gui/util.hpp | 2 - src/render/symbol/viewer.cpp | 2 +- src/resource/msw/mse.rc | 96 +++++++++--------- src/resource/msw/tool/apply.bmp | Bin 310 -> 0 bytes src/resource/msw/tool/apply.png | Bin 0 -> 315 bytes src/resource/msw/tool/bold.bmp | Bin 246 -> 0 bytes src/resource/msw/tool/bold.png | Bin 0 -> 113 bytes src/resource/msw/tool/card_add.bmp | Bin 822 -> 0 bytes src/resource/msw/tool/card_add.png | Bin 0 -> 284 bytes src/resource/msw/tool/card_add_multiple.bmp | Bin 822 -> 0 bytes src/resource/msw/tool/card_add_multiple.png | Bin 0 -> 383 bytes src/resource/msw/tool/card_del.bmp | Bin 822 -> 0 bytes src/resource/msw/tool/card_del.png | Bin 0 -> 288 bytes src/resource/msw/tool/card_rotate.bmp | Bin 822 -> 0 bytes src/resource/msw/tool/card_rotate.png | Bin 0 -> 264 bytes src/resource/msw/tool/card_rotate_0.bmp | Bin 822 -> 0 bytes src/resource/msw/tool/card_rotate_0.png | Bin 0 -> 270 bytes src/resource/msw/tool/card_rotate_180.bmp | Bin 822 -> 0 bytes src/resource/msw/tool/card_rotate_180.png | Bin 0 -> 342 bytes src/resource/msw/tool/card_rotate_270.bmp | Bin 822 -> 0 bytes src/resource/msw/tool/card_rotate_270.png | Bin 0 -> 322 bytes src/resource/msw/tool/card_rotate_90.bmp | Bin 822 -> 0 bytes src/resource/msw/tool/card_rotate_90.png | Bin 0 -> 331 bytes src/resource/msw/tool/circle.bmp | Bin 246 -> 0 bytes src/resource/msw/tool/circle.png | Bin 0 -> 173 bytes src/resource/msw/tool/copy.bmp | Bin 246 -> 0 bytes src/resource/msw/tool/copy.png | Bin 0 -> 205 bytes src/resource/msw/tool/curve.bmp | Bin 246 -> 0 bytes src/resource/msw/tool/curve.png | Bin 0 -> 145 bytes src/resource/msw/tool/cut.bmp | Bin 246 -> 0 bytes src/resource/msw/tool/cut.png | Bin 0 -> 141 bytes src/resource/msw/tool/duplicate.bmp | Bin 822 -> 0 bytes src/resource/msw/tool/duplicate.png | Bin 0 -> 163 bytes src/resource/msw/tool/find.bmp | Bin 246 -> 0 bytes src/resource/msw/tool/find.png | Bin 0 -> 150 bytes src/resource/msw/tool/grid.png | Bin 0 -> 122 bytes src/resource/msw/tool/grid_snap.png | Bin 0 -> 222 bytes src/resource/msw/tool/help.bmp | Bin 334 -> 0 bytes src/resource/msw/tool/help.png | Bin 0 -> 178 bytes src/resource/msw/tool/italic.bmp | Bin 246 -> 0 bytes src/resource/msw/tool/italic.png | Bin 0 -> 132 bytes src/resource/msw/tool/keyword_add.bmp | Bin 822 -> 0 bytes src/resource/msw/tool/keyword_add.png | Bin 0 -> 253 bytes src/resource/msw/tool/keyword_del.bmp | Bin 822 -> 0 bytes src/resource/msw/tool/keyword_del.png | Bin 0 -> 247 bytes src/resource/msw/tool/line.bmp | Bin 246 -> 0 bytes src/resource/msw/tool/line.png | Bin 0 -> 166 bytes src/resource/msw/tool/lock_dir.bmp | Bin 330 -> 0 bytes src/resource/msw/tool/lock_dir.png | Bin 0 -> 228 bytes src/resource/msw/tool/lock_free.bmp | Bin 330 -> 0 bytes src/resource/msw/tool/lock_free.png | Bin 0 -> 237 bytes src/resource/msw/tool/lock_size.bmp | Bin 330 -> 0 bytes src/resource/msw/tool/lock_size.png | Bin 0 -> 230 bytes src/resource/msw/tool/mode_curve.bmp | Bin 822 -> 0 bytes src/resource/msw/tool/mode_curve.png | Bin 0 -> 176 bytes src/resource/msw/tool/mode_paint.bmp | Bin 822 -> 0 bytes src/resource/msw/tool/mode_paint.png | Bin 0 -> 135 bytes src/resource/msw/tool/mode_rotate.bmp | Bin 822 -> 0 bytes src/resource/msw/tool/mode_rotate.png | Bin 0 -> 131 bytes src/resource/msw/tool/mode_select.bmp | Bin 822 -> 0 bytes src/resource/msw/tool/mode_select.png | Bin 0 -> 142 bytes src/resource/msw/tool/new.bmp | Bin 246 -> 0 bytes src/resource/msw/tool/new.png | Bin 0 -> 128 bytes src/resource/msw/tool/no_auto.bmp | Bin 822 -> 0 bytes src/resource/msw/tool/no_auto.png | Bin 0 -> 156 bytes src/resource/msw/tool/open.bmp | Bin 246 -> 0 bytes src/resource/msw/tool/open.png | Bin 0 -> 168 bytes src/resource/msw/tool/paste.bmp | Bin 246 -> 0 bytes src/resource/msw/tool/paste.png | Bin 0 -> 193 bytes src/resource/msw/tool/rectangle.bmp | Bin 246 -> 0 bytes src/resource/msw/tool/rectangle.png | Bin 0 -> 94 bytes src/resource/msw/tool/redo.bmp | Bin 246 -> 0 bytes src/resource/msw/tool/redo.png | Bin 0 -> 131 bytes src/resource/msw/tool/reminder.bmp | Bin 246 -> 0 bytes src/resource/msw/tool/reminder.png | Bin 0 -> 99 bytes src/resource/msw/tool/save.bmp | Bin 246 -> 0 bytes src/resource/msw/tool/save.png | Bin 0 -> 138 bytes src/resource/msw/tool/star.bmp | Bin 246 -> 0 bytes src/resource/msw/tool/star.png | Bin 0 -> 129 bytes src/resource/msw/tool/symbol.bmp | Bin 822 -> 0 bytes src/resource/msw/tool/symbol.png | Bin 0 -> 318 bytes src/resource/msw/tool/triangle.bmp | Bin 246 -> 0 bytes src/resource/msw/tool/triangle.png | Bin 0 -> 123 bytes src/resource/msw/tool/undo.bmp | Bin 246 -> 0 bytes src/resource/msw/tool/undo.png | Bin 0 -> 176 bytes src/util/window_id.hpp | 2 + 101 files changed, 317 insertions(+), 126 deletions(-) delete mode 100644 src/resource/msw/tool/apply.bmp create mode 100644 src/resource/msw/tool/apply.png delete mode 100644 src/resource/msw/tool/bold.bmp create mode 100644 src/resource/msw/tool/bold.png delete mode 100644 src/resource/msw/tool/card_add.bmp create mode 100644 src/resource/msw/tool/card_add.png delete mode 100644 src/resource/msw/tool/card_add_multiple.bmp create mode 100644 src/resource/msw/tool/card_add_multiple.png delete mode 100644 src/resource/msw/tool/card_del.bmp create mode 100644 src/resource/msw/tool/card_del.png delete mode 100644 src/resource/msw/tool/card_rotate.bmp create mode 100644 src/resource/msw/tool/card_rotate.png delete mode 100644 src/resource/msw/tool/card_rotate_0.bmp create mode 100644 src/resource/msw/tool/card_rotate_0.png delete mode 100644 src/resource/msw/tool/card_rotate_180.bmp create mode 100644 src/resource/msw/tool/card_rotate_180.png delete mode 100644 src/resource/msw/tool/card_rotate_270.bmp create mode 100644 src/resource/msw/tool/card_rotate_270.png delete mode 100644 src/resource/msw/tool/card_rotate_90.bmp create mode 100644 src/resource/msw/tool/card_rotate_90.png delete mode 100644 src/resource/msw/tool/circle.bmp create mode 100644 src/resource/msw/tool/circle.png delete mode 100644 src/resource/msw/tool/copy.bmp create mode 100644 src/resource/msw/tool/copy.png delete mode 100644 src/resource/msw/tool/curve.bmp create mode 100644 src/resource/msw/tool/curve.png delete mode 100644 src/resource/msw/tool/cut.bmp create mode 100644 src/resource/msw/tool/cut.png delete mode 100644 src/resource/msw/tool/duplicate.bmp create mode 100644 src/resource/msw/tool/duplicate.png delete mode 100644 src/resource/msw/tool/find.bmp create mode 100644 src/resource/msw/tool/find.png create mode 100644 src/resource/msw/tool/grid.png create mode 100644 src/resource/msw/tool/grid_snap.png delete mode 100644 src/resource/msw/tool/help.bmp create mode 100644 src/resource/msw/tool/help.png delete mode 100644 src/resource/msw/tool/italic.bmp create mode 100644 src/resource/msw/tool/italic.png delete mode 100644 src/resource/msw/tool/keyword_add.bmp create mode 100644 src/resource/msw/tool/keyword_add.png delete mode 100644 src/resource/msw/tool/keyword_del.bmp create mode 100644 src/resource/msw/tool/keyword_del.png delete mode 100644 src/resource/msw/tool/line.bmp create mode 100644 src/resource/msw/tool/line.png delete mode 100644 src/resource/msw/tool/lock_dir.bmp create mode 100644 src/resource/msw/tool/lock_dir.png delete mode 100644 src/resource/msw/tool/lock_free.bmp create mode 100644 src/resource/msw/tool/lock_free.png delete mode 100644 src/resource/msw/tool/lock_size.bmp create mode 100644 src/resource/msw/tool/lock_size.png delete mode 100644 src/resource/msw/tool/mode_curve.bmp create mode 100644 src/resource/msw/tool/mode_curve.png delete mode 100644 src/resource/msw/tool/mode_paint.bmp create mode 100644 src/resource/msw/tool/mode_paint.png delete mode 100644 src/resource/msw/tool/mode_rotate.bmp create mode 100644 src/resource/msw/tool/mode_rotate.png delete mode 100644 src/resource/msw/tool/mode_select.bmp create mode 100644 src/resource/msw/tool/mode_select.png delete mode 100644 src/resource/msw/tool/new.bmp create mode 100644 src/resource/msw/tool/new.png delete mode 100644 src/resource/msw/tool/no_auto.bmp create mode 100644 src/resource/msw/tool/no_auto.png delete mode 100644 src/resource/msw/tool/open.bmp create mode 100644 src/resource/msw/tool/open.png delete mode 100644 src/resource/msw/tool/paste.bmp create mode 100644 src/resource/msw/tool/paste.png delete mode 100644 src/resource/msw/tool/rectangle.bmp create mode 100644 src/resource/msw/tool/rectangle.png delete mode 100644 src/resource/msw/tool/redo.bmp create mode 100644 src/resource/msw/tool/redo.png delete mode 100644 src/resource/msw/tool/reminder.bmp create mode 100644 src/resource/msw/tool/reminder.png delete mode 100644 src/resource/msw/tool/save.bmp create mode 100644 src/resource/msw/tool/save.png delete mode 100644 src/resource/msw/tool/star.bmp create mode 100644 src/resource/msw/tool/star.png delete mode 100644 src/resource/msw/tool/symbol.bmp create mode 100644 src/resource/msw/tool/symbol.png delete mode 100644 src/resource/msw/tool/triangle.bmp create mode 100644 src/resource/msw/tool/triangle.png delete mode 100644 src/resource/msw/tool/undo.bmp create mode 100644 src/resource/msw/tool/undo.png diff --git a/src/data/action/symbol.cpp b/src/data/action/symbol.cpp index c125b017..aa257918 100644 --- a/src/data/action/symbol.cpp +++ b/src/data/action/symbol.cpp @@ -18,8 +18,16 @@ DECLARE_TYPEOF_COLLECTION(ControlPointP); SymbolPartMoveAction::SymbolPartMoveAction(const set& parts) : parts(parts) + , min_pos(Vector2D::infinity()), max_pos(-Vector2D::infinity()) , constrain(false) -{} + , snap(0) +{ + // Determine min/max_pos + FOR_EACH(p,parts) { + min_pos = piecewise_min(min_pos, p->min_pos); + max_pos = piecewise_max(max_pos, p->max_pos); + } +} String SymbolPartMoveAction::getName(bool to_undo) const { return parts.size() == 1 ? _("Move shape") : _("Move shapes"); @@ -39,9 +47,10 @@ void SymbolPartMoveAction::perform(bool to_undo) { void SymbolPartMoveAction::move(const Vector2D& deltaDelta) { delta += deltaDelta; - // Move each point by deltaDelta, possibly constrained - Vector2D d = constrainVector(delta, constrain); + // Determine actual delta, possibly constrained and snapped + Vector2D d = constrain_snap_vector_offset(min_pos, max_pos, delta, constrain, snap); Vector2D dd = d - moved; + // Move each point by d FOR_EACH(p, parts) { p->min_pos += dd; p->max_pos += dd; @@ -114,7 +123,8 @@ void SymbolPartRotateAction::rotateBy(double deltaAngle) { SymbolPartShearAction::SymbolPartShearAction(const set& parts, const Vector2D& center) : SymbolPartMatrixAction(parts, center) - , constrain(false) +// , constrain(false) + , snap(0) {} String SymbolPartShearAction::getName(bool to_undo) const { @@ -130,12 +140,14 @@ void SymbolPartShearAction::perform(bool to_undo) { // <1 -x> / // <-y 1> / (1 - xy) // we have: xy = 0 => (1 - xy) = 1 - shearBy(-shear); + shearBy(-moved); } void SymbolPartShearAction::move(const Vector2D& deltaShear) { shear += deltaShear; - shearBy(deltaShear); + Vector2D d = snap_vector(shear - moved, snap); + shearBy(d); + moved += d; } void SymbolPartShearAction::shearBy(const Vector2D& shear) { @@ -154,6 +166,7 @@ SymbolPartScaleAction::SymbolPartScaleAction(const set& parts, int : parts(parts) , scaleX(scaleX), scaleY(scaleY) , constrain(false) + , snap(0) { // Find min and max coordinates oldMin = Vector2D::infinity(); @@ -191,10 +204,19 @@ void SymbolPartScaleAction::update() { // the size after the move newMin = newRealMin; newSize = newRealSize; if (constrain && scaleX != 0 && scaleY != 0) { + // TODO : snapping Vector2D scale = newSize.div(tmpSize); - scale = constrainVector(scale, true, true); + scale = constrain_vector(scale, true, true); newSize = tmpSize.mul(scale); newMin += (newRealSize - newSize).mul(Vector2D(scaleX == -1 ? 1 : 0, scaleY == -1 ? 1 : 0)); + } else if (snap >= 0) { + if (scaleX + scaleY < 0) { + newMin = snap_vector(newMin, snap); + newSize += newRealMin - newMin; + } else { + Vector2D newMax = snap_vector(newMin + newSize, snap); + newSize = newMax - newMin; + } } // now move all points transformAll(); diff --git a/src/data/action/symbol.hpp b/src/data/action/symbol.hpp index 08795a3f..62876963 100644 --- a/src/data/action/symbol.hpp +++ b/src/data/action/symbol.hpp @@ -43,8 +43,10 @@ class SymbolPartMoveAction : public SymbolPartAction { set parts; ///< Parts to move Vector2D delta; ///< How much to move Vector2D moved; ///< How much has been moved + Vector2D min_pos, max_pos; ///< Bounding box of the thing we are moving public: bool constrain; ///< Constrain movement? + int snap; ///< Snap to grid? }; // ----------------------------------------------------------------------------- : Rotating symbol parts @@ -101,9 +103,11 @@ class SymbolPartShearAction : public SymbolPartMatrixAction { private: Vector2D shear; ///< Shearing, shear.x == 0 || shear.y == 0 + Vector2D moved; void shearBy(const Vector2D& shear); public: - bool constrain; ///< Constrain movement? +// bool constrain; ///< Constrain movement? + int snap; ///< Snap to grid? }; @@ -135,7 +139,8 @@ class SymbolPartScaleAction : public SymbolPartAction { return (v - oldMin).div(oldSize).mul(newSize) + newMin; } public: - bool constrain; ///< Constrain movement? + bool constrain; ///< Constrain movement? + int snap; ///< Snap to grid? }; // ----------------------------------------------------------------------------- : Change combine mode diff --git a/src/data/action/symbol_part.cpp b/src/data/action/symbol_part.cpp index 56368029..2b682f9b 100644 --- a/src/data/action/symbol_part.cpp +++ b/src/data/action/symbol_part.cpp @@ -16,12 +16,12 @@ DECLARE_TYPEOF_COLLECTION(ControlPointP); inline double sgn(double v) { return v > 0 ? 1 : -1; } -Vector2D constrainVector(const Vector2D& v, bool constrain, bool onlyDiagonal) { +Vector2D constrain_vector(const Vector2D& v, bool constrain, bool only_diagonal) { if (!constrain) return v; double ax = fabs(v.x), ay = fabs(v.y); - if (ax * 2 < ay && !onlyDiagonal) { + if (ax * 2 < ay && !only_diagonal) { return Vector2D(0, v.y); // vertical - } else if(ay * 2 < ax && !onlyDiagonal) { + } else if(ay * 2 < ax && !only_diagonal) { return Vector2D(v.x, 0); // horizontal } else { return Vector2D( // diagonal @@ -31,11 +31,62 @@ Vector2D constrainVector(const Vector2D& v, bool constrain, bool onlyDiagonal) { } } +inline double snap(double x, int steps) { + return steps <= 0 ? x : floor(x * steps + 0.5) / steps; +} + +Vector2D snap_vector(const Vector2D& v, int steps) { + return Vector2D(snap(v.x, steps), snap(v.y, steps)); +} + +Vector2D constrain_snap_vector(const Vector2D& v, const Vector2D& d, bool constrain, int steps) { + if (!constrain) return snap_vector(v+d, steps); + double ax = fabs(d.x), ay = fabs(d.y); + if (ax * 2 < ay) { + return Vector2D(v.x, snap(d.y + v.y, steps)); // vertical + } else if(ay * 2 < ax) { + return Vector2D(snap(d.x + v.x, steps), v.y); // horizontal + } else { + double dc = (ax + ay) / 2; // delta in both directions + double dxs = snap(v.x + dc, steps) - v.x; // snapped to x + double dys = snap(v.y + dc, steps) - v.y; // snapped to y + if (fabs(dxs-dc) < fabs(dys-dc)) { + // take the one that is closest to the unsnaped delta + return Vector2D(v.x + sgn(d.x) * dxs, v.y + sgn(d.y) * dxs); + } else { + return Vector2D(v.x + sgn(d.x) * dys, v.y + sgn(d.y) * dys); + } + } +} + +Vector2D constrain_snap_vector_offset(const Vector2D& off1, const Vector2D& d, bool constrain, int steps) { + return constrain_snap_vector(off1, d, constrain, steps) - off1; +} +// calculate constrained delta for the given offset, store in output if it is better +void constrain_snap_vector_offset_(const Vector2D& off, const Vector2D& d, bool constrain, int steps, Vector2D& best, double& best_length) { + Vector2D d2 = constrain_snap_vector_offset(off, d, constrain, steps); + double l2 = d2.lengthSqr(); + if (l2 < best_length) { + best_length = l2; + best = d2; + } +} +Vector2D constrain_snap_vector_offset(const Vector2D& off1, const Vector2D& off2, const Vector2D& d, bool constrain, int steps) { + Vector2D dd; double l = numeric_limits::infinity(); + constrain_snap_vector_offset_(off1, d, constrain, steps, dd, l); + constrain_snap_vector_offset_(off2, d, constrain, steps, dd, l); + constrain_snap_vector_offset_(Vector2D(off1.x,off2.y), d, constrain, steps, dd, l); + constrain_snap_vector_offset_(Vector2D(off2.x,off1.y), d, constrain, steps, dd, l); + return dd; +} + + // ----------------------------------------------------------------------------- : Move control point ControlPointMoveAction::ControlPointMoveAction(const set& points) : points(points) , constrain(false) + , snap(0) { oldValues.reserve(points.size()); FOR_EACH(p, points) { @@ -48,13 +99,6 @@ String ControlPointMoveAction::getName(bool to_undo) const { } void ControlPointMoveAction::perform(bool to_undo) { - /* - set::const_iterator it = points.begin(); - vector ::iterator it2 = oldValues.begin(); - for( ; it != points.end() && it2 != oldValues.end() ; ++it, ++it2) { - swap((*it)->pos, *it2); - } - */ FOR_EACH_2(p,points, op,oldValues) { swap(p->pos, op); } @@ -63,11 +107,10 @@ void ControlPointMoveAction::perform(bool to_undo) { void ControlPointMoveAction::move (const Vector2D& deltaDelta) { delta += deltaDelta; // Move each point by delta, possibly constrained - Vector2D d = constrainVector(delta, constrain); set::const_iterator it = points.begin(); vector ::iterator it2 = oldValues.begin(); for( ; it != points.end() && it2 != oldValues.end() ; ++it, ++it2) { - (*it)->pos = (*it2) + d; + (*it)->pos = constrain_snap_vector(*it2, delta, constrain, snap); } } @@ -79,6 +122,7 @@ HandleMoveAction::HandleMoveAction(const SelectedHandle& handle) , old_handle(handle.getHandle()) , old_other (handle.getOther()) , constrain(false) + , snap(0) {} String HandleMoveAction::getName(bool to_undo) const { @@ -92,7 +136,7 @@ void HandleMoveAction::perform(bool to_undo) { void HandleMoveAction::move(const Vector2D& deltaDelta) { delta += deltaDelta; - handle.getHandle() = constrainVector(old_handle + delta, constrain); + handle.getHandle() = constrain_snap_vector_offset(handle.point->pos, old_handle + delta, constrain, snap); handle.getOther() = old_other; handle.onUpdateHandle(); } diff --git a/src/data/action/symbol_part.hpp b/src/data/action/symbol_part.hpp index 5c8e4192..5b4115f0 100644 --- a/src/data/action/symbol_part.hpp +++ b/src/data/action/symbol_part.hpp @@ -20,9 +20,25 @@ // ----------------------------------------------------------------------------- : Utility -/// Constrain a vector to be horizontal, vertical or diagonal -/// If constraint==false does nothing -Vector2D constrainVector(const Vector2D& v, bool constrain = true, bool onlyDiagonal = false); +/// Constrain a vector to be horizontal, vertical or diagonal. +/** If constraint==false does nothing + */ +Vector2D constrain_vector(const Vector2D& v, bool constrain = true, bool only_diagonal = false); + +/// Snap a vector to the grid with the given number of steps per unit interval. +/** If spacing==0 does not snap. */ +Vector2D snap_vector(const Vector2D& v, int steps); + +/// Add a delta to a vector +/** Possibly constrain the delta, and snap to result to grid + */ +Vector2D constrain_snap_vector(const Vector2D& v, const Vector2D& d, bool constrain, int steps); + +/// Constrain a vector a vector, and snap to an offset grid +Vector2D constrain_snap_vector_offset(const Vector2D& off1, const Vector2D& d, bool constrain, int steps); +/// Constrain a vector a vector, and snap to two possible offset grids +/** Takes the closest snap */ +Vector2D constrain_snap_vector_offset(const Vector2D& off1, const Vector2D& off2, const Vector2D& d, bool constrain, int steps); // ----------------------------------------------------------------------------- : Move control point @@ -43,6 +59,7 @@ class ControlPointMoveAction : public Action { Vector2D delta; ///< Amount we moved public: bool constrain; ///< Constrain movement? + int snap; ///< Snap to grid? }; // ----------------------------------------------------------------------------- : Move handle @@ -65,6 +82,7 @@ class HandleMoveAction : public Action { Vector2D delta; ///< Amount we moved public: bool constrain; ///< Constrain movement? + int snap; ///< Snap to grid? }; // ----------------------------------------------------------------------------- : Segment mode diff --git a/src/data/format/image_to_symbol.cpp b/src/data/format/image_to_symbol.cpp index 3a078a21..971b582f 100644 --- a/src/data/format/image_to_symbol.cpp +++ b/src/data/format/image_to_symbol.cpp @@ -220,6 +220,10 @@ SymbolP import_symbol(Image& img) { if (is_mse1_symbol(img)) { Image img2 = img.GetSubImage(wxRect(20,0,40,40)); symbol = image_to_symbol(img2); + } else if (img.GetWidth() > 100 || img.GetHeight() > 100) { + // 100x100 ought to be enough, we trow out most afterwards data anyway + Image resampled = img.Rescale(100,100); + symbol = image_to_symbol(resampled); } else { symbol = image_to_symbol(img); } @@ -387,7 +391,7 @@ void remove_point(SymbolPart& part, int i); * stop when the cost becomes too high */ void remove_points(SymbolPart& part) { - const double treshold = 0.002; // maximum cost + const double treshold = 0.0002; // maximum cost while (true) { // Find the point with the lowest cost of removal int best = -1; diff --git a/src/data/settings.cpp b/src/data/settings.cpp index ea7d0063..51c1b6e9 100644 --- a/src/data/settings.cpp +++ b/src/data/settings.cpp @@ -88,6 +88,9 @@ Settings::Settings() , set_window_width (790) , set_window_height (300) , card_notes_height (40) + , symbol_grid_size (30) + , symbol_grid (true) + , symbol_grid_snap (false) , updates_url (_("http://magicseteditor.sourceforge.net/updates")) , check_updates (CHECK_IF_CONNECTED) , website_url (_("http://magicseteditor.sourceforge.net/")) @@ -155,6 +158,9 @@ IMPLEMENT_REFLECTION(Settings) { REFLECT(set_window_width); REFLECT(set_window_height); REFLECT(card_notes_height); + REFLECT(symbol_grid_size); + REFLECT(symbol_grid); + REFLECT(symbol_grid_snap); REFLECT(default_game); REFLECT(apprentice_location); REFLECT(updates_url); diff --git a/src/data/settings.hpp b/src/data/settings.hpp index 9aa79b83..04c7679c 100644 --- a/src/data/settings.hpp +++ b/src/data/settings.hpp @@ -100,6 +100,11 @@ class Settings { UInt set_window_height; UInt card_notes_height; + // --------------------------------------------------- : Symbol editor + UInt symbol_grid_size; + bool symbol_grid; + bool symbol_grid_snap; + // --------------------------------------------------- : Default pacakge selections String default_game; diff --git a/src/gui/control/gallery_list.cpp b/src/gui/control/gallery_list.cpp index d9002c64..a78c2fb9 100644 --- a/src/gui/control/gallery_list.cpp +++ b/src/gui/control/gallery_list.cpp @@ -120,8 +120,8 @@ void GalleryList::onChar(wxKeyEvent& ev) { wxSize GalleryList::DoGetBestSize() const { wxSize ws = GetSize(), cs = GetClientSize(); - const int w = item_size.x + SPACING; - const int h = item_size.y + SPACING; + const int w = item_size.x + 2*MARGIN + 2*BORDER; + const int h = item_size.y + 2*MARGIN + 2*BORDER; return wxSize(w, h) + ws - cs; } diff --git a/src/gui/symbol/basic_shape_editor.cpp b/src/gui/symbol/basic_shape_editor.cpp index 09d73481..95947350 100644 --- a/src/gui/symbol/basic_shape_editor.cpp +++ b/src/gui/symbol/basic_shape_editor.cpp @@ -56,9 +56,9 @@ void SymbolBasicShapeEditor::destroyUI(wxToolBar* tb, wxMenuBar* mb) { tb->RemoveChild(sidesL); tb->RemoveChild(sides); // HACK: hardcoded size of rest of toolbar - tb->DeleteToolByPos(4); // delete separator - tb->DeleteToolByPos(4); // delete sidesL - tb->DeleteToolByPos(4); // delete sides + tb->DeleteToolByPos(7); // delete separator + tb->DeleteToolByPos(7); // delete sidesL + tb->DeleteToolByPos(7); // delete sides #if wxVERSION_NUMBER < 2600 delete sides; delete sidesL; diff --git a/src/gui/symbol/control.cpp b/src/gui/symbol/control.cpp index aaccb983..02bae4f1 100644 --- a/src/gui/symbol/control.cpp +++ b/src/gui/symbol/control.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -65,7 +66,18 @@ void SymbolControl::onModeChange(wxCommandEvent& ev) { } void SymbolControl::onExtraTool(wxCommandEvent& ev) { - if (editor) editor->onCommand(ev.GetId()); + switch (ev.GetId()) { + case ID_VIEW_GRID: + settings.symbol_grid = !settings.symbol_grid; + Refresh(false); + break; + case ID_VIEW_GRID_SNAP: + settings.symbol_grid_snap = !settings.symbol_grid_snap; + Refresh(false); + break; + default: + if (editor) editor->onCommand(ev.GetId()); + } } void SymbolControl::onAction(const Action& action, bool undone) { @@ -135,6 +147,25 @@ void SymbolControl::draw(DC& dc) { clearDC(dc, Color(0, 128, 0)); // draw symbol iself SymbolViewer::draw(dc); + // draw grid + if (settings.symbol_grid) { + wxSize s = dc.GetSize(); + int lines = settings.symbol_grid_size; + for (int i = 0 ; i <= lines ; ++i) { + int x = rotation.trS((double)i/lines-0.0001); + //dc.SetPen(Color(0, i%5 == 0 ? 64 : 31, 0)); + //dc.SetPen(Color(i%5 == 0 ? 64 : 31, 0, 0)); + dc.SetLogicalFunction(wxAND); + dc.SetPen(i%5 == 0 ? Color(191,255,191) : Color(191, 255, 191)); + dc.DrawLine(x, 0, x, s.y); + dc.DrawLine(0, x, s.x, x); + dc.SetLogicalFunction(wxOR); + dc.SetPen(i%5 == 0 ? Color(0,63,0) : Color(0, 31, 0)); + dc.DrawLine(x, 0, x, s.y); + dc.DrawLine(0, x, s.x, x); + } + dc.SetLogicalFunction(wxCOPY); + } // draw editing overlay if (editor) { editor->draw(dc); @@ -196,7 +227,7 @@ void SymbolControl::onChar(wxKeyEvent& ev) { } void SymbolControl::onSize(wxSizeEvent& ev) { - wxSize s = ev.GetSize(); + wxSize s = GetClientSize(); rotation.setZoom(min(s.GetWidth(), s.GetHeight())); Refresh(false); } @@ -213,6 +244,12 @@ void SymbolControl::onUpdateUI(wxUpdateUIEvent& ev) { case ID_MODE_PAINT: ev.Enable(false); // TODO break; + case ID_VIEW_GRID: + ev.Check(settings.symbol_grid); + break; + case ID_VIEW_GRID_SNAP: + ev.Check(settings.symbol_grid_snap); + break; default: if (ev.GetId() >= ID_CHILD_MIN && ev.GetId() < ID_CHILD_MAX) { editor->onUpdateUI(ev); // foward to editor diff --git a/src/gui/symbol/point_editor.cpp b/src/gui/symbol/point_editor.cpp index 29a4f785..ce8a9049 100644 --- a/src/gui/symbol/point_editor.cpp +++ b/src/gui/symbol/point_editor.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -172,8 +173,8 @@ void SymbolPointEditor::destroyUI(wxToolBar* tb, wxMenuBar* mb) { tb->DeleteTool(ID_LOCK_DIR); tb->DeleteTool(ID_LOCK_SIZE); // HACK: hardcoded size of rest of toolbar - tb->DeleteToolByPos(4); // delete separator - tb->DeleteToolByPos(4); // delete separator + tb->DeleteToolByPos(7); // delete separator + tb->DeleteToolByPos(7); // delete separator // TODO : menu bar //mb->Remove(2) } @@ -215,8 +216,10 @@ void SymbolPointEditor::onCommand(int id) { switch (id) { case ID_SEGMENT_LINE: case ID_SEGMENT_CURVE: onChangeSegment( static_cast(id - ID_SEGMENT) ); + break; case ID_LOCK_FREE: case ID_LOCK_DIR: case ID_LOCK_SIZE: onChangeLock( static_cast(id - ID_LOCK) ); + break; } } @@ -273,6 +276,10 @@ void SymbolPointEditor::onMouseMove(const Vector2D& from, const Vector2D& to, wx control.Refresh(false); } +template int snap(Event& ev) { + return settings.symbol_grid_snap != ev.ShiftDown() ? settings.symbol_grid_size : 0; // shift toggles snap +} + void SymbolPointEditor::onMouseDrag(const Vector2D& from, const Vector2D& to, wxMouseEvent& ev) { Vector2D delta = to - from; if (selection == SELECTED_LINE && ev.AltDown()) { @@ -293,6 +300,7 @@ void SymbolPointEditor::onMouseDrag(const Vector2D& from, const Vector2D& to, wx getSymbol()->actions.add(controlPointMoveAction); } controlPointMoveAction->constrain = ev.ControlDown(); // ctrl constrains + controlPointMoveAction->snap = snap(ev); controlPointMoveAction->move(delta); new_point += delta; control.Refresh(false); @@ -302,7 +310,8 @@ void SymbolPointEditor::onMouseDrag(const Vector2D& from, const Vector2D& to, wx handleMoveAction = new HandleMoveAction(selected_handle); getSymbol()->actions.add(handleMoveAction); } - handleMoveAction->constrain = ev.ControlDown(); // ctrl constrains + handleMoveAction->constrain = ev.ControlDown(); // ctrl constrains + handleMoveAction->snap = snap(ev); handleMoveAction->move(delta); control.Refresh(false); } @@ -323,14 +332,16 @@ void SymbolPointEditor::onKeyChange(wxKeyEvent& ev) { SetStatusText(_("Alt + drag to move curve; double click to add control point on this line")); } control.Refresh(false); - } else if (ev.GetKeyCode() == WXK_CONTROL) { - // constrain changed + } else if (ev.GetKeyCode() == WXK_CONTROL || ev.GetKeyCode() == WXK_SHIFT) { + // constrain/snap changed if (controlPointMoveAction) { controlPointMoveAction->constrain = ev.ControlDown(); + controlPointMoveAction->snap = snap(ev); controlPointMoveAction->move(Vector2D()); //refresh action control.Refresh(false); } else if (handleMoveAction) { handleMoveAction->constrain = ev.ControlDown(); + handleMoveAction->snap = snap(ev); handleMoveAction->move(Vector2D()); //refresh action control.Refresh(false); } diff --git a/src/gui/symbol/select_editor.cpp b/src/gui/symbol/select_editor.cpp index da37578c..8b5c742f 100644 --- a/src/gui/symbol/select_editor.cpp +++ b/src/gui/symbol/select_editor.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include DECLARE_TYPEOF_COLLECTION(SymbolPartP); @@ -122,7 +123,7 @@ void SymbolSelectEditor::destroyUI(wxToolBar* tb, wxMenuBar* mb) { tb->DeleteTool(ID_PART_OVERLAP); tb->DeleteTool(ID_PART_BORDER); // HACK: hardcoded size of rest of toolbar - tb->DeleteToolByPos(4); // delete separator + tb->DeleteToolByPos(7); // delete separator } void SymbolSelectEditor::onUpdateUI(wxUpdateUIEvent& ev) { @@ -173,6 +174,40 @@ int SymbolSelectEditor::modeToolId() { // ----------------------------------------------------------------------------- : Mouse Events void SymbolSelectEditor::onLeftDown (const Vector2D& pos, wxMouseEvent& ev) { + have_dragged = true; + // change selection + // Are we on a handle? + int dx, dy; + if (onAnyHandle(pos, &dx, &dy)) return; // don't change the selection + // Select the part under the cursor + SymbolPartP part = findPart(pos); + if (part) { + if (ev.ShiftDown()) { + // toggle selection + set::iterator it = control.selected_parts.find(part); + if (it != control.selected_parts.end()) { + control.selected_parts.erase(it); + } else { + control.selected_parts.insert(part); + } + } else { + if (control.selected_parts.find(part) != control.selected_parts.end()) { + // already selected, do nothing + have_dragged = false; // we haven't done anything + } else { + // select the part under the cursor + control.selected_parts.clear(); + control.selected_parts.insert(part); + } + } + } else if (!ev.ShiftDown()) { + // select nothing + control.selected_parts.clear(); + } + // selection has changed + updateBoundingBox(); + control.signalSelectionChange(); + control.Refresh(false); } void SymbolSelectEditor::onLeftUp (const Vector2D& pos, wxMouseEvent& ev) { @@ -180,39 +215,18 @@ void SymbolSelectEditor::onLeftUp (const Vector2D& pos, wxMouseEvent& ev) { // stop editing resetActions(); } else { - // mouse not moved, change selection - // Are we on a handle? - int dx, dy; - if (onAnyHandle(pos, &dx, &dy)) return; // don't change the selection - // Select the part under the cursor - SymbolPartP part = findPart(pos); - if (part) { - if (ev.ShiftDown()) { - // toggle selection - set::iterator it = control.selected_parts.find(part); - if (it != control.selected_parts.end()) { - control.selected_parts.erase(it); - } else { - control.selected_parts.insert(part); - } - } else { - if (control.selected_parts.find(part) != control.selected_parts.end()) { - // already selected, don't change selection - // instead switch between rotate and resize mode - rotate = !rotate; - } else { - // select the part under the cursor - control.selected_parts.clear(); - control.selected_parts.insert(part); - } + // mouse not moved -> change selection + if (!have_dragged && !ev.ShiftDown()) { + int dx, dy; + if (onAnyHandle(pos, &dx, &dy)) return; // don't change the selection + // Find the part under the cursor + SymbolPartP part = findPart(pos); + if (control.selected_parts.find(part) != control.selected_parts.end()) { + // already selected, don't change selection + // instead switch between rotate and resize mode + rotate = !rotate; } - } else if (!ev.ShiftDown()) { - // select nothing - control.selected_parts.clear(); } - // selection has changed - updateBoundingBox(); - control.signalSelectionChange(); } control.Refresh(false); } @@ -261,7 +275,12 @@ void SymbolSelectEditor::onMouseMove (const Vector2D& from, const Vector2D& to, control.Refresh(false); } +template int snap(Event& ev) { + return settings.symbol_grid_snap != ev.ShiftDown() ? settings.symbol_grid_size : 0; // shift toggles snap +} + void SymbolSelectEditor::onMouseDrag (const Vector2D& from, const Vector2D& to, wxMouseEvent& ev) { + have_dragged = true; if (control.selected_parts.empty()) return; if (!isEditing()) { // we don't have an action yet, determine what to do @@ -294,6 +313,7 @@ void SymbolSelectEditor::onMouseDrag (const Vector2D& from, const Vector2D& to, if (moveAction) { // move the selected parts moveAction->constrain = ev.ControlDown(); + moveAction->snap = snap(ev); moveAction->move(to - from); } else if (scaleAction) { // scale the selected parts @@ -303,7 +323,9 @@ void SymbolSelectEditor::onMouseDrag (const Vector2D& from, const Vector2D& to, if (scaleX == 1) dMax.x = delta.x; if (scaleY == -1) dMin.y = delta.y; if (scaleY == 1) dMax.y = delta.y; - scaleAction->constrain = ev.ControlDown(); +// scaleAction->constrain = ev.ControlDown(); + scaleAction->constrain = true; // always constrain diagonal scaling + scaleAction->snap = snap(ev); scaleAction->move(dMin, dMax); } else if (rotateAction) { // rotate the selected parts @@ -315,7 +337,8 @@ void SymbolSelectEditor::onMouseDrag (const Vector2D& from, const Vector2D& to, Vector2D delta = to-from; delta = delta.mul(Vector2D(scaleY, scaleX)); delta = delta.div(maxV - minV); - shearAction->constrain = ev.ControlDown(); +// shearAction->constrain = ev.ControlDown(); + shearAction->snap = snap(ev); shearAction->move(delta); } control.Refresh(false); @@ -324,21 +347,28 @@ void SymbolSelectEditor::onMouseDrag (const Vector2D& from, const Vector2D& to, // ----------------------------------------------------------------------------- : Key Events void SymbolSelectEditor::onKeyChange (wxKeyEvent& ev) { - if (ev.GetKeyCode() == WXK_CONTROL) { + if (ev.GetKeyCode() == WXK_CONTROL || ev.GetKeyCode() == WXK_SHIFT) { // changed constrains if (moveAction) { moveAction->constrain = ev.ControlDown(); + moveAction->snap = snap(ev); moveAction->move(Vector2D()); // apply constrains control.Refresh(false); } else if (scaleAction) { // only allow constrained scaling in diagonal direction - scaleAction->constrain = ev.ControlDown(); +// scaleAction->constrain = ev.ControlDown(); + scaleAction->constrain = true; // always constrain diagonal scaling + scaleAction->snap = snap(ev); scaleAction->update(); // apply constrains control.Refresh(false); } else if (rotateAction) { rotateAction->constrain = ev.ControlDown(); rotateAction->rotateBy(0); // apply constrains control.Refresh(false); + } else if (shearAction) { + shearAction->snap = snap(ev); + shearAction->move(Vector2D()); // apply constrains + control.Refresh(false); } } } @@ -408,7 +438,7 @@ void SymbolSelectEditor::updateBoundingBox() { minV = piecewise_min(minV, p->min_pos); maxV = piecewise_max(maxV, p->max_pos); } - // Find rotation center +/* // Find rotation center center = Vector2D(0,0); FOR_EACH(p, control.selected_parts) { Vector2D size = p->max_pos - p->min_pos; @@ -416,6 +446,8 @@ void SymbolSelectEditor::updateBoundingBox() { center += p->min_pos + size; } center /= control.selected_parts.size(); +*/ + center = (minV + maxV) / 2; } void SymbolSelectEditor::resetActions() { diff --git a/src/gui/symbol/select_editor.hpp b/src/gui/symbol/select_editor.hpp index 285680fb..e32c281d 100644 --- a/src/gui/symbol/select_editor.hpp +++ b/src/gui/symbol/select_editor.hpp @@ -78,6 +78,8 @@ class SymbolSelectEditor : public SymbolEditorBase { double startAngle; // what side are we dragging/rotating on? int scaleX, scaleY; + // have we dragged? + bool have_dragged; // Do we want to rotate? bool rotate; // Graphics assets diff --git a/src/gui/symbol/window.cpp b/src/gui/symbol/window.cpp index e309b9b6..68202046 100644 --- a/src/gui/symbol/window.cpp +++ b/src/gui/symbol/window.cpp @@ -96,6 +96,9 @@ void SymbolWindow::init(Window* parent, SymbolP symbol) { tb->AddSeparator(); tb->AddTool(ID_EDIT_UNDO, _("Undo"), load_resource_tool_image(_("undo")), wxNullBitmap, wxITEM_NORMAL, _TOOL_1_("undo",wxEmptyString)); tb->AddTool(ID_EDIT_REDO, _("Redo"), load_resource_tool_image(_("redo")), wxNullBitmap, wxITEM_NORMAL, _TOOL_1_("redo",wxEmptyString)); + tb->AddSeparator(); + tb->AddTool(ID_VIEW_GRID, _("Grid"), load_resource_tool_image(_("grid")), wxNullBitmap, wxITEM_CHECK, _TOOL_("grid")); + tb->AddTool(ID_VIEW_GRID_SNAP,_("Snap"), load_resource_tool_image(_("grid_snap")), wxNullBitmap, wxITEM_CHECK, _TOOL_("snap")); tb->Realize(); // Edit mode toolbar diff --git a/src/gui/util.cpp b/src/gui/util.cpp index 2d83bb29..8178ecea 100644 --- a/src/gui/util.cpp +++ b/src/gui/util.cpp @@ -122,7 +122,7 @@ wxIcon load_resource_icon(const String& name) { wxBitmap load_resource_tool_image(const String& name) { #if defined(__WXMSW__) - return wxBitmap(_("tool/") + name); + return load_resource_image(_("tool/") + name); #else return load_resource_image(_("tool/") + name); #endif diff --git a/src/gui/util.hpp b/src/gui/util.hpp index 0261c2e4..8174c3e2 100644 --- a/src/gui/util.hpp +++ b/src/gui/util.hpp @@ -46,8 +46,6 @@ wxCursor load_resource_cursor(const String& name); wxIcon load_resource_icon(const String& name); /// Load an image for use in a toolbar (filename: tool/...) from a resource -/** Note: should ONLY be used for ".bmp" images for now - */ wxBitmap load_resource_tool_image(const String& name); // ----------------------------------------------------------------------------- : Platform look diff --git a/src/render/symbol/viewer.cpp b/src/render/symbol/viewer.cpp index ec383cd0..a91f163b 100644 --- a/src/render/symbol/viewer.cpp +++ b/src/render/symbol/viewer.cpp @@ -127,7 +127,7 @@ void SymbolViewer::highlightPart(DC& dc, const SymbolPart& part, HighlightStyle dc.DrawPolygon((int)points.size(), &points[0]); if (part.combine == PART_SUBTRACT || part.combine == PART_BORDER) { dc.SetLogicalFunction(wxAND); - dc.SetBrush(Color(192,192,255)); + dc.SetBrush(Color(191,191,255)); dc.DrawPolygon((int)points.size(), &points[0]); } dc.SetLogicalFunction(wxCOPY); diff --git a/src/resource/msw/mse.rc b/src/resource/msw/mse.rc index c67d3b81..e52f4b4d 100644 --- a/src/resource/msw/mse.rc +++ b/src/resource/msw/mse.rc @@ -19,36 +19,36 @@ icon/symbol ICON "icon/symbol.ico" cursor/rot_text CURSOR "cursor/rot_text.cur" -tool/new BITMAP "tool/new.bmp" -tool/open BITMAP "tool/open.bmp" -tool/save BITMAP "tool/save.bmp" +tool/new IMAGE "tool/new.png" +tool/open IMAGE "tool/open.png" +tool/save IMAGE "tool/save.png" -tool/undo BITMAP "tool/undo.bmp" -tool/redo BITMAP "tool/redo.bmp" -tool/cut BITMAP "tool/cut.bmp" -tool/copy BITMAP "tool/copy.bmp" -tool/paste BITMAP "tool/paste.bmp" -tool/find BITMAP "tool/find.bmp" +tool/undo IMAGE "tool/undo.png" +tool/redo IMAGE "tool/redo.png" +tool/cut IMAGE "tool/cut.png" +tool/copy IMAGE "tool/copy.png" +tool/paste IMAGE "tool/paste.png" +tool/find IMAGE "tool/find.png" -tool/bold BITMAP "tool/bold.bmp" -tool/italic BITMAP "tool/italic.bmp" -tool/symbol BITMAP "tool/symbol.bmp" -tool/reminder BITMAP "tool/reminder.bmp" -tool/no_auto BITMAP "tool/no_auto.bmp" +tool/bold IMAGE "tool/bold.png" +tool/italic IMAGE "tool/italic.png" +tool/symbol IMAGE "tool/symbol.png" +tool/reminder IMAGE "tool/reminder.png" +tool/no_auto IMAGE "tool/no_auto.png" -tool/card_add BITMAP "tool/card_add.bmp" -tool/card_add_multiple BITMAP "tool/card_add_multiple.bmp" -tool/card_del BITMAP "tool/card_del.bmp" -tool/card_rotate BITMAP "tool/card_rotate.bmp" -tool/card_rotate_0 BITMAP "tool/card_rotate_0.bmp" -tool/card_rotate_90 BITMAP "tool/card_rotate_90.bmp" -tool/card_rotate_180 BITMAP "tool/card_rotate_180.bmp" -tool/card_rotate_270 BITMAP "tool/card_rotate_270.bmp" +tool/card_add IMAGE "tool/card_add.png" +tool/card_add_multiple IMAGE "tool/card_add_multiple.png" +tool/card_del IMAGE "tool/card_del.png" +tool/card_rotate IMAGE "tool/card_rotate.png" +tool/card_rotate_0 IMAGE "tool/card_rotate_0.png" +tool/card_rotate_90 IMAGE "tool/card_rotate_90.png" +tool/card_rotate_180 IMAGE "tool/card_rotate_180.png" +tool/card_rotate_270 IMAGE "tool/card_rotate_270.png" -tool/keyword_add BITMAP "tool/keyword_add.bmp" -tool/keyword_del BITMAP "tool/keyword_del.bmp" +tool/keyword_add IMAGE "tool/keyword_add.png" +tool/keyword_del IMAGE "tool/keyword_del.png" -tool/help BITMAP "tool/help.bmp" +tool/help IMAGE "tool/help.png" // -------------------------------------------------------- : Symbol editor @@ -60,23 +60,25 @@ cursor/rotate CURSOR "cursor/rotate.cur" cursor/shear_x CURSOR "cursor/shear_x.cur" cursor/shear_y CURSOR "cursor/shear_y.cur" -tool/line BITMAP "tool/line.bmp" -tool/curve BITMAP "tool/curve.bmp" -tool/lock_free BITMAP "tool/lock_free.bmp" -tool/lock_dir BITMAP "tool/lock_dir.bmp" -tool/lock_size BITMAP "tool/lock_size.bmp" +tool/line IMAGE "tool/line.png" +tool/curve IMAGE "tool/curve.png" +tool/lock_free IMAGE "tool/lock_free.png" +tool/lock_dir IMAGE "tool/lock_dir.png" +tool/lock_size IMAGE "tool/lock_size.png" -tool/circle BITMAP "tool/circle.bmp" -tool/rectangle BITMAP "tool/rectangle.bmp" -tool/triangle BITMAP "tool/triangle.bmp" -tool/star BITMAP "tool/star.bmp" +tool/circle IMAGE "tool/circle.png" +tool/rectangle IMAGE "tool/rectangle.png" +tool/triangle IMAGE "tool/triangle.png" +tool/star IMAGE "tool/star.png" -tool/mode_select BITMAP "tool/mode_select.bmp" -tool/mode_rotate BITMAP "tool/mode_rotate.bmp" -tool/mode_curve BITMAP "tool/mode_curve.bmp" -tool/mode_paint BITMAP "tool/mode_paint.bmp" -tool/apply BITMAP "tool/apply.bmp" -tool/duplicate BITMAP "tool/duplicate.bmp" +tool/mode_select IMAGE "tool/mode_select.png" +tool/mode_rotate IMAGE "tool/mode_rotate.png" +tool/mode_curve IMAGE "tool/mode_curve.png" +tool/mode_paint IMAGE "tool/mode_paint.png" +tool/apply IMAGE "tool/apply.png" +tool/duplicate IMAGE "tool/duplicate.png" +tool/grid IMAGE "tool/grid.png" +tool/grid_snap IMAGE "tool/grid_snap.png" combine_or IMAGE "tool/combine_or.png" combine_sub IMAGE "tool/combine_sub.png" @@ -93,19 +95,19 @@ handle_center IMAGE "../common/handle_center.png" // -------------------------------------------------------- : Other -sort_asc IMAGE "other/sort_asc.bmp" -sort_desc IMAGE "other/sort_desc.bmp" -plus IMAGE "other/plus.bmp" -minus IMAGE "other/minus.bmp" +sort_asc IMAGE "other/sort_asc.png" +sort_desc IMAGE "other/sort_desc.png" +plus IMAGE "other/plus.png" +minus IMAGE "other/minus.png" selected IMAGE "other/selected_yes.png" deselected IMAGE "other/selected_no.png" bool_yes IMAGE "../common/bool_yes.png" bool_no IMAGE "../common/bool_no.png" -//help_book BITMAP "help_book.bmp" -//help_book_open BITMAP "help_book_open.bmp" -//help_page BITMAP "help_page.bmp" +//help_book BITMAP "help_book.png" +//help_book_open BITMAP "help_book_open.png" +//help_page BITMAP "help_page.png" about IMAGE "../common/about.png" two IMAGE "../common/two_beta.png" diff --git a/src/resource/msw/tool/apply.bmp b/src/resource/msw/tool/apply.bmp deleted file mode 100644 index 5617b207567fb658ebae79cb7e4ef560a6603df4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 310 zcmZvU!4ZTY5Cq4n3qUil_C*92fPd5RP4OZuGUIwzMIQ&u(7QXZ?cYhU4m_a+&1ljG zms(<_LM8_+W!Q6#aDm6mRKy Y=;lJ`W*-b@Fqpx^B|Tj2#dVeR1BjSdi2wiq diff --git a/src/resource/msw/tool/apply.png b/src/resource/msw/tool/apply.png new file mode 100644 index 0000000000000000000000000000000000000000..8fd541393874625af905c9a4385894d9f6f725d2 GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0kYI^x zM2T~LZf7!#&%mSt( z+Z!vC1&SMvdR)liI-=kBLqeeV(9zB-Im}1m8-9ohbT2p|xG<8t<37_zX@#((6Vw+( zvUSKaezaHkc6b%rsQ~szb_!+glUP_Uu`2xIKN4IJ#iXLLz>h`q59g7rfRk}6Zlq3e zIQ)<)Tj3wu)eVvzvW-9V1^zQ8)$Y0H@~Fgt_Xm5goGI+ZBxvXh($ diff --git a/src/resource/msw/tool/bold.png b/src/resource/msw/tool/bold.png new file mode 100644 index 0000000000000000000000000000000000000000..4cbcf7c3ce92d6cc3190319e4713357fff5a76e3 GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`7M?DSAr-fh6C^%02=@M;@A7p9 zQ%0M?BSB_nHLtw~T;3Wei176++0`KEd%1p9bz|m%%Lg?Q5*Qd7=CTRgI3h0&G=ss@ L)z4*}Q$iB}8$CjveMt^y|d`LtmS)F2#5#(c>n--003|R*=xI@00001bW%=J z06^y0W&i*HYDq*vRCwBr&PNV_FbqV|gc*A89qxZiAYc#@3;rUKpJK^M?d7X_2fjwF zL49^Xi^>h+p-&9t0H(6oUnerKkX1R8tnE-%+=64~*r_iNfXCc<0x_6Gq3<;U7HZ3M i!*#_2(*GY%>Z1);p971@j#kwG0000qTZj#3AbM-@o6}(*qH~Z9K>vxOyO)4(5wa6=jHHShMTJ=DjcWAAEl1 z=<^#VpWnZ9|H<7eFJGQSb`Q|~TTZ*E8OZ~N>FrWT;XAnF+^7=UU( zsF;DFfq|hC#s!MRF~A)L^b172@?vG6Ga!hgg9E4qXbW6q&5@UI?<3rEkzVZEam}jX;$U07*X(5~3bi1jvRd Q#6ko8!cf3~MFL3(0HK!T7ytkO diff --git a/src/resource/msw/tool/card_add_multiple.png b/src/resource/msw/tool/card_add_multiple.png new file mode 100644 index 0000000000000000000000000000000000000000..392db885292f86c9d9896d970c16292a9d7a5d4d GIT binary patch literal 383 zcmV-_0f7FAP)(<%M+Rdsg)H^x~Vj=9ou}jEvOXFMd*r0LVG?8>yS>7wbxtklc4 z%;r78)V8wH-?r4Y)WWuiiiC!Wgo=iSiiU-XhJ=EOdWwR32#5#(c>n--003|Ra_${A z00001bW%=J06^y0W&i*Hkx4{BRCwBLkJk>uFbqZQ#AegMDjm?4z32b`8%~n~Lfi){ z_vpk*03_2Ve4-`9W@-nvhduE*Ivo+Q0_#gjDb|tuM087HnTyeIAmG8ACU<7e+O1|N zKrgTJm{;ST^lo6lF3O2*pZEqe`USD=8?OS`p-lFLf$z<%p-|Ov1}gUo_1Dlp27ozy d84kVw@&aka2r(HbB1QlJ002ovPDHLkV1k5+wlDwy literal 0 HcmV?d00001 diff --git a/src/resource/msw/tool/card_del.bmp b/src/resource/msw/tool/card_del.bmp deleted file mode 100644 index 4e9c59682948dd09bc3b504fdeef0e0785672dc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H0s;3voj*M1X#r}iO&m4Vz~bpaJCc0C6)!1mYKDSu{2S!(Il4smOw0Ejh>{$ZP=9AOr9K diff --git a/src/resource/msw/tool/card_del.png b/src/resource/msw/tool/card_del.png new file mode 100644 index 0000000000000000000000000000000000000000..8ba45b396bf106e795be1eb3d539ab9592bb1201 GIT binary patch literal 288 zcmV+*0pI?KP)BOw(!N2Iev*^04=*vINwa>}v>CEOmveMtZ005N$0CfNWVE_Q-sklM_0004W zQchCLiXTCz#AeM9Qi>1>L7suUn-0+;0>|U-gsm;@GRo m+zeiXo?BdBgg+V&@WBqmxdb#|bTwrF0000)tBxwo`qFE1+r&M zc(QZ$qw`zO-oLa7s0B?uPytY6&9j&Gr(a;xavxbeP%$uULF!*#w|#a7$VCP~TYwJ3 zq5hEV%L&L@N?M-+9R~CZ4)tr+ygUT71?VuK6>E;XT(j%N=Dja~-bYpsbPP}yD1slL Xr3auExCk;EE{MqhDuVz_DP$1zR)ZOIY(%-`Atmnzt=f%wD!N1JrJFL$1tm&-j#H_N?-{`%w=(?=v%Ri9mJ>`XTC0yz600001bW%=J06^y0W&i*HVo5|n zRCwB@k4X-IFbo5ex|9|u`_BLW38*RC6-zmIVp$0h5deA$GMDFDVb6V*8VvK~BgoeB zsM(Stg7ox&&RIIlQa4C+#r}iO&m4VzYvJbV`pSxRzi?hY5?ocNsX=3XST9um<4s>(;MNKd_Y1moMJu@=>-m$C8=cf+m|Y@Rhli_L}Uq Q0D6bP)78&qol`;+07U+50ssI2 literal 0 HcmV?d00001 diff --git a/src/resource/msw/tool/card_rotate_180.bmp b/src/resource/msw/tool/card_rotate_180.bmp deleted file mode 100644 index 43915049bfb0c3cd53910a86efa1955bb068cdb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H0s;3voj*M1XuX*fTK;kkP!>}?%z+Gn)lZ#fJhM9e!s6K(ir=QEpu@1Lzkl}%Q2f-^vuIj?e!;5#$;*>Z zz*;V!e181sbD;M(?|lLEK2R|?H#eI5f$sVB9|VB1Kn5Ijb#(znu!av%4Nx2ifC`WS vP#h?T)qIGtKr_Ksfe0WQVh&dIK=UyXR`oy|;bvkoFx>+b!4J^fLpv@2@fq@z diff --git a/src/resource/msw/tool/card_rotate_180.png b/src/resource/msw/tool/card_rotate_180.png new file mode 100644 index 0000000000000000000000000000000000000000..a415690e6e7925197b1cbb6bab89ecbc71775df6 GIT binary patch literal 342 zcmV-c0jd6pP)+5l;ZftBsw}FA- zHxMC9pc?cWQv<@1?(PYtrKJ#&?(S~ven7ICwV|P*tgH+!SXx>D6vSmi3nL@r|Np<> zB0$?18QB^ds%{5P*8|Idxfl;$@m9@AhwupXlPZ`Qv)*O zQhj6!a^b3Ua7X!!{f(+cu3`PvB ouNZzK8^;JqMZ~8iMpBbE0H;QBl8V+VegFUf07*qoM6N<$f}Tp0(f|Me literal 0 HcmV?d00001 diff --git a/src/resource/msw/tool/card_rotate_270.bmp b/src/resource/msw/tool/card_rotate_270.bmp deleted file mode 100644 index 1d5af7ffb73da72e7a704292f79383e0b16d0ac6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H0s;3voj*M1XkR+YpW(l#{6+lg zLY|q~SUir`q25{I(p6iBPno3>hpYGaHML6!*vvFwPC0MxRJWt(JLd$O-CzIM=NKTOcC&Hm8;|21yc8G2ZhCbKD@6_!6K#jw2~{GxD< SlrAs`7(8A5T-G@yGywqP$bj4c literal 0 HcmV?d00001 diff --git a/src/resource/msw/tool/card_rotate_90.bmp b/src/resource/msw/tool/card_rotate_90.bmp deleted file mode 100644 index 59a50d7ba33a2e388c30fa8961963fca3e6769d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H0s;3voj*M1X=*)gQ8bIl=bX8T->OfFZGF*9)L>pc-TnRsD6iVo1m#tAwyo z)IWO(F&P%jAR3?fS6{l%cotUuw50VZQ01AU&k2}+TjGRq<+^6pvgeR zJ7+(Na))bpOfSD=%N31Zn{S cpe+yp)QcQGKrSZW<_4xsC;-aB)zg##0CDyIBLDyZ diff --git a/src/resource/msw/tool/card_rotate_90.png b/src/resource/msw/tool/card_rotate_90.png new file mode 100644 index 0000000000000000000000000000000000000000..37571deacbfbb2e2836df65158922126a51090e8 GIT binary patch literal 331 zcmV-R0kr;!P)rp1>F)0S`t>V>-O$kB;NSq&00ild z_6#h%3@ki9IN85)vwr1aH5V5LivR!rAEKbKu@S{djDNoTJ$>f)rHAhxf4KMcH&As~ zR~OJ!WTmKn`1_Ob>m8=A_eGz*T9#K06euk%#pwr-4O|Qi-ySi74Onqt+4GY(@Oc^p z1Q{4*KmLCV(gOm2z7PslK?Ww{AJVO>q^o;?JV|R4Mn*<_8s0H8JdytQ;BWc3f{racbGHgS$!32xu#SMs7`E0ans|x)o@`uTwhL_BQSJZ x8f*5!BwA+8P)2CVITMscJ*GCg?WP{I> zi`E(3_AF7#c?z8oX4P5=Y?RD=f*fDb$`uhL)(81eDI~59AIuK-;otW-eecC{>!}1a Ro+K|>wyCY{{R0E}S1o;IsI6S+N2IO!SctjR6FmMZjFyp1Wb$>vDC9V-A&iT2ysd*&~44qoNY(PO* zPZ!6KiaDwM(Oe7$9EZ2;{Xh3PbL2&XZxdY$(xgSSYyvJHQe-NO_;V;yd^tmu#nO(0 s^Cl_DZ*g$jJVT^cM7hjx&i**LzHN-$2iAY92O7xW>FVdQ&MBb@0PSKwh5!Hn literal 0 HcmV?d00001 diff --git a/src/resource/msw/tool/curve.bmp b/src/resource/msw/tool/curve.bmp deleted file mode 100644 index 120e242714274c47fe66d0fe24375e251cb8b0db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmZupyAgme2*o>#oRwoZhrR1qQ&KpDqoiaa+xQ+}CkgMH%YHnPbAmSPT06-cg$Dis z8kVX_KuD}g?;XX6D`QY$aTo!tMoa0<;IhwKOP>s_SpkC^>bP0l+XkKflnhm literal 0 HcmV?d00001 diff --git a/src/resource/msw/tool/duplicate.bmp b/src/resource/msw/tool/duplicate.bmp deleted file mode 100644 index 572598f4ceafbe0dc8ff7ac2e736684e6e4220e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 822 zcmcIhu?>JQ3=3jpK}?*$1wDYBEBYv(a0-|jB8x15RI8~>;>MPkm(*H8!abq-s~Q_i z-!LCK78_=3W#pV64(#l~+B^D0xeKsRIX)>xR1^}4*7kx^$74OzXyIp4#flqtpET3 diff --git a/src/resource/msw/tool/duplicate.png b/src/resource/msw/tool/duplicate.png new file mode 100644 index 0000000000000000000000000000000000000000..42296b7629a3c399b25922ed0e8c6a83fbfe5ee5 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?bJ#gSaa&j^Q!+#*SfB(ME z|5AUT6k|z{UoeBivm0qZj+3X0V@SoVgILjWYtq~Yzitwg zSr43wOgU!;wNbTtLo7eS(g#vV35%ZClROJeMT*{w?48CCj5qB*f0&$PagIIJaREMn BIivsp diff --git a/src/resource/msw/tool/find.png b/src/resource/msw/tool/find.png new file mode 100644 index 0000000000000000000000000000000000000000..589944b3bfa7d7ef0d5350e11bca6cbf1dfd458d GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|t_Kbr05bpo|KGb%L=DJd zED7=pW^j0RBMr#0_H=O!skoJ#z`%HnAyC24QRq|>FK1~&0=H*rf&ecsZ$bx;4{xK; sLI))i6_XaltBt%~Emj-a3=S|de0Jcurx*VJCD0fKPgg&ebxsLQ0Pl1u;Q#;t literal 0 HcmV?d00001 diff --git a/src/resource/msw/tool/grid.png b/src/resource/msw/tool/grid.png new file mode 100644 index 0000000000000000000000000000000000000000..441910a7abd6869fa3d33b192fa30f3f96da50f4 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^f) zYeb22er|4RUI_z3r&cdWL$#-iV@SoEqZ2N29#G(MF`is(5wcw)@A39(i{qlK-aQ+S z1id`2XgPVgc$cA&xNOVRT~*Nv`6ZWcb6cjHd~|#Hd1hnOEGLc+_xJ_QhAVn-7VxQm zy_x=RyTH8jT$OiD?l0W-cFDY;YjaB!6yJ(#ExCBQL1e$V0M#u6{1-oD!M$0)W9!&^wkArml){_=?1V#DVeNa2Kj-TbL|t4D_H(u19v+;( zAKAAwu^J4MpP6BdfjKAiZ!umy4{XIi1YP?!M9wKRjHB?krAYJ$Gp&Dd8E0i@@!pC8 aMVS&6zpx`koao#4lb6}JG6loUoeBivm0qZPN1iYV@Sm<-LnS;8yq;84|MQKXj!Z{u#w6A*L%+gC)Cf_ zaWI^4a`#z&()8@2qh6C_@1$Ixu<_()jZX~*CzS)9ynp+%Ln?j!jC=m;JL@*Tx@>K) X6V4&|ZgS&spy3Rju6{1-oD!Ma9-3PK5 zOM?7@862M7NCR>-JzX3_DsCkwI577tR4`)dn91aDhehGwO9qt)>4p|9k072kXBru$ a85rswFf+ciJ5dAF#Ng@b=d#Wzp$PylLnI*p literal 0 HcmV?d00001 diff --git a/src/resource/msw/tool/keyword_add.bmp b/src/resource/msw/tool/keyword_add.bmp deleted file mode 100644 index 99dd9542ddb53091fd5e56d150a1947eeb259ef8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H0s;3voj*M1XwyCY{{R2q(9ke*=1kG4 zq72y#%T8RMka&inV(r_nKTd6XR$pJQyjYp9kB^~&fuWdzA&z1D<$GQGuXgUc+7DD# zxt61YgQ1dvp@M;-fMFiT%zZ$U8B2ovf*Bm1-ADs+Vm)0PLn?0do{r>eP~dS5JYdJJ zR(S1i{uMWcjHE@+7klPMDbBDxBK*+!%l4x}7hlPq7b#otUAkexlrGOwK2zykGHOnz zrx~&?=H#8d)l+;@)1D{dk*=yK|Mj^(K4MumiD~x)X_e_fix@mz{an^LB{Ts5+QMET literal 0 HcmV?d00001 diff --git a/src/resource/msw/tool/keyword_del.bmp b/src/resource/msw/tool/keyword_del.bmp deleted file mode 100644 index e60e7b38974c133b187fb4f72f6cf415faed8a6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H0s;3voj*M1XMjMg2f=pe&|;ukPzyTgkAt0u@yhZO7BMiKhiCzcGceQx5s-lf z(A)#olEc6NMCeXMQwisS9hL*<;%9)J0rUvSFZfjgWg%{cD1-O~j}``oy$lRfkrhDv Jf-Hi}1^{Ka0mA?Q diff --git a/src/resource/msw/tool/keyword_del.png b/src/resource/msw/tool/keyword_del.png new file mode 100644 index 0000000000000000000000000000000000000000..5cda23a751a75505870a5c4decb7ecac89740bee GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!M}SX=>wyCY8X6k@|NlR8=FEBq zh6#yh7%JADXJA;)z>veh5W&E(?8NoAUw>@BeDBn@XZ7{<{XhkkYrFPe?c8^DF9X9= z28L1whC~L2r`sZq0?lMB3GxeOaCmkj4akZ0ba4!+xHa{(H(!GSkLyLT)d2z@-v2At z;^zopr09im@Gynhq literal 0 HcmV?d00001 diff --git a/src/resource/msw/tool/line.bmp b/src/resource/msw/tool/line.bmp deleted file mode 100644 index 587e557e4dad2934ed8531a643c2a072f02842c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmZ?r{l)+RWk5;;hy|dSk%0v)(Eui~5kMJ`WJ3dl0+K)`5H~O!IB)lOwK|>wyCYfJ}z}Afn8k>o$;L zED7=pW^j0RBMr#mEbxddW?mdKI;Vst0EO`? A$p8QV literal 0 HcmV?d00001 diff --git a/src/resource/msw/tool/lock_dir.bmp b/src/resource/msw/tool/lock_dir.bmp deleted file mode 100644 index 491975dcf97849e142f529a4b9afc12d54a323f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 330 zcmb78$qj%o40C9akoX{`U=E&@*oigRrUS4OI4MWUk4R2qJ8eBLNnn-OCt|oD=u8Lw zu`g(gQu@l{0CsH1IRmk(-#k_ikbJop%ySE6d;|_b(`X10K@7pTD$>YJEHHf+ys~)h MwL-=Cf%A0h1R}EvRR910 diff --git a/src/resource/msw/tool/lock_dir.png b/src/resource/msw/tool/lock_dir.png new file mode 100644 index 0000000000000000000000000000000000000000..d9237dc8326059a6fc5b42f199a0619ed38e4e93 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDUJ#gRvkU5j#3_}A0!+#)? z09Y#6-wjm4SQ6wH%;50sMjDXAS>O>_%)r1c1j3A$?$-SQ36{7OmSQ6wH%;50sMjDXAS>O>_%)r1c1j3A$?$-SQ36{7WfHzyZ?^Hsk?AchkE0&g7hmZO6_{e!T>iKB t7_(;4)twF|8jD>Umj^yOz`Tdy{*%efT#j~&e1L{Ac)I$ztaD0e0sx#6KVtv@ literal 0 HcmV?d00001 diff --git a/src/resource/msw/tool/lock_size.bmp b/src/resource/msw/tool/lock_size.bmp deleted file mode 100644 index e515b762fa2388b27d312c8bf31a837c86080cc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 330 zcmb79TMB?M3`=VT!5{Gyp2N?9ck*bvnf5W}=HCM8(xffyyb{5Yv>wW>kg&K9&G$7p zhg0eU+$#0SIRnxHGTL_ww%i_Y{TZSDech-*H%E4pnaxy94xTuKdm@_KH*9tgFSY#% A+W-In diff --git a/src/resource/msw/tool/lock_size.png b/src/resource/msw/tool/lock_size.png new file mode 100644 index 0000000000000000000000000000000000000000..43aa7241e87c8f1f4c13cd7386d53629dde794a8 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDUJ#gRvkog~o8z2;rg%9jn zthpR0&sY-V7tG-B>_!@p!&%@FSf#L@XzZSy3*3wv9Mr)ojZYIVS~=IYlE0R;{$7qtZ(LP z%MQbO4)*(}QU}2I@1WBy4^6%snWU4Q=+i-uJ8tHb0=YU zcU|rdjw>Dc2*(k|*I+k7d;@kPNY-HgrWxQB{vTorIa^&|evgd3{~J5;lw{aRe3$|J Caq=7h diff --git a/src/resource/msw/tool/mode_curve.png b/src/resource/msw/tool/mode_curve.png new file mode 100644 index 0000000000000000000000000000000000000000..9d1d477a0b561a35d0bd472eeab800201b450d23 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VWJ#gRvkoo`r|KQ+Yh6W&u zfhWV_8c>L_B*-tA!Qt7BG$6;v)5S5Q;+AReLCymPJk0#N8s_re;be+iaG~V?)LADw z<(^qI^7OQy`kuzs=2*6);M&s5K4)7N#O!|Suwv$h5XYPXbH_LG)$F?3?jd!u0c?C8 TkM}JCn#gTe~DWM4ft1dlC literal 0 HcmV?d00001 diff --git a/src/resource/msw/tool/mode_paint.bmp b/src/resource/msw/tool/mode_paint.bmp deleted file mode 100644 index fea6990f6f81a61c442ac4de2bb81f201385fabb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 822 zcmchR!3}^Q5CqTo^kaNkf)!AJe|w@dJHrj&X5olWF9GIu=fQb}+42P32hLj0WP8pH z{kD`-0<&A@%?7Vn4MI&R#Ta=55H^x5|M>WW&i8-N`jIa;=*^Nek}POtt2hj)b#1p& kQ=mi8)-yGNcQm0!(AG0Gf_F5bM$pzXHG+4#1m;kF0B^e2wg3PC diff --git a/src/resource/msw/tool/mode_paint.png b/src/resource/msw/tool/mode_paint.png new file mode 100644 index 0000000000000000000000000000000000000000..6bafb8a61f5f94fd06de864b197f4f9d8584f949 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9JOMr-t_Kbr05bpo|KHHiQ2k*! zFOb7n666=m;PC858jz#u>EaktaVt3?fg=G3QVzOrFks?jWMgMzyBHv$xRuMps0Bje z(hFCEtPGirtPw5_XTW8N5rHd)FwnH1anTe5xo8T|xC5>p(}l<)xLk`Y4rD{P5E9cz X5D~Z;M1%fy~fDm+OEOV@Z%- zFoVOh8)-m}wx^3@NX4z>go1!3lsc3Z5uBg{cz0(v(@(yHVoUr70|_C0O}iguG>?M1A?GItTYYXg zUnV98X6JvwmEu0&%L9#aMe(sp!FUu5!AAKEFc>SF{O2KKIVOzmMI2Gq6~ivZu=NRU UeU4xL6W3nB;YCcZV|vs)ZpG9KPXGV_ diff --git a/src/resource/msw/tool/mode_select.png b/src/resource/msw/tool/mode_select.png new file mode 100644 index 0000000000000000000000000000000000000000..1b8b7e9b4155d32da3834c6fa5caae270b8a03f9 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|t_Kbr`2YVukXO4aq7_In zmIV0)GdMiEkp|=#d%8G=RNP8V$VgylVpT|D>zKi&w5*9`xmrU9hkziP(x!$cW5=X! kha_LYf~yHm&5S$@f9G&toH@60FHk#!r>mdKI;Vst07#iBpa1{> literal 0 HcmV?d00001 diff --git a/src/resource/msw/tool/new.bmp b/src/resource/msw/tool/new.bmp deleted file mode 100644 index dfbcc5217508daaba636c8d402055bf7cc636c67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmbu2F%Ez*3#+wH{RUmc diff --git a/src/resource/msw/tool/new.png b/src/resource/msw/tool/new.png new file mode 100644 index 0000000000000000000000000000000000000000..58c53436a089cbb31cf795ca06919474d75136e3 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|t_Kbr`2YVukXO4aq7_In zmIV0)GdMiEkp|?bdb&7SBGqvsi$Q3ii(t&^FjIpAj0|~e W`R6WJ<=YR`z~JfX=d#Wzp$P!_Y9ny~ literal 0 HcmV?d00001 diff --git a/src/resource/msw/tool/no_auto.bmp b/src/resource/msw/tool/no_auto.bmp deleted file mode 100644 index a4e4fec4b2b8766caaba5584b2ad2e14fd5e03bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 822 zcmbtS!3}^Q46O0#$M|vtCtv{o&gmMC=1H-XmY`8$vG%UVmAG!9r?>+41u>@RXpVIP zJ`EgPAUggnqTM_VJup35ErJ$hZ2_5ENEo4 yU>^9o*tdKmXg<9@6R-o4Q%YKzQTdVdf;3r<6NXD3ZcO}Cl?@s_=f6&)AMz88q^{rq diff --git a/src/resource/msw/tool/no_auto.png b/src/resource/msw/tool/no_auto.png new file mode 100644 index 0000000000000000000000000000000000000000..8b805aba0892f5d2e6a6215a5d3eaaf511487e00 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|t_KbrSPo<}Fm$pBCjlwO zk|4ie28U-i(tsRCPZ!6Kid)GE49ph=6doQpap1s?tf|b*-PgPr*%*1v#1s@6RJI5; xv@Bzq5Rk|qB;?Sf+U&@%V#YznMZ8HM8_inTRo~7^>;)Re;OXk;vd$@?2>@eBDTV+5 literal 0 HcmV?d00001 diff --git a/src/resource/msw/tool/open.bmp b/src/resource/msw/tool/open.bmp deleted file mode 100644 index 59c9eeb7fff7e857e23e896341e79badcb888b78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmZ`xu?@p83}es^0z5cpbS#h$viF_N8hK7Wh_CA6!J({91xkygK*`!)A0*zghq!*Z z;GToO>VOLFX;QVKqqU~Nn1wN-6ZImJ@CO2{yNAp z#CL5Hc=CEiluPuaq!*W6GEdv2X>3@zUGZ1PoEkb<5)L>F1U&1&>>@wuMd6Mqqz0GT# g9M7|>Xp4cg%7-LD0UoeBivm0qZPL!vMV@SoVH%CSe)fs9WNnN|TIMsGp85wji z7&dz-1RMzr2oN|T%*n_&p=0&xNs}fiMY!C&5y7d$l%k>C;5uc>)F}&;j=2d4s;Vka i5ET$q2w-B|A^V-5J3L+eT-G@yGywn*6*?gR literal 0 HcmV?d00001 diff --git a/src/resource/msw/tool/rectangle.bmp b/src/resource/msw/tool/rectangle.bmp deleted file mode 100644 index 03c4cc363af8621a2e965453179f225a160e11ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmZ?r{l)+RWk5;;hy|dSk%0v)(EuccxFHxMhX4%>3_!%t&;X%;B#;Tj4Gaek8~{rE j2P206|3NGu211Y!km$exfZ9QTqX8mMJ`FVohcz7l3Y<@u diff --git a/src/resource/msw/tool/rectangle.png b/src/resource/msw/tool/rectangle.png new file mode 100644 index 0000000000000000000000000000000000000000..d4f8e2b9f417d589400f4e4e2fe550e33cab5754 GIT binary patch literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`s-7;6Ar-fh6C^%02zvcr9$+8I r*6`IJ@KtLdGg~vG&Wn#$OpFXh`7DCMJCY=U8W=oX{an^LB{Ts56x$fa literal 0 HcmV?d00001 diff --git a/src/resource/msw/tool/redo.bmp b/src/resource/msw/tool/redo.bmp deleted file mode 100644 index 6be53dcc76a083872c79f8e35ee84ee71c8748bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcma({u?>JQ3^Ni3a0Yjv4qf;LA;t`m@L9czwYUUE1Ws%xai;k|V3m#HaI-@n!K)ge shFO?Yqi86lD5zJX);5W%c9QTfe2dS8^pwb~^>M%VELWcBoN!WB&;S4c diff --git a/src/resource/msw/tool/redo.png b/src/resource/msw/tool/redo.png new file mode 100644 index 0000000000000000000000000000000000000000..ab7acd4a0e018dcae40c70c1613ea2838bf32c32 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|t_KbrU|?tff^d(PCqO~Q zk|4ie28U-i(tsQdPZ!6Kid)GE2bg9!HL|EXH!v`BGkY^kNMI3M!{}gmk%8?P8`~WQ ZhI|>OZKr>=JOJup@O1TaS?83{1ONcDBPaj> literal 0 HcmV?d00001 diff --git a/src/resource/msw/tool/reminder.bmp b/src/resource/msw/tool/reminder.bmp deleted file mode 100644 index f976f94c99899d8c19dea5287870e2aa95711815..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmZ`xu?>JQ3^Ni#B^JaL+`-N}%pP-AuVO7u(+YvWwPPoiy6qmdKI;Vst0LlU!djJ3c literal 0 HcmV?d00001 diff --git a/src/resource/msw/tool/save.bmp b/src/resource/msw/tool/save.bmp deleted file mode 100644 index e2720ebf5446a21bff2156863fd2707b988cdd5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmaKlF%Ez*3{10R? zmIV0)GdMiEkp|@Gd%8G=RNP8VU|_s>;er60CmWl%0At$H1;RlK7kW!930oV*l+?I` f@dS(Z36S~Q=kh#Q^jjw$sFlIf)z4*}Q$iB}Fybcd literal 0 HcmV?d00001 diff --git a/src/resource/msw/tool/star.bmp b/src/resource/msw/tool/star.bmp deleted file mode 100644 index 8aa3a833d9f2c0be6cc888c97ff86d97cce4d366..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmZ9Fu?>Yl3`2uNfkgAg6wE=-I@B&R)=l-><0avQgfEUGJJB8I-wGG9!{5Wn<_tvN z)?#EYWJZ}(LT7}s)*3<2vfg8Yys&8gg)owfd!$knSU{>gbnKPqe3y(M*W-XSF!ZrU GT;UCVL{Xmr diff --git a/src/resource/msw/tool/star.png b/src/resource/msw/tool/star.png new file mode 100644 index 0000000000000000000000000000000000000000..6319aeb7ebc9755ee37e3f6999d74784c131356e GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9-c0aAr-fdPITmBP~bQ`;m3dd z>$?pNoUY70opAWgrV|YH8|UhaFDNs-x{2?MhWWaJlKZ=yQx4CQ=ylri;rj|f4uz2B dvd;Xi49(7xpBatzwgAm!@O1TaS?83{1OQWcE?fWr literal 0 HcmV?d00001 diff --git a/src/resource/msw/tool/symbol.bmp b/src/resource/msw/tool/symbol.bmp deleted file mode 100644 index 6c8156605b938e0ec7add6cb9fc0816968c29b02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H0s;3voj*M1X-NU;&yS zgu8k3W&r^K0|Nsf11Pd;)hb0rML9V+tcoFmm6esikN~P_X=xD_76!6`3_R+AQhIuN zu)t%`(b2)Lc=F`QKnKIsr>CdmQeRwLtgNgIR|#i$d3kN!x)n`VcXv0?SaWl8D=RBo zTU!2BR0kYI^x zM2T~LZf0Dpe?))-U`z>2sXNR@(x$7zZKOTE%TW)fANoEAci{Emtfe%a+P8&r`E0q&C zZm8mU$maZWhHbgchHbmn@dw-Z+}`$~R^CxSfydb;kR@^&=K>9`wK2QaEq-nFMor`N zB&+-S`?Y<8*SywRXTZa}v{LTe=bG)u66>#*#xwLiuHj#?s;iCXu)}4O3nsna?r<}n z-eeFO`mj=N$Mf{dCI?M?nYbALoSvj|v-kAn|l5L literal 0 HcmV?d00001 diff --git a/src/resource/msw/tool/triangle.bmp b/src/resource/msw/tool/triangle.bmp deleted file mode 100644 index c1ba655e08b349256bc57cec4103fdc220b03fcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmZ9CyA6Oa3`7r!A`%T^3g)0^9cq^uD^t;iXD58b#djC^dD~Al9n^~F?m=S!BbTY! z*(;M6nYAMMVpAyvP-9f9|1i&2ME(mdrJR`vqrP^)L_}L)Kk_q_Qq;M1%fy~fDm+OEOV@Z%- zFoVOh8)-m}vZsq1O{d|gQP45MKN}PM*$3qjEn+74-z)~XAIJQ3uxm%!wz$|LDx_szeI%^MG6%*@M|B=#lE)_!T!(K2~-B diff --git a/src/resource/msw/tool/undo.png b/src/resource/msw/tool/undo.png new file mode 100644 index 0000000000000000000000000000000000000000..46cc72bdabbc1c6c58d050ccc5868e9df5608243 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0kYI^x zM2T~LZfnkF zFiA2NxGAtkYD1=rIm>d!78BuAhNF51(mBo