add crypto
This commit is contained in:
parent
90cbe489f6
commit
af6a3bce3e
120 changed files with 24616 additions and 462 deletions
|
|
@ -0,0 +1,147 @@
|
|||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import "root:/Data" as Data
|
||||
|
||||
// Calendar tab content
|
||||
Item {
|
||||
id: calendarTab
|
||||
|
||||
required property var shell
|
||||
property bool isActive: false
|
||||
|
||||
Column {
|
||||
anchors.fill: parent
|
||||
spacing: 12
|
||||
|
||||
Text {
|
||||
text: "Calendar"
|
||||
color: Data.ThemeManager.accentColor
|
||||
font.pixelSize: 18
|
||||
font.bold: true
|
||||
font.family: "Roboto"
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
width: parent.width
|
||||
height: parent.height - parent.children[0].height - parent.spacing
|
||||
color: Qt.lighter(Data.ThemeManager.bgColor, 1.2)
|
||||
radius: 20
|
||||
clip: true
|
||||
|
||||
Loader {
|
||||
anchors.fill: parent
|
||||
anchors.margins: 16
|
||||
active: calendarTab.isActive
|
||||
sourceComponent: active ? calendarComponent : null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Component {
|
||||
id: calendarComponent
|
||||
Item {
|
||||
id: calendarRoot
|
||||
property var shell: calendarTab.shell
|
||||
|
||||
readonly property date currentDate: new Date()
|
||||
property int month: currentDate.getMonth()
|
||||
property int year: currentDate.getFullYear()
|
||||
readonly property int currentDay: currentDate.getDate()
|
||||
|
||||
Column {
|
||||
anchors.fill: parent
|
||||
anchors.margins: 8
|
||||
spacing: 8
|
||||
|
||||
// Month/Year header
|
||||
Text {
|
||||
text: Qt.locale("en_US").monthName(calendarRoot.month) + " " + calendarRoot.year
|
||||
color: Data.ThemeManager.accentColor
|
||||
font.bold: true
|
||||
width: parent.width
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
font.pixelSize: 16
|
||||
height: 24
|
||||
}
|
||||
|
||||
// Weekday headers (Monday-Sunday)
|
||||
Grid {
|
||||
columns: 7
|
||||
rowSpacing: 2
|
||||
columnSpacing: 0
|
||||
width: parent.width
|
||||
height: 18
|
||||
|
||||
Repeater {
|
||||
model: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
|
||||
delegate: Text {
|
||||
text: modelData
|
||||
color: Data.ThemeManager.fgColor
|
||||
font.bold: true
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
width: parent.width / 7
|
||||
height: 18
|
||||
font.pixelSize: 11
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Calendar grid - single unified grid
|
||||
Grid {
|
||||
columns: 7
|
||||
rowSpacing: 3
|
||||
columnSpacing: 3
|
||||
width: parent.width
|
||||
|
||||
property int firstDayOfMonth: new Date(calendarRoot.year, calendarRoot.month, 1).getDay()
|
||||
property int daysInMonth: new Date(calendarRoot.year, calendarRoot.month + 1, 0).getDate()
|
||||
property int startOffset: (firstDayOfMonth === 0) ? 6 : firstDayOfMonth - 1 // Convert Sunday=0 to Monday=0
|
||||
property int prevMonthDays: new Date(calendarRoot.year, calendarRoot.month, 0).getDate()
|
||||
|
||||
// Single repeater for all 42 calendar cells (6 weeks × 7 days)
|
||||
Repeater {
|
||||
model: 42
|
||||
delegate: Rectangle {
|
||||
width: (parent.width - (parent.columnSpacing * 6)) / 7
|
||||
height: 26
|
||||
radius: 13
|
||||
|
||||
// Calculate which day this cell represents
|
||||
readonly property int dayNumber: {
|
||||
if (index < parent.startOffset) {
|
||||
// Previous month
|
||||
return parent.prevMonthDays - parent.startOffset + index + 1
|
||||
} else if (index < parent.startOffset + parent.daysInMonth) {
|
||||
// Current month
|
||||
return index - parent.startOffset + 1
|
||||
} else {
|
||||
// Next month
|
||||
return index - parent.startOffset - parent.daysInMonth + 1
|
||||
}
|
||||
}
|
||||
|
||||
readonly property bool isCurrentMonth: index >= parent.startOffset && index < (parent.startOffset + parent.daysInMonth)
|
||||
readonly property bool isToday: isCurrentMonth && dayNumber === calendarRoot.currentDay &&
|
||||
calendarRoot.month === calendarRoot.currentDate.getMonth() &&
|
||||
calendarRoot.year === calendarRoot.currentDate.getFullYear()
|
||||
|
||||
color: isToday ? Data.ThemeManager.accentColor :
|
||||
isCurrentMonth ? Data.ThemeManager.bgColor : Qt.darker(Data.ThemeManager.bgColor, 1.4)
|
||||
|
||||
Text {
|
||||
text: dayNumber
|
||||
anchors.centerIn: parent
|
||||
color: isToday ? Data.ThemeManager.bgColor :
|
||||
isCurrentMonth ? Data.ThemeManager.fgColor : Qt.darker(Data.ThemeManager.fgColor, 1.5)
|
||||
font.bold: isToday
|
||||
font.pixelSize: 12
|
||||
font.family: "Roboto"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,110 @@
|
|||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import "root:/Data" as Data
|
||||
import "root:/Widgets/System" as System
|
||||
|
||||
// Clipboard tab content
|
||||
Item {
|
||||
id: clipboardTab
|
||||
|
||||
required property var shell
|
||||
property bool isActive: false
|
||||
|
||||
Column {
|
||||
anchors.fill: parent
|
||||
spacing: 16
|
||||
|
||||
RowLayout {
|
||||
width: parent.width
|
||||
spacing: 16
|
||||
|
||||
Text {
|
||||
text: "Clipboard History"
|
||||
color: Data.ThemeManager.accentColor
|
||||
font.pixelSize: 18
|
||||
font.bold: true
|
||||
font.family: "Roboto"
|
||||
}
|
||||
|
||||
Item { Layout.fillWidth: true }
|
||||
|
||||
Rectangle {
|
||||
width: clearClipText.implicitWidth + 16
|
||||
height: 24
|
||||
radius: 12
|
||||
color: clearClipMouseArea.containsMouse ? Qt.rgba(Data.ThemeManager.accentColor.r, Data.ThemeManager.accentColor.g, Data.ThemeManager.accentColor.b, 0.2) : "transparent"
|
||||
border.color: Data.ThemeManager.accentColor
|
||||
border.width: 1
|
||||
|
||||
Text {
|
||||
id: clearClipText
|
||||
anchors.centerIn: parent
|
||||
text: "Clear All"
|
||||
color: Data.ThemeManager.accentColor
|
||||
font.family: "Roboto"
|
||||
font.pixelSize: 11
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: clearClipMouseArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
onClicked: {
|
||||
if (clipboardLoader.item && clipboardLoader.item.children[0]) {
|
||||
let clipComponent = clipboardLoader.item.children[0]
|
||||
if (clipComponent.clearClipboardHistory) {
|
||||
clipComponent.clearClipboardHistory()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
width: parent.width
|
||||
height: parent.height - parent.children[0].height - parent.spacing
|
||||
color: Qt.lighter(Data.ThemeManager.bgColor, 1.2)
|
||||
radius: 20
|
||||
clip: true
|
||||
|
||||
Loader {
|
||||
id: clipboardLoader
|
||||
anchors.fill: parent
|
||||
anchors.margins: 20
|
||||
active: clipboardTab.isActive
|
||||
sourceComponent: active ? clipboardHistoryComponent : null
|
||||
onLoaded: {
|
||||
if (item && item.children[0]) {
|
||||
item.children[0].refreshClipboardHistory()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Component {
|
||||
id: clipboardHistoryComponent
|
||||
Item {
|
||||
anchors.fill: parent
|
||||
|
||||
System.Cliphist {
|
||||
id: cliphistComponent
|
||||
anchors.fill: parent
|
||||
shell: clipboardTab.shell
|
||||
|
||||
Component.onCompleted: {
|
||||
for (let i = 0; i < children.length; i++) {
|
||||
let child = children[i]
|
||||
if (child.objectName === "contentColumn" || child.toString().includes("ColumnLayout")) {
|
||||
if (child.children && child.children.length > 0) {
|
||||
child.children[0].visible = false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,155 @@
|
|||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import "root:/Data" as Data
|
||||
import "root:/Widgets/System" as System
|
||||
import "../components/widgets" as Widgets
|
||||
import "../components/controls" as Controls
|
||||
import "../components/system" as SystemComponents
|
||||
|
||||
// Main dashboard content (tab 0)
|
||||
Item {
|
||||
id: mainDashboard
|
||||
|
||||
// Properties from parent
|
||||
required property var shell
|
||||
required property bool isRecording
|
||||
required property var triggerMouseArea
|
||||
|
||||
// Signals to forward
|
||||
signal recordingRequested()
|
||||
signal stopRecordingRequested()
|
||||
signal systemActionRequested(string action)
|
||||
signal performanceActionRequested(string action)
|
||||
|
||||
// Hover detection for auto-hide
|
||||
property bool isHovered: {
|
||||
const mouseStates = {
|
||||
userProfileHovered: userProfile ? userProfile.isHovered : false,
|
||||
weatherDisplayHovered: weatherDisplay ? weatherDisplay.containsMouse : false,
|
||||
recordingButtonHovered: recordingButton ? recordingButton.isHovered : false,
|
||||
controlsHovered: controls ? controls.containsMouse : false,
|
||||
trayHovered: trayMouseArea ? trayMouseArea.containsMouse : false,
|
||||
systemTrayHovered: systemTrayModule ? systemTrayModule.containsMouse : false,
|
||||
trayMenuHovered: inlineTrayMenu ? inlineTrayMenu.containsMouse : false,
|
||||
trayMenuVisible: inlineTrayMenu ? inlineTrayMenu.visible : false
|
||||
}
|
||||
return Object.values(mouseStates).some(state => state)
|
||||
}
|
||||
|
||||
// Night Light overlay controller (invisible - manages screen overlay)
|
||||
Widgets.NightLight {
|
||||
id: nightLightController
|
||||
shell: mainDashboard.shell
|
||||
visible: false // This widget manages overlay windows, doesn't need to be visible
|
||||
}
|
||||
|
||||
Column {
|
||||
anchors.fill: parent
|
||||
spacing: 28
|
||||
|
||||
// User profile row with weather
|
||||
Row {
|
||||
width: parent.width
|
||||
spacing: 18
|
||||
|
||||
Widgets.UserProfile {
|
||||
id: userProfile
|
||||
width: parent.width - weatherDisplay.width - parent.spacing
|
||||
height: 80
|
||||
shell: mainDashboard.shell
|
||||
}
|
||||
|
||||
Widgets.WeatherDisplay {
|
||||
id: weatherDisplay
|
||||
width: parent.width * 0.18
|
||||
height: userProfile.height
|
||||
shell: mainDashboard.shell
|
||||
}
|
||||
}
|
||||
|
||||
// Recording and system controls section
|
||||
Column {
|
||||
width: parent.width
|
||||
spacing: 28
|
||||
|
||||
Widgets.RecordingButton {
|
||||
id: recordingButton
|
||||
width: parent.width
|
||||
height: 48
|
||||
shell: mainDashboard.shell
|
||||
isRecording: mainDashboard.isRecording
|
||||
|
||||
onRecordingRequested: mainDashboard.recordingRequested()
|
||||
onStopRecordingRequested: mainDashboard.stopRecordingRequested()
|
||||
}
|
||||
|
||||
Controls.Controls {
|
||||
id: controls
|
||||
width: parent.width
|
||||
isRecording: mainDashboard.isRecording
|
||||
shell: mainDashboard.shell
|
||||
onPerformanceActionRequested: function(action) { mainDashboard.performanceActionRequested(action) }
|
||||
onSystemActionRequested: function(action) { mainDashboard.systemActionRequested(action) }
|
||||
}
|
||||
}
|
||||
|
||||
// System tray integration with menu
|
||||
Column {
|
||||
id: systemTraySection
|
||||
width: parent.width
|
||||
spacing: 8
|
||||
|
||||
property bool containsMouse: trayMouseArea.containsMouse || systemTrayModule.containsMouse
|
||||
|
||||
Rectangle {
|
||||
id: trayBackground
|
||||
width: parent.width
|
||||
height: 40
|
||||
radius: 20
|
||||
color: Qt.darker(Data.ThemeManager.bgColor, 1.15)
|
||||
|
||||
property bool isActive: false
|
||||
|
||||
MouseArea {
|
||||
id: trayMouseArea
|
||||
anchors.fill: parent
|
||||
anchors.margins: -10
|
||||
hoverEnabled: true
|
||||
propagateComposedEvents: true
|
||||
preventStealing: false
|
||||
onEntered: trayBackground.isActive = true
|
||||
onExited: {
|
||||
// Only deactivate if we're not hovering over tray menu or system tray module
|
||||
if (!inlineTrayMenu.visible && !inlineTrayMenu.containsMouse) {
|
||||
Qt.callLater(function() {
|
||||
if (!systemTrayModule.containsMouse && !inlineTrayMenu.containsMouse && !inlineTrayMenu.visible) {
|
||||
trayBackground.isActive = false
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
System.SystemTray {
|
||||
id: systemTrayModule
|
||||
anchors.centerIn: parent
|
||||
shell: mainDashboard.shell
|
||||
bar: parent
|
||||
trayMenu: inlineTrayMenu
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SystemComponents.TrayMenu {
|
||||
id: inlineTrayMenu
|
||||
parent: mainDashboard
|
||||
width: parent.width
|
||||
menu: null
|
||||
systemTrayY: systemTraySection.y
|
||||
systemTrayHeight: systemTraySection.height
|
||||
z: 100 // High z-index to appear above other content
|
||||
onHideRequested: trayBackground.isActive = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
import QtQuick
|
||||
import "root:/Data" as Data
|
||||
import "../components/media" as Media
|
||||
|
||||
// Music tab content
|
||||
Item {
|
||||
id: musicTab
|
||||
|
||||
required property var shell
|
||||
property bool isActive: false
|
||||
|
||||
Column {
|
||||
anchors.fill: parent
|
||||
spacing: 16
|
||||
|
||||
Text {
|
||||
text: "Music Player"
|
||||
color: Data.ThemeManager.accentColor
|
||||
font.pixelSize: 18
|
||||
font.bold: true
|
||||
font.family: "Roboto"
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
width: parent.width
|
||||
height: parent.height - parent.children[0].height - parent.spacing
|
||||
color: Qt.lighter(Data.ThemeManager.bgColor, 1.2)
|
||||
radius: 20
|
||||
clip: true
|
||||
|
||||
Loader {
|
||||
anchors.fill: parent
|
||||
anchors.margins: 20
|
||||
active: musicTab.isActive
|
||||
sourceComponent: active ? musicPlayerComponent : null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Component {
|
||||
id: musicPlayerComponent
|
||||
Media.MusicPlayer {
|
||||
shell: musicTab.shell
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,106 @@
|
|||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import "root:/Data" as Data
|
||||
import "root:/Widgets/Notifications" as Notifications
|
||||
|
||||
// Notification tab content
|
||||
Item {
|
||||
id: notificationTab
|
||||
|
||||
required property var shell
|
||||
property bool isActive: false
|
||||
|
||||
Column {
|
||||
anchors.fill: parent
|
||||
spacing: 16
|
||||
|
||||
RowLayout {
|
||||
width: parent.width
|
||||
spacing: 16
|
||||
|
||||
Text {
|
||||
text: "Notification History"
|
||||
color: Data.ThemeManager.accentColor
|
||||
font.pixelSize: 18
|
||||
font.bold: true
|
||||
font.family: "Roboto"
|
||||
}
|
||||
|
||||
Text {
|
||||
text: "(" + (notificationTab.shell.notificationHistory ? notificationTab.shell.notificationHistory.count : 0) + ")"
|
||||
color: Data.ThemeManager.fgColor
|
||||
font.family: "Roboto"
|
||||
font.pixelSize: 12
|
||||
opacity: 0.7
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
}
|
||||
|
||||
Item { Layout.fillWidth: true }
|
||||
|
||||
Rectangle {
|
||||
width: clearNotifText.implicitWidth + 16
|
||||
height: 24
|
||||
radius: 12
|
||||
color: clearNotifMouseArea.containsMouse ? Qt.rgba(Data.ThemeManager.accentColor.r, Data.ThemeManager.accentColor.g, Data.ThemeManager.accentColor.b, 0.2) : "transparent"
|
||||
border.color: Data.ThemeManager.accentColor
|
||||
border.width: 1
|
||||
|
||||
Text {
|
||||
id: clearNotifText
|
||||
anchors.centerIn: parent
|
||||
text: "Clear All"
|
||||
color: Data.ThemeManager.accentColor
|
||||
font.family: "Roboto"
|
||||
font.pixelSize: 11
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: clearNotifMouseArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
onClicked: notificationTab.shell.notificationHistory.clear()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
width: parent.width
|
||||
height: parent.height - parent.children[0].height - parent.spacing
|
||||
color: Qt.lighter(Data.ThemeManager.bgColor, 1.2)
|
||||
radius: 20
|
||||
clip: true
|
||||
|
||||
Loader {
|
||||
anchors.fill: parent
|
||||
anchors.margins: 20
|
||||
active: notificationTab.isActive
|
||||
sourceComponent: active ? notificationHistoryComponent : null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Component {
|
||||
id: notificationHistoryComponent
|
||||
Item {
|
||||
anchors.fill: parent
|
||||
|
||||
Notifications.NotificationHistory {
|
||||
anchors.fill: parent
|
||||
shell: notificationTab.shell
|
||||
clip: true
|
||||
|
||||
Component.onCompleted: {
|
||||
for (let i = 0; i < children.length; i++) {
|
||||
let child = children[i]
|
||||
if (child.objectName === "contentColumn" || child.toString().includes("ColumnLayout")) {
|
||||
if (child.children && child.children.length > 0) {
|
||||
child.children[0].visible = false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,153 @@
|
|||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import "root:/Data" as Data
|
||||
import "../components/settings" as SettingsComponents
|
||||
|
||||
// Settings tab content with modular, collapsible categories
|
||||
Item {
|
||||
id: settingsTab
|
||||
|
||||
required property var shell
|
||||
property bool isActive: false
|
||||
|
||||
// Track when any text input has focus for keyboard management
|
||||
property bool anyTextInputFocused: {
|
||||
try {
|
||||
return (notificationSettings && notificationSettings.anyTextInputFocused) ||
|
||||
(systemSettings && systemSettings.anyTextInputFocused) ||
|
||||
(weatherSettings && weatherSettings.anyTextInputFocused)
|
||||
} catch (e) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// Header
|
||||
Text {
|
||||
id: header
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.margins: 20
|
||||
text: "Settings"
|
||||
color: Data.ThemeManager.accentColor
|
||||
font.pixelSize: 24
|
||||
font.bold: true
|
||||
font.family: "Roboto"
|
||||
}
|
||||
|
||||
// Scrollable content
|
||||
ScrollView {
|
||||
anchors.top: header.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.topMargin: 16
|
||||
anchors.leftMargin: 20
|
||||
anchors.rightMargin: 20
|
||||
anchors.bottomMargin: 20
|
||||
|
||||
clip: true
|
||||
contentWidth: width - 5 // Reserve space for scrollbar
|
||||
|
||||
ScrollBar.vertical.policy: ScrollBar.AsNeeded
|
||||
ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
|
||||
|
||||
Column {
|
||||
width: parent.width - 15 // Match contentWidth
|
||||
spacing: 16
|
||||
|
||||
// VISUAL SETTINGS
|
||||
// Appearance Category
|
||||
SettingsComponents.SettingsCategory {
|
||||
id: appearanceCategory
|
||||
width: parent.width
|
||||
title: "Appearance"
|
||||
icon: "palette"
|
||||
|
||||
content: Component {
|
||||
SettingsComponents.AppearanceSettings {
|
||||
width: parent.width
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ⚙️ CORE SYSTEM SETTINGS
|
||||
// System Category
|
||||
SettingsComponents.SettingsCategory {
|
||||
id: systemCategory
|
||||
width: parent.width
|
||||
title: "System"
|
||||
icon: "settings"
|
||||
|
||||
content: Component {
|
||||
SettingsComponents.SystemSettings {
|
||||
id: systemSettings
|
||||
width: parent.width
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Notifications Category
|
||||
SettingsComponents.SettingsCategory {
|
||||
id: notificationsCategory
|
||||
width: parent.width
|
||||
title: "Notifications"
|
||||
icon: "notifications"
|
||||
|
||||
content: Component {
|
||||
SettingsComponents.NotificationSettings {
|
||||
id: notificationSettings
|
||||
width: parent.width
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 🎵 MEDIA & EXTERNAL SERVICES
|
||||
// Music Player Category
|
||||
SettingsComponents.SettingsCategory {
|
||||
id: musicPlayerCategory
|
||||
width: parent.width
|
||||
title: "Music Player"
|
||||
icon: "music_note"
|
||||
|
||||
content: Component {
|
||||
SettingsComponents.MusicPlayerSettings {
|
||||
width: parent.width
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Weather Category
|
||||
SettingsComponents.SettingsCategory {
|
||||
id: weatherCategory
|
||||
width: parent.width
|
||||
title: "Weather"
|
||||
icon: "wb_sunny"
|
||||
|
||||
content: Component {
|
||||
SettingsComponents.WeatherSettings {
|
||||
id: weatherSettings
|
||||
width: parent.width
|
||||
shell: settingsTab.shell
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ACCESSIBILITY & COMFORT
|
||||
// Night Light Category
|
||||
SettingsComponents.SettingsCategory {
|
||||
id: nightLightCategory
|
||||
width: parent.width
|
||||
title: "Night Light"
|
||||
icon: "dark_mode"
|
||||
|
||||
content: Component {
|
||||
SettingsComponents.NightLightSettings {
|
||||
width: parent.width
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
import QtQuick
|
||||
import "root:/Data" as Data
|
||||
import "../components/system" as SystemComponents
|
||||
|
||||
// Wallpaper tab content
|
||||
Item {
|
||||
id: wallpaperTab
|
||||
|
||||
property bool isActive: false
|
||||
|
||||
Column {
|
||||
anchors.fill: parent
|
||||
spacing: 16
|
||||
|
||||
Text {
|
||||
text: "Wallpapers"
|
||||
color: Data.ThemeManager.accentColor
|
||||
font.pixelSize: 18
|
||||
font.bold: true
|
||||
font.family: "Roboto"
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
width: parent.width
|
||||
height: parent.height - parent.children[0].height - parent.spacing
|
||||
color: Qt.lighter(Data.ThemeManager.bgColor, 1.2)
|
||||
radius: 20
|
||||
clip: true
|
||||
|
||||
Loader {
|
||||
anchors.fill: parent
|
||||
anchors.margins: 20
|
||||
active: wallpaperTab.isActive
|
||||
sourceComponent: active ? wallpaperSelectorComponent : null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Component {
|
||||
id: wallpaperSelectorComponent
|
||||
SystemComponents.WallpaperSelector {
|
||||
isVisible: parent && parent.parent && parent.parent.visible
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue