* consolidate geometry() and setGeometry() from the layouts into Layout
* introduce relayout() which does only that * place guards around relayout() calls in Layout class to prevent recursion svn path=/trunk/KDE/kdebase/workspace/libs/plasma/; revision=738923
This commit is contained in:
parent
ff0b3da511
commit
e614df56d0
@ -57,10 +57,10 @@
|
|||||||
#include "plasma/theme.h"
|
#include "plasma/theme.h"
|
||||||
#include "plasma/view.h"
|
#include "plasma/view.h"
|
||||||
|
|
||||||
|
#include "plasma/layouts/boxlayout.h"
|
||||||
#include "plasma/widgets/widget.h"
|
#include "plasma/widgets/widget.h"
|
||||||
#include "plasma/widgets/lineedit.h"
|
#include "plasma/widgets/lineedit.h"
|
||||||
#include "plasma/widgets/pushbutton.h"
|
#include "plasma/widgets/pushbutton.h"
|
||||||
#include "plasma/layouts/boxlayout.h"
|
|
||||||
|
|
||||||
//#define DYNAMIC_SHADOWS
|
//#define DYNAMIC_SHADOWS
|
||||||
namespace Plasma
|
namespace Plasma
|
||||||
@ -715,7 +715,7 @@ void Applet::flushUpdatedConstraints()
|
|||||||
constraintsUpdated(c);
|
constraintsUpdated(c);
|
||||||
|
|
||||||
if (layout()) {
|
if (layout()) {
|
||||||
layout()->update();
|
layout()->updateGeometry();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,7 +41,6 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
QMap< Position, LayoutItem * > itemPositions;
|
QMap< Position, LayoutItem * > itemPositions;
|
||||||
QRectF geometry;
|
|
||||||
QMap< Position, qreal > sizes;
|
QMap< Position, qreal > sizes;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -65,39 +64,23 @@ Qt::Orientations BorderLayout::expandingDirections() const
|
|||||||
return Qt::Horizontal | Qt::Vertical;
|
return Qt::Horizontal | Qt::Vertical;
|
||||||
}
|
}
|
||||||
|
|
||||||
QRectF BorderLayout::geometry() const
|
void BorderLayout::relayout()
|
||||||
{
|
{
|
||||||
return d->geometry;
|
QRectF rect = geometry();
|
||||||
}
|
rect.setTopLeft(rect.topLeft() + QPointF(margin(LeftMargin), margin(TopMargin)));
|
||||||
|
rect.setBottomRight(rect.bottomRight() - QPointF(margin(RightMargin), margin(BottomMargin)));
|
||||||
|
|
||||||
void BorderLayout::setGeometry(const QRectF& geometry)
|
QPointF origin = rect.topLeft();
|
||||||
{
|
|
||||||
if (!geometry.isValid() || geometry.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
d->geometry = geometry;
|
|
||||||
|
|
||||||
invalidate();
|
|
||||||
}
|
|
||||||
|
|
||||||
void BorderLayout::invalidate()
|
|
||||||
{
|
|
||||||
QRectF geometry = d->geometry;
|
|
||||||
geometry.setTopLeft(geometry.topLeft() + QPointF(margin(LeftMargin), margin(TopMargin)));
|
|
||||||
geometry.setBottomRight(geometry.bottomRight() - QPointF(margin(RightMargin), margin(BottomMargin)));
|
|
||||||
|
|
||||||
QPointF origin = geometry.topLeft();
|
|
||||||
qreal top, bottom, left, right;
|
qreal top, bottom, left, right;
|
||||||
top = (d->sizes[TopPositioned] >= 0) ? d->sizes[TopPositioned] : 0;
|
top = (d->sizes[TopPositioned] >= 0) ? d->sizes[TopPositioned] : 0;
|
||||||
left = (d->sizes[LeftPositioned] >= 0) ? d->sizes[LeftPositioned] : 0;
|
left = (d->sizes[LeftPositioned] >= 0) ? d->sizes[LeftPositioned] : 0;
|
||||||
bottom = geometry.height() - ((d->sizes[BottomPositioned] >= 0) ? d->sizes[BottomPositioned] : 0);
|
bottom = rect.height() - ((d->sizes[BottomPositioned] >= 0) ? d->sizes[BottomPositioned] : 0);
|
||||||
right = geometry.width() - ((d->sizes[RightPositioned] >= 0) ? d->sizes[RightPositioned] : 0);
|
right = rect.width() - ((d->sizes[RightPositioned] >= 0) ? d->sizes[RightPositioned] : 0);
|
||||||
|
|
||||||
if (d->itemPositions[TopPositioned] /*&& d->itemPositions[TopPositioned]->isVisible()*/) {
|
if (d->itemPositions[TopPositioned] /*&& d->itemPositions[TopPositioned]->isVisible()*/) {
|
||||||
top = (d->sizes[TopPositioned] >= 0) ? d->sizes[TopPositioned] : d->itemPositions[TopPositioned]->sizeHint().height();
|
top = (d->sizes[TopPositioned] >= 0) ? d->sizes[TopPositioned] : d->itemPositions[TopPositioned]->sizeHint().height();
|
||||||
d->itemPositions[TopPositioned]->setGeometry(QRectF(origin, QSizeF(
|
d->itemPositions[TopPositioned]->setGeometry(QRectF(origin, QSizeF(
|
||||||
geometry.width(), top)));
|
rect.width(), top)));
|
||||||
top += spacing();
|
top += spacing();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,9 +88,9 @@ void BorderLayout::invalidate()
|
|||||||
bottom = (d->sizes[BottomPositioned] >= 0) ? d->sizes[BottomPositioned]
|
bottom = (d->sizes[BottomPositioned] >= 0) ? d->sizes[BottomPositioned]
|
||||||
: d->itemPositions[BottomPositioned]->sizeHint().height();
|
: d->itemPositions[BottomPositioned]->sizeHint().height();
|
||||||
d->itemPositions[BottomPositioned]->setGeometry(QRectF(origin + QPointF(0,
|
d->itemPositions[BottomPositioned]->setGeometry(QRectF(origin + QPointF(0,
|
||||||
geometry.height() - bottom), QSizeF(geometry.width(),
|
rect.height() - bottom), QSizeF(rect.width(),
|
||||||
bottom)));
|
bottom)));
|
||||||
bottom = geometry.height() - bottom - spacing();
|
bottom = rect.height() - bottom - spacing();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (d->itemPositions[LeftPositioned] /*&& d->itemPositions[LeftPositioned]->isVisible()*/) {
|
if (d->itemPositions[LeftPositioned] /*&& d->itemPositions[LeftPositioned]->isVisible()*/) {
|
||||||
@ -120,8 +103,8 @@ void BorderLayout::invalidate()
|
|||||||
if (d->itemPositions[RightPositioned] /*&& d->itemPositions[RightPositioned]->isVisible()*/) {
|
if (d->itemPositions[RightPositioned] /*&& d->itemPositions[RightPositioned]->isVisible()*/) {
|
||||||
right = (d->sizes[RightPositioned] >= 0) ? d->sizes[RightPositioned] : d->itemPositions[RightPositioned]->sizeHint().width();
|
right = (d->sizes[RightPositioned] >= 0) ? d->sizes[RightPositioned] : d->itemPositions[RightPositioned]->sizeHint().width();
|
||||||
d->itemPositions[RightPositioned]->setGeometry(QRectF(origin + QPointF(
|
d->itemPositions[RightPositioned]->setGeometry(QRectF(origin + QPointF(
|
||||||
geometry.width() - right, top), QSizeF(right, bottom - top)));
|
rect.width() - right, top), QSizeF(right, bottom - top)));
|
||||||
right = geometry.width() - right - spacing();
|
right = rect.width() - right - spacing();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (d->itemPositions[CenterPositioned] /*&& d->itemPositions[CenterPositioned]->isVisible()*/) {
|
if (d->itemPositions[CenterPositioned] /*&& d->itemPositions[CenterPositioned]->isVisible()*/) {
|
||||||
@ -169,7 +152,7 @@ void BorderLayout::addItem(Plasma::LayoutItem * item, Position position)
|
|||||||
removeItem(item);
|
removeItem(item);
|
||||||
d->itemPositions[position] = item;
|
d->itemPositions[position] = item;
|
||||||
item->setManagingLayout(this);
|
item->setManagingLayout(this);
|
||||||
update();
|
updateGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BorderLayout::removeItem(LayoutItem * item)
|
void BorderLayout::removeItem(LayoutItem * item)
|
||||||
@ -182,7 +165,7 @@ void BorderLayout::removeItem(LayoutItem * item)
|
|||||||
item->unsetManagingLayout(this);
|
item->unsetManagingLayout(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
update();
|
updateGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
int BorderLayout::count() const
|
int BorderLayout::count() const
|
||||||
@ -236,13 +219,13 @@ Plasma::LayoutItem * BorderLayout::takeAt(int i)
|
|||||||
void BorderLayout::setSize(qreal size, Position border)
|
void BorderLayout::setSize(qreal size, Position border)
|
||||||
{
|
{
|
||||||
d->sizes[border] = size;
|
d->sizes[border] = size;
|
||||||
update();
|
updateGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BorderLayout::setAutoSize(Position border)
|
void BorderLayout::setAutoSize(Position border)
|
||||||
{
|
{
|
||||||
d->sizes[border] = -1;
|
d->sizes[border] = -1;
|
||||||
update();
|
updateGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
qreal BorderLayout::size(Position border)
|
qreal BorderLayout::size(Position border)
|
||||||
|
@ -41,10 +41,6 @@ public:
|
|||||||
virtual ~BorderLayout();
|
virtual ~BorderLayout();
|
||||||
|
|
||||||
virtual Qt::Orientations expandingDirections() const;
|
virtual Qt::Orientations expandingDirections() const;
|
||||||
virtual QRectF geometry() const;
|
|
||||||
void setGeometry(const QRectF& geometry);
|
|
||||||
|
|
||||||
void invalidate();
|
|
||||||
|
|
||||||
QSizeF sizeHint() const;
|
QSizeF sizeHint() const;
|
||||||
|
|
||||||
@ -88,6 +84,9 @@ public:
|
|||||||
*/
|
*/
|
||||||
qreal size(Position border);
|
qreal size(Position border);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void relayout();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class Private;
|
class Private;
|
||||||
Private * const d;
|
Private * const d;
|
||||||
|
@ -36,7 +36,6 @@ class BoxLayout::Private
|
|||||||
public:
|
public:
|
||||||
BoxLayout *const q;
|
BoxLayout *const q;
|
||||||
Direction direction;
|
Direction direction;
|
||||||
QRectF geometry;
|
|
||||||
QList<LayoutItem*> children;
|
QList<LayoutItem*> children;
|
||||||
|
|
||||||
Private(BoxLayout *parent)
|
Private(BoxLayout *parent)
|
||||||
@ -255,7 +254,7 @@ BoxLayout::BoxLayout(Direction direction , LayoutItem *parent)
|
|||||||
void BoxLayout::setDirection(Direction direction)
|
void BoxLayout::setDirection(Direction direction)
|
||||||
{
|
{
|
||||||
d->direction = direction;
|
d->direction = direction;
|
||||||
update();
|
updateGeometry();
|
||||||
}
|
}
|
||||||
BoxLayout::Direction BoxLayout::direction() const
|
BoxLayout::Direction BoxLayout::direction() const
|
||||||
{
|
{
|
||||||
@ -285,11 +284,6 @@ Qt::Orientations BoxLayout::expandingDirections() const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QRectF BoxLayout::geometry() const
|
|
||||||
{
|
|
||||||
return d->geometry;
|
|
||||||
}
|
|
||||||
|
|
||||||
int BoxLayout::count() const
|
int BoxLayout::count() const
|
||||||
{
|
{
|
||||||
return d->children.count();
|
return d->children.count();
|
||||||
@ -313,7 +307,7 @@ void BoxLayout::insertItem(int index, LayoutItem *item)
|
|||||||
animator()->setCurrentState(item,LayoutAnimator::InsertedState);
|
animator()->setCurrentState(item,LayoutAnimator::InsertedState);
|
||||||
}
|
}
|
||||||
|
|
||||||
update();
|
updateGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BoxLayout::addItem(LayoutItem *item)
|
void BoxLayout::addItem(LayoutItem *item)
|
||||||
@ -333,7 +327,7 @@ void BoxLayout::removeItem(LayoutItem *item)
|
|||||||
if ( animator() )
|
if ( animator() )
|
||||||
animator()->setCurrentState(item,LayoutAnimator::RemovedState);
|
animator()->setCurrentState(item,LayoutAnimator::RemovedState);
|
||||||
|
|
||||||
update();
|
updateGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
int BoxLayout::indexOf(LayoutItem *l) const
|
int BoxLayout::indexOf(LayoutItem *l) const
|
||||||
@ -350,12 +344,12 @@ LayoutItem *BoxLayout::takeAt(int i)
|
|||||||
{
|
{
|
||||||
return d->children.takeAt(i);
|
return d->children.takeAt(i);
|
||||||
|
|
||||||
update();
|
updateGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BoxLayout::setGeometry(const QRectF& geo)
|
void BoxLayout::relayout()
|
||||||
{
|
{
|
||||||
QRectF margined = geo.adjusted(margin(LeftMargin), margin(TopMargin), -margin(RightMargin), -margin(BottomMargin));
|
QRectF margined = geometry().adjusted(margin(LeftMargin), margin(TopMargin), -margin(RightMargin), -margin(BottomMargin));
|
||||||
|
|
||||||
//qDebug() << "geo before " << geo << "and with margins" << margined << "margins" << margin(LeftMargin)
|
//qDebug() << "geo before " << geo << "and with margins" << margined << "margins" << margin(LeftMargin)
|
||||||
// << margin(TopMargin) << -margin(RightMargin) << -margin(BottomMargin);
|
// << margin(TopMargin) << -margin(RightMargin) << -margin(BottomMargin);
|
||||||
@ -426,7 +420,7 @@ void BoxLayout::setGeometry(const QRectF& geo)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// set items' geometry according to new sizes
|
// set items' geometry according to new sizes
|
||||||
qreal pos = d->startPos(geo);
|
qreal pos = d->startPos(geometry());
|
||||||
for ( int i = 0 ; i < sizes.count() ; i++ ) {
|
for ( int i = 0 ; i < sizes.count() ; i++ ) {
|
||||||
|
|
||||||
//QObject *obj = dynamic_cast<QObject*>(d->children[i]);
|
//QObject *obj = dynamic_cast<QObject*>(d->children[i]);
|
||||||
@ -436,7 +430,6 @@ void BoxLayout::setGeometry(const QRectF& geo)
|
|||||||
pos = d->layoutItem(margined, d->children[i], pos , sizes[i]);
|
pos = d->layoutItem(margined, d->children[i], pos , sizes[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
d->geometry = geo;
|
|
||||||
startAnimation();
|
startAnimation();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,14 +74,15 @@ class PLASMA_EXPORT BoxLayout : public Layout
|
|||||||
virtual LayoutItem *itemAt(int i) const;
|
virtual LayoutItem *itemAt(int i) const;
|
||||||
virtual LayoutItem *takeAt(int i);
|
virtual LayoutItem *takeAt(int i);
|
||||||
virtual Qt::Orientations expandingDirections() const;
|
virtual Qt::Orientations expandingDirections() const;
|
||||||
virtual QRectF geometry() const;
|
|
||||||
virtual void setGeometry(const QRectF& geometry);
|
|
||||||
virtual int count() const;
|
virtual int count() const;
|
||||||
|
|
||||||
virtual QSizeF minimumSize() const;
|
virtual QSizeF minimumSize() const;
|
||||||
virtual QSizeF maximumSize() const;
|
virtual QSizeF maximumSize() const;
|
||||||
virtual QSizeF sizeHint() const;
|
virtual QSizeF sizeHint() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void relayout();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class Private;
|
class Private;
|
||||||
Private *const d;
|
Private *const d;
|
||||||
|
@ -36,7 +36,6 @@ class FlowLayout::Private
|
|||||||
public:
|
public:
|
||||||
Private() : columnWidth( -1 ) {}
|
Private() : columnWidth( -1 ) {}
|
||||||
QList<LayoutItem*> items;
|
QList<LayoutItem*> items;
|
||||||
QRectF geometry;
|
|
||||||
qreal columnWidth;
|
qreal columnWidth;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -103,11 +102,6 @@ LayoutItem* FlowLayout::takeAt(int i)
|
|||||||
return d->items.takeAt(i);
|
return d->items.takeAt(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
QRectF FlowLayout::geometry() const
|
|
||||||
{
|
|
||||||
return d->geometry;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
T qSum(const QList<T>& container)
|
T qSum(const QList<T>& container)
|
||||||
{
|
{
|
||||||
@ -118,11 +112,11 @@ T qSum(const QList<T>& container)
|
|||||||
return total;
|
return total;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FlowLayout::setGeometry(const QRectF& geo)
|
void FlowLayout::relayout()
|
||||||
{
|
{
|
||||||
QRectF geometry = geo.adjusted(margin(LeftMargin), margin(TopMargin), -margin(RightMargin), -margin(BottomMargin));
|
QRectF rect = geometry().adjusted(margin(LeftMargin), margin(TopMargin), -margin(RightMargin), -margin(BottomMargin));
|
||||||
|
|
||||||
qDebug() << "Flow layout geometry set to " << geo;
|
qDebug() << "Flow layout geometry set to " << geometry();
|
||||||
|
|
||||||
// calculate average size of items
|
// calculate average size of items
|
||||||
qreal totalWidth = 0;
|
qreal totalWidth = 0;
|
||||||
@ -138,12 +132,13 @@ void FlowLayout::setGeometry(const QRectF& geo)
|
|||||||
// average width, this provides the spacing between the items and
|
// average width, this provides the spacing between the items and
|
||||||
// also allows some tolerance for small differences in item widths
|
// also allows some tolerance for small differences in item widths
|
||||||
qreal averageWidth;
|
qreal averageWidth;
|
||||||
if( d->columnWidth == -1 )
|
if (d->columnWidth == -1) {
|
||||||
averageWidth = totalWidth / d->items.count() + 2*spacing();
|
averageWidth = totalWidth / d->items.count() + 2*spacing();
|
||||||
else
|
} else {
|
||||||
averageWidth = d->columnWidth;
|
averageWidth = d->columnWidth;
|
||||||
|
}
|
||||||
|
|
||||||
const int columnCount = (int)(geometry.width() / averageWidth);
|
const int columnCount = (int)(rect.width() / averageWidth);
|
||||||
|
|
||||||
int insertColumn = 0;
|
int insertColumn = 0;
|
||||||
qreal rowPos = 0;
|
qreal rowPos = 0;
|
||||||
@ -183,17 +178,16 @@ void FlowLayout::setGeometry(const QRectF& geo)
|
|||||||
|
|
||||||
// try to restrict the item width to the available geometry's
|
// try to restrict the item width to the available geometry's
|
||||||
// width
|
// width
|
||||||
if ( itemWidth > geometry.width() ) {
|
if ( itemWidth > rect.width() ) {
|
||||||
itemWidth = qMax(geometry.width(),item->minimumSize().width());
|
itemWidth = qMax(rect.width(),item->minimumSize().width());
|
||||||
offset = 0;
|
offset = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// position the item
|
// position the item
|
||||||
const QRectF newGeometry( geometry.left() +
|
const QRectF newGeometry(rect.left() + insertColumn * averageWidth + offset,
|
||||||
insertColumn * averageWidth + offset,
|
rect.top() + rowPos,
|
||||||
geometry.top() + rowPos ,
|
itemWidth,
|
||||||
itemWidth ,
|
itemSize.height());
|
||||||
itemSize.height() );
|
|
||||||
|
|
||||||
rowHeight = qMax(rowHeight,itemSize.height());
|
rowHeight = qMax(rowHeight,itemSize.height());
|
||||||
insertColumn += columnSpan;
|
insertColumn += columnSpan;
|
||||||
@ -204,8 +198,6 @@ void FlowLayout::setGeometry(const QRectF& geo)
|
|||||||
item->setGeometry( newGeometry );
|
item->setGeometry( newGeometry );
|
||||||
}
|
}
|
||||||
|
|
||||||
d->geometry = geo;
|
|
||||||
|
|
||||||
startAnimation();
|
startAnimation();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,14 +20,11 @@
|
|||||||
#define __FLOWLAYOUT__
|
#define __FLOWLAYOUT__
|
||||||
|
|
||||||
#include <plasma/plasma_export.h>
|
#include <plasma/plasma_export.h>
|
||||||
|
#include <plasma/layouts/layout.h>
|
||||||
#include "layout.h"
|
|
||||||
|
|
||||||
namespace Plasma
|
namespace Plasma
|
||||||
{
|
{
|
||||||
|
|
||||||
class LayoutItem;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A layout which lays items out left-to-right , top-to-bottom.
|
* A layout which lays items out left-to-right , top-to-bottom.
|
||||||
*
|
*
|
||||||
@ -49,12 +46,13 @@ public:
|
|||||||
virtual LayoutItem* takeAt(int i);
|
virtual LayoutItem* takeAt(int i);
|
||||||
|
|
||||||
virtual QSizeF sizeHint() const;
|
virtual QSizeF sizeHint() const;
|
||||||
virtual QRectF geometry() const;
|
|
||||||
virtual void setGeometry(const QRectF& geometry);
|
|
||||||
virtual Qt::Orientations expandingDirections() const;
|
virtual Qt::Orientations expandingDirections() const;
|
||||||
virtual void setColumnWidth( const qreal width );
|
virtual void setColumnWidth( const qreal width );
|
||||||
virtual qreal columnWidth() const;
|
virtual qreal columnWidth() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void relayout();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class Private;
|
class Private;
|
||||||
Private *const d;
|
Private *const d;
|
||||||
|
@ -85,7 +85,7 @@ LayoutItem * FreeLayout::takeAt(int i)
|
|||||||
return d->children.takeAt(i);
|
return d->children.takeAt(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FreeLayout::setGeometry(const QRectF &)
|
void FreeLayout::relayout()
|
||||||
{
|
{
|
||||||
foreach (LayoutItem *child , d->children) {
|
foreach (LayoutItem *child , d->children) {
|
||||||
if (child->geometry().size() != child->sizeHint()) {
|
if (child->geometry().size() != child->sizeHint()) {
|
||||||
|
@ -54,11 +54,13 @@ class PLASMA_EXPORT FreeLayout : public Layout
|
|||||||
virtual LayoutItem *takeAt(int i);
|
virtual LayoutItem *takeAt(int i);
|
||||||
virtual Qt::Orientations expandingDirections() const;
|
virtual Qt::Orientations expandingDirections() const;
|
||||||
virtual QRectF geometry() const;
|
virtual QRectF geometry() const;
|
||||||
virtual void setGeometry(const QRectF& geometry);
|
|
||||||
virtual int count() const;
|
virtual int count() const;
|
||||||
|
|
||||||
virtual QSizeF sizeHint() const;
|
virtual QSizeF sizeHint() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void relayout();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class Private;
|
class Private;
|
||||||
Private *const d;
|
Private *const d;
|
||||||
|
@ -59,6 +59,7 @@ class Layout::Private
|
|||||||
LayoutAnimator *animator;
|
LayoutAnimator *animator;
|
||||||
|
|
||||||
bool relayouting;
|
bool relayouting;
|
||||||
|
QRectF geometry;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -88,9 +89,24 @@ bool Layout::isEmpty() const
|
|||||||
return count() == 0;
|
return count() == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Layout::update()
|
void Layout::updateGeometry()
|
||||||
{
|
{
|
||||||
setGeometry(geometry());
|
relayout();
|
||||||
|
}
|
||||||
|
|
||||||
|
QRectF Layout::geometry() const
|
||||||
|
{
|
||||||
|
return d->geometry;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Layout::setGeometry(const QRectF &geometry)
|
||||||
|
{
|
||||||
|
if (!geometry.isValid() || geometry == d->geometry) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
d->geometry = geometry;
|
||||||
|
invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Layout::invalidate()
|
void Layout::invalidate()
|
||||||
@ -111,7 +127,7 @@ void Layout::invalidate()
|
|||||||
}
|
}
|
||||||
} while (parentLayout);
|
} while (parentLayout);
|
||||||
|
|
||||||
layout->update();
|
layout->relayout();
|
||||||
d->relayouting = false;
|
d->relayouting = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -143,8 +143,18 @@ class PLASMA_EXPORT Layout : public LayoutItem
|
|||||||
*/
|
*/
|
||||||
virtual void setAnimator( LayoutAnimator* animator );
|
virtual void setAnimator( LayoutAnimator* animator );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current geometry for this layout
|
||||||
|
*/
|
||||||
|
virtual QRectF geometry() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Changes the geometry of this layout
|
||||||
|
*/
|
||||||
|
void setGeometry(const QRectF &geometry);
|
||||||
|
|
||||||
/** Triggers an update of the layout. */
|
/** Triggers an update of the layout. */
|
||||||
void update();
|
void updateGeometry();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the minimum size of this layout.
|
* Returns the minimum size of this layout.
|
||||||
@ -161,9 +171,14 @@ class PLASMA_EXPORT Layout : public LayoutItem
|
|||||||
void invalidate();
|
void invalidate();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
/**
|
||||||
|
* Triggers a layout, usually after a change in geometry
|
||||||
|
*/
|
||||||
|
virtual void relayout() = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Starts a layout animation. Subclasses may call this
|
* Starts a layout animation. Subclasses may call this
|
||||||
* at the end of their setGeometry() implementation to
|
* at the end of their relayout() implementation to
|
||||||
* start the timeline associated with the layout's animator()
|
* start the timeline associated with the layout's animator()
|
||||||
* if there is one. If an animation is already in progress then
|
* if there is one. If an animation is already in progress then
|
||||||
* the timeline is reset to 0ms and the animation continues.
|
* the timeline is reset to 0ms and the animation continues.
|
||||||
|
@ -104,6 +104,13 @@ class PLASMA_EXPORT LayoutItem
|
|||||||
*/
|
*/
|
||||||
virtual void setGeometry(const QRectF& geometry) = 0;
|
virtual void setGeometry(const QRectF& geometry) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the layouting of the item without first changing its geometry.
|
||||||
|
* Calling this may result in a geometry change, but may not, depending
|
||||||
|
* on the managing layout if any.
|
||||||
|
*/
|
||||||
|
virtual void updateGeometry() = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the most appropriate size of this Item to hold whatever contents it has.
|
* Returns the most appropriate size of this Item to hold whatever contents it has.
|
||||||
*/
|
*/
|
||||||
|
@ -114,15 +114,6 @@ public:
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void invalidate()
|
|
||||||
{
|
|
||||||
foreach (LayoutItem * item, items.keys()) {
|
|
||||||
if (item) {
|
|
||||||
item->setGeometry(calculateRectangle(item));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void calculateSizeHint(LayoutItem * item = NULL) {
|
void calculateSizeHint(LayoutItem * item = NULL) {
|
||||||
if (item == NULL) {
|
if (item == NULL) {
|
||||||
// Recalculate the sizeHint using all items
|
// Recalculate the sizeHint using all items
|
||||||
@ -167,19 +158,13 @@ Qt::Orientations NodeLayout::expandingDirections() const
|
|||||||
return Qt::Horizontal | Qt::Vertical;
|
return Qt::Horizontal | Qt::Vertical;
|
||||||
}
|
}
|
||||||
|
|
||||||
QRectF NodeLayout::geometry() const
|
void NodeLayout::relayout()
|
||||||
{
|
{
|
||||||
return d->geometry;
|
foreach (LayoutItem * item, d->items.keys()) {
|
||||||
}
|
if (item) {
|
||||||
|
item->setGeometry(d->calculateRectangle(item));
|
||||||
void NodeLayout::setGeometry(const QRectF& geometry)
|
}
|
||||||
{
|
|
||||||
if (!geometry.isValid() || geometry.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
d->geometry = geometry;
|
|
||||||
d->invalidate();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QSizeF NodeLayout::sizeHint() const
|
QSizeF NodeLayout::sizeHint() const
|
||||||
|
@ -76,9 +76,6 @@ public:
|
|||||||
explicit NodeLayout(LayoutItem * parent = 0);
|
explicit NodeLayout(LayoutItem * parent = 0);
|
||||||
virtual ~NodeLayout();
|
virtual ~NodeLayout();
|
||||||
|
|
||||||
virtual QRectF geometry() const;
|
|
||||||
void setGeometry(const QRectF& geometry);
|
|
||||||
|
|
||||||
QSizeF sizeHint() const;
|
QSizeF sizeHint() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -109,6 +106,9 @@ public:
|
|||||||
virtual LayoutItem * itemAt(int i) const;
|
virtual LayoutItem * itemAt(int i) const;
|
||||||
virtual LayoutItem * takeAt(int i);
|
virtual LayoutItem * takeAt(int i);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void relayout();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class Private;
|
class Private;
|
||||||
Private * const d;
|
Private * const d;
|
||||||
|
21
uiloader.cpp
21
uiloader.cpp
@ -21,18 +21,17 @@
|
|||||||
|
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
|
|
||||||
#include "widgets/checkbox.h"
|
#include "plasma/widgets/checkbox.h"
|
||||||
#include "widgets/flash.h"
|
#include "plasma/widgets/flash.h"
|
||||||
#include "widgets/icon.h"
|
#include "plasma/widgets/icon.h"
|
||||||
#include "widgets/label.h"
|
#include "plasma/widgets/label.h"
|
||||||
#include "widgets/pushbutton.h"
|
#include "plasma/widgets/pushbutton.h"
|
||||||
#include "widgets/radiobutton.h"
|
#include "plasma/widgets/radiobutton.h"
|
||||||
#include "widgets/meter.h"
|
#include "plasma/widgets/meter.h"
|
||||||
//#include "widgets/rectangle.h"
|
|
||||||
|
|
||||||
#include "layouts/hboxlayout.h"
|
#include "plasma/layouts/hboxlayout.h"
|
||||||
#include "layouts/vboxlayout.h"
|
#include "plasma/layouts/vboxlayout.h"
|
||||||
#include "layouts/flowlayout.h"
|
#include "plasma/layouts/flowlayout.h"
|
||||||
|
|
||||||
namespace Plasma
|
namespace Plasma
|
||||||
{
|
{
|
||||||
|
@ -27,6 +27,8 @@
|
|||||||
|
|
||||||
#include <KDebug>
|
#include <KDebug>
|
||||||
|
|
||||||
|
#include "plasma/layouts/layout.h"
|
||||||
|
|
||||||
namespace Plasma
|
namespace Plasma
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -184,6 +186,15 @@ void LineEdit::setGeometry(const QRectF& geometry)
|
|||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LineEdit::updateGeometry()
|
||||||
|
{
|
||||||
|
if (managingLayout()) {
|
||||||
|
managingLayout()->invalidate();
|
||||||
|
} else {
|
||||||
|
setGeometry(QRectF(pos(), sizeHint()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QSizeF LineEdit::sizeHint() const
|
QSizeF LineEdit::sizeHint() const
|
||||||
{
|
{
|
||||||
return document()->size();
|
return document()->size();
|
||||||
|
@ -71,6 +71,7 @@ class PLASMA_EXPORT LineEdit : public QGraphicsTextItem, public LayoutItem
|
|||||||
|
|
||||||
QRectF geometry() const;
|
QRectF geometry() const;
|
||||||
void setGeometry(const QRectF& geometry);
|
void setGeometry(const QRectF& geometry);
|
||||||
|
void updateGeometry();
|
||||||
QSizeF sizeHint() const;
|
QSizeF sizeHint() const;
|
||||||
|
|
||||||
void setDefaultText(const QString &text);
|
void setDefaultText(const QString &text);
|
||||||
|
@ -8,11 +8,11 @@
|
|||||||
#include <KAboutData>
|
#include <KAboutData>
|
||||||
#include <KIcon>
|
#include <KIcon>
|
||||||
|
|
||||||
#include "../pushbutton.h"
|
#include "plasma/layouts/boxlayout.h"
|
||||||
#include "../lineedit.h"
|
#include "plasma/widgets/pushbutton.h"
|
||||||
#include "../../layouts/boxlayout.h"
|
#include "plasma/widgets/lineedit.h"
|
||||||
#include "../widget.h"
|
#include "plasma/widgets/widget.h"
|
||||||
#include "../label.h"
|
#include "plasma/widgets/label.h"
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -62,7 +62,7 @@ int main(int argc, char **argv)
|
|||||||
h2->addItem(labelTwo);
|
h2->addItem(labelTwo);
|
||||||
scene.addItem(labelTwo);
|
scene.addItem(labelTwo);
|
||||||
|
|
||||||
widgetLayout->update();
|
widgetLayout->updateGeometry();
|
||||||
|
|
||||||
view.show();
|
view.show();
|
||||||
return app.exec();
|
return app.exec();
|
||||||
|
@ -10,9 +10,8 @@
|
|||||||
#include <KIcon>
|
#include <KIcon>
|
||||||
|
|
||||||
|
|
||||||
#include "../../layouts/boxlayout.h"
|
#include "plasma/layouts/boxlayout.h"
|
||||||
#include "../widget.h"
|
#include "plasma/widgets/progressbar.h"
|
||||||
#include "../progressbar.h"
|
|
||||||
|
|
||||||
class Counter : QObject
|
class Counter : QObject
|
||||||
{
|
{
|
||||||
@ -89,7 +88,7 @@ int main(int argc, char **argv)
|
|||||||
h1->addItem(progressBar);
|
h1->addItem(progressBar);
|
||||||
scene.addItem(progressBar);
|
scene.addItem(progressBar);
|
||||||
|
|
||||||
widgetLayout->update();
|
widgetLayout->updateGeometry();
|
||||||
|
|
||||||
view.show();
|
view.show();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user