use gtk4::cairo::Context;
use gtk4::pango;
use crate::primitives::palette::{native_surface_paint, Palette, PaletteLayout};
use crate::theme::Theme;
pub fn gtk_palette_layout(
w: f64,
h: f64,
palette: &Palette,
line_height: f64,
) -> (PaletteLayout, f64) {
let (layout, rows_h) =
native_surface_paint::layout(w as f32, h as f32, palette, line_height as f32);
(layout, rows_h as f64)
}
#[allow(clippy::too_many_arguments)]
pub fn draw_palette(
cr: &Context,
layout: &pango::Layout,
x: f64,
y: f64,
w: f64,
h: f64,
palette: &Palette,
theme: &Theme,
line_height: f64,
nerd_fonts_enabled: bool,
) {
if w < 20.0 || h < line_height * 4.0 {
return;
}
layout.set_attributes(None);
let (palette_layout, rows_h) = gtk_palette_layout(w, h, palette, line_height);
let area = crate::event::Rect::new(x as f32, y as f32, w as f32, h as f32);
let mut surface = super::surface::CairoSurface {
cr,
layout: Some(layout),
translucent_fill: true,
};
native_surface_paint::paint(
palette,
area,
&palette_layout,
rows_h as f32,
line_height as f32,
nerd_fonts_enabled,
&mut surface,
theme,
&crate::style::Style::default(),
);
layout.set_attributes(None);
}
#[cfg(test)]
mod tests {
use super::*;
use crate::primitives::palette::PaletteMode;
use crate::types::WidgetId;
use pangocairo::cairo::{Context, Format, ImageSurface};
fn sample_palette(query: &str, query_cursor: usize) -> Palette {
Palette {
id: WidgetId::new("palette"),
title: "Commands".into(),
query: query.into(),
query_cursor,
items: Vec::new(),
selected_idx: 0,
scroll_offset: 0,
total_count: 0,
has_focus: true,
show_query: true,
create_label: None,
preview: None,
mode: PaletteMode::List,
}
}
#[test]
fn draw_palette_with_multibyte_cursor_does_not_panic() {
let surface = ImageSurface::create(Format::ARgb32, 300, 200).expect("create ImageSurface");
let cr = Context::new(&surface).expect("Context::new");
let pango_layout = pangocairo::functions::create_layout(&cr);
let query = "café🎉";
assert!(!query.is_char_boundary(4));
let palette = sample_palette(query, 4);
let theme = Theme::default();
draw_palette(
&cr,
&pango_layout,
0.0,
0.0,
300.0,
200.0,
&palette,
&theme,
18.0,
false,
);
}
}