Daniel Brötzmann pushed to branch master at gajim / gajim
Commits: 7e95d2e3 by wurstsalat at 2022-01-23T14:17:49+01:00 GroupchatDetails: Styling
- - - - -
3 changed files:
- + gajim/data/gui/groupchat_details.ui - gajim/gtk/builder.pyi - gajim/gtk/groupchat_details.py
Changes:
===================================== gajim/data/gui/groupchat_details.ui ===================================== @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> +<interface> + <requires lib="gtk+" version="3.24"/> + <!-- n-columns=2 n-rows=1 --> + <object class="GtkGrid" id="main_grid"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <object class="GtkBox"> + <property name="width-request">570</property> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkRevealer" id="header_revealer"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="transition-duration">200</property> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="spacing">12</property> + <child> + <object class="GtkImage" id="header_image"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="icon-name">missing-image</property> + <property name="icon_size">6</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="name_entry"> + <property name="name">ContactNameEntry</property> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can-focus">True</property> + <property name="valign">center</property> + <property name="activates-default">True</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkToggleButton" id="edit_name_button"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="tooltip-text" translatable="yes">Edit Name…</property> + <property name="valign">center</property> + <signal name="toggled" handler="_on_edit_name_toggled" swapped="no"/> + <child> + <object class="GtkImage"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="icon-name">document-edit-symbolic</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="stack-header"/> + </style> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkStack" id="main_stack"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="transition-type">crossfade</property> + <child> + <object class="GtkBox" id="info_box"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="orientation">vertical</property> + <child> + <placeholder/> + </child> + <style> + <class name="padding-18"/> + </style> + </object> + <packing> + <property name="name">information</property> + <property name="title" translatable="yes">Information</property> + <property name="icon-name">user-info-symbolic</property> + </packing> + </child> + <child> + <object class="GtkBox" id="settings_box"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="orientation">vertical</property> + <child> + <placeholder/> + </child> + <style> + <class name="padding-18"/> + </style> + </object> + <packing> + <property name="name">settings</property> + <property name="title" translatable="yes">Settings</property> + <property name="icon-name">document-properties-symbolic</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="stack-border"/> + </style> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> + </child> + <child> + <placeholder/> + </child> + </object> +</interface>
===================================== gajim/gtk/builder.pyi ===================================== @@ -475,6 +475,17 @@ class GroupchatCreationBuilder(Builder): create_button: Gtk.Button
+class GroupchatDetailsBuilder(Builder): + main_grid: Gtk.Grid + header_revealer: Gtk.Revealer + header_image: Gtk.Image + name_entry: Gtk.Entry + edit_name_button: Gtk.ToggleButton + main_stack: Gtk.Stack + info_box: Gtk.Box + settings_box: Gtk.Box + + class GroupchatInfoScrolledBuilder(Builder): info_grid: Gtk.Grid address_label: Gtk.Label @@ -983,6 +994,8 @@ def get_builder(file_name: Literal['groupchat_control.ui'], widgets: list[str] = @overload def get_builder(file_name: Literal['groupchat_creation.ui'], widgets: list[str] = ...) -> GroupchatCreationBuilder: ... @overload +def get_builder(file_name: Literal['groupchat_details.ui'], widgets: list[str] = ...) -> GroupchatDetailsBuilder: ... +@overload def get_builder(file_name: Literal['groupchat_info_scrolled.ui'], widgets: list[str] = ...) -> GroupchatInfoScrolledBuilder: ... @overload def get_builder(file_name: Literal['groupchat_inviter.ui'], widgets: list[str] = ...) -> GroupchatInviterBuilder: ...
===================================== gajim/gtk/groupchat_details.py ===================================== @@ -14,20 +14,28 @@
from __future__ import annotations
+from typing import Optional + from gi.repository import Gdk +from gi.repository import GObject from gi.repository import Gtk
from gajim.common import app +from gajim.common.const import AvatarSize from gajim.common.i18n import _ from gajim.common.modules.contacts import GroupchatContact
+from .builder import get_builder from .groupchat_info import GroupChatInfoScrolled from .groupchat_settings import GroupChatSettings from .sidebar_switcher import SideBarSwitcher
class GroupchatDetails(Gtk.ApplicationWindow): - def __init__(self, contact: GroupchatContact) -> None: + def __init__(self, + contact: GroupchatContact, + page: Optional[str] = None + ) -> None: Gtk.ApplicationWindow.__init__(self) self.set_application(app.app) self.set_position(Gtk.WindowPosition.CENTER) @@ -38,27 +46,55 @@ def __init__(self, contact: GroupchatContact) -> None: self.set_title(_('Groupchat Details'))
self.account = contact.account + self._client = app.get_client(contact.account) self._contact = contact
- main_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) - self._stack = Gtk.Stack() - self._side_bar_switcher = SideBarSwitcher() + self._ui = get_builder('groupchat_details.ui') + self._ui.connect_signals(self)
- main_box.add(self._side_bar_switcher) - main_box.add(self._stack) + self._switcher = SideBarSwitcher() + self._switcher.set_stack(self._ui.main_stack, rows_visible=False) + self._ui.main_grid.attach(self._switcher, 0, 0, 1, 1) + self._ui.main_stack.connect('notify::visible-child-name', + self._on_stack_child_changed) + self.add(self._ui.main_grid)
self._add_groupchat_info() self._add_groupchat_settings()
- self._side_bar_switcher.set_stack(self._stack) + self._load_avatar() + self._ui.name_entry.set_text(contact.name)
- self.add(main_box) + if page is not None: + self._switcher.set_row(page)
self.connect('key-press-event', self._on_key_press) self.connect('destroy', self._on_destroy)
self.show_all()
+ def _on_stack_child_changed(self, + _widget: Gtk.Stack, + _pspec: GObject.ParamSpec) -> None: + + name = self._ui.main_stack.get_visible_child_name() + self._ui.header_revealer.set_reveal_child(name != 'information') + + def _on_edit_name_toggled(self, widget: Gtk.ToggleButton) -> None: + active = widget.get_active() + self._ui.name_entry.set_sensitive(active) + if active: + self._ui.name_entry.grab_focus() + + name = self._ui.name_entry.get_text() + self._client.get_module('Bookmarks').modify( + self._contact.jid, name=name) + + def _load_avatar(self) -> None: + scale = self.get_scale_factor() + surface = self._contact.get_avatar(AvatarSize.VCARD_HEADER, scale) + self._ui.header_image.set_from_surface(surface) + def _add_groupchat_info(self) -> None: groupchat_info = GroupChatInfoScrolled(self._contact.account, width=600) groupchat_info.set_halign(Gtk.Align.FILL) @@ -66,17 +102,19 @@ def _add_groupchat_info(self) -> None: assert disco_info is not None groupchat_info.set_from_disco_info(disco_info) groupchat_info.set_subject(self._contact.subject) - - self._stack.add_titled(groupchat_info, 'info', _('Information')) + self._ui.info_box.add(groupchat_info) + self._switcher.set_row_visible('information', True)
def _add_groupchat_settings(self) -> None: scrolled_window = Gtk.ScrolledWindow() + scrolled_window.set_vexpand(True) scrolled_window.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
settings_box = GroupChatSettings(self.account, self._contact.jid) scrolled_window.add(settings_box) - self._stack.add_titled(scrolled_window, 'settings', _('Settings')) + self._ui.settings_box.add(scrolled_window) + self._switcher.set_row_visible('settings', True)
def _on_key_press(self, _widget: GroupchatDetails,
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/commit/7e95d2e31b1fe0bf2866bdbfc22bcaf18...