diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 648d229ff..10c543432 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -211,6 +211,7 @@ set(SOURCES library/libraryview.cpp library/libraryviewcontainer.cpp library/librarywatcher.cpp + library/savedgroupingmanager.cpp library/sqlrow.cpp musicbrainz/acoustidclient.cpp @@ -512,7 +513,8 @@ set(HEADERS library/libraryview.h library/libraryviewcontainer.h library/librarywatcher.h - + library/savedgroupingmanager.h + musicbrainz/acoustidclient.h musicbrainz/musicbrainzclient.h musicbrainz/tagfetcher.h @@ -699,6 +701,7 @@ set(UI library/libraryfilterwidget.ui library/librarysettingspage.ui library/libraryviewcontainer.ui + library/savedgroupingmanager.ui playlist/dynamicplaylistcontrols.ui playlist/playlistcontainer.ui diff --git a/src/library/libraryfilterwidget.cpp b/src/library/libraryfilterwidget.cpp index 542264ecb..5f938897b 100644 --- a/src/library/libraryfilterwidget.cpp +++ b/src/library/libraryfilterwidget.cpp @@ -102,6 +102,8 @@ LibraryFilterWidget::LibraryFilterWidget(QWidget* parent) SLOT(GroupByClicked(QAction*))); connect(ui_->save_grouping, SIGNAL(triggered()), this, SLOT(SaveGroupBy())); + connect(ui_->manage_groupings, SIGNAL(triggered()), this, + SLOT(ShowGroupingManager())); // Library config menu library_menu_ = new QMenu(tr("Display options"), this); @@ -109,6 +111,7 @@ LibraryFilterWidget::LibraryFilterWidget(QWidget* parent) library_menu_->addMenu(filter_age_menu_); library_menu_->addMenu(group_by_menu_); library_menu_->addAction(ui_->save_grouping); + library_menu_->addAction(ui_->manage_groupings); library_menu_->addSeparator(); ui_->options->setMenu(library_menu_); @@ -120,7 +123,7 @@ LibraryFilterWidget::~LibraryFilterWidget() { delete ui_; } void LibraryFilterWidget::UpdateGroupByActions() { if (group_by_group_) { - disconnect(group_by_group_,0,0,0); + disconnect(group_by_group_, 0, 0, 0); delete group_by_group_; } @@ -208,6 +211,15 @@ void LibraryFilterWidget::SaveGroupBy() { } } +void LibraryFilterWidget::ShowGroupingManager() { + if (!groupings_manager_) { + groupings_manager_.reset(new SavedGroupingManager); + } + groupings_manager_->SetFilter(this); + groupings_manager_->UpdateModel(); + groupings_manager_->show(); +} + void LibraryFilterWidget::FocusOnFilter(QKeyEvent* event) { ui_->filter->setFocus(); QApplication::sendEvent(ui_->filter, event); @@ -273,7 +285,8 @@ void LibraryFilterWidget::GroupingChanged(const LibraryModel::Grouping& g) { CheckCurrentGrouping(g); } -void LibraryFilterWidget::CheckCurrentGrouping(const LibraryModel::Grouping& g) { +void LibraryFilterWidget::CheckCurrentGrouping( + const LibraryModel::Grouping& g) { for (QAction* action : group_by_group_->actions()) { if (action->property("group_by").isNull()) continue; diff --git a/src/library/libraryfilterwidget.h b/src/library/libraryfilterwidget.h index dc6e48d14..27dd59ee8 100644 --- a/src/library/libraryfilterwidget.h +++ b/src/library/libraryfilterwidget.h @@ -23,6 +23,7 @@ #include #include "librarymodel.h" +#include "savedgroupingmanager.h" class GroupByDialog; class SettingsDialog; @@ -86,6 +87,7 @@ signals: void GroupingChanged(const LibraryModel::Grouping& g); void GroupByClicked(QAction* action); void SaveGroupBy(); + void ShowGroupingManager(); void FilterTextChanged(const QString& text); void FilterDelayTimeout(); @@ -100,6 +102,7 @@ signals: LibraryModel* model_; std::unique_ptr group_by_dialog_; + std::unique_ptr groupings_manager_; SettingsDialog* settings_dialog_; QMenu* filter_age_menu_; diff --git a/src/library/libraryfilterwidget.ui b/src/library/libraryfilterwidget.ui index facc5d2f6..2a1a1467a 100644 --- a/src/library/libraryfilterwidget.ui +++ b/src/library/libraryfilterwidget.ui @@ -103,6 +103,11 @@ Save current grouping + + + Manage saved groupings + + diff --git a/src/library/savedgroupingmanager.cpp b/src/library/savedgroupingmanager.cpp new file mode 100644 index 000000000..6ae69e077 --- /dev/null +++ b/src/library/savedgroupingmanager.cpp @@ -0,0 +1,152 @@ +/* This file is part of Clementine. + Copyright 2010, David Sansome + + Clementine 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 3 of the License, or + (at your option) any later version. + + Clementine 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 Clementine. If not, see . +*/ + +#include "libraryfilterwidget.h" +#include "librarymodel.h" +#include "savedgroupingmanager.h" +#include "ui_savedgroupingmanager.h" +#include "ui/iconloader.h" + +#include +#include +#include +#include + +SavedGroupingManager::SavedGroupingManager(QWidget* parent) + : QDialog(parent), + ui_(new Ui_SavedGroupingManager), + model_(new QStandardItemModel(0, 4, this)) { + ui_->setupUi(this); + + model_->setHorizontalHeaderItem(0, new QStandardItem(tr("Name"))); + model_->setHorizontalHeaderItem(1, new QStandardItem(tr("First level"))); + model_->setHorizontalHeaderItem(2, new QStandardItem(tr("Second Level"))); + model_->setHorizontalHeaderItem(3, new QStandardItem(tr("Third Level"))); + ui_->list->setModel(model_); + ui_->remove->setIcon(IconLoader::Load("edit-delete", IconLoader::Base)); + ui_->remove->setEnabled(false); + + ui_->remove->setShortcut(QKeySequence::Delete); + connect(ui_->list->selectionModel(), + SIGNAL(selectionChanged(QItemSelection, QItemSelection)), + SLOT(UpdateButtonState())); + + connect(ui_->remove, SIGNAL(clicked()), SLOT(Remove())); +} + +SavedGroupingManager::~SavedGroupingManager() { + delete ui_; + delete model_; +} + +QString SavedGroupingManager::GroupByToString(const LibraryModel::GroupBy& g) { + switch (g) { + case LibraryModel::GroupBy_None: { + return tr("None"); + } + case LibraryModel::GroupBy_Artist: { + return tr("Artist"); + } + case LibraryModel::GroupBy_Album: { + return tr("Album"); + } + case LibraryModel::GroupBy_YearAlbum: { + return tr("Year - Album"); + } + case LibraryModel::GroupBy_Year: { + return tr("Year"); + } + case LibraryModel::GroupBy_Composer: { + return tr("Composer"); + } + case LibraryModel::GroupBy_Genre: { + return tr("Genre"); + } + case LibraryModel::GroupBy_AlbumArtist: { + return tr("Album artist"); + } + case LibraryModel::GroupBy_FileType: { + return tr("File type"); + } + case LibraryModel::GroupBy_Performer: { + return tr("Performer"); + } + case LibraryModel::GroupBy_Grouping: { + return tr("Grouping"); + } + case LibraryModel::GroupBy_Bitrate: { + return tr("Bitrate"); + } + case LibraryModel::GroupBy_Disc: { + return tr("Disc"); + } + case LibraryModel::GroupBy_OriginalYearAlbum: { + return tr("Original year - Album"); + } + case LibraryModel::GroupBy_OriginalYear: { + return tr("Original year"); + } + default: { return tr("Unknown"); } + } +} + +void SavedGroupingManager::UpdateModel() { + model_->setRowCount(0); // don't use clear, it deletes headers + QSettings s; + s.beginGroup(LibraryModel::kSavedGroupingsSettingsGroup); + QStringList saved = s.childKeys(); + for (int i = 0; i < saved.size(); ++i) { + QByteArray bytes = s.value(saved.at(i)).toByteArray(); + QDataStream ds(&bytes, QIODevice::ReadOnly); + LibraryModel::Grouping g; + ds >> g; + + QList list; + list << new QStandardItem(saved.at(i)) + << new QStandardItem(GroupByToString(g.first)) + << new QStandardItem(GroupByToString(g.second)) + << new QStandardItem(GroupByToString(g.third)); + + model_->appendRow(list); + } +} + +void SavedGroupingManager::Remove() { + if (ui_->list->selectionModel()->hasSelection()) { + QSettings s; + s.beginGroup(LibraryModel::kSavedGroupingsSettingsGroup); + for (const QModelIndex& index : + ui_->list->selectionModel()->selectedRows()) { + if (index.isValid()) { + qLog(Debug) << "Remove saved grouping: " + << model_->item(index.row(), 0)->text(); + s.remove(model_->item(index.row(), 0)->text()); + } + } + } + UpdateModel(); + filter_->UpdateGroupByActions(); +} + +void SavedGroupingManager::UpdateButtonState() { + if (ui_->list->selectionModel()->hasSelection()) { + const QModelIndex current = ui_->list->selectionModel()->currentIndex(); + ui_->remove->setEnabled(current.isValid()); + } else { + ui_->remove->setEnabled(false); + } +} diff --git a/src/library/savedgroupingmanager.h b/src/library/savedgroupingmanager.h new file mode 100644 index 000000000..5f31a55f0 --- /dev/null +++ b/src/library/savedgroupingmanager.h @@ -0,0 +1,51 @@ +/* This file is part of Clementine. + Copyright 2015, Nick Lanham + + Clementine 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 3 of the License, or + (at your option) any later version. + + Clementine 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 Clementine. If not, see . +*/ + +#ifndef SAVEDGROUPINGMANAGER_H +#define SAVEDGROUPINGMANAGER_H + +#include +#include + +#include "librarymodel.h" + +class Ui_SavedGroupingManager; +class LibraryFilterWidget; + +class SavedGroupingManager : public QDialog { + Q_OBJECT + + public: + SavedGroupingManager(QWidget* parent = nullptr); + ~SavedGroupingManager(); + + void UpdateModel(); + void SetFilter(LibraryFilterWidget* filter) { filter_ = filter; } + + static QString GroupByToString(const LibraryModel::GroupBy& g); + + private slots: + void UpdateButtonState(); + void Remove(); + + private: + Ui_SavedGroupingManager* ui_; + QStandardItemModel* model_; + LibraryFilterWidget* filter_; +}; + +#endif // SAVEDGROUPINGMANAGER_H diff --git a/src/library/savedgroupingmanager.ui b/src/library/savedgroupingmanager.ui new file mode 100644 index 000000000..2b5faa5c5 --- /dev/null +++ b/src/library/savedgroupingmanager.ui @@ -0,0 +1,144 @@ + + + SavedGroupingManager + + + + 0 + 0 + 582 + 363 + + + + Saved Grouping Manager + + + + :/icon.png:/icon.png + + + + + + + + true + + + true + + + true + + + QAbstractItemView::DragDrop + + + Qt::MoveAction + + + true + + + QAbstractItemView::ExtendedSelection + + + QAbstractItemView::SelectRows + + + false + + + true + + + + + + + + + false + + + Remove + + + + 16 + 16 + + + + Ctrl+Up + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Close + + + + + + + + + + + buttonBox + accepted() + SavedGroupingManager + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + SavedGroupingManager + reject() + + + 316 + 260 + + + 286 + 274 + + + + +