b4b2ed4c79abbf6f430df59004abe54c7eec95a1
[vlc-remote] / playermainwindow.cpp
1   /*   VLC-REMOTE for MAEMO 5
2   *   Copyright (C) 2010 Schutz Sacha <istdasklar@gmail.com>
3   *   This program is free software; you can redistribute it and/or modify
4   *   it under the terms of the GNU General Public License version 2,
5   *   or (at your option) any later version, as published by the Free
6   *   Software Foundation
7   *
8   *   This program is distributed in the hope that it will be useful,
9   *   but WITHOUT ANY WARRANTY; without even the implied warranty of
10   *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11   *   GNU General Public License for more details
12   *
13   *   You should have received a copy of the GNU General Public
14   *   License along with this program; if not, write to the
15   *   Free Software Foundation, Inc.,
16   *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17   */
18   #include <QDebug>
19   #include <QTime>
20   #include "playermainwindow.h"
21   #include "ui_playermainwindow.h"
22   #include "configdialog.h"
23   #include "aboutdialog.h"
24   #include "accountdialog.h"
25
26
27   PlayerMainWindow::PlayerMainWindow(QWidget *parent) :
28           QMainWindow(parent),
29           ui(new Ui::PlayerMainWindow)
30   {
31       ui->setupUi(this);
32       setWindowTitle("Vlc remote");
33
34
35
36       mTimer = new QTimer(this);
37       mNetManager = new QNetworkAccessManager(this);
38       mPlayListMainWindow = new PlayListMainWindow;
39       mBrowserMainWindow = new BrowseMainWindow;
40
41       mVolume = 100;
42       mMuted = false;
43
44       ui->playlistButton->setIcon(QIcon::fromTheme("notes_bullets"));
45       ui->browseButton->setIcon(QIcon::fromTheme("filemanager_media_folder"));
46
47       ui->previousButton->setIcon(QIcon::fromTheme("pdf_viewer_first_page"));
48       ui->nextButton->setIcon(QIcon::fromTheme("pdf_viewer_last_page"));
49       ui->playButton->setIcon(QIcon::fromTheme("camera_playback"));
50       ui->stopButton->setIcon(QIcon::fromTheme("camera_video_stop"));
51       ui->pauseButton->setIcon(QIcon::fromTheme("camera_video_pause"));
52       ui->fullscreenButton->setIcon(QIcon::fromTheme("general_fullsize"));
53       ui->volDown->setIcon(QIcon::fromTheme("statusarea_volumelevel1"));
54       ui->volUp->setIcon(QIcon::fromTheme("statusarea_volumelevel4"));
55       ui->volMute->setIcon(QIcon::fromTheme("statusarea_volume_mute"));
56
57
58   #if defined(Q_WS_S60) || defined(Q_WS_MAEMO_5)
59       mPlayListMainWindow->setParent(this);
60       mPlayListMainWindow->setAttribute(Qt::WA_Maemo5StackedWindow);
61       mPlayListMainWindow->setAttribute(Qt::WA_Maemo5LandscapeOrientation,true);
62       mPlayListMainWindow->setAttribute(Qt::WA_Maemo5LandscapeOrientation,true);
63       setAttribute(Qt::WA_Maemo5StackedWindow);
64       mPlayListMainWindow->setWindowFlags(mPlayListMainWindow->windowFlags() | Qt::Window);
65
66       mBrowserMainWindow->setParent(this);
67       mBrowserMainWindow->setAttribute(Qt::WA_Maemo5StackedWindow);
68       mBrowserMainWindow->setAttribute(Qt::WA_Maemo5LandscapeOrientation,true);
69       mBrowserMainWindow->setAttribute(Qt::WA_Maemo5LandscapeOrientation,true);
70       setAttribute(Qt::WA_Maemo5StackedWindow);
71       mBrowserMainWindow->setWindowFlags(mBrowserMainWindow->windowFlags() | Qt::Window);
72
73   #endif
74
75       connect(mTimer,SIGNAL(timeout()),this,SLOT(askStatus()));
76       connect(ui->actionConfiguration,SIGNAL(triggered()),this,SLOT(showConfig()));
77       connect(ui->actionAbout,SIGNAL(triggered()),this,SLOT(showAbout()));
78       connect(ui->playlistButton,SIGNAL(clicked()),mPlayListMainWindow,SLOT(show()));
79       connect(ui->playlistButton,SIGNAL(clicked()),mPlayListMainWindow,SLOT(showPlayList()));
80       connect(ui->browseButton,SIGNAL(clicked()),mBrowserMainWindow,SLOT(show()));
81       connect(ui->browseButton,SIGNAL(clicked()),mBrowserMainWindow,SLOT(showCurrentDirectory()));
82
83       connect(ui->playButton,SIGNAL(clicked()),this,SLOT(play()));
84       connect(ui->stopButton,SIGNAL(clicked()),this,SLOT(stop()));
85       connect(ui->pauseButton,SIGNAL(clicked()),this,SLOT(pause()));
86       connect(ui->previousButton,SIGNAL(clicked()),this,SLOT(previous()));
87       connect(ui->nextButton,SIGNAL(clicked()),this,SLOT(next()));
88       connect(ui->fullscreenButton,SIGNAL(clicked()),this,SLOT(fullscreen()));
89       connect(ui->volUp,SIGNAL(clicked()),this,SLOT(volUp()));
90       connect(ui->volDown,SIGNAL(clicked()),this,SLOT(volDown()));
91       connect(ui->volMute,SIGNAL(clicked()),this,SLOT(volMute()));
92       connect(ui->slider,SIGNAL(sliderMoved(int)),this,SLOT(slide(int)));
93
94              showConfig();
95
96
97   }
98   
99
100   PlayerMainWindow::~PlayerMainWindow()
101   {
102       delete ui;
103   }
104
105   void PlayerMainWindow::changeEvent(QEvent *e)
106   {
107       QMainWindow::changeEvent(e);
108       switch (e->type()) {
109       case QEvent::LanguageChange:
110           ui->retranslateUi(this);
111           break;
112       default:
113           break;
114       }
115   }
116
117   void PlayerMainWindow::play()
118   {
119
120       mNetManager->get(QNetworkRequest(QUrl("http://"+mIp+"/requests/status.xml?command=pl_play")));
121
122   }
123   void PlayerMainWindow::stop()
124   {
125       mNetManager->get(QNetworkRequest(QUrl("http://"+mIp+"/requests/status.xml?command=pl_stop")));
126
127   }
128   void PlayerMainWindow::pause()
129   {
130       mNetManager->get(QNetworkRequest(QUrl("http://"+mIp+"/requests/status.xml?command=pl_pause")));
131
132   }
133   void PlayerMainWindow::previous()
134   {
135       mNetManager->get(QNetworkRequest(QUrl("http://"+mIp+"/requests/status.xml?command=pl_previous")));
136
137   }
138   void PlayerMainWindow::next()
139   {
140       mNetManager->get(QNetworkRequest(QUrl("http://"+mIp+"/requests/status.xml?command=pl_next")));
141
142   }
143   void PlayerMainWindow::fullscreen()
144   {
145       mNetManager->get(QNetworkRequest(QUrl("http://"+mIp+"/requests/status.xml?command=fullscreen")));
146
147   }
148   void PlayerMainWindow::volUp()
149   {
150       QUrl url = QUrl("http://"+mIp+"/requests/status.xml?command=volume");
151       url.addEncodedQueryItem(QByteArray("val"), QByteArray("%2B20"));
152       mNetManager->get(QNetworkRequest(url));
153   }
154   void PlayerMainWindow::volDown()
155   {
156
157       mNetManager->get(QNetworkRequest(QUrl("http://"+mIp+"/requests/status.xml?command=volume&val=-20")));
158
159   }
160   void PlayerMainWindow::volMute()
161   {
162       this->mMuted = !this->mMuted;
163       if (this->mMuted) {
164           mNetManager->get(QNetworkRequest(QUrl("http://"+mIp+"/requests/status.xml?command=volume&val=0")));
165       }
166       else {
167           mNetManager->get(QNetworkRequest(QUrl("http://"+mIp+"/requests/status.xml?command=volume&val="+QString::number(this->mVolume))));
168       }
169
170   }
171   void PlayerMainWindow::slide(int value)
172   {
173       mNetManager->get(QNetworkRequest(QUrl("http://"+mIp+"/requests/status.xml?command=seek&val="+QString::number(value)+"%25")));
174
175   }
176
177   void PlayerMainWindow::showConfig()
178   {
179       mTimer->stop();
180       AccountDialog * dialog = new AccountDialog;
181       dialog->exec();
182      
183        mIp= AccountDialog::currentIp();
184
185       mPlayListMainWindow->init();
186       mBrowserMainWindow->init();
187       mTimer->start(5000);
188   }
189   void PlayerMainWindow::showAbout()
190   {
191
192       AboutDialog * dialog = new AboutDialog;
193       dialog->exec();
194
195   }
196
197   void PlayerMainWindow::askStatus()
198   {
199
200       QNetworkReply * reply =  mNetManager->get(QNetworkRequest(QUrl("http://"+mIp+"/requests/status.xml")));
201       connect(reply,SIGNAL(readyRead()),this,SLOT(parseXmlStatus()));
202   }
203
204   void PlayerMainWindow::parseXmlStatus()
205   {
206       QNetworkReply * reply = qobject_cast<QNetworkReply*>(sender());
207       QDomDocument doc;
208       doc.setContent(reply->readAll());
209       QDomElement docElem = doc.documentElement();
210
211       int volume = docElem.namedItem("volume").toElement().text().toInt();
212       int length = docElem.namedItem("length").toElement().text().toInt();
213       int time = docElem.namedItem("time").toElement().text().toInt();
214       int position = docElem.namedItem("position").toElement().text().toInt();
215       QString state  =docElem.namedItem("state").toElement().text();
216
217
218       if (0 < volume) {
219           this->mVolume = volume;
220           this->mMuted = false;
221       }
222       else {
223           this->mMuted = true;
224       }
225
226
227       QTime timeLength(0,0,0) ;
228       timeLength =  timeLength.addSecs(time);
229
230       ui->timeLabel->setText(timeLength.toString("mm:ss"));
231
232
233       QDomNode infoNode =  docElem.namedItem("information");
234       QDomNode metaInfoNode =  infoNode.namedItem("meta-information");
235       QString title = metaInfoNode.namedItem("title").toElement().text();
236
237       if ( position >= 0 && position <=100)
238           ui->slider->setValue(position);
239
240       ui->label->setText(title);
241       delete reply;
242
243   }
244