Radish alpha
r
Radicle terminal user interface
Radicle
Git (anonymous pull)
Log in to clone via SSH
Restructure issue page widgets
Erik Kundt committed 2 years ago
commit 244ece0a73557e7a41682517c25bfc1cfa5e70d9
parent 6d14f62eb64b88d7c8f309cd958a7712b739f68c
5 files changed +59 -21
modified src/app.rs
@@ -41,7 +41,7 @@ pub enum PatchCid {
pub enum IssueCid {
    Header,
    List,
-
    Details,
+
    Discussion,
    Shortcuts,
}

modified src/app/event.rs
@@ -78,7 +78,7 @@ impl tuirealm::Component<Message, NoUserEvent> for Widget<issue::LargeList> {
    }
}

-
impl tuirealm::Component<Message, NoUserEvent> for Widget<issue::Details> {
+
impl tuirealm::Component<Message, NoUserEvent> for Widget<issue::IssueDiscussion> {
    fn on(&mut self, _event: Event<NoUserEvent>) -> Option<Message> {
        None
    }
modified src/app/page.rs
@@ -167,7 +167,8 @@ impl ViewPage for IssuePage {
        let (id, issue) = &self.issue;
        let header = widget::common::app_header(context, theme, None).to_boxed();
        let list = widget::issue::list(context, theme, (*id, issue.clone())).to_boxed();
-
        let details = widget::issue::details(context, theme, (*id, issue.clone())).to_boxed();
+
        let discussion =
+
            widget::issue::issue_discussion(context, theme, (*id, issue.clone())).to_boxed();
        let shortcuts = widget::common::shortcuts(
            theme,
            vec![
@@ -179,7 +180,7 @@ impl ViewPage for IssuePage {

        app.remount(Cid::Issue(IssueCid::Header), header, vec![])?;
        app.remount(Cid::Issue(IssueCid::List), list, vec![])?;
-
        app.remount(Cid::Issue(IssueCid::Details), details, vec![])?;
+
        app.remount(Cid::Issue(IssueCid::Discussion), discussion, vec![])?;
        app.remount(Cid::Issue(IssueCid::Shortcuts), shortcuts, vec![])?;

        app.active(&Cid::Issue(IssueCid::List))?;
@@ -190,7 +191,7 @@ impl ViewPage for IssuePage {
    fn unmount(&self, app: &mut Application<Cid, Message, NoUserEvent>) -> Result<()> {
        app.umount(&Cid::Issue(IssueCid::Header))?;
        app.umount(&Cid::Issue(IssueCid::List))?;
-
        app.umount(&Cid::Issue(IssueCid::Details))?;
+
        app.umount(&Cid::Issue(IssueCid::Discussion))?;
        app.umount(&Cid::Issue(IssueCid::Shortcuts))?;
        Ok(())
    }
@@ -206,8 +207,9 @@ impl ViewPage for IssuePage {
            Message::Issue(IssueMessage::Changed(id)) => {
                let repo = context.repository();
                if let Some(issue) = cob::issue::find(repo, &id)? {
-
                    let details = widget::issue::details(context, theme, (id, issue)).to_boxed();
-
                    app.remount(Cid::Issue(IssueCid::Details), details, vec![])?;
+
                    let discussion =
+
                        widget::issue::issue_discussion(context, theme, (id, issue)).to_boxed();
+
                    app.remount(Cid::Issue(IssueCid::Discussion), discussion, vec![])?;
                }
            }
            Message::Issue(IssueMessage::Focus(cid)) => {
@@ -225,8 +227,8 @@ impl ViewPage for IssuePage {
        let layout = layout::issue_preview(area, shortcuts_h);

        app.view(&Cid::Issue(IssueCid::Header), frame, layout.header);
-
        app.view(&Cid::Issue(IssueCid::List), frame, layout.list);
-
        app.view(&Cid::Issue(IssueCid::Details), frame, layout.details);
+
        app.view(&Cid::Issue(IssueCid::List), frame, layout.left);
+
        app.view(&Cid::Issue(IssueCid::Discussion), frame, layout.right);
        app.view(&Cid::Issue(IssueCid::Shortcuts), frame, layout.shortcuts);
    }

modified src/ui/layout.rs
@@ -10,9 +10,8 @@ pub struct AppHeader {

pub struct IssuePreview {
    pub header: Rect,
-
    pub list: Rect,
-
    pub details: Rect,
-
    pub discussion: Rect,
+
    pub left: Rect,
+
    pub right: Rect,
    pub shortcuts: Rect,
}

@@ -221,16 +220,10 @@ pub fn issue_preview(area: Rect, shortcuts_h: u16) -> IssuePreview {
        .constraints([Constraint::Percentage(50), Constraint::Percentage(50)].as_ref())
        .split(root[1]);

-
    let right = Layout::default()
-
        .direction(Direction::Vertical)
-
        .constraints([Constraint::Length(6), Constraint::Min(0)].as_ref())
-
        .split(split[1]);
-

    IssuePreview {
        header: root[0],
-
        list: split[0],
-
        details: right[0],
-
        discussion: right[1],
-
        shortcuts: root[2],
+
        left: split[0],
+
        right: split[1],
+
        shortcuts: root[1],
    }
}
modified src/ui/widget/issue.rs
@@ -4,6 +4,9 @@ use radicle::cob::issue::Issue;
use radicle::cob::issue::IssueId;
use radicle::Profile;
use tuirealm::props::Color;
+
use tuirealm::tui::layout::Constraint;
+
use tuirealm::tui::layout::Direction;
+
use tuirealm::tui::layout::Layout;

use super::common::container::Container;
use super::common::container::LabeledContainer;
@@ -143,6 +146,37 @@ impl WidgetComponent for Details {
    }
}

+
pub struct IssueDiscussion {
+
    details: Widget<Details>,
+
}
+

+
impl IssueDiscussion {
+
    pub fn new(context: &Context, theme: &Theme, issue: (IssueId, Issue)) -> Self {
+
        Self {
+
            details: details(context, theme, issue),
+
        }
+
    }
+
}
+

+
impl WidgetComponent for IssueDiscussion {
+
    fn view(&mut self, _properties: &Props, frame: &mut Frame, area: Rect) {
+
        let layout = Layout::default()
+
            .direction(Direction::Vertical)
+
            .constraints([Constraint::Length(6), Constraint::Min(1)])
+
            .split(area);
+

+
        self.details.view(frame, layout[0]);
+
    }
+

+
    fn state(&self) -> State {
+
        State::None
+
    }
+

+
    fn perform(&mut self, _properties: &Props, _cmd: Cmd) -> CmdResult {
+
        CmdResult::None
+
    }
+
}
+

pub fn list(context: &Context, theme: &Theme, issue: (IssueId, Issue)) -> Widget<LargeList> {
    let list = LargeList::new(context, theme, Some(issue));

@@ -154,6 +188,15 @@ pub fn details(context: &Context, theme: &Theme, issue: (IssueId, Issue)) -> Wid
    Widget::new(details)
}

+
pub fn issue_discussion(
+
    context: &Context,
+
    theme: &Theme,
+
    issue: (IssueId, Issue),
+
) -> Widget<IssueDiscussion> {
+
    let discussion = IssueDiscussion::new(context, theme, issue);
+
    Widget::new(discussion)
+
}
+

pub fn context(theme: &Theme, issue: (IssueId, &Issue), profile: &Profile) -> Widget<ContextBar> {
    let (id, issue) = issue;
    let is_you = *issue.author().id() == profile.did();