From 5b9a35677ff2978830144ff7e8162e14c88f7e62 Mon Sep 17 00:00:00 2001 From: Alex Huttunen Date: Wed, 5 Mar 2025 12:03:19 -0800 Subject: [PATCH 1/2] update icons to FontAwesome 6 variants due to QtAwesome dropping support for FontAwesome 4 --- dronecan_gui_tool/main.py | 18 +++++------ dronecan_gui_tool/panels/RTK_panel.py | 2 +- dronecan_gui_tool/panels/RemoteID_panel.py | 2 +- dronecan_gui_tool/panels/actuator_panel.py | 8 ++--- dronecan_gui_tool/panels/esc_panel.py | 8 ++--- dronecan_gui_tool/panels/hobbywing_esc.py | 2 +- dronecan_gui_tool/panels/rc_panel.py | 2 +- dronecan_gui_tool/panels/serial_panel.py | 2 +- dronecan_gui_tool/panels/stats_panel.py | 2 +- dronecan_gui_tool/widgets/__init__.py | 32 +++++++++---------- dronecan_gui_tool/widgets/about_window.py | 2 +- .../widgets/bus_monitor/window.py | 4 +-- .../can_adapter_control_panel/slcan_cli.py | 20 ++++++------ .../widgets/dynamic_node_id_allocator.py | 4 +-- dronecan_gui_tool/widgets/file_server.py | 12 +++---- dronecan_gui_tool/widgets/local_node.py | 2 +- dronecan_gui_tool/widgets/node_properties.py | 20 ++++++------ .../widgets/plotter/plot_areas/xy.py | 2 +- .../widgets/plotter/plot_areas/yt.py | 4 +-- .../widgets/plotter/plot_container.py | 2 +- .../widgets/plotter/value_extractor_views.py | 12 +++---- dronecan_gui_tool/widgets/plotter/window.py | 6 ++-- dronecan_gui_tool/widgets/subscriber.py | 8 ++--- 23 files changed, 88 insertions(+), 88 deletions(-) diff --git a/dronecan_gui_tool/main.py b/dronecan_gui_tool/main.py index d0cc0ac..183b5cc 100644 --- a/dronecan_gui_tool/main.py +++ b/dronecan_gui_tool/main.py @@ -138,7 +138,7 @@ def __init__(self, node, iface_name, iface_kwargs): # # File menu # - quit_action = QAction(get_icon('sign-out'), '&Quit', self) + quit_action = QAction(get_icon('fa6s.right-from-bracket'), '&Quit', self) quit_action.setShortcut(QKeySequence('Ctrl+Shift+Q')) quit_action.triggered.connect(self.close) @@ -148,28 +148,28 @@ def __init__(self, node, iface_name, iface_kwargs): # # Tools menu # - show_bus_monitor_action = QAction(get_icon('bus'), '&Bus Monitor', self) + show_bus_monitor_action = QAction(get_icon('fa6s.bus'), '&Bus Monitor', self) show_bus_monitor_action.setShortcut(QKeySequence('Ctrl+Shift+B')) show_bus_monitor_action.setStatusTip('Open bus monitor window') show_bus_monitor_action.triggered.connect(self._bus_monitor_manager.spawn_monitor) - show_console_action = QAction(get_icon('terminal'), 'Interactive &Console', self) + show_console_action = QAction(get_icon('fa6s.terminal'), 'Interactive &Console', self) show_console_action.setShortcut(QKeySequence('Ctrl+Shift+T')) show_console_action.setStatusTip('Open interactive console window') show_console_action.triggered.connect(self._show_console_window) - new_subscriber_action = QAction(get_icon('newspaper-o'), '&Subscriber', self) + new_subscriber_action = QAction(get_icon('fa6.newspaper'), '&Subscriber', self) new_subscriber_action.setShortcut(QKeySequence('Ctrl+Shift+S')) new_subscriber_action.setStatusTip('Open subscription tool') new_subscriber_action.triggered.connect( lambda: SubscriberWindow.spawn(self, self._node, self._active_data_type_detector)) - new_plotter_action = QAction(get_icon('area-chart'), '&Plotter', self) + new_plotter_action = QAction(get_icon('fa6s.chart-area'), '&Plotter', self) new_plotter_action.setShortcut(QKeySequence('Ctrl+Shift+P')) new_plotter_action.setStatusTip('Open new graph plotter window') new_plotter_action.triggered.connect(self._plotter_manager.spawn_plotter) - show_can_adapter_controls_action = QAction(get_icon('plug'), 'CAN &Adapter Control Panel', self) + show_can_adapter_controls_action = QAction(get_icon('fa6s.plug'), 'CAN &Adapter Control Panel', self) show_can_adapter_controls_action.setShortcut(QKeySequence('Ctrl+Shift+A')) show_can_adapter_controls_action.setStatusTip('Open CAN adapter control panel (if supported by the adapter)') show_can_adapter_controls_action.triggered.connect(self._try_spawn_can_adapter_control_panel) @@ -199,14 +199,14 @@ def __init__(self, node, iface_name, iface_kwargs): # # Help menu # - dronecan_website_action = QAction(get_icon('globe'), 'Open DroneCAN &Website', self) + dronecan_website_action = QAction(get_icon('fa6s.globe'), 'Open DroneCAN &Website', self) dronecan_website_action.triggered.connect(lambda: QDesktopServices.openUrl(QUrl('http://dronecan.org'))) - show_log_directory_action = QAction(get_icon('pencil-square-o'), 'Open &Log Directory', self) + show_log_directory_action = QAction(get_icon('fa6.pen-to-square'), 'Open &Log Directory', self) show_log_directory_action.triggered.connect( lambda: QDesktopServices.openUrl(QUrl.fromLocalFile(os.path.dirname(log_file.name)))) - about_action = QAction(get_icon('info'), '&About', self) + about_action = QAction(get_icon('fa6s.info'), '&About', self) about_action.triggered.connect(lambda: AboutWindow(self).show()) help_menu = self.menuBar().addMenu('&Help') diff --git a/dronecan_gui_tool/panels/RTK_panel.py b/dronecan_gui_tool/panels/RTK_panel.py index 746f477..7e4aab9 100644 --- a/dronecan_gui_tool/panels/RTK_panel.py +++ b/dronecan_gui_tool/panels/RTK_panel.py @@ -200,4 +200,4 @@ def spawn(parent, node): return _singleton -get_icon = partial(get_icon, 'asterisk') +get_icon = partial(get_icon, 'fa6s.asterisk') diff --git a/dronecan_gui_tool/panels/RemoteID_panel.py b/dronecan_gui_tool/panels/RemoteID_panel.py index d691311..935eb5e 100644 --- a/dronecan_gui_tool/panels/RemoteID_panel.py +++ b/dronecan_gui_tool/panels/RemoteID_panel.py @@ -213,4 +213,4 @@ def spawn(parent, node): return _singleton -get_icon = partial(get_icon, 'asterisk') +get_icon = partial(get_icon, 'fa6s.asterisk') diff --git a/dronecan_gui_tool/panels/actuator_panel.py b/dronecan_gui_tool/panels/actuator_panel.py index a87d204..7265dd1 100644 --- a/dronecan_gui_tool/panels/actuator_panel.py +++ b/dronecan_gui_tool/panels/actuator_panel.py @@ -45,7 +45,7 @@ def __init__(self, parent): self._spinbox.setSingleStep(0.001) self._spinbox.valueChanged.connect(lambda: self._slider.setValue(self._spinbox.value()*1000.0)) - self._zero_button = make_icon_button('hand-stop-o', 'Zero setpoint', self, text = 'Zero', on_clicked=self.zero) + self._zero_button = make_icon_button('fa6.hand', 'Zero setpoint', self, text = 'Zero', on_clicked=self.zero) self._actuator_id = QSpinBox(self) self._actuator_id.setMinimum(0) @@ -109,10 +109,10 @@ def __init__(self, parent, node): self._bcast_interval.valueChanged.connect( lambda: self._bcast_timer.setInterval(self._bcast_interval.value() * 1e3)) - self._stop_all = make_icon_button('hand-stop-o', 'Zero all channels', self, text='Zero All', + self._stop_all = make_icon_button('fa6.hand', 'Zero all channels', self, text='Zero All', on_clicked=self._do_stop_all) - self._pause = make_icon_button('pause', 'Pause publishing', self, checkable=True, text='Pause') + self._pause = make_icon_button('fa6s.pause', 'Pause publishing', self, checkable=True, text='Pause') self._msg_viewer = QPlainTextEdit(self) self._msg_viewer.setReadOnly(True) @@ -219,4 +219,4 @@ def spawn(parent, node): return _singleton -get_icon = partial(get_icon, 'asterisk') +get_icon = partial(get_icon, 'fa6s.asterisk') diff --git a/dronecan_gui_tool/panels/esc_panel.py b/dronecan_gui_tool/panels/esc_panel.py index b6f6bce..4cec913 100644 --- a/dronecan_gui_tool/panels/esc_panel.py +++ b/dronecan_gui_tool/panels/esc_panel.py @@ -47,7 +47,7 @@ def __init__(self, esc_index, parent): self._spinbox.setValue(0) self._spinbox.valueChanged.connect(lambda: self._slider.setValue(self._spinbox.value())) - self._zero_button = make_icon_button('hand-stop-o', 'Zero setpoint', self, on_clicked=self.zero) + self._zero_button = make_icon_button('fa6.hand', 'Zero setpoint', self, on_clicked=self.zero) self._index_label = QLabel(f'Index: {self._index}', self) self._error_count_label = QLabel('Err: NC', self) @@ -149,10 +149,10 @@ def __init__(self, parent, node): self._bcast_rate.valueChanged.connect( lambda: self._bcast_timer.setInterval(int(1e3 / self._bcast_rate.value()))) - self._stop_all = make_icon_button('hand-stop-o', 'Zero all channels', self, text='Stop All', + self._stop_all = make_icon_button('fa6.hand', 'Zero all channels', self, text='Stop All', on_clicked=self._do_stop_all) - self._pause = make_icon_button('pause', 'Pause publishing', self, checkable=True, text='Pause') + self._pause = make_icon_button('fa6s.pause', 'Pause publishing', self, checkable=True, text='Pause') self._msg_viewer = QPlainTextEdit(self) self._msg_viewer.setReadOnly(True) @@ -371,4 +371,4 @@ def spawn(parent, node): return _singleton -get_icon = partial(get_icon, 'asterisk') +get_icon = partial(get_icon, 'fa6s.asterisk') diff --git a/dronecan_gui_tool/panels/hobbywing_esc.py b/dronecan_gui_tool/panels/hobbywing_esc.py index e798f47..c51ef97 100644 --- a/dronecan_gui_tool/panels/hobbywing_esc.py +++ b/dronecan_gui_tool/panels/hobbywing_esc.py @@ -317,4 +317,4 @@ def spawn(parent, node): return _singleton -get_icon = partial(get_icon, 'asterisk') +get_icon = partial(get_icon, 'fa6s.asterisk') diff --git a/dronecan_gui_tool/panels/rc_panel.py b/dronecan_gui_tool/panels/rc_panel.py index ab91ad1..91f878a 100644 --- a/dronecan_gui_tool/panels/rc_panel.py +++ b/dronecan_gui_tool/panels/rc_panel.py @@ -380,4 +380,4 @@ def spawn(parent, node): return _singleton -get_icon = partial(get_icon, 'asterisk') \ No newline at end of file +get_icon = partial(get_icon, 'fa6s.asterisk') \ No newline at end of file diff --git a/dronecan_gui_tool/panels/serial_panel.py b/dronecan_gui_tool/panels/serial_panel.py index dd19408..bf9c108 100644 --- a/dronecan_gui_tool/panels/serial_panel.py +++ b/dronecan_gui_tool/panels/serial_panel.py @@ -647,4 +647,4 @@ def spawn(parent, node): return _singleton -get_icon = partial(get_icon, 'asterisk') +get_icon = partial(get_icon, 'fa6s.asterisk') diff --git a/dronecan_gui_tool/panels/stats_panel.py b/dronecan_gui_tool/panels/stats_panel.py index 440691d..587e302 100644 --- a/dronecan_gui_tool/panels/stats_panel.py +++ b/dronecan_gui_tool/panels/stats_panel.py @@ -148,4 +148,4 @@ def spawn(parent, node): return _singleton -get_icon = partial(get_icon, 'asterisk') +get_icon = partial(get_icon, 'fa6s.asterisk') diff --git a/dronecan_gui_tool/widgets/__init__.py b/dronecan_gui_tool/widgets/__init__.py index f53fdda..d93bcd9 100644 --- a/dronecan_gui_tool/widgets/__init__.py +++ b/dronecan_gui_tool/widgets/__init__.py @@ -279,22 +279,22 @@ def __init__(self, parent): self._default_search_direction = 'down' self.show_search_bar_button = \ - make_icon_button('search', 'Show search bar', self, checkable=True, + make_icon_button('fa6s.magnifying-glass', 'Show search bar', self, checkable=True, on_clicked=lambda: self.setVisible(self.show_search_bar_button.isChecked())) self._bar = SearchBarComboBox(self) self._bar.on_commit = lambda: self._do_search(self._default_search_direction) - self._use_regex = make_icon_button('code', 'Search using regular expressions', self, + self._use_regex = make_icon_button('fa6s.code', 'Search using regular expressions', self, checkable=True) - self._case_sensitive = make_icon_button('text-height', 'Search query is case sensitive', self, + self._case_sensitive = make_icon_button('fa6s.text-height', 'Search query is case sensitive', self, checkable=True) - self._button_search_down = make_icon_button('caret-down', 'Search down', self, + self._button_search_down = make_icon_button('fa6s.caret-down', 'Search down', self, on_clicked=partial(self._do_search, 'down')) - self._button_search_up = make_icon_button('caret-up', 'Search up', self, + self._button_search_up = make_icon_button('fa6s.caret-up', 'Search up', self, on_clicked=partial(self._do_search, 'up')) self.on_search = lambda *_: None @@ -348,23 +348,23 @@ def __init__(self, parent, pattern_completion_model): self.on_commit = lambda: None self.on_remove = lambda _: None - self._remove_button = make_icon_button('remove', 'Remove this filter', self, + self._remove_button = make_icon_button('fa6s.filter-circle-xmark', 'Remove this filter', self, on_clicked=lambda: self.on_remove(self)) self._bar = SearchBarComboBox(self, pattern_completion_model) self._bar.on_commit = self._on_commit self._bar.setFocus(Qt.OtherFocusReason) - self._apply_button = make_icon_button('check', 'Apply this filter expression [Enter]', self, + self._apply_button = make_icon_button('fa6s.check', 'Apply this filter expression [Enter]', self, on_clicked=self._on_commit) - self._inverse_button = make_icon_button('random', 'Negate filter', self, checkable=True, + self._inverse_button = make_icon_button('fa6s.shuffle', 'Negate filter', self, checkable=True, on_clicked=self._on_commit) - self._regex_button = make_icon_button('code', 'Use regular expressions', self, checkable=True, + self._regex_button = make_icon_button('fa6s.code', 'Use regular expressions', self, checkable=True, checked=True, on_clicked=self._on_commit) - self._case_sensitive_button = make_icon_button('text-height', 'Filter expression is case sensitive', self, + self._case_sensitive_button = make_icon_button('fa6s.text-height', 'Filter expression is case sensitive', self, checkable=True, on_clicked=self._on_commit) layout = QHBoxLayout(self) @@ -396,7 +396,7 @@ def make_matcher(self): def __init__(self, parent): super(FilterBar, self).__init__(parent) - self.add_filter_button = make_icon_button('filter', 'Add filter', self, on_clicked=self._on_add_filter) + self.add_filter_button = make_icon_button('fa6s.filter', 'Add filter', self, on_clicked=self._on_add_filter) self.on_filter = lambda *_: None @@ -465,12 +465,12 @@ def __init__(self, parent, started_by_default=False, pre_redraw_hook=None, **tab self._table = BasicTable(self, **table_options) self._table.selectionModel().selectionChanged.connect(self._call_on_selection_changed) - self._clear_button = make_icon_button('trash-o', 'Clear', self, on_clicked=self._clear) + self._clear_button = make_icon_button('fa6s.trash', 'Clear', self, on_clicked=self._clear) - self._pause = make_icon_button('pause', 'Pause updates; data received while paused will not be lost', self, + self._pause = make_icon_button('fa6s.pause', 'Pause updates; data received while paused will not be lost', self, checkable=True) - self._start_button = make_icon_button('video-camera', 'Start/stop capturing', self, + self._start_button = make_icon_button('fa6s.video', 'Start/stop capturing', self, checkable=True, checked=started_by_default, on_clicked=self._on_start_button_clicked) @@ -481,7 +481,7 @@ def __init__(self, parent, started_by_default=False, pre_redraw_hook=None, **tab self._filter_bar = FilterBar(self) self._filter_bar.on_filter = self._table.set_filter - self._row_count = LabelWithIcon(get_icon('list'), '0', self) + self._row_count = LabelWithIcon(get_icon('fa6s.list'), '0', self) self._row_count.setToolTip('Row count') self._redraw_timer = QTimer(self) @@ -588,7 +588,7 @@ def custom_area_layout(self): def get_icon(name): - return qtawesome.icon('fa.' + name) + return qtawesome.icon(name) def make_icon_button(icon_name, tool_tip, parent, checkable=False, checked=False, on_clicked=None, text=''): diff --git a/dronecan_gui_tool/widgets/about_window.py b/dronecan_gui_tool/widgets/about_window.py index 105ea77..1a3b065 100644 --- a/dronecan_gui_tool/widgets/about_window.py +++ b/dronecan_gui_tool/widgets/about_window.py @@ -104,7 +104,7 @@ def __init__(self, parent): # # Window layout # - self._exit_button = QPushButton(get_icon('check'), 'OK', self) + self._exit_button = QPushButton(get_icon('fa6s.check'), 'OK', self) self._exit_button.clicked.connect(self.close) layout = QVBoxLayout(self) diff --git a/dronecan_gui_tool/widgets/bus_monitor/window.py b/dronecan_gui_tool/widgets/bus_monitor/window.py index 6bf7727..8e11366 100644 --- a/dronecan_gui_tool/widgets/bus_monitor/window.py +++ b/dronecan_gui_tool/widgets/bus_monitor/window.py @@ -279,7 +279,7 @@ def flip_row_mark(row, col): if col == 0: item = self._log_widget.table.item(row, col) if item.icon().isNull(): - item.setIcon(get_icon('circle')) + item.setIcon(get_icon('fa6s.circle')) flash(self, 'Row %d was marked, click again to unmark', row, duration=3) else: item.setIcon(QIcon()) @@ -421,7 +421,7 @@ def _context_menu_requested(self, pos): row_index = self._log_widget.table.rowAt(pos.y()) if row_index >= 0: - action_show_definition = QAction(get_icon('file-code-o'), 'Open data type &definition', self) + action_show_definition = QAction(get_icon('fa6.file-code'), 'Open data type &definition', self) action_show_definition.triggered.connect(lambda: self._show_data_type_definition(row_index)) menu.addAction(action_show_definition) menu.popup(self._log_widget.table.mapToGlobal(pos)) diff --git a/dronecan_gui_tool/widgets/can_adapter_control_panel/slcan_cli.py b/dronecan_gui_tool/widgets/can_adapter_control_panel/slcan_cli.py index b0de225..cff1817 100644 --- a/dronecan_gui_tool/widgets/can_adapter_control_panel/slcan_cli.py +++ b/dronecan_gui_tool/widgets/can_adapter_control_panel/slcan_cli.py @@ -59,7 +59,7 @@ def __init__(self, parent, cli_iface): self._table = StateTable(self) - self._reload_button = make_icon_button('refresh', 'Reload state information from the adapter', self, + self._reload_button = make_icon_button('fa6s.arrows-rotate', 'Reload state information from the adapter', self, on_clicked=self._do_reload, text='Reload') self._auto_reload_checkbox = QCheckBox('Auto reload every [sec]:', self) @@ -223,10 +223,10 @@ def __init__(self, parent, model, cli_iface, store_callback): else: raise ValueError('Unsupported value type %r' % model.type) - self._ok_button = make_icon_button('check', 'Send changes to the device', self, + self._ok_button = make_icon_button('fa6s.check', 'Send changes to the device', self, text='OK', on_clicked=self._do_ok) - self._cancel_button = make_icon_button('remove', 'Discard changes and close this window', self, + self._cancel_button = make_icon_button('fa6s.xmark', 'Discard changes and close this window', self, text='Cancel', on_clicked=self.close) layout = QVBoxLayout(self) @@ -281,15 +281,15 @@ def __init__(self, parent, cli_iface): self._have_unsaved_changes = False - self._fetch_button = make_icon_button('refresh', + self._fetch_button = make_icon_button('fa6s.arrows-roatate', 'Fetch configuration from the adapter', self, on_clicked=self._do_fetch, text='Fetch') - self._store_button = make_icon_button('database', + self._store_button = make_icon_button('fa6s.database', 'Store the current configuration into non-volatile memory on the adapter', self, on_clicked=self._do_store, text='Store') - self._erase_button = make_icon_button('eraser', + self._erase_button = make_icon_button('fa6s.eraser', 'Erase configuration from the non-volatile memory', self, on_clicked=self._do_erase, text='Erase') @@ -389,7 +389,7 @@ def __init__(self, parent, cli_iface): self._command_line.setCompleter(self._command_line_completer) - self._execute_button = make_icon_button('flash', 'Execute command', self, on_clicked=self._do_execute) + self._execute_button = make_icon_button('fa6s.bolt', 'Execute command', self, on_clicked=self._do_execute) self._response_box = QPlainTextEdit(self) self._response_box.setToolTip('Command output will be printed here') @@ -448,9 +448,9 @@ def __init__(self, parent, cli_iface, iface_name): self._cli_widget = CLIWidget(self, self._cli_iface) self._tab_widget = QTabWidget(self) - self._tab_widget.addTab(self._state_widget, get_icon('dashboard'), 'Adapter State') - self._tab_widget.addTab(self._config_widget, get_icon('wrench'), 'Configuration') - self._tab_widget.addTab(self._cli_widget, get_icon('terminal'), 'Command Line') + self._tab_widget.addTab(self._state_widget, get_icon('fa6s.gauge-high'), 'Adapter State') + self._tab_widget.addTab(self._config_widget, get_icon('fa6s.wrench'), 'Configuration') + self._tab_widget.addTab(self._cli_widget, get_icon('fa6s.terminal'), 'Command Line') self._status_bar = QStatusBar(self) self._status_bar.setSizeGripEnabled(False) diff --git a/dronecan_gui_tool/widgets/dynamic_node_id_allocator.py b/dronecan_gui_tool/widgets/dynamic_node_id_allocator.py index 025d0f2..92fba2a 100644 --- a/dronecan_gui_tool/widgets/dynamic_node_id_allocator.py +++ b/dronecan_gui_tool/widgets/dynamic_node_id_allocator.py @@ -47,7 +47,7 @@ def __init__(self, parent, node, node_monitor): self._allocation_table_update_timer.start(500) self._allocation_table_update_timer.timeout.connect(self._update_table) - self._start_stop_button = make_icon_button('rocket', 'Launch/stop the dynamic node ID allocation server', self, + self._start_stop_button = make_icon_button('fa6s.rocket', 'Launch/stop the dynamic node ID allocation server', self, checkable=True) self._start_stop_button.clicked.connect(self._on_start_stop_button) @@ -58,7 +58,7 @@ def __init__(self, parent, node, node_monitor): self._database_file.addItem(self._database_file.currentText()) self._database_file.on_commit = self._on_start_stop_button - self._select_database_file = make_icon_button('folder-open-o', 'Open allocation table file', self, + self._select_database_file = make_icon_button('fa6.folder-open', 'Open allocation table file', self, on_clicked=self._on_select_database_file) db_file_completer = QCompleter() diff --git a/dronecan_gui_tool/widgets/file_server.py b/dronecan_gui_tool/widgets/file_server.py index 73c31a0..cd133c7 100644 --- a/dronecan_gui_tool/widgets/file_server.py +++ b/dronecan_gui_tool/widgets/file_server.py @@ -38,7 +38,7 @@ def __init__(self, parent, default=None): self.on_remove = lambda _: None self.on_path_changed = lambda *_: None - self._remove_button = make_icon_button('remove', 'Remove this path', self, + self._remove_button = make_icon_button('fa6s.xmark', 'Remove this path', self, on_clicked=lambda: self.on_remove(self)) completer = QCompleter(self) @@ -52,13 +52,13 @@ def __init__(self, parent, default=None): self._path_bar.setToolTip('Lookup path for file services; should point either to a file or to a directory') self._path_bar.currentTextChanged.connect(self._on_path_changed) - self._select_file_button = make_icon_button('file-o', 'Specify file path', self, + self._select_file_button = make_icon_button('fa6.file', 'Specify file path', self, on_clicked=self._on_select_path_file) - self._select_dir_button = make_icon_button('folder-open-o', 'Specify directory path', self, + self._select_dir_button = make_icon_button('fa6.folder-open', 'Specify directory path', self, on_clicked=self._on_select_path_directory) - self._hit_count_label = LabelWithIcon(get_icon('upload'), '0', self) + self._hit_count_label = LabelWithIcon(get_icon('fa6s.upload'), '0', self) self._hit_count_label.setToolTip('Hit count') layout = QHBoxLayout(self) @@ -181,7 +181,7 @@ def __init__(self, parent, node): self._path_widgets = [] - self._start_button = make_icon_button('rocket', 'Launch/stop the file server', self, + self._start_button = make_icon_button('fa6s.rocket', 'Launch/stop the file server', self, checkable=True, on_clicked=self._on_start_stop) self._start_button.setEnabled(False) @@ -192,7 +192,7 @@ def __init__(self, parent, node): self._tmr.start(500) self._add_path_button = \ - make_icon_button('plus', 'Add lookup path (lookup paths can be modified while the server is running)', + make_icon_button('fa6s.plus', 'Add lookup path (lookup paths can be modified while the server is running)', self, on_clicked=self._on_add_path) layout = QVBoxLayout(self) diff --git a/dronecan_gui_tool/widgets/local_node.py b/dronecan_gui_tool/widgets/local_node.py index 6568cae..b3857e8 100644 --- a/dronecan_gui_tool/widgets/local_node.py +++ b/dronecan_gui_tool/widgets/local_node.py @@ -56,7 +56,7 @@ def __init__(self, parent, node): self._node_id_spinbox.setValue(NODE_ID_MAX) self._node_id_spinbox.valueChanged.connect(self._update) - self._node_id_apply = make_icon_button('check', 'Apply local node ID', self, + self._node_id_apply = make_icon_button('fa6s.check', 'Apply local node ID', self, on_clicked=self._on_node_id_apply_clicked) self._update_timer = QTimer(self) diff --git a/dronecan_gui_tool/widgets/node_properties.py b/dronecan_gui_tool/widgets/node_properties.py index 31cf4c9..6fa8d0e 100644 --- a/dronecan_gui_tool/widgets/node_properties.py +++ b/dronecan_gui_tool/widgets/node_properties.py @@ -175,15 +175,15 @@ def __init__(self, parent, node, target_node_id, file_server_widget, dynamic_nod self._file_server_widget = file_server_widget self._dynamic_node_id_allocator_widget = dynamic_node_id_allocator_widget - self._restart_button = make_icon_button('power-off', 'Restart the node [dronecan.uavcan.protocol.RestartNode]', self, + self._restart_button = make_icon_button('fa6s.power-off', 'Restart the node [dronecan.uavcan.protocol.RestartNode]', self, text='Restart', on_clicked=self._do_restart) - self._transport_stats_button = make_icon_button('truck', + self._transport_stats_button = make_icon_button('fa6s.truck', 'Request transport stats [dronecan.uavcan.protocol.GetTransportStats]', self, text='Get Transport Stats', on_clicked=self._do_get_transport_stats) - self._update_button = make_icon_button('bug', + self._update_button = make_icon_button('fa6s.bug', 'Request firmware update [dronecan.uavcan.protocol.file.BeginFirmwareUpdate]', self, text='Update Firmware', on_clicked=self._do_firmware_update) @@ -449,13 +449,13 @@ def add_const_field(label, *values): layout.addWidget(QLabel('Melody', self), layout.rowCount(), 0) layout.addWidget(self._value_widget, layout.rowCount() - 1, 1) - fetch_button = make_icon_button('refresh', 'Read parameter from the node', self, text='Fetch', + fetch_button = make_icon_button('fa6s.arrows-rotate', 'Read parameter from the node', self, text='Fetch', on_clicked=self._do_fetch) - set_default_button = make_icon_button('fire-extinguisher', 'Restore default value', self, text='Restore', + set_default_button = make_icon_button('fa6s.fire-extinguisher', 'Restore default value', self, text='Restore', on_clicked=self._restore_default) - send_button = make_icon_button('flash', 'Send parameter to the node', self, text='Send', + send_button = make_icon_button('fa6s.bolt', 'Send parameter to the node', self, text='Send', on_clicked=self._do_send) - cancel_button = make_icon_button('remove', 'Close this window; unsent changes will be lost', self, + cancel_button = make_icon_button('fa6s.xmark', 'Close this window; unsent changes will be lost', self, text='Cancel', on_clicked=self.close) controls_layout = QGridLayout(self) @@ -580,17 +580,17 @@ def __init__(self, parent, node, target_node_id): self._target_node_id = target_node_id self._retries = 0 - self._read_all_button = make_icon_button('refresh', 'Fetch all config parameters from the node', self, + self._read_all_button = make_icon_button('fa6s.arrows-rotate', 'Fetch all config parameters from the node', self, text='Fetch All', on_clicked=self._do_reload) opcodes = dronecan.uavcan.protocol.param.ExecuteOpcode.Request() self._save_button = \ - make_icon_button('database', 'Commit configuration to the non-volatile storage [OPCODE_SAVE]', self, + make_icon_button('fa6s.database', 'Commit configuration to the non-volatile storage [OPCODE_SAVE]', self, text='Store All', on_clicked=partial(self._do_execute_opcode, opcodes.OPCODE_SAVE)) self._erase_button = \ - make_icon_button('eraser', 'Clear the non-volatile configuration storage [OPCODE_ERASE]', self, + make_icon_button('fa6s.eraser', 'Clear the non-volatile configuration storage [OPCODE_ERASE]', self, text='Erase All', on_clicked=partial(self._do_execute_opcode, opcodes.OPCODE_ERASE)) self._save_to_file = make_icon_button('', diff --git a/dronecan_gui_tool/widgets/plotter/plot_areas/xy.py b/dronecan_gui_tool/widgets/plotter/plot_areas/xy.py index 1e85fc9..931cb34 100644 --- a/dronecan_gui_tool/widgets/plotter/plot_areas/xy.py +++ b/dronecan_gui_tool/widgets/plotter/plot_areas/xy.py @@ -68,7 +68,7 @@ def __init__(self, parent, display_measurements): self._extractor_associations = {} # Extractor : plot - self._clear_button = make_icon_button('eraser', 'Clear all plots', self, on_clicked=self.reset) + self._clear_button = make_icon_button('fa6s.eraser', 'Clear all plots', self, on_clicked=self.reset) self._max_data_points = 100000 diff --git a/dronecan_gui_tool/widgets/plotter/plot_areas/yt.py b/dronecan_gui_tool/widgets/plotter/plot_areas/yt.py index aa136cf..43e280d 100644 --- a/dronecan_gui_tool/widgets/plotter/plot_areas/yt.py +++ b/dronecan_gui_tool/widgets/plotter/plot_areas/yt.py @@ -58,11 +58,11 @@ def __init__(self, parent, display_measurements): self._extractor_associations = {} # Extractor : plots self._max_x = 0 - self._autoscroll_checkbox = make_icon_button('angle-double-right', + self._autoscroll_checkbox = make_icon_button('fa6s.angles-right', 'Scroll the plot automatically as new data arrives', self, checkable=True, checked=True) - self._clear_button = make_icon_button('eraser', 'Clear all curves', self, on_clicked=self._do_clear) + self._clear_button = make_icon_button('fa6s.eraser', 'Clear all curves', self, on_clicked=self._do_clear) self._plot = PlotWidget(self, background=QColor(Qt.black)) self._plot.showButtons() diff --git a/dronecan_gui_tool/widgets/plotter/plot_container.py b/dronecan_gui_tool/widgets/plotter/plot_container.py index a6a32c2..1b2f208 100644 --- a/dronecan_gui_tool/widgets/plotter/plot_container.py +++ b/dronecan_gui_tool/widgets/plotter/plot_container.py @@ -31,7 +31,7 @@ def __init__(self, parent, plot_area_class, active_data_types): self._active_data_types = active_data_types self._extractors = [] - self._new_extractor_button = make_icon_button('plus', 'Add new value extractor', self, + self._new_extractor_button = make_icon_button('fa6s.plus', 'Add new value extractor', self, on_clicked=self._do_new_extractor) self._how_to_label = QLabel('\u27F5 Click to configure plotting', self) diff --git a/dronecan_gui_tool/widgets/plotter/value_extractor_views.py b/dronecan_gui_tool/widgets/plotter/value_extractor_views.py index a27a6e0..4a554f9 100644 --- a/dronecan_gui_tool/widgets/plotter/value_extractor_views.py +++ b/dronecan_gui_tool/widgets/plotter/value_extractor_views.py @@ -119,7 +119,7 @@ def __init__(self, parent, active_data_types): self._type_selector.setFocus(Qt.OtherFocusReason) self._type_selector.currentTextChanged.connect(self._on_type_changed) - self._show_all_types_button = make_icon_button('puzzle-piece', + self._show_all_types_button = make_icon_button('fa6s.puzzle-piece', 'Show all known message types, not only those that are ' 'currently being exchanged over the bus', self, checkable=True, on_clicked=self._update_data_type_list) @@ -147,13 +147,13 @@ def __init__(self, parent, active_data_types): # Visualization options self._selected_color = self.default_color_rotator.get() - self._select_color_button = make_icon_button('paint-brush', 'Select line color', self, + self._select_color_button = make_icon_button('fa6s.paintbrush', 'Select line color', self, on_clicked=self._select_color) self._select_color_button.setFlat(True) _set_color(self._select_color_button, QPalette.Button, self._selected_color) # Buttons - self._ok_button = make_icon_button('check', 'Create new extractor with these settings', self, + self._ok_button = make_icon_button('fa6s.check', 'Create new extractor with these settings', self, text='OK', on_clicked=self._on_ok) # Layout @@ -302,9 +302,9 @@ def __init__(self, parent, model): self._update_timer.timeout.connect(self._update) self._update_timer.start(200) - self._delete_button = make_icon_button('trash-o', 'Remove this extractor', self, on_clicked=self._do_remove) + self._delete_button = make_icon_button('fa6.trash', 'Remove this extractor', self, on_clicked=self._do_remove) - self._color_button = make_icon_button('paint-brush', 'Change plot color', self, on_clicked=self._change_color) + self._color_button = make_icon_button('fa6s.paintbrush', 'Change plot color', self, on_clicked=self._change_color) self._color_button.setFlat(True) _set_color(self._color_button, QPalette.Button, model.color) @@ -316,7 +316,7 @@ def __init__(self, parent, model): self._extraction_expression_box.setCompleter( _make_expression_completer(self._extraction_expression_box, model.data_type_name)) - self._error_label = make_icon_button('warning', 'Extraction error count; click to reset', self, + self._error_label = make_icon_button('fa6s.triangle-exclamation', 'Extraction error count; click to reset', self, on_clicked=self._reset_errors) self._reset_errors() diff --git a/dronecan_gui_tool/widgets/plotter/window.py b/dronecan_gui_tool/widgets/plotter/window.py index c3e9d31..420f7cc 100644 --- a/dronecan_gui_tool/widgets/plotter/window.py +++ b/dronecan_gui_tool/widgets/plotter/window.py @@ -44,14 +44,14 @@ def __init__(self, get_transfer_callback): # control_menu = self.menuBar().addMenu('&Control') - self._stop_action = QAction(get_icon('stop'), '&Stop Updates', self) + self._stop_action = QAction(get_icon('fa6s.stop'), '&Stop Updates', self) self._stop_action.setStatusTip('While stopped, all new data will be discarded') self._stop_action.setShortcut(QKeySequence('Ctrl+Shift+S')) self._stop_action.setCheckable(True) self._stop_action.toggled.connect(self._on_stop_toggled) control_menu.addAction(self._stop_action) - self._pause_action = QAction(get_icon('pause'), '&Pause Updates', self) + self._pause_action = QAction(get_icon('fa6s.pause'), '&Pause Updates', self) self._pause_action.setStatusTip('While paused, new data will be accumulated in memory ' 'to be processed once un-paused') self._pause_action.setShortcut(QKeySequence('Ctrl+Shift+P')) @@ -61,7 +61,7 @@ def __init__(self, get_transfer_callback): control_menu.addSeparator() - self._reset_time_action = QAction(get_icon('history'), '&Reset', self) + self._reset_time_action = QAction(get_icon('fa6s.clock-rotate-left'), '&Reset', self) self._reset_time_action.setStatusTip('Base time will be reset; all plots will be reset') self._reset_time_action.setShortcut(QKeySequence('Ctrl+Shift+R')) self._reset_time_action.triggered.connect(self._do_reset) diff --git a/dronecan_gui_tool/widgets/subscriber.py b/dronecan_gui_tool/widgets/subscriber.py index e32d2aa..25fc1ae 100644 --- a/dronecan_gui_tool/widgets/subscriber.py +++ b/dronecan_gui_tool/widgets/subscriber.py @@ -136,14 +136,14 @@ def __init__(self, parent, node, active_data_type_detector): self._filter_bar = FilterBar(self) self._filter_bar.on_filter = self._install_filter - self._start_stop_button = make_icon_button('video-camera', 'Begin subscription', self, checkable=True, + self._start_stop_button = make_icon_button('fa6s.video', 'Begin subscription', self, checkable=True, on_clicked=self._toggle_start_stop) - self._pause_button = make_icon_button('pause', 'Pause updates, non-displayed messages will be queued in memory', + self._pause_button = make_icon_button('fa6s.pause', 'Pause updates, non-displayed messages will be queued in memory', self, checkable=True) - self._clear_button = make_icon_button('trash-o', 'Clear output and reset stat counters', self, + self._clear_button = make_icon_button('fa6.trash', 'Clear output and reset stat counters', self, on_clicked=self._do_clear) - self._show_all_message_types = make_icon_button('puzzle-piece', + self._show_all_message_types = make_icon_button('fa6.puzzle-piece', 'Show all known message types, not only those that are ' 'currently being exchanged over the bus', self, checkable=True, on_clicked=self._update_data_type_list) From 96dbf709bcc83b50eeeff2d456d022d834cbcba5 Mon Sep 17 00:00:00 2001 From: Alex Huttunen Date: Wed, 5 Mar 2025 12:05:05 -0800 Subject: [PATCH 2/2] bump qtawesome min version to 1.4.0 to ensure FontAwesome 6 support --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 45cd4f6..dea9620 100755 --- a/setup.py +++ b/setup.py @@ -43,7 +43,7 @@ 'dronecan>=1.0.25', 'pyserial>=3.0', 'pymavlink>=2.4.26', - 'qtawesome>=0.3.1', + 'qtawesome>=1.4.0', 'qtconsole>=4.2.0', 'pyyaml>=5.1', 'easywebdav>=1.2',