Changeset 11021:258cd74e0722 in orange


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

Show progress during installation of add-ons.

Location:
Orange
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeCanvas/orngCanvas.pyw

    r11020 r11021  
    864864                    QMessageBox.warning(self,'Download Failed', "Download of add-on list has failed.") 
    865865 
    866         if dlg.exec_() == QDialog.Accepted: 
    867             add, remove, upgrade = dlg.to_install(), dlg.to_remove(), dlg.to_upgrade 
    868             for name in upgrade: 
    869                 try: 
    870                     Orange.utils.addons.upgrade(name) 
    871                 except Exception, e: 
    872                     print "Problem upgrading add-on %s: %s" % (name, e) 
    873             for name in remove: 
    874                 try: 
    875                     Orange.utils.addons.uninstall(name) 
    876                 except Exception, e: 
    877                     print "Problem uninstalling add-on %s: %s" % (name, e) 
    878             for name in add: 
    879                 try: 
    880                     Orange.utils.addons.install(name) 
    881                 except Exception, e: 
    882                     print "Problem installing add-on %s: %s" % (name, e) 
     866        dlg.exec_() 
    883867 
    884868    def menuItemShowStatusBar(self): 
  • Orange/OrangeCanvas/orngDlgs.py

    r11020 r11021  
    811811        # Buttons 
    812812        self.hbox = hbox = OWGUI.widgetBox(mainBox, orientation = "horizontal", sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)) 
     813        busyBox = OWGUI.widgetBox(hbox, sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum))  # A humble stretch. 
     814        self.busyLbl = OWGUI.label(busyBox, self, "") 
    813815        self.progress = QProgressBar(hbox, sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)) 
    814816        hbox.layout().addWidget(self.progress) 
    815817        self.progress.setVisible(False) 
    816         OWGUI.widgetBox(hbox, sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum))  # A humble stretch. 
    817818        self.okButton = OWGUI.button(hbox, self, "OK", callback = self.accept) 
    818819        self.cancelButton = OWGUI.button(hbox, self, "Cancel", callback = self.reject) 
     
    834835            if summary.exec_() == QDialog.Rejected: 
    835836                return 
     837 
     838        self.busy(True) 
     839        self.repaint() 
     840        add, remove, upgrade = self.to_install(), self.to_remove(), self.to_upgrade 
     841        for name in upgrade: 
     842            try: 
     843                self.busy("Upgrading %s ..." % name) 
     844                self.repaint() 
     845                Orange.utils.addons.upgrade(name, self.pcb) 
     846            except Exception, e: 
     847                print "Problem upgrading add-on %s: %s" % (name, e) 
     848        for name in remove: 
     849            try: 
     850                self.busy("Uninstalling %s ..." % name) 
     851                self.repaint() 
     852                Orange.utils.addons.uninstall(name, self.pcb) 
     853            except Exception, e: 
     854                print "Problem uninstalling add-on %s: %s" % (name, e) 
     855        for name in add: 
     856            try: 
     857                self.busy("Installing %s ..." % name) 
     858                self.repaint() 
     859                Orange.utils.addons.install(name, self.pcb) 
     860            except Exception, e: 
     861                print "Problem installing add-on %s: %s" % (name, e) 
     862 
    836863        QDialog.accept(self) 
    837864 
    838865    def busy(self, b=True): 
    839         self.progress.setVisible(b) 
     866        self.progress.setMaximum(1) 
     867        self.progress.setValue(0) 
     868        self.progress.setVisible(bool(b)) 
     869        self.busyLbl.setText(b if isinstance(b, str) else "") 
    840870        self.eSearch.setEnabled(not b) 
    841871        self.lst.setEnabled(not b) 
    842         self.hbox.setEnabled(not b) 
     872        self.okButton.setEnabled(not b) 
     873        self.cancelButton.setEnabled(not b) 
    843874        self.rightPanel.setEnabled(not b) 
    844875        self.infoPane.setEnabled(not b) 
    845          
     876 
     877    def pcb(self, max, val): 
     878        self.progress.setMaximum(max) 
     879        self.progress.setValue(val) 
     880        self.progress.repaint() 
     881 
    846882    def reloadRepo(self): 
    847883        # Reload add-on list. 
    848884        import Orange.utils.addons 
    849885        try: 
    850             self.busy(True) 
     886            self.busy("Reloading add-on repository ...") 
    851887            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) 
    857         except Exception, e:  # Maybe gather all exceptions (for all repositories) and show them in the end? 
     888            Orange.utils.addons.refresh_available_addons(progress_callback = self.pcb) 
     889        except Exception, e: 
    858890            QMessageBox.critical(self, "Error", "Could not reload repository: %s." % e) 
    859891        finally: 
  • Orange/utils/addons.py

    r11020 r11021  
    196196 
    197197 
    198 def install(name): 
     198def install(name, progress_callback=None): 
     199    if progress_callback: 
     200        progress_callback(1, 0) 
    199201    import site 
    200202    try: 
    201203        import urllib 
    202         egg = urllib.urlretrieve(addons[name].release_url)[0] 
     204        rh = (lambda done, bs, fs: progress_callback(fs/bs, done)) if progress_callback else None 
     205        egg = urllib.urlretrieve(addons[name].release_url, reporthook=rh)[0] 
    203206    except Exception, e: 
    204207        raise Exception("Unable to download add-on from repository: %s" % e) 
     
    237240        func() 
    238241 
    239 def uninstall(name): #TODO 
     242def uninstall(name, progress_callback=None): #TODO 
    240243    raise Exception('Unable to uninstall %s: uninstallation of add-ons is not yet implemented.') 
    241244    # Implement this either by using pip.commands.uninstall, and complain if pip is not installed on the system, 
    242245    # or by "stealing" pip's uninstallation code. 
    243246 
    244 def upgrade(name): 
    245     install(name) 
     247def upgrade(name, progress_callback=None): 
     248    install(name, progress_callback) 
    246249 
    247250load_installed_addons() 
Note: See TracChangeset for help on using the changeset viewer.