Change PosBar to use the new PixmapSlider class

This commit is contained in:
Thomas Frauendorfer 2008-03-21 22:43:21 +01:00
parent 6e7e2c2184
commit 220c124447
7 changed files with 58 additions and 204 deletions

View file

@ -16,172 +16,54 @@
#include "XMMSHandler.h"
#include "xplayback.h"
#include "mainwindow.h"
#include "PosBar.h"
#include "Skin.h"
#include <QWidget>
#include <QMouseEvent>
PosButton::PosButton (QWidget *parent, uint normal, uint pressed) : Button (parent, normal, pressed)
{
m_slider = dynamic_cast<PosBar *>(parent);
setMinimumSize (29, 10);
setMaximumSize (29, 10);
}
void
PosButton::setPos (uint pos)
{
m_pos = pos;
if (!isDown ()) {
move (pos, 0);
}
}
uint
PosButton::getPos (void)
{
return m_pos;
}
void
PosButton::mousePressEvent (QMouseEvent *event)
{
QPoint p (event->pos ());
m_diffx = p.x();
m_diffy = p.y();
setDown (true);
}
void
PosButton::mouseReleaseEvent (QMouseEvent *event)
{
setDown (false);
float value = pos().x() / (float)(m_slider->width() - width());
m_slider->requestPos (value);
}
void
PosButton::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);
}
}
}
PosBar::PosBar (QWidget *parent, uint bg, uint bnormal, uint bpressed, bool vertical) : PixWidget (parent)
PosBar::PosBar (QWidget *parent, uint bg, uint bnormal, uint bpressed)
: PixmapSlider (parent)
{
Skin *skin = Skin::getInstance ();
m_slider_normal = bnormal;
m_slider_pressed = bpressed;
m_bg = bg;
m_vertical = vertical;
setMinimumSize (248, 10);
setMaximumSize (248, 10);
m_max = 0;
m_button = new PosButton (this, bnormal, bpressed);
m_button->move (0, 0);
if (m_vertical) {
m_pix = size().width()-m_button->size().width();
} else {
m_pix = size().height()-m_button->size().height();
}
hideBar (true);
connect (skin, SIGNAL (skinChanged (Skin *)),
this, SLOT (setPixmaps (Skin *)));
setFixedSize (248, 10);
setMinimum (0);
setMaximum (0);
connect (this, SIGNAL (sliderMoved (int)),
this, SLOT (seekMs (int)));
hide ();
}
void
PosBar::setSize (uint x, uint y)
PosBar::seekMs (int value)
{
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
PosBar::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
PosBar::hideBar (bool b)
{
if (b) {
m_button->hide ();
hide ();
} else {
m_button->show ();
show ();
}
update();
}
void
PosBar::setPos (uint p)
{
if (!m_max) {
return;
}
uint x = m_pix * p / m_max;
if (x < m_pix - m_button->rect().width() && x != m_button->getPos()) {
m_button->setPos (x);
update ();
}
}
void
PosBar::requestPos (float value)
{
XMMSHandler::getInstance ().xplayback ()->seekMs (m_max * value);
XMMSHandler::getInstance ().xplayback ()->seekMs (value);
}
void
PosBar::setPixmaps (Skin *skin)
{
m_pixmap = skin->getItem (m_bg);
QPixmap pixmap = skin->getItem (m_bg);
setBackground (pixmap);
setFixedSize (248, pixmap.height ());
if ( !skin->getItem(m_slider_normal).isNull() &&
!skin->getItem(m_slider_pressed).isNull()) {
setSliders (skin->getItem(m_slider_normal),
skin->getItem(m_slider_pressed));
} else {
setSliders (QPixmap (), QPixmap ());
}
update ();
}