desktop tray: card as tall as its content, card and menu open from the tray icon's edge (never over the taskbar); menu permission files
This commit is contained in:
parent
6782ac6078
commit
da7ca48ab4
17 changed files with 185 additions and 26 deletions
|
|
@ -107,6 +107,8 @@ pub fn find<'a>(nodes: &'a [Node], path: &[String]) -> Option<(&'a [Node], Optio
|
|||
pub enum Anchor {
|
||||
/// The tray click point (physical).
|
||||
Point { x: f64, y: f64 },
|
||||
/// The tray icon's rectangle (physical): the root opens from the icon's edge that faces the screen, like the card.
|
||||
Tray { x: f64, y: f64, w: f64, h: f64 },
|
||||
/// Beside a parent panel: its left and right edge and the row's top (physical).
|
||||
Beside { left: f64, right: f64, top: f64 },
|
||||
/// A remembered top-left (pinned panels).
|
||||
|
|
@ -129,6 +131,8 @@ pub fn place_menu(anchor: Anchor, size: (f64, f64), work: Rect) -> (f64, f64) {
|
|||
let (wx, wy, ww, wh) = work;
|
||||
let (x, y) = match anchor {
|
||||
Anchor::Point { x, y } => (if x + w > wx + ww { x - w } else { x }, if y + h > wy + wh { y - h } else { y }),
|
||||
// same rule as the card: the panel's edge sits GAP from the icon, never over the taskbar
|
||||
Anchor::Tray { x, y, w: iw, h: ih } => return crate::card::place(crate::card::Rect { x, y, w: iw, h: ih }, crate::card::Rect { x: wx, y: wy, w: ww, h: wh }, w, h, GAP),
|
||||
Anchor::Beside { left, right, top } => (if right + w <= wx + ww - GAP { right - 2.0 } else { left - w + 2.0 }, top - 5.0),
|
||||
Anchor::At { x, y } => (x, y),
|
||||
};
|
||||
|
|
@ -520,12 +524,12 @@ mod runtime {
|
|||
});
|
||||
}
|
||||
|
||||
/// A right click on the tray icon: a fresh root menu at the click point (physical px).
|
||||
pub fn open_root(app: &AppHandle, x: f64, y: f64) {
|
||||
/// A right click on the tray icon: a fresh root menu next to the icon (`anchor`: Anchor::Tray, physical px).
|
||||
pub fn open_root(app: &AppHandle, anchor: Anchor) {
|
||||
if native_fallback(app) {
|
||||
return; // the native menu is on the tray and opens by itself
|
||||
}
|
||||
let (label, closes) = book(app, |b| b.open_root(Anchor::Point { x, y }));
|
||||
let (label, closes) = book(app, |b| b.open_root(anchor));
|
||||
destroy(app, &closes);
|
||||
let handle = app.clone();
|
||||
std::thread::spawn(move || {
|
||||
|
|
@ -571,6 +575,7 @@ mod runtime {
|
|||
fn anchor_point(a: Anchor) -> (f64, f64) {
|
||||
match a {
|
||||
Anchor::Point { x, y } | Anchor::At { x, y } => (x, y),
|
||||
Anchor::Tray { x, y, w, h } => (x + w / 2.0, y + h / 2.0),
|
||||
Anchor::Beside { right, top, .. } => (right, top),
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue