2 // C++ Implementation: mainwindow
4 // Author: Oliver Groß <z.o.gross@gmx.de>, (C) 2008
6 // Copyright: See COPYING file that comes with this distribution
10 #include <QFileDialog>
11 #include <QInputDialog>
14 #include "mainwindow.h"
16 #include "playlistmodel.h"
17 #include "collectionsmodel.h"
21 CMainWindow::CMainWindow(QWidget
* parent
) : QMainWindow(parent
),
22 m_CurrentTitle('-'), m_Client(UI_CLIENT_NAME
, this), m_Playback(&m_Client
), m_Medialib(&m_Client
) {
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()));
49 m_Client
.connectToServer();
52 CMainWindow::~CMainWindow() {
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());
62 settings
.beginGroup("MainWindow");
63 resize(settings
.value("size", QSize(646, 322)).toSize());
64 move(settings
.value("pos", QPoint(200, 200)).toPoint());
68 void CMainWindow::writeSettings() {
69 QSettings
settings(UI_FILE_CONFIG
, QSettings::IniFormat
, this);
70 settings
.beginGroup("Main");
71 settings
.setValue("showCollections", ui
.actionShowCollections
->isChecked());
74 settings
.beginGroup("MainWindow");
75 settings
.setValue("size", size());
76 settings
.setValue("pos", pos());
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() {
142 foreach (quint8 i
, m_Playback
.volume())
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
));
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()));
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()));
173 void CMainWindow::updateCurrentId(quint32 id
) {
175 m_CurrentTitle
= '-';
176 else if (m_Medialib
.checkMediaInfo(id
))
177 m_CurrentTitle
= toFormatedTitleInfo(id
);
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
)
197 void CMainWindow::switchToPrevious() {
198 m_Playback
.setNext(m_Medialib
.activePlaylist()->position()-1);
199 if (m_Playback
.status() != XMMS_PLAYBACK_STATUS_STOP
)
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
)
213 /* void CMainWindow::openFiles() {
214 QStringList files = QFileDialog::getOpenFileNames(this,
215 tr("Select one or more files to append"), QDir::homePath());
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())
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() {