diff --git a/justfile b/justfile index 6097b90..19eb4cc 100644 --- a/justfile +++ b/justfile @@ -1,5 +1,7 @@ -iced-video: - cd crates/iced-video && cargo run --release --example minimal +jello: + cargo r -r -- -vv +# iced-video: +# cd crates/iced-video && cargo run --release --example minimal typegen: @echo "Generating jellyfin type definitions..." cd typegen && cargo run diff --git a/ui-iced/src/settings.rs b/ui-iced/src/settings.rs index 1db6d23..b27aabf 100644 --- a/ui-iced/src/settings.rs +++ b/ui-iced/src/settings.rs @@ -20,6 +20,12 @@ pub fn update(state: &mut State, message: SettingsMessage) -> Task { tracing::trace!("Switching settings screen to {:?}", screen); state.settings.screen = screen; } + SettingsMessage::User(user_msg) => { + state.settings.login_form.update(user_msg); + } + SettingsMessage::Server(server_msg) => { + state.settings.server_form.update(server_msg); + } } Task::none() } @@ -40,6 +46,28 @@ pub enum SettingsMessage { Open, Close, Select(SettingsScreen), + User(UserMessage), + Server(ServerMessage), +} + +#[derive(Debug, Clone)] +pub enum UserMessage { + Add, + UsernameChanged(String), + PasswordChanged(String), + // Edit(uuid::Uuid), + // Delete(uuid::Uuid), + Clear, +} + +#[derive(Debug, Clone)] +pub enum ServerMessage { + Add, + NameChanged(String), + UrlChanged(String), + // Edit(uuid::Uuid), + // Delete(uuid::Uuid), + Clear, } #[derive(Debug, Clone, Default)] @@ -66,14 +94,108 @@ pub struct UserItem { #[derive(Debug, Clone, Default)] pub struct LoginForm { - username: Option, - password: Option, + username: String, + password: String, +} + +impl LoginForm { + pub fn update(&mut self, message: UserMessage) { + match message { + UserMessage::UsernameChanged(data) => { + self.username = data; + } + UserMessage::PasswordChanged(data) => { + self.password = data; + } + UserMessage::Add => { + // Handle adding user + } + UserMessage::Clear => { + self.username.clear(); + self.password.clear(); + } + } + } + pub fn view(&self) -> Element<'_, Message> { + iced::widget::column![ + text("Login Form"), + text_input("Enter Username", &self.username).on_input(|data| { + Message::Settings(SettingsMessage::User(UserMessage::UsernameChanged(data))) + }), + text_input("Enter Password", &self.password) + .secure(true) + .on_input(|data| { + Message::Settings(SettingsMessage::User(UserMessage::PasswordChanged(data))) + }), + row![ + button(text("Add User")).on_press_maybe(self.validate()), + button(text("Cancel")) + .on_press(Message::Settings(SettingsMessage::User(UserMessage::Clear))), + ] + .spacing(10), + ] + .spacing(10) + .padding([10, 0]) + .into() + } + + pub fn validate(&self) -> Option { + (!self.username.is_empty() && !self.password.is_empty()) + .then(|| Message::Settings(SettingsMessage::User(UserMessage::Add))) + } } #[derive(Debug, Clone, Default)] pub struct ServerForm { - name: Option, - url: Option, + name: String, + url: String, +} + +impl ServerForm { + pub fn update(&mut self, message: ServerMessage) { + match message { + ServerMessage::NameChanged(data) => { + self.name = data; + } + ServerMessage::UrlChanged(data) => { + self.url = data; + } + ServerMessage::Add => { + // Handle adding server + } + ServerMessage::Clear => { + self.name.clear(); + self.url.clear(); + } + _ => {} + } + } + pub fn view(&self) -> Element<'_, Message> { + iced::widget::column![ + text("Add New Server"), + text_input("Enter server name", &self.name).on_input(|data| { + Message::Settings(SettingsMessage::Server(ServerMessage::NameChanged(data))) + }), + text_input("Enter server URL", &self.url).on_input(|data| { + Message::Settings(SettingsMessage::Server(ServerMessage::UrlChanged(data))) + }), + row![ + button(text("Add Server")).on_press_maybe(self.validate()), + button(text("Cancel")).on_press(Message::Settings(SettingsMessage::Server( + ServerMessage::Clear + ))), + ] + .spacing(10), + ] + .spacing(10) + .padding([10, 0]) + .into() + } + + pub fn validate(&self) -> Option { + (!self.name.is_empty() && !self.url.is_empty()) + .then(|| Message::Settings(SettingsMessage::Server(ServerMessage::Add))) + } } mod screens { @@ -109,7 +231,6 @@ mod screens { .map(|p| p.clip(true).width(Length::Fill).into()), ) .width(Length::FillPortion(2)) - // .max_width(Length::FillPortion(3)) .spacing(10) .padding(10), ) @@ -131,6 +252,7 @@ mod screens { container( Column::new() .push(text("Server Settings")) + .push(state.settings.server_form.view()) .push(toggler(false).label("Enable Server")) .spacing(20) .padding(20), @@ -141,7 +263,8 @@ mod screens { container( Column::new() .push(text("User Settings")) - .push(toggler(true).label("Enable User")) + .push(state.settings.login_form.view()) + // .push(userlist(&state)) .spacing(20) .padding(20), )