2022-05-30 20:29:53 +08:00
|
|
|
|
/*
|
2022-05-17 20:57:09 +08:00
|
|
|
|
* 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/>.
|
|
|
|
|
*/
|
2022-05-12 17:35:50 +08:00
|
|
|
|
#include "quickpluginwindow.h"
|
|
|
|
|
#include "quicksettingcontroller.h"
|
|
|
|
|
#include "quicksettingitem.h"
|
|
|
|
|
#include "pluginsiteminterface.h"
|
|
|
|
|
#include "quicksettingcontainer.h"
|
|
|
|
|
#include "appdrag.h"
|
|
|
|
|
|
|
|
|
|
#include <DStyleOption>
|
|
|
|
|
#include <DStandardItem>
|
|
|
|
|
|
|
|
|
|
#include <QDrag>
|
|
|
|
|
#include <QScrollBar>
|
|
|
|
|
#include <QStringList>
|
|
|
|
|
#include <QSize>
|
|
|
|
|
#include <QMouseEvent>
|
2022-05-17 20:57:09 +08:00
|
|
|
|
#include <QBoxLayout>
|
2022-05-12 17:35:50 +08:00
|
|
|
|
|
|
|
|
|
#define ITEMSIZE 22
|
|
|
|
|
#define ITEMSPACE 6
|
2022-05-30 20:29:53 +08:00
|
|
|
|
#define ICONWIDTH 18
|
2022-05-25 09:44:29 +08:00
|
|
|
|
#define ICONHEIGHT 16
|
2022-05-12 17:35:50 +08:00
|
|
|
|
|
2022-05-30 20:29:53 +08:00
|
|
|
|
static QStringList fixedPluginNames{ "network", "sound", "power" };
|
|
|
|
|
|
2022-05-12 17:35:50 +08:00
|
|
|
|
const int itemDataRole = Dtk::UserRole + 1;
|
|
|
|
|
const int itemSortRole = Dtk::UserRole + 2;
|
|
|
|
|
|
|
|
|
|
QuickPluginWindow::QuickPluginWindow(QWidget *parent)
|
|
|
|
|
: QWidget(parent)
|
2022-05-25 09:44:29 +08:00
|
|
|
|
, m_mainLayout(new QBoxLayout(QBoxLayout::RightToLeft, this))
|
2022-05-12 17:35:50 +08:00
|
|
|
|
, m_position(Dock::Position::Bottom)
|
|
|
|
|
{
|
|
|
|
|
initUi();
|
|
|
|
|
initConnection();
|
|
|
|
|
|
|
|
|
|
setAcceptDrops(true);
|
|
|
|
|
setMouseTracking(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QuickPluginWindow::~QuickPluginWindow()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QuickPluginWindow::initUi()
|
|
|
|
|
{
|
2022-05-17 20:57:09 +08:00
|
|
|
|
setAcceptDrops(true);
|
|
|
|
|
m_mainLayout->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
|
2022-05-25 09:44:29 +08:00
|
|
|
|
m_mainLayout->setDirection(QBoxLayout::RightToLeft);
|
2022-05-17 20:57:09 +08:00
|
|
|
|
m_mainLayout->setContentsMargins(ITEMSPACE, 0, ITEMSPACE, 0);
|
|
|
|
|
m_mainLayout->setSpacing(ITEMSPACE);
|
2022-05-12 17:35:50 +08:00
|
|
|
|
const QList<QuickSettingItem *> &items = QuickSettingController::instance()->settingItems();
|
|
|
|
|
for (QuickSettingItem *settingItem : items) {
|
2022-05-30 20:29:53 +08:00
|
|
|
|
const QString pluginName = settingItem->pluginItem()->pluginName();
|
|
|
|
|
if (!fixedPluginNames.contains(pluginName))
|
2022-05-17 20:57:09 +08:00
|
|
|
|
continue;
|
2022-05-12 17:35:50 +08:00
|
|
|
|
|
|
|
|
|
addPlugin(settingItem);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QuickPluginWindow::setPositon(Position position)
|
|
|
|
|
{
|
|
|
|
|
if (m_position == position)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
m_position = position;
|
2022-05-17 20:57:09 +08:00
|
|
|
|
QuickSettingContainer::setPosition(position);
|
2022-05-25 09:44:29 +08:00
|
|
|
|
if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) {
|
2022-05-17 20:57:09 +08:00
|
|
|
|
m_mainLayout->setDirection(QBoxLayout::RightToLeft);
|
2022-05-25 09:44:29 +08:00
|
|
|
|
m_mainLayout->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
|
|
|
|
|
} else {
|
2022-05-17 20:57:09 +08:00
|
|
|
|
m_mainLayout->setDirection(QBoxLayout::BottomToTop);
|
2022-05-25 09:44:29 +08:00
|
|
|
|
m_mainLayout->setAlignment(Qt::AlignTop | Qt::AlignHCenter);
|
|
|
|
|
}
|
2022-05-17 20:57:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-30 20:29:53 +08:00
|
|
|
|
int QuickPluginWindow::findActiveTargetIndex(QuickDockItem *widget)
|
2022-05-17 20:57:09 +08:00
|
|
|
|
{
|
|
|
|
|
for (int i = 0; i < m_activeSettingItems.size(); i++) {
|
2022-05-30 20:29:53 +08:00
|
|
|
|
PluginsItemInterface *settingItem = m_activeSettingItems[i];
|
|
|
|
|
if (widget->pluginItem() == settingItem)
|
2022-05-17 20:57:09 +08:00
|
|
|
|
return i;
|
|
|
|
|
}
|
2022-05-30 20:29:53 +08:00
|
|
|
|
|
2022-05-17 20:57:09 +08:00
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-30 20:29:53 +08:00
|
|
|
|
void QuickPluginWindow::dragPlugin(PluginsItemInterface *item)
|
2022-05-17 20:57:09 +08:00
|
|
|
|
{
|
|
|
|
|
// 释放插件,一般是从快捷设置面板区域移动到这里的,固定插件不支持拖动
|
2022-05-30 20:29:53 +08:00
|
|
|
|
if (fixedPluginNames.contains(item->pluginName()))
|
2022-05-17 20:57:09 +08:00
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
QPoint itemPoint = mapFromGlobal(QCursor::pos());
|
|
|
|
|
// 查找移动后的位置,如果移动后的插件找不到,就直接放到最后
|
2022-05-30 20:29:53 +08:00
|
|
|
|
QuickDockItem *targetWidget = qobject_cast<QuickDockItem *>(childAt(itemPoint));
|
2022-05-17 20:57:09 +08:00
|
|
|
|
if (!targetWidget) {
|
|
|
|
|
m_activeSettingItems << item;
|
|
|
|
|
} else {
|
|
|
|
|
// 如果是拖动到固定插件区域,也放到最后
|
|
|
|
|
int targetIndex = findActiveTargetIndex(targetWidget);
|
|
|
|
|
if (targetIndex < 0)
|
|
|
|
|
m_activeSettingItems << item;
|
|
|
|
|
else
|
|
|
|
|
m_activeSettingItems.insert(targetIndex, item);
|
|
|
|
|
}
|
2022-05-30 20:29:53 +08:00
|
|
|
|
|
2022-05-17 20:57:09 +08:00
|
|
|
|
//排序插入到当前窗体
|
|
|
|
|
resetPluginDisplay();
|
|
|
|
|
Q_EMIT itemCountChanged();
|
2022-05-12 17:35:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QuickPluginWindow::addPlugin(QuickSettingItem *item)
|
|
|
|
|
{
|
2022-05-17 20:57:09 +08:00
|
|
|
|
for (int i = 0; i < m_mainLayout->count(); i++) {
|
2022-05-30 20:29:53 +08:00
|
|
|
|
QLayoutItem *layoutItem = m_mainLayout->itemAt(i);
|
|
|
|
|
if (!layoutItem)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
QuickDockItem *dockItem = qobject_cast<QuickDockItem *>(layoutItem->widget());
|
|
|
|
|
if (!dockItem)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if (item->pluginItem() == dockItem->pluginItem()) {
|
2022-05-17 20:57:09 +08:00
|
|
|
|
resetPluginDisplay();
|
2022-05-12 17:35:50 +08:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-05-30 20:29:53 +08:00
|
|
|
|
if (fixedPluginNames.contains(item->pluginItem()->pluginName())) {
|
2022-05-17 20:57:09 +08:00
|
|
|
|
// 新插入的插件如果是固定插件,则将其插入到固定插件列表中,并对其进行排序
|
2022-05-30 20:29:53 +08:00
|
|
|
|
m_fixedSettingItems << item->pluginItem();
|
|
|
|
|
qSort(m_fixedSettingItems.begin(), m_fixedSettingItems.end(), [](PluginsItemInterface *item1, PluginsItemInterface *item2) {
|
|
|
|
|
int index1 = fixedPluginNames.indexOf(item1->pluginName());
|
|
|
|
|
int index2 = fixedPluginNames.indexOf(item2->pluginName());
|
2022-05-17 20:57:09 +08:00
|
|
|
|
return index1 < index2;
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
// 如果是非固定插件,则直接插入到末尾
|
2022-05-30 20:29:53 +08:00
|
|
|
|
m_activeSettingItems << item->pluginItem();
|
2022-05-17 20:57:09 +08:00
|
|
|
|
}
|
|
|
|
|
resetPluginDisplay();
|
2022-05-12 17:35:50 +08:00
|
|
|
|
Q_EMIT itemCountChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QSize QuickPluginWindow::suitableSize()
|
|
|
|
|
{
|
|
|
|
|
if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom)
|
2022-05-25 09:44:29 +08:00
|
|
|
|
return QSize((ITEMSPACE + ICONWIDTH) * m_mainLayout->count() + ITEMSPACE, ITEMSIZE);
|
|
|
|
|
|
|
|
|
|
int height = 0;
|
|
|
|
|
int itemCount = m_mainLayout->count();
|
|
|
|
|
if (itemCount > 0) {
|
|
|
|
|
// 每个图标占据的高度
|
|
|
|
|
height += ICONHEIGHT * itemCount;
|
|
|
|
|
// 图标间距占据的高度
|
|
|
|
|
height += ITEMSPACE * itemCount;
|
|
|
|
|
}
|
2022-05-12 17:35:50 +08:00
|
|
|
|
|
2022-05-25 09:44:29 +08:00
|
|
|
|
return QSize(ITEMSIZE, height);
|
2022-05-12 17:35:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-30 20:29:53 +08:00
|
|
|
|
void QuickPluginWindow::removePlugin(PluginsItemInterface *item)
|
2022-05-12 17:35:50 +08:00
|
|
|
|
{
|
2022-05-17 20:57:09 +08:00
|
|
|
|
if (m_fixedSettingItems.contains(item))
|
|
|
|
|
m_fixedSettingItems.removeOne(item);
|
|
|
|
|
else if (m_activeSettingItems.contains(item))
|
|
|
|
|
m_activeSettingItems.removeOne(item);
|
|
|
|
|
else
|
|
|
|
|
return;
|
2022-05-12 17:35:50 +08:00
|
|
|
|
|
2022-05-17 20:57:09 +08:00
|
|
|
|
resetPluginDisplay();
|
2022-05-12 17:35:50 +08:00
|
|
|
|
Q_EMIT itemCountChanged();
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-30 20:29:53 +08:00
|
|
|
|
PluginsItemInterface *QuickPluginWindow::findQuickSettingItem(const QPoint &mousePoint, const QList<PluginsItemInterface *> &settingItems)
|
2022-05-12 17:35:50 +08:00
|
|
|
|
{
|
2022-05-30 20:29:53 +08:00
|
|
|
|
QuickDockItem *selectWidget = qobject_cast<QuickDockItem *>(childAt(mousePoint));
|
2022-05-17 20:57:09 +08:00
|
|
|
|
if (!selectWidget)
|
2022-05-12 17:35:50 +08:00
|
|
|
|
return nullptr;
|
|
|
|
|
|
2022-05-17 20:57:09 +08:00
|
|
|
|
for (int i = 0; i < settingItems.size(); i++) {
|
2022-05-30 20:29:53 +08:00
|
|
|
|
PluginsItemInterface *settingItem = settingItems[i];
|
|
|
|
|
if (selectWidget->pluginItem() == settingItem)
|
2022-05-17 20:57:09 +08:00
|
|
|
|
return settingItem;
|
|
|
|
|
}
|
2022-05-12 17:35:50 +08:00
|
|
|
|
|
2022-05-17 20:57:09 +08:00
|
|
|
|
return nullptr;
|
2022-05-12 17:35:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-17 20:57:09 +08:00
|
|
|
|
void QuickPluginWindow::mousePressEvent(QMouseEvent *event)
|
2022-05-12 17:35:50 +08:00
|
|
|
|
{
|
2022-05-17 20:57:09 +08:00
|
|
|
|
// 查找非固定的图标,然后执行拖动
|
2022-05-30 20:29:53 +08:00
|
|
|
|
PluginsItemInterface *quickItem = findQuickSettingItem(event->pos(), m_activeSettingItems);
|
2022-05-17 20:57:09 +08:00
|
|
|
|
if (!quickItem)
|
2022-05-12 17:35:50 +08:00
|
|
|
|
return;
|
|
|
|
|
|
2022-05-17 20:57:09 +08:00
|
|
|
|
// 如果不是固定图标,则让其拖动
|
|
|
|
|
startDrag(quickItem);
|
2022-05-12 17:35:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-25 09:44:29 +08:00
|
|
|
|
QPoint QuickPluginWindow::popupPoint() const
|
|
|
|
|
{
|
|
|
|
|
if (!parentWidget())
|
|
|
|
|
return pos();
|
|
|
|
|
|
|
|
|
|
QPoint pointCurrent = parentWidget()->mapToGlobal(pos());
|
|
|
|
|
switch (m_position) {
|
|
|
|
|
case Dock::Position::Bottom: {
|
|
|
|
|
// 在下方的时候,Y坐标设置在顶层窗口的y值,保证下方对齐
|
|
|
|
|
pointCurrent.setY(topLevelWidget()->y());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case Dock::Position::Top: {
|
|
|
|
|
// 在上面的时候,Y坐标设置为任务栏的下方,保证上方对齐
|
|
|
|
|
pointCurrent.setY(topLevelWidget()->y() + topLevelWidget()->height());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case Dock::Position::Left: {
|
|
|
|
|
// 在左边的时候,X坐标设置在顶层窗口的最右侧,保证左对齐
|
|
|
|
|
pointCurrent.setX(topLevelWidget()->x() + topLevelWidget()->width());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case Dock::Position::Right: {
|
|
|
|
|
// 在右边的时候,X坐标设置在顶层窗口的最左侧,保证右对齐
|
|
|
|
|
pointCurrent.setX(topLevelWidget()->x());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return pointCurrent;
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-30 20:29:53 +08:00
|
|
|
|
void QuickPluginWindow::onFixedClick()
|
2022-05-12 17:35:50 +08:00
|
|
|
|
{
|
2022-05-17 20:57:09 +08:00
|
|
|
|
// 查找固定团图标,然后点击弹出快捷面板
|
2022-05-30 20:29:53 +08:00
|
|
|
|
QuickDockItem *dockItem = qobject_cast<QuickDockItem *>(sender());
|
|
|
|
|
if (!dockItem || !fixedPluginNames.contains(dockItem->pluginItem()->pluginName()))
|
2022-05-12 17:35:50 +08:00
|
|
|
|
return;
|
|
|
|
|
|
2022-05-25 09:44:29 +08:00
|
|
|
|
// 弹出快捷设置面板
|
2022-05-17 20:57:09 +08:00
|
|
|
|
DockPopupWindow *popWindow = QuickSettingContainer::popWindow();
|
2022-05-25 09:44:29 +08:00
|
|
|
|
popWindow->show(popupPoint());
|
2022-05-12 17:35:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-30 20:29:53 +08:00
|
|
|
|
void QuickPluginWindow::startDrag(PluginsItemInterface *moveItem)
|
2022-05-12 17:35:50 +08:00
|
|
|
|
{
|
|
|
|
|
AppDrag *drag = new AppDrag(this, new QuickDragWidget);
|
2022-05-17 20:57:09 +08:00
|
|
|
|
QuickPluginMimeData *mimedata = new QuickPluginMimeData(moveItem);
|
2022-05-12 17:35:50 +08:00
|
|
|
|
drag->setMimeData(mimedata);
|
|
|
|
|
drag->appDragWidget()->setDockInfo(m_position, QRect(mapToGlobal(pos()), size()));
|
2022-05-30 20:29:53 +08:00
|
|
|
|
QPixmap dragPixmap = moveItem->icon(DockPart::QuickPanel).pixmap(QSize(ITEMSIZE, ITEMSIZE));
|
2022-05-12 17:35:50 +08:00
|
|
|
|
drag->setPixmap(dragPixmap);
|
2022-05-17 20:57:09 +08:00
|
|
|
|
drag->setHotSpot(QPoint(0, 0));
|
2022-05-12 17:35:50 +08:00
|
|
|
|
|
|
|
|
|
connect(drag->appDragWidget(), &AppDragWidget::requestRemoveItem, this, [ this, moveItem ] {
|
|
|
|
|
removePlugin(moveItem);
|
|
|
|
|
});
|
|
|
|
|
|
2022-05-30 20:29:53 +08:00
|
|
|
|
connect(static_cast<QuickDragWidget *>(drag->appDragWidget()), &QuickDragWidget::requestDropItem, this, &QuickPluginWindow::onPluginDropItem);
|
2022-05-17 20:57:09 +08:00
|
|
|
|
connect(static_cast<QuickDragWidget *>(drag->appDragWidget()), &QuickDragWidget::requestDragMove, this, &QuickPluginWindow::onPluginDragMove);
|
2022-05-12 17:35:50 +08:00
|
|
|
|
|
2022-05-17 20:57:09 +08:00
|
|
|
|
drag->exec(Qt::MoveAction | Qt::CopyAction);
|
|
|
|
|
}
|
2022-05-12 17:35:50 +08:00
|
|
|
|
|
2022-05-30 20:29:53 +08:00
|
|
|
|
QuickDockItem *QuickPluginWindow::getDockItemByPlugin(PluginsItemInterface *item)
|
|
|
|
|
{
|
|
|
|
|
if (!item)
|
|
|
|
|
return nullptr;
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < m_mainLayout->count(); i++) {
|
|
|
|
|
QLayoutItem *layoutItem = m_mainLayout->itemAt(i);
|
|
|
|
|
if (!layoutItem)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
QuickDockItem *dockItem = qobject_cast<QuickDockItem *>(layoutItem->widget());
|
|
|
|
|
if (!dockItem)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if (dockItem->pluginItem() == item)
|
|
|
|
|
return dockItem;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int QuickPluginWindow::getDropIndex(QPoint point)
|
|
|
|
|
{
|
|
|
|
|
QuickDockItem *targetItem = getDockItemByPlugin(findQuickSettingItem(point, m_activeSettingItems));
|
|
|
|
|
if (targetItem)
|
|
|
|
|
return m_activeSettingItems.indexOf(targetItem->pluginItem());
|
|
|
|
|
|
|
|
|
|
// 上下方向从右向左排列
|
|
|
|
|
if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) {
|
|
|
|
|
for (int i = 0; i < m_mainLayout->count() - 1; i++) {
|
|
|
|
|
QLayoutItem *layoutBefore = m_mainLayout->itemAt(i);
|
|
|
|
|
QLayoutItem *layoutItem = m_mainLayout->itemAt(i + 1);
|
|
|
|
|
if (!layoutBefore || !layoutItem)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
QuickDockItem *dockBeforeItem = qobject_cast<QuickDockItem *>(layoutBefore->widget());
|
|
|
|
|
QuickDockItem *dockItem = qobject_cast<QuickDockItem *>(layoutItem->widget());
|
|
|
|
|
if (dockItem->pluginItem()->isPrimary())
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if (dockBeforeItem->geometry().x() > point.x() && dockItem->geometry().right() < point.x())
|
|
|
|
|
return i;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
for (int i = 0; i < m_mainLayout->count() - 1; i++) {
|
|
|
|
|
QLayoutItem *layoutBefore = m_mainLayout->itemAt(i);
|
|
|
|
|
QLayoutItem *layoutItem = m_mainLayout->itemAt(i + 1);
|
|
|
|
|
if (!layoutBefore || !layoutItem)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
QuickDockItem *dockBeforeItem = qobject_cast<QuickDockItem *>(layoutBefore->widget());
|
|
|
|
|
if (dockBeforeItem->pluginItem()->isPrimary())
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
QuickDockItem *dockItem = qobject_cast<QuickDockItem *>(layoutItem->widget());
|
|
|
|
|
|
|
|
|
|
// 从上向下排列
|
|
|
|
|
if (dockBeforeItem->geometry().bottom() < point.y() && dockItem->geometry().top() > point.y())
|
|
|
|
|
return i;
|
|
|
|
|
}
|
|
|
|
|
// 如果都没有找到,直接插入到最后
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QuickPluginWindow::onPluginDropItem(QDropEvent *event)
|
|
|
|
|
{
|
|
|
|
|
const QuickPluginMimeData *data = qobject_cast<const QuickPluginMimeData *>(event->mimeData());
|
|
|
|
|
if (!data)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// 获取当前鼠标在任务栏快捷图标区域的位置
|
|
|
|
|
QPoint currentPoint = mapFromGlobal(QCursor::pos());
|
|
|
|
|
// 获取区域图标插入的位置
|
|
|
|
|
int dropIndex = getDropIndex(currentPoint);
|
|
|
|
|
if (dropIndex >= 0)
|
|
|
|
|
m_activeSettingItems.insert(dropIndex, data->pluginItemInterface());
|
|
|
|
|
else
|
|
|
|
|
m_activeSettingItems << data->pluginItemInterface();
|
|
|
|
|
|
|
|
|
|
resetPluginDisplay();
|
|
|
|
|
Q_EMIT itemCountChanged();
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-17 20:57:09 +08:00
|
|
|
|
void QuickPluginWindow::onPluginDragMove(QDragMoveEvent *event)
|
|
|
|
|
{
|
|
|
|
|
QPoint currentPoint = mapFromGlobal(QCursor::pos());
|
|
|
|
|
const QuickPluginMimeData *data = qobject_cast<const QuickPluginMimeData *>(event->mimeData());
|
|
|
|
|
if (!data)
|
|
|
|
|
return;
|
2022-05-12 17:35:50 +08:00
|
|
|
|
|
2022-05-30 20:29:53 +08:00
|
|
|
|
// 查找移动的
|
|
|
|
|
PluginsItemInterface *sourceItem = data->pluginItemInterface();
|
2022-05-17 20:57:09 +08:00
|
|
|
|
if (!sourceItem)
|
|
|
|
|
return;
|
2022-05-12 17:35:50 +08:00
|
|
|
|
|
2022-05-30 20:29:53 +08:00
|
|
|
|
QuickDockItem *sourceMoveWidget = getDockItemByPlugin(sourceItem);
|
|
|
|
|
QuickDockItem *targetItem = getDockItemByPlugin(findQuickSettingItem(currentPoint, m_activeSettingItems));
|
2022-05-17 20:57:09 +08:00
|
|
|
|
// 如果未找到要移动的目标位置,或者移动的目标位置是固定插件,或者原插件和目标插件是同一个插件,则不做任何操作
|
2022-05-30 20:29:53 +08:00
|
|
|
|
if (!sourceMoveWidget || !targetItem || sourceMoveWidget == targetItem)
|
2022-05-17 20:57:09 +08:00
|
|
|
|
return;
|
2022-05-12 17:35:50 +08:00
|
|
|
|
|
2022-05-17 20:57:09 +08:00
|
|
|
|
// 重新对所有的插件进行排序
|
|
|
|
|
QMap<QWidget *, int> allItems;
|
|
|
|
|
for (int i = 0; i < m_mainLayout->count(); i++) {
|
|
|
|
|
QWidget *childWidget = m_mainLayout->itemAt(i)->widget();
|
|
|
|
|
allItems[childWidget] = i;
|
|
|
|
|
}
|
|
|
|
|
// 调整列表中的位置
|
|
|
|
|
int sourceIndex = m_activeSettingItems.indexOf(sourceItem);
|
2022-05-30 20:29:53 +08:00
|
|
|
|
int targetIndex = m_activeSettingItems.indexOf(targetItem->pluginItem());
|
2022-05-17 20:57:09 +08:00
|
|
|
|
if (sourceIndex >= 0)
|
|
|
|
|
m_activeSettingItems.move(sourceIndex, targetIndex);
|
|
|
|
|
else
|
|
|
|
|
m_activeSettingItems.insert(targetIndex, sourceItem);
|
2022-05-12 17:35:50 +08:00
|
|
|
|
|
2022-05-17 20:57:09 +08:00
|
|
|
|
event->accept();
|
|
|
|
|
}
|
2022-05-12 17:35:50 +08:00
|
|
|
|
|
2022-05-17 20:57:09 +08:00
|
|
|
|
void QuickPluginWindow::resetPluginDisplay()
|
|
|
|
|
{
|
|
|
|
|
// 先删除所有的widget
|
2022-05-30 20:29:53 +08:00
|
|
|
|
QMap<PluginsItemInterface *, QuickDockItem *> pluginItems;
|
2022-05-17 20:57:09 +08:00
|
|
|
|
for (int i = m_mainLayout->count() - 1; i >= 0; i--) {
|
|
|
|
|
QLayoutItem *layoutItem = m_mainLayout->itemAt(i);
|
2022-05-30 20:29:53 +08:00
|
|
|
|
if (!layoutItem)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
QuickDockItem *dockItem = qobject_cast<QuickDockItem *>(layoutItem->widget());
|
|
|
|
|
if (!dockItem)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
dockItem->setParent(nullptr);
|
|
|
|
|
m_mainLayout->removeItem(layoutItem);
|
|
|
|
|
pluginItems[dockItem->pluginItem()] = dockItem;
|
2022-05-17 20:57:09 +08:00
|
|
|
|
}
|
|
|
|
|
// 将列表中所有的控件按照顺序添加到布局上
|
2022-05-30 20:29:53 +08:00
|
|
|
|
auto addWidget = [ = ](const QList<PluginsItemInterface *> &items) {
|
|
|
|
|
for (PluginsItemInterface *item : items) {
|
|
|
|
|
QuickDockItem *itemWidget = nullptr;
|
|
|
|
|
if (pluginItems.contains(item)) {
|
|
|
|
|
itemWidget = pluginItems[item];
|
|
|
|
|
} else {
|
|
|
|
|
itemWidget = new QuickDockItem(item, this);
|
|
|
|
|
itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT);
|
|
|
|
|
}
|
|
|
|
|
connect(itemWidget, &QuickDockItem::clicked, this, &QuickPluginWindow::onFixedClick);
|
2022-05-17 20:57:09 +08:00
|
|
|
|
itemWidget->setParent(this);
|
|
|
|
|
m_mainLayout->addWidget(itemWidget);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
addWidget(m_fixedSettingItems);
|
2022-05-25 09:44:29 +08:00
|
|
|
|
addWidget(m_activeSettingItems);
|
2022-05-12 17:35:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QuickPluginWindow::initConnection()
|
|
|
|
|
{
|
2022-05-17 20:57:09 +08:00
|
|
|
|
connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ this ](QuickSettingItem * settingItem) {
|
2022-05-30 20:29:53 +08:00
|
|
|
|
const QString pluginName = settingItem->pluginItem()->pluginName();
|
|
|
|
|
if (!fixedPluginNames.contains(pluginName))
|
2022-05-12 17:35:50 +08:00
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
addPlugin(settingItem);
|
|
|
|
|
});
|
|
|
|
|
|
2022-05-30 20:29:53 +08:00
|
|
|
|
connect(QuickSettingController::instance(), &QuickSettingController::pluginRemoved, this, [ this ] (QuickSettingItem *settingItem){
|
|
|
|
|
removePlugin(settingItem->pluginItem());
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief QuickDockItem::QuickDockItem
|
|
|
|
|
* @param pluginItem
|
|
|
|
|
* @param parent
|
|
|
|
|
*/
|
|
|
|
|
QuickDockItem::QuickDockItem(PluginsItemInterface *pluginItem, QWidget *parent)
|
|
|
|
|
: QWidget(parent)
|
|
|
|
|
, m_pluginItem(pluginItem)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QuickDockItem::~QuickDockItem()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PluginsItemInterface *QuickDockItem::pluginItem()
|
|
|
|
|
{
|
|
|
|
|
return m_pluginItem;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QuickDockItem::paintEvent(QPaintEvent *event)
|
|
|
|
|
{
|
|
|
|
|
if (!m_pluginItem)
|
|
|
|
|
return QWidget::paintEvent(event);
|
|
|
|
|
|
|
|
|
|
QPixmap pixmap = m_pluginItem->icon(DockPart::QuickPanel).pixmap(ICONHEIGHT, ICONHEIGHT);
|
|
|
|
|
QRect pixmapRect = QRect((rect().width() - ICONHEIGHT) / 2, (rect().height() - ICONHEIGHT) / 2,
|
|
|
|
|
ICONHEIGHT, ICONHEIGHT);
|
|
|
|
|
QPainter painter(this);
|
|
|
|
|
painter.drawPixmap(pixmapRect, pixmap);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QuickDockItem::mouseReleaseEvent(QMouseEvent *event)
|
|
|
|
|
{
|
|
|
|
|
Q_EMIT clicked();
|
|
|
|
|
QWidget::mouseReleaseEvent(event);
|
2022-05-12 17:35:50 +08:00
|
|
|
|
}
|