diff --git a/rog-control-center/ui/main_window.slint b/rog-control-center/ui/main_window.slint index 125dbb66..64a359fb 100644 --- a/rog-control-center/ui/main_window.slint +++ b/rog-control-center/ui/main_window.slint @@ -3,8 +3,7 @@ import { AppSize } from "globals.slint"; import { PageSystem, AvailableSystemProperties, SystemPageData } from "pages/system.slint"; import { SideBar } from "widgets/sidebar.slint"; import { PageAbout } from "pages/about.slint"; -import { PageFans, Node } from "pages/fans.slint"; -export { Node } +import { PageFans } from "pages/fans.slint"; import { PageAnime, AnimePageData } from "pages/anime.slint"; import { PageAura } from "pages/aura.slint"; import { AuraPageData, AuraDevType, AuraDevTuf, AuraDevRog1, PowerZones, KbAuraPowerState, AuraPowerDev, AuraEffect } from "types/aura_types.slint"; @@ -36,7 +35,6 @@ export component MainWindow inherits Window { aura.external_colour_change(); aura.external_colour_change(); } - pure callback verify_fan_curves([Node], length, length) -> [Node]; min-height: AppSize.height; min-width: AppSize.width; background: Colors.black; diff --git a/rog-control-center/ui/pages/aura.slint b/rog-control-center/ui/pages/aura.slint index 9dca535f..15c0ae94 100644 --- a/rog-control-center/ui/pages/aura.slint +++ b/rog-control-center/ui/pages/aura.slint @@ -26,9 +26,9 @@ export component PageAura inherits Rectangle { SystemDropdown { text: @tr("Brightness"); current_index <=> AuraPageData.brightness; - current_value: AuraPageData.brightness_names[self.current-index]; + current_value: AuraPageData.brightness_names[self.current-index]; model <=> AuraPageData.brightness_names; - selected => { + selected => { AuraPageData.set_brightness(AuraPageData.brightness) } } diff --git a/rog-control-center/ui/pages/fans.slint b/rog-control-center/ui/pages/fans.slint index aa4f543b..0640ab0a 100644 --- a/rog-control-center/ui/pages/fans.slint +++ b/rog-control-center/ui/pages/fans.slint @@ -1,53 +1,154 @@ -import { Palette } from "std-widgets.slint"; -import { Graph } from "../widgets/graph.slint"; +import { Palette, TabWidget, Button, CheckBox } from "std-widgets.slint"; +import { Graph, Node } from "../widgets/graph.slint"; +import { SystemToggle } from "../widgets/common.slint"; +import { Profile, FanType, FanPageData } from "../types/fan_types.slint"; -export struct Node { x: length, y: length} +component FanTab inherits Rectangle { + in-out property enabled: false; + in-out property tab_enabled: false; + in property profile; + in property fan_type; + callback apply(); + callback cancel(); + callback default(); + callback toggled(); + in property title; + in-out property <[Node]> nodes; -export component PageFans inherits VerticalLayout { - in-out property <[Node]> nodes: [ - { - x: 10px, - y: 10px, - }, - { - x: 40px, - y: 30px, - }, - { - x: 70px, - y: 50px, - }, - { - x: 100px, - y: 70px, - }, - { - x: 130px, - y: 90px, - }, - { - x: 160px, - y: 110px, - }, - { - x: 190px, - y: 130px, - }, - { - x: 220px, - y: 150px, - }, - ]; - Text { - text: "WORK IN PROGRESS"; + if !root.tab_enabled: VerticalLayout { + alignment: center; + HorizontalLayout { + alignment: center; + Text { + font-size: 24px; + text: "WIP: Not enabled yet"; + } + } } - HorizontalLayout { - Graph { - // width: root.preferred-width; - // height: root.preferred-height; - nodes <=> root.nodes; - + VerticalLayout { + HorizontalLayout { + Graph { + nodes <=> root.nodes; + } + } + + HorizontalLayout { + alignment: LayoutAlignment.end; + CheckBox { + text: @tr("Enabled"); + checked <=> root.enabled; + enabled <=> root.tab_enabled; + toggled => { + root.toggled(); + } + } + + Button { + text: @tr("Apply"); + enabled <=> root.tab_enabled; + clicked => { + root.apply(); + } + } + + Button { + text: @tr("Cancel"); + enabled <=> root.tab_enabled; + clicked => { + root.cancel() + } + } + + Button { + text: @tr("Factory Default"); + enabled <=> root.tab_enabled; + clicked => { + root.default(); + } + } + } + } +} + +export component PageFans inherits VerticalLayout { + TabWidget { + Tab { + title: @tr("Balanced"); + TabWidget { + Tab { + title: @tr("CPU"); + FanTab { + nodes <=> FanPageData.balanced_cpu; + } + } + + Tab { + title: @tr("Mid"); + FanTab { + nodes <=> FanPageData.balanced_mid; + } + } + + Tab { + title: @tr("GPU"); + FanTab { + nodes <=> FanPageData.balanced_gpu; + } + } + } + } + + Tab { + title: @tr("Performance"); + TabWidget { + Tab { + title: @tr("CPU"); + FanTab { + nodes <=> FanPageData.performance_cpu; + } + } + + Tab { + title: @tr("Mid"); + FanTab { + nodes <=> FanPageData.performance_mid; + } + } + + Tab { + title: @tr("GPU"); + FanTab { + nodes <=> FanPageData.performance_gpu; + } + } + } + } + + Tab { + title: @tr("Quiet"); + TabWidget { + Tab { + title: @tr("CPU"); + FanTab { + nodes <=> FanPageData.quiet_cpu; + } + } + + Tab { + title: @tr("Mid"); + FanTab { + nodes <=> FanPageData.quiet_mid; + } + } + + Tab { + title: @tr("GPU"); + FanTab { + nodes <=> FanPageData.quiet_gpu; + } + } + } } } } diff --git a/rog-control-center/ui/pages/system.slint b/rog-control-center/ui/pages/system.slint index 5bb48998..2999192a 100644 --- a/rog-control-center/ui/pages/system.slint +++ b/rog-control-center/ui/pages/system.slint @@ -112,7 +112,7 @@ export component PageSystem inherits Rectangle { minimum: 20; maximum: 100; value <=> SystemPageData.charge_control_end_threshold; - released => { + released => { SystemPageData.set_charge_control_end_threshold(Math.round(SystemPageData.charge_control_end_threshold)) } } @@ -124,7 +124,7 @@ export component PageSystem inherits Rectangle { current_index <=> SystemPageData.throttle_thermal_policy; current_value: SystemPageData.throttle_policy_choices[SystemPageData.throttle_thermal_policy]; model <=> SystemPageData.throttle_policy_choices; - selected => { + selected => { SystemPageData.set_throttle_thermal_policy(SystemPageData.throttle_thermal_policy) } } @@ -144,7 +144,7 @@ export component PageSystem inherits Rectangle { if SystemPageData.available.panel-od: SystemToggle { text: @tr("Panel Overdrive"); checked <=> SystemPageData.panel_od; - toggled => { + toggled => { SystemPageData.set_panel_od(SystemPageData.panel_od) } } @@ -152,7 +152,7 @@ export component PageSystem inherits Rectangle { if SystemPageData.available.mini-led-mode: SystemToggle { text: @tr("MiniLED Mode"); checked <=> SystemPageData.mini_led_mode; - toggled => { + toggled => { SystemPageData.set_mini_led_mode(SystemPageData.mini_led_mode) } } @@ -160,7 +160,7 @@ export component PageSystem inherits Rectangle { if SystemPageData.available.boot-sound: SystemToggle { text: @tr("POST boot sound"); checked <=> SystemPageData.boot_sound; - toggled => { + toggled => { SystemPageData.set_boot_sound(SystemPageData.boot_sound) } } @@ -185,7 +185,7 @@ export component PageSystem inherits Rectangle { minimum: 5; maximum: 250; value <=> SystemPageData.ppt_pl1_spl; - released => { + released => { SystemPageData.set_ppt_pl1_spl(Math.round(SystemPageData.ppt_pl1_spl)) } } @@ -195,7 +195,7 @@ export component PageSystem inherits Rectangle { minimum: 5; maximum: 250; value <=> SystemPageData.ppt_pl2_sppt; - released => { + released => { SystemPageData.set_ppt_pl2_sppt(Math.round(SystemPageData.ppt_pl2_sppt)) } } @@ -205,7 +205,7 @@ export component PageSystem inherits Rectangle { minimum: 5; maximum: 250; value <=> SystemPageData.ppt_fppt; - released => { + released => { SystemPageData.set_ppt_fppt(Math.round(SystemPageData.ppt_fppt)) } } @@ -215,7 +215,7 @@ export component PageSystem inherits Rectangle { minimum: 5; maximum: 130; value <=> SystemPageData.ppt_apu_sppt; - released => { + released => { SystemPageData.set_ppt_apu_sppt(Math.round(SystemPageData.ppt_apu_sppt)) } } @@ -225,7 +225,7 @@ export component PageSystem inherits Rectangle { maximum: 130; minimum: 5; value <=> SystemPageData.ppt_platform_sppt; - released => { + released => { SystemPageData.set_ppt_platform_sppt(Math.round(SystemPageData.ppt_platform_sppt)) } } @@ -235,7 +235,7 @@ export component PageSystem inherits Rectangle { minimum: 5; maximum: 25; value <=> SystemPageData.nv_dynamic_boost; - released => { + released => { SystemPageData.set_nv_dynamic_boost(Math.round(SystemPageData.nv_dynamic_boost)) } } @@ -245,7 +245,7 @@ export component PageSystem inherits Rectangle { minimum: 75; maximum: 87; value <=> SystemPageData.nv_temp_target; - released => { + released => { SystemPageData.set_nv_temp_target(Math.round(SystemPageData.nv_temp_target)) } } diff --git a/rog-control-center/ui/widgets/aura_power.slint b/rog-control-center/ui/widgets/aura_power.slint index e87e3d96..ad9db3de 100644 --- a/rog-control-center/ui/widgets/aura_power.slint +++ b/rog-control-center/ui/widgets/aura_power.slint @@ -22,7 +22,6 @@ export component AuraPowerGroup inherits Rectangle { color: Palette.alternate-foreground; horizontal-alignment: TextHorizontalAlignment.center; text <=> root.group-title; - } row := HorizontalBox { diff --git a/rog-control-center/ui/widgets/colour_picker.slint b/rog-control-center/ui/widgets/colour_picker.slint index 2f8a580b..eb7a398d 100644 --- a/rog-control-center/ui/widgets/colour_picker.slint +++ b/rog-control-center/ui/widgets/colour_picker.slint @@ -4,8 +4,8 @@ export component ColourSlider inherits VerticalLayout { spacing: 10px; in-out property enabled; property hex: "#FF0000"; - in-out property c1value<=> c1.value; - in-out property c2value<=> c2.value; + in-out property c1value <=> c1.value; + in-out property c2value <=> c2.value; property base_colour: Colors.red; in-out property final_colour: Colors.red; in-out property colourbox: final_colour; @@ -151,7 +151,6 @@ export component ColourSlider inherits VerticalLayout { border-radius: 7px; border-color: Palette.border; background <=> root.colourbox; - } } } diff --git a/rog-control-center/ui/widgets/common.slint b/rog-control-center/ui/widgets/common.slint index 6c870728..891888b9 100644 --- a/rog-control-center/ui/widgets/common.slint +++ b/rog-control-center/ui/widgets/common.slint @@ -24,7 +24,6 @@ export component SystemSlider inherits RogItem { vertical-alignment: TextVerticalAlignment.center; color: Palette.control-foreground; text <=> root.text; - } Text { @@ -63,7 +62,6 @@ export component SystemToggle inherits RogItem { vertical-alignment: TextVerticalAlignment.center; color: Palette.control-foreground; text <=> root.text; - } } @@ -94,7 +92,6 @@ export component SystemToggleVert inherits RogItem { horizontal-alignment: TextHorizontalAlignment.center; color: Palette.control-foreground; text <=> root.text; - } HorizontalLayout { @@ -102,7 +99,7 @@ export component SystemToggleVert inherits RogItem { padding-bottom: 10px; Switch { checked <=> root.checked; - toggled => { + toggled => { root.toggled(root.checked) } } @@ -125,7 +122,6 @@ export component SystemDropdown inherits RogItem { vertical-alignment: TextVerticalAlignment.center; color: Palette.control-foreground; text <=> root.text; - } } diff --git a/rog-control-center/ui/widgets/graph.slint b/rog-control-center/ui/widgets/graph.slint index 974ab7fb..ad5e2041 100644 --- a/rog-control-center/ui/widgets/graph.slint +++ b/rog-control-center/ui/widgets/graph.slint @@ -3,98 +3,111 @@ import { Palette } from "std-widgets.slint"; export struct Node { x: length, y: length} export component Graph inherits Rectangle { - preferred-height: 100%; - preferred-width: 100%; - pure callback verify_positions([Node], length, length) -> [Node]; in-out property <[Node]> nodes; + in property node_min: { x: 0px, y: 0px }; + in property node_max: { x: 100px, y: 100px }; + property graph_padding: 20px; + graph := Rectangle { + width: root.width - root.graph_padding * 2; + height: root.height - root.graph_padding * 2; + x: root.graph_padding; + y: root.graph_padding; + function scale_x_to_graph(x: length) -> length { + ((x - node_min.x) / (node_max.x - node_min.x)) * graph.width + }function scale_y_to_graph(y: length) -> length { + ((y - node_min.y) / (node_max.y - node_min.y)) * graph.height + }function scale_x_to_node(x: length) -> length { + (x / graph.width) * (node_max.x - node_min.x) + }function scale_y_to_node(y: length) -> length { + (y / graph.height) * (node_max.y - node_min.y) + }for l[idx] in nodes: path := Rectangle { + if idx + 1 != nodes.length: Path { + viewbox-width: self.width / 1px; + viewbox-height: self.height / 1px; + stroke: Palette.control-foreground; + stroke-width: 2px; + MoveTo { + x: scale_x_to_graph(nodes[idx].x) / 1px; + y: graph.height / 1px - scale_y_to_graph(nodes[idx].y) / 1px; + } - for l[idx] in nodes: path := Rectangle { - if idx + 1 != nodes.length: Path { - viewbox-width: self.width / 1px; - viewbox-height: self.height / 1px; - stroke: Palette.control-foreground; - stroke-width: 2px; - MoveTo { - x: nodes[idx].x / 1px; - y: root.height / 1px - nodes[idx].y / 1px; - } - - LineTo { - x: nodes[idx + 1].x / 1px; - y: root.height / 1px - nodes[idx + 1].y / 1px; + LineTo { + x: scale_x_to_graph(nodes[idx + 1].x) / 1px; + y: graph.height / 1px - scale_y_to_graph(nodes[idx + 1].y) / 1px; + } } } - } - for n[idx] in nodes: Rectangle { - states [ + for n[idx] in nodes: Rectangle { + states [ pressed when touch.pressed: { - state.background: Palette.selection-background; - } - hover when touch.has-hover: { - state.background: Palette.accent-background; - } - ]state := Rectangle { - background: Palette.control-foreground; - x: n.x - self.width / 2; - y: root.height - n.y - self.height / 2; - width: 18px; - height: self.width; - border-radius: self.width / 2; - property pad: self.border-radius / 2; + state.background: Palette.selection-background; + } + hover when touch.has-hover: { + state.background: Palette.accent-background; + } + ]state := Rectangle { + background: Palette.control-foreground; + x: scale_x_to_graph(n.x) - self.width / 2; + y: graph.height - scale_y_to_graph(n.y) - self.height / 2; + width: 18px; + height: self.width; + border-radius: self.width / 2; + property pad: 1px; - touch := TouchArea { - function check() { - if idx + 1 < nodes.length && idx > 0 { - if n.x + self.mouse-x - self.pressed-x > nodes[idx + 1].x { - n.x = nodes[idx + 1].x - pad; - } else if n.x + self.mouse-x - self.pressed-x < nodes[idx - 1].x { - n.x = nodes[idx - 1].x + pad; - } + touch := TouchArea { + function check() { + if idx + 1 < nodes.length && idx > 0 { + if n.x + scale_x_to_node(self.mouse-x - self.pressed-x) > nodes[idx + 1].x { + n.x = nodes[idx + 1].x - pad; + } else if n.x + scale_x_to_node(self.mouse-x - self.pressed-x) < nodes[idx - 1].x { + n.x = nodes[idx - 1].x + pad; + } - if n.y + self.height - self.mouse-y - self.pressed-y > nodes[idx + 1].y { - n.y = nodes[idx + 1].y - pad; - } else if n.y + self.height - self.mouse-y - self.pressed-y < nodes[idx - 1].y { - n.y = nodes[idx - 1].y + pad; - } - } else if idx == 0 { - if n.x + self.mouse-x - self.pressed-x < 0.0 { - n.x = 1px; - } else if n.x + self.mouse-x - self.pressed-x > nodes[idx + 1].x { - n.x = nodes[idx + 1].x - pad; - } + if n.y + scale_y_to_node(self.height - self.mouse-y - self.pressed-y) > nodes[idx + 1].y { + n.y = nodes[idx + 1].y - pad; + } else if n.y + scale_y_to_node(self.height - self.mouse-y - self.pressed-y) < nodes[idx - 1].y { + n.y = nodes[idx - 1].y + pad; + } + } else if idx == 0 { + if n.x + scale_x_to_node(self.mouse-x - self.pressed-x) < 0.0 { + n.x = 1px; + } else if n.x + scale_x_to_node(self.mouse-x - self.pressed-x) > nodes[idx + 1].x { + n.x = nodes[idx + 1].x - pad; + } - if n.y - self.mouse-y - self.pressed-y < 0.0 { - n.y = 1px; - } else if n.y + self.height - self.mouse-y - self.pressed-y > nodes[idx + 1].y { - n.y = nodes[idx + 1].y - pad; - } - } else if idx == nodes.length - 1 { - if n.x + self.mouse-x - self.pressed-x > root.width { - n.x = root.width - 1px; - } else if n.x + self.mouse-x - self.pressed-x < nodes[idx - 1].x { - n.x = nodes[idx - 1].x + pad; - } + if n.y - scale_y_to_node(self.mouse-y - self.pressed-y) < 0.0 { + n.y = 1px; + } else if n.y + scale_y_to_node(self.height - self.mouse-y - self.pressed-y) > nodes[idx + 1].y { + n.y = nodes[idx + 1].y - pad; + } + } else if idx == nodes.length - 1 { + if n.x + scale_x_to_node(self.mouse-x - self.pressed-x) > scale_x_to_node(graph.width) { + n.x = scale_x_to_node(graph.width - 1px); + } else if n.x + scale_x_to_node(self.mouse-x - self.pressed-x) < nodes[idx - 1].x { + n.x = nodes[idx - 1].x + pad; + } - if n.y - self.mouse-y - self.pressed-y > root.height { - n.y = root.height - 1px; - } else if n.y + self.height - self.mouse-y - self.pressed-y < nodes[idx - 1].y { - n.y = nodes[idx - 1].y + pad; + if n.y - scale_y_to_node(self.mouse-y - self.pressed-y) > scale_y_to_node(graph.height) { + n.y = scale_y_to_node(graph.height - 1px); + } else if n.y + scale_y_to_node(self.height - self.mouse-y - self.pressed-y) < nodes[idx - 1].y { + n.y = nodes[idx - 1].y + pad; + } } + }moved => { + if (self.pressed) { + n.x += scale_x_to_node(self.mouse-x - self.pressed-x); + n.y -= scale_y_to_node(self.mouse-y - self.pressed-y); + self.check(); + // nodes[idx] = n; } - }moved => { - if (self.pressed) { - n.x += self.mouse-x - self.pressed-x; - n.y -= self.mouse-y - self.pressed-y; + } + + clicked => { self.check(); - // nodes[idx] = n; } + mouse-cursor: move; } - - clicked => { - self.check(); - } - mouse-cursor: move; } } } diff --git a/rog-control-center/ui/widgets/sidebar.slint b/rog-control-center/ui/widgets/sidebar.slint index 253051d2..684e20bb 100644 --- a/rog-control-center/ui/widgets/sidebar.slint +++ b/rog-control-center/ui/widgets/sidebar.slint @@ -7,8 +7,8 @@ component SideBarItem inherits Rectangle { padding: 10px; in property selected; in property has-focus; - in-out property text<=> label.text; - callback clicked<=>touch.clicked; + in-out property text <=> label.text; + callback clicked <=> touch.clicked; min-height: self.visible ? l.preferred-height + 10px : 0px; // min-width: self.visible ? l.preferred-width + 10px : 0px; states [ @@ -54,7 +54,7 @@ component SideBarItem inherits Rectangle { export component SideBar inherits Rectangle { in property <[string]> model: []; in property <[bool]> available: []; - in property title<=> label.text; + in property title <=> label.text; out property current-item: 0; out property current-focused: fs.has-focus ? fs.focused-tab : -1; // The currently focused tab