pub mod exit_dialogue;
pub mod messaging;
pub mod msg_area;
pub mod tabbed;
pub mod termbox;
pub mod text_field;
pub mod widget;
use std::fs;
use std::rc::Rc;
use std::str;
use config::Colors;
use self::tabbed::{Tabbed, TabbedRet, TabStyle, MsgSource};
pub use self::messaging::Timestamp;
use term_input::{Event, Key};
use termbox_simple::{Termbox, OutputMode};
use trie::Trie;
pub struct TUI {
termbox: Termbox,
colors: Colors,
ui: Tabbed,
}
#[derive(Debug)]
pub enum TUIRet {
Abort,
KeyHandled,
KeyIgnored(Key),
EventIgnored(Event),
Input {
msg : Vec<char>,
from : MsgSource,
},
}
impl TUI {
pub fn new(colors: Colors) -> TUI {
let mut tui = Termbox::init().unwrap(); tui.set_output_mode(OutputMode::Output256);
tui.set_clear_attributes(colors.clear.fg, colors.clear.bg);
let _ = fs::create_dir("logs");
TUI {
ui: Tabbed::new(tui.width() as i32, tui.height() as i32),
colors: colors,
termbox: tui,
}
}
pub fn set_colors(&mut self, colors: Colors) {
self.termbox.set_clear_attributes(colors.clear.fg, colors.clear.bg);
self.colors = colors;
}
}
impl TUI {
pub fn count_tabs(&self) -> usize {
self.ui.count_tabs()
}
pub fn new_server_tab(&mut self, serv_name: &str) {
self.ui.new_server_tab(serv_name);
}
pub fn close_server_tab(&mut self, serv_name: &str) {
self.ui.close_server_tab(serv_name);
}
pub fn new_chan_tab(&mut self, serv_name: &str, chan_name: &str) {
self.ui.new_chan_tab(serv_name, chan_name);
}
pub fn close_chan_tab(&mut self, serv_name: &str, chan_name: &str) {
self.ui.close_chan_tab(serv_name, chan_name);
}
pub fn new_user_tab(&mut self, serv_name: &str, nick: &str) {
self.ui.new_user_tab(serv_name, nick);
}
pub fn close_user_tab(&mut self, serv_name: &str, nick: &str) {
self.ui.close_user_tab(serv_name, nick);
}
pub fn set_tab_style(&mut self, style: TabStyle, target: &MsgTarget) {
self.ui.set_tab_style(style, target);
}
pub fn set_nick(&mut self, serv_name: &str, nick: Rc<String>) {
self.ui.set_nick(nick, &MsgTarget::AllServTabs { serv_name: serv_name });
}
pub fn get_nicks(&self, serv_name: &str, chan_name: &str) -> Option<Rc<Trie>> {
self.ui.get_nicks(serv_name, chan_name)
}
}
impl TUI {
pub fn handle_input_event(&mut self, ev : Event) -> TUIRet {
match ev {
Event::Resize => {
self.resize();
TUIRet::KeyHandled
},
Event::Key(key) => {
match self.ui.keypressed(key) {
TabbedRet::KeyHandled => TUIRet::KeyHandled,
TabbedRet::KeyIgnored => TUIRet::KeyIgnored(key),
TabbedRet::Input { msg, from } => {
TUIRet::Input {
msg: msg,
from: from.clone(),
}
},
TabbedRet::Abort => TUIRet::Abort,
}
},
Event::String(str) => {
if !str.contains('\n') && !str.contains('\r') {
for ch in str.chars() {
self.handle_input_event(Event::Key(Key::Char(ch)));
}
TUIRet::KeyHandled
} else {
TUIRet::EventIgnored(Event::String(str.to_owned()))
}
},
ev => {
TUIRet::EventIgnored(ev)
},
}
}
pub fn resize(&mut self) {
self.termbox.resize();
self.termbox.clear();
let w = self.termbox.width();
let h = self.termbox.height();
self.ui.resize(w, h);
}
pub fn draw(&mut self) {
self.termbox.clear();
self.ui.draw(&mut self.termbox, &self.colors, 0, 0);
self.termbox.present();
}
}
#[derive(Debug)]
pub enum MsgTarget<'a> {
Server { serv_name: &'a str },
Chan { serv_name: &'a str, chan_name: &'a str },
User { serv_name: &'a str, nick: &'a str },
AllServTabs { serv_name: &'a str },
AllUserTabs { serv_name: &'a str, nick: &'a str },
AllTabs,
CurrentTab,
MultipleTabs(Vec<MsgTarget<'a>>),
}
impl TUI {
pub fn add_client_err_msg(&mut self, msg: &str, target: &MsgTarget) {
self.ui.add_client_err_msg(msg, target);
}
pub fn add_client_msg(&mut self, msg: &str, target: &MsgTarget) {
self.ui.add_client_msg(msg, target);
}
pub fn add_privmsg(&mut self, sender: &str, msg: &str, ts: Timestamp, target: &MsgTarget) {
self.ui.add_privmsg(sender, msg, ts, target);
}
pub fn add_privmsg_highlight(
&mut self, sender: &str, msg: &str, ts: Timestamp, target: &MsgTarget)
{
self.ui.add_privmsg_highlight(sender, msg, ts, target);
}
pub fn add_msg(&mut self, msg: &str, ts: Timestamp, target : &MsgTarget) {
self.ui.add_msg(msg, ts, target);
}
pub fn add_err_msg(&mut self, msg: &str, ts: Timestamp, target : &MsgTarget) {
self.ui.add_err_msg(msg, ts, target);
}
pub fn show_topic(&mut self, msg: &str, ts: Timestamp, target: &MsgTarget) {
self.ui.show_topic(msg, ts, target);
}
pub fn clear_nicks(&mut self, target: &MsgTarget) {
self.ui.clear_nicks(target);
}
pub fn add_nick(&mut self, nick: &str, ts: Option<Timestamp>, target: &MsgTarget) {
self.ui.add_nick(nick, ts, target);
}
pub fn remove_nick(&mut self, nick : &str, ts: Option<Timestamp>, target: &MsgTarget) {
self.ui.remove_nick(nick, ts, target);
}
pub fn rename_nick(&mut self, old_nick: &str, new_nick: &str, ts: Timestamp, target: &MsgTarget) {
self.ui.rename_nick(old_nick, new_nick, ts, target);
}
}