Skip to content
This repository was archived by the owner on Feb 2, 2019. It is now read-only.

Commit ece8e55

Browse files
committed
ui: add tabbed action editing, separate out UITemplate into own file
1 parent ed36fb1 commit ece8e55

File tree

4 files changed

+189
-108
lines changed

4 files changed

+189
-108
lines changed

sqa-ui/src/actions/audio.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,10 @@ impl AudioUI {
3939
let params = Default::default();
4040
let cnf = Default::default();
4141
let sb = SliderBox::new(0, 0, &tx, uu);
42-
temp.pwin.append_property("File target", &file);
43-
temp.pwin.props_box.pack_start(&sb.grid, false, true, 5);
42+
temp.notebk_tabs[0].append_property("File target", &file);
43+
let patch = temp.add_tab();
44+
patch.label.set_markup("Levels & Patch");
45+
patch.container.pack_start(&sb.grid, false, true, 5);
4446
let mut ctx = AudioUI { file, temp, params, cnf, sb };
4547
ctx.bind();
4648
ctx
@@ -66,8 +68,8 @@ impl AudioUI {
6668
trace!("audio: recreating sliders!");
6769
self.sb.grid.destroy();
6870
self.sb = SliderBox::new(p.chans.len(), self.cnf.defs.len(), &self.temp.tx, self.temp.uu);
69-
self.temp.pwin.props_box.pack_start(&self.sb.grid, false, true, 5);
70-
self.temp.pwin.props_box.show_all();
71+
self.temp.notebk_tabs[1].container.pack_start(&self.sb.grid, false, true, 5);
72+
self.temp.notebk_tabs[1].container.show_all();
7173
}
7274
let mut details = p.chans.iter()
7375
.map(|ch| {
@@ -153,4 +155,7 @@ impl ActionUI for AudioUI {
153155
fn get_container(&mut self) -> Option<Widget> {
154156
self.temp.get_container()
155157
}
158+
fn change_cur_page(&mut self, cp: Option<u32>) {
159+
self.temp.change_cur_page(cp)
160+
}
156161
}

sqa-ui/src/actions/fade.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,13 @@ impl FadeUI {
5555
let sel = Button::new_with_label("[choose...]");
5656
let selecting = Rc::new(Cell::new(false));
5757
let actionlist = HashMap::new();
58-
temp.pwin.append_property("Target", &sel);
59-
temp.pwin.append_property("Duration", &*dur);
60-
temp.pwin.props_box.pack_start(&sb.grid, false, true, 5);
58+
let patch = temp.add_tab();
59+
let fade = temp.add_tab();
60+
patch.label.set_markup("Levels &amp; Patch");
61+
fade.label.set_markup("Fade Properties");
62+
temp.notebk_tabs[0].append_property("Target", &sel);
63+
fade.append_property("Duration", &*dur);
64+
patch.container.pack_start(&sb.grid, false, true, 5);
6165
let mut ctx = FadeUI { temp, params, sb, sel, tx, selecting, actionlist, dur };
6266
ctx.bind();
6367
ctx
@@ -97,8 +101,8 @@ impl FadeUI {
97101
if p.fades.len() != self.sb.n_sliders() {
98102
self.sb.grid.destroy();
99103
self.sb = SliderBox::new(p.fades.len(), 0, &self.temp.tx, self.temp.uu);
100-
self.temp.pwin.props_box.pack_start(&self.sb.grid, false, true, 5);
101-
self.temp.pwin.props_box.show_all();
104+
self.temp.notebk_tabs[1].container.pack_start(&self.sb.grid, false, true, 5);
105+
self.temp.notebk_tabs[1].container.show_all();
102106
}
103107
let mut fades = p.fades.clone();
104108
fades.insert(0, p.fade_master.clone());
@@ -169,4 +173,7 @@ impl ActionUI for FadeUI {
169173
let p = self.params.clone();
170174
self.on_new_parameters(&p);
171175
}
176+
fn change_cur_page(&mut self, cp: Option<u32>) {
177+
self.temp.change_cur_page(cp)
178+
}
172179
}

sqa-ui/src/actions/mod.rs

Lines changed: 15 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,29 @@
11
use gtk::prelude::*;
2-
use gtk::{self, Widget, TreeView, ListStore, Button, ButtonBox, ButtonBoxStyle, Orientation, Builder, MenuItem, TreeSelection, TargetEntry, TargetFlags, Stack, ScrolledWindow};
2+
use gtk::{self, Widget, TreeView, ListStore, Builder, MenuItem, TreeSelection, TargetEntry, TargetFlags, Stack};
33
use gdk;
44
use uuid::Uuid;
55
use std::collections::HashMap;
66
use std::mem;
77
use sync::UISender;
8-
use widgets::PropertyWindow;
98
use sqa_backend::codec::{Command, Reply};
109
use sqa_backend::mixer::MixerConf;
11-
use sqa_backend::actions::{ActionParameters, PlaybackState, OpaqueAction};
10+
use sqa_backend::actions::{ActionParameters, OpaqueAction};
1211
use sqa_backend::actions::audio::AudioParams;
1312
use messages::Message;
1413

1514
pub mod audio;
1615
pub mod fade;
16+
pub mod template;
17+
pub use self::template::UITemplate;
1718
use self::audio::AudioUI;
1819
use self::fade::FadeUI;
1920
pub enum ActionInternalMessage {
2021
Create(&'static str),
2122
SelectionChanged,
2223
FilesDropped(Vec<String>),
2324
BeginSelection(Uuid),
24-
CancelSelection
25+
CancelSelection,
26+
ChangeCurPage(Option<u32>)
2527
}
2628
#[derive(Clone)]
2729
pub enum ActionMessageInner {
@@ -54,7 +56,8 @@ pub struct ActionController {
5456
mload: MenuItem,
5557
mexec: MenuItem,
5658
mcreate_audio: MenuItem,
57-
mcreate_fade: MenuItem
59+
mcreate_fade: MenuItem,
60+
cur_page: Option<u32>
5861
}
5962
pub trait ActionUI {
6063
fn on_update(&mut self, p: &OpaqueAction);
@@ -66,65 +69,9 @@ pub trait ActionUI {
6669
fn on_action_list(&mut self, _l: &HashMap<Uuid, OpaqueAction>) {}
6770
fn on_selection_finished(&mut self, _sel: Uuid) {}
6871
fn on_selection_cancelled(&mut self) {}
69-
}
70-
pub struct UITemplate {
71-
pub pwin: PropertyWindow,
72-
pub close_btn: Button,
73-
pub load_btn: Button,
74-
pub execute_btn: Button,
75-
pub tx: UISender,
76-
pub popped_out: bool,
77-
pub uu: Uuid
72+
fn change_cur_page(&mut self, Option<u32>);
7873
}
7974

80-
impl UITemplate {
81-
pub fn new(uu: Uuid, tx: UISender) -> Self {
82-
let mut pwin = PropertyWindow::new();
83-
let close_btn = Button::new_with_mnemonic("_Close");
84-
let load_btn = Button::new_with_mnemonic("_Load");
85-
let execute_btn = Button::new_with_mnemonic("_Execute");
86-
let btn_box = ButtonBox::new(Orientation::Horizontal);
87-
let popped_out = false;
88-
btn_box.set_layout(ButtonBoxStyle::Spread);
89-
btn_box.pack_start(&load_btn, false, false, 0);
90-
btn_box.pack_start(&execute_btn, false, false, 0);
91-
pwin.append_button(&close_btn);
92-
pwin.props_box.pack_start(&btn_box, false, false, 0);
93-
UITemplate { pwin, close_btn, load_btn, execute_btn, popped_out, tx, uu }
94-
}
95-
pub fn get_container(&mut self) -> Option<Widget> {
96-
if self.pwin.window.is_visible() {
97-
None
98-
}
99-
else {
100-
if !self.popped_out {
101-
self.pwin.props_box_box.remove(&self.pwin.props_box);
102-
self.popped_out = true;
103-
}
104-
let swin = ScrolledWindow::new(None, None);
105-
swin.add(&self.pwin.props_box);
106-
Some(swin.upcast())
107-
}
108-
}
109-
pub fn edit_separately(&mut self) {
110-
if self.popped_out {
111-
self.popped_out = false;
112-
self.pwin.props_box_box.pack_start(&self.pwin.props_box, true, true, 0);
113-
}
114-
self.pwin.window.show_all();
115-
}
116-
pub fn bind(&mut self) {
117-
let uu = self.uu;
118-
let ref tx = self.tx;
119-
use self::ActionMessageInner::*;
120-
self.close_btn.connect_clicked(clone!(tx; |_a| {
121-
tx.send_internal((uu, CloseButton));
122-
}));
123-
}
124-
pub fn on_update(&mut self, p: &OpaqueAction) {
125-
playback_state_update(p, &mut self.pwin);
126-
}
127-
}
12875
#[derive(Clone)]
12976
struct TreeSelectGetter {
13077
sel: TreeSelection,
@@ -142,42 +89,6 @@ impl TreeSelectGetter {
14289
None
14390
}
14491
}
145-
pub fn playback_state_update(p: &OpaqueAction, pwin: &mut PropertyWindow) {
146-
use self::PlaybackState::*;
147-
match p.state {
148-
Inactive => pwin.update_header(
149-
"gtk-media-stop",
150-
"Inactive",
151-
&p.desc
152-
),
153-
Unverified(ref errs) => pwin.update_header(
154-
"gtk-dialog-error",
155-
"Incomplete",
156-
format!("{} errors are present.", errs.len())
157-
),
158-
Loading => pwin.update_header(
159-
"gtk-refresh",
160-
"Loading",
161-
&p.desc
162-
),
163-
Loaded => pwin.update_header(
164-
"gtk-home",
165-
"Loaded",
166-
&p.desc
167-
),
168-
Paused => pwin.update_header(
169-
"gtk-media-pause",
170-
"Paused",
171-
&p.desc
172-
),
173-
Active(ref dur) => pwin.update_header(
174-
"gtk-media-play",
175-
format!("Active ({}s)", dur.as_secs()),
176-
&p.desc
177-
),
178-
_ => {}
179-
}
180-
}
18192
macro_rules! bind_action_menu_items {
18293
($self:ident, $tx:ident, $tsg:ident, $($name:ident => $res:ident),*) => {
18394
$(
@@ -206,11 +117,12 @@ impl ActionController {
206117
let ctls = HashMap::new();
207118
let opas = HashMap::new();
208119
let tx = None;
120+
let cur_page = None;
209121
let cur_widget = None;
210122
let cur_sel = None;
211123
let mixer = Default::default();
212124
build!(ActionController using b
213-
with ctls, opas, tx, mixer, cur_widget, cur_sel
125+
with ctls, opas, tx, mixer, cur_widget, cur_sel, cur_page
214126
get view, store, medit, mload, mexec, mdelete, mcreate_audio, mcreate_fade, sidebar)
215127
}
216128
pub fn bind(&mut self, tx: &UISender) {
@@ -356,6 +268,7 @@ impl ActionController {
356268
self.sidebar.set_visible_child(&w);
357269
self.cur_widget = Some((uu, w));
358270
}
271+
act.change_cur_page(self.cur_page);
359272
}
360273
}
361274
else {
@@ -399,6 +312,9 @@ impl ActionController {
399312
act.on_selection_cancelled();
400313
}
401314
}
315+
},
316+
ChangeCurPage(cp) => {
317+
self.cur_page = cp;
402318
}
403319
}
404320
}

0 commit comments

Comments
 (0)