dde-dock/frame/controller/toolapphelper.cpp
2023-02-16 15:08:28 +08:00

204 lines
6.6 KiB
C++

// Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd.
// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: LGPL-3.0-or-later
#include "toolapphelper.h"
#include "dockitem.h"
#include "pluginsitem.h"
#include "quicksettingcontroller.h"
#include <QWidget>
#include <QBoxLayout>
ToolAppHelper::ToolAppHelper(QWidget *toolAreaWidget, QObject *parent)
: QObject(parent)
, m_toolAreaWidget(toolAreaWidget)
, m_displayMode(DisplayMode::Efficient)
, m_position(Dock::Position::Bottom)
{
connect(QuickSettingController::instance(), &QuickSettingController::pluginInserted, this, [ = ](PluginsItemInterface *itemInter, const QuickSettingController::PluginAttribute pluginAttr) {
if (pluginAttr != QuickSettingController::PluginAttribute::Tool)
return;
pluginItemAdded(itemInter);
});
connect(QuickSettingController::instance(), &QuickSettingController::pluginRemoved, this, [ = ](PluginsItemInterface *itemInter) {
pluginItemRemoved(itemInter);
});
QList<PluginsItemInterface *> pluginItems = QuickSettingController::instance()->pluginItems(QuickSettingController::PluginAttribute::Tool);
for (PluginsItemInterface *pluginItem : pluginItems)
pluginItemAdded(pluginItem);
updateToolArea();
}
void ToolAppHelper::setDisplayMode(DisplayMode displayMode)
{
m_displayMode = displayMode;
moveToolWidget();
updateWidgetStatus();
}
void ToolAppHelper::setPosition(Position position)
{
m_toolAreaWidget->setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
m_position = position;
}
bool ToolAppHelper::toolIsVisible() const
{
return m_toolAreaWidget->isVisible();
}
void ToolAppHelper::appendToToolArea(int index, DockItem *dockItem)
{
dockItem->setParent(m_toolAreaWidget);
QBoxLayout *boxLayout = static_cast<QBoxLayout *>(m_toolAreaWidget->layout());
if (index >= 0)
boxLayout->insertWidget(index, dockItem);
else
boxLayout->addWidget(dockItem);
Q_EMIT requestUpdate();
}
bool ToolAppHelper::removeToolArea(PluginsItemInterface *itemInter)
{
QBoxLayout *boxLayout = static_cast<QBoxLayout *>(m_toolAreaWidget->layout());
for (int i = 0; i < boxLayout->count(); i++) {
PluginsItem *dockItem = qobject_cast<PluginsItem *>(boxLayout->itemAt(i)->widget());
if (dockItem && dockItem->pluginItem() == itemInter) {
boxLayout->removeWidget(dockItem);
return true;
}
}
return false;
}
void ToolAppHelper::moveToolWidget()
{
for (int i = m_toolAreaWidget->layout()->count() - 1; i >= 0; i--) {
QLayoutItem *layoutItem = m_toolAreaWidget->layout()->itemAt(i);
if (!layoutItem)
continue;
PluginsItem *pluginWidget = qobject_cast<PluginsItem *>(layoutItem->widget());
if (!pluginWidget)
continue;
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);
}
}
}
void ToolAppHelper::updateToolArea()
{
bool oldVisible = m_toolAreaWidget->isVisible();
QLayout *layout = m_toolAreaWidget->layout();
if (m_position == Dock::Position::Bottom || m_position == Dock::Position::Top) {
int size = 0;
for (int i = 0; i < layout->count(); i++) {
PluginsItem *dockItem = qobject_cast<PluginsItem *>(layout->itemAt(i)->widget());
if (!dockItem)
continue;
size += dockItem->width();
}
m_toolAreaWidget->setFixedWidth(size);
m_toolAreaWidget->setVisible(size > 0);
} else {
int size = 0;
for (int i = 0; i < layout->count(); i++) {
PluginsItem *dockItem = qobject_cast<PluginsItem *>(layout->itemAt(i)->widget());
if (!dockItem)
continue;
size += dockItem->height();
}
m_toolAreaWidget->setFixedHeight(size);
m_toolAreaWidget->setVisible(size > 0);
}
bool isVisible = m_toolAreaWidget->isVisible();
if (oldVisible != isVisible)
Q_EMIT toolVisibleChanged(isVisible);
}
void ToolAppHelper::updateWidgetStatus()
{
bool oldVisible = toolIsVisible();
if (m_displayMode == DisplayMode::Efficient) {
// 高效模式
m_toolAreaWidget->setVisible(false);
} else {
// 时尚模式
m_toolAreaWidget->setVisible(m_toolAreaWidget->layout()->count() > 0);
}
bool visible = toolIsVisible();
if (oldVisible != visible)
Q_EMIT toolVisibleChanged(visible);
}
bool ToolAppHelper::pluginInTool(PluginsItemInterface *itemInter) const
{
return (QuickSettingController::instance()->pluginAttribute(itemInter) == QuickSettingController::PluginAttribute::Tool);
}
void ToolAppHelper::pluginItemAdded(PluginsItemInterface *itemInter)
{
if (m_displayMode != Dock::DisplayMode::Fashion || pluginExists(itemInter))
return;
QuickSettingController *quickController = QuickSettingController::instance();
if (pluginInTool(itemInter)) {
PluginsItem *pluginItem = quickController->pluginItemWidget(itemInter);
appendToToolArea(0, pluginItem);
updateToolArea();
Q_EMIT requestUpdate();
}
}
void ToolAppHelper::pluginItemRemoved(PluginsItemInterface *itemInter)
{
QuickSettingController *quickController = QuickSettingController::instance();
if (pluginInTool(itemInter)) {
PluginsItem *pluginItem = quickController->pluginItemWidget(itemInter);
removeToolArea(pluginItem->pluginItem());
updateToolArea();
Q_EMIT requestUpdate();
}
}
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;
}