aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Smeding <tom.smeding@gmail.com>2020-09-17 22:15:17 +0200
committerTom Smeding <tom.smeding@gmail.com>2021-01-28 22:20:12 +0100
commite780e6c829f028ed7430c458f6002ac7c5409174 (patch)
treef6038cae2f25f04dfe08e72cb31f4cdf2c7e915f
parenta6d82264a5b099ebfe8f3ecf6d1b81b146804231 (diff)
rust: Switch buffers using mouse
-rw-r--r--rust/src/main.rs59
1 files changed, 40 insertions, 19 deletions
diff --git a/rust/src/main.rs b/rust/src/main.rs
index 937cc88..1ce64c6 100644
--- a/rust/src/main.rs
+++ b/rust/src/main.rs
@@ -9,7 +9,7 @@ use once_cell::sync::Lazy;
use tokio::{runtime, task};
use tokio::sync::Mutex as AsyncMutex;
use termion::{clear, color, cursor};
-use termion::event::Key;
+use termion::event::{Event, Key, MouseEvent, MouseButton};
use termion::raw::{IntoRawMode, RawTerminal};
use termion::input::{TermRead, MouseTerminal};
use termion::screen::AlternateScreen;
@@ -315,19 +315,16 @@ impl App {
}
}
- async fn switch_buffer(self: &Arc<Self>, delta: isize) -> io::Result<()> {
- {
- let mut state = self.state.lock().await;
- let current_index =
- state.roomlist.iter().enumerate()
- .filter(|&t| *t.1 == state.currentroom)
- .map(|t| t.0)
- .next().unwrap_or(0);
- let index = (current_index as isize + delta)
- .max(0).min(state.roomlist.len() as isize - 1);
- state.currentroom = state.roomlist[index as usize].clone();
- }
- self.full_redraw().await
+ async fn switch_buffer_rel(self: &Arc<Self>, delta: isize) -> io::Result<()> {
+ let mut state = self.state.lock().await;
+ let current_index =
+ state.roomlist.iter().enumerate()
+ .filter(|&t| *t.1 == state.currentroom)
+ .map(|t| t.0)
+ .next().unwrap_or(0);
+ let index = (current_index as isize + delta)
+ .max(0).min(state.roomlist.len() as isize - 1);
+ state.switch_buffer(index as usize)
}
// Returns whether application should quit
@@ -335,8 +332,8 @@ impl App {
match key {
Key::Ctrl('c') => { return Ok(true); }
Key::Ctrl('l') => self.full_redraw().await?,
- Key::F(5) => self.switch_buffer(-1).await?,
- Key::F(6) => self.switch_buffer(1).await?,
+ Key::F(5) => self.switch_buffer_rel(-1).await?,
+ Key::F(6) => self.switch_buffer_rel(1).await?,
_ => {
let submitted = {
let mut state = self.state.lock().await;
@@ -355,6 +352,15 @@ impl App {
Ok(false)
}
+ async fn on_mouse(self: &Arc<Self>, x: u16, y: u16) -> io::Result<()> {
+ let mut state = self.state.lock().await;
+ if x < state.layout.rlsepx && usize::from(y) < state.roomlist.len() {
+ state.switch_buffer(usize::from(y))?;
+ }
+
+ Ok(())
+ }
+
// Returns whether application should quit
async fn handle_input(self: &Arc<Self>, line: &str) -> io::Result<bool> {
let parsed = if line.starts_with("//") {
@@ -497,6 +503,11 @@ impl State {
self.rooms.get_mut(room).unwrap().history.push(item);
self.full_redraw()
}
+
+ fn switch_buffer(&mut self, index: usize) -> io::Result<()> {
+ self.currentroom = self.roomlist[index].clone();
+ self.full_redraw()
+ }
}
async fn pushchan_thread(mut chan: mpsc::Receiver<PushMessage>, app: Arc<App>) {
@@ -541,9 +552,19 @@ async fn async_main() -> io::Result<()> {
app_clone.fetch_rooms_list().await.unwrap();
});
- for key in io::stdin().keys() {
- if app.on_key(key?).await? {
- break;
+ for event in io::stdin().events() {
+ match event? {
+ Event::Key(key) => {
+ if app.on_key(key).await? {
+ break;
+ }
+ }
+
+ Event::Mouse(MouseEvent::Press(MouseButton::Left, x, y)) => {
+ app.on_mouse(x - 1, y - 1).await?;
+ }
+
+ _ => {}
}
}