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
43 changes: 7 additions & 36 deletions src/backend/wayland/state/render/canvas/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -168,42 +168,13 @@ impl WaylandState {

self.render_eraser_hover_halos(ctx, hover_mx, hover_my);

// Render provisional shape if actively drawing.
let rendered_provisional = if let crate::input::DrawingState::Drawing {
tool: crate::input::Tool::Blur,
start_x,
start_y,
..
} = &self.input_state.state
{
let (x, w) = if mx >= *start_x {
(*start_x, mx - start_x)
} else {
(mx, start_x - mx)
};
let (y, h) = if my >= *start_y {
(*start_y, my - start_y)
} else {
(my, start_y - my)
};
crate::draw::render_blur_rect(
ctx,
crate::draw::BlurRectParams {
x,
y,
w,
h,
strength: self
.input_state
.thickness_for_tool(crate::input::Tool::Blur),
cacheable: false,
},
&replay_ctx,
);
true
} else {
// Use optimized method that avoids cloning for freehand
self.input_state.render_provisional_shape(ctx, mx, my)
let provisional = self.input_state.provisional_tool_stroke(mx, my);
let rendered_provisional = match provisional {
crate::input::tool::ProvisionalToolStroke::BlurReplayPreview(params) => {
crate::draw::render_blur_rect(ctx, params, &replay_ctx);
true
}
_ => self.input_state.render_provisional_shape(ctx, mx, my),
};
if rendered_provisional {
debug!("Rendered provisional shape");
Expand Down
43 changes: 30 additions & 13 deletions src/backend/wayland/state/render/tool_preview.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use crate::draw::Color;
use crate::input::Tool;
use crate::toolbar_icons;
use crate::ui::toolbar::model::{self, SemanticToolIcon};

pub(super) fn draw_tool_preview(
ctx: &cairo::Context,
Expand Down Expand Up @@ -47,22 +48,38 @@ pub(super) fn draw_tool_preview(
ctx.set_source_rgba(r, g, b, a);
let icon_x = bx + pad;
let icon_y = by + pad;
match tool {
Tool::Select => toolbar_icons::draw_icon_select(ctx, icon_x, icon_y, icon_size),
Tool::Pen => toolbar_icons::draw_icon_pen(ctx, icon_x, icon_y, icon_size),
Tool::Line => toolbar_icons::draw_icon_line(ctx, icon_x, icon_y, icon_size),
Tool::Rect => toolbar_icons::draw_icon_rect(ctx, icon_x, icon_y, icon_size),
Tool::Ellipse => toolbar_icons::draw_icon_circle(ctx, icon_x, icon_y, icon_size),
Tool::Arrow => toolbar_icons::draw_icon_arrow(ctx, icon_x, icon_y, icon_size),
Tool::Blur => toolbar_icons::draw_icon_blur(ctx, icon_x, icon_y, icon_size),
Tool::Marker => toolbar_icons::draw_icon_marker(ctx, icon_x, icon_y, icon_size),
Tool::StepMarker => toolbar_icons::draw_icon_step_marker(ctx, icon_x, icon_y, icon_size),
Tool::Highlight => toolbar_icons::draw_icon_highlight(ctx, icon_x, icon_y, icon_size),
Tool::Eraser => toolbar_icons::draw_icon_eraser(ctx, icon_x, icon_y, icon_size),
}
draw_semantic_tool_icon(
ctx,
model::semantic_icon_for_tool(tool),
icon_x,
icon_y,
icon_size,
);
let _ = ctx.restore();
}

fn draw_semantic_tool_icon(
ctx: &cairo::Context,
icon: SemanticToolIcon,
x: f64,
y: f64,
size: f64,
) {
match icon {
SemanticToolIcon::Select => toolbar_icons::draw_icon_select(ctx, x, y, size),
SemanticToolIcon::Pen => toolbar_icons::draw_icon_pen(ctx, x, y, size),
SemanticToolIcon::Line => toolbar_icons::draw_icon_line(ctx, x, y, size),
SemanticToolIcon::Rect => toolbar_icons::draw_icon_rect(ctx, x, y, size),
SemanticToolIcon::Circle => toolbar_icons::draw_icon_circle(ctx, x, y, size),
SemanticToolIcon::Arrow => toolbar_icons::draw_icon_arrow(ctx, x, y, size),
SemanticToolIcon::Blur => toolbar_icons::draw_icon_blur(ctx, x, y, size),
SemanticToolIcon::Marker => toolbar_icons::draw_icon_marker(ctx, x, y, size),
SemanticToolIcon::Highlight => toolbar_icons::draw_icon_highlight(ctx, x, y, size),
SemanticToolIcon::StepMarker => toolbar_icons::draw_icon_step_marker(ctx, x, y, size),
SemanticToolIcon::Eraser => toolbar_icons::draw_icon_eraser(ctx, x, y, size),
}
}

pub(super) fn draw_stylus_hover_cursor(
ctx: &cairo::Context,
tool: Tool,
Expand Down
1 change: 1 addition & 0 deletions src/backend/wayland/state/toolbar/events.rs
Original file line number Diff line number Diff line change
Expand Up @@ -411,6 +411,7 @@ mod tests {
fn click_highlight_toolbar_events_are_explicit_config_exceptions() {
let events = vec![
ToolbarEvent::ToggleAllHighlight(true),
ToolbarEvent::SelectTool(Tool::Highlight),
ToolbarEvent::ToggleHighlightToolRing(true),
];

Expand Down
13 changes: 5 additions & 8 deletions src/backend/wayland/toolbar/layout/spec/top.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::config::ToolbarLayoutMode;
use crate::input::Tool;
use crate::ui::toolbar::ToolbarSnapshot;
use crate::ui::toolbar::model;

use super::ToolbarLayoutSpec;

Expand Down Expand Up @@ -52,18 +52,15 @@ impl ToolbarLayoutSpec {
} else {
Self::TOP_TEXT_BUTTON_W
};
let tool_count = if self.layout_mode == ToolbarLayoutMode::Simple {
5
} else {
10
};
let tool_count =
model::top_tool_buttons(self.layout_mode == ToolbarLayoutMode::Simple).len();
let mut x = Self::TOP_START_X + Self::TOP_HANDLE_SIZE + gap;
x += tool_count as f64 * (btn_w + gap);
if self.layout_mode == ToolbarLayoutMode::Simple {
x += btn_w + gap;
}
let fill_tool_active = matches!(snapshot.tool_override, Some(Tool::Rect | Tool::Ellipse))
|| matches!(snapshot.active_tool, Tool::Rect | Tool::Ellipse);
let fill_tool_active =
model::fill_tool_active(snapshot.active_tool, snapshot.tool_override);
let fill_visible = !self.use_icons
&& fill_tool_active
&& !(self.layout_mode == ToolbarLayoutMode::Simple && self.shape_picker_open);
Expand Down
6 changes: 3 additions & 3 deletions src/backend/wayland/toolbar/layout/top/icons.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ use super::super::spec::ToolbarLayoutSpec;
use super::shape_buttons;
use super::tool_buttons;
use crate::config::{Action, action_label};
use crate::input::Tool;
use crate::ui::toolbar::bindings::tool_tooltip_label;
use crate::ui::toolbar::model;
use crate::ui::toolbar::{ToolbarEvent, ToolbarSnapshot};

pub(super) fn build_hits(
Expand All @@ -28,10 +28,10 @@ pub(super) fn build_hits(
let mut rect_x = None;
let mut circle_end_x = None;
for tool in tool_buttons {
if *tool == Tool::Rect {
if model::is_fill_tool(*tool) && rect_x.is_none() {
rect_x = Some(x);
}
if *tool == Tool::Ellipse {
if model::is_fill_tool(*tool) {
circle_end_x = Some(x + btn_size);
}
hits.push(HitRegion {
Expand Down
39 changes: 4 additions & 35 deletions src/backend/wayland/toolbar/layout/top/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,38 +5,12 @@ use super::super::hit::HitRegion;
use super::spec::ToolbarLayoutSpec;
use crate::config::ToolbarLayoutMode;
use crate::input::Tool;
use crate::ui::toolbar::model;
use crate::ui::toolbar::{ToolbarEvent, ToolbarSnapshot};

mod icons;
mod text;

const TOOL_BUTTONS_SIMPLE: &[Tool] = &[
Tool::Select,
Tool::Pen,
Tool::Marker,
Tool::StepMarker,
Tool::Eraser,
];
const TOOL_BUTTONS_FULL: &[Tool] = &[
Tool::Select,
Tool::Pen,
Tool::Marker,
Tool::StepMarker,
Tool::Eraser,
Tool::Line,
Tool::Rect,
Tool::Ellipse,
Tool::Arrow,
Tool::Blur,
];
const SHAPE_BUTTONS: &[Tool] = &[
Tool::Line,
Tool::Rect,
Tool::Ellipse,
Tool::Arrow,
Tool::Blur,
];

pub fn build_top_hits(
width: f64,
height: f64,
Expand All @@ -45,8 +19,7 @@ pub fn build_top_hits(
) {
let spec = ToolbarLayoutSpec::new(snapshot);
let is_simple = snapshot.layout_mode == ToolbarLayoutMode::Simple;
let fill_tool_active = matches!(snapshot.tool_override, Some(Tool::Rect | Tool::Ellipse))
|| matches!(snapshot.active_tool, Tool::Rect | Tool::Ellipse);
let fill_tool_active = model::fill_tool_active(snapshot.active_tool, snapshot.tool_override);

if spec.use_icons() {
icons::build_hits(height, snapshot, &spec, is_simple, fill_tool_active, hits);
Expand Down Expand Up @@ -79,13 +52,9 @@ pub fn build_top_hits(
}

fn tool_buttons(is_simple: bool) -> &'static [Tool] {
if is_simple {
TOOL_BUTTONS_SIMPLE
} else {
TOOL_BUTTONS_FULL
}
model::top_tool_buttons(is_simple)
}

fn shape_buttons() -> &'static [Tool] {
SHAPE_BUTTONS
model::shape_tools()
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ use crate::backend::wayland::toolbar::hit::HitRegion;
use crate::draw::Color;
use crate::input::Tool;
use crate::toolbar_icons;
use crate::ui::toolbar::model::{self, SemanticToolIcon};
use crate::ui::toolbar::{PresetSlotSnapshot, ToolbarEvent, ToolbarSnapshot};

use super::super::super::super::widgets::{draw_round_rect, draw_swatch};
Expand Down Expand Up @@ -114,17 +115,17 @@ pub(super) fn draw_preset_content(
}

fn draw_preset_icon(ctx: &cairo::Context, tool: Tool, x: f64, y: f64, size: f64) {
match tool {
Tool::Select => toolbar_icons::draw_icon_select(ctx, x, y, size),
Tool::Pen => toolbar_icons::draw_icon_pen(ctx, x, y, size),
Tool::Line => toolbar_icons::draw_icon_line(ctx, x, y, size),
Tool::Rect => toolbar_icons::draw_icon_rect(ctx, x, y, size),
Tool::Ellipse => toolbar_icons::draw_icon_circle(ctx, x, y, size),
Tool::Arrow => toolbar_icons::draw_icon_arrow(ctx, x, y, size),
Tool::Blur => toolbar_icons::draw_icon_blur(ctx, x, y, size),
Tool::Marker => toolbar_icons::draw_icon_marker(ctx, x, y, size),
Tool::StepMarker => toolbar_icons::draw_icon_step_marker(ctx, x, y, size),
Tool::Highlight => toolbar_icons::draw_icon_highlight(ctx, x, y, size),
Tool::Eraser => toolbar_icons::draw_icon_eraser(ctx, x, y, size),
match model::semantic_icon_for_tool(tool) {
SemanticToolIcon::Select => toolbar_icons::draw_icon_select(ctx, x, y, size),
SemanticToolIcon::Pen => toolbar_icons::draw_icon_pen(ctx, x, y, size),
SemanticToolIcon::Line => toolbar_icons::draw_icon_line(ctx, x, y, size),
SemanticToolIcon::Rect => toolbar_icons::draw_icon_rect(ctx, x, y, size),
SemanticToolIcon::Circle => toolbar_icons::draw_icon_circle(ctx, x, y, size),
SemanticToolIcon::Arrow => toolbar_icons::draw_icon_arrow(ctx, x, y, size),
SemanticToolIcon::Blur => toolbar_icons::draw_icon_blur(ctx, x, y, size),
SemanticToolIcon::Marker => toolbar_icons::draw_icon_marker(ctx, x, y, size),
SemanticToolIcon::StepMarker => toolbar_icons::draw_icon_step_marker(ctx, x, y, size),
SemanticToolIcon::Highlight => toolbar_icons::draw_icon_highlight(ctx, x, y, size),
SemanticToolIcon::Eraser => toolbar_icons::draw_icon_eraser(ctx, x, y, size),
}
}
23 changes: 10 additions & 13 deletions src/backend/wayland/toolbar/render/top_strip/icons/shape_picker.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
use crate::backend::wayland::toolbar::events::HitKind;
use crate::backend::wayland::toolbar::hit::HitRegion;
use crate::backend::wayland::toolbar::layout::ToolbarLayoutSpec;
use crate::input::Tool;
use crate::toolbar_icons;
use crate::ui::toolbar::ToolbarEvent;
use crate::ui::toolbar::bindings::tool_tooltip_label;
use crate::ui::toolbar::model;

use super::super::super::widgets::*;
use super::TopStripLayout;

type IconFn = fn(&cairo::Context, f64, f64, f64);
use super::tool_row::draw_semantic_tool_icon;

pub(super) fn draw_shape_picker_row(
layout: &mut TopStripLayout,
Expand All @@ -20,14 +18,7 @@ pub(super) fn draw_shape_picker_row(
) {
let shape_y = y + btn_size + ToolbarLayoutSpec::TOP_SHAPE_ROW_GAP;
let mut shape_x = ToolbarLayoutSpec::TOP_START_X + handle_w + layout.gap;
let shapes: &[(Tool, IconFn)] = &[
(Tool::Line, toolbar_icons::draw_icon_line),
(Tool::Rect, toolbar_icons::draw_icon_rect),
(Tool::Ellipse, toolbar_icons::draw_icon_circle),
(Tool::Arrow, toolbar_icons::draw_icon_arrow),
(Tool::Blur, toolbar_icons::draw_icon_blur),
];
for (tool, icon_fn) in shapes {
for tool in model::shape_tools() {
let is_active =
layout.snapshot.active_tool == *tool || layout.snapshot.tool_override == Some(*tool);
let is_hover = layout
Expand All @@ -40,7 +31,13 @@ pub(super) fn draw_shape_picker_row(
set_icon_color(layout.ctx, is_hover);
let icon_x = shape_x + (btn_size - icon_size) / 2.0;
let icon_y = shape_y + (btn_size - icon_size) / 2.0;
icon_fn(layout.ctx, icon_x, icon_y, icon_size);
draw_semantic_tool_icon(
layout.ctx,
model::semantic_icon_for_tool(*tool),
icon_x,
icon_y,
icon_size,
);
let tooltip = layout.tool_tooltip(*tool, tool_tooltip_label(*tool));
layout.hits.push(HitRegion {
rect: (shape_x, shape_y, btn_size, btn_size),
Expand Down
Loading
Loading