Implemented new features: 1.2.1
authorNikolay Tischenko <niktischenko@gmail.com>
Mon, 27 Sep 2010 05:37:10 +0000 (12:37 +0700)
committerNikolay Tischenko <niktischenko@gmail.com>
Mon, 27 Sep 2010 05:37:10 +0000 (12:37 +0700)
* stop timer
* tag editing
* soft volume slider
* sorting artist by alphabet in library
Fixed bugs:
* auto-refreshing library view after adding new directory

30 files changed:
resources/resources.qrc
resources/volume.png [new file with mode: 0644]
someplayer.pro
src/dbstorage.cpp
src/dbstorage.h
src/edittagsdialog.cpp [new file with mode: 0644]
src/edittagsdialog.h [new file with mode: 0644]
src/library.cpp
src/library.h
src/libraryform.cpp
src/libraryform.h
src/mainwindow.cpp
src/mainwindow.h
src/player/player.cpp
src/player/player.h
src/playerform.cpp
src/playerform.h
src/playlist.cpp
src/playlist.h
src/someplayer.h
src/tagresolver.cpp
src/tagresolver.h
src/timerdialog.cpp [new file with mode: 0644]
src/timerdialog.h [new file with mode: 0644]
src/track.cpp
src/track.h
src/ui/edittagsdialog.ui [new file with mode: 0644]
src/ui/playerform.ui
src/ui/playlistdialog.ui [new file with mode: 0644]
src/ui/timerdialog.ui [new file with mode: 0644]

index 444ab95..984ba8d 100644 (file)
@@ -25,5 +25,6 @@
         <file>forward.png</file>
         <file>window.png</file>
         <file>fullscreen.png</file>
+        <file>volume.png</file>
     </qresource>
 </RCC>
diff --git a/resources/volume.png b/resources/volume.png
new file mode 100644 (file)
index 0000000..6e833f8
Binary files /dev/null and b/resources/volume.png differ
index 1269327..f7e5f1b 100644 (file)
@@ -115,7 +115,9 @@ SOURCES += src/main.cpp\
     src/taglib/trueaudio/trueaudioproperties.cpp \
     src/taglib/trueaudio/trueaudiofile.cpp \
     src/taglib/wavpack/wavpackproperties.cpp \
-    src/taglib/wavpack/wavpackfile.cpp
+    src/taglib/wavpack/wavpackfile.cpp \
+    src/edittagsdialog.cpp \
+    src/timerdialog.cpp
 
 HEADERS  += src/mainwindow.h \
                src/player/player.h \
@@ -208,13 +210,17 @@ HEADERS  += src/mainwindow.h \
     src/taglib/trueaudio/trueaudioproperties.h \
     src/taglib/trueaudio/trueaudiofile.h \
     src/taglib/wavpack/wavpackproperties.h \
-    src/taglib/wavpack/wavpackfile.h
+    src/taglib/wavpack/wavpackfile.h \
+    src/edittagsdialog.h \
+    src/timerdialog.h
 
 FORMS    += src/ui/mainwindow.ui \
     src/ui/playerform.ui \
     src/ui/libraryform.ui \
     src/ui/busywidget.ui \
-    src/playlistdialog.ui
+    src/ui/playlistdialog.ui \
+    src/ui/edittagsdialog.ui \
+    src/ui/timerdialog.ui
 
 CONFIG += mobility
 MOBILITY = 
index b78dc3a..8b29483 100644 (file)
@@ -20,6 +20,7 @@
 #include "dbstorage.h"
 #include <QSqlQuery>
 #include <QSqlResult>
+#include <QDebug>
 
 using namespace SomePlayer::Storage;
 using namespace SomePlayer::DataObjects;
@@ -38,48 +39,54 @@ DbStorage::DbStorage(QString path) {
 
 void DbStorage::_prepare_queries() {
        _get_artists_query = new QSqlQuery(db);
-       _get_artists_query->prepare("SELECT name FROM artist");
+       _get_artists_query->prepare("SELECT name FROM artist ORDER BY name");
 
        _get_albums_for_artist_query = new QSqlQuery(db);
-       _get_albums_for_artist_query->prepare("SELECT name FROM album WHERE artist_id in (SELECT id from artist WHERE UPPER(name) = UPPER(:name));");
+       _get_albums_for_artist_query->prepare("SELECT name FROM album WHERE artist_id in (SELECT id from artist WHERE UPPER(name) = UPPER(:name)) ORDER BY name;");
 
        _get_tracks_for_album_query = new QSqlQuery(db);
        _get_tracks_for_album_query->prepare("SELECT id, title, source, count, length FROM tracks WHERE artist_id IN "
-                                                                                "(SELECT id FROM artist WHERE UPPER(name) = UPPER(:artist_name)) AND album_id IN "
-                                                                                "(SELECT id FROM album WHERE UPPER(name) = UPPER(:album_name));");
+                                                               "(SELECT id FROM artist WHERE UPPER(name) = UPPER(:artist_name)) AND album_id IN "
+                                                               "(SELECT id FROM album WHERE UPPER(name) = UPPER(:album_name));");
 
        _get_favorites_query = new QSqlQuery(db);
        _get_favorites_query->prepare("SELECT track_id as id, title, artist, album.name as album, source, count, length FROM "
-                                                                 "(SELECT tracks.id AS track_id, artist.name AS artist, title, count, source, tracks.album_id, length FROM "
-                                                                 "tracks JOIN artist ON tracks.artist_id = artist.id) "
-                                                                 "JOIN album ON album_id = album.id WHERE track_id IN "
-                                                                 "(SELECT track_id FROM favorites);");
+                                                               "(SELECT tracks.id AS track_id, artist.name AS artist, title, count, source, tracks.album_id, length FROM "
+                                                               "tracks JOIN artist ON tracks.artist_id = artist.id) "
+                                                               "JOIN album ON album_id = album.id WHERE track_id IN "
+                                                               "(SELECT track_id FROM favorites);");
 
        _get_most_played_query = new QSqlQuery(db);
        _get_most_played_query->prepare("SELECT track_id as id, title, artist, album.name as album, source, count, length FROM "
-                                                                       "(SELECT tracks.id AS track_id, artist.name AS artist, title, count, source, tracks.album_id, length FROM "
-                                                                       "tracks JOIN artist ON tracks.artist_id = artist.id) "
-                                                                       "JOIN album ON album_id = album.id ORDER BY count DESC "
-                                                                       "LIMIT 0, :max");
+                                                               "(SELECT tracks.id AS track_id, artist.name AS artist, title, count, source, tracks.album_id, length FROM "
+                                                               "tracks JOIN artist ON tracks.artist_id = artist.id) "
+                                                               "JOIN album ON album_id = album.id ORDER BY count DESC "
+                                                               "LIMIT 0, :max");
 
        _get_never_played_query = new QSqlQuery(db);
        _get_never_played_query->prepare("SELECT track_id as id, title, artist, album.name as album, source, count, length FROM "
-                                                                        "(SELECT tracks.id AS track_id, artist.name AS artist, title, count, source, tracks.album_id, length FROM "
-                                                                        "tracks JOIN artist ON tracks.artist_id = artist.id) "
-                                                                        "JOIN album ON album_id = album.id "
-                                                                        "WHERE count = 0");
+                                                               "(SELECT tracks.id AS track_id, artist.name AS artist, title, count, source, tracks.album_id, length FROM "
+                                                               "tracks JOIN artist ON tracks.artist_id = artist.id) "
+                                                               "JOIN album ON album_id = album.id "
+                                                               "WHERE count = 0");
 
        _get_recently_added_query = new QSqlQuery(db);
        _get_recently_added_query->prepare("SELECT track_id as id, title, artist, album.name as album, source, count, length FROM "
-                                                                          "(SELECT tracks.id AS track_id, artist.name AS artist, title, count, source, tracks.album_id, length FROM "
-                                                                          "tracks JOIN artist ON tracks.artist_id = artist.id) "
-                                                                          "JOIN album ON album_id = album.id "
-                                                                          "WHERE track_id IN "
-                                                                          "(SELECT track_id FROM adding_date ORDER BY date DESC LIMIT 0, :max)");
+                                                               "(SELECT tracks.id AS track_id, artist.name AS artist, title, count, source, tracks.album_id, length FROM "
+                                                               "tracks JOIN artist ON tracks.artist_id = artist.id) "
+                                                               "JOIN album ON album_id = album.id "
+                                                               "WHERE track_id IN "
+                                                               "(SELECT track_id FROM adding_date ORDER BY date DESC LIMIT 0, :max)");
 
        _get_track_count = new QSqlQuery(db);
        _get_track_count->prepare("SELECT count from tracks WHERE id = :id");
 
+       _get_track_by_source_query = new QSqlQuery(db);
+       _get_track_by_source_query->prepare("SELECT track_id AS id, title, artist, album.name AS album, source, count, length FROM "
+                                                               "(SELECT tracks.id AS track_id, artist.name AS artist, title, count, tracks.album_id, length FROM "
+                                                               "tracks JOIN artist ON tracks.artist_id = artist.id AND source = :source) "
+                                                               "JOIN album ON album_id = album.id LIMIT 1");
+
        _check_artist_query = new QSqlQuery(db);
        _check_artist_query->prepare("SELECT id FROM artist WHERE UPPER(name) = UPPER(:name)");
 
@@ -106,35 +113,38 @@ void DbStorage::_prepare_queries() {
 
        _update_track_count_query = new QSqlQuery(db);
        _update_track_count_query->prepare("UPDATE tracks SET count = :count where id = :id");
+
+       _remove_track_query = new QSqlQuery(db);
+       _remove_track_query->prepare("DELETE FROM tracks WHERE id = :id");
 }
 
 void DbStorage::_create_database_structure() {
        QSqlQuery *query = new QSqlQuery(db);
        query->exec("create table artist (id integer primary key, "
-                                                                               "name text "
-                                                                               ");");
+                                                               "name text "
+                                                               ");");
        query->exec("create table album (id integer primary key, "
-                                                                               "artist_id integer, "
-                                                                               "name text, "
-                                                                               "foreign key(artist_id) references arist(id) "
-                                                                               ");");
+                                                               "artist_id integer, "
+                                                               "name text, "
+                                                               "foreign key(artist_id) references arist(id) "
+                                                               ");");
        query->exec("create table tracks (id integer primary key, "
-                                                                               "artist_id integer, "
-                                                                               "album_id integer, "
-                                                                               "title text, "
-                                                                               "source text, "
-                                                                               "count integer default 0, "
-                                                                               "length integer default 0, "
-                                                                               "foreign key(artist_id) references artist(id), "
-                                                                               "foreign key(album_id) references album(id) "
-                                                                               ");");
+                                                               "artist_id integer, "
+                                                               "album_id integer, "
+                                                               "title text, "
+                                                               "source text, "
+                                                               "count integer default 0, "
+                                                               "length integer default 0, "
+                                                               "foreign key(artist_id) references artist(id), "
+                                                               "foreign key(album_id) references album(id) "
+                                                               ");");
        query->exec("create table favorites (track_id integer, "
-                                                                               "foreign key(track_id) references tracks(id) "
-                                                                               ");");
+                                                               "foreign key(track_id) references tracks(id) "
+                                                               ");");
        query->exec("create table adding_date (track_id integer, "
-                                                                               "date integer, "
-                                                                               "foreign key(track_id) references tracks(id) "
-                                                                               ");");
+                                                               "date integer, "
+                                                               "foreign key(track_id) references tracks(id) "
+                                                               ");");
 }
 
 DbStorage::~DbStorage() {
@@ -145,6 +155,7 @@ DbStorage::~DbStorage() {
        delete _get_never_played_query;
        delete _get_recently_added_query;
        delete _get_tracks_for_album_query;
+       delete _get_track_by_source_query;
        delete _check_album_query;
        delete _check_artist_query;
        delete _check_track_query;
@@ -154,6 +165,7 @@ DbStorage::~DbStorage() {
        delete _insert_track_query;
        delete _insert_favorites_query;
        delete _update_track_count_query;
+       delete _remove_track_query;
        db.close();
 }
 
@@ -311,6 +323,7 @@ void DbStorage::addTrack(Track track) {
        int artist_id = _check_add_artist(artist);
        int album_id = _check_add_album(album, artist_id);
        if (artist_id == -1 || album_id == -1) {
+               qDebug () << "one";
                //big bang
                return;
        }
@@ -318,6 +331,7 @@ void DbStorage::addTrack(Track track) {
        query->bindValue(":source", source);
        query->exec();
        if (query->next()) {
+               qDebug () << "two";
                // already in datebase, skip
                return;
        }
@@ -339,12 +353,15 @@ void DbStorage::addTrack(Track track) {
                        if (query->exec()) {
                                // ok
                        } else {
+                               qDebug () << "three";
                                // big bang
                        }
                } else {
+                       qDebug () << "four";
                        // big bang
                }
        } else {
+               qDebug () << "five";
                // big bang
        }
 }
@@ -368,6 +385,38 @@ void DbStorage::updateTrackCount(Track track) {
        }
 }
 
+Track DbStorage::updateTrack(Track track) {
+       QSqlQuery *query = _remove_track_query;
+       query->bindValue(":id", track.id());
+       if (!query->exec()) {
+               qDebug() << "Problem here";
+       }
+       addTrack(track);
+       query = _get_track_by_source_query;
+       query->bindValue(":source", track.source());
+       query->exec();
+       if (query->next()) {
+               qDebug() << "enter";
+               int id = query->value(0).toInt();
+               qDebug() << id;
+               QString title = query->value(1).toString();
+               qDebug() << title;
+               QString artist = query->value(2).toString();
+               qDebug() << artist;
+               QString album = query->value(3).toString();
+               qDebug() << album;
+               QString source = query->value(4).toString();
+               qDebug() << source;
+               int count = query->value(5).toInt();
+               int length = query->value(6).toInt();
+               TrackMetadata meta(title, artist, album, length);
+               Track ntrack(id, meta, source);
+               ntrack.setCount(count);
+               return ntrack;
+       }
+       return track;
+}
+
 int DbStorage::_check_add_artist(QString artist) {
        QSqlQuery *query = _check_artist_query;
        query->bindValue(":name", artist);
index 5c1b761..822140d 100644 (file)
@@ -55,6 +55,7 @@ namespace SomePlayer {
                        void addToFavorites(Track track);
 
                        void updateTrackCount(Track track);
+                       Track updateTrack(Track);
                        void addTrack(Track track);
 
                private:
@@ -74,6 +75,7 @@ namespace SomePlayer {
                        QSqlQuery *_get_never_played_query;
                        QSqlQuery *_get_recently_added_query;
                        QSqlQuery *_get_track_count;
+                       QSqlQuery *_get_track_by_source_query;
 
                        QSqlQuery *_check_artist_query;
                        QSqlQuery *_check_album_query;
@@ -86,6 +88,8 @@ namespace SomePlayer {
                        QSqlQuery *_insert_favorites_query;
 
                        QSqlQuery *_update_track_count_query;
+
+                       QSqlQuery *_remove_track_query;
                };
        };
 };
diff --git a/src/edittagsdialog.cpp b/src/edittagsdialog.cpp
new file mode 100644 (file)
index 0000000..b385270
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * SomePlayer - An alternate music player for Maemo 5
+ * Copyright (C) 2010 Nikolay (somebody) Tischenko <niktischenko@gmail.com>
+ *
+ * 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 "edittagsdialog.h"
+#include "ui_edittagsdialog.h"
+#include "trackmetainformation.h"
+
+using namespace SomePlayer::DataObjects;
+
+EditTagsDialog::EditTagsDialog(QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::EditTagsDialog)
+{
+    ui->setupUi(this);
+}
+
+EditTagsDialog::~EditTagsDialog()
+{
+    delete ui;
+}
+
+void EditTagsDialog::setTrackMetadata(TrackMetadata meta) {
+       _meta = meta;
+       ui->artistLineEdit->setText(meta.artist());
+       ui->albumLineEdit->setText(meta.album());
+       ui->titleLineEdit->setText(meta.title());
+}
+
+TrackMetadata EditTagsDialog::meta() {
+       _meta.setArtist(ui->artistLineEdit->text());
+       _meta.setAlbum(ui->albumLineEdit->text());
+       _meta.setTitle(ui->titleLineEdit->text());
+       return _meta;
+}
diff --git a/src/edittagsdialog.h b/src/edittagsdialog.h
new file mode 100644 (file)
index 0000000..a2b2b4b
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * SomePlayer - An alternate music player for Maemo 5
+ * Copyright (C) 2010 Nikolay (somebody) Tischenko <niktischenko@gmail.com>
+ *
+ * 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 EDITTAGSDIALOG_H
+#define EDITTAGSDIALOG_H
+
+#include <QDialog>
+#include "someplayer.h"
+#include "trackmetainformation.h"
+
+using SomePlayer::DataObjects::TrackMetadata;
+namespace Ui {
+    class EditTagsDialog;
+}
+
+class EditTagsDialog : public QDialog
+{
+    Q_OBJECT
+
+public:
+    explicit EditTagsDialog(QWidget *parent = 0);
+    ~EditTagsDialog();
+    void setTrackMetadata(TrackMetadata meta);
+    TrackMetadata meta();
+
+private:
+    Ui::EditTagsDialog *ui;
+    TrackMetadata _meta;
+};
+
+#endif // EDITTAGSDIALOG_H
index 562afd5..7f8165b 100644 (file)
@@ -18,6 +18,7 @@
  */
 
 #include "library.h"
+#include <QDebug>
 
 using namespace SomePlayer::DataObjects;
 using namespace SomePlayer::Storage;
@@ -142,3 +143,22 @@ void Library::_scanned(QStringList files) {
        emit addingTracks(files.count());
        _resolver->decode(files);
 }
+
+void Library::updateTrackMetadata(Track track) {
+       Track ntrack = track;
+       if (track.id() > 0) {
+               ntrack = _library_storage->updateTrack(track);
+       }
+       // update all playlists
+       QList<QString> playlists = getPlaylistsNames();
+       foreach (QString name, playlists) {
+               Playlist pl = getPlaylist(name);
+               QList<Track> tracks = pl.tracks();
+               int pos = tracks.indexOf(ntrack); // comparing using source
+               tracks.removeOne(ntrack); // comparing using source
+               tracks.insert(pos, ntrack);
+               pl.setTracks(tracks);
+               savePlaylist(pl);
+       }
+       _resolver->updateTags(ntrack);
+}
index 9268609..6359548 100644 (file)
@@ -90,6 +90,7 @@ namespace SomePlayer {
                        void addTrack(Track);
                        void addToFavorites(Track);
                        void updateTrackCount(Track);
+                       void updateTrackMetadata(Track);
                };
 
        };
index f63cdf4..5fd2177 100644 (file)
@@ -358,3 +358,29 @@ void LibraryForm::cancelSearch() {
        _search_pattern = "";
        ui->listView->selectionModel()->clearSelection();
 }
+
+void LibraryForm::refresh() {
+       switch (_state) {
+       case STATE_ARTIST:
+               _view_button();
+               break;
+       case STATE_ALBUM:
+               __fill_model(_model, _lib->getAlbumsForArtist(_current_artist));
+               break;
+       case STATE_PLAYLIST:
+               _playlists_button();
+               break;
+       case STATE_DYNAMIC:
+               _dynamic_button();
+               break;
+       case STATE_PLAYLIST_TRACK:
+               _current_playlist = _lib->getPlaylist(_current_playlist.name());
+               _current_tracks = _current_playlist.tracks();
+               __fill_model_tracks(_model, _current_tracks);
+               break;
+       case STATE_TRACK:
+               _current_tracks = _lib->getTracksForAlbum(_current_album, _current_artist);
+               __fill_model_tracks(_model, _current_tracks);
+               break;
+       }
+}
index 8e7892c..6672789 100644 (file)
@@ -54,6 +54,7 @@ public slots:
        void nextItem();
        void prevItem();
        void cancelSearch();
+       void refresh();
 private slots:
        void _player();
        void _view_button();
index 424023f..63017be 100644 (file)
@@ -27,6 +27,7 @@
 #include "player/player.h"
 
 #include "library.h"
+#include "timerdialog.h"
 
 using namespace SomePlayer::DataObjects;
 using namespace SomePlayer::Storage;
@@ -44,6 +45,7 @@ MainWindow::MainWindow(QWidget *parent) :
        _player_form = new PlayerForm(_library, ui->stackedWidget);
        _library_form = new LibraryForm(_library, ui->stackedWidget);
        _busy_widget = new BusyWidget(ui->stackedWidget);
+       _timer = new QTimer(this);
        ui->stackedWidget->insertWidget(0, _player_form);
        ui->stackedWidget->insertWidget(1, _library_form);
        ui->stackedWidget->insertWidget(2, _busy_widget);
@@ -51,13 +53,16 @@ MainWindow::MainWindow(QWidget *parent) :
        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");
        connect(_player_form, SIGNAL(library()), this, SLOT(library()));
        connect(_library_form, SIGNAL(player()), this, SLOT(player()));
        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(_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()));
@@ -69,6 +74,7 @@ MainWindow::MainWindow(QWidget *parent) :
        connect(ui->nextButton, SIGNAL(clicked()), this, SLOT(_nextItem()));
        connect(ui->prevButton, SIGNAL(clicked()), this, SLOT(_prevItem()));
        connect(ui->fscreenButton, SIGNAL(clicked()), this, SLOT(_toggle_full_screen()));
+       connect(_timer, SIGNAL(timeout()), this, SLOT(_timeout()));
        hideSearchPanel();
        library();
 }
@@ -85,7 +91,7 @@ void MainWindow::aboutQt() {
 }
 
 void MainWindow::about() {
-       QMessageBox::about(this, "About SomePlayer", "Alternate music player for Maemo 5 "
+       QMessageBox::about(this, QString("About SomePlayer v")+_SOMEPLAYER_VERSION_, "Alternate music player for Maemo 5 "
                                           "written in C++ with Qt4\n\n"
                                           "Author: Nikolay Tischenko aka \"somebody\" <niktischenko@gmail.com>");
 }
@@ -206,3 +212,31 @@ void MainWindow::_add_files() {
        QStringList files = QFileDialog::getOpenFileNames(this, "Add file");
        if (!files.isEmpty()) _player_form->addFiles(files);
 }
+
+void MainWindow::_set_timer() {
+       TimerDialog dialog(this);
+       dialog.init();
+       if (_timer->isActive()) {
+               dialog.showDisable();
+               int msec = _timer->interval();
+               int h = msec/3600000;
+               int m = msec/60000 - h * 60;
+               int s = msec/1000 - h * 3600 - m * 60;
+               dialog.setTime(h, m, s);
+       }
+       if (QDialog::Accepted == dialog.exec()) {
+               if (!dialog.timerDisabled()) {
+                       int h, m, s;
+                       dialog.getTime(&h, &m, &s);
+                       _timer->setInterval(h*3600000+m*60000+s*1000);
+                       _timer->start();
+               } else if (_timer->isActive()) {
+                       _timer->stop();
+               }
+       }
+}
+
+void MainWindow::_timeout() {
+       _player_form->stop();
+       _timer->stop();
+}
index e2036e4..3a274a0 100644 (file)
@@ -26,6 +26,7 @@
 #include "libraryform.h"
 #include "busywidget.h"
 #include "library.h"
+#include <QTimer>
 
 namespace Ui {
        class MainWindow;
@@ -63,11 +64,14 @@ private slots:
        void _prevItem();
        void _cancelSearch();
        void _toggle_full_screen();
+       void _set_timer();
+       void _timeout();
 private:
        PlayerForm *_player_form;
        LibraryForm *_library_form;
        BusyWidget *_busy_widget;
        Library *_library;
+       QTimer *_timer;
 };
 
 #endif // MAINWINDOW_H
index bd8c8d5..05d37cd 100644 (file)
@@ -188,3 +188,6 @@ void Player::toggleRepeat() {
        _config.setValue("playback/repeat", _repeat);
 }
 
+void Player::setVolume(int v) {
+       _output->setVolume(v*0.01);
+}
index cf45026..625aa63 100644 (file)
@@ -8,6 +8,7 @@
 #include "../playlist.h"
 #include <phonon/MediaObject>
 #include <phonon/AudioOutput>
+#include <phonon/VolumeSlider>
 #include <QStack>
 #include <QQueue>
 
@@ -31,6 +32,7 @@ namespace SomePlayer {
 
                        bool random() {return _random;}
                        bool repeat() {return _repeat;}
+                       int volume() {return (int)(_output->volume()*100 + 0.5);}
                        Phonon::MediaObject* mediaObject() {return _player;}
 
                signals:
@@ -51,6 +53,7 @@ namespace SomePlayer {
                        void toggleRandom();
                        void toggleRepeat();
                        void seek(int);
+                       void setVolume(int);
                private slots:
                        void _stateChanged(Phonon::State, Phonon::State);
                        void _tick(qint64);
index fd2bdab..4aa4e16 100644 (file)
@@ -27,6 +27,7 @@
 #include "trackrenderer.h"
 #include <QResource>
 #include "playlistdialog.h"
+#include "edittagsdialog.h"
 
 using namespace SomePlayer::DataObjects;
 using namespace SomePlayer::Playback;
@@ -61,6 +62,9 @@ PlayerForm::PlayerForm(Library* lib, QWidget *parent) :
        } else {
                ui->repeatButton->setIcon(QIcon(":/icons/repeat_inactive.png"));
        }
+       ui->volumeSlider->setMinimum(0);
+       ui->volumeSlider->setMaximum(100);
+       ui->volumeSlider->hide();
        _seek_slider = new QSlider(Qt::Horizontal);
        _seek_slider->setEnabled(false);
        ui->progressLayout->insertWidget(1, _seek_slider);
@@ -69,9 +73,10 @@ PlayerForm::PlayerForm(Library* lib, QWidget *parent) :
        ui->playlistView->setModel(_model);
        _context_menu = new QMenu(ui->playlistView);
        QAction *delete_action = _context_menu->addAction("Delete");
-       QAction *enqueue_action = _context_menu->addAction("Enqueue");
        QAction *add_to_favorites = _context_menu->addAction("Add to favorites");
+       QAction *enqueue_action = _context_menu->addAction("Enqueue");
        QAction *add_to_playlists = _context_menu->addAction("Add to playlists");
+       QAction *edit_tags = _context_menu->addAction("Edit tags");
 
        _track_renderer = new TrackRenderer(this);
        ui->playlistView->setItemDelegateForColumn(0, _track_renderer);
@@ -90,14 +95,17 @@ PlayerForm::PlayerForm(Library* lib, QWidget *parent) :
        connect(ui->randomButton, SIGNAL(clicked()), this, SLOT(_toggle_random()));
        connect(ui->repeatButton, SIGNAL(clicked()), this, SLOT(_toggle_repeat()));
        connect(_seek_slider, SIGNAL(sliderReleased()), this, SLOT(_slider_released()));
+       connect(ui->volumeSlider, SIGNAL(sliderMoved(int)), _player, SLOT(setVolume(int)));
        connect(ui->playlistView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(_custom_context_venu_requested(QPoint)));
        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()));
        connect(add_to_playlists, SIGNAL(triggered()), this, SLOT(_add_to_playlists()));
+       connect(edit_tags, SIGNAL(triggered()), this, SLOT(_edit_tags()));
        connect(_player, SIGNAL(stateChanged(PlayerState)), this, SLOT(_state_changed(PlayerState)));
        connect(_player, SIGNAL(trackDone(Track)), _lib, SLOT(updateTrackCount(Track)));
        connect(_tag_resolver, SIGNAL(decoded(Track)), this, SLOT(_track_decoded(Track)));
+       connect(ui->volumeButton, SIGNAL(clicked()), this, SLOT(_toggle_volume()));
 }
 
 PlayerForm::~PlayerForm()
@@ -297,11 +305,43 @@ void PlayerForm::_add_to_playlists() {
        QList<QString> names = _lib->getPlaylistsNames();
        names.removeOne(_CURRENT_PLAYLIST_SUBST_);
        PlaylistDialog dialog(names, this);
-       dialog.exec();
-       QList<QString> selected = dialog.selected();
-       foreach (QString name, selected) {
-               Playlist pl = _lib->getPlaylist(name);
-               pl.addTrack(_current_playlist.tracks().at(id));
-               _lib->savePlaylist(pl);
+       if (dialog.exec() == QDialog::Accepted) {
+               QList<QString> selected = dialog.selected();
+               foreach (QString name, selected) {
+                       Playlist pl = _lib->getPlaylist(name);
+                       pl.addTrack(_current_playlist.tracks().at(id));
+                       _lib->savePlaylist(pl);
+               }
        }
 }
+
+void PlayerForm::_edit_tags() {
+       QList<QModelIndex> idx = ui->playlistView->selectionModel()->selectedIndexes();
+       Track track = _current_playlist.tracks().at(idx.first().row());
+
+       EditTagsDialog dialog(this);
+       dialog.setTrackMetadata(track.metadata());
+       if (dialog.exec() == QDialog::Accepted) {
+               track.setMetadata(dialog.meta());
+               _lib->updateTrackMetadata(track);
+               reload();
+       }
+}
+
+void PlayerForm::stop() {
+       _player->stop();
+}
+
+void PlayerForm::_toggle_volume() {
+       if (ui->volumeSlider->isVisible()) {
+               ui->volumeSlider->hide();
+       } else {
+               ui->volumeSlider->show();
+               ui->volumeSlider->setValue(_player->volume());
+       }
+}
+
+void PlayerForm::_volume_changed() {
+       int value = ui->volumeSlider->value();
+       _player->setVolume(value);
+}
index 6129049..5f9f00d 100644 (file)
@@ -61,6 +61,7 @@ public slots:
        void prevItem();
        void cancelSearch();
        void addFiles(QList<QString> files);
+       void stop();
 
 private slots:
        void _library();
@@ -74,10 +75,13 @@ private slots:
        void _enqueue_track();
        void _add_to_favorites();
        void _add_to_playlists();
+       void _edit_tags();
        void _state_changed(PlayerState);
        void _toggle_repeat();
        void _toggle_random();
+       void _toggle_volume();
        void _track_decoded(Track);
+       void _volume_changed();
 
 private:
     Ui::PlayerForm *ui;
index 81ea60c..2233da3 100644 (file)
@@ -57,6 +57,10 @@ void Playlist::removeTrackAt(int id) {
        _tracks.removeAt(id);
 }
 
+void Playlist::setTracks(QList<Track> tracks) {
+       _tracks = tracks;
+}
+
 void Playlist::clear() {
        _tracks.clear();
 }
index 3abb9e6..28975db 100644 (file)
@@ -42,6 +42,7 @@ namespace SomePlayer {
                        void addTrack(Track track);
                        void removeTrack(Track track);
                        void removeTrackAt(int id);
+                       void setTracks(QList<Track>);
                        void clear();
 
                private:
index 2008b4b..8920e77 100644 (file)
@@ -47,6 +47,7 @@ namespace SomePlayer {
 #include "config.h"
 
 #define _DYNAMIC_PLAYLIST_MAX_COUNT_ 50
+#define _SOMEPLAYER_VERSION_ "1.2.1"
 #define NDEBUG
 
 #endif
index 9ab07a4..10bf0a6 100644 (file)
@@ -50,3 +50,16 @@ void TagResolver::decode(QStringList files) {
        }
        emit done();
 }
+
+void TagResolver::updateTags(Track track) {
+       TagLib::FileRef file_ref(QFile::encodeName(track.source()).data());
+       if (!file_ref.isNull()) {
+               TagLib::Tag *tag = file_ref.tag();
+               if (NULL != tag) {
+                       tag->setArtist(TagLib::String(track.metadata().artist().toStdWString()));
+                       tag->setAlbum(TagLib::String(track.metadata().album().toStdWString()));
+                       tag->setTitle(TagLib::String(track.metadata().title().toStdWString()));
+               }
+               file_ref.save();
+       }
+}
index 31facd9..459a6c9 100644 (file)
@@ -37,6 +37,7 @@ namespace SomePlayer {
                        explicit TagResolver(QObject *parent = 0);
                public slots:
                        void decode (QStringList files);
+                       void updateTags(Track);
 
                signals:
                        void decoded(Track);
diff --git a/src/timerdialog.cpp b/src/timerdialog.cpp
new file mode 100644 (file)
index 0000000..e2856bc
--- /dev/null
@@ -0,0 +1,46 @@
+#include "timerdialog.h"
+#include "ui_timerdialog.h"
+#include <QDebug>
+
+TimerDialog::TimerDialog(QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::TimerDialog)
+{
+    ui->setupUi(this);
+    ui->disableCheckBox->setChecked(false);
+    ui->disableCheckBox->setVisible(false);
+}
+
+TimerDialog::~TimerDialog()
+{
+    delete ui;
+}
+
+void TimerDialog::init() {
+       setTime(0, 0, 0);
+}
+
+void TimerDialog::setTime(int h, int m, int s) {
+       if (h < 0 || h > 12 || m < 0 || m > 59 || s < 0 || s > 59)
+               return;
+       ui->hoursListWidget->setCurrentRow(h);
+       ui->hoursListWidget->scrollTo(ui->hoursListWidget->model()->index(h, 0));
+       ui->minutesListWidget->setCurrentRow(m);
+       ui->minutesListWidget->scrollTo(ui->minutesListWidget->model()->index(m, 0));
+       ui->secondsListWidget->setCurrentRow(s);
+       ui->secondsListWidget->scrollTo(ui->secondsListWidget->model()->index(s, 0));
+}
+
+void TimerDialog::getTime(int *h, int *m, int *s) {
+       (*h) = ui->hoursListWidget->currentRow();
+       (*m) = ui->minutesListWidget->currentRow();
+       (*s) = ui->secondsListWidget->currentRow();
+}
+
+bool TimerDialog::timerDisabled() {
+       return ui->disableCheckBox->isChecked();
+}
+
+void TimerDialog::showDisable() {
+       ui->disableCheckBox->setVisible(true);
+}
diff --git a/src/timerdialog.h b/src/timerdialog.h
new file mode 100644 (file)
index 0000000..bc56b10
--- /dev/null
@@ -0,0 +1,30 @@
+#ifndef TIMERDIALOG_H
+#define TIMERDIALOG_H
+
+#include <QDialog>
+
+namespace Ui {
+    class TimerDialog;
+}
+
+class TimerDialog : public QDialog
+{
+    Q_OBJECT
+
+public:
+    explicit TimerDialog(QWidget *parent = 0);
+    ~TimerDialog();
+    void getTime(int *, int *, int *);
+    bool timerDisabled();
+
+public slots:
+    void init();
+    void setTime (int, int, int);
+    void showDisable();
+
+
+private:
+    Ui::TimerDialog *ui;
+};
+
+#endif // TIMERDIALOG_H
index 66bde60..807f156 100644 (file)
@@ -59,6 +59,10 @@ TrackMetadata Track::metadata() const {
        return _metadata;
 }
 
+void Track::setMetadata(TrackMetadata meta) {
+       _metadata = meta;
+}
+
 QString Track::source() const {
        return _source;
 }
index 8d1d488..5a81d90 100644 (file)
@@ -41,6 +41,7 @@ namespace SomePlayer {
                        ~Track();
                        Track &operator=(const Track &track);
                        TrackMetadata metadata() const; //read-write
+                       void setMetadata(TrackMetadata meta);
                        QString source() const;
                        int id() const;
                        void setSource (QString source);
diff --git a/src/ui/edittagsdialog.ui b/src/ui/edittagsdialog.ui
new file mode 100644 (file)
index 0000000..f45b77f
--- /dev/null
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>EditTagsDialog</class>
+ <widget class="QDialog" name="EditTagsDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>800</width>
+    <height>480</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Edit tags</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_2">
+   <item row="0" column="0">
+    <layout class="QGridLayout" name="gridLayout">
+     <item row="0" column="0">
+      <widget class="QLabel" name="artistLabel">
+       <property name="text">
+        <string>Artist:</string>
+       </property>
+      </widget>
+     </item>
+     <item row="0" column="1">
+      <widget class="QLineEdit" name="artistLineEdit"/>
+     </item>
+     <item row="1" column="0">
+      <widget class="QLabel" name="albumLabel">
+       <property name="text">
+        <string>Album:</string>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="1">
+      <widget class="QLineEdit" name="albumLineEdit"/>
+     </item>
+     <item row="2" column="0">
+      <widget class="QLabel" name="titleLabel">
+       <property name="text">
+        <string>Title:</string>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="1">
+      <widget class="QLineEdit" name="titleLineEdit"/>
+     </item>
+    </layout>
+   </item>
+   <item row="1" column="0">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>EditTagsDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>EditTagsDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
index 2c2b473..2ebead7 100644 (file)
   <property name="windowTitle">
    <string>Form</string>
   </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <property name="spacing">
+  <layout class="QGridLayout" name="gridLayout_2">
+   <property name="margin">
     <number>0</number>
    </property>
-   <property name="margin">
+   <property name="spacing">
     <number>0</number>
    </property>
-   <item>
-    <widget class="QStackedWidget" name="stackedWidget">
-     <property name="currentIndex">
-      <number>1</number>
+   <item row="0" column="0">
+    <layout class="QHBoxLayout" name="horizontalLayout_3">
+     <property name="spacing">
+      <number>0</number>
      </property>
-     <widget class="QWidget" name="page">
-      <layout class="QVBoxLayout" name="verticalLayout_4">
-       <property name="spacing">
-        <number>0</number>
-       </property>
-       <property name="margin">
-        <number>0</number>
-       </property>
-       <item>
-        <widget class="QListView" name="playlistView">
-         <property name="contextMenuPolicy">
-          <enum>Qt::CustomContextMenu</enum>
-         </property>
-         <property name="editTriggers">
-          <set>QAbstractItemView::NoEditTriggers</set>
-         </property>
-         <property name="textElideMode">
-          <enum>Qt::ElideLeft</enum>
-         </property>
-         <property name="uniformItemSizes">
-          <bool>true</bool>
+     <item>
+      <widget class="QStackedWidget" name="stackedWidget">
+       <property name="currentIndex">
+        <number>1</number>
+       </property>
+       <widget class="QWidget" name="page">
+        <layout class="QVBoxLayout" name="verticalLayout_4">
+         <property name="spacing">
+          <number>0</number>
          </property>
-         <property name="wordWrap">
-          <bool>true</bool>
+         <property name="margin">
+          <number>0</number>
          </property>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="page_2">
-      <layout class="QGridLayout" name="gridLayout">
-       <item row="0" column="0">
-        <widget class="QWidget" name="widget" native="true">
-         <layout class="QVBoxLayout" name="verticalLayout_2">
-          <item>
-           <layout class="QHBoxLayout" name="horizontalLayout_5">
+         <item>
+          <widget class="QListView" name="playlistView">
+           <property name="contextMenuPolicy">
+            <enum>Qt::CustomContextMenu</enum>
+           </property>
+           <property name="editTriggers">
+            <set>QAbstractItemView::NoEditTriggers</set>
+           </property>
+           <property name="textElideMode">
+            <enum>Qt::ElideLeft</enum>
+           </property>
+           <property name="uniformItemSizes">
+            <bool>true</bool>
+           </property>
+           <property name="wordWrap">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+       <widget class="QWidget" name="page_2">
+        <layout class="QGridLayout" name="gridLayout">
+         <item row="0" column="0">
+          <widget class="QWidget" name="widget" native="true">
+           <layout class="QVBoxLayout" name="verticalLayout_2">
             <item>
-             <spacer name="horizontalSpacer_2">
-              <property name="orientation">
-               <enum>Qt::Horizontal</enum>
-              </property>
-              <property name="sizeHint" stdset="0">
-               <size>
-                <width>40</width>
-                <height>20</height>
-               </size>
-              </property>
-             </spacer>
+             <layout class="QHBoxLayout" name="horizontalLayout_5">
+              <item>
+               <spacer name="horizontalSpacer_2">
+                <property name="orientation">
+                 <enum>Qt::Horizontal</enum>
+                </property>
+                <property name="sizeHint" stdset="0">
+                 <size>
+                  <width>40</width>
+                  <height>20</height>
+                 </size>
+                </property>
+               </spacer>
+              </item>
+              <item>
+               <widget class="QLabel" name="countLabel">
+                <property name="text">
+                 <string>0/0</string>
+                </property>
+                <property name="alignment">
+                 <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+                </property>
+               </widget>
+              </item>
+             </layout>
             </item>
             <item>
-             <widget class="QLabel" name="countLabel">
+             <widget class="QLabel" name="titleLabel">
               <property name="text">
-               <string>0/0</string>
+               <string>&lt;h3&gt;Title&lt;/h3&gt;</string>
               </property>
               <property name="alignment">
-               <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+               <set>Qt::AlignCenter</set>
               </property>
              </widget>
             </item>
-           </layout>
-          </item>
-          <item>
-           <widget class="QLabel" name="titleLabel">
-            <property name="text">
-             <string>&lt;h3&gt;Title&lt;/h3&gt;</string>
-            </property>
-            <property name="alignment">
-             <set>Qt::AlignCenter</set>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <layout class="QHBoxLayout" name="progressLayout">
             <item>
-             <widget class="QLabel" name="doneTimeLabel">
-              <property name="text">
-               <string>00:00</string>
-              </property>
-             </widget>
+             <layout class="QHBoxLayout" name="progressLayout">
+              <item>
+               <widget class="QLabel" name="doneTimeLabel">
+                <property name="text">
+                 <string>00:00</string>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <widget class="QLabel" name="allTimeLabel">
+                <property name="text">
+                 <string>00:00</string>
+                </property>
+               </widget>
+              </item>
+             </layout>
             </item>
             <item>
-             <widget class="QLabel" name="allTimeLabel">
+             <widget class="QLabel" name="artistAlbumLabel">
               <property name="text">
-               <string>00:00</string>
+               <string>&lt;b&gt;Artist&lt;/b&gt;&lt;br/&gt;album</string>
+              </property>
+              <property name="alignment">
+               <set>Qt::AlignCenter</set>
               </property>
              </widget>
             </item>
            </layout>
-          </item>
-          <item>
-           <widget class="QLabel" name="artistAlbumLabel">
-            <property name="text">
-             <string>&lt;b&gt;Artist&lt;/b&gt;&lt;br/&gt;album</string>
-            </property>
-            <property name="alignment">
-             <set>Qt::AlignCenter</set>
-            </property>
-           </widget>
-          </item>
-         </layout>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+      </widget>
+     </item>
+     <item>
+      <layout class="QHBoxLayout" name="volumeLayout">
+       <item>
+        <widget class="QSlider" name="volumeSlider">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
         </widget>
        </item>
       </layout>
-     </widget>
-    </widget>
+     </item>
+    </layout>
    </item>
-   <item>
+   <item row="1" column="0">
     <layout class="QHBoxLayout" name="horizontalLayout">
      <property name="spacing">
       <number>0</number>
        </property>
       </widget>
      </item>
+     <item>
+      <spacer name="horizontalSpacer_5">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QPushButton" name="volumeButton">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="minimumSize">
+        <size>
+         <width>70</width>
+         <height>70</height>
+        </size>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset resource="../../resources/resources.qrc">
+         <normaloff>:/icons/volume.png</normaloff>:/icons/volume.png</iconset>
+       </property>
+       <property name="flat">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
     </layout>
    </item>
   </layout>
diff --git a/src/ui/playlistdialog.ui b/src/ui/playlistdialog.ui
new file mode 100644 (file)
index 0000000..048b5c6
--- /dev/null
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PlaylistDialog</class>
+ <widget class="QDialog" name="PlaylistDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>592</width>
+    <height>361</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Dialog</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="spacing">
+    <number>0</number>
+   </property>
+   <property name="margin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="QListView" name="listView">
+     <property name="editTriggers">
+      <set>QAbstractItemView::NoEditTriggers</set>
+     </property>
+     <property name="selectionMode">
+      <enum>QAbstractItemView::MultiSelection</enum>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>PlaylistDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>PlaylistDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/src/ui/timerdialog.ui b/src/ui/timerdialog.ui
new file mode 100644 (file)
index 0000000..7de7cac
--- /dev/null
@@ -0,0 +1,1196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>TimerDialog</class>
+ <widget class="QDialog" name="TimerDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>800</width>
+    <height>480</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Set timer</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <item row="0" column="0" colspan="2">
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout">
+       <item>
+        <widget class="QLabel" name="label">
+         <property name="text">
+          <string>Hours</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QListWidget" name="hoursListWidget">
+         <item>
+          <property name="text">
+           <string>00</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>01</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>02</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>03</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>04</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>05</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>06</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>07</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>08</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>09</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>10</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>11</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>12</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+        </widget>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QLabel" name="label_2">
+       <property name="text">
+        <string>:</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout_2">
+       <item>
+        <widget class="QLabel" name="label_4">
+         <property name="text">
+          <string>Minutes</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QListWidget" name="minutesListWidget">
+         <item>
+          <property name="text">
+           <string>00</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>01</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>02</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>03</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>04</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>05</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>06</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>07</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>08</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>09</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>10</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>11</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>12</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>13</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>14</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>15</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>16</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>17</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>18</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>19</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>20</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>21</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>22</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>23</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>24</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>25</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>26</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>27</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>28</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>29</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>30</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>31</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>32</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>33</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>34</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>35</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>36</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>37</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>38</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>40</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>41</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>42</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>43</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>44</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>45</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>46</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>47</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>48</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>49</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>50</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>51</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>52</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>53</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>54</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>55</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>56</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>57</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>58</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>59</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+        </widget>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QLabel" name="label_3">
+       <property name="text">
+        <string>:</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout_3">
+       <item>
+        <widget class="QLabel" name="label_5">
+         <property name="text">
+          <string>Seconds</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QListWidget" name="secondsListWidget">
+         <item>
+          <property name="text">
+           <string>00</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>01</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>02</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>03</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>04</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>05</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>06</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>07</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>08</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>09</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>10</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>11</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>12</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>13</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>14</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>15</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>16</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>17</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>18</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>19</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>20</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>21</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>22</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>23</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>24</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>25</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>26</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>27</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>28</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>29</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>30</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>31</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>32</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>33</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>34</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>35</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>36</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>37</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>38</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>39</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>40</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>41</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>42</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>43</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>44</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>45</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>46</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>47</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>48</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>49</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>50</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>51</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>52</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>53</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>54</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>55</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>56</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>57</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>58</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>59</string>
+          </property>
+          <property name="textAlignment">
+           <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+          </property>
+         </item>
+        </widget>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </item>
+   <item row="1" column="0">
+    <widget class="QCheckBox" name="disableCheckBox">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="text">
+      <string>Disable</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="1">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>TimerDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>TimerDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>