#include "systempluginwindow.h" #include "systemplugincontroller.h" #include "systempluginitem.h" #include "dockpluginscontroller.h" #include #include #include #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(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(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); }