mirror of
https://github.com/clementine-player/Clementine
synced 2025-01-29 10:39:47 +01:00
Add more song-related things to the device menu
This commit is contained in:
parent
fc5929b79b
commit
94b1edde2f
@ -115,18 +115,29 @@ DeviceView::DeviceView(QWidget* parent)
|
||||
merged_model_(NULL),
|
||||
sort_model_(NULL),
|
||||
properties_dialog_(new DeviceProperties),
|
||||
menu_(new QMenu(this))
|
||||
device_menu_(new QMenu(this)),
|
||||
library_menu_(new QMenu(this))
|
||||
{
|
||||
connect_action_ = menu_->addAction(
|
||||
// Device menu items
|
||||
connect_action_ = device_menu_->addAction(
|
||||
IconLoader::Load("list-add"), tr("Connect device"), this, SLOT(Connect()));
|
||||
disconnect_action_ = menu_->addAction(
|
||||
disconnect_action_ = device_menu_->addAction(
|
||||
IconLoader::Load("list-remove"), tr("Disconnect device"), this, SLOT(Disconnect()));
|
||||
forget_action_ = menu_->addAction(
|
||||
forget_action_ = device_menu_->addAction(
|
||||
IconLoader::Load("list-remove"), tr("Forget device"), this, SLOT(Forget()));
|
||||
menu_->addSeparator();
|
||||
properties_action_ = menu_->addAction(
|
||||
device_menu_->addSeparator();
|
||||
properties_action_ = device_menu_->addAction(
|
||||
IconLoader::Load("configure"), tr("Device properties..."), this, SLOT(Properties()));
|
||||
|
||||
// Library menu items
|
||||
load_action_ = library_menu_->addAction(IconLoader::Load("media-playback-start"),
|
||||
tr("Load"), this, SLOT(Load()));
|
||||
add_to_playlist_action_ = library_menu_->addAction(IconLoader::Load("media-playback-start"),
|
||||
tr("Add to playlist"), this, SLOT(AddToPlaylist()));
|
||||
library_menu_->addSeparator();
|
||||
delete_action_ = library_menu_->addAction(IconLoader::Load("edit-delete"),
|
||||
tr("Delete from disk..."), this, SLOT(Delete()));
|
||||
|
||||
setItemDelegate(new DeviceItemDelegate(this));
|
||||
SetExpandOnReset(false);
|
||||
}
|
||||
@ -158,19 +169,26 @@ void DeviceView::SetDeviceManager(DeviceManager *manager) {
|
||||
|
||||
void DeviceView::contextMenuEvent(QContextMenuEvent* e) {
|
||||
menu_index_ = currentIndex();
|
||||
QModelIndex device_index = MapToDevice(menu_index_);
|
||||
bool is_device = device_index.isValid();
|
||||
bool is_connected = is_device && manager_->GetConnectedDevice(device_index.row());
|
||||
bool is_plugged_in = is_device && manager_->GetLister(device_index.row());
|
||||
bool is_remembered = is_device && manager_->GetDatabaseId(device_index.row()) != -1;
|
||||
|
||||
connect_action_->setEnabled(is_plugged_in);
|
||||
disconnect_action_->setEnabled(is_plugged_in);
|
||||
connect_action_->setVisible(!is_connected);
|
||||
disconnect_action_->setVisible(is_connected);
|
||||
forget_action_->setEnabled(is_remembered);
|
||||
const QModelIndex device_index = MapToDevice(menu_index_);
|
||||
const QModelIndex library_index = MapToLibrary(menu_index_);
|
||||
|
||||
menu_->popup(e->globalPos());
|
||||
if (device_index.isValid()) {
|
||||
const bool is_connected = manager_->GetConnectedDevice(device_index.row());
|
||||
const bool is_plugged_in = manager_->GetLister(device_index.row());
|
||||
const bool is_remembered = manager_->GetDatabaseId(device_index.row()) != -1;
|
||||
|
||||
connect_action_->setEnabled(is_plugged_in);
|
||||
disconnect_action_->setEnabled(is_plugged_in);
|
||||
forget_action_->setEnabled(is_remembered);
|
||||
|
||||
connect_action_->setVisible(!is_connected);
|
||||
disconnect_action_->setVisible(is_connected);
|
||||
|
||||
device_menu_->popup(e->globalPos());
|
||||
} else if (library_index.isValid()) {
|
||||
library_menu_->popup(e->globalPos());
|
||||
}
|
||||
}
|
||||
|
||||
QModelIndex DeviceView::MapToDevice(const QModelIndex& merged_model_index) const {
|
||||
@ -181,6 +199,16 @@ QModelIndex DeviceView::MapToDevice(const QModelIndex& merged_model_index) const
|
||||
return sort_model_->mapToSource(sort_model_index);
|
||||
}
|
||||
|
||||
QModelIndex DeviceView::MapToLibrary(const QModelIndex& merged_model_index) const {
|
||||
QModelIndex sort_model_index = merged_model_->mapToSource(merged_model_index);
|
||||
if (const QSortFilterProxyModel* sort_model =
|
||||
qobject_cast<const QSortFilterProxyModel*>(sort_model_index.model())) {
|
||||
return sort_model->mapToSource(sort_model_index);
|
||||
}
|
||||
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
void DeviceView::Connect() {
|
||||
QModelIndex device_idx = MapToDevice(menu_index_);
|
||||
QModelIndex sort_idx = sort_model_->mapFromSource(device_idx);
|
||||
@ -247,8 +275,46 @@ void DeviceView::mouseDoubleClickEvent(QMouseEvent *event) {
|
||||
|
||||
QModelIndex merged_index = indexAt(event->pos());
|
||||
QModelIndex device_index = MapToDevice(merged_index);
|
||||
if (device_index.isValid() && !manager_->GetConnectedDevice(device_index.row())) {
|
||||
menu_index_ = merged_index;
|
||||
Connect();
|
||||
if (device_index.isValid()) {
|
||||
if (!manager_->GetConnectedDevice(device_index.row())) {
|
||||
menu_index_ = merged_index;
|
||||
Connect();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
QModelIndex library_index = MapToLibrary(merged_index);
|
||||
if (library_index.isValid()) {
|
||||
emit DoubleClicked(GetSelectedSongs());
|
||||
}
|
||||
}
|
||||
|
||||
SongList DeviceView::GetSelectedSongs() const {
|
||||
QModelIndexList selected_merged_indexes = selectionModel()->selectedRows();
|
||||
SongList songs;
|
||||
foreach (const QModelIndex& merged_index, selected_merged_indexes) {
|
||||
QModelIndex library_index = MapToLibrary(merged_index);
|
||||
if (!library_index.isValid())
|
||||
continue;
|
||||
|
||||
const LibraryModel* library = qobject_cast<const LibraryModel*>(
|
||||
library_index.model());
|
||||
if (!library)
|
||||
continue;
|
||||
|
||||
songs << library->GetChildSongs(library_index);
|
||||
}
|
||||
return songs;
|
||||
}
|
||||
|
||||
void DeviceView::Load() {
|
||||
emit Load(GetSelectedSongs());
|
||||
}
|
||||
|
||||
void DeviceView::AddToPlaylist() {
|
||||
emit AddToPlaylist(GetSelectedSongs());
|
||||
}
|
||||
|
||||
void DeviceView::Delete() {
|
||||
|
||||
}
|
||||
|
@ -17,6 +17,7 @@
|
||||
#ifndef DEVICEVIEW_H
|
||||
#define DEVICEVIEW_H
|
||||
|
||||
#include "core/song.h"
|
||||
#include "library/libraryview.h"
|
||||
#include "widgets/autoexpandingtreeview.h"
|
||||
|
||||
@ -47,20 +48,33 @@ public:
|
||||
|
||||
void SetDeviceManager(DeviceManager* manager);
|
||||
|
||||
signals:
|
||||
void Load(const SongList& songs);
|
||||
void AddToPlaylist(const SongList& songs);
|
||||
void DoubleClicked(const SongList& songs);
|
||||
|
||||
protected:
|
||||
void contextMenuEvent(QContextMenuEvent *);
|
||||
void mouseDoubleClickEvent(QMouseEvent *event);
|
||||
|
||||
private slots:
|
||||
// Device menu actions
|
||||
void Connect();
|
||||
void Disconnect();
|
||||
void Forget();
|
||||
void Properties();
|
||||
|
||||
// Library menu actions
|
||||
void Load();
|
||||
void AddToPlaylist();
|
||||
void Delete();
|
||||
|
||||
void DeviceDisconnected(int row);
|
||||
|
||||
private:
|
||||
QModelIndex MapToDevice(const QModelIndex& merged_model_index) const;
|
||||
QModelIndex MapToLibrary(const QModelIndex& merged_model_index) const;
|
||||
SongList GetSelectedSongs() const;
|
||||
|
||||
private:
|
||||
DeviceManager* manager_;
|
||||
@ -69,11 +83,17 @@ private:
|
||||
|
||||
boost::scoped_ptr<DeviceProperties> properties_dialog_;
|
||||
|
||||
QMenu* menu_;
|
||||
QMenu* device_menu_;
|
||||
QAction* connect_action_;
|
||||
QAction* disconnect_action_;
|
||||
QAction* forget_action_;
|
||||
QAction* properties_action_;
|
||||
|
||||
QMenu* library_menu_;
|
||||
QAction* load_action_;
|
||||
QAction* add_to_playlist_action_;
|
||||
QAction* delete_action_;
|
||||
|
||||
QModelIndex menu_index_;
|
||||
};
|
||||
|
||||
|
@ -364,6 +364,9 @@ MainWindow::MainWindow(NetworkAccessManager* network, Engine::Type engine, QWidg
|
||||
|
||||
// Devices connections
|
||||
connect(devices_, SIGNAL(Error(QString)), error_dialog_.get(), SLOT(ShowMessage(QString)));
|
||||
connect(ui_->devices_view, SIGNAL(Load(SongList)), SLOT(LoadDeviceSongsToPlaylist(SongList)));
|
||||
connect(ui_->devices_view, SIGNAL(AddToPlaylist(SongList)), SLOT(AddDeviceSongsToPlaylist(SongList)));
|
||||
connect(ui_->devices_view, SIGNAL(DoubleClicked(SongList)), SLOT(DeviceSongsDoubleClicked(SongList)));
|
||||
|
||||
// Library filter widget
|
||||
QAction* library_config_action = new QAction(
|
||||
@ -632,6 +635,35 @@ void MainWindow::AddLibrarySongsToPlaylist(bool clear_first, const SongList &son
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::AddDeviceSongsToPlaylist(const SongList &songs) {
|
||||
AddDeviceSongsToPlaylist(false, songs);
|
||||
}
|
||||
|
||||
void MainWindow::LoadDeviceSongsToPlaylist(const SongList &songs) {
|
||||
AddDeviceSongsToPlaylist(true, songs);
|
||||
}
|
||||
|
||||
void MainWindow::DeviceSongsDoubleClicked(const SongList &songs) {
|
||||
AddDeviceSongsToPlaylist(autoclear_playlist_, songs);
|
||||
}
|
||||
|
||||
void MainWindow::AddDeviceSongsToPlaylist(bool clear_first, const SongList &songs) {
|
||||
if (clear_first)
|
||||
playlists_->ClearCurrent();
|
||||
|
||||
QModelIndex first_song = playlists_->current()->InsertSongs(songs);
|
||||
|
||||
if (!playlists_->current()->proxy()->mapFromSource(first_song).isValid()) {
|
||||
// The first song doesn't match the filter, so don't play it
|
||||
return;
|
||||
}
|
||||
|
||||
if (first_song.isValid() && player_->GetState() != Engine::Playing) {
|
||||
playlists_->SetActiveToCurrent();
|
||||
player_->PlayAt(first_song.row(), Engine::First, true);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::MediaStopped() {
|
||||
ui_->action_stop->setEnabled(false);
|
||||
ui_->action_stop_after_this_track->setEnabled(false);
|
||||
|
@ -134,6 +134,10 @@ class MainWindow : public QMainWindow, public PlatformInterface {
|
||||
void AddLibrarySongsToPlaylist(const SongList& songs);
|
||||
void LibrarySongsDoubleClicked(const SongList& songs);
|
||||
|
||||
void LoadDeviceSongsToPlaylist(const SongList& songs);
|
||||
void AddDeviceSongsToPlaylist(const SongList& songs);
|
||||
void DeviceSongsDoubleClicked(const SongList& songs);
|
||||
|
||||
void VolumeWheelEvent(int delta);
|
||||
void ToggleShowHide();
|
||||
|
||||
@ -168,6 +172,7 @@ class MainWindow : public QMainWindow, public PlatformInterface {
|
||||
void AddFilesToPlaylist(bool clear_first, const QList<QUrl>& urls);
|
||||
void AddLibraryItemToPlaylist(bool clear_first, const QModelIndexList& indexes);
|
||||
void AddLibrarySongsToPlaylist(bool clear_first, const SongList& songs);
|
||||
void AddDeviceSongsToPlaylist(bool clear_first, const SongList& songs);
|
||||
void AddUrls(bool play_now, const QList<QUrl>& urls);
|
||||
|
||||
private:
|
||||
|
Loading…
x
Reference in New Issue
Block a user