layout: Latch keys when clicked twice
Third click unlatches. No actual UI indication.
This commit is contained in:
@ -672,6 +672,12 @@ pub struct Layout {
|
||||
pub margins: Margins,
|
||||
pub kind: ArrangementKind,
|
||||
pub current_view: String,
|
||||
|
||||
// If current view is latched,
|
||||
// clicking any button that emits an action (erase, submit, set modifier)
|
||||
// will cause lock buttons to unlatch.
|
||||
view_latched: bool,
|
||||
|
||||
// Views own the actual buttons which have state
|
||||
// Maybe they should own UI only,
|
||||
// and keys should be owned by a dedicated non-UI-State?
|
||||
@ -718,6 +724,7 @@ impl Layout {
|
||||
Layout {
|
||||
kind,
|
||||
current_view: "base".to_owned(),
|
||||
view_latched: false,
|
||||
views: data.views,
|
||||
keymaps: data.keymaps,
|
||||
pressed_keys: HashSet::new(),
|
||||
@ -818,6 +825,8 @@ impl Layout {
|
||||
}
|
||||
out
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
mod procedures {
|
||||
@ -1026,24 +1035,35 @@ mod seat {
|
||||
Action::Submit { text: _, keys: _ }
|
||||
| Action::Erase
|
||||
=> {
|
||||
unstick_locks(layout).apply();
|
||||
if layout.view_latched {
|
||||
unstick_locks(layout).apply();
|
||||
}
|
||||
submission.handle_release(KeyState::get_id(rckey), time);
|
||||
},
|
||||
Action::SetView(view) => {
|
||||
layout.view_latched = false;
|
||||
try_set_view(layout, view)
|
||||
},
|
||||
Action::LockView { lock, unlock } => {
|
||||
let gets_locked = !key.action.is_locked(&layout.current_view);
|
||||
unstick_locks(layout)
|
||||
// It doesn't matter what the resulting view should be,
|
||||
// it's getting changed anyway.
|
||||
.choose_view(
|
||||
match gets_locked {
|
||||
true => lock.clone(),
|
||||
false => unlock.clone(),
|
||||
}
|
||||
)
|
||||
.apply()
|
||||
let locked = key.action.is_locked(&layout.current_view);
|
||||
let (gets_latched, new_view) = match (layout.view_latched, locked) {
|
||||
// Was unlocked, now make locked but latched. (false)
|
||||
// OR (true)
|
||||
// Layout is latched for reason other than this button.
|
||||
(_, false) => (true, Some(lock.clone())),
|
||||
// Was latched, now only locked.
|
||||
(true, true) => (false, None),
|
||||
// Was locked, now make unlocked.
|
||||
(false, true) => (false, Some(unlock.clone())),
|
||||
};
|
||||
layout.view_latched = gets_latched;
|
||||
if let Some(view) = new_view {
|
||||
unstick_locks(layout)
|
||||
// It doesn't matter what the resulting view should be,
|
||||
// it's getting changed anyway.
|
||||
.choose_view(view)
|
||||
.apply()
|
||||
}
|
||||
},
|
||||
Action::ApplyModifier(modifier) => {
|
||||
// FIXME: key id is unneeded with stateless locks
|
||||
@ -1193,6 +1213,7 @@ mod test {
|
||||
]);
|
||||
let layout = Layout {
|
||||
current_view: String::new(),
|
||||
view_latched: false,
|
||||
keymaps: Vec::new(),
|
||||
kind: ArrangementKind::Base,
|
||||
pressed_keys: HashSet::new(),
|
||||
|
||||
Reference in New Issue
Block a user