23 #include <QGraphicsSceneResizeEvent>
29 #include <kmimetype.h>
33 #include "private/themedwidgetinterface_p.h"
39 class FramePrivate :
public ThemedWidgetInterface<Frame>
42 FramePrivate(Frame *parent)
43 : ThemedWidgetInterface<Frame>(parent),
67 void FramePrivate::syncBorders()
70 qreal left, top, right, bottom;
72 svg->getMargins(left, top, right, bottom);
75 QFontMetricsF fm(q->font());
79 q->setContentsMargins(left, top, right, bottom);
84 d(new FramePrivate(this))
87 d->svg->setImagePath(
"widgets/frame");
88 d->svg->setElementPrefix(
"plain");
91 connect(d->svg, SIGNAL(repaintNeeded()), SLOT(syncBorders()));
106 d->svg->setElementPrefix(
"raised");
109 d->svg->setElementPrefix(
"sunken");
113 d->svg->setElementPrefix(
"plain");
127 if (borders != d->svg->enabledBorders()) {
128 d->svg->setEnabledBorders(borders);
136 return d->svg->enabledBorders();
154 if (d->imagePath == path) {
164 bool absolutePath = !path.isEmpty() &&
166 !QDir::isRelativePath(path)
168 (path[0] ==
'/' || path.startsWith(QLatin1String(
":/")))
173 d->absImagePath = path;
179 if (path.isEmpty()) {
183 KMimeType::Ptr mime = KMimeType::findByPath(d->absImagePath);
185 if (!mime->is(
"image/svg+xml") && !mime->is(
"application/x-gzip")) {
186 d->pixmap =
new QPixmap(d->absImagePath);
189 d->image->setImagePath(path);
206 return d->styleSheet;
219 d->svg->paintFrame(painter);
221 if (!d->text.isNull()) {
222 QFontMetricsF fm(font());
223 QRectF textRect = d->svg->contentsRect();
224 textRect.setHeight(fm.height());
225 painter->setFont(font());
227 painter->drawText(textRect, Qt::AlignHCenter|Qt::AlignTop, d->text);
230 if (!d->imagePath.isNull()) {
231 if (d->pixmap && !d->pixmap->isNull()) {
232 painter->drawPixmap(contentsRect(), *d->pixmap, d->pixmap->rect());
233 }
else if (d->image) {
234 d->image->paint(painter, contentsRect());
241 d->svg->resizeFrame(event->newSize());
244 d->image->resize(contentsRect().size());
254 if (!d->image && !layout()) {
255 QFontMetricsF fm(font());
257 qreal left, top, right, bottom;
258 d->svg->getMargins(left, top, right, bottom);
260 hint.setHeight(fm.height() + top + bottom);
261 if (which == Qt::MinimumSize || which == Qt::PreferredSize) {
262 QRectF rect = fm.boundingRect(d->text);
263 hint.setWidth(rect.width() + left + right);
272 d->changeEvent(event);