Floating: add option for always_on_top and fixed_pos
This commit is contained in:
parent
96cea8e6f9
commit
90020b41a8
1 changed files with 41 additions and 6 deletions
|
@ -25,7 +25,9 @@ pub(crate) struct State {
|
|||
pub struct Floating {
|
||||
id: Id,
|
||||
movable: bool,
|
||||
always_on_top: bool,
|
||||
default_pos: Option<Pos2>,
|
||||
fixed_pos: Option<Pos2>,
|
||||
}
|
||||
|
||||
impl Floating {
|
||||
|
@ -33,7 +35,9 @@ impl Floating {
|
|||
Self {
|
||||
id: Id::new(id_source),
|
||||
movable: true,
|
||||
always_on_top: false,
|
||||
default_pos: None,
|
||||
fixed_pos: None,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -42,16 +46,42 @@ impl Floating {
|
|||
self
|
||||
}
|
||||
|
||||
/// Always show as top Floating
|
||||
pub fn always_on_top(mut self) -> Self {
|
||||
self.always_on_top = true;
|
||||
self
|
||||
}
|
||||
|
||||
pub fn default_pos(mut self, default_pos: Pos2) -> Self {
|
||||
self.default_pos = Some(default_pos);
|
||||
self
|
||||
}
|
||||
|
||||
pub fn fixed_pos(mut self, fixed_pos: Pos2) -> Self {
|
||||
self.default_pos = Some(fixed_pos);
|
||||
self.fixed_pos = Some(fixed_pos);
|
||||
self.movable = false;
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
impl Floating {
|
||||
pub fn show(self, ctx: &Arc<Context>, add_contents: impl FnOnce(&mut Ui)) {
|
||||
let default_pos = self.default_pos.unwrap_or_else(|| pos2(100.0, 100.0)); // TODO
|
||||
let id = ctx.register_unique_id(self.id, "Floating", default_pos);
|
||||
// TODO
|
||||
// pub fn show(self, ui: &Ui, add_contents: impl FnOnce(&mut Ui)) {
|
||||
// let default_pos = self.default_pos.unwrap_or_else(|| ui.top_left() + pos2(100.0, 100.0)); // TODO
|
||||
// }
|
||||
|
||||
pub fn show(self, ctx: &Arc<Context>, add_contents: impl FnOnce(&mut Ui)) -> InteractInfo {
|
||||
let Floating {
|
||||
id,
|
||||
movable,
|
||||
always_on_top,
|
||||
default_pos,
|
||||
fixed_pos,
|
||||
} = self;
|
||||
|
||||
let default_pos = default_pos.unwrap_or_else(|| pos2(100.0, 100.0)); // TODO
|
||||
let id = ctx.register_unique_id(id, "Floating", default_pos);
|
||||
let layer = Layer::Window(id);
|
||||
|
||||
let (mut state, _is_new) = match ctx.memory().get_floating(id) {
|
||||
|
@ -65,6 +95,7 @@ impl Floating {
|
|||
(state, true)
|
||||
}
|
||||
};
|
||||
state.pos = fixed_pos.unwrap_or(state.pos);
|
||||
state.pos = state.pos.round();
|
||||
|
||||
let mut ui = Ui::new(
|
||||
|
@ -77,8 +108,10 @@ impl Floating {
|
|||
state.size = ui.bounding_size().ceil();
|
||||
|
||||
let rect = Rect::from_min_size(state.pos, state.size);
|
||||
let clip_rect = Rect::everything();
|
||||
let move_interact = ctx.interact(layer, clip_rect, rect, Some(id.with("move")));
|
||||
let clip_rect = Rect::everything(); // TODO: get from context
|
||||
|
||||
let interact_id = if movable { Some(id.with("move")) } else { None };
|
||||
let move_interact = ctx.interact(layer, clip_rect, rect, interact_id);
|
||||
|
||||
let input = ctx.input();
|
||||
if move_interact.active {
|
||||
|
@ -112,10 +145,12 @@ impl Floating {
|
|||
// &format!("Floating size: {:?}", state.size),
|
||||
// );
|
||||
|
||||
if move_interact.active || mouse_pressed_on_floating(ctx, id) {
|
||||
if move_interact.active || mouse_pressed_on_floating(ctx, id) || always_on_top {
|
||||
ctx.memory().move_floating_to_top(id);
|
||||
}
|
||||
ctx.memory().set_floating_state(id, state);
|
||||
|
||||
move_interact
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue