parsed `pijul channel` text blob into individual UI components
Dependencies
- [2]
G2CHQAOPparsed `pijul log` text blob into individual entries & fields - [3]
NSE6BLWAinit slint project from https://github.com/slint-ui/slint-rust-template - [4]
IQY5LHENadd GUI element to display simple `pijul log` results - [5]
4RPYR65Cconnect GUI to pijul to display simple channel list - [*]
NCRTU7M4cargo init
Change contents
- replacement in ui/app-window.slint at line 1
import { Button, VerticalBox, HorizontalBox, ScrollView } from "std-widgets.slint";import { Button, VerticalBox, HorizontalBox, ScrollView, ListView } from "std-widgets.slint"; - edit in ui/app-window.slint at line 48
component ChannelsList {in-out property <[string]> channels;in-out property <int> active; - edit in ui/app-window.slint at line 53
VerticalBox {alignment: start;spacing: 0;preferred-width: 150px;Text {text: "channels";}// TODO convert to a (Standard)ListView?for ch[index] in channels: HorizontalBox {alignment: start;spacing: 0;padding: 0;Rectangle {width: 10px;height: 10px;visible: index == root.active;background: blue;}Text {text: "\{ch}";}}}} - replacement in ui/app-window.slint at line 83
in-out property <string> channel_list: "";in-out property <[string]> channels <=> chs.channels;in-out property <int> active-channel <=> chs.active; - edit in ui/app-window.slint at line 89
width: 600px;height: 400px; - replacement in ui/app-window.slint at line 101
VerticalBox {alignment: start;preferred-width: 150px;Text {text: "channels";}Text {text: "\{root.channel_list}";}chs := ChannelsList {channels: [];active: 0; - edit in ui/app-window.slint at line 106
// TODO convert to a (Standard)ListView? - edit in ui/app-window.slint at line 108
preferred-width: 500px; - edit in ui/app-window.slint at line 111
preferred-width: 500px; - replacement in src/main.rs at line 10
use slint::{ModelRc, SharedString};use slint::SharedString; - replacement in src/main.rs at line 33
ui.set_channel_list(SharedString::from(&channel_list));let channel_strs = channel_list.entries.into_iter().map(SharedString::from).collect::<Vec<_>>();ui.set_channels((&channel_strs[..]).into());ui.set_active_channel(i32::try_from(channel_list.active).unwrap_or(-1)); - replacement in src/cmds.rs at line 4
pub fn channel(exe: &std::path::Path, repo: &std::path::Path) -> Result<String, Error> {pub fn channel(exe: &std::path::Path, repo: &std::path::Path) -> Result<ChannelsList, Error> { - replacement in src/cmds.rs at line 13
Ok(String::from_utf8(output.stdout)?)parse_channel_output(output.stdout)}fn parse_channel_output(output: Vec<u8>) -> Result<ChannelsList, Error> {let channels_str = String::from_utf8(output)?;let channels_list = channels_str.split('\n').map(|substr| substr.trim()).fold(ChannelsList::new(),|mut channels_list, ch_str| {if ch_str.starts_with("* ") {channels_list.active = channels_list.entries.len();channels_list.entries.push(ch_str[2..].to_string());} else {channels_list.entries.push(ch_str.to_string());}channels_list},);Ok(channels_list) - edit in src/cmds.rs at line 64
}#[derive(Debug)]pub struct ChannelsList {pub(crate) entries: Vec<String>,pub(crate) active: usize, - edit in src/cmds.rs at line 72
impl ChannelsList {pub(crate) fn new() -> Self {Self {entries: Vec::new(),active: usize::MAX,}}}