diff --git a/build/depends.py b/build/depends.py
index a0539700921..d5e05d47dd0 100644
--- a/build/depends.py
+++ b/build/depends.py
@@ -630,6 +630,8 @@ def sources(self, build):
"controllers/dlgprefcontrollers.cpp",
"dialog/dlgabout.cpp",
"dialog/dlgdevelopertools.cpp",
+ "dialog/savedqueries/dlgsavedquerieseditor.cpp",
+ "dialog/savedqueries/savedqueriestablemodel.cpp",
"preferences/configobject.cpp",
"preferences/dialog/dlgprefautodj.cpp",
@@ -828,6 +830,13 @@ def sources(self, build):
"widget/wcoverartmenu.cpp",
"widget/wsingletoncontainer.cpp",
"widget/wmainmenubar.cpp",
+ "widget/wbuttonbar.cpp",
+ "widget/wfeatureclickbutton.cpp",
+ "widget/wlibrarystack.cpp",
+ "widget/wlibrarybreadcrumb.cpp",
+ "widget/wminiviewscrollbar.cpp",
+ "widget/wverticalscrollarea.cpp",
+ "widget/wtristatebutton.cpp",
"musicbrainz/network.cpp",
"musicbrainz/tagfetcher.cpp",
@@ -840,7 +849,8 @@ def sources(self, build):
"widget/wtracktableview.cpp",
"widget/wtracktableviewheader.cpp",
"widget/wlibrarysidebar.cpp",
- "widget/wlibrary.cpp",
+ "widget/wlibrarypane.cpp",
+ "widget/wbaselibrary.cpp",
"widget/wlibrarytableview.cpp",
"widget/wanalysislibrarytableview.cpp",
"widget/wlibrarytextbrowser.cpp",
@@ -851,62 +861,80 @@ def sources(self, build):
"library/librarytablemodel.cpp",
"library/searchquery.cpp",
"library/searchqueryparser.cpp",
- "library/analysislibrarytablemodel.cpp",
- "library/missingtablemodel.cpp",
- "library/hiddentablemodel.cpp",
"library/proxytrackmodel.cpp",
"library/coverart.cpp",
"library/coverartcache.cpp",
"library/coverartutils.cpp",
- "library/playlisttablemodel.cpp",
"library/libraryfeature.cpp",
- "library/analysisfeature.cpp",
- "library/autodj/autodjfeature.cpp",
- "library/autodj/autodjprocessor.cpp",
"library/dao/directorydao.cpp",
- "library/mixxxlibraryfeature.cpp",
- "library/baseplaylistfeature.cpp",
- "library/playlistfeature.cpp",
- "library/setlogfeature.cpp",
- "library/autodj/dlgautodj.cpp",
- "library/dlganalysis.cpp",
"library/dlgcoverartfullsize.cpp",
- "library/dlghidden.cpp",
- "library/dlgmissing.cpp",
"library/dlgtagfetcher.cpp",
"library/dlgtrackinfo.cpp",
-
- "library/browse/browsetablemodel.cpp",
- "library/browse/browsethread.cpp",
- "library/browse/browsefeature.cpp",
- "library/browse/foldertreemodel.cpp",
+ "library/dao/savedqueriesdao.cpp",
"library/export/trackexportdlg.cpp",
"library/export/trackexportwizard.cpp",
"library/export/trackexportworker.cpp",
- "library/recording/recordingfeature.cpp",
- "library/recording/dlgrecording.cpp",
"recording/recordingmanager.cpp",
"engine/sidechain/enginerecord.cpp",
+ # Library Features
+ "library/features/analysis/analysisfeature.cpp",
+ "library/features/analysis/analysislibrarytablemodel.cpp",
+ "library/features/analysis/dlganalysis.cpp",
+
+ "library/features/autodj/autodjfeature.cpp",
+ "library/features/autodj/autodjprocessor.cpp",
+ "library/features/autodj/dlgautodj.cpp",
+
+ "library/features/banshee/bansheedbconnection.cpp",
+ "library/features/banshee/bansheefeature.cpp",
+ "library/features/banshee/bansheeplaylistmodel.cpp",
+
+ "library/features/baseplaylist/baseplaylistfeature.cpp",
+
+ "library/features/browse/browsefeature.cpp",
+ "library/features/browse/browsetablemodel.cpp",
+ "library/features/browse/browsethread.cpp",
+ "library/features/browse/foldertreemodel.cpp",
+
+ "library/features/crates/cratefeature.cpp",
+ "library/features/crates/cratetablemodel.cpp",
+
+ "library/features/history/historyfeature.cpp",
+ "library/features/history/historytreemodel.cpp",
+
+ "library/features/libraryfolder/libraryfoldermodel.cpp",
+ "library/features/libraryfolder/libraryfoldersfeature.cpp",
+
+ "library/features/maintenance/dlghidden.cpp",
+ "library/features/maintenance/dlgmissing.cpp",
+ "library/features/maintenance/hiddentablemodel.cpp",
+ "library/features/maintenance/maintenancefeature.cpp",
+ "library/features/maintenance/missingtablemodel.cpp",
+
+ "library/features/mixxxlibrary/mixxxlibraryfeature.cpp",
+ "library/features/mixxxlibrary/mixxxlibrarytreemodel.cpp",
+
+ "library/features/playlist/playlistfeature.cpp",
+ "library/features/playlist/playlisttablemodel.cpp",
+
# External Library Features
- "library/baseexternallibraryfeature.cpp",
- "library/baseexternaltrackmodel.cpp",
- "library/baseexternalplaylistmodel.cpp",
- "library/rhythmbox/rhythmboxfeature.cpp",
-
- "library/banshee/bansheefeature.cpp",
- "library/banshee/bansheeplaylistmodel.cpp",
- "library/banshee/bansheedbconnection.cpp",
-
- "library/itunes/itunesfeature.cpp",
- "library/traktor/traktorfeature.cpp",
-
- "library/cratefeature.cpp",
- "library/sidebarmodel.cpp",
+ "library/features/baseexternalfeature/baseexternallibraryfeature.cpp",
+ "library/features/baseexternalfeature/baseexternalplaylistmodel.cpp",
+ "library/features/baseexternalfeature/baseexternaltrackmodel.cpp",
+
+ "library/features/itunes/itunesfeature.cpp",
+ "library/features/recording/dlgrecording.cpp",
+ "library/features/recording/recordingfeature.cpp",
+ "library/features/rhythmbox/rhythmboxfeature.cpp",
+ "library/features/traktor/traktorfeature.cpp",
+
"library/library.cpp",
+ "library/librarypanemanager.cpp",
+ "library/librarysidebarexpandedmanager.cpp",
"library/scanner/libraryscanner.cpp",
"library/scanner/libraryscannerdlg.cpp",
@@ -915,7 +943,6 @@ def sources(self, build):
"library/scanner/recursivescandirectorytask.cpp",
"library/dao/cratedao.cpp",
- "library/cratetablemodel.cpp",
"library/dao/cuedao.cpp",
"library/dao/cue.cpp",
"library/dao/trackdao.cpp",
@@ -1075,6 +1102,7 @@ def sources(self, build):
"util/logging.cpp",
"util/cmdlineargs.cpp",
"util/audiosignal.cpp",
+ "util/stringhelper.cpp",
'#res/mixxx.qrc'
]
@@ -1099,15 +1127,16 @@ def sources(self, build):
'controllers/dlgprefcontrollersdlg.ui',
'dialog/dlgaboutdlg.ui',
'dialog/dlgdevelopertoolsdlg.ui',
- 'library/autodj/dlgautodj.ui',
- 'library/dlganalysis.ui',
+ 'dialog/savedqueries/dlgsavedquerieseditor.ui',
'library/dlgcoverartfullsize.ui',
- 'library/dlghidden.ui',
- 'library/dlgmissing.ui',
'library/dlgtagfetcher.ui',
'library/dlgtrackinfo.ui',
'library/export/dlgtrackexport.ui',
- 'library/recording/dlgrecording.ui',
+ 'library/features/analysis/dlganalysis.ui',
+ 'library/features/autodj/dlgautodj.ui',
+ 'library/features/maintenance/dlghidden.ui',
+ 'library/features/maintenance/dlgmissing.ui',
+ 'library/features/recording/dlgrecording.ui',
'preferences/dialog/dlgprefautodjdlg.ui',
'preferences/dialog/dlgprefbeatsdlg.ui',
'preferences/dialog/dlgprefcontrolsdlg.ui',
diff --git a/res/images/library/ic_library_folder.png b/res/images/library/ic_library_folder.png
new file mode 100644
index 00000000000..1c91df56502
Binary files /dev/null and b/res/images/library/ic_library_folder.png differ
diff --git a/res/images/library/ic_library_lockpreselect.png b/res/images/library/ic_library_lockpreselect.png
new file mode 100644
index 00000000000..629097f13cb
Binary files /dev/null and b/res/images/library/ic_library_lockpreselect.png differ
diff --git a/res/images/library/ic_library_maintenance.png b/res/images/library/ic_library_maintenance.png
new file mode 100644
index 00000000000..58b68c9e9b1
Binary files /dev/null and b/res/images/library/ic_library_maintenance.png differ
diff --git a/res/images/library/ic_library_notpreselect.png b/res/images/library/ic_library_notpreselect.png
new file mode 100644
index 00000000000..705eb81942c
Binary files /dev/null and b/res/images/library/ic_library_notpreselect.png differ
diff --git a/res/images/library/ic_library_pinned.png b/res/images/library/ic_library_pinned.png
new file mode 100644
index 00000000000..e296c37ba31
Binary files /dev/null and b/res/images/library/ic_library_pinned.png differ
diff --git a/res/images/library/ic_library_preselect.png b/res/images/library/ic_library_preselect.png
new file mode 100644
index 00000000000..edd51930993
Binary files /dev/null and b/res/images/library/ic_library_preselect.png differ
diff --git a/res/mixxx.qrc b/res/mixxx.qrc
index ec6c2b8c785..d2f8c4412e4 100644
--- a/res/mixxx.qrc
+++ b/res/mixxx.qrc
@@ -108,5 +108,15 @@
translations/mixxx_uz.qm
translations/mixxx_zh_CN.qm
translations/mixxx_zh_TW.qm
+ images/library/ic_library_maintenance.png
+ images/library/ic_library_folder.png
+ skins/save.png
+ skins/downArrow.png
+ skins/cross_2.png
+ skins/save_disabled.png
+ images/library/ic_library_preselect.png
+ images/library/ic_library_notpreselect.png
+ images/library/ic_library_lockpreselect.png
+ images/library/ic_library_pinned.png
diff --git a/res/schema.xml b/res/schema.xml
index e58c8033f68..36da5556791 100644
--- a/res/schema.xml
+++ b/res/schema.xml
@@ -426,4 +426,24 @@ METADATA
ALTER TABLE cues ADD COLUMN color INTEGER DEFAULT 4294901760 NOT NULL;
+
+
+ Add new savedQueries table to store the saved queries for each
+ library feature
+
+
+ CREATE TABLE IF NOT EXISTS savedQueries (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ libraryFeature TEXT,
+ query TEXT,
+ title TEXT,
+ selectedItems TEXT,
+ sortOrder TEXT,
+ vScrollbarPos INTEGER,
+ sortColumn INTEGER,
+ sortAscendingOrder NUMERIC,
+ pinned NUMERIC
+ );
+
+
diff --git a/res/skins/Deere/image/style_sort_down.svg b/res/skins/Deere/image/style_sort_down.svg
index dcfc197e736..96d0b84931d 100644
--- a/res/skins/Deere/image/style_sort_down.svg
+++ b/res/skins/Deere/image/style_sort_down.svg
@@ -1,5 +1,60 @@
-