Use specified colors for textboxes

This commit is contained in:
p11 2025-07-21 11:07:17 +02:00
parent 447df9d9ea
commit 40b88cefff
3 changed files with 36 additions and 4 deletions

1
Cargo.lock generated
View File

@ -260,6 +260,7 @@ dependencies = [
"multilinear-parser", "multilinear-parser",
"percent-encoding", "percent-encoding",
"pukram2html", "pukram2html",
"simple-color",
"threadpool", "threadpool",
"vn-settings", "vn-settings",
] ]

View File

@ -4,6 +4,7 @@ version = "0.1.0"
edition = "2024" edition = "2024"
[dependencies] [dependencies]
simple-color = "0.2.3"
percent-encoding = "2.3" percent-encoding = "2.3"
maud = "0.27.0" maud = "0.27.0"
pukram2html = "0.3.0" pukram2html = "0.3.0"

View File

@ -13,6 +13,7 @@ use maud::{Markup, html};
use multilinear::{BorrowedMultilinearSimulation, Event}; use multilinear::{BorrowedMultilinearSimulation, Event};
use multilinear_parser::{MultilinearParser, NamedMultilinearInfo}; use multilinear_parser::{MultilinearParser, NamedMultilinearInfo};
use pukram2html::convert; use pukram2html::convert;
use simple_color::Color;
use vn_settings::{Change, Parameter, PlayerSettings, SettingsContext, extract_layers}; use vn_settings::{Change, Parameter, PlayerSettings, SettingsContext, extract_layers};
use crate::dialog::parse_map; use crate::dialog::parse_map;
@ -72,18 +73,47 @@ fn render_choice(block: &DialogBlock<Parameter>, index: usize, progress: &str) -
} }
} }
fn render_dialog_block(block: &DialogBlock<Parameter>) -> Markup { fn rgba_string(color: Color) -> String {
format!(
"rgba({}, {}, {}, {})",
color.r,
color.g,
color.b,
color.a as f32 / 255.0
)
}
fn render_dialog_block(settings: &PlayerSettings, block: &DialogBlock<Parameter>) -> Markup {
if block.lines.is_empty() { if block.lines.is_empty() {
return html! {}; return html! {};
} }
let text_fill_color = rgba_string(settings.colors.dialog_box.text_fill.get(&block.name));
let text_line_color = rgba_string(settings.colors.dialog_box.text_line.get(&block.name));
let name_fill_color = rgba_string(settings.colors.dialog_box.name_fill.get(&block.name));
let name_line_color = rgba_string(settings.colors.dialog_box.name_line.get(&block.name));
let mut content = Vec::new(); let mut content = Vec::new();
convert(block.lines.iter().map(|l| l.text.as_ref()), &mut content); convert(block.lines.iter().map(|l| l.text.as_ref()), &mut content);
html! { html! {
fieldset .visual-novel-box onclick="playCurrentAudio()" { fieldset .visual-novel-box onclick="playCurrentAudio()"
style=(format!(
"background: {}; border-color: {}; color: {};",
text_fill_color,
text_line_color,
text_line_color,
)) {
@if !block.name.is_empty() { @if !block.name.is_empty() {
legend .character-name { (block.name) } legend .character-name
style=(format!(
"background: {}; border-color: {}; color: {};",
name_fill_color,
name_line_color,
name_line_color,
)) {
(block.name)
}
} }
div .dialog-content { div .dialog-content {
@match String::from_utf8(content) { @match String::from_utf8(content) {
@ -449,7 +479,7 @@ fn process_dialog(
sections.push(html! { sections.push(html! {
(render_scene(player_settings, &block.name)) (render_scene(player_settings, &block.name))
(render_dialog_block(block)) (render_dialog_block(player_settings, block))
audio { audio {
source src=(format!("/{base_path}.{}.mp3", start_index + i)) type="audio/mpeg"; source src=(format!("/{base_path}.{}.mp3", start_index + i)) type="audio/mpeg";
} }