mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Chat tab message notification and disable chat tab fade-out
This commit is contained in:
parent
4d638540e0
commit
1cb0b6a84e
@ -19,6 +19,7 @@ use conrod_core::{
|
||||
};
|
||||
use i18n::Localization;
|
||||
use i18n_helpers::localize_chat_message;
|
||||
use inline_tweak::tweak;
|
||||
use std::collections::{HashSet, VecDeque};
|
||||
use vek::Vec2;
|
||||
|
||||
@ -83,6 +84,7 @@ pub struct Chat<'a> {
|
||||
history_max: usize,
|
||||
chat_size: Vec2<f64>,
|
||||
chat_pos: Vec2<f64>,
|
||||
unread_tabs: Vec<bool>,
|
||||
|
||||
localized_strings: &'a Localization,
|
||||
}
|
||||
@ -98,6 +100,7 @@ impl<'a> Chat<'a> {
|
||||
localized_strings: &'a Localization,
|
||||
chat_size: Vec2<f64>,
|
||||
chat_pos: Vec2<f64>,
|
||||
unread_tabs: Vec<bool>,
|
||||
) -> Self {
|
||||
Self {
|
||||
pulse,
|
||||
@ -114,6 +117,7 @@ impl<'a> Chat<'a> {
|
||||
chat_size,
|
||||
chat_pos,
|
||||
localized_strings,
|
||||
unread_tabs,
|
||||
}
|
||||
}
|
||||
|
||||
@ -190,6 +194,7 @@ pub enum Event {
|
||||
ShowChatTabSettings(usize),
|
||||
ResizeChat(Vec2<f64>),
|
||||
MoveChat(Vec2<f64>),
|
||||
UpdateUnread(Vec<bool>),
|
||||
}
|
||||
|
||||
impl<'a> Widget for Chat<'a> {
|
||||
@ -286,6 +291,28 @@ impl<'a> Widget for Chat<'a> {
|
||||
|
||||
handle_chat_mouse_events(state.ids.draggable_area, ui, &mut events);
|
||||
|
||||
let group_members = self
|
||||
.client
|
||||
.group_members()
|
||||
.iter()
|
||||
.filter_map(|(u, r)| match r {
|
||||
Role::Member => Some(u),
|
||||
Role::Pet => None,
|
||||
})
|
||||
.collect::<HashSet<_>>();
|
||||
|
||||
let chat_tabs_with_new_content = chat_tabs.iter().map(|tab| {
|
||||
self.new_messages
|
||||
.iter()
|
||||
.any(|new_message| tab.filter.satisfies(new_message, &group_members))
|
||||
});
|
||||
let mut new_unread: Vec<bool> = self
|
||||
.unread_tabs
|
||||
.iter()
|
||||
.zip(chat_tabs_with_new_content)
|
||||
.map(|(a, b)| a | b)
|
||||
.collect();
|
||||
|
||||
// Maintain scrolling //
|
||||
if !self.new_messages.is_empty() {
|
||||
for message in self.new_messages.iter() {
|
||||
@ -521,15 +548,6 @@ impl<'a> Widget for Chat<'a> {
|
||||
.resize(s.messages.len(), &mut ui.widget_id_generator())
|
||||
});
|
||||
}
|
||||
let group_members = self
|
||||
.client
|
||||
.group_members()
|
||||
.iter()
|
||||
.filter_map(|(u, r)| match r {
|
||||
Role::Member => Some(u),
|
||||
Role::Pet => None,
|
||||
})
|
||||
.collect::<HashSet<_>>();
|
||||
let show_char_name = chat_settings.chat_character_name;
|
||||
let messages = &state
|
||||
.messages
|
||||
@ -643,12 +661,15 @@ impl<'a> Widget for Chat<'a> {
|
||||
{
|
||||
state.update(|s| s.tabs_last_hover_pulse = Some(self.pulse));
|
||||
}
|
||||
|
||||
if let Some(time_since_hover) = state
|
||||
.tabs_last_hover_pulse
|
||||
.map(|t| self.pulse - t)
|
||||
.filter(|t| t <= &1.5)
|
||||
{
|
||||
let time_since_hover = if chat_settings.chat_tab_fade {
|
||||
state
|
||||
.tabs_last_hover_pulse
|
||||
.map(|t| self.pulse - t)
|
||||
.filter(|t| t <= &1.5)
|
||||
} else {
|
||||
Some(0.0)
|
||||
};
|
||||
if let Some(time_since_hover) = time_since_hover {
|
||||
let alpha = 1.0 - (time_since_hover / 1.5).powi(4);
|
||||
let shading = color::rgba(1.0, 0.82, 0.27, (chat_settings.chat_opacity + 0.1) * alpha);
|
||||
|
||||
@ -693,7 +714,8 @@ impl<'a> Widget for Chat<'a> {
|
||||
});
|
||||
}
|
||||
for (i, chat_tab) in chat_tabs.iter().enumerate() {
|
||||
if Button::image(if chat_settings.chat_tab_index == Some(i) {
|
||||
let is_unread = new_unread[i];
|
||||
if Button::image(if chat_settings.chat_tab_index == Some(i) || is_unread {
|
||||
self.imgs.selection
|
||||
} else {
|
||||
self.imgs.nothing
|
||||
@ -701,7 +723,6 @@ impl<'a> Widget for Chat<'a> {
|
||||
.w_h(chat_tab_width, CHAT_TAB_HEIGHT)
|
||||
.hover_image(self.imgs.selection_hover)
|
||||
.press_image(self.imgs.selection_press)
|
||||
.image_color(shading)
|
||||
.label(chat_tab.label.as_str())
|
||||
.label_font_size(self.fonts.cyri.scale(14))
|
||||
.label_font_id(self.fonts.cyri.conrod_id)
|
||||
@ -714,9 +735,17 @@ impl<'a> Widget for Chat<'a> {
|
||||
},
|
||||
0.0,
|
||||
)
|
||||
.and(|r| {
|
||||
if is_unread && chat_settings.chat_tab_index != Some(i) {
|
||||
r.image_color(shading.complement())
|
||||
} else {
|
||||
r.image_color(shading)
|
||||
}
|
||||
})
|
||||
.set(state.ids.chat_tabs[i], ui)
|
||||
.was_clicked()
|
||||
{
|
||||
new_unread[i] = false;
|
||||
events.push(Event::ChangeChatTab(Some(i)));
|
||||
}
|
||||
|
||||
@ -815,7 +844,7 @@ impl<'a> Widget for Chat<'a> {
|
||||
}
|
||||
})
|
||||
.set(state.ids.draggable_area, ui);
|
||||
|
||||
events.push(Event::UpdateUnread(new_unread));
|
||||
events
|
||||
}
|
||||
}
|
||||
|
@ -1296,6 +1296,7 @@ pub struct Hud {
|
||||
map_drag: Vec2<f64>,
|
||||
chat_size: Vec2<f64>,
|
||||
chat_pos: Vec2<f64>,
|
||||
unread_tabs: Vec<bool>,
|
||||
}
|
||||
|
||||
impl Hud {
|
||||
@ -1433,6 +1434,7 @@ impl Hud {
|
||||
map_drag: Vec2::zero(),
|
||||
chat_size: Vec2::new(DEFAULT_CHAT_BOX_WIDTH, DEFAULT_CHAT_BOX_HEIGHT),
|
||||
chat_pos: Vec2::new(10.0, 10.0),
|
||||
unread_tabs: vec![false; global_state.settings.chat.chat_tabs.len()],
|
||||
}
|
||||
}
|
||||
|
||||
@ -3502,6 +3504,7 @@ impl Hud {
|
||||
i18n,
|
||||
self.chat_size,
|
||||
self.chat_pos,
|
||||
self.unread_tabs.clone(),
|
||||
)
|
||||
.and_then(self.force_chat_input.take(), |c, input| c.input(input))
|
||||
.and_then(self.tab_complete.take(), |c, input| {
|
||||
@ -3537,6 +3540,9 @@ impl Hud {
|
||||
chat::Event::MoveChat(pos) => {
|
||||
self.chat_pos = pos;
|
||||
},
|
||||
chat::Event::UpdateUnread(unread) => {
|
||||
self.unread_tabs = unread;
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -3588,6 +3594,16 @@ impl Hud {
|
||||
},
|
||||
_ => {},
|
||||
},
|
||||
SettingsChange::Chat(chat_change) => match chat_change {
|
||||
ChatChange::ChatTabInsert(idx, _) => {
|
||||
self.unread_tabs.insert(*idx, false)
|
||||
},
|
||||
ChatChange::ChatTabRemove(idx) => {
|
||||
self.unread_tabs.remove(*idx);
|
||||
},
|
||||
ChatChange::ResetChatSettings => self.unread_tabs.truncate(1),
|
||||
_ => {},
|
||||
},
|
||||
_ => {},
|
||||
}
|
||||
events.push(Event::SettingsChange(settings_change));
|
||||
|
@ -26,6 +26,8 @@ widget_ids! {
|
||||
transp_value,
|
||||
char_name_text,
|
||||
char_name_button,
|
||||
chat_tab_fade_text,
|
||||
chat_tab_fade_button,
|
||||
reset_chat_button,
|
||||
|
||||
//Tabs
|
||||
@ -213,12 +215,35 @@ impl<'a> Widget for Chat<'a> {
|
||||
)));
|
||||
}
|
||||
|
||||
// "Show character names in chat" toggle button
|
||||
Text::new("Fade out Chat Tabs")
|
||||
.down_from(state.ids.char_name_text, 10.0)
|
||||
.font_size(self.fonts.cyri.scale(14))
|
||||
.font_id(self.fonts.cyri.conrod_id)
|
||||
.color(TEXT_COLOR)
|
||||
.set(state.ids.chat_tab_fade_text, ui);
|
||||
|
||||
if chat_settings.chat_tab_fade
|
||||
!= ToggleButton::new(
|
||||
chat_settings.chat_tab_fade,
|
||||
self.imgs.checkbox,
|
||||
self.imgs.checkbox_checked,
|
||||
)
|
||||
.w_h(18.0, 18.0)
|
||||
.right_from(state.ids.chat_tab_fade_text, 10.0)
|
||||
.hover_images(self.imgs.checkbox_mo, self.imgs.checkbox_checked_mo)
|
||||
.press_images(self.imgs.checkbox_press, self.imgs.checkbox_checked)
|
||||
.set(state.ids.chat_tab_fade_button, ui)
|
||||
{
|
||||
events.push(Event::ChatChange(ChatTabFade(!chat_settings.chat_tab_fade)));
|
||||
}
|
||||
|
||||
// Reset the chat settings to the default settings
|
||||
if Button::image(self.imgs.button)
|
||||
.w_h(RESET_BUTTONS_WIDTH, RESET_BUTTONS_HEIGHT)
|
||||
.hover_image(self.imgs.button_hover)
|
||||
.press_image(self.imgs.button_press)
|
||||
.down_from(state.ids.char_name_text, 20.0)
|
||||
.down_from(state.ids.chat_tab_fade_text, 20.0)
|
||||
.label(&self.localized_strings.get_msg("hud-settings-reset_chat"))
|
||||
.label_font_size(self.fonts.cyri.scale(14))
|
||||
.label_color(TEXT_COLOR)
|
||||
|
@ -43,6 +43,7 @@ pub enum Chat {
|
||||
ChatTabInsert(usize, ChatTab),
|
||||
ChatTabMove(usize, usize), //(i, j) move item from position i, and insert into position j
|
||||
ChatTabRemove(usize),
|
||||
ChatTabFade(bool),
|
||||
ResetChatSettings,
|
||||
}
|
||||
#[derive(Clone)]
|
||||
@ -351,6 +352,9 @@ impl SettingsChange {
|
||||
settings.chat.chat_tabs.remove(i);
|
||||
}
|
||||
},
|
||||
Chat::ChatTabFade(fade) => {
|
||||
settings.chat.chat_tab_fade = fade;
|
||||
},
|
||||
Chat::ResetChatSettings => {
|
||||
settings.chat = ChatSettings::default();
|
||||
},
|
||||
|
@ -73,6 +73,7 @@ pub struct ChatSettings {
|
||||
pub chat_character_name: bool,
|
||||
pub chat_tabs: Vec<ChatTab>,
|
||||
pub chat_tab_index: Option<usize>,
|
||||
pub chat_tab_fade: bool,
|
||||
pub chat_cmd_prefix: char,
|
||||
}
|
||||
|
||||
@ -83,6 +84,7 @@ impl Default for ChatSettings {
|
||||
chat_character_name: true,
|
||||
chat_tabs: vec![ChatTab::default()],
|
||||
chat_tab_index: Some(0),
|
||||
chat_tab_fade: false,
|
||||
chat_cmd_prefix: '/',
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user