bed_level: improvements (#1248)

1. use the status reference instead of regex matching (this was coded before the status existed)
2. change icons to reflect the rotation direction
3. change icon to reflect that the adjustment is good enough (according to klipper docs below 6 minutes)
4. auto open the panel when screws_tilt_calculate finished

close #1231
This commit is contained in:
Alfredo Monclus 2024-01-25 22:46:51 -03:00 committed by GitHub
parent 9e252b013f
commit b5e87152f1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 613 additions and 66 deletions

View File

@ -6,7 +6,7 @@ from gi.repository import GLib
class Printer: class Printer:
def __init__(self, state_cb, state_callbacks, busy_cb): def __init__(self, state_cb, state_callbacks):
self.config = {} self.config = {}
self.data = {} self.data = {}
self.state = "disconnected" self.state = "disconnected"
@ -22,8 +22,6 @@ class Printer:
self.output_pin_count = 0 self.output_pin_count = 0
self.store_timeout = None self.store_timeout = None
self.tempstore = {} self.tempstore = {}
self.busy_cb = busy_cb
self.busy = False
self.tempstore_size = 1200 self.tempstore_size = 1200
self.cameras = [] self.cameras = []
self.available_commands = {} self.available_commands = {}
@ -41,7 +39,6 @@ class Printer:
self.ledcount = 0 self.ledcount = 0
self.output_pin_count = 0 self.output_pin_count = 0
self.tempstore = {} self.tempstore = {}
self.busy = False
if not self.store_timeout: if not self.store_timeout:
self.store_timeout = GLib.timeout_add_seconds(1, self._update_temp_store) self.store_timeout = GLib.timeout_add_seconds(1, self._update_temp_store)
self.tempstore_size = 1200 self.tempstore_size = 1200
@ -137,18 +134,10 @@ class Printer:
return "paused" return "paused"
if self.data['print_stats']['state'] == 'printing': if self.data['print_stats']['state'] == 'printing':
return "printing" return "printing"
if self.data['idle_timeout']['state'].lower() == "printing":
return "busy"
return self.data['webhooks']['state'] return self.data['webhooks']['state']
def process_status_update(self): def process_status_update(self):
state = self.evaluate_state() state = self.evaluate_state()
if state == "busy":
self.busy = True
return GLib.idle_add(self.busy_cb, True)
if self.busy:
self.busy = False
GLib.idle_add(self.busy_cb, False)
if state != self.state: if state != self.state:
self.change_state(state) self.change_state(state)
return False return False

View File

@ -36,7 +36,6 @@ class Panel(ScreenPanel):
def __init__(self, screen, title): def __init__(self, screen, title):
super().__init__(screen, title) super().__init__(screen, title)
self.response_count = 0
self.screw_dict = {} self.screw_dict = {}
self.screws = [] self.screws = []
self.y_cnt = 0 self.y_cnt = 0
@ -306,7 +305,6 @@ class Panel(ScreenPanel):
self._screen._ws.klippy.gcode_script("Z_TILT_ADJUST") self._screen._ws.klippy.gcode_script("Z_TILT_ADJUST")
def go_to_position(self, widget, position): def go_to_position(self, widget, position):
widget.set_sensitive(False)
self.home() self.home()
logging.debug(f"Going to position: {position}") logging.debug(f"Going to position: {position}")
script = [ script = [
@ -323,55 +321,40 @@ class Panel(ScreenPanel):
def process_busy(self, busy): def process_busy(self, busy):
for button in self.buttons: for button in self.buttons:
if button == "screws": if button == "screws":
self.buttons[button].set_sensitive(
self._printer.config_section_exists("screws_tilt_adjust")
and (not busy))
continue continue
self.buttons[button].set_sensitive((not busy)) self.buttons[button].set_sensitive((not busy))
def process_update(self, action, data): def process_update(self, action, data):
if action == "notify_busy": if 'idle_timeout' in data:
self.process_busy(data) self.process_busy(data['idle_timeout']['state'].lower() == "printing")
if action != "notify_status_update":
return return
if action != "notify_gcode_response": if "screws_tilt_adjust" in data:
return if "error" in data["screws_tilt_adjust"]:
if data.startswith('!!'):
self.response_count = 0
self.buttons['screws'].set_sensitive(True) self.buttons['screws'].set_sensitive(True)
return logging.info("Error reported by screws_tilt_adjust")
result = re.match( if "results" in data["screws_tilt_adjust"]:
"^// (.*) : [xX= ]+([\\-0-9\\.]+), [yY= ]+([\\-0-9\\.]+), [zZ= ]+[\\-0-9\\.]+ :" + section = self._printer.get_config_section('screws_tilt_adjust')
" (Adjust ->|adjust) ([CW]+ [0-9:]+)", for screw, result in data["screws_tilt_adjust"]["results"].items():
data logging.info(f"{screw} {result['sign']} {result['adjust']}")
) if screw not in section:
# screws_tilt_adjust uses PROBE positions and was offseted for the buttons to work equal to bed_screws logging.error(f"{screw} not found in {section}")
# for the result we need to undo the offset continue
if result: x, y = section[screw].split(',')
x = round(float(result[2]) + self.x_offset, 1) x = round(float(x) + self.x_offset, 1)
y = round(float(result[3]) + self.y_offset, 1) y = round(float(y) + self.y_offset, 1)
for key, value in self.screw_dict.items(): for key, value in self.screw_dict.items():
if value and x == value[0] and y == value[1]: if value and x == value[0] and y == value[1]:
logging.debug(f"X: {x} Y: {y} Adjust: {result[5]} Pos: {key}") logging.debug(f"X: {x} Y: {y} Adjust: {result['adjust']} Pos: {key}")
self.buttons[key].set_label(result[5]) if result['is_base']:
break logging.info(f"{screw} is the Reference")
self.response_count += 1
if self.response_count >= len(self.screws) - 1:
self.buttons['screws'].set_sensitive(True)
else:
result = re.match(
"^// (.*) : [xX= ]+([\\-0-9\\.]+), [yY= ]+([\\-0-9\\.]+), [zZ= ]+[\\-0-9\\.]",
data
)
# screws_tilt_adjust uses PROBE positions and was offseted for the buttons to work equal to bed_screws
# for the result we need to undo the offset
if result and re.search('base', result[1]):
x = round(float(result[2]) + self.x_offset, 1)
y = round(float(result[3]) + self.y_offset, 1)
logging.debug(f"X: {x} Y: {y} is the reference")
for key, value in self.screw_dict.items():
if value and x == value[0] and y == value[1]:
logging.debug(f"X: {x} Y: {y} Pos: {key}")
self.buttons[key].set_label(_("Reference")) self.buttons[key].set_label(_("Reference"))
else:
self.buttons[key].set_label(f"{result['sign']} {result['adjust']}")
if int(result['adjust'].split(':')[1]) < 6:
self.buttons[key].set_image(self._gtk.Image('complete'))
else:
self.buttons[key].set_image(self._gtk.Image(result['sign'].lower()))
def _get_screws(self, config_section_name): def _get_screws(self, config_section_name):
screws = [] screws = []
@ -397,8 +380,5 @@ class Panel(ScreenPanel):
return sorted(screws, key=lambda s: (float(s[1]), float(s[0]))) return sorted(screws, key=lambda s: (float(s[1]), float(s[0])))
def screws_tilt_calculate(self, widget): def screws_tilt_calculate(self, widget):
widget.set_sensitive(False)
self.home() self.home()
self.response_count = 0
self.buttons['screws'].set_sensitive(False)
self._screen._send_action(widget, "printer.gcode.script", {"script": "SCREWS_TILT_CALCULATE"}) self._screen._send_action(widget, "printer.gcode.script", {"script": "SCREWS_TILT_CALCULATE"})

View File

@ -191,7 +191,7 @@ class KlipperScreen(Gtk.Window):
"shutdown": self.state_shutdown "shutdown": self.state_shutdown
} }
for printer in self.printers: for printer in self.printers:
printer["data"] = Printer(state_execute, state_callbacks, self.process_busy_state) printer["data"] = Printer(state_execute, state_callbacks)
default_printer = self._config.get_main_config().get('default_printer') default_printer = self._config.get_main_config().get('default_printer')
logging.debug(f"Default printer: {default_printer}") logging.debug(f"Default printer: {default_printer}")
if [True for p in self.printers if default_printer in p]: if [True for p in self.printers if default_printer in p]:
@ -266,6 +266,7 @@ class KlipperScreen(Gtk.Window):
"motion_report": ["live_position", "live_velocity", "live_extruder_velocity"], "motion_report": ["live_position", "live_velocity", "live_extruder_velocity"],
"exclude_object": ["current_object", "objects", "excluded_objects"], "exclude_object": ["current_object", "objects", "excluded_objects"],
"manual_probe": ['is_active'], "manual_probe": ['is_active'],
"screws_tilt_adjust": ['results', 'error'],
} }
} }
for extruder in self.printer.get_tools(): for extruder in self.printer.get_tools():
@ -326,7 +327,6 @@ class KlipperScreen(Gtk.Window):
logging.debug(f"Current panel hierarchy: {' > '.join(self._cur_panels)}") logging.debug(f"Current panel hierarchy: {' > '.join(self._cur_panels)}")
if hasattr(self.panels[panel], "process_update"): if hasattr(self.panels[panel], "process_update"):
self.process_update("notify_status_update", self.printer.data) self.process_update("notify_status_update", self.printer.data)
self.process_update("notify_busy", self.printer.busy)
if hasattr(self.panels[panel], "activate"): if hasattr(self.panels[panel], "activate"):
self.panels[panel].activate() self.panels[panel].activate()
self.show_all() self.show_all()
@ -652,10 +652,6 @@ class KlipperScreen(Gtk.Window):
self.base_panel.show_heaters(False) self.base_panel.show_heaters(False)
self.show_panel("printer_select", _("Printer Select"), remove_all=True) self.show_panel("printer_select", _("Printer Select"), remove_all=True)
def process_busy_state(self, busy):
self.process_update("notify_busy", busy)
return False
def websocket_disconnected(self, msg): def websocket_disconnected(self, msg):
self.printer_initializing(msg, remove=True) self.printer_initializing(msg, remove=True)
self.printer.state = "disconnected" self.printer.state = "disconnected"
@ -758,6 +754,8 @@ class KlipperScreen(Gtk.Window):
self.printer.process_update(data) self.printer.process_update(data)
if 'manual_probe' in data and data['manual_probe']['is_active'] and 'zcalibrate' not in self._cur_panels: if 'manual_probe' in data and data['manual_probe']['is_active'] and 'zcalibrate' not in self._cur_panels:
self.show_panel("zcalibrate", _('Z Calibrate')) self.show_panel("zcalibrate", _('Z Calibrate'))
if "screws_tilt_adjust" in data and 'bed_level' not in self._cur_panels:
self.show_panel("bed_level", _('Bed Level'))
elif action == "notify_filelist_changed": elif action == "notify_filelist_changed":
if self.files is not None: if self.files is not None:
self.files.process_update(data) self.files.process_update(data)

View File

@ -0,0 +1,82 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="64"
height="64"
viewBox="0 0 64 64"
version="1.1"
id="svg10"
sodipodi:docname="ccw.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<sodipodi:namedview
pagecolor="#002b36"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:window-width="1600"
inkscape:window-height="827"
id="namedview11"
showgrid="false"
inkscape:pagecheckerboard="false"
inkscape:zoom="9.8125"
inkscape:cx="24.611465"
inkscape:cy="26.751592"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg10"
inkscape:document-rotation="0"
inkscape:showpageshadow="0"
inkscape:deskcolor="#d1d1d1" />
<metadata
id="metadata16">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>reboot</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs14" />
<!-- Generator: Sketch 52.5 (67469) - http://www.bohemiancoding.com/sketch -->
<title
id="title2">reboot</title>
<desc
id="desc4">Created with Sketch.</desc>
<g
id="g1"
transform="matrix(-1,0,0,1,65.338774,0)">
<path
style="fill:none;stroke:#eee8d5;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.978816"
id="path1602"
sodipodi:type="arc"
sodipodi:cx="31.999998"
sodipodi:cy="30.999998"
sodipodi:rx="23"
sodipodi:ry="23"
sodipodi:start="0.34906585"
sodipodi:end="5.5850536"
sodipodi:open="true"
sodipodi:arc-type="arc"
d="M 53.612928,38.866461 A 23,23 0 0 1 29.995416,53.912476 23,23 0 0 1 9.3494198,34.993906 23,23 0 0 1 22.279778,10.154919 23,23 0 0 1 49.61902,16.215883" />
<path
style="color:#000000;display:inline;opacity:0.998;fill:#eee8d5;stroke:none;stroke-width:0.999996;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none"
d="m 44.419427,15.545528 4.601827,-4.601827 c 0.341169,-0.341169 0.752279,-0.319634 0.996042,-0.07587 l 2.195376,2.195375 c 0.876612,0.876258 2.376088,0.277073 2.407424,-0.961996 l 0.07976,-3.0951208 c 0.01064,-0.414859 0.381781,-0.786003 0.796637,-0.796638 l 4.228314,-0.107971 c 0.208443,-0.0053 0.343523,0.06144 0.447441,0.165359 0.103919,0.103919 0.171668,0.239975 0.16633,0.448412 l -0.325853,12.6888308 -0.106997,4.231229 c -0.01067,0.416029 -0.378664,0.784028 -0.794694,0.794694 l -4.23123,0.106997 -12.68883,0.325853 c -0.416025,0.01066 -0.624436,-0.197746 -0.613771,-0.61377 l 0.107969,-4.228313 c 0.01064,-0.414859 0.381778,-0.786002 0.796639,-0.796639 l 3.095122,-0.07976 c 1.239068,-0.03134 1.838252,-1.530811 0.961995,-2.407422 l -2.195376,-2.195376 c -0.243763,-0.243763 -0.265294,-0.654877 0.07587,-0.996043 z"
id="rect852-3"
sodipodi:nodetypes="ssscccccscccccccccccss" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="64"
height="64"
viewBox="0 0 64 64"
version="1.1"
id="svg10"
sodipodi:docname="refresh.svg"
inkscape:version="1.1 (c4e8f9ed74, 2021-05-24)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<sodipodi:namedview
pagecolor="#002b36"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:window-width="1600"
inkscape:window-height="826"
id="namedview11"
showgrid="false"
inkscape:pagecheckerboard="false"
inkscape:zoom="9.8125"
inkscape:cx="24.66242"
inkscape:cy="26.853503"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg10"
inkscape:document-rotation="0" />
<metadata
id="metadata16">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>reboot</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs14" />
<!-- Generator: Sketch 52.5 (67469) - http://www.bohemiancoding.com/sketch -->
<title
id="title2">reboot</title>
<desc
id="desc4">Created with Sketch.</desc>
<path
style="fill:none;stroke:#eee8d5;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.978816"
id="path1602"
sodipodi:type="arc"
sodipodi:cx="31.999998"
sodipodi:cy="30.999998"
sodipodi:rx="23"
sodipodi:ry="23"
sodipodi:start="0.34906585"
sodipodi:end="5.5850536"
sodipodi:open="true"
sodipodi:arc-type="arc"
d="M 53.612928,38.866461 A 23,23 0 0 1 29.995416,53.912476 23,23 0 0 1 9.3494198,34.993906 23,23 0 0 1 22.279778,10.154919 23,23 0 0 1 49.61902,16.215883" />
<path
style="color:#000000;display:inline;opacity:0.998;fill:#eee8d5;stroke:none;stroke-width:0.999996;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none"
d="m 44.419427,15.545528 4.601827,-4.601827 c 0.341169,-0.341169 0.752279,-0.319634 0.996042,-0.07587 l 2.195376,2.195375 c 0.876612,0.876258 2.376088,0.277073 2.407424,-0.961996 l 0.07976,-3.0951208 c 0.01064,-0.414859 0.381781,-0.786003 0.796637,-0.796638 l 4.228314,-0.107971 c 0.208443,-0.0053 0.343523,0.06144 0.447441,0.165359 0.103919,0.103919 0.171668,0.239975 0.16633,0.448412 l -0.325853,12.6888308 -0.106997,4.231229 c -0.01067,0.416029 -0.378664,0.784028 -0.794694,0.794694 l -4.23123,0.106997 -12.68883,0.325853 c -0.416025,0.01066 -0.624436,-0.197746 -0.613771,-0.61377 l 0.107969,-4.228313 c 0.01064,-0.414859 0.381778,-0.786002 0.796639,-0.796639 l 3.095122,-0.07976 c 1.239068,-0.03134 1.838252,-1.530811 0.961995,-2.407422 l -2.195376,-2.195376 c -0.243763,-0.243763 -0.265294,-0.654877 0.07587,-0.996043 z"
id="rect852-3"
sodipodi:nodetypes="ssscccccscccccccccccss" />
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
width="24"
height="24"
viewBox="0 0 24 24"
id="svg1087"
sodipodi:docname="ccw.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1091" />
<sodipodi:namedview
id="namedview1089"
pagecolor="#505050"
bordercolor="#ffffff"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
showgrid="false"
inkscape:zoom="26"
inkscape:cx="-0.38461538"
inkscape:cy="12.019231"
inkscape:window-width="1600"
inkscape:window-height="827"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1087"
inkscape:showpageshadow="0"
inkscape:deskcolor="#d1d1d1" />
<path
d="M 6.35,6.35 C 7.8,4.9 9.79,4 12,4 a 8,8 0 0 1 8,8 8,8 0 0 1 -8,8 C 8.27,20 5.16,17.45 4.27,14 h 2.08 c 0.82,2.33 3.04,4 5.65,4 A 6,6 0 0 0 18,12 6,6 0 0 0 12,6 C 10.34,6 8.86,6.69 7.78,7.78 L 11,11 H 4 V 4 Z"
id="path1085"
style="fill:#e2e2e2" />
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
width="24"
height="24"
viewBox="0 0 24 24"
id="svg1087"
sodipodi:docname="refresh.svg"
inkscape:version="1.1 (c4e8f9ed74, 2021-05-24)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1091" />
<sodipodi:namedview
id="namedview1089"
pagecolor="#505050"
bordercolor="#ffffff"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
showgrid="false"
inkscape:zoom="26"
inkscape:cx="-0.38461538"
inkscape:cy="12.019231"
inkscape:window-width="1600"
inkscape:window-height="826"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1087" />
<path
d="M17.65,6.35C16.2,4.9 14.21,4 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20C15.73,20 18.84,17.45 19.73,14H17.65C16.83,16.33 14.61,18 12,18A6,6 0 0,1 6,12A6,6 0 0,1 12,6C13.66,6 15.14,6.69 16.22,7.78L13,11H20V4L17.65,6.35Z"
id="path1085"
style="fill:#e2e2e2" />
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
width="24"
height="24"
viewBox="0 0 24 24"
id="svg1087"
sodipodi:docname="ccw.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1091" />
<sodipodi:namedview
id="namedview1089"
pagecolor="#505050"
bordercolor="#ffffff"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
showgrid="false"
inkscape:zoom="26"
inkscape:cx="-0.38461538"
inkscape:cy="12.019231"
inkscape:window-width="1600"
inkscape:window-height="827"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1087"
inkscape:showpageshadow="0"
inkscape:deskcolor="#d1d1d1" />
<path
d="M 6.35,6.35 C 7.8,4.9 9.79,4 12,4 a 8,8 0 0 1 8,8 8,8 0 0 1 -8,8 C 8.27,20 5.16,17.45 4.27,14 h 2.08 c 0.82,2.33 3.04,4 5.65,4 A 6,6 0 0 0 18,12 6,6 0 0 0 12,6 C 10.34,6 8.86,6.69 7.78,7.78 L 11,11 H 4 V 4 Z"
id="path1085"
style="fill:#e2e2e2" />
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
width="24"
height="24"
viewBox="0 0 24 24"
id="svg1087"
sodipodi:docname="refresh.svg"
inkscape:version="1.1 (c4e8f9ed74, 2021-05-24)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1091" />
<sodipodi:namedview
id="namedview1089"
pagecolor="#505050"
bordercolor="#ffffff"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
showgrid="false"
inkscape:zoom="26"
inkscape:cx="-0.38461538"
inkscape:cy="12.019231"
inkscape:window-width="1600"
inkscape:window-height="826"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1087" />
<path
d="M17.65,6.35C16.2,4.9 14.21,4 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20C15.73,20 18.84,17.45 19.73,14H17.65C16.83,16.33 14.61,18 12,18A6,6 0 0,1 6,12A6,6 0 0,1 12,6C13.66,6 15.14,6.69 16.22,7.78L13,11H20V4L17.65,6.35Z"
id="path1085"
style="fill:#e2e2e2" />
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
width="24"
height="24"
viewBox="0 0 24 24"
id="svg1087"
sodipodi:docname="ccw.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1091" />
<sodipodi:namedview
id="namedview1089"
pagecolor="#505050"
bordercolor="#ffffff"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
showgrid="false"
inkscape:zoom="26"
inkscape:cx="-0.38461538"
inkscape:cy="12.019231"
inkscape:window-width="1600"
inkscape:window-height="827"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1087"
inkscape:showpageshadow="0"
inkscape:deskcolor="#d1d1d1" />
<path
d="M 6.35,6.35 C 7.8,4.9 9.79,4 12,4 a 8,8 0 0 1 8,8 8,8 0 0 1 -8,8 C 8.27,20 5.16,17.45 4.27,14 h 2.08 c 0.82,2.33 3.04,4 5.65,4 A 6,6 0 0 0 18,12 6,6 0 0 0 12,6 C 10.34,6 8.86,6.69 7.78,7.78 L 11,11 H 4 V 4 Z"
id="path1085"
style="fill:#000000;font-variation-settings:normal;opacity:1;vector-effect:none;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
width="24"
height="24"
viewBox="0 0 24 24"
id="svg1087"
sodipodi:docname="cw.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1091" />
<sodipodi:namedview
id="namedview1089"
pagecolor="#505050"
bordercolor="#ffffff"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
showgrid="false"
inkscape:zoom="26"
inkscape:cx="-0.38461538"
inkscape:cy="12.019231"
inkscape:window-width="1600"
inkscape:window-height="827"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1087"
inkscape:showpageshadow="0"
inkscape:deskcolor="#d1d1d1" />
<path
d="M17.65,6.35C16.2,4.9 14.21,4 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20C15.73,20 18.84,17.45 19.73,14H17.65C16.83,16.33 14.61,18 12,18A6,6 0 0,1 6,12A6,6 0 0,1 12,6C13.66,6 15.14,6.69 16.22,7.78L13,11H20V4L17.65,6.35Z"
id="path1085"
style="fill:#000000;font-variation-settings:normal;opacity:1;vector-effect:none;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="64"
height="64"
viewBox="0 0 64 64"
version="1.1"
id="svg10"
sodipodi:docname="ccw.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata
id="metadata16">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>folder</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs14" />
<sodipodi:namedview
pagecolor="#bfbfbf"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1600"
inkscape:window-height="827"
id="namedview12"
showgrid="false"
inkscape:pagecheckerboard="false"
inkscape:zoom="7.6562596"
inkscape:cx="28.995882"
inkscape:cy="29.453024"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg10"
inkscape:snap-bbox="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:document-rotation="0"
inkscape:snap-bbox-midpoints="true"
inkscape:snap-intersection-paths="true"
inkscape:snap-midpoints="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:bbox-nodes="true"
inkscape:bbox-paths="true"
inkscape:showpageshadow="0"
inkscape:deskcolor="#d1d1d1" />
<!-- Generator: Sketch 52.5 (67469) - http://www.bohemiancoding.com/sketch -->
<title
id="title2">folder</title>
<desc
id="desc4">Created with Sketch.</desc>
<g
id="g1"
transform="translate(1.2631795)">
<path
sodipodi:nodetypes="ccc"
inkscape:connector-curvature="0"
id="path4710-2-1"
d="m 4.3403339,31.365635 5.187416,7.118657 5.0236311,-7.118657 z"
style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.73127;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#ffffff;stroke-width:4;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stop-color:#000000"
id="path853"
sodipodi:type="arc"
sodipodi:cx="33"
sodipodi:cy="32"
sodipodi:rx="23.5"
sodipodi:ry="23.5"
sodipodi:start="3.1415927"
sodipodi:end="2.3561945"
sodipodi:arc-type="arc"
sodipodi:open="true"
d="M 9.5,32 A 23.5,23.5 0 0 1 28.415378,8.9515457 23.5,23.5 0 0 1 54.711169,23.00694 23.5,23.5 0 0 1 46.0559,51.539536 23.5,23.5 0 0 1 16.38299,48.617009" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="64"
height="64"
viewBox="0 0 64 64"
version="1.1"
id="svg10"
sodipodi:docname="cw.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata
id="metadata16">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>folder</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs14" />
<sodipodi:namedview
pagecolor="#bfbfbf"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1600"
inkscape:window-height="827"
id="namedview12"
showgrid="false"
inkscape:pagecheckerboard="false"
inkscape:zoom="7.6562596"
inkscape:cx="28.995882"
inkscape:cy="29.453024"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg10"
inkscape:snap-bbox="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:document-rotation="0"
inkscape:snap-bbox-midpoints="true"
inkscape:snap-intersection-paths="true"
inkscape:snap-midpoints="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:bbox-nodes="true"
inkscape:bbox-paths="true"
inkscape:showpageshadow="0"
inkscape:deskcolor="#d1d1d1" />
<!-- Generator: Sketch 52.5 (67469) - http://www.bohemiancoding.com/sketch -->
<title
id="title2">folder</title>
<desc
id="desc4">Created with Sketch.</desc>
<g
id="g1"
transform="matrix(-1,0,0,1,62.736821,0)">
<path
sodipodi:nodetypes="ccc"
inkscape:connector-curvature="0"
id="path4710-2-1"
d="m 4.3403339,31.365635 5.187416,7.118657 5.0236311,-7.118657 z"
style="display:inline;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.73127;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#ffffff;stroke-width:4;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stop-color:#000000"
id="path853"
sodipodi:type="arc"
sodipodi:cx="33"
sodipodi:cy="32"
sodipodi:rx="23.5"
sodipodi:ry="23.5"
sodipodi:start="3.1415927"
sodipodi:end="2.3561945"
sodipodi:arc-type="arc"
sodipodi:open="true"
d="M 9.5,32 A 23.5,23.5 0 0 1 28.415378,8.9515457 23.5,23.5 0 0 1 54.711169,23.00694 23.5,23.5 0 0 1 46.0559,51.539536 23.5,23.5 0 0 1 16.38299,48.617009" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB