From 193aaa646e12abea89d6b7f91cd91f902fcd37f6 Mon Sep 17 00:00:00 2001 From: reya Date: Thu, 6 Feb 2025 09:11:44 +0700 Subject: [PATCH] fix: panel is not focus --- Cargo.toml | 13 ++++-------- crates/app/src/main.rs | 5 ++--- crates/app/src/views/app.rs | 20 +++++++----------- crates/app/src/views/onboarding.rs | 9 ++++---- crates/ui/src/dock_area/mod.rs | 31 ++-------------------------- crates/ui/src/dock_area/tab_panel.rs | 3 ++- 6 files changed, 21 insertions(+), 60 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index aa7dd087..7a390871 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,13 +33,8 @@ smallvec = "1.13.2" rust-embed = "8.5.0" [profile.release] -codegen-units = 1 -lto = true -panic = "abort" -incremental = false -opt-level = "z" strip = true -rpath = false -debug = false -debug-assertions = false -overflow-checks = false +opt-level = "z" +lto = true +codegen-units = 1 +panic = "abort" diff --git a/crates/app/src/main.rs b/crates/app/src/main.rs index 1fe304fb..eb49bc53 100644 --- a/crates/app/src/main.rs +++ b/crates/app/src/main.rs @@ -20,7 +20,7 @@ use state::{get_client, initialize_client}; use std::{borrow::Cow, collections::HashSet, ops::Deref, str::FromStr, sync::Arc, time::Duration}; use tokio::sync::mpsc; use ui::{theme::Theme, Root}; -use views::{app::AppView, onboarding, startup::Startup}; +use views::{app, onboarding, startup::Startup}; mod asset; mod views; @@ -311,8 +311,7 @@ fn main() { if let Some(root) = this.root() { cx.update_entity(&root, |this: &mut Root, cx| { this.set_view( - cx.new(|cx| AppView::new(profile, window, cx)) - .into(), + app::init(profile, window, cx).into(), cx, ); }); diff --git a/crates/app/src/views/app.rs b/crates/app/src/views/app.rs index db1ef89f..9de7c370 100644 --- a/crates/app/src/views/app.rs +++ b/crates/app/src/views/app.rs @@ -2,7 +2,7 @@ use app_state::registry::AppRegistry; use chat_state::registry::ChatRegistry; use common::profile::NostrProfile; use gpui::{ - actions, div, img, impl_internal_actions, px, AppContext, Axis, BorrowAppContext, Context, + actions, div, img, impl_internal_actions, px, App, AppContext, Axis, BorrowAppContext, Context, Entity, InteractiveElement, IntoElement, ObjectFit, ParentElement, Render, Styled, StyledImage, Window, }; @@ -44,24 +44,18 @@ impl_internal_actions!(dock, [AddPanel]); // Account actions actions!(account, [OpenProfile, OpenContacts, OpenSettings, Logout]); -pub struct DockAreaTab { - id: &'static str, - version: usize, +pub fn init(account: NostrProfile, window: &mut Window, cx: &mut App) -> Entity { + AppView::new(account, window, cx) } -pub const DOCK_AREA: DockAreaTab = DockAreaTab { - id: "dock", - version: 1, -}; - pub struct AppView { account: NostrProfile, dock: Entity, } impl AppView { - pub fn new(account: NostrProfile, window: &mut Window, cx: &mut Context<'_, Self>) -> AppView { - let dock = cx.new(|cx| DockArea::new(DOCK_AREA.id, Some(DOCK_AREA.version), window, cx)); + pub fn new(account: NostrProfile, window: &mut Window, cx: &mut App) -> Entity { + let dock = cx.new(|cx| DockArea::new(window, cx)); let weak_dock = dock.downgrade(); let left_panel = DockItem::panel(Arc::new(sidebar::init(window, cx))); let center_panel = DockItem::split_with_sizes( @@ -79,13 +73,13 @@ impl AppView { cx, ); + // Set default dock layout _ = weak_dock.update(cx, |view, cx| { - view.set_version(DOCK_AREA.version, window, cx); view.set_left_dock(left_panel, Some(px(240.)), true, window, cx); view.set_center(center_panel, window, cx); }); - AppView { account, dock } + cx.new(|_| Self { account, dock }) } fn render_account(&self) -> impl IntoElement { diff --git a/crates/app/src/views/onboarding.rs b/crates/app/src/views/onboarding.rs index c786bf40..c4f648fb 100644 --- a/crates/app/src/views/onboarding.rs +++ b/crates/app/src/views/onboarding.rs @@ -16,7 +16,7 @@ use ui::{ ContextModal, Root, Size, StyledExt, }; -use super::app::AppView; +use super::app; const ALPHA_MESSAGE: &str = "Coop is in the alpha stage; it does not store any credentials. You will need to log in again when you reopen the app."; const JOIN_URL: &str = "https://start.njump.me/"; @@ -61,10 +61,12 @@ impl Onboarding { }) } + /* fn use_connect(&mut self, _window: &mut Window, cx: &mut Context) { self.use_connect = true; cx.notify(); } + */ fn use_privkey(&mut self, _window: &mut Window, cx: &mut Context) { self.use_privkey = true; @@ -127,10 +129,7 @@ impl Onboarding { if let Some(root) = this.root() { cx.update_entity(&root, |this: &mut Root, cx| { - this.set_view( - cx.new(|cx| AppView::new(profile, window, cx)).into(), - cx, - ); + this.set_view(app::init(profile, window, cx).into(), cx); }); } }); diff --git a/crates/ui/src/dock_area/mod.rs b/crates/ui/src/dock_area/mod.rs index 3e0fd77f..289ffc1e 100644 --- a/crates/ui/src/dock_area/mod.rs +++ b/crates/ui/src/dock_area/mod.rs @@ -7,7 +7,7 @@ use crate::dock_area::{ use gpui::{ actions, canvas, div, prelude::FluentBuilder, px, AnyElement, AnyView, App, AppContext, Axis, Bounds, Context, Edges, Entity, EntityId, EventEmitter, InteractiveElement as _, IntoElement, - ParentElement as _, Pixels, Render, SharedString, Styled, Subscription, WeakEntity, Window, + ParentElement as _, Pixels, Render, Styled, Subscription, WeakEntity, Window, }; use std::sync::Arc; @@ -28,17 +28,11 @@ pub enum DockEvent { /// The main area of the dock. pub struct DockArea { - id: SharedString, - /// The version is used to special the default layout, this is like the `panel_version` in [`Panel`](Panel). - version: Option, pub(crate) bounds: Bounds, - /// The center view of the dockarea. items: DockItem, - /// The entity_id of the [`TabPanel`](TabPanel) where each toggle button should be displayed, toggle_button_panels: Edges>, - /// The left dock of the dock_area. left_dock: Option>, /// The bottom dock of the dock_area. @@ -47,13 +41,10 @@ pub struct DockArea { right_dock: Option>, /// The top zoom view of the dock_area, if any. zoom_view: Option, - /// Lock panels layout, but allow to resize. is_locked: bool, - /// The panel style, default is [`PanelStyle::Default`](PanelStyle::Default). pub(crate) panel_style: PanelStyle, - subscriptions: Vec, } @@ -289,12 +280,7 @@ impl DockItem { } impl DockArea { - pub fn new( - id: impl Into, - version: Option, - window: &mut Window, - cx: &mut Context, - ) -> Self { + pub fn new(window: &mut Window, cx: &mut Context) -> Self { let stack_panel = cx.new(|cx| StackPanel::new(Axis::Horizontal, window, cx)); let dock_item = DockItem::Split { @@ -305,8 +291,6 @@ impl DockArea { }; let mut this = Self { - id: id.into(), - version, bounds: Bounds::default(), items: dock_item, zoom_view: None, @@ -330,12 +314,6 @@ impl DockArea { self } - /// Set version of the dock area. - pub fn set_version(&mut self, version: usize, _window: &mut Window, cx: &mut Context) { - self.version = Some(version); - cx.notify(); - } - /// The DockItem as the center of the dock area. /// /// This is used to render at the Center of the DockArea. @@ -661,11 +639,6 @@ impl DockArea { self.subscriptions.push(subscription); } - /// Returns the ID of the dock area. - pub fn id(&self) -> SharedString { - self.id.clone() - } - pub fn set_zoomed_in( &mut self, panel: Entity

, diff --git a/crates/ui/src/dock_area/tab_panel.rs b/crates/ui/src/dock_area/tab_panel.rs index c937273b..94ea1d71 100644 --- a/crates/ui/src/dock_area/tab_panel.rs +++ b/crates/ui/src/dock_area/tab_panel.rs @@ -171,6 +171,7 @@ impl TabPanel { fn set_active_ix(&mut self, ix: usize, window: &mut Window, cx: &mut Context) { if ix == self.active_ix { + self.focus_active_panel(window, cx); return; } @@ -1021,7 +1022,7 @@ impl TabPanel { fn focus_active_panel(&self, window: &mut Window, cx: &mut Context) { if let Some(active_panel) = self.active_panel(cx) { - active_panel.focus_handle(cx).focus(window); + window.focus(&active_panel.focus_handle(cx)); } }