/* * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. * * Author: sbw * * Maintainer: sbw * zhaolong * * 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 . */ #include "mainwindow.h" #include "mainpanelcontrol.h" #include "dockitemmanager.h" #include "menuworker.h" #include "proxyplugincontroller.h" #include "windowmanager.h" #include "dockscreen.h" #include "dragwidget.h" #include "multiscreenworker.h" #include "constants.h" #include "displaymanager.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define DOCK_SCREEN DockScreen::instance() #define DIS_INS DisplayManager::instance() MainWindow::MainWindow(MultiScreenWorker *multiScreenWorker, QWidget *parent) : MainWindowBase(multiScreenWorker, parent) , m_mainPanel(new MainPanelControl(multiScreenWorker->dockInter(), this)) , m_multiScreenWorker(multiScreenWorker) { m_mainPanel->setDisplayMode(m_multiScreenWorker->displayMode()); initConnections(); for (auto item : DockItemManager::instance()->itemList()) m_mainPanel->insertItem(-1, item); } void MainWindow::resizeEvent(QResizeEvent *event) { MainWindowBase::resizeEvent(event); m_mainPanel->updatePluginsLayout(); } void MainWindow::initConnections() { connect(DockItemManager::instance(), &DockItemManager::itemInserted, m_mainPanel, &MainPanelControl::insertItem, Qt::DirectConnection); connect(DockItemManager::instance(), &DockItemManager::itemRemoved, m_mainPanel, &MainPanelControl::removeItem, Qt::DirectConnection); connect(DockItemManager::instance(), &DockItemManager::itemUpdated, m_mainPanel, &MainPanelControl::itemUpdated, Qt::DirectConnection); connect(DockItemManager::instance(), &DockItemManager::trayVisableCountChanged, this, &MainWindow::resizeDockIcon, Qt::QueuedConnection); connect(m_mainPanel, &MainPanelControl::itemMoved, DockItemManager::instance(), &DockItemManager::itemMoved, Qt::DirectConnection); connect(m_mainPanel, &MainPanelControl::itemAdded, DockItemManager::instance(), &DockItemManager::itemAdded, Qt::DirectConnection); connect(m_mainPanel, &MainPanelControl::requestUpdate, this, &MainWindow::requestUpdate); } /** * @brief MainWindow::getTrayVisableItemCount * 重新获取以下当前托盘区域有多少个可见的图标,并更新图标的大小 */ void MainWindow::resizeDockIcon() { m_mainPanel->resizeDockIcon(); } /** * @brief MainWindow::setGeometry * @param rect 设置任务栏的位置和大小,重写此函数时为了及时发出panelGeometryChanged信号,最终供外部DBus调用方使用 */ void MainWindow::setGeometry(const QRect &rect) { if (rect == this->geometry()) return; DBlurEffectWidget::setGeometry(rect); } MainWindowBase::DockWindowType MainWindow::windowType() const { return DockWindowType::MainWindow; } void MainWindow::setPosition(const Position &position) { MainWindowBase::setPosition(position); m_mainPanel->setPositonValue(position); // 更新鼠标拖拽样式,在类内部设置到qApp单例上去 if ((Top == position) || (Bottom == position)) m_mainPanel->setCursor(Qt::SizeVerCursor); else m_mainPanel->setCursor(Qt::SizeHorCursor); } void MainWindow::setDisplayMode(const Dock::DisplayMode &displayMode) { m_mainPanel->setDisplayMode(displayMode); MainWindowBase::setDisplayMode(displayMode); } void MainWindow::updateParentGeometry(const Position &pos, const QRect &rect) { setFixedSize(rect.size()); setGeometry(rect); int panelSize = windowSize(); QRect panelRect = rect; switch (pos) { case Position::Top: m_mainPanel->move(0, rect.height() - panelSize); panelRect.setHeight(panelSize); break; case Position::Left: m_mainPanel->move(width() - panelSize, 0); panelRect.setWidth(panelSize); break; case Position::Bottom: m_mainPanel->move(0, 0); panelRect.setHeight(panelSize); break; case Position::Right: m_mainPanel->move(0, 0); panelRect.setWidth(panelSize); break; } m_mainPanel->setFixedSize(panelRect.size()); } QSize MainWindow::suitableSize(const Position &pos, const int &screenSize, const double &deviceRatio) const { return m_mainPanel->suitableSize(pos, screenSize, deviceRatio); } void MainWindow::resetPanelGeometry() { m_mainPanel->setFixedSize(size()); m_mainPanel->move(0, 0); }