diff --git a/crates/theme2/src/registry.rs b/crates/theme2/src/registry.rs index cb7814cb6fb88886cb95490544c00f0dc7f5612e..e212d5f9a72d37500bc132f54bef91defb4e08db 100644 --- a/crates/theme2/src/registry.rs +++ b/crates/theme2/src/registry.rs @@ -10,6 +10,12 @@ use crate::{ SystemColors, Theme, ThemeColors, ThemeFamily, ThemeStyles, UserTheme, UserThemeFamily, }; +#[derive(Debug, Clone)] +pub struct ThemeMeta { + pub name: SharedString, + pub appearance: Appearance, +} + pub struct ThemeRegistry { themes: HashMap>, } @@ -94,8 +100,11 @@ impl ThemeRegistry { self.themes.keys().cloned() } - pub fn list(&self, _staff: bool) -> impl Iterator + '_ { - self.themes.values().map(|theme| theme.name.clone()) + pub fn list(&self, _staff: bool) -> impl Iterator + '_ { + self.themes.values().map(|theme| ThemeMeta { + name: theme.name.clone(), + appearance: theme.appearance(), + }) } pub fn get(&self, name: &str) -> Result> { diff --git a/crates/theme2/src/theme2.rs b/crates/theme2/src/theme2.rs index ff80b9f5f9a2820ece15a49aa9b7257d0be9b89d..cb3808d4f1bc1610485d9320e681e0b5a46248e8 100644 --- a/crates/theme2/src/theme2.rs +++ b/crates/theme2/src/theme2.rs @@ -31,6 +31,15 @@ pub enum Appearance { Dark, } +impl Appearance { + pub fn is_light(&self) -> bool { + match self { + Self::Light => true, + Self::Dark => false, + } + } +} + #[derive(Debug, PartialEq, Eq, Clone, Copy)] pub enum LoadThemes { /// Only load the base theme. diff --git a/crates/theme_selector2/src/theme_selector.rs b/crates/theme_selector2/src/theme_selector.rs index 8430f0698baa1db1b1e18c3747b6ed5f473436e8..2aa893b69cc8d479f5f5fd3c5493da61b22d0e1c 100644 --- a/crates/theme_selector2/src/theme_selector.rs +++ b/crates/theme_selector2/src/theme_selector.rs @@ -2,13 +2,13 @@ use feature_flags::FeatureFlagAppExt; use fs::Fs; use fuzzy::{match_strings, StringMatch, StringMatchCandidate}; use gpui::{ - actions, AppContext, DismissEvent, Div, EventEmitter, FocusableView, Render, SharedString, - View, ViewContext, VisualContext, WeakView, + actions, AppContext, DismissEvent, Div, EventEmitter, FocusableView, Render, View, ViewContext, + VisualContext, WeakView, }; use picker::{Picker, PickerDelegate}; use settings::{update_settings_file, SettingsStore}; use std::sync::Arc; -use theme::{Theme, ThemeRegistry, ThemeSettings}; +use theme::{Theme, ThemeMeta, ThemeRegistry, ThemeSettings}; use ui::{prelude::*, v_stack, ListItem}; use util::ResultExt; use workspace::{ui::HighlightedLabel, Workspace}; @@ -81,7 +81,7 @@ impl ThemeSelector { pub struct ThemeSelectorDelegate { fs: Arc, - theme_names: Vec, + themes: Vec, matches: Vec, original_theme: Arc, selection_completed: bool, @@ -99,21 +99,25 @@ impl ThemeSelectorDelegate { let staff_mode = cx.is_staff(); let registry = cx.global::(); - let theme_names = registry.list(staff_mode).collect::>(); - //todo!(theme sorting) - // theme_names.sort_unstable_by(|a, b| a.is_light.cmp(&b.is_light).then(a.name.cmp(&b.name))); - let matches = theme_names + let mut themes = registry.list(staff_mode).collect::>(); + themes.sort_unstable_by(|a, b| { + a.appearance + .is_light() + .cmp(&b.appearance.is_light()) + .then(a.name.cmp(&b.name)) + }); + let matches = themes .iter() .map(|meta| StringMatch { candidate_id: 0, score: 0.0, positions: Default::default(), - string: meta.to_string(), + string: meta.name.to_string(), }) .collect(); let mut this = Self { fs, - theme_names, + themes, matches, original_theme: original_theme.clone(), selected_index: 0, @@ -213,13 +217,13 @@ impl PickerDelegate for ThemeSelectorDelegate { ) -> gpui::Task<()> { let background = cx.background_executor().clone(); let candidates = self - .theme_names + .themes .iter() .enumerate() .map(|(id, meta)| StringMatchCandidate { id, - char_bag: meta.as_ref().into(), - string: meta.to_string(), + char_bag: meta.name.as_ref().into(), + string: meta.name.to_string(), }) .collect::>();