diff --git a/frame/controller/recentapphelper.cpp b/frame/controller/recentapphelper.cpp index bec585701..a0c576bd1 100644 --- a/frame/controller/recentapphelper.cpp +++ b/frame/controller/recentapphelper.cpp @@ -87,6 +87,11 @@ bool RecentAppHelper::dockAppIsVisible() const || m_appWidget->layout()->count() > 0); } +void RecentAppHelper::updateDockInter(DockInter *dockInter) +{ + m_dockInter = dockInter; +} + bool RecentAppHelper::eventFilter(QObject *watched, QEvent *event) { if (watched == m_appWidget || watched == m_recentWidget) { diff --git a/frame/controller/recentapphelper.h b/frame/controller/recentapphelper.h index d67c038b6..3c71ceb38 100644 --- a/frame/controller/recentapphelper.h +++ b/frame/controller/recentapphelper.h @@ -47,6 +47,7 @@ public: void removeAppItem(DockItem *dockItem); bool recentIsVisible() const; bool dockAppIsVisible() const; + void updateDockInter(DockInter *dockInter); Q_SIGNALS: void requestUpdate(); diff --git a/frame/util/menuworker.cpp b/frame/util/menuworker.cpp index 91e18dcd2..560c7fa7c 100644 --- a/frame/util/menuworker.cpp +++ b/frame/util/menuworker.cpp @@ -32,9 +32,9 @@ #define DIS_INS DisplayManager::instance() -MenuWorker::MenuWorker(QObject *parent) +MenuWorker::MenuWorker(DockInter *dockInter, QObject *parent) : QObject(parent) - , m_dockInter(new DockInter(dockServiceName(), dockServicePath(), QDBusConnection::sessionBus(), this)) + , m_dockInter(dockInter) { } diff --git a/frame/util/menuworker.h b/frame/util/menuworker.h index f62d47fa7..cf7909ca9 100644 --- a/frame/util/menuworker.h +++ b/frame/util/menuworker.h @@ -35,7 +35,7 @@ class MenuWorker : public QObject { Q_OBJECT public: - explicit MenuWorker(QObject *parent = nullptr); + explicit MenuWorker(DockInter *dockInter, QObject *parent = nullptr); void exec(); diff --git a/frame/util/multiscreenworker.cpp b/frame/util/multiscreenworker.cpp index ec9dad4ea..c86cf5c68 100644 --- a/frame/util/multiscreenworker.cpp +++ b/frame/util/multiscreenworker.cpp @@ -63,16 +63,15 @@ MultiScreenWorker::MultiScreenWorker(QObject *parent) , m_appearanceInter(new Appearance("org.deepin.dde.Appearance1", "/org/deepin/dde/Appearance1", QDBusConnection::sessionBus(), this)) , m_monitorUpdateTimer(new QTimer(this)) , m_delayWakeTimer(new QTimer(this)) - , m_position(Dock::Position::Bottom) - , m_hideMode(Dock::HideMode::KeepShowing) - , m_hideState(Dock::HideState::Show) - , m_displayMode(Dock::DisplayMode::Efficient) + , m_position(Dock::Position(-1)) + , m_hideMode(Dock::HideMode(-1)) + , m_hideState(Dock::HideState(-1)) + , m_displayMode(Dock::DisplayMode(-1)) , m_state(AutoHide) { initConnection(); initMembers(); initDockMode(); - initUI(); QMetaObject::invokeMethod(this, &MultiScreenWorker::initDisplayData, Qt::QueuedConnection); } @@ -252,7 +251,7 @@ void MultiScreenWorker::onHideModeChanged(int hideMode) void MultiScreenWorker::onHideStateChanged(int state) { - if (state == Dock::Unknown) + if (state == m_hideState) return; m_hideState = static_cast(state); @@ -573,11 +572,6 @@ void MultiScreenWorker::initConnection() connect(m_launcherInter, static_cast(&DBusLuncher::VisibleChanged), this, [ = ](bool value) { setStates(LauncherDisplay, value); }); - connect(m_dockInter, &DockInter::PositionChanged, this, &MultiScreenWorker::onPositionChanged); - connect(m_dockInter, &DockInter::DisplayModeChanged, this, &MultiScreenWorker::onDisplayModeChanged); - connect(m_dockInter, &DockInter::HideModeChanged, this, &MultiScreenWorker::onHideModeChanged); - connect(m_dockInter, &DockInter::HideStateChanged, this, &MultiScreenWorker::onHideStateChanged); - connect(this, &MultiScreenWorker::requestUpdatePosition, this, &MultiScreenWorker::onRequestUpdatePosition); connect(this, &MultiScreenWorker::requestUpdateMonitorInfo, this, &MultiScreenWorker::onRequestUpdateMonitorInfo); @@ -587,22 +581,14 @@ void MultiScreenWorker::initConnection() connect(m_monitorUpdateTimer, &QTimer::timeout, this, &MultiScreenWorker::updateDisplay); } -void MultiScreenWorker::initUI() -{ - onPositionChanged(dockInter()->position()); - onDisplayModeChanged(dockInter()->displayMode()); - onHideModeChanged(dockInter()->hideMode()); - onOpacityChanged(m_appearanceInter->opacity()); -} - void MultiScreenWorker::initDockMode() { if (m_dockInter->isValid()) { - m_position = static_cast(m_dockInter->position()); - m_hideMode = static_cast(m_dockInter->hideMode()); - m_hideState = static_cast(m_dockInter->hideState()); - m_displayMode = static_cast(m_dockInter->displayMode()); - m_opacity = m_dockInter->opacity(); + onPositionChanged(dockInter()->position()); + onDisplayModeChanged(dockInter()->displayMode()); + onHideModeChanged(dockInter()->hideMode()); + onHideStateChanged(m_dockInter->hideState()); + onOpacityChanged(m_dockInter->opacity()); DockItem::setDockPosition(m_position); qApp->setProperty(PROP_POSITION, QVariant::fromValue(m_position)); @@ -714,6 +700,10 @@ void MultiScreenWorker::checkDaemonDockService() }); connect(dockInter, &DockInter::WindowSizeEfficientChanged, this, &MultiScreenWorker::onWindowSizeChanged); connect(dockInter, &DockInter::WindowSizeFashionChanged, this, &MultiScreenWorker::onWindowSizeChanged); + connect(dockInter, &DockInter::PositionChanged, this, &MultiScreenWorker::onPositionChanged); + connect(dockInter, &DockInter::DisplayModeChanged, this, &MultiScreenWorker::onDisplayModeChanged); + connect(dockInter, &DockInter::HideModeChanged, this, &MultiScreenWorker::onHideModeChanged); + connect(dockInter, &DockInter::HideStateChanged, this, &MultiScreenWorker::onHideStateChanged); }; QDBusConnectionInterface *ifc = QDBusConnection::sessionBus().interface(); @@ -728,6 +718,9 @@ void MultiScreenWorker::checkDaemonDockService() // connect connectionInit(m_dockInter); + // 通知主窗体服务已经重启了,需要重新获取DockInter + emit serviceRestart(); + // reinit data reInitDisplayData(); diff --git a/frame/util/multiscreenworker.h b/frame/util/multiscreenworker.h index ee276598b..283cc379f 100644 --- a/frame/util/multiscreenworker.h +++ b/frame/util/multiscreenworker.h @@ -127,6 +127,9 @@ signals: void requestPlayAnimation(const QString &screenName, const Position &position, const Dock::AniAction &animation, bool containMouse = false, bool updatePos = false); void requestChangeDockPosition(const QString &fromScreen, const QString &toScreen, const Position &fromPos, const Position &toPos); + // 服务重新启动的信号 + void serviceRestart(); + public slots: void onAutoHideChanged(const bool autoHide); void onRequestUpdateRegionMonitor(); @@ -163,7 +166,6 @@ private: void initMembers(); void initDockMode(); void initConnection(); - void initUI(); void initDisplayData(); void reInitDisplayData(); diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index 4fe441b9b..fcb206c33 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -971,6 +971,12 @@ void MainPanelControl::updatePluginsLayout() } } +void MainPanelControl::updateDockInter(DockInter *dockInter) +{ + m_dockInter = dockInter; + m_recentHelper->updateDockInter(dockInter); +} + QSize MainPanelControl::suitableSize(const Position &position, int screenSize, double deviceRatio) const { if (screenSize <= 0) diff --git a/frame/window/mainpanelcontrol.h b/frame/window/mainpanelcontrol.h index f7929b601..061bc776a 100755 --- a/frame/window/mainpanelcontrol.h +++ b/frame/window/mainpanelcontrol.h @@ -52,6 +52,7 @@ public: void setDisplayMode(DisplayMode dislayMode); void resizeDockIcon(); void updatePluginsLayout(); + void updateDockInter(DockInter *dockInter); QSize suitableSize(const Position &position, int screenSize, double deviceRatio) const; diff --git a/frame/window/mainwindow.cpp b/frame/window/mainwindow.cpp index 8e7045720..62808c0fe 100755 --- a/frame/window/mainwindow.cpp +++ b/frame/window/mainwindow.cpp @@ -60,6 +60,7 @@ MainWindow::MainWindow(MultiScreenWorker *multiScreenWorker, QWidget *parent) : MainWindowBase(multiScreenWorker, parent) , m_mainPanel(new MainPanelControl(multiScreenWorker->dockInter(), this)) , m_multiScreenWorker(multiScreenWorker) + , m_needUpdateUi(false) { m_mainPanel->setDisplayMode(m_multiScreenWorker->displayMode()); @@ -169,3 +170,20 @@ void MainWindow::resetPanelGeometry() m_mainPanel->setFixedSize(size()); m_mainPanel->move(0, 0); } + +void MainWindow::serviceRestart() +{ + m_mainPanel->updateDockInter(m_multiScreenWorker->dockInter()); + // 在重启服务后,MultiScreenWorker会通知WindowManager类执行PositionChanged动画,在执行此动作过程中 + // 会执行动画,动画需要消耗时间,因此, 在重启服务后,需要标记更新UI,在稍后动画执行结束后,需要重新刷新界面的显示,否则任务栏显示错误 + m_needUpdateUi = true; +} + +void MainWindow::animationFinished(bool showOrHide) +{ + if (m_needUpdateUi) { + // 在动画执行结束后,如果收到需要更新UI的标记,那么则需要重新请求更新界面,在更新结束后,再将更新UI标记为false,那么在下次进来的时候,无需再次更新UI + Q_EMIT requestUpdate(); + m_needUpdateUi = false; + } +} diff --git a/frame/window/mainwindow.h b/frame/window/mainwindow.h index 2301a0931..5f9f83467 100644 --- a/frame/window/mainwindow.h +++ b/frame/window/mainwindow.h @@ -59,6 +59,8 @@ public: void updateParentGeometry(const Dock::Position &pos, const QRect &rect) override; QSize suitableSize(const Dock::Position &pos, const int &screenSize, const double &deviceRatio) const override; void resetPanelGeometry() override; + void serviceRestart() override; + void animationFinished(bool showOrHide) override; private: using QWidget::show; @@ -74,6 +76,7 @@ private: QString m_registerKey; QStringList m_registerKeys; + bool m_needUpdateUi; }; #endif // MAINWINDOW_H diff --git a/frame/window/mainwindowbase.cpp b/frame/window/mainwindowbase.cpp index a6f361e19..6d35ba432 100644 --- a/frame/window/mainwindowbase.cpp +++ b/frame/window/mainwindowbase.cpp @@ -54,7 +54,6 @@ MainWindowBase::MainWindowBase(MultiScreenWorker *multiScreenWorker, QWidget *pa : DBlurEffectWidget(parent) , m_displayMode(Dock::DisplayMode::Efficient) , m_position(Dock::Position::Bottom) - , m_dockInter(multiScreenWorker->dockInter()) , m_dragWidget(new DragWidget(this)) , m_multiScreenWorker(multiScreenWorker) , m_updateDragAreaTimer(new QTimer(this)) @@ -571,9 +570,9 @@ Dock::Position MainWindowBase::position() const int MainWindowBase::windowSize() const { if (m_displayMode == Dock::DisplayMode::Efficient) - return m_dockInter->windowSizeEfficient(); + return m_multiScreenWorker->dockInter()->windowSizeEfficient(); - return m_dockInter->windowSizeFashion(); + return m_multiScreenWorker->dockInter()->windowSizeFashion(); } bool MainWindowBase::isDraging() const @@ -633,7 +632,7 @@ void MainWindowBase::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::RightButton && geometry().contains(QCursor::pos())) { m_multiScreenWorker->onAutoHideChanged(false); - MenuWorker menuWorker; + MenuWorker menuWorker(m_multiScreenWorker->dockInter()); menuWorker.exec(); m_multiScreenWorker->onAutoHideChanged(true); } diff --git a/frame/window/mainwindowbase.h b/frame/window/mainwindowbase.h index b12ef219f..0b38cb1d7 100644 --- a/frame/window/mainwindowbase.h +++ b/frame/window/mainwindowbase.h @@ -63,6 +63,8 @@ public: QVariantAnimation *createAnimation(QScreen *screen, const Dock::Position &pos, const Dock::AniAction &act); virtual void resetPanelGeometry() {} // 重置内部区域,为了让内部区域和当前区域始终保持一致 virtual int dockSpace() const; // 与后面窗体之间的间隔 + virtual void serviceRestart() {} // 服务重新启动后的操作 + virtual void animationFinished(bool showOrHide) {} Q_SIGNALS: void requestUpdate(); @@ -105,7 +107,6 @@ private Q_SLOTS: private: Dock::DisplayMode m_displayMode; Dock::Position m_position; - DockInter *m_dockInter; DragWidget *m_dragWidget; MultiScreenWorker *m_multiScreenWorker; QTimer *m_updateDragAreaTimer; diff --git a/frame/window/windowmanager.cpp b/frame/window/windowmanager.cpp index 7d9b2975d..f65cd4b81 100644 --- a/frame/window/windowmanager.cpp +++ b/frame/window/windowmanager.cpp @@ -325,6 +325,16 @@ void WindowManager::showAniFinish() onRequestNotifyWindowManager(); } +void WindowManager::animationFinish(bool showOrHide) +{ + for (MainWindowBase *mainWindow : m_topWindows) { + if (!mainWindow->isVisible()) + continue; + + mainWindow->animationFinished(showOrHide); + } +} + void WindowManager::hideAniFinish() { DockItem::setDockPosition(m_position); @@ -416,6 +426,8 @@ void WindowManager::updateDockGeometry(const QRect &rect) return; QScreen *screen = DIS_INS->screen(DOCKSCREEN_INS->current()); + if (!screen || m_position == Dock::Position(-1)) + return; for (MainWindowBase *mainWindow : m_topWindows) { if (!mainWindow->isVisible()) @@ -444,6 +456,7 @@ void WindowManager::updateDockGeometry(const QRect &rect) windowShowSize.setWidth(rect.width()); break; } + default: break; } mainWindow->blockSignals(true); @@ -462,11 +475,12 @@ void WindowManager::initConnection() { connect(m_dbusDaemonInterface, &QDBusConnectionInterface::serviceOwnerChanged, this, &WindowManager::onDbusNameOwnerChanged); - connect(m_multiScreenWorker, &MultiScreenWorker::requestUpdateDockGeometry, this, &WindowManager::onUpdateDockGeometry); + connect(m_multiScreenWorker, &MultiScreenWorker::serviceRestart, this, &WindowManager::onServiceRestart); connect(m_multiScreenWorker, &MultiScreenWorker::positionChanged, this, &WindowManager::onPositionChanged); connect(m_multiScreenWorker, &MultiScreenWorker::displayModeChanged, this, &WindowManager::onDisplayModeChanged); connect(m_multiScreenWorker, &MultiScreenWorker::requestPlayAnimation, this, &WindowManager::onPlayAnimation); connect(m_multiScreenWorker, &MultiScreenWorker::requestChangeDockPosition, this, &WindowManager::onChangeDockPosition); + connect(m_multiScreenWorker, &MultiScreenWorker::requestUpdateDockGeometry, this, &WindowManager::onUpdateDockGeometry); connect(m_multiScreenWorker, &MultiScreenWorker::requestUpdateFrontendGeometry, this, &WindowManager::onRequestUpdateFrontendGeometry); connect(m_multiScreenWorker, &MultiScreenWorker::requestNotifyWindowManager, this, &WindowManager::onRequestNotifyWindowManager); connect(m_multiScreenWorker, &MultiScreenWorker::requestUpdateFrontendGeometry, DockItemManager::instance(), &DockItemManager::requestUpdateDockItem); @@ -557,12 +571,14 @@ void WindowManager::onPlayAnimation(const QString &screenName, const Dock::Posit if (updatePos) onPositionChanged(m_multiScreenWorker->position()); m_multiScreenWorker->setStates(MultiScreenWorker::ShowAnimationStart, false); + animationFinish(true); break; case Dock::AniAction::Hide: hideAniFinish(); if (updatePos) onPositionChanged(m_multiScreenWorker->position()); m_multiScreenWorker->setStates(MultiScreenWorker::HideAnimationStart, false); + animationFinish(false); break; } }); @@ -642,6 +658,7 @@ void WindowManager::onChangeDockPosition(QString fromScreen, QString toScreen, c // 结束之后需要根据确定需要再隐藏 showAniFinish(); m_multiScreenWorker->setStates(MultiScreenWorker::ChangePositionAnimationStart, false); + animationFinish(true); }); for (QParallelAnimationGroup *ani : animations) { @@ -805,3 +822,9 @@ void WindowManager::onRequestNotifyWindowManager() static_cast(strutEnd)); // 设置任务栏终点坐标(上下为x,左右为y) } } + +void WindowManager::onServiceRestart() +{ + for (MainWindowBase *mainWindow : m_topWindows) + mainWindow->serviceRestart(); +} diff --git a/frame/window/windowmanager.h b/frame/window/windowmanager.h index 9cf681899..438fd38ee 100644 --- a/frame/window/windowmanager.h +++ b/frame/window/windowmanager.h @@ -63,6 +63,7 @@ private: QParallelAnimationGroup *createAnimationGroup(const Dock::AniAction &aniAction, const QString &screenName, const Dock::Position &position) const; void showAniFinish(); + void animationFinish(bool showOrHide); void hideAniFinish(); QRect getDockGeometry(bool withoutScale = false) const; // 计算左右侧加起来的区域大小 @@ -81,6 +82,8 @@ private Q_SLOTS: void onRequestUpdateFrontendGeometry(); void onRequestNotifyWindowManager(); + void onServiceRestart(); + private: MultiScreenWorker *m_multiScreenWorker; QString m_sniHostService;