void WWidget::scheduleRerender(bool laterOnly, WFlags<RepaintFlag> flags) { if (!flags_.test(BIT_NEED_RERENDER)) { flags_.set(BIT_NEED_RERENDER); WApplication::instance()->session()->renderer().needUpdate(this, laterOnly); } if ((flags & RepaintSizeAffected) && !flags_.test(BIT_NEED_RERENDER_SIZE_CHANGE)) { flags_.set(BIT_NEED_RERENDER_SIZE_CHANGE); webWidget()->parentResized(this, Vertical); /* * A size change to an absolutely positioned widget will not affect * a layout computation, except if it's itself in a layout! */ if (positionScheme() == Absolute && !isInLayout()) return; /* * Propagate event up, this will be caught by a container widget * with a layout manager. */ WWidget *p = parent(); if (p) p->childResized(this, Vertical); } }
void Spacer::setSizeHintProperty(const QSize &s) { m_sizeHint = s; if (!isInLayout()) // Visible resize only if not in layout resize(s + m_SizeOffset); updateGeometry(); }
void WWidget::childResized(WWidget *child, WFlags<Orientation> directions) { /* * Stop propagation at an absolutely positioned widget */ if (positionScheme() == Absolute && !isInLayout()) return; WWidget *p = parent(); if (p) p->childResized(this, directions); }
void Spacer::setOrientation(Qt::Orientation o) { if (m_orientation == o) return; const QSizePolicy::Policy st = sizeType(); // flip size type m_orientation = o; setSizeType(st); if (m_interactive) { m_sizeHint = QSize(m_sizeHint.height(), m_sizeHint.width()); if (!isInLayout()) resize(m_sizeHint + m_SizeOffset); } updateMask(); update(); updateGeometry(); }
void Spacer::resizeEvent(QResizeEvent* e) { QWidget::resizeEvent(e); // When resized by widget handle dragging after a reset (QSize(0, 0)): // Mark the property as changed (geometry and sizeHint are in sync except for 'changed'). if (m_formWindow) { const QSize oldSize = e->oldSize(); if (oldSize.isNull() || oldSize.width() <= m_SizeOffset.width() || oldSize.height() <= m_SizeOffset.height()) if (QDesignerPropertySheetExtension *sheet = qt_extension<QDesignerPropertySheetExtension*>(m_formWindow->core()->extensionManager(), this)) sheet->setChanged(sheet->indexOf(QLatin1String("sizeHint")), true); } updateMask(); if (!m_interactive) return; if (!isInLayout()) { // Allow size-handle resize only if not in layout const QSize currentSize = size(); if (currentSize.width() >= m_SizeOffset.width() && currentSize.height() >= m_SizeOffset.height()) m_sizeHint = currentSize - m_SizeOffset; } }
QSize Spacer::sizeHint() const { return isInLayout() ? m_sizeHint : m_sizeHint + m_SizeOffset; }
DomElement *WPaintedWidget::createDomElement(WApplication *app) { if (isInLayout()) { setLayoutSizeAware(true); setJavaScriptMember(WT_RESIZE_JS, "function(self, w, h) {" """var u = $(self).find('canvas, img');" """if (w >= 0) " "" "u.width(w);" """if (h >= 0) " "" "u.height(h);" "}"); } createPainter(); DomElement *result = DomElement::createNew(domElementType()); setId(result, app); DomElement *wrap = result; if (width().isAuto() && height().isAuto()) { result->setProperty(PropertyStylePosition, "relative"); wrap = DomElement::createNew(DomElement_DIV); wrap->setProperty(PropertyStylePosition, "absolute"); wrap->setProperty(PropertyStyleLeft, "0"); wrap->setProperty(PropertyStyleRight, "0"); } DomElement *canvas = DomElement::createNew(DomElement_DIV); if (!app->environment().agentIsSpiderBot()) canvas->setId('p' + id()); WPaintDevice *device = painter_->getPaintDevice(false); //handle the widget correctly when inline and using VML if (painter_->renderType() == WWidgetPainter::InlineVml && isInline()) { result->setProperty(PropertyStyle, "zoom: 1;"); canvas->setProperty(PropertyStyleDisplay, "inline"); canvas->setProperty(PropertyStyle, "zoom: 1;"); } if (renderWidth_ != 0 && renderHeight_ != 0) { paintEvent(device); #ifdef WT_TARGET_JAVA if (device->painter()) device->painter()->end(); #endif // WT_TARGET_JAVA } painter_->createContents(canvas, device); needRepaint_ = false; wrap->addChild(canvas); if (wrap != result) result->addChild(wrap); updateDom(*result, true); return result; }
void WScrollArea::updateDom(DomElement& element, bool all) { if (all) if (isInLayout() && WApplication::instance()->environment().ajax()) { setJavaScriptMember("wtResize", "function(s, w, h) {" "s.style.width=w+'px';" "s.style.height=h+'px';" "}"); } if (widgetChanged_ || all) { if (widget_) element.addChild(widget_->createSDomElement(WApplication::instance())); widgetChanged_ = false; } if (scrollBarChanged_ || all) { if ((horizontalScrollBar_->tiesChanged_) || (verticalScrollBar_->tiesChanged_)) { horizontalScrollBar_->tiesChanged_ = true; verticalScrollBar_->tiesChanged_ = true; } horizontalScrollBar_->updateDom(element, all); verticalScrollBar_->updateDom(element, all); scrollBarChanged_ = false; } if (scrollBarPolicyChanged_ || all) { switch (horizontalScrollBarPolicy_) { case ScrollBarAsNeeded: element.setProperty(Wt::PropertyStyleOverflowX, "auto"); break; case ScrollBarAlwaysOff: element.setProperty(Wt::PropertyStyleOverflowX, "hidden"); break; case ScrollBarAlwaysOn: element.setProperty(Wt::PropertyStyleOverflowX, "scroll"); break; } switch (verticalScrollBarPolicy_) { case ScrollBarAsNeeded: element.setProperty(Wt::PropertyStyleOverflowY, "auto"); break; case ScrollBarAlwaysOff: element.setProperty(Wt::PropertyStyleOverflowY, "hidden"); break; case ScrollBarAlwaysOn: element.setProperty(Wt::PropertyStyleOverflowY, "scroll"); break; } scrollBarPolicyChanged_ = false; } WWebWidget::updateDom(element, all); }