Ticket #2962: gajim-svn-sexy.patch

File gajim-svn-sexy.patch, 8.7 KB (added by khorne, 2 years ago)

patch against r8885

  • src/chat_control.py

     
    2828import dialogs 
    2929import history_window 
    3030import notify 
     31import re 
    3132 
    3233from common import gajim 
    3334from common import helpers 
     
    4647except: 
    4748        HAS_GTK_SPELL = False 
    4849 
     50try: 
     51        import sexy 
     52        HAS_SEXY = True 
    4953 
     54except: 
     55        HAS_SEXY = False 
     56 
    5057# the next script, executed in the "po" directory, 
    5158# generates the following list. 
    5259##!/bin/sh 
     
    5461#echo "{_('en'):'en'",$LANG"}" 
    5562langs = {_('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'} 
    5663 
     64urlfinder = re.compile("(https?://|www|ftp)[^ ]+") 
    5765 
     66def make_href(match): 
     67        return '<a href="%s">%s</a>' % (match.group(), match.group()) 
     68 
    5869################################################################################ 
    5970class ChatControlBase(MessageControl): 
    6071        '''A base class containing a banner, ConversationTextview, MessageTextView 
     
    120131        event_keymod): 
    121132                pass # Derived should implement this rather than connecting to the event itself. 
    122133 
     134        def status_url_clicked(self, widget, url): 
     135                helpers.launch_browser_mailer('url',url) 
     136 
    123137        def __init__(self, type_id, parent_win, widget_name, contact, acct,  
    124138        resource = None): 
    125139                MessageControl.__init__(self, type_id, parent_win, widget_name, 
     
    150164                        gtk.DEST_DEFAULT_DROP, 
    151165                        self.dnd_list, gtk.gdk.ACTION_COPY) 
    152166 
     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 
    153179                # Create textviews and connect signals 
    154180                self.conv_textview = ConversationTextview(self.account) 
    155181                # FIXME: DND on non editable TextView, find a better way 
     
    229255                                # loop removing non-existant dictionaries 
    230256                                # iterating on a copy 
    231257                                for lang in dict(langs): 
    232                                         try:  
     258                                        try: 
    233259                                                spell.set_language(langs[lang]) 
    234260                                        except: 
    235261                                                del langs[lang] 
     
    247273                                        spell.set_language(lang) 
    248274                        except (gobject.GError, RuntimeError), msg: 
    249275                                dialogs.AspellDictError(lang) 
    250                 self.style_event_id = 0 
     276 
    251277                self.conv_textview.tv.show() 
    252278                self._paint_banner() 
    253279 
     
    316342 
    317343        def _paint_banner(self): 
    318344                '''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 
    342346         
    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 = 0  
    348          
    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] = widget 
    354          
    355         def _on_style_set_event(self, widget, style, *opts): 
    356                 '''set style of widget from style class *.Frame.Eventbox  
    357                         opts[0] == True -> set fg color 
    358                         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          
    369347        def _on_keypress_event(self, widget, event): 
    370348                if event.state & gtk.gdk.CONTROL_MASK: 
    371349                        # CTRL + l|L: clear conv_textview 
     
    11311109                jid = contact.jid 
    11321110 
    11331111                banner_name_label = self.xml.get_widget('banner_name_label') 
     1112                banner_vbox = self.xml.get_widget('banner_vbox') 
    11341113                banner_eventbox = self.xml.get_widget('banner_eventbox') 
    11351114                 
    11361115                name = contact.get_shown_name() 
     
    11621141                        self.status_tooltip.set_tip(banner_eventbox, status) 
    11631142                        self.status_tooltip.enable() 
    11641143                        banner_name_label.set_ellipsize(pango.ELLIPSIZE_END) 
     1144                        self.banner_status_label.set_ellipsize(pango.ELLIPSIZE_END) 
    11651145                        status = helpers.reduce_chars_newlines(status, max_lines = 1) 
    11661146                status_escaped = gobject.markup_escape_text(status) 
    11671147 
     
    11921172                        # weight="heavy" size="x-large" 
    11931173                        label_text = '<span %s>%s</span><span %s>%s</span>' % \ 
    11941174                                (font_attrs, name, font_attrs_small, acct_info) 
     1175 
    11951176                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) 
    11981184                else: 
    11991185                        self.status_tooltip.disable() 
    12001186                # setup the label that holds name and jid 
  • data/glade/message_window.glade

     
    104104                          </child> 
    105105 
    106106                          <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> 
    107120                            <widget class="GtkLabel" id="banner_name_label"> 
    108121                              <property name="visible">True</property> 
    109                               <property name="label">&lt;span weight=&quot;heavy&quot; size=&quot;large&quot;&gt;Contact name&lt;/span&gt; 
    110 Status message</property> 
     122                                      <property name="label">&lt;span weight=&quot;heavy&quot; size=&quot;large&quot;&gt;Contact name&lt;/span&gt;</property> 
    111123                              <property name="use_underline">False</property> 
    112124                              <property name="use_markup">True</property> 
    113125                              <property name="justify">GTK_JUSTIFY_LEFT</property> 
    114126                              <property name="wrap">False</property> 
    115127                              <property name="selectable">False</property> 
    116                               <property name="xalign">0.0500000007451</property> 
     128                                      <property name="xalign">0</property> 
    117129                              <property name="yalign">0.5</property> 
    118130                              <property name="xpad">0</property> 
    119                               <property name="ypad">5</property> 
     131                                      <property name="ypad">0</property> 
    120132                              <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 
    121133                              <property name="width_chars">-1</property> 
    122134                              <property name="single_line_mode">False</property> 
     
    124136                            </widget> 
    125137                            <packing> 
    126138                              <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> 
    127152                              <property name="expand">True</property> 
    128153                              <property name="fill">True</property> 
    129154                            </packing>