From 8ae9fb971616f51ee64aa623cbc93de50162a067 Mon Sep 17 00:00:00 2001 From: Nikolay Tischenko Date: Wed, 20 Oct 2010 02:07:48 +0700 Subject: [PATCH] A lot of changes (animations, initial library manager) --- resources/someplayer_pkg.png | Bin 0 -> 3260 bytes someplayer.pro | 9 ++- src/dbstorage.cpp | 47 ++++++++++- src/dbstorage.h | 5 ++ src/filestorage.cpp | 6 +- src/libraryform.cpp | 38 +++------ src/libraryform.h | 9 +-- src/mainwindow.cpp | 66 +++++++--------- src/mainwindow.h | 7 +- src/managelibraryform.cpp | 46 +++++++++++ src/managelibraryform.h | 48 +++++++++++ src/playerform.cpp | 6 +- src/playerform.h | 1 + src/toolswidget.cpp | 4 + src/toolswidget.h | 1 + src/ui/libraryform.ui | 39 +-------- src/ui/mainwindow.ui | 44 +++++++++-- src/ui/managelibraryform.ui | 180 ++++++++++++++++++++++++++++++++++++++++++ src/ui/playerform.ui | 2 +- 19 files changed, 431 insertions(+), 127 deletions(-) create mode 100644 resources/someplayer_pkg.png create mode 100644 src/managelibraryform.cpp create mode 100644 src/managelibraryform.h create mode 100644 src/ui/managelibraryform.ui diff --git a/resources/someplayer_pkg.png b/resources/someplayer_pkg.png new file mode 100644 index 0000000000000000000000000000000000000000..b3d565424364e3337ab4dc85f282c6e7da11914c GIT binary patch literal 3260 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 #include #include +#include using namespace SomePlayer::Storage; using namespace SomePlayer::DataObjects; DbStorage::DbStorage(QString path) { - QString dbname = path+_DATABASE_NAME_; + QString dbname = path + _DATABASE_NAME_; db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName(dbname); if (!db.open()) { @@ -95,12 +96,18 @@ void DbStorage::_prepare_queries() { _get_track_id_by_source_query = new QSqlQuery(db); _get_track_id_by_source_query->prepare("SELECT id FROM tracks WHERE source = :source"); + _get_directories_query = new QSqlQuery(db); + _get_directories_query->prepare("SELECT id, path FROM directories"); + _check_artist_query = new QSqlQuery(db); _check_artist_query->prepare("SELECT id FROM artist WHERE uname = :uname"); _check_album_query = new QSqlQuery(db); _check_album_query->prepare("SELECT id FROM album WHERE uname = :uname AND artist_id = :artist_id"); + _check_directory_query = new QSqlQuery(db); + _check_directory_query->prepare("SELECT id from directories WHERE path = :path"); + _insert_artist_query = new QSqlQuery(db); _insert_artist_query->prepare("INSERT INTO artist (name, uname) values (:name, :uname)"); @@ -108,7 +115,7 @@ void DbStorage::_prepare_queries() { _insert_album_query->prepare("INSERT INTO album (name, uname, artist_id, year) values (:name, :uname, :artist_id, :year)"); _insert_track_query = new QSqlQuery(db); - _insert_track_query->prepare("INSERT INTO tracks (title, utitle, artist_id, album_id, source, length) values (:title, :utitle, :artist_id, :album_id, :source, :length)"); + _insert_track_query->prepare("INSERT INTO tracks (title, utitle, artist_id, album_id, source, directory, length) values (:title, :utitle, :artist_id, :album_id, :source, :directory_id, :length)"); _insert_date_query = new QSqlQuery(db); _insert_date_query->prepare("INSERT INTO adding_date (track_id, date) values (:track_id, strftime('%s', 'now'))"); @@ -116,6 +123,9 @@ void DbStorage::_prepare_queries() { _insert_favorites_query = new QSqlQuery(db); _insert_favorites_query->prepare("INSERT INTO favorites (track_id) values (:track_id)"); + _insert_directory_query = new QSqlQuery(db); + _insert_directory_query->prepare("INSERT INTO directories (path) values (:path)"); + _update_track_count_query = new QSqlQuery(db); _update_track_count_query->prepare("UPDATE tracks SET count = :count where id = :id"); @@ -156,6 +166,7 @@ void DbStorage::_create_database_structure() { "title text, " "utitle text, " "source text, " + "directory integer, " "count integer default 0, " "length integer default 0, " "foreign key(artist_id) references artist(id), " @@ -183,6 +194,8 @@ void DbStorage::_create_database_structure() { "on album.artist_id = artist.id) " "on aartist_id = tracks.artist_id " "and aalbum_id = tracks.album_id"); + + query->exec("create table directories (id integer primary key, path text)"); } DbStorage::~DbStorage() { @@ -195,14 +208,17 @@ DbStorage::~DbStorage() { delete _get_recently_added_query; delete _get_tracks_for_album_query; delete _get_tracks_by_pattern_query; + delete _get_directories_query; delete _check_album_query; delete _check_artist_query; + delete _check_directory_query; delete _get_track_id_by_source_query; delete _insert_album_query; delete _insert_artist_query; delete _insert_date_query; delete _insert_track_query; delete _insert_favorites_query; + delete _insert_directory_query; delete _update_track_count_query; delete _remove_track_query; db.close(); @@ -366,6 +382,8 @@ void DbStorage::addTrack(Track track) { QString artist = track.metadata().artist(); QString album = track.metadata().album(); QString source = track.source(); + QFileInfo info(source); + QString path = info.canonicalPath(); int year = track.metadata().year(); int artist_id = _check_add_artist(artist); int album_id = _check_add_album(album, artist_id, year); @@ -386,6 +404,7 @@ void DbStorage::addTrack(Track track) { query->bindValue(":artist_id", artist_id); query->bindValue(":album_id", album_id); query->bindValue(":source", source); + query->bindValue(":directory", _check_add_directory(path)); query->bindValue(":length", track.metadata().length()); if (query->exec()) { //ok @@ -527,3 +546,27 @@ void DbStorage::_cleanup() { _remove_empty_albums_query->exec(); _remove_empty_artists_query->exec(); } + +int DbStorage::_check_add_directory(QString path) { + QSqlQuery *query = _check_directory_query; + query->bindValue(":path", path); + query->exec(); + if (query->next()) { + return query->value(0).toInt(); + } else { + query = _insert_directory_query; + query->bindValue(":path", path); + query->exec(); + return _check_add_directory(path); + } +} + +QList DbStorage::getDirectories() { + QSqlQuery *query = _get_directories_query; + query->exec(); + QList directories; + while (query->next()) { + directories.append(query->value(1).toString()); + } + return directories; +} diff --git a/src/dbstorage.h b/src/dbstorage.h index 1e1fb8c..cc10880 100644 --- a/src/dbstorage.h +++ b/src/dbstorage.h @@ -42,6 +42,7 @@ namespace SomePlayer { public: DbStorage(QString path); ~DbStorage(); + QList getDirectories(); QList getArtists(); QMap getAlbumsForArtist(QString artist); QList getTracksForAlbum(QString album, QString artist); // hm... @@ -67,6 +68,7 @@ namespace SomePlayer { int _check_add_artist(QString artist); int _check_add_album(QString album, int artist_id, int year); + int _check_add_directory(QString path); void _cleanup(); @@ -82,15 +84,18 @@ namespace SomePlayer { QSqlQuery *_get_track_count; QSqlQuery *_get_tracks_by_pattern_query; QSqlQuery *_get_track_id_by_source_query; + QSqlQuery *_get_directories_query; QSqlQuery *_check_artist_query; QSqlQuery *_check_album_query; + QSqlQuery *_check_directory_query; QSqlQuery *_insert_artist_query; QSqlQuery *_insert_album_query; QSqlQuery *_insert_track_query; QSqlQuery *_insert_date_query; QSqlQuery *_insert_favorites_query; + QSqlQuery *_insert_directory_query; QSqlQuery *_update_track_count_query; diff --git a/src/filestorage.cpp b/src/filestorage.cpp index dea1e68..1ddb878 100644 --- a/src/filestorage.cpp +++ b/src/filestorage.cpp @@ -48,7 +48,7 @@ QList FileStorage::getPlaylists() { Playlist FileStorage::getPlaylist(QString name) { if (name == _CURRENT_PLAYLIST_SUBST_) name = _CURRENT_PLAYLIST_NAME_; - QFile playlistFile (_path_prefix+"/"+name+"."+_PLAYLIST_FILE_EXTENSION_OLD_); // remove OLD_ in next version + QFile playlistFile (_path_prefix + "/" + name + "." + _PLAYLIST_FILE_EXTENSION_OLD_); // remove OLD_ in next version Playlist playlist; playlist.setName(PLAYLIST_BAD_NAME); // legacy _start_ @@ -85,7 +85,7 @@ Playlist FileStorage::getPlaylist(QString name) { playlistFile.close(); playlistFile.remove(); } else { - playlistFile.setFileName(_path_prefix+"/"+name+"."+_PLAYLIST_FILE_EXTENSION_); + playlistFile.setFileName(_path_prefix + "/" + name + "." + _PLAYLIST_FILE_EXTENSION_); // legacy _end_ if (playlistFile.exists()) { playlist.setName(name); @@ -160,7 +160,7 @@ void FileStorage::savePlaylist(Playlist playlist) { QString name = playlist.name(); if (playlist.name() == _CURRENT_PLAYLIST_SUBST_) name = _CURRENT_PLAYLIST_NAME_; - QString filename = _path_prefix + "/" +name+"."_PLAYLIST_FILE_EXTENSION_; + QString filename = _path_prefix + "/" + name + "."_PLAYLIST_FILE_EXTENSION_; QFile playlistFile(filename); if (playlistFile.exists()) { playlistFile.remove(); diff --git a/src/libraryform.cpp b/src/libraryform.cpp index 2b8c092..3f9f9ea 100644 --- a/src/libraryform.cpp +++ b/src/libraryform.cpp @@ -123,8 +123,8 @@ LibraryForm::LibraryForm(Library *lib, QWidget *parent) : ui->listView->setModel(_model); ui->listView->setColumnWidth(0, 70); ui->toolsLayout->addWidget(_tools_widget); + _tools_widget->hideFSButton(); _tools_widget->hide(); - connect(ui->playerButton, SIGNAL(clicked()), this, SLOT(_player())); connect(ui->viewButton, SIGNAL(clicked()), this, SLOT(_view_button())); connect(ui->playlistsButton, SIGNAL(clicked()), this, SLOT(_playlists_button())); connect(ui->dynamicButton, SIGNAL(clicked()), this, SLOT(_dynamic_button())); @@ -140,11 +140,10 @@ LibraryForm::LibraryForm(Library *lib, QWidget *parent) : connect(_tools_widget, SIGNAL(search(QString)), this, SLOT(search(QString))); connect(_tools_widget, SIGNAL(nextSearch()), this, SLOT(nextItem())); connect(_tools_widget, SIGNAL(prevSearch()), this, SLOT(prevItem())); - connect(_tools_widget, SIGNAL(toggleFullscreen(bool)), this, SIGNAL(fullscreen(bool))); connect(ui->moreButton, SIGNAL(clicked()), this, SLOT(_more_button())); connect(search_in_library, SIGNAL(toggled(bool)), this, SLOT(_search_button(bool))); + connect(ui->playerButton, SIGNAL(clicked()), this, SLOT(hide())); _view_button(); - _current_playlist_changed = true; _top_gradient = ui->topWidget->styleSheet(); _bottom_gradient = ui->bottomWidget->styleSheet(); _is_dynamic = false; @@ -152,16 +151,9 @@ LibraryForm::LibraryForm(Library *lib, QWidget *parent) : LibraryForm::~LibraryForm() { - _lib->saveCurrentPlaylist(_lib->getCurrentPlaylist()); // wtf? - _current_playlist_changed = true; delete ui; } -void LibraryForm::_player() { - emit player(_current_playlist_changed); - _current_playlist_changed = false; -} - void LibraryForm::_view_button() { QList artitst = _lib->getArtists(); __fill_model(_model, artitst, _icons_theme); @@ -285,7 +277,6 @@ void LibraryForm::_add_button() { if (_state == STATE_NONE) return; QModelIndexList selected = ui->listView->selectionModel()->selectedIndexes(); ui->listView->selectionModel()->clearSelection(); - emit busy(QString("

Adding... Please wait

")); Playlist cur = _lib->getCurrentPlaylist(); QRegExp regexp("\\[\\d+\\]\\ (.*)"); switch (_state) { @@ -294,7 +285,7 @@ void LibraryForm::_add_button() { _add_artist(&cur, id.data().toString()); } _lib->saveCurrentPlaylist(cur); - _current_playlist_changed = true; + emit refreshPlayer(); break; case STATE_ALBUM: foreach (QModelIndex id, selected) { @@ -303,41 +294,39 @@ void LibraryForm::_add_button() { } } _lib->saveCurrentPlaylist(cur); - _current_playlist_changed = true; + emit refreshPlayer(); break; case STATE_TRACK: foreach (QModelIndex id, selected) { _add_track(&cur, _current_tracks.at(id.row())); } _lib->saveCurrentPlaylist(cur); - _current_playlist_changed = true; + emit refreshPlayer(); break; case STATE_PLAYLIST: foreach (QModelIndex id, selected) { _add_playlist(&cur, id.data().toString()); } _lib->saveCurrentPlaylist(cur); - _current_playlist_changed = true; + emit refreshPlayer(); break; case STATE_PLAYLIST_TRACK: foreach (QModelIndex id, selected) { _add_track(&cur, _current_tracks.at(id.row())); } _lib->saveCurrentPlaylist(cur); - _current_playlist_changed = true; + emit refreshPlayer(); break; case STATE_SEARCH: foreach (QModelIndex id, selected) { _add_track(&cur, _current_tracks.at(id.row())); } _lib->saveCurrentPlaylist(cur); - _current_playlist_changed = true; + emit refreshPlayer(); break; default: - emit done(); return; } - emit done(); } @@ -424,7 +413,7 @@ void LibraryForm::_delete_button() { } _current_tracks = _current_playlist.tracks(); _lib->savePlaylist(_current_playlist); - _current_playlist_changed = true; + emit refreshPlayer(); __fill_model_tracks(_model, _current_tracks, _icons_theme); ui->listView->setColumnWidth(0, 70); } else if (_state == STATE_PLAYLIST) { @@ -450,12 +439,12 @@ void LibraryForm::_delete_track(Track track) { Playlist current = _lib->getCurrentPlaylist(); current.removeTrack(track); _lib->saveCurrentPlaylist(current); - _current_playlist_changed = true; + emit refreshPlayer(); } void LibraryForm::_use_button() { _lib->saveCurrentPlaylist(_current_playlist); - _current_playlist_changed = true; + emit refreshPlayer(); _current_playlist = _lib->getCurrentPlaylist(); } @@ -665,11 +654,10 @@ void LibraryForm::updateIcons() { } else { ui->moreButton->setIcon(QIcon(landscape ? ":/icons/"+_icons_theme+"/unmore_l.png" : ":/icons/"+_icons_theme+"/more.png")); } - ui->playerButton->setIcon(QIcon(":/icons/"+_icons_theme+"/player.png")); ui->playlistsButton->setIcon(QIcon(":/icons/"+_icons_theme+"/playlists.png")); ui->viewButton->setIcon(QIcon(":/icons/"+_icons_theme+"/artists.png")); if (ui->listView->selectionModel()->selectedRows().count() == _model->rowCount()) { - ui->selectAllButton->setIcon(QIcon(":/icons/"+_icons_theme+"/unselect_all.png")); + ui->selectAllButton->setIcon(QIcon(":/icons/"+_icons_theme+"/deselect_all.png")); } else { ui->selectAllButton->setIcon(QIcon(":/icons/"+_icons_theme+"/select_all.png")); } @@ -710,7 +698,7 @@ void LibraryForm::_process_dblclick(QModelIndex id) { Track track = _current_tracks.at(id.row()); cur.addTrack(track); _lib->saveCurrentPlaylist(cur); - _current_playlist_changed = true; + emit refreshPlayer(); emit addAndPlay(track); ui->listView->clearSelection(); } diff --git a/src/libraryform.h b/src/libraryform.h index 59bb9a0..b4d87bc 100644 --- a/src/libraryform.h +++ b/src/libraryform.h @@ -47,12 +47,9 @@ class LibraryForm : public QWidget public: explicit LibraryForm(Library *lib, QWidget *parent = 0); - ~LibraryForm(); + ~LibraryForm(); signals: - void player(bool); - void busy(QString); - void done(); - void fullscreen(bool); + void refreshPlayer(); void addAndPlay(Track); public slots: void search(QString); @@ -65,7 +62,6 @@ public slots: void updateIcons(); void checkGradient(); private slots: - void _player(); void _view_button(); void _dynamic_button(); void _playlists_button(); @@ -93,7 +89,6 @@ private: QList _current_tracks; QString _search_pattern; int _search_current_id; - bool _current_playlist_changed; ToolsWidget *_tools_widget; bool landscape; QString _icons_theme; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 1fbec1d..40c5304 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -46,44 +46,39 @@ MainWindow::MainWindow(QWidget *parent) : connect(ui->actionAbout, SIGNAL(triggered()), this, SLOT(about())); connect(ui->actionSettings, SIGNAL(triggered()), this, SLOT(settings())); setAnimated(true); - _player_form = new PlayerForm(_library, ui->stackedWidget); - _library_form = new LibraryForm(_library, ui->stackedWidget); - _busy_widget = new BusyWidget(ui->stackedWidget); + setAttribute(Qt::WA_Maemo5StackedWindow); + _player_form = new PlayerForm(_library, this); + ui->centralWidget->layout()->addWidget(_player_form); + _library_form = new LibraryForm(_library, this); + _library_form->setAttribute(Qt::WA_Maemo5StackedWindow); + _library_form->setWindowFlags(_library_form->windowFlags() | Qt::Window); + _busy_widget = new BusyWidget(this); + ui->centralWidget->layout()->addWidget(_busy_widget); + _busy_widget->hide(); _timer = new QTimer(this); _equalizer_dialog = new EqualizerDialog(this); - ui->stackedWidget->insertWidget(0, _player_form); - ui->stackedWidget->insertWidget(1, _library_form); - ui->stackedWidget->insertWidget(2, _busy_widget); - QAction *add_directory = ui->menuLibrary->addAction("Add directory"); - QAction *save_playlist = ui->menuLibrary->addAction("Save playlist"); - QAction *clear_playlist = ui->menuLibrary->addAction("Clear current playlist"); - QAction *add_files = ui->menuLibrary->addAction("Add file to current playlist"); - QAction *set_timer = ui->menuBar->addAction("Set timer"); - QAction *equalizer = ui->menuBar->addAction("Equalizer"); + _manage_library_form = new ManageLibraryForm(_library, this); + _manage_library_form->setAttribute(Qt::WA_Maemo5StackedWindow); + _manage_library_form->setWindowFlags(Qt::Window | _manage_library_form->windowFlags()); connect(_player_form, SIGNAL(library()), this, SLOT(library())); - connect(_library_form, SIGNAL(player(bool)), this, SLOT(player(bool))); - connect(add_directory, SIGNAL(triggered()), this, SLOT(_add_directory())); - connect(save_playlist, SIGNAL(triggered()), this, SLOT(_save_playlist())); - connect(clear_playlist, SIGNAL(triggered()), this, SLOT(_clear_current_playlist())); - connect(add_files, SIGNAL(triggered()), this, SLOT(_add_files())); - connect(set_timer, SIGNAL(triggered()), this, SLOT(_set_timer())); - connect(equalizer, SIGNAL(triggered()), this, SLOT(_equalizer())); + connect(_library_form, SIGNAL(refreshPlayer()), this, SLOT(player())); + connect(ui->actionManageLibrary, SIGNAL(triggered()), this, SLOT(_manage_library())); + connect(ui->actionSavePlaylist, SIGNAL(triggered()), this, SLOT(_save_playlist())); + connect(_player_form, SIGNAL(clearPlaylist()), this, SLOT(_clear_current_playlist())); + connect(ui->actionSetTimer, SIGNAL(triggered()), this, SLOT(_set_timer())); + connect(ui->actionEqualizer, SIGNAL(triggered()), this, SLOT(_equalizer())); connect(_library, SIGNAL(done()), this, SLOT(library())); connect(_library, SIGNAL(done()), _library_form, SLOT(refresh())); connect(_library, SIGNAL(addingTracks(int)), _busy_widget, SLOT(setMax(int))); connect(_library, SIGNAL(trackAdded()), _busy_widget, SLOT(tick())); - connect(_library_form, SIGNAL(done()), this, SLOT(library())); - connect(_library_form, SIGNAL(busy(QString)), this, SLOT(showBusyWidget(QString))); connect(_timer, SIGNAL(timeout()), this, SLOT(_timeout())); connect(_equalizer_dialog, SIGNAL(valueChanged(int,int)), this, SLOT(_equalizer_value_changed(int, int))); connect(_equalizer_dialog, SIGNAL(equalizerEnabled()), _player_form, SLOT(enableEqualizer())); connect(_equalizer_dialog, SIGNAL(equalizerDisabled()), _player_form, SLOT(disableEqualizer())); connect(QApplication::desktop(), SIGNAL(resized(int)), this, SLOT(_orientation_changed())); connect(_player_form, SIGNAL(fullscreen(bool)), this, SLOT(_fullscreen(bool))); - connect(_library_form, SIGNAL(fullscreen(bool)), this, SLOT(_fullscreen(bool))); connect(_library_form, SIGNAL(addAndPlay(Track)), _player_form, SLOT(play(Track))); _player_form->reload(true); - library(); QString mode = config.getValue("ui/orientation").toString(); if (mode == "landscape") { setAttribute(Qt::WA_Maemo5LandscapeOrientation); @@ -105,6 +100,7 @@ MainWindow::MainWindow(QWidget *parent) : _player_form->updateIcons(); _player_form->checkGradient(); _library_form->checkGradient(); + setWindowTitle("SomePlayer"); } MainWindow::~MainWindow() @@ -120,27 +116,22 @@ void MainWindow::about() { "Author: Nikolay Tischenko aka \"somebody\" "); } -void MainWindow::player(bool reread) { - ui->stackedWidget->setCurrentIndex(0); - _player_form->reload(reread); - setWindowTitle("SomePlayer"); +void MainWindow::player() { + _player_form->reload(true); _orientation_changed(); // workaround } void MainWindow::library() { ui->menuBar->setEnabled(true); - _library_form->refresh(); - ui->stackedWidget->setCurrentIndex(1); - setWindowTitle("SomePlayer Library"); + _library_form->show(); _orientation_changed(); // workaround + _busy_widget->hide(); + _manage_library_form->hide(); + _player_form->show(); } -void MainWindow::_add_directory() { - QString directory = QFileDialog::getExistingDirectory (this, "Select directory", "/home/user/MyDocs", QFileDialog::ShowDirsOnly ); - if (!directory.isEmpty()) { - showBusyWidget("

Scanning... Please wait

"); - _library->addDirectory(directory); - } +void MainWindow::_manage_library() { + _manage_library_form->show(); } void MainWindow::_save_playlist() { @@ -186,7 +177,8 @@ void MainWindow::_clear_current_playlist() { void MainWindow::showBusyWidget(QString caption) { _busy_widget->setText(caption); ui->menuBar->setEnabled(false); - ui->stackedWidget->setCurrentIndex(2); + _player_form->hide(); + _busy_widget->show(); } void MainWindow::_add_files() { diff --git a/src/mainwindow.h b/src/mainwindow.h index 7fc05dd..df6c266 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -26,6 +26,7 @@ #include "libraryform.h" #include "busywidget.h" #include "equalizerdialog.h" +#include "managelibraryform.h" #include "library.h" #include @@ -52,12 +53,13 @@ signals: public slots: void about(); - void player(bool); + void player(); void library(); void settings(); void showBusyWidget(QString); private slots: - void _add_directory(); + void _manage_library(); +// void _add_directory(); void _save_playlist(); void _clear_current_playlist(); void _add_files(); @@ -74,6 +76,7 @@ private: Library *_library; QTimer *_timer; EqualizerDialog *_equalizer_dialog; + ManageLibraryForm *_manage_library_form; }; #endif // MAINWINDOW_H diff --git a/src/managelibraryform.cpp b/src/managelibraryform.cpp new file mode 100644 index 0000000..066d4ac --- /dev/null +++ b/src/managelibraryform.cpp @@ -0,0 +1,46 @@ +/* + * SomePlayer - An alternate music player for Maemo 5 + * Copyright (C) 2010 Nikolay (somebody) Tischenko + * + * This program 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 2 + * of the License, or (at your option) any later version. + * + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "managelibraryform.h" +#include "ui_managelibraryform.h" +#include "library.h" +#include + +using namespace SomePlayer::DataObjects; + +ManageLibraryForm::ManageLibraryForm(Library *library, QWidget *parent) : + QWidget(parent), + ui(new Ui::ManageLibraryForm), + _library (library) +{ + ui->setupUi(this); + connect(ui->addButton, SIGNAL(clicked()), this, SLOT(add())); +} + +ManageLibraryForm::~ManageLibraryForm() +{ + delete ui; +} + +void ManageLibraryForm::add() { + QString directory = QFileDialog::getExistingDirectory (this, "Select directory", "/home/user/MyDocs", QFileDialog::ShowDirsOnly ); + if (!directory.isEmpty()) { + _library->addDirectory(directory); + } +} diff --git a/src/managelibraryform.h b/src/managelibraryform.h new file mode 100644 index 0000000..91568b8 --- /dev/null +++ b/src/managelibraryform.h @@ -0,0 +1,48 @@ +/* + * SomePlayer - An alternate music player for Maemo 5 + * Copyright (C) 2010 Nikolay (somebody) Tischenko + * + * This program 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 2 + * of the License, or (at your option) any later version. + * + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef MANAGELIBRARYFORM_H +#define MANAGELIBRARYFORM_H + +#include +#include "someplayer.h" + +namespace Ui { + class ManageLibraryForm; +} + +using SomePlayer::DataObjects::Library; + +class ManageLibraryForm : public QWidget +{ + Q_OBJECT + +public: + explicit ManageLibraryForm(Library *library, QWidget *parent = 0); + ~ManageLibraryForm(); + +private slots: + void add(); + +private: + Ui::ManageLibraryForm *ui; + Library *_library; +}; + +#endif // MANAGELIBRARYFORM_H diff --git a/src/playerform.cpp b/src/playerform.cpp index fd41832..567f7b6 100644 --- a/src/playerform.cpp +++ b/src/playerform.cpp @@ -83,6 +83,7 @@ PlayerForm::PlayerForm(Library* lib, QWidget *parent) : _model = new QStandardItemModel(0, 2, this); ui->playlistView->setModel(_model); _context_menu = new QMenu(ui->playlistView); + QAction *clear_playlist = _context_menu->addAction("Clear playlist"); QAction *delete_action = _context_menu->addAction("Delete"); QAction *add_to_favorites = _context_menu->addAction("Add to favorites"); QAction *enqueue_action = _context_menu->addAction("Enqueue"); @@ -110,6 +111,7 @@ PlayerForm::PlayerForm(Library* lib, QWidget *parent) : connect(ui->seekSlider, SIGNAL(sliderMoved(int)), _player, SLOT(seek(int))); connect(ui->volumeSlider, SIGNAL(sliderMoved(int)), _player, SLOT(setVolume(int))); connect(ui->playlistView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(_custom_context_menu_requested(QPoint))); + connect(clear_playlist, SIGNAL(triggered()), this, SIGNAL(clearPlaylist())); connect(delete_action, SIGNAL(triggered()), this, SLOT(_delete_track())); connect(enqueue_action, SIGNAL(triggered()), this, SLOT(_enqueue_track())); connect(add_to_favorites, SIGNAL(triggered()), this, SLOT(_add_to_favorites())); @@ -497,9 +499,9 @@ void PlayerForm::updateIcons() { _tools_widget->updateIcons(); ui->libraryButton->setIcon(QIcon(":/icons/"+_icons_theme+"/library.png")); if (_tools_widget->isVisible()) { - ui->moreButton->setIcon(QIcon(landscape ? ":/icons/"+_icons_theme+"/unmore.png" : ":/icons/"+_icons_theme+"/more.png")); + ui->moreButton->setIcon(QIcon(landscape ? ":/icons/" + _icons_theme + "/unmore.png" : ":/icons/" + _icons_theme + "/more.png")); } else { - ui->moreButton->setIcon(QIcon(landscape ? ":/icons/"+_icons_theme+"/more.png" : ":/icons/"+_icons_theme+"/unmore.png")); + ui->moreButton->setIcon(QIcon(landscape ? ":/icons/" + _icons_theme + "/more.png" : ":/icons/" + _icons_theme + "/unmore.png")); } ui->nextButton->setIcon(QIcon(":/icons/"+_icons_theme+"/next.png")); ui->stopButton->setIcon(QIcon(":/icons/"+_icons_theme+"/stop.png")); diff --git a/src/playerform.h b/src/playerform.h index c7c1c1b..1be2824 100644 --- a/src/playerform.h +++ b/src/playerform.h @@ -57,6 +57,7 @@ public: signals: void library(); void fullscreen(bool); + void clearPlaylist(); public slots: void reload(bool); diff --git a/src/toolswidget.cpp b/src/toolswidget.cpp index 07aea3b..08a8cb0 100644 --- a/src/toolswidget.cpp +++ b/src/toolswidget.cpp @@ -74,3 +74,7 @@ void ToolsWidget::toggleArrows(bool state) { ui->nextButton->setVisible(state); ui->prevButton->setVisible(state); } + +void ToolsWidget::hideFSButton() { + ui->fscreenButton->hide(); +} diff --git a/src/toolswidget.h b/src/toolswidget.h index 82a9b3b..dd6d180 100644 --- a/src/toolswidget.h +++ b/src/toolswidget.h @@ -40,6 +40,7 @@ public slots: void updateIcons(); void show(); void toggleArrows(bool); + void hideFSButton(); signals: void toggleFullscreen(bool); diff --git a/src/ui/libraryform.ui b/src/ui/libraryform.ui index c7064ac..918c94b 100644 --- a/src/ui/libraryform.ui +++ b/src/ui/libraryform.ui @@ -10,45 +10,8 @@ 480 - - - - - - - 0 - 85 - 255 - - - - - - - - - 0 - 85 - 255 - - - - - - - - - 127 - 127 - 126 - - - - - - - Form + SomePlayer Library diff --git a/src/ui/mainwindow.ui b/src/ui/mainwindow.ui index 7bd4bc0..7da86cc 100644 --- a/src/ui/mainwindow.ui +++ b/src/ui/mainwindow.ui @@ -14,19 +14,13 @@ someplayer - + 0 0 - - - - - - @@ -52,9 +46,25 @@ Library + + + + + Tools + + + + + + + Player + + + + @@ -66,6 +76,26 @@ Settings + + + Manage library + + + + + Equalizer + + + + + Set timer + + + + + Save playlist + + diff --git a/src/ui/managelibraryform.ui b/src/ui/managelibraryform.ui new file mode 100644 index 0000000..beab448 --- /dev/null +++ b/src/ui/managelibraryform.ui @@ -0,0 +1,180 @@ + + + ManageLibraryForm + + + + 0 + 0 + 553 + 300 + + + + Form + + + + 6 + + + 9 + + + + + 0 + + + + + Add new + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Update + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Delete + + + + + + + + + 0 + + + + + 0 + + + + + Added directories: + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::ScrollBarAlwaysOff + + + QAbstractItemView::NoEditTriggers + + + QAbstractItemView::MultiSelection + + + QAbstractItemView::SelectRows + + + + 50 + 50 + + + + false + + + false + + + true + + + false + + + 70 + + + 70 + + + + + + + + + 0 artitst + + + + + + + 0 albums + + + + + + + 0 tracks + + + + + + + + + + + + diff --git a/src/ui/playerform.ui b/src/ui/playerform.ui index 5c48ec1..a4ae191 100644 --- a/src/ui/playerform.ui +++ b/src/ui/playerform.ui @@ -11,7 +11,7 @@ - Form + SomePlayer -- 1.7.9.5