Changeset 11020:ecf11f8d4342 in orange


Ignore:
Timestamp:
11/14/12 11:34:03 (17 months ago)
Author:
Matija Polajnar <matija.polajnar@…>
Branch:
default
Message:

Show progress during reloading of add-ons list.

Location:
Orange
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeCanvas/orngCanvas.pyw

    r11018 r11020  
    846846        t = time.time() 
    847847        lastRefresh = self.settings["lastAddonsRefresh"] 
     848        dlg = orngDlgs.AddOnManagerDialog(self, self) 
    848849        if t - lastRefresh > 7*24*3600: 
     850            dlg.show() 
    849851            if QMessageBox.question(self, "Refresh", 
    850852                                    "List of add-ons in repository has %s. Do you want to %s the list now?" % 
     
    854856                                     QMessageBox.No | QMessageBox.Escape) == QMessageBox.Yes: 
    855857                 
    856                 #TODO: # Should show some progress (and enable cancellation) 
    857858                try: 
    858                     Orange.utils.addons.refresh_available_addons() 
     859                    dlg.reloadRepo() 
    859860                    self.settings["lastAddonsRefresh"] = time.time() 
    860861                except Exception, e: 
     
    863864                    QMessageBox.warning(self,'Download Failed', "Download of add-on list has failed.") 
    864865 
    865         dlg = orngDlgs.AddOnManagerDialog(self, self) 
    866866        if dlg.exec_() == QDialog.Accepted: 
    867867            add, remove, upgrade = dlg.to_install(), dlg.to_remove(), dlg.to_upgrade 
  • Orange/OrangeCanvas/orngDlgs.py

    r11019 r11020  
    799799        # Right panel 
    800800         
    801         rightPanel = OWGUI.widgetBox(repos, orientation = "vertical", sizePolicy=QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Expanding)) 
     801        self.rightPanel = rightPanel = OWGUI.widgetBox(repos, orientation = "vertical", sizePolicy=QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Expanding)) 
    802802        rightPanel.layout().setSizeConstraint(QLayout.SetMinimumSize) 
    803803        self.reloadRepoButton = OWGUI.button(rightPanel, self, "Refresh list", callback = self.reloadRepo) 
     
    810810         
    811811        # Buttons 
    812         hbox = OWGUI.widgetBox(mainBox, orientation = "horizontal", sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)) 
    813         hbox.layout().addStretch(1) 
     812        self.hbox = hbox = OWGUI.widgetBox(mainBox, orientation = "horizontal", sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)) 
     813        self.progress = QProgressBar(hbox, sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)) 
     814        hbox.layout().addWidget(self.progress) 
     815        self.progress.setVisible(False) 
     816        OWGUI.widgetBox(hbox, sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum))  # A humble stretch. 
    814817        self.okButton = OWGUI.button(hbox, self, "OK", callback = self.accept) 
    815818        self.cancelButton = OWGUI.button(hbox, self, "Cancel", callback = self.reject) 
     
    832835                return 
    833836        QDialog.accept(self) 
     837 
     838    def busy(self, b=True): 
     839        self.progress.setVisible(b) 
     840        self.eSearch.setEnabled(not b) 
     841        self.lst.setEnabled(not b) 
     842        self.hbox.setEnabled(not b) 
     843        self.rightPanel.setEnabled(not b) 
     844        self.infoPane.setEnabled(not b) 
    834845         
    835846    def reloadRepo(self): 
    836847        # Reload add-on list. 
    837         # TODO: This can take some time - show some progress to user! 
    838848        import Orange.utils.addons 
    839849        try: 
    840             Orange.utils.addons.refresh_available_addons() 
     850            self.busy(True) 
     851            self.repaint() 
     852            def pcb(max, val): 
     853                self.progress.setMaximum(max) 
     854                self.progress.setValue(val) 
     855                self.progress.repaint() 
     856            Orange.utils.addons.refresh_available_addons(progress_callback = pcb) 
    841857        except Exception, e:  # Maybe gather all exceptions (for all repositories) and show them in the end? 
    842             QMessageBox.critical(self, "Error", "Could not reload repository '%s': %s." % (repo.name, e)) 
     858            QMessageBox.critical(self, "Error", "Could not reload repository: %s." % e) 
     859        finally: 
     860            self.busy(False) 
    843861        # Finally, refresh the tree on GUI. 
    844862        self.refreshView() 
  • Orange/utils/addons.py

    r11018 r11020  
    8181    return result 
    8282 
    83 def refresh_available_addons(force=False): 
     83def refresh_available_addons(force=False, progress_callback=None): 
    8484    pypi = xmlrpclib.ServerProxy('http://pypi.python.org/pypi') 
     85    if progress_callback: 
     86        progress_callback(1, 0) 
    8587 
    8688    pkg_dict = {} 
     
    98100 
    99101    docs = {} 
    100     for name, (_, version) in pkg_dict.items(): 
     102    if progress_callback: 
     103        progress_callback(len(pkg_dict)+1, 1) 
     104    for i, (name, (_, version)) in enumerate(pkg_dict.items()): 
    101105        if force or name not in addons or addons[name].available_version != version: 
    102106            try: 
     
    126130                traceback.print_exc() 
    127131                warnings.warn('Could not load data for the following add-on: %s'%name) 
     132        if progress_callback: 
     133            progress_callback(len(pkg_dict)+1, i+2) 
    128134 
    129135    rebuild_index() 
Note: See TracChangeset for help on using the changeset viewer.