25 for (
const auto &dirty : std::as_const(m_repaints)) {
26 if (!dirty.isEmpty()) {
62 m_parentItem->markSortedChildItemsDirty();
74 if (m_parentItem == item) {
78 m_parentItem->removeChild(
this);
82 Q_ASSERT(m_parentItem->m_scene == m_scene);
83 m_parentItem->addChild(
this);
85 updateEffectiveVisibility();
88void Item::addChild(
Item *item)
90 Q_ASSERT(!m_childItems.contains(item));
92 m_childItems.append(item);
93 markSortedChildItemsDirty();
101void Item::removeChild(Item *item)
103 Q_ASSERT(m_childItems.contains(item));
106 m_childItems.removeOne(item);
107 markSortedChildItemsDirty();
109 updateBoundingRect();
124 if (m_position != point) {
128 m_parentItem->updateBoundingRect();
142 if (m_size !=
size) {
145 updateBoundingRect();
154 return QRectF(QPoint(0, 0),
size());
159 return m_boundingRect;
162void Item::updateBoundingRect()
165 for (
Item *item : std::as_const(m_childItems)) {
166 boundingRect |= item->boundingRect().translated(item->position());
172 m_parentItem->updateBoundingRect();
179 return QList<QRectF>();
212 if (region.isEmpty()) {
220 if (
rect.isEmpty()) {
228 if (
rect.isEmpty()) {
236 if (Q_UNLIKELY(!sibling)) {
237 qCDebug(KWIN_CORE) << Q_FUNC_INFO <<
"requires a valid sibling";
241 qCDebug(KWIN_CORE) << Q_FUNC_INFO <<
"requires items to be siblings";
244 if (Q_UNLIKELY(sibling ==
this)) {
248 const int selfIndex = m_parentItem->m_childItems.indexOf(
this);
249 const int siblingIndex = m_parentItem->m_childItems.indexOf(sibling);
251 if (selfIndex == siblingIndex - 1) {
255 m_parentItem->m_childItems.move(selfIndex, selfIndex > siblingIndex ? siblingIndex : siblingIndex - 1);
256 markSortedChildItemsDirty();
264 if (Q_UNLIKELY(!sibling)) {
265 qCDebug(KWIN_CORE) << Q_FUNC_INFO <<
"requires a valid sibling";
269 qCDebug(KWIN_CORE) << Q_FUNC_INFO <<
"requires items to be siblings";
272 if (Q_UNLIKELY(sibling ==
this)) {
276 const int selfIndex = m_parentItem->m_childItems.indexOf(
this);
277 const int siblingIndex = m_parentItem->m_childItems.indexOf(sibling);
279 if (selfIndex == siblingIndex + 1) {
283 m_parentItem->m_childItems.move(selfIndex, selfIndex > siblingIndex ? siblingIndex + 1 : siblingIndex);
284 markSortedChildItemsDirty();
293 scheduleRepaintInternal(region);
300 scheduleRepaintInternal(delegate, region);
304void Item::scheduleRepaintInternal(
const QRegion ®ion)
307 const QList<SceneDelegate *> delegates = m_scene->
delegates();
309 const QRegion dirtyRegion = globalRegion & delegate->viewport();
310 if (!dirtyRegion.isEmpty()) {
311 m_repaints[delegate] += dirtyRegion;
312 delegate->layer()->scheduleRepaint(
this);
317void Item::scheduleRepaintInternal(SceneDelegate *delegate,
const QRegion ®ion)
320 const QRegion dirtyRegion = globalRegion & delegate->viewport();
321 if (!dirtyRegion.isEmpty()) {
322 m_repaints[delegate] += dirtyRegion;
323 delegate->layer()->scheduleRepaint(
this);
333 const QList<SceneDelegate *> delegates = m_scene->
delegates();
335 if (delegate->viewport().intersects(geometry)) {
336 delegate->layer()->scheduleRepaint(
this);
357 if (!m_quads.has_value()) {
360 return m_quads.value();
365 return m_repaints.value(delegate);
370 m_repaints.insert(delegate, QRegion());
375 m_repaints.remove(delegate);
380 return m_explicitVisible;
385 return m_effectiveVisible;
390 if (m_explicitVisible != visible) {
391 m_explicitVisible = visible;
392 updateEffectiveVisibility();
401bool Item::computeEffectiveVisibility()
const
403 return m_explicitVisible && (!m_parentItem || m_parentItem->isVisible());
406void Item::updateEffectiveVisibility()
408 const bool effectiveVisible = computeEffectiveVisibility();
409 if (m_effectiveVisible == effectiveVisible) {
413 m_effectiveVisible = effectiveVisible;
414 if (!m_effectiveVisible) {
417 scheduleRepaintInternal(
boundingRect().toAlignedRect());
420 for (
Item *childItem : std::as_const(m_childItems)) {
421 childItem->updateEffectiveVisibility();
425static bool compareZ(
const Item *a,
const Item *b)
427 return a->z() < b->z();
432 if (!m_sortedChildItems.has_value()) {
433 QList<Item *> items = m_childItems;
434 std::stable_sort(items.begin(), items.end(), compareZ);
435 m_sortedChildItems = items;
437 return m_sortedChildItems.value();
440void Item::markSortedChildItemsDirty()
442 m_sortedChildItems.reset();
447 return m_colorDescription;
452 m_colorDescription = description;
457 return m_presentationHint;
462 m_presentationHint = hint;
467#include "moc_item.cpp"
void setColorDescription(const ColorDescription &description)
virtual void preprocess()
QList< Item * > sortedChildItems() const
void childAdded(Item *item)
virtual QRegion opaque() const
void setParentItem(Item *parent)
PresentationModeHint presentationHint() const
QRectF boundingRect() const
void setVisible(bool visible)
bool explicitVisible() const
QRegion mapToGlobal(const QRegion ®ion) const
Item(Scene *scene, Item *parent=nullptr)
QRectF mapFromGlobal(const QRectF &rect) const
WindowQuadList quads() const
virtual WindowQuadList buildQuads() const
Item * parentItem() const
void stackAfter(Item *sibling)
void setPresentationHint(PresentationModeHint hint)
void resetRepaints(SceneDelegate *delegate)
QRegion repaints(SceneDelegate *delegate) const
QPointF rootPosition() const
void setSize(const QSizeF &size)
const ColorDescription & colorDescription() const
QList< Item * > childItems() const
void setOpacity(qreal opacity)
void scheduleRepaint(const QRectF ®ion)
void stackBefore(Item *sibling)
void setPosition(const QPointF &point)
void setTransform(const QMatrix4x4 &transform)
virtual QList< QRectF > shape() const
QMatrix4x4 transform() const
void boundingRectChanged()
QList< SceneDelegate * > delegates() const
void addRepaint(const QRegion ®ion)
void delegateRemoved(SceneDelegate *delegate)