mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-02 15:45:21 +00:00

完成插件区域的引用图标加载、快捷设置的展示、老插件的加载等功能 Log: 完成特效模式下右侧插件区域的功能 Influence: v23任务栏右侧插件区域 Task: https://pms.uniontech.com/task-view-110311.html Change-Id: I1599907d4529c57070ee2e21b70cc0c17f132e5e
168 lines
5.0 KiB
C++
168 lines
5.0 KiB
C++
#include "systempluginwindow.h"
|
|
#include "systemplugincontroller.h"
|
|
#include "systempluginitem.h"
|
|
#include "dockpluginscontroller.h"
|
|
|
|
#include <DListView>
|
|
#include <QBoxLayout>
|
|
#include <QMetaObject>
|
|
|
|
#define MAXICONSIZE 48
|
|
#define MINICONSIZE 24
|
|
#define ICONMARGIN 8
|
|
|
|
SystemPluginWindow::SystemPluginWindow(QWidget *parent)
|
|
: DBlurEffectWidget(parent)
|
|
, m_pluginController(new FixedPluginController(this))
|
|
, m_listView(new DListView(this))
|
|
, m_position(Dock::Position::Bottom)
|
|
, m_mainLayout(new QBoxLayout(QBoxLayout::Direction::LeftToRight, this))
|
|
{
|
|
initUi();
|
|
connect(m_pluginController, &DockPluginsController::pluginItemInserted, this, &SystemPluginWindow::onPluginItemAdded);
|
|
connect(m_pluginController, &DockPluginsController::pluginItemRemoved, this, &SystemPluginWindow::onPluginItemRemoved);
|
|
connect(m_pluginController, &DockPluginsController::pluginItemUpdated, this, &SystemPluginWindow::onPluginItemUpdated);
|
|
QMetaObject::invokeMethod(m_pluginController, &DockPluginsController::startLoader, Qt::QueuedConnection);
|
|
}
|
|
|
|
SystemPluginWindow::~SystemPluginWindow()
|
|
{
|
|
}
|
|
|
|
void SystemPluginWindow::setPositon(Position position)
|
|
{
|
|
if (m_position == position)
|
|
return;
|
|
|
|
m_position = position;
|
|
|
|
if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom)
|
|
m_mainLayout->setDirection(QBoxLayout::Direction::LeftToRight);
|
|
else
|
|
m_mainLayout->setDirection(QBoxLayout::Direction::TopToBottom);
|
|
}
|
|
|
|
QSize SystemPluginWindow::suitableSize()
|
|
{
|
|
QMargins m = m_mainLayout->contentsMargins();
|
|
if (m_mainLayout->direction() == QBoxLayout::Direction::LeftToRight) {
|
|
int itemSize = height() - m_mainLayout->contentsMargins().top() - m_mainLayout->contentsMargins().bottom();
|
|
int itemWidth = m.left() + m.right();
|
|
for (int i = 0; i < m_mainLayout->count(); i++) {
|
|
QWidget *widget = m_mainLayout->itemAt(i)->widget();
|
|
if (!widget)
|
|
continue;
|
|
|
|
PluginsItem *item = qobject_cast<PluginsItem *>(widget);
|
|
if (!item)
|
|
continue;
|
|
|
|
// 如果是横向的,则高度是固定,高宽一致,因此读取高度作为它的尺寸值
|
|
itemWidth += itemSize;
|
|
if (i < m_mainLayout->count() - 1)
|
|
itemWidth += m_mainLayout->spacing();
|
|
}
|
|
|
|
itemWidth += m.right();
|
|
return QSize(itemWidth, height());
|
|
}
|
|
|
|
int itemSize = width() - m_mainLayout->contentsMargins().left() - m_mainLayout->contentsMargins().right();
|
|
int itemHeight = m.top();
|
|
for (int i = 0; i < m_mainLayout->count(); i++) {
|
|
QWidget *widget = m_mainLayout->itemAt(i)->widget();
|
|
if (!widget)
|
|
continue;
|
|
|
|
PluginsItem *item = qobject_cast<PluginsItem *>(widget);
|
|
if (!item)
|
|
continue;
|
|
|
|
itemHeight += itemSize;
|
|
if (i < m_mainLayout->count() - 1)
|
|
itemHeight += m_mainLayout->spacing();
|
|
}
|
|
|
|
itemHeight += m.bottom();
|
|
|
|
return QSize(width(), itemHeight);
|
|
}
|
|
|
|
void SystemPluginWindow::resizeEvent(QResizeEvent *event)
|
|
{
|
|
DBlurEffectWidget::resizeEvent(event);
|
|
Q_EMIT pluginSizeChanged();
|
|
}
|
|
|
|
void SystemPluginWindow::initUi()
|
|
{
|
|
m_mainLayout->setContentsMargins(8, 8, 8, 8);
|
|
m_mainLayout->setSpacing(5);
|
|
}
|
|
|
|
int SystemPluginWindow::calcIconSize() const
|
|
{
|
|
switch (m_position) {
|
|
case Dock::Position::Top:
|
|
case Dock::Position::Bottom: {
|
|
if (height() >= 56)
|
|
return MAXICONSIZE;
|
|
if (height() <= 40)
|
|
return MINICONSIZE;
|
|
return height() - ICONMARGIN * 2;
|
|
break;
|
|
}
|
|
case Dock::Position::Left:
|
|
case Dock::Position::Right: {
|
|
if (width() >= 56)
|
|
return MAXICONSIZE;
|
|
if (width() <= 40)
|
|
return MINICONSIZE;
|
|
return width() - ICONMARGIN * 2;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
void SystemPluginWindow::onPluginItemAdded(PluginsItem *pluginItem)
|
|
{
|
|
if (m_mainLayout->children().contains(pluginItem))
|
|
return;
|
|
|
|
m_mainLayout->addWidget(pluginItem);
|
|
Q_EMIT pluginSizeChanged();
|
|
}
|
|
|
|
void SystemPluginWindow::onPluginItemRemoved(PluginsItem *pluginItem)
|
|
{
|
|
if (!m_mainLayout->children().contains(pluginItem))
|
|
return;
|
|
|
|
m_mainLayout->removeWidget(pluginItem);
|
|
Q_EMIT pluginSizeChanged();
|
|
}
|
|
|
|
void SystemPluginWindow::onPluginItemUpdated(PluginsItem *pluginItem)
|
|
{
|
|
pluginItem->refreshIcon();
|
|
}
|
|
|
|
// can loader plugins
|
|
FixedPluginController::FixedPluginController(QObject *parent)
|
|
: DockPluginsController(parent)
|
|
{
|
|
}
|
|
|
|
const QVariant FixedPluginController::getValue(PluginsItemInterface * const itemInter, const QString &key, const QVariant &fallback)
|
|
{
|
|
if (key == "enable")
|
|
return (itemInter->pluginName().compare("shutdown") == 0);
|
|
|
|
return AbstractPluginsController::getValue(itemInter, key, fallback);
|
|
}
|
|
|
|
PluginsItem *FixedPluginController::createPluginsItem(PluginsItemInterface * const itemInter, const QString &itemKey, const QString &pluginApi)
|
|
{
|
|
return new StretchPluginsItem(itemInter, itemKey, pluginApi);
|
|
}
|