fonts and glowup
This commit is contained in:
112
src/main.rs
112
src/main.rs
@@ -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> {
|
||||
|
||||
@@ -13,10 +13,12 @@ pub enum Message {
|
||||
Load,
|
||||
FileNameChanged(String),
|
||||
TogglePaused,
|
||||
SetMusicLength,
|
||||
LengthChange(String),
|
||||
ChangeDelta(f32),
|
||||
AddPoint,
|
||||
RemovePoint,
|
||||
ClickedOnTimeLine(f32),
|
||||
ChangeDeltaString(String),
|
||||
SlidePointLeft,
|
||||
SlidePointRight,
|
||||
}
|
||||
|
||||
18
src/music.rs
18
src/music.rs
@@ -18,6 +18,7 @@ use iced::widget::canvas::Stroke;
|
||||
use iced::widget::canvas::Style;
|
||||
use iced::{Color, Rectangle, Renderer, Theme};
|
||||
use std::f32::consts::PI;
|
||||
use std::mem::swap;
|
||||
use std::time::Duration;
|
||||
#[derive(Serialize, Deserialize)]
|
||||
pub struct Music {
|
||||
@@ -156,6 +157,21 @@ impl Music {
|
||||
pub fn remove_polygon(&mut self, delta: f32, i: usize) {
|
||||
self.find_poly_frame(delta).polygons.remove(i);
|
||||
}
|
||||
|
||||
pub fn slide_to_left(&mut self, delta: f32) {
|
||||
let i = self.find_index_frame(delta);
|
||||
if i > 0 {
|
||||
let (left, right) = self.poly_frame.split_at_mut(i);
|
||||
swap(&mut left[i - 1].1, &mut right[0].1);
|
||||
}
|
||||
}
|
||||
pub fn slide_to_right(&mut self, delta: f32) {
|
||||
let i = self.find_index_frame(delta);
|
||||
if i < self.poly_frame.len() - 1 {
|
||||
let (left, right) = self.poly_frame.split_at_mut(i + 1);
|
||||
swap(&mut left[i].1, &mut right[0].1);
|
||||
}
|
||||
}
|
||||
}
|
||||
impl canvas::Program<Message> for Music {
|
||||
// No internal state
|
||||
@@ -171,7 +187,7 @@ impl canvas::Program<Message> for Music {
|
||||
) -> Vec<canvas::Geometry> {
|
||||
let mut geo_small_frame: Vec<Geometry> = vec![];
|
||||
let mut geo_cursor: Vec<Geometry> = vec![];
|
||||
let mut frame = canvas::Frame::new(renderer, bounds.size());
|
||||
let frame = canvas::Frame::new(renderer, bounds.size());
|
||||
let mut toggle_color = true;
|
||||
let padding = 8.;
|
||||
let w = bounds.width - (padding * 2.);
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
use crate::Polygon;
|
||||
use iced::Color;
|
||||
use kira::sound::static_sound::StaticSoundData;
|
||||
use regex::Regex;
|
||||
|
||||
pub fn is_delta_format_valid(str: &str) -> bool {
|
||||
let re = Regex::new(r"^\d{1,2}:\d{1,2}:\d{1,2}$").unwrap();
|
||||
re.is_match(str)
|
||||
}
|
||||
pub fn string_to_color<S: AsRef<str>>(s: S) -> Color {
|
||||
match s.as_ref() {
|
||||
"Green" => Color::from_rgb(0.0, 1.0, 0.0),
|
||||
|
||||
Reference in New Issue
Block a user