first alpha (pre-)release
[musique.git] / mainwindow.cpp
blob586e4709def91f48fb92a0b8226b725770608d58
1 //
2 // C++ Implementation: mainwindow
3 //
4 // Author: Oliver Groß <z.o.gross@gmx.de>, (C) 2008
5 //
6 // Copyright: See COPYING file that comes with this distribution
7 //
8 #include <QLabel>
9 #include <QSlider>
10 #include <QFileDialog>
11 #include <QInputDialog>
12 #include <QDir>
13 #include <QSettings>
14 #include "mainwindow.h"
15 #include "common.h"
16 #include "playlistmodel.h"
17 #include "collectionsmodel.h"
18 #include <QDebug>
20 namespace musique {
21 CMainWindow::CMainWindow(QWidget * parent) : QMainWindow(parent),
22 m_CurrentTitle('-'), m_Client(UI_CLIENT_NAME, this), m_Playback(&m_Client), m_Medialib(&m_Client) {
23 ui.setupUi(this);
24 setupToolbars();
26 m_PlaylistModel = new CPlaylistModel(&m_Medialib, this);
27 ui.playlistView->setModel(m_PlaylistModel);
28 ui.playlistView->addActions(ui.menuEdit->actions());
29 ui.playlistView->setContextMenuPolicy(Qt::ActionsContextMenu);
30 connect(ui.playlistView, SIGNAL(activated(QModelIndex)), this, SLOT(switchToEntry(QModelIndex)));
31 connect(ui.playlistView->selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)),
32 this, SLOT(handleEntrySelectionChange(const QItemSelection &)));
34 m_CollectionsModel = new CCollectionsModel(&m_Medialib, this);
35 ui.collectionsView->setModel(m_CollectionsModel);
36 connect(ui.playlistView, SIGNAL(activated(QModelIndex)), this, SLOT(switchToPlaylist(QModelIndex)));
38 connect(&m_Playback, SIGNAL(playTimeChanged(quint32)), this, SLOT(updatePlaytime(quint32)));
39 connect(&m_Playback, SIGNAL(volumeChanged()), this, SLOT(updateVolume()));
40 connect(&m_Playback, SIGNAL(statusChanged(xmms_playback_status_t)), this, SLOT(updateStatus(xmms_playback_status_t)));
41 connect(&m_Playback, SIGNAL(idChanged(quint32)), this, SLOT(updateCurrentId(quint32)));
43 connect(&m_Medialib, SIGNAL(mediaInfoReady(quint32)), this, SLOT(checkMediaUpdate(quint32)));
44 connect(&m_Medialib, SIGNAL(activePlaylistChanged()), this, SLOT(switchToActivePlaylist()));
46 setupActions();
47 readSettings();
49 m_Client.connectToServer();
52 CMainWindow::~CMainWindow() {
53 writeSettings();
56 void CMainWindow::readSettings() {
57 QSettings settings(UI_FILE_CONFIG, QSettings::IniFormat, this);
58 settings.beginGroup("Main");
59 ui.actionShowCollections->setChecked(settings.value("showCollections", false).toBool());
60 settings.endGroup();
62 settings.beginGroup("MainWindow");
63 resize(settings.value("size", QSize(646, 322)).toSize());
64 move(settings.value("pos", QPoint(200, 200)).toPoint());
65 settings.endGroup();
68 void CMainWindow::writeSettings() {
69 QSettings settings(UI_FILE_CONFIG, QSettings::IniFormat, this);
70 settings.beginGroup("Main");
71 settings.setValue("showCollections", ui.actionShowCollections->isChecked());
72 settings.endGroup();
74 settings.beginGroup("MainWindow");
75 settings.setValue("size", size());
76 settings.setValue("pos", pos());
77 settings.endGroup();
80 inline void CMainWindow::setupActions() {
81 ui.actionPlayPause->setIcon(QIcon(UI_ICON_PLAY));
82 ui.actionStop->setIcon(QIcon(UI_ICON_STOP));
83 ui.actionNext->setIcon(QIcon(UI_ICON_NEXT));
84 ui.actionPrevious->setIcon(QIcon(UI_ICON_PREVIOUS));
85 ui.actionAddFiles->setIcon(QIcon(UI_ICON_OPEN));
86 //ui.actionAddDirectory->setIcon(QIcon(UI_ICON_));
87 //ui.actionAddUrl->setIcon(QIcon(UI_ICON_));
88 ui.actionRemove->setIcon(QIcon(UI_ICON_REMOVE));
89 ui.actionClearPlaylist->setIcon(QIcon(UI_ICON_CLEAR));
90 ui.actionShufflePlaylist->setIcon(QIcon(UI_ICON_SHUFFLE));
91 ui.actionShowCollections->setIcon(QIcon(UI_ICON_SHOWCOLLECTIONS));
93 connect(ui.actionStop, SIGNAL(triggered()), &m_Playback, SLOT(stop()));
94 connect(ui.actionNext, SIGNAL(triggered()), this, SLOT(switchToNext()));
95 connect(ui.actionPrevious, SIGNAL(triggered()), this, SLOT(switchToPrevious()));
96 connect(ui.actionAddFiles, SIGNAL(triggered()), this, SLOT(addFiles()));
97 connect(ui.actionAddDirectory, SIGNAL(triggered()), this, SLOT(addDirectory()));
98 connect(ui.actionAddUrl, SIGNAL(triggered()), this, SLOT(addUrl()));
99 connect(ui.actionRemove, SIGNAL(triggered()), this, SLOT(removeSelectedEntries()));
100 connect(ui.actionClearPlaylist, SIGNAL(triggered()), this, SLOT(clearPlaylist()));
101 connect(ui.actionShufflePlaylist, SIGNAL(triggered()), this, SLOT(randomizePlaylist()));
102 connect(ui.actionQuit, SIGNAL(triggered()), this, SLOT(close()));
103 connect(ui.actionAboutQt, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
106 inline void CMainWindow::setupToolbars() {
107 m_VolumeLabel = new QLabel(this);
108 m_VolumeLabel->setText(tr("Volume"));
110 m_VolumeSlider = new QSlider(this);
111 m_VolumeSlider->setMaximum(100);
112 m_VolumeSlider->setOrientation(Qt::Horizontal);
113 m_VolumeSlider->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
115 m_CurrentLabel = new QLabel(this);
116 m_CurrentLabel->setText("[disconnected]");
118 m_TimeLabel = new QLabel(this);
119 m_TimeLabel->setText("--:--");
121 ui.playbackBar->addWidget(m_VolumeLabel);
122 ui.playbackBar->addWidget(m_VolumeSlider);
124 ui.currentBar->addWidget(m_CurrentLabel);
125 ui.currentBar->addSeparator();
126 ui.currentBar->addWidget(m_TimeLabel);
128 connect(m_VolumeSlider, SIGNAL(valueChanged(int)), &m_Playback, SLOT(setVolume(int)));
131 inline QString CMainWindow::toFormatedTitleInfo(quint32 id) {
132 return m_Medialib.media()[id]->artist + " - " + m_Medialib.media()[id]->title;
135 void CMainWindow::updatePlaytime(quint32 time) {
136 //TODO: check this (could be too much overhead if nothing visible changed)
137 m_TimeLabel->setText(formatedTime(time));
140 void CMainWindow::updateVolume() {
141 quint8 mid = 0;
142 foreach (quint8 i, m_Playback.volume())
143 mid += i;
145 if (mid)
146 mid /= m_Playback.volume().count();
147 m_VolumeSlider->setValue(mid);
150 void CMainWindow::updateStatus(xmms_playback_status_t status) {
151 m_CurrentLabel->setText(toStringFormated(status).arg(m_CurrentTitle));
153 switch (status) {
154 case XMMS_PLAYBACK_STATUS_STOP:
155 m_TimeLabel->setText("--:--");
156 case XMMS_PLAYBACK_STATUS_PAUSE:
157 disconnect(ui.actionPlayPause, SIGNAL(triggered()), &m_Playback, SLOT(pause()));
158 ui.actionPlayPause->setText("Play");
159 ui.actionPlayPause->setIcon(QIcon(UI_ICON_PLAY));
160 connect(ui.actionPlayPause, SIGNAL(triggered()), &m_Playback, SLOT(start()));
161 break;
162 case XMMS_PLAYBACK_STATUS_PLAY:
163 disconnect(ui.actionPlayPause, SIGNAL(triggered()), &m_Playback, SLOT(start()));
164 ui.actionPlayPause->setText("Pause");
165 ui.actionPlayPause->setIcon(QIcon(UI_ICON_PAUSE));
166 connect(ui.actionPlayPause, SIGNAL(triggered()), &m_Playback, SLOT(pause()));
167 break;
168 default:
169 break;
173 void CMainWindow::updateCurrentId(quint32 id) {
174 if (id == 0)
175 m_CurrentTitle = '-';
176 else if (m_Medialib.checkMediaInfo(id))
177 m_CurrentTitle = toFormatedTitleInfo(id);
178 else {
179 m_CurrentTitle = tr("loading title... (id: %1)").arg(id);
181 m_CurrentLabel->setText(toStringFormated(m_Playback.status()).arg(m_CurrentTitle));
184 void CMainWindow::checkMediaUpdate(quint32 id) {
185 if (id == m_Playback.currentID()) {
186 m_CurrentTitle = toFormatedTitleInfo(id);
187 m_CurrentLabel->setText(toStringFormated(m_Playback.status()).arg(m_CurrentTitle));
191 void CMainWindow::switchToNext() {
192 m_Playback.setNext(m_Medialib.activePlaylist()->position()+1);
193 if (m_Playback.status() != XMMS_PLAYBACK_STATUS_STOP)
194 m_Playback.tickle();
197 void CMainWindow::switchToPrevious() {
198 m_Playback.setNext(m_Medialib.activePlaylist()->position()-1);
199 if (m_Playback.status() != XMMS_PLAYBACK_STATUS_STOP)
200 m_Playback.tickle();
203 void CMainWindow::switchToEntry(QModelIndex index) {
204 if (m_Medialib.activePlaylist() != m_PlaylistModel->playlist())
205 m_Medialib.setActivePlaylist(m_PlaylistModel->playlist()->identifier());
206 m_Playback.setNext(index.row());
207 if (m_Playback.status() == XMMS_PLAYBACK_STATUS_STOP)
208 m_Playback.start();
209 else
210 m_Playback.tickle();
213 /* void CMainWindow::openFiles() {
214 QStringList files = QFileDialog::getOpenFileNames(this,
215 tr("Select one or more files to append"), QDir::homePath());
217 if (files.isEmpty())
218 return;
220 m_PlaylistModel->playlist()->clear();
221 foreach(QString i, files) {
222 m_PlaylistModel->playlist()->append("file://"+i);
226 void CMainWindow::addFiles() {
227 QFileDialog fileDialog(this, tr("Select one or more files to add"), lastFilesDir);
228 fileDialog.setFileMode(QFileDialog::ExistingFiles);
229 if (fileDialog.exec()) {
230 lastFilesDir = fileDialog.directory().path();
231 foreach(QString i, fileDialog.selectedFiles()) {
232 m_PlaylistModel->playlist()->append("file://" + i);
237 void CMainWindow::addDirectory() {
238 QFileDialog directoryDialog(this, tr("Select a directory to add"), lastDirectoryDir);
239 directoryDialog.setFileMode(QFileDialog::DirectoryOnly);
240 if (directoryDialog.exec()) {
241 lastDirectoryDir = directoryDialog.directory().path();
242 m_PlaylistModel->playlist()->appendRecursive("file://" + directoryDialog.selectedFiles()[0]);
246 void CMainWindow::addUrl() {
247 QString url = QInputDialog::getItem(this, tr("Enter a URL to add"), "URL:", lastAppendedUrls);
248 if (!url.isEmpty()) {
249 lastAppendedUrls.prepend(url);
250 if (lastAppendedUrls.count() > 5)
251 lastAppendedUrls.removeLast();
255 void CMainWindow::removeSelectedEntries() {
256 QModelIndexList selectedIndexes = ui.playlistView->selectionModel()->selectedIndexes();
257 /* if (selectedIndexes.isEmpty())
258 return;*/
260 foreach(QModelIndex i, selectedIndexes)
261 m_PlaylistModel->playlist()->remove(i.row());
264 void CMainWindow::clearPlaylist() {
265 m_PlaylistModel->playlist()->clear();
268 void CMainWindow::randomizePlaylist() {
269 m_PlaylistModel->playlist()->randomize();
272 void CMainWindow::switchToActivePlaylist() {
273 //disconnect(&m_Medialib, SIGNAL(activePlaylistChanged()), this, SLOT(handleActivePlaylistOnce()));
274 m_PlaylistModel->setPlaylist(m_Medialib.activePlaylist());
277 void CMainWindow::handleEntrySelectionChange(const QItemSelection & selected) {
278 QModelIndexList selectedIndexes = selected.indexes();
279 ui.actionRemove->setDisabled(selectedIndexes.isEmpty());
282 /* void CMainWindow::openPlaylist() {
285 void CMainWindow::savePlaylist() {