From 9e3af62f975a070d02f49752564c1a332416e249 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucio=20Andr=C3=A9s=20Illanes=20Albornoz?= Date: Mon, 8 Jan 2018 20:28:43 +0100 Subject: [PATCH] MiRCART{General,}Frame.py, assets/*.png: adds icons for tools. MiRCART{Frame,ToolText}.py: initial implementation of Text tool. --- MiRCARTFrame.py | 123 ++++++++++++++++++++++------------------- MiRCARTGeneralFrame.py | 37 +++++++++---- MiRCARTToolText.py | 52 +++++++++++++++++ assets/toolCircle.png | Bin 0 -> 360 bytes assets/toolLine.png | Bin 0 -> 371 bytes assets/toolRect.png | Bin 0 -> 220 bytes assets/toolText.png | Bin 0 -> 306 bytes 7 files changed, 144 insertions(+), 68 deletions(-) create mode 100644 MiRCARTToolText.py create mode 100644 assets/toolCircle.png create mode 100644 assets/toolLine.png create mode 100644 assets/toolRect.png create mode 100644 assets/toolText.png diff --git a/MiRCARTFrame.py b/MiRCARTFrame.py index 71372ce..7a92ebb 100644 --- a/MiRCARTFrame.py +++ b/MiRCARTFrame.py @@ -29,6 +29,7 @@ from MiRCARTGeneralFrame import MiRCARTGeneralFrame, \ from MiRCARTToolCircle import MiRCARTToolCircle from MiRCARTToolLine import MiRCARTToolLine from MiRCARTToolRect import MiRCARTToolRect +from MiRCARTToolText import MiRCARTToolText import os, wx @@ -38,48 +39,51 @@ class MiRCARTFrame(MiRCARTGeneralFrame): canvasPos = canvasSize = cellSize = None # {{{ Commands - # Id Type Id Labels Icon bitmap Accelerator [Initial state] - CID_NEW = (0x100, TID_COMMAND, "New", "&New", wx.ART_NEW, (wx.ACCEL_CTRL, ord("N"))) - CID_OPEN = (0x101, TID_COMMAND, "Open", "&Open", wx.ART_FILE_OPEN, (wx.ACCEL_CTRL, ord("O"))) - CID_SAVE = (0x102, TID_COMMAND, "Save", "&Save", wx.ART_FILE_SAVE, (wx.ACCEL_CTRL, ord("S"))) - CID_SAVEAS = (0x103, TID_COMMAND, "Save As...", "Save &As...", wx.ART_FILE_SAVE_AS, None) - CID_EXPORT_AS_PNG = (0x104, TID_COMMAND, "Export as PNG...", \ - "Export as PN&G...", None, None) - CID_EXPORT_IMGUR = (0x105, TID_COMMAND, "Export to Imgur...", \ - "Export to I&mgur...", None, None, haveUrllib) - CID_EXPORT_PASTEBIN = (0x106, TID_COMMAND, "Export to Pastebin...", \ - "Export to Pasteb&in...", None, None, haveUrllib) - CID_EXIT = (0x107, TID_COMMAND, "Exit", "E&xit", None, None) - CID_UNDO = (0x108, TID_COMMAND, "Undo", "&Undo", wx.ART_UNDO, (wx.ACCEL_CTRL, ord("Z")), False) - CID_REDO = (0x109, TID_COMMAND, "Redo", "&Redo", wx.ART_REDO, (wx.ACCEL_CTRL, ord("Y")), False) - CID_CUT = (0x10a, TID_COMMAND, "Cut", "Cu&t", wx.ART_CUT, None, False) - CID_COPY = (0x10b, TID_COMMAND, "Copy", "&Copy", wx.ART_COPY, None, False) - CID_PASTE = (0x10c, TID_COMMAND, "Paste", "&Paste", wx.ART_PASTE, None, False) - CID_DELETE = (0x10d, TID_COMMAND, "Delete", "De&lete", wx.ART_DELETE, None, False) - CID_INCRBRUSH = (0x10e, TID_COMMAND, "Increase brush size", \ - "&Increase brush size", wx.ART_PLUS, (wx.ACCEL_CTRL, ord("+"))) - CID_DECRBRUSH = (0x10f, TID_COMMAND, "Decrease brush size", \ - "&Decrease brush size", wx.ART_MINUS, (wx.ACCEL_CTRL, ord("-"))) - CID_SOLID_BRUSH = (0x110, TID_SELECT, "Solid brush", "&Solid brush", None, None, True) - CID_RECT = (0x111, TID_SELECT, "Rectangle", "&Rectangle", None, None, True) - CID_CIRCLE = (0x112, TID_SELECT, "Circle", "&Circle", None, None, False) - CID_LINE = (0x113, TID_SELECT, "Line", "&Line", None, None, False) - CID_COLOUR00 = (0x114, TID_COMMAND, "Colour #00", "Colour #00", None, None) - CID_COLOUR01 = (0x115, TID_COMMAND, "Colour #01", "Colour #01", None, None) - CID_COLOUR02 = (0x116, TID_COMMAND, "Colour #02", "Colour #02", None, None) - CID_COLOUR03 = (0x117, TID_COMMAND, "Colour #03", "Colour #03", None, None) - CID_COLOUR04 = (0x118, TID_COMMAND, "Colour #04", "Colour #04", None, None) - CID_COLOUR05 = (0x119, TID_COMMAND, "Colour #05", "Colour #05", None, None) - CID_COLOUR06 = (0x11a, TID_COMMAND, "Colour #06", "Colour #06", None, None) - CID_COLOUR07 = (0x11b, TID_COMMAND, "Colour #07", "Colour #07", None, None) - CID_COLOUR08 = (0x11c, TID_COMMAND, "Colour #08", "Colour #08", None, None) - CID_COLOUR09 = (0x11d, TID_COMMAND, "Colour #09", "Colour #09", None, None) - CID_COLOUR10 = (0x11e, TID_COMMAND, "Colour #10", "Colour #10", None, None) - CID_COLOUR11 = (0x11f, TID_COMMAND, "Colour #11", "Colour #11", None, None) - CID_COLOUR12 = (0x120, TID_COMMAND, "Colour #12", "Colour #12", None, None) - CID_COLOUR13 = (0x121, TID_COMMAND, "Colour #13", "Colour #13", None, None) - CID_COLOUR14 = (0x122, TID_COMMAND, "Colour #14", "Colour #14", None, None) - CID_COLOUR15 = (0x123, TID_COMMAND, "Colour #15", "Colour #15", None, None) + # Id Type Id Labels Icon bitmap Accelerator [Initial state] + CID_NEW = [0x100, TID_COMMAND, "New", "&New", ["", wx.ART_NEW], [wx.ACCEL_CTRL, ord("N")]] + CID_OPEN = [0x101, TID_COMMAND, "Open", "&Open", ["", wx.ART_FILE_OPEN], [wx.ACCEL_CTRL, ord("O")]] + CID_SAVE = [0x102, TID_COMMAND, "Save", "&Save", ["", wx.ART_FILE_SAVE], [wx.ACCEL_CTRL, ord("S")]] + CID_SAVEAS = [0x103, TID_COMMAND, "Save As...", "Save &As...", ["", wx.ART_FILE_SAVE_AS], None] + CID_EXPORT_AS_PNG = [0x104, TID_COMMAND, "Export as PNG...", \ + "Export as PN&G...", None, None] + CID_EXPORT_IMGUR = [0x105, TID_COMMAND, "Export to Imgur...", \ + "Export to I&mgur...", None, None, haveUrllib] + CID_EXPORT_PASTEBIN = [0x106, TID_COMMAND, "Export to Pastebin...", \ + "Export to Pasteb&in...", None, None, haveUrllib] + CID_EXIT = [0x107, TID_COMMAND, "Exit", "E&xit", None, None] + CID_UNDO = [0x108, TID_COMMAND, "Undo", "&Undo", ["", wx.ART_UNDO], [wx.ACCEL_CTRL, ord("Z")], False] + CID_REDO = [0x109, TID_COMMAND, "Redo", "&Redo", ["", wx.ART_REDO], [wx.ACCEL_CTRL, ord("Y")], False] + CID_CUT = [0x10a, TID_COMMAND, "Cut", "Cu&t", ["", wx.ART_CUT], None, False] + CID_COPY = [0x10b, TID_COMMAND, "Copy", "&Copy", ["", wx.ART_COPY], None, False] + CID_PASTE = [0x10c, TID_COMMAND, "Paste", "&Paste", ["", wx.ART_PASTE], None, False] + CID_DELETE = [0x10d, TID_COMMAND, "Delete", "De&lete", ["", wx.ART_DELETE], None, False] + CID_INCRBRUSH = [0x10e, TID_COMMAND, "Increase brush size", \ + "&Increase brush size", ["", wx.ART_PLUS], [wx.ACCEL_CTRL, ord("+")]] + CID_DECRBRUSH = [0x10f, TID_COMMAND, "Decrease brush size", \ + "&Decrease brush size", ["", wx.ART_MINUS], [wx.ACCEL_CTRL, ord("-")]] + CID_SOLID_BRUSH = [0x110, TID_SELECT, "Solid brush", "&Solid brush", None, None, True] + + CID_RECT = [0x150, TID_SELECT, "Rectangle", "&Rectangle", ["toolRect.png"], [wx.ACCEL_CTRL, ord("R")], True] + CID_CIRCLE = [0x151, TID_SELECT, "Circle", "&Circle", ["toolCircle.png"], [wx.ACCEL_CTRL, ord("C")], False] + CID_LINE = [0x152, TID_SELECT, "Line", "&Line", ["toolLine.png"], [wx.ACCEL_CTRL, ord("L")], False] + CID_TEXT = [0x153, TID_SELECT, "Text", "&Text", ["toolText.png"], [wx.ACCEL_CTRL, ord("T")], False] + + CID_COLOUR00 = [0x1a0, TID_COMMAND, "Colour #00", "Colour #00", None, None] + CID_COLOUR01 = [0x1a1, TID_COMMAND, "Colour #01", "Colour #01", None, None] + CID_COLOUR02 = [0x1a2, TID_COMMAND, "Colour #02", "Colour #02", None, None] + CID_COLOUR03 = [0x1a3, TID_COMMAND, "Colour #03", "Colour #03", None, None] + CID_COLOUR04 = [0x1a4, TID_COMMAND, "Colour #04", "Colour #04", None, None] + CID_COLOUR05 = [0x1a5, TID_COMMAND, "Colour #05", "Colour #05", None, None] + CID_COLOUR06 = [0x1a6, TID_COMMAND, "Colour #06", "Colour #06", None, None] + CID_COLOUR07 = [0x1a7, TID_COMMAND, "Colour #07", "Colour #07", None, None] + CID_COLOUR08 = [0x1a8, TID_COMMAND, "Colour #08", "Colour #08", None, None] + CID_COLOUR09 = [0x1a9, TID_COMMAND, "Colour #09", "Colour #09", None, None] + CID_COLOUR10 = [0x1aa, TID_COMMAND, "Colour #10", "Colour #10", None, None] + CID_COLOUR11 = [0x1ab, TID_COMMAND, "Colour #11", "Colour #11", None, None] + CID_COLOUR12 = [0x1ac, TID_COMMAND, "Colour #12", "Colour #12", None, None] + CID_COLOUR13 = [0x1ad, TID_COMMAND, "Colour #13", "Colour #13", None, None] + CID_COLOUR14 = [0x1ae, TID_COMMAND, "Colour #14", "Colour #14", None, None] + CID_COLOUR15 = [0x1af, TID_COMMAND, "Colour #15", "Colour #15", None, None] # }}} # {{{ Non-items NID_MENU_SEP = (0x200, TID_NOTHING) @@ -95,7 +99,7 @@ class MiRCARTFrame(MiRCARTGeneralFrame): CID_CUT, CID_COPY, CID_PASTE, CID_DELETE, NID_MENU_SEP, \ CID_INCRBRUSH, CID_DECRBRUSH, CID_SOLID_BRUSH)) MID_TOOLS = (0x302, TID_MENU, "Tools", "&Tools", ( \ - CID_RECT, CID_CIRCLE, CID_LINE)) + CID_RECT, CID_CIRCLE, CID_LINE, CID_TEXT)) # }}} # {{{ Toolbars BID_TOOLBAR = (0x400, TID_TOOLBAR, ( \ @@ -103,7 +107,7 @@ class MiRCARTFrame(MiRCARTGeneralFrame): CID_UNDO, CID_REDO, NID_TOOLBAR_SEP, \ CID_CUT, CID_COPY, CID_PASTE, CID_DELETE, NID_TOOLBAR_SEP, \ CID_INCRBRUSH, CID_DECRBRUSH, CID_SOLID_BRUSH, NID_TOOLBAR_SEP, \ - CID_RECT, CID_CIRCLE, CID_LINE, NID_TOOLBAR_SEP, \ + CID_RECT, CID_CIRCLE, CID_LINE, CID_TEXT, NID_TOOLBAR_SEP, \ CID_COLOUR00, CID_COLOUR01, CID_COLOUR02, CID_COLOUR03, CID_COLOUR04, \ CID_COLOUR05, CID_COLOUR06, CID_COLOUR07, CID_COLOUR08, CID_COLOUR09, \ CID_COLOUR10, CID_COLOUR11, CID_COLOUR12, CID_COLOUR13, CID_COLOUR14, \ @@ -119,17 +123,8 @@ class MiRCARTFrame(MiRCARTGeneralFrame): LID_TOOLBARS = (0x602, TID_LIST, (BID_TOOLBAR)) # }}} - # {{{ _dialogSaveChanges(self) - def _dialogSaveChanges(self): - with wx.MessageDialog(self, \ - "Do you want to save changes to {}?".format( \ - self.canvasPathName), "MiRCART", \ - wx.CANCEL|wx.CANCEL_DEFAULT|wx.ICON_QUESTION|wx.YES_NO) as dialog: - dialogChoice = dialog.ShowModal() - return dialogChoice - # }}} - # {{{ _setPaletteToolBitmaps(self): XXX - def _setPaletteToolBitmaps(self): + # {{{ _initPaletteToolBitmaps(self): XXX + def _initPaletteToolBitmaps(self): paletteDescr = ( \ self.CID_COLOUR00, self.CID_COLOUR01, self.CID_COLOUR02, self.CID_COLOUR03, self.CID_COLOUR04, \ self.CID_COLOUR05, self.CID_COLOUR06, self.CID_COLOUR07, self.CID_COLOUR08, self.CID_COLOUR09, \ @@ -145,8 +140,16 @@ class MiRCARTFrame(MiRCARTGeneralFrame): toolBitmapDc.SetBackground(toolBitmapBrush) toolBitmapDc.SetPen(wx.Pen(wx.Colour(toolBitmapColour), 1)) toolBitmapDc.DrawRectangle(0, 0, 16, 16) - self.toolBar.SetToolNormalBitmap( \ - paletteDescr[numColour][0], toolBitmap) + paletteDescr[numColour][4] = ["", None, toolBitmap] + # }}} + # {{{ _dialogSaveChanges(self) + def _dialogSaveChanges(self): + with wx.MessageDialog(self, \ + "Do you want to save changes to {}?".format( \ + self.canvasPathName), "MiRCART", \ + wx.CANCEL|wx.CANCEL_DEFAULT|wx.ICON_QUESTION|wx.YES_NO) as dialog: + dialogChoice = dialog.ShowModal() + return dialogChoice # }}} # {{{ _updateStatusBar(self, showColours=None, showFileName=True, showPos=None): XXX def _updateStatusBar(self, showColours=True, showFileName=True, showPos=True): @@ -369,6 +372,10 @@ class MiRCARTFrame(MiRCARTGeneralFrame): self.menuItemsById[cid].Check(True) self.panelCanvas.canvasCurTool = \ MiRCARTToolLine(self.panelCanvas) + elif cid == self.CID_TEXT[0]: + self.menuItemsById[cid].Check(True) + self.panelCanvas.canvasCurTool = \ + MiRCARTToolText(self.panelCanvas) elif cid >= self.CID_COLOUR00[0] \ and cid <= self.CID_COLOUR15[0]: numColour = cid - self.CID_COLOUR00[0] @@ -387,8 +394,8 @@ class MiRCARTFrame(MiRCARTGeneralFrame): # # __init__(self, parent, appSize=(800, 600), canvasPos=(25, 50), canvasSize=(100, 30), cellSize=(7, 14)): initialisation method def __init__(self, parent, appSize=(800, 600), canvasPos=(25, 50), canvasSize=(100, 30), cellSize=(7, 14)): + self._initPaletteToolBitmaps() panelSkin = super().__init__(parent, wx.ID_ANY, "MiRCART", size=appSize) - self._setPaletteToolBitmaps() self.canvasPos = canvasPos; self.cellSize = cellSize; self.canvasSize = canvasSize; self.canvasPathName = None self.panelCanvas = MiRCARTCanvas(panelSkin, parentFrame=self, \ diff --git a/MiRCARTGeneralFrame.py b/MiRCARTGeneralFrame.py index 0c127e0..7bdf00a 100644 --- a/MiRCARTGeneralFrame.py +++ b/MiRCARTGeneralFrame.py @@ -75,29 +75,45 @@ class MiRCARTGeneralFrame(wx.Frame): # {{{ _initToolBars(self, toolBarsDescr, handler): XXX def _initToolBars(self, toolBarsDescr, handler, panelSkin): self.toolBarItemsById = {} - self.toolBar = wx.ToolBar(panelSkin, -1, \ + self.toolBar = wx.ToolBar(panelSkin, -1, \ style=wx.HORIZONTAL|wx.TB_FLAT|wx.TB_NODIVIDER) self.toolBar.SetToolBitmapSize((16,16)) for toolBarItem in toolBarsDescr[2]: if toolBarItem == self.NID_TOOLBAR_SEP: self.toolBar.AddSeparator() else: - if toolBarItem[4] != None: - toolBarItemIcon = wx.ArtProvider.GetBitmap( \ - toolBarItem[4], wx.ART_TOOLBAR, (16,16)) - else: - toolBarItemIcon = wx.ArtProvider.GetBitmap( \ - wx.ART_HELP, wx.ART_TOOLBAR, (16,16)) - toolBarItemWindow = self.toolBar.AddTool( \ - toolBarItem[0], toolBarItem[2], toolBarItemIcon) + toolBarItemWindow = self.toolBar.AddTool( \ + toolBarItem[0], toolBarItem[2], toolBarItem[4][2]) self.toolBarItemsById[toolBarItem[0]] = toolBarItemWindow - if len(toolBarItem) == 7 \ + if len(toolBarItem) == 7 \ and toolBarItem[1] == TID_COMMAND: toolBarItemWindow.Enable(toolBarItem[6]) self.Bind(wx.EVT_TOOL, handler, toolBarItemWindow) self.Bind(wx.EVT_TOOL_RCLICKED, handler, toolBarItemWindow) self.toolBar.Realize(); self.toolBar.Fit(); # }}} + # {{{ _initToolBitmaps(self): XXX + def _initToolBitmaps(self, toolBarsDescr): + for toolBarItem in toolBarsDescr[2]: + if toolBarItem == self.NID_TOOLBAR_SEP: + continue + elif toolBarItem[4] == None: + toolBarItem[4] = ["", None, wx.ArtProvider.GetBitmap( \ + wx.ART_HELP, wx.ART_TOOLBAR, (16,16))] + elif toolBarItem[4][0] == "" \ + and toolBarItem[4][1] != None: + toolBarItem[4] = ["", None, wx.ArtProvider.GetBitmap( \ + toolBarItem[4][1], wx.ART_TOOLBAR, (16,16))] + elif toolBarItem[4][0] == "" \ + and toolBarItem[4][1] == None: + toolBarItem[4] = ["", None, toolBarItem[4][2]] + elif toolBarItem[4][0] != "": + toolBitmap = wx.Bitmap((16,16)) + toolBitmap.LoadFile( \ + os.path.join("assets", toolBarItem[4][0]), \ + wx.BITMAP_TYPE_ANY) + toolBarItem[4] = ["", None, toolBitmap] + # }}} # {{{ onClose(self, event): XXX def onClose(self, event): self.Destroy(); self.__del__(); @@ -118,6 +134,7 @@ class MiRCARTGeneralFrame(wx.Frame): menuBar = self._initMenus(self.LID_MENUS[2], \ self.onFrameCommand) self.SetMenuBar(menuBar) + self._initToolBitmaps(self.LID_TOOLBARS[2]) toolBar = self._initToolBars(self.LID_TOOLBARS[2], \ self.onFrameCommand, panelSkin) diff --git a/MiRCARTToolText.py b/MiRCARTToolText.py new file mode 100644 index 0000000..9fd18ab --- /dev/null +++ b/MiRCARTToolText.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +# +# MiRCARTToolText.py -- XXX +# Copyright (c) 2018 Lucio Andrés Illanes Albornoz +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# + +from MiRCARTTool import MiRCARTTool + +class MiRCARTToolText(MiRCARTTool): + """XXX""" + + # + # onMouseEvent(self, event, atPoint, brushColours, brushSize, isDragging, isLeftDown, isRightDown): XXX + def onMouseEvent(self, event, atPoint, brushColours, brushSize, isDragging, isLeftDown, isRightDown): + brushColours = brushColours.copy() + if isLeftDown: + brushColours[1] = brushColours[0] + elif isRightDown: + brushColours[0] = brushColours[1] + else: + brushColours[1] = brushColours[0] + brushPatches = [] + for brushRow in range(brushSize[1]): + for brushCol in range(brushSize[0] * 2): + brushPatches.append([[ \ + atPoint[0] + brushCol, \ + atPoint[1] + brushRow], \ + brushColours, 0, " "]) + if isLeftDown or isRightDown: + return [[False, brushPatches], [True, brushPatches]] + else: + return [[True, brushPatches]] + +# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120 diff --git a/assets/toolCircle.png b/assets/toolCircle.png new file mode 100644 index 0000000000000000000000000000000000000000..9e34f7288272bb8dda0b54fe26d13a6d1998b2a2 GIT binary patch literal 360 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwwYY*EWF^-SBjA46*QEI!RIJkb!_}xPrETsHn{9MNE;64qwtby0}=Hk`)9_$SM6f zpEBLoBmKn|<9xN><^S_8xj1pm*67OC=vI>5(GcG9dSAqB7A4*tOl+!o3p{N+KbRJ4 zl?OI6Te!Wwtn$&qm^W)(ZQz;r2ZaqRX1?R9@YA!pS~R2EbaAHM%IH5c*FAV#xMPNI z@yWBiUpUrgS^oIKF*#H3=5dw!kfpm$hd*GH;8~XLx+gvN64PEczp&4;Z>C9oP|Tbx yWTJ1cBJ6rDfu%TwiFw1xu-V+%nqB{epYWbJq^No$J@+`!j|`r!elF{r5}E+A&w?)i literal 0 HcmV?d00001 diff --git a/assets/toolLine.png b/assets/toolLine.png new file mode 100644 index 0000000000000000000000000000000000000000..206b1042bc2237fa368625752e1647d764ec94d5 GIT binary patch literal 371 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwwYY*EWF^J@#~Q46*QEdf_~mqoc_2kB|3n-NSg(Bgo9`({o0f)f&>Clcsol;u4$W z6d4hFf9Ld_%{%`+xw724_+9?2XC03%>NlFzC+6M?2%KVgF!KA^00FH=t7SKmm;ImV zD6Q4E%&JA1O+)F`zk0ibMUz$}b)0=0?GTZEhFMLkjqS==_L2$CPZZPhN+t_jIq>U7 zQm>Sg{>|rYw?$4qt}7OQC0UsLE%EW)IY%Y361b;)DEd5i{|C0PgEG@^hrhj>$^KDX zNmr-v5QpRoFk5?t`S%HC&hLM4Pn5moF|*Ns&Dr>f+4qZ|aODR1c;0SVmjU!HgQu&X J%Q~loCIHE-mH+?% literal 0 HcmV?d00001 diff --git a/assets/toolRect.png b/assets/toolRect.png new file mode 100644 index 0000000000000000000000000000000000000000..851cb4a2265a11b60255b40a28e2baf7e4b10430 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwwYY*EWF^`FOfGhFJJ-?eXMdFyJ`y>%YH$wPx!|#%(O!&{DXWlJQt*7HB} zt7vcfz{mPfmg|tUNK3f}$NK<*dkYoz+;*Avo!^hMzw(L|$HLhCbJoNy0Gi9->FVdQ I&MBb@0EFE|ApigX literal 0 HcmV?d00001 diff --git a/assets/toolText.png b/assets/toolText.png new file mode 100644 index 0000000000000000000000000000000000000000..d27b9690570d46f88fbbdab0ea22ba7531fe2758 GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwwYY*EWF^E%J1646*QEI`JXbAp?PC_23r8SN!+?e`Sex__kV2b$eRTsa1{Zr=R}H zmF%qfRR7Y3c9S=Xy!#nHuDEiqJ-YMhtHTzTd^T2!{yTB% w_5wD3zM~oYboZp5X5K%k&34JdvQr