1
0
mirror of https://github.com/dguglielmi/sunny-overlay.git synced 2025-12-06 13:52:40 +01:00
Files
sunny-overlay/media-sound/mixxx/files/mixxx-2.1.0-fix-unresponsive-scrolling-through-crates-and-playlists-using-encoder.patch

282 lines
10 KiB
Diff

From 360f9881848ebba244338101fdf3e47e45e9ece8 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Tue, 17 Apr 2018 00:31:42 +0200
Subject: [PATCH] Fix unresponsive scrolling through crates & playlists with
encoder
---
src/library/baseplaylistfeature.cpp | 8 ++++++-
src/library/crate/cratefeature.cpp | 4 +++-
src/library/libraryfeature.cpp | 29 +++++++++++++++++++----
src/library/libraryfeature.h | 21 +++++++++++++----
src/library/sidebarmodel.cpp | 47 +++++++++++++++++++++++++++----------
src/library/sidebarmodel.h | 17 ++++++++++++--
6 files changed, 100 insertions(+), 26 deletions(-)
diff --git a/src/library/baseplaylistfeature.cpp b/src/library/baseplaylistfeature.cpp
index 2cfd68e974..c0506e458d 100644
--- a/src/library/baseplaylistfeature.cpp
+++ b/src/library/baseplaylistfeature.cpp
@@ -19,11 +19,17 @@
#include "widget/wlibrarytextbrowser.h"
#include "util/assert.h"
+namespace {
+
+const int kClickedChildActivationTimeoutMillis = 100;
+
+} // anonymous namespace
+
BasePlaylistFeature::BasePlaylistFeature(QObject* parent,
UserSettingsPointer pConfig,
TrackCollection* pTrackCollection,
QString rootViewName)
- : LibraryFeature(pConfig, parent),
+ : LibraryFeature(pConfig, kClickedChildActivationTimeoutMillis, parent),
m_pTrackCollection(pTrackCollection),
m_playlistDao(pTrackCollection->getPlaylistDAO()),
m_trackDao(pTrackCollection->getTrackDAO()),
diff --git a/src/library/crate/cratefeature.cpp b/src/library/crate/cratefeature.cpp
index 38c09b0eb8..da75522e39 100644
--- a/src/library/crate/cratefeature.cpp
+++ b/src/library/crate/cratefeature.cpp
@@ -29,6 +29,8 @@
namespace {
+const int kClickedChildActivationTimeoutMillis = 100;
+
QString formatLabel(
const CrateSummary& crateSummary) {
return QString("%1 (%2) %3").arg(
@@ -42,7 +44,7 @@ QString formatLabel(
CrateFeature::CrateFeature(Library* pLibrary,
TrackCollection* pTrackCollection,
UserSettingsPointer pConfig)
- : LibraryFeature(pConfig),
+ : LibraryFeature(pConfig, kClickedChildActivationTimeoutMillis),
m_cratesIcon(":/images/library/ic_library_crates.png"),
m_lockedCrateIcon(":/images/library/ic_library_locked.png"),
m_pTrackCollection(pTrackCollection),
diff --git a/src/library/libraryfeature.cpp b/src/library/libraryfeature.cpp
index efe20d2e9d..e582557370 100644
--- a/src/library/libraryfeature.cpp
+++ b/src/library/libraryfeature.cpp
@@ -6,18 +6,37 @@
// KEEP THIS cpp file to tell scons that moc should be called on the class!!!
// The reason for this is that LibraryFeature uses slots/signals and for this
// to work the code has to be precompiles by moc
-LibraryFeature::LibraryFeature(QObject *parent)
- : QObject(parent) {
+LibraryFeature::LibraryFeature(
+ QObject *parent)
+ : QObject(parent),
+ m_clickedChildActivationTimeoutMillis(0) {
}
-LibraryFeature::LibraryFeature(UserSettingsPointer pConfig, QObject* parent)
+LibraryFeature::LibraryFeature(
+ int clickedChildActivationTimeoutMillis,
+ QObject *parent)
: QObject(parent),
- m_pConfig(pConfig) {
+ m_clickedChildActivationTimeoutMillis(clickedChildActivationTimeoutMillis) {
+ DEBUG_ASSERT(m_clickedChildActivationTimeoutMillis >= 0);
}
-LibraryFeature::~LibraryFeature() {
+LibraryFeature::LibraryFeature(
+ UserSettingsPointer pConfig,
+ QObject* parent)
+ : QObject(parent),
+ m_pConfig(pConfig),
+ m_clickedChildActivationTimeoutMillis(0) {
+}
+LibraryFeature::LibraryFeature(
+ UserSettingsPointer pConfig,
+ int clickedChildActivationTimeoutMillis,
+ QObject* parent)
+ : QObject(parent),
+ m_pConfig(pConfig),
+ m_clickedChildActivationTimeoutMillis(clickedChildActivationTimeoutMillis) {
+ DEBUG_ASSERT(m_clickedChildActivationTimeoutMillis >= 0);
}
QStringList LibraryFeature::getPlaylistFiles(QFileDialog::FileMode mode) const {
diff --git a/src/library/libraryfeature.h b/src/library/libraryfeature.h
index 138d96c1aa..7639e03557 100644
--- a/src/library/libraryfeature.h
+++ b/src/library/libraryfeature.h
@@ -29,11 +29,23 @@ class KeyboardEventFilter;
class LibraryFeature : public QObject {
Q_OBJECT
public:
- LibraryFeature(QObject* parent = NULL);
+ explicit LibraryFeature(
+ QObject* parent);
+ explicit LibraryFeature(
+ int clickedChildActivationTimeoutMillis,
+ QObject* parent = nullptr);
+ explicit LibraryFeature(
+ UserSettingsPointer pConfig,
+ QObject* parent = nullptr);
+ explicit LibraryFeature(
+ UserSettingsPointer pConfig,
+ int clickedChildActivationTimeoutMillis,
+ QObject* parent = nullptr);
+ ~LibraryFeature() override = default;
- LibraryFeature(UserSettingsPointer pConfig,
- QObject* parent = NULL);
- virtual ~LibraryFeature();
+ int clickedChildActivationTimeoutMillis() const {
+ return m_clickedChildActivationTimeoutMillis;
+ }
virtual QVariant title() = 0;
virtual QIcon getIcon() = 0;
@@ -124,6 +136,7 @@ class LibraryFeature : public QObject {
private:
QStringList getPlaylistFiles(QFileDialog::FileMode mode) const;
+ const int m_clickedChildActivationTimeoutMillis;
};
#endif /* LIBRARYFEATURE_H */
diff --git a/src/library/sidebarmodel.cpp b/src/library/sidebarmodel.cpp
index e0943bb40f..c2bb5d198b 100644
--- a/src/library/sidebarmodel.cpp
+++ b/src/library/sidebarmodel.cpp
@@ -8,13 +8,14 @@
#include "library/browse/browsefeature.h"
#include "util/assert.h"
-SidebarModel::SidebarModel(QObject* parent)
+SidebarModel::SidebarModel(
+ QObject* parent)
: QAbstractItemModel(parent),
- m_iDefaultSelectedIndex(0) {
-}
-
-SidebarModel::~SidebarModel() {
-
+ m_iDefaultSelectedIndex(0),
+ m_clickedChildActivationTimer(new QTimer(this)),
+ m_clickedFeature(nullptr) {
+ m_clickedChildActivationTimer->setSingleShot(true);
+ connect(m_clickedChildActivationTimer, SIGNAL(timeout()), this, SLOT(slotActivateChildAtClickedFeatureIndex()));
}
void SidebarModel::addLibraryFeature(LibraryFeature* feature) {
@@ -221,6 +222,20 @@ QVariant SidebarModel::data(const QModelIndex& index, int role) const {
return QVariant();
}
+void SidebarModel::onFeatureIndexClicked(
+ LibraryFeature* feature,
+ QModelIndex index) {
+ m_clickedChildActivationTimer->stop();
+ m_clickedFeature = feature;
+ m_clickedIndex = index;
+}
+
+void SidebarModel::slotActivateChildAtClickedFeatureIndex() {
+ if (m_clickedFeature) {
+ m_clickedFeature->activateChild(m_clickedIndex);
+ }
+}
+
void SidebarModel::clicked(const QModelIndex& index) {
//qDebug() << "SidebarModel::clicked() index=" << index;
@@ -236,8 +251,12 @@ void SidebarModel::clicked(const QModelIndex& index) {
} else {
TreeItem* tree_item = (TreeItem*)index.internalPointer();
if (tree_item) {
- LibraryFeature* feature = tree_item->feature();
- feature->activateChild(index);
+ onFeatureIndexClicked(tree_item->feature(), index);
+ DEBUG_ASSERT(m_clickedFeature);
+ // Deferred activation is required for smooth scrolling when using
+ // encoder knobs
+ m_clickedChildActivationTimer->start(
+ m_clickedFeature->clickedChildActivationTimeoutMillis());
}
}
}
@@ -249,8 +268,9 @@ void SidebarModel::doubleClicked(const QModelIndex& index) {
} else {
TreeItem* tree_item = (TreeItem*)index.internalPointer();
if (tree_item) {
- LibraryFeature* feature = tree_item->feature();
- feature->onLazyChildExpandation(index);
+ onFeatureIndexClicked(tree_item->feature(), index);
+ DEBUG_ASSERT(m_clickedFeature);
+ m_clickedFeature->onLazyChildExpandation(m_clickedIndex);
}
}
}
@@ -267,9 +287,10 @@ void SidebarModel::rightClicked(const QPoint& globalPos, const QModelIndex& inde
{
TreeItem* tree_item = (TreeItem*)index.internalPointer();
if (tree_item) {
- LibraryFeature* feature = tree_item->feature();
- feature->activateChild(index);
- feature->onRightClickChild(globalPos, index);
+ onFeatureIndexClicked(tree_item->feature(), index);
+ DEBUG_ASSERT(m_clickedFeature);
+ m_clickedFeature->activateChild(m_clickedIndex);
+ m_clickedFeature->onRightClickChild(globalPos, m_clickedIndex);
}
}
}
diff --git a/src/library/sidebarmodel.h b/src/library/sidebarmodel.h
index 0040d2119d..17c3bb8cae 100644
--- a/src/library/sidebarmodel.h
+++ b/src/library/sidebarmodel.h
@@ -7,6 +7,7 @@
#include <QAbstractItemModel>
#include <QList>
#include <QModelIndex>
+#include <QTimer>
#include <QVariant>
class LibraryFeature;
@@ -14,8 +15,9 @@ class LibraryFeature;
class SidebarModel : public QAbstractItemModel {
Q_OBJECT
public:
- explicit SidebarModel(QObject* parent = 0);
- virtual ~SidebarModel();
+ explicit SidebarModel(
+ QObject* parent = nullptr);
+ ~SidebarModel() override = default;
void addLibraryFeature(LibraryFeature* feature);
QModelIndex getDefaultSelection();
@@ -64,11 +66,22 @@ class SidebarModel : public QAbstractItemModel {
signals:
void selectIndex(const QModelIndex& index);
+ private slots:
+ void slotActivateChildAtClickedFeatureIndex();
+
private:
QModelIndex translateSourceIndex(const QModelIndex& parent);
void featureRenamed(LibraryFeature*);
QList<LibraryFeature*> m_sFeatures;
unsigned int m_iDefaultSelectedIndex; /** Index of the item in the sidebar model to select at startup. */
+
+ QTimer* const m_clickedChildActivationTimer;
+ LibraryFeature* m_clickedFeature;
+ QModelIndex m_clickedIndex;
+
+ void onFeatureIndexClicked(
+ LibraryFeature* feature,
+ QModelIndex index);
};
#endif /* SIDEBARMODEL_H */