Enable paste in textboxes

This commit is contained in:
Kyle Wood 2016-04-25 18:50:16 -05:00 committed by Matthew Collins
parent 6e33c3cc36
commit 8d95965d40
2 changed files with 28 additions and 12 deletions

View File

@ -66,6 +66,8 @@ use std::marker::PhantomData;
use std::thread; use std::thread;
use std::sync::mpsc; use std::sync::mpsc;
use protocol::mojang; use protocol::mojang;
use sdl2::Sdl;
use sdl2::keyboard;
const CL_BRAND: console::CVar<String> = console::CVar { const CL_BRAND: console::CVar<String> = console::CVar {
ty: PhantomData, ty: PhantomData,
@ -90,6 +92,8 @@ pub struct Game {
chunk_builder: chunk_builder::ChunkBuilder, chunk_builder: chunk_builder::ChunkBuilder,
connect_reply: Option<mpsc::Receiver<Result<server::Server, protocol::Error>>>, connect_reply: Option<mpsc::Receiver<Result<server::Server, protocol::Error>>>,
sdl: Sdl,
} }
impl Game { impl Game {
@ -226,10 +230,11 @@ fn main() {
should_close: false, should_close: false,
chunk_builder: chunk_builder::ChunkBuilder::new(resource_manager, textures), chunk_builder: chunk_builder::ChunkBuilder::new(resource_manager, textures),
connect_reply: None, connect_reply: None,
sdl: sdl,
}; };
game.renderer.camera.pos = cgmath::Point3::new(0.5, 13.2, 0.5); game.renderer.camera.pos = cgmath::Point3::new(0.5, 13.2, 0.5);
let mut events = sdl.event_pump().unwrap(); let mut events = game.sdl.event_pump().unwrap();
while !game.should_close { while !game.should_close {
let now = time::now(); let now = time::now();
@ -277,7 +282,7 @@ fn main() {
window.gl_swap_window(); window.gl_swap_window();
for event in events.poll_iter() { for event in events.poll_iter() {
handle_window_event(&window, &mut game, &mut ui_container, event) handle_window_event(&window, &mut game, &mut ui_container, event);
} }
} }
} }
@ -361,22 +366,24 @@ fn handle_window_event(window: &sdl2::video::Window,
Event::KeyDown{keycode: Some(Keycode::Backquote), ..} => { Event::KeyDown{keycode: Some(Keycode::Backquote), ..} => {
game.console.lock().unwrap().toggle(); game.console.lock().unwrap().toggle();
} }
Event::KeyDown{keycode: Some(key), ..} => { Event::KeyDown{keycode: Some(key), keymod, ..} => {
if game.focused { if game.focused {
if let Some(steven_key) = settings::Stevenkey::get_by_keycode(key, &game.vars) { if let Some(steven_key) = settings::Stevenkey::get_by_keycode(key, &game.vars) {
game.server.key_press(true, steven_key); game.server.key_press(true, steven_key);
} }
} else { } else {
ui_container.key_press(game, key, true); let ctrl_pressed = keymod.intersects(keyboard::LCTRLMOD | keyboard::RCTRLMOD);
ui_container.key_press(game, key, true, ctrl_pressed);
} }
} }
Event::KeyUp{keycode: Some(key), ..} => { Event::KeyUp{keycode: Some(key), keymod, ..} => {
if game.focused { if game.focused {
if let Some(steven_key) = settings::Stevenkey::get_by_keycode(key, &game.vars) { if let Some(steven_key) = settings::Stevenkey::get_by_keycode(key, &game.vars) {
game.server.key_press(false, steven_key); game.server.key_press(false, steven_key);
} }
} else { } else {
ui_container.key_press(game, key, false); let ctrl_pressed = keymod.intersects(keyboard::LCTRLMOD | keyboard::RCTRLMOD);
ui_container.key_press(game, key, false, ctrl_pressed);
} }
} }
Event::TextInput{text, ..} => { Event::TextInput{text, ..} => {

View File

@ -183,12 +183,12 @@ macro_rules! define_elements {
} }
} }
fn key_press(&self, game: &mut ::Game, key: Keycode, down: bool) { fn key_press(&self, game: &mut ::Game, key: Keycode, down: bool, ctrl_pressed: bool) {
match *self { match *self {
$( $(
Element::$name(ref inner) => { Element::$name(ref inner) => {
let mut el = inner.borrow_mut(); let mut el = inner.borrow_mut();
el.key_press(game, key, down); el.key_press(game, key, down, ctrl_pressed);
}, },
)* )*
} }
@ -395,7 +395,7 @@ impl Container {
focusables[next_focus].set_focused(true); focusables[next_focus].set_focused(true);
} }
pub fn key_press(&mut self, game: &mut ::Game, key: Keycode, down: bool) { pub fn key_press(&mut self, game: &mut ::Game, key: Keycode, down: bool, ctrl_pressed: bool) {
if key == Keycode::Tab { if key == Keycode::Tab {
if !down { if !down {
self.cycle_focus(); self.cycle_focus();
@ -405,7 +405,7 @@ impl Container {
for el in self.focusable_elements.iter() for el in self.focusable_elements.iter()
.flat_map(|v| v.upgrade()) { .flat_map(|v| v.upgrade()) {
if el.is_focused() { if el.is_focused() {
el.key_press(game, key, down); el.key_press(game, key, down, ctrl_pressed);
} }
} }
} }
@ -465,7 +465,7 @@ trait UIElement {
fn get_size(&self) -> (f64, f64); fn get_size(&self) -> (f64, f64);
fn is_dirty(&self) -> bool; fn is_dirty(&self) -> bool;
fn post_init(_: Rc<RefCell<Self>>) {} fn post_init(_: Rc<RefCell<Self>>) {}
fn key_press(&mut self, _game: &mut ::Game, _key: Keycode, _down: bool) {} fn key_press(&mut self, _game: &mut ::Game, _key: Keycode, _down: bool, _ctrl_pressed: bool) {}
fn key_type(&mut self, _game: &mut ::Game, _c: char) {} fn key_type(&mut self, _game: &mut ::Game, _c: char) {}
fn tick(&mut self, renderer: &mut render::Renderer); fn tick(&mut self, renderer: &mut render::Renderer);
} }
@ -1309,7 +1309,7 @@ impl TextBoxBuilder {
} }
impl UIElement for TextBox { impl UIElement for TextBox {
fn key_press(&mut self, game: &mut ::Game, key: Keycode, down: bool) { fn key_press(&mut self, game: &mut ::Game, key: Keycode, down: bool, ctrl_pressed: bool) {
match (key, down) { match (key, down) {
(Keycode::Backspace, false) => {self.input.pop();}, (Keycode::Backspace, false) => {self.input.pop();},
(Keycode::Return, false) => { (Keycode::Return, false) => {
@ -1321,6 +1321,15 @@ impl UIElement for TextBox {
} }
self.submit_funcs.append(&mut temp); self.submit_funcs.append(&mut temp);
}, },
(Keycode::V, true) => {
if ctrl_pressed {
let clipboard = game.sdl.video().unwrap().clipboard();
if clipboard.has_clipboard_text() {
let text = clipboard.clipboard_text().unwrap();
self.input.push_str(&text);
}
}
},
_ => {}, _ => {},
} }
} }