Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
152 changes: 66 additions & 86 deletions Cargo.lock

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -136,8 +136,8 @@ syn = {version = "=2.0.117"}
thiserror = {version = "=2.0.18"}

# ui
freya = {version = "=0.5.0-rc.1", features = ["engine", "winit", "router", "remote-asset", "sdk", "markdown", "query", "radio", "titlebar"]}
freya-skia-safe = "=0.98.1" # required for the SKSL player renderer
freya = {version = "=0.5.0-rc.4", features = ["engine", "winit", "router", "remote-asset", "sdk", "markdown", "query", "radio", "titlebar"]}
freya-skia-safe = "=0.99.1" # required for the SKSL player renderer
image = {version = "=0.25.10", default-features = false, features = ["png", "jpeg"]}

[profile.release]
Expand Down
13 changes: 3 additions & 10 deletions packages/oneclient_app/src/components/account_switcher.rs
Original file line number Diff line number Diff line change
Expand Up @@ -179,16 +179,9 @@ impl Component for AccountRow {
.maybe(*hovered.read() && !active, |el| {
el.background(colors::ghost_overlay_hover())
})
.on_pointer_enter(move |_| {
hovered.set(true);
if !active {
Cursor::set(CursorIcon::Pointer);
}
})
.on_pointer_leave(move |_| {
hovered.set(false);
Cursor::set(CursorIcon::default());
})
.cursor((!active).then_some(CursorIcon::Pointer))
.on_pointer_enter(move |_| hovered.set(true))
.on_pointer_leave(move |_| hovered.set(false))
.on_press(switch)
.child(
Avatar::new(id.to_string())
Expand Down
15 changes: 2 additions & 13 deletions packages/oneclient_app/src/components/button.rs
Original file line number Diff line number Diff line change
Expand Up @@ -251,10 +251,6 @@ impl Component for Button {

let cursor_icon = self.cursor_icon;

use_drop(move || {
Cursor::set(CursorIcon::default());
});

let palette = variant_colors(self.variant);

let background = if !enabled() {
Expand Down Expand Up @@ -329,21 +325,14 @@ impl Component for Button {
hovering.set(false);
pressing.set(false);
})
.on_pointer_enter(move |_| {
Cursor::set(cursor_icon);
})
.on_pointer_leave(move |_| {
Cursor::set(CursorIcon::default());
})
.cursor(cursor_icon)
.map(on_press.clone(), |rect, handler| {
rect.on_all_press(move |event: Event<PressEventData>| {
handler.call(event);
})
});
} else {
rect = rect
.on_pointer_enter(move |_| Cursor::set(CursorIcon::NotAllowed))
.on_pointer_leave(move |_| Cursor::set(CursorIcon::default()));
rect = rect.cursor(CursorIcon::NotAllowed);
}

rect
Expand Down
7 changes: 2 additions & 5 deletions packages/oneclient_app/src/components/charts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -357,11 +357,8 @@ impl Component for BarChart {
.width(Size::flex(1.0))
.height(Size::fill())
.main_align(Alignment::End)
.on_pointer_enter(move |_| {
*hovered.write() = Some(i);
Cursor::set(CursorIcon::Pointer);
})
.on_pointer_leave(|_| Cursor::set(CursorIcon::default()))
.cursor(CursorIcon::Pointer)
.on_pointer_enter(move |_| *hovered.write() = Some(i))
.child(
rect()
.width(Size::fill())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -356,8 +356,7 @@ fn cluster_header(
.margin(Gaps::new(if first { 0. } else { 8. }, 0., 3., 0.))
.corner_radius(CornerRadius::new_all(8.))
.background(colors::component_bg())
.on_pointer_enter(|_| Cursor::set(CursorIcon::Pointer))
.on_pointer_leave(|_| Cursor::set(CursorIcon::default()))
.cursor(CursorIcon::Pointer)
.on_press(move |_| open_cluster(&dispatch, cluster_id))
.child(
label()
Expand Down
11 changes: 3 additions & 8 deletions packages/oneclient_app/src/components/context_menu.rs
Original file line number Diff line number Diff line change
Expand Up @@ -192,14 +192,9 @@ impl Component for ContextMenuRow {
} else {
Color::TRANSPARENT
})
.on_pointer_enter(move |_| {
hovered.set(true);
Cursor::set(CursorIcon::Pointer);
})
.on_pointer_leave(move |_| {
hovered.set(false);
Cursor::set(CursorIcon::default());
})
.cursor(CursorIcon::Pointer)
.on_pointer_enter(move |_| hovered.set(true))
.on_pointer_leave(move |_| hovered.set(false))
.on_press(move |_| {
on_select.call(());
on_close.call(());
Expand Down
3 changes: 1 addition & 2 deletions packages/oneclient_app/src/components/log_viewer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -280,8 +280,7 @@ fn auto_scroll_toggle(mut auto_scroll: State<bool>) -> impl IntoElement {
} else {
colors::component_bg()
})
.on_pointer_enter(|_| Cursor::set(CursorIcon::Pointer))
.on_pointer_leave(|_| Cursor::set(CursorIcon::default()))
.cursor(CursorIcon::Pointer)
.on_press(move |_| auto_scroll.toggle())
.child(Icon::new(IconType::ChevronDown).size(13.).color(if on {
colors::brand()
Expand Down
7 changes: 1 addition & 6 deletions packages/oneclient_app/src/components/navbar/app_navbar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -164,10 +164,6 @@ impl Component for NavLink {
let target = self.target.clone();
let nav_label = self.nav_label;

use_drop(move || {
Cursor::set(CursorIcon::default());
});

let color = if active || hovering() || focused().is_focused() {
theme::colors::fg_primary()
} else {
Expand Down Expand Up @@ -204,8 +200,7 @@ impl Component for NavLink {
})
.on_pointer_over(move |_| hovering.set(true))
.on_pointer_out(move |_| hovering.set(false))
.on_pointer_enter(move |_| Cursor::set(CursorIcon::Pointer))
.on_pointer_leave(move |_| Cursor::set(CursorIcon::default()))
.cursor(CursorIcon::Pointer)
.child(
label()
.text(nav_label)
Expand Down
3 changes: 1 addition & 2 deletions packages/oneclient_app/src/components/notifications.rs
Original file line number Diff line number Diff line change
Expand Up @@ -207,8 +207,7 @@ fn tasks_section(entry: &InboxEntry, mut expanded: State<bool>) -> impl IntoElem
.horizontal()
.cross_align(Alignment::Center)
.spacing(6.)
.on_pointer_enter(|_| Cursor::set(CursorIcon::Pointer))
.on_pointer_leave(|_| Cursor::set(CursorIcon::default()))
.cursor(CursorIcon::Pointer)
.on_press(move |_| {
let now = !*expanded.peek();
expanded.set(now);
Expand Down
35 changes: 13 additions & 22 deletions packages/oneclient_app/src/components/package_row.rs
Original file line number Diff line number Diff line change
Expand Up @@ -225,8 +225,7 @@ fn grid_card(
let package_id = item.package_id.clone();
let package_type_owned = package_type.to_string();
rect()
.on_pointer_enter(|_| Cursor::set(CursorIcon::Pointer))
.on_pointer_leave(|_| Cursor::set(CursorIcon::default()))
.cursor(CursorIcon::Pointer)
.on_press(move |e: Event<PressEventData>| {
e.stop_propagation();
let _ = RouterContext::get().push(Route::BrowserPackage {
Expand Down Expand Up @@ -307,8 +306,7 @@ fn grid_card(
.background(bg)
.border(border_all_color(1.5, border))
.content(Content::Flex)
.on_pointer_enter(|_| Cursor::set(CursorIcon::Pointer))
.on_pointer_leave(|_| Cursor::set(CursorIcon::default()))
.cursor(CursorIcon::Pointer)
.on_press(move |_| on_toggle.call(()))
.child(header)
.child(
Expand Down Expand Up @@ -344,15 +342,13 @@ fn package_info(
.spacing(12.)
.content(Content::Flex)
.maybe(remote, |el| {
el.on_pointer_enter(|_| Cursor::set(CursorIcon::Pointer))
.on_pointer_leave(|_| Cursor::set(CursorIcon::default()))
.on_press(move |_| {
let _ = RouterContext::get().push(Route::BrowserPackage {
cluster_id,
package_type: package_type.clone(),
package_id: format!("{}:{}", provider as u8, package_id),
});
})
el.cursor(CursorIcon::Pointer).on_press(move |_| {
let _ = RouterContext::get().push(Route::BrowserPackage {
cluster_id,
package_type: package_type.clone(),
package_id: format!("{}:{}", provider as u8, package_id),
});
})
})
.child(icon)
.child(
Expand Down Expand Up @@ -528,15 +524,10 @@ fn remove_button(
Color::TRANSPARENT
})
.maybe(enabled, |el| {
el.on_pointer_enter(move |_| {
hovering.set(true);
Cursor::set(CursorIcon::Pointer);
})
.on_pointer_leave(move |_| {
hovering.set(false);
Cursor::set(CursorIcon::default());
})
.on_press(move |_| on_remove())
el.cursor(CursorIcon::Pointer)
.on_pointer_enter(move |_| hovering.set(true))
.on_pointer_leave(move |_| hovering.set(false))
.on_press(move |_| on_remove())
})
.child(Icon::new(IconType::Trash01).size(14.).color(color))
.into_element()
Expand Down
35 changes: 10 additions & 25 deletions packages/oneclient_app/src/components/player_model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -106,19 +106,6 @@ impl Component for PlayerModel {
});

let mut drag = use_state(|| None::<(f32, f32, f32, f32)>);
let mut hovering = use_state(|| false);

// Derive from both states Freya re-emits `pointer enter` after a press which
// would otherwise drop the grabbing cursor as the drag starts
let apply_cursor = move || {
Cursor::set(if drag.peek().is_some() {
CursorIcon::Grabbing
} else if *hovering.peek() {
CursorIcon::Grab
} else {
CursorIcon::default()
});
};

let mut last_uuid = use_state({
let u = self.uuid.clone();
Expand Down Expand Up @@ -168,22 +155,21 @@ impl Component for PlayerModel {
ctx.canvas.draw_rect(SkRect::new(0.0, 0.0, w, h), &paint);
});

canvas(render_cb)
.key(src_ptr as u64)
// `canvas` carries no style data, so the cursor rides on a wrapper `rect` that
// covers exactly the same area
rect()
.width(self.width.clone())
.height(self.height.clone())
.on_pointer_enter(move |_| {
hovering.set(true);
apply_cursor();
})
.on_pointer_leave(move |_| {
hovering.set(false);
apply_cursor();
})
.cursor(CursorIcon::Grab)
.child(
canvas(render_cb)
.key(src_ptr as u64)
.width(Size::fill())
.height(Size::fill()),
)
.on_pointer_down(move |e: Event<PointerEventData>| {
let loc = e.global_location();
drag.set(Some((loc.x as f32, loc.y as f32, yaw(), pitch())));
apply_cursor();
})
.on_global_pointer_move(move |e: Event<PointerEventData>| {
let Some((sx, sy, yaw0, pitch0)) = *drag.read() else {
Expand All @@ -206,7 +192,6 @@ impl Component for PlayerModel {
.on_global_pointer_press(move |_: Event<PointerEventData>| {
if drag.peek().is_some() {
drag.set(None);
apply_cursor();
}
})
}
Expand Down
3 changes: 1 addition & 2 deletions packages/oneclient_app/src/components/screenshot_viewer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -191,8 +191,7 @@ fn chevron_btn(
}

base.background(Color::from_argb(140, 0, 0, 0))
.on_pointer_enter(|_| Cursor::set(CursorIcon::Pointer))
.on_pointer_leave(|_| Cursor::set(CursorIcon::default()))
.cursor(CursorIcon::Pointer)
.on_press(on_press)
.child(Icon::new(icon).size(26.).color(colors::fg_primary()))
.into_element()
Expand Down
3 changes: 1 addition & 2 deletions packages/oneclient_app/src/components/segmented_control.rs
Original file line number Diff line number Diff line change
Expand Up @@ -184,8 +184,7 @@ impl<T: Copy + PartialEq + 'static> Component for SegmentButton<T> {
el.border(border_all_color(1., colors::brand()))
})
.maybe(!disabled, |el| {
el.on_pointer_enter(|_| Cursor::set(CursorIcon::Pointer))
.on_pointer_leave(|_| Cursor::set(CursorIcon::default()))
el.cursor(CursorIcon::Pointer)
.on_all_press(move |_| *selected.write() = value)
})
.maybe_child(self.icon.map(|icon| {
Expand Down
14 changes: 3 additions & 11 deletions packages/oneclient_app/src/components/status_bar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -128,9 +128,6 @@ impl Component for StatusBanner {

let mut close_hover = use_state(|| false);

// Close unmounts the banner from under the pointer so no `leave` fires
use_drop(|| Cursor::set(CursorIcon::default()));

let close = issue.closeable().then(|| {
rect()
.center()
Expand All @@ -142,14 +139,9 @@ impl Component for StatusBanner {
} else {
Color::TRANSPARENT
})
.on_pointer_enter(move |_| {
close_hover.set(true);
Cursor::set(CursorIcon::Pointer);
})
.on_pointer_leave(move |_| {
close_hover.set(false);
Cursor::set(CursorIcon::default());
})
.cursor(CursorIcon::Pointer)
.on_pointer_enter(move |_| close_hover.set(true))
.on_pointer_leave(move |_| close_hover.set(false))
.on_press(move |_| {
dismissed.write().insert(issue);
})
Expand Down
3 changes: 1 addition & 2 deletions packages/oneclient_app/src/components/tab_bar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -184,8 +184,7 @@ impl Component for TabButton {
.a11y_id(a11y_id)
.a11y_focusable(true)
.a11y_role(AccessibilityRole::Button)
.on_pointer_enter(|_| Cursor::set(CursorIcon::Pointer))
.on_pointer_leave(|_| Cursor::set(CursorIcon::default()));
.cursor(CursorIcon::Pointer);

if let Some(handler) = self.on_press.clone() {
el = el.on_all_press(move |e| handler.call(e));
Expand Down
12 changes: 3 additions & 9 deletions packages/oneclient_app/src/components/toggle.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,10 +98,6 @@ impl Component for Switch {

let text = if on { "On" } else { "Off" };

use_drop(|| {
Cursor::set(CursorIcon::default());
});

rect()
.horizontal()
.cross_align(Alignment::Center)
Expand All @@ -110,11 +106,9 @@ impl Component for Switch {
.a11y_focusable(!disabled)
.a11y_role(AccessibilityRole::Button)
.maybe(!disabled, |el| {
el.on_pointer_enter(|_| Cursor::set(CursorIcon::Pointer))
.on_pointer_leave(|_| Cursor::set(CursorIcon::default()))
.on_all_press(move |_| {
on_press.call(());
})
el.cursor(CursorIcon::Pointer).on_all_press(move |_| {
on_press.call(());
})
})
.child(
label()
Expand Down
10 changes: 4 additions & 6 deletions packages/oneclient_app/src/hooks/queries/auth.rs
Original file line number Diff line number Diff line change
Expand Up @@ -113,15 +113,13 @@ pub fn try_account(query: &UseQuery<AccountQuery>) -> Option<MinecraftAccount> {
}

async fn invalidate_auth_queries(account_id: Option<Uuid>) {
QueriesStorage::<ListAccountsQuery>::try_invalidate_matching(ListAccountsKeys).await;
QueriesStorage::<ListAccountsQuery>::invalidate_matching(ListAccountsKeys).await;
for fallback in [false, true] {
QueriesStorage::<DefaultAccountQuery>::try_invalidate_matching(DefaultAccountKeys {
fallback,
})
.await;
QueriesStorage::<DefaultAccountQuery>::invalidate_matching(DefaultAccountKeys { fallback })
.await;
}
if let Some(id) = account_id {
QueriesStorage::<AccountQuery>::try_invalidate_matching(AccountKeys { id }).await;
QueriesStorage::<AccountQuery>::invalidate_matching(AccountKeys { id }).await;
}
}

Expand Down
5 changes: 2 additions & 3 deletions packages/oneclient_app/src/hooks/queries/image.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,10 @@ pub fn loaded_image(url: Option<&str>, query: &UseQuery<CachedImageQuery>) -> Op

pub fn use_cached_image(url: Option<String>, max_edge: u32) -> UseQuery<CachedImageQuery> {
let url = url.unwrap_or_default();
let enabled = !url.is_empty();
let keys = (!url.is_empty()).then_some(CachedImageKeys { url, max_edge });

use_query(
Query::new(CachedImageKeys { url, max_edge }, CachedImageQuery)
.enable(enabled)
Query::new(keys, CachedImageQuery)
.stale_time(IMAGE_STALE)
.clean_time(IMAGE_CLEAN),
)
Expand Down
2 changes: 1 addition & 1 deletion packages/oneclient_app/src/hooks/queries/java.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ pub fn java_runtimes(query: &UseQuery<ListJavaRuntimesQuery>) -> Vec<JavaRuntime
}

pub async fn invalidate_java_queries() {
QueriesStorage::<ListJavaRuntimesQuery>::try_invalidate_all().await;
QueriesStorage::<ListJavaRuntimesQuery>::invalidate_all().await;
}

#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
Expand Down
Loading