Update the size in two ways

A dialog can be resized for two reasons: the mainItem size changes, or the dialog size changes.

the first can happen programmatically, caused by the Layout, or just by assigning the width.

the second can be caused either programmatically, assigning the size of the dialog or externally by the windowmanager, that is the only one theat in the end has the only final control of the window size

Change-Id: Ifc5c7f683039f83d13a5046c10d6dd0227169542
REVIEW:120235
This commit is contained in:
Marco Martin 2014-09-18 17:25:48 +02:00
parent a393284338
commit dff792a86b
2 changed files with 48 additions and 6 deletions

View File

@ -114,7 +114,6 @@ public:
void syncToMainItemSize(); void syncToMainItemSize();
Dialog *q; Dialog *q;
QTimer *syncTimer;
Plasma::Types::Location location; Plasma::Types::Location location;
Plasma::FrameSvgItem *frameSvgItem; Plasma::FrameSvgItem *frameSvgItem;
QPointer<QQuickItem> mainItem; QPointer<QQuickItem> mainItem;
@ -238,7 +237,9 @@ void DialogPrivate::updateVisibility(bool visible)
} }
cachedGeometry = QRect(); cachedGeometry = QRect();
} }
syncToMainItemSize(); if (mainItem) {
syncToMainItemSize();
}
if (mainItemLayout) { if (mainItemLayout) {
updateLayoutParameters(); updateLayoutParameters();
} }
@ -540,7 +541,9 @@ void DialogPrivate::updateInputShape()
void DialogPrivate::syncToMainItemSize() void DialogPrivate::syncToMainItemSize()
{ {
if (!componentComplete || !mainItem || !q->isVisible()) { Q_ASSERT(mainItem);
if (!componentComplete || !q->isVisible()) {
return; return;
} }
@ -733,7 +736,9 @@ void Dialog::setVisualParent(QQuickItem *visualParent)
if (visualParent->window()) { if (visualParent->window()) {
setTransientParent(visualParent->window()); setTransientParent(visualParent->window());
} }
d->syncToMainItemSize(); if (d->mainItem) {
d->syncToMainItemSize();
}
} }
} }
@ -881,7 +886,9 @@ void Dialog::setLocation(Plasma::Types::Location location)
d->location = location; d->location = location;
emit locationChanged(); emit locationChanged();
d->syncToMainItemSize(); if (d->mainItem) {
d->syncToMainItemSize();
}
} }
QObject *Dialog::margins() const QObject *Dialog::margins() const
@ -903,6 +910,19 @@ void Dialog::adjustGeometry(const QRect &geom)
void Dialog::resizeEvent(QResizeEvent* re) void Dialog::resizeEvent(QResizeEvent* re)
{ {
QQuickWindow::resizeEvent(re); QQuickWindow::resizeEvent(re);
d->mainItem->disconnect(this);
d->frameSvgItem->setWidth(re->size().width());
d->frameSvgItem->setHeight(re->size().height());
auto margin = d->frameSvgItem->margins();
d->mainItem->setX(margin->left());
d->mainItem->setY(margin->top());
d->mainItem->setWidth(re->size().width() - margin->left() - margin->right());
d->mainItem->setHeight(re->size().height() - margin->top() - margin->bottom());
QObject::connect(d->mainItem, SIGNAL(widthChanged()), this, SLOT(slotMainItemSizeChanged()));
QObject::connect(d->mainItem, SIGNAL(heightChanged()), this, SLOT(slotMainItemSizeChanged()));
} }
void Dialog::setType(WindowType type) void Dialog::setType(WindowType type)
@ -1013,7 +1033,12 @@ void Dialog::classBegin()
void Dialog::componentComplete() void Dialog::componentComplete()
{ {
d->componentComplete = true; d->componentComplete = true;
d->syncToMainItemSize();
d->updateTheme();
if (d->mainItem) {
d->syncToMainItemSize();
}
if (d->mainItemLayout) { if (d->mainItemLayout) {
d->updateLayoutParameters(); d->updateLayoutParameters();

View File

@ -25,6 +25,7 @@ import QtQuick.Layouts 1.1
import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.plasma.core 2.0 as PlasmaCore
PlasmaCore.Dialog { PlasmaCore.Dialog {
id: root
location: PlasmaCore.Types.Floating location: PlasmaCore.Types.Floating
Rectangle { Rectangle {
@ -34,6 +35,10 @@ PlasmaCore.Dialog {
color: "red" color: "red"
Rectangle {
width: rect.Layout.minimumWidth
height: rect.Layout.minimumHeight
}
ColumnLayout { ColumnLayout {
anchors.top: parent.top anchors.top: parent.top
Controls.Label { Controls.Label {
@ -53,6 +58,18 @@ PlasmaCore.Dialog {
rect.Layout.minimumHeight = rect.Layout.minimumHeight + 10 rect.Layout.minimumHeight = rect.Layout.minimumHeight + 10
} }
} }
Controls.Button {
text: "Increase dialog width"
onClicked: {
root.width = root.width + 10
}
}
Controls.Button {
text: "Increase dialog height"
onClicked: {
root.height = root.height + 10
}
}
} }
} }
} }