From 6641d69ddad4f23af4cd6fd49de5ed0f31c7b3e8 Mon Sep 17 00:00:00 2001 From: faecorrigan <145371008+faecorrigan@users.noreply.github.com> Date: Sun, 12 Jul 2026 13:45:33 +0100 Subject: [PATCH 1/4] Added Help Buttons The help buttons link to the relevant documentation page on our gitbook --- CHANGELOG.md | 1 + .../addons/facing/FacingWizardPopup.kv | 3 ++ .../addons/probe_scan/ui/ProbeScanPopup.kv | 2 + .../addons/probing/ProbingPopup.kv | 9 ++-- .../addons/probing/ProbingPopup.py | 5 --- .../probing/operations/Angle/AngleSettings.kv | 10 ++++- .../Calibration/CalibrationSettings.kv | 10 ++++- .../FourthAxis/FourthAxisSettings.kv | 9 ++++ carveracontroller/addons/tooltips/Tooltips.kv | 25 +++++++++++ carveracontroller/addons/tooltips/Tooltips.py | 26 +++++++++++- carveracontroller/makera.kv | 41 +++++++++++++++++-- 11 files changed, 123 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 603ca7b9..3ceb756a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,7 @@ - Change: Remove remaining "Can not load config, Key:" messages from the MDI - Change: Resume playback will now use gcode loaded in the controller instead of cached local file - Change: Upgrade screen now will show the letter "c" at the end of the current firmware version if it's present. This indicates that it's Community firmware +- Enhancement: added green question mark help buttons to the UI that link to the relavent documentation page [2.1.0] - Enhancement: Add right-click menu option to clear resume-at-line setting diff --git a/carveracontroller/addons/facing/FacingWizardPopup.kv b/carveracontroller/addons/facing/FacingWizardPopup.kv index 3829df51..0993f6d6 100644 --- a/carveracontroller/addons/facing/FacingWizardPopup.kv +++ b/carveracontroller/addons/facing/FacingWizardPopup.kv @@ -638,3 +638,6 @@ font_size: dp(12) text: tr._('Close') on_release: root.dismiss() + + HelpButton: + helpPath: "https://carvera-community.gitbook.io/docs/controller/features/facing-widget" diff --git a/carveracontroller/addons/probe_scan/ui/ProbeScanPopup.kv b/carveracontroller/addons/probe_scan/ui/ProbeScanPopup.kv index 183653d7..be30d240 100644 --- a/carveracontroller/addons/probe_scan/ui/ProbeScanPopup.kv +++ b/carveracontroller/addons/probe_scan/ui/ProbeScanPopup.kv @@ -999,6 +999,8 @@ text: tr._('Close') size_hint_x: 1 on_release: root.dismiss() + HelpButton: + helpPath: "https://carvera-community.gitbook.io/docs/controller/features/probe_scan" BoxLayout: id: probing_banner diff --git a/carveracontroller/addons/probing/ProbingPopup.kv b/carveracontroller/addons/probing/ProbingPopup.kv index a47ed7a1..ae0a72d4 100644 --- a/carveracontroller/addons/probing/ProbingPopup.kv +++ b/carveracontroller/addons/probing/ProbingPopup.kv @@ -664,17 +664,14 @@ Label: size_hint_min_x: dp(90) padding: '5dp' - halign: 'center' + halign: 'right' valign: 'middle' text_size: self.size multiline: False text: tr._('Note: Most of these operations require a true 3 axis probe, not the manual probe supplied with the Carvera. See the documentation for more info') - Button: - text: "More Info" - size_hint_x: None - width: dp(100) - on_release: root.open_probe_info_url() + HelpButton: + helpPath: "https://carvera-community.gitbook.io/docs/firmware/features/3d-probe-support" BoxLayout: spacing: '5dp' diff --git a/carveracontroller/addons/probing/ProbingPopup.py b/carveracontroller/addons/probing/ProbingPopup.py index 0c93256d..afaafbc7 100644 --- a/carveracontroller/addons/probing/ProbingPopup.py +++ b/carveracontroller/addons/probing/ProbingPopup.py @@ -30,8 +30,6 @@ logger = logging.getLogger(__name__) -import webbrowser - from kivy.app import App @@ -65,9 +63,6 @@ def allows_external_jog(self) -> bool: """Allow keyboard/pendant jog while the probing screen is open.""" return self._is_open - def open_probe_info_url(self): - webbrowser.open("https://carvera-community.gitbook.io/docs/firmware/features/3d-probe-support") - def delayed_bind(self, dt): self.outside_corner_settings = self.ids.outside_corner_settings self.inside_corner_settings = self.ids.inside_corner_settings diff --git a/carveracontroller/addons/probing/operations/Angle/AngleSettings.kv b/carveracontroller/addons/probing/operations/Angle/AngleSettings.kv index e428182c..df9c6234 100644 --- a/carveracontroller/addons/probing/operations/Angle/AngleSettings.kv +++ b/carveracontroller/addons/probing/operations/Angle/AngleSettings.kv @@ -253,4 +253,12 @@ pos: self.pos size: self.size active: root.get_setting('UseProbeNormallyClosed') == "1" - on_active: root.setting_changed('UseProbeNormallyClosed', "1" if self.active else "0") \ No newline at end of file + on_active: root.setting_changed('UseProbeNormallyClosed', "1" if self.active else "0") + BoxLayout: + ProbeSettingLabel: + label_text: 'More Info:' + hint_text: '' + BoxLayout: + size_hint_x: 0.4 + HelpButton: + helpPath: "https://carvera-community.gitbook.io/docs/controller/features/wcs-rotation#clearing-a-rotation" \ No newline at end of file diff --git a/carveracontroller/addons/probing/operations/Calibration/CalibrationSettings.kv b/carveracontroller/addons/probing/operations/Calibration/CalibrationSettings.kv index 529d84ce..83f1a546 100644 --- a/carveracontroller/addons/probing/operations/Calibration/CalibrationSettings.kv +++ b/carveracontroller/addons/probing/operations/Calibration/CalibrationSettings.kv @@ -179,4 +179,12 @@ pos: self.pos size: self.size active: root.get_setting('UseProbeNormallyClosed') == "1" - on_active: root.setting_changed('UseProbeNormallyClosed', "1" if self.active else "0") \ No newline at end of file + on_active: root.setting_changed('UseProbeNormallyClosed', "1" if self.active else "0") + BoxLayout: + ProbeSettingLabel: + label_text: 'More Info:' + hint_text: '' + BoxLayout: + size_hint_x: 0.4 + HelpButton: + helpPath: "https://carvera-community.gitbook.io/docs/firmware/supported-commands/mcodes/self-calibration" \ No newline at end of file diff --git a/carveracontroller/addons/probing/operations/FourthAxis/FourthAxisSettings.kv b/carveracontroller/addons/probing/operations/FourthAxis/FourthAxisSettings.kv index 39dc7c55..74f51d17 100644 --- a/carveracontroller/addons/probing/operations/FourthAxis/FourthAxisSettings.kv +++ b/carveracontroller/addons/probing/operations/FourthAxis/FourthAxisSettings.kv @@ -156,3 +156,12 @@ size: self.size active: root.get_setting('SaveAOffset') == "1" on_active: root.setting_changed('SaveAOffset', "1" if self.active else "0") + BoxLayout: + ProbeSettingLabel: + label_text: 'More Info:' + hint_text: '' + BoxLayout: + size_hint_x: 0.4 + HelpButton: + halign: 'center' + helpPath: "https://carvera-community.gitbook.io/docs/firmware/supported-commands/mcodes/self-calibration" \ No newline at end of file diff --git a/carveracontroller/addons/tooltips/Tooltips.kv b/carveracontroller/addons/tooltips/Tooltips.kv index 8fa35417..c0042bb6 100644 --- a/carveracontroller/addons/tooltips/Tooltips.kv +++ b/carveracontroller/addons/tooltips/Tooltips.kv @@ -80,3 +80,28 @@ Rectangle: size: self.size pos: self.pos + + + id: help_button + orientation: 'vertical' + halign: 'center' + pos_hint: {'center_x': 0.5, 'center_y': 0.5} + size_hint: None, None + height: self.parent.height + width: self.parent.height * 2 + state_image: self.background_normal if self.state == 'normal' else self.background_down + disabled_image: self.background_disabled_normal if self.state == 'normal' else self.background_disabled_down + canvas: + Color: + rgba: 0, 1, 0, 1 + BorderImage: + border: self.border + pos: self.pos + size: self.size + source: self.disabled_image if self.disabled else self.state_image + Image: + id: image + source: root.image_source + fit_mode: 'scale-down' + size_hint: 0.3,0.3 + pos_hint: {'center_x': 0.5, 'center_y': 0.5} \ No newline at end of file diff --git a/carveracontroller/addons/tooltips/Tooltips.py b/carveracontroller/addons/tooltips/Tooltips.py index 91a9a916..0460c6dc 100644 --- a/carveracontroller/addons/tooltips/Tooltips.py +++ b/carveracontroller/addons/tooltips/Tooltips.py @@ -5,7 +5,7 @@ from kivy.compat import string_types from kivy.core.window import Window from kivy.factory import Factory -from kivy.properties import BooleanProperty, NumericProperty, ObjectProperty, StringProperty +from kivy.properties import BooleanProperty, NumericProperty, ObjectProperty, StringProperty, ListProperty from kivy.uix.boxlayout import BoxLayout from kivy.uix.button import Button from kivy.uix.dropdown import DropDown @@ -15,7 +15,8 @@ from kivy.uix.spinner import Spinner from kivy.uix.switch import Switch from kivy.uix.textinput import TextInput - +from kivy.uix.behaviors import ButtonBehavior +import webbrowser class Tooltip(BoxLayout): pass @@ -823,3 +824,24 @@ def close_tooltip(self, *args): def display_tooltip(self, *args): Window.add_widget(self._tooltip) + +class HelpButton(ButtonBehavior, BoxLayout): + image_source = StringProperty('data/open_iconic_UI/oi--question-mark.png') + helpPath = StringProperty("https://carvera-community.gitbook.io/docs") + background_normal = StringProperty('atlas://data/images/defaulttheme/button') + background_down = StringProperty('atlas://data/images/defaulttheme/button_pressed') + background_disabled_normal = StringProperty('atlas://data/images/defaulttheme/button_disabled') + background_disabled_down = StringProperty('atlas://data/images/defaulttheme/button_disabled_pressed') + border = ListProperty([16, 16, 16, 16]) + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.bind(on_release=self.open_link) + fbind = self.fbind + + + def open_link(self, *args): + webbrowser.open(self.helpPath) + + + diff --git a/carveracontroller/makera.kv b/carveracontroller/makera.kv index d00ff6d7..9452063f 100644 --- a/carveracontroller/makera.kv +++ b/carveracontroller/makera.kv @@ -514,6 +514,12 @@ on_release: root.select('Third Item') app.root.controller.clearAutoLeveling() + BoxLayout: + size_hint_y: None + height: '48dp' + HelpButton: + helpPath: "https://carvera-community.gitbook.io/docs/controller/features/auto-leveling" + : @@ -1499,6 +1505,12 @@ root.dismiss() if root.unlock_safe_z:\ root.unlock_safe_z() + BoxLayout: + size_hint_x: 0.25 + HelpButton: + size_hint: 1,1 + helpPath: "https://carvera-community.gitbook.io/docs/controller/common-error-messages" + : lb_title: lb_title @@ -1727,6 +1739,7 @@ id: btn_ok text: tr._('Ok') on_release: root.on_ok_pressed() + TabbedPanelItem: text: tr._('Set By XYZ Probe') @@ -3757,7 +3770,7 @@ size: self.size radius: [dp(12),] GridLayout: - cols: 3 + cols: 4 rows: 1 spacing: '3dp' GridBoxLayout: @@ -3781,6 +3794,12 @@ text: tr._('Macro 3') height: '35dp' on_release: app.root.run_macro(3) + GridBoxLayout: + size_hint: 0.25,1 + HelpButton: + size_hint: 1,1 + helpPath: "https://carvera-community.gitbook.io/docs/controller/features/macros" + Widget: size_hint_y: 0.15 BoxLayout: @@ -3909,7 +3928,7 @@ size: self.size radius: [dp(12),] GridLayout: - cols: 2 + cols: 3 rows: 2 spacing: '3dp' GridBoxLayout: @@ -3927,7 +3946,8 @@ text: tr._('Jog Mode:Step') height: '35dp' on_release: app.root.toggle_jog_mode() - + GridBoxLayout: + size_hint_x: 0.15 GridBoxLayout: ToggleButton: id: kb_jog_btn @@ -3943,6 +3963,11 @@ state: app.jog_pendant_enable height: '35dp' on_release: app.root.toggle_pendant_jog_control() + GridBoxLayout: + size_hint_x: 0.15 + HelpButton: + size_hint: 1,1 + helpPath: "https://carvera-community.gitbook.io/docs/controller/features/jogging-controls" BoxLayout: disabled: not (app.state == 'Idle' or app.state == 'Run' or app.state == 'Pause') or (app.playing and app.state != 'Pause') or (app.state == 'Run' and root.allow_jogging_while_machine_running == '0') @@ -5435,6 +5460,11 @@ on_release: root.apply_changes() root.dismiss() + BoxLayout: + size_hint_x: 0.2 + HelpButton: + helpPath: "https://carvera-community.gitbook.io/docs/controller/features/workspace-management" + : size_hint: 0.5, 0.4 @@ -5497,6 +5527,11 @@ text: tr._('Ok') on_release: on_release: root.on_ok_pressed() + BoxLayout: + size_hint_x: 0.2 + HelpButton: + helpPath: "https://carvera-community.gitbook.io/docs/controller/features/wcs-rotation" + # Solid disabled look (no faded theme atlas / no ghost text): mute bg + text vs enabled row. : From 0fc5d603bac405c20d90db37ada37c94dec1032e Mon Sep 17 00:00:00 2001 From: faecorrigan <145371008+faecorrigan@users.noreply.github.com> Date: Sun, 19 Jul 2026 09:17:17 +0100 Subject: [PATCH 2/4] remove buttons from help screen --- carveracontroller/makera.kv | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/carveracontroller/makera.kv b/carveracontroller/makera.kv index 9452063f..8af9fb68 100644 --- a/carveracontroller/makera.kv +++ b/carveracontroller/makera.kv @@ -3794,11 +3794,6 @@ text: tr._('Macro 3') height: '35dp' on_release: app.root.run_macro(3) - GridBoxLayout: - size_hint: 0.25,1 - HelpButton: - size_hint: 1,1 - helpPath: "https://carvera-community.gitbook.io/docs/controller/features/macros" Widget: size_hint_y: 0.15 @@ -3928,7 +3923,7 @@ size: self.size radius: [dp(12),] GridLayout: - cols: 3 + cols: 2 rows: 2 spacing: '3dp' GridBoxLayout: @@ -3963,12 +3958,7 @@ state: app.jog_pendant_enable height: '35dp' on_release: app.root.toggle_pendant_jog_control() - GridBoxLayout: - size_hint_x: 0.15 - HelpButton: - size_hint: 1,1 - helpPath: "https://carvera-community.gitbook.io/docs/controller/features/jogging-controls" - + BoxLayout: disabled: not (app.state == 'Idle' or app.state == 'Run' or app.state == 'Pause') or (app.playing and app.state != 'Pause') or (app.state == 'Run' and root.allow_jogging_while_machine_running == '0') padding: '25dp' From 4b917d59b9a46da67db3042be254b3d8d5f59c6b Mon Sep 17 00:00:00 2001 From: Serge Bakharev Date: Sun, 19 Jul 2026 18:35:46 +1000 Subject: [PATCH 3/4] fix the jogging control box and formatting --- carveracontroller/addons/tooltips/Tooltips.py | 22 +++++++++---------- carveracontroller/makera.kv | 7 ++---- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/carveracontroller/addons/tooltips/Tooltips.py b/carveracontroller/addons/tooltips/Tooltips.py index 0460c6dc..e7d5fe5b 100644 --- a/carveracontroller/addons/tooltips/Tooltips.py +++ b/carveracontroller/addons/tooltips/Tooltips.py @@ -1,11 +1,13 @@ import sys +import webbrowser from kivy.app import App from kivy.clock import Clock from kivy.compat import string_types from kivy.core.window import Window from kivy.factory import Factory -from kivy.properties import BooleanProperty, NumericProperty, ObjectProperty, StringProperty, ListProperty +from kivy.properties import BooleanProperty, ListProperty, NumericProperty, ObjectProperty, StringProperty +from kivy.uix.behaviors import ButtonBehavior from kivy.uix.boxlayout import BoxLayout from kivy.uix.button import Button from kivy.uix.dropdown import DropDown @@ -15,8 +17,7 @@ from kivy.uix.spinner import Spinner from kivy.uix.switch import Switch from kivy.uix.textinput import TextInput -from kivy.uix.behaviors import ButtonBehavior -import webbrowser + class Tooltip(BoxLayout): pass @@ -825,13 +826,14 @@ def close_tooltip(self, *args): def display_tooltip(self, *args): Window.add_widget(self._tooltip) + class HelpButton(ButtonBehavior, BoxLayout): - image_source = StringProperty('data/open_iconic_UI/oi--question-mark.png') + image_source = StringProperty("data/open_iconic_UI/oi--question-mark.png") helpPath = StringProperty("https://carvera-community.gitbook.io/docs") - background_normal = StringProperty('atlas://data/images/defaulttheme/button') - background_down = StringProperty('atlas://data/images/defaulttheme/button_pressed') - background_disabled_normal = StringProperty('atlas://data/images/defaulttheme/button_disabled') - background_disabled_down = StringProperty('atlas://data/images/defaulttheme/button_disabled_pressed') + background_normal = StringProperty("atlas://data/images/defaulttheme/button") + background_down = StringProperty("atlas://data/images/defaulttheme/button_pressed") + background_disabled_normal = StringProperty("atlas://data/images/defaulttheme/button_disabled") + background_disabled_down = StringProperty("atlas://data/images/defaulttheme/button_disabled_pressed") border = ListProperty([16, 16, 16, 16]) def __init__(self, **kwargs): @@ -839,9 +841,5 @@ def __init__(self, **kwargs): self.bind(on_release=self.open_link) fbind = self.fbind - def open_link(self, *args): webbrowser.open(self.helpPath) - - - diff --git a/carveracontroller/makera.kv b/carveracontroller/makera.kv index 8af9fb68..a74baccc 100644 --- a/carveracontroller/makera.kv +++ b/carveracontroller/makera.kv @@ -3770,7 +3770,7 @@ size: self.size radius: [dp(12),] GridLayout: - cols: 4 + cols: 3 rows: 1 spacing: '3dp' GridBoxLayout: @@ -3941,8 +3941,6 @@ text: tr._('Jog Mode:Step') height: '35dp' on_release: app.root.toggle_jog_mode() - GridBoxLayout: - size_hint_x: 0.15 GridBoxLayout: ToggleButton: id: kb_jog_btn @@ -3950,7 +3948,6 @@ height: '35dp' state: app.jog_keyboard_enable on_release: app.root.toggle_keyboard_jog_control() - GridBoxLayout: ToggleButton: id: pendant_jogging_en_btn @@ -3958,7 +3955,7 @@ state: app.jog_pendant_enable height: '35dp' on_release: app.root.toggle_pendant_jog_control() - + BoxLayout: disabled: not (app.state == 'Idle' or app.state == 'Run' or app.state == 'Pause') or (app.playing and app.state != 'Pause') or (app.state == 'Run' and root.allow_jogging_while_machine_running == '0') padding: '25dp' From 47519ac73784c89dcb754ce391374b36091fb5cd Mon Sep 17 00:00:00 2001 From: Serge Bakharev Date: Sun, 19 Jul 2026 18:37:45 +1000 Subject: [PATCH 4/4] fix spelling in changelog.md --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 062fe267..aef360f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,7 +22,7 @@ - Enhancement: Log connect and manual disconnect with the connection method and address - Enhancement: Add a "Network..." option under Scan Wi-Fi in the connection dropdown to enter a machine network address - Enhancement: Reconnect supports USB as well as WiFi. Configure preferred method for app-launch auto-connect -- Enhancement: added green question mark help buttons to the UI that link to the relavent documentation page +- Enhancement: added green question mark help buttons to the UI that link to the relevant documentation page - Fixed: Restore Keyboard Jogging state after Probing Popup is closed - Fixed: Repeated firmware checks now happen just once - Fixed: UI widget updates from the SerialMonitor() now dispatched via the main thread. This should reduce the number of RecycleView related crashes @@ -48,7 +48,7 @@ - Change: Resume playback will now use gcode loaded in the controller instead of cached local file - Change: Upgrade screen now will show the letter "c" at the end of the current firmware version if it's present. This indicates that it's Community firmware - Change: Auto-connect on app launch now is only performed if auto-reconnect is enabled -- Change: Reconnect uses the last successful connection method. On fresh app launch it uses the configured prefered connection method +- Change: Reconnect uses the last successful connection method. On fresh app launch it uses the configured preferred connection method - Change: USB devices in connection dropdown are filtered to only show devices specifically with the FTDI chip found on the Makera machines - Change: USB devices are now selected and stored by stable VID:PID:serial identity (instead of generic COM path)