Browse Source

It werks!!1

environments/review-jsparber-h-cxnwl8/deployments/1
Jonas Platte 9 years ago
parent
commit
091801d0db
  1. 68
      res/main_window.glade
  2. 61
      src/app.rs
  3. 7
      src/main.rs
  4. 30
      src/matrix_client.rs

68
res/main_window.glade

@ -279,32 +279,76 @@
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<child>
<object class="GtkBox">
<object class="GtkStack" id="user_button_stack">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">4</property>
<child>
<object class="GtkImage">
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">address-book-new</property>
<property name="icon_size">3</property>
<property name="spacing">4</property>
<child>
<object class="GtkSpinner">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="active">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Loading...</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
<property name="name">user_loading_page</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Guest</property>
<property name="spacing">4</property>
<child>
<object class="GtkImage" id="profile_image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">address-book-new</property>
<property name="icon_size">3</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="display_name_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">&lt;Display Name&gt;</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="name">user_connected_page</property>
<property name="position">1</property>
</packing>
</child>

61
src/app.rs

@ -1,20 +1,17 @@
use gio;
use gtk;
use gtk::prelude::*;
use ruma_client_api::r0 as api;
use std::env;
use std::{env, sync, time, thread};
use matrix_client;
// TODO: Is this the correct format for GApplication IDs?
const APP_ID: &'static str = "jplatte.ruma_gtk";
pub struct App {
gtk_app: gtk::Application,
matrix_connection: Option<MatrixConnection>,
}
pub struct MatrixConnection {
// reqwest::Client
matrix_access_token: String,
matrix_user_id: String,
gtk_builder: gtk::Builder,
dispatch_rx: sync::mpsc::Receiver<Box<Fn(&gtk::Builder) + Send>>,
matrix_client_thread_join_handle: thread::JoinHandle<()>,
}
impl App {
@ -25,32 +22,46 @@ impl App {
let gtk_app = gtk::Application::new(Some(APP_ID), gio::ApplicationFlags::empty())
.expect("Failed to initialize GtkApplication");
let builder = gtk::Builder::new_from_file("res/main_window.glade");
let gtk_builder = gtk::Builder::new_from_file("res/main_window.glade");
let gtk_builder2 = gtk_builder.clone();
gtk_app.connect_activate(move |app| {
let user_button: gtk::Button = builder.get_object("user_button")
let user_button: gtk::Button = gtk_builder2.get_object("user_button")
.expect("Couldn't find user_button in ui file.");
let user_menu: gtk::Popover = builder.get_object("user_menu")
let user_menu: gtk::Popover = gtk_builder2.get_object("user_menu")
.expect("Couldn't find user_menu in ui file.");
user_button.connect_clicked(move |_| user_menu.show());
// Set up shutdown callback
let window: gtk::Window = builder.get_object("main_window")
let window: gtk::Window = gtk_builder2.get_object("main_window")
.expect("Couldn't find main_window in ui file.");
let app2 = app.clone();
window.connect_delete_event(move |_, _| {
app2.quit();
Inhibit(false)
});
window.set_application(Some(app));
window.show_all();
});
let (dispatch_tx, dispatch_rx) = sync::mpsc::channel::<Box<Fn(&gtk::Builder) + Send>>();
let matrix_client_thread_join_handle =
thread::spawn(move || matrix_client::run_client_main(dispatch_tx));
App {
gtk_app: gtk_app,
matrix_connection: None,
gtk_builder: gtk_builder,
dispatch_rx: dispatch_rx,
matrix_client_thread_join_handle: matrix_client_thread_join_handle,
}
}
pub fn run(&self) {
pub fn run(self) {
// Might just be the only way to go from impl Iterator<Item=String> to &[&str]
let args = env::args().collect::<Vec<_>>();
let mut args_refs = Vec::<&str>::new();
@ -59,15 +70,19 @@ impl App {
args_refs.push(r);
}
self.gtk_app.run(args_refs.len() as i32, &args_refs);
let dispatch_rx = self.dispatch_rx;
let gtk_builder = self.gtk_builder;
gtk::idle_add(move || {
if let Ok(dispatch_fn) = dispatch_rx.recv_timeout(time::Duration::from_millis(5)) {
dispatch_fn(&gtk_builder);
}
Continue(true)
});
/*let client = reqwest::Client::new().unwrap();
let res = client.post("https://matrix.org/_matrix/client/r0/register?kind=guest")
.body("{}")
.send()
.unwrap()
.json::<api::account::register::Response>();
self.gtk_app.run(args_refs.len() as i32, &args_refs);
println!("{:?}", res);*/
// Clean up
self.matrix_client_thread_join_handle.join();
}
}

7
src/main.rs

@ -1,3 +1,9 @@
#![feature(box_syntax)]
// not using this yet because rustfmt doesn't support it:
// https://github.com/rust-lang-nursery/rustfmt/issues/1215
//#![feature(field_init_shorthand)]
extern crate reqwest;
extern crate ruma_client_api;
extern crate gio;
@ -5,6 +11,7 @@ extern crate gtk;
// extern crate xdg;
mod app;
mod matrix_client;
use app::App;
// use std::fs::File;

30
src/matrix_client.rs

@ -0,0 +1,30 @@
use gtk;
use reqwest;
use ruma_client_api::r0 as api;
use std::sync::mpsc::Sender;
pub fn run_client_main(dispatch_tx: Sender<Box<Fn(&gtk::Builder) + Send>>) {
let client = reqwest::Client::new().unwrap();
let res = client.post("https://matrix.org/_matrix/client/r0/register?kind=guest")
.body("{}")
.send()
.unwrap()
.json::<api::account::register::Response>()
.unwrap();
dispatch_tx.send(box move |builder| {
builder.get_object::<gtk::Stack>("user_button_stack")
.expect("Can't find user_button_stack in ui file.")
.set_visible_child_name("user_connected_page");
builder.get_object::<gtk::Label>("display_name_label")
.expect("Can't find display_name_label in ui file.")
.set_text("Guest");
});
}
struct MatrixConnection {
/// reqwest::Client,
matrix_access_token: String,
matrix_user_id: String,
}
Loading…
Cancel
Save