wip: add bar to keyboard
This commit is contained in:
@@ -8,6 +8,8 @@
|
|||||||
width="${width}" height="${height}" min_width="${width}" min_height="${height}" max_width="${width}" max_height="${height}"
|
width="${width}" height="${height}" min_width="${width}" min_height="${height}" max_width="${width}" max_height="${height}"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<macro name="bg_rect" width="100%" color="~color_bg" round="16" border="2" border_color="~color_accent"/>
|
||||||
|
|
||||||
<!-- The keyboard is build from the xkb keymap. This file is for customizing the keycaps. -->
|
<!-- The keyboard is build from the xkb keymap. This file is for customizing the keycaps. -->
|
||||||
|
|
||||||
<!-- Key cap with a single label. -->
|
<!-- Key cap with a single label. -->
|
||||||
@@ -71,4 +73,36 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- An app with a single icon. -->
|
||||||
|
<template name="AppIcon">
|
||||||
|
<div macro="keycap_div" width="80" height="80">
|
||||||
|
<rectangle id="${id}" macro="keycap_rect">
|
||||||
|
<sprite color="~color_text" width="32" height="32" src="${src}" />
|
||||||
|
</rectangle>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<elements>
|
||||||
|
<div flex_direction="column" interactable="0">
|
||||||
|
<rectangle macro="bg_rect" padding="16" align_items="center" justify_content="space_between">
|
||||||
|
<div id="bar_root">
|
||||||
|
<AppIcon id="test1" />
|
||||||
|
<AppIcon id="test2" />
|
||||||
|
<AppIcon id="test3" />
|
||||||
|
</div>
|
||||||
|
<div id="tray_root">
|
||||||
|
<div align_items="center" flex_direction="column" gap="4">
|
||||||
|
<label text="23:59" _source="clock" _display="time" size="28" />
|
||||||
|
<label text="Tuesday" _source="clock" _display="dow" size="22" />
|
||||||
|
<label text="22/2/2022" _source="clock" _display="date" size="22" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</rectangle>
|
||||||
|
<div width="100%" height="20" interactable="0" />
|
||||||
|
<rectangle id="keyboard_root" macro="bg_rect" flex_direction="column" padding="16">
|
||||||
|
</rectangle>
|
||||||
|
</div>
|
||||||
|
</elements>
|
||||||
|
|
||||||
</layout>
|
</layout>
|
||||||
|
|||||||
@@ -1,6 +1,12 @@
|
|||||||
use std::{collections::HashMap, rc::Rc};
|
use std::{collections::HashMap, rc::Rc};
|
||||||
|
|
||||||
use crate::{app_misc, gui::panel::GuiPanel, state::AppState, subsystem::hid::XkbKeymap};
|
use crate::{
|
||||||
|
app_misc,
|
||||||
|
gui::panel::{GuiPanel, NewGuiPanelParams},
|
||||||
|
state::AppState,
|
||||||
|
subsystem::hid::XkbKeymap,
|
||||||
|
};
|
||||||
|
use anyhow::Context;
|
||||||
use glam::{FloatExt, Mat4, Vec2, vec2, vec3};
|
use glam::{FloatExt, Mat4, Vec2, vec2, vec3};
|
||||||
use wgui::{
|
use wgui::{
|
||||||
animation::{Animation, AnimationEasing},
|
animation::{Animation, AnimationEasing},
|
||||||
@@ -8,7 +14,7 @@ use wgui::{
|
|||||||
drawing::{self, Color},
|
drawing::{self, Color},
|
||||||
event::{self, CallbackMetadata, EventListenerKind},
|
event::{self, CallbackMetadata, EventListenerKind},
|
||||||
layout::{LayoutParams, LayoutUpdateParams},
|
layout::{LayoutParams, LayoutUpdateParams},
|
||||||
parser::Fetchable,
|
parser::{Fetchable, ParseDocumentExtra, ParseDocumentParams},
|
||||||
renderer_vk::util,
|
renderer_vk::util,
|
||||||
taffy::{self, prelude::length},
|
taffy::{self, prelude::length},
|
||||||
widget::{
|
widget::{
|
||||||
@@ -24,7 +30,6 @@ use super::{
|
|||||||
layout::{self, KeyCapType},
|
layout::{self, KeyCapType},
|
||||||
};
|
};
|
||||||
|
|
||||||
const BACKGROUND_PADDING: f32 = 16.0;
|
|
||||||
const PIXELS_PER_UNIT: f32 = 80.;
|
const PIXELS_PER_UNIT: f32 = 80.;
|
||||||
|
|
||||||
#[allow(clippy::too_many_lines, clippy::significant_drop_tightening)]
|
#[allow(clippy::too_many_lines, clippy::significant_drop_tightening)]
|
||||||
@@ -34,43 +39,30 @@ pub(super) fn create_keyboard_panel(
|
|||||||
state: KeyboardState,
|
state: KeyboardState,
|
||||||
layout: &layout::Layout,
|
layout: &layout::Layout,
|
||||||
) -> anyhow::Result<GuiPanel<KeyboardState>> {
|
) -> anyhow::Result<GuiPanel<KeyboardState>> {
|
||||||
let mut panel = GuiPanel::new_blank(app, state, Default::default())?;
|
let mut panel =
|
||||||
|
GuiPanel::new_from_template(app, "gui/keyboard.xml", state, NewGuiPanelParams::default())?;
|
||||||
|
|
||||||
|
let doc_params = ParseDocumentParams {
|
||||||
|
globals: app.wgui_globals.clone(),
|
||||||
|
path: AssetPath::FileOrBuiltIn("gui/keyboard.xml"),
|
||||||
|
extra: ParseDocumentExtra::default(),
|
||||||
|
};
|
||||||
|
|
||||||
let globals = app.wgui_globals.clone();
|
let globals = app.wgui_globals.clone();
|
||||||
let accent_color = globals.get().defaults.accent_color;
|
let accent_color = globals.get().defaults.accent_color;
|
||||||
|
|
||||||
let anim_mult = globals.defaults().animation_mult;
|
let anim_mult = globals.defaults().animation_mult;
|
||||||
|
|
||||||
let (background, _) = panel.layout.add_child(
|
let root = panel
|
||||||
panel.layout.content_root_widget,
|
.parser_state
|
||||||
WidgetRectangle::create(WidgetRectangleParams {
|
.get_widget_id("keyboard_root")
|
||||||
color: globals.defaults().bg_color,
|
.context("Element with id 'keyboard_root' not found; keyboard.xml may be out of date.")?;
|
||||||
round: WLength::Units((16.0 * globals.defaults().rounding_mult).max(0.)),
|
|
||||||
border: 2.0,
|
|
||||||
border_color: accent_color,
|
|
||||||
..Default::default()
|
|
||||||
}),
|
|
||||||
taffy::Style {
|
|
||||||
flex_direction: taffy::FlexDirection::Column,
|
|
||||||
padding: length(BACKGROUND_PADDING),
|
|
||||||
..Default::default()
|
|
||||||
},
|
|
||||||
)?;
|
|
||||||
|
|
||||||
let has_altgr = keymap.as_ref().is_some_and(|m| XkbKeymap::has_altgr(m));
|
let has_altgr = keymap.as_ref().is_some_and(|m| XkbKeymap::has_altgr(m));
|
||||||
|
|
||||||
let parse_doc_params = wgui::parser::ParseDocumentParams {
|
|
||||||
globals,
|
|
||||||
path: AssetPath::FileOrBuiltIn("gui/keyboard.xml"),
|
|
||||||
extra: Default::default(),
|
|
||||||
};
|
|
||||||
|
|
||||||
let (_, mut gui_state_key) =
|
|
||||||
wgui::parser::new_layout_from_assets(&parse_doc_params, &LayoutParams::default())?;
|
|
||||||
|
|
||||||
for row in 0..layout.key_sizes.len() {
|
for row in 0..layout.key_sizes.len() {
|
||||||
let (div, _) = panel.layout.add_child(
|
let (div, _) = panel.layout.add_child(
|
||||||
background.id,
|
root,
|
||||||
WidgetDiv::create(),
|
WidgetDiv::create(),
|
||||||
taffy::Style {
|
taffy::Style {
|
||||||
flex_direction: taffy::FlexDirection::Row,
|
flex_direction: taffy::FlexDirection::Row,
|
||||||
@@ -144,15 +136,15 @@ pub(super) fn create_keyboard_panel(
|
|||||||
}
|
}
|
||||||
|
|
||||||
let template_key = format!("Key{:?}", key.cap_type);
|
let template_key = format!("Key{:?}", key.cap_type);
|
||||||
gui_state_key.instantiate_template(
|
panel.parser_state.instantiate_template(
|
||||||
&parse_doc_params,
|
&doc_params,
|
||||||
&template_key,
|
&template_key,
|
||||||
&mut panel.layout,
|
&mut panel.layout,
|
||||||
div.id,
|
div.id,
|
||||||
params,
|
params,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
if let Ok(widget_id) = gui_state_key.get_widget_id(&my_id) {
|
if let Ok(widget_id) = panel.parser_state.get_widget_id(&my_id) {
|
||||||
let key_state = {
|
let key_state = {
|
||||||
let rect = panel
|
let rect = panel
|
||||||
.layout
|
.layout
|
||||||
@@ -271,7 +263,6 @@ pub(super) fn create_keyboard_panel(
|
|||||||
timestep_alpha: 0.0,
|
timestep_alpha: 0.0,
|
||||||
})?,
|
})?,
|
||||||
);
|
);
|
||||||
panel.parser_state = gui_state_key;
|
|
||||||
|
|
||||||
Ok(panel)
|
Ok(panel)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user