Use Consistent Color Generation for MUC nicknames

This commit is contained in:
Philipp Hörist 2019-03-12 18:44:20 +01:00
parent 348a8551fe
commit 4b3a5b7704
4 changed files with 16 additions and 37 deletions

View File

@ -250,8 +250,6 @@ class StandardGroupChatCommands(CommandContainer):
@doc(_("Clear the text window")) @doc(_("Clear the text window"))
def clear(self): def clear(self):
self.conv_textview.clear() self.conv_textview.clear()
self.gc_count_nicknames_colors = -1
self.gc_custom_colors = {}
@command(raw=True) @command(raw=True)
@doc(_("Change your nickname in a group chat")) @doc(_("Change your nickname in a group chat"))

View File

@ -253,7 +253,6 @@ class Config:
'hide_groupchat_occupants_list': [opt_bool, False, _('Hides the group chat occupants list in group chat window.')], 'hide_groupchat_occupants_list': [opt_bool, False, _('Hides the group chat occupants list in group chat window.')],
'chat_merge_consecutive_nickname': [opt_bool, False, _('In a chat, show the nickname at the beginning of a line only when it\'s not the same person talking than in previous message.')], 'chat_merge_consecutive_nickname': [opt_bool, False, _('In a chat, show the nickname at the beginning of a line only when it\'s not the same person talking than in previous message.')],
'chat_merge_consecutive_nickname_indent': [opt_str, ' ', _('Indentation when using merge consecutive nickname.')], 'chat_merge_consecutive_nickname_indent': [opt_str, ' ', _('Indentation when using merge consecutive nickname.')],
'gc_nicknames_colors': [opt_str, '#4e9a06:#f57900:#ce5c00:#3465a4:#204a87:#75507b:#5c3566:#c17d11:#8f5902:#ef2929:#cc0000:#a40000', _('List of colors, separated by ":", that will be used to color nicknames in group chats.'), True],
'ctrl_tab_go_to_next_composing': [opt_bool, True, _('Ctrl-Tab go to next composing tab when none is unread.')], 'ctrl_tab_go_to_next_composing': [opt_bool, True, _('Ctrl-Tab go to next composing tab when none is unread.')],
'confirm_metacontacts': [opt_str, '', _('Show the confirm metacontacts creation dialog or not? Empty string means never show the dialog.')], 'confirm_metacontacts': [opt_str, '', _('Show the confirm metacontacts creation dialog or not? Empty string means never show the dialog.')],
'confirm_block': [opt_str, '', _('Show the confirm block contact dialog or not? Empty string means never show the dialog.')], 'confirm_block': [opt_str, '', _('Show the confirm block contact dialog or not? Empty string means never show the dialog.')],

View File

@ -34,6 +34,9 @@ from gi.repository import Gtk
from gi.repository import Pango from gi.repository import Pango
from gi.repository import GObject from gi.repository import GObject
from gi.repository import GLib from gi.repository import GLib
from gi.repository import Gdk
from nbxmpp.util import text_to_colour
from gajim.common import app from gajim.common import app
from gajim.common import helpers from gajim.common import helpers
@ -43,14 +46,13 @@ from gajim.common.helpers import AdditionalDataDict
from gajim.common.fuzzyclock import FuzzyClock from gajim.common.fuzzyclock import FuzzyClock
from gajim.common.const import StyleAttr from gajim.common.const import StyleAttr
from gajim.gtk.htmltextview import HtmlTextView
from gajim.gtk import util from gajim.gtk import util
from gajim.gtk.util import load_icon from gajim.gtk.util import load_icon
from gajim.gtk.util import get_cursor from gajim.gtk.util import get_cursor
from gajim.gtk.emoji_data import emoji_pixbufs from gajim.gtk.emoji_data import emoji_pixbufs
from gajim.gtk.emoji_data import is_emoji from gajim.gtk.emoji_data import is_emoji
from gajim.gtk.emoji_data import get_emoji_pixbuf from gajim.gtk.emoji_data import get_emoji_pixbuf
from gajim.gtk.htmltextview import HtmlTextView
NOT_SHOWN = 0 NOT_SHOWN = 0
ALREADY_RECEIVED = 1 ALREADY_RECEIVED = 1
@ -247,13 +249,6 @@ class ConversationTextview(GObject.GObject):
desc = app.css_config.get_font('.gajim-outgoing-message-text') desc = app.css_config.get_font('.gajim-outgoing-message-text')
self.tagOutText.set_property('font-desc', desc) self.tagOutText.set_property('font-desc', desc)
colors = app.config.get('gc_nicknames_colors')
colors = colors.split(':')
for i, color in enumerate(colors):
tagname = 'gc_nickname_color_' + str(i)
tag = buffer_.create_tag(tagname)
tag.set_property('foreground', color)
self.tagMarked = buffer_.create_tag('marked') self.tagMarked = buffer_.create_tag('marked')
color = app.css_config.get_value( color = app.css_config.get_value(
'.gajim-highlight-message', StyleAttr.COLOR) '.gajim-highlight-message', StyleAttr.COLOR)
@ -1223,6 +1218,11 @@ class ConversationTextview(GObject.GObject):
if other_tags_for_name: if other_tags_for_name:
name_tags = other_tags_for_name[:] # create a new list name_tags = other_tags_for_name[:] # create a new list
name_tags.append(kind) name_tags.append(kind)
for tag in name_tags:
if tag.startswith('muc_nickname_color_'):
self._add_new_colour_tags(tag, name)
before_str = app.config.get('before_nickname') before_str = app.config.get('before_nickname')
before_str = helpers.from_one_line(before_str) before_str = helpers.from_one_line(before_str)
after_str = app.config.get('after_nickname') after_str = app.config.get('after_nickname')
@ -1230,6 +1230,12 @@ class ConversationTextview(GObject.GObject):
format_ = before_str + name + direction_mark + after_str + ' ' format_ = before_str + name + direction_mark + after_str + ' '
buffer_.insert_with_tags_by_name(end_iter, format_, *name_tags) buffer_.insert_with_tags_by_name(end_iter, format_, *name_tags)
def _add_new_colour_tags(self, tag, name):
if self._buffer.get_tag_table().lookup(tag) is not None:
return
gdk_color = Gdk.Color.from_floats(*text_to_colour(name))
self._buffer.create_tag(tag, foreground_gdk=gdk_color)
def print_subject(self, subject, iter_=None): def print_subject(self, subject, iter_=None):
if subject: # if we have subject, show it too! if subject: # if we have subject, show it too!
subject = _('Subject: %s\n') % subject subject = _('Subject: %s\n') % subject

View File

@ -193,12 +193,6 @@ class GroupchatControl(ChatControlBase):
self.subject = '' self.subject = ''
# nickname coloring
self.gc_count_nicknames_colors = -1
self.gc_custom_colors = {}
self.number_of_colors = len(app.config.get('gc_nicknames_colors').\
split(':'))
self.name_label = self.xml.get_object('banner_name_label') self.name_label = self.xml.get_object('banner_name_label')
self.event_box = self.xml.get_object('banner_eventbox') self.event_box = self.xml.get_object('banner_eventbox')
@ -1347,17 +1341,7 @@ class GroupchatControl(ChatControlBase):
if kind == 'incoming': # it's a message NOT from us if kind == 'incoming': # it's a message NOT from us
# highlighting and sounds # highlighting and sounds
highlight, _sound = self.highlighting_for_message(text, tim) highlight, _sound = self.highlighting_for_message(text, tim)
if contact in self.gc_custom_colors: other_tags_for_name.append('muc_nickname_color_%s' % contact)
other_tags_for_name.append('gc_nickname_color_' + \
str(self.gc_custom_colors[contact]))
else:
self.gc_count_nicknames_colors += 1
if self.gc_count_nicknames_colors == self.number_of_colors:
self.gc_count_nicknames_colors = 0
self.gc_custom_colors[contact] = \
self.gc_count_nicknames_colors
other_tags_for_name.append('gc_nickname_color_' + \
str(self.gc_count_nicknames_colors))
if highlight: if highlight:
# muc-specific chatstate # muc-specific chatstate
if self.parent_win: if self.parent_win:
@ -1369,10 +1353,6 @@ class GroupchatControl(ChatControlBase):
self._nick_completion.record_message(contact, highlight) self._nick_completion.record_message(contact, highlight)
if text.startswith('/me ') or text.startswith('/me\n'):
other_tags_for_text.append('gc_nickname_color_' + \
str(self.gc_custom_colors[contact]))
self.check_and_possibly_add_focus_out_line() self.check_and_possibly_add_focus_out_line()
ChatControlBase.print_conversation_line(self, text, kind, contact, tim, ChatControlBase.print_conversation_line(self, text, kind, contact, tim,
@ -1858,10 +1838,6 @@ class GroupchatControl(ChatControlBase):
tv.last_received_message_id[nick] tv.last_received_message_id[nick]
del tv.last_received_message_id[nick] del tv.last_received_message_id[nick]
# keep nickname color
if nick in self.gc_custom_colors:
self.gc_custom_colors[new_nick] = self.gc_custom_colors[nick]
self.remove_contact(nick) self.remove_contact(nick)
self.add_contact_to_roster(new_nick) self.add_contact_to_roster(new_nick)