#![deny(unsafe_code)]
#![allow(dead_code)]
#![recursion_limit = "256"]
mod config;
mod contacts;
mod gui;
mod identities;
mod ids;
mod log;
mod messages;
mod send;
mod settings;
mod status;
mod subscriptions;
mod tab;
use ::log::error;
use glium::Surface;
use gui::Gui;
use ids::Ids;
use koibumi_node_sync::Event as BmEvent;
const TITLE: &str = "Koibumi - An Experimental Bitmessage Client";
const WIDTH: u32 = 512;
const HEIGHT: u32 = 512;
fn main() {
let event_loop = glium::glutin::event_loop::EventLoop::<BmEvent>::with_user_event();
let mut gui = Gui::new(event_loop.create_proxy());
let window = glium::glutin::window::WindowBuilder::new()
.with_title(TITLE)
.with_inner_size(glium::glutin::dpi::LogicalSize::new(WIDTH, HEIGHT));
let context = glium::glutin::ContextBuilder::new()
.with_vsync(true)
.with_multisampling(4);
let display = glium::Display::new(window, context, &event_loop);
if let Err(err) = display {
error!("{}", err);
return;
}
let display = display.unwrap();
let mut ui = conrod_core::UiBuilder::new([WIDTH as f64, HEIGHT as f64]).build();
let mut ids = Ids::new(ui.widget_id_generator());
let font = rusttype::Font::from_bytes(koibumi_unifont_jp::TTF);
if let Err(err) = font {
error!("{}", err);
return;
}
let font = font.unwrap();
let _font_id = ui.fonts.insert(font);
let renderer = conrod_glium::Renderer::new(&display);
if let Err(err) = renderer {
error!("{}", err);
return;
}
let mut renderer = renderer.unwrap();
let image_map = conrod_core::image::Map::<glium::texture::Texture2d>::new();
let mut should_update_ui = true;
event_loop.run(move |event, _, control_flow| {
*control_flow = glium::glutin::event_loop::ControlFlow::Poll;
*control_flow = glium::glutin::event_loop::ControlFlow::Wait;
match &event {
glium::glutin::event::Event::WindowEvent { event, .. } => match event {
glium::glutin::event::WindowEvent::CloseRequested
| glium::glutin::event::WindowEvent::KeyboardInput {
input:
glium::glutin::event::KeyboardInput {
virtual_keycode: Some(glium::glutin::event::VirtualKeyCode::Escape),
..
},
..
} => *control_flow = glium::glutin::event_loop::ControlFlow::Exit,
_ => {}
},
glium::glutin::event::Event::UserEvent(event) => {
match event {
BmEvent::ConnectionCounts {
incoming_initiated,
incoming_connected,
incoming_established,
outgoing_initiated,
outgoing_connected,
outgoing_established,
} => {
gui.status_tab.incoming_initiated = *incoming_initiated;
gui.status_tab.incoming_connected = *incoming_connected;
gui.status_tab.incoming_established = *incoming_established;
gui.status_tab.outgoing_initiated = *outgoing_initiated;
gui.status_tab.outgoing_connected = *outgoing_connected;
gui.status_tab.outgoing_established = *outgoing_established;
}
BmEvent::AddrCount(count) => {
gui.status_tab.addr_count = *count;
}
BmEvent::Established {
addr,
user_agent,
rating,
} => {
gui.status_tab.peers.push(addr.clone());
gui.status_tab
.peer_infos
.insert(addr.clone(), (user_agent.clone(), rating.clone()));
}
BmEvent::Disconnected { addr } => {
if let Some(index) = gui.status_tab.peers.iter().position(|v| v == addr) {
gui.status_tab.peers.remove(index);
}
}
BmEvent::Objects {
missing,
loaded,
uploaded,
} => {
gui.status_tab.missing_objects = *missing;
gui.status_tab.loaded_objects = *loaded;
gui.status_tab.uploaded_objects = *uploaded;
}
BmEvent::Stopped => {
gui.state = crate::gui::State::Idle;
}
BmEvent::Msg {
user_id,
address,
object,
} => {
gui.handle_msg(user_id.clone(), address.clone(), object.clone());
}
BmEvent::Broadcast {
user_id,
address,
object,
} => {
gui.handle_broadcast(user_id.clone(), address.clone(), object.clone());
}
}
should_update_ui = true;
}
_ => {}
}
if let Some(event) =
conrod_winit::v023_convert_event!(&event, &display.gl_window().window())
{
ui.handle_event(event);
should_update_ui = true;
}
match &event {
glium::glutin::event::Event::MainEventsCleared => {
if should_update_ui {
should_update_ui = false;
gui.set_widgets(&mut ui.set_widgets(), &mut ids);
display.gl_window().window().request_redraw();
}
}
glium::glutin::event::Event::RedrawRequested(_) => {
let primitives = ui.draw();
renderer.fill(&display, primitives, &image_map);
let mut target = display.draw();
target.clear_color(0.0, 0.0, 0.0, 1.0);
if let Err(err) = renderer.draw(&display, &mut target, &image_map) {
error!("{}", err);
return;
}
if let Err(err) = target.finish() {
error!("{}", err);
return;
}
}
_ => {}
}
})
}