Create chat panel settings
This commit is contained in:
parent
ddda5a559b
commit
ed7bc91dbd
6 changed files with 74 additions and 55 deletions
|
@ -131,6 +131,14 @@
|
|||
// Default width of the channels panel.
|
||||
"default_width": 240
|
||||
},
|
||||
"chat_panel": {
|
||||
// Whether to show the collaboration panel button in the status bar.
|
||||
"button": true,
|
||||
// Where to dock channels panel. Can be 'left' or 'right'.
|
||||
"dock": "right",
|
||||
// Default width of the channels panel.
|
||||
"default_width": 240
|
||||
},
|
||||
"assistant": {
|
||||
// Whether to show the assistant panel button in the status bar.
|
||||
"button": true,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
use crate::collab_panel::{CollaborationPanelDockPosition, CollaborationPanelSettings};
|
||||
use crate::ChatPanelSettings;
|
||||
use anyhow::Result;
|
||||
use channel::{ChannelChat, ChannelChatEvent, ChannelMessage, ChannelStore};
|
||||
use client::Client;
|
||||
|
@ -17,6 +17,7 @@ use language::language_settings::SoftWrap;
|
|||
use menu::Confirm;
|
||||
use project::Fs;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use settings::SettingsStore;
|
||||
use std::sync::Arc;
|
||||
use theme::Theme;
|
||||
use time::{OffsetDateTime, UtcOffset};
|
||||
|
@ -40,6 +41,7 @@ pub struct ChatPanel {
|
|||
fs: Arc<dyn Fs>,
|
||||
width: Option<f32>,
|
||||
pending_serialization: Task<Option<()>>,
|
||||
subscriptions: Vec<gpui::Subscription>,
|
||||
has_focus: bool,
|
||||
}
|
||||
|
||||
|
@ -124,9 +126,23 @@ impl ChatPanel {
|
|||
channel_select,
|
||||
local_timezone: cx.platform().local_timezone(),
|
||||
has_focus: false,
|
||||
subscriptions: Vec::new(),
|
||||
width: None,
|
||||
};
|
||||
|
||||
let mut old_dock_position = this.position(cx);
|
||||
this.subscriptions
|
||||
.push(
|
||||
cx.observe_global::<SettingsStore, _>(move |this: &mut Self, cx| {
|
||||
let new_dock_position = this.position(cx);
|
||||
if new_dock_position != old_dock_position {
|
||||
old_dock_position = new_dock_position;
|
||||
cx.emit(Event::DockPositionChanged);
|
||||
}
|
||||
cx.notify();
|
||||
}),
|
||||
);
|
||||
|
||||
this.init_active_channel(cx);
|
||||
cx.observe(&this.channel_store, |this, _, cx| {
|
||||
this.init_active_channel(cx);
|
||||
|
@ -446,10 +462,7 @@ impl View for ChatPanel {
|
|||
|
||||
impl Panel for ChatPanel {
|
||||
fn position(&self, cx: &gpui::WindowContext) -> DockPosition {
|
||||
match settings::get::<CollaborationPanelSettings>(cx).dock {
|
||||
CollaborationPanelDockPosition::Left => DockPosition::Left,
|
||||
CollaborationPanelDockPosition::Right => DockPosition::Right,
|
||||
}
|
||||
settings::get::<ChatPanelSettings>(cx).dock
|
||||
}
|
||||
|
||||
fn position_is_valid(&self, position: DockPosition) -> bool {
|
||||
|
@ -457,24 +470,14 @@ impl Panel for ChatPanel {
|
|||
}
|
||||
|
||||
fn set_position(&mut self, position: DockPosition, cx: &mut ViewContext<Self>) {
|
||||
settings::update_settings_file::<CollaborationPanelSettings>(
|
||||
self.fs.clone(),
|
||||
cx,
|
||||
move |settings| {
|
||||
let dock = match position {
|
||||
DockPosition::Left | DockPosition::Bottom => {
|
||||
CollaborationPanelDockPosition::Left
|
||||
}
|
||||
DockPosition::Right => CollaborationPanelDockPosition::Right,
|
||||
};
|
||||
settings.dock = Some(dock);
|
||||
},
|
||||
);
|
||||
settings::update_settings_file::<ChatPanelSettings>(self.fs.clone(), cx, move |settings| {
|
||||
settings.dock = Some(position)
|
||||
});
|
||||
}
|
||||
|
||||
fn size(&self, cx: &gpui::WindowContext) -> f32 {
|
||||
self.width
|
||||
.unwrap_or_else(|| settings::get::<CollaborationPanelSettings>(cx).default_width)
|
||||
.unwrap_or_else(|| settings::get::<ChatPanelSettings>(cx).default_width)
|
||||
}
|
||||
|
||||
fn set_size(&mut self, size: Option<f32>, cx: &mut ViewContext<Self>) {
|
||||
|
@ -484,7 +487,7 @@ impl Panel for ChatPanel {
|
|||
}
|
||||
|
||||
fn icon_path(&self, cx: &gpui::WindowContext) -> Option<&'static str> {
|
||||
settings::get::<CollaborationPanelSettings>(cx)
|
||||
settings::get::<ChatPanelSettings>(cx)
|
||||
.button
|
||||
.then(|| "icons/conversations.svg")
|
||||
}
|
||||
|
|
|
@ -1,16 +1,17 @@
|
|||
mod channel_modal;
|
||||
mod contact_finder;
|
||||
mod panel_settings;
|
||||
|
||||
use crate::{
|
||||
channel_view::{self, ChannelView},
|
||||
face_pile::FacePile,
|
||||
CollaborationPanelSettings,
|
||||
};
|
||||
use anyhow::Result;
|
||||
use call::ActiveCall;
|
||||
use channel::{Channel, ChannelEvent, ChannelId, ChannelStore};
|
||||
use channel_modal::ChannelModal;
|
||||
use client::{proto::PeerId, Client, Contact, User, UserStore};
|
||||
use contact_finder::ContactFinder;
|
||||
use context_menu::{ContextMenu, ContextMenuItem};
|
||||
use db::kvp::KEY_VALUE_STORE;
|
||||
use editor::{Cancel, Editor};
|
||||
|
@ -47,10 +48,6 @@ use workspace::{
|
|||
Workspace,
|
||||
};
|
||||
|
||||
pub use panel_settings::{CollaborationPanelDockPosition, CollaborationPanelSettings};
|
||||
|
||||
use self::contact_finder::ContactFinder;
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
|
||||
struct RemoveChannel {
|
||||
channel_id: u64,
|
||||
|
@ -113,7 +110,6 @@ impl_actions!(
|
|||
const COLLABORATION_PANEL_KEY: &'static str = "CollaborationPanel";
|
||||
|
||||
pub fn init(cx: &mut AppContext) {
|
||||
settings::register::<panel_settings::CollaborationPanelSettings>(cx);
|
||||
contact_finder::init(cx);
|
||||
channel_modal::init(cx);
|
||||
channel_view::init(cx);
|
||||
|
@ -451,7 +447,7 @@ impl CollabPanel {
|
|||
let mut old_dock_position = this.position(cx);
|
||||
this.subscriptions
|
||||
.push(
|
||||
cx.observe_global::<SettingsStore, _>(move |this: &mut CollabPanel, cx| {
|
||||
cx.observe_global::<SettingsStore, _>(move |this: &mut Self, cx| {
|
||||
let new_dock_position = this.position(cx);
|
||||
if new_dock_position != old_dock_position {
|
||||
old_dock_position = new_dock_position;
|
||||
|
@ -2555,10 +2551,7 @@ impl View for CollabPanel {
|
|||
|
||||
impl Panel for CollabPanel {
|
||||
fn position(&self, cx: &gpui::WindowContext) -> DockPosition {
|
||||
match settings::get::<CollaborationPanelSettings>(cx).dock {
|
||||
CollaborationPanelDockPosition::Left => DockPosition::Left,
|
||||
CollaborationPanelDockPosition::Right => DockPosition::Right,
|
||||
}
|
||||
settings::get::<CollaborationPanelSettings>(cx).dock
|
||||
}
|
||||
|
||||
fn position_is_valid(&self, position: DockPosition) -> bool {
|
||||
|
@ -2569,15 +2562,7 @@ impl Panel for CollabPanel {
|
|||
settings::update_settings_file::<CollaborationPanelSettings>(
|
||||
self.fs.clone(),
|
||||
cx,
|
||||
move |settings| {
|
||||
let dock = match position {
|
||||
DockPosition::Left | DockPosition::Bottom => {
|
||||
CollaborationPanelDockPosition::Left
|
||||
}
|
||||
DockPosition::Right => CollaborationPanelDockPosition::Right,
|
||||
};
|
||||
settings.dock = Some(dock);
|
||||
},
|
||||
move |settings| settings.dock = Some(position),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -2595,7 +2580,7 @@ impl Panel for CollabPanel {
|
|||
fn icon_path(&self, cx: &gpui::WindowContext) -> Option<&'static str> {
|
||||
settings::get::<CollaborationPanelSettings>(cx)
|
||||
.button
|
||||
.then(|| "icons/conversations.svg")
|
||||
.then(|| "icons/user_group_16.svg")
|
||||
}
|
||||
|
||||
fn icon_tooltip(&self) -> (String, Option<Box<dyn gpui::Action>>) {
|
||||
|
|
|
@ -6,11 +6,11 @@ mod contact_notification;
|
|||
mod face_pile;
|
||||
mod incoming_call_notification;
|
||||
mod notifications;
|
||||
mod panel_settings;
|
||||
mod project_shared_notification;
|
||||
mod sharing_status_indicator;
|
||||
|
||||
use call::{ActiveCall, Room};
|
||||
pub use collab_titlebar_item::CollabTitlebarItem;
|
||||
use gpui::{
|
||||
actions,
|
||||
geometry::{
|
||||
|
@ -24,12 +24,18 @@ use std::{rc::Rc, sync::Arc};
|
|||
use util::ResultExt;
|
||||
use workspace::AppState;
|
||||
|
||||
pub use collab_titlebar_item::CollabTitlebarItem;
|
||||
pub use panel_settings::{ChatPanelSettings, CollaborationPanelSettings};
|
||||
|
||||
actions!(
|
||||
collab,
|
||||
[ToggleScreenSharing, ToggleMute, ToggleDeafen, LeaveCall]
|
||||
);
|
||||
|
||||
pub fn init(app_state: &Arc<AppState>, cx: &mut AppContext) {
|
||||
settings::register::<CollaborationPanelSettings>(cx);
|
||||
settings::register::<ChatPanelSettings>(cx);
|
||||
|
||||
vcs_menu::init(cx);
|
||||
collab_titlebar_item::init(cx);
|
||||
collab_panel::init(cx);
|
||||
|
|
|
@ -2,32 +2,47 @@ use anyhow;
|
|||
use schemars::JsonSchema;
|
||||
use serde_derive::{Deserialize, Serialize};
|
||||
use settings::Setting;
|
||||
|
||||
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
|
||||
#[serde(rename_all = "snake_case")]
|
||||
pub enum CollaborationPanelDockPosition {
|
||||
Left,
|
||||
Right,
|
||||
}
|
||||
use workspace::dock::DockPosition;
|
||||
|
||||
#[derive(Deserialize, Debug)]
|
||||
pub struct CollaborationPanelSettings {
|
||||
pub button: bool,
|
||||
pub dock: CollaborationPanelDockPosition,
|
||||
pub dock: DockPosition,
|
||||
pub default_width: f32,
|
||||
}
|
||||
|
||||
#[derive(Deserialize, Debug)]
|
||||
pub struct ChatPanelSettings {
|
||||
pub button: bool,
|
||||
pub dock: DockPosition,
|
||||
pub default_width: f32,
|
||||
}
|
||||
|
||||
#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, Debug)]
|
||||
pub struct CollaborationPanelSettingsContent {
|
||||
pub struct PanelSettingsContent {
|
||||
pub button: Option<bool>,
|
||||
pub dock: Option<CollaborationPanelDockPosition>,
|
||||
pub dock: Option<DockPosition>,
|
||||
pub default_width: Option<f32>,
|
||||
}
|
||||
|
||||
impl Setting for CollaborationPanelSettings {
|
||||
const KEY: Option<&'static str> = Some("collaboration_panel");
|
||||
|
||||
type FileContent = CollaborationPanelSettingsContent;
|
||||
type FileContent = PanelSettingsContent;
|
||||
|
||||
fn load(
|
||||
default_value: &Self::FileContent,
|
||||
user_values: &[&Self::FileContent],
|
||||
_: &gpui::AppContext,
|
||||
) -> anyhow::Result<Self> {
|
||||
Self::load_via_json_merge(default_value, user_values)
|
||||
}
|
||||
}
|
||||
|
||||
impl Setting for ChatPanelSettings {
|
||||
const KEY: Option<&'static str> = Some("chat_panel");
|
||||
|
||||
type FileContent = PanelSettingsContent;
|
||||
|
||||
fn load(
|
||||
default_value: &Self::FileContent,
|
|
@ -4,7 +4,8 @@ use gpui::{
|
|||
elements::*, platform::CursorStyle, platform::MouseButton, Action, AnyViewHandle, AppContext,
|
||||
Axis, Entity, Subscription, View, ViewContext, ViewHandle, WeakViewHandle, WindowContext,
|
||||
};
|
||||
use serde::Deserialize;
|
||||
use schemars::JsonSchema;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::rc::Rc;
|
||||
use theme::ThemeSettings;
|
||||
|
||||
|
@ -132,7 +133,8 @@ pub struct Dock {
|
|||
active_panel_index: usize,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, Deserialize, PartialEq)]
|
||||
#[derive(Clone, Copy, Debug, Serialize, Deserialize, JsonSchema, PartialEq)]
|
||||
#[serde(rename_all = "lowercase")]
|
||||
pub enum DockPosition {
|
||||
Left,
|
||||
Bottom,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue