From 6e7e2c2184aafdfb31ea72e860e5e3b3bc35622e Mon Sep 17 00:00:00 2001 From: Thomas Frauendorfer Date: Thu, 13 Mar 2008 05:30:00 +0100 Subject: [PATCH] Added a PixmapSlider class and changed Slider to inherit from it. PixmapSlider is a subclass of QAbstractSlider. It is independent of Skin.cpp. Slider is now only a wrapper to update the QPixmaps on a skin change. removed a workaround from equalizerwidget, that was necessary for the previous implementation. 2-3 one line fixes I don't remember --- src/PosBar.cpp | 4 +- src/VolumeSlider.cpp | 223 +++--------------------------- src/VolumeSlider.h | 59 +------- src/equalizer/equalizerwidget.cpp | 22 +-- src/equalizer/equalizerwidget.h | 4 +- src/mainwindow/maindisplay.cpp | 3 +- src/playlist/playlistwidget.cpp | 6 +- src/widgets/pixmapslider.cpp | 195 ++++++++++++++++++++++++++ src/widgets/pixmapslider.h | 69 +++++++++ src/widgets/widgets.pri | 6 +- 10 files changed, 311 insertions(+), 280 deletions(-) create mode 100644 src/widgets/pixmapslider.cpp create mode 100644 src/widgets/pixmapslider.h diff --git a/src/PosBar.cpp b/src/PosBar.cpp index de227a6..914fcca 100644 --- a/src/PosBar.cpp +++ b/src/PosBar.cpp @@ -150,9 +150,11 @@ PosBar::hideBar (bool b) if (b) { m_button->hide (); + hide (); } else { m_button->show (); - } + show (); + } update(); } diff --git a/src/VolumeSlider.cpp b/src/VolumeSlider.cpp index 45541b6..a9c0dd5 100644 --- a/src/VolumeSlider.cpp +++ b/src/VolumeSlider.cpp @@ -13,231 +13,46 @@ * GNU General Public License for more details. */ -#include "XMMSHandler.h" -#include - #include "VolumeSlider.h" #include "Skin.h" -#include "Button.h" - -#include -#include - -#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) Slider::Slider (QWidget *parent, uint name_min, uint name_max, - uint name_on, uint name_off, int min, int max) : PixWidget (parent) + uint name_on, uint name_off, int min, int max) : PixmapSlider (parent) { + Skin *skin = Skin::getInstance(); + + connect (skin, SIGNAL (skinChanged (Skin *)), + this, SLOT (setPixmaps(Skin *))); + m_name_min = name_min; m_name_max = name_max; m_name_on = name_on; m_name_off = name_off; - - m_min = min; - m_max = max; - m_button = 0; + setMinimum (min); + setMaximum (max); - m_value = 0; - m_value_index = (uint)((abs(m_min) / (double)(abs(m_min)+abs(m_max))) * (name_max-name_min)); } void Slider::setPixmaps (Skin *skin) { - m_skin = skin; - - m_pixmap_slider = m_skin->getItem(m_name_min+m_value_index); - m_vertical = (m_pixmap_slider.height() > m_pixmap_slider.width()) ? true : false; - - setMinimumSize(m_pixmap_slider.size()); - setMaximumSize(m_pixmap_slider.size()); - - resize(m_pixmap_slider.size()); + QPixmapList bglist; + for (uint32_t i = m_name_min; i <= m_name_max; i++) { + bglist.append (skin->getItem(i)); + } + setBackground (bglist); if (!skin->getItem(m_name_on).isNull() && !skin->getItem(m_name_off).isNull()) { - if (m_button) { - delete m_button; - } - - m_button = new SliderButton (this, m_name_on, m_name_off, m_vertical); - m_button->setPixmaps (m_skin); - m_button->show (); - - int tmp = (uint)((ceil(abs(m_min) / (double)(abs(m_min)+abs(m_max)))) * (m_name_max-m_name_min)); - if (m_vertical) { - m_button->move(1, height()-m_button->height()-tmp); - } else { - m_button->move(tmp, 1); - } + setSliders (skin->getItem(m_name_on), skin->getItem(m_name_off)); } else { - if (m_button) { - delete m_button; - m_button = NULL; - } + setSliders (QPixmap (), QPixmap ()); } + QPixmap pixmap_slider = skin->getItem(m_name_min); + setFixedSize(pixmap_slider.size()); + resize(pixmap_slider.size()); + update(); } - -void -Slider::changePixmap () -{ - m_pixmap_slider = m_skin->getItem (m_name_min+m_value_index); - update(); -} - -void -Slider::paintEvent (QPaintEvent *event) -{ - QPainter paint; - paint.begin (this); - paint.drawPixmap (rect(), m_pixmap_slider, m_pixmap_slider.rect ()); - paint.end (); -} - -void -Slider::mousePressEvent (QMouseEvent *event) -{ - updatePos (event); -} - -void -Slider::mouseMoveEvent (QMouseEvent *event) -{ - updatePos (event); -} - -void -Slider::mouseReleaseEvent (QMouseEvent *event) -{ - updatePos (event); -} - -void -Slider::updatePos (QMouseEvent *event) -{ - QPoint p (event->pos ()); - int value; - - if (m_vertical) { - value = CLAMP(p.y(), 0, height()); - } else { - value = CLAMP(p.x(), 0, width()); - } - - setPos(value, true); - if (m_button != 0) { - m_button->setPos(value); - } - - emit valueChanged (m_value); -} - -void -Slider::setValue (int value) -{ - double frac; - int pos; - - frac = abs(value)/(double)(abs(m_min)+abs(m_max)); - if (m_vertical) { - pos = (int)(height() * frac); - } else { - pos = (int)(width() * frac); - } - - setPos(pos, false); - if (m_button != 0) { - m_button->setPos(pos); - } -} - -void -Slider::setPos (int value, bool tell) -{ - double frac; - - if (m_vertical) { - frac = (height() - value) / (double) height(); - } else { - frac = value / (double) width(); - } - - /* calculate m_min <= m_value <= m_max */ - m_value = (uint)(frac * (abs(m_min) + abs(m_max)) + m_min); - - /* calculate m_name_min <= m_value_index <= m_name_max */ - m_value_index = (uint) ceil (frac * (m_name_max - m_name_min)); - - - changePixmap(); - - if (tell) { - emit valueChanged (m_value); - } -} - - -SliderButton::SliderButton (QWidget *parent, uint normal, uint pressed, - bool vertical) : Button (parent, normal, pressed, false) -{ - m_slider = dynamic_cast(parent); - m_vertical = vertical; - m_diff = 0; - - if (m_vertical) { - move(1, 0); - } else { - move(0, 1); - } -} - - -void -SliderButton::mousePressEvent (QMouseEvent *event) -{ - if (m_vertical) { - m_diff = y() - event->pos().y(); - } else { - m_diff = x() - event->pos().x(); - } - setDown (true); -} - - -void -SliderButton::mouseReleaseEvent (QMouseEvent *event) -{ - setDown (false); -} - - -void -SliderButton::setPos (uint pos) -{ - if (m_vertical) { - int ypos = MIN(pos, (uint)m_slider->height()-height()); - move(1, ypos); - } else { - int xpos = MIN(pos, (uint)m_slider->width()-width()); - move(xpos, 1); - } -} - - -void -SliderButton::mouseMoveEvent (QMouseEvent *event) -{ - QPoint p = m_slider->mapFromGlobal (event->globalPos ()); - int value; - if (m_vertical) { - value = CLAMP(p.y(), 0, m_slider->height()); - } else { - value = CLAMP(p.x(), 0, m_slider->width()); - } - - m_slider->setPos(value, true); - setPos (value); -} diff --git a/src/VolumeSlider.h b/src/VolumeSlider.h index 5991c77..ea18ba8 100644 --- a/src/VolumeSlider.h +++ b/src/VolumeSlider.h @@ -16,78 +16,23 @@ #ifndef __VOLUMESLIDER_H__ #define __VOLUMESLIDER_H__ -class Slider; -class MainDisplay; -class Button; - -#include "Button.h" -#include "PixWidget.h" +#include "pixmapslider.h" class Skin; -class SliderButton : public Button -{ - Q_OBJECT - public: - SliderButton (QWidget *parent, uint normal, uint pressed, bool dir); - void mouseMoveEvent (QMouseEvent *); - void mousePressEvent (QMouseEvent *); - void mouseReleaseEvent (QMouseEvent *); - void setPos (uint); - - - public slots: - //void setValue (uint volume_base100); - - private: - void changePixmap (bool pressed); - Slider *m_slider; - bool m_vertical; - int m_diff; -}; - -class Slider : public PixWidget +class Slider : public PixmapSlider { Q_OBJECT public: Slider (QWidget *parent, uint min, uint max, uint on, uint off, int, int); - void paintEvent (QPaintEvent *event); - - void mouseMoveEvent (QMouseEvent *); - void mousePressEvent (QMouseEvent *); - void mouseReleaseEvent (QMouseEvent *); - public slots: void setPixmaps (Skin *skin); - void setPos (int value, bool tell); - void setValue (int value); - - signals: - void valueChanged (int val); private: - void updatePos (QMouseEvent *event); - void changePixmap (); - - QPixmap m_pixmap_slider; - SliderButton *m_button; - - Skin *m_skin; - - uint m_value_index; - int m_value; - - int m_position; - uint m_name_min; uint m_name_max; uint m_name_on; uint m_name_off; - - int m_min; - int m_max; - - bool m_vertical; }; #endif diff --git a/src/equalizer/equalizerwidget.cpp b/src/equalizer/equalizerwidget.cpp index 322a08a..4b49757 100644 --- a/src/equalizer/equalizerwidget.cpp +++ b/src/equalizer/equalizerwidget.cpp @@ -32,14 +32,16 @@ EqualizerSlider::EqualizerSlider (QWidget *parent, uint pix_min, uint pix_max, pix_off, min, max) { m_id = id; - connect ( this, SIGNAL (valueChanged (int)), - this, SLOT (on_self_value_changed (int)) ); + connect ( this, SIGNAL (sliderMoved (int)), + this, SLOT (on_self_slider_moved (int)) ); + setInvertedAppearance (true); + setOrientation (Qt::Vertical); } void -EqualizerSlider::on_self_value_changed (int value) +EqualizerSlider::on_self_slider_moved (int value) { - emit numberedValueChanged (value, m_id); + emit numberedSliderMoved (value, m_id); } @@ -82,7 +84,9 @@ EqualizerWidget::EqualizerWidget (QWidget *parent) : QWidget (parent) Skin::EQ_WIN_BAR_BTN_0, Skin::EQ_WIN_BAR_BTN_1, -20, 20); m_preamp->move(21, 38); - connect (m_preamp, SIGNAL (valueChanged (int)), + m_preamp->setOrientation (Qt::Vertical); + m_preamp->setInvertedAppearance (true); + connect (m_preamp, SIGNAL (sliderMoved (int)), this, SLOT (updateServerPreamp (int))); for (int i=0; i < 10; i++) { @@ -91,7 +95,7 @@ EqualizerWidget::EqualizerWidget (QWidget *parent) : QWidget (parent) Skin::EQ_WIN_BAR_BTN_0, Skin::EQ_WIN_BAR_BTN_1, -20, 20, i); m_bands[i]->move(78+i*18, 38); - connect (m_bands[i], SIGNAL (numberedValueChanged (int, int)), + connect (m_bands[i], SIGNAL (numberedSliderMoved (int, int)), this, SLOT (updateServerBands (int, int))); } @@ -175,14 +179,12 @@ EqualizerWidget::serverConfigChanged (QString key, QString value) } if (key == "equalizer.preamp") { // FIXME: value can be of type floas - // '-20' should not be necessary. seems to be a bug in slider - m_preamp->setValue (value.toInt () -20); + m_preamp->setValue (value.toInt ()); } if (key.startsWith ("equalizer.legacy")) { int i = key.right (1).toInt (); // FIXME: value can be float - // '-20' should not be necessary. seems to be a bug in slider - m_bands[i]->setValue (value.toInt () -20 ); + m_bands[i]->setValue (value.toInt ()); } } diff --git a/src/equalizer/equalizerwidget.h b/src/equalizer/equalizerwidget.h index 98d11b3..7d3ed97 100644 --- a/src/equalizer/equalizerwidget.h +++ b/src/equalizer/equalizerwidget.h @@ -38,10 +38,10 @@ class EqualizerSlider : public Slider EqualizerSlider (QWidget*, uint, uint, uint, uint, int, int, int); signals: - void numberedValueChanged (int value, int id); + void numberedSliderMoved (int value, int id); protected slots: - void on_self_value_changed (int value); + void on_self_slider_moved (int value); private: int m_id; diff --git a/src/mainwindow/maindisplay.cpp b/src/mainwindow/maindisplay.cpp index af2479e..4d0d377 100644 --- a/src/mainwindow/maindisplay.cpp +++ b/src/mainwindow/maindisplay.cpp @@ -99,7 +99,7 @@ MainDisplay::MainDisplay (QWidget *parent) : SkinDisplay(parent) connect (client.cache () , SIGNAL (playtime (uint32_t)), this, SLOT (setPlaytime (uint32_t))); connect (&client, SIGNAL(getVolume(uint)), this, SLOT(updateVolume(uint))); - connect (m_vslider, SIGNAL(valueChanged(int)), this, SLOT(setVolume(int))); + connect (m_vslider, SIGNAL(sliderMoved(int)), this, SLOT(setVolume(int))); client.volumeGet(); setupServerConfig (); @@ -139,6 +139,7 @@ MainDisplay::setStatus (Xmms::Playback::Status status) m_time->setTime(0); m_posbar->setPos (0); m_posbar->hideBar (true); + m_stereo->setStereoMono (false, false); } } diff --git a/src/playlist/playlistwidget.cpp b/src/playlist/playlistwidget.cpp index 972b620..1fbffa0 100644 --- a/src/playlist/playlistwidget.cpp +++ b/src/playlist/playlistwidget.cpp @@ -73,7 +73,7 @@ PlaylistScrollBar::mouseMoveEvent (QMouseEvent *event) setValue(tmp); //TODO only repaint necessary range - repaint (); + update (); } void @@ -98,7 +98,7 @@ PlaylistScrollBar::mousePressEvent (QMouseEvent *event) } //TODO only repaint necessary range - repaint (); + update (); } void @@ -115,7 +115,7 @@ PlaylistScrollBar::mouseReleaseEvent (QMouseEvent *event) } //TODO only repaint necessary range - repaint (); + update (); } void diff --git a/src/widgets/pixmapslider.cpp b/src/widgets/pixmapslider.cpp new file mode 100644 index 0000000..2b9ee49 --- /dev/null +++ b/src/widgets/pixmapslider.cpp @@ -0,0 +1,195 @@ +/** + * This file is a part of Promoe, an XMMS2 Client + * + * Copyright (C) 2008 Thomas Frauendorfer + * + * 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 the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "pixmapslider.h" + +#include +#include +#include +#include +#include + +PixmapSlider::PixmapSlider (QWidget *parent) : QAbstractSlider (parent) +{ + setSliderDown (false); +} + +void +PixmapSlider::setBackground (const QPixmap &pixmap) +{ + QPixmapList list; + list.append (pixmap); + setBackground (list); +} + +void +PixmapSlider::setBackground (const QPixmapList &list) +{ + m_backgrounds = list; + m_background_index = -1; +} + +void +PixmapSlider::setSliders (QPixmap normal, QPixmap pressed) +{ + m_normal = normal; + m_pressed = pressed; +} + +void +PixmapSlider::mouseMoveEvent (QMouseEvent *event) +{ + if (!isSliderDown ()) { + event->ignore (); + return; + } + + int val = sliderMovePosition (event); + + if (val == value ()) { + return; + } + QAbstractSlider::setValue (val); +} + +void +PixmapSlider::mousePressEvent (QMouseEvent *event) +{ + if (event->button () != Qt::LeftButton) { + event->ignore (); + return; + } + + setSliderDown (true); + + int val = sliderMovePosition (event); + + if (val == value ()) { + return; + } + QAbstractSlider::setValue (val); + + update (); +} + +void +PixmapSlider::mouseReleaseEvent (QMouseEvent *event) +{ + if (event->button () != Qt::LeftButton) { + event->ignore (); + return; + } + + int val = sliderMovePosition (event); + + QAbstractSlider::setValue (val); + + setSliderDown (false); + + update (); +} + +int +PixmapSlider::sliderMovePosition (QMouseEvent *event) +{ + if (orientation () == Qt::Vertical) { + return sliderValueFromPosition (event->y() - m_pressed.height () /2); + } else { + return sliderValueFromPosition (event->x() - m_pressed.width () /2); + } + +} + +void +PixmapSlider::setValue (int val) +{ + if (isSliderDown ()){ + return; + } + QAbstractSlider::setValue (val); +} + +void +PixmapSlider::paintEvent (QPaintEvent *event) +{ + QPainter p; + p.begin (this); + // draw background + if (!m_backgrounds.isEmpty ()) { + int bg_idx = backgroundIndex (); + QPixmap bg = m_backgrounds[bg_idx]; + // only redraw the complete background, if the index changed + if (bg_idx == m_background_index) { + p.drawPixmap (event->rect (), bg, bg.rect ()); + } else { + m_background_index = bg_idx; + p.drawPixmap (rect (), bg, bg.rect ()); + } + } + // draw slider + QPixmap *slider = isSliderDown () ? &m_pressed : &m_normal; + QRect rect (slider->rect ()); + if (orientation () == Qt::Vertical) { + rect.moveTop (sliderPositionFromValue ()); + rect.moveLeft (1); + } else { + rect.moveLeft (sliderPositionFromValue ()); + rect.moveTop (1); + } + p.drawPixmap (rect , *slider, slider->rect ()); + p.end (); +} + +int +PixmapSlider::sliderPositionFromValue () +{ + int span; + if (orientation () == Qt::Vertical) { + span = height () - m_normal.height (); + } else { + span = width () - m_normal.width (); + } + + return QStyle::sliderPositionFromValue (minimum (), maximum (), + sliderPosition (), span, + invertedAppearance ()); +} + +int +PixmapSlider::sliderValueFromPosition (int pos) +{ + int span; + if (orientation () == Qt::Vertical) { + span = height () - m_normal.height (); + } else { + span = width () - m_normal.width (); + } + + return QStyle::sliderValueFromPosition (minimum (), maximum (), pos, + span, invertedAppearance ()); +} + +int +PixmapSlider::backgroundIndex () +{ + if (m_backgrounds.isEmpty ()) { + return -1; + } + + return QStyle::sliderPositionFromValue (minimum (), maximum (), + sliderPosition (), + m_backgrounds.size () - 1, false); +} diff --git a/src/widgets/pixmapslider.h b/src/widgets/pixmapslider.h new file mode 100644 index 0000000..9b75b10 --- /dev/null +++ b/src/widgets/pixmapslider.h @@ -0,0 +1,69 @@ +/** + * This file is a part of Promoe, an XMMS2 CLient + * + * Copyright (C) 2008 Thomas Frauendorfer + * + * 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 the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef __PIXMAPSLIDER_H__ +#define __PIXMAPSLIDER_H__ + +#include +#include + +class QWidget; +class QPixmap; +class QPaintEvent; +class QMouseEvent; + +typedef QList QPixmapList; + +class PixmapSlider : public QAbstractSlider +{ + Q_OBJECT + public: + PixmapSlider (QWidget *parent); + ~PixmapSlider () {} + + void setValue (int val); + + void setBackground (const QPixmap &); + void setBackground (const QPixmapList &); + QPixmapList backgrounds () const { return m_backgrounds; } + + void setSliders (QPixmap normal, QPixmap pressed = QPixmap ()); + QPixmap normalSlider () const { return m_normal; } + QPixmap pressedSlider () const { return m_pressed; } + + protected slots: + void paintEvent (QPaintEvent *event); + + void mouseMoveEvent (QMouseEvent *); + void mousePressEvent (QMouseEvent *); + void mouseReleaseEvent (QMouseEvent *); + + protected: + int sliderMovePosition (QMouseEvent *); + + int sliderPositionFromValue (); + int sliderValueFromPosition (int pos); + int backgroundIndex (); + + private: + QPixmapList m_backgrounds; + QPixmap m_normal; + QPixmap m_pressed; + + int m_background_index; +}; + +#endif diff --git a/src/widgets/widgets.pri b/src/widgets/widgets.pri index 64b44d4..970db7e 100644 --- a/src/widgets/widgets.pri +++ b/src/widgets/widgets.pri @@ -1,6 +1,8 @@ -HEADERS += pixmapbutton.h +HEADERS += pixmapbutton.h \ + pixmapslider.h -SOURCES += pixmapbutton.cpp +SOURCES += pixmapbutton.cpp \ + pixmapslider.cpp INCLUDEPATH += $$PWD DEPENDPATH += $$PWD