<file>forward.png</file>
<file>window.png</file>
<file>fullscreen.png</file>
+ <file>volume.png</file>
</qresource>
</RCC>
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 \
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 =
#include "dbstorage.h"
#include <QSqlQuery>
#include <QSqlResult>
+#include <QDebug>
using namespace SomePlayer::Storage;
using namespace SomePlayer::DataObjects;
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)");
_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() {
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;
delete _insert_track_query;
delete _insert_favorites_query;
delete _update_track_count_query;
+ delete _remove_track_query;
db.close();
}
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;
}
query->bindValue(":source", source);
query->exec();
if (query->next()) {
+ qDebug () << "two";
// already in datebase, skip
return;
}
if (query->exec()) {
// ok
} else {
+ qDebug () << "three";
// big bang
}
} else {
+ qDebug () << "four";
// big bang
}
} else {
+ qDebug () << "five";
// big bang
}
}
}
}
+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);
void addToFavorites(Track track);
void updateTrackCount(Track track);
+ Track updateTrack(Track);
void addTrack(Track track);
private:
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;
QSqlQuery *_insert_favorites_query;
QSqlQuery *_update_track_count_query;
+
+ QSqlQuery *_remove_track_query;
};
};
};
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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
*/
#include "library.h"
+#include <QDebug>
using namespace SomePlayer::DataObjects;
using namespace SomePlayer::Storage;
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);
+}
void addTrack(Track);
void addToFavorites(Track);
void updateTrackCount(Track);
+ void updateTrackMetadata(Track);
};
};
_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;
+ }
+}
void nextItem();
void prevItem();
void cancelSearch();
+ void refresh();
private slots:
void _player();
void _view_button();
#include "player/player.h"
#include "library.h"
+#include "timerdialog.h"
using namespace SomePlayer::DataObjects;
using namespace SomePlayer::Storage;
_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);
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()));
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();
}
}
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>");
}
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();
+}
#include "libraryform.h"
#include "busywidget.h"
#include "library.h"
+#include <QTimer>
namespace Ui {
class MainWindow;
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
_config.setValue("playback/repeat", _repeat);
}
+void Player::setVolume(int v) {
+ _output->setVolume(v*0.01);
+}
#include "../playlist.h"
#include <phonon/MediaObject>
#include <phonon/AudioOutput>
+#include <phonon/VolumeSlider>
#include <QStack>
#include <QQueue>
bool random() {return _random;}
bool repeat() {return _repeat;}
+ int volume() {return (int)(_output->volume()*100 + 0.5);}
Phonon::MediaObject* mediaObject() {return _player;}
signals:
void toggleRandom();
void toggleRepeat();
void seek(int);
+ void setVolume(int);
private slots:
void _stateChanged(Phonon::State, Phonon::State);
void _tick(qint64);
#include "trackrenderer.h"
#include <QResource>
#include "playlistdialog.h"
+#include "edittagsdialog.h"
using namespace SomePlayer::DataObjects;
using namespace SomePlayer::Playback;
} 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);
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);
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()
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);
+}
void prevItem();
void cancelSearch();
void addFiles(QList<QString> files);
+ void stop();
private slots:
void _library();
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;
_tracks.removeAt(id);
}
+void Playlist::setTracks(QList<Track> tracks) {
+ _tracks = tracks;
+}
+
void Playlist::clear() {
_tracks.clear();
}
void addTrack(Track track);
void removeTrack(Track track);
void removeTrackAt(int id);
+ void setTracks(QList<Track>);
void clear();
private:
#include "config.h"
#define _DYNAMIC_PLAYLIST_MAX_COUNT_ 50
+#define _SOMEPLAYER_VERSION_ "1.2.1"
#define NDEBUG
#endif
}
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();
+ }
+}
explicit TagResolver(QObject *parent = 0);
public slots:
void decode (QStringList files);
+ void updateTags(Track);
signals:
void decoded(Track);
--- /dev/null
+#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);
+}
--- /dev/null
+#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
return _metadata;
}
+void Track::setMetadata(TrackMetadata meta) {
+ _metadata = meta;
+}
+
QString Track::source() const {
return _source;
}
~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);
--- /dev/null
+<?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>
<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><h3>Title</h3></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><h3>Title</h3></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><b>Artist</b><br/>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><b>Artist</b><br/>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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>