Add Edit file information and Show in file browser actions to the files view. Fixes issue 2559

This commit is contained in:
David Sansome 2012-01-29 18:44:00 +00:00
parent facb366017
commit 281d69581c
9 changed files with 92 additions and 15 deletions

View File

@ -477,9 +477,9 @@ void LibraryView::Delete() {
void LibraryView::EditTracks() { void LibraryView::EditTracks() {
if(!edit_tag_dialog_) { if(!edit_tag_dialog_) {
edit_tag_dialog_.reset(new EditTagDialog(cover_providers_, this)); edit_tag_dialog_.reset(new EditTagDialog(cover_providers_, this));
edit_tag_dialog_->SetTagCompleter(library_->backend());
} }
edit_tag_dialog_->SetSongs(GetSelectedSongs()); edit_tag_dialog_->SetSongs(GetSelectedSongs());
edit_tag_dialog_->SetTagCompleter(library_->backend());
edit_tag_dialog_->show(); edit_tag_dialog_->show();
} }

View File

@ -42,6 +42,8 @@
#include <QtConcurrentRun> #include <QtConcurrentRun>
#include <QtDebug> #include <QtDebug>
#include <limits>
const char* EditTagDialog::kHintText = QT_TR_NOOP("(different across multiple songs)"); const char* EditTagDialog::kHintText = QT_TR_NOOP("(different across multiple songs)");
const char* EditTagDialog::kSettingsGroup = "EditTagDialog"; const char* EditTagDialog::kSettingsGroup = "EditTagDialog";
@ -231,8 +233,18 @@ void EditTagDialog::SetSongsFinished() {
return; return;
data_ = watcher->result(); 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; return;
}
// Add the filenames to the list // Add the filenames to the list
foreach (const Data& data, data_) { foreach (const Data& data, data_) {
@ -244,10 +256,13 @@ void EditTagDialog::SetSongsFinished() {
ui_->song_list->selectAll(); ui_->song_list->selectAll();
// Hide the list if there's only one song in it // Hide the list if there's only one song in it
const bool multiple = data_.count() != 1; SetSongListVisibility(data_.count() != 1);
ui_->song_list->setVisible(multiple); }
previous_button_->setEnabled(multiple);
next_button_->setEnabled(multiple); void EditTagDialog::SetSongListVisibility(bool visible) {
ui_->song_list->setVisible(visible);
previous_button_->setEnabled(visible);
next_button_->setEnabled(visible);
} }
void EditTagDialog::SetTagCompleter(LibraryBackend* backend) { 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)); label->setText(value <= 0 ? def : (QString::number(value) + " " + suffix));
} }
static void SetDate(QLabel* label, uint time) {
if (time == std::numeric_limits<uint>::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) { void EditTagDialog::UpdateSummaryTab(const Song& song) {
cover_art_id_ = cover_loader_->Worker()->LoadImageAsync(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_->bpm, song.bpm(), tr("bpm"));
SetText(ui_->samplerate, song.samplerate(), "Hz"); SetText(ui_->samplerate, song.samplerate(), "Hz");
SetText(ui_->bitrate, song.bitrate(), tr("kbps")); SetText(ui_->bitrate, song.bitrate(), tr("kbps"));
ui_->mtime->setText(QDateTime::fromTime_t(song.mtime()).toString( SetDate(ui_->mtime, song.mtime());
QLocale::system().dateTimeFormat(QLocale::LongFormat))); SetDate(ui_->ctime, song.ctime());
ui_->ctime->setText(QDateTime::fromTime_t(song.ctime()).toString(
QLocale::system().dateTimeFormat(QLocale::LongFormat))); if (song.filesize() == -1) {
ui_->filesize->setText(Utilities::PrettySize(song.filesize())); ui_->filesize->setText(tr("Unknown"));
} else {
ui_->filesize->setText(Utilities::PrettySize(song.filesize()));
}
ui_->filetype->setText(song.TextForFiletype()); ui_->filetype->setText(song.TextForFiletype());
if (song.url().scheme() == "file") if (song.url().scheme() == "file")
@ -586,11 +614,19 @@ void EditTagDialog::UpdateCoverOf(const Song& selected, const QModelIndexList& s
} }
void EditTagDialog::NextSong() { void EditTagDialog::NextSong() {
if (ui_->song_list->count() == 0) {
return;
}
int row = (ui_->song_list->currentRow() + 1) % ui_->song_list->count(); int row = (ui_->song_list->currentRow() + 1) % ui_->song_list->count();
ui_->song_list->setCurrentRow(row); ui_->song_list->setCurrentRow(row);
} }
void EditTagDialog::PreviousSong() { 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(); int row = (ui_->song_list->currentRow() - 1 + ui_->song_list->count()) % ui_->song_list->count();
ui_->song_list->setCurrentRow(row); ui_->song_list->setCurrentRow(row);
} }

View File

@ -129,6 +129,7 @@ private:
void UpdateStatisticsTab(const Song& song); void UpdateStatisticsTab(const Song& song);
bool SetLoading(const QString& message); bool SetLoading(const QString& message);
void SetSongListVisibility(bool visible);
// Called by QtConcurrentRun // Called by QtConcurrentRun
QList<Data> LoadData(const SongList& songs) const; QList<Data> LoadData(const SongList& songs) const;

View File

@ -329,6 +329,7 @@ MainWindow::MainWindow(
connect(file_view_, SIGNAL(PathChanged(QString)), SLOT(FilePathChanged(QString))); connect(file_view_, SIGNAL(PathChanged(QString)), SLOT(FilePathChanged(QString)));
connect(file_view_, SIGNAL(CopyToLibrary(QList<QUrl>)), SLOT(CopyFilesToLibrary(QList<QUrl>))); connect(file_view_, SIGNAL(CopyToLibrary(QList<QUrl>)), SLOT(CopyFilesToLibrary(QList<QUrl>)));
connect(file_view_, SIGNAL(MoveToLibrary(QList<QUrl>)), SLOT(MoveFilesToLibrary(QList<QUrl>))); connect(file_view_, SIGNAL(MoveToLibrary(QList<QUrl>)), SLOT(MoveFilesToLibrary(QList<QUrl>)));
connect(file_view_, SIGNAL(EditTags(QList<QUrl>)), SLOT(EditFileTags(QList<QUrl>)));
connect(file_view_, SIGNAL(CopyToDevice(QList<QUrl>)), SLOT(CopyFilesToDevice(QList<QUrl>))); connect(file_view_, SIGNAL(CopyToDevice(QList<QUrl>)), SLOT(CopyFilesToDevice(QList<QUrl>)));
file_view_->SetTaskManager(task_manager_); file_view_->SetTaskManager(task_manager_);
@ -1462,7 +1463,6 @@ void MainWindow::EditTracks() {
EnsureEditTagDialogCreated(); EnsureEditTagDialogCreated();
edit_tag_dialog_->SetSongs(songs, items); edit_tag_dialog_->SetSongs(songs, items);
edit_tag_dialog_->SetTagCompleter(library_->model()->backend());
edit_tag_dialog_->show(); edit_tag_dialog_->show();
} }
@ -1786,21 +1786,21 @@ void MainWindow::NowPlayingWidgetPositionChanged(bool above_status_bar) {
ui_->status_bar->show(); ui_->status_bar->show();
} }
void MainWindow::CopyFilesToLibrary(const QList<QUrl> &urls) { void MainWindow::CopyFilesToLibrary(const QList<QUrl>& urls) {
organise_dialog_->SetDestinationModel(library_->model()->directory_model()); organise_dialog_->SetDestinationModel(library_->model()->directory_model());
organise_dialog_->SetUrls(urls); organise_dialog_->SetUrls(urls);
organise_dialog_->SetCopy(true); organise_dialog_->SetCopy(true);
organise_dialog_->show(); organise_dialog_->show();
} }
void MainWindow::MoveFilesToLibrary(const QList<QUrl> &urls) { void MainWindow::MoveFilesToLibrary(const QList<QUrl>& urls) {
organise_dialog_->SetDestinationModel(library_->model()->directory_model()); organise_dialog_->SetDestinationModel(library_->model()->directory_model());
organise_dialog_->SetUrls(urls); organise_dialog_->SetUrls(urls);
organise_dialog_->SetCopy(false); organise_dialog_->SetCopy(false);
organise_dialog_->show(); organise_dialog_->show();
} }
void MainWindow::CopyFilesToDevice(const QList<QUrl> &urls) { void MainWindow::CopyFilesToDevice(const QList<QUrl>& urls) {
organise_dialog_->SetDestinationModel(devices_->connected_devices_model(), true); organise_dialog_->SetDestinationModel(devices_->connected_devices_model(), true);
organise_dialog_->SetCopy(true); organise_dialog_->SetCopy(true);
if (organise_dialog_->SetUrls(urls)) if (organise_dialog_->SetUrls(urls))
@ -1811,6 +1811,22 @@ void MainWindow::CopyFilesToDevice(const QList<QUrl> &urls) {
} }
} }
void MainWindow::EditFileTags(const QList<QUrl>& 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() { void MainWindow::PlaylistCopyToLibrary() {
PlaylistOrganiseSelected(true); PlaylistOrganiseSelected(true);
} }
@ -1979,6 +1995,8 @@ void MainWindow::EnsureEditTagDialogCreated() {
edit_tag_dialog_.reset(new EditTagDialog(cover_providers_)); edit_tag_dialog_.reset(new EditTagDialog(cover_providers_));
connect(edit_tag_dialog_.get(), SIGNAL(accepted()), SLOT(EditTagDialogAccepted())); connect(edit_tag_dialog_.get(), SIGNAL(accepted()), SLOT(EditTagDialogAccepted()));
connect(edit_tag_dialog_.get(), SIGNAL(Error(QString)), SLOT(ShowErrorDialog(QString))); connect(edit_tag_dialog_.get(), SIGNAL(Error(QString)), SLOT(ShowErrorDialog(QString)));
edit_tag_dialog_->SetTagCompleter(library_->model()->backend());
} }
void MainWindow::ShowAboutDialog() { void MainWindow::ShowAboutDialog() {

View File

@ -182,6 +182,7 @@ class MainWindow : public QMainWindow, public PlatformInterface {
void CopyFilesToLibrary(const QList<QUrl>& urls); void CopyFilesToLibrary(const QList<QUrl>& urls);
void MoveFilesToLibrary(const QList<QUrl>& urls); void MoveFilesToLibrary(const QList<QUrl>& urls);
void CopyFilesToDevice(const QList<QUrl>& urls); void CopyFilesToDevice(const QList<QUrl>& urls);
void EditFileTags(const QList<QUrl>& urls);
void AddToPlaylist(QMimeData* data); void AddToPlaylist(QMimeData* data);
void AddToPlaylist(QAction* action); void AddToPlaylist(QAction* action);

View File

@ -65,6 +65,7 @@ FileView::FileView(QWidget* parent)
connect(ui_->list, SIGNAL(MoveToLibrary(QList<QUrl>)), SIGNAL(MoveToLibrary(QList<QUrl>))); connect(ui_->list, SIGNAL(MoveToLibrary(QList<QUrl>)), SIGNAL(MoveToLibrary(QList<QUrl>)));
connect(ui_->list, SIGNAL(CopyToDevice(QList<QUrl>)), SIGNAL(CopyToDevice(QList<QUrl>))); connect(ui_->list, SIGNAL(CopyToDevice(QList<QUrl>)), SIGNAL(CopyToDevice(QList<QUrl>)));
connect(ui_->list, SIGNAL(Delete(QStringList)), SLOT(Delete(QStringList))); connect(ui_->list, SIGNAL(Delete(QStringList)), SLOT(Delete(QStringList)));
connect(ui_->list, SIGNAL(EditTags(QList<QUrl>)), SIGNAL(EditTags(QList<QUrl>)));
QString filter(FileView::kFileFilter); QString filter(FileView::kFileFilter);
filter_list_ << filter.split(" "); filter_list_ << filter.split(" ");

View File

@ -57,6 +57,7 @@ class FileView : public QWidget {
void CopyToLibrary(const QList<QUrl>& urls); void CopyToLibrary(const QList<QUrl>& urls);
void MoveToLibrary(const QList<QUrl>& urls); void MoveToLibrary(const QList<QUrl>& urls);
void CopyToDevice(const QList<QUrl>& urls); void CopyToDevice(const QList<QUrl>& urls);
void EditTags(const QList<QUrl>& urls);
private slots: private slots:
void FileUp(); void FileUp();

View File

@ -17,6 +17,7 @@
#include "fileviewlist.h" #include "fileviewlist.h"
#include "core/mimedata.h" #include "core/mimedata.h"
#include "core/utilities.h"
#include "ui/iconloader.h" #include "ui/iconloader.h"
#include <QContextMenuEvent> #include <QContextMenuEvent>
@ -43,6 +44,13 @@ FileViewList::FileViewList(QWidget* parent)
tr("Copy to device..."), this, SLOT(CopyToDeviceSlot())); tr("Copy to device..."), this, SLOT(CopyToDeviceSlot()));
menu_->addAction(IconLoader::Load("edit-delete"), tr("Delete from disk..."), menu_->addAction(IconLoader::Load("edit-delete"), tr("Delete from disk..."),
this, SLOT(DeleteSlot())); 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); setAttribute(Qt::WA_MacShowFocusRect, false);
} }
@ -120,6 +128,10 @@ void FileViewList::DeleteSlot() {
emit Delete(FilenamesFromSelection()); emit Delete(FilenamesFromSelection());
} }
void FileViewList::EditTagsSlot() {
emit EditTags(UrlListFromSelection());
}
void FileViewList::mousePressEvent(QMouseEvent* e) { void FileViewList::mousePressEvent(QMouseEvent* e) {
QListView::mousePressEvent(e); QListView::mousePressEvent(e);
@ -134,3 +146,7 @@ void FileViewList::mousePressEvent(QMouseEvent* e) {
emit AddToPlaylist(data); emit AddToPlaylist(data);
} }
} }
void FileViewList::ShowInBrowser() {
Utilities::OpenInFileBrowser(UrlListFromSelection());
}

View File

@ -37,6 +37,7 @@ class FileViewList : public QListView {
void MoveToLibrary(const QList<QUrl>& urls); void MoveToLibrary(const QList<QUrl>& urls);
void CopyToDevice(const QList<QUrl>& urls); void CopyToDevice(const QList<QUrl>& urls);
void Delete(const QStringList& filenames); void Delete(const QStringList& filenames);
void EditTags(const QList<QUrl>& urls);
protected: protected:
void contextMenuEvent(QContextMenuEvent* e); void contextMenuEvent(QContextMenuEvent* e);
@ -49,6 +50,8 @@ class FileViewList : public QListView {
void MoveToLibrarySlot(); void MoveToLibrarySlot();
void CopyToDeviceSlot(); void CopyToDeviceSlot();
void DeleteSlot(); void DeleteSlot();
void EditTagsSlot();
void ShowInBrowser();
QStringList FilenamesFromSelection() const; QStringList FilenamesFromSelection() const;
QList<QUrl> UrlListFromSelection() const; QList<QUrl> UrlListFromSelection() const;