diff --git a/src/mainwindow/clutterbar.cpp b/src/mainwindow/clutterbar.cpp index fea051c..3ac8a78 100644 --- a/src/mainwindow/clutterbar.cpp +++ b/src/mainwindow/clutterbar.cpp @@ -20,7 +20,9 @@ #include #include -ClutterBar::ClutterBar (QWidget *parent) : QWidget (parent) +ClutterBar::ClutterBar (QWidget *parent) : QWidget (parent), + m_val (Skin::CLUTTER_ON), m_checked_a (false), m_checked_d (false), + m_show_always (true) { connect (SkinManager::instance (), SIGNAL (skinChanged (Skin *)), this, SLOT (setPixmaps(Skin *))); @@ -34,18 +36,16 @@ ClutterBar::~ClutterBar () void ClutterBar::setPixmaps(Skin *skin) { - m_clutter_on = skin->getItem(Skin::CLUTTER_ON); - m_clutter_off = skin->getItem(Skin::CLUTTER_OFF); + setPixmaps (skin->getPixmapList (Skin::PIXMAPS_CLUTTERBAR)); +} - m_clutter_o = skin->getItem(Skin::CLUTTER_O); - m_clutter_a = skin->getItem(Skin::CLUTTER_A); - m_clutter_i = skin->getItem(Skin::CLUTTER_I); - m_clutter_d = skin->getItem(Skin::CLUTTER_D); - m_clutter_v = skin->getItem(Skin::CLUTTER_V); +void +ClutterBar::setPixmaps (const QPixmapList &p) +{ + m_pixmaps = p; - m_pixmap = m_clutter_on; - - setFixedSize (m_clutter_on.size ()); + QPixmap pixmap = m_pixmaps.value (Skin::CLUTTER_ON); + setFixedSize (pixmap.size ()); update(); } @@ -53,41 +53,118 @@ ClutterBar::setPixmaps(Skin *skin) void ClutterBar::mousePressEvent (QMouseEvent *event) { - int y = event->pos().y(); - - if (y > 2 && y < 11) { - m_pixmap = m_clutter_o; - } else if (y > 10 && y < 19) { - m_pixmap = m_clutter_a; - } else if (y > 18 && y < 27) { - m_pixmap = m_clutter_i; - } else if (y > 26 && y < 35) { - m_pixmap = m_clutter_d; - } else if (y > 34 && y < 43) { - m_pixmap = m_clutter_v; - } + m_val = posToVal (event->x (), event->y ()); update(); } +void +ClutterBar::mouseMoveEvent (QMouseEvent *event) +{ + const int val = posToVal (event->x(), event->y()); + + if (m_val != val) { + m_val = val; + + update (); + } +} void ClutterBar::mouseReleaseEvent (QMouseEvent *event) { - m_pixmap = m_clutter_on; + m_val = Skin::CLUTTER_ON; + + const int val = posToVal (event->x (), event->y()); + switch (val) { + case Skin::CLUTTER_O: + emit clicked_o (); + break; + case Skin::CLUTTER_A: + m_checked_a = !m_checked_a; + emit clicked_a (m_checked_a); + break; + case Skin::CLUTTER_I: + emit clicked_i (); + break; + case Skin::CLUTTER_D: + m_checked_d = !m_checked_d; + emit clicked_d (m_checked_d); + break; + case Skin::CLUTTER_V: + emit clicked_v (); + break; + default: + break; + } update(); } +void +ClutterBar::enterEvent (QEvent * event) +{ + update (); +} +void +ClutterBar::leaveEvent (QEvent * event) +{ + update (); +} + +bool +ClutterBar::posInWidget (const int x, const int y) const +{ + return (x >= 0 && y >= 0 && x < width() && y < height()); +} + +int +ClutterBar::posToVal (const int x, const int y) const +{ + if (!posInWidget (x, y)) + return Skin::CLUTTER_ON; + + if (y <= 2) { + return Skin::CLUTTER_ON; + } else if (y <= 10) { + return Skin::CLUTTER_O; + } else if (y <= 18) { + return Skin::CLUTTER_A; + } else if (y <= 26) { + return Skin::CLUTTER_I; + } else if (y <= 34) { + return Skin::CLUTTER_D; + } else if (y <= 42) { + return Skin::CLUTTER_V; + } + + return Skin::CLUTTER_ON; +} void ClutterBar::paintEvent (QPaintEvent *event) { - if (m_pixmap.isNull ()) { - return; + QPainter paint (this); + if (m_show_always || underMouse ()) { + const QPixmap pix = m_pixmaps.value (m_val); + if (pix.isNull ()) + return; + paint.drawPixmap (rect (), pix, pix.rect ()); + if (m_checked_a) { + const QPixmap pix_a = m_pixmaps.value (Skin::CLUTTER_A); + const QRect rect(0, 10, pix_a.width (), 8); + paint.drawPixmap (rect, pix_a, rect); + } + if (m_checked_d) { + const QPixmap pix_d = m_pixmaps.value (Skin::CLUTTER_D); + const QRect rect(0, 26, pix_d.width (), 8); + paint.drawPixmap (rect, pix_d, rect); + } + } else { + const QPixmap pix = m_pixmaps.value (Skin::CLUTTER_OFF); + if (pix.isNull ()) + return; + paint.drawPixmap (rect (), pix, pix.rect ()); } - - QPainter p (this); - p.drawPixmap (rect (), m_pixmap, m_pixmap.rect ()); } #include "clutterbar.moc" diff --git a/src/mainwindow/clutterbar.h b/src/mainwindow/clutterbar.h index 7559f75..3769b6d 100644 --- a/src/mainwindow/clutterbar.h +++ b/src/mainwindow/clutterbar.h @@ -1,7 +1,7 @@ /** * This file is a part of Promoe, an XMMS2 Client. * - * Copyright (C) 2005-2008 XMMS2 Team + * Copyright (C) 2005-2010 XMMS2 Team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,12 +16,17 @@ #ifndef __CLUTTERBAR_H__ #define __CLUTTERBAR_H__ -#include "QWidget" +#include +#include +#include + class QMouseEvent; class QPaintEvent; class Skin; +typedef QList QPixmapList; + class ClutterBar : public QWidget { Q_OBJECT @@ -30,26 +35,36 @@ class ClutterBar : public QWidget ~ClutterBar (); public slots: + void setPixmaps (const QPixmapList &); void setPixmaps(Skin *skin); + signals: + void clicked_o (); + void clicked_a (bool checked); + void clicked_i (); + void clicked_d (bool checked); + void clicked_v (); + protected: void paintEvent (QPaintEvent *event); void mousePressEvent (QMouseEvent *event); + void mouseMoveEvent (QMouseEvent *event); void mouseReleaseEvent (QMouseEvent *event); - QPixmap m_clutter_off; - QPixmap m_clutter_on; + void enterEvent (QEvent *event); + void leaveEvent (QEvent *event); - QPixmap m_clutter_o; - QPixmap m_clutter_a; - QPixmap m_clutter_i; - QPixmap m_clutter_d; - QPixmap m_clutter_v; + bool posInWidget (const int x, const int y) const; + int posToVal (const int x, const int y) const; - bool enabled; + QPixmapList m_pixmaps; - QPixmap m_pixmap; + int m_val; + bool m_checked_a; + bool m_checked_d; + + bool m_show_always; }; diff --git a/src/playlist/playlistmenu.h b/src/playlist/playlistmenu.h index 22e520f..4ef8242 100644 --- a/src/playlist/playlistmenu.h +++ b/src/playlist/playlistmenu.h @@ -16,7 +16,7 @@ #ifndef __PLAYLISTMENU_H__ #define __PLAYLISTMENU_H__ -#include +#include "skin.h" #include diff --git a/src/skin/skin.cpp b/src/skin/skin.cpp index 22453ec..728ddcb 100644 --- a/src/skin/skin.cpp +++ b/src/skin/skin.cpp @@ -125,14 +125,17 @@ Skin::handle_titlebar (const QPixmap &img) m_items[STATUSBAR_0] = img.copy(27, 29, 275, 14); m_items[STATUSBAR_1] = img.copy(27, 29+13, 275, 14); - m_items[CLUTTER_ON] = img.copy(304+8*0, 0, 8, 43); - m_items[CLUTTER_OFF] = img.copy(304+8*1, 0, 8, 43); + // Must be the same order as ClutterItems + QPixmapList clist; + clist << img.copy(304+8*0, 0, 8, 43); // CLUTTER_ON + clist << img.copy(304+8*1, 0, 8, 43); // CLUTTER_OFF - m_items[CLUTTER_O] = img.copy(304+8*0, 44, 8, 43); - m_items[CLUTTER_A] = img.copy(304+8*1, 44, 8, 43); - m_items[CLUTTER_I] = img.copy(304+8*2, 44, 8, 43); - m_items[CLUTTER_D] = img.copy(304+8*3, 44, 8, 43); - m_items[CLUTTER_V] = img.copy(304+8*4, 44, 8, 43); + clist << img.copy(304+8*0, 44, 8, 43); // CLUTTER_O + clist << img.copy(304+8*1, 44, 8, 43); // CLUTTER_A + clist << img.copy(304+8*2, 44, 8, 43); // CLUTTER_I + clist << img.copy(304+8*3, 44, 8, 43); // CLUTTER_D + clist << img.copy(304+8*4, 44, 8, 43); // CLUTTER_V + m_pixmaplists[PIXMAPS_CLUTTERBAR] = clist; return true; } diff --git a/src/skin/skin.h b/src/skin/skin.h index 9063b37..ce32a87 100644 --- a/src/skin/skin.h +++ b/src/skin/skin.h @@ -162,6 +162,8 @@ class Skin : public QObject SLIDER_BALANCEBAR_BUTTON, SLIDER_EQUALIZER, SLIDER_EQUALIZER_BGS, + /* Various */ + PIXMAPS_CLUTTERBAR, // }; // // enum Part { // Old and not yet sorted enum @@ -177,20 +179,10 @@ class Skin : public QObject TITLEBAR_1, STATUSBAR_0, STATUSBAR_1, - SEEKBAR, - SEEKBAR_POS_0, - SEEKBAR_POS_1, TEXTBG, PIC_PLAY, PIC_PAUSE, PIC_STOP, - CLUTTER_ON, - CLUTTER_OFF, - CLUTTER_O, - CLUTTER_A, - CLUTTER_I, - CLUTTER_D, - CLUTTER_V, EQ_WIN_BG, EQ_WIN_TITLE_ACTIVE, EQ_WIN_TITLE_INACTIVE, @@ -200,6 +192,17 @@ class Skin : public QObject POSBAR, }; + // The order here must be the same as in handle_titlebar + enum ClutterItems { + CLUTTER_ON, + CLUTTER_OFF, + CLUTTER_O, + CLUTTER_A, + CLUTTER_I, + CLUTTER_D, + CLUTTER_V + }; + enum PlaylistParts { PLS_CORNER_UL_0, PLS_CORNER_UL_1,