From f36ba49ea9218d672315f6d131aec9530cf8949b Mon Sep 17 00:00:00 2001 From: Tobias Rundstrom Date: Mon, 20 Feb 2006 00:43:42 -0300 Subject: [PATCH] Huge push that fixes lot of the problems with headers and added a Slider --- Button.cpp | 28 ++++++++-- Button.h | 7 ++- Display.cpp | 4 +- Display.h | 4 +- MainDisplay.cpp | 17 ++++-- MainDisplay.h | 7 ++- MainWindow.cpp | 12 +++-- MainWindow.h | 7 +-- NumberDisplay.h | 6 --- PixWidget.cpp | 9 ++-- PixWidget.h | 6 ++- Skin.cpp | 7 +++ Skin.h | 3 ++ Slider.cpp | 135 ++++++++++++++++++++++++++++++++++++++++++++++++ Slider.h | 51 ++++++++++++++++++ StereoMono.h | 4 ++ TitleBar.cpp | 1 - TitleBar.h | 3 +- XMMSHandler.cpp | 21 +++++++- XMMSHandler.h | 2 + promoe.pro | 6 ++- 21 files changed, 298 insertions(+), 42 deletions(-) create mode 100644 Slider.cpp create mode 100644 Slider.h diff --git a/Button.cpp b/Button.cpp index a3e0e1c..4e7524a 100644 --- a/Button.cpp +++ b/Button.cpp @@ -1,10 +1,14 @@ + +#include "MainWindow.h" #include "Button.h" -#include "Display.h" + Button::Button (QWidget *parent, uint normal, uint pressed) : PixWidget (parent) { m_name_normal = normal; m_name_pressed = pressed; + m_diffx = 0; + m_diffy = 0; } Button::~Button () @@ -18,6 +22,13 @@ Button::setPixmaps(Skin *skin) m_pixmap_pressed = skin->getItem (m_name_pressed); m_pixmap = m_pixmap_normal; + if (!m_pixmap_normal || m_pixmap_normal.isNull()) { + qDebug ("OPPP! %d return NULL!", m_name_normal); + } + if (!m_pixmap_pressed || m_pixmap_pressed.isNull()) { + qDebug ("OPPP! %d return NULL!", m_name_pressed); + } + setMinimumSize (m_pixmap.size ()); setMaximumSize (m_pixmap.size ()); @@ -27,19 +38,28 @@ Button::setPixmaps(Skin *skin) void Button::mousePressEvent (QMouseEvent *event) { - ((SkinDisplay *)parent ())->setNoDrag (true); + MainWindow *mw = dynamic_cast(window ()); + mw->setNoDrag (true); + m_pixmap = m_pixmap_pressed; + + m_diffx = event->pos().x(); + m_diffy = event->pos().y(); + + m_nodrag = true; + update (); } void Button::mouseReleaseEvent (QMouseEvent *event) { - ((SkinDisplay *)parent())->setNoDrag (false); + MainWindow *mw = dynamic_cast(window ()); + mw->setNoDrag (false); m_pixmap = m_pixmap_normal; + m_nodrag = false; update(); emit clicked(); - } ToggleButton::ToggleButton (QWidget *parent, uint on_normal, uint on_pressed, diff --git a/Button.h b/Button.h index cc61eb7..53dcb63 100644 --- a/Button.h +++ b/Button.h @@ -1,7 +1,6 @@ #ifndef __BUTTON_H__ #define __BUTTON_H__ -#include #include "PixWidget.h" using namespace std; @@ -12,6 +11,7 @@ class Button : public PixWidget public: Button (QWidget *parent, uint btn1, uint btn2); ~Button (); + bool noDrag (void) { return m_nodrag; } public slots: void setPixmaps (Skin *skin); @@ -25,9 +25,14 @@ class Button : public PixWidget uint m_name_normal; uint m_name_pressed; + + uint m_diffx; + uint m_diffy; QPixmap m_pixmap_normal; QPixmap m_pixmap_pressed; + + bool m_nodrag; }; class ToggleButton : public Button diff --git a/Display.cpp b/Display.cpp index eeb39cd..59d5ffe 100644 --- a/Display.cpp +++ b/Display.cpp @@ -33,13 +33,13 @@ SkinDisplay::mouseMoveEvent (QMouseEvent *event) void SkinDisplay::enterEvent (QEvent *event) { - m_tbar->setActive(true); + dynamic_cast(m_tbar)->setActive(true); } void SkinDisplay::leaveEvent (QEvent *event) { - m_tbar->setActive(false); + dynamic_cast(m_tbar)->setActive(false); } void diff --git a/Display.h b/Display.h index 9065d22..3a13596 100644 --- a/Display.h +++ b/Display.h @@ -10,7 +10,7 @@ #include #include -#include "TitleBar.h" +#include "Skin.h" using namespace std; @@ -35,7 +35,7 @@ class SkinDisplay : public QWidget void SkinDisplay::leaveEvent (QEvent *event); QWidget *m_mw; - TitleBar *m_tbar; + QWidget *m_tbar; private: bool m_noDrag; diff --git a/MainDisplay.cpp b/MainDisplay.cpp index a52f90c..c5db859 100644 --- a/MainDisplay.cpp +++ b/MainDisplay.cpp @@ -35,6 +35,11 @@ MainDisplay::MainDisplay (QWidget *parent) : SkinDisplay(parent) m_stereo->move (212, 41); m_stereo->setStereoMono (0, 0); + m_slider = new Slider (this, Skin::POSBAR, + Skin::POSBAR_BTN_0, + Skin::POSBAR_BTN_1); + m_slider->move (16, 72); + } void @@ -73,26 +78,28 @@ MainDisplay::SetupToggleButtons (void) void MainDisplay::SetupPushButtons (void) { + MainWindow *mw = dynamic_cast(window ()); + /* 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()), m_mw->getHandler (), SLOT(prev())); + connect (m_prev, SIGNAL(clicked()), mw->getHandler (), 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()), m_mw->getHandler (), SLOT(play())); + connect (m_play, SIGNAL(clicked()), mw->getHandler (), 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()), m_mw->getHandler (), SLOT(pause())); + connect (m_pause, SIGNAL(clicked()), mw->getHandler (), 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()), m_mw->getHandler (), SLOT(stop())); + connect (m_stop, SIGNAL(clicked()), mw->getHandler (), 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()), m_mw->getHandler (), SLOT(next())); + connect (m_next, SIGNAL(clicked()), mw->getHandler (), 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 3a379a3..f54b4f9 100644 --- a/MainDisplay.h +++ b/MainDisplay.h @@ -18,10 +18,10 @@ class MainDisplay; #include "TitleBar.h" #include "Button.h" #include "TextBar.h" -#include "MainWindow.h" #include "NumberDisplay.h" #include "SmallNumberDisplay.h" #include "StereoMono.h" +#include "Slider.h" using namespace std; @@ -40,14 +40,13 @@ class MainDisplay : public SkinDisplay SmallNumberDisplay *m_khz; StereoMono *m_stereo; + Slider *m_slider; public slots: void setPixmaps(Skin *skin); protected: void SetupPushButtons (void); - void MainDisplay::SetupToggleButtons (void); - - MainWindow *m_mw; + void SetupToggleButtons (void); Button *m_prev; Button *m_play; diff --git a/MainWindow.cpp b/MainWindow.cpp index 6c39aed..2708a4b 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -1,7 +1,7 @@ #include #include "MainWindow.h" -MainWindow::MainWindow () +MainWindow::MainWindow (QWidget *parent) : QMainWindow (parent) { setWindowFlags(Qt::FramelessWindowHint); setGeometry(100, 100, 275, 116); @@ -13,7 +13,7 @@ MainWindow::MainWindow () setCentralWidget(m_display); - skin->setSkin("./Debian/"); + skin->setSkin("./CleanAMP/"); m_display->show(); } @@ -23,6 +23,12 @@ MainWindow::~MainWindow () delete skin; } +void +MainWindow::setNoDrag (bool b) +{ + m_display->setNoDrag (b); +} + Skin *MainWindow::getSkin(void) { return skin; @@ -32,7 +38,7 @@ int main (int argc, char **argv) { QApplication app(argc, argv); - MainWindow *mw = new MainWindow(); + MainWindow *mw = new MainWindow (NULL); mw->show(); diff --git a/MainWindow.h b/MainWindow.h index 9187290..08dacb5 100644 --- a/MainWindow.h +++ b/MainWindow.h @@ -23,11 +23,12 @@ class MainWindow : public QMainWindow { Q_OBJECT public: - MainWindow(void); - ~MainWindow(void); - Skin *getSkin(void); + MainWindow (QWidget *parent); + ~MainWindow (void); + Skin *getSkin (void); XMMSHandler *getHandler () { return m_handler; } MainDisplay *getMD () { return m_display; } + void setNoDrag (bool b); private: Skin *skin; XMMSHandler *m_handler; diff --git a/NumberDisplay.h b/NumberDisplay.h index 029fec6..65aa74e 100644 --- a/NumberDisplay.h +++ b/NumberDisplay.h @@ -1,12 +1,6 @@ #ifndef __NUMBERDISPLAY_H__ #define __NUMBERDISPLAY_H__ -#include - -#include -#include -#include - #include "PixWidget.h" class NumberDisplay : public PixWidget diff --git a/PixWidget.cpp b/PixWidget.cpp index 95a4ed6..20abe37 100644 --- a/PixWidget.cpp +++ b/PixWidget.cpp @@ -1,14 +1,13 @@ #include "MainWindow.h" - #include "PixWidget.h" - PixWidget::PixWidget (QWidget *parent) : QWidget (parent) { - MainWindow *mw = (MainWindow *)((SkinDisplay *)parent)->getMW(); - + MainWindow *mw = dynamic_cast(window ()); + if (!mw) { + qDebug ("******** DANGER! NO MAINWINDOW FOUND"); + } m_pixmap = QPixmap(0,0); - connect (mw->getSkin(), SIGNAL (skinChanged (Skin *)), this, SLOT (setPixmaps(Skin *))); } diff --git a/PixWidget.h b/PixWidget.h index 16c7193..930b596 100644 --- a/PixWidget.h +++ b/PixWidget.h @@ -3,12 +3,12 @@ #include +#include "Skin.h" + #include #include #include -#include "Skin.h" - class PixWidget : public QWidget { Q_OBJECT @@ -16,10 +16,12 @@ class PixWidget : public QWidget PixWidget(QWidget *parent = 0); ~PixWidget(); void paintEvent (QPaintEvent *event); + QWidget *getMW (void) { return m_mw; } public slots: virtual void setPixmaps(Skin *skin); protected: QPixmap m_pixmap; + QWidget *m_mw; }; #endif diff --git a/Skin.cpp b/Skin.cpp index 5927a11..5af42b2 100644 --- a/Skin.cpp +++ b/Skin.cpp @@ -277,6 +277,13 @@ void Skin::BuildSliders (void) { QPixmap *img; + + img = getPixmap("posbar.bmp"); + m_items->insert (POSBAR, img->copy (0, 0, 248, 10)); + m_items->insert (POSBAR_BTN_0, img->copy (248, 0, 29, 10)); + m_items->insert (POSBAR_BTN_1, img->copy (278, 0, 29, 10)); + + delete img; img = getPixmap("volume.bmp"); for (int i = VOLUMEBAR_POS_MIN; i < VOLUMEBAR_POS_MAX; i++) { diff --git a/Skin.h b/Skin.h index b2b0449..6f00378 100644 --- a/Skin.h +++ b/Skin.h @@ -146,6 +146,9 @@ class Skin : public QWidget PIC_PLAY, PIC_PAUSE, PIC_STOP, + POSBAR, + POSBAR_BTN_0, + POSBAR_BTN_1, }; private: QPixmap *Skin::getPixmap (string file); diff --git a/Slider.cpp b/Slider.cpp new file mode 100644 index 0000000..a89d44d --- /dev/null +++ b/Slider.cpp @@ -0,0 +1,135 @@ +#include "MainWindow.h" + +#include "Slider.h" + +#include +#include + +BarButton::BarButton (QWidget *parent, uint normal, uint pressed) : Button (parent, normal, pressed) +{ + m_slider = dynamic_cast(parent); + setMinimumSize (29, 10); + setMaximumSize (29, 10); +} + +void +BarButton::mouseMoveEvent (QMouseEvent *event) +{ + QPoint p (event->pos ()); + + /** @todo this could be cleaned up */ + if (m_slider->getVertical ()) { + int npos = pos().x() + p.x() - m_diffx; + if (npos >= 0 && npos + rect().width() <= m_slider->rect().width()) { + move (npos, 0); + } else if (npos < 0) { + move (0, 0); + } else if (npos + rect().width() > m_slider->rect().width()) { + move (m_slider->rect().width()-rect().width(), 0); + } + } else { + int npos = pos().y()+p.y()-m_diffy; + if (npos >= 0 && npos + rect().height() <= m_slider->rect().height()) { + move (npos, 0); + } else if (npos < 0) { + move (0, 0); + } else if (npos + rect().height() > m_slider->rect().height()) { + move (m_slider->rect().height()-rect().height(), 0); + } + } + +} + + +Slider::Slider (QWidget *parent, uint bg, uint bnormal, uint bpressed, bool vertical) : PixWidget (parent) +{ + MainWindow *mw = dynamic_cast(window ()); + + m_bg = bg; + m_vertical = vertical; + + setMinimumSize (248, 10); + setMaximumSize (248, 10); + + m_max = 0; + + m_button = new BarButton (this, bnormal, bpressed); + m_button->move (0, 0); + connect (m_button, SIGNAL(clicked ()), mw->getHandler (), SLOT (setPlaytime ())); + + if (m_vertical) { + m_pix = size().width()-m_button->size().width(); + } else { + m_pix = size().height()-m_button->size().height(); + } + + m_pos = 0; + + hideBar (true); + +} + +void +Slider::setSize (uint x, uint y) +{ + setMinimumSize (x, y); + setMaximumSize (x, y); + + if (m_vertical) { + m_pix = size().width()-m_button->size().width(); + } else { + m_pix = size().height()-m_button->size().height(); + } + +} + +uint +Slider::getPos (void) +{ + + if (m_vertical) { + return (uint)((float)m_button->pos().x()) / (float)(m_pix) * float(m_max); + } else { + return (uint)((float)m_button->pos().y())/((float)(m_pix*m_max)); + } +} + +void +Slider::hideBar (bool b) +{ + + if (b) { + m_button->hide (); + } else { + m_button->show (); + } + update(); + +} + +void +Slider::setPos (uint p) +{ + if (!m_max) { + return; + } + + if (m_button->noDrag()) { + return; + } + + uint x = m_pix * p / m_max; + if (x != m_pos) { + m_button->move (x , 0); + m_pos = x; + update (); + } + +} + +void +Slider::setPixmaps (Skin *skin) +{ + m_pixmap = skin->getItem (m_bg); +} + diff --git a/Slider.h b/Slider.h new file mode 100644 index 0000000..234eee7 --- /dev/null +++ b/Slider.h @@ -0,0 +1,51 @@ +#ifndef __SLIDER_H__ +#define __SLIDER_H__ + +#include "PixWidget.h" +#include "Button.h" + +class Slider; + +class BarButton : public Button +{ + public: + BarButton (QWidget *, uint, uint); + + void mouseMoveEvent (QMouseEvent *); + + private: + Slider *m_slider; + + +}; + +class Slider : public PixWidget +{ + Q_OBJECT + + public: + Slider (QWidget *parent, uint bg, uint bnormal, uint bpressed, bool vertical=true); + ~Slider () { } + + void setSize (uint, uint); + uint getPos (void); + void setPos (uint); + + void setMax (uint max) { m_max = max; } + void hideBar (bool b); + bool getVertical () { return m_vertical; } + + public slots: + void setPixmaps (Skin *skin); + + private: + bool m_vertical; + int m_bg; + uint m_max; + uint m_pix; + uint m_pos; + BarButton *m_button; + +}; + +#endif diff --git a/StereoMono.h b/StereoMono.h index 9f72abf..c89bec7 100644 --- a/StereoMono.h +++ b/StereoMono.h @@ -1,3 +1,6 @@ +#ifndef __STEREOMONO_H__ +#define __STEREOMONO_H__ + #include "PixWidget.h" class StereoMono : public PixWidget @@ -25,3 +28,4 @@ class StereoMono : public PixWidget QPixmap m_pixmap_stereo; }; +#endif diff --git a/TitleBar.cpp b/TitleBar.cpp index 5918b80..56f8969 100644 --- a/TitleBar.cpp +++ b/TitleBar.cpp @@ -1,4 +1,3 @@ -#include "MainWindow.h" #include "TitleBar.h" #include "Display.h" diff --git a/TitleBar.h b/TitleBar.h index d54bafa..a4bca68 100644 --- a/TitleBar.h +++ b/TitleBar.h @@ -1,7 +1,8 @@ #ifndef __TITLEBAR_H__ #define __TITLEBAR_H__ -#include +class TitleBar; + #include "PixWidget.h" using namespace std; diff --git a/XMMSHandler.cpp b/XMMSHandler.cpp index c0716c4..74ec78a 100644 --- a/XMMSHandler.cpp +++ b/XMMSHandler.cpp @@ -12,7 +12,7 @@ XMMSHandler::XMMSHandler (MainWindow *mw) : sigc::trackable () m_xmmsc = new XMMSClient ("promoe"); - if (!m_xmmsc->connect (NULL)) { + if (!m_xmmsc->connect (getenv ("XMMS_PATH"))) { QErrorMessage *err = new QErrorMessage (); err->showMessage ("Couldn't connect to XMMS2, please try again."); err->exec (); @@ -38,6 +38,9 @@ XMMSHandler::playback_playtime (XMMSResult *res) 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); + res->restart (); } @@ -53,6 +56,15 @@ XMMSHandler::playback_current_id (XMMSResult *res) r->connect (sigc::mem_fun (this, &XMMSHandler::medialib_info)); } +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 (XMMSResult *res) { @@ -80,6 +92,13 @@ XMMSHandler::medialib_info (XMMSResult *res) } } + if (res->getDictValue ("duration", &b)) { + if (b > 0) { + m_mw->getMD ()->m_slider->setMax (b); + m_mw->getMD ()->m_slider->hideBar (false); + } + } + delete res; } diff --git a/XMMSHandler.h b/XMMSHandler.h index 374bdd5..82b1a1f 100644 --- a/XMMSHandler.h +++ b/XMMSHandler.h @@ -22,6 +22,8 @@ class XMMSHandler : public QObject, public sigc::trackable { const XMMSClient *getXMMS () { return m_xmmsc; } public slots: + void setPlaytime (); + void play () { delete m_xmmsc->playback_start (); } void stop () { delete m_xmmsc->playback_stop (); } void pause () { delete m_xmmsc->playback_pause (); } diff --git a/promoe.pro b/promoe.pro index 1dc1e17..94cdf73 100644 --- a/promoe.pro +++ b/promoe.pro @@ -10,7 +10,8 @@ SOURCES += XmmsQT4.cpp \ NumberDisplay.cpp \ XMMSHandler.cpp \ SmallNumberDisplay.cpp \ - StereoMono.cpp + StereoMono.cpp \ + Slider.cpp HEADERS += XmmsQT4.h \ PixWidget.h \ @@ -24,7 +25,8 @@ HEADERS += XmmsQT4.h \ NumberDisplay.h \ XMMSHandler.h \ SmallNumberDisplay.h \ - StereoMono.h + StereoMono.h \ + Slider.h CONFIG += link_pkgconfig CONFIG += debug