2023-02-16 13:51:55 +08:00
|
|
|
|
// Copyright (C) 2019 ~ 2019 Deepin Technology Co., Ltd.
|
|
|
|
|
// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd.
|
2022-09-06 11:36:55 +08:00
|
|
|
|
//
|
|
|
|
|
// SPDX-License-Identifier: LGPL-3.0-or-later
|
2019-08-17 17:33:36 +08:00
|
|
|
|
|
|
|
|
|
#include "dockitemmanager.h"
|
2020-12-16 17:38:41 +08:00
|
|
|
|
#include "appitem.h"
|
|
|
|
|
#include "launcheritem.h"
|
|
|
|
|
#include "pluginsitem.h"
|
2023-06-13 15:05:44 +08:00
|
|
|
|
#include "taskmanager/entry.h"
|
|
|
|
|
#include "taskmanager/taskmanager.h"
|
|
|
|
|
#include "taskmanager/windowinfobase.h"
|
2020-12-16 17:38:41 +08:00
|
|
|
|
#include "traypluginitem.h"
|
2021-03-20 12:10:45 +08:00
|
|
|
|
#include "utils.h"
|
2023-06-07 14:11:50 +08:00
|
|
|
|
#include "docksettings.h"
|
2022-08-18 15:41:46 +00:00
|
|
|
|
#include "appmultiitem.h"
|
2022-10-19 03:50:12 +00:00
|
|
|
|
#include "quicksettingcontroller.h"
|
2019-08-17 17:33:36 +08:00
|
|
|
|
|
|
|
|
|
#include <QDebug>
|
|
|
|
|
#include <QGSettings>
|
|
|
|
|
|
2021-04-16 11:19:56 +08:00
|
|
|
|
#include <DApplication>
|
|
|
|
|
|
2019-08-17 17:33:36 +08:00
|
|
|
|
DockItemManager *DockItemManager::INSTANCE = nullptr;
|
2021-03-20 12:10:45 +08:00
|
|
|
|
const QGSettings *DockItemManager::m_appSettings = Utils::ModuleSettingsPtr("app");
|
|
|
|
|
const QGSettings *DockItemManager::m_activeSettings = Utils::ModuleSettingsPtr("activeapp");
|
|
|
|
|
const QGSettings *DockItemManager::m_dockedSettings = Utils::ModuleSettingsPtr("dockapp");
|
2021-03-10 18:40:46 +08:00
|
|
|
|
|
2019-08-17 17:33:36 +08:00
|
|
|
|
DockItemManager::DockItemManager(QObject *parent)
|
|
|
|
|
: QObject(parent)
|
2023-06-13 15:05:44 +08:00
|
|
|
|
, m_taskmanager(TaskManager::instance())
|
2021-03-16 12:35:23 +08:00
|
|
|
|
, m_loadFinished(false)
|
2019-08-17 17:33:36 +08:00
|
|
|
|
{
|
2019-09-04 13:22:43 +08:00
|
|
|
|
//固定区域:启动器
|
2021-03-12 13:20:13 +08:00
|
|
|
|
m_itemList.append(new LauncherItem);
|
2019-08-17 17:33:36 +08:00
|
|
|
|
|
|
|
|
|
// 应用区域
|
2023-06-13 15:05:44 +08:00
|
|
|
|
for (auto entry : m_taskmanager->getEntries()) {
|
2023-06-07 14:11:50 +08:00
|
|
|
|
AppItem *it = new AppItem(m_appSettings, m_activeSettings, m_dockedSettings, entry);
|
2019-08-21 14:07:24 +08:00
|
|
|
|
manageItem(it);
|
2019-08-17 17:33:36 +08:00
|
|
|
|
|
2023-06-13 15:05:44 +08:00
|
|
|
|
connect(it, &AppItem::requestPreviewWindow, m_taskmanager, &TaskManager::previewWindow);
|
|
|
|
|
connect(it, &AppItem::requestCancelPreview, m_taskmanager, &TaskManager::cancelPreviewWindow);
|
2022-08-18 15:41:46 +00:00
|
|
|
|
connect(it, &AppItem::windowCountChanged, this, &DockItemManager::onAppWindowCountChanged);
|
2020-10-29 18:08:30 +08:00
|
|
|
|
connect(this, &DockItemManager::requestUpdateDockItem, it, &AppItem::requestUpdateEntryGeometries);
|
|
|
|
|
|
2019-08-17 17:33:36 +08:00
|
|
|
|
m_itemList.append(it);
|
2023-06-13 15:05:44 +08:00
|
|
|
|
m_appIDist.append(it->appId());
|
2022-08-18 15:41:46 +00:00
|
|
|
|
updateMultiItems(it);
|
2019-08-17 17:33:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 托盘区域和插件区域 由DockPluginsController获取
|
2022-11-02 06:35:04 +00:00
|
|
|
|
QuickSettingController *quickController = QuickSettingController::instance();
|
2022-11-04 07:28:51 +00:00
|
|
|
|
connect(quickController, &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute pluginAttr) {
|
2022-11-02 06:35:04 +00:00
|
|
|
|
if (pluginAttr != QuickSettingController::PluginAttribute::Fixed)
|
|
|
|
|
return;
|
2019-08-17 17:33:36 +08:00
|
|
|
|
|
2022-11-02 06:35:04 +00:00
|
|
|
|
m_pluginItems << itemInter;
|
|
|
|
|
pluginItemInserted(quickController->pluginItemWidget(itemInter));
|
|
|
|
|
});
|
2019-08-17 17:33:36 +08:00
|
|
|
|
|
2022-11-02 06:35:04 +00:00
|
|
|
|
connect(quickController, &QuickSettingController::pluginRemoved, this, &DockItemManager::onPluginItemRemoved);
|
|
|
|
|
connect(quickController, &QuickSettingController::pluginUpdated, this, &DockItemManager::onPluginUpdate);
|
2023-01-12 11:06:36 +08:00
|
|
|
|
connect(quickController, &QuickSettingController::pluginLoaderFinished, this, &DockItemManager::onPluginLoadFinished, Qt::QueuedConnection);
|
2019-08-17 17:33:36 +08:00
|
|
|
|
|
|
|
|
|
// 应用信号
|
2023-06-13 15:05:44 +08:00
|
|
|
|
connect(m_taskmanager, &TaskManager::entryAdded, this, &DockItemManager::appItemAdded);
|
|
|
|
|
connect(m_taskmanager, &TaskManager::entryRemoved, this, static_cast<void (DockItemManager::*)(const QString &)>(&DockItemManager::appItemRemoved), Qt::QueuedConnection);
|
|
|
|
|
connect(m_taskmanager, &TaskManager::serviceRestarted, this, &DockItemManager::reloadAppItems);
|
2023-06-07 14:11:50 +08:00
|
|
|
|
connect(DockSettings::instance(), &DockSettings::showMultiWindowChanged, this, &DockItemManager::onShowMultiWindowChanged);
|
2019-08-17 17:33:36 +08:00
|
|
|
|
|
2021-04-16 11:19:56 +08:00
|
|
|
|
DApplication *app = qobject_cast<DApplication *>(qApp);
|
|
|
|
|
if (app) {
|
|
|
|
|
connect(app, &DApplication::iconThemeChanged, this, &DockItemManager::refreshItemsIcon);
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-25 13:05:45 +08:00
|
|
|
|
connect(qApp, &QApplication::aboutToQuit, this, &QObject::deleteLater);
|
|
|
|
|
|
2022-11-02 06:35:04 +00:00
|
|
|
|
// 读取已经加载的固定区域插件
|
|
|
|
|
QList<PluginsItemInterface *> plugins = quickController->pluginItems(QuickSettingController::PluginAttribute::Fixed);
|
|
|
|
|
for (PluginsItemInterface *plugin : plugins) {
|
|
|
|
|
m_pluginItems << plugin;
|
|
|
|
|
pluginItemInserted(quickController->pluginItemWidget(plugin));
|
|
|
|
|
}
|
|
|
|
|
|
2019-08-17 17:33:36 +08:00
|
|
|
|
// 刷新图标
|
2021-04-16 11:19:56 +08:00
|
|
|
|
QMetaObject::invokeMethod(this, "refreshItemsIcon", Qt::QueuedConnection);
|
2019-08-17 17:33:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DockItemManager *DockItemManager::instance(QObject *parent)
|
|
|
|
|
{
|
|
|
|
|
if (!INSTANCE)
|
|
|
|
|
INSTANCE = new DockItemManager(parent);
|
|
|
|
|
|
|
|
|
|
return INSTANCE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const QList<QPointer<DockItem>> DockItemManager::itemList() const
|
|
|
|
|
{
|
|
|
|
|
return m_itemList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool DockItemManager::appIsOnDock(const QString &appDesktop) const
|
|
|
|
|
{
|
2023-06-13 15:05:44 +08:00
|
|
|
|
return m_taskmanager->isOnDock(appDesktop);
|
2019-08-17 17:33:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-04-16 11:19:56 +08:00
|
|
|
|
void DockItemManager::refreshItemsIcon()
|
2019-08-17 17:33:36 +08:00
|
|
|
|
{
|
|
|
|
|
for (auto item : m_itemList) {
|
2022-02-10 11:08:44 +08:00
|
|
|
|
if (item.isNull())
|
|
|
|
|
continue;
|
|
|
|
|
|
2021-03-06 18:40:13 +08:00
|
|
|
|
item->refreshIcon();
|
2019-08-17 17:33:36 +08:00
|
|
|
|
item->update();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-12-28 09:51:35 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief 将插件的参数(Order, Visible, etc)写入gsettings
|
|
|
|
|
* 自动化测试需要通过dbus(GetPluginSettings)获取这些参数
|
|
|
|
|
*/
|
2019-08-17 17:33:36 +08:00
|
|
|
|
void DockItemManager::updatePluginsItemOrderKey()
|
|
|
|
|
{
|
|
|
|
|
int index = 0;
|
|
|
|
|
for (auto item : m_itemList) {
|
2019-08-21 12:52:53 +08:00
|
|
|
|
if (item.isNull() || item->itemType() != DockItem::Plugins)
|
2019-08-17 17:33:36 +08:00
|
|
|
|
continue;
|
|
|
|
|
static_cast<PluginsItem *>(item.data())->setItemSortKey(++index);
|
|
|
|
|
}
|
2019-09-04 13:22:43 +08:00
|
|
|
|
|
|
|
|
|
// 固定区域插件排序
|
|
|
|
|
index = 0;
|
|
|
|
|
for (auto item : m_itemList) {
|
|
|
|
|
if (item.isNull() || item->itemType() != DockItem::FixedPlugin)
|
|
|
|
|
continue;
|
|
|
|
|
static_cast<PluginsItem *>(item.data())->setItemSortKey(++index);
|
|
|
|
|
}
|
2019-08-17 17:33:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-08-21 12:52:53 +08:00
|
|
|
|
void DockItemManager::itemMoved(DockItem *const sourceItem, DockItem *const targetItem)
|
2019-08-17 17:33:36 +08:00
|
|
|
|
{
|
2019-08-21 12:52:53 +08:00
|
|
|
|
Q_ASSERT(sourceItem != targetItem);
|
2019-08-17 17:33:36 +08:00
|
|
|
|
|
2019-08-21 12:52:53 +08:00
|
|
|
|
const DockItem::ItemType moveType = sourceItem->itemType();
|
|
|
|
|
const DockItem::ItemType replaceType = targetItem->itemType();
|
2019-08-17 17:33:36 +08:00
|
|
|
|
|
|
|
|
|
// app move
|
|
|
|
|
if (moveType == DockItem::App || moveType == DockItem::Placeholder)
|
2019-10-17 19:52:55 +08:00
|
|
|
|
if (replaceType != DockItem::App)
|
2019-08-17 17:33:36 +08:00
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// plugins move
|
|
|
|
|
if (moveType == DockItem::Plugins || moveType == DockItem::TrayPlugin)
|
|
|
|
|
if (replaceType != DockItem::Plugins && replaceType != DockItem::TrayPlugin)
|
|
|
|
|
return;
|
|
|
|
|
|
2019-08-21 12:52:53 +08:00
|
|
|
|
const int moveIndex = m_itemList.indexOf(sourceItem);
|
2019-10-17 19:52:55 +08:00
|
|
|
|
const int replaceIndex = m_itemList.indexOf(targetItem);
|
2019-08-17 17:33:36 +08:00
|
|
|
|
|
|
|
|
|
m_itemList.removeAt(moveIndex);
|
2019-08-21 12:52:53 +08:00
|
|
|
|
m_itemList.insert(replaceIndex, sourceItem);
|
2019-08-17 17:33:36 +08:00
|
|
|
|
|
|
|
|
|
// update plugins sort key if order changed
|
|
|
|
|
if (moveType == DockItem::Plugins || replaceType == DockItem::Plugins
|
2021-03-12 13:20:13 +08:00
|
|
|
|
|| moveType == DockItem::TrayPlugin || replaceType == DockItem::TrayPlugin
|
|
|
|
|
|| moveType == DockItem::FixedPlugin || replaceType == DockItem::FixedPlugin) {
|
2020-12-28 09:51:35 +08:00
|
|
|
|
updatePluginsItemOrderKey();
|
|
|
|
|
}
|
2019-08-17 17:33:36 +08:00
|
|
|
|
|
|
|
|
|
// for app move, index 0 is launcher item, need to pass it.
|
|
|
|
|
if (moveType == DockItem::App && replaceType == DockItem::App)
|
2023-06-13 15:05:44 +08:00
|
|
|
|
m_taskmanager->moveEntry(moveIndex - 1, replaceIndex - 1);
|
2019-08-17 17:33:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-08-29 20:21:36 +08:00
|
|
|
|
void DockItemManager::itemAdded(const QString &appDesktop, int idx)
|
|
|
|
|
{
|
2023-06-13 15:05:44 +08:00
|
|
|
|
m_taskmanager->requestDock(appDesktop, idx);
|
2019-08-29 20:21:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-06-13 15:05:44 +08:00
|
|
|
|
void DockItemManager::appItemAdded(const Entry *entry, const int index)
|
2019-08-17 17:33:36 +08:00
|
|
|
|
{
|
2019-10-11 16:04:12 +08:00
|
|
|
|
// 第一个是启动器
|
|
|
|
|
int insertIndex = 1;
|
2019-08-17 17:33:36 +08:00
|
|
|
|
|
|
|
|
|
// -1 for append to app list end
|
|
|
|
|
if (index != -1) {
|
|
|
|
|
insertIndex += index;
|
|
|
|
|
} else {
|
|
|
|
|
for (auto item : m_itemList)
|
2022-02-10 11:08:44 +08:00
|
|
|
|
if (!item.isNull() && item->itemType() == DockItem::App)
|
2019-08-17 17:33:36 +08:00
|
|
|
|
++insertIndex;
|
|
|
|
|
}
|
|
|
|
|
|
2023-06-13 15:05:44 +08:00
|
|
|
|
AppItem *item = new AppItem(m_appSettings, m_activeSettings, m_dockedSettings, entry);
|
2020-07-22 17:08:59 +08:00
|
|
|
|
|
|
|
|
|
if (m_appIDist.contains(item->appId())) {
|
2023-06-13 15:05:44 +08:00
|
|
|
|
item->deleteLater();
|
2020-07-22 17:08:59 +08:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2019-08-21 14:07:24 +08:00
|
|
|
|
manageItem(item);
|
2019-08-17 17:33:36 +08:00
|
|
|
|
|
2023-06-13 15:05:44 +08:00
|
|
|
|
connect(item, &AppItem::requestPreviewWindow, m_taskmanager, &TaskManager::previewWindow);
|
|
|
|
|
connect(item, &AppItem::requestCancelPreview, m_taskmanager, &TaskManager::cancelPreviewWindow);
|
2022-08-18 15:41:46 +00:00
|
|
|
|
connect(item, &AppItem::windowCountChanged, this, &DockItemManager::onAppWindowCountChanged);
|
2020-12-02 14:50:49 +08:00
|
|
|
|
connect(this, &DockItemManager::requestUpdateDockItem, item, &AppItem::requestUpdateEntryGeometries);
|
2019-08-17 17:33:36 +08:00
|
|
|
|
|
|
|
|
|
m_itemList.insert(insertIndex, item);
|
2020-07-22 17:08:59 +08:00
|
|
|
|
m_appIDist.append(item->appId());
|
2019-11-04 11:31:54 +08:00
|
|
|
|
|
2022-08-18 15:41:46 +00:00
|
|
|
|
int itemIndex = insertIndex;
|
|
|
|
|
if (index != -1)
|
|
|
|
|
itemIndex = insertIndex - 1;
|
2019-11-04 11:31:54 +08:00
|
|
|
|
|
2022-08-18 15:41:46 +00:00
|
|
|
|
// 插入dockItem
|
|
|
|
|
emit itemInserted(itemIndex, item);
|
|
|
|
|
// 向后插入多开窗口
|
|
|
|
|
updateMultiItems(item, true);
|
2019-08-17 17:33:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DockItemManager::appItemRemoved(const QString &appId)
|
|
|
|
|
{
|
|
|
|
|
for (int i(0); i != m_itemList.size(); ++i) {
|
|
|
|
|
AppItem *app = static_cast<AppItem *>(m_itemList[i].data());
|
|
|
|
|
if (!app) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2022-02-10 11:08:44 +08:00
|
|
|
|
|
|
|
|
|
if (m_itemList[i]->itemType() != DockItem::App)
|
|
|
|
|
continue;
|
|
|
|
|
|
2019-08-17 17:33:36 +08:00
|
|
|
|
if (!app->isValid() || app->appId() == appId) {
|
|
|
|
|
appItemRemoved(app);
|
2020-08-04 15:38:41 +08:00
|
|
|
|
break;
|
2019-08-17 17:33:36 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2020-07-22 17:08:59 +08:00
|
|
|
|
|
|
|
|
|
m_appIDist.removeAll(appId);
|
2019-08-17 17:33:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DockItemManager::appItemRemoved(AppItem *appItem)
|
|
|
|
|
{
|
|
|
|
|
emit itemRemoved(appItem);
|
|
|
|
|
m_itemList.removeOne(appItem);
|
2019-12-30 11:10:36 +08:00
|
|
|
|
|
|
|
|
|
if (appItem->isDragging()) {
|
|
|
|
|
QDrag::cancel();
|
|
|
|
|
}
|
2019-08-17 17:33:36 +08:00
|
|
|
|
appItem->deleteLater();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DockItemManager::reloadAppItems()
|
|
|
|
|
{
|
|
|
|
|
// remove old item
|
|
|
|
|
for (auto item : m_itemList)
|
|
|
|
|
if (item->itemType() == DockItem::App)
|
|
|
|
|
appItemRemoved(static_cast<AppItem *>(item.data()));
|
|
|
|
|
|
|
|
|
|
// append new item
|
2023-06-13 15:05:44 +08:00
|
|
|
|
for (Entry* entry : m_taskmanager->getEntries())
|
|
|
|
|
appItemAdded(entry, -1);
|
2019-08-17 17:33:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-08-21 14:07:24 +08:00
|
|
|
|
void DockItemManager::manageItem(DockItem *item)
|
|
|
|
|
{
|
|
|
|
|
connect(item, &DockItem::requestRefreshWindowVisible, this, &DockItemManager::requestRefershWindowVisible, Qt::UniqueConnection);
|
|
|
|
|
connect(item, &DockItem::requestWindowAutoHide, this, &DockItemManager::requestWindowAutoHide, Qt::UniqueConnection);
|
|
|
|
|
}
|
2021-03-16 12:35:23 +08:00
|
|
|
|
|
2019-08-17 17:33:36 +08:00
|
|
|
|
void DockItemManager::pluginItemInserted(PluginsItem *item)
|
|
|
|
|
{
|
2019-08-21 14:07:24 +08:00
|
|
|
|
manageItem(item);
|
|
|
|
|
|
2019-12-06 14:25:36 +08:00
|
|
|
|
DockItem::ItemType pluginType = item->itemType();
|
|
|
|
|
|
2019-08-17 17:33:36 +08:00
|
|
|
|
// find first plugins item position
|
|
|
|
|
int firstPluginPosition = -1;
|
|
|
|
|
for (int i(0); i != m_itemList.size(); ++i) {
|
|
|
|
|
DockItem::ItemType type = m_itemList[i]->itemType();
|
2019-12-06 14:25:36 +08:00
|
|
|
|
if (type != pluginType)
|
2019-08-17 17:33:36 +08:00
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
firstPluginPosition = i;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (firstPluginPosition == -1)
|
|
|
|
|
firstPluginPosition = m_itemList.size();
|
|
|
|
|
|
|
|
|
|
// find insert position
|
|
|
|
|
int insertIndex = 0;
|
|
|
|
|
const int itemSortKey = item->itemSortKey();
|
|
|
|
|
if (itemSortKey == -1 || firstPluginPosition == -1) {
|
|
|
|
|
insertIndex = m_itemList.size();
|
|
|
|
|
} else if (itemSortKey == 0) {
|
|
|
|
|
insertIndex = firstPluginPosition;
|
|
|
|
|
} else {
|
|
|
|
|
insertIndex = m_itemList.size();
|
|
|
|
|
for (int i(firstPluginPosition + 1); i != m_itemList.size() + 1; ++i) {
|
|
|
|
|
PluginsItem *pItem = static_cast<PluginsItem *>(m_itemList[i - 1].data());
|
|
|
|
|
Q_ASSERT(pItem);
|
|
|
|
|
|
|
|
|
|
const int sortKey = pItem->itemSortKey();
|
2019-12-27 13:04:56 +08:00
|
|
|
|
if (pluginType == DockItem::FixedPlugin) {
|
|
|
|
|
if (sortKey != -1 && itemSortKey > sortKey)
|
|
|
|
|
continue;
|
|
|
|
|
insertIndex = i - 1;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (sortKey != -1 && itemSortKey > sortKey && pItem->itemType() != DockItem::FixedPlugin)
|
2019-08-17 17:33:36 +08:00
|
|
|
|
continue;
|
|
|
|
|
insertIndex = i - 1;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_itemList.insert(insertIndex, item);
|
2019-12-06 14:25:36 +08:00
|
|
|
|
if(pluginType == DockItem::FixedPlugin)
|
|
|
|
|
insertIndex ++;
|
2019-08-17 17:33:36 +08:00
|
|
|
|
|
2022-02-15 18:49:50 +08:00
|
|
|
|
if (!Utils::SettingValue(QString("com.deepin.dde.dock.module.") + item->pluginName(), QByteArray(), "enable", true).toBool())
|
|
|
|
|
item->setVisible(false);
|
2022-11-18 08:10:17 +00:00
|
|
|
|
else
|
|
|
|
|
item->setVisible(true);
|
2022-02-15 18:49:50 +08:00
|
|
|
|
|
|
|
|
|
emit itemInserted(insertIndex - firstPluginPosition, item);
|
2019-08-17 17:33:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-11-02 06:35:04 +00:00
|
|
|
|
void DockItemManager::onPluginItemRemoved(PluginsItemInterface *itemInter)
|
2019-08-17 17:33:36 +08:00
|
|
|
|
{
|
2022-11-02 06:35:04 +00:00
|
|
|
|
if (!m_pluginItems.contains(itemInter))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
PluginsItem *item = QuickSettingController::instance()->pluginItemWidget(itemInter);
|
2019-08-17 17:33:36 +08:00
|
|
|
|
item->hidePopup();
|
2022-11-18 08:10:17 +00:00
|
|
|
|
item->hide();
|
2019-08-17 17:33:36 +08:00
|
|
|
|
|
2019-10-17 19:52:55 +08:00
|
|
|
|
emit itemRemoved(item);
|
2019-08-17 17:33:36 +08:00
|
|
|
|
|
|
|
|
|
m_itemList.removeOne(item);
|
2022-11-02 06:35:04 +00:00
|
|
|
|
|
|
|
|
|
if (m_loadFinished) {
|
|
|
|
|
updatePluginsItemOrderKey();
|
|
|
|
|
}
|
2019-08-17 17:33:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-11-02 06:35:04 +00:00
|
|
|
|
void DockItemManager::onPluginUpdate(PluginsItemInterface *itemInter)
|
2019-08-17 17:33:36 +08:00
|
|
|
|
{
|
2022-11-02 06:35:04 +00:00
|
|
|
|
if (!m_pluginItems.contains(itemInter))
|
|
|
|
|
return;
|
2019-08-17 17:33:36 +08:00
|
|
|
|
|
2022-11-02 06:35:04 +00:00
|
|
|
|
Q_EMIT itemUpdated(QuickSettingController::instance()->pluginItemWidget(itemInter));
|
2019-08-17 17:33:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-03-16 12:35:23 +08:00
|
|
|
|
void DockItemManager::onPluginLoadFinished()
|
2019-08-21 14:07:24 +08:00
|
|
|
|
{
|
2021-03-16 12:35:23 +08:00
|
|
|
|
updatePluginsItemOrderKey();
|
|
|
|
|
m_loadFinished = true;
|
2019-08-21 14:07:24 +08:00
|
|
|
|
}
|
2021-03-16 12:35:23 +08:00
|
|
|
|
|
2022-08-18 15:41:46 +00:00
|
|
|
|
void DockItemManager::onAppWindowCountChanged()
|
2021-03-16 12:35:23 +08:00
|
|
|
|
{
|
2022-08-18 15:41:46 +00:00
|
|
|
|
AppItem *appItem = static_cast<AppItem *>(sender());
|
|
|
|
|
updateMultiItems(appItem, true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DockItemManager::updateMultiItems(AppItem *appItem, bool emitSignal)
|
|
|
|
|
{
|
|
|
|
|
// 如果系统设置不开启应用多窗口拆分,则无需之后的操作
|
2023-06-13 15:05:44 +08:00
|
|
|
|
if (!m_taskmanager->showMultiWindow())
|
2022-08-18 15:41:46 +00:00
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// 如果开启了多窗口拆分,则同步窗口和多窗口应用的信息
|
2023-06-13 15:05:44 +08:00
|
|
|
|
const WindowInfoMap &windowInfoMap = appItem->windowsInfos();
|
2022-08-18 15:41:46 +00:00
|
|
|
|
QList<AppMultiItem *> removeItems;
|
|
|
|
|
// 同步当前已经存在的多开窗口的列表,删除不存在的多开窗口
|
|
|
|
|
for (int i = 0; i < m_itemList.size(); i++) {
|
|
|
|
|
QPointer<DockItem> dockItem = m_itemList[i];
|
|
|
|
|
AppMultiItem *multiItem = qobject_cast<AppMultiItem *>(dockItem.data());
|
|
|
|
|
if (!multiItem || multiItem->appItem() != appItem)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
// 如果查找到的当前的应用的窗口不需要移除,则继续下一个循环
|
|
|
|
|
if (!needRemoveMultiWindow(multiItem))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
removeItems << multiItem;
|
|
|
|
|
}
|
|
|
|
|
// 从itemList中移除多开窗口
|
|
|
|
|
for (AppMultiItem *dockItem : removeItems)
|
|
|
|
|
m_itemList.removeOne(dockItem);
|
|
|
|
|
if (emitSignal) {
|
|
|
|
|
// 移除发送每个多开窗口的移除信号
|
|
|
|
|
for (AppMultiItem *dockItem : removeItems)
|
|
|
|
|
Q_EMIT itemRemoved(dockItem);
|
|
|
|
|
}
|
|
|
|
|
qDeleteAll(removeItems);
|
|
|
|
|
|
|
|
|
|
// 遍历当前APP打开的所有窗口的列表,如果不存在多开窗口的应用,则新增,同时发送信号
|
|
|
|
|
for (auto it = windowInfoMap.begin(); it != windowInfoMap.end(); it++) {
|
|
|
|
|
if (multiWindowExist(it.key()))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
const WindowInfo &windowInfo = it.value();
|
|
|
|
|
// 如果不存在这个窗口对应的多开窗口,则新建一个窗口,同时发送窗口新增的信号
|
|
|
|
|
AppMultiItem *multiItem = new AppMultiItem(appItem, it.key(), windowInfo);
|
|
|
|
|
m_itemList << multiItem;
|
|
|
|
|
if (emitSignal)
|
|
|
|
|
Q_EMIT itemInserted(-1, multiItem);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 检查对应的窗口是否存在多开窗口
|
|
|
|
|
bool DockItemManager::multiWindowExist(quint32 winId) const
|
|
|
|
|
{
|
|
|
|
|
for (QPointer<DockItem> dockItem : m_itemList) {
|
|
|
|
|
AppMultiItem *multiItem = qobject_cast<AppMultiItem *>(dockItem.data());
|
|
|
|
|
if (!multiItem)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if (multiItem->winId() == winId)
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 检查当前多开窗口是否需要移除
|
|
|
|
|
// 如果当前多开窗口图标对应的窗口在这个窗口所属的APP中所有打开窗口中不存在,那么则认为该多窗口已经被关闭
|
|
|
|
|
bool DockItemManager::needRemoveMultiWindow(AppMultiItem *multiItem) const
|
|
|
|
|
{
|
|
|
|
|
// 查找多分窗口对应的窗口在应用所有的打开的窗口中是否存在,只要它对应的窗口存在,就无需删除
|
|
|
|
|
// 只要不存在,就需要删除
|
|
|
|
|
AppItem *appItem = multiItem->appItem();
|
2023-06-13 15:05:44 +08:00
|
|
|
|
const WindowInfoMap &windowInfoMap = appItem->windowsInfos();
|
2022-08-18 15:41:46 +00:00
|
|
|
|
for (auto it = windowInfoMap.begin(); it != windowInfoMap.end(); it++) {
|
|
|
|
|
if (it.key() == multiItem->winId())
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DockItemManager::onShowMultiWindowChanged()
|
|
|
|
|
{
|
2023-06-13 15:05:44 +08:00
|
|
|
|
if (m_taskmanager->showMultiWindow()) {
|
2022-08-18 15:41:46 +00:00
|
|
|
|
// 如果当前设置支持窗口多开,那么就依次对每个APPItem加载多开窗口
|
2022-08-18 10:42:52 +00:00
|
|
|
|
for (int i = 0; i < m_itemList.size(); i++) {
|
|
|
|
|
const QPointer<DockItem> &dockItem = m_itemList[i];
|
2022-08-18 15:41:46 +00:00
|
|
|
|
if (dockItem->itemType() != DockItem::ItemType::App)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
updateMultiItems(static_cast<AppItem *>(dockItem.data()), true);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 如果当前设置不支持窗口多开,则删除所有的多开窗口
|
|
|
|
|
QList<DockItem *> multiWindows;
|
|
|
|
|
for (const QPointer<DockItem> &dockItem : m_itemList) {
|
|
|
|
|
if (dockItem->itemType() != DockItem::AppMultiWindow)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
multiWindows << dockItem.data();
|
|
|
|
|
}
|
|
|
|
|
for (DockItem *multiItem : multiWindows) {
|
|
|
|
|
m_itemList.removeOne(multiItem);
|
|
|
|
|
Q_EMIT itemRemoved(multiItem);
|
|
|
|
|
multiItem->deleteLater();
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-03-16 12:35:23 +08:00
|
|
|
|
}
|