Commit e38b0b2b authored by Nico's avatar Nico
Browse files

Put more responsibilities into MainWindowController

parent 8e368723
......@@ -93,4 +93,4 @@ class WindowActions(Actions):
# pylint: disable=unused-argument
def _open_private_chat(self, action, contact_id):
self.widget.current_container.open_private_chat(contact_id.get_int32())
self.widget.current_controller.open_private_chat(contact_id.get_int32())
......@@ -2,6 +2,9 @@
# SPDX-License-Identifier: AGPL-3.0-only
# License-Filename: LICENSE.md
from briar_wrapper.models.contacts import Contacts
from briar_gtk.containers.private_chat import PrivateChatContainer
from briar_gtk.controllers.main_menu import MainMenuController
from briar_gtk.controllers.private_chat import PrivateChatController
from briar_gtk.controllers.sidebar import SidebarController
......@@ -16,8 +19,17 @@ class MainWindowController():
def __init__(self, main_window_view, builder):
self._main_window_view = main_window_view
self._builder = builder
self._signals = list()
self._setup_children()
self._load_content()
self._setup_destroy_listener()
def open_private_chat(self, contact_id):
contact_name = self._get_contact_name(contact_id)
self._prepare_chat_view(contact_name)
self._setup_private_chat_widget(contact_name, contact_id)
self._current_contact_id = contact_id
def _setup_children(self):
self._sidebar_view = SidebarView(self._builder)
......@@ -31,3 +43,123 @@ class MainWindowController():
self._main_menu_view = MainMenuView()
self._main_menu_controller = MainMenuController(
self._main_menu_view, APP().api)
def _get_contact_name(self, contact_id):
name = ""
for contact in Contacts(APP().api).get():
if contact["contactId"] == contact_id:
name = contact["author"]["name"]
if "alias" in contact:
name = contact["alias"]
break
return name
def _prepare_chat_view(self, contact_name):
main_content_stack = self._builder.get_object("main_content_stack")
chat_placeholder = main_content_stack.get_child_by_name(
"chat_placeholder")
if self._no_chat_opened():
chat_placeholder.hide()
else:
self._clear_history_container()
chat_view = main_content_stack.get_child_by_name("chat_view")
chat_view.show()
main_window_leaflet = self._builder.get_object("main_window_leaflet")
main_content_container = self._builder.get_object(
"main_content_container")
main_window_leaflet.set_visible_child(main_content_container)
contact_name_label = self._builder.get_object("contact_name")
contact_name_label.set_text(contact_name)
self._builder.get_object("chat_menu_button").show()
def _no_chat_opened(self):
main_content_stack = self._builder.get_object("main_content_stack")
chat_placeholder = main_content_stack.get_child_by_name(
"chat_placeholder")
return chat_placeholder.get_visible()
def _clear_history_container(self):
history_container = self._builder.get_object("history_container")
children = history_container.get_children()
for child in children:
child.destroy()
if hasattr(self, "_selected_contact"):
del self._selected_contact
# pylint: disable=no-member
def _load_content(self):
socket_listener = APP().api.socket_listener
self._setup_contact_added_listeners(socket_listener)
self._setup_message_received_listeners(socket_listener)
def _setup_contact_added_listeners(self, socket_listener):
signal_id = socket_listener.connect("ContactAddedEvent",
self._notify_contact_added)
self._signals.append(signal_id)
def _setup_message_received_listeners(self, socket_listener):
signal_id = socket_listener.connect("ConversationMessageReceivedEvent",
self._notify_message_received)
self._signals.append(signal_id)
# pylint: disable=unused-argument
def _notify_contact_added(self, message):
self._notify(
_("Contact added"), # context: "Notification"
NOTIFICATION_CONTACT_ADDED
)
# pylint: disable=unused-argument
def _notify_message_received(self, message):
self._notify(
_("New private message"), # context: "Notification"
NOTIFICATION_PRIVATE_MESSAGE
)
@staticmethod
def _notify(title, identifier):
if APP().window.is_active():
return
notification = Gio.Notification.new(title)
notification.set_priority(Gio.NotificationPriority.HIGH)
APP().send_notification(identifier, notification)
def _setup_destroy_listener(self):
self._main_window_view.connect("destroy", self._on_destroy)
# pylint: disable=unused-argument
def _on_destroy(self, widget):
self._disconnect_signals()
def _disconnect_signals(self):
self._sidebar_controller.disconnect_signals()
for signal in self._signals:
APP().api.socket_listener.disconnect(signal)
def _setup_private_chat_widget(self, contact_name, contact_id):
self._current_private_chat_widget = PrivateChatContainer(
contact_name, contact_id)
history_container = self._builder.get_object("history_container")
history_container.add(self._current_private_chat_widget)
history_container.show_all()
self._disconnect_chat_entry_signals()
chat_entry = self._builder.get_object("chat_entry")
self._chat_entry_signal_id = chat_entry.connect(
"activate", self._on_chat_entry_activate
)
chat_entry.grab_focus()
def _disconnect_chat_entry_signals(self):
if not hasattr(self, "_chat_entry_signal_id"):
return
chat_entry = self._builder.get_object("chat_entry")
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
self._current_private_chat_widget.send_message(widget)
self._refresh_contacts()
......@@ -33,10 +33,8 @@ class MainWindowView(Gtk.Overlay):
def __init__(self, builder):
super().__init__()
self._builder = builder
self._signals = list()
self._setup_view()
self._load_content()
@property
def main_window_leaflet(self):
......@@ -79,12 +77,6 @@ class MainWindowView(Gtk.Overlay):
about_dialog = AboutDialogWidget()
about_dialog.show()
def open_private_chat(self, contact_id):
contact_name = self._get_contact_name(contact_id)
self._prepare_chat_view(contact_name)
self._setup_private_chat_widget(contact_name, contact_id)
self._current_contact_id = contact_id
def show_sidebar(self):
self.main_window_leaflet.set_visible_child(
self._builder.get_object("sidebar_box"))
......@@ -168,55 +160,12 @@ class MainWindowView(Gtk.Overlay):
self.show_sidebar()
widget.destroy()
def _prepare_chat_view(self, contact_name):
if self._no_chat_opened():
self.chat_placeholder.hide()
else:
self._clear_history_container()
self.chat_view.show()
self.main_window_leaflet.set_visible_child(
self.main_content_container)
self.contact_name_label.set_text(contact_name)
self._builder.get_object("chat_menu_button").show()
def _setup_private_chat_widget(self, contact_name, contact_id):
self._current_private_chat_widget = PrivateChatContainer(
contact_name, contact_id)
self.history_container.add(self._current_private_chat_widget)
self.history_container.show_all()
self._disconnect_chat_entry_signals()
self._chat_entry_signal_id = self.chat_entry.connect(
"activate", self._on_chat_entry_activate
)
self.chat_entry.grab_focus()
def _on_chat_entry_activate(self, widget):
if len(widget.get_text()) == 0:
return
self._current_private_chat_widget.send_message(widget)
self._refresh_contacts()
def _disconnect_chat_entry_signals(self):
if not hasattr(self, "_chat_entry_signal_id"):
return
self.chat_entry.disconnect(self._chat_entry_signal_id)
del self._chat_entry_signal_id
def _no_chat_opened(self):
return self.chat_placeholder.get_visible()
def _get_contact_name(self, contact_id):
name = ""
for contact in Contacts(APP().api).get():
if contact["contactId"] == contact_id:
name = contact["author"]["name"]
if "alias" in contact:
name = contact["alias"]
break
return name
def _clear_history_container(self):
children = self.history_container.get_children()
for child in children:
......@@ -227,7 +176,6 @@ class MainWindowView(Gtk.Overlay):
def _setup_view(self):
self._setup_main_window_stack()
self._setup_headerbar_stack_holder()
self._setup_destroy_listener()
def _setup_main_window_stack(self):
main_window_stack = self._builder.get_object("main_window_stack")
......@@ -240,55 +188,5 @@ class MainWindowView(Gtk.Overlay):
headerbar_stack_holder.show_all()
APP().window.set_titlebar(headerbar_stack_holder)
def _setup_destroy_listener(self):
self.connect("destroy", self._on_destroy)
# pylint: disable=unused-argument
def _on_destroy(self, widget):
self._disconnect_signals()
def _disconnect_signals(self):
self._sidebar_controller.disconnect_signals()
for signal in self._signals:
APP().api.socket_listener.disconnect(signal)
# pylint: disable=no-member
def _load_content(self):
socket_listener = APP().api.socket_listener
self._setup_contact_added_listeners(socket_listener)
self._setup_message_received_listeners(socket_listener)
def _setup_contact_added_listeners(self, socket_listener):
signal_id = socket_listener.connect("ContactAddedEvent",
self._notify_contact_added)
self._signals.append(signal_id)
def _setup_message_received_listeners(self, socket_listener):
signal_id = socket_listener.connect("ConversationMessageReceivedEvent",
self._notify_message_received)
self._signals.append(signal_id)
# pylint: disable=unused-argument
def _notify_contact_added(self, message):
self._notify(
_("Contact added"), # context: "Notification"
NOTIFICATION_CONTACT_ADDED
)
# pylint: disable=unused-argument
def _notify_message_received(self, message):
self._notify(
_("New private message"), # context: "Notification"
NOTIFICATION_PRIVATE_MESSAGE
)
@staticmethod
def _notify(title, identifier):
if APP().window.is_active():
return
notification = Gio.Notification.new(title)
notification.set_priority(Gio.NotificationPriority.HIGH)
APP().send_notification(identifier, notification)
def _refresh_contacts(self):
self._sidebar_controller.refresh_contacts()
......@@ -19,7 +19,6 @@ class SidebarView():
self._clear_contact_list()
for contact in contact_list:
print(contact)
contact_row = ContactRowWidget(contact)
contacts_list_box = self._builder.get_object("contacts_list_box")
contacts_list_box.add(contact_row)
......
......@@ -107,6 +107,7 @@ class Window(Gtk.ApplicationWindow):
main_window_controller = MainWindowController(
main_window_view, builder)
self._setup_container(main_window_view)
self.current_controller = main_window_controller
def _setup_add_contact_container(self):
self._setup_container(AddContactContainer())
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment