Changeset 8422

Show
Ignore:
Timestamp:
07/22/07 11:04:33 (18 months ago)
Author:
asterix
Message:

add 2 buttons to search window: add contact to roster and information. fixes #3304

Location:
trunk
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/data/glade/search_window.glade

    r8082 r8422  
    1 <?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> 
    2 <!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> 
    3  
     1<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
     2<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd"> 
     3<!--*- mode: xml -*--> 
    44<glade-interface> 
    5  
    6 <widget class="GtkWindow" id="search_window"> 
    7   <property name="border_width">12</property> 
    8   <property name="title" translatable="yes">Search</property> 
    9   <property name="type">GTK_WINDOW_TOPLEVEL</property> 
    10   <property name="window_position">GTK_WIN_POS_NONE</property> 
    11   <property name="modal">False</property> 
    12   <property name="resizable">True</property> 
    13   <property name="destroy_with_parent">False</property> 
    14   <property name="decorated">True</property> 
    15   <property name="skip_taskbar_hint">False</property> 
    16   <property name="skip_pager_hint">False</property> 
    17   <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property> 
    18   <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> 
    19   <property name="focus_on_map">True</property> 
    20   <property name="urgency_hint">False</property> 
    21   <signal name="key_press_event" handler="on_search_window_key_press_event" last_modification_time="Wed, 04 Apr 2007 18:39:27 GMT"/> 
    22   <signal name="destroy" handler="on_search_window_destroy" last_modification_time="Wed, 04 Apr 2007 18:39:35 GMT"/> 
    23  
    24   <child> 
    25     <widget class="GtkVBox" id="vbox1"> 
    26       <property name="visible">True</property> 
    27       <property name="homogeneous">False</property> 
    28       <property name="spacing">6</property> 
    29  
    30       <child> 
    31         <widget class="GtkVBox" id="search_vbox"> 
    32           <property name="visible">True</property> 
    33           <property name="homogeneous">False</property> 
    34           <property name="spacing">0</property> 
    35  
    36           <child> 
    37             <widget class="GtkLabel" id="label"> 
    38               <property name="visible">True</property> 
    39               <property name="label" translatable="yes">Please wait while retrieving search form...</property> 
    40               <property name="use_underline">False</property> 
    41               <property name="use_markup">False</property> 
    42               <property name="justify">GTK_JUSTIFY_LEFT</property> 
    43               <property name="wrap">False</property> 
    44               <property name="selectable">False</property> 
    45               <property name="xalign">0.5</property> 
    46               <property name="yalign">0.5</property> 
    47               <property name="xpad">0</property> 
    48               <property name="ypad">0</property> 
    49               <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 
    50               <property name="width_chars">-1</property> 
    51               <property name="single_line_mode">False</property> 
    52               <property name="angle">0</property> 
    53             </widget> 
    54             <packing> 
    55               <property name="padding">0</property> 
    56               <property name="expand">True</property> 
    57               <property name="fill">False</property> 
    58             </packing> 
    59           </child> 
    60  
    61           <child> 
    62             <widget class="GtkProgressBar" id="progressbar"> 
    63               <property name="visible">True</property> 
    64               <property name="orientation">GTK_PROGRESS_LEFT_TO_RIGHT</property> 
    65               <property name="fraction">0</property> 
    66               <property name="pulse_step">0.10000000149</property> 
    67               <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 
    68             </widget> 
    69             <packing> 
    70               <property name="padding">0</property> 
    71               <property name="expand">True</property> 
    72               <property name="fill">False</property> 
    73             </packing> 
    74           </child> 
    75  
    76           <child> 
    77             <placeholder/> 
    78           </child> 
    79         </widget> 
    80         <packing> 
    81           <property name="padding">0</property> 
    82           <property name="expand">True</property> 
    83           <property name="fill">True</property> 
    84         </packing> 
    85       </child> 
    86  
    87       <child> 
    88         <widget class="GtkHButtonBox" id="hbuttonbox1"> 
    89           <property name="visible">True</property> 
    90           <property name="layout_style">GTK_BUTTONBOX_END</property> 
    91           <property name="spacing">6</property> 
    92  
    93           <child> 
    94             <widget class="GtkButton" id="search_button"> 
    95               <property name="visible">True</property> 
    96               <property name="can_default">True</property> 
    97               <property name="can_focus">True</property> 
    98               <property name="relief">GTK_RELIEF_NORMAL</property> 
    99               <property name="focus_on_click">True</property> 
    100               <signal name="clicked" handler="on_search_button_clicked" last_modification_time="Thu, 19 Apr 2007 09:43:28 GMT"/> 
    101  
    102               <child> 
    103                 <widget class="GtkAlignment" id="alignment1"> 
    104                   <property name="visible">True</property> 
    105                   <property name="xalign">0.5</property> 
    106                   <property name="yalign">0.5</property> 
    107                   <property name="xscale">0</property> 
    108                   <property name="yscale">0</property> 
    109                   <property name="top_padding">0</property> 
    110                   <property name="bottom_padding">0</property> 
    111                   <property name="left_padding">0</property> 
    112                   <property name="right_padding">0</property> 
    113  
    114                   <child> 
    115                     <widget class="GtkHBox" id="hbox5"> 
    116                       <property name="visible">True</property> 
    117                       <property name="homogeneous">False</property> 
    118                       <property name="spacing">2</property> 
    119  
    120                       <child> 
    121                         <widget class="GtkImage" id="image1"> 
    122                           <property name="visible">True</property> 
    123                           <property name="stock">gtk-find</property> 
    124                           <property name="icon_size">4</property> 
    125                           <property name="xalign">0.5</property> 
    126                           <property name="yalign">0.5</property> 
    127                           <property name="xpad">0</property> 
    128                           <property name="ypad">0</property> 
    129                         </widget> 
    130                         <packing> 
    131                           <property name="padding">0</property> 
    132                           <property name="expand">False</property> 
    133                           <property name="fill">False</property> 
    134                         </packing> 
    135                       </child> 
    136  
    137                       <child> 
    138                         <widget class="GtkLabel" id="label58"> 
    139                           <property name="visible">True</property> 
    140                           <property name="label" translatable="yes">_Search</property> 
    141                           <property name="use_underline">True</property> 
    142                           <property name="use_markup">False</property> 
    143                           <property name="justify">GTK_JUSTIFY_LEFT</property> 
    144                           <property name="wrap">False</property> 
    145                           <property name="selectable">False</property> 
    146                           <property name="xalign">0.5</property> 
    147                           <property name="yalign">0.5</property> 
    148                           <property name="xpad">0</property> 
    149                           <property name="ypad">0</property> 
    150                           <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> 
    151                           <property name="width_chars">-1</property> 
    152                           <property name="single_line_mode">False</property> 
    153                           <property name="angle">0</property> 
    154                         </widget> 
    155                         <packing> 
    156                           <property name="padding">0</property> 
    157                           <property name="expand">False</property> 
    158                           <property name="fill">False</property> 
    159                         </packing> 
    160                       </child> 
    161                     </widget> 
    162                   </child> 
    163                 </widget> 
    164               </child> 
    165             </widget> 
    166           </child> 
    167  
    168           <child> 
    169             <widget class="GtkButton" id="close_button"> 
    170               <property name="visible">True</property> 
    171               <property name="can_default">True</property> 
    172               <property name="can_focus">True</property> 
    173               <property name="label">gtk-close</property> 
    174               <property name="use_stock">True</property> 
    175               <property name="relief">GTK_RELIEF_NORMAL</property> 
    176               <property name="focus_on_click">True</property> 
    177               <signal name="clicked" handler="on_close_button_clicked" last_modification_time="Mon, 25 Sep 2006 05:08:55 GMT"/> 
    178             </widget> 
    179           </child> 
    180         </widget> 
    181         <packing> 
    182           <property name="padding">0</property> 
    183           <property name="expand">False</property> 
    184           <property name="fill">True</property> 
    185         </packing> 
    186       </child> 
    187     </widget> 
    188   </child> 
    189 </widget> 
    190  
     5  <widget class="GtkWindow" id="search_window"> 
     6    <property name="border_width">12</property> 
     7    <property name="title" translatable="yes">Search</property> 
     8    <signal name="key_press_event" handler="on_search_window_key_press_event"/> 
     9    <signal name="destroy" handler="on_search_window_destroy"/> 
     10    <child> 
     11      <widget class="GtkVBox" id="vbox1"> 
     12        <property name="visible">True</property> 
     13        <property name="spacing">6</property> 
     14        <child> 
     15          <widget class="GtkVBox" id="search_vbox"> 
     16            <property name="visible">True</property> 
     17            <child> 
     18              <widget class="GtkLabel" id="label"> 
     19                <property name="visible">True</property> 
     20                <property name="label" translatable="yes">Please wait while retrieving search form...</property> 
     21              </widget> 
     22              <packing> 
     23                <property name="fill">False</property> 
     24              </packing> 
     25            </child> 
     26            <child> 
     27              <widget class="GtkProgressBar" id="progressbar"> 
     28                <property name="visible">True</property> 
     29                <property name="pulse_step">0.10000000149</property> 
     30              </widget> 
     31              <packing> 
     32                <property name="fill">False</property> 
     33                <property name="position">1</property> 
     34              </packing> 
     35            </child> 
     36            <child> 
     37              <placeholder/> 
     38            </child> 
     39          </widget> 
     40        </child> 
     41        <child> 
     42          <widget class="GtkHButtonBox" id="hbuttonbox1"> 
     43            <property name="visible">True</property> 
     44            <property name="spacing">6</property> 
     45            <property name="layout_style">GTK_BUTTONBOX_END</property> 
     46            <child> 
     47              <widget class="GtkButton" id="add_contact_button"> 
     48                <property name="sensitive">False</property> 
     49                <property name="can_focus">True</property> 
     50                <property name="receives_default">True</property> 
     51                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> 
     52                <property name="no_show_all">True</property> 
     53                <property name="response_id">0</property> 
     54                <signal name="clicked" handler="on_add_contact_button_clicked"/> 
     55                <child> 
     56                  <widget class="GtkAlignment" id="alignment2"> 
     57                    <property name="visible">True</property> 
     58                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> 
     59                    <child> 
     60                      <widget class="GtkHBox" id="hbox1"> 
     61                        <property name="visible">True</property> 
     62                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> 
     63                        <property name="spacing">2</property> 
     64                        <child> 
     65                          <widget class="GtkImage" id="image2"> 
     66                            <property name="visible">True</property> 
     67                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> 
     68                            <property name="stock">gtk-add</property> 
     69                          </widget> 
     70                          <packing> 
     71                            <property name="expand">False</property> 
     72                            <property name="fill">False</property> 
     73                          </packing> 
     74                        </child> 
     75                        <child> 
     76                          <widget class="GtkLabel" id="label1"> 
     77                            <property name="visible">True</property> 
     78                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> 
     79                            <property name="label" translatable="yes">_Add contact</property> 
     80                            <property name="use_underline">True</property> 
     81                          </widget> 
     82                          <packing> 
     83                            <property name="expand">False</property> 
     84                            <property name="fill">False</property> 
     85                            <property name="position">1</property> 
     86                          </packing> 
     87                        </child> 
     88                      </widget> 
     89                    </child> 
     90                  </widget> 
     91                </child> 
     92              </widget> 
     93            </child> 
     94            <child> 
     95              <widget class="GtkButton" id="information_button"> 
     96                <property name="sensitive">False</property> 
     97                <property name="can_focus">True</property> 
     98                <property name="receives_default">True</property> 
     99                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> 
     100                <property name="no_show_all">True</property> 
     101                <property name="response_id">0</property> 
     102                <signal name="clicked" handler="on_information_button_clicked"/> 
     103                <child> 
     104                  <widget class="GtkAlignment" id="alignment3"> 
     105                    <property name="visible">True</property> 
     106                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> 
     107                    <child> 
     108                      <widget class="GtkHBox" id="hbox2"> 
     109                        <property name="visible">True</property> 
     110                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> 
     111                        <property name="spacing">2</property> 
     112                        <child> 
     113                          <widget class="GtkImage" id="image3"> 
     114                            <property name="visible">True</property> 
     115                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> 
     116                            <property name="stock">gtk-info</property> 
     117                          </widget> 
     118                          <packing> 
     119                            <property name="expand">False</property> 
     120                            <property name="fill">False</property> 
     121                          </packing> 
     122                        </child> 
     123                        <child> 
     124                          <widget class="GtkLabel" id="label2"> 
     125                            <property name="visible">True</property> 
     126                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> 
     127                            <property name="label" translatable="yes">_Information</property> 
     128                            <property name="use_underline">True</property> 
     129                          </widget> 
     130                          <packing> 
     131                            <property name="expand">False</property> 
     132                            <property name="fill">False</property> 
     133                            <property name="position">1</property> 
     134                          </packing> 
     135                        </child> 
     136                      </widget> 
     137                    </child> 
     138                  </widget> 
     139                </child> 
     140              </widget> 
     141              <packing> 
     142                <property name="position">1</property> 
     143              </packing> 
     144            </child> 
     145            <child> 
     146              <widget class="GtkButton" id="search_button"> 
     147                <property name="visible">True</property> 
     148                <property name="can_focus">True</property> 
     149                <property name="can_default">True</property> 
     150                <property name="response_id">0</property> 
     151                <signal name="clicked" handler="on_search_button_clicked"/> 
     152                <child> 
     153                  <widget class="GtkAlignment" id="alignment1"> 
     154                    <property name="visible">True</property> 
     155                    <property name="xscale">0</property> 
     156                    <property name="yscale">0</property> 
     157                    <child> 
     158                      <widget class="GtkHBox" id="hbox5"> 
     159                        <property name="visible">True</property> 
     160                        <property name="spacing">2</property> 
     161                        <child> 
     162                          <widget class="GtkImage" id="image1"> 
     163                            <property name="visible">True</property> 
     164                            <property name="stock">gtk-find</property> 
     165                          </widget> 
     166                          <packing> 
     167                            <property name="expand">False</property> 
     168                            <property name="fill">False</property> 
     169                          </packing> 
     170                        </child> 
     171                        <child> 
     172                          <widget class="GtkLabel" id="label58"> 
     173                            <property name="visible">True</property> 
     174                            <property name="label" translatable="yes">_Search</property> 
     175                            <property name="use_underline">True</property> 
     176                          </widget> 
     177                          <packing> 
     178                            <property name="expand">False</property> 
     179                            <property name="fill">False</property> 
     180                            <property name="position">1</property> 
     181                          </packing> 
     182                        </child> 
     183                      </widget> 
     184                    </child> 
     185                  </widget> 
     186                </child> 
     187              </widget> 
     188              <packing> 
     189                <property name="position">2</property> 
     190              </packing> 
     191            </child> 
     192            <child> 
     193              <widget class="GtkButton" id="close_button"> 
     194                <property name="visible">True</property> 
     195                <property name="can_focus">True</property> 
     196                <property name="can_default">True</property> 
     197                <property name="label">gtk-close</property> 
     198                <property name="use_stock">True</property> 
     199                <property name="response_id">0</property> 
     200                <signal name="clicked" handler="on_close_button_clicked"/> 
     201              </widget> 
     202              <packing> 
     203                <property name="position">3</property> 
     204              </packing> 
     205            </child> 
     206          </widget> 
     207          <packing> 
     208            <property name="expand">False</property> 
     209            <property name="position">1</property> 
     210          </packing> 
     211        </child> 
     212      </widget> 
     213    </child> 
     214  </widget> 
    191215</glade-interface> 
  • trunk/src/search_window.py

    r8300 r8422  
    2020import gtkgui_helpers 
    2121import dialogs 
     22import vcard 
    2223import config 
    2324import dataforms_widget 
     
    3435                self.xml = gtkgui_helpers.get_glade('search_window.glade') 
    3536                self.window = self.xml.get_widget('search_window') 
    36                 for name in ('label', 'progressbar', 'search_vbox', 'search_button'): 
     37                for name in ('label', 'progressbar', 'search_vbox', 'search_button', 
     38                'add_contact_button', 'information_button'): 
    3739                        self.__dict__[name] = self.xml.get_widget(name) 
    3840 
     
    4446 
    4547                self.is_form = None 
     48 
     49                # Is there a jid column in results ? if -1: no, else column number 
     50                self.jid_column = -1 
    4651 
    4752        def request_form(self): 
     
    8388                self.pulse_id = gobject.timeout_add(80, self.pulse_callback) 
    8489                self.search_button.hide() 
     90 
     91        def on_add_contact_button_clicked(self, widget): 
     92                (model, iter) = self.result_treeview.get_selection().get_selected() 
     93                if not iter: 
     94                        return 
     95                jid = model[iter][self.jid_column] 
     96                dialogs.AddNewContactWindow(self.account, jid) 
     97         
     98        def on_information_button_clicked(self, widget): 
     99                (model, iter) = self.result_treeview.get_selection().get_selected() 
     100                if not iter: 
     101                        return 
     102                jid = model[iter][self.jid_column] 
     103                if gajim.interface.instances[self.account]['infos'].has_key(jid): 
     104                        gajim.interface.instances[self.account]['infos'][jid].window.present() 
     105                else: 
     106                        contact = gajim.contacts.create_contact(jid = jid, name='', groups=[], 
     107                                show='', status='', sub='', ask='', resource='', priority=0, 
     108                                keyID='', our_chatstate=None, chatstate=None) 
     109                        gajim.interface.instances[self.account]['infos'][jid] = \ 
     110                                vcard.VcardWindow(contact, self.account) 
    85111 
    86112        def on_form_arrived(self, form, is_form): 
     
    111137                self.search_vbox.pack_start(self.data_form_widget) 
    112138 
     139        def on_result_treeview_cursor_changed(self, treeview): 
     140                if self.jid_column == -1: 
     141                        return 
     142                (model, iter) = treeview.get_selection().get_selected() 
     143                if not iter: 
     144                        return 
     145                if model[iter][self.jid_column]: 
     146                        self.add_contact_button.set_sensitive(True) 
     147                        self.information_button.set_sensitive(True) 
     148                else: 
     149                        self.add_contact_button.set_sensitive(False) 
     150                        self.information_button.set_sensitive(False) 
     151 
    113152        def on_result_arrived(self, form, is_form): 
    114153                if self.pulse_id: 
     
    125164                        sw = gtk.ScrolledWindow() 
    126165                        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) 
    127                         treeview = gtk.TreeView() 
    128                         sw.add(treeview) 
     166                        self.result_treeview = gtk.TreeView() 
     167                        self.result_treeview.connect('cursor-changed', 
     168                                self.on_result_treeview_cursor_changed) 
     169                        sw.add(self.result_treeview) 
    129170                        # Create model 
    130171                        fieldtypes = [str]*len(form[0]) 
     
    136177                        counter = 0 
    137178                        for field in form[0].keys(): 
    138                                 treeview.append_column( 
     179                                self.result_treeview.append_column( 
    139180                                        gtk.TreeViewColumn(field, gtk.CellRendererText(), 
    140181                                        text = counter)) 
     182                                if field == 'jid': 
     183                                        self.jid_column = counter 
    141184                                counter += 1 
    142                         treeview.set_model(model) 
     185                        self.result_treeview.set_model(model) 
    143186                        sw.show_all() 
    144187                        self.search_vbox.pack_start(sw) 
     188                        if self.jid_column > -1: 
     189                                self.add_contact_button.show() 
     190                                self.information_button.show() 
    145191                        return 
    146192 
     
    155201                        return 
    156202 
     203                self.result_treeview = self.data_form_widget.records_treeview 
     204                selection = self.result_treeview.get_selection() 
     205                selection.set_mode(gtk.SELECTION_SINGLE) 
     206                self.result_treeview.connect('cursor-changed', 
     207                        self.on_result_treeview_cursor_changed) 
     208 
     209                counter = 0 
     210                for field in self.dataform.items[0].fields: 
     211                        if field.var == 'jid': 
     212                                self.jid_column = counter 
     213                                break 
     214                        counter += 1 
    157215                self.search_vbox.pack_start(self.data_form_widget) 
    158216                self.data_form_widget.show() 
     217                if self.jid_column > -1: 
     218                        self.add_contact_button.show() 
     219                        self.information_button.show() 
    159220                if self.data_form_widget.title: 
    160221                        self.window.set_title('%s - Search - Gajim' % \