parent
2da80e4641
commit
0b9c9f5f2d
2 changed files with 108 additions and 1 deletions
|
@ -189,6 +189,7 @@ pub fn init(cx: &mut App) {
|
||||||
base_keymap_picker::init(cx);
|
base_keymap_picker::init(cx);
|
||||||
|
|
||||||
register_serializable_item::<Onboarding>(cx);
|
register_serializable_item::<Onboarding>(cx);
|
||||||
|
register_serializable_item::<WelcomePage>(cx);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn show_onboarding_view(app_state: Arc<AppState>, cx: &mut App) -> Task<anyhow::Result<()>> {
|
pub fn show_onboarding_view(app_state: Arc<AppState>, cx: &mut App) -> Task<anyhow::Result<()>> {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use gpui::{
|
use gpui::{
|
||||||
Action, App, Context, Entity, EventEmitter, FocusHandle, Focusable, InteractiveElement,
|
Action, App, Context, Entity, EventEmitter, FocusHandle, Focusable, InteractiveElement,
|
||||||
ParentElement, Render, Styled, Window, actions,
|
ParentElement, Render, Styled, Task, Window, actions,
|
||||||
};
|
};
|
||||||
use menu::{SelectNext, SelectPrevious};
|
use menu::{SelectNext, SelectPrevious};
|
||||||
use ui::{ButtonLike, Divider, DividerColor, KeyBinding, Vector, VectorName, prelude::*};
|
use ui::{ButtonLike, Divider, DividerColor, KeyBinding, Vector, VectorName, prelude::*};
|
||||||
|
@ -352,3 +352,109 @@ impl Item for WelcomePage {
|
||||||
f(*event)
|
f(*event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl workspace::SerializableItem for WelcomePage {
|
||||||
|
fn serialized_item_kind() -> &'static str {
|
||||||
|
"WelcomePage"
|
||||||
|
}
|
||||||
|
|
||||||
|
fn cleanup(
|
||||||
|
workspace_id: workspace::WorkspaceId,
|
||||||
|
alive_items: Vec<workspace::ItemId>,
|
||||||
|
_window: &mut Window,
|
||||||
|
cx: &mut App,
|
||||||
|
) -> Task<gpui::Result<()>> {
|
||||||
|
workspace::delete_unloaded_items(
|
||||||
|
alive_items,
|
||||||
|
workspace_id,
|
||||||
|
"welcome_pages",
|
||||||
|
&persistence::WELCOME_PAGES,
|
||||||
|
cx,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize(
|
||||||
|
_project: Entity<project::Project>,
|
||||||
|
_workspace: gpui::WeakEntity<workspace::Workspace>,
|
||||||
|
workspace_id: workspace::WorkspaceId,
|
||||||
|
item_id: workspace::ItemId,
|
||||||
|
window: &mut Window,
|
||||||
|
cx: &mut App,
|
||||||
|
) -> Task<gpui::Result<Entity<Self>>> {
|
||||||
|
if persistence::WELCOME_PAGES
|
||||||
|
.get_welcome_page(item_id, workspace_id)
|
||||||
|
.ok()
|
||||||
|
.is_some_and(|is_open| is_open)
|
||||||
|
{
|
||||||
|
window.spawn(cx, async move |cx| cx.update(WelcomePage::new))
|
||||||
|
} else {
|
||||||
|
Task::ready(Err(anyhow::anyhow!("No welcome page to deserialize")))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize(
|
||||||
|
&mut self,
|
||||||
|
workspace: &mut workspace::Workspace,
|
||||||
|
item_id: workspace::ItemId,
|
||||||
|
_closing: bool,
|
||||||
|
_window: &mut Window,
|
||||||
|
cx: &mut Context<Self>,
|
||||||
|
) -> Option<Task<gpui::Result<()>>> {
|
||||||
|
let workspace_id = workspace.database_id()?;
|
||||||
|
Some(cx.background_spawn(async move {
|
||||||
|
persistence::WELCOME_PAGES
|
||||||
|
.save_welcome_page(item_id, workspace_id, true)
|
||||||
|
.await
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn should_serialize(&self, event: &Self::Event) -> bool {
|
||||||
|
event == &ItemEvent::UpdateTab
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod persistence {
|
||||||
|
use db::{define_connection, query, sqlez_macros::sql};
|
||||||
|
use workspace::WorkspaceDb;
|
||||||
|
|
||||||
|
define_connection! {
|
||||||
|
pub static ref WELCOME_PAGES: WelcomePagesDb<WorkspaceDb> =
|
||||||
|
&[
|
||||||
|
sql!(
|
||||||
|
CREATE TABLE welcome_pages (
|
||||||
|
workspace_id INTEGER,
|
||||||
|
item_id INTEGER UNIQUE,
|
||||||
|
is_open INTEGER DEFAULT FALSE,
|
||||||
|
|
||||||
|
PRIMARY KEY(workspace_id, item_id),
|
||||||
|
FOREIGN KEY(workspace_id) REFERENCES workspaces(workspace_id)
|
||||||
|
ON DELETE CASCADE
|
||||||
|
) STRICT;
|
||||||
|
),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
impl WelcomePagesDb {
|
||||||
|
query! {
|
||||||
|
pub async fn save_welcome_page(
|
||||||
|
item_id: workspace::ItemId,
|
||||||
|
workspace_id: workspace::WorkspaceId,
|
||||||
|
is_open: bool
|
||||||
|
) -> Result<()> {
|
||||||
|
INSERT OR REPLACE INTO welcome_pages(item_id, workspace_id, is_open)
|
||||||
|
VALUES (?, ?, ?)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
query! {
|
||||||
|
pub fn get_welcome_page(
|
||||||
|
item_id: workspace::ItemId,
|
||||||
|
workspace_id: workspace::WorkspaceId
|
||||||
|
) -> Result<bool> {
|
||||||
|
SELECT is_open
|
||||||
|
FROM welcome_pages
|
||||||
|
WHERE item_id = ? AND workspace_id = ?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue