- trying to solve an idiosyncrasy of MacOS which do not allow modifying the main menu in a non-main thread which is done after editing an object

This commit is contained in:
Marius Stanciu
2023-11-14 21:49:17 +02:00
parent a7c909273b
commit 4458249ee5
13 changed files with 100 additions and 95 deletions

View File

@@ -9,7 +9,7 @@
from PyQt6 import QtGui, QtWidgets
from PyQt6.QtCore import QSettings, pyqtSlot
from PyQt6.QtCore import Qt, pyqtSignal
from PyQt6.QtCore import Qt, pyqtSignal, QMetaObject
from PyQt6.QtGui import QAction, QTextCursor
import os.path
@@ -276,6 +276,8 @@ class App(QtCore.QObject):
restore_project = pyqtSignal(object, str, bool, bool, bool, bool)
# used when loading a project and restoring objects
restore_project_objects_sig = pyqtSignal(object, str, bool, bool)
# post-Edit actions
post_edit_sig = pyqtSignal()
def __init__(self, qapp, user_defaults=True):
"""
@@ -1199,6 +1201,9 @@ class App(QtCore.QObject):
# when the options dictionary values change
self.options.set_change_callback(callback=self.on_options_value_changed)
# post_edit signal
self.post_edit_sig.connect(self.on_editing_final_action, type=Qt.ConnectionType.QueuedConnection)
# ###########################################################################################################
# ########################################## Standard signals ###############################################
# ###########################################################################################################
@@ -1892,8 +1897,8 @@ class App(QtCore.QObject):
def connect_editmenu_signals(self):
self.ui.menufile_exit.triggered.connect(self.final_save)
self.ui.menueditedit.triggered.connect(lambda: self.object2editor())
self.ui.menueditok.triggered.connect(lambda: self.editor2object())
self.ui.menueditedit.triggered.connect(lambda: self.on_editing_start())
self.ui.menueditok.triggered.connect(lambda: self.on_editing_finished())
self.ui.menuedit_join2geo.triggered.connect(self.on_edit_join)
self.ui.menuedit_join_exc2exc.triggered.connect(self.on_edit_join_exc)
@@ -1981,7 +1986,7 @@ class App(QtCore.QObject):
self.ui.menuprojectviewsource.triggered.connect(self.on_view_source)
self.ui.menuprojectcopy.triggered.connect(self.on_copy_command)
self.ui.menuprojectedit.triggered.connect(self.object2editor)
self.ui.menuprojectedit.triggered.connect(self.on_editing_start)
self.ui.menuprojectdelete.triggered.connect(self.on_delete)
self.ui.menuprojectsave.triggered.connect(self.on_project_context_save)
@@ -2012,8 +2017,8 @@ class App(QtCore.QObject):
self.ui.popmenu_copy.triggered.connect(self.on_copy_command)
self.ui.popmenu_delete.triggered.connect(self.on_delete)
self.ui.popmenu_edit.triggered.connect(self.object2editor)
self.ui.popmenu_save.triggered.connect(lambda: self.editor2object())
self.ui.popmenu_edit.triggered.connect(self.on_editing_start)
self.ui.popmenu_save.triggered.connect(lambda: self.on_editing_finished())
self.ui.popmenu_numeric_move.triggered.connect(lambda: self.on_numeric_move())
self.ui.popmenu_move.triggered.connect(self.obj_move)
self.ui.popmenu_move2origin.triggered.connect(self.on_move2origin)
@@ -2094,8 +2099,8 @@ class App(QtCore.QObject):
self.ui.zoom_out_btn.triggered.connect(lambda: self.plotcanvas.zoom(1.5))
# Edit Toolbar Signals
self.ui.editor_start_btn.triggered.connect(self.object2editor)
self.ui.editor_exit_btn.clicked.connect(lambda: self.editor2object(force_cancel=True))
self.ui.editor_start_btn.triggered.connect(self.on_editing_start)
self.ui.editor_exit_btn.clicked.connect(lambda: self.on_editing_finished(force_cancel=True))
self.ui.copy_btn.triggered.connect(self.on_copy_command)
self.ui.delete_btn.triggered.connect(self.on_delete)
@@ -2284,13 +2289,13 @@ class App(QtCore.QObject):
self.ui.snap_max_dist_entry.setText(str(self.options["global_snap_max"]))
self.ui.grid_gap_link_cb.setChecked(True)
def object2editor(self):
def on_editing_start(self):
"""
Send the current Geometry, Gerber, Excellon object or CNCJob (if any) its editor.
Send the current Geometry, Gerber, "Excellon" object or CNCJob (if any) its editor.
:return: None
"""
self.defaults.report_usage("object2editor()")
self.defaults.report_usage("on_editing_start()")
edited_object = self.collection.get_active()
if edited_object is None:
@@ -2435,17 +2440,17 @@ class App(QtCore.QObject):
self.should_we_save = True
def editor2object(self, cleanup=None, force_cancel=None):
def on_editing_finished(self, cleanup=None, force_cancel=None):
"""
Transfers the Geometry or Excellon from its editor to the current object.
Transfers the Geometry or an "Excellon", from its editor to the current object.
:param cleanup: if True then we closed the app when the editor was open, so we close first the editor
:param force_cancel: if True always add Cancel button
:return: None
"""
self.defaults.report_usage("editor2object()")
self.defaults.report_usage("on_editing_finished()")
# do not update a Geometry/Excellon/Gerber/GCode object unless it comes out of an editor
# do not update a Geometry/"Excellon"/Gerber/GCode object unless it comes out of an editor
if self.call_source == 'app':
return
@@ -2516,7 +2521,7 @@ class App(QtCore.QObject):
edited_obj.obj_options['ymax'] = ymax
except (AttributeError, ValueError) as e:
self.inform.emit('[WARNING] %s' % _("Object empty after edit."))
self.log.debug("App.editor2object() --> Geometry --> %s" % str(e))
self.log.debug("App.on_editing_finished() --> Geometry --> %s" % str(e))
edited_obj.build_ui()
edited_obj.plot()
@@ -2669,10 +2674,17 @@ class App(QtCore.QObject):
_("Select a Gerber, Geometry, Excellon or CNCJob object to update."))
return
self.post_edit_sig.emit()
def on_editing_final_action(self):
self.log.debug("######################### Closing the EDITOR ################################")
self.call_source = 'app'
# if notebook is hidden we show it
if self.ui.splitter.sizes()[0] == 0:
self.ui.splitter.setSizes([1, 1])
# change back the tab name
for idx in range(self.ui.notebook.count()):
# restore the Properties Tab text and color
if self.ui.notebook.tabText(idx) == _("Editor"):
@@ -2683,25 +2695,21 @@ class App(QtCore.QObject):
if self.ui.notebook.tabText(idx) == _("Project"):
self.ui.notebook.tabBar.setTabEnabled(idx, True)
self.ui.plot_tab_area.setTabText(0, _("Plot Area"))
self.ui.plot_tab_area.protectTab(0)
# make sure that we re-enable the selection on Project Tab after returning from Editor Mode:
self.ui.project_frame.setDisabled(False)
QMetaObject.invokeMethod(self, "modify_menu_items", Qt.ConnectionType.QueuedConnection)
@QtCore.pyqtSlot()
def modify_menu_items(self):
# re-enable the objects menu that was disabled on entry in Editor mode
self.ui.menuobjects.setDisabled(False)
# re-enable the tool menu that was disabled on entry in Editor mode
self.ui.menu_plugins.setDisabled(False)
# restore the call_source to app
self.call_source = 'app'
self.log.debug("######################### Closing the EDITOR ################################")
# edited_obj.plot()
self.ui.plot_tab_area.setTabText(0, _("Plot Area"))
self.ui.plot_tab_area.protectTab(0)
# restore the notebook tab close method to the app
# self.ui.notebook.callback_on_close = self.on_close_notebook_tab
# make sure that we reenable the selection on Project Tab after returning from Editor Mode:
self.ui.project_frame.setDisabled(False)
def get_last_folder(self):
"""
Get the folder path from where the last file was opened.
@@ -6022,7 +6030,7 @@ class App(QtCore.QObject):
self.area_3d_tab.deleteLater()
self.area_3d_tab = QtWidgets.QWidget()
elif tab_obj_name == "gcode_editor_tab":
self.editor2object()
self.on_editing_finished()
else:
pass