diff --git a/frame/drag/quickdragcore.h b/frame/drag/quickdragcore.h index 0eee58dc2..4156a65cf 100644 --- a/frame/drag/quickdragcore.h +++ b/frame/drag/quickdragcore.h @@ -50,4 +50,6 @@ private: bool m_useSourcePixmap; }; +Q_DECLARE_INTERFACE(QuickIconDrag, "QuickIconDrag") + #endif // QUICKDRAGCORE_H diff --git a/frame/window/quickpluginmodel.cpp b/frame/window/quickpluginmodel.cpp index 822ceb67a..6d645e4c9 100644 --- a/frame/window/quickpluginmodel.cpp +++ b/frame/window/quickpluginmodel.cpp @@ -121,39 +121,6 @@ void QuickPluginModel::onPluginRemoved(PluginsItemInterface *itemInter) Q_EMIT requestUpdate(); } -void QuickPluginModel::onSettingChanged(const QString &key, const QVariant &value) -{ - if (key != PLUGINNAMEKEY) - return; - QStringList localOrder = m_dockedPluginIndex.keys(); - std::sort(localOrder.begin(), localOrder.end(), [ = ](const QString &key1, const QString &key2) { - return m_dockedPluginIndex.value(key1) < m_dockedPluginIndex.value(key2); - }); - if (localOrder == value.toStringList()) - return; - - // 当配置发生变化的时候,更新任务栏的插件显示 - // 1、将当前现有的插件列表中不在配置中的插件移除 - localOrder = value.toStringList(); - for (PluginsItemInterface *itemInter : m_dockedPluginsItems) { - if (localOrder.contains(itemInter->pluginName())) - continue; - - m_dockedPluginsItems.removeOne(itemInter); - m_dockedPluginIndex.remove(itemInter->pluginName()); - } - // 2、将配置中已有的但是插件列表中没有的插件移动到任务栏上 - QList plugins = QuickSettingController::instance()->pluginItems(QuickSettingController::PluginAttribute::Quick); - for (PluginsItemInterface *plugin : plugins) - m_dockedPluginsItems << plugin; - - m_dockedPluginIndex.clear(); - for (int i = 0; i < localOrder.size(); i++) - m_dockedPluginIndex[localOrder[i]] = i; - - Q_EMIT requestUpdate(); -} - void QuickPluginModel::initConnection() { QuickSettingController *quickController = QuickSettingController::instance(); @@ -179,7 +146,6 @@ void QuickPluginModel::initConnection() connect(quickController, &QuickSettingController::pluginRemoved, this, &QuickPluginModel::onPluginRemoved); connect(quickController, &QuickSettingController::pluginUpdated, this, &QuickPluginModel::requestUpdatePlugin); - connect(SETTINGCONFIG, &SettingConfig::valueChanged, this, &QuickPluginModel::onSettingChanged); } void QuickPluginModel::initConfig() diff --git a/frame/window/quickpluginmodel.h b/frame/window/quickpluginmodel.h index a9a06f886..c1f5e9bdf 100644 --- a/frame/window/quickpluginmodel.h +++ b/frame/window/quickpluginmodel.h @@ -54,7 +54,6 @@ protected: private Q_SLOTS: void onPluginRemoved(PluginsItemInterface *itemInter); - void onSettingChanged(const QString &key, const QVariant &value); private: void initConnection(); diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 0d201dbee..2b2a82e62 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -306,7 +306,7 @@ bool QuickPluginWindow::eventFilter(QObject *watched, QEvent *event) m_dragEnterMimeData = nullptr; QDropEvent *dropEvent = static_cast(event); if (isQuickWindow(dropEvent->source())) { - const QuickPluginMimeData *mimeData = qobject_cast(dropEvent->mimeData()); + QuickPluginMimeData *mimeData = static_cast(const_cast(dropEvent->mimeData())); if (mimeData) dragPlugin(mimeData->pluginItemInterface()); } @@ -320,7 +320,7 @@ bool QuickPluginWindow::eventFilter(QObject *watched, QEvent *event) void QuickPluginWindow::dragEnterEvent(QDragEnterEvent *event) { - m_dragEnterMimeData = const_cast(qobject_cast(event->mimeData())); + m_dragEnterMimeData = static_cast(const_cast(event->mimeData())); if (m_dragEnterMimeData) { PluginsItemInterface *plugin = m_dragEnterMimeData->pluginItemInterface(); QIcon icon = plugin->icon(DockPart::QuickShow); diff --git a/plugins/pluginmanager/dockplugincontroller.cpp b/plugins/pluginmanager/dockplugincontroller.cpp index d3e6f2396..e310bc477 100644 --- a/plugins/pluginmanager/dockplugincontroller.cpp +++ b/plugins/pluginmanager/dockplugincontroller.cpp @@ -673,7 +673,21 @@ bool DockPluginController::pluginCanDock(const QStringList &config, PluginsItemI || (plugin->flags() & PluginFlag::Type_Tray)) return true; - // 3、插件已经驻留在任务栏,则始终显示 + // 3、如果该插件并未加载(未调用itemAdde或已经调用itemRemoved),则该插件不显示 + if (!m_pluginsMap.contains(plugin)) + return false; + + const QMap &pluginMap = m_pluginsMap[plugin]; + // 如果不包含PLUGININFO,说明该插件从未调用itemAdded方法,无需加载 + if (!pluginMap.contains(PLUGININFO)) + return false; + + // 如果该插件信息的m_loaded为true,说明已经调用过itemAdded方法,并且之后又调用了itemRemoved方法,则插件也无需加载 + PluginInfo *pluginInfo = static_cast(pluginMap[PLUGININFO]); + if (!pluginInfo->m_loaded) + return false; + + // 4、插件已经驻留在任务栏,则始终显示 return config.contains(plugin->pluginName()); } diff --git a/plugins/pluginmanager/quicksettingitem.cpp b/plugins/pluginmanager/quicksettingitem.cpp index 2f672f2ee..f9f6d3266 100644 --- a/plugins/pluginmanager/quicksettingitem.cpp +++ b/plugins/pluginmanager/quicksettingitem.cpp @@ -69,27 +69,7 @@ PluginsItemInterface *QuickSettingItem::pluginItem() const const QPixmap QuickSettingItem::dragPixmap() { - QPixmap pluginPixmap = m_pluginInter->icon(DockPart::QuickPanel, DGuiApplicationHelper::instance()->themeType()).pixmap(ICONWIDTH, ICONHEIGHT); - - QPainter foregroundPainter(&pluginPixmap); - foregroundPainter.setPen(foregroundColor()); - foregroundPainter.setCompositionMode(QPainter::CompositionMode_SourceIn); - foregroundPainter.fillRect(pluginPixmap.rect(), foregroundColor()); - - QPixmap pixmapDrag(ICONWIDTH + ICONSPACE + FONTSIZE * 2, ICONHEIGHT + ICONSPACE + FONTSIZE * 2); - pixmapDrag.fill(Qt::transparent); - QPainter painter(&pixmapDrag); - painter.drawPixmap(QPoint((ICONSPACE + FONTSIZE * 2) / 2, 0), pluginPixmap); - painter.setPen(foregroundPainter.pen()); - - QFont font; - font.setPixelSize(FONTSIZE); - painter.setFont(font); - QTextOption option; - option.setAlignment(Qt::AlignTop | Qt::AlignHCenter); - painter.drawText(QRect(QPoint(0, ICONHEIGHT + ICONSPACE), - QPoint(pixmapDrag.width(), pixmapDrag.height())), m_pluginInter->pluginDisplayName(), option); - return pixmapDrag; + return grab(); } const QString QuickSettingItem::itemKey() const