Partial implementation for additional add-movie details. Need to implement selection menus now but that's it!

This commit is contained in:
2023-08-08 10:50:04 -06:00
parent d1da5af6d7
commit b748d27a06
10 changed files with 602 additions and 103 deletions
+82 -1
View File
@@ -2,7 +2,7 @@ use std::cell::RefCell;
use std::fmt::{Debug, Display, Formatter};
use serde::Deserialize;
use tui::widgets::TableState;
use tui::widgets::{ListState, TableState};
use crate::app::radarr::ActiveRadarrBlock;
@@ -28,6 +28,87 @@ pub trait Scrollable {
fn scroll_to_bottom(&mut self);
}
pub struct StatefulList<T> {
pub state: ListState,
pub items: Vec<T>,
}
impl<T> Default for StatefulList<T> {
fn default() -> StatefulList<T> {
StatefulList {
state: ListState::default(),
items: Vec::new(),
}
}
}
impl<T> Scrollable for StatefulList<T> {
fn scroll_down(&mut self) {
let selected_row = match self.state.selected() {
Some(i) => {
if i >= self.items.len() - 1 {
0
} else {
i + 1
}
}
None => 0,
};
self.state.select(Some(selected_row));
}
fn scroll_up(&mut self) {
let selected_row = match self.state.selected() {
Some(i) => {
if i == 0 {
self.items.len() - 1
} else {
i - 1
}
}
None => 0,
};
self.state.select(Some(selected_row));
}
fn scroll_to_top(&mut self) {
self.state.select(Some(0));
}
fn scroll_to_bottom(&mut self) {
self.state.select(Some(self.items.len() - 1));
}
}
impl<T: Clone + PartialEq + Eq + Debug> StatefulList<T> {
pub fn set_items(&mut self, items: Vec<T>) {
let items_len = items.len();
self.items = items;
if !self.items.is_empty() {
let selected_row = self.state.selected().map_or(0, |i| {
if i > 0 && i < items_len {
i
} else if i >= items_len {
items_len - 1
} else {
0
}
});
self.state.select(Some(selected_row));
}
}
pub fn current_selection(&self) -> &T {
&self.items[self.state.selected().unwrap_or(0)]
}
pub fn current_selection_clone(&self) -> T {
self.items[self.state.selected().unwrap_or(0)].clone()
}
}
pub struct StatefulTable<T> {
pub state: TableState,
pub items: Vec<T>,
+82
View File
@@ -1,7 +1,10 @@
use std::fmt::{Display, Formatter};
use chrono::{DateTime, Utc};
use derivative::Derivative;
use serde::{Deserialize, Serialize};
use serde_json::Number;
use strum::EnumIter;
use crate::models::HorizontallyScrollableText;
@@ -223,6 +226,7 @@ pub struct AddMovieBody {
#[derive(Default, Serialize, Debug, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct AddOptions {
pub monitor: String,
pub search_for_movie: bool,
}
@@ -243,3 +247,81 @@ pub struct AddMovieSearchResult {
pub runtime: Number,
pub ratings: RatingsList,
}
#[derive(Default, PartialEq, Eq, Clone, Debug)]
pub enum MinimumAvailability {
Tba,
Announced,
InCinemas,
#[default]
Released,
}
impl Display for MinimumAvailability {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
let minimum_availability = match self {
MinimumAvailability::Tba => "tba",
MinimumAvailability::Announced => "announced",
MinimumAvailability::InCinemas => "inCinemas",
MinimumAvailability::Released => "released",
};
write!(f, "{}", minimum_availability)
}
}
impl MinimumAvailability {
pub fn vec() -> Vec<Self> {
vec![
MinimumAvailability::Tba,
MinimumAvailability::Announced,
MinimumAvailability::InCinemas,
MinimumAvailability::Released,
]
}
pub fn to_display_str(&self) -> &str {
match self {
MinimumAvailability::Tba => "TBA",
MinimumAvailability::Announced => "Announced",
MinimumAvailability::InCinemas => "In Cinemas",
MinimumAvailability::Released => "Released",
}
}
}
#[derive(Default, PartialEq, Eq, Clone, Debug)]
pub enum Monitor {
#[default]
MovieOnly,
MovieAndCollection,
None,
}
impl Display for Monitor {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
let monitor = match self {
Monitor::MovieOnly => "movieOnly",
Monitor::MovieAndCollection => "movieAndCollection",
Monitor::None => "none",
};
write!(f, "{}", monitor)
}
}
impl Monitor {
pub fn vec() -> Vec<Self> {
vec![
Monitor::MovieOnly,
Monitor::MovieAndCollection,
Monitor::None,
]
}
pub fn to_display_str(&self) -> &str {
match self {
Monitor::MovieOnly => "Movie only",
Monitor::MovieAndCollection => "Movie and Collection",
Monitor::None => "None",
}
}
}