fonts and glowup

This commit is contained in:
2025-07-10 00:25:42 +02:00
parent 5fa8b88373
commit 7e97532442
15 changed files with 252 additions and 54 deletions

View File

@@ -8,30 +8,25 @@ mod message;
use message::Message;
mod utils;
use utils::str_to_sec;
use utils::{is_delta_format_valid, str_to_sec};
use std::fs;
use iced::Element;
use iced::widget::{TextInput, column, text};
use iced::{Application, Element, Font, font};
use iced::{
Color, Length, Task, Theme,
widget::{Column, button, canvas, container, pick_list, row, scrollable, slider},
};
use iced::{
Font,
widget::{
TextInput, column, text,
text_input::{Icon, Side},
},
};
use regex::Regex;
use std::f32::consts::PI;
use std::time::Instant;
use kira::{
AudioManager, AudioManagerSettings, DefaultBackend, sound::static_sound::StaticSoundData,
};
const FONT_BYTES: &[u8] = include_bytes!("../fonts/EnvyCodeRNerdFontMono-Regular.ttf");
const FONT: Font = Font::with_name("EnvyCodeR Nerd Font Mono");
use crate::utils::delta_to_string;
fn main() -> iced::Result {
@@ -55,6 +50,8 @@ fn main() -> iced::Result {
};
iced::application("My App", MyApp::update, MyApp::view)
.theme(move |_| polytheme.clone())
.font(FONT_BYTES)
.default_font(FONT)
.subscription(MyApp::subscription)
.run_with(MyApp::new)
}
@@ -69,12 +66,16 @@ struct MyApp {
all_saves: Vec<String>,
current_delta: f32,
str_music_length: String,
str_time: String,
}
impl MyApp {
fn new() -> (Self, Task<Message>) {
let manager = AudioManager::<DefaultBackend>::new(AudioManagerSettings::default())
.expect("Error to load AudioManager");
//let font_bytes = include_bytes!("../fonts/");
(
Self {
time_last_frame: Instant::now(),
@@ -86,6 +87,7 @@ impl MyApp {
music: Music::default(),
current_delta: 0.0,
str_music_length: "01:00:00".to_string(),
str_time: "00:00:00".to_string(),
},
Task::none(),
)
@@ -112,6 +114,7 @@ impl MyApp {
self.music
.apply_tick(self.current_delta, time_btw, &mut self.audio_manager);
self.time_last_frame = Instant::now();
self.str_time = delta_to_string(self.current_delta);
}
}
Message::Remove(i) => {
@@ -148,27 +151,33 @@ impl MyApp {
}
Message::ToggleSavePanel => self.show_save_panel = !self.show_save_panel,
Message::FileNameChanged(s) => self.music.file_name = s,
Message::LengthChange(s) => self.str_music_length = s,
Message::LengthChange(s) => {
if is_delta_format_valid(&s) {
let sec = str_to_sec(&s);
if sec > 0. {
self.music.length = sec;
}
}
self.str_music_length = s;
}
Message::TogglePaused => {
self.paused = !self.paused;
if !self.paused {
self.time_last_frame = Instant::now();
}
}
Message::SetMusicLength => {
if self.is_length_valid() {
self.music.length = str_to_sec(&self.str_music_length)
}
}
Message::ChangeDelta(f) => {
self.current_delta = f;
self.music.fix_teta(self.current_delta);
// update the red dot on canvas
if self.paused {
self.update(Message::TogglePaused);
self.update(Message::Tick);
self.update(Message::TogglePaused);
self.update_canvas_if_paused();
}
Message::ChangeDeltaString(s) => {
if is_delta_format_valid(&s) {
self.update(Message::ChangeDelta(str_to_sec(&s)));
}
self.str_time = s;
}
Message::AddPoint => {
self.music.add_point(self.current_delta);
@@ -179,6 +188,16 @@ impl MyApp {
Message::ClickedOnTimeLine(f) => {
self.update(Message::ChangeDelta(f));
}
Message::SlidePointLeft => {
self.music.slide_to_left(self.current_delta);
self.music.fix_teta(self.current_delta);
self.update_canvas_if_paused();
}
Message::SlidePointRight => {
self.music.slide_to_right(self.current_delta);
self.music.fix_teta(self.current_delta);
self.update_canvas_if_paused();
}
}
}
@@ -202,7 +221,7 @@ impl MyApp {
i += 1;
column![
row![
text(&polygon.name),
text(&polygon.name).font(FONT),
button("Remove").on_press(Message::Remove(i)),
pick_list(
["Black", "Blue", "Green", "Pink", "Yellow", "Cyan"]
@@ -270,24 +289,9 @@ impl MyApp {
save_panel.push(button("Load").on_press(Message::Load).into());
}
column![
text(&self.music.file_name).size(32.0),
text("Polymusic").size(32.0),
row(save_panel).spacing(20),
row![
text("Music Length").size(20),
TextInput::new("MM:SS:CS", &self.str_music_length)
.on_input(|new_value| Message::LengthChange(new_value))
.icon(Icon {
font: Font::DEFAULT,
code_point: if self.is_length_valid() {
'\u{2705}'
} else {
'\u{274C}'
},
size: None,
spacing: 10.,
side: Side::Left,
}),
button("Valid").on_press(Message::SetMusicLength),
text(txt_nb_rev).size(20),
button("Increment").on_press(Message::ButtonPressedIncrement),
button("Decrement").on_press(Message::ButtonPressedDecrement),
@@ -314,15 +318,19 @@ impl MyApp {
.spacing(20),
column![
row![
button("Toggle Play").on_press(Message::TogglePaused),
text(format!(
"{}/{}",
delta_to_string(self.current_delta),
delta_to_string(self.music.length)
))
.size(20.0),
button("Add Point").on_press(Message::AddPoint),
button("Remove Point").on_press(Message::RemovePoint),
button(text(if self.paused { "󰐊" } else { "󰏤" }).size(28))
.on_press(Message::TogglePaused),
TextInput::new("MM:SS:CS", &self.str_time)
.on_input(|new_value| Message::ChangeDeltaString(new_value))
.size(28),
text("/").size(30),
TextInput::new("MM:SS:CS", &self.str_music_length)
.on_input(|new_value| Message::LengthChange(new_value))
.size(28),
button(text("").size(28)).on_press(Message::AddPoint),
button(text("").size(28)).on_press(Message::RemovePoint),
button(text("").size(28)).on_press(Message::SlidePointLeft),
button(text("").size(28)).on_press(Message::SlidePointRight),
]
.spacing(20),
column![
@@ -346,16 +354,20 @@ impl MyApp {
.into()
}
fn is_length_valid(&self) -> bool {
let re = Regex::new(r"^\d{2}:\d{2}:\d{2}$").unwrap();
re.is_match(self.str_music_length.as_str())
}
fn subscription(&self) -> iced::Subscription<Message> {
iced::Subscription::batch([
//window::events().map(|(_id, event)| Message::WindowEvent(event)),
iced::time::every(std::time::Duration::from_millis(16)).map(|_| Message::Tick),
])
}
fn update_canvas_if_paused(&mut self) {
if self.paused {
self.update(Message::TogglePaused);
self.update(Message::Tick);
self.update(Message::TogglePaused);
}
}
}
fn load_path_sounds() -> Vec<String> {