From 368c2923656afcc1a2ce34eff9acf79f4ed1fff8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20Br=C3=B6tzmann?= <mailtrash@posteo.de>
Date: Thu, 14 May 2020 11:21:34 +0200
Subject: [PATCH] Start Chat: Introduce account badges

---
 gajim/data/style/gajim.css | 12 ++++++++++++
 gajim/gtk/css_config.py    |  2 +-
 gajim/gtk/start_chat.py    | 40 +++++++++++++++++++-------------------
 gajim/gtk/util.py          | 13 +++++++++++++
 4 files changed, 46 insertions(+), 21 deletions(-)

diff --git a/gajim/data/style/gajim.css b/gajim/data/style/gajim.css
index 1386ae8a79..b87ee7c0ab 100644
--- a/gajim/data/style/gajim.css
+++ b/gajim/data/style/gajim.css
@@ -260,6 +260,18 @@ .data-form-widget textview { padding: 5px; }
 /*Image Preview*/
 .preview-image { box-shadow: 0px 0px 3px 0px alpha(@theme_text_color, 0.2); }
 
+/* Badge */
+.badge {
+    color: rgb(242, 242, 242);
+    padding-left: 6px;
+    padding-right: 6px;
+    padding-top: 2px;
+    padding-bottom: 2px;
+    border-radius: 4px;
+    font-size: 80%;
+    font-weight: bold;
+}
+
 /* Treeview */
 .adhoc-treeview { padding: 5px; }
 .adhoc-scrolled { border: 1px solid; border-color:@unfocused_borders; }
diff --git a/gajim/gtk/css_config.py b/gajim/gtk/css_config.py
index 6bb905a061..22884cabe6 100644
--- a/gajim/gtk/css_config.py
+++ b/gajim/gtk/css_config.py
@@ -538,7 +538,7 @@ def refresh(self):
         for index, account in enumerate(accounts):
             color = app.config.get_per('accounts', account, 'account_color')
             css_class = 'gajim_class_%s' % index
-            css += '.%s { color: %s }\n' % (css_class, color)
+            css += '.%s { background-color: %s }\n' % (css_class, color)
             self._dynamic_dict[account] = css_class
 
         self._dynamic_provider.load_from_data(css.encode())
diff --git a/gajim/gtk/start_chat.py b/gajim/gtk/start_chat.py
index 1a1352d38c..87ff004bd4 100644
--- a/gajim/gtk/start_chat.py
+++ b/gajim/gtk/start_chat.py
@@ -37,6 +37,7 @@
 from gajim.gtk.util import get_builder
 from gajim.gtk.util import ensure_not_destroyed
 from gajim.gtk.util import get_icon_name
+from gajim.gtk.util import generate_account_badge
 
 
 class Search(IntEnum):
@@ -136,8 +137,8 @@ def _add_groupchats(self, rows):
             for bookmark in bookmarks:
                 jid = str(bookmark.jid)
                 name = get_groupchat_name(con, jid)
-                rows.append(ContactRow(account, None, jid,
-                                       name, show_account, True))
+                rows.append(ContactRow(account, None, jid, name, show_account,
+                                       groupchat=True))
 
     def _load_contacts(self, rows):
         generator = self._incremental_add(rows)
@@ -401,7 +402,8 @@ def _add_new_jid_row(self):
             show_account = len(self._accounts) > 1
             row = ContactRow(account, None, '', None, show_account)
             self.new_contact_rows[account] = row
-            group_row = ContactRow(account, None, '', None, show_account, True)
+            group_row = ContactRow(account, None, '', None, show_account,
+                                   groupchat=True)
             self.new_groupchat_rows[account] = group_row
             self._ui.listbox.add(row)
             self._ui.listbox.add(group_row)
@@ -609,8 +611,8 @@ def __init__(self, account, contact, jid, name, show_account,
         image.set_size_request(AvatarSize.CHAT, AvatarSize.CHAT)
         grid.add(image)
 
-        middle_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
-        middle_box.set_hexpand(True)
+        box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
+        box.set_hexpand(True)
 
         if self.name is None:
             if self.groupchat:
@@ -624,7 +626,17 @@ def __init__(self, account, contact, jid, name, show_account,
         self.name_label.set_width_chars(20)
         self.name_label.set_halign(Gtk.Align.START)
         self.name_label.get_style_context().add_class('bold16')
-        middle_box.add(self.name_label)
+        name_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6)
+        name_box.add(self.name_label)
+        if show_account:
+            account_badge = generate_account_badge(account)
+            account_badge.set_tooltip_text(
+                _('Account: %s' % self.account_label))
+            account_badge.set_halign(Gtk.Align.END)
+            account_badge.set_valign(Gtk.Align.START)
+            account_badge.set_hexpand(True)
+            name_box.add(account_badge)
+        box.add(name_box)
 
         self.jid_label = Gtk.Label(label=jid)
         self.jid_label.set_tooltip_text(jid)
@@ -633,21 +645,9 @@ def __init__(self, account, contact, jid, name, show_account,
         self.jid_label.set_width_chars(22)
         self.jid_label.set_halign(Gtk.Align.START)
         self.jid_label.get_style_context().add_class('dim-label')
-        middle_box.add(self.jid_label)
-
-        grid.add(middle_box)
+        box.add(self.jid_label)
 
-        if show_account:
-            account_icon = Gtk.Image.new_from_icon_name(
-                'org.gajim.Gajim-symbolic', Gtk.IconSize.MENU)
-            account_icon.set_tooltip_text(
-                _('Account: %s' % self.account_label))
-            account_class = app.css_config.get_dynamic_class(account)
-            account_icon.get_style_context().add_class(account_class)
-            right_box = Gtk.Box()
-            right_box.set_vexpand(True)
-            right_box.add(account_icon)
-            grid.add(right_box)
+        grid.add(box)
 
         self.add(grid)
         self.show_all()
diff --git a/gajim/gtk/util.py b/gajim/gtk/util.py
index a2d06af5e4..7ac54b32bc 100644
--- a/gajim/gtk/util.py
+++ b/gajim/gtk/util.py
@@ -660,6 +660,19 @@ def get_color_for_account(account: str) -> str:
     return rgba.to_string()
 
 
+def generate_account_badge(account):
+    account_label = app.get_account_label(account)
+    badge = Gtk.Label(label=account_label)
+    badge.set_ellipsize(Pango.EllipsizeMode.END)
+    badge.set_max_width_chars(12)
+    badge.set_size_request(50, -1)
+    account_class = app.css_config.get_dynamic_class(account)
+    badge_context = badge.get_style_context()
+    badge_context.add_class(account_class)
+    badge_context.add_class('badge')
+    return badge
+
+
 @lru_cache(maxsize=16)
 def get_css_show_class(show):
     if show in ('online', 'chat'):
-- 
GitLab