Changeset 42

Show
Ignore:
Timestamp:
07/20/06 20:49:16 (2 years ago)
Author:
ploum
Message:

#7 : inform the user while searching

Big refactorization : all searches are now threaded

Files:
2 added
1 modified

Legend:

Unmodified
Added
Removed
  • conseil.py

    r41 r42  
    11#!/usr/bin/env python 
    22# -*- coding: utf-8 -*- 
    3 import sys 
    4 import string 
     3import sys, time 
     4import string, threading 
    55#subfolders are added to the path 
    66sys.path[1:1]=["storage", "protocols"] 
     
    2121from bug import bug 
    2222from bookmarks_store import * 
    23 from page import * 
     23from retriever import * 
     24from definitions import * 
    2425 
    2526class MainWindow : 
     
    4950                #Wich BTS are we using ? 
    5051                self.bts = protocol() 
     52                self.retriever = retriever(self.bts, self.bugs_tabs) 
    5153                #bookmarks init 
    5254                self.bookmarks = bookmarks_store(self.bts.btsName()) 
     
    103105 
    104106 
    105         # This function initialize an empty result tree 
    106         def __treeInit__(self): 
    107                 def callback_click(widget, event) : 
    108                         #middle click, open in background 
    109                         if event.button == 2 : 
    110                                 print "TODO : open bug in background" 
    111                         #right click menu 
    112                         elif event.button == 3 : 
    113                                 zetuple = widget.get_selection().get_selected() 
    114                                 itera = zetuple[1] 
    115                                 store = zetuple[0] 
    116                                 def browser_callback(menuitem) : 
    117                                         #if we have not yet left clicked in the results 
    118                                         # itera will be None 
    119                                         # Fixme ! 
    120                                         if itera != None : 
    121                                                 bugnbr = store.get_value(itera,0) 
    122                                                 gnome.url_show(self.bts.getBugUrl(bugnbr)) 
    123                                 browser = gtk.MenuItem("Open in a web browser") 
    124                                 browser.connect("activate", browser_callback) 
    125                                 browser.show() 
    126                                 menu = gtk.Menu() 
    127                                 menu.append(browser) 
    128                                 menu.popup(None, None, None, event.button, event.time) 
    129                 #We add an empty tree result first 
    130                 listing = gtk.ListStore(gobject.TYPE_INT,gobject.TYPE_STRING) 
    131                 tree = gtk.TreeView(listing) 
    132                 tree.connect("button-press-event",callback_click) 
    133                 renderer = gtk.CellRendererText() 
    134                 column = gtk.TreeViewColumn("Bug #", renderer, text=0) 
    135                 column.set_resizable(1) 
    136                 column.set_sort_column_id(0) 
    137                 column2 = gtk.TreeViewColumn("Product", renderer, text=1) 
    138                 column2.set_resizable(1) 
    139                 column2.set_sort_column_id(1) 
    140                 column3 = gtk.TreeViewColumn("Titre", renderer, text=2) 
    141                 column3.set_resizable(1) 
    142                 column3.set_sort_column_id(2) 
    143                 column4 = gtk.TreeViewColumn("Importance", renderer, text=3) 
    144                 column4.set_resizable(1) 
    145                 column4.set_sort_column_id(3) 
    146                 column5 = gtk.TreeViewColumn("Status", renderer, text=4) 
    147                 column5.set_resizable(1) 
    148                 column5.set_sort_column_id(4) 
    149                 tree.append_column(column) 
    150                 tree.append_column(column2) 
    151                 tree.append_column(column3) 
    152                 tree.append_column(column4) 
    153                 tree.append_column(column5) 
    154                 tree.show() 
    155                 return tree 
     107         
    156108 
    157109        def bookmarks_button_press(self,widget, event) : 
     
    200152 
    201153        #open a page in the given widget using clicked, which is a bookmark object 
    202         def open_page(widget,clicked) : 
     154        def open_page(self,clicked) : 
    203155                method = clicked.get_method() 
    204156                dic = makedict() 
     
    208160                        bug_nbr = clicked.get_bug() 
    209161                        dic["bug"] = bug_nbr 
    210                         widget.__bugDisplay(widget.bts.retrieveBug(bug_nbr), dic) 
     162                        self.retriever.display(dic) 
    211163                elif method == 2: 
    212164                        dic["method"] = 2 
    213165                        searchString = clicked.get_search() 
    214166                        dic["search"] = searchString 
    215                         widget.__searchDisplay(widget.bts.genericSearch(searchString),dic) 
     167                        self.retriever.display(dic) 
    216168                elif method == 3: 
    217169                        dic["method"] = 3 
     
    220172                        search = clicked.get_search() 
    221173                        dic["search"] = search 
    222                         widget.__searchDisplay(widget.bts.packageSearch(product,search),dic) 
     174                        self.retriever.display(dic) 
    223175 
    224176        #when the "add bookmark button is clicked 
     
    238190                        dic["method"] = 1 
    239191                        dic["bug"] = searchString 
    240                         self.__bugDisplay(self.bts.retrieveBug(int(searchString)),dic) 
     192                        self.retriever.display(dic) 
    241193                # no, we have a search. 
    242194                else : 
     
    245197                                dic["method"]= 3 
    246198                                dic["product"] = array[0] 
    247                                 #this is only to avoid an error when searching on a lonely package 
    248199                                if len(array) < 2 : 
    249                                         self.__searchDisplay(self.bts.packageSearch(array[0],None),dic) 
     200                                        dic["search"] = None 
    250201                                else : 
    251202                                        dic["search"] = array[1]         
    252                                         self.__searchDisplay(self.bts.packageSearch(array[0],array[1]),dic) 
     203                                self.retriever.display(dic) 
    253204                        else : 
    254205                                dic["method"]= 2 
    255206                                dic["search"] = searchString 
    256                                 self.__searchDisplay(self.bts.genericSearch(searchString),dic) 
    257  
    258         #We did a simple search 
    259         def __searchDisplay(self, store,args): 
    260                 #First, we ask for the result as it can takes some times 
    261                 if len(store) == 0 : 
    262                         tab = gtk.Label("No result matching your search") 
    263                         tab.show() 
    264                 else : 
    265                         tree=self.__treeInit__() 
    266                         tree.connect("row-activated", self.__row_clicked, tree.get_selection()) 
    267                         tree.set_headers_clickable(1) 
    268                         tree.set_rules_hint(1) 
    269                         tree.set_model(store) 
    270                         tab = gtk.ScrolledWindow() 
    271                         tab.show() 
    272                         tab.add(tree) 
    273                 zepage = page(tab, args) 
    274                 self.insertTab(zepage)           
    275  
    276         #Callback for the row_activated in a search view 
    277         def __row_clicked(widget, path, view_column, user_param1,data) : 
    278                 zetuple = data.get_selected() 
    279                 bug_nbr = zetuple[0].get_value(zetuple[1],0) 
    280                 dic = makedict() 
    281                 dic["method"] = 1 
    282                 dic["bug"] = str(bug_nbr) 
    283                 widget.__bugDisplay(widget.bts.retrieveBug(bug_nbr),dic) 
    284          
    285  
    286         # This function takes a bug Object and then display it nicely 
    287         # (it will be nice one day, I swear...) 
    288         def __bugDisplay(self, zebug, descr) : 
    289                 nbr = zebug.getNbr() 
    290                 def callback_click(widget, event) : 
    291                         #middle click, open in background 
    292                         if event.button == 2 : 
    293                                 print "What do you want to do with middle click ?" 
    294                         #right click menu 
    295                         elif event.button == 3 : 
    296                                 def browser_callback(menuitem) : 
    297                                         gnome.url_show(self.bts.getBugUrl(nbr)) 
    298                                 browser = gtk.MenuItem("Open in a web browser") 
    299                                 browser.connect("activate", browser_callback) 
    300                                 browser.show() 
    301                                 menu = gtk.Menu() 
    302                                 menu.append(browser) 
    303                                 menu.popup(None, None, None, event.button, event.time)   
    304  
    305                 def callback_postcom(widget,buff,nbr) : 
    306                         itera = buff.get_bounds() 
    307                         content = buff.get_text(itera[0],itera[1]) 
    308                         if content.strip() != '' : 
    309                                 #FIXME : support title in comments 
    310                                 title="Dummy title" 
    311                                 self.bts.postComment(nbr,title,content) 
    312          
    313                 if nbr < 0 : 
    314                         main_widget = gtk.Label("This specific bug doesnt exist") 
    315                         main_widget.show() 
    316                 else : 
    317                         bugnbr=str(nbr) 
    318                         bugtemplate = "bug_template.glade" 
    319                         bugwidget = gtk.glade.XML(bugtemplate) 
    320                         widget_comments_nbr = bugwidget.get_widget("comments_nbr") 
    321                         textcom = bugwidget.get_widget("text_comment") 
    322                         postbutton = bugwidget.get_widget("post_button") 
    323                         postbutton.connect("clicked",callback_postcom, textcom.get_buffer(),bugnbr) 
    324                         # handle nicely plurals 
    325                         bugtotal = zebug.comNbr() 
    326                         if bugtotal > 1 : 
    327                                 com_text = "%d comments : "%bugtotal 
    328                         else : 
    329                                 com_text = "%d comment : "%bugtotal 
    330                         widget_comments_nbr.set_text(com_text) 
    331                         widget_comments = bugwidget.get_widget("com_frame") 
    332                         widget_nbr = bugwidget.get_widget("number")  
    333                         title_bugnbr = "Bug #%s :" %bugnbr 
    334                         widget_nbr.set_text(title_bugnbr) 
    335                         widget_title = bugwidget.get_widget("title")  
    336                         title_title = "%s" %zebug.getTitle() 
    337                         widget_title.set_text(title_title) 
    338                         widget_description = bugwidget.get_widget("description")  
    339                         widget_description.set_text(zebug.getDescription()) 
    340                         widget_status= bugwidget.get_widget("status") 
    341                         widget_status.set_text(zebug.getStatus()) 
    342                         widget_importance= bugwidget.get_widget("importance") 
    343                         widget_importance.set_text(zebug.getImportance()) 
    344                         widget_assignee= bugwidget.get_widget("assigned") 
    345                         widget_assignee.set_text(zebug.getAssignee()) 
    346                         widget_package= bugwidget.get_widget("package") 
    347                         widget_package.set_text(zebug.getPackage()) 
    348                         #inserting comments 
    349                         hbox = gtk.VBox(spacing=2) 
    350                         hbox.show() 
    351                         for i in zebug.getAllComments(): 
    352                                 comwidget = gtk.glade.XML("comment.glade") 
    353                                 comwidget.get_widget("poster").set_text(i.getAuthor()) 
    354                                 comwidget.get_widget("title").set_text(i.getTitle()) 
    355                                 comwidget.get_widget("date").set_text(i.getDate()) 
    356                                 comwidget.get_widget("comment_body").set_text(i.getContent()) 
    357                                 hbox.add(comwidget.get_widget("comment")) 
    358  
    359                         to_remove = bugwidget.get_widget("dummy_label") 
    360                         widget_comments.remove(to_remove) 
    361                         widget_comments.add(hbox) 
    362                         #We take the vbox to insert it 
    363                         main_widget = bugwidget.get_widget("bug_main") 
    364                         main_widget.connect("button-press-event",callback_click) 
     207                                self.retriever.display(dic) 
     208         
    365209                 
    366                 zepage = page(main_widget, descr) 
    367                 self.insertTab(zepage) 
    368  
    369  
    370         # Adding a tab 
    371         # we receive as arguments an objet page 
    372         def insertTab(self, tab_page) : 
    373                 #close tab button callback 
    374                 tab = tab_page.get_widget() 
    375                 name = tab_page.get_title() 
    376                 def closeTab(widget, data): 
    377                         page = self.bugs_tabs.page_num(data) 
    378                         self.bugs_tabs.remove_page(page) 
    379                 #this is ugly ! I don't want to use glade for this 
    380                 label_widget=gtk.glade.XML("tab_label.glade") 
    381                 dic = {"on_close_tab_clicked" : lambda close: closeTab(close, tab) } 
    382                 label_widget.signal_autoconnect(dic) 
    383                 label=label_widget.get_widget("label1") 
    384                 label.set_text(name) 
    385                 top=label_widget.get_widget("hbox1") 
    386                 tabid = self.bugs_tabs.insert_page(tab, top) 
    387  
    388  
    389 #make a search dictionnary 
    390 #Those dict are passed as argument to __searchDisplay 
    391 def makedict() : 
    392         return dict([["method",None],["search",None],["product",None],["bug",None]]) 
    393                  
    394210 
    395211if __name__ == "__main__": 
     212        gobject.threads_init() 
     213        #gtk.gdk.threads_init() 
    396214        hwg = MainWindow() 
     215        #gtk.threads_enter() 
    397216        gtk.main() 
     217        #gtk.threads_leave()