feat: Move settings to a tab based ui
This commit is contained in:
@@ -21,9 +21,10 @@ iced = { workspace = true, features = [
|
||||
|
||||
|
||||
iced-video = { workspace = true }
|
||||
iced_aw = "0.13.0"
|
||||
iced_wgpu = "0.14.0"
|
||||
iced_winit = "0.14.0"
|
||||
reqwest = "0.12.24"
|
||||
reqwest = "0.13"
|
||||
tap = "1.0.1"
|
||||
toml = "0.9.8"
|
||||
tracing = "0.1.41"
|
||||
|
||||
@@ -158,8 +158,6 @@ impl State {
|
||||
query: None,
|
||||
screen: Screen::Home,
|
||||
settings: settings::SettingsState::default(),
|
||||
// username_input: String::new(),
|
||||
// password_input: String::new(),
|
||||
is_authenticated: false,
|
||||
video: None,
|
||||
}
|
||||
@@ -175,17 +173,8 @@ pub enum Message {
|
||||
OpenItem(Option<uuid::Uuid>),
|
||||
LoadedItem(Option<uuid::Uuid>, Vec<Item>),
|
||||
Error(String),
|
||||
SetToken(String),
|
||||
Back,
|
||||
Home,
|
||||
// Login {
|
||||
// username: String,
|
||||
// password: String,
|
||||
// config: api::JellyfinConfig,
|
||||
// },
|
||||
// LoginSuccess(String),
|
||||
// LoadedClient(api::JellyfinClient, bool),
|
||||
// Logout,
|
||||
Video(video::VideoMessage),
|
||||
}
|
||||
|
||||
@@ -252,15 +241,6 @@ fn update(state: &mut State, message: Message) -> Task<Message> {
|
||||
state.messages.push(err);
|
||||
Task::none()
|
||||
}
|
||||
Message::SetToken(token) => {
|
||||
tracing::info!("Authenticated with token: {}", token);
|
||||
state
|
||||
.jellyfin_client
|
||||
.as_mut()
|
||||
.map(|mut client| client.set_token(token));
|
||||
state.is_authenticated = true;
|
||||
Task::none()
|
||||
}
|
||||
Message::Back => {
|
||||
state.current = state.history.pop().unwrap_or(None);
|
||||
Task::none()
|
||||
@@ -271,7 +251,6 @@ fn update(state: &mut State, message: Message) -> Task<Message> {
|
||||
}
|
||||
Message::SearchQueryChanged(query) => {
|
||||
state.query = Some(query);
|
||||
// Handle search query change
|
||||
Task::none()
|
||||
}
|
||||
Message::Search => {
|
||||
@@ -350,19 +329,17 @@ fn body(state: &State) -> Element<'_, Message> {
|
||||
|
||||
fn header(state: &State) -> Element<'_, Message> {
|
||||
row([
|
||||
container(
|
||||
Button::new(
|
||||
Text::new(
|
||||
state
|
||||
.jellyfin_client
|
||||
.as_ref()
|
||||
.map(|c| c.config.server_url.as_str())
|
||||
.unwrap_or("No Server"),
|
||||
)
|
||||
.align_x(Alignment::Start),
|
||||
)
|
||||
.on_press(Message::Home),
|
||||
text(
|
||||
state
|
||||
.jellyfin_client
|
||||
.as_ref()
|
||||
.map(|c| c.config.server_url.as_str())
|
||||
.unwrap_or("No Server"),
|
||||
)
|
||||
.align_x(Alignment::Start)
|
||||
.pipe(button)
|
||||
.on_press(Message::Home)
|
||||
.pipe(container)
|
||||
.padding(10)
|
||||
.width(Length::Fill)
|
||||
.height(Length::Fill)
|
||||
@@ -371,18 +348,17 @@ fn header(state: &State) -> Element<'_, Message> {
|
||||
.style(container::rounded_box)
|
||||
.into(),
|
||||
search(state),
|
||||
container(
|
||||
row([
|
||||
button("Refresh").on_press(Message::Refresh).into(),
|
||||
button("Settings")
|
||||
.on_press(Message::Settings(settings::SettingsMessage::Open))
|
||||
.into(),
|
||||
button("TestVideo")
|
||||
.on_press(Message::Video(video::VideoMessage::Test))
|
||||
.into(),
|
||||
])
|
||||
.spacing(10),
|
||||
)
|
||||
row([
|
||||
button("Refresh").on_press(Message::Refresh).into(),
|
||||
button("Settings")
|
||||
.on_press(Message::Settings(settings::SettingsMessage::Open))
|
||||
.into(),
|
||||
button("TestVideo")
|
||||
.on_press(Message::Video(video::VideoMessage::Test))
|
||||
.into(),
|
||||
])
|
||||
.spacing(10)
|
||||
.pipe(container)
|
||||
.padding(10)
|
||||
.width(Length::Fill)
|
||||
.height(Length::Fill)
|
||||
|
||||
@@ -66,7 +66,7 @@ pub enum ServerMessage {
|
||||
Clear,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Default)]
|
||||
#[derive(Debug, Clone, Default, PartialEq, Eq)]
|
||||
pub enum SettingsScreen {
|
||||
#[default]
|
||||
Main,
|
||||
@@ -195,9 +195,28 @@ impl ServerForm {
|
||||
}
|
||||
|
||||
mod screens {
|
||||
use iced_aw::Tabs;
|
||||
|
||||
use super::*;
|
||||
pub fn settings(state: &State) -> Element<'_, Message> {
|
||||
row([settings_list(state), settings_screen(state)]).into()
|
||||
Tabs::new(|f| Message::Settings(SettingsMessage::Select(f)))
|
||||
.push(
|
||||
SettingsScreen::Main,
|
||||
iced_aw::TabLabel::Text("General".into()),
|
||||
main(state),
|
||||
)
|
||||
.push(
|
||||
SettingsScreen::Servers,
|
||||
iced_aw::TabLabel::Text("Servers".into()),
|
||||
server(state),
|
||||
)
|
||||
.push(
|
||||
SettingsScreen::Users,
|
||||
iced_aw::TabLabel::Text("Users".into()),
|
||||
user(state),
|
||||
)
|
||||
.set_active_tab(&state.settings.screen)
|
||||
.into()
|
||||
}
|
||||
|
||||
pub fn settings_screen(state: &State) -> Element<'_, Message> {
|
||||
@@ -207,64 +226,65 @@ mod screens {
|
||||
SettingsScreen::Users => user(state),
|
||||
})
|
||||
.width(Length::FillPortion(10))
|
||||
.height(Length::Fill)
|
||||
.style(|theme| container::background(theme.extended_palette().background.base.color))
|
||||
.pipe(container)
|
||||
.padding(10)
|
||||
.style(|theme| container::background(theme.extended_palette().secondary.base.color))
|
||||
.width(Length::FillPortion(10))
|
||||
.into()
|
||||
}
|
||||
|
||||
pub fn settings_list(state: &State) -> Element<'_, Message> {
|
||||
scrollable(
|
||||
column(
|
||||
[
|
||||
button(center_text("Main")).on_press(Message::Settings(
|
||||
SettingsMessage::Select(SettingsScreen::Main),
|
||||
)),
|
||||
button(center_text("Servers")).on_press(Message::Settings(
|
||||
SettingsMessage::Select(SettingsScreen::Servers),
|
||||
)),
|
||||
button(center_text("Users")).on_press(Message::Settings(
|
||||
SettingsMessage::Select(SettingsScreen::Users),
|
||||
)),
|
||||
]
|
||||
.map(|p| p.clip(true).width(Length::Fill).into()),
|
||||
)
|
||||
.width(Length::FillPortion(2))
|
||||
.spacing(10)
|
||||
.padding(10),
|
||||
column(
|
||||
[
|
||||
button(center_text("General")).on_press(Message::Settings(
|
||||
SettingsMessage::Select(SettingsScreen::Main),
|
||||
)),
|
||||
button(center_text("Servers")).on_press(Message::Settings(
|
||||
SettingsMessage::Select(SettingsScreen::Servers),
|
||||
)),
|
||||
button(center_text("Users")).on_press(Message::Settings(SettingsMessage::Select(
|
||||
SettingsScreen::Users,
|
||||
))),
|
||||
]
|
||||
.map(|p| p.clip(true).width(Length::Fill).into()),
|
||||
)
|
||||
.width(Length::FillPortion(2))
|
||||
.spacing(10)
|
||||
.padding(10)
|
||||
.pipe(scrollable)
|
||||
.into()
|
||||
}
|
||||
|
||||
pub fn main(state: &State) -> Element<'_, Message> {
|
||||
// placeholder for now
|
||||
container(
|
||||
Column::new()
|
||||
.push(text("Main Settings"))
|
||||
.push(toggler(true).label("Foobar"))
|
||||
.spacing(20)
|
||||
.padding(20),
|
||||
)
|
||||
.into()
|
||||
Column::new()
|
||||
.push(text("Main Settings"))
|
||||
.push(toggler(true).label("HDR"))
|
||||
.spacing(20)
|
||||
.padding(20)
|
||||
.pipe(container)
|
||||
.into()
|
||||
}
|
||||
|
||||
pub fn server(state: &State) -> Element<'_, Message> {
|
||||
container(
|
||||
Column::new()
|
||||
.push(text("Server Settings"))
|
||||
.push(state.settings.server_form.view())
|
||||
// .push(toggler(false).label("Enable Server"))
|
||||
.spacing(20)
|
||||
.padding(20),
|
||||
)
|
||||
.into()
|
||||
Column::new()
|
||||
.push(text("Server Settings"))
|
||||
.push(state.settings.server_form.view())
|
||||
.spacing(20)
|
||||
.padding(20)
|
||||
.pipe(container)
|
||||
.into()
|
||||
}
|
||||
|
||||
pub fn user(state: &State) -> Element<'_, Message> {
|
||||
container(
|
||||
Column::new()
|
||||
.push(text("User Settings"))
|
||||
.push(state.settings.login_form.view())
|
||||
// .push(userlist(&state))
|
||||
.spacing(20)
|
||||
.padding(20),
|
||||
)
|
||||
.into()
|
||||
Column::new()
|
||||
.push(text("User Settings"))
|
||||
.push(state.settings.login_form.view())
|
||||
.spacing(20)
|
||||
.padding(20)
|
||||
.pipe(container)
|
||||
.into()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user