aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ui/hotkey_overlay.rs64
1 files changed, 38 insertions, 26 deletions
diff --git a/src/ui/hotkey_overlay.rs b/src/ui/hotkey_overlay.rs
index d30d500d..247f44f6 100644
--- a/src/ui/hotkey_overlay.rs
+++ b/src/ui/hotkey_overlay.rs
@@ -125,7 +125,7 @@ impl HotkeyOverlay {
}
}
-fn format_bind(binds: &[Bind], mod_key: ModKey, action: &Action) -> Option<(String, String)> {
+fn format_bind(binds: &[Bind], action: &Action) -> Option<(Option<Key>, String)> {
let mut bind_with_non_null = None;
let mut bind_with_custom_title = None;
let mut found_null_title = false;
@@ -158,33 +158,16 @@ fn format_bind(binds: &[Bind], mod_key: ModKey, action: &Action) -> Option<(Stri
title = Some(custom.clone());
}
- key_name(mod_key, &bind.key)
+ Some(bind.key)
} else {
- String::from("(not bound)")
+ None
};
let title = title.unwrap_or_else(|| action_name(action));
- Some((format!(" {key} "), title))
+ Some((key, title))
}
-fn render(
- renderer: &mut GlesRenderer,
- config: &Config,
- mod_key: ModKey,
- scale: f64,
-) -> anyhow::Result<RenderedOverlay> {
- let _span = tracy_client::span!("hotkey_overlay::render");
-
- // let margin = MARGIN * scale;
- let padding: i32 = to_physical_precise_round(scale, PADDING);
- let line_interval: i32 = to_physical_precise_round(scale, LINE_INTERVAL);
-
- // FIXME: if it doesn't fit, try splitting in two columns or something.
- // let mut target_size = output_size;
- // target_size.w -= margin * 2;
- // target_size.h -= margin * 2;
- // anyhow::ensure!(target_size.w > 0 && target_size.h > 0);
-
+fn collect_actions(config: &Config) -> Vec<&Action> {
let binds = &config.binds.0;
// Collect actions that we want to show.
@@ -290,9 +273,36 @@ fn render(
actions.retain(|&action| binds.iter().any(|bind| bind.action == *action))
}
- let strings = actions
+ actions
+}
+
+fn render(
+ renderer: &mut GlesRenderer,
+ config: &Config,
+ mod_key: ModKey,
+ scale: f64,
+) -> anyhow::Result<RenderedOverlay> {
+ let _span = tracy_client::span!("hotkey_overlay::render");
+
+ // let margin = MARGIN * scale;
+ let padding: i32 = to_physical_precise_round(scale, PADDING);
+ let line_interval: i32 = to_physical_precise_round(scale, LINE_INTERVAL);
+
+ // FIXME: if it doesn't fit, try splitting in two columns or something.
+ // let mut target_size = output_size;
+ // target_size.w -= margin * 2;
+ // target_size.h -= margin * 2;
+ // anyhow::ensure!(target_size.w > 0 && target_size.h > 0);
+
+ let strings = collect_actions(config)
.into_iter()
- .filter_map(|action| format_bind(binds, mod_key, action))
+ .filter_map(|action| format_bind(&config.binds.0, action))
+ .map(|(key, action)| {
+ let key = key.map(|key| key_name(mod_key, &key));
+ let key = key.as_deref().unwrap_or("(not bound)");
+ let key = format!(" {key} ");
+ (key, action)
+ })
.collect::<Vec<_>>();
let mut font = FontDescription::from_string(FONT);
@@ -563,8 +573,10 @@ mod tests {
#[track_caller]
fn check(config: &str, action: Action) -> String {
let config = Config::parse("test.kdl", config).unwrap();
- if let Some((key, title)) = format_bind(&config.binds.0, ModKey::Super, &action) {
- format!("{key}: {title}")
+ if let Some((key, title)) = format_bind(&config.binds.0, &action) {
+ let key = key.map(|key| key_name(ModKey::Super, &key));
+ let key = key.as_deref().unwrap_or("(not bound)");
+ format!(" {key} : {title}")
} else {
String::from("None")
}