mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 19:12:43 +00:00 
			
		
		
		
	Everywhere: Support overriding the system color scheme
This commit is contained in:
		
							parent
							
								
									fba0cee622
								
							
						
					
					
						commit
						e9e4baee77
					
				
					 15 changed files with 161 additions and 30 deletions
				
			
		|  | @ -11,6 +11,7 @@ | |||
| #include <Applications/DisplaySettings/ThemesSettingsGML.h> | ||||
| #include <LibCore/DirIterator.h> | ||||
| #include <LibGUI/Application.h> | ||||
| #include <LibGUI/CheckBox.h> | ||||
| #include <LibGUI/ConnectionToWindowServer.h> | ||||
| #include <LibGUI/ItemListModel.h> | ||||
| #include <LibGUI/MessageBox.h> | ||||
|  | @ -18,6 +19,11 @@ | |||
| 
 | ||||
| namespace DisplaySettings { | ||||
| 
 | ||||
| static DeprecatedString get_color_scheme_name_from_pathname(DeprecatedString const& color_scheme_path) | ||||
| { | ||||
|     return color_scheme_path.replace("/res/color-schemes/"sv, ""sv, ReplaceMode::FirstOnly).replace(".ini"sv, ""sv, ReplaceMode::FirstOnly); | ||||
| }; | ||||
| 
 | ||||
| ThemesSettingsWidget::ThemesSettingsWidget(bool& background_settings_changed) | ||||
|     : m_background_settings_changed { background_settings_changed } | ||||
| { | ||||
|  | @ -49,6 +55,47 @@ ThemesSettingsWidget::ThemesSettingsWidget(bool& background_settings_changed) | |||
|     m_themes_combo->set_selected_index(current_theme_index, GUI::AllowCallback::No); | ||||
| 
 | ||||
|     auto mouse_settings_icon = Gfx::Bitmap::load_from_file("/res/icons/16x16/app-mouse.png"sv).release_value_but_fixme_should_propagate_errors(); | ||||
| 
 | ||||
|     m_color_scheme_names.clear(); | ||||
|     Core::DirIterator iterator("/res/color-schemes", Core::DirIterator::SkipParentAndBaseDir); | ||||
|     while (iterator.has_next()) { | ||||
|         auto path = iterator.next_path(); | ||||
|         m_color_scheme_names.append(path.replace(".ini"sv, ""sv, ReplaceMode::FirstOnly)); | ||||
|     } | ||||
|     quick_sort(m_color_scheme_names); | ||||
|     auto& color_scheme_combo = *find_descendant_of_type_named<GUI::ComboBox>("color_scheme_combo"); | ||||
|     color_scheme_combo.set_only_allow_values_from_model(true); | ||||
|     color_scheme_combo.set_model(*GUI::ItemListModel<DeprecatedString>::create(m_color_scheme_names)); | ||||
|     m_selected_color_scheme_name = get_color_scheme_name_from_pathname(GUI::Widget::palette().color_scheme_path()); | ||||
|     auto selected_color_scheme_index = m_color_scheme_names.find_first_index(m_selected_color_scheme_name); | ||||
|     if (selected_color_scheme_index.has_value()) | ||||
|         color_scheme_combo.set_selected_index(selected_color_scheme_index.value()); | ||||
|     else { | ||||
|         color_scheme_combo.set_text("Custom"); | ||||
|         m_color_scheme_is_file_based = false; | ||||
|         if (m_color_scheme_names.size() > 1) { | ||||
|             color_scheme_combo.set_enabled(true); | ||||
|             find_descendant_of_type_named<GUI::CheckBox>("custom_color_scheme_checkbox")->set_checked(true); | ||||
|         } | ||||
|     } | ||||
|     color_scheme_combo.on_change = [this](auto&, const GUI::ModelIndex& index) { | ||||
|         m_selected_color_scheme_name = index.data().as_string(); | ||||
|         m_color_scheme_is_file_based = true; | ||||
|         set_modified(true); | ||||
|     }; | ||||
| 
 | ||||
|     find_descendant_of_type_named<GUI::CheckBox>("custom_color_scheme_checkbox")->on_checked = [this](bool) { | ||||
|         if (m_color_scheme_names.size() <= 1) | ||||
|             return; | ||||
| 
 | ||||
|         if (find_descendant_of_type_named<GUI::CheckBox>("custom_color_scheme_checkbox")->is_checked()) | ||||
|             find_descendant_of_type_named<GUI::ComboBox>("color_scheme_combo")->set_enabled(true); | ||||
|         else { | ||||
|             find_descendant_of_type_named<GUI::ComboBox>("color_scheme_combo")->set_enabled(false); | ||||
|             set_modified(true); | ||||
|         } | ||||
|     }; | ||||
| 
 | ||||
|     m_cursor_themes_button = *find_descendant_of_type_named<GUI::Button>("cursor_themes_button"); | ||||
|     m_cursor_themes_button->set_icon(mouse_settings_icon); | ||||
|     m_cursor_themes_button->on_click = [&](auto) { | ||||
|  | @ -82,8 +129,21 @@ ThemesSettingsWidget::ThemesSettingsWidget(bool& background_settings_changed) | |||
| 
 | ||||
| void ThemesSettingsWidget::apply_settings() | ||||
| { | ||||
|     if (m_selected_theme && m_selected_theme->name != GUI::ConnectionToWindowServer::the().get_system_theme()) | ||||
|         VERIFY(GUI::ConnectionToWindowServer::the().set_system_theme(m_selected_theme->path, m_selected_theme->name, m_background_settings_changed)); | ||||
|     Optional<DeprecatedString> color_scheme_path = DeprecatedString::formatted("/res/color-schemes/{}.ini", m_selected_color_scheme_name); | ||||
| 
 | ||||
|     if (!m_color_scheme_is_file_based && find_descendant_of_type_named<GUI::CheckBox>("custom_color_scheme_checkbox")->is_checked()) | ||||
|         VERIFY(GUI::ConnectionToWindowServer::the().set_system_theme(m_selected_theme->path, m_selected_theme->name, m_background_settings_changed, "Custom"sv)); | ||||
|     else if (find_descendant_of_type_named<GUI::CheckBox>("custom_color_scheme_checkbox")->is_checked()) | ||||
|         VERIFY(GUI::ConnectionToWindowServer::the().set_system_theme(m_selected_theme->path, m_selected_theme->name, m_background_settings_changed, color_scheme_path)); | ||||
|     else { | ||||
|         VERIFY(GUI::ConnectionToWindowServer::the().set_system_theme(m_selected_theme->path, m_selected_theme->name, m_background_settings_changed, OptionalNone())); | ||||
|         // Update the color scheme combobox to match the new theme.
 | ||||
|         auto const theme_config = Core::ConfigFile::open(m_selected_theme->path).release_value_but_fixme_should_propagate_errors(); | ||||
|         auto const color_scheme_index = m_color_scheme_names.find_first_index(get_color_scheme_name_from_pathname(theme_config->read_entry("Paths", "ColorScheme"))); | ||||
|         if (color_scheme_index.has_value()) | ||||
|             find_descendant_of_type_named<GUI::ComboBox>("color_scheme_combo")->set_selected_index(color_scheme_index.value()); | ||||
|     } | ||||
| 
 | ||||
|     m_background_settings_changed = false; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 implicitfield
						implicitfield