Mobydick-Linux-Scaricare-Mu.../src/main.rs

122 lines
2.9 KiB
Rust
Raw Normal View History

2019-02-03 21:46:29 +01:00
use gtk::{self, prelude::*, *};
use std::{
cell::RefCell,
rc::Rc,
sync::Arc,
fs,
path::PathBuf,
};
use serde_json::json;
2019-02-05 14:11:02 +01:00
macro_rules! clone {
(@param _) => ( _ );
(@param $x:ident) => ( $x );
($($n:ident),+ => move || $body:expr) => (
{
$( let $n = $n.clone(); )+
move || $body
}
);
($($n:ident),+ => move |$($p:tt),+| $body:expr) => (
{
$( let $n = $n.clone(); )+
move |$(clone!(@param $p),)+| $body
}
);
}
2019-02-03 21:46:29 +01:00
mod api;
2019-02-05 14:11:02 +01:00
mod ui;
2019-02-03 21:46:29 +01:00
#[derive(Debug)]
2019-02-05 14:11:02 +01:00
pub struct AppState {
2019-02-03 21:46:29 +01:00
instance: Option<String>,
username: Option<String>,
password: Option<String>,
token: Option<String>,
client: reqwest::Client,
search_result: Option<api::SearchResult>,
stack: Stack,
err_revealer: Revealer,
err_label: Label,
downloads: Arc<RefCell<Vec<Download>>>,
}
2019-02-05 14:11:02 +01:00
pub type State = Rc<RefCell<AppState>>;
2019-02-03 21:46:29 +01:00
#[derive(Debug)]
2019-02-05 14:11:02 +01:00
pub struct Download {
2019-02-03 21:46:29 +01:00
url: String,
done: bool,
output: PathBuf,
}
fn main() {
if gtk::init().is_err() {
println!("Failed to initialize GTK.");
return;
}
let window = Window::new(WindowType::Toplevel);
window.set_title("Funkload");
window.set_default_size(1080, 720);
2019-02-05 14:11:02 +01:00
let (token, instance, user) = fs::read("data.json").ok().and_then(|f|
serde_json::from_slice(&f).map(|json: serde_json::Value| (
json["token"].as_str().map(ToString::to_string),
json["instance"].as_str().map(ToString::to_string),
json["username"].as_str().map(ToString::to_string),
)).ok()
).unwrap_or((None, None, None));
2019-02-03 21:46:29 +01:00
let err_revealer = Revealer::new();
let err_label = Label::new("Error");
err_revealer.add(&err_label);
let state = Rc::new(RefCell::new(AppState {
client: reqwest::Client::new(),
token: token,
instance: instance,
2019-02-05 14:11:02 +01:00
username: user,
2019-02-03 21:46:29 +01:00
password: None,
search_result: None,
stack: Stack::new(),
err_revealer: err_revealer,
err_label: err_label,
downloads: Arc::new(RefCell::new(Vec::new())),
}));
2019-02-05 14:11:02 +01:00
let login_page = ui::login_page::render(state.clone());
2019-02-03 21:46:29 +01:00
2019-02-05 14:11:02 +01:00
state.borrow().stack.add_named(&login_page, "login");
2019-02-05 17:32:26 +01:00
let scrolled = ScrolledWindow::new(None, None);
scrolled.add(&state.borrow().stack);
window.add(&scrolled);
2019-02-03 21:46:29 +01:00
window.show_all();
if state.borrow().instance.is_some() && state.borrow().token.is_some() {
2019-02-05 14:11:02 +01:00
let main_page = ui::main_page::render(state.clone());
state.borrow().stack.add_named(&main_page, "main");
state.borrow().stack.set_visible_child_name("main");
// state.borrow_mut().stack.show_all();
2019-02-03 21:46:29 +01:00
}
2019-02-05 14:11:02 +01:00
window.connect_delete_event(clone!(state => move |_, _| {
2019-02-03 21:46:29 +01:00
gtk::main_quit();
fs::write("data.json", serde_json::to_string(&json!({
"token": state.borrow().token.clone(),
2019-02-05 14:11:02 +01:00
"instance": state.borrow().instance.clone(),
"username": state.borrow().username.clone(),
2019-02-03 21:46:29 +01:00
})).unwrap()).unwrap();
Inhibit(false)
2019-02-05 14:11:02 +01:00
}));
2019-02-03 21:46:29 +01:00
gtk::main();
}