diff options
author | Norwegian Rock Cat <qt-info@nokia.com> | 2009-07-03 13:05:58 +0200 |
---|---|---|
committer | Norwegian Rock Cat <qt-info@nokia.com> | 2009-07-03 13:05:58 +0200 |
commit | 48784989a429da87ba8a3b8b5a5390616b146a60 (patch) | |
tree | 72e6398e135af64bff71bf85d87e71c3532a23d3 | |
parent | 26fba3ca3300639024a0c39acb70d3b34ff61bf1 (diff) |
Some work with the enabled property.
Basics are there, mouse events aren't delivered at all to a disabled item.
The appearance isn't quite correct though.
-rw-r--r-- | example/simple/main.cpp | 14 | ||||
-rw-r--r-- | src/qtsegmentcontrol.cpp | 22 |
2 files changed, 29 insertions, 7 deletions
diff --git a/example/simple/main.cpp b/example/simple/main.cpp index 2b19edd..ea9fc86 100644 --- a/example/simple/main.cpp +++ b/example/simple/main.cpp @@ -1,5 +1,6 @@ #include <QtGui/QApplication> #include <QtGui/QWidget> +#include <QtGui/QCheckBox> #include <QtGui/QVBoxLayout> #include "qtsegmentcontrol.h" @@ -9,10 +10,12 @@ class MyWindow : public QWidget public: MyWindow() { controller = new QtSegmentControl(); - controller->setCount(3); + controller->setCount(4); controller->setSegmentText(0, tr("Select One")); controller->setSegmentText(1, tr("Select All")); controller->setSegmentText(2, tr("Select None")); + controller->setSegmentText(3, tr("Permanently Disabled")); + controller->setSegmentEnabled(3, false); controller->setSelectionBehavior(QtSegmentControl::SelectOne); connect(controller, SIGNAL(segmentSelected(int)), this, SLOT(updateBehavior(int))); segmentControl = new QtSegmentControl(); @@ -24,9 +27,14 @@ public: segmentControl->setSegmentText(4, "Maggie"); controller->setSegmentSelected(0, true); + QCheckBox *button = new QCheckBox(tr("Disable Bart")); + button->setChecked(false); + connect(button, SIGNAL(toggled(bool)), SLOT(updateBart(bool))); + QVBoxLayout *vboxlayout = new QVBoxLayout(); vboxlayout->addWidget(controller); vboxlayout->addWidget(segmentControl); + vboxlayout->addWidget(button); setLayout(vboxlayout); } @@ -35,6 +43,10 @@ private slots: segmentControl->setSelectionBehavior(QtSegmentControl::SelectionBehavior(newOne)); } + void updateBart(bool enabled) { + segmentControl->setSegmentEnabled(2, !enabled); + } + private: QtSegmentControl *controller; QtSegmentControl *segmentControl; diff --git a/src/qtsegmentcontrol.cpp b/src/qtsegmentcontrol.cpp index 617f54a..762b40f 100644 --- a/src/qtsegmentcontrol.cpp +++ b/src/qtsegmentcontrol.cpp @@ -1,6 +1,8 @@ +#include <QtGui/QApplication> #include <QtGui/QIcon> #include <QtGui/QMenu> #include <QtGui/QPainter> +#include <QtGui/QStyle> #include <QtGui/QStyleOption> #include <QtGui/QMouseEvent> #include <QtCore/QDebug> @@ -120,7 +122,8 @@ static void drawSegmentControlSegmentLabel(const QStyleOption *option, QPainter { if (const QtStyleOptionSegmentControlSegment *segment = static_cast<const QtStyleOptionSegmentControlSegment *>(option)) { - painter->drawText(segment->rect, Qt::AlignCenter, segment->text); + qApp->style()->drawItemText(painter, segment->rect, Qt::AlignCenter, segment->palette, + segment->state & QStyle::State_Enabled, segment->text); } } @@ -416,7 +419,7 @@ int QtSegmentControl::segmentAt(const QPoint &pos) const const int segmentCount = d->segments.count(); for (int i = 0; i < segmentCount; ++i) { QRect rect = segmentRect(i); - if (rect.contains(pos)) + if (rect.contains(pos) && d->segments.at(i).enabled) return i; } return -1; @@ -437,8 +440,11 @@ void QtSegmentControl::paintEvent(QPaintEvent *) void QtSegmentControl::mousePressEvent(QMouseEvent *event) { - d->wasPressed = d->pressedIndex = segmentAt(event->pos()); - d->postUpdate(d->pressedIndex); + int segmentIndex = segmentAt(event->pos()); + if (segmentIndex != -1) { + d->wasPressed = d->pressedIndex = segmentAt(event->pos()); + d->postUpdate(d->pressedIndex); + } } void QtSegmentControl::mouseMoveEvent(QMouseEvent *event) @@ -456,6 +462,8 @@ void QtSegmentControl::mouseMoveEvent(QMouseEvent *event) void QtSegmentControl::mouseReleaseEvent(QMouseEvent *event) { int index = segmentAt(event->pos()); + if (index == -1) + return; // This order of reset is important. d->pressedIndex = -1; if (index == d->wasPressed && d->selectionBehavior != SelectNone) { @@ -504,9 +512,11 @@ void QtSegmentControl::initStyleOption(int segment, QStyleOption *option) const } else { sgi->position = QtStyleOptionSegmentControlSegment::Middle; } - if (segmentInfo.selected) { + + if (segmentInfo.selected) sgi->state |= QStyle::State_Selected; - } + if (!segmentInfo.enabled) + sgi->state &= ~QStyle::State_Enabled; if (d->selectionBehavior != QtSegmentControl::SelectNone) { sgi->selectedPositions = QtStyleOptionSegmentControlSegment::NotAdjacent; |