Ticket #2962: gajim-svn-sexy.patch
| File gajim-svn-sexy.patch, 8.7 KB (added by khorne, 2 years ago) |
|---|
-
src/chat_control.py
28 28 import dialogs 29 29 import history_window 30 30 import notify 31 import re 31 32 32 33 from common import gajim 33 34 from common import helpers … … 46 47 except: 47 48 HAS_GTK_SPELL = False 48 49 50 try: 51 import sexy 52 HAS_SEXY = True 49 53 54 except: 55 HAS_SEXY = False 56 50 57 # the next script, executed in the "po" directory, 51 58 # generates the following list. 52 59 ##!/bin/sh … … 54 61 #echo "{_('en'):'en'",$LANG"}" 55 62 langs = {_('English'): 'en', _('Belarusian'): 'be', _('Bulgarian'): 'bg', _('Breton'): 'br', _('Czech'): 'cs', _('German'): 'de', _('Greek'): 'el', _('British'): 'en_GB', _('Esperanto'): 'eo', _('Spanish'): 'es', _('Basque'): 'eu', _('French'): 'fr', _('Croatian'): 'hr', _('Italian'): 'it', _('Norwegian (b)'): 'nb', _('Dutch'): 'nl', _('Norwegian'): 'no', _('Polish'): 'pl', _('Portuguese'): 'pt', _('Brazilian Portuguese'): 'pt_BR', _('Russian'): 'ru', _('Serbian'): 'sr', _('Slovak'): 'sk', _('Swedish'): 'sv', _('Chinese (Ch)'): 'zh_CN'} 56 63 64 urlfinder = re.compile("(https?://|www|ftp)[^ ]+") 57 65 66 def make_href(match): 67 return '<a href="%s">%s</a>' % (match.group(), match.group()) 68 58 69 ################################################################################ 59 70 class ChatControlBase(MessageControl): 60 71 '''A base class containing a banner, ConversationTextview, MessageTextView … … 120 131 event_keymod): 121 132 pass # Derived should implement this rather than connecting to the event itself. 122 133 134 def status_url_clicked(self, widget, url): 135 helpers.launch_browser_mailer('url',url) 136 123 137 def __init__(self, type_id, parent_win, widget_name, contact, acct, 124 138 resource = None): 125 139 MessageControl.__init__(self, type_id, parent_win, widget_name, … … 150 164 gtk.DEST_DEFAULT_DROP, 151 165 self.dnd_list, gtk.gdk.ACTION_COPY) 152 166 167 if HAS_SEXY: 168 self.banner_status_label = sexy.UrlLabel() 169 self.banner_status_label.connect('url_activated', self.status_url_clicked) 170 else: 171 self.banner_status_label = gtk.Label() 172 self.banner_status_label.set_selectable(True) 173 self.banner_status_label.set_alignment(0,0.5) 174 175 banner_vbox = self.xml.get_widget('banner_vbox') 176 banner_vbox.pack_start(self.banner_status_label) 177 self.banner_status_label.show() 178 153 179 # Create textviews and connect signals 154 180 self.conv_textview = ConversationTextview(self.account) 155 181 # FIXME: DND on non editable TextView, find a better way … … 229 255 # loop removing non-existant dictionaries 230 256 # iterating on a copy 231 257 for lang in dict(langs): 232 try: 258 try: 233 259 spell.set_language(langs[lang]) 234 260 except: 235 261 del langs[lang] … … 247 273 spell.set_language(lang) 248 274 except (gobject.GError, RuntimeError), msg: 249 275 dialogs.AspellDictError(lang) 250 self.style_event_id = 0 276 251 277 self.conv_textview.tv.show() 252 278 self._paint_banner() 253 279 … … 316 342 317 343 def _paint_banner(self): 318 344 '''Repaint banner with theme color''' 319 theme = gajim.config.get('roster_theme') 320 bgcolor = gajim.config.get_per('themes', theme, 'bannerbgcolor') 321 textcolor = gajim.config.get_per('themes', theme, 'bannertextcolor') 322 # the backgrounds are colored by using an eventbox by 323 # setting the bg color of the eventbox and the fg of the name_label 324 banner_eventbox = self.xml.get_widget('banner_eventbox') 325 banner_name_label = self.xml.get_widget('banner_name_label') 326 self.disconnect_style_event(banner_name_label) 327 if bgcolor: 328 banner_eventbox.modify_bg(gtk.STATE_NORMAL, 329 gtk.gdk.color_parse(bgcolor)) 330 default_bg = False 331 else: 332 default_bg = True 333 if textcolor: 334 banner_name_label.modify_fg(gtk.STATE_NORMAL, 335 gtk.gdk.color_parse(textcolor)) 336 default_fg = False 337 else: 338 default_fg = True 339 if default_bg or default_fg: 340 self._on_style_set_event(banner_name_label, None, default_fg, 341 default_bg) 345 pass 342 346 343 def disconnect_style_event(self, widget):344 if self.style_event_id:345 widget.disconnect(self.style_event_id)346 del self.handlers[self.style_event_id]347 self.style_event_id = 0348 349 def connect_style_event(self, widget, set_fg = False, set_bg = False):350 self.disconnect_style_event(widget)351 self.style_event_id = widget.connect('style-set',352 self._on_style_set_event, set_fg, set_bg)353 self.handlers[self.style_event_id] = widget354 355 def _on_style_set_event(self, widget, style, *opts):356 '''set style of widget from style class *.Frame.Eventbox357 opts[0] == True -> set fg color358 opts[1] == True -> set bg color'''359 banner_eventbox = self.xml.get_widget('banner_eventbox')360 self.disconnect_style_event(widget)361 if opts[1]:362 bg_color = widget.style.bg[gtk.STATE_SELECTED]363 banner_eventbox.modify_bg(gtk.STATE_NORMAL, bg_color)364 if opts[0]:365 fg_color = widget.style.fg[gtk.STATE_SELECTED]366 widget.modify_fg(gtk.STATE_NORMAL, fg_color)367 self.connect_style_event(widget, opts[0], opts[1])368 369 347 def _on_keypress_event(self, widget, event): 370 348 if event.state & gtk.gdk.CONTROL_MASK: 371 349 # CTRL + l|L: clear conv_textview … … 1131 1109 jid = contact.jid 1132 1110 1133 1111 banner_name_label = self.xml.get_widget('banner_name_label') 1112 banner_vbox = self.xml.get_widget('banner_vbox') 1134 1113 banner_eventbox = self.xml.get_widget('banner_eventbox') 1135 1114 1136 1115 name = contact.get_shown_name() … … 1162 1141 self.status_tooltip.set_tip(banner_eventbox, status) 1163 1142 self.status_tooltip.enable() 1164 1143 banner_name_label.set_ellipsize(pango.ELLIPSIZE_END) 1144 self.banner_status_label.set_ellipsize(pango.ELLIPSIZE_END) 1165 1145 status = helpers.reduce_chars_newlines(status, max_lines = 1) 1166 1146 status_escaped = gobject.markup_escape_text(status) 1167 1147 … … 1192 1172 # weight="heavy" size="x-large" 1193 1173 label_text = '<span %s>%s</span><span %s>%s</span>' % \ 1194 1174 (font_attrs, name, font_attrs_small, acct_info) 1175 1195 1176 if status_escaped: 1196 label_text += '\n<span %s>%s</span>' %\ 1197 (font_attrs_small, status_escaped) 1177 if HAS_SEXY: 1178 status_text = urlfinder.sub(make_href, status_escaped) 1179 status_text = '<span %s>%s</span>' % (font_attrs_small, status_text) 1180 else: 1181 status_text = '<span %s>%s</span>' % (font_attrs_small, status_escaped) 1182 1183 self.banner_status_label.set_markup(status_text) 1198 1184 else: 1199 1185 self.status_tooltip.disable() 1200 1186 # setup the label that holds name and jid -
data/glade/message_window.glade
104 104 </child> 105 105 106 106 <child> 107 <widget class="GtkEventBox" id="banner_eventbox"> 108 <property name="visible">True</property> 109 <property name="visible_window">True</property> 110 <property name="above_child">False</property> 111 112 <child> 113 <widget class="GtkVBox" id="banner_vbox"> 114 <property name="border_width">5</property> 115 <property name="visible">True</property> 116 <property name="homogeneous">False</property> 117 <property name="spacing">0</property> 118 119 <child> 107 120 <widget class="GtkLabel" id="banner_name_label"> 108 121 <property name="visible">True</property> 109 <property name="label"><span weight="heavy" size="large">Contact name</span> 110 Status message</property> 122 <property name="label"><span weight="heavy" size="large">Contact name</span></property> 111 123 <property name="use_underline">False</property> 112 124 <property name="use_markup">True</property> 113 125 <property name="justify">GTK_JUSTIFY_LEFT</property> 114 126 <property name="wrap">False</property> 115 127 <property name="selectable">False</property> 116 <property name="xalign">0.0500000007451</property>128 <property name="xalign">0</property> 117 129 <property name="yalign">0.5</property> 118 130 <property name="xpad">0</property> 119 <property name="ypad">5</property>131 <property name="ypad">0</property> 120 132 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 121 133 <property name="width_chars">-1</property> 122 134 <property name="single_line_mode">False</property> … … 124 136 </widget> 125 137 <packing> 126 138 <property name="padding">0</property> 139 <property name="expand">False</property> 140 <property name="fill">False</property> 141 </packing> 142 </child> 143 144 <child> 145 <placeholder/> 146 </child> 147 </widget> 148 </child> 149 </widget> 150 <packing> 151 <property name="padding">0</property> 127 152 <property name="expand">True</property> 128 153 <property name="fill">True</property> 129 154 </packing>
