This adds the ability for Zed to restore multiple windows after
restarting. It's now the default behavior.
Release Notes:
- Added ability to restore all windows that were open when Zed was quit.
Previously only the last used workspace was restored. This is now the
default behavior. To get back the old behavior, add the following to
your settings: `{"restore_on_startup": "last_workspace"}` (Part of
[#4985](https://github.com/zed-industries/zed/issues/4985) and
[#4683](https://github.com/zed-industries/zed/issues/4683))
Demo:
https://github.com/user-attachments/assets/57a375ec-0c6a-4724-97c4-3fea8f18bc2d
---------
Co-authored-by: Nathan <nathan@zed.dev>
168 lines
5.6 KiB
Rust
168 lines
5.6 KiB
Rust
use anyhow::Result;
|
|
use collections::HashMap;
|
|
use gpui::AppContext;
|
|
use schemars::JsonSchema;
|
|
use serde::{Deserialize, Serialize};
|
|
use settings::{Settings, SettingsSources};
|
|
|
|
#[derive(Deserialize)]
|
|
pub struct WorkspaceSettings {
|
|
pub active_pane_magnification: f32,
|
|
pub centered_layout: CenteredLayoutSettings,
|
|
pub confirm_quit: bool,
|
|
pub show_call_status_icon: bool,
|
|
pub autosave: AutosaveSetting,
|
|
pub restore_on_startup: RestoreOnStartupBehaviour,
|
|
pub drop_target_size: f32,
|
|
pub when_closing_with_no_tabs: CloseWindowWhenNoItems,
|
|
pub use_system_path_prompts: bool,
|
|
pub command_aliases: HashMap<String, String>,
|
|
}
|
|
|
|
#[derive(Copy, Clone, Default, Serialize, Deserialize, JsonSchema)]
|
|
#[serde(rename_all = "snake_case")]
|
|
pub enum CloseWindowWhenNoItems {
|
|
/// Match platform conventions by default, so "on" on macOS and "off" everywhere else
|
|
#[default]
|
|
PlatformDefault,
|
|
/// Close the window when there are no tabs
|
|
CloseWindow,
|
|
/// Leave the window open when there are no tabs
|
|
KeepWindowOpen,
|
|
}
|
|
|
|
impl CloseWindowWhenNoItems {
|
|
pub fn should_close(&self) -> bool {
|
|
match self {
|
|
CloseWindowWhenNoItems::PlatformDefault => cfg!(target_os = "macos"),
|
|
CloseWindowWhenNoItems::CloseWindow => true,
|
|
CloseWindowWhenNoItems::KeepWindowOpen => false,
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Copy, Clone, Default, Serialize, Deserialize, JsonSchema)]
|
|
#[serde(rename_all = "snake_case")]
|
|
pub enum RestoreOnStartupBehaviour {
|
|
/// Always start with an empty editor
|
|
None,
|
|
/// Restore the workspace that was closed last.
|
|
LastWorkspace,
|
|
/// Restore all workspaces that were open when quitting Zed.
|
|
#[default]
|
|
LastSession,
|
|
}
|
|
|
|
#[derive(Clone, Default, Serialize, Deserialize, JsonSchema)]
|
|
pub struct WorkspaceSettingsContent {
|
|
/// Scale by which to zoom the active pane.
|
|
/// When set to 1.0, the active pane has the same size as others,
|
|
/// but when set to a larger value, the active pane takes up more space.
|
|
///
|
|
/// Default: `1.0`
|
|
pub active_pane_magnification: Option<f32>,
|
|
// Centered layout related settings.
|
|
pub centered_layout: Option<CenteredLayoutSettings>,
|
|
/// Whether or not to prompt the user to confirm before closing the application.
|
|
///
|
|
/// Default: false
|
|
pub confirm_quit: Option<bool>,
|
|
/// Whether or not to show the call status icon in the status bar.
|
|
///
|
|
/// Default: true
|
|
pub show_call_status_icon: Option<bool>,
|
|
/// When to automatically save edited buffers.
|
|
///
|
|
/// Default: off
|
|
pub autosave: Option<AutosaveSetting>,
|
|
/// Controls previous session restoration in freshly launched Zed instance.
|
|
/// Values: none, last_workspace, last_session
|
|
/// Default: last_session
|
|
pub restore_on_startup: Option<RestoreOnStartupBehaviour>,
|
|
/// The size of the workspace split drop targets on the outer edges.
|
|
/// Given as a fraction that will be multiplied by the smaller dimension of the workspace.
|
|
///
|
|
/// Default: `0.2` (20% of the smaller dimension of the workspace)
|
|
pub drop_target_size: Option<f32>,
|
|
/// Whether to close the window when using 'close active item' on a workspace with no tabs
|
|
///
|
|
/// Default: auto ("on" on macOS, "off" otherwise)
|
|
pub when_closing_with_no_tabs: Option<CloseWindowWhenNoItems>,
|
|
/// Whether to use the system provided dialogs for Open and Save As.
|
|
/// When set to false, Zed will use the built-in keyboard-first pickers.
|
|
///
|
|
/// Default: true
|
|
pub use_system_path_prompts: Option<bool>,
|
|
/// Aliases for the command palette. When you type a key in this map,
|
|
/// it will be assumed to equal the value.
|
|
///
|
|
/// Default: true
|
|
pub command_aliases: Option<HashMap<String, String>>,
|
|
}
|
|
|
|
#[derive(Deserialize)]
|
|
pub struct TabBarSettings {
|
|
pub show: bool,
|
|
pub show_nav_history_buttons: bool,
|
|
}
|
|
|
|
#[derive(Clone, Default, Serialize, Deserialize, JsonSchema)]
|
|
pub struct TabBarSettingsContent {
|
|
/// Whether or not to show the tab bar in the editor.
|
|
///
|
|
/// Default: true
|
|
pub show: Option<bool>,
|
|
/// Whether or not to show the navigation history buttons in the tab bar.
|
|
///
|
|
/// Default: true
|
|
pub show_nav_history_buttons: Option<bool>,
|
|
}
|
|
|
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]
|
|
#[serde(rename_all = "snake_case")]
|
|
pub enum AutosaveSetting {
|
|
/// Disable autosave.
|
|
Off,
|
|
/// Save after inactivity period of `milliseconds`.
|
|
AfterDelay { milliseconds: u64 },
|
|
/// Autosave when focus changes.
|
|
OnFocusChange,
|
|
/// Autosave when the active window changes.
|
|
OnWindowChange,
|
|
}
|
|
|
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema)]
|
|
#[serde(rename_all = "snake_case")]
|
|
pub struct CenteredLayoutSettings {
|
|
/// The relative width of the left padding of the central pane from the
|
|
/// workspace when the centered layout is used.
|
|
///
|
|
/// Default: 0.2
|
|
pub left_padding: Option<f32>,
|
|
// The relative width of the right padding of the central pane from the
|
|
// workspace when the centered layout is used.
|
|
///
|
|
/// Default: 0.2
|
|
pub right_padding: Option<f32>,
|
|
}
|
|
|
|
impl Settings for WorkspaceSettings {
|
|
const KEY: Option<&'static str> = None;
|
|
|
|
type FileContent = WorkspaceSettingsContent;
|
|
|
|
fn load(sources: SettingsSources<Self::FileContent>, _: &mut AppContext) -> Result<Self> {
|
|
sources.json_merge()
|
|
}
|
|
}
|
|
|
|
impl Settings for TabBarSettings {
|
|
const KEY: Option<&'static str> = Some("tab_bar");
|
|
|
|
type FileContent = TabBarSettingsContent;
|
|
|
|
fn load(sources: SettingsSources<Self::FileContent>, _: &mut AppContext) -> Result<Self> {
|
|
sources.json_merge()
|
|
}
|
|
}
|