Partial implementation for additional add-movie details. Need to implement selection menus now but that's it!
This commit is contained in:
+82
-1
@@ -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>,
|
||||
|
||||
@@ -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",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user