Skip to content

Commit c5bdd73

Browse files
author
Deren Vural
committed
working settings window
Signed-off-by: Deren Vural <[email protected]>
1 parent 062302c commit c5bdd73

File tree

3 files changed

+254
-56
lines changed

3 files changed

+254
-56
lines changed

src/resources/settings-window.ui

Lines changed: 57 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,66 +4,87 @@ SPDX-FileCopyrightText: 2022 Deren Vural
44
SPDX-License-Identifier: GPL-3.0-or-later
55
-->
66
<interface>
7-
<!-- Main Menu Description (implemented later) -->
8-
<menu id="main-menu">
9-
<item>
10-
<attribute name="label" translatable="yes">Not Yet Implemented..</attribute>
11-
</item>
12-
</menu>
13-
147
<!-- Header Implementation (implements main-menu) -->
158
<template class="NvidiaExtensionSettingsWindow" parent="GtkApplicationWindow">
169
<property name="title" translatable="yes">Settings</property>
17-
<property name="width-request">360</property>
10+
<property name="width-request">500</property>
11+
<property name="height-request">200</property>
1812
<child type="titlebar">
19-
<object class="AdwHeaderBar">
20-
<child type="end">
21-
<object class="GtkMenuButton">
22-
<property name="icon-name">open-menu-symbolic</property>
23-
<property name="menu-model">main-menu</property>
24-
<property name="tooltip-text" translatable="yes">Main Menu</property>
25-
</object>
26-
</child>
27-
</object>
13+
<object class="AdwHeaderBar"/>
2814
</child>
2915

30-
<!-- Content Container Implementation -->
16+
<!-- Content Container Implementation -->
3117
<child>
3218
<object class="GtkScrolledWindow">
3319
<property name="hscrollbar-policy">never</property>
34-
<property name="min-content-height">420</property>
20+
<property name="min-content-height">200</property>
3521
<property name="vexpand">True</property>
3622
<property name="child">
3723
<object class="AdwClamp">
3824
<property name="child">
39-
<object class="GtkBox">
40-
<property name="orientation">vertical</property>
25+
<object class="GtkListBox">
4126
<property name="margin-top">12</property>
4227
<property name="margin-bottom">12</property>
4328
<property name="margin-start">12</property>
4429
<property name="margin-end">12</property>
45-
<property name="spacing">12</property>
30+
4631
<!-- Content Implementation -->
4732
<child>
48-
<!--
49-
<object class="GtkEntry" id="entry">
50-
<property name="placeholder-text" translatable="yes">Enter a Task…</property>
51-
<property name="secondary-icon-name">list-add-symbolic</property>
33+
<object class="AdwActionRow">
34+
<property name="title">Refresh Rate (s)</property>
35+
<property name="subtitle">The time between refreshes in seconds</property>
36+
<property name="activatable">false</property>
37+
<property name="selectable">false</property>
38+
<child>
39+
<object class="GtkSpinButton" id="refreshrate_input">
40+
<signal name="value-changed" handler="refreshrate_set" swapped="true"/>
41+
<property name="digits" translatable="yes">0</property>
42+
<property name="numeric">True</property>
43+
</object>
44+
</child>
45+
</object>
46+
</child>
47+
48+
<child>
49+
<object class="AdwActionRow">
50+
<property name="title">Temperature Unit</property>
51+
<property name="subtitle">Temperature unit to be displayed</property>
52+
<property name="activatable">false</property>
53+
<property name="selectable">false</property>
54+
<child>
55+
<object class="GtkCheckButton" id="temp_unit_c">
56+
<signal name="toggled" handler="temp_unit_set" swapped="true"/>
57+
<property name="label">Celcius (C)</property>
58+
</object>
59+
</child>
60+
<child>
61+
<object class="GtkCheckButton" id="temp_unit_f">
62+
<signal name="toggled" handler="temp_unit_set" swapped="true"/>
63+
<property name="label">Fahrenheit (F)</property>
64+
</object>
65+
</child>
5266
</object>
53-
-->
5467
</child>
68+
5569
<child>
56-
<!--
57-
<object class="GtkListBox" id="tasks_list">
58-
<property name="valign">start</property>
59-
<property name="visible">False</property>
60-
<property name="selection-mode">none</property>
61-
<style>
62-
<class name="boxed-list" />
63-
</style>
70+
<object class="AdwComboRow" id="provider_input">
71+
<property name="title">Properties Provider</property>
72+
<property name="subtitle">The properties provider to use</property>
73+
<property name="activatable">false</property>
74+
<property name="selectable">false</property>
75+
<property name="model">
76+
<object class="GtkStringList">
77+
<items>
78+
<item translatable="yes">Nvidia Settings and Nvidia SMI</item>
79+
<item translatable="yes">Nvidia Settings</item>
80+
<item translatable="yes">Nvidia SMI</item>
81+
<item translatable="yes">Nvidia Optimus</item>
82+
</items>
83+
</object>
84+
</property>
6485
</object>
65-
-->
6686
</child>
87+
6788
</object>
6889
</property>
6990
</object>

src/settingswindow/imp.rs

Lines changed: 78 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919
*/
2020

2121
// Imports
22-
use adwaita::{gio, glib, prelude::*, subclass::prelude::*};
22+
use adwaita::{gio, glib, prelude::*, subclass::prelude::*, ComboRow};
2323
use gio::Settings;
2424
use glib::{once_cell::sync::OnceCell, signal::Inhibit, subclass::InitializingObject};
25-
use gtk::{subclass::prelude::*, CompositeTemplate}; //, Entry, ListBox, TemplateChild}; //Value, once_cell::sync::Lazy, ParamSpec,
25+
use gtk::{subclass::prelude::*, CompositeTemplate, TemplateChild, SpinButton, CheckButton};
2626

2727
// Modules
2828
//use crate::utils::data_path;
@@ -32,6 +32,14 @@ use gtk::{subclass::prelude::*, CompositeTemplate}; //, Entry, ListBox, Template
3232
#[template(resource = "/settings-window.ui")]
3333
pub struct SettingsWindow {
3434
pub settings: OnceCell<Settings>,
35+
#[template_child]
36+
pub refreshrate_input: TemplateChild<SpinButton>,
37+
#[template_child]
38+
pub temp_unit_c: TemplateChild<CheckButton>,
39+
#[template_child]
40+
pub temp_unit_f: TemplateChild<CheckButton>,
41+
#[template_child]
42+
pub provider_input: TemplateChild<ComboRow>,
3543
}
3644

3745
// The central trait for subclassing a GObject
@@ -40,17 +48,81 @@ impl ObjectSubclass for SettingsWindow {
4048
// `NAME` needs to match `class` attribute of template
4149
const NAME: &'static str = "NvidiaExtensionSettingsWindow";
4250
type Type = super::SettingsWindow;
51+
//type ParentType = adwaita::PreferencesWindow;
4352
type ParentType = gtk::ApplicationWindow;
4453

4554
fn class_init(klass: &mut Self::Class) {
4655
klass.bind_template();
56+
klass.bind_template_callbacks();
4757
}
4858

4959
fn instance_init(obj: &InitializingObject<Self>) {
5060
obj.init_template();
5161
}
5262
}
5363

64+
/*
65+
* Name:
66+
* SettingsWindow
67+
*
68+
* Description:
69+
* Trait shared by all SettingsWindow objects
70+
*
71+
* Made:
72+
* 13/10/2022
73+
*
74+
* Made by:
75+
* Deren Vural
76+
*
77+
* Notes:
78+
*
79+
*/
80+
#[gtk::template_callbacks]
81+
impl SettingsWindow {
82+
#[template_callback]
83+
fn refreshrate_set(&self, button: &SpinButton) {
84+
// Get new refresh rate input
85+
let new_value: i32 = button.value_as_int();
86+
87+
// Set refresh rate property
88+
let settings = self.settings.get().expect("..Cannot retrieve settings");
89+
settings.set_int("refreshrate", new_value).expect("..Cannot set `tempformat` setting");
90+
}
91+
92+
#[template_callback]
93+
fn temp_unit_set(&self, button: &CheckButton) {
94+
// Get list of buttons
95+
let check_buttons: [&CheckButton; 2] = [&self.temp_unit_c, &self.temp_unit_f];
96+
97+
// For each button in the group
98+
for current_button in check_buttons {
99+
// Check if current button active
100+
if current_button.is_active() {
101+
// Get new unit
102+
let unit: String = button.label().expect("..Could not fetch contents of temperature unit button label").to_string();
103+
104+
// Set appropriate setting
105+
match unit.as_str() {
106+
"Celcius (C)" => {
107+
// Set temperature unit as C
108+
let settings = self.settings.get().expect("..Cannot retrieve settings");
109+
settings.set_int("tempformat", 0).expect("..Cannot set `tempformat` setting");
110+
},
111+
"Fahrenheit (F)" => {
112+
// Set temperature unit as F
113+
let settings = self.settings.get().expect("..Cannot retrieve settings");
114+
settings.set_int("tempformat", 1).expect("..Cannot set `tempformat` setting");
115+
},
116+
_ => {
117+
// Display error message
118+
panic!("..Unexpected temperature unit");
119+
},
120+
}
121+
}
122+
}
123+
}
124+
}
125+
54126
/*
55127
* Trait Name:
56128
* ObjectImpl
@@ -74,8 +146,8 @@ impl ObjectImpl for SettingsWindow {
74146

75147
// Setup
76148
obj.setup_settings();
77-
//obj.setup_tasks();
78149
obj.restore_data();
150+
obj.setup_widgets();
79151
obj.setup_callbacks();
80152
obj.setup_actions();
81153
}
@@ -163,6 +235,7 @@ impl WindowImpl for SettingsWindow {
163235
*/
164236
impl AdwWindowImpl for SettingsWindow {}
165237

238+
166239
/*
167240
* Trait Name:
168241
* ApplicationWindowImpl
@@ -171,7 +244,7 @@ impl AdwWindowImpl for SettingsWindow {}
171244
* Trait shared by all ApplicationWindow's
172245
*
173246
* Made:
174-
* 10/10/2022
247+
* 09/10/2022
175248
*
176249
* Made by:
177250
* Deren Vural
@@ -189,7 +262,7 @@ impl ApplicationWindowImpl for SettingsWindow {}
189262
* Trait shared by all AdwApplicationWindow's
190263
*
191264
* Made:
192-
* 10/10/2022
265+
* 09/10/2022
193266
*
194267
* Made by:
195268
* Deren Vural

0 commit comments

Comments
 (0)