diff options
author | Norwegian Rock Cat <qt-info@nokia.com> | 2009-05-15 14:11:03 +0200 |
---|---|---|
committer | Norwegian Rock Cat <qt-info@nokia.com> | 2009-05-15 14:11:03 +0200 |
commit | 0fa61c04061a963cbab47f319542d9e26c06594f (patch) | |
tree | d3d0aa30d9a5909e2117c29e0724b9182af86237 | |
parent | b0fb74793aaeef85bad378c628c22eae10abdc44 (diff) |
Work on sizehints
-rw-r--r-- | src/qtsegmentcontrol.cpp | 47 | ||||
-rw-r--r-- | src/qtsegmentcontrol.h | 5 |
2 files changed, 46 insertions, 6 deletions
diff --git a/src/qtsegmentcontrol.cpp b/src/qtsegmentcontrol.cpp index 57716bc..dc73a60 100644 --- a/src/qtsegmentcontrol.cpp +++ b/src/qtsegmentcontrol.cpp @@ -2,6 +2,7 @@ #include <QtGui/QMenu> #include <QtGui/QPainter> #include <QtGui/QStyleOption> +#include <QtCore/QDebug> #include "qtsegmentcontrol.h" @@ -77,7 +78,7 @@ protected: }; static void drawSegmentControlSegment(const QStyleOption *option, - QPainter *painter, QWidget *widget = 0) + QPainter *painter, QWidget * = 0) { #ifndef Q_WS_MAC painter->fillRect(option->rect, Qt::blue); @@ -85,7 +86,6 @@ static void drawSegmentControlSegment(const QStyleOption *option, // ### Change to qstyleoption_cast! if (const QtStyleOptionSegmentControlSegment *segment = static_cast<const QtStyleOptionSegmentControlSegment *>(option)) { - qDebug("Segment pos %d", segment->position); CGContextRef cg = qt_mac_cg_context(painter->device()); HIThemeSegmentDrawInfo sgi; sgi.version = 0; @@ -261,23 +261,59 @@ QString QtSegmentControl::segmentWhatsThis(int segment) const return d->indexOK(segment) ? d->segments.at(segment).whatsThis : QString(); } -QSize QtSegmentControl::segmentSizeHint(int segment, const QSize &size) const +QSize QtSegmentControl::segmentSizeHint(int segment) const { - return QSize(20, 20); + QSize size; + const SegmentInfo &segmentInfo = d->segments[segment]; + QFontMetrics fm(font()); + size = fm.size(0, segmentInfo.text); + if (!segmentInfo.icon.isNull()) { + QSize size2 = segmentInfo.icon.actualSize(iconSize()); + size.rwidth() += size2.width(); + size.rheight() = qMax(size.height(), size2.height()); + } + return size; } QSize QtSegmentControl::sizeHint() const { QSize size; for (int i = 0; i < d->segments.count(); ++i) { - size += segmentSizeHint(i, size); + size += segmentSizeHint(i); } return size; } +QRect QtSegmentControl::segmentRect(int index) const +{ + QRect rect; + const int segmentCount = d->segments.count(); + for (int i = 0; i < segmentCount; ++i) { + QSize sz = segmentSizeHint(i); + if (i == index) { + rect.setSize(sz); + return rect; + } + rect.setLeft(rect.left() + sz.width()); + } + return QRect(); +} + +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)) + return i; + } + return -1; +} + void QtSegmentControl::paintEvent(QPaintEvent *) { QPainter p(this); + p.fillRect(rect(), Qt::blue); QtStyleOptionSegmentControlSegment segmentInfo; const int segmentCount = d->segments.count(); for (int i = 0; i < segmentCount; ++i) { @@ -345,6 +381,7 @@ void QtSegmentControl::initStyleOption(int segment, QStyleOption *option) sgi->selectedPosition = QtStyleOptionSegmentControlSegment::NotAdjacent; } } + sgi->rect = segmentRect(segment); sgi->text = segmentInfo.text; sgi->icon = segmentInfo.icon; } diff --git a/src/qtsegmentcontrol.h b/src/qtsegmentcontrol.h index d820f17..8c78cae 100644 --- a/src/qtsegmentcontrol.h +++ b/src/qtsegmentcontrol.h @@ -53,9 +53,12 @@ public: void setSegmentWhatsThis(int segment, const QString &whatsThisText); QString segmentWhatsThis(int segment) const; - virtual QSize segmentSizeHint(int segment, const QSize &size) const; + virtual QSize segmentSizeHint(int segment) const; QSize sizeHint() const; + QRect segmentRect(int index) const; + int segmentAt(const QPoint &pos) const; + protected: void initStyleOption(int segment, QStyleOption *option); void paintEvent(QPaintEvent *pe); |