mirror of
https://github.com/LGUG2Z/komorebi.git
synced 2026-04-22 16:48:33 +02:00
57 lines
1.8 KiB
Rust
57 lines
1.8 KiB
Rust
use eframe::egui::CursorIcon;
|
|
use eframe::egui::Frame;
|
|
use eframe::egui::Margin;
|
|
use eframe::egui::Response;
|
|
use eframe::egui::Sense;
|
|
use eframe::egui::Ui;
|
|
|
|
/// Same as SelectableLabel, but supports all content
|
|
pub struct SelectableFrame {
|
|
selected: bool,
|
|
}
|
|
|
|
impl SelectableFrame {
|
|
pub fn new(selected: bool) -> Self {
|
|
Self { selected }
|
|
}
|
|
|
|
pub fn show<R>(self, ui: &mut Ui, add_contents: impl FnOnce(&mut Ui) -> R) -> Response {
|
|
let Self { selected } = self;
|
|
|
|
Frame::NONE
|
|
.show(ui, |ui| {
|
|
let response = ui.interact(ui.max_rect(), ui.unique_id(), Sense::click());
|
|
|
|
if ui.is_rect_visible(response.rect) {
|
|
let inner_margin = Margin::symmetric(
|
|
ui.style().spacing.button_padding.x as i8,
|
|
ui.style().spacing.button_padding.y as i8,
|
|
);
|
|
|
|
if selected
|
|
|| response.hovered()
|
|
|| response.highlighted()
|
|
|| response.has_focus()
|
|
{
|
|
let visuals = ui.style().interact_selectable(&response, selected);
|
|
|
|
Frame::NONE
|
|
.stroke(visuals.bg_stroke)
|
|
.corner_radius(visuals.corner_radius)
|
|
.fill(visuals.bg_fill)
|
|
.inner_margin(inner_margin)
|
|
.show(ui, add_contents);
|
|
} else {
|
|
Frame::NONE
|
|
.inner_margin(inner_margin)
|
|
.show(ui, add_contents);
|
|
}
|
|
}
|
|
|
|
response
|
|
})
|
|
.inner
|
|
.on_hover_cursor(CursorIcon::PointingHand)
|
|
}
|
|
}
|