From 281d69581c976c0ee45d3e09e1cd11b3a1df7426 Mon Sep 17 00:00:00 2001 From: David Sansome Date: Sun, 29 Jan 2012 18:44:00 +0000 Subject: [PATCH] Add Edit file information and Show in file browser actions to the files view. Fixes issue 2559 --- src/library/libraryview.cpp | 2 +- src/ui/edittagdialog.cpp | 56 +++++++++++++++++++++++++++++------- src/ui/edittagdialog.h | 1 + src/ui/mainwindow.cpp | 26 ++++++++++++++--- src/ui/mainwindow.h | 1 + src/widgets/fileview.cpp | 1 + src/widgets/fileview.h | 1 + src/widgets/fileviewlist.cpp | 16 +++++++++++ src/widgets/fileviewlist.h | 3 ++ 9 files changed, 92 insertions(+), 15 deletions(-) diff --git a/src/library/libraryview.cpp b/src/library/libraryview.cpp index a6d919040..95cdef424 100644 --- a/src/library/libraryview.cpp +++ b/src/library/libraryview.cpp @@ -477,9 +477,9 @@ void LibraryView::Delete() { void LibraryView::EditTracks() { if(!edit_tag_dialog_) { edit_tag_dialog_.reset(new EditTagDialog(cover_providers_, this)); + edit_tag_dialog_->SetTagCompleter(library_->backend()); } edit_tag_dialog_->SetSongs(GetSelectedSongs()); - edit_tag_dialog_->SetTagCompleter(library_->backend()); edit_tag_dialog_->show(); } diff --git a/src/ui/edittagdialog.cpp b/src/ui/edittagdialog.cpp index a5108b659..2e65d08d9 100644 --- a/src/ui/edittagdialog.cpp +++ b/src/ui/edittagdialog.cpp @@ -42,6 +42,8 @@ #include #include +#include + const char* EditTagDialog::kHintText = QT_TR_NOOP("(different across multiple songs)"); const char* EditTagDialog::kSettingsGroup = "EditTagDialog"; @@ -231,8 +233,18 @@ void EditTagDialog::SetSongsFinished() { return; data_ = watcher->result(); - if (data_.count() == 0) + if (data_.count() == 0) { + // If there were no valid songs, disable everything + ui_->song_list->setEnabled(false); + ui_->tab_widget->setEnabled(false); + + // Show a summary with empty information + UpdateSummaryTab(Song()); + ui_->tab_widget->setCurrentWidget(ui_->summary_tab); + + SetSongListVisibility(false); return; + } // Add the filenames to the list foreach (const Data& data, data_) { @@ -244,10 +256,13 @@ void EditTagDialog::SetSongsFinished() { ui_->song_list->selectAll(); // Hide the list if there's only one song in it - const bool multiple = data_.count() != 1; - ui_->song_list->setVisible(multiple); - previous_button_->setEnabled(multiple); - next_button_->setEnabled(multiple); + SetSongListVisibility(data_.count() != 1); +} + +void EditTagDialog::SetSongListVisibility(bool visible) { + ui_->song_list->setVisible(visible); + previous_button_->setEnabled(visible); + next_button_->setEnabled(visible); } void EditTagDialog::SetTagCompleter(LibraryBackend* backend) { @@ -390,6 +405,15 @@ static void SetText(QLabel* label, int value, const QString& suffix, const QStri label->setText(value <= 0 ? def : (QString::number(value) + " " + suffix)); } +static void SetDate(QLabel* label, uint time) { + if (time == std::numeric_limits::max()) { // -1 + label->setText(QObject::tr("Unknown")); + } else { + label->setText(QDateTime::fromTime_t(time).toString( + QLocale::system().dateTimeFormat(QLocale::LongFormat))); + } +} + void EditTagDialog::UpdateSummaryTab(const Song& song) { cover_art_id_ = cover_loader_->Worker()->LoadImageAsync(song); @@ -420,11 +444,15 @@ void EditTagDialog::UpdateSummaryTab(const Song& song) { SetText(ui_->bpm, song.bpm(), tr("bpm")); SetText(ui_->samplerate, song.samplerate(), "Hz"); SetText(ui_->bitrate, song.bitrate(), tr("kbps")); - ui_->mtime->setText(QDateTime::fromTime_t(song.mtime()).toString( - QLocale::system().dateTimeFormat(QLocale::LongFormat))); - ui_->ctime->setText(QDateTime::fromTime_t(song.ctime()).toString( - QLocale::system().dateTimeFormat(QLocale::LongFormat))); - ui_->filesize->setText(Utilities::PrettySize(song.filesize())); + SetDate(ui_->mtime, song.mtime()); + SetDate(ui_->ctime, song.ctime()); + + if (song.filesize() == -1) { + ui_->filesize->setText(tr("Unknown")); + } else { + ui_->filesize->setText(Utilities::PrettySize(song.filesize())); + } + ui_->filetype->setText(song.TextForFiletype()); if (song.url().scheme() == "file") @@ -586,11 +614,19 @@ void EditTagDialog::UpdateCoverOf(const Song& selected, const QModelIndexList& s } void EditTagDialog::NextSong() { + if (ui_->song_list->count() == 0) { + return; + } + int row = (ui_->song_list->currentRow() + 1) % ui_->song_list->count(); ui_->song_list->setCurrentRow(row); } void EditTagDialog::PreviousSong() { + if (ui_->song_list->count() == 0) { + return; + } + int row = (ui_->song_list->currentRow() - 1 + ui_->song_list->count()) % ui_->song_list->count(); ui_->song_list->setCurrentRow(row); } diff --git a/src/ui/edittagdialog.h b/src/ui/edittagdialog.h index 7e47a083a..c01354962 100644 --- a/src/ui/edittagdialog.h +++ b/src/ui/edittagdialog.h @@ -129,6 +129,7 @@ private: void UpdateStatisticsTab(const Song& song); bool SetLoading(const QString& message); + void SetSongListVisibility(bool visible); // Called by QtConcurrentRun QList LoadData(const SongList& songs) const; diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index 3f9da7686..cb94a2821 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -329,6 +329,7 @@ MainWindow::MainWindow( connect(file_view_, SIGNAL(PathChanged(QString)), SLOT(FilePathChanged(QString))); connect(file_view_, SIGNAL(CopyToLibrary(QList)), SLOT(CopyFilesToLibrary(QList))); connect(file_view_, SIGNAL(MoveToLibrary(QList)), SLOT(MoveFilesToLibrary(QList))); + connect(file_view_, SIGNAL(EditTags(QList)), SLOT(EditFileTags(QList))); connect(file_view_, SIGNAL(CopyToDevice(QList)), SLOT(CopyFilesToDevice(QList))); file_view_->SetTaskManager(task_manager_); @@ -1462,7 +1463,6 @@ void MainWindow::EditTracks() { EnsureEditTagDialogCreated(); edit_tag_dialog_->SetSongs(songs, items); - edit_tag_dialog_->SetTagCompleter(library_->model()->backend()); edit_tag_dialog_->show(); } @@ -1786,21 +1786,21 @@ void MainWindow::NowPlayingWidgetPositionChanged(bool above_status_bar) { ui_->status_bar->show(); } -void MainWindow::CopyFilesToLibrary(const QList &urls) { +void MainWindow::CopyFilesToLibrary(const QList& urls) { organise_dialog_->SetDestinationModel(library_->model()->directory_model()); organise_dialog_->SetUrls(urls); organise_dialog_->SetCopy(true); organise_dialog_->show(); } -void MainWindow::MoveFilesToLibrary(const QList &urls) { +void MainWindow::MoveFilesToLibrary(const QList& urls) { organise_dialog_->SetDestinationModel(library_->model()->directory_model()); organise_dialog_->SetUrls(urls); organise_dialog_->SetCopy(false); organise_dialog_->show(); } -void MainWindow::CopyFilesToDevice(const QList &urls) { +void MainWindow::CopyFilesToDevice(const QList& urls) { organise_dialog_->SetDestinationModel(devices_->connected_devices_model(), true); organise_dialog_->SetCopy(true); if (organise_dialog_->SetUrls(urls)) @@ -1811,6 +1811,22 @@ void MainWindow::CopyFilesToDevice(const QList &urls) { } } +void MainWindow::EditFileTags(const QList& urls) { + EnsureEditTagDialogCreated(); + + SongList songs; + foreach (const QUrl& url, urls) { + Song song; + song.set_url(url); + song.set_valid(true); + song.set_filetype(Song::Type_Mpeg); + songs << song; + } + + edit_tag_dialog_->SetSongs(songs); + edit_tag_dialog_->show(); +} + void MainWindow::PlaylistCopyToLibrary() { PlaylistOrganiseSelected(true); } @@ -1979,6 +1995,8 @@ void MainWindow::EnsureEditTagDialogCreated() { edit_tag_dialog_.reset(new EditTagDialog(cover_providers_)); connect(edit_tag_dialog_.get(), SIGNAL(accepted()), SLOT(EditTagDialogAccepted())); connect(edit_tag_dialog_.get(), SIGNAL(Error(QString)), SLOT(ShowErrorDialog(QString))); + + edit_tag_dialog_->SetTagCompleter(library_->model()->backend()); } void MainWindow::ShowAboutDialog() { diff --git a/src/ui/mainwindow.h b/src/ui/mainwindow.h index 98bdce34d..681aa36df 100644 --- a/src/ui/mainwindow.h +++ b/src/ui/mainwindow.h @@ -182,6 +182,7 @@ class MainWindow : public QMainWindow, public PlatformInterface { void CopyFilesToLibrary(const QList& urls); void MoveFilesToLibrary(const QList& urls); void CopyFilesToDevice(const QList& urls); + void EditFileTags(const QList& urls); void AddToPlaylist(QMimeData* data); void AddToPlaylist(QAction* action); diff --git a/src/widgets/fileview.cpp b/src/widgets/fileview.cpp index 5f0f54220..4cff6863d 100644 --- a/src/widgets/fileview.cpp +++ b/src/widgets/fileview.cpp @@ -65,6 +65,7 @@ FileView::FileView(QWidget* parent) connect(ui_->list, SIGNAL(MoveToLibrary(QList)), SIGNAL(MoveToLibrary(QList))); connect(ui_->list, SIGNAL(CopyToDevice(QList)), SIGNAL(CopyToDevice(QList))); connect(ui_->list, SIGNAL(Delete(QStringList)), SLOT(Delete(QStringList))); + connect(ui_->list, SIGNAL(EditTags(QList)), SIGNAL(EditTags(QList))); QString filter(FileView::kFileFilter); filter_list_ << filter.split(" "); diff --git a/src/widgets/fileview.h b/src/widgets/fileview.h index b00c5cc90..07e5d239f 100644 --- a/src/widgets/fileview.h +++ b/src/widgets/fileview.h @@ -57,6 +57,7 @@ class FileView : public QWidget { void CopyToLibrary(const QList& urls); void MoveToLibrary(const QList& urls); void CopyToDevice(const QList& urls); + void EditTags(const QList& urls); private slots: void FileUp(); diff --git a/src/widgets/fileviewlist.cpp b/src/widgets/fileviewlist.cpp index d1697b31a..3084c9124 100644 --- a/src/widgets/fileviewlist.cpp +++ b/src/widgets/fileviewlist.cpp @@ -17,6 +17,7 @@ #include "fileviewlist.h" #include "core/mimedata.h" +#include "core/utilities.h" #include "ui/iconloader.h" #include @@ -43,6 +44,13 @@ FileViewList::FileViewList(QWidget* parent) tr("Copy to device..."), this, SLOT(CopyToDeviceSlot())); menu_->addAction(IconLoader::Load("edit-delete"), tr("Delete from disk..."), this, SLOT(DeleteSlot())); + + menu_->addSeparator(); + menu_->addAction(IconLoader::Load("edit-rename"), + tr("Edit track information..."), this, SLOT(EditTagsSlot())); + menu_->addAction(IconLoader::Load("document-open-folder"), + tr("Show in file browser..."), this, SLOT(ShowInBrowser())); + setAttribute(Qt::WA_MacShowFocusRect, false); } @@ -120,6 +128,10 @@ void FileViewList::DeleteSlot() { emit Delete(FilenamesFromSelection()); } +void FileViewList::EditTagsSlot() { + emit EditTags(UrlListFromSelection()); +} + void FileViewList::mousePressEvent(QMouseEvent* e) { QListView::mousePressEvent(e); @@ -134,3 +146,7 @@ void FileViewList::mousePressEvent(QMouseEvent* e) { emit AddToPlaylist(data); } } + +void FileViewList::ShowInBrowser() { + Utilities::OpenInFileBrowser(UrlListFromSelection()); +} diff --git a/src/widgets/fileviewlist.h b/src/widgets/fileviewlist.h index e1f4f780a..6935e9483 100644 --- a/src/widgets/fileviewlist.h +++ b/src/widgets/fileviewlist.h @@ -37,6 +37,7 @@ class FileViewList : public QListView { void MoveToLibrary(const QList& urls); void CopyToDevice(const QList& urls); void Delete(const QStringList& filenames); + void EditTags(const QList& urls); protected: void contextMenuEvent(QContextMenuEvent* e); @@ -49,6 +50,8 @@ class FileViewList : public QListView { void MoveToLibrarySlot(); void CopyToDeviceSlot(); void DeleteSlot(); + void EditTagsSlot(); + void ShowInBrowser(); QStringList FilenamesFromSelection() const; QList UrlListFromSelection() const;