From 8409c74e2309ef0b2bd3be24589e6bcda2569027 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sat, 18 Jul 2020 00:26:03 +0300 Subject: [PATCH] - added some icons in the Code Editor - replaced some icons in the app - in Code Editor, when changing text, the Save Code button will change color (text and icon) to red and after save it will revert the color to the default one - in Code Editor some methods rework --- CHANGELOG.md | 7 ++++ appEditors/AppTextEditor.py | 34 +++++++++++++++++- appGUI/ObjectUI.py | 3 +- appObjects/FlatCAMCNCJob.py | 14 +------- appObjects/FlatCAMDocument.py | 14 ++++---- appObjects/FlatCAMScript.py | 7 ++-- appTools/ToolCalibration.py | 8 +---- appTools/ToolIsolation.py | 3 +- appTools/ToolNCC.py | 1 + appTools/ToolPaint.py | 1 + appTools/ToolSolderPaste.py | 12 +++---- app_Main.py | 18 ++-------- assets/resources/dark_resources/find32.png | Bin 0 -> 1148 bytes .../resources/dark_resources/geometry16.png | Bin 617 -> 862 bytes .../resources/dark_resources/geometry32.png | Bin 732 -> 1367 bytes assets/resources/dark_resources/preview32.png | Bin 0 -> 1099 bytes assets/resources/dark_resources/printer16.png | Bin 565 -> 686 bytes assets/resources/dark_resources/printer32.png | Bin 870 -> 1070 bytes assets/resources/dark_resources/replace32.png | Bin 0 -> 1005 bytes assets/resources/dark_resources/save_as.png | Bin 683 -> 719 bytes assets/resources/find32.png | Bin 0 -> 766 bytes assets/resources/geometry16.png | Bin 582 -> 584 bytes assets/resources/geometry32.png | Bin 804 -> 955 bytes assets/resources/preview32.png | Bin 0 -> 741 bytes assets/resources/printer16.png | Bin 559 -> 543 bytes assets/resources/printer32.png | Bin 818 -> 835 bytes assets/resources/replace32.png | Bin 0 -> 705 bytes assets/resources/save_as.png | Bin 628 -> 654 bytes assets/resources/save_as_red.png | Bin 0 -> 719 bytes 29 files changed, 61 insertions(+), 61 deletions(-) create mode 100644 assets/resources/dark_resources/find32.png create mode 100644 assets/resources/dark_resources/preview32.png create mode 100644 assets/resources/dark_resources/replace32.png create mode 100644 assets/resources/find32.png create mode 100644 assets/resources/preview32.png create mode 100644 assets/resources/replace32.png create mode 100644 assets/resources/save_as_red.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ce067a9..d9d3916d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,13 @@ CHANGELOG for FlatCAM beta ================================================= +18.07.2020 + +- added some icons in the Code Editor +- replaced some icons in the app +- in Code Editor, when changing text, the Save Code button will change color (text and icon) to red and after save it will revert the color to the default one +- in Code Editor some methods rework + 16.07.2020 - added a new method for GCode generation for Geometry objects diff --git a/appEditors/AppTextEditor.py b/appEditors/AppTextEditor.py index 69222671..e9726c98 100644 --- a/appEditors/AppTextEditor.py +++ b/appEditors/AppTextEditor.py @@ -72,13 +72,17 @@ class AppTextEditor(QtWidgets.QWidget): self.code_editor.setPlainText(text) self.buttonPreview = QtWidgets.QPushButton(_('Print Preview')) + self.buttonPreview.setIcon(QtGui.QIcon(self.app.resource_location + '/preview32.png')) self.buttonPreview.setToolTip(_("Open a OS standard Preview Print window.")) self.buttonPreview.setMinimumWidth(100) self.buttonPrint = QtWidgets.QPushButton(_('Print Code')) + self.buttonPrint.setIcon(QtGui.QIcon(self.app.resource_location + '/printer32.png')) self.buttonPrint.setToolTip(_("Open a OS standard Print window.")) + self.buttonPrint.setMinimumWidth(100) self.buttonFind = QtWidgets.QPushButton(_('Find in Code')) + self.buttonFind.setIcon(QtGui.QIcon(self.app.resource_location + '/find32.png')) self.buttonFind.setToolTip(_("Will search and highlight in yellow the string in the Find box.")) self.buttonFind.setMinimumWidth(100) @@ -86,6 +90,7 @@ class AppTextEditor(QtWidgets.QWidget): self.entryFind.setToolTip(_("Find box. Enter here the strings to be searched in the text.")) self.buttonReplace = QtWidgets.QPushButton(_('Replace With')) + self.buttonReplace.setIcon(QtGui.QIcon(self.app.resource_location + '/replace32.png')) self.buttonReplace.setToolTip(_("Will replace the string from the Find box with the one in the Replace box.")) self.buttonReplace.setMinimumWidth(100) @@ -97,17 +102,23 @@ class AppTextEditor(QtWidgets.QWidget): "with the text in the 'Replace' box..")) self.button_copy_all = QtWidgets.QPushButton(_('Copy All')) + self.button_copy_all.setIcon(QtGui.QIcon(self.app.resource_location + '/copy_file32.png')) self.button_copy_all.setToolTip(_("Will copy all the text in the Code Editor to the clipboard.")) self.button_copy_all.setMinimumWidth(100) self.buttonOpen = QtWidgets.QPushButton(_('Open Code')) + self.buttonOpen.setIcon(QtGui.QIcon(self.app.resource_location + '/folder32_bis.png')) self.buttonOpen.setToolTip(_("Will open a text file in the editor.")) + self.buttonOpen.setMinimumWidth(100) self.buttonSave = QtWidgets.QPushButton(_('Save Code')) + self.buttonSave.setIcon(QtGui.QIcon(self.app.resource_location + '/save_as.png')) self.buttonSave.setToolTip(_("Will save the text in the editor into a file.")) + self.buttonSave.setMinimumWidth(100) self.buttonRun = QtWidgets.QPushButton(_('Run Code')) self.buttonRun.setToolTip(_("Will run the TCL commands found in the text file, one by one.")) + self.buttonRun.setMinimumWidth(100) self.buttonRun.hide() @@ -169,7 +180,26 @@ class AppTextEditor(QtWidgets.QWidget): # enable = not self.ui.code_editor.document().isEmpty() # self.ui.buttonPrint.setEnabled(enable) # self.ui.buttonPreview.setEnabled(enable) - pass + + self.buttonSave.setStyleSheet("QPushButton {color: red;}") + self.buttonSave.setIcon(QtGui.QIcon(self.app.resource_location + '/save_as_red.png')) + + def load_text(self, text, move_to_start=False, move_to_end=False, clear_text=True, as_html=False): + self.code_editor.textChanged.disconnect() + if clear_text: + # first clear previous text in text editor (if any) + self.code_editor.clear() + + self.code_editor.setReadOnly(False) + if as_html is False: + self.code_editor.setPlainText(text) + else: + self.code_editor.setHtml(text) + if move_to_start: + self.code_editor.moveCursor(QtGui.QTextCursor.Start) + elif move_to_end: + self.code_editor.moveCursor(QtGui.QTextCursor.End) + self.code_editor.textChanged.connect(self.handleTextChanged) def handleOpen(self, filt=None): self.app.defaults.report_usage("handleOpen()") @@ -268,6 +298,8 @@ class AppTextEditor(QtWidgets.QWidget): with open(filename, 'w') as f: for line in my_gcode: f.write(line) + self.buttonSave.setStyleSheet("") + self.buttonSave.setIcon(QtGui.QIcon(self.app.resource_location + '/save_as.png')) except FileNotFoundError: self.app.inform.emit('[WARNING] %s' % _("No such file or directory")) return diff --git a/appGUI/ObjectUI.py b/appGUI/ObjectUI.py index bb0ff722..a823be15 100644 --- a/appGUI/ObjectUI.py +++ b/appGUI/ObjectUI.py @@ -2028,14 +2028,13 @@ class CNCObjectUI(ObjectUI): # GO Button self.export_gcode_button = QtWidgets.QPushButton(_('Save CNC Code')) + self.export_gcode_button.setIcon(QtGui.QIcon(self.app.resource_location + '/save_as.png')) self.export_gcode_button.setToolTip( _("Opens dialog to save G-Code\n" "file.") ) - # h_lay.addWidget(self.modify_gcode_button) h_lay.addWidget(self.export_gcode_button) - # self.custom_box.addWidget(self.export_gcode_button) class ScriptObjectUI(ObjectUI): diff --git a/appObjects/FlatCAMCNCJob.py b/appObjects/FlatCAMCNCJob.py index 34d36fbe..c434b056 100644 --- a/appObjects/FlatCAMCNCJob.py +++ b/appObjects/FlatCAMCNCJob.py @@ -579,10 +579,6 @@ class CNCJobObject(FlatCAMObj, CNCjob): self.app.ui.position_label.setText("") self.app.ui.rel_position_label.setText("") - # first clear previous text in text editor (if any) - self.gcode_editor_tab.code_editor.clear() - self.gcode_editor_tab.code_editor.setReadOnly(False) - self.gcode_editor_tab.code_editor.completer_enable = False self.gcode_editor_tab.buttonRun.hide() @@ -592,20 +588,12 @@ class CNCJobObject(FlatCAMObj, CNCjob): self.gcode_editor_tab.t_frame.hide() # then append the text from GCode to the text editor try: - self.gcode_editor_tab.code_editor.setPlainText(self.app.gcode_edited.getvalue()) - # for line in self.app.gcode_edited: - # QtWidgets.QApplication.processEvents() - # - # proc_line = str(line).strip('\n') - # self.gcode_editor_tab.code_editor.append(proc_line) + self.gcode_editor_tab.load_text(self.app.gcode_edited.getvalue(), move_to_start=True, clear_text=True) except Exception as e: log.debug('FlatCAMCNNJob.on_edit_code_click() -->%s' % str(e)) self.app.inform.emit('[ERROR] %s %s' % ('FlatCAMCNNJob.on_edit_code_click() -->', str(e))) return - self.gcode_editor_tab.code_editor.moveCursor(QtGui.QTextCursor.Start) - - self.gcode_editor_tab.handleTextChanged() self.gcode_editor_tab.t_frame.show() self.app.proc_container.view.set_idle() diff --git a/appObjects/FlatCAMDocument.py b/appObjects/FlatCAMDocument.py index e278e9c3..2ff84a98 100644 --- a/appObjects/FlatCAMDocument.py +++ b/appObjects/FlatCAMDocument.py @@ -84,10 +84,6 @@ class DocumentObject(FlatCAMObj): self.document_editor_tab.code_editor.setStyleSheet(stylesheet) - # first clear previous text in text editor (if any) - self.document_editor_tab.code_editor.clear() - self.document_editor_tab.code_editor.setReadOnly(self._read_only) - self.document_editor_tab.buttonRun.hide() self.ui.autocomplete_cb.set_value(self.app.defaults['document_autocompleter']) @@ -138,14 +134,16 @@ class DocumentObject(FlatCAMObj): self.ui.font_size_cb.setCurrentIndex(int(self.app.defaults['document_font_size'])) - self.document_editor_tab.handleTextChanged() + # self.document_editor_tab.handleTextChanged() self.ser_attrs = ['options', 'kind', 'source_file'] if Qt.mightBeRichText(self.source_file): - self.document_editor_tab.code_editor.setHtml(self.source_file) + # self.document_editor_tab.code_editor.setHtml(self.source_file) + self.document_editor_tab.load_text(self.source_file, move_to_start=True, clear_text=True, as_html=True) else: - for line in self.source_file.splitlines(): - self.document_editor_tab.code_editor.append(line) + # for line in self.source_file.splitlines(): + # self.document_editor_tab.code_editor.append(line) + self.document_editor_tab.load_text(self.source_file, move_to_start=True, clear_text=True, as_html=False) self.build_ui() diff --git a/appObjects/FlatCAMScript.py b/appObjects/FlatCAMScript.py index cb0afbd6..1eb4b8ac 100644 --- a/appObjects/FlatCAMScript.py +++ b/appObjects/FlatCAMScript.py @@ -135,14 +135,11 @@ class ScriptObject(FlatCAMObj): self.script_editor_tab.t_frame.hide() try: - self.script_editor_tab.code_editor.setPlainText(self.source_file) - # for line in self.source_file.splitlines(): - # QtWidgets.QApplication.processEvents() - # self.script_editor_tab.code_editor.append(line) + # self.script_editor_tab.code_editor.setPlainText(self.source_file) + self.script_editor_tab.load_text(self.source_file, move_to_end=True) except Exception as e: log.debug("ScriptObject.set_ui() --> %s" % str(e)) - self.script_editor_tab.code_editor.moveCursor(QtGui.QTextCursor.End) self.script_editor_tab.t_frame.show() self.app.proc_container.view.set_idle() diff --git a/appTools/ToolCalibration.py b/appTools/ToolCalibration.py index 3bece057..a868d48e 100644 --- a/appTools/ToolCalibration.py +++ b/appTools/ToolCalibration.py @@ -1072,10 +1072,6 @@ class ToolCalibration(AppTool): self.app.ui.position_label.setText("") self.app.ui.rel_position_label.setText("") - # first clear previous text in text editor (if any) - self.gcode_editor_tab.code_editor.clear() - self.gcode_editor_tab.code_editor.setReadOnly(False) - self.gcode_editor_tab.code_editor.completer_enable = False self.gcode_editor_tab.buttonRun.hide() @@ -1085,13 +1081,11 @@ class ToolCalibration(AppTool): self.gcode_editor_tab.t_frame.hide() # then append the text from GCode to the text editor try: - self.gcode_editor_tab.code_editor.setPlainText(gcode) + self.gcode_editor_tab.load_text(gcode, move_to_start=True, clear_text=True) except Exception as e: self.app.inform.emit('[ERROR] %s %s' % ('ERROR -->', str(e))) return - self.gcode_editor_tab.code_editor.moveCursor(QtGui.QTextCursor.Start) - self.gcode_editor_tab.t_frame.show() self.app.proc_container.view.set_idle() diff --git a/appTools/ToolIsolation.py b/appTools/ToolIsolation.py index b49c00ea..1ca9ae49 100644 --- a/appTools/ToolIsolation.py +++ b/appTools/ToolIsolation.py @@ -3269,7 +3269,8 @@ class IsoUI: separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) self.grid3.addWidget(separator_line, 39, 0, 1, 2) - self.generate_iso_button = QtWidgets.QPushButton("%s" % _("Generate Isolation Geometry")) + self.generate_iso_button = QtWidgets.QPushButton("%s" % _("Generate Geometry")) + self.generate_iso_button.setIcon(QtGui.QIcon(self.app.resource_location + '/geometry32.png')) self.generate_iso_button.setStyleSheet(""" QPushButton { diff --git a/appTools/ToolNCC.py b/appTools/ToolNCC.py index abe1748a..1b13aa41 100644 --- a/appTools/ToolNCC.py +++ b/appTools/ToolNCC.py @@ -4214,6 +4214,7 @@ class NccUI: self.grid3.addWidget(separator_line, 32, 0, 1, 2) self.generate_ncc_button = QtWidgets.QPushButton(_('Generate Geometry')) + self.generate_ncc_button.setIcon(QtGui.QIcon(self.app.resource_location + '/geometry32.png')) self.generate_ncc_button.setToolTip( _("Create the Geometry Object\n" "for non-copper routing.") diff --git a/appTools/ToolPaint.py b/appTools/ToolPaint.py index a3c5d991..5f420bce 100644 --- a/appTools/ToolPaint.py +++ b/appTools/ToolPaint.py @@ -3241,6 +3241,7 @@ class PaintUI: # GO Button self.generate_paint_button = QtWidgets.QPushButton(_('Generate Geometry')) + self.generate_paint_button.setIcon(QtGui.QIcon(self.app.resource_location + '/geometry32.png')) self.generate_paint_button.setToolTip( _("Create a Geometry Object which paints the polygons.") ) diff --git a/appTools/ToolSolderPaste.py b/appTools/ToolSolderPaste.py index f226205c..e0565ba7 100644 --- a/appTools/ToolSolderPaste.py +++ b/appTools/ToolSolderPaste.py @@ -1019,19 +1019,15 @@ class SolderPaste(AppTool): return try: - for line in lines: - proc_line = str(line).strip('\n') - self.text_editor_tab.code_editor.append(proc_line) + # for line in lines: + # proc_line = str(line).strip('\n') + # self.text_editor_tab.code_editor.append(proc_line) + self.text_editor_tab.load_text(lines, move_to_start=True) except Exception as e: log.debug('ToolSolderPaste.on_view_gcode() -->%s' % str(e)) self.app.inform.emit('[ERROR] %s --> %s' % ('ToolSolderPaste.on_view_gcode()', str(e))) return - self.text_editor_tab.code_editor.moveCursor(QtGui.QTextCursor.Start) - - self.text_editor_tab.handleTextChanged() - # self.app.ui.show() - def on_save_gcode(self): """ Save solderpaste dispensing GCode to a file on HDD. diff --git a/app_Main.py b/app_Main.py index bf717936..086320df 100644 --- a/app_Main.py +++ b/app_Main.py @@ -7668,9 +7668,6 @@ class App(QtCore.QObject): self.ui.coords_toolbar.hide() self.ui.delta_coords_toolbar.hide() - # first clear previous text in text editor (if any) - self.text_editor_tab.code_editor.clear() - self.text_editor_tab.code_editor.setReadOnly(False) self.toggle_codeeditor = True self.text_editor_tab.code_editor.completer_enable = False self.text_editor_tab.buttonRun.hide() @@ -7722,10 +7719,6 @@ class App(QtCore.QObject): self.ui.coords_toolbar.hide() self.ui.delta_coords_toolbar.hide() - # first clear previous text in text editor (if any) - self.source_editor_tab.code_editor.clear() - self.source_editor_tab.code_editor.setReadOnly(False) - self.source_editor_tab.code_editor.completer_enable = False self.source_editor_tab.buttonRun.hide() @@ -7767,20 +7760,13 @@ class App(QtCore.QObject): self.source_editor_tab.t_frame.hide() try: - self.source_editor_tab.code_editor.setPlainText(file.getvalue()) - # for line in file: - # QtWidgets.QApplication.processEvents() - # proc_line = str(line).strip('\n') - # self.source_editor_tab.code_editor.append(proc_line) + self.source_editor_tab.load_text(file.getvalue(), clear_text=True, move_to_start=True) except Exception as e: log.debug('App.on_view_source() -->%s' % str(e)) self.inform.emit('[ERROR] %s: %s' % (_('Failed to load the source code for the selected object'), str(e))) return - self.source_editor_tab.handleTextChanged() self.source_editor_tab.t_frame.show() - - self.source_editor_tab.code_editor.moveCursor(QtGui.QTextCursor.Start) self.proc_container.view.set_idle() # self.ui.show() @@ -9205,7 +9191,7 @@ class App(QtCore.QObject): if f.open(QtCore.QIODevice.ReadOnly): stream = QtCore.QTextStream(f) code_edited = stream.readAll() - self.text_editor_tab.code_editor.setPlainText(code_edited) + self.text_editor_tab.load_text(code_edited, clear_text=True, move_to_start=True) f.close() except IOError: App.log.error("Failed to open config file: %s" % filename) diff --git a/assets/resources/dark_resources/find32.png b/assets/resources/dark_resources/find32.png new file mode 100644 index 0000000000000000000000000000000000000000..e58a3ee4a6f3833ef34253a6f602c51a19aa6c0b GIT binary patch literal 1148 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+0817mrBPlzi}!Q;n|@4bBa z|Ns97uU|iT`SvjkJ$m)#>ec^`U%rEj02z;9vJaoXeFBzx^y=-I|Noyn`GlnR-IG`E zLEKlb9=!l*zkU1v<5zE$awhj14I{)eD>zelUG2ezIpxnHQ0m?AY)&=y?_5ckPEW<1<>|45H~!21$4uk z$3T~W7$99hi$Ep=)qouN_6dmb=HZ7AU^CwW9Rm~uxd-A}uoj@p@4tHWy?O<-5g6v75(nymRCP&^ zUoZowIE!S@-M`1P*`mL`+rH|^uUpz_Z19>x)wxPZb0ThFtRZV4Se< zO~*9}?;l_6Th5#g*9qRnZ~W}`{X?^TE4T18C>L)4I)gFE+uensgH_f8$l)yTh%9Dc z;5!1sj8nDwq=AC$C7!;n>`&MQMHvk}*ZA83^*DOEIEGl9K07fy`jCN08~>spfg>5N zIzT;(9vx_9Uh(K&b+~KcgL{wvR7xM%BK2U_ceUrIzc2Hh&m$HuWypfJv(}1@9Vw$%5;C! z%Fema8M{km!h!mQ(z3g*H2ax-?^<+2yroX&0%!B2#@j?F+=Rw;fDn( zTndvpx0!bu{xeqA@cBD$rrUKMU;t0CY^W3w3$pI^UY5E@Qu_9P9^^zBMpR|tG_XtO~1si{UR8hv)*?n4DYTabXyu6tc z>fBm(yi;J$e0=ZAf^+@;HjV*Fs}|bqU*RNFnX=&6Yw3Nfos`afcD(;7bLzf56ZjvS zi?G?B$%}q+uiIccFnm=@Tq8@X{fuWU&rM7{A zm4U%O(Z`@DLukm&PsvQH#I2#zopr0Ik1!ZU6uP literal 0 HcmV?d00001 diff --git a/assets/resources/dark_resources/geometry16.png b/assets/resources/dark_resources/geometry16.png index 14bdbe825688fadadb803cbe8f10518e5d8517df..18e744e3d49bb8cd62bebcc07e20ec00c8884e3a 100644 GIT binary patch literal 862 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>({S=vQM9ab-j4|_{CeGAwcoRk3Rz0kAOyj^#V-;3BCey-$BHIT#z$>vM=9*ECT8U zTle_IJCLpyKxIJdUOjyYvh>NzH$dB;ynXxd!-u=?-hoxVf$9Rf6YMsiuE#ImJq4N% z1Yq{#S8qUe0nGs!@(So+px-;5ZaV>_LP~=Cf*BZ1ZJQe`!k%z<9ZE<#QO9v(xzm0o zR?EsB-n+8h;mKn6g;E#vg(mjS&N}VBi}{HDuemdiPTn2auHxc3%~?i}|7OtV>vKG+ zil$g|-iqG5rMg2kK4~bp9zYIffk$L90|Va?5N4dJ%_j{MWH0gb zb!C6TE+{Id7&znh8KBT1PZ!4!iOa5i&x@KIMBMB*csm(%C3Wm&sXi#=$&|%VUH`xQ zqu#j(KQ~r?dvkXtD?=Z9nO2Eg!=z>WGl3c;K{f>ErERK(!v>gTe~DWM4f86CGW delta 501 zcmcb|_L60SBnJxv1H;x|=C39y+SfBBdAqwX{BQ3+vmYqRS>O>_%)r2G4Z@7wM^>2u z1=&kHeO=j~u<(isF#R|+|2zW&V~nSZV~EE2)`=Uvr!Yz!tAGFf?%c|`zY2L{>PsE&!0Z6^!ZaC^#6iV+pL=#T>i4`2&leyVvZGC9q+gF4WG{MyKXDY zu`r`n{a%;-k?xPHPK(;89#5643Ysm#;rc#nN$Y`oD?XdKDQtLf(Jhqa`1I)g%Wip0 zQ`xYkWXG4iy>|=+bYp6BEZ=q)+*zlyP9537rkEkYv!l*s<9$}B)+q0&scE!X;RgaN59_Gg{!gbdbq!n zRWb7VU#_=J=ZZqta&Y{J@ZFKgCUao<&O=M@rMIfc&SObW+HGMIHUF{aF|+MCYgNd;IhxgcR#0hZ~T0V=iJR=mY-fT9^Z?4T{ZbMla#oLuAxbYfq|8w pnU#T&u7RU26pfg{MQ1XW5E z`1>)fl%lv4!zU*v--9R)$;1)Gp%B9`Lkh-*K!U0X0;FMT0>M-eAp)sXJToIzYGksd zD_*DxrUa%48Ya^R2nMw(Ln&BOF4t=f9EA!|sF7)<1XCj@E?22!3YAo4Agd6lf?5US zFG<9T8OVpAQc3iMz?Eoc$uNRxq2LSutOwQR*^r=2#p&oFqVjn{pwAJ`>$@WND$RRy3)$|BTQd3X5o{#^t=`=W>>&kVfX;$s+_aAX;T^q|C^{_b` z?03T`|M&$#_tcQ&3A=cW?Bgpl_pdp6i@&hFJl?F$-K}KS*0g1DEj9?xYcHS47#L1) z>ua^$ZC-rwIMXq-dUyQM(+e@yU)zfmTQ2wYj9hg%G9nt76-Eaq%~=_jBw?0q_q+=# zXxqu|TQ?M?3{oUNmPhNj{1cJ7L;ON+PD@gM^zrltj$M}Qp0m8v&aJ3xyJtsV(!qF4 z%FQpW*kp`^H+<7(B^v9p2sw~GU^8>AC1>@cie0?I(gmM&pStJ7-L9f_A;L{s;eOoX zh5b-oNR972?|W&d=LEZqyiMpYZ1dH;OW(I5QMk-0@Z4Pyr&3G`Z0=#^r!ST!@9F)D zUA>}sQFE1*7a+2*D4;ZRUz(baSrlA)`wlfB9qkCU zUlSx7`=coE(#HM6PS4&v9PgprB6U9?SI^ldhG@NT^F>ybG~v$TGndYK9nINn<6ymO zQ{wtlb*z#@AtUgsSM!;1{L~bF8l97q1~)*ZP$}yvwDkeBSZV;BN~Kc+d?*w;g>rMK zsp@}%gITG(^ur$(^q+F|g8~QQ26k3DUyzcM1_T0uA1`x%E+-{B%`Yn_qgoy82uUE4 L8O693wzu#<9=rs1 delta 615 zcmcc4b%%9=BnJxv1H;YYP4yEM?dlnrlDyqr82-2SpVc-QGzaqR{a%A(h&(15Hh{!R$me(9(g@` z;mw)m)>g_Jzr?WVJ-=IgZ|?7V&F+89*PNJomdC)QDf!d)`)abMnT{~7n6dC$tkCA5 z`^Hbg{Y~oMR2@{W<(3KX5Be0dWwTU{!BlDEnYFi`2KcV?-lloPl6?ioYdgi}Z=qh(LH!5m4EOta*|$sR zd|Fjvc7Ej|-3w9T9J3CtWIeoTndi%i`x*XRjJl~aS$)Y5)f3xPj|$6_mN>@;on2$~ zDnp(3%<9LS(rV357K^Q2Q_0m@FS%5w_rQ^_oHHa!y6<#U?nvkO`k^;({h7TUmNyn1 z{qJ8tuf}`ftId0iweKjVy*2tN_gd$E?K!#T)7>x4_btEb(X{Ubo5Az_Mte7{SFCz$ z`1gb90j_vs`7)lYd-(|&Z_Zpi!1T>`&oZ~JsdHMtJ~-NOv)NQs?_;^FdRuSl=f7$t zZ2c7sF^r4S7iGJw*m4{gm#QVM5hW>!C8<`)MX8A;0jUf|21W+D1}3^jCLxA~R)!{4 jMyA>Z237_JwGuZDqv*)ZPsvQH#I1qHHKBg88ml1yXsZCU diff --git a/assets/resources/dark_resources/preview32.png b/assets/resources/dark_resources/preview32.png new file mode 100644 index 0000000000000000000000000000000000000000..27b6bcd428cfbb91ed4a51b60312ce5971b5cfe8 GIT binary patch literal 1099 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+0817mi8Plzi}!TFNQ2nz{pFoO%X2LW+d;R+1%MW0|ch8=IWP#3j1lINB)q9}T&z?O4ISHu# z#k;p}K}J1!{q7aeG0)#T0lEZYGEflc3y_&_pMu@<E-p zgLMJb1I+}wKl^mis z7$aQk80$n^U61no2$?cv`l?642Mz?W^;j`nUhDY%dF|XLVDPDyxJHzuB$lLFB^RXv zDF!10BLiInb6rF85F~}U&Kt&9mu6{1-oD!M<7aL12 literal 0 HcmV?d00001 diff --git a/assets/resources/dark_resources/printer16.png b/assets/resources/dark_resources/printer16.png index e93dcc885e0485facab6735ca3f276ac2e8be431..7a5a2b9a67d5989b70980bb44a70fa5ce87d76b1 100644 GIT binary patch delta 553 zcmdnWvW|6vBnLAC1A~SxfAB;_`}#QnJ|V6^{+a*(AHRC@=;hnTFW)|T_2%)bw?OvO zmv4aF$1mRg2Lq7Q%Xg1oy#q3yynF{_KY0aG|M2X1>Zb+@%qsVkS>r>P?bQ& zn-?!$0L{7o>J>!qlg<#FdrT;2GJ-Taxj zu~_t~2lwsm-j^LI25M(a@^*J&=wOxg0CG4BJR*UDd`B22RtVLz3yN~^>2cij0?JJD zba4!kxSZQ}Q>e*6fQ7v?MovJ`$HC!=*ulsD?awhBTzsnT=G}F-W-&6PE);6q6=JYZ z@UFm%Wty#9XFa<$DXDpWYPNOAqZ`%-?pFVke*d89qk_#j`v*KxE&57t=W{#?5Mp;y zS+1!2^>0ast@?>ii$reLPw6_c>4fouRniYGZ3|zpa`n!H>)-D#|I{n3{73I-^F+aK zBFDLfM7jU(ckDO{bfRjBYeY#(Vo9o1a#1RfVlXl=GSD?J*EKW`F*39=u&^>T(Kax! gGBD6KUw#ioLvDUbW?Chh27V+RQCadylUbMy0pp(^6aWAK delta 377 zcmZ3-x|L;uBnJxv1H;x|=C39y+H*4{dAqwXFs$lTHkusBC|}RQD=Hv9RlHh-fq{|P z)5S4F<9zGI_1?{aBF8?Sw-%9kmGX~))s!>&2eXN#fevTWQG;fM6O#_A{1BI5ZPuBg zBgN{-axf))%Z?>$Ix-4;3^F8UKde=6=H0v9=DX$nVvFbV7QB0Z`Qj3HAGcL6wk95% z)i5Whr1-7&l__w~Pr+rerZH)^u zX9u?_e|@$vk?sH5-|Vsxw&$)FJ&T?!%_JpmqHAapVqjopXl7+(tZQIwWnggjl90n> QAMA2_`d9s#T+3t#0L>DgC;$Ke diff --git a/assets/resources/dark_resources/printer32.png b/assets/resources/dark_resources/printer32.png index b72a7695fb58a890955c02af39d65684302d5b15..183bec8e22d8cd667f081fcf40e179586d3af395 100644 GIT binary patch delta 928 zcmaFHwvJ>6LynXWG&EtA7>nYG6pp~!QUA_7rqV)c&R}Wsl2D3p1Jp${$`wpV> z&Er>ZpS*exQTg!Yhx_;MKm73F_HB^fC$E53z6Dxy=Kud^&)z+I_8#O=uz!Fg(41#) z-hfPd@fIll=v6()M4+ArFFrha`R>W9clV#a2kL(UVuQpXc7S~VQu!3@CSYhWY@6c^ zB$G>m{DK*Tjf`cs{M{ria{uC#j(a_mnWlDK`^m}m>+0(}Z*J+7eS24`J?Y=Xs=LW9 zDHUuV-bzTmU%GDhD*k2W6AUcAepKQRWM8{tr53B4JWIi|LU)a#e8$$_&5D^V3gKyC zq0gUgSbs%*@1}+bpnZ%<-tI089jvk*6SL*(*#$*8m;-h${SK4}_H=O!u{b?-^3AYA z4m=Lb8hQa+)^V_QiHeJ`ii&336p0boqV#}`>*xRa0xKCU<1KP~{e7$a)h;h#P?qtV z-g%kPCirrm%wb#O)BEPncJB{2_*iw}xLD)?*Fqby=>;V)eVk>zW4HMBl>6=M44sD;tK68-C8w^? zqdvjPclr5qx;@-H&TN|}1PgB6(>mcOkLZE`ooNru5BBZne$wH|W#4r1iAvTvkx8lh zXFUt}`&30#WX~4)YocKbv@)+RTObi1Vc06|yNh+l;al~!v5TFOD=M0~qW&&y>wn@| zpEXHEbd_N8g^60C9-Dryxtz7O%zfS)$9G%efAk8)-{*M0=2OC82K6)8R#0A>l&Je7#Ug_SXdbtYa19?85k&8%{+&qBR4-KGp&-r2$zQ7 Lbj6~{rp$%_aykk? delta 718 zcmV;<0x|ur2<8Tm83+Ub007x@vVV~wK7RlLVoOIv0063uBQgL0010qNS#tmY4#WTe z4#WYKD-Ig~000McNliruw~YRdN6T0yIfPK~zY`)s;_3lW`cwKbx*eyg?wO zO(LugVGS}JdDCEqO6?@{?--eory#m?YvmybgoLO()FHxd7SY%elS-&*hvrSCLw}fq zB!vm7tZ#>{?R|fHjlnMUdoDk|JkRHSe$V%Pf3HVWw!9VAR}QG&LchdOLz(8jTcXEx z20l_;Hnd?5vsrEjUe-t$+M4@u|GgpBbCx=)TyvvjN%MsC)*UnvXPpG&u7Gh8tdpS0 zp{f`S`mAOlsjF&``KxneT8{esbh&veidaqAPj(?RZcKS(g1|G#ws;HgMD&;0PFbq zUQk;}^TPlv5z6lxfEs=}0ps-ZIxhw|&s8=Iz$CZxhrB@zeGEGRuQ3sothh_k}Hm1Cq?#78UbJmo-Mo#PB|NU}+QU3A$COu!!6fQx)0ZVa)L zBRmAA`1&_MZnbcs=l}n?{suX>Nv3(N3bFtI03~!qSd*dy6BjfsF*H;# zFgh_cIyE&dFf%$ZFi-H6V3W)P8W%JzF*H;#Fgh_cIyE&dFf%$ZFg~p<+>`wSF^$1B AzyJUM diff --git a/assets/resources/dark_resources/replace32.png b/assets/resources/dark_resources/replace32.png new file mode 100644 index 0000000000000000000000000000000000000000..803cd7c3f9cc8c864c8350f5ec19e7e91c080d38 GIT binary patch literal 1005 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+081EXw!Plzi}!IQUdAH90} z_~qLtFW)|X0c5;+^6Cwc3uFM%(^v0->=!RyJpAzC@#Dv@UcCZKy?y@t^TU@P?!J5X z==JOW|Nn!vzkBxV9YiD8z;};8hP=K1{yoq@pt46VfFf@|wgBw{S_HD|?UUETCguu=N+5*(|1jGi}0yO8r>(@ZW)0gkAUj6?F;^tTH z9zO>Of|UW)K-}{dr1#}JAo&R7oi~qPya5{i?Dgx1uU|g}`}+Q?SC3x2y?q}kdx=<4N)b26UNmUax)iSE1mI0AYMvm z`u$(?@?Ux<*L>7gaQ?=XRqWpXow*=%(Wm*6_10{gZk9WAhppQ9?;cYci(SWog+|6! z*CoQ)x3NZwYLx>mVodUOcVXyYmGuB}I14-?iy0XBj({-ZRBb+KpdfpRr>`sf6LvvS z7M7%p`Us#NEl(H65R22b6JLfMG7xBW=iaekZAL+Nkbq;MxQMIkl&eiELcI%5{@&ka z_BM02$&-H>>d$uD@Bjt5&hvyo&G= z+$8fT@Hm&#O9OG=PGgybsk?R0C+5ywlDTo?%p(%{nzwHR9(!Ij?McSg$@g_1Ji2H1 zbjOp=&Ccf^yy!UJ{&@1`%?AXY7R2f8Y~ylz;k5Hl{UWZ%E2gbq;i$f^#B6buFR$rW zwbIo=S9fTZm-g;^-_855zj}rJF4xUh&v93%-!9F&eR*EbzXvxBzAW7F|LNDWCTGh( zO`JL5z39nO2EgL(iZ8ML-RbARB`7(@M${i&7cN%ggmL^RkPR b6AM!H@{7`Ezq647Dq`?-^>bP0l+XkKXfYSf literal 0 HcmV?d00001 diff --git a/assets/resources/dark_resources/save_as.png b/assets/resources/dark_resources/save_as.png index 2d3ae02b19cd40c18df3d8faa9439cac5ae6514b..1b209539fe882b66546b3434860d43fcc5b61e15 100644 GIT binary patch delta 626 zcmZ3@dY)CWGr-TCmrII^fq{Y7)59eQNGpIa2Q!d#S<-cEqN08MU%h+y`t{?-kMG~V|M*q?yZ`_H165zW3L+l??FO3&bWnIj5#?x znb)zMF!k^|>ud(p%9!Ns?!wT)D(eB{a29w(7BevL9RXp+soH$fKtcABdQV?h_9yIu zBBoODKlJwj#g2HoIEGl9-aFY-sL4RUHClwpi$m)ibC;6w&i`+ZXl+qs3EK5RcT?5X zx&MP11B@;`=~3UhK)OX>ax}}#Pm+peYkBXkpz(NVvV?c zZUaMK-=VbbH@gna+ioG_`mp5N?D!Z5k*Xi73wZOG4#vJ{+$KM}NR1<}dWW{4(;A~G zoc#Q=zbM^ok(k}HR6C^HBk0TwH6g{*hAH#@ZerryW`g%dX!cw zrQevzY!L8?C80v&kZISJ+mmgXq{Pj24b4N046ICzt&GgH4GgRd4AR)_RVL>#NqJzA z6OV460SpMq64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1STJYD@<);T3K F0RVv-D|G+> delta 590 zcmX@lx|&t7Gr-TCmrII^fq{Y7)59eQNK1h*2Mds7c5ZQ7`Tld&f8m z9JfDz#O1M)i_IDP2?-DT<8qWX3TPkfn4rYyDJZZ`KzlX|w>4|vYLRKjoD@}#uH zo$%OMw<)2xRjB@;%o#VA^S`6^2tV0VT|WIxn6dTzyEAXjREaxAa`~}OnR1Vo) zj?-l+-LqP*=~sPYg~aaahkXsg3L1Q-Mh+1Sb1!lq;BM=3Zj4`9Z?fnAsh8Wmr+=+| zaQo9gwaKxoUdD0TYF`RVR+}ug=)*ZnZHuof?VnA^tg0wEUL`aCvb^{vpIQDbDq8wS z!u4h-K8?PqbHvO3UAb7ro8t$z@8pduj5_IS9rK&>6+;dCYZKReYEQj-;@1bD^Xx;|&p zwBR5Pky&SsJ8eEk4UEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-GzZ+Rj;xUkjGiz z5n0T@z;^_M8K-LVNdpDhOFVsD*`KfriZUvONXJJpFfg9+ba4#vIR5sEtw(5~#PN^) zm9@=_OqN8gRp^LoQ&L)Vu)_g=*rOplwP#1sU-OE+ap!HfSC{tGoiC|-{&2uVuM*lV#F7 zDKoDvnv1gzu8;Y>bi%sJD}?X#^@dA)waZewkiqLw*;2Ru&8C=mz6B?l__^LPeB;^` z>UJlzjaAv~IU8U0=_`c=u@`b(!_NENUlKF5$JyrG9mfwcQ+8{5>{@(O@cCW=mgO7N z`2ts21z(>3u5Pd7n;mfnv$y^f_!*ME-Oc)n#>H9kg@*%{u$dlzpvQ49vWsp1-z~XW zz4O1iM>QXmI1oA2uWH4;TJ}3d=f(27txrwa#J|bki(NIsB02Hr)%1wYF!eow`4<{C zp4{)|e@*It*xr|#>p1Kxm3Ej}IySF$^}Vpvw%6kE94%Qs$ys-0eY6w*#Vr0m?;peL z%5}@5_9rF*qgu7ZHKHUXu_Vl&Je7#Ug_7+M({Ya19?85jgC z*!mnrLvDUbW?Cg~4T^txqk$SEK{f>ErE PRK(!v>gTe~DWM4f1(Pa; literal 0 HcmV?d00001 diff --git a/assets/resources/geometry16.png b/assets/resources/geometry16.png index ceb539099dc0d77792b88d125b0c9a88d02bd1e9..38ad8ea26627f6470ba26f46da73621b69055521 100644 GIT binary patch literal 584 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+uenMVO6iP5s=4O z;1OBOz`%C|gc+x5^GO2**-JcqUD=I*%SmGe`^y3W|GmM2BnkALdDu zCp@(AQ(yOTU)}Z6`uBAc_b}ZaX|v zV9JTCv*MS+LMwv0dloX4hp4$sE$oidjdpmlJK)E;&D(sNF7%4U`mrb!t<=5n}Nx1jYoA8Gi-<001BJ|6u?C00DDSM?wMF$t-^W000SaNLh0L00TP!00TP# zi^Qrn0005&Nkl7J76;;@y1KegQc_Z-CM@Q!_ zHUn6Y3}E&4_6Ab_nW20pm<2#u#m&v_36RNyV!-?N@0UM)`m_S%T#%rTkI(-#{Q2|$Z{EE5 zzq7ORvz(mVDWE=Xux@d2@q+sL`tLxKw}EVd`jLO};(x{eK^lReb^reT*Q%ejS})Oz@)FQ{|Klc2`Ql1 zA|oUJpF4Lh|Ni~^GCM~=EAgfYcd_g*)IIge)8E+>TVZKyMwO$lSI0rm+Ogz*gfqVS!b47b9R zFqm~;qvTJ^eSa%#OYxVLt#8?Ei!hO;jtfH=P;t#Y3EL-}&dt}PSxXw~W)+i3Vm=ji zCHzyud$|EV7WxbIL><&+IJpCRl#E)QSlXdNqY^I(U!;s9!hZ0e@MUg*AIw==6?^<@ z*25`dkKfFC2>fiuniltsD$doEcZCB@3tkaUf}O%dJ%6cHEcT=DY*l%{Kgyo>Oy=9> zMpEgb3E_;sx_iG1!m*lqOtk$jDPWli;a}tS`M_Co!erZ*i=qz%ru4X~*eV5^;Oxmh># zIbd9=u76MZy2W|W#+q1gv8lWF3wvw37crfQ3dLpe9U1=I6jk;{=FmMJM-MHGSO#CUg6REf9txV(U|HJIuAp+y=+LMt2 z7ECfQEigANF*j5)F*-6aIy5;eFfckWFs6B0aR2}SC3HntbYx+4WjbwdWNBu305UK# hFfA}QEipG#GBG+bF*-CkD=;uRFfi97;?0xu0x<`WbQ%Bv delta 669 zcmdnZzJzT;TK)g_{xka-7#KJUJR*x37}%mgm~oSxayw9vy~NYkmHja%zmT%x6VZiT z3=E8)JY5_^JdVGe>YpL(C~|DSuh|x}iVfEASr#CY8R}xQ(){Z(_q~w| zs{{mZtxm`c`0~V2S7{-8zEji^B~8IVey26;w-*WBN~tfamy?=&_v|aZCu-*m4BpQ+ zzb}37dqwiXZ*Ggu{{GL@D0_Qzcw}x+;QFs;+lABLtrBCH#@jGCIrj6JPp32HUZ0ro zV)b6-o0Cj)_FmevEyH2^*;%f?H>5eoFZh`7;cZBTM?3q?6LVJX`_1brwC9QKONMRJ zXC3|;!IE8QDL!dRbx3`B_;x{~ZznI6aM-PVBDXZ@%0V{IrviJ{w5)w6!IH0<>hz)K z%%Xk&8XvUSX)V|D4Dz%$z40h9^TbB3g+|MYlMit3``oscqp(-%rURFL^XY>IqT6aC zRul+soUG(6<9_2zz_X0QswYLW_>y_=+FUPzWOj#*1PREpiz9R zbf@d8sR;~fch(&UUi~#7z4DNF%(Lk`&NIe8HQDxi;rgWsT|O0S{7RHxTnbs3AlApa zX|MC{uQ!tQ+c|Ej6ue!op8fA|@UMk`?sFdvXFvaKX%!R8k4UEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-GzZ+Rj;xUkjGiz z5n0T@z;^_M8K-LVNdpDhOFVsD*`KfrigGF!o!L^yz`(fK)5S5weI9mg{f3dfOt&J9GN#I^w8WH8v9m9IC zMMO0tb!+y+3C2A4#1>zCG1q!~&5z_?HaE; z!w>n%znN$j`Bd-cB4xP;(|h*RJuR*4cCtATefQF`Ydfn`pFU=c`fWwZt`|BqgyV)hf9t6-Y4{ z85kMp8kp-Enuiz}S{Ybc8JlVw7+4t?C@epqiJ~DlKP5A*61RrHUlmh<8YDqB1m~xf plqVLYGL)B>>t*I;7bhncr0V4trO$q6BL!5%;OXk;vd$@?2>?NDCZqrW literal 0 HcmV?d00001 diff --git a/assets/resources/printer16.png b/assets/resources/printer16.png index 1b98d2fbf639b8399767eb32aed9a1a0d93c728a..2277b0adeb04d5384014fbbe8bbd955e02b05bfd 100644 GIT binary patch delta 370 zcmZ3_GM{BaXZ;g)K~Z)?`EM_FFfcH@^>lFz(Kz3Fale-nqsZ}({Z&U-7zVJvfzE`RCtr{O2s^ zw9MFI{9DNQ>tk2%me$hzR~J*31@RSTweEYeYRaYl?wxZ@V!3_lpUq_mb>Fn>+R3U< z5A+IjN*-4gduU|?uuUfaR*x=g5$?ZLp6i;YsooZS*=}gfhhACUOP7R-Pb5ad=tyE?s z^X-rN(;K^lS8k0DdGtu!KF1>c_6p9wTY+9zEpd$~Nl7e8wMs5Z1yT$~21W+D2Ijhk r<{?IgRtDx)CYIU;237_JpSdT0N70a*pOTqYiCaTcn6~%ie~g9zL*JlV delta 394 zcmbQwvYur^XZ>RyVLmkmA&H7h3=9l^JzX3_G|snPwDoRE6gl>Be%KP1#;||@-$oC8 zXA=z*6HZ6(W?tWiA{VcOXXJCVFI%>)Nr7qMN`8ecPeOLMT$x~D@AtMA{MqZT4R@89ks{W`{`bLPSSDtA@@gF>~$HKHUXu_Vy2EzuBiGSn=5fuj>v?tZ!0006JNklrJp{;Pfr?263K|kD5@7zwJ(`Q7J8(kWpuwteh7GEz<5-jXnFgw(7R@8iOm&`RuyUEii9%)p_Hx zl$({aYs;IjH-BwLIqd@XQLjgzK96lL5#oVBdqx!|u~Uaid{=9(B!F+I%H+HKYE@vt z(!U%dELz;M694Za!M22lRIncft_6TYUaKq-V8K!Se*;YDb=tBw3CTy4=`~RpXcKrC z`csAyS06GJdXEHJGlt}xw9nTKp>66zZ@fqmX>dYrZGXXw0%N*#m|Mr7CGvDy)-jmV z;gT_d3u{F+rQ79DjbR7Ez%pHGLVwyV%Xxri@JrS;!5`cvow_ZQq``u2of_A=(Xu{e zI?o{OZ2nozdXg`8Lu%B;p|3xM)`$kJMNR?Hn;5l0$L$FH8G~_QQGjJtQlT(`mqp@J zs`7Fc0V{axj2@phk+8*XPvfWe8%Qjs1Dc|gqL$XIdJ_iohNC~9-xN*8d+LN3Hj|$M z78^1!EigANF*j5)F*-0eIx{dUFfckWFl<)eJ(JJ^78^1!EigANF*j5)F*-0eIx{dU QFfckWFdYkLfs+9PF@ozG^8f$< delta 613 zcmV-r0-F892C@c_iGSk^6AmROoIjp=00062Nkl6vpwNUyVdTAfzb~ zR*SHNN+ow1jG0G1d!P55Kj%H?-j^+}j5Yi#jt87!57P(a7=Lv&;B`1+DLFJdB_Pwh zNWhzynL2cn+B6_|gaYT~%SsvBYT1luX4bBtM6U%AeJKHbA{IoHtW`~sua1F`k)+)b zAy8`6zL*^wW1e2u^n*uHP!Q1ss@+rLSK{V&0~*urT!W8xBv#O>CCFS?dG5POYzjLy z8uu-2K-ig;MSuJh9;B6e!l35ZYdqlW>guE+lP2PxNuO1L3wpIAbK8YiM_2E?;-rZE zKBz;nPPM|?lL2GVwvO48viL%yGH_aE3=sb*ul%e9X8mx$u0Z;%33KvITksVh5~>JH_XXJQGDnA0~Un*Ty@LM_#FUDtB9_Okbmn>BA`#Rw^6guMb|9`00Ztu z4|z+jCLM`@HxBt^5!)PAuSd7Sxb!Ivmc7;;jp@{54Yg@SwJww@Q>GLzRN=NeHc*{@ z*?6T=j;FeGc_K%Jm&g*)keCp>m3z#XlA~Oe=MF~Qap$}mu8!k4UEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-GzZ+Rj;xUkjGiz z5n0T@z;^_M8K-LVNdpDhOFVsD*`Kfrin5rvZ1n%az`)q=>EamTaeVG2+ia0Qkz*h4 zs}-tBEAlD*2s^PQY?qjjw4*`9vJS?LmqZS_DYkMnZPiJ7S(bEatJj1Y#*fBp9DCRH zb~t`|G)tCy^4-F@dyTE1n@ul%|KIYt<@X?)bG-%T%I|J{-(#~c<9hOaTkYuD>oR)3 z!j^SA$5?in#04aIsTj@d6rW&`=CAZIkt5FG(UORqDvh`cCz2T2Pd{`&dw6AqvSI8? z)oE+26FINk+4eB@{hP_h>VJ5b`*f;Rt(4tgTGG4o;hO7KD_`$7`e4a@FKug?{`Sgw zKOQ!H7CL_VLCp5Ij!_HL#JcZp&;OYqznWDgEw}ojc!rlznDLFHYv%4du;YYt^)uI% zrt^|hj$S+1&c42;(CT`v{k&U6rgK+BZGPzE_-Eq$b${=MnfUBlni_h2*|cfPHZHoV zu44D(xxyI2D?NY%?PN}v7CMhd8i!PC{xWt~$( F697wD8GHZ$ literal 0 HcmV?d00001 diff --git a/assets/resources/save_as.png b/assets/resources/save_as.png index a8aa51c7331ccfe37c173d9d773c6a75f40f2ba7..d80ebcf9e1850f57db5b66143d4522aac69b8754 100644 GIT binary patch delta 598 zcmeyu(#NXU8Q|y6%O%Cdz`(%k>ERLtq!mDzg9S+5EZ$T@l6R z13W9|=~bKk468qTJ=Q;TuWR|`guMs$tW58<{Cf1+eFw*W;S0+zZ)|_Cp-#4MiouE( zhlL#v`h9)1+x;--XT2&Dj%9auf7y2_@6?93s`Ix*uNR1HkW!L9FzI|;)Cs;1hu6i; z`oHsIprS>B#+xflt~K6sHosBh{qbshj8ef18(s_J|93Ptwg0%!u(e*YXST2E>1S(H z7=ztnHLu4OZm%(7Q2zFs;qbRtxeqxj#b3zX@H@RAD7P+?^NW1RQO50Ryez+tzk9?G z<{Hj%;%DUFimTTq&Ww2AYj7m!g)2AX_hVAGnHC>Be|+Iuiv?HRl8;xUD=8j%ksQ-~ zUg6*Mu$5xW>*h9Y*V~(SY}20b1@%vy+)qsr51FqQ)fbz1Hs$jwj5OsmAL z;l#eFCx99xOLTx%1m~xflqVLYGL)B>>t*I;7bhncr0V4trO$q6BL!5&;OXk;vd$@? F2>>{Z?~ecg delta 572 zcmeBU{lcQy8Q|y6%O%Cdz`(%k>ERLtq@_TZg9S)3JGZz_RCKNX-`;;_KakH^;1OBO zz`%DHgc*K4*F|Nfyp%8Zycj9`;`_OdyT8(I#h!{>zk9p% zuL9@D03Y`+zXFbn9Za5@<1)WjOH=Ywm^jzGH04i^v~HR_-uGE4c8alJ<>|H>qs0pr zO=#KpVE3Do?qCn zSN8bquG{q-7!j%^t`Q|Ei6yC4$wjF^iowXh&{EgHQrFNl#L&XZ*wo6@MBBi`%D|vz k$(Ele8glbfGSez?X%I3n;Qh(t3e>^i>FVdQ&MBb@0G5IC4gdfE diff --git a/assets/resources/save_as_red.png b/assets/resources/save_as_red.png new file mode 100644 index 0000000000000000000000000000000000000000..5015542857784feeb20c769fd8f9b1cf9dbfcbe2 GIT binary patch literal 719 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10Vsd~_h%1o(KbR26J-2mJ zfs}qpkY6yv+;`W^UjDrM>Cxwhzdu}^qr6Zq%-)7-pIo$)f}e*6z%^Qg$%{kl9CMeF@y`Emk7#XCWC_~!L3dNt)w%zJ z83T+iJ?T;3xyW`g%dX!cwrQevz zY!L8?C80v&kZISJ+d%)QmbgZgq$HN4S|t~y0x1R~10w@n19M$N^AIBgD^p`DQv+=S z11kdqeqm;I6b-rgDVb@NxHZ)I?cNR4APKS|I6tkVJh3R1p}f3YFEcN@I61K(RWH9N UefB#WDWD<-Pgg&ebxsLQ0BM%+qW}N^ literal 0 HcmV?d00001