Files

147 lines
5.1 KiB
QML
Raw Permalink Normal View History

// =====================================
// =============== 主窗口 ===============
// =====================================
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
}
}
}
}
}
}