diff options
author | Daniel Schürmann <daschuer@mixxx.org> | 2023-06-10 04:54:28 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-10 04:54:28 -0800 |
commit | 5e0656359b2cae6f78baf1078e0f0ced1ee779ae (patch) | |
tree | 3a372b89887c62c14d8dcc653855cdb8b981d448 | |
parent | 798c3087f274b495ba1ed26851bf37345f562ad8 (diff) | |
parent | 2f008d318cfad56955e08fa4a32e968293d4ec8a (diff) |
Merge pull request #11634 from ronso0/tracks-right-align-bpm-duration
library: right align BPM, duration & bitrate values
-rw-r--r-- | src/library/basetracktablemodel.cpp | 39 | ||||
-rw-r--r-- | src/library/basetracktablemodel.h | 7 | ||||
-rw-r--r-- | src/library/library_prefs.cpp | 5 | ||||
-rw-r--r-- | src/library/library_prefs.h | 2 | ||||
-rw-r--r-- | src/preferences/dialog/dlgpreflibrary.cpp | 66 | ||||
-rw-r--r-- | src/preferences/dialog/dlgpreflibrary.h | 3 | ||||
-rw-r--r-- | src/preferences/dialog/dlgpreflibrarydlg.ui | 42 | ||||
-rw-r--r-- | src/skin/legacy/legacyskinparser.cpp | 7 |
8 files changed, 146 insertions, 25 deletions
diff --git a/src/library/basetracktablemodel.cpp b/src/library/basetracktablemodel.cpp index bb13b45738..0d468637eb 100644 --- a/src/library/basetracktablemodel.cpp +++ b/src/library/basetracktablemodel.cpp @@ -92,6 +92,24 @@ QSqlDatabase cloneDatabase( } // anonymous namespace +// static +constexpr int BaseTrackTableModel::kBpmColumnPrecisionDefault; +constexpr int BaseTrackTableModel::kBpmColumnPrecisionMinimum; +constexpr int BaseTrackTableModel::kBpmColumnPrecisionMaximum; + +int BaseTrackTableModel::s_bpmColumnPrecision = + kBpmColumnPrecisionDefault; + +// static +void BaseTrackTableModel::setBpmColumnPrecision(int precision) { + VERIFY_OR_DEBUG_ASSERT(precision >= BaseTrackTableModel::kBpmColumnPrecisionMinimum) { + precision = BaseTrackTableModel::kBpmColumnPrecisionMinimum; + } + VERIFY_OR_DEBUG_ASSERT(precision <= BaseTrackTableModel::kBpmColumnPrecisionMaximum) { + precision = BaseTrackTableModel::kBpmColumnPrecisionMaximum; + } + s_bpmColumnPrecision = precision; +} //static QStringList BaseTrackTableModel::defaultTableColumns() { return kDefaultTableColumns; @@ -426,7 +444,8 @@ QVariant BaseTrackTableModel::data( role != Qt::EditRole && role != Qt::CheckStateRole && role != Qt::ToolTipRole && - role != kDataExportRole) { + role != kDataExportRole && + role != Qt::TextAlignmentRole) { return QVariant(); } @@ -571,6 +590,21 @@ QVariant BaseTrackTableModel::roleValue( break; } M_FALLTHROUGH_INTENDED; + // Right align BPM, duraation and bitrate so big/small values can easily be + // spotted by length (number of digits) + case Qt::TextAlignmentRole: { + switch (field) { + case ColumnCache::COLUMN_LIBRARYTABLE_BPM: + case ColumnCache::COLUMN_LIBRARYTABLE_DURATION: + case ColumnCache::COLUMN_LIBRARYTABLE_BITRATE: { + // We need to cast to int due to a bug similar to + // https://bugreports.qt.io/browse/QTBUG-67582 + return static_cast<int>(Qt::AlignVCenter | Qt::AlignRight); + } + default: + return QVariant(); // default AlignLeft for all other columns + } + } case Qt::DisplayRole: switch (field) { case ColumnCache::COLUMN_LIBRARYTABLE_DURATION: { @@ -688,7 +722,8 @@ QVariant BaseTrackTableModel::roleValue( if (role == Qt::ToolTipRole || role == kDataExportRole) { return QString::number(bpm.value(), 'f', 4); } else { - return QString::number(bpm.value(), 'f', 1); + // custom precision, set in DlgPrefLibrary + return QString::number(bpm.value(), 'f', s_bpmColumnPrecision); } } else { return QChar('-'); diff --git a/src/library/basetracktablemodel.h b/src/library/basetracktablemodel.h index cfb2a85d0b..9b258e3dce 100644 --- a/src/library/basetracktablemodel.h +++ b/src/library/basetracktablemodel.h @@ -97,6 +97,11 @@ class BaseTrackTableModel : public QAbstractTableModel, public TrackModel { const QString& mood) const override; #endif // __EXTRA_METADATA__ + static constexpr int kBpmColumnPrecisionDefault = 1; + static constexpr int kBpmColumnPrecisionMinimum = 0; + static constexpr int kBpmColumnPrecisionMaximum = 10; + static void setBpmColumnPrecision(int precision); + protected: static constexpr int defaultColumnWidth() { return 50; @@ -271,4 +276,6 @@ class BaseTrackTableModel : public QAbstractTableModel, public TrackModel { int countValidColumnHeaders() const; TrackId m_previewDeckTrackId; + + static int s_bpmColumnPrecision; }; diff --git a/src/library/library_prefs.cpp b/src/library/library_prefs.cpp index 050feb948c..bf8265f7cb 100644 --- a/src/library/library_prefs.cpp +++ b/src/library/library_prefs.cpp @@ -58,6 +58,11 @@ const ConfigKey mixxx::library::prefs::kEnableSearchHistoryShortcutsConfigKey = mixxx::library::prefs::kConfigGroup, QStringLiteral("EnableSearchHistoryShortcuts")}; +const ConfigKey mixxx::library::prefs::kBpmColumnPrecisionConfigKey = + ConfigKey{ + mixxx::library::prefs::kConfigGroup, + QStringLiteral("BpmColumnPrecision")}; + // The "Export" suffix in the key is kept for backward compatibility const ConfigKey mixxx::library::prefs::kSyncTrackMetadataConfigKey = ConfigKey{ diff --git a/src/library/library_prefs.h b/src/library/library_prefs.h index 026c15bc45..b6f9f91f4f 100644 --- a/src/library/library_prefs.h +++ b/src/library/library_prefs.h @@ -24,6 +24,8 @@ extern const ConfigKey kEnableSearchCompletionsConfigKey; extern const ConfigKey kEnableSearchHistoryShortcutsConfigKey; +extern const ConfigKey kBpmColumnPrecisionConfigKey; + extern const ConfigKey kEditMetadataSelectedClickConfigKey; extern const ConfigKey kHistoryMinTracksToKeepConfigKey; diff --git a/src/preferences/dialog/dlgpreflibrary.cpp b/src/preferences/dialog/dlgpreflibrary.cpp index cd4c789d42..074a65b981 100644 --- a/src/preferences/dialog/dlgpreflibrary.cpp +++ b/src/preferences/dialog/dlgpreflibrary.cpp @@ -12,6 +12,7 @@ #include <QUrl> #include "defs_urls.h" +#include "library/basetracktablemodel.h" #include "library/dlgtrackmetadataexport.h" #include "library/library.h" #include "library/library_prefs.h" @@ -78,13 +79,15 @@ DlgPrefLibrary::DlgPrefLibrary( this, &DlgPrefLibrary::slotRowHeightValueChanged); + spinbox_bpm_precision->setMinimum(BaseTrackTableModel::kBpmColumnPrecisionMinimum); + spinbox_bpm_precision->setMaximum(BaseTrackTableModel::kBpmColumnPrecisionMaximum); + connect(spinbox_bpm_precision, + QOverload<int>::of(&QSpinBox::valueChanged), + this, + &DlgPrefLibrary::slotBpmColumnPrecisionChanged); + searchDebouncingTimeoutSpinBox->setMinimum(WSearchLineEdit::kMinDebouncingTimeoutMillis); searchDebouncingTimeoutSpinBox->setMaximum(WSearchLineEdit::kMaxDebouncingTimeoutMillis); - const auto searchDebouncingTimeoutMillis = - m_pConfig->getValue( - kSearchDebouncingTimeoutMillisConfigKey, - WSearchLineEdit::kDefaultDebouncingTimeoutMillis); - searchDebouncingTimeoutSpinBox->setValue(searchDebouncingTimeoutMillis); connect(searchDebouncingTimeoutSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), this, @@ -131,12 +134,37 @@ DlgPrefLibrary::DlgPrefLibrary( this, &DlgPrefLibrary::slotSyncTrackMetadataToggled); + // Avoid undesired spinbox value changes while scrolling the preferences page + setFocusPolicyInstallEventFilter(spinbox_bpm_precision); + setFocusPolicyInstallEventFilter(spinbox_history_track_duplicate_distance); + setFocusPolicyInstallEventFilter(spinbox_history_min_tracks_to_keep); + setFocusPolicyInstallEventFilter(spinBoxRowHeight); + setFocusPolicyInstallEventFilter(searchDebouncingTimeoutSpinBox); + // Initialize the controls after all slots have been connected slotUpdate(); } DlgPrefLibrary::~DlgPrefLibrary() = default; +void DlgPrefLibrary::setFocusPolicyInstallEventFilter(QSpinBox* box) { + box->setFocusPolicy(Qt::StrongFocus); + box->installEventFilter(this); +} + +// Catch scroll events over spinboxes and pass them to the scroll area instead. +bool DlgPrefLibrary::eventFilter(QObject* obj, QEvent* e) { + if (e->type() == QEvent::Wheel) { + // Reject scrolling only if widget is unfocused. + // Object to widget cast is needed to check the focus state. + QSpinBox* spin = qobject_cast<QSpinBox*>(obj); + if (spin && !spin->hasFocus()) { + QApplication::sendEvent(verticalLayout, e); + return true; + } + } + return QObject::eventFilter(obj, e); +} void DlgPrefLibrary::slotShow() { m_bAddedDirectory = false; } @@ -199,14 +227,12 @@ void DlgPrefLibrary::slotResetToDefaults() { checkBox_SyncTrackMetadata->setChecked(false); checkBox_SeratoMetadataExport->setChecked(false); checkBox_use_relative_path->setChecked(false); - checkBox_show_rhythmbox->setChecked(true); - checkBox_show_banshee->setChecked(true); - checkBox_show_itunes->setChecked(true); - checkBox_show_traktor->setChecked(true); - checkBox_show_rekordbox->setChecked(true); checkBoxEditMetadataSelectedClicked->setChecked(kEditMetadataSelectedClickDefault); radioButton_dbclick_deck->setChecked(true); + spinbox_bpm_precision->setValue(BaseTrackTableModel::kBpmColumnPrecisionDefault); + radioButton_cover_art_fetcher_medium->setChecked(true); + spinBoxRowHeight->setValue(Library::kDefaultRowHeightPx); setLibraryFont(QApplication::font()); searchDebouncingTimeoutSpinBox->setValue( @@ -214,6 +240,12 @@ void DlgPrefLibrary::slotResetToDefaults() { checkBoxEnableSearchCompletions->setChecked(WSearchLineEdit::kCompletionsEnabledDefault); checkBoxEnableSearchHistoryShortcuts->setChecked( WSearchLineEdit::kHistoryShortcutsEnabledDefault); + + checkBox_show_rhythmbox->setChecked(true); + checkBox_show_banshee->setChecked(true); + checkBox_show_itunes->setChecked(true); + checkBox_show_traktor->setChecked(true); + checkBox_show_rekordbox->setChecked(true); } void DlgPrefLibrary::slotUpdate() { @@ -299,11 +331,18 @@ void DlgPrefLibrary::slotUpdate() { m_iOriginalTrackTableRowHeight = m_pLibrary->getTrackTableRowHeight(); spinBoxRowHeight->setValue(m_iOriginalTrackTableRowHeight); setLibraryFont(m_originalTrackTableFont); + const auto searchDebouncingTimeoutMillis = m_pConfig->getValue( kSearchDebouncingTimeoutMillisConfigKey, WSearchLineEdit::kDefaultDebouncingTimeoutMillis); searchDebouncingTimeoutSpinBox->setValue(searchDebouncingTimeoutMillis); + + const auto bpmColumnPrecision = + m_pConfig->getValue( + kBpmColumnPrecisionConfigKey, + BaseTrackTableModel::kBpmColumnPrecisionDefault); + spinbox_bpm_precision->setValue(bpmColumnPrecision); } void DlgPrefLibrary::slotCancel() { @@ -550,6 +589,13 @@ void DlgPrefLibrary::updateSearchLineEditHistoryOptions() { WSearchLineEdit::kHistoryShortcutsEnabledDefault)); } +void DlgPrefLibrary::slotBpmColumnPrecisionChanged(int bpmPrecision) { + m_pConfig->setValue( + kBpmColumnPrecisionConfigKey, + bpmPrecision); + BaseTrackTableModel::setBpmColumnPrecision(bpmPrecision); +} + void DlgPrefLibrary::slotSyncTrackMetadataToggled() { if (isVisible() && checkBox_SyncTrackMetadata->isChecked()) { mixxx::DlgTrackMetadataExport::showMessageBoxOncePerSession(); diff --git a/src/preferences/dialog/dlgpreflibrary.h b/src/preferences/dialog/dlgpreflibrary.h index 1dee5dcf9a..3f767c8300 100644 --- a/src/preferences/dialog/dlgpreflibrary.h +++ b/src/preferences/dialog/dlgpreflibrary.h @@ -61,9 +61,12 @@ class DlgPrefLibrary : public DlgPreferencePage, public Ui::DlgPrefLibraryDlg { void slotSelectFont(); void slotSyncTrackMetadataToggled(); void slotSearchDebouncingTimeoutMillisChanged(int); + void slotBpmColumnPrecisionChanged(int bpmPrecision); void slotSeratoMetadataExportClicked(bool); private: + void setFocusPolicyInstallEventFilter(QSpinBox* box); + bool eventFilter(QObject* object, QEvent* event) override; void initializeDirList(); void setLibraryFont(const QFont& font); void updateSearchLineEditHistoryOptions(); diff --git a/src/preferences/dialog/dlgpreflibrarydlg.ui b/src/preferences/dialog/dlgpreflibrarydlg.ui index f0f0d5bcf6..8a558a7a74 100644 --- a/src/preferences/dialog/dlgpreflibrarydlg.ui +++ b/src/preferences/dialog/dlgpreflibrarydlg.ui @@ -153,7 +153,7 @@ </property> <layout class="QGridLayout" name="gridLayout_track_table_view"> - <item row="1" column="0" colspan="2"> + <item row="1" column="0" colspan="3"> <widget class="QCheckBox" name="checkBoxEditMetadataSelectedClicked"> <property name="text"> <string>Edit metadata after clicking selected track</string> @@ -161,7 +161,7 @@ </widget> </item> - <item row="2" column="0"> + <item row="2" column="0" colspan="3"> <widget class="QLabel" name="doubeClickActionLabel"> <property name="text"> <string>Track Double-Click Action:</string> @@ -172,7 +172,7 @@ </widget> </item> - <item row="3" column="0"> + <item row="3" column="0" colspan="3"> <widget class="QRadioButton" name="radioButton_dbclick_deck"> <property name="text"> <string>Load track to next available deck</string> @@ -182,21 +182,21 @@ </property> </widget> </item> - <item row="4" column="0"> + <item row="4" column="0" colspan="3"> <widget class="QRadioButton" name="radioButton_dbclick_bottom"> <property name="text"> <string>Add track to Auto DJ queue (bottom)</string> </property> </widget> </item> - <item row="5" column="0"> + <item row="5" column="0" colspan="3"> <widget class="QRadioButton" name="radioButton_dbclick_top"> <property name="text"> <string>Add track to Auto DJ queue (top)</string> </property> </widget> </item> - <item row="6" column="0"> + <item row="6" column="0" colspan="3"> <widget class="QRadioButton" name="radioButton_dbclick_ignore"> <property name="text"> <string>Ignore</string> @@ -204,6 +204,21 @@ </widget> </item> + <item row="7" column="0"> + <widget class="QLabel" name="bpmPrecisionLabel"> + <property name="text"> + <string>BPM display precision:</string> + </property> + <property name="alignment"> + <set>Qt::AlignLeft|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="7" column="1" colspan="2"> + <widget class="QSpinBox" name="spinbox_bpm_precision"> + </widget> + </item> + </layout> </widget> </item><!-- Track Table View --> @@ -215,7 +230,7 @@ </property> <layout class="QGridLayout" name="gridLayout_history"> - <item row="1" column="0" colspan="2"> + <item row="1" column="0"> <widget class="QLabel" name="label_history_track_duplicate_distance"> <property name="text"> <string>Track duplicate distance</string> @@ -228,7 +243,7 @@ </property> </widget> </item> - <item row="1" column="2"> + <item row="1" column="1" colspan="2"> <widget class="QSpinBox" name="spinbox_history_track_duplicate_distance"> <property name="toolTip"> <string>When playing a track again log it to the session history only if more than N other tracks have been played in the meantime</string> @@ -245,7 +260,7 @@ </widget> </item> - <item row="2" column="0" colspan="2"> + <item row="2" column="0"> <widget class="QLabel" name="label_history_cleanup"> <property name="toolTip"> <string>History playlist with less than N tracks will be deleted<br/><br/>Note: the cleanup will be performed during startup and shutdown of Mixxx.</string> @@ -258,7 +273,7 @@ </property> </widget> </item> - <item row="2" column="2"> + <item row="2" column="1" colspan="2"> <widget class="QSpinBox" name="spinbox_history_min_tracks_to_keep"> <property name="minimum"> <number>1</number> @@ -297,7 +312,7 @@ <string>Library Row Height:</string> </property> <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + <set>Qt::AlignLeft|Qt::AlignVCenter</set> </property> </widget> </item> @@ -324,7 +339,7 @@ <string>Library Font:</string> </property> <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + <set>Qt::AlignLeft|Qt::AlignVCenter</set> </property> </widget> </item> @@ -349,7 +364,7 @@ <string>Search-as-you-type timeout:</string> </property> <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + <set>Qt::AlignLeft|Qt::AlignVCenter</set> </property> </widget> </item> @@ -608,6 +623,7 @@ <tabstop>radioButton_dbclick_bottom</tabstop> <tabstop>radioButton_dbclick_top</tabstop> <tabstop>radioButton_dbclick_ignore</tabstop> + <tabstop>bpmPrecisionSpinBox</tabstop> <tabstop>spinbox_history_track_duplicate_distance</tabstop> <tabstop>spinbox_history_min_tracks_to_keep</tabstop> <tabstop>checkBox_use_relative_path</tabstop> diff --git a/src/skin/legacy/legacyskinparser.cpp b/src/skin/legacy/legacyskinparser.cpp index e6810be402..9804fd8885 100644 --- a/src/skin/legacy/legacyskinparser.cpp +++ b/src/skin/legacy/legacyskinparser.cpp @@ -15,6 +15,7 @@ #include "controllers/controllermanager.h" #include "controllers/keyboard/keyboardeventfilter.h" #include "effects/effectsmanager.h" +#include "library/basetracktablemodel.h" #include "library/library.h" #include "library/library_prefs.h" #include "mixer/basetrackplayer.h" @@ -1537,6 +1538,12 @@ QWidget* LegacySkinParser::parseLibrary(const QDomElement& node) { pLibraryWidget->installEventFilter(m_pControllerManager->getControllerLearningEventFilter()); pLibraryWidget->setup(node, *m_pContext); + const auto bpmColumnPrecision = + m_pConfig->getValue( + mixxx::library::prefs::kBpmColumnPrecisionConfigKey, + BaseTrackTableModel::kBpmColumnPrecisionDefault); + BaseTrackTableModel::setBpmColumnPrecision(bpmColumnPrecision); + // Connect Library search signals to the WLibrary connect(m_pLibrary, &Library::search, |