palette selector improvements

This commit is contained in:
galister 2026-07-13 19:53:09 +09:00
parent 952b6e10b6
commit fd8a327395
13 changed files with 78 additions and 27 deletions

View File

@ -1,8 +1,8 @@
<layout> <layout>
<!-- id, text --> <!-- id, text -->
<template name="ColorPaletteButton"> <template name="ColorPaletteButton">
<Button id="${id}" width="350" flex_direction="column" justify_content="space_around" <Button id="${id}" width="350" flex_direction="column" justify_content="space_around" tooltip="${tooltip}" tooltip_side="bottom"
color="${background}" hover_color="${background_variant}" border_color="${outline}" hover_border_color="${highlight}" padding="16" > color="${background}" hover_color="${background_variant}" border_color="${outline}" hover_border_color="${highlight}" padding="16" margin="4" >
<label text="${text}" size="24" weight="bold" color="${on_background}" parent_color="ignore"/> <label text="${text}" size="24" weight="bold" color="${on_background}" parent_color="ignore"/>
<div flex_direction="row" width="100%" justify_content="space_evenly" padding_top="16" > <div flex_direction="row" width="100%" justify_content="space_evenly" padding_top="16" >
<rectangle round="100%" width="32" height="32" color="${primary}" border="2" border_color="${on_primary}" /> <rectangle round="100%" width="32" height="32" color="${primary}" border="2" border_color="${on_primary}" />

View File

@ -185,7 +185,12 @@
"WHISPER_MODEL_HELP": "Zu verwendendes Whisper-Modell.\nGrößere Modelle liefern genauere\nErgebnisse, verbrauchen jedoch mehr VRAM.", "WHISPER_MODEL_HELP": "Zu verwendendes Whisper-Modell.\nGrößere Modelle liefern genauere\nErgebnisse, verbrauchen jedoch mehr VRAM.",
"DEFAULT_OVERLAY_SCALE": "Standardgröße des Overlays", "DEFAULT_OVERLAY_SCALE": "Standardgröße des Overlays",
"DEFAULT_OVERLAY_SCALE_HELP": "Neue Overlays werden in dieser Skalierung erstellt.", "DEFAULT_OVERLAY_SCALE_HELP": "Neue Overlays werden in dieser Skalierung erstellt.",
"COLOR_PALETTE": "Farbpalette" "COLOR_PALETTE": "Farbpalette",
"COLOR_PALETTES": "Farbpaletten",
"COLOR_PALETTE_CURRENT": "Derzeit aktives Thema.",
"COLOR_PALETTE_ACTIVATE": "Klicken Sie hier, um dieses Thema zu verwenden.",
"APPLY_CHANGES_RESTART": "WayVR neu starten, um die Änderungen zu übernehmen?",
"COLOR_PALETTE_HELP": "Klicken, um Farbpaletten zu durchsuchen.\nUm eigene zu erstellen, besuche die Webseite!"
}, },
"HELLO": "Hallo!", "HELLO": "Hallo!",
"AUDIO": { "AUDIO": {

View File

@ -97,7 +97,10 @@
"CAPTURE_METHOD_HELP": "Try changing this if you are\nexperiencing black or glitchy screens", "CAPTURE_METHOD_HELP": "Try changing this if you are\nexperiencing black or glitchy screens",
"COLOR_KEYING": "Color keying", "COLOR_KEYING": "Color keying",
"COLOR_PALETTE": "Color palette", "COLOR_PALETTE": "Color palette",
"COLOR_PALETTE_HELP": "Click to browse color palettes.\nTo create custom ones, see website!",
"COLOR_PALETTES": "Color palettes", "COLOR_PALETTES": "Color palettes",
"COLOR_PALETTE_CURRENT": "Currently active theme.",
"COLOR_PALETTE_ACTIVATE": "Click to use this theme.",
"APPLY_CHANGES_RESTART": "Restart WayVR to apply changes?", "APPLY_CHANGES_RESTART": "Restart WayVR to apply changes?",
"CLEAR_PIPEWIRE_TOKENS": "Clear PipeWire tokens", "CLEAR_PIPEWIRE_TOKENS": "Clear PipeWire tokens",
"CLEAR_PIPEWIRE_TOKENS_HELP": "Prompt for screen selection on next start", "CLEAR_PIPEWIRE_TOKENS_HELP": "Prompt for screen selection on next start",

View File

@ -185,7 +185,12 @@
"WHISPER_MODEL_HELP": "Modelo de Whisper a utilizar.\nLos modelos más grandes producen\nresultados más precisos, pero consumen más VRAM.", "WHISPER_MODEL_HELP": "Modelo de Whisper a utilizar.\nLos modelos más grandes producen\nresultados más precisos, pero consumen más VRAM.",
"DEFAULT_OVERLAY_SCALE": "Tamaño de la superposición predeterminado", "DEFAULT_OVERLAY_SCALE": "Tamaño de la superposición predeterminado",
"DEFAULT_OVERLAY_SCALE_HELP": "Genera nuevas capas de superposición con esta escala.", "DEFAULT_OVERLAY_SCALE_HELP": "Genera nuevas capas de superposición con esta escala.",
"COLOR_PALETTE": "Paleta de colores" "COLOR_PALETTE": "Paleta de colores",
"COLOR_PALETTES": "Paletas de colores",
"COLOR_PALETTE_CURRENT": "Tema actualmente activo.",
"COLOR_PALETTE_ACTIVATE": "Haz clic para usar este tema.",
"APPLY_CHANGES_RESTART": "¿Reiniciar WayVR para aplicar los cambios?",
"COLOR_PALETTE_HELP": "Haz clic para explorar paletas de colores.\nPara crear paletas personalizadas, ¡visita el sitio web!"
}, },
"HELLO": "¡Hola!", "HELLO": "¡Hola!",
"AUDIO": { "AUDIO": {

View File

@ -206,7 +206,12 @@
"WHISPER_MODEL_HELP": "Modello Whisper da utilizzare.\nI modelli più grandi producono risultati\npiù accurati, ma consumano più VRAM.", "WHISPER_MODEL_HELP": "Modello Whisper da utilizzare.\nI modelli più grandi producono risultati\npiù accurati, ma consumano più VRAM.",
"DEFAULT_OVERLAY_SCALE": "Dimensioni overlay predefinite", "DEFAULT_OVERLAY_SCALE": "Dimensioni overlay predefinite",
"DEFAULT_OVERLAY_SCALE_HELP": "Genera nuovi overlay con questa scala.", "DEFAULT_OVERLAY_SCALE_HELP": "Genera nuovi overlay con questa scala.",
"COLOR_PALETTE": "Tavolozza colori" "COLOR_PALETTE": "Tavolozza colori",
"COLOR_PALETTES": "Tavolozze colori",
"COLOR_PALETTE_CURRENT": "Tema attualmente attivo.",
"COLOR_PALETTE_ACTIVATE": "Clicca per usare questo tema.",
"APPLY_CHANGES_RESTART": "Riavviare WayVR per applicare le modifiche?",
"COLOR_PALETTE_HELP": "Clicca per sfogliare le palette di colori.\nPer crearne di personalizzate, visita il sito web!"
}, },
"APPLICATION_LAUNCHER": "Lanciatore applicazioni", "APPLICATION_LAUNCHER": "Lanciatore applicazioni",
"APPLICATION_STARTED": "Applicazione avviata", "APPLICATION_STARTED": "Applicazione avviata",

View File

@ -185,7 +185,12 @@
"WHISPER_MODEL_HELP": "使用するWhisperモデル。\nモデルが大きいほど精度は向上しますが、\nVRAMの消費量が増加します。", "WHISPER_MODEL_HELP": "使用するWhisperモデル。\nモデルが大きいほど精度は向上しますが、\nVRAMの消費量が増加します。",
"DEFAULT_OVERLAY_SCALE": "デフォルトのオーバーレイサイズ", "DEFAULT_OVERLAY_SCALE": "デフォルトのオーバーレイサイズ",
"DEFAULT_OVERLAY_SCALE_HELP": "新しいオーバーレイをこのスケールで生成します。", "DEFAULT_OVERLAY_SCALE_HELP": "新しいオーバーレイをこのスケールで生成します。",
"COLOR_PALETTE": "カラーパレット" "COLOR_PALETTE": "カラーパレット",
"COLOR_PALETTES": "カラーパレット",
"COLOR_PALETTE_CURRENT": "現在有効なテーマ。",
"COLOR_PALETTE_ACTIVATE": "クリックしてこのテーマを適用します。",
"APPLY_CHANGES_RESTART": "変更を適用するためにWayVRを再起動しますか",
"COLOR_PALETTE_HELP": "クリックしてカラーパレットを選択してください。\nカスタムパレットの作成については、ウェブサイトを参照してください"
}, },
"HELLO": "こんにちは!", "HELLO": "こんにちは!",
"AUDIO": { "AUDIO": {

View File

@ -180,7 +180,12 @@
"WHISPER_MODEL_HELP": "Model Whisper do wykorzystania.\nWiększe modele dają dokładniejsze\nwyniki, ale zużywają więcej pamięci VRAM.", "WHISPER_MODEL_HELP": "Model Whisper do wykorzystania.\nWiększe modele dają dokładniejsze\nwyniki, ale zużywają więcej pamięci VRAM.",
"DEFAULT_OVERLAY_SCALE": "Domyślny rozmiar nakładki", "DEFAULT_OVERLAY_SCALE": "Domyślny rozmiar nakładki",
"DEFAULT_OVERLAY_SCALE_HELP": "Twórz nowe nakładki w tej skali.", "DEFAULT_OVERLAY_SCALE_HELP": "Twórz nowe nakładki w tej skali.",
"COLOR_PALETTE": "Paleta kolorów" "COLOR_PALETTE": "Paleta kolorów",
"COLOR_PALETTES": "Palety kolorów",
"COLOR_PALETTE_CURRENT": "Obecnie aktywny motyw.",
"COLOR_PALETTE_ACTIVATE": "Kliknij, aby użyć tego motywu.",
"APPLY_CHANGES_RESTART": "Zrestartować WayVR, aby zastosować zmiany?",
"COLOR_PALETTE_HELP": "Kliknij, aby przeglądać palety kolorów.\nAby stworzyć własne, odwiedź stronę internetową!"
}, },
"APPLICATION_LAUNCHER": "Uruchamiacz aplikacji", "APPLICATION_LAUNCHER": "Uruchamiacz aplikacji",
"APPLICATIONS": "Aplikacje", "APPLICATIONS": "Aplikacje",

View File

@ -206,7 +206,12 @@
"WHISPER_MODEL_HELP": "要使用的 Whisper 模型。\n模型越大结果越准确\n但消耗的显存 (VRAM) 越多。", "WHISPER_MODEL_HELP": "要使用的 Whisper 模型。\n模型越大结果越准确\n但消耗的显存 (VRAM) 越多。",
"DEFAULT_OVERLAY_SCALE": "默认叠加层大小", "DEFAULT_OVERLAY_SCALE": "默认叠加层大小",
"DEFAULT_OVERLAY_SCALE_HELP": "以该比例生成新的叠加层。", "DEFAULT_OVERLAY_SCALE_HELP": "以该比例生成新的叠加层。",
"COLOR_PALETTE": "调色板" "COLOR_PALETTE": "调色板",
"COLOR_PALETTES": "配色方案",
"COLOR_PALETTE_CURRENT": "当前激活的主题。",
"COLOR_PALETTE_ACTIVATE": "点击以使用此主题。",
"APPLY_CHANGES_RESTART": "重启 WayVR 以应用更改吗?",
"COLOR_PALETTE_HELP": "点击浏览配色方案。\n如需创建自定义配色请参阅网站"
}, },
"APPLICATION_LAUNCHER": "应用启动器", "APPLICATION_LAUNCHER": "应用启动器",
"APPLICATION_STARTED": "应用已启动", "APPLICATION_STARTED": "应用已启动",

View File

@ -43,7 +43,7 @@ mod tab_space_drag;
mod tab_troubleshooting; mod tab_troubleshooting;
#[derive(Clone)] #[derive(Clone)]
enum TabNameEnum { pub(crate) enum TabNameEnum {
AutostartApps, AutostartApps,
Controls, Controls,
Features, Features,
@ -291,7 +291,7 @@ impl<T> Tab<T> for TabSettings<T> {
// Sorted alphabetically // Sorted alphabetically
#[allow(clippy::enum_variant_names)] #[allow(clippy::enum_variant_names)]
#[derive(Clone, Copy, Eq, PartialEq, AsRefStr, EnumString)] #[derive(Clone, Copy, Eq, PartialEq, AsRefStr, EnumString)]
enum SettingType { pub(crate) enum SettingType {
AllowSliding, AllowSliding,
BlockGameInput, BlockGameInput,
BlockGameInputIgnoreWatch, BlockGameInputIgnoreWatch,

View File

@ -44,6 +44,7 @@ impl SettingsTab for State {
self.globals.clone(), self.globals.clone(),
self.popup_color_palettes.clone(), self.popup_color_palettes.clone(),
self.settings_tasks.clone(), self.settings_tasks.clone(),
par.general_config.color_palette.clone(),
); );
} }
} }

View File

@ -2,7 +2,6 @@ use std::{marker::PhantomData, rc::Rc};
use wgui::{ use wgui::{
assets::AssetPath, assets::AssetPath,
color::WguiColorName,
components::button::ComponentButton, components::button::ComponentButton,
globals::WguiGlobals, globals::WguiGlobals,
layout::{Layout, WidgetID}, layout::{Layout, WidgetID},

View File

@ -1,4 +1,4 @@
use std::rc::Rc; use std::{rc::Rc, sync::Arc};
use wgui::{ use wgui::{
assets::AssetPath, assets::AssetPath,
color::WguiColorName, color::WguiColorName,
@ -32,6 +32,7 @@ pub struct Params<'a> {
pub parent_id: WidgetID, pub parent_id: WidgetID,
pub frontend_tasks: &'a FrontendTasks, pub frontend_tasks: &'a FrontendTasks,
pub settings_tasks: Tasks<SettingsTask>, pub settings_tasks: Tasks<SettingsTask>,
pub current_palette: Arc<str>,
} }
pub struct View { pub struct View {
@ -40,6 +41,7 @@ pub struct View {
globals: WguiGlobals, globals: WguiGlobals,
popup_dialog: PopupHolder<views::dialog_box::View>, popup_dialog: PopupHolder<views::dialog_box::View>,
settings_tasks: Tasks<SettingsTask>, settings_tasks: Tasks<SettingsTask>,
chosen_palette: Option<Arc<str>>,
} }
impl ViewTrait for View { impl ViewTrait for View {
@ -49,9 +51,7 @@ impl ViewTrait for View {
for task in self.tasks.drain() { for task in self.tasks.drain() {
match task { match task {
Task::SelectPalette(profile) => { Task::SelectPalette(profile) => {
par.general_config.color_palette = profile.into(); self.chosen_palette = Some(profile.into());
par.config_change_kind.replace(ConfigChangeKind::WguiThemeChange);
self.show_restart_dialog_box()?; self.show_restart_dialog_box()?;
} }
Task::Cancel => { Task::Cancel => {
@ -59,6 +59,11 @@ impl ViewTrait for View {
close_dialog(); close_dialog();
} }
Task::Restart => { Task::Restart => {
if let Some(palette) = self.chosen_palette.take() {
par.general_config.color_palette = palette;
par.config_change_kind.replace(ConfigChangeKind::WguiThemeChange);
}
self.settings_tasks.push(SettingsTask::RestartSoftware); self.settings_tasks.push(SettingsTask::RestartSoftware);
} }
} }
@ -74,13 +79,12 @@ macro_rules! insert_colors {
$( $key:literal => $color:ident ),* $(,)? $( $key:literal => $color:ident ),* $(,)?
) => { ) => {
$( $(
$params.insert( $params.insert_str(
$key, $key,
WguiColorName::$color WguiColorName::$color
.to_wgui_color() .to_wgui_color()
.resolve($palette) .resolve($palette)
.to_hex() .to_hex()
.as_str()
); );
)* )*
}; };
@ -103,10 +107,19 @@ impl View {
for (idx, (name, palette)) in PALETTES.iter().enumerate() { for (idx, (name, palette)) in PALETTES.iter().enumerate() {
let id = format!("profile_btn_{idx}"); let id = format!("profile_btn_{idx}");
let is_current = &*params.current_palette == *name;
let mut cell_params = TemplateParams::new(); let mut cell_params = TemplateParams::new();
cell_params.insert("id", &id); cell_params.insert("id", &id);
cell_params.insert("text", name);
if is_current {
cell_params.insert_str("text", format!("{name}"));
cell_params.insert("tooltip", "APP_SETTINGS.COLOR_PALETTE_CURRENT");
} else {
cell_params.insert("text", name);
cell_params.insert("tooltip", "APP_SETTINGS.COLOR_PALETTE_ACTIVATE");
}
insert_colors!( insert_colors!(
cell_params, cell_params,
palette, palette,
@ -133,14 +146,16 @@ impl View {
cell_params, cell_params,
)?; )?;
let btn = parser_state.fetch_component_as::<ComponentButton>(&id)?; if !is_current {
let tasks_clone = tasks.clone(); let btn = parser_state.fetch_component_as::<ComponentButton>(&id)?;
btn.on_click(Rc::new({ let tasks_clone = tasks.clone();
move |_common, _e| { btn.on_click(Rc::new({
tasks_clone.push(Task::SelectPalette(name.to_string())); move |_common, _e| {
Ok(()) tasks_clone.push(Task::SelectPalette(name.to_string()));
} Ok(())
})); }
}));
}
} }
Ok(Self { Ok(Self {
@ -149,6 +164,7 @@ impl View {
globals: params.globals.clone(), globals: params.globals.clone(),
popup_dialog, popup_dialog,
settings_tasks: params.settings_tasks, settings_tasks: params.settings_tasks,
chosen_palette: None,
}) })
} }
@ -197,6 +213,7 @@ pub fn mount_popup(
globals: WguiGlobals, globals: WguiGlobals,
popup: PopupHolder<View>, popup: PopupHolder<View>,
settings_tasks: Tasks<SettingsTask>, settings_tasks: Tasks<SettingsTask>,
current_palette: Arc<str>,
) { ) {
frontend_tasks frontend_tasks
.clone() .clone()
@ -209,6 +226,7 @@ pub fn mount_popup(
parent_id: data.id_content, parent_id: data.id_content,
frontend_tasks: &frontend_tasks, frontend_tasks: &frontend_tasks,
settings_tasks, settings_tasks,
current_palette,
})?; })?;
popup.set_view(data.handle, view, None); popup.set_view(data.handle, view, None);

View File

@ -1,6 +1,6 @@
use std::{cell::RefCell, rc::Rc}; use std::{cell::RefCell, rc::Rc};
use cosmic_text::{Attrs, AttrsList, BorrowedWithFontSystem, Buffer, Metrics, Scroll, Shaping, Wrap}; use cosmic_text::{Attrs, AttrsList, BorrowedWithFontSystem, Buffer, Metrics, Shaping, Wrap};
use slotmap::Key; use slotmap::Key;
use taffy::AvailableSpace; use taffy::AvailableSpace;