dde-dock/frame/window/mainwindowbase.h
donghualin 1691e7188c fix: 任务栏代码结构优化解耦
原来的TrayManagerWindow的类是放到MainPanelWindow类里面作为它的一部分,导致窗管在显示的时候有很多问题
修改方案:
1、将左右侧区域拆分成两个窗体,让它们继承自相同的基类MainWindowBase。
2、左右区域公共的部分,例如圆角、展示区域、动画获取等,都在基类中实现或者通过接口返回
3、增加WindowManager类,管理所有的界面,WindowManager类无需知道具体子类的指针,只需要根据相应的接口来获取即可
4、所有的界面类在main.cpp中创建,调用WindowManager对象设置
5、拆分MultiScreenWorker类,使MultiScreenWorker类只关心任务栏相关的逻辑,无需关心窗体或界面

Log: 优化任务栏的显示问题
Influence: 打开任务栏,观察时尚模式下圆角,左右侧区域中间是否连接在一起等
Bug: https://pms.uniontech.com/bug-view-137267.html
Bug: https://pms.uniontech.com/bug-view-140029.html
Bug: https://pms.uniontech.com/bug-view-134527.html
Bug: https://pms.uniontech.com/bug-view-146743.html
Bug: https://pms.uniontech.com/bug-view-150293.html
Change-Id: I4266f6f8c983f61258b92834d93cdacd0221d7de
2022-08-25 19:31:44 +00:00

119 lines
3.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd.
*
* Author: donghualin <donghualin@uniontech.com>
*
* Maintainer: donghualin <donghualin@uniontech.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
#ifndef MAINWINDOWBASE_H
#define MAINWINDOWBASE_H
#include "constants.h"
#include "dbusutil.h"
#include <DBlurEffectWidget>
#include <DPlatformWindowHandle>
#include <DGuiApplicationHelper>
#include <QEvent>
#include <QMouseEvent>
#include <utils.h>
class DragWidget;
class MultiScreenWorker;
DWIDGET_USE_NAMESPACE
class MainWindowBase : public DBlurEffectWidget
{
Q_OBJECT
public:
enum class DockWindowType {
MainWindow, // 主窗口
TrayWindow // 主窗口之外的其他窗口
};
public:
explicit MainWindowBase(MultiScreenWorker *multiScreenWorker, QWidget *parent = Q_NULLPTR);
virtual ~MainWindowBase();
void setOrder(int order); // 窗体展示的顺序,按照左到右和上到下
int order() const;
virtual DockWindowType windowType() const = 0;
virtual void setDisplayMode(const Dock::DisplayMode &displayMode);
virtual void setPosition(const Dock::Position &position);
// 用来更新子区域的位置一般用于在执行动画的过程中根据当前的位置来更新里面panel的大小
virtual void updateParentGeometry(const Dock::Position &pos, const QRect &rect) = 0;
virtual QRect getDockGeometry(QScreen *screen, const Dock::Position &pos, const Dock::DisplayMode &displaymode, const Dock::HideState &hideState, bool withoutScale = false) const;
QVariantAnimation *createAnimation(QScreen *screen, const Dock::Position &pos, const Dock::AniAction &act);
virtual void resetPanelGeometry() {} // 重置内部区域,为了让内部区域和当前区域始终保持一致
virtual int dockSpace() const; // 与后面窗体之间的间隔
Q_SIGNALS:
void requestUpdate();
protected:
void resizeEvent(QResizeEvent *event) override;
void moveEvent(QMoveEvent *) override;
void enterEvent(QEvent *e) override;
void mousePressEvent(QMouseEvent *event) override;
void showEvent(QShowEvent *event) override;
Dock::DisplayMode displayMode() const;
Dock::Position position() const;
int windowSize() const;
bool isDraging() const;
virtual void updateRadius(int borderRadius) {}
virtual QSize suitableSize(const Dock::Position &pos, const int &screenSize, const double &deviceRatio) const = 0;
private:
void initUi();
void initAttribute();
void initConnection();
void initMember();
void updateDragGeometry();
int getBorderRadius() const;
private Q_SLOTS:
void onMainWindowSizeChanged(QPoint offset);
void resetDragWindow();
void touchRequestResizeDock();
void adjustShadowMask();
void onCompositeChanged();
void onThemeTypeChanged(DGuiApplicationHelper::ColorType themeType);
private:
Dock::DisplayMode m_displayMode;
Dock::Position m_position;
DockInter *m_dockInter;
DragWidget *m_dragWidget;
MultiScreenWorker *m_multiScreenWorker;
QTimer *m_updateDragAreaTimer;
DPlatformWindowHandle m_platformWindowHandle;
QTimer *m_shadowMaskOptimizeTimer;
bool m_isShow;
int m_borderRadius;
int m_order;
};
#endif // MAINWINDOWBASE_H