diff --git a/briar-gtk/briar_gtk/presenters/private_chat.py b/briar-gtk/briar_gtk/presenters/private_chat.py index dc9f4d1dd8cd907fb4b9dd8a84c336c467ee0924..ea4173e4675cb80e0a3b4786c6abc10e885c0762 100644 --- a/briar-gtk/briar_gtk/presenters/private_chat.py +++ b/briar-gtk/briar_gtk/presenters/private_chat.py @@ -5,7 +5,7 @@ import time from gettext import gettext as _ -from gi.repository import Gtk, GLib +from gi.repository import Gdk, Gtk, GLib from briar_wrapper.models.contacts import Contacts from briar_wrapper.models.private_chat import PrivateChat @@ -187,7 +187,7 @@ class PrivateChatPresenter: def _setup_chat_entry(self): chat_entry = self._view.builder.get_object("chat_entry") self._chat_entry_signal_id = chat_entry.connect( - "activate", self._on_chat_entry_activate + "key-press-event", self._on_chat_entry_activate ) chat_entry.grab_focus() @@ -244,14 +244,29 @@ class PrivateChatPresenter: chat_entry.disconnect(self._chat_entry_signal_id) del self._chat_entry_signal_id - def _on_chat_entry_activate(self, widget): - if len(widget.get_text()) == 0: - return + def _on_chat_entry_activate(self, widget, event): + # Return is pressed + if Gdk.keyval_name(event.keyval) != 'Return': + return False + # Shift is not pressed + if (event.state & Gdk.ModifierType.SHIFT_MASK) == Gdk.ModifierType.SHIFT_MASK: # noqa + return False + # Text does not only contain whitespace + if len(self._get_text_from_text_view(widget).strip()) == 0: + return False self._send_message(widget) self._sidebar_presenter.refresh_contacts() + return True + + @staticmethod + def _get_text_from_text_view(widget): + text_buffer = widget.get_buffer() + start_iter = text_buffer.get_start_iter() + end_iter = text_buffer.get_end_iter() + return text_buffer.get_text(start_iter, end_iter, True) def _send_message(self, widget): - message = widget.get_text() + message = self._get_text_from_text_view(widget) private_chat = PrivateChat(APP().api, self._view.contact_id) private_chat.send(message) @@ -268,5 +283,5 @@ class PrivateChatPresenter: "timestamp": int(round(time.time() * 1000)) }) - widget.set_text("") + widget.get_buffer().set_text("") GLib.idle_add(self._view.scroll_to_bottom) diff --git a/briar-gtk/data/ui/main_window.ui b/briar-gtk/data/ui/main_window.ui index e10eaa87cc1eb2bc60400b04edad79903a561a6c..a1a027384a95989f955f1d3c3f9b9ef8b1f8da90 100644 --- a/briar-gtk/data/ui/main_window.ui +++ b/briar-gtk/data/ui/main_window.ui @@ -111,27 +111,76 @@ </packing> </child> <child> - <object class="GtkBox"> + <object class="HdyClamp"> <property name="visible">True</property> + <property name="maximum_size">800</property> <!-- Same as in PrivateChatView --> + <property name="tightening_threshold">600</property> + <property name="hexpand">True</property> <child> - <object class="HdyClamp"> + <object class="GtkBox"> <property name="visible">True</property> - <property name="maximum_size">800</property> <!-- Same as in PrivateChatView --> - <property name="tightening_threshold">600</property> - <property name="hexpand">True</property> <child> - <object class="GtkEntry" id="chat_entry"> + <object class="GtkButton" id="entry_emoji_button"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="placeholder_text" translatable="yes" context="Used in input field in main window">Type Message</property> - <property name="show_emoji_icon">True</property> + <property name="action_name">win.open-emoji-menu</property> + <child> + <object class="GtkImage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon_name">face-smile-symbolic</property> + </object> + </child> + <accessibility> + + </accessibility> + <child internal-child="accessible"> + <object class="AtkObject" id="a11y-entry_emoji_button"> + <property name="AtkObject::accessible_name" translatable="yes">Show emojis</property> + </object> + </child> + </object> + </child> + <child> + <object class="GtkScrolledWindow"> + <property name="visible">True</property> + <property name="hexpand">True</property> + <child> + <object class="GtkTextView" id="chat_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="wrap_mode">word-char</property> + </object> + </child> + <style> + <class name="message-input-area" /> + </style> + </object> + </child> + <child> + <object class="GtkButton" id="entry_send_button"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="action_name">win.send-message</property> + <child> + <object class="GtkImage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon_name">media-playback-start</property> + </object> + </child> + <accessibility> + + </accessibility> + <child internal-child="accessible"> + <object class="AtkObject" id="a11y-entry_send_button"> + <property name="AtkObject::accessible_name" translatable="yes">Send</property> + </object> + </child> </object> </child> </object> </child> - <style> - <class name="message-input-area" /> - </style> </object> </child> </object>