Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions config.example.toml
Original file line number Diff line number Diff line change
Expand Up @@ -565,6 +565,13 @@ toggle_whiteboard = ["Ctrl+W"]
toggle_blackboard = ["Ctrl+B"]
return_to_transparent = ["Ctrl+Shift+T"]

# Page navigation
page_prev = []
page_next = []
page_new = ["Ctrl+Alt+N"]
page_duplicate = ["Ctrl+Alt+D"]
page_delete = ["Ctrl+Alt+Delete"]

# Toggle help overlay
toggle_help = ["F10", "F1"]

Expand Down
35 changes: 35 additions & 0 deletions configurator/src/models/keybindings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,11 @@ pub enum KeybindingField {
ToggleWhiteboard,
ToggleBlackboard,
ReturnToTransparent,
PagePrev,
PageNext,
PageNew,
PageDuplicate,
PageDelete,
ToggleHelp,
ToggleStatusBar,
ToggleClickHighlight,
Expand Down Expand Up @@ -205,6 +210,11 @@ impl KeybindingField {
Self::ToggleWhiteboard,
Self::ToggleBlackboard,
Self::ReturnToTransparent,
Self::PagePrev,
Self::PageNext,
Self::PageNew,
Self::PageDuplicate,
Self::PageDelete,
Self::ToggleHelp,
Self::ToggleStatusBar,
Self::ToggleClickHighlight,
Expand Down Expand Up @@ -302,6 +312,11 @@ impl KeybindingField {
Self::ToggleWhiteboard => "Toggle whiteboard",
Self::ToggleBlackboard => "Toggle blackboard",
Self::ReturnToTransparent => "Return to transparent",
Self::PagePrev => "Page: previous",
Self::PageNext => "Page: next",
Self::PageNew => "Page: new",
Self::PageDuplicate => "Page: duplicate",
Self::PageDelete => "Page: delete",
Self::ToggleHelp => "Toggle help",
Self::ToggleStatusBar => "Toggle status bar",
Self::ToggleClickHighlight => "Toggle click highlight",
Expand Down Expand Up @@ -399,6 +414,11 @@ impl KeybindingField {
Self::ToggleWhiteboard => "toggle_whiteboard",
Self::ToggleBlackboard => "toggle_blackboard",
Self::ReturnToTransparent => "return_to_transparent",
Self::PagePrev => "page_prev",
Self::PageNext => "page_next",
Self::PageNew => "page_new",
Self::PageDuplicate => "page_duplicate",
Self::PageDelete => "page_delete",
Self::ToggleHelp => "toggle_help",
Self::ToggleStatusBar => "toggle_status_bar",
Self::ToggleClickHighlight => "toggle_click_highlight",
Expand Down Expand Up @@ -506,6 +526,11 @@ impl KeybindingField {
Self::ToggleWhiteboard
| Self::ToggleBlackboard
| Self::ReturnToTransparent
| Self::PagePrev
| Self::PageNext
| Self::PageNew
| Self::PageDuplicate
| Self::PageDelete
| Self::ToggleHelp
| Self::ToggleStatusBar
| Self::ToggleClickHighlight
Expand Down Expand Up @@ -592,6 +617,11 @@ impl KeybindingField {
Self::ToggleWhiteboard => &config.toggle_whiteboard,
Self::ToggleBlackboard => &config.toggle_blackboard,
Self::ReturnToTransparent => &config.return_to_transparent,
Self::PagePrev => &config.page_prev,
Self::PageNext => &config.page_next,
Self::PageNew => &config.page_new,
Self::PageDuplicate => &config.page_duplicate,
Self::PageDelete => &config.page_delete,
Self::ToggleHelp => &config.toggle_help,
Self::ToggleStatusBar => &config.toggle_status_bar,
Self::ToggleClickHighlight => &config.toggle_click_highlight,
Expand Down Expand Up @@ -689,6 +719,11 @@ impl KeybindingField {
Self::ToggleWhiteboard => config.toggle_whiteboard = value,
Self::ToggleBlackboard => config.toggle_blackboard = value,
Self::ReturnToTransparent => config.return_to_transparent = value,
Self::PagePrev => config.page_prev = value,
Self::PageNext => config.page_next = value,
Self::PageNew => config.page_new = value,
Self::PageDuplicate => config.page_duplicate = value,
Self::PageDelete => config.page_delete = value,
Self::ToggleHelp => config.toggle_help = value,
Self::ToggleStatusBar => config.toggle_status_bar = value,
Self::ToggleClickHighlight => config.toggle_click_highlight = value,
Expand Down
7 changes: 7 additions & 0 deletions docs/CONFIG.md
Original file line number Diff line number Diff line change
Expand Up @@ -550,6 +550,13 @@ toggle_whiteboard = ["Ctrl+W"]
toggle_blackboard = ["Ctrl+B"]
return_to_transparent = ["Ctrl+Shift+T"]

# Page navigation
page_prev = []
page_next = []
page_new = ["Ctrl+Alt+N"]
page_duplicate = ["Ctrl+Alt+D"]
page_delete = ["Ctrl+Alt+Delete"]

# Toggle help overlay
toggle_help = ["F10"]

Expand Down
8 changes: 8 additions & 0 deletions src/backend/wayland/state/render.rs
Original file line number Diff line number Diff line change
Expand Up @@ -397,6 +397,14 @@ impl WaylandState {
self.input_state.zoom_locked(),
);
}
if !self.input_state.show_status_bar {
let mode = self.input_state.board_mode();
let page_count = self.input_state.canvas_set.page_count(mode);
if page_count > 1 {
let page_index = self.input_state.canvas_set.active_page_index(mode);
crate::ui::render_page_badge(&ctx, width, height, page_index, page_count);
}
}

// Render status bar if enabled
if self.input_state.show_status_bar {
Expand Down
50 changes: 50 additions & 0 deletions src/backend/wayland/toolbar/layout.rs
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ impl ToolbarLayoutSpec {
let show_text_controls =
snapshot.text_active || snapshot.note_active || snapshot.show_text_controls;
let show_actions = snapshot.show_actions_section || snapshot.show_actions_advanced;
let show_pages = snapshot.show_actions_advanced;
let show_presets =
snapshot.show_presets && snapshot.preset_slot_count.min(snapshot.presets.len()) > 0;
let show_step_section = snapshot.show_step_section;
Expand Down Expand Up @@ -207,6 +208,11 @@ impl ToolbarLayoutSpec {
add_section(actions_card_h, &mut height);
}

if show_pages {
let pages_h = self.side_pages_height(snapshot);
add_section(pages_h, &mut height);
}

if show_step_section {
let step_h = self.side_step_height(snapshot);
add_section(step_h, &mut height);
Expand Down Expand Up @@ -351,6 +357,18 @@ impl ToolbarLayoutSpec {
}
}

pub(super) fn side_pages_height(&self, snapshot: &ToolbarSnapshot) -> f64 {
if !snapshot.show_actions_advanced {
return 0.0;
}
let btn_h = if self.use_icons {
Self::SIDE_ACTION_BUTTON_HEIGHT_ICON
} else {
Self::SIDE_ACTION_BUTTON_HEIGHT_TEXT
};
Self::SIDE_SECTION_TOGGLE_OFFSET_Y + btn_h + Self::SIDE_ACTION_BUTTON_GAP
}

pub(super) fn side_step_height(&self, snapshot: &ToolbarSnapshot) -> f64 {
let delay_h = if snapshot.show_delay_sliders {
Self::SIDE_DELAY_SECTION_HEIGHT
Expand Down Expand Up @@ -1067,6 +1085,38 @@ pub fn build_side_hits(
y += actions_card_h + section_gap;
}

if snapshot.show_actions_advanced {
let pages_card_h = spec.side_pages_height(snapshot);
let pages_y = y + ToolbarLayoutSpec::SIDE_SECTION_TOGGLE_OFFSET_Y;
let btn_h = if use_icons {
ToolbarLayoutSpec::SIDE_ACTION_BUTTON_HEIGHT_ICON
} else {
ToolbarLayoutSpec::SIDE_ACTION_BUTTON_HEIGHT_TEXT
};
let btn_gap = ToolbarLayoutSpec::SIDE_ACTION_BUTTON_GAP;
let btn_w = (content_width - btn_gap * 4.0) / 5.0;
let buttons = [
(ToolbarEvent::PagePrev, "Prev"),
(ToolbarEvent::PageNext, "Next"),
(ToolbarEvent::PageNew, "New"),
(ToolbarEvent::PageDuplicate, "Dup"),
(ToolbarEvent::PageDelete, "Del"),
];
for (idx, (evt, label)) in buttons.iter().enumerate() {
let bx = x + (btn_w + btn_gap) * idx as f64;
hits.push(HitRegion {
rect: (bx, pages_y, btn_w, btn_h),
event: evt.clone(),
kind: HitKind::Click,
tooltip: Some(super::format_binding_label(
label,
snapshot.binding_hints.binding_for_event(evt),
)),
});
}
y += pages_card_h + section_gap;
}

// Delay sliders
if snapshot.show_step_section && snapshot.show_delay_sliders {
let undo_t = delay_t_from_ms(snapshot.undo_all_delay_ms);
Expand Down
88 changes: 88 additions & 0 deletions src/backend/wayland/toolbar/render.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1968,6 +1968,94 @@ pub fn render_side_palette(
y += actions_card_h + section_gap;
}

if snapshot.show_actions_advanced {
let pages_card_h = spec.side_pages_height(snapshot);
draw_group_card(ctx, card_x, y, card_w, pages_card_h);
draw_section_label(
ctx,
x,
y + ToolbarLayoutSpec::SIDE_SECTION_LABEL_OFFSET_TALL,
"Pages",
);

let pages_y = y + ToolbarLayoutSpec::SIDE_SECTION_TOGGLE_OFFSET_Y;
let btn_h = if use_icons {
ToolbarLayoutSpec::SIDE_ACTION_BUTTON_HEIGHT_ICON
} else {
ToolbarLayoutSpec::SIDE_ACTION_BUTTON_HEIGHT_TEXT
};
let btn_gap = ToolbarLayoutSpec::SIDE_ACTION_BUTTON_GAP;
let btn_w = (content_width - btn_gap * 4.0) / 5.0;
let can_prev = snapshot.page_index > 0;
let can_next = snapshot.page_index + 1 < snapshot.page_count;
let buttons = [
(
ToolbarEvent::PagePrev,
"Prev",
toolbar_icons::draw_icon_undo as fn(&cairo::Context, f64, f64, f64),
can_prev,
),
(
ToolbarEvent::PageNext,
"Next",
toolbar_icons::draw_icon_redo as fn(&cairo::Context, f64, f64, f64),
can_next,
),
(
ToolbarEvent::PageNew,
"New",
toolbar_icons::draw_icon_plus as fn(&cairo::Context, f64, f64, f64),
true,
),
(
ToolbarEvent::PageDuplicate,
"Dup",
toolbar_icons::draw_icon_save as fn(&cairo::Context, f64, f64, f64),
true,
),
(
ToolbarEvent::PageDelete,
"Del",
toolbar_icons::draw_icon_clear as fn(&cairo::Context, f64, f64, f64),
true,
),
];

for (idx, (evt, label, icon_fn, enabled)) in buttons.iter().enumerate() {
let bx = x + (btn_w + btn_gap) * idx as f64;
let is_hover = hover
.map(|(hx, hy)| point_in_rect(hx, hy, bx, pages_y, btn_w, btn_h))
.unwrap_or(false);
draw_button(ctx, bx, pages_y, btn_w, btn_h, *enabled, is_hover);
if use_icons {
if *enabled {
set_icon_color(ctx, is_hover);
} else {
ctx.set_source_rgba(0.5, 0.5, 0.55, 0.5);
}
let icon_size = ToolbarLayoutSpec::SIDE_ACTION_ICON_SIZE;
let icon_x = bx + (btn_w - icon_size) / 2.0;
let icon_y = pages_y + (btn_h - icon_size) / 2.0;
icon_fn(ctx, icon_x, icon_y, icon_size);
} else {
draw_label_center(ctx, bx, pages_y, btn_w, btn_h, label);
}
if *enabled {
hits.push(HitRegion {
rect: (bx, pages_y, btn_w, btn_h),
event: evt.clone(),
kind: HitKind::Click,
tooltip: Some(format_binding_label(
label,
snapshot.binding_hints.binding_for_event(evt),
)),
});
}
}

y += pages_card_h + section_gap;
}

if snapshot.show_step_section {
let custom_toggle_h = ToolbarLayoutSpec::SIDE_TOGGLE_HEIGHT;
let toggle_gap = ToolbarLayoutSpec::SIDE_TOGGLE_GAP;
Expand Down
Loading