80 lines
2.6 KiB
Rust
80 lines
2.6 KiB
Rust
use crate::anim::{AnimationHelper, ICON_EXPANSION_MULTIPLE};
|
|
use egui::{emath::GuiRounding, Pos2, Stroke};
|
|
use notedeck::NotedeckTextStyle;
|
|
|
|
pub fn x_button(rect: egui::Rect) -> impl egui::Widget {
|
|
move |ui: &mut egui::Ui| -> egui::Response {
|
|
let max_width = rect.width();
|
|
let helper = AnimationHelper::new_from_rect(ui, "user_search_close", rect);
|
|
|
|
let fill_color = ui.visuals().text_color();
|
|
|
|
let radius = max_width / (2.0 * ICON_EXPANSION_MULTIPLE);
|
|
|
|
let painter = ui.painter();
|
|
let ppp = ui.ctx().pixels_per_point();
|
|
let nw_edge = helper
|
|
.scale_pos_from_center(Pos2::new(-radius, radius))
|
|
.round_to_pixel_center(ppp);
|
|
let se_edge = helper
|
|
.scale_pos_from_center(Pos2::new(radius, -radius))
|
|
.round_to_pixel_center(ppp);
|
|
let sw_edge = helper
|
|
.scale_pos_from_center(Pos2::new(-radius, -radius))
|
|
.round_to_pixel_center(ppp);
|
|
let ne_edge = helper
|
|
.scale_pos_from_center(Pos2::new(radius, radius))
|
|
.round_to_pixel_center(ppp);
|
|
|
|
let line_width = helper.scale_1d_pos(2.0);
|
|
|
|
painter.line_segment([nw_edge, se_edge], Stroke::new(line_width, fill_color));
|
|
painter.line_segment([ne_edge, sw_edge], Stroke::new(line_width, fill_color));
|
|
|
|
helper.take_animation_response()
|
|
}
|
|
}
|
|
|
|
/// Button styled in the Notedeck theme
|
|
pub fn styled_button_toggleable(
|
|
text: &str,
|
|
fill_color: egui::Color32,
|
|
enabled: bool,
|
|
) -> impl egui::Widget + '_ {
|
|
move |ui: &mut egui::Ui| -> egui::Response {
|
|
let painter = ui.painter();
|
|
let text_color = if ui.visuals().dark_mode {
|
|
egui::Color32::WHITE
|
|
} else {
|
|
egui::Color32::BLACK
|
|
};
|
|
|
|
let galley = painter.layout(
|
|
text.to_owned(),
|
|
NotedeckTextStyle::Button.get_font_id(ui.ctx()),
|
|
text_color,
|
|
ui.available_width(),
|
|
);
|
|
|
|
let size = galley.rect.expand2(egui::vec2(16.0, 8.0)).size();
|
|
let mut button = egui::Button::new(galley).corner_radius(8.0);
|
|
|
|
if !enabled {
|
|
button = button
|
|
.sense(egui::Sense::focusable_noninteractive())
|
|
.fill(ui.visuals().noninteractive().bg_fill)
|
|
.stroke(ui.visuals().noninteractive().bg_stroke);
|
|
} else {
|
|
button = button.fill(fill_color);
|
|
}
|
|
|
|
let mut resp = ui.add_sized(size, button);
|
|
|
|
if !enabled {
|
|
resp = resp.on_hover_cursor(egui::CursorIcon::NotAllowed);
|
|
}
|
|
|
|
resp
|
|
}
|
|
}
|