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::sync::mpsc;
use protocol::mojang;
use sdl2::Sdl;
use sdl2::keyboard;
const CL_BRAND: console::CVar<String> = console::CVar {
ty: PhantomData,
@ -90,6 +92,8 @@ pub struct Game {
chunk_builder: chunk_builder::ChunkBuilder,
connect_reply: Option<mpsc::Receiver<Result<server::Server, protocol::Error>>>,
sdl: Sdl,
}
impl Game {
@ -226,10 +230,11 @@ fn main() {
should_close: false,
chunk_builder: chunk_builder::ChunkBuilder::new(resource_manager, textures),
connect_reply: None,
sdl: sdl,
};
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 {
let now = time::now();
@ -277,7 +282,7 @@ fn main() {
window.gl_swap_window();
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), ..} => {
game.console.lock().unwrap().toggle();
}
Event::KeyDown{keycode: Some(key), ..} => {
Event::KeyDown{keycode: Some(key), keymod, ..} => {
if game.focused {
if let Some(steven_key) = settings::Stevenkey::get_by_keycode(key, &game.vars) {
game.server.key_press(true, steven_key);
}
} 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 let Some(steven_key) = settings::Stevenkey::get_by_keycode(key, &game.vars) {
game.server.key_press(false, steven_key);
}
} 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, ..} => {

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 {
$(
Element::$name(ref inner) => {
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);
}
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 !down {
self.cycle_focus();
@ -405,7 +405,7 @@ impl Container {
for el in self.focusable_elements.iter()
.flat_map(|v| v.upgrade()) {
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 is_dirty(&self) -> bool;
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 tick(&mut self, renderer: &mut render::Renderer);
}
@ -1309,7 +1309,7 @@ impl TextBoxBuilder {
}
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) {
(Keycode::Backspace, false) => {self.input.pop();},
(Keycode::Return, false) => {
@ -1321,6 +1321,15 @@ impl UIElement for TextBox {
}
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);
}
}
},
_ => {},
}
}