You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdemultimedia/juk/slideraction.cpp

358 lines
11 KiB

/***************************************************************************
begin : Wed Feb 6 2002
copyright : (C) 2002 - 2004 by Scott Wheeler
email : wheeler@kde.org
***************************************************************************/
/***************************************************************************
* *
* 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. *
* *
***************************************************************************/
#include <ktoolbar.h>
#include <klocale.h>
#include <kiconloader.h>
#include <kdebug.h>
#include <tqtooltip.h>
#include <tqlayout.h>
#include <tqlabel.h>
#include <tqtimer.h>
#include "slideraction.h"
////////////////////////////////////////////////////////////////////////////////
// convenience class
////////////////////////////////////////////////////////////////////////////////
/**
* This "custom" slider reverses the left and middle buttons. Typically the
* middle button "instantly" seeks rather than moving the slider towards the
* click position in fixed intervals. This behavior has now been mapped on
* to the left mouse button.
*/
class TrackPositionSlider : public TQSlider
{
public:
TrackPositionSlider(TQWidget *parent, const char *name) : TQSlider(parent, name)
{
setFocusPolicy(TQ_NoFocus);
}
protected:
virtual void mousePressEvent(TQMouseEvent *e)
{
if(e->button() == Qt::LeftButton) {
TQMouseEvent reverse(TQEvent::MouseButtonPress, e->pos(), Qt::MidButton, e->state());
TQSlider::mousePressEvent(&reverse);
emit sliderPressed();
}
else if(e->button() == Qt::MidButton) {
TQMouseEvent reverse(TQEvent::MouseButtonPress, e->pos(), Qt::LeftButton, e->state());
TQSlider::mousePressEvent(&reverse);
}
}
};
////////////////////////////////////////////////////////////////////////////////
// VolumeSlider implementation
////////////////////////////////////////////////////////////////////////////////
VolumeSlider::VolumeSlider(Qt::Orientation o, TQWidget *parent, const char *name) :
TQSlider(o, parent, name)
{
connect(this, TQT_SIGNAL(valueChanged(int)), this, TQT_SLOT(slotValueChanged(int)));
}
void VolumeSlider::wheelEvent(TQWheelEvent *e)
{
if(orientation() ==Qt::Horizontal) {
TQWheelEvent transposed(e->pos(), -(e->delta()), e->state(), e->orientation());
TQSlider::wheelEvent(&transposed);
}
else
TQSlider::wheelEvent(e);
}
void VolumeSlider::focusInEvent(TQFocusEvent *)
{
clearFocus();
}
int VolumeSlider::volume() const
{
if(orientation() ==Qt::Horizontal)
return value();
else
return maxValue() - value();
}
void VolumeSlider::setVolume(int value)
{
if(orientation() ==Qt::Horizontal)
setValue(value);
else
setValue(maxValue() - value);
}
void VolumeSlider::setOrientation(Qt::Orientation o)
{
if(o == orientation())
return;
blockSignals(true);
setValue(maxValue() - value());
blockSignals(false);
TQSlider::setOrientation(o);
}
void VolumeSlider::slotValueChanged(int value)
{
if(orientation() ==Qt::Horizontal)
emit signalVolumeChanged(value);
else
emit signalVolumeChanged(maxValue() - value);
}
////////////////////////////////////////////////////////////////////////////////
// public members
////////////////////////////////////////////////////////////////////////////////
const int SliderAction::minPosition = 0;
const int SliderAction::maxPosition = 1000;
SliderAction::SliderAction(const TQString &text, TQObject *parent, const char *name)
: KAction(text, 0, parent, name),
m_toolBar(0),
m_layout(0),
m_trackPositionSlider(0),
m_volumeSlider(0),
m_dragging(false),
m_volumeDragging(false)
{
}
SliderAction::~SliderAction()
{
}
int SliderAction::plug(TQWidget *parent, int index)
{
TQWidget *w = createWidget(parent);
if(!w)
return -1;
// the check for null makes sure that there is only one toolbar that this is
// "plugged" in to
if(parent->inherits("KToolBar") && !m_toolBar) {
m_toolBar = static_cast<KToolBar *>(parent);
int id = KAction::getToolButtonID();
m_toolBar->insertWidget(id, w->width(), w, index);
addContainer(m_toolBar, id);
connect(m_toolBar, TQT_SIGNAL(destroyed()), this, TQT_SLOT(slotToolbarDestroyed()));
connect(m_toolBar, TQT_SIGNAL(orientationChanged(Qt::Orientation)),
this, TQT_SLOT(slotUpdateOrientation()));
connect(m_toolBar, TQT_SIGNAL(placeChanged(TQDockWindow::Place)),
this, TQT_SLOT(slotUpdateOrientation()));
slotUpdateOrientation();
return (containerCount() - 1);
}
else
slotUpdateOrientation();
return -1;
}
void SliderAction::unplug(TQWidget *parent)
{
if (parent->inherits("KToolBar")) {
m_toolBar = static_cast<KToolBar *>(parent);
int index = findContainer(m_toolBar);
if (index != -1) {
m_toolBar->removeItem(itemId(index));
removeContainer(index);
m_toolBar = 0;
}
}
}
////////////////////////////////////////////////////////////////////////////////
// public slots
////////////////////////////////////////////////////////////////////////////////
void SliderAction::slotUpdateOrientation()
{
// if the toolbar is not null and either the dockWindow not defined or is the toolbar
if(!m_toolBar)
return;
if(m_toolBar->barPos() == KToolBar::Right || m_toolBar->barPos() == KToolBar::Left) {
m_trackPositionSlider->setOrientation(Qt::Vertical);
m_volumeSlider->setOrientation(Qt::Vertical);
m_layout->setDirection(TQBoxLayout::TopToBottom);
}
else {
m_trackPositionSlider->setOrientation(Qt::Horizontal);
m_volumeSlider->setOrientation(Qt::Horizontal);
m_layout->setDirection(TQBoxLayout::LeftToRight);
}
slotUpdateSize();
}
////////////////////////////////////////////////////////////////////////////////
// private members
////////////////////////////////////////////////////////////////////////////////
TQWidget *SliderAction::createWidget(TQWidget *parent) // virtual -- used by base class
{
if(parent) {
TQWidget *base = new TQWidget(parent);
base->setBackgroundMode(parent->backgroundMode());
base->setName("kde toolbar widget");
KToolBar *toolBar = dynamic_cast<KToolBar *>(parent);
if(toolBar)
toolBar->setStretchableWidget(base);
Qt::Orientation orientation;
if(toolBar && toolBar->barPos() == KToolBar::Right || toolBar->barPos() == KToolBar::Left)
orientation =Qt::Vertical;
else
orientation =Qt::Horizontal;
m_layout = new TQBoxLayout(base, TQBoxLayout::TopToBottom, 5, 5);
m_layout->addItem(new TQSpacerItem(20, 1));
TQLabel *trackPositionLabel = new TQLabel(base);
trackPositionLabel->setName("kde toolbar widget");
trackPositionLabel->setPixmap(SmallIcon("player_time"));
TQToolTip::add(trackPositionLabel, i18n("Track position"));
m_layout->addWidget(trackPositionLabel);
m_trackPositionSlider = new TrackPositionSlider(base, "trackPositionSlider");
m_trackPositionSlider->setMaxValue(maxPosition);
TQToolTip::add(m_trackPositionSlider, i18n("Track position"));
m_layout->addWidget(m_trackPositionSlider);
connect(m_trackPositionSlider, TQT_SIGNAL(sliderPressed()), this, TQT_SLOT(slotSliderPressed()));
connect(m_trackPositionSlider, TQT_SIGNAL(sliderReleased()), this, TQT_SLOT(slotSliderReleased()));
m_layout->addItem(new TQSpacerItem(10, 1));
TQLabel *volumeLabel = new TQLabel(base);
volumeLabel->setName("kde toolbar widget");
volumeLabel->setPixmap(SmallIcon("player_volume"));
TQToolTip::add(volumeLabel, i18n("Volume"));
m_layout->addWidget(volumeLabel);
m_volumeSlider = new VolumeSlider(orientation, base, "volumeSlider");
m_volumeSlider->setMaxValue(100);
TQToolTip::add(m_volumeSlider, i18n("Volume"));
m_layout->addWidget(m_volumeSlider);
connect(m_volumeSlider, TQT_SIGNAL(signalVolumeChanged(int)), TQT_SIGNAL(signalVolumeChanged(int)));
connect(m_volumeSlider, TQT_SIGNAL(sliderPressed()), this, TQT_SLOT(slotVolumeSliderPressed()));
connect(m_volumeSlider, TQT_SIGNAL(sliderReleased()), this, TQT_SLOT(slotVolumeSliderReleased()));
m_volumeSlider->setName("kde toolbar widget");
m_trackPositionSlider->setName("kde toolbar widget");
m_layout->setStretchFactor(m_trackPositionSlider, 4);
m_layout->setStretchFactor(m_volumeSlider, 1);
connect(parent, TQT_SIGNAL(modechange()), this, TQT_SLOT(slotUpdateSize()));
return base;
}
else
return 0;
}
////////////////////////////////////////////////////////////////////////////////
// private slots
////////////////////////////////////////////////////////////////////////////////
void SliderAction::slotUpdateSize()
{
static const int offset = 3;
static const int absoluteMax = 10000;
if(!m_toolBar)
return;
if(m_toolBar->barPos() == KToolBar::Right || m_toolBar->barPos() == KToolBar::Left) {
m_volumeSlider->setMaximumWidth(m_toolBar->iconSize() - offset);
m_volumeSlider->setMaximumHeight(volumeMax);
m_trackPositionSlider->setMaximumWidth(m_toolBar->iconSize() - offset);
m_trackPositionSlider->setMaximumHeight(absoluteMax);
}
else {
m_volumeSlider->setMaximumHeight(m_toolBar->iconSize() - offset);
m_volumeSlider->setMaximumWidth(volumeMax);
m_trackPositionSlider->setMaximumHeight(m_toolBar->iconSize() - offset);
m_trackPositionSlider->setMaximumWidth(absoluteMax);
}
}
void SliderAction::slotSliderPressed()
{
m_dragging = true;
}
void SliderAction::slotSliderReleased()
{
m_dragging = false;
emit signalPositionChanged(m_trackPositionSlider->value());
}
void SliderAction::slotVolumeSliderPressed()
{
m_volumeDragging = true;
}
void SliderAction::slotVolumeSliderReleased()
{
m_volumeDragging = false;
emit signalVolumeChanged(m_volumeSlider->value());
}
void SliderAction::slotToolbarDestroyed()
{
int index = findContainer(m_toolBar);
if(index != -1)
removeContainer(index);
m_toolBar = 0;
// This is probably a leak, but this code path hardly ever occurs, and it's
// too hard to debug correctly.
m_trackPositionSlider = 0;
m_volumeSlider = 0;
}
#include "slideraction.moc"
// vim: set et sw=4 ts=4: