Skip to content

Commit 7c3bec2

Browse files
committed
Merge branch 'development'
2 parents dfed759 + 9ed3600 commit 7c3bec2

6 files changed

Lines changed: 67 additions & 32 deletions

File tree

Cargo.lock

Lines changed: 4 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "tether-egui"
3-
version = "0.10.2"
3+
version = "0.10.5"
44
edition = "2021"
55
license = "MIT"
66
description = "GUI for building and testing Tether-based applications"
@@ -32,6 +32,7 @@ rmpv = { version = "0.4", features = ["with-serde"] }
3232
rmp-serde = "0.15"
3333
clap = { version = "4.1.1", features = ["derive"] }
3434
rfd = "0.11"
35+
anyhow = "1.0.96"
3536

3637
# The profile that 'cargo dist' will build with
3738
[profile.dist]

demo.json

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,16 @@
77
"description": "A true or false value",
88
"plug": {
99
"OutputPlug": {
10-
"name": "Message",
10+
"name": "",
1111
"topic": {
1212
"Tether": {
1313
"role": "gui",
1414
"id": "any",
15-
"plug_name": "Message",
16-
"full_topic": "gui/any/Message"
15+
"plug_name": "",
16+
"full_topic": "gui/any/"
1717
}
1818
},
19-
"qos": 0,
19+
"qos": 1,
2020
"retain": false
2121
}
2222
},
@@ -50,7 +50,8 @@
5050
"value": 0.0,
5151
"rangeMin": 0.0,
5252
"rangeMax": 1.0,
53-
"shouldRound": false
53+
"shouldRound": false,
54+
"stepSize": 1.0
5455
}
5556
},
5657
{
@@ -75,9 +76,12 @@
7576
},
7677
"midiMapping": null
7778
},
78-
"value": [0.0, 0.0]
79+
"value": [
80+
0.0,
81+
0.0
82+
]
7983
}
8084
}
8185
],
8286
"tetherSettings": null
83-
}
87+
}

src/gui/common.rs

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::fs;
22

3+
use anyhow::anyhow;
34
use egui::{Color32, DragValue, RichText, Ui};
45
use log::*;
56

@@ -23,28 +24,23 @@ pub fn general_agent_area(ui: &mut Ui, model: &mut Model) {
2324
ui.small("(No JSON file loaded)");
2425
}
2526
ui.horizontal(|ui| {
26-
if ui.button("Save").clicked() {
27-
if let Some(path) = rfd::FileDialog::new()
27+
if let Some(path_string) = &model.json_file {
28+
if ui.button("Save").clicked() {
29+
save_to_disk(model, path_string).expect("failed to save");
30+
}
31+
}
32+
33+
if ui.button("Save As...").clicked() {
34+
if let Some(path_string) = rfd::FileDialog::new()
2835
.add_filter("text", &["json"])
2936
.save_file()
37+
.map(|path| path.display().to_string())
3038
{
31-
// if model.project.tether_settings.was_changed {
32-
// info!("Tether Settings were edited; copying these to project");
33-
// model.project.tether_settings = Some(model.editable_tether_settings.clone());
34-
// };
35-
let path_string = path.display().to_string();
36-
let text = serde_json::to_string_pretty(&model.project)
37-
.expect("failed to serialise widget data");
38-
match fs::write(path_string, text) {
39-
Ok(()) => {
40-
info!("Saved OK");
41-
}
42-
Err(e) => {
43-
error!("Error saving to disk: {:?}", e);
44-
}
45-
}
39+
save_to_disk(model, &path_string).expect("failed to save as");
40+
model.json_file = Some(path_string);
4641
}
4742
}
43+
4844
if ui.button("Load").clicked() {
4945
if let Some(path) = rfd::FileDialog::new()
5046
.add_filter("text", &["json"])
@@ -60,7 +56,7 @@ pub fn general_agent_area(ui: &mut Ui, model: &mut Model) {
6056
}
6157
}
6258
}
63-
if ui.button("Clear").clicked() {
59+
if ui.button("New").clicked() {
6460
model.project.widgets.clear();
6561
model.json_file = None;
6662
}
@@ -127,3 +123,15 @@ pub fn general_agent_area(ui: &mut Ui, model: &mut Model) {
127123
}
128124
}
129125
}
126+
127+
fn save_to_disk(model: &Model, path: &str) -> anyhow::Result<()> {
128+
let text =
129+
serde_json::to_string_pretty(&model.project).expect("failed to serialise widget data");
130+
match fs::write(path, text) {
131+
Ok(_) => {
132+
info!("Saved OK to \"{}\"", path);
133+
Ok(())
134+
}
135+
Err(e) => Err(anyhow!("Error writing to disk: {}", e)),
136+
}
137+
}

src/model.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@ impl Default for Model {
5959
// edit_tether_settings: false,
6060
json_file: {
6161
if was_loaded_from_disk {
62-
None
63-
} else {
6462
Some(json_path)
63+
} else {
64+
None
6565
}
6666
},
6767
monitor_topic: cli.monitor_topic.clone(),

src/widgets/numbers.rs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ pub struct NumberWidget {
2424
range_min: f64,
2525
range_max: f64,
2626
should_round: bool,
27+
#[serde(default = "default_step_size")]
28+
step_size: f64,
29+
}
30+
31+
fn default_step_size() -> f64 {
32+
1.0
2733
}
2834

2935
#[allow(clippy::too_many_arguments)]
@@ -44,6 +50,13 @@ impl NumberWidget {
4450
range_min: *range.start(),
4551
range_max: *range.end(),
4652
should_round: round_off,
53+
step_size: {
54+
if round_off {
55+
1.0
56+
} else {
57+
(*range.start() - *range.end()).abs() / 100.
58+
}
59+
},
4760
}
4861
}
4962

@@ -79,7 +92,11 @@ impl View for NumberWidget {
7992
let &max = self.range().end();
8093

8194
if ui
82-
.add(Slider::new(&mut self.value, min..=max).clamp_to_range(false))
95+
.add(
96+
Slider::new(&mut self.value, min..=max)
97+
.clamp_to_range(false)
98+
.step_by(self.step_size),
99+
)
83100
.changed()
84101
&& self.common().auto_send
85102
{
@@ -141,6 +158,10 @@ impl View for NumberWidget {
141158
&mut self.range_max,
142159
SENSIBLE_MIN..=SENSIBLE_MAX,
143160
));
161+
162+
ui.label("StepSize");
163+
let max_step = self.range_max - self.range_min;
164+
ui.add(Slider::new(&mut self.step_size, 0.0..=max_step));
144165
});
145166

146167
common_save_button(ui, self, tether_agent);

0 commit comments

Comments
 (0)