From 787a5c7b5bb98703ed6c3a411d1027339672faa7 Mon Sep 17 00:00:00 2001 From: Daniel Svensson Date: Sun, 26 Feb 2006 19:16:43 +0100 Subject: [PATCH] Singletonify XMMSHandler and kick out everything not XMMSisch from the class. A class that needs to talk to xmms2 now calls XMMSHandler::getInstance() and all communication is handled by signals'n'slots. --- MainDisplay.cpp | 63 +++++++++++++++++++++++++++++++---- MainDisplay.h | 5 +++ MainWindow.cpp | 2 +- PlayStatus.cpp | 15 ++++++--- PlayStatus.h | 6 ++-- ShadedDisplay.cpp | 39 ++++++++++++++++++---- ShadedDisplay.h | 5 +++ Slider.cpp | 1 - XMMSHandler.cpp | 84 ++++++++++++++++------------------------------- XMMSHandler.h | 15 +++++---- 10 files changed, 150 insertions(+), 85 deletions(-) diff --git a/MainDisplay.cpp b/MainDisplay.cpp index 90e1574..b117b43 100644 --- a/MainDisplay.cpp +++ b/MainDisplay.cpp @@ -5,7 +5,7 @@ MainDisplay::MainDisplay (QWidget *parent) : SkinDisplay(parent) { - m_mw = dynamic_cast(parent); + XMMSHandler *xmmsh = XMMSHandler::getInstance (); m_tbar = new TitleBar(this, false); m_tbar->move(0, 0); @@ -43,6 +43,12 @@ MainDisplay::MainDisplay (QWidget *parent) : SkinDisplay(parent) m_playstatus = new PlayStatus (this); m_playstatus->move (24, 28); + connect (xmmsh, SIGNAL(mediainfoChanged(QString,int,int,int,int)), + this, SLOT(setMediainfo(QString,int,int,int,int))); + connect (xmmsh, SIGNAL(playbackStatusChanged(uint)), + this, SLOT(setStatus(uint))); + connect (xmmsh, SIGNAL(playtimeChanged(uint)), + this, SLOT(setPlaytime(uint))); } void @@ -58,6 +64,49 @@ MainDisplay::setPixmaps (Skin *skin) setMinimumSize(QSize(275, 116)); } +void +MainDisplay::setStatus (uint status) +{ + if (status == XMMS_PLAYBACK_STATUS_STOP) { + m_number->setNumber (0, 0); + m_number2->setNumber (0, 0); + m_slider->setPos (0); + m_slider->hideBar (true); + } +} + +void +MainDisplay::setPlaytime (uint time) +{ + uint sec, min; + + sec = (time / 1000) % 60; + min = (time / 1000) / 60; + + m_number->setNumber (min / 10, min % 10); + m_number2->setNumber (sec / 10, sec % 10); + + // update slider + m_slider->setPos (time); +} + +void +MainDisplay::setMediainfo (QString str, int bitrate, int samplerate, + int channels, int duration) +{ + m_text->setText (str); + m_kbps->setNumber (bitrate/1000, 3); + m_khz->setNumber (samplerate/1000, 2); + if (channels > 1) { + m_stereo->setStereoMono (1, 0); + } else { + m_stereo->setStereoMono (0, 1); + } + m_slider->setMax (duration); + m_slider->hideBar (false); +} + + void MainDisplay::SetupToggleButtons (void) { @@ -81,28 +130,28 @@ MainDisplay::SetupToggleButtons (void) void MainDisplay::SetupPushButtons (void) { - MainWindow *mw = dynamic_cast(window ()); + XMMSHandler *xmmsh = XMMSHandler::getInstance (); /* Normal buttons */ m_prev = new Button (this, Skin::BTN_PREV_0, Skin::BTN_PREV_1); m_prev->move(16, 88); - connect (m_prev, SIGNAL(clicked()), mw->getHandler (), SLOT(prev())); + connect (m_prev, SIGNAL(clicked()), xmmsh, SLOT(prev())); m_play = new Button (this, Skin::BTN_PLAY_0, Skin::BTN_PLAY_1); m_play->move(39, 88); - connect (m_play, SIGNAL(clicked()), mw->getHandler (), SLOT(play())); + connect (m_play, SIGNAL(clicked()), xmmsh, SLOT(play())); m_pause = new Button (this, Skin::BTN_PAUSE_0, Skin::BTN_PAUSE_1); m_pause->move(62, 88); - connect (m_pause, SIGNAL(clicked()), mw->getHandler (), SLOT(pause())); + connect (m_pause, SIGNAL(clicked()), xmmsh, SLOT(pause())); m_stop = new Button (this, Skin::BTN_STOP_0, Skin::BTN_STOP_1); m_stop->move(85, 88); - connect (m_stop, SIGNAL(clicked()), mw->getHandler (), SLOT(stop())); + connect (m_stop, SIGNAL(clicked()), xmmsh, SLOT(stop())); m_next = new Button (this, Skin::BTN_NEXT_0, Skin::BTN_NEXT_1); m_next->move(108, 88); - connect (m_next, SIGNAL(clicked()), mw->getHandler (), SLOT(next())); + connect (m_next, SIGNAL(clicked()), xmmsh, SLOT(next())); m_eject = new Button (this, Skin::BTN_EJECT_0, Skin::BTN_EJECT_1); m_eject->move(136, 89); diff --git a/MainDisplay.h b/MainDisplay.h index 713acc3..0fcd4f9 100644 --- a/MainDisplay.h +++ b/MainDisplay.h @@ -23,6 +23,7 @@ class MainDisplay; #include "StereoMono.h" #include "Slider.h" #include "PlayStatus.h" +#include "MainWindow.h" using namespace std; @@ -47,6 +48,10 @@ class MainDisplay : public SkinDisplay public slots: void setPixmaps(Skin *skin); + void setStatus (uint status); + void setPlaytime (uint time); + void setMediainfo (QString str, int bitrate, int samplerate, + int channels, int duration); protected: void SetupPushButtons (void); diff --git a/MainWindow.cpp b/MainWindow.cpp index 0bff5c7..6fea502 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -10,7 +10,7 @@ MainWindow::MainWindow (QWidget *parent) : QMainWindow (parent) * Initialize the Handler that will * update the display and the buttons */ - m_handler = new XMMSHandler (this); + m_handler = XMMSHandler::getInstance(); /* * Initialize skin, but don't open one diff --git a/PlayStatus.cpp b/PlayStatus.cpp index 53f83c6..16c0345 100644 --- a/PlayStatus.cpp +++ b/PlayStatus.cpp @@ -2,10 +2,15 @@ PlayStatus::PlayStatus (QWidget *parent) : PixWidget (parent) { - setMinimumSize(11, 9); - setMaximumSize(11, 9); + XMMSHandler *xmmsh = XMMSHandler::getInstance(); - m_status = XMMS_PLAYBACK_STATUS_STOP; + setMinimumSize(11, 9); + setMaximumSize(11, 9); + + m_status = XMMS_PLAYBACK_STATUS_STOP; + + connect (xmmsh, SIGNAL(playbackStatusChanged(uint)), + this, SLOT(setStatus(uint))); } void @@ -19,9 +24,9 @@ PlayStatus::setPixmaps (Skin *skin) } void -PlayStatus::setStatus (int status) +PlayStatus::setStatus (uint status) { - + qDebug("funkar"); if (status == XMMS_PLAYBACK_STATUS_STOP) { m_pixmap = m_pixmap_stop; } else if (status == XMMS_PLAYBACK_STATUS_PLAY) { diff --git a/PlayStatus.h b/PlayStatus.h index 8e58ae8..907b126 100644 --- a/PlayStatus.h +++ b/PlayStatus.h @@ -1,19 +1,20 @@ #ifndef __PLAYSTATUS_H__ #define __PLAYSTATUS_H__ -#include +#include "XMMSHandler.h" #include "PixWidget.h" class PlayStatus : public PixWidget { + Q_OBJECT public: PlayStatus (QWidget *parent); ~PlayStatus () { } - void setStatus (int); public slots: void setPixmaps (Skin *skin); + void setStatus (uint status); private: int m_status; @@ -21,7 +22,6 @@ class PlayStatus : public PixWidget QPixmap m_pixmap_stop; QPixmap m_pixmap_play; QPixmap m_pixmap_pause; - }; #endif diff --git a/ShadedDisplay.cpp b/ShadedDisplay.cpp index c05ce43..cfe8c01 100644 --- a/ShadedDisplay.cpp +++ b/ShadedDisplay.cpp @@ -2,8 +2,7 @@ ShadedDisplay::ShadedDisplay (QWidget *parent) : SkinDisplay (parent) { - MainWindow *mw = dynamic_cast(parent); - m_mw = parent; + XMMSHandler *xmmsh = XMMSHandler::getInstance (); setMinimumSize (275, 14); setMaximumSize (275, 14); @@ -26,31 +25,57 @@ ShadedDisplay::ShadedDisplay (QWidget *parent) : SkinDisplay (parent) m_prev = new Button (this); m_prev->move(169, 4); m_prev->resize (8, 7); - connect (m_prev, SIGNAL(clicked()), mw->getHandler (), SLOT(prev())); + connect (m_prev, SIGNAL(clicked()), xmmsh, SLOT(prev())); m_play = new Button (this); m_play->move(177, 4); m_play->resize (10, 7); - connect (m_play, SIGNAL(clicked()), mw->getHandler (), SLOT(play())); + connect (m_play, SIGNAL(clicked()), xmmsh, SLOT(play())); m_pause = new Button (this); m_pause->move(187, 4); m_pause->resize (10, 7); - connect (m_pause, SIGNAL(clicked()), mw->getHandler (), SLOT(pause())); + connect (m_pause, SIGNAL(clicked()), xmmsh, SLOT(pause())); m_stop = new Button (this); m_stop->move(197, 4); m_stop->resize (9, 7); - connect (m_stop, SIGNAL(clicked()), mw->getHandler (), SLOT(stop())); + connect (m_stop, SIGNAL(clicked()), xmmsh, SLOT(stop())); m_next = new Button (this); m_next->move(206, 4); m_next->resize (8, 7); - connect (m_next, SIGNAL(clicked()), mw->getHandler (), SLOT(next())); + connect (m_next, SIGNAL(clicked()), xmmsh, SLOT(next())); m_eject = new Button (this); m_eject->move(216, 4); m_eject->resize (9, 7); + connect (xmmsh, SIGNAL(playbackStatusChanged(uint)), + this, SLOT(setStatus(uint))); + connect (xmmsh, SIGNAL(playtimeChanged(uint)), + this, SLOT(setPlaytime(uint))); } +void +ShadedDisplay::setStatus (uint status) +{ + if (status == XMMS_PLAYBACK_STATUS_STOP) { + m_number->setNumber (0, 2); + m_number2->setNumber (0, 2); + } +} + +void +ShadedDisplay::setPlaytime (uint time) +{ + uint sec, min; + + sec = (time / 1000) % 60; + min = (time / 1000) / 60; + + m_number->setNumber (min, 2); + m_number2->setNumber (sec, 2); +} + + diff --git a/ShadedDisplay.h b/ShadedDisplay.h index 5cc22ec..c4de58b 100644 --- a/ShadedDisplay.h +++ b/ShadedDisplay.h @@ -11,6 +11,7 @@ class ShadedDisplay; class ShadedDisplay : public SkinDisplay { + Q_OBJECT public: ShadedDisplay (QWidget *parent); ~ShadedDisplay () { } @@ -27,6 +28,10 @@ class ShadedDisplay : public SkinDisplay Button *m_next; Button *m_eject; + public slots: + void setStatus (uint status); + void setPlaytime (uint time); + }; #endif diff --git a/Slider.cpp b/Slider.cpp index ce5d8be..b785e03 100644 --- a/Slider.cpp +++ b/Slider.cpp @@ -124,7 +124,6 @@ Slider::setPos (uint p) m_pos = x; update (); } - } void diff --git a/XMMSHandler.cpp b/XMMSHandler.cpp index e5fd5ef..7a280c0 100644 --- a/XMMSHandler.cpp +++ b/XMMSHandler.cpp @@ -1,15 +1,23 @@ #include #include "XmmsQT4.h" -#include "MainDisplay.h" #include "XMMSHandler.h" #include -XMMSHandler::XMMSHandler (MainWindow *mw) : sigc::trackable () -{ - m_mw = mw; +XMMSHandler *XMMSHandler::singleton = NULL; +XMMSHandler *XMMSHandler::getInstance (void) +{ + if (!singleton) { + singleton = new XMMSHandler (); + } + + return singleton; +} + +XMMSHandler::XMMSHandler (void) : sigc::trackable () +{ m_xmmsc = new XMMSClient ("promoe"); if (!m_xmmsc->connect (getenv ("XMMS_PATH"))) { @@ -45,40 +53,20 @@ XMMSHandler::playlist_list (XMMSResultValueList *res) void XMMSHandler::playback_status (XMMSResultValue *res) { - uint i; - res->getValue (&i); - m_mw->getMD ()->m_playstatus->setStatus (i); - - if (i == XMMS_PLAYBACK_STATUS_STOP) { - m_mw->getSD ()->m_number->setNumber (0, 2); - m_mw->getSD ()->m_number2->setNumber (0, 2); - m_mw->getMD ()->m_number->setNumber (0, 0); - m_mw->getMD ()->m_number2->setNumber (0, 0); - m_mw->getMD ()->m_slider->setPos (0); - } + uint status; + res->getValue (&status); + emit playbackStatusChanged (status); } void XMMSHandler::playback_playtime (XMMSResultValue *res) { - uint i, sec, min; - res->getValue (&i); - - sec = (i / 1000) % 60; - min = (i / 1000) / 60; - - if (m_mw->getShaded ()) { - m_mw->getSD ()->m_number->setNumber (min, 2); - m_mw->getSD ()->m_number2->setNumber (sec, 2); - } else { - m_mw->getMD ()->m_number->setNumber (min / 10, min % 10); - m_mw->getMD ()->m_number2->setNumber (sec / 10, sec % 10); - - /* update slider */ - m_mw->getMD ()->m_slider->setPos (i); - } + uint i; + res->getValue (&i); + emit playtimeChanged (i); + res->restart (); } @@ -101,45 +89,31 @@ XMMSHandler::playback_current_id (XMMSResultValue *res) void XMMSHandler::setPlaytime (void) { + /* uint pos = m_mw->getMD ()->m_slider->getPos(); qDebug ("pos = %d", pos); delete m_xmmsc->playback_seek_ms (pos); + */ } void XMMSHandler::medialib_info (XMMSResultDict *res) { + int bitrate, samplerate, channels, duration; char str[4096]; - int b; - /* Make this NICER! */ + // Make this NICER! res->entryFormat (str, 4096, "${artist} - ${album} - ${title}"); - m_mw->getMD ()->m_text->setText (QString::fromUtf8 (str)); - m_mw->getSD ()->m_title->setText (QString::fromUtf8 (str)); - if (res->getValue ("bitrate", &b)) { - m_mw->getMD ()->m_kbps->setNumber (b/1000, 3); - } - if (res->getValue ("samplerate", &b)) { - m_mw->getMD ()->m_khz->setNumber (b/1000, 2); - } + res->getValue ("bitrate", &bitrate); + res->getValue ("samplerate", &samplerate); + res->getValue ("channels:out", &channels); + res->getValue ("duration", &duration); - if (res->getValue ("channels:out", &b)) { - if (b == 1) { - m_mw->getMD ()->m_stereo->setStereoMono (0, 1); - } else { - m_mw->getMD ()->m_stereo->setStereoMono (1, 0); - } - } - - if (res->getValue ("duration", &b)) { - if (b > 0) { - m_mw->getMD ()->m_slider->setMax (b); - m_mw->getMD ()->m_slider->hideBar (false); - } - } + emit mediainfoChanged (QString::fromUtf8 (str), bitrate, + samplerate, channels, duration); delete res; } diff --git a/XMMSHandler.h b/XMMSHandler.h index 0b674b1..e4c9095 100644 --- a/XMMSHandler.h +++ b/XMMSHandler.h @@ -3,9 +3,6 @@ #include -class XMMSHandler; - -#include "MainWindow.h" #include "XmmsQT4.h" #include @@ -13,7 +10,8 @@ class XMMSHandler; class XMMSHandler : public QObject, public sigc::trackable { Q_OBJECT public: - XMMSHandler (MainWindow *mw); + static XMMSHandler *getInstance (void); + XMMSHandler (void); ~XMMSHandler (); void playback_playtime (XMMSResultValue *res); void playback_current_id (XMMSResultValue *res); @@ -38,11 +36,16 @@ class XMMSHandler : public QObject, public sigc::trackable { delete m_xmmsc->playback_tickle (); } + signals: + void playbackStatusChanged (uint status); + void playtimeChanged (uint time); + void mediainfoChanged (QString str, int bitrate, int samplerate, + int channels, int duration); + private: - MainWindow *m_mw; XmmsQT4 *m_qt4; XMMSClient *m_xmmsc; - + static XMMSHandler *singleton; }; #endif