summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNorwegian Rock Cat <qt-info@nokia.com>2009-05-15 17:07:01 +0200
committerNorwegian Rock Cat <qt-info@nokia.com>2009-05-15 17:07:01 +0200
commit0a76befcc70852f143bbf8edc76f61c7f6d3387f (patch)
tree7f09bcc151e75372e7b8b96c6705130fbe44acb9
parent06dba5e913def3b5f0fc77b9c11ba3a59c786617 (diff)
Some event handling.
-rw-r--r--example/simple/main.cpp2
-rw-r--r--src/qtsegmentcontrol.cpp115
2 files changed, 81 insertions, 36 deletions
diff --git a/example/simple/main.cpp b/example/simple/main.cpp
index d4ae8c9..c65231e 100644
--- a/example/simple/main.cpp
+++ b/example/simple/main.cpp
@@ -8,8 +8,8 @@ int main(int argc, char **argv)
QApplication app(argc, argv);
QWidget widget;
- widget.resize(200, 200);
QtSegmentControl *segmentControl = new QtSegmentControl(&widget);
+ segmentControl->setSelectionBehavior(QtSegmentControl::SelectOne);
segmentControl->setCount(5);
segmentControl->setSegmentText(0, "Homer");
segmentControl->setSegmentText(1, "Marge");
diff --git a/src/qtsegmentcontrol.cpp b/src/qtsegmentcontrol.cpp
index 0ec9257..2589375 100644
--- a/src/qtsegmentcontrol.cpp
+++ b/src/qtsegmentcontrol.cpp
@@ -2,6 +2,7 @@
#include <QtGui/QMenu>
#include <QtGui/QPainter>
#include <QtGui/QStyleOption>
+#include <QtGui/QMouseEvent>
#include <QtCore/QDebug>
#include "qtsegmentcontrol.h"
@@ -28,36 +29,6 @@ static ThemeDrawState getDrawState(QStyle::State flags)
#endif
-struct SegmentInfo {
- SegmentInfo() : menu(0), selected(false), enabled(true) {}
- ~SegmentInfo() { delete menu; }
- QString text;
- QString toolTip;
- QString whatsThis;
- QIcon icon;
- QMenu *menu;
- bool selected;
- bool enabled;
- QRect rect;
-};
-
-class QtSegmentControlPrivate {
-public:
- QtSegmentControlPrivate(QtSegmentControl *myQ) : q(myQ), lastSelected(-1), layoutDirty(true) {};
- ~QtSegmentControlPrivate() {};
-
- void layoutSegments();
- void postUpdate(int index = -1, bool geoToo = false);
-
- QtSegmentControl *q;
- QtSegmentControl::SelectionBehavior selectionBehavior;
- QSize iconSize;
- QVector<SegmentInfo> segments;
- int lastSelected;
- bool layoutDirty;
- inline bool indexOK(int index) { return index >= 0 && index < segments.count(); }
-};
-
class QtStyleOptionSegmentControlSegment : public QStyleOption
{
public:
@@ -136,6 +107,39 @@ static void drawSegmentControlSegment(const QStyleOption *option,
drawSegmentControlSegmentLabel(option, painter, widget);
}
+struct SegmentInfo {
+ SegmentInfo() : menu(0), selected(false), enabled(true) {}
+ ~SegmentInfo() { delete menu; }
+ QString text;
+ QString toolTip;
+ QString whatsThis;
+ QIcon icon;
+ QMenu *menu;
+ bool selected;
+ bool enabled;
+ QRect rect;
+};
+
+class QtSegmentControlPrivate {
+public:
+ QtSegmentControlPrivate(QtSegmentControl *myQ)
+ : q(myQ), lastSelected(-1), layoutDirty(true), pressedIndex(-1), wasPressed(-1) {};
+ ~QtSegmentControlPrivate() {};
+
+ void layoutSegments();
+ void postUpdate(int index = -1, bool geoToo = false);
+
+ QtSegmentControl *q;
+ QtSegmentControl::SelectionBehavior selectionBehavior;
+ QSize iconSize;
+ QVector<SegmentInfo> segments;
+ int lastSelected;
+ bool layoutDirty;
+ int pressedIndex;
+ int wasPressed;
+ inline bool indexOK(int index) { return index >= 0 && index < segments.count(); }
+};
+
void QtSegmentControlPrivate::layoutSegments()
{
if (!layoutDirty)
@@ -204,6 +208,17 @@ void QtSegmentControl::setSegmentSelected(int index, bool selected)
if (d->segments[index].selected != selected) {
d->segments[index].selected = selected;
+ d->lastSelected = index;
+ if (d->selectionBehavior == SelectOne) {
+ const int segmentCount = d->segments.count();
+ for (int i = 0; i < segmentCount; ++i) {
+ SegmentInfo &info = d->segments[i];
+ if (i != index && info.selected) {
+ info.selected = false;
+ d->postUpdate(i);
+ }
+ }
+ }
d->postUpdate(index);
emit segmentSelected(index);
}
@@ -224,9 +239,18 @@ void QtSegmentControl::setSelectionBehavior(SelectionBehavior behavior)
{
if (d->selectionBehavior == behavior)
return;
-
d->selectionBehavior = behavior;
- // ### change up selection and update()
+ if (behavior == SelectOne) {
+ // This call will do the right thing.
+ setSegmentSelected(d->lastSelected, true);
+ } else if (behavior == SelectNone) {
+ d->lastSelected = -1;
+ const int segmentCount = d->segments.count();
+ for (int i = 0; i < segmentCount; ++i) {
+ d->segments[i].selected = false;
+ }
+ d->postUpdate(-1);
+ }
}
QtSegmentControl::SelectionBehavior QtSegmentControl::selectionBehavior() const
@@ -384,17 +408,36 @@ void QtSegmentControl::paintEvent(QPaintEvent *)
void QtSegmentControl::mousePressEvent(QMouseEvent *event)
{
- QWidget::mousePressEvent(event);
+ d->wasPressed = d->pressedIndex = segmentAt(event->pos());
+ d->postUpdate(d->pressedIndex);
}
void QtSegmentControl::mouseMoveEvent(QMouseEvent *event)
{
- QWidget::mouseMoveEvent(event);
+ int index = segmentAt(event->pos());
+ if (index != d->wasPressed) {
+ d->pressedIndex = -1;
+ d->postUpdate(d->wasPressed);
+ } else if (index == d->wasPressed && d->pressedIndex == -1) {
+ d->pressedIndex = d->wasPressed;
+ d->postUpdate(d->wasPressed);
+ }
}
void QtSegmentControl::mouseReleaseEvent(QMouseEvent *event)
{
- QWidget::mouseReleaseEvent(event);
+ int index = segmentAt(event->pos());
+ // This order of reset is important.
+ d->pressedIndex = -1;
+ if (index == d->wasPressed && d->selectionBehavior != SelectNone) {
+ if (d->selectionBehavior == SelectAll) {
+ setSegmentSelected(index, !d->segments[index].selected);
+ } else {
+ setSegmentSelected(index, true);
+ d->postUpdate(index);
+ }
+ }
+ d->wasPressed = -1;
}
void QtSegmentControl::keyPressEvent(QKeyEvent *event)
@@ -417,6 +460,8 @@ void QtSegmentControl::initStyleOption(int segment, QStyleOption *option) const
if (!option || !d->indexOK(segment))
return;
option->initFrom(this);
+ if (segment == d->pressedIndex)
+ option->state |= QStyle::State_Sunken;
// ## Change to qstyleoption_cast
if (QtStyleOptionSegmentControlSegment *sgi = static_cast<QtStyleOptionSegmentControlSegment *>(option)) {
sgi->iconSize = d->iconSize;