|
|
@@ -11,6 +11,10 @@ use crate::{get_appdata, message, Appdata, MAX_MESSAGE_LENGTH, MAX_USERNAME_LENG
|
|
|
|
|
|
pub const USERS_PANEL_ID: &str = "users_view_id";
|
|
|
pub const MESSAGE_PANEL_ID: &str = "message_view_id";
|
|
|
+pub const CHANNEL_VIEW_ID: &str = "channel_view_id";
|
|
|
+pub const CHANNEL_NEW_FIELD_ID: &str = "channel_new_field_id";
|
|
|
+pub const CHANNEL_NEW_BUTTON_ID: &str = "CHANNEL_NEW_BUTTON_ID";
|
|
|
+pub const CHANNEL_CURRENT_PANEL_ID: &str = "CHANNEL_CURRENT_PANEL_ID";
|
|
|
pub const INPUT_FIELD_ID: &str = "input_field_id";
|
|
|
pub const INPUT_PANEL_ID: &str = "input_panel_id";
|
|
|
pub const INPUT_BUTTON_ID: &str = "input_button_id";
|
|
|
@@ -21,7 +25,8 @@ pub const USERNAME_FIELD_ID: &str = "username_field_id";
|
|
|
pub const USERNAME_BUTTON_ID: &str = "username_button_id";
|
|
|
pub const REFRESH_BUTTON_ID: &str = "refresh_button_id";
|
|
|
pub const BLOCKED_WORDS_BUTTON_ID: &str = "blocked_words_view_id";
|
|
|
-pub const SERVER_SETTINGS_FIELD_ID: &str = "server_settings_field_id";
|
|
|
+pub const SERVER_SETTINGS_ADDRESS_FIELD_ID: &str = "server_settings_address_field_id";
|
|
|
+pub const SERVER_SETTINGS_REFRESH_FIELD_ID: &str = "server_settings_refresh_field_id";
|
|
|
pub const SERVER_SETTINGS_BUTTON_ID: &str = "server_settings_button_id";
|
|
|
|
|
|
pub const DIALOGUE_MIN_SIZE: (u16, u16) = (20, 5);
|
|
|
@@ -34,12 +39,17 @@ pub enum Labels {
|
|
|
Close,
|
|
|
Submit,
|
|
|
Send,
|
|
|
+ New,
|
|
|
Clear,
|
|
|
Error,
|
|
|
User,
|
|
|
Users,
|
|
|
Message,
|
|
|
Messages,
|
|
|
+ Channel,
|
|
|
+ Channels,
|
|
|
+ NewChannel,
|
|
|
+ InvalidChannelNameExplination,
|
|
|
TypeAMessage,
|
|
|
SetLanguage,
|
|
|
SetUsername,
|
|
|
@@ -134,11 +144,11 @@ impl Labels {
|
|
|
Labels::InvalidUsernameExplination => {
|
|
|
buf = [
|
|
|
r"Invalid username. Must match ^[a-zA-Z0-9#_\-\.]{2,${MAX_USERNAME_LENGTH}}$"
|
|
|
- .replace("${MAX_MESSAGE_LENGTH}", &MAX_USERNAME_LENGTH.to_string()),
|
|
|
+ .replace("${MAX_USERNAME_LENGTH}", &MAX_USERNAME_LENGTH.to_string()),
|
|
|
r"Ongeldige gebruikersnaam. Moet overeenkomen met ^[a-zA-Z0-9#_\-\.]{2,${MAX_USERNAME_LENGTH}}$"
|
|
|
- .replace("${MAX_MESSAGE_LENGTH}", &MAX_USERNAME_LENGTH.to_string()),
|
|
|
+ .replace("${MAX_USERNAME_LENGTH}", &MAX_USERNAME_LENGTH.to_string()),
|
|
|
r"無効なユーザー名。 ^[a-zA-Z0-9#_\-\.]{2,${MAX_USERNAME_LENGTH}}$ に一致する必要があります"
|
|
|
- .replace("${MAX_MESSAGE_LENGTH}", &MAX_USERNAME_LENGTH.to_string()),
|
|
|
+ .replace("${MAX_USERNAME_LENGTH}", &MAX_USERNAME_LENGTH.to_string()),
|
|
|
];
|
|
|
|
|
|
[buf[0].as_str(), buf[1].as_str(), buf[2].as_str()]
|
|
|
@@ -162,12 +172,32 @@ impl Labels {
|
|
|
],
|
|
|
Labels::Submit => ["Submit", "Indienen", "提出する"],
|
|
|
Labels::ServerSettings => ["Server settings", "Serverinstellingen", "サーバー設定"],
|
|
|
- Labels::ServerAddress => ["Server address", "Serveradres", "サーバーアドレス"],
|
|
|
+ Labels::ServerAddress => [
|
|
|
+ "Server address (IP:Port)",
|
|
|
+ "Serveradres (IP:poort)",
|
|
|
+ "サーバーアドレス(IP:ポート)",
|
|
|
+ ],
|
|
|
Labels::ServerRefreshRate => [
|
|
|
"Update rate (seconds)",
|
|
|
"Updatefrequentie (seconden)",
|
|
|
"更新率 (秒)",
|
|
|
],
|
|
|
+ Labels::Channels => ["Channels", "Kanalen", "チャンネル"],
|
|
|
+ Labels::NewChannel => ["New Channel", "Nieuw kanaal", "新しいチャンネル"],
|
|
|
+ Labels::InvalidChannelNameExplination => {
|
|
|
+ buf = [
|
|
|
+ r"Invalid channel name. Must match ^[a-zA-Z0-9#_\-\.]{2,${MAX_USERNAME_LENGTH}}$"
|
|
|
+ .replace("${MAX_USERNAME_LENGTH}", &MAX_USERNAME_LENGTH.to_string()),
|
|
|
+ r"Ongeldige kanaalnaam. Moet overeenkomen met ^[a-zA-Z0-9#_\-\.]{2,${MAX_USERNAME_LENGTH}}$"
|
|
|
+ .replace("${MAX_USERNAME_LENGTH}", &MAX_USERNAME_LENGTH.to_string()),
|
|
|
+ r"無効なチャンネル名。 ^[a-zA-Z0-9#_\-\.]{2,${MAX_USERNAME_LENGTH}}$ に一致する必要があります"
|
|
|
+ .replace("${MAX_USERNAME_LENGTH}", &MAX_USERNAME_LENGTH.to_string()),
|
|
|
+ ];
|
|
|
+
|
|
|
+ [buf[0].as_str(), buf[1].as_str(), buf[2].as_str()]
|
|
|
+ }
|
|
|
+ Labels::New => ["New", "Nieuw", "新"],
|
|
|
+ Labels::Channel => ["Channel", "Kanaal", "チャネル"],
|
|
|
};
|
|
|
|
|
|
let idx = match language {
|
|
|
@@ -237,6 +267,10 @@ pub fn keybind_close_manual_end(siv: &mut Cursive, close_all: bool) {
|
|
|
|
|
|
pub fn visual_update(siv: &mut Cursive) {
|
|
|
let appdata = get_appdata(siv);
|
|
|
+ let current_channel = appdata.current_channel;
|
|
|
+ let language = get_appdata(siv).language;
|
|
|
+
|
|
|
+ // --- Messages ---
|
|
|
|
|
|
let mut messages: Vec<message::MessageSanitized> = appdata
|
|
|
.messages
|
|
|
@@ -252,7 +286,6 @@ pub fn visual_update(siv: &mut Cursive) {
|
|
|
message.remove_blocked_phrases(siv);
|
|
|
}
|
|
|
|
|
|
- // Messages
|
|
|
siv.call_on_name(
|
|
|
MESSAGE_PANEL_ID,
|
|
|
|panel: &mut Panel<ScrollView<SelectView>>| {
|
|
|
@@ -261,7 +294,10 @@ pub fn visual_update(siv: &mut Cursive) {
|
|
|
let selected = view.selected_id();
|
|
|
|
|
|
view.clear();
|
|
|
- for message in messages.iter() {
|
|
|
+ for message in messages
|
|
|
+ .iter()
|
|
|
+ .filter(|x| channel_matches(&x.channel, ¤t_channel))
|
|
|
+ {
|
|
|
view.add_item(
|
|
|
// TODO: Localized timestamps
|
|
|
format!(
|
|
|
@@ -280,19 +316,24 @@ pub fn visual_update(siv: &mut Cursive) {
|
|
|
},
|
|
|
);
|
|
|
|
|
|
- // Members list
|
|
|
+ // --- Members list ---
|
|
|
+
|
|
|
siv.call_on_name(
|
|
|
USERS_PANEL_ID,
|
|
|
|panel: &mut Panel<ScrollView<SelectView>>| {
|
|
|
let view = panel.get_inner_mut().get_inner_mut();
|
|
|
|
|
|
let mut senders: Vec<String> = vec![];
|
|
|
- for message in messages.iter() {
|
|
|
+ for message in messages
|
|
|
+ .iter()
|
|
|
+ .filter(|x| channel_matches(&x.channel, ¤t_channel))
|
|
|
+ {
|
|
|
if senders.contains(&message.sender) {
|
|
|
continue;
|
|
|
}
|
|
|
senders.push(message.sender.clone());
|
|
|
}
|
|
|
+ senders.sort();
|
|
|
|
|
|
let selected = view.selected_id();
|
|
|
view.clear();
|
|
|
@@ -306,7 +347,50 @@ pub fn visual_update(siv: &mut Cursive) {
|
|
|
},
|
|
|
);
|
|
|
|
|
|
- // Current username
|
|
|
+ // --- Channels ---
|
|
|
+
|
|
|
+ siv.call_on_name(
|
|
|
+ CHANNEL_VIEW_ID,
|
|
|
+ |panel: &mut Panel<ScrollView<SelectView>>| {
|
|
|
+ let view = panel.get_inner_mut().get_inner_mut();
|
|
|
+
|
|
|
+ let mut channels = appdata.local_channels.clone();
|
|
|
+ for message in messages.iter() {
|
|
|
+ if !channels.contains(&message.channel) {
|
|
|
+ channels.push(message.channel.clone());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ channels.sort();
|
|
|
+
|
|
|
+ let selected = view.selected_id();
|
|
|
+ view.clear();
|
|
|
+
|
|
|
+ for channel in channels {
|
|
|
+ view.add_item(channel.clone(), channel.clone());
|
|
|
+ }
|
|
|
+
|
|
|
+ if let Some(selected) = selected {
|
|
|
+ view.set_selection(selected);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ );
|
|
|
+
|
|
|
+ // --- Current channel ---
|
|
|
+
|
|
|
+ let appdata_c = get_appdata(siv);
|
|
|
+ siv.call_on_name(
|
|
|
+ CHANNEL_CURRENT_PANEL_ID,
|
|
|
+ |view: &mut NamedView<Panel<TextView>>| {
|
|
|
+ view.get_mut()
|
|
|
+ .get_inner_mut()
|
|
|
+ .set_content(appdata_c.current_channel);
|
|
|
+
|
|
|
+ view.get_mut().set_title(Labels::Channel.localize(language));
|
|
|
+ },
|
|
|
+ );
|
|
|
+
|
|
|
+ // --- Current username ---
|
|
|
+
|
|
|
siv.call_on_name(
|
|
|
CURRENT_USERNAME_PANEL_ID,
|
|
|
|view: &mut NamedView<Panel<TextView>>| {
|
|
|
@@ -314,18 +398,23 @@ pub fn visual_update(siv: &mut Cursive) {
|
|
|
},
|
|
|
);
|
|
|
|
|
|
- // Localize buttons
|
|
|
- let language = get_appdata(siv).language;
|
|
|
+ // --- Localize buttons ---
|
|
|
|
|
|
for (name, label) in [
|
|
|
(USERS_PANEL_ID, Labels::Users.localize(language)),
|
|
|
(MESSAGE_PANEL_ID, Labels::Messages.localize(language)),
|
|
|
+ (CHANNEL_VIEW_ID, Labels::Channels.localize(language)),
|
|
|
] {
|
|
|
siv.call_on_name(name, |panel: &mut Panel<ScrollView<SelectView>>| {
|
|
|
panel.set_title(label);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+ siv.call_on_name(CHANNEL_NEW_BUTTON_ID, |view: &mut NamedView<Button>| {
|
|
|
+ view.get_mut()
|
|
|
+ .set_label(Labels::NewChannel.localize(language));
|
|
|
+ });
|
|
|
+
|
|
|
siv.call_on_name(INPUT_PANEL_ID, |panel: &mut Panel<LinearLayout>| {
|
|
|
panel.set_title(Labels::TypeAMessage.localize(language));
|
|
|
});
|
|
|
@@ -380,3 +469,7 @@ pub fn change_language(siv: &mut Cursive, language: Language) {
|
|
|
|
|
|
visual_update(siv);
|
|
|
}
|
|
|
+
|
|
|
+pub fn channel_matches(message_channel: &str, reference_channel: &str) -> bool {
|
|
|
+ message_channel == reference_channel
|
|
|
+}
|