ontv 0.1.3

A rich desktop application for tracking tv shows
Documentation
use crate::prelude::*;
use crate::queue::{TaskKind, TaskRef, TaskStatus};

#[derive(Debug, Clone)]
pub(crate) enum Message {
    Untrack,
    Track,
    RefreshSeries(RemoteSeriesId),
    RemoveSeries,
}

#[derive(Debug, Clone)]
pub(crate) struct SeriesActions {
    series_id: SeriesId,
    confirm: bool,
}

impl Component<SeriesId> for SeriesActions {
    #[inline]
    fn new(series_id: SeriesId) -> Self {
        Self {
            series_id,
            confirm: false,
        }
    }

    #[inline]
    fn changed(&mut self, series_id: SeriesId) {
        if self.series_id != series_id {
            self.series_id = series_id;
            self.confirm = false;
        }
    }
}

impl SeriesActions {
    pub(crate) fn update(&mut self, cx: &mut Ctxt<'_>, message: Message) {
        match message {
            Message::Untrack => {
                cx.service.untrack(&self.series_id);
            }
            Message::Track => {
                cx.service.track(&self.series_id);
            }
            Message::RefreshSeries(remote_id) => {
                cx.service
                    .push_task_without_delay(TaskKind::DownloadSeries {
                        series_id: self.series_id,
                        remote_id,
                        last_modified: None,
                        force: true,
                    });
            }
            Message::RemoveSeries => {
                cx.remove_series(&self.series_id);
            }
        }
    }

    pub(crate) fn view(&self, cx: &CtxtRef<'_>, series: &Series) -> Element<'static, Message> {
        let mut row = w::Row::new();

        if series.tracked {
            row = row.push(
                w::button(w::text("Untrack").size(SMALL))
                    .style(theme::Button::Destructive)
                    .on_press(Message::Untrack),
            );
        } else {
            row = row.push(
                w::button(w::text("Track").size(SMALL))
                    .style(theme::Button::Positive)
                    .on_press(Message::Track),
            );
        }

        let status = cx.service.task_status(TaskRef::Series {
            series_id: series.id,
        });

        match status {
            Some(TaskStatus::Pending) => {
                row = row
                    .push(w::button(w::text("Refresh").size(SMALL)).style(theme::Button::Positive));
            }
            Some(TaskStatus::Running) => {
                row = row.push(
                    w::button(w::text("Downloading...").size(SMALL)).style(theme::Button::Primary),
                );
            }
            None => {
                if let Some(remote_id) = series.remote_id {
                    row = row.push(
                        w::button(w::text("Refresh").size(SMALL))
                            .style(theme::Button::Positive)
                            .on_press(Message::RefreshSeries(remote_id)),
                    );
                }
            }
        }

        row = row.push(
            w::button(w::text("Remove").size(SMALL))
                .style(theme::Button::Destructive)
                .on_press(Message::RemoveSeries),
        );

        row.spacing(SPACE).into()
    }
}