147 lines
5.1 KiB
QML
147 lines
5.1 KiB
QML
// =====================================
|
||
// =============== 主窗口 ===============
|
||
// =====================================
|
||
|
||
import QtQuick 2.15
|
||
import QtQuick.Window 2.15
|
||
import QtQuick.Controls 2.15
|
||
import QtGraphicalEffects 1.15
|
||
import Qt.labs.settings 1.1
|
||
import MissionConnector 1.0 // Python任务连接器
|
||
import KeyMouseConnector 1.0 // 键盘/鼠标连接器
|
||
import UtilsConnector 1.0 // 通用连接器
|
||
|
||
import "Themes"
|
||
import "TabView_"
|
||
import "Configs"
|
||
import "EventBus"
|
||
import "Popup_"
|
||
import "MainWindow"
|
||
import "ImageManager"
|
||
|
||
Window {
|
||
id: mainWindowRoot
|
||
visibility: Window.Hidden // 在 MainWindowManager 中启用可见性
|
||
// 窗口 | 自定义标题栏 | 有标题 | 有系统菜单 | 有最小最大化按钮 | 有关闭按钮 | 根据条件是否置顶
|
||
property bool isMainWindowTop: false
|
||
flags: Qt.Window | Qt.CustomizeWindowHint | Qt.WindowTitleHint | Qt.WindowSystemMenuHint
|
||
| Qt.WindowMinMaxButtonsHint | Qt.WindowCloseButtonHint | (isMainWindowTop?Qt.WindowStaysOnTopHint:0)
|
||
|
||
width: 800
|
||
height: 500
|
||
minimumWidth: 300
|
||
minimumHeight: 300
|
||
color: "#00000000"
|
||
title: UmiAbout.fullname
|
||
|
||
// ========================= 【控制】 =========================
|
||
|
||
// 全局样式,通过 theme 来访问
|
||
property Theme theme: Theme{}
|
||
// 全局尺寸,通过 size_ 来访问
|
||
property Size_ size_: Size_{}
|
||
|
||
// 全局单例,通过 qmlapp. 来访问
|
||
Item {
|
||
id: qmlapp
|
||
|
||
// 普通全局单例
|
||
TabViewManager { id: tab } // 标签页逻辑管理器
|
||
ImageManager { id: imageManager } // 图片管理器
|
||
MissionConnector { id: msnConnector } // 任务连接器
|
||
PubSub { id: pubSub } // 全局事件发布/订阅
|
||
KeyMouseConnector { id:keyMouse } // 鼠标/键盘
|
||
UtilsConnector { id:utilsConnector } // 通用连接器
|
||
AsynFilesLoader { id:asynFilesLoader } // 异步文件加载器
|
||
|
||
// 必须先初始化的单例,onCompleted顺序从下往上
|
||
MainWindowManager { id:mainWin; mainWin:mainWindowRoot } // 主窗管理
|
||
SystemTray { id:systemTray } // 系统托盘
|
||
PopupManager { id: popup } // 弹窗管理器
|
||
GlobalConfigs { id: globalConfigs } // 全局设置
|
||
|
||
property alias asynFilesLoader: asynFilesLoader
|
||
property alias imageManager: imageManager
|
||
property alias globalConfigs: globalConfigs
|
||
property alias tab: tab
|
||
property alias popup: popup
|
||
property alias msnConnector: msnConnector
|
||
property alias pubSub: pubSub
|
||
property alias keyMouse: keyMouse
|
||
property alias utilsConnector: utilsConnector
|
||
property alias systemTray: systemTray
|
||
property alias mainWin: mainWin
|
||
property bool enabledEffect: false // 全局是否启用动画
|
||
|
||
Component.onCompleted: {
|
||
// 延时加载标签页
|
||
Qt.callLater(()=>{
|
||
qmlapp.tab.init()
|
||
})
|
||
}
|
||
}
|
||
|
||
onClosing: { // 窗口关闭事件
|
||
close.accepted = false // 阻止原生事件
|
||
mainWin.close() // 调用主窗管理器的关闭
|
||
}
|
||
|
||
// ========================= 【布局】 =========================
|
||
|
||
// 主窗口的容器,兼做边框
|
||
Rectangle {
|
||
id: mainContainer
|
||
anchors.fill: parent
|
||
color: "#00000000"
|
||
radius: size_.windowRadius // 窗口圆角
|
||
focus: true
|
||
|
||
// Esc 关闭窗口
|
||
Keys.enabled: true
|
||
Keys.onEscapePressed: {
|
||
// 如果设置了关闭窗口后隐藏到托盘区,则关闭窗口
|
||
if(qmlapp.globalConfigs.getValue("window.closeWin2Hide")) {
|
||
mainWindowRoot.visibility = Window.Hidden
|
||
}
|
||
// 否则,最小化窗口,以兼容没有托盘区的平台
|
||
else {
|
||
mainWindowRoot.visibility = Window.Minimized
|
||
}
|
||
// TODO: Deiban 平台测试!
|
||
}
|
||
|
||
// 为了防止主窗启动不显示时,内容的宽度初始值为0,先让内容挂到固定宽度的Item下
|
||
Item {
|
||
width: 800
|
||
height: 500
|
||
property alias mainWidth: mainContainer.width
|
||
onMainWidthChanged: { // 主窗恢复显示时,再让内容挂回主窗
|
||
if(mainUI.parent !== mainContainer)
|
||
mainUI.parent = mainContainer
|
||
}
|
||
|
||
// 主窗口的内容
|
||
Rectangle {
|
||
id: mainUI
|
||
anchors.fill: parent
|
||
anchors.margins: 0 // 透明边框宽度
|
||
|
||
color: theme.bgColor // 整个窗口的背景颜色
|
||
radius: size_.windowRadius // 窗口圆角
|
||
|
||
// 标签视图
|
||
TabView_ { }
|
||
|
||
// 裁切子元素,并应用圆角
|
||
layer.enabled: true
|
||
layer.effect: OpacityMask {
|
||
maskSource: Rectangle {
|
||
width: mainUI.width
|
||
height: mainUI.height
|
||
radius: size_.windowRadius
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} |