Merge pull request #1849 from rdswift/open_script_editor_from_main_screen

Show script editor from main screen menu
This commit is contained in:
Philipp Wolfer
2021-06-17 16:05:03 +02:00
committed by GitHub
2 changed files with 122 additions and 7 deletions

View File

@@ -29,7 +29,6 @@
# Copyright (C) 2019 Timur Enikeev
# Copyright (C) 2020 Gabriel Ferreira
# Copyright (C) 2021 Petit Minion
# Copyright (C) 2021 Bob Swift
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -121,7 +120,11 @@ from picard.ui.passworddialog import (
PasswordDialog,
ProxyDialog,
)
from picard.ui.scripteditor import user_script_title
from picard.ui.scripteditor import (
ScriptEditorDialog,
ScriptEditorExamples,
user_script_title,
)
from picard.ui.searchdialog.album import AlbumSearchDialog
from picard.ui.searchdialog.track import TrackSearchDialog
from picard.ui.statusindicator import DesktopStatusIndicator
@@ -202,6 +205,10 @@ class MainWindow(QtWidgets.QMainWindow, PreserveGeometry):
if player.available:
self.player = player
self.player.error.connect(self._on_player_error)
self.script_editor_dialog = None
self.examples = None
self.setupUi()
def setupUi(self):
@@ -478,6 +485,9 @@ class MainWindow(QtWidgets.QMainWindow, PreserveGeometry):
self.options_action.setMenuRole(QtWidgets.QAction.PreferencesRole)
self.options_action.triggered.connect(self.show_options)
self.show_script_editor_action = QtWidgets.QAction(_("Open &file naming script editor..."))
self.show_script_editor_action.triggered.connect(self.open_file_naming_script_editor)
self.cut_action = QtWidgets.QAction(icontheme.lookup('edit-cut', icontheme.ICON_SIZE_MENU), _("&Cut"), self)
self.cut_action.setShortcut(QtGui.QKeySequence.Cut)
self.cut_action.setEnabled(False)
@@ -760,10 +770,12 @@ class MainWindow(QtWidgets.QMainWindow, PreserveGeometry):
def toggle_rename_files(self, checked):
config = get_config()
config.setting["rename_files"] = checked
self.update_script_editor_examples()
def toggle_move_files(self, checked):
config = get_config()
config.setting["move_files"] = checked
self.update_script_editor_examples()
def toggle_tag_saving(self, checked):
config = get_config()
@@ -824,6 +836,8 @@ class MainWindow(QtWidgets.QMainWindow, PreserveGeometry):
menu.addMenu(self.script_quick_selector_menu)
menu.addSeparator()
menu.addAction(self.show_script_editor_action)
menu.addSeparator()
menu.addAction(self.options_action)
menu = self.menuBar().addMenu(_("&Tools"))
menu.addAction(self.refresh_action)
@@ -1382,6 +1396,7 @@ class MainWindow(QtWidgets.QMainWindow, PreserveGeometry):
self.metadata_box.selection_dirty = True
self.metadata_box.update(drop_album_caches=drop_album_caches)
self.selection_updated.emit(objects)
self.update_script_editor_example_files()
def refresh_metadatabox(self):
self.tagger.window.metadata_box.selection_dirty = True
@@ -1488,8 +1503,11 @@ class MainWindow(QtWidgets.QMainWindow, PreserveGeometry):
callback=update_last_check_date
)
def make_script_selector_menu(self):
config = get_config()
def make_script_selector_menu(self, config=None):
"""Update the sub-menu of available file naming scripts.
"""
if config is None:
config = get_config()
naming_scripts = config.setting["file_renaming_scripts"]
selected_script_id = config.setting["selected_file_naming_script_id"]
self.script_quick_selector_menu.clear()
@@ -1513,10 +1531,92 @@ class MainWindow(QtWidgets.QMainWindow, PreserveGeometry):
_add_menu_item(script_item['title'], script_item['id'])
def select_new_naming_script(self, id):
"""Update the currently selected naming script ID in the settings.
Args:
id (str): ID of the selected file naming script
"""
config = get_config()
log.debug("Setting naming script to: %s", id)
config.setting["selected_file_naming_script_id"] = id
self.make_script_selector_menu()
self.make_script_selector_menu(config=config)
if self.script_editor_dialog:
self.script_editor_dialog.set_selected_script_id(id, skip_check=False)
def open_file_naming_script_editor(self):
"""Open the file naming script editor / manager in a new window.
"""
if self.script_editor_dialog:
self.script_editor_dialog.load()
else:
self.examples = ScriptEditorExamples(tagger=self.tagger)
self.create_script_editor_dialog()
self.script_editor_dialog.show()
self.script_editor_dialog.raise_()
self.script_editor_dialog.activateWindow()
self.examples.update_sample_example_files()
self.show_script_editor_action.setEnabled(False)
self.options_action.setEnabled(False)
def create_script_editor_dialog(self):
"""Create the file naming script editor manager window.
"""
self.script_editor_dialog = ScriptEditorDialog(parent=self, examples=self.examples)
self.script_editor_dialog.signal_save.connect(self.script_editor_save)
self.script_editor_dialog.signal_selection_changed.connect(self.update_selector_from_script_editor)
self.script_editor_dialog.signal_update_scripts_list.connect(self.update_scripts_list_from_editor)
self.script_editor_dialog.signal_index_changed.connect(self.script_editor_index_changed)
self.script_editor_dialog.finished.connect(self.script_editor_closed)
def script_editor_save(self):
"""Process "signal_save" signal from the script editor.
"""
config = get_config()
config.setting["file_renaming_scripts"] = self.script_editor_dialog.naming_scripts
script_item = self.script_editor_dialog.get_selected_item()
config.setting["selected_file_naming_script_id"] = script_item["id"]
self.make_script_selector_menu(config=config)
def script_editor_closed(self):
"""Process "finished" signal from the script editor.
"""
self.show_script_editor_action.setEnabled(True)
self.options_action.setEnabled(True)
def update_script_editor_example_files(self):
"""Update the list of example files for the file naming script editor.
"""
if self.examples:
self.examples.update_sample_example_files()
self.update_script_editor_examples()
def update_script_editor_examples(self):
"""Update the examples for the file naming script editor, using current settings.
"""
if self.examples:
config = get_config()
override = {
"rename_files": config.setting["rename_files"],
"move_files": config.setting["move_files"],
}
self.examples.update_examples(override=override)
if self.script_editor_dialog:
self.script_editor_dialog.display_examples()
def script_editor_index_changed(self):
"""Process "signal_index_changed" signal from the script editor.
"""
self.script_editor_save()
def update_selector_from_script_editor(self):
"""Process "signal_selection_changed" signal from the script editor.
"""
self.script_editor_save()
def update_scripts_list_from_editor(self):
"""Process "signal_update_scripts_list" signal from the script editor.
"""
self.script_editor_save()
def update_last_check_date(is_success):

View File

@@ -402,6 +402,7 @@ class ScriptEditorDialog(PicardDialog):
signal_update = QtCore.pyqtSignal()
signal_selection_changed = QtCore.pyqtSignal()
signal_update_scripts_list = QtCore.pyqtSignal()
signal_index_changed = QtCore.pyqtSignal()
default_script_directory = os.path.normpath(QtCore.QStandardPaths.writableLocation(QtCore.QStandardPaths.DocumentsLocation))
default_script_filename = "picard_naming_script.ptsp"
@@ -420,8 +421,6 @@ class ScriptEditorDialog(PicardDialog):
self.FILE_TYPE_SCRIPT = _("Picard Script Files") + " (*.pts *.txt)"
self.FILE_TYPE_PACKAGE = _("Picard Naming Script Package") + " (*.ptsp *.yaml)"
# TODO: Make this work properly so that it can be accessed from both the main window and the options window.
# self.setWindowFlags(QtCore.Qt.Window)
self.setWindowTitle(self.TITLE)
self.displaying = False
self.loading = True
@@ -671,6 +670,7 @@ class ScriptEditorDialog(PicardDialog):
self.ui.preset_naming_scripts.setCurrentIndex(idx)
self.ui.preset_naming_scripts.blockSignals(False)
self.selected_script_index = idx
self.signal_index_changed.emit()
def _insert_item(self, script_item):
"""Insert a new item into the script selection combo box and update the script list in the settings.
@@ -748,6 +748,21 @@ class ScriptEditorDialog(PicardDialog):
return False
return True
def set_selected_script_id(self, id, skip_check=True):
"""Select the script with the specified ID.
Args:
id (str): ID of the script to select
skip_check (bool, optional): Skip the check for unsaved edits. Defaults to True.
"""
idx = 0
for i in range(self.ui.preset_naming_scripts.count()):
script_item = self.ui.preset_naming_scripts.itemData(i)
if script_item["id"] == id:
idx = i
break
self.set_selected_script_index(idx, skip_check=skip_check)
def set_selected_script_index(self, idx, skip_check=True):
"""Select the script at the specified combo box index.