[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: koffice/kexi/kexiutils
From: Jarosław Staniek <staniek () kde ! org>
Date: 2010-09-23 22:53:23
Message-ID: 20100923225323.839F5AC88C () svn ! kde ! org
[Download RAW message or body]
SVN commit 1178809 by staniek:
Forms
*fix infinite recursion in line edits because of using style proxies
BIG:247183
M +11 -1 styleproxy.cpp
M +62 -23 styleproxy.h
--- trunk/koffice/kexi/kexiutils/styleproxy.cpp #1178808:1178809
@@ -1,5 +1,5 @@
/* This file is part of the KDE project
- Copyright (C) 2006 Jarosław Staniek <staniek@kde.org>
+ Copyright (C) 2006-2010 Jarosław Staniek <staniek@kde.org>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
@@ -26,6 +26,7 @@
StyleProxy::StyleProxy(QStyle* parentStyle)
: QStyle()
+ , m_method(new int(0))
{
setParentStyle(parentStyle);
}
@@ -33,6 +34,7 @@
StyleProxy::~StyleProxy()
{
delete m_style;
+ delete m_method;
}
void StyleProxy::setParentStyle(QStyle* style)
@@ -48,3 +50,11 @@
return m_style;
return QApplication::style();
}
+
+QStyle* StyleProxy::parentStyle(int methodIndex) const
+{
+ if (!m_style || *m_method == methodIndex /* avoid infinite recursion */)
+ return QApplication::style();
+ *m_method = methodIndex;
+ return m_style;
+}
--- trunk/koffice/kexi/kexiutils/styleproxy.h #1178808:1178809
@@ -1,5 +1,5 @@
/* This file is part of the KDE project
- Copyright (C) 2006 Jarosław Staniek <staniek@kde.org>
+ Copyright (C) 2006-2010 Jarosław Staniek <staniek@kde.org>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
@@ -64,112 +64,151 @@
void setParentStyle(QStyle* style);
virtual void polish(QWidget *w) {
- parentStyle()->polish(w);
+ parentStyle(1)->polish(w);
+ *m_method = 0;
}
virtual void unpolish(QWidget *w) {
- parentStyle()->unpolish(w);
+ parentStyle(2)->unpolish(w);
+ *m_method = 0;
}
virtual void polish(QApplication *a) {
- parentStyle()->polish(a);
+ parentStyle(3)->polish(a);
+ *m_method = 0;
}
virtual void unpolish(QApplication *a) {
- parentStyle()->unpolish(a);
+ parentStyle(4)->unpolish(a);
+ *m_method = 0;
}
virtual void polish(QPalette &p) {
- parentStyle()->polish(p);
+ parentStyle(5)->polish(p);
+ *m_method = 0;
}
virtual QRect itemTextRect(const QFontMetrics &fm, const QRect &r,
int flags, bool enabled, const QString &text) const {
- return parentStyle()->itemTextRect(fm, r, flags, enabled, text);
+ QRect result = parentStyle(6)->itemTextRect(fm, r, flags, enabled, text);
+ *m_method = 0;
+ return result;
}
virtual QRect itemPixmapRect(const QRect &r, int flags, const QPixmap &pixmap) \
const {
- return parentStyle()->itemPixmapRect(r, flags, pixmap);
+ QRect result = parentStyle(7)->itemPixmapRect(r, flags, pixmap);
+ *m_method = 0;
+ return result;
}
virtual void drawItemText(QPainter *painter, const QRect &rect,
int flags, const QPalette &pal, bool enabled,
const QString &text, QPalette::ColorRole textRole = \
QPalette::NoRole) const {
- parentStyle()->drawItemText(painter, rect, flags, pal, enabled, text, \
textRole); + parentStyle(8)->drawItemText(painter, rect, flags, pal, enabled, \
text, textRole); + *m_method = 0;
}
virtual void drawPrimitive(PrimitiveElement element,
const QStyleOption * option, QPainter * painter,
const QWidget * widget = 0) const {
- parentStyle()->drawPrimitive(element, option, painter, widget);
+ parentStyle(9)->drawPrimitive(element, option, painter, widget);
+ *m_method = 0;
}
virtual void drawItemPixmap(QPainter *painter, const QRect &rect,
int alignment, const QPixmap &pixmap) const {
- parentStyle()->drawItemPixmap(painter, rect, alignment, pixmap);
+ parentStyle(10)->drawItemPixmap(painter, rect, alignment, pixmap);
+ *m_method = 0;
}
virtual QPalette standardPalette() const {
- return parentStyle()->standardPalette();
+ QPalette result = parentStyle(11)->standardPalette();
+ *m_method = 0;
+ return result;
}
virtual void drawControl(ControlElement element, const QStyleOption *opt,
QPainter *p, const QWidget *w = 0) const {
- parentStyle()->drawControl(element, opt, p, w);
+ parentStyle(12)->drawControl(element, opt, p, w);
+ *m_method = 0;
}
virtual QRect subElementRect(SubElement subElement, const QStyleOption *option,
const QWidget *widget = 0) const {
- return parentStyle()->subElementRect(subElement, option, widget);
+ QRect result = parentStyle(13)->subElementRect(subElement, option, widget);
+ *m_method = 0;
+ return result;
}
virtual void drawComplexControl(ComplexControl cc, const QStyleOptionComplex \
*opt,
QPainter *p, const QWidget *widget = 0) const {
- parentStyle()->drawComplexControl(cc, opt, p, widget);
+ parentStyle(14)->drawComplexControl(cc, opt, p, widget);
+ *m_method = 0;
}
virtual SubControl hitTestComplexControl(ComplexControl cc,
const QStyleOptionComplex *opt, const QPoint &pt, const QWidget *widget \
= 0) const {
- return parentStyle()->hitTestComplexControl(cc, opt, pt, widget);
+ SubControl result = parentStyle(15)->hitTestComplexControl(cc, opt, pt, \
widget); + *m_method = 0;
+ return result;
}
virtual QRect subControlRect(ComplexControl cc, const QStyleOptionComplex *opt,
SubControl sc, const QWidget *widget = 0) const {
- return parentStyle()->subControlRect(cc, opt, sc, widget);
+ QRect result = parentStyle(16)->subControlRect(cc, opt, sc, widget);
+ *m_method = 0;
+ return result;
}
virtual int pixelMetric(PixelMetric metric, const QStyleOption *option = 0,
const QWidget *widget = 0) const {
- return parentStyle()->pixelMetric(metric, option, widget);
+ int result = parentStyle(17)->pixelMetric(metric, option, widget);
+ *m_method = 0;
+ return result;
}
virtual QSize sizeFromContents(ContentsType ct, const QStyleOption *opt,
const QSize &contentsSize, const QWidget *w = 0) \
const {
- return parentStyle()->sizeFromContents(ct, opt, contentsSize, w);
+ QSize result = parentStyle(18)->sizeFromContents(ct, opt, contentsSize, w);
+ *m_method = 0;
+ return result;
}
virtual int styleHint(StyleHint stylehint, const QStyleOption *opt = 0,
const QWidget *widget = 0, QStyleHintReturn* returnData = \
0) const {
- return parentStyle()->styleHint(stylehint, opt, widget, returnData);
+ int result = parentStyle(19)->styleHint(stylehint, opt, widget, returnData);
+ *m_method = 0;
+ return result;
}
virtual QPixmap standardPixmap(StandardPixmap standardPixmap,
const QStyleOption *opt = 0, const QWidget \
*widget = 0) const {
- return parentStyle()->standardPixmap(standardPixmap, opt, widget);
+ QPixmap result = parentStyle(20)->standardPixmap(standardPixmap, opt, \
widget); + *m_method = 0;
+ return result;
}
QIcon standardIcon(StandardPixmap standardIcon, const QStyleOption *option = 0,
const QWidget *widget = 0) const {
- return parentStyle()->standardIcon(standardIcon, option, widget);
+ QIcon result = parentStyle(21)->standardIcon(standardIcon, option, widget);
+ *m_method = 0;
+ return result;
}
virtual QPixmap generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap,
const QStyleOption *opt) const {
- return parentStyle()->generatedIconPixmap(iconMode, pixmap, opt);
+ QPixmap result = parentStyle(22)->generatedIconPixmap(iconMode, pixmap, \
opt); + *m_method = 0;
+ return result;
}
protected:
+ //! Helper that returns m_style if not called recursively, otherwise returns \
QApplication::style() + //! to avoid infinite loop. *m_method is used to tracke \
two nested calls to the same method. + QStyle* parentStyle(int methodIndex) const;
+
QPointer<QStyle> m_style;
+ int *m_method;
};
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic