Merge branch 'command-chat-key' into 'master'

Open chat with '/' when pressing Key::Command (default is '/')

See merge request veloren/veloren!128
This commit is contained in:
Imbris 2019-07-05 17:19:11 +00:00
commit ab2c2dd940
5 changed files with 60 additions and 9 deletions

6
Cargo.lock generated
View File

@ -360,7 +360,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "conrod_core"
version = "0.63.0"
source = "git+https://gitlab.com/veloren/conrod.git#93f02e61838b475ff190b3563a0f41f8981cc228"
source = "git+https://gitlab.com/veloren/conrod.git#d603363488870eae9df91ba45ba795509c8a6ab4"
dependencies = [
"conrod_derive 0.63.0 (git+https://gitlab.com/veloren/conrod.git)",
"daggy 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
@ -374,7 +374,7 @@ dependencies = [
[[package]]
name = "conrod_derive"
version = "0.63.0"
source = "git+https://gitlab.com/veloren/conrod.git#93f02e61838b475ff190b3563a0f41f8981cc228"
source = "git+https://gitlab.com/veloren/conrod.git#d603363488870eae9df91ba45ba795509c8a6ab4"
dependencies = [
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
"quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
@ -384,7 +384,7 @@ dependencies = [
[[package]]
name = "conrod_winit"
version = "0.63.0"
source = "git+https://gitlab.com/veloren/conrod.git#93f02e61838b475ff190b3563a0f41f8981cc228"
source = "git+https://gitlab.com/veloren/conrod.git#d603363488870eae9df91ba45ba795509c8a6ab4"
[[package]]
name = "constant_time_eq"

View File

@ -2,6 +2,7 @@ use super::{img_ids::Imgs, Fonts, TEXT_COLOR};
use conrod_core::{
input::Key,
position::Dimension,
text::cursor::Index,
widget::{self, Button, Id, List, Rectangle, Text, TextEdit},
widget_ids, Colorable, Positionable, Sizeable, UiCell, Widget, WidgetCommon,
};
@ -22,6 +23,8 @@ const MAX_MESSAGES: usize = 100;
#[derive(WidgetCommon)]
pub struct Chat<'a> {
new_messages: &'a mut VecDeque<String>,
force_input: Option<String>,
force_cursor: Option<Index>,
imgs: &'a Imgs,
fonts: &'a Fonts,
@ -34,12 +37,24 @@ impl<'a> Chat<'a> {
pub fn new(new_messages: &'a mut VecDeque<String>, imgs: &'a Imgs, fonts: &'a Fonts) -> Self {
Self {
new_messages,
force_input: None,
force_cursor: None,
imgs,
fonts,
common: widget::CommonBuilder::default(),
}
}
pub fn input(mut self, input: String) -> Self {
self.force_input = Some(input);
self
}
pub fn cursor_pos(mut self, index: Index) -> Self {
self.force_cursor = Some(index);
self
}
fn scrolled_to_bottom(state: &State, ui: &UiCell) -> bool {
// Might be more efficient to cache result and update it when a scroll event has occurred
// instead of every frame.
@ -74,8 +89,8 @@ impl<'a> Widget for Chat<'a> {
fn init_state(&self, id_gen: widget::id::Generator) -> Self::State {
State {
messages: VecDeque::new(),
input: "".to_owned(),
messages: VecDeque::new(),
ids: Ids::new(id_gen),
}
}
@ -101,18 +116,30 @@ impl<'a> Widget for Chat<'a> {
});
let keyboard_capturer = ui.global_input().current.widget_capturing_keyboard;
let input_focused = keyboard_capturer == Some(state.ids.input);
if let Some(input) = &self.force_input {
state.update(|s| s.input = input.clone());
}
let input_focused =
keyboard_capturer == Some(state.ids.input) || keyboard_capturer == Some(id);
// Only show if it has the keyboard captured.
// Chat input uses a rectangle as its background.
if input_focused {
let text_edit = TextEdit::new(&state.input)
let input = self.force_input.as_ref().unwrap_or(&state.input);
let mut text_edit = TextEdit::new(input)
.w(460.0)
.restrict_to_height(false)
.color(TEXT_COLOR)
.line_spacing(2.0)
.font_size(15)
.font_id(self.fonts.opensans);
if let Some(pos) = self.force_cursor {
text_edit = text_edit.cursor_pos(pos);
}
let y = match text_edit.get_y_dimension(ui) {
Dimension::Absolute(y) => y + 6.0,
_ => 0.0,
@ -122,6 +149,7 @@ impl<'a> Widget for Chat<'a> {
.bottom_left_with_margins_on(ui.window, 10.0, 10.0)
.w(470.0)
.set(state.ids.input_bg, ui);
if let Some(str) = text_edit
.top_left_with_margins_on(state.ids.input_bg, 1.0, 1.0)
.set(state.ids.input, ui)

View File

@ -33,6 +33,7 @@ use crate::{
use client::Client;
use common::{comp, terrain::TerrainChunkSize, vol::VolSize};
use conrod_core::{
text::cursor::Index,
widget::{self, Button, Image, Rectangle, Text},
widget_ids, Color, Colorable, Labelable, Positionable, Sizeable, Widget,
};
@ -259,6 +260,8 @@ pub struct Hud {
show: Show,
to_focus: Option<Option<widget::Id>>,
force_ungrab: bool,
force_chat_input: Option<String>,
force_chat_cursor: Option<Index>,
}
impl Hud {
@ -296,6 +299,8 @@ impl Hud {
},
to_focus: None,
force_ungrab: false,
force_chat_input: None,
force_chat_cursor: None,
}
}
@ -561,9 +566,17 @@ impl Hud {
}
// Chat box
match Chat::new(&mut self.new_messages, &self.imgs, &self.fonts)
.set(self.ids.chat, ui_widgets)
{
let mut chat = Chat::new(&mut self.new_messages, &self.imgs, &self.fonts);
if let Some(input) = self.force_chat_input.take() {
chat = chat.input(input);
}
if let Some(pos) = self.force_chat_cursor.take() {
chat = chat.cursor_pos(pos);
}
match chat.set(self.ids.chat, ui_widgets) {
Some(chat::Event::SendMessage(message)) => {
events.push(Event::SendMessage(message));
}
@ -739,6 +752,12 @@ impl Hud {
// Press key while not typing
WinEvent::InputUpdate(key, true) if !self.typing() => match key {
GameInput::Command => {
self.force_chat_input = Some("/".to_owned());
self.force_chat_cursor = Some(Index { line: 0, char: 1 });
self.ui.focus_widget(Some(self.ids.chat));
true
}
GameInput::Map => {
self.show.toggle_map();
true

View File

@ -11,6 +11,7 @@ pub struct ControlSettings {
pub toggle_cursor: KeyMouse,
pub escape: KeyMouse,
pub enter: KeyMouse,
pub command: KeyMouse,
pub move_forward: KeyMouse,
pub move_left: KeyMouse,
pub move_back: KeyMouse,
@ -41,6 +42,7 @@ impl Default for ControlSettings {
toggle_cursor: KeyMouse::Key(VirtualKeyCode::Tab),
escape: KeyMouse::Key(VirtualKeyCode::Escape),
enter: KeyMouse::Key(VirtualKeyCode::Return),
command: KeyMouse::Key(VirtualKeyCode::Slash),
move_forward: KeyMouse::Key(VirtualKeyCode::W),
move_left: KeyMouse::Key(VirtualKeyCode::A),
move_back: KeyMouse::Key(VirtualKeyCode::S),

View File

@ -19,6 +19,7 @@ pub enum GameInput {
Jump,
Glide,
Enter,
Command,
Escape,
Map,
Bag,
@ -110,6 +111,7 @@ impl Window {
key_map.insert(settings.controls.toggle_cursor, GameInput::ToggleCursor);
key_map.insert(settings.controls.escape, GameInput::Escape);
key_map.insert(settings.controls.enter, GameInput::Enter);
key_map.insert(settings.controls.command, GameInput::Command);
key_map.insert(settings.controls.move_forward, GameInput::MoveForward);
key_map.insert(settings.controls.move_left, GameInput::MoveLeft);
key_map.insert(settings.controls.move_back, GameInput::MoveBack);