New repeat mode: repeate one
authorNikolay Tischenko <niktischenko@gmail.com>
Mon, 11 Oct 2010 11:35:22 +0000 (18:35 +0700)
committerNikolay Tischenko <niktischenko@gmail.com>
Mon, 11 Oct 2010 11:35:22 +0000 (18:35 +0700)
Fixed bug with volume slider place
Now doubletap on track in library adds track to current playlist and
plays it
Fixed bug with back button in dynamic playlist view

28 files changed:
resources/black/random_active.png [deleted file]
resources/black/random_inactive.png [deleted file]
resources/black/random_off.png [new file with mode: 0644]
resources/black/random_on.png [new file with mode: 0644]
resources/black/repeat_active.png [deleted file]
resources/black/repeat_all.png [new file with mode: 0644]
resources/black/repeat_inactive.png [deleted file]
resources/black/repeat_off.png [new file with mode: 0644]
resources/black/repeat_one.png [new file with mode: 0644]
resources/resources.qrc
resources/someplayer.desktop [changed mode: 0755->0644]
resources/white/random_active.png [deleted file]
resources/white/random_inactive.png [deleted file]
resources/white/random_off.png [new file with mode: 0644]
resources/white/random_on.png [new file with mode: 0644]
resources/white/repeat_active.png [deleted file]
resources/white/repeat_all.png [new file with mode: 0644]
resources/white/repeat_inactive.png [deleted file]
resources/white/repeat_off.png [new file with mode: 0644]
resources/white/repeat_one.png [new file with mode: 0644]
src/libraryform.cpp
src/libraryform.h
src/mainwindow.cpp
src/player/player.cpp
src/player/player.h
src/playerform.cpp
src/playerform.h
src/ui/playerform.ui

diff --git a/resources/black/random_active.png b/resources/black/random_active.png
deleted file mode 100644 (file)
index aae80aa..0000000
Binary files a/resources/black/random_active.png and /dev/null differ
diff --git a/resources/black/random_inactive.png b/resources/black/random_inactive.png
deleted file mode 100644 (file)
index ea8f9ed..0000000
Binary files a/resources/black/random_inactive.png and /dev/null differ
diff --git a/resources/black/random_off.png b/resources/black/random_off.png
new file mode 100644 (file)
index 0000000..4db4154
Binary files /dev/null and b/resources/black/random_off.png differ
diff --git a/resources/black/random_on.png b/resources/black/random_on.png
new file mode 100644 (file)
index 0000000..5c6d670
Binary files /dev/null and b/resources/black/random_on.png differ
diff --git a/resources/black/repeat_active.png b/resources/black/repeat_active.png
deleted file mode 100644 (file)
index f574f11..0000000
Binary files a/resources/black/repeat_active.png and /dev/null differ
diff --git a/resources/black/repeat_all.png b/resources/black/repeat_all.png
new file mode 100644 (file)
index 0000000..325760c
Binary files /dev/null and b/resources/black/repeat_all.png differ
diff --git a/resources/black/repeat_inactive.png b/resources/black/repeat_inactive.png
deleted file mode 100644 (file)
index 66e78e4..0000000
Binary files a/resources/black/repeat_inactive.png and /dev/null differ
diff --git a/resources/black/repeat_off.png b/resources/black/repeat_off.png
new file mode 100644 (file)
index 0000000..39c54b0
Binary files /dev/null and b/resources/black/repeat_off.png differ
diff --git a/resources/black/repeat_one.png b/resources/black/repeat_one.png
new file mode 100644 (file)
index 0000000..3fc85f2
Binary files /dev/null and b/resources/black/repeat_one.png differ
index 4325b91..7780bfd 100644 (file)
@@ -1,37 +1,5 @@
 <RCC>
     <qresource prefix="/icons">
-        <file>white/add.png</file>
-        <file>white/artists.png</file>
-        <file>white/back.png</file>
-        <file>white/delete.png</file>
-        <file>white/deselect_all.png</file>
-        <file>white/dynamic.png</file>
-        <file>white/fav.png</file>
-        <file>white/forward.png</file>
-        <file>white/fullscreen.png</file>
-        <file>white/library.png</file>
-        <file>white/next.png</file>
-        <file>white/pause.png</file>
-        <file>white/play.png</file>
-        <file>white/playback.png</file>
-        <file>white/player.png</file>
-        <file>white/playlist.png</file>
-        <file>white/playlists.png</file>
-        <file>white/prev.png</file>
-        <file>white/random_active.png</file>
-        <file>white/random_inactive.png</file>
-        <file>white/repeat_active.png</file>
-        <file>white/repeat_inactive.png</file>
-        <file>white/search.png</file>
-        <file>white/select_all.png</file>
-        <file>white/stop.png</file>
-        <file>white/use.png</file>
-        <file>white/volume.png</file>
-        <file>white/window.png</file>
-        <file>white/more.png</file>
-        <file>white/unmore.png</file>
-        <file>white/more_l.png</file>
-        <file>white/unmore_l.png</file>
         <file>black/add.png</file>
         <file>black/artists.png</file>
         <file>black/back.png</file>
         <file>black/playlist.png</file>
         <file>black/playlists.png</file>
         <file>black/prev.png</file>
-        <file>black/random_active.png</file>
-        <file>black/random_inactive.png</file>
-        <file>black/repeat_active.png</file>
-        <file>black/repeat_inactive.png</file>
+        <file>black/random_off.png</file>
+        <file>black/random_on.png</file>
+        <file>black/repeat_all.png</file>
+        <file>black/repeat_off.png</file>
+        <file>black/repeat_one.png</file>
         <file>black/search.png</file>
         <file>black/select_all.png</file>
         <file>black/stop.png</file>
         <file>black/use.png</file>
         <file>black/volume.png</file>
         <file>black/window.png</file>
+        <file>white/add.png</file>
+        <file>white/artists.png</file>
+        <file>white/back.png</file>
+        <file>white/delete.png</file>
+        <file>white/deselect_all.png</file>
+        <file>white/dynamic.png</file>
+        <file>white/fav.png</file>
+        <file>white/forward.png</file>
+        <file>white/fullscreen.png</file>
+        <file>white/library.png</file>
+        <file>white/more_l.png</file>
+        <file>white/more.png</file>
+        <file>white/next.png</file>
+        <file>white/pause.png</file>
+        <file>white/play.png</file>
+        <file>white/playback.png</file>
+        <file>white/player.png</file>
+        <file>white/playlist.png</file>
+        <file>white/playlists.png</file>
+        <file>white/prev.png</file>
+        <file>white/random_off.png</file>
+        <file>white/random_on.png</file>
+        <file>white/repeat_all.png</file>
+        <file>white/repeat_off.png</file>
+        <file>white/repeat_one.png</file>
+        <file>white/search.png</file>
+        <file>white/select_all.png</file>
+        <file>white/stop.png</file>
+        <file>white/unmore_l.png</file>
+        <file>white/unmore.png</file>
+        <file>white/use.png</file>
+        <file>white/volume.png</file>
+        <file>white/window.png</file>
     </qresource>
 </RCC>
old mode 100755 (executable)
new mode 100644 (file)
diff --git a/resources/white/random_active.png b/resources/white/random_active.png
deleted file mode 100644 (file)
index aae80aa..0000000
Binary files a/resources/white/random_active.png and /dev/null differ
diff --git a/resources/white/random_inactive.png b/resources/white/random_inactive.png
deleted file mode 100644 (file)
index 746bcaf..0000000
Binary files a/resources/white/random_inactive.png and /dev/null differ
diff --git a/resources/white/random_off.png b/resources/white/random_off.png
new file mode 100644 (file)
index 0000000..679ae86
Binary files /dev/null and b/resources/white/random_off.png differ
diff --git a/resources/white/random_on.png b/resources/white/random_on.png
new file mode 100644 (file)
index 0000000..15a8835
Binary files /dev/null and b/resources/white/random_on.png differ
diff --git a/resources/white/repeat_active.png b/resources/white/repeat_active.png
deleted file mode 100644 (file)
index f574f11..0000000
Binary files a/resources/white/repeat_active.png and /dev/null differ
diff --git a/resources/white/repeat_all.png b/resources/white/repeat_all.png
new file mode 100644 (file)
index 0000000..6b88a87
Binary files /dev/null and b/resources/white/repeat_all.png differ
diff --git a/resources/white/repeat_inactive.png b/resources/white/repeat_inactive.png
deleted file mode 100644 (file)
index 004a4eb..0000000
Binary files a/resources/white/repeat_inactive.png and /dev/null differ
diff --git a/resources/white/repeat_off.png b/resources/white/repeat_off.png
new file mode 100644 (file)
index 0000000..7f3a0fe
Binary files /dev/null and b/resources/white/repeat_off.png differ
diff --git a/resources/white/repeat_one.png b/resources/white/repeat_one.png
new file mode 100644 (file)
index 0000000..b9f6938
Binary files /dev/null and b/resources/white/repeat_one.png differ
index faf5a88..975e47b 100644 (file)
@@ -93,6 +93,7 @@ LibraryForm::LibraryForm(Library *lib, QWidget *parent) :
        connect(ui->playlistsButton, SIGNAL(clicked()), this, SLOT(_playlists_button()));
        connect(ui->dynamicButton, SIGNAL(clicked()), this, SLOT(_dynamic_button()));
        connect(ui->listView, SIGNAL(clicked(QModelIndex)), this, SLOT(_process_list_click(QModelIndex)));
+       connect(ui->listView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(_process_dblclick(QModelIndex)));
        connect(ui->listView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
                this, SLOT(_process_selection(QItemSelection,QItemSelection)));
        connect(ui->addButton, SIGNAL(clicked()), this, SLOT(_add_button()));
@@ -225,6 +226,7 @@ void LibraryForm::_process_list_click(QModelIndex index) {
                        ui->listView->setColumnWidth(0, 70);
                        ui->listView->scrollToTop();
                        _state = STATE_PLAYLIST_TRACK;
+                       _is_dynamic = true;
                        ui->backButton->setEnabled(true);
                        ui->useButton->setEnabled(true);
                        ui->useButton->setIcon(QIcon(":/icons/"+_icons_theme+"/use.png"));
@@ -328,7 +330,12 @@ void LibraryForm::_back_button() {
                ui->listLabel->setText(QString("Albums by \"%1\"").arg(_current_artist));
                break;
        case STATE_PLAYLIST_TRACK:
-               _playlists_button();
+               if (_is_dynamic) {
+                       _dynamic_button();
+                       _is_dynamic = false;
+               } else {
+                       _playlists_button();
+               }
                ui->listView->scrollToTop();
        default:
                return;
@@ -614,6 +621,7 @@ void LibraryForm::updateIcons() {
        } else {
                ui->selectAllButton->setIcon(QIcon(":/icons/"+_icons_theme+"/select_all.png"));
        }
+       refresh();
 }
 
 void LibraryForm::checkGradient() {
@@ -641,3 +649,19 @@ void LibraryForm::_process_selection(QItemSelection selected, QItemSelection des
                ui->listView->selectionModel()->select(id, QItemSelectionModel::Deselect);
        }
 }
+
+void LibraryForm::_process_dblclick(QModelIndex id) {
+       if (id.column() == 0)
+               return;
+       if (_state == STATE_TRACK || _state == STATE_PLAYLIST_TRACK) {
+               qWarning() << "double clicked";
+               Playlist cur = _lib->getCurrentPlaylist();
+               Track track = _current_tracks.at(id.row());
+               cur.addTrack(track);
+               _lib->saveCurrentPlaylist(cur);
+               _current_playlist_changed = true;
+               emit addAndPlay(track);
+               ui->listView->clearSelection();
+       }
+}
+
index debf491..f3133ee 100644 (file)
@@ -53,6 +53,7 @@ signals:
        void busy(QString);
        void done();
        void fullscreen(bool);
+       void addAndPlay(Track);
 public slots:
        void search(QString);
        void nextItem();
@@ -74,6 +75,7 @@ private slots:
        void _back_button();
        void _use_button();
        void _process_list_click(QModelIndex);
+       void _process_dblclick(QModelIndex);
        void _process_selection(QItemSelection, QItemSelection);
        void _more_button();
 
@@ -82,6 +84,7 @@ private:
        Library *_lib;
        QStandardItemModel *_model;
        LibraryFormListState _state;
+       bool _is_dynamic; // workaround
        QString _current_artist;
        QString _current_album;
        Playlist _current_playlist;
index 4ab05bb..ddbca43 100644 (file)
@@ -81,6 +81,7 @@ MainWindow::MainWindow(QWidget *parent) :
        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();
index 37f9a02..9b105ad 100644 (file)
@@ -96,7 +96,7 @@ Player::Player(QObject *parent) :
        int seed = QTime::currentTime().msec();
        qsrand(seed);
        _random = _config.getValue("playback/random").toBool();
-       _repeat = _config.getValue("playback/repeat").toBool();
+       _repeat = (RepeatRule) _config.getValue("playback/repeat").toInt();
        _current = -1;
 }
 
@@ -133,6 +133,11 @@ void Player::next() {
                stop(); // empty playlist
                return;
        }
+       if (_repeat == REPEAT_ONE) {
+               _set_source();
+               play();
+               return;
+       }
        _history.push(_current % count);
        if (!_queue.isEmpty()) {
                _current = _queue.dequeue();
@@ -145,8 +150,8 @@ void Player::next() {
                        _current = _current + 1;
                }
        }
-       if (_random && _history.count() >= count && !_repeat ||
-               !_repeat && _current >= count) {
+       if (_random && _history.count() >= count && _repeat == REPEAT_NO||
+               _repeat == REPEAT_NO && _current >= count) {
                _history.clear();
                stop();
        } else {
@@ -250,7 +255,13 @@ void Player::toggleRandom() {
 }
 
 void Player::toggleRepeat() {
-       _repeat = !_repeat;
+       if (_repeat == REPEAT_NO) {
+               _repeat = REPEAT_ALL;
+       } else if (_repeat == REPEAT_ALL) {
+               _repeat = REPEAT_ONE;
+       } else if (_repeat == REPEAT_ONE) {
+               _repeat = REPEAT_NO;
+       }
        _config.setValue("playback/repeat", _repeat);
 }
 
index 562aad4..d7ff555 100644 (file)
@@ -44,6 +44,7 @@ namespace SomePlayer {
        namespace Playback {
 
                enum PlayerState { PLAYER_STOPPED, PLAYER_PLAYING, PLAYER_PAUSED, PLAYER_LOADING, PLAYER_DONE, PLAYER_ERROR };
+               enum RepeatRule {REPEAT_NO, REPEAT_ALL, REPEAT_ONE};
 
                class Randomizer {
                public:
@@ -63,7 +64,7 @@ namespace SomePlayer {
                        explicit Player(QObject *parent = 0);
 
                        bool random() {return _random;}
-                       bool repeat() {return _repeat;}
+                       RepeatRule repeat() {return _repeat;}
                        int volume() {return (int)(_output->volume()*100 + 0.5);}
                        Phonon::MediaObject* mediaObject() {return _player;}
                        bool equalizerEnabled() {return _equalizer_enabled;}
@@ -104,7 +105,7 @@ namespace SomePlayer {
                        int _current;
                        Track _track; // current track (workaround)
                        bool _random;
-                       bool _repeat;
+                       RepeatRule _repeat;
                        bool _equalizer_enabled;
                        QStack<int> _history;
                        QQueue<int> _queue;
index ecee53b..2ec4222 100644 (file)
@@ -59,14 +59,16 @@ PlayerForm::PlayerForm(Library* lib, QWidget *parent) :
        _time = new QTime();
        ui->setupUi(this);
        if (_player->random()) {
-               ui->randomButton->setIcon(QIcon(":/icons/"+_icons_theme+"/random_active.png"));
+               ui->randomButton->setIcon(QIcon(":/icons/"+_icons_theme+"/random_on.png"));
        } else {
-               ui->randomButton->setIcon(QIcon(":/icons/"+_icons_theme+"/random_inactive.png"));
+               ui->randomButton->setIcon(QIcon(":/icons/"+_icons_theme+"/random_off.png"));
        }
-       if (_player->repeat()) {
-               ui->repeatButton->setIcon(QIcon(":/icons/"+_icons_theme+"/repeat_active.png"));
+       if (_player->repeat() == REPEAT_ALL) {
+               ui->repeatButton->setIcon(QIcon(":/icons/"+_icons_theme+"/repeat_all.png"));
+       } else if (_player->repeat() == REPEAT_NO){
+               ui->repeatButton->setIcon(QIcon(":/icons/"+_icons_theme+"/repeat_off.png"));
        } else {
-               ui->repeatButton->setIcon(QIcon(":/icons/"+_icons_theme+"/repeat_inactive.png"));
+               ui->repeatButton->setIcon(QIcon(":/icons/"+_icons_theme+"/repeat_one.png"));
        }
        ui->volumeSlider->setMinimum(0);
        ui->volumeSlider->setMaximum(100);
@@ -254,18 +256,20 @@ void PlayerForm::_state_changed(PlayerState state) {
 void PlayerForm::_toggle_random() {
        _player->toggleRandom();
        if (_player->random()) {
-               ui->randomButton->setIcon(QIcon(":/icons/"+_icons_theme+"/random_active.png"));
+               ui->randomButton->setIcon(QIcon(":/icons/"+_icons_theme+"/random_on.png"));
        } else {
-               ui->randomButton->setIcon(QIcon(":/icons/"+_icons_theme+"/random_inactive.png"));
+               ui->randomButton->setIcon(QIcon(":/icons/"+_icons_theme+"/random_off.png"));
        }
 }
 
 void PlayerForm::_toggle_repeat() {
        _player->toggleRepeat();
-       if (_player->repeat()) {
-               ui->repeatButton->setIcon(QIcon(":/icons/"+_icons_theme+"/repeat_active.png"));
+       if (_player->repeat() == REPEAT_ALL) {
+               ui->repeatButton->setIcon(QIcon(":/icons/"+_icons_theme+"/repeat_all.png"));
+       } else if (_player->repeat() == REPEAT_NO){
+               ui->repeatButton->setIcon(QIcon(":/icons/"+_icons_theme+"/repeat_off.png"));
        } else {
-               ui->repeatButton->setIcon(QIcon(":/icons/"+_icons_theme+"/repeat_inactive.png"));
+               ui->repeatButton->setIcon(QIcon(":/icons/"+_icons_theme+"/repeat_one.png"));
        }
 }
 
@@ -499,15 +503,17 @@ void PlayerForm::updateIcons() {
        } else {
                ui->viewButton->setIcon(QIcon(":/icons/"+_icons_theme+"/playback.png"));
        }
-       if (_player->repeat()) {
-               ui->repeatButton->setIcon(QIcon(":/icons/"+_icons_theme+"/repeat_active.png"));
+       if (_player->repeat() == REPEAT_ALL) {
+               ui->repeatButton->setIcon(QIcon(":/icons/"+_icons_theme+"/repeat_all.png"));
+       } else if (_player->repeat() == REPEAT_NO){
+               ui->repeatButton->setIcon(QIcon(":/icons/"+_icons_theme+"/repeat_off.png"));
        } else {
-               ui->repeatButton->setIcon(QIcon(":/icons/"+_icons_theme+"/repeat_inactive.png"));
+               ui->repeatButton->setIcon(QIcon(":/icons/"+_icons_theme+"/repeat_one.png"));
        }
        if (_player->random()) {
-               ui->randomButton->setIcon(QIcon(":/icons/"+_icons_theme+"/random_active.png"));
+               ui->randomButton->setIcon(QIcon(":/icons/"+_icons_theme+"/random_on.png"));
        } else {
-               ui->randomButton->setIcon(QIcon(":/icons/"+_icons_theme+"/random_inactive.png"));
+               ui->randomButton->setIcon(QIcon(":/icons/"+_icons_theme+"/random_off.png"));
        }
 }
 
@@ -521,3 +527,12 @@ void PlayerForm::checkGradient() {
                ui->bottomWidget->setStyleSheet("");
        }
 }
+
+void PlayerForm::play(Track track) {
+       reload(true);
+       int id = _current_playlist.tracks().indexOf(track);
+       if (id > 0) {
+               _player->setTrackId(id);
+               _player->play();
+       }
+}
index 5e7014c..c7c1c1b 100644 (file)
@@ -74,6 +74,7 @@ public slots:
        void landscapeMode();
        void updateIcons();
        void checkGradient();
+       void play(Track);
 
 private slots:
        void _library();
index 96d6ad8..5c48ec1 100644 (file)
            </property>
           </widget>
          </item>
-         <item>
-          <widget class="QSlider" name="volumeSlider">
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="invertedAppearance">
-            <bool>false</bool>
-           </property>
-           <property name="invertedControls">
-            <bool>false</bool>
-           </property>
-          </widget>
-         </item>
         </layout>
        </widget>
        <widget class="QWidget" name="page_2">
        </widget>
       </widget>
      </item>
+     <item>
+      <widget class="QSlider" name="volumeSlider">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="invertedAppearance">
+        <bool>false</bool>
+       </property>
+       <property name="invertedControls">
+        <bool>false</bool>
+       </property>
+      </widget>
+     </item>
     </layout>
    </item>
    <item>
        </property>
        <property name="icon">
         <iconset resource="../../resources/resources.qrc">
-         <normaloff>:/icons/white/repeat_inactive.png</normaloff>:/icons/white/repeat_inactive.png</iconset>
+         <normaloff>:/icons/white/repeat_off.png</normaloff>:/icons/white/repeat_off.png</iconset>
        </property>
        <property name="iconSize">
         <size>
        </property>
        <property name="icon">
         <iconset resource="../../resources/resources.qrc">
-         <normaloff>:/icons/white/random_inactive.png</normaloff>:/icons/white/random_inactive.png</iconset>
+         <normaloff>:/icons/white/random_off.png</normaloff>:/icons/white/random_off.png</iconset>
        </property>
        <property name="iconSize">
         <size>