From 3185a70b9afbdc5d9cd9fbbde3d9bc159b646bfe Mon Sep 17 00:00:00 2001 From: Michail Vourlakos Date: Sat, 6 Mar 2021 13:20:32 +0200 Subject: [PATCH] more functionality for FastLayoutManager --provide addAppletItem function --provide reorderSplitters in Start and End layouts when an applet is added in them and the splitters are moving in faulty position --- containment/package/contents/ui/main.qml | 30 +------ containment/plugin/layoutmanager.cpp | 107 +++++++++++++++++++++-- containment/plugin/layoutmanager.h | 5 +- 3 files changed, 107 insertions(+), 35 deletions(-) diff --git a/containment/package/contents/ui/main.qml b/containment/package/contents/ui/main.qml index 0b444c5f4..fdb941c2c 100644 --- a/containment/package/contents/ui/main.qml +++ b/containment/package/contents/ui/main.qml @@ -571,17 +571,8 @@ Item { } } - Containment.onAppletAdded: { - var appletItem = createAppletItem(applet); - addAppletItemInLayout(appletItem, x, y); - console.log(applet.pluginName); - fastLayoutManager.save(); - } - - Containment.onAppletRemoved: { - fastLayoutManager.removeAppletItem(applet); - fastLayoutManager.save(); - } + Containment.onAppletAdded: fastLayoutManager.addAppletItem(applet, x, y); + Containment.onAppletRemoved: fastLayoutManager.removeAppletItem(applet); Plasmoid.onUserConfiguringChanged: { if (plasmoid.userConfiguring) { @@ -620,23 +611,6 @@ Item { return splitter; } - function addAppletItemInLayout(appletItem, x, y){ - if ( (dndSpacer.parent === layoutsContainer.mainLayout) - || (dndSpacer.parent === layoutsContainer.startLayout) - || (dndSpacer.parent===layoutsContainer.endLayout)) { - // Is there a DND placeholder? Replace it! - fastLayoutManager.insertBefore(dndSpacer, appletItem); - dndSpacer.parent = root; - return; - } else if (x >= 0 && y >= 0) { - // If the provided position is valid, use it. - fastLayoutManager.insertAtCoordinates(appletItem, x , y); - } else { - // Fall through to adding at the end of main layout. - appletItem.parent = layoutsContainer.mainLayout; - } - } - //! it is used in order to check the right click position //! the only way to take into account the visual appearance //! of the applet (including its spacers) diff --git a/containment/plugin/layoutmanager.cpp b/containment/plugin/layoutmanager.cpp index cd0daa1b1..d0d3ca949 100644 --- a/containment/plugin/layoutmanager.cpp +++ b/containment/plugin/layoutmanager.cpp @@ -272,8 +272,8 @@ void LayoutManager::restore() QList applets = m_plasmoid->property("applets").value>(); Latte::Types::Alignment alignment = static_cast((*m_configuration)["alignment"].toInt()); - int splitterPosition = static_cast((*m_configuration)["splitterPosition"].toInt()); - int splitterPosition2 = static_cast((*m_configuration)["splitterPosition2"].toInt()); + int splitterPosition = (*m_configuration)["splitterPosition"].toInt(); + int splitterPosition2 = (*m_configuration)["splitterPosition2"].toInt(); QList appletIdsOrder; for (int i=0; i((*m_configuration)["splitterPosition"].toInt()); - int splitterPosition2 = static_cast((*m_configuration)["splitterPosition2"].toInt()); + int splitterPosition = (*m_configuration)["splitterPosition"].toInt(); + int splitterPosition2 = (*m_configuration)["splitterPosition2"].toInt(); setSplitterPosition(splitterPosition); setSplitterPosition2(splitterPosition2); @@ -699,6 +699,41 @@ void LayoutManager::insertAtCoordinates(QQuickItem *item, const int &x, const in } } +void LayoutManager::addAppletItem(QObject *applet, int x, int y) +{ + if (!m_startLayout || !m_mainLayout || !m_endLayout) { + return; + } + + QVariant appletItemVariant; + QVariant appletVariant; appletVariant.setValue(applet); + m_createAppletItemMethod.invoke(m_rootItem, Q_RETURN_ARG(QVariant, appletItemVariant), Q_ARG(QVariant, appletVariant)); + QQuickItem *appletItem = appletItemVariant.value(); + + if (m_dndSpacer->parentItem() == m_mainLayout + || m_dndSpacer->parentItem() == m_startLayout + || m_dndSpacer->parentItem() == m_endLayout) { + insertBefore(m_dndSpacer, appletItem); + + QQuickItem *currentlayout = m_dndSpacer->parentItem(); + m_dndSpacer->setParentItem(m_rootItem); + + if (currentlayout == m_startLayout) { + reorderSplitterInStartLayout(); + } else if (currentlayout ==m_endLayout) { + reorderSplitterInEndLayout(); + } + } else if (x >= 0 && y >= 0) { + // If the provided position is valid, use it. + insertAtCoordinates(appletItem, x , y); + } else { + // Fall through to adding at the end of main layout. + appletItem->setParentItem(m_mainLayout); + } + + save(); +} + void LayoutManager::removeAppletItem(QObject *applet) { if (!m_startLayout || !m_mainLayout || !m_endLayout) { @@ -728,6 +763,66 @@ void LayoutManager::removeAppletItem(QObject *applet) } } } + + save(); +} + +void LayoutManager::reorderSplitterInStartLayout() +{ + Latte::Types::Alignment alignment = static_cast((*m_configuration)["alignment"].toInt()); + + if (alignment != Latte::Types::Justify) { + return; + } + + int size = m_startLayout->childItems().count(); + + if (size > 0) { + QQuickItem *splitter{nullptr}; + + for (int i=0; ichildItems()[i]; + bool issplitter = item->property("isInternalViewSplitter").toBool(); + + if (issplitter && ichildItems()[size-1],splitter); + } + } +} + +void LayoutManager::reorderSplitterInEndLayout() +{ + Latte::Types::Alignment alignment = static_cast((*m_configuration)["alignment"].toInt()); + + if (alignment != Latte::Types::Justify) { + return; + } + + int size = m_endLayout->childItems().count(); + + if (size > 0) { + QQuickItem *splitter{nullptr}; + + for (int i=0; ichildItems()[i]; + bool issplitter = item->property("isInternalViewSplitter").toBool(); + + if (issplitter && i!=0) { + splitter = item; + break; + } + } + + if (splitter) { + insertBefore(m_endLayout->childItems()[0],splitter); + } + } } void LayoutManager::addJustifySplittersInMainLayout() @@ -738,8 +833,8 @@ void LayoutManager::addJustifySplittersInMainLayout() destroyJustifySplitters(); - int splitterPosition = static_cast((*m_configuration)["splitterPosition"].toInt()); - int splitterPosition2 = static_cast((*m_configuration)["splitterPosition2"].toInt()); + int splitterPosition = (*m_configuration)["splitterPosition"].toInt(); + int splitterPosition2 = (*m_configuration)["splitterPosition2"].toInt(); int splitterIndex = (splitterPosition >= 1 ? splitterPosition - 1 : -1); int splitterIndex2 = (splitterPosition2 >= 1 ? splitterPosition2 - 1 : -1); diff --git a/containment/plugin/layoutmanager.h b/containment/plugin/layoutmanager.h index cc88a41ed..eab33acaf 100644 --- a/containment/plugin/layoutmanager.h +++ b/containment/plugin/layoutmanager.h @@ -92,6 +92,7 @@ public slots: Q_INVOKABLE void save(); Q_INVOKABLE void saveOptions(); + Q_INVOKABLE void addAppletItem(QObject *applet, int x, int y); Q_INVOKABLE void removeAppletItem(QObject *applet); Q_INVOKABLE void addJustifySplittersInMainLayout(); @@ -118,7 +119,6 @@ signals: private slots: void onRootItemChanged(); - void destroyJustifySplitters(); private: @@ -133,6 +133,9 @@ private: void setLockedZoomApplets(const QString &applets); void setUserBlocksColorizingApplets(const QString &applets); + void reorderSplitterInStartLayout(); + void reorderSplitterInEndLayout(); + bool isValidApplet(const int &id); bool insertAtLayoutCoordinates(QQuickItem *layout, QQuickItem *item, int x, int y);