mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-04 09:23:03 +00:00
feat: 高效模式增加加载插件的功能
删除原来的tray插件,高效模式下,加载插件使用时尚模式相同的加载插件的方式 Log: 增加高效模式加载插件的功能 Influence: 高效模式下加载插件 Task: https://pms.uniontech.com/task-view-112073.html Change-Id: I5766382fb64bd544b3c7a9c40d1ce4668613d508
This commit is contained in:
parent
a8b8e6bd00
commit
9e2e8fb18d
2
debian/dde-dock.install
vendored
2
debian/dde-dock.install
vendored
@ -1,10 +1,8 @@
|
|||||||
usr/share
|
usr/share
|
||||||
usr/bin
|
usr/bin
|
||||||
etc/dde-dock
|
etc/dde-dock
|
||||||
usr/lib/dde-dock/plugins/libdatetime.so
|
|
||||||
usr/lib/dde-dock/plugins/libshutdown.so
|
usr/lib/dde-dock/plugins/libshutdown.so
|
||||||
usr/lib/dde-dock/plugins/libtrash.so
|
usr/lib/dde-dock/plugins/libtrash.so
|
||||||
usr/lib/dde-dock/plugins/libtray.so
|
|
||||||
usr/lib/dde-dock/plugins/liboverlay-warning.so
|
usr/lib/dde-dock/plugins/liboverlay-warning.so
|
||||||
usr/lib/dde-dock/plugins/system-trays
|
usr/lib/dde-dock/plugins/system-trays
|
||||||
usr/lib/dde-dock/plugins/quick-trays
|
usr/lib/dde-dock/plugins/quick-trays
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#include "traypluginitem.h"
|
#include "traypluginitem.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "appmultiitem.h"
|
#include "appmultiitem.h"
|
||||||
|
#include "quicksettingcontroller.h"
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QGSettings>
|
#include <QGSettings>
|
||||||
@ -40,7 +41,6 @@ const QGSettings *DockItemManager::m_dockedSettings = Utils::ModuleSettingsPtr("
|
|||||||
DockItemManager::DockItemManager(QObject *parent)
|
DockItemManager::DockItemManager(QObject *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
, m_appInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this))
|
, m_appInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this))
|
||||||
, m_pluginsInter(new DockPluginsController(this))
|
|
||||||
, m_loadFinished(false)
|
, m_loadFinished(false)
|
||||||
{
|
{
|
||||||
//固定区域:启动器
|
//固定区域:启动器
|
||||||
@ -77,13 +77,6 @@ DockItemManager::DockItemManager(QObject *parent)
|
|||||||
connect(m_appInter, &DockInter::ShowMultiWindowChanged, this, &DockItemManager::onShowMultiWindowChanged);
|
connect(m_appInter, &DockInter::ShowMultiWindowChanged, this, &DockItemManager::onShowMultiWindowChanged);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 插件信号
|
|
||||||
connect(m_pluginsInter, &DockPluginsController::pluginItemInserted, this, &DockItemManager::pluginItemInserted, Qt::QueuedConnection);
|
|
||||||
connect(m_pluginsInter, &DockPluginsController::pluginItemRemoved, this, &DockItemManager::pluginItemRemoved, Qt::QueuedConnection);
|
|
||||||
connect(m_pluginsInter, &DockPluginsController::pluginItemUpdated, this, &DockItemManager::itemUpdated, Qt::QueuedConnection);
|
|
||||||
connect(m_pluginsInter, &DockPluginsController::trayVisableCountChanged, this, &DockItemManager::trayVisableCountChanged, Qt::QueuedConnection);
|
|
||||||
connect(m_pluginsInter, &DockPluginsController::pluginLoaderFinished, this, &DockItemManager::onPluginLoadFinished, Qt::QueuedConnection);
|
|
||||||
|
|
||||||
DApplication *app = qobject_cast<DApplication *>(qApp);
|
DApplication *app = qobject_cast<DApplication *>(qApp);
|
||||||
if (app) {
|
if (app) {
|
||||||
connect(app, &DApplication::iconThemeChanged, this, &DockItemManager::refreshItemsIcon);
|
connect(app, &DApplication::iconThemeChanged, this, &DockItemManager::refreshItemsIcon);
|
||||||
@ -110,7 +103,7 @@ const QList<QPointer<DockItem>> DockItemManager::itemList() const
|
|||||||
|
|
||||||
const QList<PluginsItemInterface *> DockItemManager::pluginList() const
|
const QList<PluginsItemInterface *> DockItemManager::pluginList() const
|
||||||
{
|
{
|
||||||
return m_pluginsInter->pluginsMap().keys();
|
return QuickSettingController::instance()->pluginsMap().keys();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DockItemManager::appIsOnDock(const QString &appDesktop) const
|
bool DockItemManager::appIsOnDock(const QString &appDesktop) const
|
||||||
@ -268,76 +261,6 @@ void DockItemManager::appItemRemoved(AppItem *appItem)
|
|||||||
appItem->deleteLater();
|
appItem->deleteLater();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DockItemManager::pluginItemInserted(PluginsItem *item)
|
|
||||||
{
|
|
||||||
manageItem(item);
|
|
||||||
|
|
||||||
DockItem::ItemType pluginType = item->itemType();
|
|
||||||
|
|
||||||
// find first plugins item position
|
|
||||||
int firstPluginPosition = -1;
|
|
||||||
for (int i(0); i != m_itemList.size(); ++i) {
|
|
||||||
DockItem::ItemType type = m_itemList[i]->itemType();
|
|
||||||
if (type != pluginType)
|
|
||||||
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();
|
|
||||||
if (pluginType == DockItem::FixedPlugin) {
|
|
||||||
if (sortKey != -1 && itemSortKey > sortKey)
|
|
||||||
continue;
|
|
||||||
insertIndex = i - 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (sortKey != -1 && itemSortKey > sortKey && pItem->itemType() != DockItem::FixedPlugin)
|
|
||||||
continue;
|
|
||||||
insertIndex = i - 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m_itemList.insert(insertIndex, item);
|
|
||||||
if(pluginType == DockItem::FixedPlugin)
|
|
||||||
insertIndex ++;
|
|
||||||
|
|
||||||
if (!Utils::SettingValue(QString("com.deepin.dde.dock.module.") + item->pluginName(), QByteArray(), "enable", true).toBool())
|
|
||||||
item->setVisible(false);
|
|
||||||
|
|
||||||
emit itemInserted(insertIndex - firstPluginPosition, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DockItemManager::pluginItemRemoved(PluginsItem *item)
|
|
||||||
{
|
|
||||||
item->hidePopup();
|
|
||||||
|
|
||||||
emit itemRemoved(item);
|
|
||||||
|
|
||||||
m_itemList.removeOne(item);
|
|
||||||
|
|
||||||
if (m_loadFinished) {
|
|
||||||
updatePluginsItemOrderKey();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DockItemManager::reloadAppItems()
|
void DockItemManager::reloadAppItems()
|
||||||
{
|
{
|
||||||
// remove old item
|
// remove old item
|
||||||
|
@ -22,7 +22,6 @@
|
|||||||
#ifndef DOCKITEMMANAGER_H
|
#ifndef DOCKITEMMANAGER_H
|
||||||
#define DOCKITEMMANAGER_H
|
#define DOCKITEMMANAGER_H
|
||||||
|
|
||||||
#include "dockpluginscontroller.h"
|
|
||||||
#include "pluginsiteminterface.h"
|
#include "pluginsiteminterface.h"
|
||||||
#include "dockitem.h"
|
#include "dockitem.h"
|
||||||
#include "appitem.h"
|
#include "appitem.h"
|
||||||
@ -75,8 +74,6 @@ private:
|
|||||||
void appItemAdded(const QDBusObjectPath &path, const int index);
|
void appItemAdded(const QDBusObjectPath &path, const int index);
|
||||||
void appItemRemoved(const QString &appId);
|
void appItemRemoved(const QString &appId);
|
||||||
void appItemRemoved(AppItem *appItem);
|
void appItemRemoved(AppItem *appItem);
|
||||||
void pluginItemInserted(PluginsItem *item);
|
|
||||||
void pluginItemRemoved(PluginsItem *item);
|
|
||||||
void updatePluginsItemOrderKey();
|
void updatePluginsItemOrderKey();
|
||||||
void reloadAppItems();
|
void reloadAppItems();
|
||||||
void manageItem(DockItem *item);
|
void manageItem(DockItem *item);
|
||||||
@ -89,7 +86,6 @@ private:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
DockInter *m_appInter;
|
DockInter *m_appInter;
|
||||||
DockPluginsController *m_pluginsInter;
|
|
||||||
|
|
||||||
static DockItemManager *INSTANCE;
|
static DockItemManager *INSTANCE;
|
||||||
|
|
||||||
|
@ -1,163 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd.
|
|
||||||
*
|
|
||||||
* Author: sbw <sbw@sbw.so>
|
|
||||||
*
|
|
||||||
* Maintainer: sbw <sbw@sbw.so>
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "dockpluginscontroller.h"
|
|
||||||
#include "proxyplugincontroller.h"
|
|
||||||
#include "pluginsiteminterface.h"
|
|
||||||
#include "traypluginitem.h"
|
|
||||||
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QDir>
|
|
||||||
#include <QDrag>
|
|
||||||
|
|
||||||
DockPluginsController::DockPluginsController(QObject *parent)
|
|
||||||
: AbstractPluginsController(parent)
|
|
||||||
{
|
|
||||||
setObjectName("DockPlugin");
|
|
||||||
|
|
||||||
ProxyPluginController::instance(PluginType::FixedSystemPlugin)->addProxyInterface(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
DockPluginsController::~DockPluginsController()
|
|
||||||
{
|
|
||||||
ProxyPluginController::instance(PluginType::FixedSystemPlugin)->removeProxyInterface(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DockPluginsController::itemAdded(PluginsItemInterface *const itemInter, const QString &itemKey)
|
|
||||||
{
|
|
||||||
QMap<PluginsItemInterface *, QMap<QString, QObject *>> &mPluginsMap = pluginsMap();
|
|
||||||
|
|
||||||
// check if same item added
|
|
||||||
if (mPluginsMap.contains(itemInter))
|
|
||||||
if (mPluginsMap[itemInter].contains(itemKey))
|
|
||||||
return;
|
|
||||||
|
|
||||||
// 取 plugin api
|
|
||||||
ProxyPluginController *proxyController = ProxyPluginController::instance(itemInter);
|
|
||||||
if (!proxyController)
|
|
||||||
return;
|
|
||||||
|
|
||||||
QPluginLoader *pluginLoader = proxyController->pluginLoader(itemInter);
|
|
||||||
if (!pluginLoader)
|
|
||||||
return;
|
|
||||||
|
|
||||||
const QJsonObject &meta = pluginLoader->metaData().value("MetaData").toObject();
|
|
||||||
|
|
||||||
PluginsItem *item = nullptr;
|
|
||||||
if (itemInter->pluginName() == "tray") {
|
|
||||||
item = new TrayPluginItem(itemInter, itemKey, meta);
|
|
||||||
if (item->graphicsEffect()) {
|
|
||||||
item->graphicsEffect()->setEnabled(false);
|
|
||||||
}
|
|
||||||
connect(static_cast<TrayPluginItem *>(item), &TrayPluginItem::trayVisableCountChanged,
|
|
||||||
this, &DockPluginsController::trayVisableCountChanged, Qt::UniqueConnection);
|
|
||||||
} else {
|
|
||||||
item = new PluginsItem(itemInter, itemKey, meta);
|
|
||||||
}
|
|
||||||
|
|
||||||
mPluginsMap[itemInter][itemKey] = item;
|
|
||||||
|
|
||||||
emit pluginItemInserted(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DockPluginsController::itemUpdate(PluginsItemInterface *const itemInter, const QString &itemKey)
|
|
||||||
{
|
|
||||||
PluginsItem *item = getPluginItem(itemInter, itemKey);
|
|
||||||
if (!item)
|
|
||||||
return;
|
|
||||||
|
|
||||||
item->update();
|
|
||||||
|
|
||||||
emit pluginItemUpdated(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DockPluginsController::itemRemoved(PluginsItemInterface *const itemInter, const QString &itemKey)
|
|
||||||
{
|
|
||||||
PluginsItem *item = getPluginItem(itemInter, itemKey);
|
|
||||||
if (!item)
|
|
||||||
return;
|
|
||||||
|
|
||||||
item->detachPluginWidget();
|
|
||||||
|
|
||||||
emit pluginItemRemoved(item);
|
|
||||||
|
|
||||||
QMap<PluginsItemInterface *, QMap<QString, QObject *>> &mPluginsMap = pluginsMap();
|
|
||||||
mPluginsMap[itemInter].remove(itemKey);
|
|
||||||
|
|
||||||
// do not delete the itemWidget object(specified in the plugin interface)
|
|
||||||
item->centralWidget()->setParent(nullptr);
|
|
||||||
|
|
||||||
if (item->isDragging()) {
|
|
||||||
QDrag::cancel();
|
|
||||||
}
|
|
||||||
|
|
||||||
// just delete our wrapper object(PluginsItem)
|
|
||||||
item->deleteLater();
|
|
||||||
}
|
|
||||||
|
|
||||||
void DockPluginsController::requestWindowAutoHide(PluginsItemInterface *const itemInter, const QString &itemKey, const bool autoHide)
|
|
||||||
{
|
|
||||||
PluginsItem *item = getPluginItem(itemInter, itemKey);
|
|
||||||
if (!item)
|
|
||||||
return;
|
|
||||||
|
|
||||||
Q_EMIT item->requestWindowAutoHide(autoHide);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DockPluginsController::requestRefreshWindowVisible(PluginsItemInterface *const itemInter, const QString &itemKey)
|
|
||||||
{
|
|
||||||
PluginsItem *item = getPluginItem(itemInter, itemKey);
|
|
||||||
if (!item)
|
|
||||||
return;
|
|
||||||
|
|
||||||
Q_EMIT item->requestRefreshWindowVisible();
|
|
||||||
}
|
|
||||||
|
|
||||||
void DockPluginsController::requestSetAppletVisible(PluginsItemInterface *const itemInter, const QString &itemKey, const bool visible)
|
|
||||||
{
|
|
||||||
PluginsItem *item = getPluginItem(itemInter, itemKey);
|
|
||||||
if (!item)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (visible) {
|
|
||||||
item->showPopupApplet(itemInter->itemPopupApplet(itemKey));
|
|
||||||
} else {
|
|
||||||
item->hidePopup();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QMap<PluginsItemInterface *, QMap<QString, QObject *>> &DockPluginsController::pluginsMap()
|
|
||||||
{
|
|
||||||
return ProxyPluginController::instance(PluginType::FixedSystemPlugin)->pluginsMap();
|
|
||||||
}
|
|
||||||
|
|
||||||
PluginsItem *DockPluginsController::getPluginItem(PluginsItemInterface * const itemInter, const QString &itemKey) const
|
|
||||||
{
|
|
||||||
ProxyPluginController *proxyController = ProxyPluginController::instance(itemInter);
|
|
||||||
if (!proxyController)
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
const QMap<PluginsItemInterface *, QMap<QString, QObject *>> &plugins = proxyController->pluginsMap();
|
|
||||||
if (plugins.contains(itemInter) && plugins[itemInter].contains(itemKey))
|
|
||||||
return static_cast<PluginsItem *>(plugins[itemInter][itemKey]);
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
@ -1,62 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd.
|
|
||||||
*
|
|
||||||
* Author: sbw <sbw@sbw.so>
|
|
||||||
*
|
|
||||||
* Maintainer: sbw <sbw@sbw.so>
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef DOCKPLUGINSCONTROLLER_H
|
|
||||||
#define DOCKPLUGINSCONTROLLER_H
|
|
||||||
|
|
||||||
#include "pluginsitem.h"
|
|
||||||
#include "pluginproxyinterface.h"
|
|
||||||
#include "abstractpluginscontroller.h"
|
|
||||||
|
|
||||||
#include <QPluginLoader>
|
|
||||||
#include <QList>
|
|
||||||
#include <QMap>
|
|
||||||
#include <QDBusConnectionInterface>
|
|
||||||
|
|
||||||
class PluginsItemInterface;
|
|
||||||
class DockPluginsController : public AbstractPluginsController
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit DockPluginsController(QObject *parent = nullptr);
|
|
||||||
~DockPluginsController() override;
|
|
||||||
|
|
||||||
// implements PluginProxyInterface
|
|
||||||
void itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override;
|
|
||||||
void itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey) override;
|
|
||||||
void itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) override;
|
|
||||||
void requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) override;
|
|
||||||
void requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) override;
|
|
||||||
void requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override;
|
|
||||||
QMap<PluginsItemInterface *, QMap<QString, QObject *>> &pluginsMap();
|
|
||||||
|
|
||||||
private:
|
|
||||||
PluginsItem *getPluginItem(PluginsItemInterface * const itemInter, const QString &itemKey) const;
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void pluginItemInserted(PluginsItem *pluginItem) const;
|
|
||||||
void pluginItemRemoved(PluginsItem *pluginItem) const;
|
|
||||||
void pluginItemUpdated(PluginsItem *pluginItem) const;
|
|
||||||
void trayVisableCountChanged(const int &count) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // DOCKPLUGINSCONTROLLER_H
|
|
@ -1,83 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd.
|
|
||||||
*
|
|
||||||
* Author: donghualin <donghualin@uniontech.com>
|
|
||||||
*
|
|
||||||
* Maintainer: donghualin <donghualin@uniontech.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
#include "fixedplugincontroller.h"
|
|
||||||
#include "utils.h"
|
|
||||||
#include "proxyplugincontroller.h"
|
|
||||||
#include "systempluginwindow.h"
|
|
||||||
|
|
||||||
FixedPluginController::FixedPluginController(QObject *parent)
|
|
||||||
: AbstractPluginsController(parent)
|
|
||||||
{
|
|
||||||
setObjectName("FixedPluginController");
|
|
||||||
ProxyPluginController::instance(PluginType::FixedSystemPlugin)->addProxyInterface(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
FixedPluginController::~FixedPluginController()
|
|
||||||
{
|
|
||||||
ProxyPluginController::instance(PluginType::FixedSystemPlugin)->removeProxyInterface(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
void FixedPluginController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey)
|
|
||||||
{
|
|
||||||
StretchPluginsItem *item = new StretchPluginsItem(itemInter, itemKey);
|
|
||||||
m_pluginItems << item;
|
|
||||||
Q_EMIT pluginItemInserted(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
void FixedPluginController::itemUpdate(PluginsItemInterface * const itemInter, const QString &)
|
|
||||||
{
|
|
||||||
for (StretchPluginsItem *item : m_pluginItems) {
|
|
||||||
if (item->pluginInter() == itemInter) {
|
|
||||||
Q_EMIT pluginItemUpdated(item);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void FixedPluginController::itemRemoved(PluginsItemInterface * const itemInter, const QString &)
|
|
||||||
{
|
|
||||||
for (StretchPluginsItem *item : m_pluginItems) {
|
|
||||||
if (item->pluginInter() == itemInter) {
|
|
||||||
m_pluginItems.removeOne(item);
|
|
||||||
Q_EMIT pluginItemRemoved(item);
|
|
||||||
item->deleteLater();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FixedPluginController::needLoad(PluginsItemInterface *itemInter)
|
|
||||||
{
|
|
||||||
ProxyPluginController *controller = ProxyPluginController::instance(itemInter);
|
|
||||||
if (!controller)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
QPluginLoader *pluginLoader = controller->pluginLoader(itemInter);
|
|
||||||
if (!pluginLoader)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// isFixed配置表示该插件在时尚模式下,显示在最右侧的图标,例如关机图标
|
|
||||||
QJsonObject json = pluginLoader->metaData().value("MetaData").toObject();
|
|
||||||
if (json.contains("fixed"))
|
|
||||||
return json.value("fixed").toBool();
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
@ -1,56 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd.
|
|
||||||
*
|
|
||||||
* Author: donghualin <donghualin@uniontech.com>
|
|
||||||
*
|
|
||||||
* Maintainer: donghualin <donghualin@uniontech.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
#ifndef FIXEDPLUGINCONTROLLER_H
|
|
||||||
#define FIXEDPLUGINCONTROLLER_H
|
|
||||||
|
|
||||||
#include "abstractpluginscontroller.h"
|
|
||||||
|
|
||||||
class StretchPluginsItem;
|
|
||||||
|
|
||||||
class FixedPluginController : public AbstractPluginsController
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit FixedPluginController(QObject *parent = nullptr);
|
|
||||||
~FixedPluginController() override;
|
|
||||||
|
|
||||||
Q_SIGNALS:
|
|
||||||
void pluginItemInserted(StretchPluginsItem *);
|
|
||||||
void pluginItemRemoved(StretchPluginsItem *);
|
|
||||||
void pluginItemUpdated(StretchPluginsItem *);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey) override;
|
|
||||||
void itemUpdate(PluginsItemInterface * const itemInter, const QString &) override;
|
|
||||||
void itemRemoved(PluginsItemInterface * const itemInter, const QString &) override;
|
|
||||||
|
|
||||||
void requestWindowAutoHide(PluginsItemInterface * const, const QString &, const bool) override {}
|
|
||||||
void requestRefreshWindowVisible(PluginsItemInterface * const, const QString &) override {}
|
|
||||||
void requestSetAppletVisible(PluginsItemInterface * const, const QString &, const bool) override {}
|
|
||||||
|
|
||||||
bool needLoad(PluginsItemInterface *itemInter) override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
QList<StretchPluginsItem *> m_pluginItems;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // FIXEDPLUGINCONTROLLER_H
|
|
@ -37,39 +37,25 @@ static QStringList getPathFromConf(const QString &key) {
|
|||||||
static QMap<PluginType, QStringList> getPluginPaths()
|
static QMap<PluginType, QStringList> getPluginPaths()
|
||||||
{
|
{
|
||||||
QMap<PluginType, QStringList> plugins;
|
QMap<PluginType, QStringList> plugins;
|
||||||
|
|
||||||
// 添加系统目录
|
|
||||||
{
|
|
||||||
QStringList pluginPaths;
|
|
||||||
#ifdef QT_DEBUG
|
|
||||||
pluginPaths << qApp->applicationDirPath() + "/../plugins";
|
|
||||||
#else
|
|
||||||
pluginPaths << "/usr/lib/dde-dock/plugins";
|
|
||||||
|
|
||||||
const QStringList &pluginsDirs = getPathFromConf("PATH");
|
|
||||||
if (!pluginsDirs.isEmpty())
|
|
||||||
pluginPaths << pluginsDirs;
|
|
||||||
#endif
|
|
||||||
plugins[PluginType::FixedSystemPlugin] = pluginPaths;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 添加快捷插件目录
|
// 添加快捷插件目录
|
||||||
{
|
{
|
||||||
QStringList pluginPaths;
|
QStringList pluginPaths;
|
||||||
#ifdef QT_DEBUG
|
#ifdef QT_DEBUG
|
||||||
pluginPaths << qApp->applicationDirPath() + "/../plugins/quick-trays";
|
pluginPaths << qApp->applicationDirPath() + "/../plugins/quick-trays"
|
||||||
|
<< qApp->applicationDirPath() + "/../plugins";
|
||||||
#else
|
#else
|
||||||
pluginPaths << "/usr/lib/dde-dock/plugins/quick-trays";
|
pluginPaths << "/usr/lib/dde-dock/plugins/quick-trays"
|
||||||
|
<< "/usr/lib/dde-dock/plugins";
|
||||||
|
|
||||||
const QStringList &pluginsDirs = getPathFromConf("QUICK_TRAY_PATH");
|
const QStringList pluginsDirs = (getPathFromConf("QUICK_TRAY_PATH") << getPathFromConf("PATH"));
|
||||||
if (!pluginsDirs.isEmpty())
|
if (!pluginsDirs.isEmpty())
|
||||||
pluginPaths << pluginsDirs;
|
pluginPaths << pluginsDirs;
|
||||||
#endif
|
#endif
|
||||||
plugins[PluginType::QuickPlugin] = pluginPaths;
|
plugins[PluginType::QuickPlugin] = pluginPaths;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加系统插件目录
|
// 添加系统插件目录
|
||||||
{
|
{
|
||||||
QStringList pluginPaths;
|
QStringList pluginPaths;
|
||||||
#ifdef QT_DEBUG
|
#ifdef QT_DEBUG
|
||||||
pluginPaths << qApp->applicationDirPath() + "/../plugins/system-trays";
|
pluginPaths << qApp->applicationDirPath() + "/../plugins/system-trays";
|
||||||
@ -78,7 +64,7 @@ static QMap<PluginType, QStringList> getPluginPaths()
|
|||||||
|
|
||||||
const QStringList &pluginsDirs = getPathFromConf("SYSTEM_TRAY_PATH");
|
const QStringList &pluginsDirs = getPathFromConf("SYSTEM_TRAY_PATH");
|
||||||
if (!pluginsDirs.isEmpty())
|
if (!pluginsDirs.isEmpty())
|
||||||
pluginPaths << pluginsDirs;
|
pluginPaths << pluginsDirs;
|
||||||
#endif
|
#endif
|
||||||
plugins[PluginType::SystemTrays] = pluginPaths;
|
plugins[PluginType::SystemTrays] = pluginPaths;
|
||||||
}
|
}
|
||||||
|
@ -26,8 +26,7 @@
|
|||||||
class PluginsItemInterface;
|
class PluginsItemInterface;
|
||||||
// 加载的插件的类型(1 根目录下的插件 2 快捷设置插件 3 系统插件)
|
// 加载的插件的类型(1 根目录下的插件 2 快捷设置插件 3 系统插件)
|
||||||
enum class PluginType {
|
enum class PluginType {
|
||||||
FixedSystemPlugin = 0,
|
QuickPlugin = 0,
|
||||||
QuickPlugin,
|
|
||||||
SystemTrays
|
SystemTrays
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include "quicksettingitem.h"
|
#include "quicksettingitem.h"
|
||||||
#include "pluginsiteminterface.h"
|
#include "pluginsiteminterface.h"
|
||||||
#include "proxyplugincontroller.h"
|
#include "proxyplugincontroller.h"
|
||||||
|
#include "pluginsitem.h"
|
||||||
|
|
||||||
QuickSettingController::QuickSettingController(QObject *parent)
|
QuickSettingController::QuickSettingController(QObject *parent)
|
||||||
: AbstractPluginsController(parent)
|
: AbstractPluginsController(parent)
|
||||||
@ -35,78 +36,46 @@ QuickSettingController::~QuickSettingController()
|
|||||||
ProxyPluginController::instance(PluginType::QuickPlugin)->removeProxyInterface(this);
|
ProxyPluginController::instance(PluginType::QuickPlugin)->removeProxyInterface(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QuickSettingController::sortPlugins()
|
|
||||||
{
|
|
||||||
QList<QuickSettingItem *> primarySettingItems;
|
|
||||||
QList<QuickSettingItem *> quickItems;
|
|
||||||
for (QuickSettingItem *item : m_quickSettingItems) {
|
|
||||||
if (item->isPrimary())
|
|
||||||
primarySettingItems << item;
|
|
||||||
else
|
|
||||||
quickItems << item;
|
|
||||||
}
|
|
||||||
|
|
||||||
static QStringList existKeys = {"network-item-key", "sound-item-key", "VPN", "PROJECTSCREEN"};
|
|
||||||
qSort(primarySettingItems.begin(), primarySettingItems.end(), [ = ](QuickSettingItem *item1, QuickSettingItem *item2) {
|
|
||||||
int index1 = existKeys.indexOf(item1->itemKey());
|
|
||||||
int index2 = existKeys.indexOf(item2->itemKey());
|
|
||||||
if (index1 >= 0 || index2 >= 0)
|
|
||||||
return index1 < index2;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
|
|
||||||
m_quickSettingItems.clear();
|
|
||||||
m_quickSettingItems << primarySettingItems << quickItems;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QuickSettingController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey)
|
void QuickSettingController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey)
|
||||||
{
|
{
|
||||||
QList<QuickSettingItem *>::iterator findItemIterator = std::find_if(m_quickSettingItems.begin(), m_quickSettingItems.end(),
|
// 根据读取到的metaData数据获取当前插件的类型,提供给外部
|
||||||
[ = ](QuickSettingItem *item) {
|
PluginAttribute pluginClass = PluginAttribute::Quick;
|
||||||
return item->itemKey() == itemKey;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (findItemIterator != m_quickSettingItems.end())
|
|
||||||
return;
|
|
||||||
|
|
||||||
QPluginLoader *pluginLoader = ProxyPluginController::instance(PluginType::QuickPlugin)->pluginLoader(itemInter);
|
QPluginLoader *pluginLoader = ProxyPluginController::instance(PluginType::QuickPlugin)->pluginLoader(itemInter);
|
||||||
QJsonObject metaData;
|
QJsonObject meta;
|
||||||
if (pluginLoader)
|
if (pluginLoader) {
|
||||||
metaData = pluginLoader->metaData().value("MetaData").toObject();
|
meta = pluginLoader->metaData().value("MetaData").toObject();
|
||||||
QuickSettingItem *quickItem = new QuickSettingItem(itemInter, itemKey, metaData);
|
if (meta.contains("tool") && meta.value("tool").toBool())
|
||||||
|
pluginClass = PluginAttribute::Tool;
|
||||||
|
else if (meta.contains("fixed") && meta.value("fixed").toBool())
|
||||||
|
pluginClass = PluginAttribute::Fixed;
|
||||||
|
}
|
||||||
|
|
||||||
m_quickSettingItems << quickItem;
|
m_quickPlugins[pluginClass] << itemInter;
|
||||||
sortPlugins();
|
m_quickPluginsMap[itemInter] = itemKey;
|
||||||
|
|
||||||
emit pluginInserted(quickItem);
|
emit pluginInserted(itemInter, pluginClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QuickSettingController::itemUpdate(PluginsItemInterface * const itemInter, const QString &)
|
void QuickSettingController::itemUpdate(PluginsItemInterface * const itemInter, const QString &)
|
||||||
{
|
{
|
||||||
auto findItemIterator = std::find_if(m_quickSettingItems.begin(), m_quickSettingItems.end(),
|
|
||||||
[ = ](QuickSettingItem *item) {
|
|
||||||
return item->pluginItem() == itemInter;
|
|
||||||
});
|
|
||||||
if (findItemIterator != m_quickSettingItems.end()) {
|
|
||||||
QuickSettingItem *settingItem = *findItemIterator;
|
|
||||||
settingItem->update();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QuickSettingController::itemRemoved(PluginsItemInterface * const itemInter, const QString &)
|
void QuickSettingController::itemRemoved(PluginsItemInterface * const itemInter, const QString &)
|
||||||
{
|
{
|
||||||
// 删除本地记录的插件列表
|
for (auto it = m_quickPlugins.begin(); it != m_quickPlugins.end(); it++) {
|
||||||
QList<QuickSettingItem *>::iterator findItemIterator = std::find_if(m_quickSettingItems.begin(), m_quickSettingItems.end(),
|
QList<PluginsItemInterface *> &plugins = m_quickPlugins[it.key()];
|
||||||
[ = ](QuickSettingItem *item) {
|
if (!plugins.contains(itemInter))
|
||||||
return (item->pluginItem() == itemInter);
|
continue;
|
||||||
});
|
|
||||||
if (findItemIterator != m_quickSettingItems.end()) {
|
plugins.removeOne(itemInter);
|
||||||
QuickSettingItem *quickItem = *findItemIterator;
|
if (plugins.isEmpty())
|
||||||
m_quickSettingItems.removeOne(quickItem);
|
m_quickPlugins.remove(it.key());
|
||||||
Q_EMIT pluginRemoved(quickItem);
|
|
||||||
quickItem->deleteLater();
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_quickPluginsMap.remove(itemInter);
|
||||||
|
Q_EMIT pluginRemoved(itemInter);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QuickSettingController::updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part)
|
void QuickSettingController::updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part)
|
||||||
@ -119,3 +88,32 @@ QuickSettingController *QuickSettingController::instance()
|
|||||||
static QuickSettingController instance;
|
static QuickSettingController instance;
|
||||||
return &instance;
|
return &instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QList<PluginsItemInterface *> QuickSettingController::pluginItems(const PluginAttribute &pluginClass) const
|
||||||
|
{
|
||||||
|
return m_quickPlugins.value(pluginClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString QuickSettingController::itemKey(PluginsItemInterface *pluginItem) const
|
||||||
|
{
|
||||||
|
return m_quickPluginsMap.value(pluginItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
QJsonObject QuickSettingController::metaData(PluginsItemInterface *pluginItem) const
|
||||||
|
{
|
||||||
|
QPluginLoader *pluginLoader = ProxyPluginController::instance(PluginType::QuickPlugin)->pluginLoader(pluginItem);
|
||||||
|
if (!pluginLoader)
|
||||||
|
return QJsonObject();
|
||||||
|
|
||||||
|
return pluginLoader->metaData().value("MetaData").toObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
PluginsItem *QuickSettingController::pluginItemWidget(PluginsItemInterface *pluginItem)
|
||||||
|
{
|
||||||
|
if (m_pluginItemWidgetMap.contains(pluginItem))
|
||||||
|
return m_pluginItemWidgetMap[pluginItem];
|
||||||
|
|
||||||
|
PluginsItem *widget = new PluginsItem(pluginItem, itemKey(pluginItem), metaData(pluginItem));
|
||||||
|
m_pluginItemWidgetMap[pluginItem] = widget;
|
||||||
|
return widget;
|
||||||
|
}
|
||||||
|
@ -24,18 +24,29 @@
|
|||||||
#include "abstractpluginscontroller.h"
|
#include "abstractpluginscontroller.h"
|
||||||
|
|
||||||
class QuickSettingItem;
|
class QuickSettingItem;
|
||||||
|
class PluginsItem;
|
||||||
|
|
||||||
class QuickSettingController : public AbstractPluginsController
|
class QuickSettingController : public AbstractPluginsController
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
enum class PluginAttribute {
|
||||||
|
Quick = 0,
|
||||||
|
Tool,
|
||||||
|
Fixed
|
||||||
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static QuickSettingController *instance();
|
static QuickSettingController *instance();
|
||||||
const QList<QuickSettingItem *> &settingItems() const { return m_quickSettingItems; }
|
QList<PluginsItemInterface *> pluginItems(const PluginAttribute &pluginClass) const;
|
||||||
|
QString itemKey(PluginsItemInterface *pluginItem) const;
|
||||||
|
QJsonObject metaData(PluginsItemInterface *pluginItem) const;
|
||||||
|
PluginsItem *pluginItemWidget(PluginsItemInterface *pluginItem);
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
void pluginInserted(QuickSettingItem *);
|
void pluginInserted(PluginsItemInterface *itemInter, const PluginAttribute &);
|
||||||
void pluginRemoved(QuickSettingItem *);
|
void pluginRemoved(PluginsItemInterface *itemInter);
|
||||||
void pluginUpdated(PluginsItemInterface *, const DockPart &);
|
void pluginUpdated(PluginsItemInterface *, const DockPart &);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -52,10 +63,9 @@ protected:
|
|||||||
void updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) override;
|
void updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void sortPlugins();
|
QMap<PluginAttribute, QList<PluginsItemInterface *>> m_quickPlugins;
|
||||||
|
QMap<PluginsItemInterface *, QString> m_quickPluginsMap;
|
||||||
private:
|
QMap<PluginsItemInterface *, PluginsItem *> m_pluginItemWidgetMap;
|
||||||
QList<QuickSettingItem *> m_quickSettingItems;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CONTAINERPLUGINSCONTROLLER_H
|
#endif // CONTAINERPLUGINSCONTROLLER_H
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include "toolapphelper.h"
|
#include "toolapphelper.h"
|
||||||
#include "dockitem.h"
|
#include "dockitem.h"
|
||||||
#include "pluginsitem.h"
|
#include "pluginsitem.h"
|
||||||
|
#include "quicksettingcontroller.h"
|
||||||
|
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include <QBoxLayout>
|
#include <QBoxLayout>
|
||||||
@ -33,37 +34,23 @@ ToolAppHelper::ToolAppHelper(QWidget *pluginAreaWidget, QWidget *toolAreaWidget,
|
|||||||
, m_displayMode(DisplayMode::Efficient)
|
, m_displayMode(DisplayMode::Efficient)
|
||||||
, m_trashItem(nullptr)
|
, m_trashItem(nullptr)
|
||||||
{
|
{
|
||||||
|
connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginClass) {
|
||||||
|
if (pluginClass != QuickSettingController::PluginAttribute::Tool)
|
||||||
|
return;
|
||||||
|
|
||||||
|
pluginItemAdded(itemInter);
|
||||||
|
});
|
||||||
|
|
||||||
|
QList<PluginsItemInterface *> pluginItems = QuickSettingController::instance()->pluginItems(QuickSettingController::PluginAttribute::Tool);
|
||||||
|
for (PluginsItemInterface *pluginItem : pluginItems)
|
||||||
|
pluginItemAdded(pluginItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ToolAppHelper::setDisplayMode(DisplayMode displayMode)
|
void ToolAppHelper::setDisplayMode(DisplayMode displayMode)
|
||||||
{
|
{
|
||||||
m_displayMode = displayMode;
|
m_displayMode = displayMode;
|
||||||
resetPluginItems();
|
|
||||||
updateWidgetStatus();
|
updateWidgetStatus();
|
||||||
}
|
moveToolWidget();
|
||||||
|
|
||||||
void ToolAppHelper::addPluginItem(int index, DockItem *dockItem)
|
|
||||||
{
|
|
||||||
if (pluginInTool(dockItem))
|
|
||||||
appendToToolArea(index, dockItem);
|
|
||||||
else
|
|
||||||
appendToPluginArea(index, dockItem);
|
|
||||||
|
|
||||||
// 将插件指针顺序保存到列表中
|
|
||||||
if (index >= 0 && index < m_sequentPluginItems.size())
|
|
||||||
m_sequentPluginItems.insert(index, dockItem);
|
|
||||||
else
|
|
||||||
m_sequentPluginItems << dockItem;
|
|
||||||
|
|
||||||
// 保存垃圾箱插件指针
|
|
||||||
PluginsItem *pluginsItem = qobject_cast<PluginsItem *>(dockItem);
|
|
||||||
if (pluginsItem && pluginsItem->pluginName() == "trash")
|
|
||||||
m_trashItem = pluginsItem;
|
|
||||||
|
|
||||||
if (!toolIsVisible())
|
|
||||||
updateWidgetStatus();
|
|
||||||
|
|
||||||
Q_EMIT requestUpdate();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ToolAppHelper::removePluginItem(DockItem *dockItem)
|
void ToolAppHelper::removePluginItem(DockItem *dockItem)
|
||||||
@ -90,23 +77,16 @@ bool ToolAppHelper::toolIsVisible() const
|
|||||||
return m_toolAreaWidget->isVisible();
|
return m_toolAreaWidget->isVisible();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ToolAppHelper::appendToPluginArea(int index, DockItem *dockItem)
|
|
||||||
{
|
|
||||||
// 因为日期时间插件和其他插件的大小有异,为了方便设置边距,在插件区域布局再添加一层布局设置边距
|
|
||||||
// 因此在处理插件图标时,需要通过两层布局判断是否为需要的插件,例如拖动插件位置等判断
|
|
||||||
QBoxLayout *boxLayout = new QBoxLayout(QBoxLayout::LeftToRight, m_pluginAreaWidget);
|
|
||||||
boxLayout->addWidget(dockItem, 0, Qt::AlignCenter);
|
|
||||||
QBoxLayout *pluginLayout = static_cast<QBoxLayout *>(m_pluginAreaWidget->layout());
|
|
||||||
pluginLayout->insertLayout(index, boxLayout, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ToolAppHelper::appendToToolArea(int index, DockItem *dockItem)
|
void ToolAppHelper::appendToToolArea(int index, DockItem *dockItem)
|
||||||
{
|
{
|
||||||
|
dockItem->setParent(m_toolAreaWidget);
|
||||||
QBoxLayout *boxLayout = static_cast<QBoxLayout *>(m_toolAreaWidget->layout());
|
QBoxLayout *boxLayout = static_cast<QBoxLayout *>(m_toolAreaWidget->layout());
|
||||||
if (index >= 0)
|
if (index >= 0)
|
||||||
boxLayout->insertWidget(index, dockItem);
|
boxLayout->insertWidget(index, dockItem);
|
||||||
else
|
else
|
||||||
boxLayout->addWidget(dockItem);
|
boxLayout->addWidget(dockItem);
|
||||||
|
|
||||||
|
Q_EMIT requestUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ToolAppHelper::removePluginArea(DockItem *dockItem)
|
bool ToolAppHelper::removePluginArea(DockItem *dockItem)
|
||||||
@ -141,28 +121,26 @@ bool ToolAppHelper::removeToolArea(DockItem *dockItem)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ToolAppHelper::resetPluginItems()
|
void ToolAppHelper::moveToolWidget()
|
||||||
{
|
{
|
||||||
if (m_displayMode == DisplayMode::Efficient) {
|
for (int i = m_toolAreaWidget->layout()->count() - 1; i >= 0; i--) {
|
||||||
// 高效模式下, 让工具区域的插件移动到插件区域显示
|
QLayoutItem *layoutItem = m_toolAreaWidget->layout()->itemAt(i);
|
||||||
QList<DockItem *> dockItems = dockItemOnWidget(true);
|
if (!layoutItem)
|
||||||
for (DockItem *dockItem : dockItems) {
|
continue;
|
||||||
// 从工具列表中移除插件, 将这些插件放入到插件区域
|
|
||||||
removeToolArea(dockItem);
|
|
||||||
int index = itemIndex(dockItem, false);
|
|
||||||
appendToPluginArea(index, dockItem);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// 时尚模式下,将插件区域对应的插件移动到工具区域
|
|
||||||
QList<DockItem *> dockItems = dockItemOnWidget(false);
|
|
||||||
for (DockItem *dockItem : dockItems) {
|
|
||||||
if (!pluginInTool(dockItem))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// 从插件区域中移除相关插件,并将其插入到工具区域中
|
PluginsItem *pluginWidget = qobject_cast<PluginsItem *>(layoutItem->widget());
|
||||||
removePluginArea(dockItem);
|
if (!pluginWidget)
|
||||||
int index = itemIndex(dockItem, true);
|
continue;
|
||||||
appendToToolArea(index, dockItem);
|
|
||||||
|
m_toolAreaWidget->layout()->removeWidget(pluginWidget);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_displayMode == Dock::DisplayMode::Fashion) {
|
||||||
|
QuickSettingController *quickController = QuickSettingController::instance();
|
||||||
|
QList<PluginsItemInterface *> plugins = quickController->pluginItems(QuickSettingController::PluginAttribute::Tool);
|
||||||
|
for (PluginsItemInterface *plugin : plugins) {
|
||||||
|
PluginsItem *pluginWidget = quickController->pluginItemWidget(plugin);
|
||||||
|
m_toolAreaWidget->layout()->addWidget(pluginWidget);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -186,9 +164,6 @@ void ToolAppHelper::updateWidgetStatus()
|
|||||||
|
|
||||||
bool ToolAppHelper::pluginInTool(DockItem *dockItem) const
|
bool ToolAppHelper::pluginInTool(DockItem *dockItem) const
|
||||||
{
|
{
|
||||||
if (m_displayMode != DisplayMode::Fashion)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
PluginsItem *pluginItem = qobject_cast<PluginsItem *>(dockItem);
|
PluginsItem *pluginItem = qobject_cast<PluginsItem *>(dockItem);
|
||||||
if (!pluginItem)
|
if (!pluginItem)
|
||||||
return false;
|
return false;
|
||||||
@ -238,19 +213,55 @@ QList<DockItem *> ToolAppHelper::dockItemOnWidget(bool isTool) const
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
QBoxLayout *pluginLayout = static_cast<QBoxLayout *>(m_pluginAreaWidget->layout());
|
QBoxLayout *pluginLayout = static_cast<QBoxLayout *>(m_pluginAreaWidget->layout());
|
||||||
for (int i = 0; i < pluginLayout->count(); ++i) {
|
if (pluginLayout) {
|
||||||
QLayoutItem *layoutItem = pluginLayout->itemAt(i);
|
for (int i = 0; i < pluginLayout->count(); ++i) {
|
||||||
QLayout *boxLayout = layoutItem->layout();
|
QLayoutItem *layoutItem = pluginLayout->itemAt(i);
|
||||||
if (!boxLayout)
|
QLayout *boxLayout = layoutItem->layout();
|
||||||
continue;
|
if (!boxLayout)
|
||||||
|
continue;
|
||||||
|
|
||||||
DockItem *dockItem = qobject_cast<DockItem *>(boxLayout->itemAt(0)->widget());
|
DockItem *dockItem = qobject_cast<DockItem *>(boxLayout->itemAt(0)->widget());
|
||||||
if (!dockItem)
|
if (!dockItem)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
dockItems << dockItem;
|
dockItems << dockItem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return dockItems;
|
return dockItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ToolAppHelper::pluginItemAdded(PluginsItemInterface *itemInter)
|
||||||
|
{
|
||||||
|
if (m_displayMode != Dock::DisplayMode::Fashion || pluginExists(itemInter))
|
||||||
|
return;
|
||||||
|
|
||||||
|
QuickSettingController *quickController = QuickSettingController::instance();
|
||||||
|
PluginsItem *pluginItem = quickController->pluginItemWidget(itemInter);
|
||||||
|
if (pluginInTool(pluginItem))
|
||||||
|
appendToToolArea(0, pluginItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ToolAppHelper::pluginExists(PluginsItemInterface *itemInter) const
|
||||||
|
{
|
||||||
|
QBoxLayout *boxLayout = static_cast<QBoxLayout *>(m_toolAreaWidget->layout());
|
||||||
|
if (!boxLayout)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (int i = 0; i < boxLayout->count() ; i++) {
|
||||||
|
QLayoutItem *layoutItem = boxLayout->itemAt(i);
|
||||||
|
if (!layoutItem)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
PluginsItem *pluginItem = qobject_cast<PluginsItem *>(layoutItem->widget());
|
||||||
|
if (!pluginItem)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// 如果当前的插件的接口已经存在,则无需再次插入
|
||||||
|
if (pluginItem->pluginItem() == itemInter)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
class QWidget;
|
class QWidget;
|
||||||
class DockItem;
|
class DockItem;
|
||||||
class PluginsItem;
|
class PluginsItem;
|
||||||
|
class PluginsItemInterface;
|
||||||
|
|
||||||
using namespace Dock;
|
using namespace Dock;
|
||||||
|
|
||||||
@ -40,7 +41,6 @@ public:
|
|||||||
explicit ToolAppHelper(QWidget *pluginAreaWidget, QWidget *toolAreaWidget, QObject *parent = nullptr);
|
explicit ToolAppHelper(QWidget *pluginAreaWidget, QWidget *toolAreaWidget, QObject *parent = nullptr);
|
||||||
|
|
||||||
void setDisplayMode(DisplayMode displayMode);
|
void setDisplayMode(DisplayMode displayMode);
|
||||||
void addPluginItem(int index, DockItem *dockItem);
|
|
||||||
void removePluginItem(DockItem *dockItem);
|
void removePluginItem(DockItem *dockItem);
|
||||||
PluginsItem *trashPlugin() const;
|
PluginsItem *trashPlugin() const;
|
||||||
bool toolIsVisible() const;
|
bool toolIsVisible() const;
|
||||||
@ -50,16 +50,17 @@ Q_SIGNALS:
|
|||||||
void toolVisibleChanged(bool);
|
void toolVisibleChanged(bool);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void appendToPluginArea(int index, DockItem *dockItem);
|
|
||||||
void appendToToolArea(int index, DockItem *dockItem);
|
void appendToToolArea(int index, DockItem *dockItem);
|
||||||
bool removePluginArea(DockItem *dockItem);
|
bool removePluginArea(DockItem *dockItem);
|
||||||
bool removeToolArea(DockItem *dockItem);
|
bool removeToolArea(DockItem *dockItem);
|
||||||
|
void moveToolWidget();
|
||||||
|
|
||||||
void resetPluginItems();
|
|
||||||
void updateWidgetStatus();
|
void updateWidgetStatus();
|
||||||
bool pluginInTool(DockItem *dockItem) const;
|
bool pluginInTool(DockItem *dockItem) const;
|
||||||
int itemIndex(DockItem *dockItem, bool isTool) const;
|
int itemIndex(DockItem *dockItem, bool isTool) const;
|
||||||
QList<DockItem *> dockItemOnWidget(bool isTool) const;
|
QList<DockItem *> dockItemOnWidget(bool isTool) const;
|
||||||
|
void pluginItemAdded(PluginsItemInterface *itemInter);
|
||||||
|
bool pluginExists(PluginsItemInterface *itemInter) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QWidget *m_pluginAreaWidget;
|
QWidget *m_pluginAreaWidget;
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include "dockitemmanager.h"
|
#include "dockitemmanager.h"
|
||||||
#include "windowmanager.h"
|
#include "windowmanager.h"
|
||||||
#include "proxyplugincontroller.h"
|
#include "proxyplugincontroller.h"
|
||||||
|
#include "pluginsitem.h"
|
||||||
|
|
||||||
#include <QScreen>
|
#include <QScreen>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
@ -26,12 +26,14 @@
|
|||||||
#include "pluginsiteminterface.h"
|
#include "pluginsiteminterface.h"
|
||||||
|
|
||||||
class QGSettings;
|
class QGSettings;
|
||||||
|
|
||||||
class PluginsItem : public DockItem
|
class PluginsItem : public DockItem
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
|
friend class QuickSettingController;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit PluginsItem(PluginsItemInterface *const pluginInter, const QString &itemKey, const QJsonObject &jsonData, QWidget *parent = nullptr);
|
|
||||||
~PluginsItem() override;
|
~PluginsItem() override;
|
||||||
|
|
||||||
int itemSortKey() const;
|
int itemSortKey() const;
|
||||||
@ -58,6 +60,9 @@ public:
|
|||||||
public slots:
|
public slots:
|
||||||
void refreshIcon() override;
|
void refreshIcon() override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
explicit PluginsItem(PluginsItemInterface *const pluginInter, const QString &itemKey, const QJsonObject &jsonData, QWidget *parent = nullptr);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void onGSettingsChanged(const QString &key);
|
void onGSettingsChanged(const QString &key);
|
||||||
|
|
||||||
|
@ -28,6 +28,8 @@
|
|||||||
|
|
||||||
#include <QIcon>
|
#include <QIcon>
|
||||||
#include <QPainterPath>
|
#include <QPainterPath>
|
||||||
|
#include <QPushButton>
|
||||||
|
#include <QFontMetrics>
|
||||||
|
|
||||||
#define ICONWIDTH 24
|
#define ICONWIDTH 24
|
||||||
#define ICONHEIGHT 24
|
#define ICONHEIGHT 24
|
||||||
@ -48,7 +50,13 @@ QuickSettingItem::QuickSettingItem(PluginsItemInterface *const pluginInter, cons
|
|||||||
, m_pluginInter(pluginInter)
|
, m_pluginInter(pluginInter)
|
||||||
, m_itemKey(itemKey)
|
, m_itemKey(itemKey)
|
||||||
, m_metaData(metaData)
|
, m_metaData(metaData)
|
||||||
|
, m_iconWidgetParent(new QWidget(this))
|
||||||
|
, m_iconWidget(new QuickIconWidget(pluginInter, itemKey, isPrimary(), m_iconWidgetParent))
|
||||||
|
, m_textWidget(new QWidget(this))
|
||||||
|
, m_nameLabel(new QLabel(m_textWidget))
|
||||||
|
, m_stateLabel(new QLabel(m_textWidget))
|
||||||
{
|
{
|
||||||
|
initUi();
|
||||||
setAcceptDrops(true);
|
setAcceptDrops(true);
|
||||||
this->installEventFilter(this);
|
this->installEventFilter(this);
|
||||||
}
|
}
|
||||||
@ -57,6 +65,32 @@ QuickSettingItem::~QuickSettingItem()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool QuickSettingItem::eventFilter(QObject *obj, QEvent *event)
|
||||||
|
{
|
||||||
|
if (event->type() == QEvent::MouseButtonRelease) {
|
||||||
|
if (obj->objectName() == "expandLabel") {
|
||||||
|
// 如果是鼠标的按下事件
|
||||||
|
if (isPrimary())
|
||||||
|
Q_EMIT detailClicked(m_pluginInter);
|
||||||
|
} else if (obj == this) {
|
||||||
|
const QString &command = m_pluginInter->itemCommand(m_itemKey);
|
||||||
|
if (!command.isEmpty())
|
||||||
|
QProcess::startDetached(command);
|
||||||
|
|
||||||
|
if (QWidget *w = m_pluginInter->itemPopupApplet(m_itemKey))
|
||||||
|
showPopupApplet(w);
|
||||||
|
}
|
||||||
|
} else if (event->type() == QEvent::Resize) {
|
||||||
|
if (obj == m_nameLabel) {
|
||||||
|
m_nameLabel->setText(QFontMetrics(m_nameLabel->font()).elidedText(m_pluginInter->pluginDisplayName(), Qt::TextElideMode::ElideRight, m_nameLabel->width()));
|
||||||
|
} else if (obj == m_stateLabel) {
|
||||||
|
m_stateLabel->setText(QFontMetrics(m_stateLabel->font()).elidedText(m_pluginInter->description(), Qt::TextElideMode::ElideRight, m_stateLabel->width()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return DockItem::eventFilter(obj, event);
|
||||||
|
}
|
||||||
|
|
||||||
PluginsItemInterface *QuickSettingItem::pluginItem() const
|
PluginsItemInterface *QuickSettingItem::pluginItem() const
|
||||||
{
|
{
|
||||||
return m_pluginInter;
|
return m_pluginInter;
|
||||||
@ -114,84 +148,9 @@ void QuickSettingItem::paintEvent(QPaintEvent *e)
|
|||||||
QPainterPath path;
|
QPainterPath path;
|
||||||
path.addRoundedRect(rect(), RADIUS, RADIUS);
|
path.addRoundedRect(rect(), RADIUS, RADIUS);
|
||||||
painter.setClipPath(path);
|
painter.setClipPath(path);
|
||||||
|
|
||||||
// 绘制背景色
|
// 绘制背景色
|
||||||
DPalette dpa = DPaletteHelper::instance()->palette(this);
|
DPalette dpa = DPaletteHelper::instance()->palette(this);
|
||||||
painter.fillRect(rect(), dpa.brush(DPalette::ColorRole::Mid));
|
painter.fillRect(rect(), Qt::white);
|
||||||
// 让图标填上前景色
|
|
||||||
int pixmapWidth = static_cast<int>(ICONWIDTH * qApp->devicePixelRatio());
|
|
||||||
int pixmapHeight = static_cast<int>(ICONHEIGHT * qApp->devicePixelRatio());
|
|
||||||
QIcon icon = m_pluginInter->icon(DockPart::QuickPanel);
|
|
||||||
QList<QSize> iconSizes = icon.availableSizes();
|
|
||||||
if (iconSizes.size() > 0) {
|
|
||||||
QSize size = iconSizes[0];
|
|
||||||
if (size.isValid() && !size.isEmpty() && !size.isNull()) {
|
|
||||||
pixmapWidth = size.width();
|
|
||||||
pixmapHeight = size.height();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
QPixmap pm = icon.pixmap(pixmapWidth, pixmapHeight);
|
|
||||||
QPainter pa(&pm);
|
|
||||||
pa.setCompositionMode(QPainter::CompositionMode_SourceIn);
|
|
||||||
pa.fillRect(pm.rect(), painter.pen().brush());
|
|
||||||
if (isPrimary()) {
|
|
||||||
// 如果是主图标,则显示阴影背景
|
|
||||||
int marginYSpace = yMarginSpace();
|
|
||||||
QRect iconBg(MARGINLEFTSPACE, marginYSpace, BGSIZE, BGSIZE);
|
|
||||||
painter.save();
|
|
||||||
painter.setPen(Qt::NoPen);
|
|
||||||
painter.setBrush(dpa.brush(DPalette::ColorRole::Midlight));
|
|
||||||
painter.drawEllipse(iconBg);
|
|
||||||
painter.restore();
|
|
||||||
QRect rctIcon(iconBg.x() + (iconBg.width() - pixmapWidth) / 2,
|
|
||||||
iconBg.y() + (iconBg.height() - pixmapHeight) / 2,
|
|
||||||
pixmapWidth, pixmapHeight);
|
|
||||||
painter.drawPixmap(rctIcon, pm);
|
|
||||||
// 绘制文字
|
|
||||||
painter.setPen(Qt::black);
|
|
||||||
|
|
||||||
QRect rctPluginName(iconBg.right() + 10, iconBg.top(), BGWIDTH - BGSIZE - OPENICONSIZE - 10 * 2, BGSIZE / 2);
|
|
||||||
QFont font = DFontSizeManager::instance()->t6();
|
|
||||||
font.setBold(true);
|
|
||||||
painter.setFont(font);
|
|
||||||
QTextOption textOption;
|
|
||||||
textOption.setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
|
|
||||||
QString displayName = QFontMetrics(font).elidedText(m_pluginInter->pluginDisplayName(), Qt::TextElideMode::ElideRight, rctPluginName.width());
|
|
||||||
painter.drawText(rctPluginName, displayName, textOption);
|
|
||||||
// 绘制下方啊的状态文字
|
|
||||||
QRect rctPluginStatus(rctPluginName.x(), rctPluginName.bottom() + 1,
|
|
||||||
rctPluginName.width(), BGSIZE / 2);
|
|
||||||
font = DFontSizeManager::instance()->t10();
|
|
||||||
painter.setFont(font);
|
|
||||||
QString description = QFontMetrics(font).elidedText(m_pluginInter->description(), Qt::TextElideMode::ElideRight, rctPluginStatus.width());
|
|
||||||
painter.drawText(rctPluginStatus, description, textOption);
|
|
||||||
// 绘制右侧的展开按钮
|
|
||||||
QPixmap expandPixmap = ImageUtil::loadSvg(expandFileName(), expandSize);
|
|
||||||
int iconRight = rect().width() - MARGINRIGHTSPACE;
|
|
||||||
QRect rectOfExpand(iconRight - expandSize.width(),
|
|
||||||
(rctIcon.y() + (rctIcon.height() - expandSize.height()) / 2),
|
|
||||||
expandSize.width(), expandSize.height());
|
|
||||||
painter.drawPixmap(rectOfExpand, expandPixmap);
|
|
||||||
} else {
|
|
||||||
// 绘制图标
|
|
||||||
QRect rctIcon = iconRect();
|
|
||||||
painter.drawPixmap(rctIcon, pm);
|
|
||||||
// 绘制文字
|
|
||||||
QFont ft;
|
|
||||||
ft.setPixelSize(FONTSIZE);
|
|
||||||
painter.setFont(ft);
|
|
||||||
QTextOption option;
|
|
||||||
option.setAlignment(Qt::AlignTop | Qt::AlignHCenter);
|
|
||||||
painter.drawText(QRect(QPoint(0, rctIcon.top() + ICONHEIGHT + ICONSPACE),
|
|
||||||
QPoint(width(), height())), m_pluginInter->pluginDisplayName(), option);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QRect QuickSettingItem::iconRect()
|
|
||||||
{
|
|
||||||
int left = (width() - ICONWIDTH) / 2;
|
|
||||||
int top = (height() - ICONHEIGHT - ICONSPACE - 10) / 2;
|
|
||||||
return QRect(left, top, ICONWIDTH, ICONHEIGHT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QColor QuickSettingItem::foregroundColor() const
|
QColor QuickSettingItem::foregroundColor() const
|
||||||
@ -207,31 +166,96 @@ QColor QuickSettingItem::foregroundColor() const
|
|||||||
return dpa.color(DPalette::ColorGroup::Normal, DPalette::ColorRole::Text);
|
return dpa.color(DPalette::ColorGroup::Normal, DPalette::ColorRole::Text);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QuickSettingItem::mouseReleaseEvent(QMouseEvent *event)
|
void QuickSettingItem::initUi()
|
||||||
{
|
{
|
||||||
// 如果是鼠标的按下事件
|
|
||||||
if (isPrimary()) {
|
if (isPrimary()) {
|
||||||
QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
|
// 如果是占用两排的插件,则用横向Layout
|
||||||
QRect rctExpand(rect().width() - MARGINRIGHTSPACE - expandSize.width(),
|
QHBoxLayout *mainLayout = new QHBoxLayout(this);
|
||||||
(rect().height() - expandSize.height()) / 2,
|
mainLayout->setContentsMargins(10, 0, 10, 0);
|
||||||
expandSize.width(), expandSize.height());
|
mainLayout->setSpacing(0);
|
||||||
if (rctExpand.contains(mapFromGlobal(mouseEvent->globalPos())))
|
mainLayout->addStretch(10);
|
||||||
Q_EMIT detailClicked(m_pluginInter);
|
mainLayout->setAlignment(Qt::AlignCenter);
|
||||||
|
// 添加图标
|
||||||
|
QVBoxLayout *iconLayout = new QVBoxLayout(m_iconWidgetParent);
|
||||||
|
iconLayout->setContentsMargins(0, 0, 0, 0);
|
||||||
|
iconLayout->setSpacing(0);
|
||||||
|
iconLayout->setAlignment(Qt::AlignCenter);
|
||||||
|
m_iconWidget->setFixedSize(BGSIZE, BGSIZE);
|
||||||
|
iconLayout->addWidget(m_iconWidget);
|
||||||
|
mainLayout->addWidget(m_iconWidgetParent);
|
||||||
|
mainLayout->addSpacing(10);
|
||||||
|
// 添加中间的名称部分
|
||||||
|
QFont nameFont = DFontSizeManager::instance()->t6();
|
||||||
|
nameFont.setBold(true);
|
||||||
|
QPalette pe;
|
||||||
|
pe.setColor(QPalette::WindowText, Qt::black);
|
||||||
|
m_nameLabel->setPalette(pe);
|
||||||
|
m_stateLabel->setPalette(pe);
|
||||||
|
m_nameLabel->setFont(nameFont);
|
||||||
|
m_stateLabel->setFont(DFontSizeManager::instance()->t10());
|
||||||
|
m_nameLabel->setText(m_pluginInter->pluginDisplayName());
|
||||||
|
m_stateLabel->setText(m_pluginInter->description());
|
||||||
|
m_nameLabel->installEventFilter(this);
|
||||||
|
m_stateLabel->installEventFilter(this);
|
||||||
|
QVBoxLayout *textLayout = new QVBoxLayout(m_textWidget);
|
||||||
|
textLayout->setContentsMargins(0, 0, 0, 0);
|
||||||
|
textLayout->setSpacing(0);
|
||||||
|
textLayout->addWidget(m_nameLabel);
|
||||||
|
textLayout->addWidget(m_stateLabel);
|
||||||
|
textLayout->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
|
||||||
|
mainLayout->addWidget(m_textWidget);
|
||||||
|
|
||||||
|
// 添加右侧的展开按钮
|
||||||
|
QWidget *expandWidgetParent = new QWidget(this);
|
||||||
|
QVBoxLayout *expandLayout = new QVBoxLayout(expandWidgetParent);
|
||||||
|
expandLayout->setSpacing(0);
|
||||||
|
QLabel *expandLabel = new QLabel(expandWidgetParent);
|
||||||
|
expandLabel->setObjectName("expandLabel");
|
||||||
|
expandLabel->setPixmap(QPixmap(expandFileName()));
|
||||||
|
expandLabel->setFixedSize(expandSize);
|
||||||
|
expandLabel->setAutoFillBackground(true);
|
||||||
|
expandLabel->installEventFilter(this);
|
||||||
|
expandLayout->addWidget(expandLabel);
|
||||||
|
pe.setBrush(QPalette::Window, Qt::transparent);
|
||||||
|
expandLabel->setPalette(pe);
|
||||||
|
|
||||||
|
mainLayout->addWidget(expandWidgetParent);
|
||||||
} else {
|
} else {
|
||||||
const QString command = m_pluginInter->itemCommand(m_itemKey);
|
QHBoxLayout *iconLayout = new QHBoxLayout(m_iconWidgetParent);
|
||||||
if (!command.isEmpty())
|
iconLayout->setContentsMargins(0, 0, 0, 0);
|
||||||
QProcess::startDetached(command);
|
iconLayout->setSpacing(0);
|
||||||
|
iconLayout->setAlignment(Qt::AlignHCenter);
|
||||||
|
|
||||||
if (QWidget *w = m_pluginInter->itemPopupApplet(m_itemKey))
|
m_iconWidgetParent->setFixedHeight(ICONHEIGHT);
|
||||||
showPopupApplet(w);
|
m_iconWidget->setFixedSize(ICONWIDTH, ICONHEIGHT);
|
||||||
|
iconLayout->addWidget(m_iconWidget);
|
||||||
|
|
||||||
|
QVBoxLayout *mainLayout = new QVBoxLayout(this);
|
||||||
|
mainLayout->setContentsMargins(0, 10, 0, 10);
|
||||||
|
mainLayout->setSpacing(7);
|
||||||
|
mainLayout->setAlignment(Qt::AlignCenter);
|
||||||
|
// 添加上方的图标
|
||||||
|
mainLayout->addWidget(m_iconWidgetParent);
|
||||||
|
|
||||||
|
// 添加下方的文字
|
||||||
|
QHBoxLayout *textLayout = new QHBoxLayout(m_textWidget);
|
||||||
|
textLayout->setAlignment(Qt::AlignCenter);
|
||||||
|
textLayout->setContentsMargins(0, 0, 0, 0);
|
||||||
|
textLayout->setSpacing(0);
|
||||||
|
QFont nameFont = DFontSizeManager::instance()->t10();
|
||||||
|
QPalette pe;
|
||||||
|
pe.setColor(QPalette::WindowText, Qt::black);
|
||||||
|
m_nameLabel->setFont(nameFont);
|
||||||
|
m_nameLabel->setPalette(pe);
|
||||||
|
m_nameLabel->setText(m_pluginInter->pluginDisplayName());
|
||||||
|
textLayout->addWidget(m_nameLabel);
|
||||||
|
m_stateLabel->setVisible(false);
|
||||||
|
m_textWidget->setFixedHeight(11);
|
||||||
|
mainLayout->addWidget(m_textWidget);
|
||||||
|
installEventFilter(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int QuickSettingItem::yMarginSpace()
|
|
||||||
{
|
|
||||||
return (rect().height() - BGSIZE) / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString QuickSettingItem::expandFileName()
|
QString QuickSettingItem::expandFileName()
|
||||||
{
|
{
|
||||||
if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType)
|
if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType)
|
||||||
@ -239,3 +263,112 @@ QString QuickSettingItem::expandFileName()
|
|||||||
|
|
||||||
return QString(":/icons/resources/arrow-right.svg");
|
return QString(":/icons/resources/arrow-right.svg");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QPixmap QuickSettingItem::pluginIcon() const
|
||||||
|
{
|
||||||
|
QIcon icon = m_pluginInter->icon(DockPart::QuickPanel);
|
||||||
|
if (icon.isNull()) {
|
||||||
|
// 如果图标为空,就使用itemWidget的截图作为它的图标,这种一般是适用于老版本插件或者没有实现v23接口的插件
|
||||||
|
QWidget *itemWidget = m_pluginInter->itemWidget(m_itemKey);
|
||||||
|
itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT);
|
||||||
|
QPixmap grabPixmap = itemWidget->grab();
|
||||||
|
return grabPixmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取icon接口返回的图标
|
||||||
|
int pixmapWidth = width();
|
||||||
|
int pixmapHeight = height();
|
||||||
|
QList<QSize> iconSizes = icon.availableSizes();
|
||||||
|
if (iconSizes.size() > 0) {
|
||||||
|
QSize size = iconSizes[0];
|
||||||
|
if (size.isValid() && !size.isEmpty() && !size.isNull()) {
|
||||||
|
pixmapWidth = size.width();
|
||||||
|
pixmapHeight = size.height();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return icon.pixmap(pixmapWidth, pixmapHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief QuickIconWidget::QuickIconWidget
|
||||||
|
* @param pluginInter
|
||||||
|
* @param parent
|
||||||
|
* 图标的widget
|
||||||
|
*/
|
||||||
|
QuickIconWidget::QuickIconWidget(PluginsItemInterface *pluginInter, const QString &itemKey, bool isPrimary, QWidget *parent)
|
||||||
|
: QWidget(parent)
|
||||||
|
, m_pluginInter(pluginInter)
|
||||||
|
, m_itemKey(itemKey)
|
||||||
|
, m_isPrimary(isPrimary)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void QuickIconWidget::paintEvent(QPaintEvent *event)
|
||||||
|
{
|
||||||
|
QWidget::paintEvent(event);
|
||||||
|
QPixmap pm = pluginIcon();
|
||||||
|
|
||||||
|
QPainter painter(this);
|
||||||
|
painter.setRenderHint(QPainter::RenderHint::Antialiasing);
|
||||||
|
painter.setPen(foregroundColor());
|
||||||
|
|
||||||
|
if (m_isPrimary) {
|
||||||
|
DPalette dpa = DPaletteHelper::instance()->palette(this);
|
||||||
|
QPainter pa(&pm);
|
||||||
|
pa.setCompositionMode(QPainter::CompositionMode_SourceIn);
|
||||||
|
pa.fillRect(pm.rect(), painter.pen().brush());
|
||||||
|
// 如果是主图标,则显示阴影背景
|
||||||
|
painter.save();
|
||||||
|
painter.setPen(Qt::NoPen);
|
||||||
|
painter.setBrush(dpa.brush(DPalette::ColorRole::Midlight));
|
||||||
|
painter.drawEllipse(rect());
|
||||||
|
painter.restore();
|
||||||
|
QRect rctIcon((rect().width() - pm.width()) / 2, (rect().height() - pm.height()) / 2, pm.width(), pm.height());
|
||||||
|
painter.drawPixmap(rctIcon, pm);
|
||||||
|
} else {
|
||||||
|
QRect rctIcon(0, 0, pm.width(), pm.height());
|
||||||
|
painter.drawPixmap(rctIcon, pm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QColor QuickIconWidget::foregroundColor() const
|
||||||
|
{
|
||||||
|
DPalette dpa = DPaletteHelper::instance()->palette(this);
|
||||||
|
// 此处的颜色是临时获取的,后期需要和设计师确认,改成正规的颜色
|
||||||
|
if (m_pluginInter->status() == PluginsItemInterface::PluginStatus::Active)
|
||||||
|
return dpa.color(DPalette::ColorGroup::Active, DPalette::ColorRole::Text);
|
||||||
|
|
||||||
|
if (m_pluginInter->status() == PluginsItemInterface::PluginStatus::Deactive)
|
||||||
|
return dpa.color(DPalette::ColorGroup::Disabled, DPalette::ColorRole::Text);
|
||||||
|
|
||||||
|
return dpa.color(DPalette::ColorGroup::Normal, DPalette::ColorRole::Text);
|
||||||
|
}
|
||||||
|
|
||||||
|
QPixmap QuickIconWidget::pluginIcon() const
|
||||||
|
{
|
||||||
|
QIcon icon = m_pluginInter->icon(DockPart::QuickPanel);
|
||||||
|
if (icon.isNull()) {
|
||||||
|
// 如果图标为空,就使用itemWidget的截图作为它的图标,这种一般是适用于老版本插件或者没有实现v23接口的插件
|
||||||
|
QWidget *itemWidget = m_pluginInter->itemWidget(m_itemKey);
|
||||||
|
if (itemWidget) {
|
||||||
|
itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT);
|
||||||
|
return itemWidget->grab();
|
||||||
|
}
|
||||||
|
return QPixmap();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取icon接口返回的图标
|
||||||
|
int pixmapWidth = width();
|
||||||
|
int pixmapHeight = height();
|
||||||
|
QList<QSize> iconSizes = icon.availableSizes();
|
||||||
|
if (iconSizes.size() > 0) {
|
||||||
|
QSize size = iconSizes[0];
|
||||||
|
if (size.isValid() && !size.isEmpty() && !size.isNull()) {
|
||||||
|
pixmapWidth = size.width();
|
||||||
|
pixmapHeight = size.height();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return icon.pixmap(pixmapWidth, pixmapHeight);
|
||||||
|
}
|
||||||
|
@ -24,17 +24,18 @@
|
|||||||
#include "dockitem.h"
|
#include "dockitem.h"
|
||||||
|
|
||||||
class PluginsItemInterface;
|
class PluginsItemInterface;
|
||||||
|
class QuickIconWidget;
|
||||||
|
|
||||||
class QuickSettingItem : public DockItem
|
class QuickSettingItem : public DockItem
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
friend class QuickSettingController;
|
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
void detailClicked(PluginsItemInterface *);
|
void detailClicked(PluginsItemInterface *);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
QuickSettingItem(PluginsItemInterface *const pluginInter, const QString &itemKey, const QJsonObject &metaData, QWidget *parent = nullptr);
|
||||||
|
~QuickSettingItem() override;
|
||||||
PluginsItemInterface *pluginItem() const;
|
PluginsItemInterface *pluginItem() const;
|
||||||
ItemType itemType() const override;
|
ItemType itemType() const override;
|
||||||
const QPixmap dragPixmap();
|
const QPixmap dragPixmap();
|
||||||
@ -42,23 +43,49 @@ public:
|
|||||||
bool isPrimary() const;
|
bool isPrimary() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
QuickSettingItem(PluginsItemInterface *const pluginInter, const QString &itemKey, const QJsonObject &metaData, QWidget *parent = nullptr);
|
|
||||||
~QuickSettingItem() override;
|
|
||||||
|
|
||||||
|
bool eventFilter(QObject *obj, QEvent *event) override;
|
||||||
void paintEvent(QPaintEvent *e) override;
|
void paintEvent(QPaintEvent *e) override;
|
||||||
QRect iconRect();
|
|
||||||
QColor foregroundColor() const;
|
QColor foregroundColor() const;
|
||||||
|
|
||||||
void mouseReleaseEvent(QMouseEvent *event) override;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int yMarginSpace();
|
void initUi();
|
||||||
QString expandFileName();
|
QString expandFileName();
|
||||||
|
QPixmap pluginIcon() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
PluginsItemInterface *m_pluginInter;
|
PluginsItemInterface *m_pluginInter;
|
||||||
QString m_itemKey;
|
QString m_itemKey;
|
||||||
QJsonObject m_metaData;
|
QJsonObject m_metaData;
|
||||||
|
QWidget *m_iconWidgetParent;
|
||||||
|
QuickIconWidget *m_iconWidget;
|
||||||
|
QWidget *m_textWidget;
|
||||||
|
QLabel *m_nameLabel;
|
||||||
|
QLabel *m_stateLabel;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The QuickIconWidget class
|
||||||
|
* 图标的Widget
|
||||||
|
*/
|
||||||
|
class QuickIconWidget : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit QuickIconWidget(PluginsItemInterface *pluginInter, const QString &itemKey, bool isPrimary, QWidget *parent = Q_NULLPTR);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void paintEvent(QPaintEvent *event) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
QColor foregroundColor() const;
|
||||||
|
QPixmap pluginIcon() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
PluginsItemInterface *m_pluginInter;
|
||||||
|
QString m_itemKey;
|
||||||
|
bool m_isPrimary;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // QUICKSETTINGITEM_H
|
#endif // QUICKSETTINGITEM_H
|
||||||
|
@ -42,7 +42,7 @@ static QMap<int, QString> dateFormat{{ 0,"yyyy/M/d" }, { 1,"yyyy-M-d" }, { 2,"yy
|
|||||||
{ 4,"yyyy-MM-dd" }, { 5,"yyyy.MM.dd" }, { 6,"yy/M/d" }, { 7,"yy-M-d" }, { 8,"yy.M.d" }};
|
{ 4,"yyyy-MM-dd" }, { 5,"yyyy.MM.dd" }, { 6,"yy/M/d" }, { 7,"yy-M-d" }, { 8,"yy.M.d" }};
|
||||||
static QMap<int, QString> timeFormat{{0, "h:mm"}, {1, "hh:mm"}};
|
static QMap<int, QString> timeFormat{{0, "h:mm"}, {1, "hh:mm"}};
|
||||||
|
|
||||||
DateTimeDisplayer::DateTimeDisplayer(QWidget *parent)
|
DateTimeDisplayer::DateTimeDisplayer(bool showMultiRow, QWidget *parent)
|
||||||
: QWidget (parent)
|
: QWidget (parent)
|
||||||
, m_timedateInter(new Timedate("org.deepin.daemon.Timedate1", "/org/deepin/daemon/Timedate1", QDBusConnection::sessionBus(), this))
|
, m_timedateInter(new Timedate("org.deepin.daemon.Timedate1", "/org/deepin/daemon/Timedate1", QDBusConnection::sessionBus(), this))
|
||||||
, m_position(Dock::Position::Bottom)
|
, m_position(Dock::Position::Bottom)
|
||||||
@ -52,6 +52,7 @@ DateTimeDisplayer::DateTimeDisplayer(QWidget *parent)
|
|||||||
, m_tipsTimer(new QTimer(this))
|
, m_tipsTimer(new QTimer(this))
|
||||||
, m_currentSize(0)
|
, m_currentSize(0)
|
||||||
, m_oneRow(false)
|
, m_oneRow(false)
|
||||||
|
, m_showMultiRow(showMultiRow)
|
||||||
{
|
{
|
||||||
m_tipPopupWindow.reset(new DockPopupWindow);
|
m_tipPopupWindow.reset(new DockPopupWindow);
|
||||||
// 日期格式变化的时候,需要重绘
|
// 日期格式变化的时候,需要重绘
|
||||||
@ -131,12 +132,16 @@ QSize DateTimeDisplayer::suitableSize() const
|
|||||||
QSize DateTimeDisplayer::suitableSize(const Dock::Position &position) const
|
QSize DateTimeDisplayer::suitableSize(const Dock::Position &position) const
|
||||||
{
|
{
|
||||||
DateTimeInfo info = dateTimeInfo(position);
|
DateTimeInfo info = dateTimeInfo(position);
|
||||||
if (position == Dock::Position::Top || position == Dock::Position::Bottom) {
|
if (position == Dock::Position::Left || position == Dock::Position::Right)
|
||||||
int width = info.m_timeRect.width() + info.m_dateRect.width() + 16;
|
return QSize(width(), info.m_timeRect.height() + info.m_dateRect.height());
|
||||||
return QSize(width, height());
|
|
||||||
|
// 如果在上下显示
|
||||||
|
if (m_showMultiRow) {
|
||||||
|
// 如果显示多行的情况,一般是在高效模式下显示,因此,返回最大的尺寸
|
||||||
|
return QSize(qMax(info.m_timeRect.width(), info.m_dateRect.width()), height());
|
||||||
}
|
}
|
||||||
|
|
||||||
return QSize(width(), info.m_timeRect.height() + info.m_dateRect.height());
|
return QSize(info.m_timeRect.width() + info.m_dateRect.width() + 16, height());
|
||||||
}
|
}
|
||||||
|
|
||||||
void DateTimeDisplayer::mousePressEvent(QMouseEvent *event)
|
void DateTimeDisplayer::mousePressEvent(QMouseEvent *event)
|
||||||
@ -209,20 +214,29 @@ DateTimeDisplayer::DateTimeInfo DateTimeDisplayer::dateTimeInfo(const Dock::Posi
|
|||||||
info.m_time = getTimeString(position);
|
info.m_time = getTimeString(position);
|
||||||
info.m_date = getDateString(position);
|
info.m_date = getDateString(position);
|
||||||
|
|
||||||
if (position == Dock::Top || position == Dock::Bottom) {
|
// 如果是左右方向
|
||||||
int timeWidth = QFontMetrics(timeFont()).boundingRect(info.m_time).width() + 3;
|
if (position == Dock::Position::Left || position == Dock::Position::Right) {
|
||||||
int dateWidth = QFontMetrics(m_dateFont).boundingRect(info.m_date).width() + 2;
|
int textWidth = rect().width();
|
||||||
|
info.m_timeRect = QRect(0, 0, textWidth, DATETIMESIZE / 2);
|
||||||
|
info.m_dateRect = QRect(0, DATETIMESIZE / 2 + 1, textWidth, DATETIMESIZE / 2);
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
int timeWidth = QFontMetrics(timeFont()).boundingRect(info.m_time).width() + 3;
|
||||||
|
int dateWidth = QFontMetrics(m_dateFont).boundingRect(info.m_date).width() + 2;
|
||||||
|
// 如果是上下方向
|
||||||
|
if (m_showMultiRow) {
|
||||||
|
// 日期时间多行显示(一般是高效模式下)
|
||||||
|
info.m_timeRect = QRect(0, 0, timeWidth, height() / 2);
|
||||||
|
info.m_dateRect = QRect(0, height() / 2, dateWidth, height() / 2);
|
||||||
|
} else {
|
||||||
info.m_timeRect = QRect(ITEMSPACE, 0, timeWidth, height());
|
info.m_timeRect = QRect(ITEMSPACE, 0, timeWidth, height());
|
||||||
int dateX = rect().width() - QFontMetrics(m_dateFont).width(info.m_date) - 2 - ITEMSPACE;
|
int dateX = rect().width() - QFontMetrics(m_dateFont).width(info.m_date) - 2 - ITEMSPACE;
|
||||||
// 如果时间的X坐标小于日期的X坐标,需要手动设置坐标在日期坐标的右侧
|
// 如果时间的X坐标小于日期的X坐标,需要手动设置坐标在日期坐标的右侧
|
||||||
if (dateX < info.m_timeRect.right())
|
if (dateX < info.m_timeRect.right())
|
||||||
dateX = info.m_timeRect.right();
|
dateX = info.m_timeRect.right();
|
||||||
info.m_dateRect = QRect(dateX, 0, dateWidth, height());
|
info.m_dateRect = QRect(dateX, 0, dateWidth, height());
|
||||||
} else {
|
|
||||||
int textWidth = rect().width();
|
|
||||||
info.m_timeRect = QRect(0, 0, textWidth, DATETIMESIZE / 2);
|
|
||||||
info.m_dateRect = QRect(0, DATETIMESIZE / 2 + 1, textWidth, DATETIMESIZE / 2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -260,16 +274,17 @@ void DateTimeDisplayer::paintEvent(QPaintEvent *e)
|
|||||||
painter.setRenderHint(QPainter::Antialiasing);
|
painter.setRenderHint(QPainter::Antialiasing);
|
||||||
painter.setPen(QPen(palette().brightText(), 1));
|
painter.setPen(QPen(palette().brightText(), 1));
|
||||||
|
|
||||||
int timeTextFlag = Qt::AlignCenter;
|
int timeAlignFlag = Qt::AlignCenter;
|
||||||
int dateTextFlag = Qt::AlignCenter;
|
int dateAlignFlag = Qt::AlignCenter;
|
||||||
if (m_position == Dock::Top || m_position == Dock::Bottom) {
|
if (m_showMultiRow) {
|
||||||
timeTextFlag = Qt::AlignLeft | Qt::AlignVCenter;
|
timeAlignFlag = Qt::AlignHCenter | Qt::AlignBottom;
|
||||||
dateTextFlag = Qt::AlignRight | Qt::AlignVCenter;
|
dateAlignFlag = Qt::AlignHCenter | Qt::AlignTop;
|
||||||
}
|
}
|
||||||
|
|
||||||
painter.setFont(timeFont());
|
painter.setFont(timeFont());
|
||||||
painter.drawText(info.m_timeRect, timeTextFlag, info.m_time);
|
painter.drawText(textRect(info.m_timeRect), timeAlignFlag, info.m_time);
|
||||||
painter.setFont(m_dateFont);
|
painter.setFont(m_dateFont);
|
||||||
painter.drawText(info.m_dateRect, dateTextFlag, info.m_date);
|
painter.drawText(textRect(info.m_dateRect), dateAlignFlag, info.m_date);
|
||||||
|
|
||||||
updateLastData(info);
|
updateLastData(info);
|
||||||
}
|
}
|
||||||
@ -352,6 +367,19 @@ void DateTimeDisplayer::createMenuItem()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QRect DateTimeDisplayer::textRect(const QRect &sourceRect) const
|
||||||
|
{
|
||||||
|
// 如果是上下,则不做任何变化
|
||||||
|
if (!m_showMultiRow && (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom))
|
||||||
|
return sourceRect;
|
||||||
|
|
||||||
|
QRect resultRect = sourceRect;
|
||||||
|
QSize size = suitableSize();
|
||||||
|
// 如果是左右或者上下多行显示,设置宽度
|
||||||
|
resultRect.setWidth(size.width());
|
||||||
|
return resultRect;
|
||||||
|
}
|
||||||
|
|
||||||
void DateTimeDisplayer::enterEvent(QEvent *event)
|
void DateTimeDisplayer::enterEvent(QEvent *event)
|
||||||
{
|
{
|
||||||
Q_UNUSED(event);
|
Q_UNUSED(event);
|
||||||
|
@ -48,7 +48,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit DateTimeDisplayer(QWidget *parent = nullptr);
|
explicit DateTimeDisplayer(bool showMultiRow, QWidget *parent = nullptr);
|
||||||
~DateTimeDisplayer() override;
|
~DateTimeDisplayer() override;
|
||||||
void setPositon(Dock::Position position);
|
void setPositon(Dock::Position position);
|
||||||
void setOneRow(bool oneRow);
|
void setOneRow(bool oneRow);
|
||||||
@ -80,6 +80,7 @@ private:
|
|||||||
QFont timeFont() const;
|
QFont timeFont() const;
|
||||||
|
|
||||||
void createMenuItem();
|
void createMenuItem();
|
||||||
|
QRect textRect(const QRect &sourceRect) const;
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void onTimeChanged();
|
void onTimeChanged();
|
||||||
@ -97,6 +98,7 @@ private:
|
|||||||
QString m_lastTimeString;
|
QString m_lastTimeString;
|
||||||
int m_currentSize;
|
int m_currentSize;
|
||||||
bool m_oneRow;
|
bool m_oneRow;
|
||||||
|
bool m_showMultiRow;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // DATETIMEDISPLAYER_H
|
#endif // DATETIMEDISPLAYER_H
|
||||||
|
342
frame/window/docktraywindow.cpp
Normal file
342
frame/window/docktraywindow.cpp
Normal file
@ -0,0 +1,342 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
|
*
|
||||||
|
* Author: donghualin <donghualin@uniontech.com>
|
||||||
|
*
|
||||||
|
* Maintainer: donghualin <donghualin@uniontech.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include "docktraywindow.h"
|
||||||
|
#include "datetimedisplayer.h"
|
||||||
|
#include "systempluginwindow.h"
|
||||||
|
#include "quickpluginwindow.h"
|
||||||
|
#include "tray_gridview.h"
|
||||||
|
#include "tray_model.h"
|
||||||
|
#include "tray_delegate.h"
|
||||||
|
#include "quicksettingcontroller.h"
|
||||||
|
#include "pluginsitem.h"
|
||||||
|
|
||||||
|
#include <DGuiApplicationHelper>
|
||||||
|
|
||||||
|
#include <QBoxLayout>
|
||||||
|
#include <QLabel>
|
||||||
|
|
||||||
|
#define FRONTSPACING 18
|
||||||
|
#define SPLITERSIZE 2
|
||||||
|
#define SPLITESPACE 10
|
||||||
|
|
||||||
|
DockTrayWindow::DockTrayWindow(DockInter *dockInter, QWidget *parent)
|
||||||
|
: QWidget(parent)
|
||||||
|
, m_dockInter(dockInter)
|
||||||
|
, m_position(Dock::Position::Bottom)
|
||||||
|
, m_displayMode(Dock::DisplayMode::Efficient)
|
||||||
|
, m_mainBoxLayout(new QBoxLayout(QBoxLayout::Direction::RightToLeft, this))
|
||||||
|
, m_toolWidget(new QWidget(this))
|
||||||
|
, m_toolLayout(new QBoxLayout(QBoxLayout::RightToLeft, m_toolWidget))
|
||||||
|
, m_toolLineLabel(new QLabel(this))
|
||||||
|
, m_dateTimeWidget(new DateTimeDisplayer(true, this))
|
||||||
|
, m_systemPuginWidget(new SystemPluginWindow(this))
|
||||||
|
, m_quickIconWidget(new QuickPluginWindow(this))
|
||||||
|
, m_trayView(new TrayGridView(this))
|
||||||
|
, m_model(new TrayModel(m_trayView, false, true, this))
|
||||||
|
, m_delegate(new TrayDelegate(m_trayView, this))
|
||||||
|
{
|
||||||
|
initUi();
|
||||||
|
initConnection();
|
||||||
|
|
||||||
|
m_trayView->setModel(m_model);
|
||||||
|
m_trayView->setItemDelegate(m_delegate);
|
||||||
|
m_trayView->openPersistentEditor(m_model->index(0, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
void DockTrayWindow::setPositon(const Dock::Position &position)
|
||||||
|
{
|
||||||
|
m_position = position;
|
||||||
|
m_dateTimeWidget->setPositon(position);
|
||||||
|
m_systemPuginWidget->setPositon(position);
|
||||||
|
m_quickIconWidget->setPositon(position);
|
||||||
|
m_trayView->setPosition(position);
|
||||||
|
updateLayout(position);
|
||||||
|
onResetLayout();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DockTrayWindow::setDisplayMode(const Dock::DisplayMode &displayMode)
|
||||||
|
{
|
||||||
|
m_displayMode = displayMode;
|
||||||
|
moveToolPlugin();
|
||||||
|
}
|
||||||
|
|
||||||
|
QSize DockTrayWindow::suitableSize(const Dock::Position &position, const int &, const double &) const
|
||||||
|
{
|
||||||
|
if (position == Dock::Position::Left || position == Dock::Position::Right) {
|
||||||
|
// 左右的尺寸
|
||||||
|
int height = FRONTSPACING
|
||||||
|
+ m_toolWidget->height()
|
||||||
|
+ (SPLITESPACE * 2)
|
||||||
|
+ SPLITERSIZE
|
||||||
|
+ m_dateTimeWidget->suitableSize(position).height()
|
||||||
|
+ m_systemPuginWidget->suitableSize(position).height()
|
||||||
|
+ m_quickIconWidget->suitableSize(position).height()
|
||||||
|
+ m_trayView->suitableSize(position).height();
|
||||||
|
|
||||||
|
return QSize(-1, height);
|
||||||
|
}
|
||||||
|
// 上下的尺寸
|
||||||
|
int width = FRONTSPACING
|
||||||
|
+ m_toolWidget->width()
|
||||||
|
+ (SPLITESPACE * 2)
|
||||||
|
+ SPLITERSIZE
|
||||||
|
+ m_dateTimeWidget->width()
|
||||||
|
+ m_systemPuginWidget->width()
|
||||||
|
+ m_quickIconWidget->width()
|
||||||
|
+ m_trayView->width();
|
||||||
|
return QSize(width, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
QSize DockTrayWindow::suitableSize() const
|
||||||
|
{
|
||||||
|
return suitableSize(m_position, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DockTrayWindow::layoutWidget()
|
||||||
|
{
|
||||||
|
resizeTool();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DockTrayWindow::resizeEvent(QResizeEvent *event)
|
||||||
|
{
|
||||||
|
Q_EMIT requestUpdate();
|
||||||
|
// 当尺寸发生变化的时候,通知托盘区域刷新尺寸,让托盘图标始终保持居中显示
|
||||||
|
Q_EMIT m_delegate->sizeHintChanged(m_model->index(0, 0));
|
||||||
|
QWidget::resizeEvent(event);
|
||||||
|
switch (m_position) {
|
||||||
|
case Dock::Position::Left:
|
||||||
|
case Dock::Position::Right:
|
||||||
|
m_toolLineLabel->setFixedSize(width() * 0.6, SPLITERSIZE);
|
||||||
|
break;
|
||||||
|
case Dock::Position::Top:
|
||||||
|
case Dock::Position::Bottom:
|
||||||
|
m_toolLineLabel->setFixedSize(SPLITERSIZE, height() * 0.6);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DockTrayWindow::paintEvent(QPaintEvent *event)
|
||||||
|
{
|
||||||
|
QWidget::paintEvent(event);
|
||||||
|
QPainter painter(this);
|
||||||
|
QColor color;
|
||||||
|
if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) {
|
||||||
|
color = Qt::black;
|
||||||
|
painter.setOpacity(0.5);
|
||||||
|
} else {
|
||||||
|
color = Qt::white;
|
||||||
|
painter.setOpacity(0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
painter.fillRect(m_toolLineLabel->geometry(), color);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 根据任务栏的位置来更新布局的方向
|
||||||
|
* @brief DockTrayWindow::updateLayout
|
||||||
|
* @param position
|
||||||
|
*/
|
||||||
|
void DockTrayWindow::updateLayout(const Dock::Position &position)
|
||||||
|
{
|
||||||
|
switch (position) {
|
||||||
|
case Dock::Position::Left:
|
||||||
|
case Dock::Position::Right: {
|
||||||
|
m_mainBoxLayout->setDirection(QBoxLayout::BottomToTop);
|
||||||
|
m_toolLayout->setDirection(QBoxLayout::BottomToTop);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Dock::Position::Top:
|
||||||
|
case Dock::Position::Bottom: {
|
||||||
|
m_mainBoxLayout->setDirection(QBoxLayout::RightToLeft);
|
||||||
|
m_toolLayout->setDirection(QBoxLayout::RightToLeft);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DockTrayWindow::resizeTool() const
|
||||||
|
{
|
||||||
|
int toolSize = 0;
|
||||||
|
int size = 0;
|
||||||
|
if (m_position == Dock::Position::Left || m_position == Dock::Position::Right)
|
||||||
|
size = width();
|
||||||
|
else
|
||||||
|
size = height();
|
||||||
|
|
||||||
|
for (int i = 0; i < m_toolLayout->count(); i++) {
|
||||||
|
QLayoutItem *layoutItem = m_toolLayout->itemAt(i);
|
||||||
|
if (!layoutItem)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
PluginsItem *toolWidget = qobject_cast<PluginsItem *>(layoutItem->widget());
|
||||||
|
if (!toolWidget)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
toolWidget->setFixedSize(size, size);
|
||||||
|
toolSize += size;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_position == Dock::Position::Left || m_position == Dock::Position::Right)
|
||||||
|
m_toolWidget->setFixedHeight(toolSize);
|
||||||
|
else
|
||||||
|
m_toolWidget->setFixedWidth(toolSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DockTrayWindow::pluginExists(PluginsItemInterface *itemInter) const
|
||||||
|
{
|
||||||
|
for (int i = 0; i < m_toolLayout->count(); i++) {
|
||||||
|
QLayoutItem *layoutItem = m_toolLayout->itemAt(i);
|
||||||
|
if (!layoutItem)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
PluginsItem *pluginItem = qobject_cast<PluginsItem *>(layoutItem->widget());
|
||||||
|
if (!pluginItem)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (pluginItem->pluginItem() == itemInter)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DockTrayWindow::moveToolPlugin()
|
||||||
|
{
|
||||||
|
for (int i = m_toolLayout->count() - 1; i >= 0; i--) {
|
||||||
|
QLayoutItem *layoutItem = m_toolLayout->itemAt(i);
|
||||||
|
if (!layoutItem)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
PluginsItem *pluginWidget = qobject_cast<PluginsItem *>(layoutItem->widget());
|
||||||
|
if (!pluginWidget)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
m_toolLayout->removeWidget(pluginWidget);
|
||||||
|
}
|
||||||
|
if (m_displayMode == Dock::DisplayMode::Efficient) {
|
||||||
|
// 如果当前是高效模式,则将所有的工具插件移动到当前的工具区域
|
||||||
|
QuickSettingController *quickController = QuickSettingController::instance();
|
||||||
|
QList<PluginsItemInterface *> plugins = quickController->pluginItems(QuickSettingController::PluginAttribute::Tool);
|
||||||
|
for (PluginsItemInterface *pluginInter : plugins) {
|
||||||
|
PluginsItem *pluginWidget = quickController->pluginItemWidget(pluginInter);
|
||||||
|
m_toolLayout->addWidget(pluginWidget);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DockTrayWindow::initUi()
|
||||||
|
{
|
||||||
|
m_toolLayout->setContentsMargins(0, 0, 0, 0);
|
||||||
|
m_toolLayout->setSpacing(0);
|
||||||
|
|
||||||
|
m_systemPuginWidget->setDisplayMode(Dock::DisplayMode::Efficient);
|
||||||
|
m_mainBoxLayout->setContentsMargins(0, 0, 0, 0);
|
||||||
|
m_mainBoxLayout->setSpacing(0);
|
||||||
|
m_mainBoxLayout->addSpacing(FRONTSPACING);
|
||||||
|
m_mainBoxLayout->addWidget(m_toolWidget);
|
||||||
|
m_mainBoxLayout->addSpacing(SPLITESPACE);
|
||||||
|
m_mainBoxLayout->addWidget(m_toolLineLabel);
|
||||||
|
m_mainBoxLayout->addSpacing(SPLITESPACE);
|
||||||
|
m_mainBoxLayout->addWidget(m_dateTimeWidget);
|
||||||
|
m_mainBoxLayout->addWidget(m_systemPuginWidget);
|
||||||
|
m_mainBoxLayout->addWidget(m_quickIconWidget);
|
||||||
|
m_mainBoxLayout->addWidget(m_trayView);
|
||||||
|
m_mainBoxLayout->setAlignment(m_toolLineLabel, Qt::AlignCenter);
|
||||||
|
|
||||||
|
WinInfo info;
|
||||||
|
info.type = TrayIconType::EXPANDICON;
|
||||||
|
m_model->addRow(info);
|
||||||
|
m_trayView->openPersistentEditor(m_model->index(0, 0));
|
||||||
|
|
||||||
|
m_toolLineLabel->setFixedSize(0, 0);
|
||||||
|
|
||||||
|
m_mainBoxLayout->addStretch();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DockTrayWindow::initConnection()
|
||||||
|
{
|
||||||
|
connect(m_systemPuginWidget, &SystemPluginWindow::itemChanged, this, &DockTrayWindow::onResetLayout);
|
||||||
|
connect(m_dateTimeWidget, &DateTimeDisplayer::requestUpdate, this, &DockTrayWindow::onResetLayout);
|
||||||
|
connect(m_quickIconWidget, &QuickPluginWindow::itemCountChanged, this, &DockTrayWindow::onResetLayout);
|
||||||
|
connect(m_trayView, &TrayGridView::requestRemove, this, &DockTrayWindow::onResetLayout);
|
||||||
|
|
||||||
|
connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ this ] (PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginClass) {
|
||||||
|
if (pluginClass != QuickSettingController::PluginAttribute::Tool)
|
||||||
|
return;
|
||||||
|
|
||||||
|
onItemAdded(itemInter);
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(QuickSettingController::instance(), &QuickSettingController::pluginRemoved, this, &DockTrayWindow::onItemRemove);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DockTrayWindow::onResetLayout()
|
||||||
|
{
|
||||||
|
switch(m_position) {
|
||||||
|
case Dock::Position::Left:
|
||||||
|
case Dock::Position::Right: {
|
||||||
|
m_dateTimeWidget->setFixedSize(QWIDGETSIZE_MAX, m_dateTimeWidget->suitableSize().height());
|
||||||
|
m_systemPuginWidget->setFixedSize(QWIDGETSIZE_MAX, m_systemPuginWidget->suitableSize().height());
|
||||||
|
m_quickIconWidget->setFixedSize(QWIDGETSIZE_MAX, m_quickIconWidget->suitableSize().height());
|
||||||
|
m_trayView->setFixedSize(QWIDGETSIZE_MAX, m_trayView->suitableSize().height());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Dock::Position::Top:
|
||||||
|
case Dock::Position::Bottom: {
|
||||||
|
m_dateTimeWidget->setFixedSize(m_dateTimeWidget->suitableSize().width(), QWIDGETSIZE_MAX);
|
||||||
|
m_systemPuginWidget->setFixedSize(m_systemPuginWidget->suitableSize().width(), QWIDGETSIZE_MAX);
|
||||||
|
m_quickIconWidget->setFixedSize(m_quickIconWidget->suitableSize().width(), QWIDGETSIZE_MAX);
|
||||||
|
m_trayView->setFixedSize(m_trayView->suitableSize().width(), QWIDGETSIZE_MAX);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Q_EMIT requestUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DockTrayWindow::onItemAdded(PluginsItemInterface *itemInter)
|
||||||
|
{
|
||||||
|
if (m_displayMode != Dock::DisplayMode::Efficient || pluginExists(itemInter))
|
||||||
|
return;
|
||||||
|
|
||||||
|
QuickSettingController *quickController = QuickSettingController::instance();
|
||||||
|
PluginsItem *pluginItem = quickController->pluginItemWidget(itemInter);
|
||||||
|
pluginItem->setVisible(true);
|
||||||
|
|
||||||
|
m_toolLayout->addWidget(pluginItem);
|
||||||
|
|
||||||
|
Q_EMIT requestUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DockTrayWindow::onItemRemove(PluginsItemInterface *itemInter)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < m_toolLayout->count(); i++) {
|
||||||
|
QLayoutItem *layoutItem = m_toolLayout->itemAt(i);
|
||||||
|
if (!layoutItem)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
PluginsItem *pluginItem = qobject_cast<PluginsItem *>(layoutItem->widget());
|
||||||
|
if (!pluginItem || pluginItem->pluginItem() != itemInter)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
m_toolLayout->removeWidget(pluginItem);
|
||||||
|
Q_EMIT requestUpdate();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
91
frame/window/docktraywindow.h
Normal file
91
frame/window/docktraywindow.h
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
|
*
|
||||||
|
* Author: donghualin <donghualin@uniontech.com>
|
||||||
|
*
|
||||||
|
* Maintainer: donghualin <donghualin@uniontech.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#ifndef DOCKTRAYWINDOW_H
|
||||||
|
#define DOCKTRAYWINDOW_H
|
||||||
|
|
||||||
|
#include "constants.h"
|
||||||
|
#include "dbusutil.h"
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
class QBoxLayout;
|
||||||
|
class SystemPluginWindow;
|
||||||
|
class DateTimeDisplayer;
|
||||||
|
class QuickPluginWindow;
|
||||||
|
class TrayGridView;
|
||||||
|
class TrayModel;
|
||||||
|
class TrayDelegate;
|
||||||
|
class PluginsItem;
|
||||||
|
class PluginsItemInterface;
|
||||||
|
class QLabel;
|
||||||
|
|
||||||
|
class DockTrayWindow : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit DockTrayWindow(DockInter *dockInter, QWidget *parent = nullptr);
|
||||||
|
|
||||||
|
void setPositon(const Dock::Position &position);
|
||||||
|
void setDisplayMode(const Dock::DisplayMode &displayMode);
|
||||||
|
|
||||||
|
QSize suitableSize(const Dock::Position &position, const int &, const double &) const;
|
||||||
|
QSize suitableSize() const;
|
||||||
|
|
||||||
|
void layoutWidget();
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
void requestUpdate();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void resizeEvent(QResizeEvent *event) override;
|
||||||
|
void paintEvent(QPaintEvent *event) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void initUi();
|
||||||
|
void initConnection();
|
||||||
|
void updateLayout(const Dock::Position &position);
|
||||||
|
void resizeTool() const;
|
||||||
|
bool pluginExists(PluginsItemInterface *itemInter) const;
|
||||||
|
void moveToolPlugin();
|
||||||
|
|
||||||
|
private Q_SLOTS:
|
||||||
|
void onResetLayout();
|
||||||
|
void onItemAdded(PluginsItemInterface *itemInter);
|
||||||
|
void onItemRemove(PluginsItemInterface *itemInter);
|
||||||
|
|
||||||
|
private:
|
||||||
|
DockInter *m_dockInter;
|
||||||
|
Dock::Position m_position;
|
||||||
|
Dock::DisplayMode m_displayMode;
|
||||||
|
QBoxLayout *m_mainBoxLayout;
|
||||||
|
QWidget *m_toolWidget;
|
||||||
|
QBoxLayout *m_toolLayout;
|
||||||
|
QLabel *m_toolLineLabel;
|
||||||
|
DateTimeDisplayer *m_dateTimeWidget; // 日期时间
|
||||||
|
SystemPluginWindow *m_systemPuginWidget; // 固定区域-一般是右侧的电源按钮
|
||||||
|
QuickPluginWindow *m_quickIconWidget; // 插件区域-包括网络、蓝牙等
|
||||||
|
TrayGridView *m_trayView; // 托盘区域视图
|
||||||
|
TrayModel *m_model; // 托盘区域的model
|
||||||
|
TrayDelegate *m_delegate; // 托盘区域的视图代理
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // DOCKTRAYWINDOW_H
|
@ -39,6 +39,7 @@
|
|||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
#include "appmultiitem.h"
|
#include "appmultiitem.h"
|
||||||
#include "dockscreen.h"
|
#include "dockscreen.h"
|
||||||
|
#include "docktraywindow.h"
|
||||||
|
|
||||||
#include <QDrag>
|
#include <QDrag>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
@ -97,7 +98,7 @@ MainPanelControl::MainPanelControl(DockInter *dockInter, QWidget *parent)
|
|||||||
, m_placeholderItem(nullptr)
|
, m_placeholderItem(nullptr)
|
||||||
, m_appDragWidget(nullptr)
|
, m_appDragWidget(nullptr)
|
||||||
, m_displayMode(Efficient)
|
, m_displayMode(Efficient)
|
||||||
, m_tray(nullptr)
|
, m_tray(new DockTrayWindow(dockInter, this))
|
||||||
, m_dockInter(dockInter)
|
, m_dockInter(dockInter)
|
||||||
, m_recentHelper(new RecentAppHelper(m_appAreaSonWidget, m_recentAreaWidget, m_dockInter, this))
|
, m_recentHelper(new RecentAppHelper(m_appAreaSonWidget, m_recentAreaWidget, m_dockInter, this))
|
||||||
, m_toolHelper(new ToolAppHelper(m_pluginAreaWidget, m_toolSonAreaWidget, this))
|
, m_toolHelper(new ToolAppHelper(m_pluginAreaWidget, m_toolSonAreaWidget, this))
|
||||||
@ -181,22 +182,28 @@ void MainPanelControl::initUI()
|
|||||||
m_toolSonLayout->setContentsMargins(0, 0, 0, 0);
|
m_toolSonLayout->setContentsMargins(0, 0, 0, 0);
|
||||||
m_toolAreaLayout->addWidget(m_toolSonAreaWidget);
|
m_toolAreaLayout->addWidget(m_toolSonAreaWidget);
|
||||||
|
|
||||||
|
// 添加托盘区域(包括托盘图标和插件)等
|
||||||
|
m_tray->setObjectName("tray");
|
||||||
|
m_mainPanelLayout->addWidget(m_tray);
|
||||||
|
|
||||||
|
m_trayAreaWidget->setVisible(false);
|
||||||
|
m_pluginAreaWidget->setVisible(false);
|
||||||
/* 托盘区域 */
|
/* 托盘区域 */
|
||||||
m_trayAreaWidget->setObjectName("trayarea");
|
/*m_trayAreaWidget->setObjectName("trayarea");
|
||||||
m_trayAreaWidget->setLayout(m_trayAreaLayout);
|
m_trayAreaWidget->setLayout(m_trayAreaLayout);
|
||||||
m_trayAreaLayout->setSpacing(0);
|
m_trayAreaLayout->setSpacing(0);
|
||||||
m_trayAreaLayout->setContentsMargins(0, 10, 0, 10);
|
m_trayAreaLayout->setContentsMargins(0, 10, 0, 10);
|
||||||
m_mainPanelLayout->addWidget(m_trayAreaWidget);
|
m_mainPanelLayout->addWidget(m_trayAreaWidget);
|
||||||
|
|
||||||
m_traySpliter->setObjectName("spliter_tray");
|
m_traySpliter->setObjectName("spliter_tray");
|
||||||
m_mainPanelLayout->addWidget(m_traySpliter);
|
m_mainPanelLayout->addWidget(m_traySpliter);*/
|
||||||
|
|
||||||
/* 插件区域 */
|
/* 插件区域 */
|
||||||
m_pluginAreaWidget->setObjectName("pluginarea");
|
/*m_pluginAreaWidget->setObjectName("pluginarea");
|
||||||
m_pluginAreaWidget->setLayout(m_pluginLayout);
|
m_pluginAreaWidget->setLayout(m_pluginLayout);
|
||||||
m_pluginLayout->setSpacing(10);
|
m_pluginLayout->setSpacing(10);
|
||||||
m_pluginLayout->setContentsMargins(0, 0, 0, 0);
|
m_pluginLayout->setContentsMargins(0, 0, 0, 0);
|
||||||
m_mainPanelLayout->addWidget(m_pluginAreaWidget, 0, Qt::AlignCenter);
|
m_mainPanelLayout->addWidget(m_pluginAreaWidget, 0, Qt::AlignCenter);*/
|
||||||
|
|
||||||
/* 桌面预览 */
|
/* 桌面预览 */
|
||||||
m_desktopWidget->setObjectName("showdesktoparea");
|
m_desktopWidget->setObjectName("showdesktoparea");
|
||||||
@ -218,6 +225,7 @@ void MainPanelControl::initConnection()
|
|||||||
connect(m_toolHelper, &ToolAppHelper::requestUpdate, this, &MainPanelControl::requestUpdate);
|
connect(m_toolHelper, &ToolAppHelper::requestUpdate, this, &MainPanelControl::requestUpdate);
|
||||||
connect(m_toolHelper, &ToolAppHelper::toolVisibleChanged, this, &MainPanelControl::onToolVisibleChanged);
|
connect(m_toolHelper, &ToolAppHelper::toolVisibleChanged, this, &MainPanelControl::onToolVisibleChanged);
|
||||||
connect(m_multiHelper, &MultiWindowHelper::requestUpdate, this, &MainPanelControl::requestUpdate);
|
connect(m_multiHelper, &MultiWindowHelper::requestUpdate, this, &MainPanelControl::requestUpdate);
|
||||||
|
connect(m_tray, &DockTrayWindow::requestUpdate, this, &MainPanelControl::onTrayRequestUpdate);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -231,6 +239,7 @@ void MainPanelControl::setDisplayMode(DisplayMode dislayMode)
|
|||||||
|
|
||||||
m_displayMode = dislayMode;
|
m_displayMode = dislayMode;
|
||||||
m_recentHelper->setDisplayMode(dislayMode);
|
m_recentHelper->setDisplayMode(dislayMode);
|
||||||
|
m_tray->setDisplayMode(dislayMode);
|
||||||
m_toolHelper->setDisplayMode(dislayMode);
|
m_toolHelper->setDisplayMode(dislayMode);
|
||||||
m_multiHelper->setDisplayMode(dislayMode);
|
m_multiHelper->setDisplayMode(dislayMode);
|
||||||
updateDisplayMode();
|
updateDisplayMode();
|
||||||
@ -310,13 +319,13 @@ void MainPanelControl::addFixedAreaItem(int index, QWidget *wdg)
|
|||||||
* @param index 位置索引,如果为负数则插入到最后,为正则插入到指定位置
|
* @param index 位置索引,如果为负数则插入到最后,为正则插入到指定位置
|
||||||
* @param wdg 应用指针对象
|
* @param wdg 应用指针对象
|
||||||
*/
|
*/
|
||||||
void MainPanelControl::addTrayAreaItem(int index, QWidget *wdg)
|
/*void MainPanelControl::addTrayAreaItem(int index, QWidget *wdg)
|
||||||
{
|
{
|
||||||
m_tray = static_cast<TrayPluginItem *>(wdg);
|
m_tray = static_cast<TrayPluginItem *>(wdg);
|
||||||
m_trayAreaLayout->insertWidget(index, wdg);
|
m_trayAreaLayout->insertWidget(index, wdg);
|
||||||
if (m_tray)
|
if (m_tray)
|
||||||
m_tray->installEventFilter(this);
|
m_tray->installEventFilter(this);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
/**移除固定区域某一应用
|
/**移除固定区域某一应用
|
||||||
* @brief MainPanelControl::removeFixedAreaItem
|
* @brief MainPanelControl::removeFixedAreaItem
|
||||||
@ -437,10 +446,12 @@ void MainPanelControl::insertItem(int index, DockItem *item)
|
|||||||
m_recentHelper->addAppItem(index, item);
|
m_recentHelper->addAppItem(index, item);
|
||||||
break;
|
break;
|
||||||
case DockItem::TrayPlugin: // 此处只会有一个tray系统托盘插件,微信、声音、网络蓝牙等等,都在系统托盘插件中处理的
|
case DockItem::TrayPlugin: // 此处只会有一个tray系统托盘插件,微信、声音、网络蓝牙等等,都在系统托盘插件中处理的
|
||||||
addTrayAreaItem(index, item);
|
//addTrayAreaItem(index, item);
|
||||||
break;
|
return;
|
||||||
|
//break;
|
||||||
case DockItem::Plugins:
|
case DockItem::Plugins:
|
||||||
m_toolHelper->addPluginItem(index, item);
|
//m_toolHelper->addPluginItem(index, item);
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case DockItem::AppMultiWindow:
|
case DockItem::AppMultiWindow:
|
||||||
m_multiHelper->addMultiWindow(index, static_cast<AppMultiItem *>(item));
|
m_multiHelper->addMultiWindow(index, static_cast<AppMultiItem *>(item));
|
||||||
@ -695,8 +706,8 @@ bool MainPanelControl::eventFilter(QObject *watched, QEvent *event)
|
|||||||
// 但是子部件的模式变化函数在FashionTrayItem部件中的
|
// 但是子部件的模式变化函数在FashionTrayItem部件中的
|
||||||
// NormalContainer部件尺寸变化完成之前就已经结束,导致
|
// NormalContainer部件尺寸变化完成之前就已经结束,导致
|
||||||
// NormalContainer没有更新自己的尺寸,引起插件区域拥挤
|
// NormalContainer没有更新自己的尺寸,引起插件区域拥挤
|
||||||
if (m_tray && watched == m_tray && event->type() == QEvent::Resize)
|
//if (m_tray && watched == m_tray && event->type() == QEvent::Resize)
|
||||||
m_tray->pluginItem()->displayModeChanged(m_displayMode);
|
//m_tray->pluginItem()->displayModeChanged(m_displayMode);
|
||||||
|
|
||||||
// 更新应用区域大小和任务栏图标大小
|
// 更新应用区域大小和任务栏图标大小
|
||||||
if (watched == m_appAreaSonWidget) {
|
if (watched == m_appAreaSonWidget) {
|
||||||
@ -980,11 +991,11 @@ void MainPanelControl::updateModeChange()
|
|||||||
m_traySpliter->setVisible(m_displayMode == DisplayMode::Efficient);
|
m_traySpliter->setVisible(m_displayMode == DisplayMode::Efficient);
|
||||||
m_pluginAreaWidget->setVisible(m_displayMode == DisplayMode::Efficient);
|
m_pluginAreaWidget->setVisible(m_displayMode == DisplayMode::Efficient);
|
||||||
m_toolAreaWidget->setVisible(m_displayMode == DisplayMode::Fashion);
|
m_toolAreaWidget->setVisible(m_displayMode == DisplayMode::Fashion);
|
||||||
|
m_toolSonAreaWidget->setVisible(m_displayMode == DisplayMode::Fashion);
|
||||||
onRecentVisibleChanged(m_recentHelper->recentIsVisible());
|
onRecentVisibleChanged(m_recentHelper->recentIsVisible());
|
||||||
onDockAppVisibleChanged(m_recentHelper->dockAppIsVisible());
|
onDockAppVisibleChanged(m_recentHelper->dockAppIsVisible());
|
||||||
onToolVisibleChanged(m_toolHelper->toolIsVisible());
|
onToolVisibleChanged(m_toolHelper->toolIsVisible());
|
||||||
if (m_tray)
|
m_tray->setVisible(m_displayMode == DisplayMode::Efficient);
|
||||||
m_tray->setVisible(m_displayMode == DisplayMode::Efficient);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**把驻留应用和被打开的应用所在窗口移动到指定位置
|
/**把驻留应用和被打开的应用所在窗口移动到指定位置
|
||||||
@ -1224,9 +1235,10 @@ void MainPanelControl::resizeDockIcon()
|
|||||||
} else {
|
} else {
|
||||||
int totalLength = ((m_position == Position::Top) || (m_position == Position::Bottom)) ? width() : height();
|
int totalLength = ((m_position == Position::Top) || (m_position == Position::Bottom)) ? width() : height();
|
||||||
// 减去托盘间隔区域
|
// 减去托盘间隔区域
|
||||||
if (m_tray) {
|
/*if (m_tray) {
|
||||||
totalLength -= (m_tray->trayVisibleItemCount() + 1) * 10;
|
totalLength -= (m_tray->trayVisibleItemCount() + 1) * 10;
|
||||||
}
|
}*/
|
||||||
|
totalLength -= m_tray->width();
|
||||||
// 减去3个分割线的宽度
|
// 减去3个分割线的宽度
|
||||||
totalLength -= 3 * SPLITER_SIZE;
|
totalLength -= 3 * SPLITER_SIZE;
|
||||||
// 减去显示桌面图标宽度
|
// 减去显示桌面图标宽度
|
||||||
@ -1265,9 +1277,9 @@ void MainPanelControl::resizeDockIcon()
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// 参与计算的插件的个数包含托盘和插件
|
// 参与计算的插件的个数包含托盘和插件
|
||||||
int pluginCount = m_tray ? m_tray->trayVisibleItemCount() + calcPluginItemCount : calcPluginItemCount;
|
// int pluginCount = m_tray ? m_tray->trayVisibleItemCount() + calcPluginItemCount : calcPluginItemCount;
|
||||||
// 需要计算的图标总数
|
// 需要计算的图标总数
|
||||||
int iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count() + pluginCount;
|
int iconCount = m_fixedAreaLayout->count() + m_appAreaSonLayout->count()/* + pluginCount*/;
|
||||||
if (iconCount <= 0)
|
if (iconCount <= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -1290,8 +1302,8 @@ void MainPanelControl::resizeDockIcon()
|
|||||||
tray_item_size = 20;
|
tray_item_size = 20;
|
||||||
|
|
||||||
// 减去插件图标的大小后重新计算固定图标和应用图标的平均大小
|
// 减去插件图标的大小后重新计算固定图标和应用图标的平均大小
|
||||||
totalLength -= tray_item_size * pluginCount;
|
totalLength -= m_tray->width();//tray_item_size * pluginCount;
|
||||||
iconCount -= pluginCount;
|
//iconCount -= pluginCount;
|
||||||
|
|
||||||
// 余数
|
// 余数
|
||||||
yu = (totalLength % iconCount);
|
yu = (totalLength % iconCount);
|
||||||
@ -1408,8 +1420,8 @@ void MainPanelControl::calcuDockIconSize(int w, int h, int traySize)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_tray)
|
/*if (m_tray)
|
||||||
m_tray->centralWidget()->setProperty("iconSize", traySize);
|
m_tray->centralWidget()->setProperty("iconSize", traySize);*/
|
||||||
|
|
||||||
// 因为日期时间大小和其他插件大小有异,为了设置边距,在各插件中增加了一层布局
|
// 因为日期时间大小和其他插件大小有异,为了设置边距,在各插件中增加了一层布局
|
||||||
// 因此需要通过多一层布局来获取各插件
|
// 因此需要通过多一层布局来获取各插件
|
||||||
@ -1502,6 +1514,15 @@ void MainPanelControl::onToolVisibleChanged(bool visible)
|
|||||||
m_recentSpliter->setVisible(visible);
|
m_recentSpliter->setVisible(visible);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainPanelControl::onTrayRequestUpdate()
|
||||||
|
{
|
||||||
|
m_tray->layoutWidget();
|
||||||
|
if (m_position == Dock::Position::Left || m_position == Dock::Position::Right)
|
||||||
|
m_tray->setFixedHeight(m_tray->suitableSize().height());
|
||||||
|
else
|
||||||
|
m_tray->setFixedWidth(m_tray->suitableSize().width());
|
||||||
|
}
|
||||||
|
|
||||||
/**时尚模式没有‘显示桌面’区域
|
/**时尚模式没有‘显示桌面’区域
|
||||||
* @brief MainPanelControl::resizeDesktopWidget
|
* @brief MainPanelControl::resizeDesktopWidget
|
||||||
*/
|
*/
|
||||||
|
@ -31,7 +31,7 @@ using namespace Dock;
|
|||||||
|
|
||||||
class QBoxLayout;
|
class QBoxLayout;
|
||||||
class QLabel;
|
class QLabel;
|
||||||
class TrayPluginItem;
|
class DockTrayWindow;
|
||||||
class PluginsItem;
|
class PluginsItem;
|
||||||
class DockItem;
|
class DockItem;
|
||||||
class PlaceholderItem;
|
class PlaceholderItem;
|
||||||
@ -77,7 +77,7 @@ private:
|
|||||||
void addFixedAreaItem(int index, QWidget *wdg);
|
void addFixedAreaItem(int index, QWidget *wdg);
|
||||||
void removeFixedAreaItem(QWidget *wdg);
|
void removeFixedAreaItem(QWidget *wdg);
|
||||||
void removeAppAreaItem(QWidget *wdg);
|
void removeAppAreaItem(QWidget *wdg);
|
||||||
void addTrayAreaItem(int index, QWidget *wdg);
|
//void addTrayAreaItem(int index, QWidget *wdg);
|
||||||
void removeTrayAreaItem(QWidget *wdg);
|
void removeTrayAreaItem(QWidget *wdg);
|
||||||
int getScreenSize() const;
|
int getScreenSize() const;
|
||||||
|
|
||||||
@ -97,6 +97,7 @@ private Q_SLOTS:
|
|||||||
void onRecentVisibleChanged(bool visible);
|
void onRecentVisibleChanged(bool visible);
|
||||||
void onDockAppVisibleChanged(bool visible);
|
void onDockAppVisibleChanged(bool visible);
|
||||||
void onToolVisibleChanged(bool visible);
|
void onToolVisibleChanged(bool visible);
|
||||||
|
void onTrayRequestUpdate();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void dragMoveEvent(QDragMoveEvent *e) override;
|
void dragMoveEvent(QDragMoveEvent *e) override;
|
||||||
@ -142,7 +143,7 @@ private:
|
|||||||
AppDragWidget *m_appDragWidget;
|
AppDragWidget *m_appDragWidget;
|
||||||
DisplayMode m_displayMode;
|
DisplayMode m_displayMode;
|
||||||
QPoint m_mousePressPos;
|
QPoint m_mousePressPos;
|
||||||
TrayPluginItem *m_tray;
|
DockTrayWindow *m_tray;
|
||||||
int m_dragIndex = -1; // 记录应用区域被拖拽图标的位置
|
int m_dragIndex = -1; // 记录应用区域被拖拽图标的位置
|
||||||
|
|
||||||
DockInter *m_dockInter;
|
DockInter *m_dockInter;
|
||||||
|
@ -70,13 +70,13 @@ void QuickPluginWindow::initUi()
|
|||||||
m_mainLayout->setDirection(QBoxLayout::RightToLeft);
|
m_mainLayout->setDirection(QBoxLayout::RightToLeft);
|
||||||
m_mainLayout->setContentsMargins(ITEMSPACE, 0, ITEMSPACE, 0);
|
m_mainLayout->setContentsMargins(ITEMSPACE, 0, ITEMSPACE, 0);
|
||||||
m_mainLayout->setSpacing(ITEMSPACE);
|
m_mainLayout->setSpacing(ITEMSPACE);
|
||||||
const QList<QuickSettingItem *> &items = QuickSettingController::instance()->settingItems();
|
QList<PluginsItemInterface *> items = QuickSettingController::instance()->pluginItems(QuickSettingController::PluginAttribute::Quick);
|
||||||
for (QuickSettingItem *settingItem : items) {
|
for (PluginsItemInterface *pluginItem : items) {
|
||||||
const QString pluginName = settingItem->pluginItem()->pluginName();
|
const QString pluginName = pluginItem->pluginName();
|
||||||
if (!fixedPluginNames.contains(pluginName))
|
if (!fixedPluginNames.contains(pluginName))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
addPlugin(settingItem);
|
addPlugin(pluginItem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,8 +137,11 @@ QSize QuickPluginWindow::suitableSize() const
|
|||||||
return suitableSize(m_position);
|
return suitableSize(m_position);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QuickPluginWindow::addPlugin(QuickSettingItem *item)
|
void QuickPluginWindow::addPlugin(PluginsItemInterface *pluginItem)
|
||||||
{
|
{
|
||||||
|
if (!isQuickPlugin(pluginItem))
|
||||||
|
return;
|
||||||
|
|
||||||
for (int i = 0; i < m_mainLayout->count(); i++) {
|
for (int i = 0; i < m_mainLayout->count(); i++) {
|
||||||
QLayoutItem *layoutItem = m_mainLayout->itemAt(i);
|
QLayoutItem *layoutItem = m_mainLayout->itemAt(i);
|
||||||
if (!layoutItem)
|
if (!layoutItem)
|
||||||
@ -148,14 +151,14 @@ void QuickPluginWindow::addPlugin(QuickSettingItem *item)
|
|||||||
if (!dockItem)
|
if (!dockItem)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (item->pluginItem() == dockItem->pluginItem()) {
|
if (pluginItem == dockItem->pluginItem()) {
|
||||||
resetPluginDisplay();
|
resetPluginDisplay();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (fixedPluginNames.contains(item->pluginItem()->pluginName())) {
|
if (fixedPluginNames.contains(pluginItem->pluginName())) {
|
||||||
// 新插入的插件如果是固定插件,则将其插入到固定插件列表中,并对其进行排序
|
// 新插入的插件如果是固定插件,则将其插入到固定插件列表中,并对其进行排序
|
||||||
m_fixedSettingItems << item->pluginItem();
|
m_fixedSettingItems << pluginItem;
|
||||||
qSort(m_fixedSettingItems.begin(), m_fixedSettingItems.end(), [](PluginsItemInterface *item1, PluginsItemInterface *item2) {
|
qSort(m_fixedSettingItems.begin(), m_fixedSettingItems.end(), [](PluginsItemInterface *item1, PluginsItemInterface *item2) {
|
||||||
int index1 = fixedPluginNames.indexOf(item1->pluginName());
|
int index1 = fixedPluginNames.indexOf(item1->pluginName());
|
||||||
int index2 = fixedPluginNames.indexOf(item2->pluginName());
|
int index2 = fixedPluginNames.indexOf(item2->pluginName());
|
||||||
@ -163,7 +166,7 @@ void QuickPluginWindow::addPlugin(QuickSettingItem *item)
|
|||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// 如果是非固定插件,则直接插入到末尾
|
// 如果是非固定插件,则直接插入到末尾
|
||||||
m_activeSettingItems << item->pluginItem();
|
m_activeSettingItems << pluginItem;
|
||||||
}
|
}
|
||||||
resetPluginDisplay();
|
resetPluginDisplay();
|
||||||
Q_EMIT itemCountChanged();
|
Q_EMIT itemCountChanged();
|
||||||
@ -319,6 +322,15 @@ QuickDockItem *QuickPluginWindow::getDockItemByPlugin(PluginsItemInterface *item
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool QuickPluginWindow::isQuickPlugin(PluginsItemInterface *pluginItem)
|
||||||
|
{
|
||||||
|
QJsonObject metaData = QuickSettingController::instance()->metaData(pluginItem);
|
||||||
|
if (metaData.contains("tool"))
|
||||||
|
return !metaData.value("tool").toBool();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
int QuickPluginWindow::getDropIndex(QPoint point)
|
int QuickPluginWindow::getDropIndex(QPoint point)
|
||||||
{
|
{
|
||||||
QuickDockItem *targetItem = getDockItemByPlugin(findQuickSettingItem(point, m_activeSettingItems));
|
QuickDockItem *targetItem = getDockItemByPlugin(findQuickSettingItem(point, m_activeSettingItems));
|
||||||
@ -435,6 +447,7 @@ void QuickPluginWindow::resetPluginDisplay()
|
|||||||
}
|
}
|
||||||
// 将列表中所有的控件按照顺序添加到布局上
|
// 将列表中所有的控件按照顺序添加到布局上
|
||||||
auto addWidget = [ = ](const QList<PluginsItemInterface *> &items) {
|
auto addWidget = [ = ](const QList<PluginsItemInterface *> &items) {
|
||||||
|
QuickSettingController *quickController = QuickSettingController::instance();
|
||||||
for (PluginsItemInterface *item : items) {
|
for (PluginsItemInterface *item : items) {
|
||||||
QuickDockItem *itemWidget = nullptr;
|
QuickDockItem *itemWidget = nullptr;
|
||||||
if (pluginItems.contains(item)) {
|
if (pluginItems.contains(item)) {
|
||||||
@ -445,7 +458,7 @@ void QuickPluginWindow::resetPluginDisplay()
|
|||||||
if (pluginLoader)
|
if (pluginLoader)
|
||||||
metaData = pluginLoader->metaData().value("MetaData").toObject();
|
metaData = pluginLoader->metaData().value("MetaData").toObject();
|
||||||
|
|
||||||
itemWidget = new QuickDockItem(item, metaData, this);
|
itemWidget = new QuickDockItem(item, metaData, quickController->itemKey(item), this);
|
||||||
itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT);
|
itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT);
|
||||||
}
|
}
|
||||||
connect(itemWidget, &QuickDockItem::clicked, this, &QuickPluginWindow::onFixedClick);
|
connect(itemWidget, &QuickDockItem::clicked, this, &QuickPluginWindow::onFixedClick);
|
||||||
@ -460,16 +473,19 @@ void QuickPluginWindow::resetPluginDisplay()
|
|||||||
|
|
||||||
void QuickPluginWindow::initConnection()
|
void QuickPluginWindow::initConnection()
|
||||||
{
|
{
|
||||||
connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ this ](QuickSettingItem * settingItem) {
|
connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ this ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginClass) {
|
||||||
const QString pluginName = settingItem->pluginItem()->pluginName();
|
if (pluginClass != QuickSettingController::PluginAttribute::Quick)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const QString pluginName = itemInter->pluginName();
|
||||||
if (!fixedPluginNames.contains(pluginName))
|
if (!fixedPluginNames.contains(pluginName))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
addPlugin(settingItem);
|
addPlugin(itemInter);
|
||||||
});
|
});
|
||||||
|
|
||||||
connect(QuickSettingController::instance(), &QuickSettingController::pluginRemoved, this, [ this ] (QuickSettingItem *settingItem){
|
connect(QuickSettingController::instance(), &QuickSettingController::pluginRemoved, this, [ this ] (PluginsItemInterface *itemInter){
|
||||||
removePlugin(settingItem->pluginItem());
|
removePlugin(itemInter);
|
||||||
});
|
});
|
||||||
|
|
||||||
connect(QuickSettingController::instance(), &QuickSettingController::pluginUpdated, this, &QuickPluginWindow::onUpdatePlugin);
|
connect(QuickSettingController::instance(), &QuickSettingController::pluginUpdated, this, &QuickPluginWindow::onUpdatePlugin);
|
||||||
@ -480,10 +496,11 @@ void QuickPluginWindow::initConnection()
|
|||||||
* @param pluginItem
|
* @param pluginItem
|
||||||
* @param parent
|
* @param parent
|
||||||
*/
|
*/
|
||||||
QuickDockItem::QuickDockItem(PluginsItemInterface *pluginItem, const QJsonObject &metaData, QWidget *parent)
|
QuickDockItem::QuickDockItem(PluginsItemInterface *pluginItem, const QJsonObject &metaData, const QString itemKey, QWidget *parent)
|
||||||
: QWidget(parent)
|
: QWidget(parent)
|
||||||
, m_pluginItem(pluginItem)
|
, m_pluginItem(pluginItem)
|
||||||
, m_metaData(metaData)
|
, m_metaData(metaData)
|
||||||
|
, m_itemKey(itemKey)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -509,8 +526,7 @@ void QuickDockItem::paintEvent(QPaintEvent *event)
|
|||||||
if (!m_pluginItem)
|
if (!m_pluginItem)
|
||||||
return QWidget::paintEvent(event);
|
return QWidget::paintEvent(event);
|
||||||
|
|
||||||
int pixmapSize = static_cast<int>(ICONHEIGHT * qApp->devicePixelRatio());
|
QPixmap pixmap = iconPixmap();
|
||||||
QPixmap pixmap = m_pluginItem->icon(DockPart::QuickPanel).pixmap(pixmapSize, pixmapSize);
|
|
||||||
QRect pixmapRect = QRect((rect().width() - ICONHEIGHT) / 2, (rect().height() - ICONHEIGHT) / 2,
|
QRect pixmapRect = QRect((rect().width() - ICONHEIGHT) / 2, (rect().height() - ICONHEIGHT) / 2,
|
||||||
ICONHEIGHT, ICONHEIGHT);
|
ICONHEIGHT, ICONHEIGHT);
|
||||||
|
|
||||||
@ -523,3 +539,19 @@ void QuickDockItem::mouseReleaseEvent(QMouseEvent *event)
|
|||||||
Q_EMIT clicked();
|
Q_EMIT clicked();
|
||||||
QWidget::mouseReleaseEvent(event);
|
QWidget::mouseReleaseEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QPixmap QuickDockItem::iconPixmap() const
|
||||||
|
{
|
||||||
|
int pixmapSize = static_cast<int>(ICONHEIGHT * qApp->devicePixelRatio());
|
||||||
|
QIcon icon = m_pluginItem->icon(DockPart::QuickShow);
|
||||||
|
if (!icon.isNull())
|
||||||
|
return icon.pixmap(pixmapSize, pixmapSize);
|
||||||
|
|
||||||
|
QWidget *itemWidget = m_pluginItem->itemWidget(m_itemKey);
|
||||||
|
if (itemWidget) {
|
||||||
|
itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT);
|
||||||
|
return itemWidget->grab();
|
||||||
|
}
|
||||||
|
|
||||||
|
return QPixmap();
|
||||||
|
}
|
||||||
|
@ -62,7 +62,7 @@ protected:
|
|||||||
void mousePressEvent(QMouseEvent *event) override;
|
void mousePressEvent(QMouseEvent *event) override;
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void addPlugin(QuickSettingItem *item);
|
void addPlugin(PluginsItemInterface *pluginItem);
|
||||||
void removePlugin(PluginsItemInterface *item);
|
void removePlugin(PluginsItemInterface *item);
|
||||||
void onPluginDropItem(QDropEvent *event);
|
void onPluginDropItem(QDropEvent *event);
|
||||||
void onPluginDragMove(QDragMoveEvent *event);
|
void onPluginDragMove(QDragMoveEvent *event);
|
||||||
@ -79,6 +79,7 @@ private:
|
|||||||
void resetPluginDisplay();
|
void resetPluginDisplay();
|
||||||
QPoint popupPoint() const;
|
QPoint popupPoint() const;
|
||||||
QuickDockItem *getDockItemByPlugin(PluginsItemInterface *item);
|
QuickDockItem *getDockItemByPlugin(PluginsItemInterface *item);
|
||||||
|
bool isQuickPlugin(PluginsItemInterface *pluginItem);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QBoxLayout *m_mainLayout;
|
QBoxLayout *m_mainLayout;
|
||||||
@ -93,7 +94,7 @@ class QuickDockItem : public QWidget
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit QuickDockItem(PluginsItemInterface *pluginItem, const QJsonObject &metaData, QWidget *parent = nullptr);
|
explicit QuickDockItem(PluginsItemInterface *pluginItem, const QJsonObject &metaData, const QString itemKey, QWidget *parent = nullptr);
|
||||||
~QuickDockItem();
|
~QuickDockItem();
|
||||||
|
|
||||||
PluginsItemInterface *pluginItem();
|
PluginsItemInterface *pluginItem();
|
||||||
@ -106,9 +107,12 @@ protected:
|
|||||||
void paintEvent(QPaintEvent *event);
|
void paintEvent(QPaintEvent *event);
|
||||||
void mouseReleaseEvent(QMouseEvent *event);
|
void mouseReleaseEvent(QMouseEvent *event);
|
||||||
|
|
||||||
|
QPixmap iconPixmap() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
PluginsItemInterface *m_pluginItem;
|
PluginsItemInterface *m_pluginItem;
|
||||||
QJsonObject m_metaData;
|
QJsonObject m_metaData;
|
||||||
|
QString m_itemKey;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // QUICKPLUGINWINDOW_H
|
#endif // QUICKPLUGINWINDOW_H
|
||||||
|
@ -144,12 +144,14 @@ void QuickSettingContainer::setPosition(Position position)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void QuickSettingContainer::initQuickItem(QuickSettingItem *quickItem)
|
void QuickSettingContainer::initQuickItem(PluginsItemInterface *plugin)
|
||||||
{
|
{
|
||||||
|
QuickSettingItem *quickItem = new QuickSettingItem(plugin, m_pluginLoader->itemKey(plugin), m_pluginLoader->metaData(plugin));
|
||||||
quickItem->setParent(m_pluginWidget);
|
quickItem->setParent(m_pluginWidget);
|
||||||
quickItem->setMouseTracking(true);
|
quickItem->setMouseTracking(true);
|
||||||
quickItem->installEventFilter(this);
|
quickItem->installEventFilter(this);
|
||||||
connect(quickItem, &QuickSettingItem::detailClicked, this, &QuickSettingContainer::onItemDetailClick);
|
connect(quickItem, &QuickSettingItem::detailClicked, this, &QuickSettingContainer::onItemDetailClick);
|
||||||
|
m_quickSettings << quickItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QuickSettingContainer::onItemDetailClick(PluginsItemInterface *pluginInter)
|
void QuickSettingContainer::onItemDetailClick(PluginsItemInterface *pluginInter)
|
||||||
@ -181,19 +183,31 @@ void QuickSettingContainer::showWidget(QWidget *widget, const QString &title)
|
|||||||
m_switchLayout->setCurrentWidget(m_childPage);
|
m_switchLayout->setCurrentWidget(m_childPage);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QuickSettingContainer::onPluginInsert(QuickSettingItem *quickItem)
|
void QuickSettingContainer::onPluginInsert(PluginsItemInterface * itemInter)
|
||||||
{
|
{
|
||||||
initQuickItem(quickItem);
|
initQuickItem(itemInter);
|
||||||
updateItemLayout();
|
updateItemLayout();
|
||||||
onResizeView();
|
onResizeView();
|
||||||
}
|
}
|
||||||
|
|
||||||
void QuickSettingContainer::onPluginRemove(QuickSettingItem *quickItem)
|
void QuickSettingContainer::onPluginRemove(PluginsItemInterface * itemInter)
|
||||||
{
|
{
|
||||||
|
QuickSettingItem *quickItem = nullptr;
|
||||||
|
for (QuickSettingItem *settingItem : m_quickSettings) {
|
||||||
|
if (settingItem->pluginItem() != itemInter)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
quickItem = settingItem;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!quickItem)
|
||||||
|
return;
|
||||||
|
|
||||||
disconnect(quickItem, &QuickSettingItem::detailClicked, this, &QuickSettingContainer::onItemDetailClick);
|
disconnect(quickItem, &QuickSettingItem::detailClicked, this, &QuickSettingContainer::onItemDetailClick);
|
||||||
quickItem->setParent(nullptr);
|
quickItem->setParent(nullptr);
|
||||||
quickItem->removeEventFilter(this);
|
quickItem->removeEventFilter(this);
|
||||||
quickItem->setMouseTracking(false);
|
quickItem->setMouseTracking(false);
|
||||||
|
quickItem->deleteLater();
|
||||||
|
|
||||||
//调整子控件的位置
|
//调整子控件的位置
|
||||||
updateItemLayout();
|
updateItemLayout();
|
||||||
@ -258,8 +272,7 @@ void QuickSettingContainer::updateItemLayout()
|
|||||||
|
|
||||||
int row = 0;
|
int row = 0;
|
||||||
int column = 0;
|
int column = 0;
|
||||||
QList<QuickSettingItem *> quickSettings = m_pluginLoader->settingItems();
|
for (QuickSettingItem *item : m_quickSettings) {
|
||||||
for (QuickSettingItem *item : quickSettings) {
|
|
||||||
int usedColumn = item->isPrimary() ? 2 : 1;
|
int usedColumn = item->isPrimary() ? 2 : 1;
|
||||||
m_pluginLayout->addWidget(item, row, column, 1, usedColumn);
|
m_pluginLayout->addWidget(item, row, column, 1, usedColumn);
|
||||||
column += usedColumn;
|
column += usedColumn;
|
||||||
@ -309,9 +322,9 @@ void QuickSettingContainer::initUi()
|
|||||||
|
|
||||||
m_mainlayout->addWidget(m_componentWidget);
|
m_mainlayout->addWidget(m_componentWidget);
|
||||||
// 加载所有的插件
|
// 加载所有的插件
|
||||||
QList<QuickSettingItem *> pluginItems = m_pluginLoader->settingItems();
|
QList<PluginsItemInterface *> plugins = m_pluginLoader->pluginItems(QuickSettingController::PluginAttribute::Quick);
|
||||||
for (QuickSettingItem *quickItem: pluginItems)
|
for (PluginsItemInterface *plugin : plugins)
|
||||||
initQuickItem(quickItem);
|
initQuickItem(plugin);
|
||||||
|
|
||||||
m_switchLayout->addWidget(m_mainWidget);
|
m_switchLayout->addWidget(m_mainWidget);
|
||||||
m_switchLayout->addWidget(m_childPage);
|
m_switchLayout->addWidget(m_childPage);
|
||||||
@ -322,7 +335,7 @@ void QuickSettingContainer::initUi()
|
|||||||
setAcceptDrops(true);
|
setAcceptDrops(true);
|
||||||
|
|
||||||
QMetaObject::invokeMethod(this, [ = ] {
|
QMetaObject::invokeMethod(this, [ = ] {
|
||||||
if (pluginItems.size() > 0)
|
if (plugins.size() > 0)
|
||||||
updateItemLayout();
|
updateItemLayout();
|
||||||
// 设置当前窗口的大小
|
// 设置当前窗口的大小
|
||||||
onResizeView();
|
onResizeView();
|
||||||
@ -334,7 +347,12 @@ void QuickSettingContainer::initUi()
|
|||||||
|
|
||||||
void QuickSettingContainer::initConnection()
|
void QuickSettingContainer::initConnection()
|
||||||
{
|
{
|
||||||
connect(m_pluginLoader, &QuickSettingController::pluginInserted, this, &QuickSettingContainer::onPluginInsert);
|
connect(m_pluginLoader, &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginClass) {
|
||||||
|
if (pluginClass != QuickSettingController::PluginAttribute::Quick)
|
||||||
|
return;
|
||||||
|
|
||||||
|
onPluginInsert(itemInter);
|
||||||
|
});
|
||||||
connect(m_pluginLoader, &QuickSettingController::pluginRemoved, this, &QuickSettingContainer::onPluginRemove);
|
connect(m_pluginLoader, &QuickSettingController::pluginRemoved, this, &QuickSettingContainer::onPluginRemove);
|
||||||
connect(m_playerWidget, &MediaWidget::visibleChanged, this, &QuickSettingContainer::onResizeView);
|
connect(m_playerWidget, &MediaWidget::visibleChanged, this, &QuickSettingContainer::onResizeView);
|
||||||
connect(m_volumnWidget, &VolumeWidget::visibleChanged, this, &QuickSettingContainer::onResizeView);
|
connect(m_volumnWidget, &VolumeWidget::visibleChanged, this, &QuickSettingContainer::onResizeView);
|
||||||
@ -363,9 +381,8 @@ void QuickSettingContainer::initConnection()
|
|||||||
void QuickSettingContainer::onResizeView()
|
void QuickSettingContainer::onResizeView()
|
||||||
{
|
{
|
||||||
if (m_switchLayout->currentWidget() == m_mainWidget) {
|
if (m_switchLayout->currentWidget() == m_mainWidget) {
|
||||||
QList<QuickSettingItem *> pluginItems = m_pluginLoader->settingItems();
|
|
||||||
int selfPluginCount = 0;
|
int selfPluginCount = 0;
|
||||||
for (QuickSettingItem *item : pluginItems) {
|
for (QuickSettingItem *item : m_quickSettings) {
|
||||||
// 如果是置顶的插件,则认为它占用两个普通插件的位置
|
// 如果是置顶的插件,则认为它占用两个普通插件的位置
|
||||||
int increCount = (item->isPrimary() ? 2 : 1);
|
int increCount = (item->isPrimary() ? 2 : 1);
|
||||||
selfPluginCount += increCount;
|
selfPluginCount += increCount;
|
||||||
|
@ -66,8 +66,8 @@ protected:
|
|||||||
void showHomePage();
|
void showHomePage();
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void onPluginInsert(QuickSettingItem *quickItem);
|
void onPluginInsert(PluginsItemInterface * itemInter);
|
||||||
void onPluginRemove(QuickSettingItem *quickItem);
|
void onPluginRemove(PluginsItemInterface * itemInter);
|
||||||
void onItemDetailClick(PluginsItemInterface *pluginInter);
|
void onItemDetailClick(PluginsItemInterface *pluginInter);
|
||||||
bool eventFilter(QObject *watched, QEvent *event) override;
|
bool eventFilter(QObject *watched, QEvent *event) override;
|
||||||
void onResizeView();
|
void onResizeView();
|
||||||
@ -80,7 +80,7 @@ private:
|
|||||||
// 调整控件位置
|
// 调整控件位置
|
||||||
void updateItemLayout();
|
void updateItemLayout();
|
||||||
// 初始化控件项目
|
// 初始化控件项目
|
||||||
void initQuickItem(QuickSettingItem *quickItem);
|
void initQuickItem(PluginsItemInterface *plugin);
|
||||||
// 显示具体的窗体
|
// 显示具体的窗体
|
||||||
void showWidget(QWidget *widget, const QString &title);
|
void showWidget(QWidget *widget, const QString &title);
|
||||||
// 清除移动轨迹
|
// 清除移动轨迹
|
||||||
@ -106,6 +106,7 @@ private:
|
|||||||
DisplaySettingWidget *m_displaySettingWidget;
|
DisplaySettingWidget *m_displaySettingWidget;
|
||||||
PluginChildPage *m_childPage;
|
PluginChildPage *m_childPage;
|
||||||
QPoint m_dragPluginPosition;
|
QPoint m_dragPluginPosition;
|
||||||
|
QList<QuickSettingItem *> m_quickSettings;
|
||||||
};
|
};
|
||||||
|
|
||||||
class QuickPluginMimeData : public QMimeData
|
class QuickPluginMimeData : public QMimeData
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
#include "systempluginwindow.h"
|
#include "systempluginwindow.h"
|
||||||
#include "systemplugincontroller.h"
|
#include "systemplugincontroller.h"
|
||||||
#include "systempluginitem.h"
|
#include "systempluginitem.h"
|
||||||
#include "fixedplugincontroller.h"
|
#include "quicksettingcontroller.h"
|
||||||
|
|
||||||
#include <DListView>
|
#include <DListView>
|
||||||
#include <QBoxLayout>
|
#include <QBoxLayout>
|
||||||
@ -35,21 +35,33 @@
|
|||||||
|
|
||||||
SystemPluginWindow::SystemPluginWindow(QWidget *parent)
|
SystemPluginWindow::SystemPluginWindow(QWidget *parent)
|
||||||
: QWidget(parent)
|
: QWidget(parent)
|
||||||
, m_pluginController(new FixedPluginController(this))
|
|
||||||
, m_listView(new DListView(this))
|
, m_listView(new DListView(this))
|
||||||
|
, m_displayMode(Dock::DisplayMode::Efficient)
|
||||||
, m_position(Dock::Position::Bottom)
|
, m_position(Dock::Position::Bottom)
|
||||||
, m_mainLayout(new QBoxLayout(QBoxLayout::Direction::LeftToRight, this))
|
, m_mainLayout(new QBoxLayout(QBoxLayout::Direction::LeftToRight, this))
|
||||||
{
|
{
|
||||||
initUi();
|
initUi();
|
||||||
connect(m_pluginController, &FixedPluginController::pluginItemInserted, this, &SystemPluginWindow::onPluginItemAdded);
|
initConnection();
|
||||||
connect(m_pluginController, &FixedPluginController::pluginItemRemoved, this, &SystemPluginWindow::onPluginItemRemoved);
|
|
||||||
connect(m_pluginController, &FixedPluginController::pluginItemUpdated, this, &SystemPluginWindow::onPluginItemUpdated);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SystemPluginWindow::~SystemPluginWindow()
|
SystemPluginWindow::~SystemPluginWindow()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SystemPluginWindow::setDisplayMode(const DisplayMode &displayMode)
|
||||||
|
{
|
||||||
|
m_displayMode = displayMode;
|
||||||
|
|
||||||
|
QObjectList childObjects = children();
|
||||||
|
for (QObject *childObject : childObjects) {
|
||||||
|
StretchPluginsItem *item = qobject_cast<StretchPluginsItem *>(childObject);
|
||||||
|
if (!item)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
item->setDisplayMode(displayMode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SystemPluginWindow::setPositon(Position position)
|
void SystemPluginWindow::setPositon(Position position)
|
||||||
{
|
{
|
||||||
if (m_position == position)
|
if (m_position == position)
|
||||||
@ -111,46 +123,66 @@ void SystemPluginWindow::initUi()
|
|||||||
m_mainLayout->setSpacing(0);
|
m_mainLayout->setSpacing(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SystemPluginWindow::pluginExist(StretchPluginsItem *pluginItem)
|
void SystemPluginWindow::initConnection()
|
||||||
|
{
|
||||||
|
QuickSettingController *quickController = QuickSettingController::instance();
|
||||||
|
connect(quickController, &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute &pluginClass) {
|
||||||
|
if (pluginClass != QuickSettingController::PluginAttribute::Fixed)
|
||||||
|
return;
|
||||||
|
|
||||||
|
pluginAdded(itemInter);
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(quickController, &QuickSettingController::pluginRemoved, this, &SystemPluginWindow::onPluginItemRemoved);
|
||||||
|
connect(quickController, &QuickSettingController::pluginUpdated, this, &SystemPluginWindow::onPluginItemUpdated);
|
||||||
|
|
||||||
|
QList<PluginsItemInterface *> plugins = quickController->pluginItems(QuickSettingController::PluginAttribute::Fixed);
|
||||||
|
for (int i = 0; i < plugins.size(); i++)
|
||||||
|
pluginAdded(plugins[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
StretchPluginsItem *SystemPluginWindow::findPluginItemWidget(PluginsItemInterface *pluginItem)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < m_mainLayout->count(); i++) {
|
for (int i = 0; i < m_mainLayout->count(); i++) {
|
||||||
QLayoutItem *layoutItem = m_mainLayout->itemAt(i);
|
QLayoutItem *layoutItem = m_mainLayout->itemAt(i);
|
||||||
if (!layoutItem)
|
if (!layoutItem)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (layoutItem->widget() == pluginItem)
|
StretchPluginsItem *itemWidget = qobject_cast<StretchPluginsItem *>(layoutItem->widget());
|
||||||
return true;
|
if (itemWidget && itemWidget->pluginInter() == pluginItem)
|
||||||
|
return itemWidget;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SystemPluginWindow::onPluginItemAdded(StretchPluginsItem *pluginItem)
|
void SystemPluginWindow::pluginAdded(PluginsItemInterface *plugin)
|
||||||
{
|
{
|
||||||
if (pluginExist(pluginItem))
|
StretchPluginsItem *item = new StretchPluginsItem(plugin, QuickSettingController::instance()->itemKey(plugin));
|
||||||
return;
|
item->setDisplayMode(m_displayMode);
|
||||||
|
item->setPosition(m_position);
|
||||||
pluginItem->setPosition(m_position);
|
item->setParent(this);
|
||||||
pluginItem->setParent(this);
|
item->show();
|
||||||
pluginItem->show();
|
m_mainLayout->addWidget(item);
|
||||||
m_mainLayout->addWidget(pluginItem);
|
|
||||||
Q_EMIT itemChanged();
|
Q_EMIT itemChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SystemPluginWindow::onPluginItemRemoved(StretchPluginsItem *pluginItem)
|
void SystemPluginWindow::onPluginItemRemoved(PluginsItemInterface *pluginItem)
|
||||||
{
|
{
|
||||||
if (!pluginExist(pluginItem))
|
StretchPluginsItem *item = findPluginItemWidget(pluginItem);
|
||||||
return;
|
if (item) {
|
||||||
|
item->setParent(nullptr);
|
||||||
pluginItem->setParent(nullptr);
|
item->hide();
|
||||||
pluginItem->hide();
|
m_mainLayout->removeWidget(item);
|
||||||
m_mainLayout->removeWidget(pluginItem);
|
Q_EMIT itemChanged();
|
||||||
Q_EMIT itemChanged();
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SystemPluginWindow::onPluginItemUpdated(StretchPluginsItem *pluginItem)
|
void SystemPluginWindow::onPluginItemUpdated(PluginsItemInterface *pluginItem)
|
||||||
{
|
{
|
||||||
pluginItem->update();
|
StretchPluginsItem *item = findPluginItemWidget(pluginItem);
|
||||||
|
if (item)
|
||||||
|
item->update();
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ICONSIZE 20
|
#define ICONSIZE 20
|
||||||
@ -161,6 +193,7 @@ StretchPluginsItem::StretchPluginsItem(PluginsItemInterface * const pluginInter,
|
|||||||
: DockItem(parent)
|
: DockItem(parent)
|
||||||
, m_pluginInter(pluginInter)
|
, m_pluginInter(pluginInter)
|
||||||
, m_itemKey(itemKey)
|
, m_itemKey(itemKey)
|
||||||
|
, m_displayMode(Dock::DisplayMode::Efficient)
|
||||||
, m_position(Dock::Position::Bottom)
|
, m_position(Dock::Position::Bottom)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -169,6 +202,11 @@ StretchPluginsItem::~StretchPluginsItem()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void StretchPluginsItem::setDisplayMode(const DisplayMode &displayMode)
|
||||||
|
{
|
||||||
|
m_displayMode = displayMode;
|
||||||
|
}
|
||||||
|
|
||||||
void StretchPluginsItem::setPosition(Position position)
|
void StretchPluginsItem::setPosition(Position position)
|
||||||
{
|
{
|
||||||
m_position = position;
|
m_position = position;
|
||||||
@ -260,6 +298,9 @@ QFont StretchPluginsItem::textFont(const Position &position) const
|
|||||||
|
|
||||||
bool StretchPluginsItem::needShowText() const
|
bool StretchPluginsItem::needShowText() const
|
||||||
{
|
{
|
||||||
|
// 如果是高效模式,则不需要显示下面的文本
|
||||||
|
if (m_displayMode == Dock::DisplayMode::Efficient)
|
||||||
|
return false;
|
||||||
// 任务栏在上方或者下方显示的时候,根据设计图,只有在当前区域高度大于50的时候才同时显示文本和图标
|
// 任务栏在上方或者下方显示的时候,根据设计图,只有在当前区域高度大于50的时候才同时显示文本和图标
|
||||||
if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom)
|
if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom)
|
||||||
return height() >= 50;
|
return height() >= 50;
|
||||||
|
@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
|
|
||||||
class FixedPluginController;
|
|
||||||
class StretchPluginsItem;
|
class StretchPluginsItem;
|
||||||
class QBoxLayout;
|
class QBoxLayout;
|
||||||
class PluginsItemInterface;
|
class PluginsItemInterface;
|
||||||
@ -42,6 +41,7 @@ class SystemPluginWindow : public QWidget
|
|||||||
public:
|
public:
|
||||||
explicit SystemPluginWindow(QWidget *parent = nullptr);
|
explicit SystemPluginWindow(QWidget *parent = nullptr);
|
||||||
~SystemPluginWindow() override;
|
~SystemPluginWindow() override;
|
||||||
|
void setDisplayMode(const Dock::DisplayMode &displayMode);
|
||||||
void setPositon(Dock::Position position);
|
void setPositon(Dock::Position position);
|
||||||
QSize suitableSize() const;
|
QSize suitableSize() const;
|
||||||
QSize suitableSize(const Dock::Position &position) const;
|
QSize suitableSize(const Dock::Position &position) const;
|
||||||
@ -51,16 +51,17 @@ Q_SIGNALS:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void initUi();
|
void initUi();
|
||||||
bool pluginExist(StretchPluginsItem *pluginItem);
|
void initConnection();
|
||||||
|
StretchPluginsItem *findPluginItemWidget(PluginsItemInterface *pluginItem);
|
||||||
|
void pluginAdded(PluginsItemInterface *plugin);
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void onPluginItemAdded(StretchPluginsItem *pluginItem);
|
void onPluginItemRemoved(PluginsItemInterface *pluginItem);
|
||||||
void onPluginItemRemoved(StretchPluginsItem *pluginItem);
|
void onPluginItemUpdated(PluginsItemInterface *pluginItem);
|
||||||
void onPluginItemUpdated(StretchPluginsItem *pluginItem);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
FixedPluginController *m_pluginController;
|
|
||||||
DListView *m_listView;
|
DListView *m_listView;
|
||||||
|
Dock::DisplayMode m_displayMode;
|
||||||
Dock::Position m_position;
|
Dock::Position m_position;
|
||||||
QBoxLayout *m_mainLayout;
|
QBoxLayout *m_mainLayout;
|
||||||
};
|
};
|
||||||
@ -72,6 +73,7 @@ class StretchPluginsItem : public DockItem
|
|||||||
public:
|
public:
|
||||||
StretchPluginsItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent = nullptr);
|
StretchPluginsItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent = nullptr);
|
||||||
~StretchPluginsItem() override;
|
~StretchPluginsItem() override;
|
||||||
|
void setDisplayMode(const Dock::DisplayMode &displayMode);
|
||||||
void setPosition(Dock::Position position);
|
void setPosition(Dock::Position position);
|
||||||
PluginsItemInterface *pluginInter() const;
|
PluginsItemInterface *pluginInter() const;
|
||||||
QString itemKey() const;
|
QString itemKey() const;
|
||||||
@ -97,6 +99,7 @@ private:
|
|||||||
private:
|
private:
|
||||||
PluginsItemInterface *m_pluginInter;
|
PluginsItemInterface *m_pluginInter;
|
||||||
QString m_itemKey;
|
QString m_itemKey;
|
||||||
|
Dock::DisplayMode m_displayMode;
|
||||||
Dock::Position m_position;
|
Dock::Position m_position;
|
||||||
QPoint m_mousePressPoint;
|
QPoint m_mousePressPoint;
|
||||||
};
|
};
|
||||||
|
@ -39,18 +39,11 @@ ExpandIconWidget::ExpandIconWidget(QWidget *parent, Qt::WindowFlags f)
|
|||||||
: BaseTrayWidget(parent, f)
|
: BaseTrayWidget(parent, f)
|
||||||
, m_regionInter(new DRegionMonitor(this))
|
, m_regionInter(new DRegionMonitor(this))
|
||||||
, m_position(Dock::Position::Bottom)
|
, m_position(Dock::Position::Bottom)
|
||||||
, m_gridParentView(new RoundWidget(nullptr))
|
|
||||||
, m_trayView(new TrayGridView(m_gridParentView))
|
|
||||||
, m_trayDelegate(new TrayDelegate(m_trayView, m_trayView))
|
|
||||||
, m_trayModel(new TrayModel(m_trayView, true, false))
|
|
||||||
{
|
{
|
||||||
initUi();
|
|
||||||
initConnection();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ExpandIconWidget::~ExpandIconWidget()
|
ExpandIconWidget::~ExpandIconWidget()
|
||||||
{
|
{
|
||||||
m_gridParentView->deleteLater();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExpandIconWidget::setPositonValue(Dock::Position position)
|
void ExpandIconWidget::setPositonValue(Dock::Position position)
|
||||||
@ -69,17 +62,19 @@ void ExpandIconWidget::sendClick(uint8_t mouseButton, int x, int y)
|
|||||||
if (mouseButton != XCB_BUTTON_INDEX_1)
|
if (mouseButton != XCB_BUTTON_INDEX_1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
setTrayPanelVisible(!m_gridParentView->isVisible());
|
QWidget *gridParentView = popupTrayView();
|
||||||
|
setTrayPanelVisible(!gridParentView->isVisible());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExpandIconWidget::setTrayPanelVisible(bool visible)
|
void ExpandIconWidget::setTrayPanelVisible(bool visible)
|
||||||
{
|
{
|
||||||
|
QWidget *gridParentView = popupTrayView();
|
||||||
if (visible) {
|
if (visible) {
|
||||||
resetPosition();
|
resetPosition();
|
||||||
m_gridParentView->show();
|
gridParentView->show();
|
||||||
m_regionInter->registerRegion();
|
m_regionInter->registerRegion();
|
||||||
} else {
|
} else {
|
||||||
m_gridParentView->hide();
|
gridParentView->hide();
|
||||||
m_regionInter->unregisterRegion();
|
m_regionInter->unregisterRegion();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -89,8 +84,11 @@ QPixmap ExpandIconWidget::icon()
|
|||||||
return QPixmap(dropIconFile());
|
return QPixmap(dropIconFile());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExpandIconWidget::paintEvent(QPaintEvent *)
|
void ExpandIconWidget::paintEvent(QPaintEvent *event)
|
||||||
{
|
{
|
||||||
|
if (popupTrayView()->trayView()->model()->rowCount() == 0)
|
||||||
|
return BaseTrayWidget::paintEvent(event);
|
||||||
|
|
||||||
QPainter painter(this);
|
QPainter painter(this);
|
||||||
QPixmap pixmap = ImageUtil::loadSvg(dropIconFile(), QSize(ICON_SIZE, ICON_SIZE));
|
QPixmap pixmap = ImageUtil::loadSvg(dropIconFile(), QSize(ICON_SIZE, ICON_SIZE));
|
||||||
QRect rectOfPixmap(rect().x() + (rect().width() - ICON_SIZE) / 2,
|
QRect rectOfPixmap(rect().x() + (rect().width() - ICON_SIZE) / 2,
|
||||||
@ -129,9 +127,72 @@ const QString ExpandIconWidget::dropIconFile() const
|
|||||||
return iconFile + ".svg";
|
return iconFile + ".svg";
|
||||||
}
|
}
|
||||||
|
|
||||||
QWidget *ExpandIconWidget::popupTrayView()
|
TrayGridWidget *ExpandIconWidget::popupTrayView()
|
||||||
{
|
{
|
||||||
return m_gridParentView;
|
static TrayGridWidget *gridParentView = nullptr;
|
||||||
|
if (gridParentView)
|
||||||
|
return gridParentView;
|
||||||
|
|
||||||
|
gridParentView = new TrayGridWidget(nullptr);
|
||||||
|
TrayGridView *trayView = new TrayGridView(gridParentView);
|
||||||
|
TrayDelegate *trayDelegate = new TrayDelegate(trayView, trayView);
|
||||||
|
TrayModel *trayModel = new TrayModel(trayView, true, false);
|
||||||
|
gridParentView->setTrayGridView(trayView);
|
||||||
|
|
||||||
|
gridParentView->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);
|
||||||
|
trayView->setModel(trayModel);
|
||||||
|
trayView->setItemDelegate(trayDelegate);
|
||||||
|
trayView->setSpacing(ITEM_SPACING);
|
||||||
|
trayView->setDragDistance(2);
|
||||||
|
|
||||||
|
QVBoxLayout *layout = new QVBoxLayout(gridParentView);
|
||||||
|
layout->setContentsMargins(ITEM_SPACING, ITEM_SPACING, ITEM_SPACING, ITEM_SPACING);
|
||||||
|
layout->setSpacing(0);
|
||||||
|
layout->addWidget(trayView);
|
||||||
|
|
||||||
|
auto rowCountChanged = [ = ] {
|
||||||
|
int count = trayModel->rowCount();
|
||||||
|
trayView->setFixedSize(trayView->suitableSize());
|
||||||
|
gridParentView->setFixedSize(trayView->size() + QSize(ITEM_SPACING * 2, ITEM_SPACING * 2));
|
||||||
|
if (count > 0)
|
||||||
|
resetPosition();
|
||||||
|
else if (gridParentView->isVisible())
|
||||||
|
gridParentView->hide();
|
||||||
|
|
||||||
|
Q_EMIT trayVisbleChanged(count > 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
connect(trayView, &TrayGridView::rowCountChanged, this, rowCountChanged);
|
||||||
|
|
||||||
|
connect(trayDelegate, &TrayDelegate::removeRow, this, [ = ](const QModelIndex &index) {
|
||||||
|
trayView->model()->removeRow(index.row(),index.parent());
|
||||||
|
});
|
||||||
|
connect(trayView, &TrayGridView::requestRemove, trayModel, &TrayModel::removeRow);
|
||||||
|
connect(m_regionInter, &DRegionMonitor::buttonPress, this, [ = ](const QPoint &mousePos, const int flag) {
|
||||||
|
// 如果当前是隐藏,那么在点击任何地方都隐藏
|
||||||
|
if (!isVisible()) {
|
||||||
|
gridParentView->hide();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((flag != DRegionMonitor::WatchedFlags::Button_Left) && (flag != DRegionMonitor::WatchedFlags::Button_Right))
|
||||||
|
return;
|
||||||
|
|
||||||
|
QPoint ptPos = parentWidget()->mapToGlobal(this->pos());
|
||||||
|
const QRect rect = QRect(ptPos, size());
|
||||||
|
if (rect.contains(mousePos))
|
||||||
|
return;
|
||||||
|
|
||||||
|
const QRect rctView(gridParentView->pos(), gridParentView->size());
|
||||||
|
if (rctView.contains(mousePos))
|
||||||
|
return;
|
||||||
|
|
||||||
|
gridParentView->hide();
|
||||||
|
});
|
||||||
|
|
||||||
|
QMetaObject::invokeMethod(this, rowCountChanged, Qt::QueuedConnection);
|
||||||
|
|
||||||
|
return gridParentView;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExpandIconWidget::resetPosition()
|
void ExpandIconWidget::resetPosition()
|
||||||
@ -139,91 +200,29 @@ void ExpandIconWidget::resetPosition()
|
|||||||
if (!parentWidget())
|
if (!parentWidget())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
QWidget *gridParentView = popupTrayView();
|
||||||
QPoint ptPos = parentWidget()->mapToGlobal(this->pos());
|
QPoint ptPos = parentWidget()->mapToGlobal(this->pos());
|
||||||
switch (m_position) {
|
switch (m_position) {
|
||||||
case Dock::Position::Bottom: {
|
case Dock::Position::Bottom: {
|
||||||
ptPos.setY(ptPos.y() - m_gridParentView->height());
|
ptPos.setY(ptPos.y() - gridParentView->height());
|
||||||
ptPos.setX(ptPos.x() - m_gridParentView->width());
|
ptPos.setX(ptPos.x() - gridParentView->width());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Dock::Position::Top: {
|
case Dock::Position::Top: {
|
||||||
ptPos.setY(ptPos.y() + m_gridParentView->height());
|
ptPos.setY(ptPos.y() + gridParentView->height());
|
||||||
ptPos.setX(ptPos.x() - m_gridParentView->width());
|
ptPos.setX(ptPos.x() - gridParentView->width());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Dock::Position::Left: {
|
case Dock::Position::Left: {
|
||||||
ptPos.setX(ptPos.x() + m_gridParentView->width() / 2);
|
ptPos.setX(ptPos.x() + gridParentView->width() / 2);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Dock::Position::Right: {
|
case Dock::Position::Right: {
|
||||||
ptPos.setX(ptPos.x() - m_gridParentView->width() / 2);
|
ptPos.setX(ptPos.x() - gridParentView->width() / 2);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_gridParentView->move(ptPos);
|
gridParentView->move(ptPos);
|
||||||
}
|
|
||||||
|
|
||||||
void ExpandIconWidget::initUi()
|
|
||||||
{
|
|
||||||
m_gridParentView->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);
|
|
||||||
m_trayView->setModel(m_trayModel);
|
|
||||||
m_trayView->setItemDelegate(m_trayDelegate);
|
|
||||||
m_trayView->setSpacing(ITEM_SPACING);
|
|
||||||
m_trayView->setDragDistance(2);
|
|
||||||
|
|
||||||
QVBoxLayout *layout = new QVBoxLayout(m_gridParentView);
|
|
||||||
layout->setContentsMargins(ITEM_SPACING, ITEM_SPACING, ITEM_SPACING, ITEM_SPACING);
|
|
||||||
layout->setSpacing(0);
|
|
||||||
layout->addWidget(m_trayView);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ExpandIconWidget::initConnection()
|
|
||||||
{
|
|
||||||
connect(m_trayView, &TrayGridView::rowCountChanged, this, &ExpandIconWidget::onRowCountChanged);
|
|
||||||
|
|
||||||
connect(m_trayDelegate, &TrayDelegate::removeRow, this, [ = ](const QModelIndex &index) {
|
|
||||||
m_trayView->model()->removeRow(index.row(),index.parent());
|
|
||||||
});
|
|
||||||
connect(m_trayView, &TrayGridView::requestRemove, m_trayModel, &TrayModel::removeRow);
|
|
||||||
connect(m_regionInter, &DRegionMonitor::buttonPress, this, &ExpandIconWidget::onGlobMousePress);
|
|
||||||
|
|
||||||
QMetaObject::invokeMethod(this, &ExpandIconWidget::onRowCountChanged, Qt::QueuedConnection);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ExpandIconWidget::onRowCountChanged()
|
|
||||||
{
|
|
||||||
int count = m_trayModel->rowCount();
|
|
||||||
m_trayView->setFixedSize(m_trayView->suitableSize());
|
|
||||||
m_gridParentView->setFixedSize(m_trayView->size() + QSize(ITEM_SPACING * 2, ITEM_SPACING * 2));
|
|
||||||
if (count > 0)
|
|
||||||
resetPosition();
|
|
||||||
else if (m_gridParentView->isVisible())
|
|
||||||
m_gridParentView->hide();
|
|
||||||
|
|
||||||
Q_EMIT trayVisbleChanged(count > 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ExpandIconWidget::onGlobMousePress(const QPoint &mousePos, const int flag)
|
|
||||||
{
|
|
||||||
// 如果当前是隐藏,那么在点击任何地方都隐藏
|
|
||||||
if (!isVisible()) {
|
|
||||||
m_gridParentView->hide();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((flag != DRegionMonitor::WatchedFlags::Button_Left) && (flag != DRegionMonitor::WatchedFlags::Button_Right))
|
|
||||||
return;
|
|
||||||
|
|
||||||
QPoint ptPos = parentWidget()->mapToGlobal(this->pos());
|
|
||||||
const QRect rect = QRect(ptPos, size());
|
|
||||||
if (rect.contains(mousePos))
|
|
||||||
return;
|
|
||||||
|
|
||||||
const QRect rctView(m_gridParentView->pos(), m_gridParentView->size());
|
|
||||||
if (rctView.contains(mousePos))
|
|
||||||
return;
|
|
||||||
|
|
||||||
m_gridParentView->hide();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -231,14 +230,25 @@ void ExpandIconWidget::onGlobMousePress(const QPoint &mousePos, const int flag)
|
|||||||
* @param parent
|
* @param parent
|
||||||
*/
|
*/
|
||||||
|
|
||||||
RoundWidget::RoundWidget(QWidget *parent)
|
TrayGridWidget::TrayGridWidget(QWidget *parent)
|
||||||
: QWidget (parent)
|
: QWidget (parent)
|
||||||
, m_dockInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this))
|
, m_dockInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this))
|
||||||
|
, m_trayGridView(nullptr)
|
||||||
{
|
{
|
||||||
setAttribute(Qt::WA_TranslucentBackground);
|
setAttribute(Qt::WA_TranslucentBackground);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RoundWidget::paintEvent(QPaintEvent *event)
|
void TrayGridWidget::setTrayGridView(TrayGridView *trayView)
|
||||||
|
{
|
||||||
|
m_trayGridView = trayView;
|
||||||
|
}
|
||||||
|
|
||||||
|
TrayGridView *TrayGridWidget::trayView() const
|
||||||
|
{
|
||||||
|
return m_trayGridView;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrayGridWidget::paintEvent(QPaintEvent *event)
|
||||||
{
|
{
|
||||||
Q_UNUSED(event);
|
Q_UNUSED(event);
|
||||||
|
|
||||||
@ -252,7 +262,7 @@ void RoundWidget::paintEvent(QPaintEvent *event)
|
|||||||
painter.fillPath(path, maskColor());
|
painter.fillPath(path, maskColor());
|
||||||
}
|
}
|
||||||
|
|
||||||
QColor RoundWidget::maskColor() const
|
QColor TrayGridWidget::maskColor() const
|
||||||
{
|
{
|
||||||
QColor color = DGuiApplicationHelper::standardPalette(DGuiApplicationHelper::instance()->themeType()).window().color();
|
QColor color = DGuiApplicationHelper::standardPalette(DGuiApplicationHelper::instance()->themeType()).window().color();
|
||||||
int maskAlpha(static_cast<int>(255 * m_dockInter->opacity()));
|
int maskAlpha(static_cast<int>(255 * m_dockInter->opacity()));
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
class TrayGridView;
|
class TrayGridView;
|
||||||
class TrayModel;
|
class TrayModel;
|
||||||
class TrayDelegate;
|
class TrayDelegate;
|
||||||
|
class TrayGridWidget;
|
||||||
|
|
||||||
namespace Dtk { namespace Gui { class DRegionMonitor; } }
|
namespace Dtk { namespace Gui { class DRegionMonitor; } }
|
||||||
|
|
||||||
@ -45,41 +46,32 @@ public:
|
|||||||
QString itemKeyForConfig() override { return "Expand"; }
|
QString itemKeyForConfig() override { return "Expand"; }
|
||||||
void updateIcon() override {}
|
void updateIcon() override {}
|
||||||
QPixmap icon() override;
|
QPixmap icon() override;
|
||||||
QWidget *popupTrayView();
|
TrayGridWidget *popupTrayView();
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
void trayVisbleChanged(bool);
|
void trayVisbleChanged(bool);
|
||||||
|
|
||||||
private Q_SLOTS:
|
|
||||||
void onGlobMousePress(const QPoint &mousePos, const int flag);
|
|
||||||
void onRowCountChanged();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void paintEvent(QPaintEvent *) override;
|
void paintEvent(QPaintEvent *event) override;
|
||||||
const QString dropIconFile() const;
|
const QString dropIconFile() const;
|
||||||
|
|
||||||
void resetPosition();
|
void resetPosition();
|
||||||
|
|
||||||
private:
|
|
||||||
void initUi();
|
|
||||||
void initConnection();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Dtk::Gui::DRegionMonitor *m_regionInter;
|
Dtk::Gui::DRegionMonitor *m_regionInter;
|
||||||
Dock::Position m_position;
|
Dock::Position m_position;
|
||||||
QWidget *m_gridParentView;
|
|
||||||
TrayGridView *m_trayView;
|
|
||||||
TrayDelegate *m_trayDelegate;
|
|
||||||
TrayModel *m_trayModel;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// 绘制圆角窗体
|
// 绘制圆角窗体
|
||||||
class RoundWidget : public QWidget
|
class TrayGridWidget : public QWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit RoundWidget(QWidget *parent);
|
explicit TrayGridWidget(QWidget *parent);
|
||||||
|
|
||||||
|
void setTrayGridView(TrayGridView *trayView);
|
||||||
|
TrayGridView *trayView() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void paintEvent(QPaintEvent *event) override;
|
void paintEvent(QPaintEvent *event) override;
|
||||||
@ -89,6 +81,7 @@ private:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
DockInter *m_dockInter;
|
DockInter *m_dockInter;
|
||||||
|
TrayGridView *m_trayGridView;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // EXPANDICONWIDGET_H
|
#endif // EXPANDICONWIDGET_H
|
||||||
|
@ -55,7 +55,7 @@ TrayManagerWindow::TrayManagerWindow(QWidget *parent)
|
|||||||
, m_systemPluginWidget(new SystemPluginWindow(this))
|
, m_systemPluginWidget(new SystemPluginWindow(this))
|
||||||
, m_appPluginWidget(new QWidget(m_appPluginDatetimeWidget))
|
, m_appPluginWidget(new QWidget(m_appPluginDatetimeWidget))
|
||||||
, m_quickIconWidget(new QuickPluginWindow(m_appPluginWidget))
|
, m_quickIconWidget(new QuickPluginWindow(m_appPluginWidget))
|
||||||
, m_dateTimeWidget(new DateTimeDisplayer(m_appPluginDatetimeWidget))
|
, m_dateTimeWidget(new DateTimeDisplayer(false, m_appPluginDatetimeWidget))
|
||||||
, m_appPluginLayout(new QBoxLayout(QBoxLayout::Direction::LeftToRight, this))
|
, m_appPluginLayout(new QBoxLayout(QBoxLayout::Direction::LeftToRight, this))
|
||||||
, m_mainLayout(new QBoxLayout(QBoxLayout::Direction::LeftToRight, this))
|
, m_mainLayout(new QBoxLayout(QBoxLayout::Direction::LeftToRight, this))
|
||||||
, m_trayView(new TrayGridView(this))
|
, m_trayView(new TrayGridView(this))
|
||||||
@ -217,6 +217,7 @@ void TrayManagerWindow::resizeEvent(QResizeEvent *event)
|
|||||||
|
|
||||||
void TrayManagerWindow::initUi()
|
void TrayManagerWindow::initUi()
|
||||||
{
|
{
|
||||||
|
m_systemPluginWidget->setDisplayMode(Dock::DisplayMode::Fashion);
|
||||||
m_trayView->setModel(m_model);
|
m_trayView->setModel(m_model);
|
||||||
m_trayView->setItemDelegate(m_delegate);
|
m_trayView->setItemDelegate(m_delegate);
|
||||||
m_trayView->setDragDistance(2);
|
m_trayView->setDragDistance(2);
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
add_subdirectory("datetime")
|
#add_subdirectory("datetime")
|
||||||
#add_subdirectory("disk-mount")
|
#add_subdirectory("disk-mount")
|
||||||
add_subdirectory("shutdown")
|
add_subdirectory("shutdown")
|
||||||
add_subdirectory("power")
|
add_subdirectory("power")
|
||||||
add_subdirectory("sound")
|
#add_subdirectory("sound")
|
||||||
add_subdirectory("tray")
|
#add_subdirectory("tray")
|
||||||
add_subdirectory("trash")
|
add_subdirectory("trash")
|
||||||
add_subdirectory("keyboard-layout")
|
add_subdirectory("keyboard-layout")
|
||||||
add_subdirectory("onboard")
|
add_subdirectory("onboard")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user