Add separate window for naming script editing.

This commit is contained in:
Bob Swift
2021-04-12 17:45:18 -06:00
committed by Philipp Wolfer
parent 2fd987c0e1
commit 6ced4e95e4
6 changed files with 776 additions and 24 deletions

View File

@@ -16,6 +16,7 @@
# Copyright (C) 2016 Suhas
# Copyright (C) 2016-2017 Sambhav Kothari
# Copyright (C) 2021 Gabriel Ferreira
# 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
@@ -58,6 +59,7 @@ from picard.ui.options import (
OptionsPage,
register_options_page,
)
from picard.ui.options.renaming_editor import RenamingEditorOptionsPage
from picard.ui.options.scripting import (
ScriptCheckError,
ScriptingDocumentationDialog,
@@ -119,6 +121,7 @@ class RenamingOptionsPage(OptionsPage):
)
self.ui.file_naming_format.textChanged.connect(self.check_formats)
self.ui.file_naming_format_default.clicked.connect(self.set_file_naming_format_default)
self.ui.open_script_editor.clicked.connect(self.show_script_editing_page)
self.ui.move_files_to_browse.clicked.connect(self.move_files_to_browse)
script_edit = self.ui.file_naming_format
@@ -147,6 +150,9 @@ class RenamingOptionsPage(OptionsPage):
# Sync example lists vertical scrolling
sync_vertical_scrollbars((self.ui.example_filename_before, self.ui.example_filename_after))
def show_script_editing_page(self):
RenamingEditorOptionsPage.show_instance(parent=self)
def show_scripting_documentation(self):
ScriptingDocumentationDialog.show_instance(parent=self)
@@ -165,6 +171,7 @@ class RenamingOptionsPage(OptionsPage):
active = self.ui.move_files.isChecked() or self.ui.rename_files.isChecked()
self.ui.file_naming_format.setEnabled(active)
self.ui.file_naming_format_default.setEnabled(active)
self.ui.open_script_editor.setEnabled(active)
palette = self.script_palette_normal if active else self.script_palette_readonly
self.ui.file_naming_format.setPalette(palette)

View File

@@ -0,0 +1,298 @@
# -*- coding: utf-8 -*-
#
# Picard, the next-generation MusicBrainz tagger
#
# Copyright (C) 2006-2008, 2011 Lukáš Lalinský
# Copyright (C) 2008-2009 Nikolai Prokoschenko
# Copyright (C) 2009-2010, 2014-2015, 2018-2021 Philipp Wolfer
# Copyright (C) 2011-2013 Michael Wiencek
# Copyright (C) 2011-2013 Wieland Hoffmann
# Copyright (C) 2013 Calvin Walton
# Copyright (C) 2013 Ionuț Ciocîrlan
# Copyright (C) 2013-2014 Sophist-UK
# Copyright (C) 2013-2015, 2018-2019, 2021 Laurent Monin
# Copyright (C) 2015 Alex Berman
# Copyright (C) 2015 Ohm Patel
# Copyright (C) 2016 Suhas
# Copyright (C) 2016-2017 Sambhav Kothari
# Copyright (C) 2021 Gabriel Ferreira
# 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
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
from functools import partial
import os.path
from picard.config import (
TextOption,
get_config,
)
from picard.const import DEFAULT_FILE_NAMING_FORMAT
from picard.file import File
from picard.script import (
ScriptError,
ScriptParser,
)
from picard.util.settingsoverride import SettingsOverride
from picard.ui import (
PicardDialog,
SingletonDialog,
)
from picard.ui.options import (
OptionsCheckError,
OptionsPage,
)
from picard.ui.options.scripting import (
ScriptCheckError,
ScriptingDocumentationDialog,
)
from picard.ui.ui_options_renaming_editor import Ui_RenamingEditorOptionsPage
class RenamingEditorOptionsPage(PicardDialog, SingletonDialog):
NAME = "filerenamingeditor"
TITLE = N_("File Naming Editor")
PARENT = None
SORT_ORDER = 40
ACTIVE = True
HELP_URL = '/config/options_filerenaming.html'
STYLESHEET_ERROR = OptionsPage.STYLESHEET_ERROR
options = [
TextOption(
"setting",
"file_naming_format",
DEFAULT_FILE_NAMING_FORMAT,
),
]
def __init__(self, parent=None):
super().__init__(parent)
self.ui = Ui_RenamingEditorOptionsPage()
self.ui.setupUi(self)
self.PARENT = parent
self.ui.file_naming_editor_save.clicked.connect(self.save_script)
self.ui.file_naming_editor_cancel.clicked.connect(self.reject)
self.ui.file_naming_format.setEnabled(True)
self.ui.file_naming_format_default.setEnabled(True)
self.ui.file_naming_format.textChanged.connect(self.check_formats)
self.ui.file_naming_format_default.clicked.connect(self.set_file_naming_format_default)
self.ui.scripting_documentation_button.clicked.connect(self.show_scripting_documentation)
self.ui.example_filename_sample_files_button.clicked.connect(self._sample_example_files)
self._sampled_example_files = []
# Sync example lists vertical scrolling
def sync_vertical_scrollbars(widgets):
"""Sync position of vertical scrollbars for listed widgets"""
def _sync_scrollbar_vert(widget, value):
widget.blockSignals(True)
widget.verticalScrollBar().setValue(value)
widget.blockSignals(False)
widgets = set(widgets)
for widget in widgets:
for other in widgets - {widget}:
widget.verticalScrollBar().valueChanged.connect(
partial(_sync_scrollbar_vert, other))
# Sync example lists vertical scrolling
sync_vertical_scrollbars((self.ui.example_filename_before, self.ui.example_filename_after))
self.load()
def save_script(self):
self.PARENT.ui.file_naming_format.setPlainText(self.ui.file_naming_format.toPlainText())
self.accept()
def show_scripting_documentation(self):
ScriptingDocumentationDialog.show_instance(parent=self)
def check_formats(self):
self.test()
self.update_examples()
def _example_to_filename(self, file):
config = get_config()
settings = SettingsOverride(config.setting, {
'ascii_filenames': self.PARENT.ui.ascii_filenames.isChecked(),
'file_naming_format': self.ui.file_naming_format.toPlainText(),
'move_files': self.PARENT.ui.move_files.isChecked(),
'move_files_to': os.path.normpath(self.PARENT.ui.move_files_to.text()),
'rename_files': self.PARENT.ui.rename_files.isChecked(),
'windows_compatibility': self.PARENT.ui.windows_compatibility.isChecked(),
})
try:
if config.setting["enable_tagger_scripts"]:
for s_pos, s_name, s_enabled, s_text in config.setting["list_of_scripts"]:
if s_enabled and s_text:
parser = ScriptParser()
parser.eval(s_text, file.metadata)
filename_before = file.filename
filename_after = file.make_filename(filename_before, file.metadata, settings)
if not settings["move_files"]:
return os.path.basename(filename_before), os.path.basename(filename_after)
return filename_before, filename_after
except ScriptError:
return "", ""
except TypeError:
return "", ""
def _sample_example_files(self):
# Get a new sample of randomly selected /loaded files to use as renaming examples
import random
max_samples = 10 # pick up to 10 samples
if self.tagger.window.selected_objects:
# If files/albums/tracks are selected, sample example files from them
files = self.tagger.get_files_from_objects(self.tagger.window.selected_objects)
length = min(max_samples, len(files))
files = [file for file in random.sample(files, k=length)]
else:
# If files/albums/tracks are not selected, sample example files from the pool of loaded files
files = self.tagger.files
length = min(max_samples, len(files))
files = [files[key] for key in random.sample(files.keys(), k=length)]
if not files:
# If no file has been loaded, use generic examples
files = [self.example_1(), self.example_2()]
self._sampled_example_files = files
self.update_examples()
def update_examples(self):
self.ui.example_filename_before.clear()
self.ui.example_filename_after.clear()
if not self._sampled_example_files:
self._sample_example_files()
example_files = self._sampled_example_files
examples = [self._example_to_filename(example) for example in example_files]
for before, after in sorted(examples, key=lambda x: x[1]):
self.ui.example_filename_before.addItem(before)
self.ui.example_filename_after.addItem(after)
def load(self):
self.ui.file_naming_format.setPlainText(self.PARENT.ui.file_naming_format.toPlainText())
self.update_examples()
def check(self):
self.check_format()
if self.PARENT.ui.move_files.isChecked() and not self.PARENT.ui.move_files_to.text().strip():
raise OptionsCheckError(_("Error"), _("The location to move files to must not be empty."))
def check_format(self):
parser = ScriptParser()
try:
parser.eval(self.ui.file_naming_format.toPlainText())
except Exception as e:
raise ScriptCheckError("", str(e))
if self.PARENT.ui.rename_files.isChecked():
if not self.ui.file_naming_format.toPlainText().strip():
raise ScriptCheckError("", _("The file naming format must not be empty."))
# def save(self):
# self.PARENT.ui.file_naming_format.setPlainText(self.ui.file_naming_format.toPlainText())
def display_error(self, error):
# Ignore scripting errors, those are handled inline
if not isinstance(error, ScriptCheckError):
super().display_error(error)
def set_file_naming_format_default(self):
self.ui.file_naming_format.setText(self.options[0].default)
# self.ui.file_naming_format.setCursorPosition(0)
def example_1(self):
file = File("ticket_to_ride.mp3")
file.state = File.NORMAL
file.metadata['album'] = 'Help!'
file.metadata['title'] = 'Ticket to Ride'
file.metadata['~releasecomment'] = '2014 mono remaster'
file.metadata['artist'] = 'The Beatles'
file.metadata['artistsort'] = 'Beatles, The'
file.metadata['albumartist'] = 'The Beatles'
file.metadata['albumartistsort'] = 'Beatles, The'
file.metadata['tracknumber'] = '7'
file.metadata['totaltracks'] = '14'
file.metadata['discnumber'] = '1'
file.metadata['totaldiscs'] = '1'
file.metadata['originaldate'] = '1965-08-06'
file.metadata['originalyear'] = '1965'
file.metadata['date'] = '2014-09-08'
file.metadata['releasetype'] = ['album', 'soundtrack']
file.metadata['~primaryreleasetype'] = ['album']
file.metadata['~secondaryreleasetype'] = ['soundtrack']
file.metadata['releasestatus'] = 'official'
file.metadata['releasecountry'] = 'US'
file.metadata['~extension'] = 'mp3'
file.metadata['musicbrainz_albumid'] = 'd7fbbb0a-1348-40ad-8eef-cd438d4cd203'
file.metadata['musicbrainz_albumartistid'] = 'b10bbbfc-cf9e-42e0-be17-e2c3e1d2600d'
file.metadata['musicbrainz_artistid'] = 'b10bbbfc-cf9e-42e0-be17-e2c3e1d2600d'
file.metadata['musicbrainz_recordingid'] = 'ed052ae1-c950-47f2-8d2b-46e1b58ab76c'
file.metadata['musicbrainz_releasetrackid'] = '392639f5-5629-477e-b04b-93bffa703405'
return file
def example_2(self):
config = get_config()
file = File("track05.mp3")
file.state = File.NORMAL
file.metadata['album'] = "Coup d'État, Volume 1: Ku De Ta / Prologue"
file.metadata['title'] = "I've Got to Learn the Mambo"
file.metadata['artist'] = "Snowboy feat. James Hunter"
file.metadata['artistsort'] = "Snowboy feat. Hunter, James"
file.metadata['albumartist'] = config.setting['va_name']
file.metadata['albumartistsort'] = config.setting['va_name']
file.metadata['tracknumber'] = '5'
file.metadata['totaltracks'] = '13'
file.metadata['discnumber'] = '2'
file.metadata['totaldiscs'] = '2'
file.metadata['discsubtitle'] = "Beat Up"
file.metadata['originaldate'] = '2005-07-04'
file.metadata['originalyear'] = '2005'
file.metadata['date'] = '2005-07-04'
file.metadata['releasetype'] = ['album', 'compilation']
file.metadata['~primaryreleasetype'] = 'album'
file.metadata['~secondaryreleasetype'] = 'compilation'
file.metadata['releasestatus'] = 'official'
file.metadata['releasecountry'] = 'AU'
file.metadata['compilation'] = '1'
file.metadata['~multiartist'] = '1'
file.metadata['~extension'] = 'mp3'
file.metadata['musicbrainz_albumid'] = '4b50c71e-0a07-46ac-82e4-cb85dc0c9bdd'
file.metadata['musicbrainz_recordingid'] = 'b3c487cb-0e55-477d-8df3-01ec6590f099'
file.metadata['musicbrainz_releasetrackid'] = 'f8649a05-da39-39ba-957c-7abf8f9012be'
file.metadata['musicbrainz_albumartistid'] = '89ad4ac3-39f7-470e-963a-56509c546377'
file.metadata['musicbrainz_artistid'] = ['7b593455-d207-482c-8c6f-19ce22c94679',
'9e082466-2390-40d1-891e-4803531f43fd']
return file
def test(self):
self.ui.renaming_error.setStyleSheet("")
self.ui.renaming_error.setText("")
try:
self.check_format()
except ScriptCheckError as e:
self.ui.renaming_error.setStyleSheet(self.STYLESHEET_ERROR)
self.ui.renaming_error.setText(e.info)
return

View File

@@ -88,13 +88,6 @@ class Ui_RenamingOptionsPage(object):
self.example_filename_sample_files_button = QtWidgets.QPushButton(RenamingOptionsPage)
self.example_filename_sample_files_button.setObjectName("example_filename_sample_files_button")
self.horizontalLayout.addWidget(self.example_filename_sample_files_button)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem)
self.scripting_documentation_button = QtWidgets.QPushButton(RenamingOptionsPage)
self.scripting_documentation_button.setObjectName("scripting_documentation_button")
self.horizontalLayout.addWidget(self.scripting_documentation_button)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem1)
self.file_naming_format_default = QtWidgets.QPushButton(RenamingOptionsPage)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
@@ -104,6 +97,16 @@ class Ui_RenamingOptionsPage(object):
self.file_naming_format_default.setMinimumSize(QtCore.QSize(0, 0))
self.file_naming_format_default.setObjectName("file_naming_format_default")
self.horizontalLayout.addWidget(self.file_naming_format_default)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem)
self.scripting_documentation_button = QtWidgets.QPushButton(RenamingOptionsPage)
self.scripting_documentation_button.setObjectName("scripting_documentation_button")
self.horizontalLayout.addWidget(self.scripting_documentation_button)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem1)
self.open_script_editor = QtWidgets.QPushButton(RenamingOptionsPage)
self.open_script_editor.setObjectName("open_script_editor")
self.horizontalLayout.addWidget(self.open_script_editor)
self.verticalLayout_5.addLayout(self.horizontalLayout)
self.renaming_error = QtWidgets.QLabel(RenamingOptionsPage)
self.renaming_error.setText("")
@@ -142,7 +145,6 @@ class Ui_RenamingOptionsPage(object):
RenamingOptionsPage.setTabOrder(self.move_files_to_browse, self.move_additional_files)
RenamingOptionsPage.setTabOrder(self.move_additional_files, self.move_additional_files_pattern)
RenamingOptionsPage.setTabOrder(self.move_additional_files_pattern, self.delete_empty_dirs)
RenamingOptionsPage.setTabOrder(self.delete_empty_dirs, self.file_naming_format_default)
def retranslateUi(self, RenamingOptionsPage):
_translate = QtCore.QCoreApplication.translate
@@ -156,8 +158,9 @@ class Ui_RenamingOptionsPage(object):
self.windows_compatibility.setText(_("Windows compatibility"))
self.file_naming_format_label.setText(_("Name files like this"))
self.example_filename_sample_files_button.setText(_("Renew examples"))
self.scripting_documentation_button.setText(_("Scripting Documentation"))
self.file_naming_format_default.setText(_("Default"))
self.scripting_documentation_button.setText(_("Scripting Documentation"))
self.open_script_editor.setText(_("Script Editor"))
self.groupBox.setTitle(_("Examples"))
self.example_filename_before_label.setText(_("Before"))
self.example_filename_after_label.setText(_("After"))

View File

@@ -0,0 +1,143 @@
# -*- coding: utf-8 -*-
# Automatically generated - don't edit.
# Use `python setup.py build_ui` to update it.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_RenamingEditorOptionsPage(object):
def setupUi(self, RenamingEditorOptionsPage):
RenamingEditorOptionsPage.setObjectName("RenamingEditorOptionsPage")
RenamingEditorOptionsPage.setWindowModality(QtCore.Qt.WindowModal)
RenamingEditorOptionsPage.setEnabled(True)
RenamingEditorOptionsPage.resize(453, 552)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(RenamingEditorOptionsPage.sizePolicy().hasHeightForWidth())
RenamingEditorOptionsPage.setSizePolicy(sizePolicy)
self.verticalLayout_5 = QtWidgets.QVBoxLayout(RenamingEditorOptionsPage)
self.verticalLayout_5.setObjectName("verticalLayout_5")
self.verticalLayout_2 = QtWidgets.QVBoxLayout()
self.verticalLayout_2.setContentsMargins(-1, 0, -1, 0)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.file_naming_format_label = QtWidgets.QLabel(RenamingEditorOptionsPage)
self.file_naming_format_label.setObjectName("file_naming_format_label")
self.verticalLayout_2.addWidget(self.file_naming_format_label)
self.frame = QtWidgets.QFrame(RenamingEditorOptionsPage)
self.frame.setMinimumSize(QtCore.QSize(0, 20))
self.frame.setFrameShape(QtWidgets.QFrame.NoFrame)
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame.setLineWidth(0)
self.frame.setObjectName("frame")
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.frame)
self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.splitter = QtWidgets.QSplitter(self.frame)
self.splitter.setOrientation(QtCore.Qt.Vertical)
self.splitter.setObjectName("splitter")
self.file_naming_format = ScriptTextEdit(self.splitter)
self.file_naming_format.setEnabled(False)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.MinimumExpanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.file_naming_format.sizePolicy().hasHeightForWidth())
self.file_naming_format.setSizePolicy(sizePolicy)
self.file_naming_format.setMinimumSize(QtCore.QSize(0, 250))
self.file_naming_format.viewport().setProperty("cursor", QtGui.QCursor(QtCore.Qt.IBeamCursor))
self.file_naming_format.setTabChangesFocus(False)
self.file_naming_format.setLineWrapMode(QtWidgets.QTextEdit.NoWrap)
self.file_naming_format.setTabStopWidth(20)
self.file_naming_format.setAcceptRichText(False)
self.file_naming_format.setTextInteractionFlags(QtCore.Qt.TextEditorInteraction)
self.file_naming_format.setObjectName("file_naming_format")
self.groupBox = QtWidgets.QGroupBox(self.splitter)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth())
self.groupBox.setSizePolicy(sizePolicy)
self.groupBox.setMinimumSize(QtCore.QSize(0, 150))
self.groupBox.setObjectName("groupBox")
self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.groupBox)
self.verticalLayout_4.setContentsMargins(-1, 6, -1, 0)
self.verticalLayout_4.setObjectName("verticalLayout_4")
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.example_filename_before_label = QtWidgets.QLabel(self.groupBox)
self.example_filename_before_label.setObjectName("example_filename_before_label")
self.horizontalLayout_3.addWidget(self.example_filename_before_label)
self.example_filename_after_label = QtWidgets.QLabel(self.groupBox)
self.example_filename_after_label.setObjectName("example_filename_after_label")
self.horizontalLayout_3.addWidget(self.example_filename_after_label)
self.verticalLayout_4.addLayout(self.horizontalLayout_3)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.example_filename_before = QtWidgets.QListWidget(self.groupBox)
self.example_filename_before.setObjectName("example_filename_before")
self.horizontalLayout_2.addWidget(self.example_filename_before)
self.example_filename_after = QtWidgets.QListWidget(self.groupBox)
self.example_filename_after.setObjectName("example_filename_after")
self.horizontalLayout_2.addWidget(self.example_filename_after)
self.verticalLayout_4.addLayout(self.horizontalLayout_2)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setSpacing(2)
self.horizontalLayout.setObjectName("horizontalLayout")
self.example_filename_sample_files_button = QtWidgets.QPushButton(self.groupBox)
self.example_filename_sample_files_button.setObjectName("example_filename_sample_files_button")
self.horizontalLayout.addWidget(self.example_filename_sample_files_button)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem)
self.scripting_documentation_button = QtWidgets.QPushButton(self.groupBox)
self.scripting_documentation_button.setObjectName("scripting_documentation_button")
self.horizontalLayout.addWidget(self.scripting_documentation_button)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem1)
self.renaming_error = QtWidgets.QLabel(self.groupBox)
self.renaming_error.setText("")
self.renaming_error.setAlignment(QtCore.Qt.AlignCenter)
self.renaming_error.setObjectName("renaming_error")
self.horizontalLayout.addWidget(self.renaming_error)
self.file_naming_format_default = QtWidgets.QPushButton(self.groupBox)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.file_naming_format_default.sizePolicy().hasHeightForWidth())
self.file_naming_format_default.setSizePolicy(sizePolicy)
self.file_naming_format_default.setMinimumSize(QtCore.QSize(0, 0))
self.file_naming_format_default.setObjectName("file_naming_format_default")
self.horizontalLayout.addWidget(self.file_naming_format_default)
self.verticalLayout_4.addLayout(self.horizontalLayout)
self.verticalLayout_3.addWidget(self.splitter)
self.verticalLayout_2.addWidget(self.frame)
self.verticalLayout_5.addLayout(self.verticalLayout_2)
self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
self.horizontalLayout_4.setContentsMargins(-1, 0, -1, -1)
self.horizontalLayout_4.setObjectName("horizontalLayout_4")
spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout_4.addItem(spacerItem2)
self.file_naming_editor_cancel = QtWidgets.QPushButton(RenamingEditorOptionsPage)
self.file_naming_editor_cancel.setObjectName("file_naming_editor_cancel")
self.horizontalLayout_4.addWidget(self.file_naming_editor_cancel)
self.file_naming_editor_save = QtWidgets.QPushButton(RenamingEditorOptionsPage)
self.file_naming_editor_save.setObjectName("file_naming_editor_save")
self.horizontalLayout_4.addWidget(self.file_naming_editor_save)
self.verticalLayout_5.addLayout(self.horizontalLayout_4)
self.retranslateUi(RenamingEditorOptionsPage)
QtCore.QMetaObject.connectSlotsByName(RenamingEditorOptionsPage)
def retranslateUi(self, RenamingEditorOptionsPage):
_translate = QtCore.QCoreApplication.translate
self.file_naming_format_label.setText(_("Name files like this"))
self.groupBox.setTitle(_("Examples"))
self.example_filename_before_label.setText(_("Before"))
self.example_filename_after_label.setText(_("After"))
self.example_filename_sample_files_button.setText(_("Renew examples"))
self.scripting_documentation_button.setText(_("Scripting Documentation"))
self.file_naming_format_default.setText(_("Default"))
self.file_naming_editor_cancel.setText(_("Cancel"))
self.file_naming_editor_save.setText(_("Save"))
from picard.ui.widgets.scripttextedit import ScriptTextEdit

View File

@@ -173,6 +173,25 @@
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="file_naming_format_default">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Default</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
@@ -207,21 +226,9 @@
</spacer>
</item>
<item>
<widget class="QPushButton" name="file_naming_format_default">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<widget class="QPushButton" name="open_script_editor">
<property name="text">
<string>Default</string>
<string>Script Editor</string>
</property>
</widget>
</item>
@@ -302,7 +309,6 @@
<tabstop>move_additional_files</tabstop>
<tabstop>move_additional_files_pattern</tabstop>
<tabstop>delete_empty_dirs</tabstop>
<tabstop>file_naming_format_default</tabstop>
</tabstops>
<resources/>
<connections/>

View File

@@ -0,0 +1,295 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>RenamingEditorOptionsPage</class>
<widget class="QWidget" name="RenamingEditorOptionsPage">
<property name="windowModality">
<enum>Qt::WindowModal</enum>
</property>
<property name="enabled">
<bool>true</bool>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>453</width>
<height>552</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5" stretch="0,0">
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="topMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="file_naming_format_label">
<property name="text">
<string>Name files like this</string>
</property>
</widget>
</item>
<item>
<widget class="QFrame" name="frame">
<property name="minimumSize">
<size>
<width>0</width>
<height>20</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<widget class="ScriptTextEdit" name="file_naming_format">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>250</height>
</size>
</property>
<property name="cursor" stdset="0">
<cursorShape>IBeamCursor</cursorShape>
</property>
<property name="tabChangesFocus">
<bool>false</bool>
</property>
<property name="lineWrapMode">
<enum>QTextEdit::NoWrap</enum>
</property>
<property name="tabStopWidth">
<number>20</number>
</property>
<property name="acceptRichText">
<bool>false</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::TextEditorInteraction</set>
</property>
</widget>
<widget class="QGroupBox" name="groupBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>150</height>
</size>
</property>
<property name="title">
<string>Examples</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<property name="topMargin">
<number>6</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLabel" name="example_filename_before_label">
<property name="text">
<string>Before</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="example_filename_after_label">
<property name="text">
<string>After</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QListWidget" name="example_filename_before"/>
</item>
<item>
<widget class="QListWidget" name="example_filename_after"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>2</number>
</property>
<item>
<widget class="QPushButton" name="example_filename_sample_files_button">
<property name="text">
<string>Renew examples</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="scripting_documentation_button">
<property name="text">
<string>Scripting Documentation</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="renaming_error">
<property name="text">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="file_naming_format_default">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Default</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<property name="topMargin">
<number>0</number>
</property>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="file_naming_editor_cancel">
<property name="text">
<string>Cancel</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="file_naming_editor_save">
<property name="text">
<string>Save</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>ScriptTextEdit</class>
<extends>QTextEdit</extends>
<header location="global">picard.ui.widgets.scripttextedit</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>file_naming_format_default</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>