feat(settings): implement user and server form handling with update functions and UI views
This commit is contained in:
6
justfile
6
justfile
@@ -1,5 +1,7 @@
|
|||||||
iced-video:
|
jello:
|
||||||
cd crates/iced-video && cargo run --release --example minimal
|
cargo r -r -- -vv
|
||||||
|
# iced-video:
|
||||||
|
# cd crates/iced-video && cargo run --release --example minimal
|
||||||
typegen:
|
typegen:
|
||||||
@echo "Generating jellyfin type definitions..."
|
@echo "Generating jellyfin type definitions..."
|
||||||
cd typegen && cargo run
|
cd typegen && cargo run
|
||||||
|
|||||||
@@ -20,6 +20,12 @@ pub fn update(state: &mut State, message: SettingsMessage) -> Task<Message> {
|
|||||||
tracing::trace!("Switching settings screen to {:?}", screen);
|
tracing::trace!("Switching settings screen to {:?}", screen);
|
||||||
state.settings.screen = 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()
|
Task::none()
|
||||||
}
|
}
|
||||||
@@ -40,6 +46,28 @@ pub enum SettingsMessage {
|
|||||||
Open,
|
Open,
|
||||||
Close,
|
Close,
|
||||||
Select(SettingsScreen),
|
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)]
|
#[derive(Debug, Clone, Default)]
|
||||||
@@ -66,14 +94,108 @@ pub struct UserItem {
|
|||||||
|
|
||||||
#[derive(Debug, Clone, Default)]
|
#[derive(Debug, Clone, Default)]
|
||||||
pub struct LoginForm {
|
pub struct LoginForm {
|
||||||
username: Option<String>,
|
username: String,
|
||||||
password: Option<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<Message> {
|
||||||
|
(!self.username.is_empty() && !self.password.is_empty())
|
||||||
|
.then(|| Message::Settings(SettingsMessage::User(UserMessage::Add)))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Default)]
|
#[derive(Debug, Clone, Default)]
|
||||||
pub struct ServerForm {
|
pub struct ServerForm {
|
||||||
name: Option<String>,
|
name: String,
|
||||||
url: Option<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<Message> {
|
||||||
|
(!self.name.is_empty() && !self.url.is_empty())
|
||||||
|
.then(|| Message::Settings(SettingsMessage::Server(ServerMessage::Add)))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mod screens {
|
mod screens {
|
||||||
@@ -109,7 +231,6 @@ mod screens {
|
|||||||
.map(|p| p.clip(true).width(Length::Fill).into()),
|
.map(|p| p.clip(true).width(Length::Fill).into()),
|
||||||
)
|
)
|
||||||
.width(Length::FillPortion(2))
|
.width(Length::FillPortion(2))
|
||||||
// .max_width(Length::FillPortion(3))
|
|
||||||
.spacing(10)
|
.spacing(10)
|
||||||
.padding(10),
|
.padding(10),
|
||||||
)
|
)
|
||||||
@@ -131,6 +252,7 @@ mod screens {
|
|||||||
container(
|
container(
|
||||||
Column::new()
|
Column::new()
|
||||||
.push(text("Server Settings"))
|
.push(text("Server Settings"))
|
||||||
|
.push(state.settings.server_form.view())
|
||||||
.push(toggler(false).label("Enable Server"))
|
.push(toggler(false).label("Enable Server"))
|
||||||
.spacing(20)
|
.spacing(20)
|
||||||
.padding(20),
|
.padding(20),
|
||||||
@@ -141,7 +263,8 @@ mod screens {
|
|||||||
container(
|
container(
|
||||||
Column::new()
|
Column::new()
|
||||||
.push(text("User Settings"))
|
.push(text("User Settings"))
|
||||||
.push(toggler(true).label("Enable User"))
|
.push(state.settings.login_form.view())
|
||||||
|
// .push(userlist(&state))
|
||||||
.spacing(20)
|
.spacing(20)
|
||||||
.padding(20),
|
.padding(20),
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user