Skip to content

Commit 1ba1d28

Browse files
committed
PICARD-2179: Ensure script editor is modal also on macOS
This fixes the script editor opening behind the options dialog on macOS
1 parent 7e1daec commit 1ba1d28

File tree

6 files changed

+32
-36
lines changed

6 files changed

+32
-36
lines changed

picard/ui/options/renaming.py

+28-23
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,10 @@
4747
get_config,
4848
)
4949
from picard.const import DEFAULT_FILE_NAMING_FORMAT
50-
from picard.const.sys import IS_WIN
50+
from picard.const.sys import (
51+
IS_MACOS,
52+
IS_WIN,
53+
)
5154
from picard.script import ScriptParser
5255

5356
from picard.ui.options import (
@@ -150,15 +153,17 @@ def __init__(self, parent=None):
150153
self.ui.example_selection_note.setText(_(self.examples.notes_text) % self.examples.max_samples)
151154
self.ui.example_filename_sample_files_button.setToolTip(_(self.examples.tooltip_text) % self.examples.max_samples)
152155

153-
self.script_editor_page = ScriptEditorDialog(parent=self, examples=self.examples)
154-
self.script_editor_page.signal_save.connect(self.save_from_editor)
155-
self.script_editor_page.signal_update.connect(self.update_from_editor)
156-
self.script_editor_page.signal_selection_changed.connect(self.update_selector_from_editor)
156+
self.script_editor_dialog = ScriptEditorDialog(parent=self, examples=self.examples)
157+
if IS_MACOS: # Workaround for dialog opening behind options dialog
158+
self.script_editor_dialog.setModal(True)
159+
self.script_editor_dialog.signal_save.connect(self.save_from_editor)
160+
self.script_editor_dialog.signal_update.connect(self.update_from_editor)
161+
self.script_editor_dialog.signal_selection_changed.connect(self.update_selector_from_editor)
157162

158163
self.update_selector_from_editor()
159164

160165
# Sync example lists vertical scrolling and selection colors
161-
self.script_editor_page.synchronize_vertical_scrollbars((self.ui.example_filename_before, self.ui.example_filename_after))
166+
self.script_editor_dialog.synchronize_vertical_scrollbars((self.ui.example_filename_before, self.ui.example_filename_after))
162167

163168
self.current_row = -1
164169

@@ -167,32 +172,32 @@ def update_selector_from_editor(self):
167172
"""
168173
self.ui.naming_script_selector.blockSignals(True)
169174
self.ui.naming_script_selector.clear()
170-
for i in range(self.script_editor_page.ui.preset_naming_scripts.count()):
171-
title = self.script_editor_page.ui.preset_naming_scripts.itemText(i)
172-
script = self.script_editor_page.ui.preset_naming_scripts.itemData(i)
175+
for i in range(self.script_editor_dialog.ui.preset_naming_scripts.count()):
176+
title = self.script_editor_dialog.ui.preset_naming_scripts.itemText(i)
177+
script = self.script_editor_dialog.ui.preset_naming_scripts.itemData(i)
173178
self.ui.naming_script_selector.addItem(title, script)
174-
self.ui.naming_script_selector.setCurrentIndex(self.script_editor_page.ui.preset_naming_scripts.currentIndex())
179+
self.ui.naming_script_selector.setCurrentIndex(self.script_editor_dialog.ui.preset_naming_scripts.currentIndex())
175180
self.ui.naming_script_selector.blockSignals(False)
176181

177182
def update_selector_in_editor(self):
178183
"""Update the selection in the script editor page to match local selection.
179184
"""
180-
self.script_editor_page.ui.preset_naming_scripts.setCurrentIndex(self.ui.naming_script_selector.currentIndex())
185+
self.script_editor_dialog.ui.preset_naming_scripts.setCurrentIndex(self.ui.naming_script_selector.currentIndex())
181186

182187
def match_after_to_before(self):
183188
"""Sets the selected item in the 'after' list to the corresponding item in the 'before' list.
184189
"""
185-
self.script_editor_page.synchronize_selected_example_lines(self.current_row, self.ui.example_filename_before, self.ui.example_filename_after)
190+
self.script_editor_dialog.synchronize_selected_example_lines(self.current_row, self.ui.example_filename_before, self.ui.example_filename_after)
186191

187192
def match_before_to_after(self):
188193
"""Sets the selected item in the 'before' list to the corresponding item in the 'after' list.
189194
"""
190-
self.script_editor_page.synchronize_selected_example_lines(self.current_row, self.ui.example_filename_after, self.ui.example_filename_before)
195+
self.script_editor_dialog.synchronize_selected_example_lines(self.current_row, self.ui.example_filename_after, self.ui.example_filename_before)
191196

192197
def show_script_editing_page(self):
193-
self.script_editor_page.show()
194-
self.script_editor_page.raise_()
195-
self.script_editor_page.activateWindow()
198+
self.script_editor_dialog.show()
199+
self.script_editor_dialog.raise_()
200+
self.script_editor_dialog.activateWindow()
196201
self.update_examples_from_local()
197202

198203
def show_scripting_documentation(self):
@@ -217,7 +222,7 @@ def toggle_file_naming_format(self):
217222
self.ui.windows_compatibility.setEnabled(active)
218223

219224
def save_from_editor(self):
220-
self.script_text = self.script_editor_page.get_script()
225+
self.script_text = self.script_editor_dialog.get_script()
221226

222227
def update_from_editor(self):
223228
self.display_examples()
@@ -228,7 +233,7 @@ def check_formats(self):
228233

229234
def update_example_files(self):
230235
self.examples.update_sample_example_files()
231-
self.script_editor_page.display_examples()
236+
self.script_editor_dialog.display_examples()
232237

233238
def update_examples_from_local(self):
234239
override = {
@@ -239,12 +244,12 @@ def update_examples_from_local(self):
239244
'windows_compatibility': self.ui.windows_compatibility.isChecked(),
240245
}
241246
self.examples.update_examples(override=override)
242-
self.script_editor_page.display_examples()
247+
self.script_editor_dialog.display_examples()
243248

244249
def display_examples(self):
245250
self.current_row = -1
246251
examples = self.examples.get_examples()
247-
self.script_editor_page.update_example_listboxes(self.ui.example_filename_before, self.ui.example_filename_after, examples)
252+
self.script_editor_dialog.update_example_listboxes(self.ui.example_filename_before, self.ui.example_filename_after, examples)
248253

249254
def load(self):
250255
config = get_config()
@@ -262,7 +267,7 @@ def load(self):
262267
self.ui.move_additional_files.setChecked(config.setting["move_additional_files"])
263268
self.ui.move_additional_files_pattern.setText(config.setting["move_additional_files_pattern"])
264269
self.ui.delete_empty_dirs.setChecked(config.setting["delete_empty_dirs"])
265-
self.script_editor_page.load()
270+
self.script_editor_dialog.load()
266271
self.update_examples_from_local()
267272

268273
def check(self):
@@ -292,8 +297,8 @@ def save(self):
292297
config.setting["move_additional_files"] = self.ui.move_additional_files.isChecked()
293298
config.setting["move_additional_files_pattern"] = self.ui.move_additional_files_pattern.text()
294299
config.setting["delete_empty_dirs"] = self.ui.delete_empty_dirs.isChecked()
295-
config.setting["file_naming_scripts"] = self.script_editor_page.naming_scripts
296-
config.setting["selected_file_naming_script_id"] = self.script_editor_page.selected_script_id
300+
config.setting["file_naming_scripts"] = self.script_editor_dialog.naming_scripts
301+
config.setting["selected_file_naming_script_id"] = self.script_editor_dialog.selected_script_id
297302
self.tagger.window.enable_moving_action.setChecked(config.setting["move_files"])
298303

299304
def display_error(self, error):

picard/ui/scripteditor.py

-1
Original file line numberDiff line numberDiff line change
@@ -1018,7 +1018,6 @@ def __init__(self, parent, script_item):
10181018
super().__init__(parent=parent)
10191019
self.script_item = script_item
10201020
self.readonly = script_item.readonly
1021-
self.setWindowModality(QtCore.Qt.WindowModal)
10221021
self.setWindowTitle(self.TITLE)
10231022
self.displaying = False
10241023
self.ui = Ui_ScriptDetails()

picard/ui/ui_scripteditor.py

-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010
class Ui_ScriptEditor(object):
1111
def setupUi(self, ScriptEditor):
1212
ScriptEditor.setObjectName("ScriptEditor")
13-
ScriptEditor.setWindowModality(QtCore.Qt.NonModal)
14-
ScriptEditor.setEnabled(True)
1513
ScriptEditor.resize(902, 729)
1614
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
1715
sizePolicy.setHorizontalStretch(0)

picard/ui/ui_scripteditor_details.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@
1010
class Ui_ScriptDetails(object):
1111
def setupUi(self, ScriptDetails):
1212
ScriptDetails.setObjectName("ScriptDetails")
13+
ScriptDetails.setWindowModality(QtCore.Qt.WindowModal)
1314
ScriptDetails.resize(700, 284)
1415
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
1516
sizePolicy.setHorizontalStretch(1)
1617
sizePolicy.setVerticalStretch(1)
1718
sizePolicy.setHeightForWidth(ScriptDetails.sizePolicy().hasHeightForWidth())
1819
ScriptDetails.setSizePolicy(sizePolicy)
19-
ScriptDetails.setModal(False)
2020
self.verticalLayout = QtWidgets.QVBoxLayout(ScriptDetails)
2121
self.verticalLayout.setObjectName("verticalLayout")
2222
self.gridLayout = QtWidgets.QGridLayout()

ui/scripteditor.ui

-6
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,6 @@
22
<ui version="4.0">
33
<class>ScriptEditor</class>
44
<widget class="QWidget" name="ScriptEditor">
5-
<property name="windowModality">
6-
<enum>Qt::NonModal</enum>
7-
</property>
8-
<property name="enabled">
9-
<bool>true</bool>
10-
</property>
115
<property name="geometry">
126
<rect>
137
<x>0</x>

ui/scripteditor_details.ui

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
<ui version="4.0">
33
<class>ScriptDetails</class>
44
<widget class="QDialog" name="ScriptDetails">
5+
<property name="windowModality">
6+
<enum>Qt::WindowModal</enum>
7+
</property>
58
<property name="geometry">
69
<rect>
710
<x>0</x>
@@ -19,9 +22,6 @@
1922
<property name="windowTitle">
2023
<string>Scripting Documentation</string>
2124
</property>
22-
<property name="modal">
23-
<bool>false</bool>
24-
</property>
2525
<layout class="QVBoxLayout" name="verticalLayout">
2626
<item>
2727
<layout class="QGridLayout" name="gridLayout">

0 commit comments

Comments
 (0)