New widget: radio button

svn path=/trunk/KDE/kdebase/workspace/plasma/lib/; revision=666420
This commit is contained in:
Rafael Fernández López 2007-05-19 20:49:16 +00:00
parent 4c4b013b89
commit 3294b91379
3 changed files with 294 additions and 0 deletions

View File

@ -16,6 +16,7 @@ set(plasma_LIB_SRCS
widgets/lineedit.cpp
widgets/pushbutton.cpp
widgets/checkbox.cpp
widgets/radiobutton.cpp
)
kde4_automoc(${plasma_LIB_SRCS})

201
widgets/radiobutton.cpp Normal file
View File

@ -0,0 +1,201 @@
/**
* Copyright (C) 2007 by Rafael Fernández López <ereslibre@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License version 2 as
* published by the Free Software Foundation
*
* 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
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the
* Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
// Qt includes
#include <QtGui/QWidget>
#include <QtGui/QApplication>
#include <QtGui/QGraphicsScene>
#include <QtGui/QStyleOptionButton>
#include <QtGui/QGraphicsSceneMouseEvent>
// Radio button includes
#include "radiobutton.h"
namespace Plasma
{
/// Private section ==============================
class RadioButton::Private
{
public:
Private();
~Private();
// Attributes
bool checked;
bool mouseOver;
bool mouseDown;
QString text;
};
RadioButton::Private::Private()
: checked(false)
, mouseOver(false)
, mouseDown(false)
, text(QString())
{
}
RadioButton::Private::~Private()
{
}
/// End Private section ==========================
RadioButton::RadioButton(QGraphicsItem *parent)
: QGraphicsItem(parent)
, d(new Private)
{
setAcceptedMouseButtons(Qt::LeftButton);
setAcceptsHoverEvents(true);
}
RadioButton::~RadioButton()
{
delete d;
}
void RadioButton::updated(const Plasma::DataSource::Data&)
{
}
QRectF RadioButton::boundingRect() const
{
return QRectF(0, 0, 150, 30);
}
void RadioButton::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
QStyle *style = widget ? widget->style() : QApplication::style();
QStyleOptionButton radioButtonOption;
radioButtonOption.rect = option->rect;
radioButtonOption.text = d->text;
radioButtonOption.state = option->state;
radioButtonOption.state |= d->checked ? QStyle::State_On : QStyle::State_Off;
radioButtonOption.state |= d->mouseOver && isEnabled() ? QStyle::State_MouseOver : QStyle::State_None;
radioButtonOption.state |= d->mouseDown && isEnabled() ? QStyle::State_Sunken : QStyle::State_Raised;
style->drawControl(QStyle::CE_RadioButton, &radioButtonOption, painter, widget);
}
bool RadioButton::isChecked() const
{
return d->checked;
}
const QString &RadioButton::text() const
{
return d->text;
}
void RadioButton::setChecked(bool checked)
{
d->checked = checked;
RadioButton *siblingRadioButton;
// If we have a parent item (some kind of grouping widget or whatever)
// check first there.
if (d->mouseOver && checked && parentItem())
{
foreach(QGraphicsItem *sibling, parentItem()->children())
{
siblingRadioButton = dynamic_cast<RadioButton*>(sibling);
if (siblingRadioButton && siblingRadioButton->isChecked())
{
siblingRadioButton->setChecked(false);
break; // Only an item is checked at same time as maximum
}
}
}
// If not, we should be on a scene, not flying anywhere
else if (checked && !parentItem() && scene())
{
foreach(QGraphicsItem *sibling, scene()->items())
{
siblingRadioButton = dynamic_cast<RadioButton*>(sibling);
if (siblingRadioButton && siblingRadioButton->isChecked())
{
siblingRadioButton->setChecked(false);
break; // Only an item is checked at same time as maximum
}
}
}
update();
}
void RadioButton::setText(const QString &text)
{
d->text = text;
update();
}
void RadioButton::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
event->accept();
d->mouseDown = true;
update();
}
void RadioButton::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
event->accept();
d->mouseDown = false;
setChecked(true);
update();
emit clicked();
}
void RadioButton::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
event->accept();
d->mouseOver = true;
update();
}
void RadioButton::hoverMoveEvent(QGraphicsSceneHoverEvent *event)
{
event->accept();
d->mouseOver = true;
update();
}
void RadioButton::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
{
event->accept();
d->mouseOver = false;
update();
}
void RadioButton::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
{
event->accept();
d->mouseOver = true;
update();
}
} // Plasma namespace
#include "radiobutton.moc"

92
widgets/radiobutton.h Normal file
View File

@ -0,0 +1,92 @@
/**
* Copyright (C) 2007 by Rafael Fernández López <ereslibre@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License version 2 as
* published by the Free Software Foundation
*
* 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
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the
* Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef RADIOBUTTON_H
#define RADIOBUTTON_H
// Qt includes
#include <QtCore/QObject>
#include <QtGui/QGraphicsItem>
// KDE includes
#include <kdemacros.h>
// Plasma includes
#include "datavisualization.h"
/**
* This class emulates a QRadioButton.
*
* You will be able to add radio buttons as childrens of a QGraphicsItem, so
* only one radio button will be checked at a time. If you don't add them as
* siblings (adding all them as childrens of the same QGraphicsItem), then
* you can add them directly to a scene, where they will be siblings too. This
* way you can have groups of radio buttons.
*
* @note Please before working with radio buttons, add them to a scene or as
* childrens of another QGraphicsItem.
*
* @author Rafael Fernández López
*/
namespace Plasma
{
class KDE_EXPORT RadioButton : public DataVisualization
, public QGraphicsItem
{
Q_OBJECT
public:
RadioButton(QGraphicsItem *parent = 0);
virtual ~RadioButton();
// DataVisualization overriden virtual methods
void updated(const Plasma::DataSource::Data&);
// QGraphicsItem overriden virtual methods
QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
// Getters
bool isChecked() const;
const QString &text() const;
// Setters
void setChecked(bool checked);
void setText(const QString &text);
Q_SIGNALS:
void clicked();
protected:
virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *event);
virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
private:
class Private;
Private *const d;
};
} // Plasma namespace
#endif // RADIOBUTTON_H