Build release type score sliders UI dynamically.

This commit is contained in:
Laurent Monin
2014-04-09 14:03:14 +02:00
parent e59fabda3f
commit 91cd68022e
3 changed files with 96 additions and 371 deletions

View File

@@ -24,7 +24,65 @@ from picard import config
from picard.util import load_release_type_scores, save_release_type_scores
from picard.ui.options import OptionsPage, register_options_page
from picard.ui.ui_options_releases import Ui_ReleasesOptionsPage
from picard.const import RELEASE_COUNTRIES, RELEASE_FORMATS
from picard.const import (RELEASE_COUNTRIES,
RELEASE_FORMATS,
RELEASE_PRIMARY_GROUPS,
RELEASE_SECONDARY_GROUPS)
from picard.i18n import ugettext_attr
_DEFAULT_SCORE = 0.5
_release_type_scores = save_release_type_scores(dict([(g, _DEFAULT_SCORE) for g
in
RELEASE_PRIMARY_GROUPS.keys()
+
RELEASE_SECONDARY_GROUPS.keys()]))
class ReleaseTypeScore:
def __init__(self, group, layout, label, cell):
row, column = cell #it uses 2 cells (r,c and r,c+1)
self.group = group
self.layout = layout
self.label = QtGui.QLabel(self.group)
self.label.setText(label)
self.layout.addWidget(self.label, row, column, 1, 1)
self.slider = QtGui.QSlider(self.group)
self.slider.setMaximum(100)
self.slider.setOrientation(QtCore.Qt.Horizontal)
self.layout.addWidget(self.slider, row, column + 1, 1, 1)
self.reset()
def setValue(self, value):
self.slider.setValue(int(value * 100))
def value(self):
return float(self.slider.value()) / 100.0
def reset(self):
self.setValue(_DEFAULT_SCORE)
class RowColIter:
def __init__(self, max_cells, max_cols=6, step=2):
assert(max_cols % step == 0)
self.step = step
self.cols = max_cols
self.rows = int((max_cells - 1) / (self.cols / step)) + 1
self.current = (-1, 0)
def __iter__(self):
return self
def next(self):
row, col = self.current
row += 1
if row == self.rows:
col += self.step
row = 0
self.current = (row, col)
return self.current
class ReleasesOptionsPage(OptionsPage):
@@ -36,29 +94,43 @@ class ReleasesOptionsPage(OptionsPage):
ACTIVE = True
options = [
config.TextOption("setting", "release_type_scores", "Album 0.5 Single 0.5 EP 0.5 Compilation 0.5 Soundtrack 0.5 Spokenword 0.5 Interview 0.5 Audiobook 0.5 Live 0.5 Remix 0.5 Other 0.5"),
config.TextOption("setting", "release_type_scores", _release_type_scores),
config.ListOption("setting", "preferred_release_countries", []),
config.ListOption("setting", "preferred_release_formats", []),
]
_release_type_sliders = {}
def __init__(self, parent=None):
super(ReleasesOptionsPage, self).__init__(parent)
self.ui = Ui_ReleasesOptionsPage()
self.ui.setupUi(self)
self.ui.reset_preferred_types_btn.clicked.connect(self.reset_preferred_types)
self._release_type_sliders["Album"] = self.ui.prefer_album_score
self._release_type_sliders["Single"] = self.ui.prefer_single_score
self._release_type_sliders["EP"] = self.ui.prefer_ep_score
self._release_type_sliders["Compilation"] = self.ui.prefer_compilation_score
self._release_type_sliders["Soundtrack"] = self.ui.prefer_soundtrack_score
self._release_type_sliders["Spokenword"] = self.ui.prefer_spokenword_score
self._release_type_sliders["Interview"] = self.ui.prefer_interview_score
self._release_type_sliders["Audiobook"] = self.ui.prefer_audiobook_score
self._release_type_sliders["Live"] = self.ui.prefer_live_score
self._release_type_sliders["Remix"] = self.ui.prefer_remix_score
self._release_type_sliders["Other"] = self.ui.prefer_other_score
self._release_type_sliders = {}
def add_slider(name, griditer, context):
label = ugettext_attr(name, context)
self._release_type_sliders[name] = \
ReleaseTypeScore(self.ui.type_group,
self.ui.gridLayout,
label,
griditer.next())
griditer = RowColIter(len(RELEASE_PRIMARY_GROUPS) +
len(RELEASE_SECONDARY_GROUPS) + 1) # +1 for Reset button
for name in RELEASE_PRIMARY_GROUPS:
add_slider(name, griditer, context=u'release_group_primary_type')
for name in RELEASE_SECONDARY_GROUPS:
add_slider(name, griditer, context=u'release_group_secondary_type')
self.reset_preferred_types_btn = QtGui.QPushButton(self.ui.type_group)
self.reset_preferred_types_btn.setText(_("Reset all"))
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.reset_preferred_types_btn.sizePolicy().hasHeightForWidth())
self.reset_preferred_types_btn.setSizePolicy(sizePolicy)
r, c = griditer.next()
self.ui.gridLayout.addWidget(self.reset_preferred_types_btn, r, c, 1, 2)
self.reset_preferred_types_btn.clicked.connect(self.reset_preferred_types)
self.ui.add_countries.clicked.connect(self.add_preferred_countries)
self.ui.remove_countries.clicked.connect(self.remove_preferred_countries)
@@ -72,7 +144,8 @@ class ReleasesOptionsPage(OptionsPage):
def load(self):
scores = load_release_type_scores(config.setting["release_type_scores"])
for (release_type, release_type_slider) in self._release_type_sliders.iteritems():
release_type_slider.setValue(int(scores.get(release_type, 0.5) * 100))
release_type_slider.setValue(scores.get(release_type,
_DEFAULT_SCORE))
self._load_list_items("preferred_release_countries", RELEASE_COUNTRIES,
self.ui.country_list, self.ui.preferred_country_list)
@@ -82,7 +155,7 @@ class ReleasesOptionsPage(OptionsPage):
def save(self):
scores = {}
for (release_type, release_type_slider) in self._release_type_sliders.iteritems():
scores[release_type] = float(release_type_slider.value()) / 100.0
scores[release_type] = release_type_slider.value()
config.setting["release_type_scores"] = save_release_type_scores(scores)
self._save_list_items("preferred_release_countries", self.ui.preferred_country_list)
@@ -90,7 +163,7 @@ class ReleasesOptionsPage(OptionsPage):
def reset_preferred_types(self):
for release_type_slider in self._release_type_sliders.values():
release_type_slider.setValue(50)
release_type_slider.reset()
def add_preferred_countries(self):
self._move_selected_items(self.ui.country_list, self.ui.preferred_country_list)
@@ -114,7 +187,11 @@ class ReleasesOptionsPage(OptionsPage):
def _load_list_items(self, setting, source, list1, list2):
if setting == "preferred_release_countries":
source_list = [(c[0], ugettext_countries(c[1])) for c in source.items()]
source_list = [(c[0], ugettext_countries(c[1])) for c in
source.items()]
elif setting == "preferred_release_formats":
source_list = [(c[0], ugettext_attr(c[1], u"medium_format")) for c
in source.items()]
else:
source_list = [(c[0], _(c[1])) for c in source.items()]
source_list.sort(key=itemgetter(1), cmp=strcoll)

View File

@@ -21,113 +21,6 @@ class Ui_ReleasesOptionsPage(object):
self.gridLayout = QtGui.QGridLayout(self.type_group)
self.gridLayout.setVerticalSpacing(6)
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
self.label = QtGui.QLabel(self.type_group)
self.label.setObjectName(_fromUtf8("label"))
self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
self.prefer_album_score = QtGui.QSlider(self.type_group)
self.prefer_album_score.setMaximum(100)
self.prefer_album_score.setProperty("value", 50)
self.prefer_album_score.setOrientation(QtCore.Qt.Horizontal)
self.prefer_album_score.setObjectName(_fromUtf8("prefer_album_score"))
self.gridLayout.addWidget(self.prefer_album_score, 0, 1, 1, 1)
self.label_2 = QtGui.QLabel(self.type_group)
self.label_2.setObjectName(_fromUtf8("label_2"))
self.gridLayout.addWidget(self.label_2, 0, 2, 1, 1)
self.prefer_single_score = QtGui.QSlider(self.type_group)
self.prefer_single_score.setMaximum(100)
self.prefer_single_score.setProperty("value", 50)
self.prefer_single_score.setOrientation(QtCore.Qt.Horizontal)
self.prefer_single_score.setObjectName(_fromUtf8("prefer_single_score"))
self.gridLayout.addWidget(self.prefer_single_score, 0, 3, 1, 1)
self.label_3 = QtGui.QLabel(self.type_group)
self.label_3.setObjectName(_fromUtf8("label_3"))
self.gridLayout.addWidget(self.label_3, 0, 4, 1, 1)
self.prefer_ep_score = QtGui.QSlider(self.type_group)
self.prefer_ep_score.setMaximum(100)
self.prefer_ep_score.setProperty("value", 50)
self.prefer_ep_score.setOrientation(QtCore.Qt.Horizontal)
self.prefer_ep_score.setObjectName(_fromUtf8("prefer_ep_score"))
self.gridLayout.addWidget(self.prefer_ep_score, 0, 5, 1, 1)
self.label_7 = QtGui.QLabel(self.type_group)
self.label_7.setObjectName(_fromUtf8("label_7"))
self.gridLayout.addWidget(self.label_7, 1, 0, 1, 1)
self.prefer_compilation_score = QtGui.QSlider(self.type_group)
self.prefer_compilation_score.setMaximum(100)
self.prefer_compilation_score.setProperty("value", 50)
self.prefer_compilation_score.setOrientation(QtCore.Qt.Horizontal)
self.prefer_compilation_score.setObjectName(_fromUtf8("prefer_compilation_score"))
self.gridLayout.addWidget(self.prefer_compilation_score, 1, 1, 1, 1)
self.label_8 = QtGui.QLabel(self.type_group)
self.label_8.setObjectName(_fromUtf8("label_8"))
self.gridLayout.addWidget(self.label_8, 1, 2, 1, 1)
self.prefer_soundtrack_score = QtGui.QSlider(self.type_group)
self.prefer_soundtrack_score.setMaximum(100)
self.prefer_soundtrack_score.setProperty("value", 50)
self.prefer_soundtrack_score.setOrientation(QtCore.Qt.Horizontal)
self.prefer_soundtrack_score.setObjectName(_fromUtf8("prefer_soundtrack_score"))
self.gridLayout.addWidget(self.prefer_soundtrack_score, 1, 3, 1, 1)
self.label_9 = QtGui.QLabel(self.type_group)
self.label_9.setObjectName(_fromUtf8("label_9"))
self.gridLayout.addWidget(self.label_9, 1, 4, 1, 1)
self.prefer_spokenword_score = QtGui.QSlider(self.type_group)
self.prefer_spokenword_score.setMaximum(100)
self.prefer_spokenword_score.setProperty("value", 50)
self.prefer_spokenword_score.setOrientation(QtCore.Qt.Horizontal)
self.prefer_spokenword_score.setObjectName(_fromUtf8("prefer_spokenword_score"))
self.gridLayout.addWidget(self.prefer_spokenword_score, 1, 5, 1, 1)
self.label_10 = QtGui.QLabel(self.type_group)
self.label_10.setObjectName(_fromUtf8("label_10"))
self.gridLayout.addWidget(self.label_10, 2, 0, 1, 1)
self.prefer_interview_score = QtGui.QSlider(self.type_group)
self.prefer_interview_score.setMaximum(100)
self.prefer_interview_score.setProperty("value", 50)
self.prefer_interview_score.setOrientation(QtCore.Qt.Horizontal)
self.prefer_interview_score.setObjectName(_fromUtf8("prefer_interview_score"))
self.gridLayout.addWidget(self.prefer_interview_score, 2, 1, 1, 1)
self.label_11 = QtGui.QLabel(self.type_group)
self.label_11.setObjectName(_fromUtf8("label_11"))
self.gridLayout.addWidget(self.label_11, 2, 2, 1, 1)
self.prefer_audiobook_score = QtGui.QSlider(self.type_group)
self.prefer_audiobook_score.setMaximum(100)
self.prefer_audiobook_score.setProperty("value", 50)
self.prefer_audiobook_score.setOrientation(QtCore.Qt.Horizontal)
self.prefer_audiobook_score.setObjectName(_fromUtf8("prefer_audiobook_score"))
self.gridLayout.addWidget(self.prefer_audiobook_score, 2, 3, 1, 1)
self.label_12 = QtGui.QLabel(self.type_group)
self.label_12.setObjectName(_fromUtf8("label_12"))
self.gridLayout.addWidget(self.label_12, 2, 4, 1, 1)
self.prefer_live_score = QtGui.QSlider(self.type_group)
self.prefer_live_score.setMaximum(100)
self.prefer_live_score.setProperty("value", 50)
self.prefer_live_score.setOrientation(QtCore.Qt.Horizontal)
self.prefer_live_score.setObjectName(_fromUtf8("prefer_live_score"))
self.gridLayout.addWidget(self.prefer_live_score, 2, 5, 1, 1)
self.label_13 = QtGui.QLabel(self.type_group)
self.label_13.setObjectName(_fromUtf8("label_13"))
self.gridLayout.addWidget(self.label_13, 3, 0, 1, 1)
self.prefer_remix_score = QtGui.QSlider(self.type_group)
self.prefer_remix_score.setMaximum(100)
self.prefer_remix_score.setProperty("value", 50)
self.prefer_remix_score.setOrientation(QtCore.Qt.Horizontal)
self.prefer_remix_score.setObjectName(_fromUtf8("prefer_remix_score"))
self.gridLayout.addWidget(self.prefer_remix_score, 3, 1, 1, 1)
self.label_14 = QtGui.QLabel(self.type_group)
self.label_14.setObjectName(_fromUtf8("label_14"))
self.gridLayout.addWidget(self.label_14, 3, 2, 1, 1)
self.prefer_other_score = QtGui.QSlider(self.type_group)
self.prefer_other_score.setMaximum(100)
self.prefer_other_score.setSliderPosition(50)
self.prefer_other_score.setOrientation(QtCore.Qt.Horizontal)
self.prefer_other_score.setObjectName(_fromUtf8("prefer_other_score"))
self.gridLayout.addWidget(self.prefer_other_score, 3, 3, 1, 1)
self.reset_preferred_types_btn = QtGui.QPushButton(self.type_group)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.reset_preferred_types_btn.sizePolicy().hasHeightForWidth())
self.reset_preferred_types_btn.setSizePolicy(sizePolicy)
self.reset_preferred_types_btn.setObjectName(_fromUtf8("reset_preferred_types_btn"))
self.gridLayout.addWidget(self.reset_preferred_types_btn, 4, 5, 1, 1)
self.verticalLayout_3.addWidget(self.type_group)
self.country_group = QtGui.QGroupBox(ReleasesOptionsPage)
self.country_group.setObjectName(_fromUtf8("country_group"))
@@ -209,18 +102,6 @@ class Ui_ReleasesOptionsPage(object):
def retranslateUi(self, ReleasesOptionsPage):
self.type_group.setTitle(_("Preferred release types"))
self.label.setText(_("Album"))
self.label_2.setText(_("Single"))
self.label_3.setText(_("EP"))
self.label_7.setText(_("Compilation"))
self.label_8.setText(_("Soundtrack"))
self.label_9.setText(_("Spokenword"))
self.label_10.setText(_("Interview"))
self.label_11.setText(_("Audiobook"))
self.label_12.setText(_("Live"))
self.label_13.setText(_("Remix"))
self.label_14.setText(_("Other"))
self.reset_preferred_types_btn.setText(_("Reset all"))
self.country_group.setTitle(_("Preferred release countries"))
self.add_countries.setText(_(">"))
self.remove_countries.setText(_("<"))

View File

@@ -20,239 +20,6 @@
<property name="verticalSpacing">
<number>6</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Album</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSlider" name="prefer_album_score">
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>50</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Single</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QSlider" name="prefer_single_score">
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>50</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="QLabel" name="label_3">
<property name="text">
<string>EP</string>
</property>
</widget>
</item>
<item row="0" column="5">
<widget class="QSlider" name="prefer_ep_score">
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>50</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Compilation</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSlider" name="prefer_compilation_score">
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>50</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Soundtrack</string>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QSlider" name="prefer_soundtrack_score">
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>50</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="1" column="4">
<widget class="QLabel" name="label_9">
<property name="text">
<string>Spokenword</string>
</property>
</widget>
</item>
<item row="1" column="5">
<widget class="QSlider" name="prefer_spokenword_score">
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>50</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Interview</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSlider" name="prefer_interview_score">
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>50</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLabel" name="label_11">
<property name="text">
<string>Audiobook</string>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QSlider" name="prefer_audiobook_score">
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>50</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="2" column="4">
<widget class="QLabel" name="label_12">
<property name="text">
<string>Live</string>
</property>
</widget>
</item>
<item row="2" column="5">
<widget class="QSlider" name="prefer_live_score">
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>50</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_13">
<property name="text">
<string>Remix</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QSlider" name="prefer_remix_score">
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>50</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QLabel" name="label_14">
<property name="text">
<string>Other</string>
</property>
</widget>
</item>
<item row="3" column="3">
<widget class="QSlider" name="prefer_other_score">
<property name="maximum">
<number>100</number>
</property>
<property name="sliderPosition">
<number>50</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="4" column="5">
<widget class="QPushButton" name="reset_preferred_types_btn">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Reset all</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>