Ignore:
Timestamp:
09/10/13 13:43:30 (7 months ago)
Author:
markotoplak
Branch:
default
Children:
11694:d38d2b1084b7, 11868:8672ced44ddb
Message:

Database update redesign (changes by Vid).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeWidgets/OWDatabasesUpdate.py

    r11619 r11693  
    44import sys 
    55 
    6 from datetime import datetime 
     6from datetime import datetime, timedelta 
    77from functools import partial 
    88from collections import namedtuple 
     
    1818 
    1919import OWGUIEx 
     20import OWGUI 
    2021 
    2122 
     
    6263    #: Remove button was clicked. 
    6364    removeClicked = Signal() 
    64  
     65     
    6566    def __init__(self, state=AVAILABLE, parent=None): 
    6667        QWidget.__init__(self, parent) 
     
    6869        layout.setSpacing(1) 
    6970        layout.setContentsMargins(1, 1, 1, 1) 
    70         self.installButton = UpdateOptionButton(self) 
    71         self.installButton.setIcon(icon("update.png")) 
    72         self.installButton.setToolTip("Download") 
    73  
    74         self.removeButton = UpdateOptionButton(self) 
    75         self.removeButton.setIcon(icon("delete.png")) 
    76         self.removeButton.setToolTip("Remove from system") 
    77  
    78         self.installButton.clicked.connect(self.installClicked) 
    79         self.removeButton.clicked.connect(self.removeClicked) 
    80  
    81         layout.addWidget(self.installButton) 
    82         layout.addWidget(self.removeButton) 
     71 
     72        self.checkButton = QCheckBox() 
     73          
     74        layout.addWidget(self.checkButton) 
    8375        self.setLayout(layout) 
    84  
     76  
    8577        self.setMaximumHeight(30) 
    8678 
    8779        self.state = -1 
    8880        self.setState(state) 
    89  
     81         
    9082    def setState(self, state): 
    9183        """ 
     
    9789            self.state = state 
    9890            self._update() 
    99  
     91  
    10092    def _update(self): 
    10193        if self.state == AVAILABLE: 
    102             self.installButton.setIcon(icon("update.png")) 
    103             self.installButton.setToolTip("Download") 
    104             self.installButton.setEnabled(True) 
    105             self.removeButton.setEnabled(False) 
     94            self.checkButton.setChecked(False) 
    10695        elif self.state == CURRENT: 
    107             self.installButton.setIcon(icon("update1.png")) 
    108             self.installButton.setToolTip("Update") 
    109             self.installButton.setEnabled(False) 
    110             self.removeButton.setEnabled(True) 
     96            self.checkButton.setChecked(True) 
    11197        elif self.state == OUTDATED: 
    112             self.installButton.setIcon(icon("update1.png")) 
    113             self.installButton.setToolTip("Update") 
    114             self.installButton.setEnabled(True) 
    115             self.removeButton.setEnabled(True) 
     98            self.checkButton.setChecked(True) 
    11699        elif self.state == DEPRECATED: 
    117             self.installButton.setIcon(icon("update.png")) 
    118             self.installButton.setToolTip("") 
    119             self.installButton.setEnabled(False) 
    120             self.removeButton.setEnabled(True) 
     100            self.checkButton.setChecked(True) 
    121101        else: 
    122102            raise ValueError("Invalid state %r" % self._state) 
     103 
     104        try: 
     105            self.checkButton.clicked.disconnect()   # Remove old signals if they exist 
     106        except: 
     107            pass 
     108 
     109        if not self.checkButton.isChecked():        # Switch signals if the file is present or not 
     110            self.checkButton.clicked.connect(self.installClicked) 
     111        else: 
     112            self.checkButton.clicked.connect(self.removeClicked) 
    123113 
    124114 
     
    167157        self.setData(1, self.EditRole2, item.title) 
    168158 
    169         self.setData(2, Qt.DisplayRole, sizeof_fmt(item.size)) 
    170         self.setData(2, self.EditRole2, item.size) 
    171  
    172         if item.latest is not None: 
    173             self.setData(3, Qt.DisplayRole, item.latest.date().isoformat()) 
    174             self.setData(3, self.EditRole2, item.latest) 
    175         else: 
    176             self.setData(3, Qt.DisplayRole, "N/A") 
     159        self.setData(4, Qt.DisplayRole, sizeof_fmt(item.size)) 
     160        self.setData(4, self.EditRole2, item.size) 
     161 
     162        if item.local is not None: 
     163            self.setData(3, Qt.DisplayRole, item.local.date().isoformat()) 
     164            self.setData(3, self.EditRole2, item.local) 
     165        else: 
     166            self.setData(3, Qt.DisplayRole, "") 
    177167            self.setData(3, self.EditRole2, datetime.now()) 
    178168 
     
    181171    def _updateToolTip(self): 
    182172        state_str = self.STATE_STRINGS[self.item.state] 
     173        try: 
     174            diff_date = self.item.latest - self.item.local 
     175        except: 
     176            diff_date = None 
     177         
    183178        tooltip = ("State: %s\nTags: %s" % 
    184                    (state_str, 
    185                     ", ".join(tag for tag in self.item.tags 
    186                               if not tag.startswith("#")))) 
     179                   (state_str, ", ".join(tag for tag in self.item.tags 
     180                    if not tag.startswith("#")))) 
    187181 
    188182        if self.item.state in [CURRENT, OUTDATED, DEPRECATED]: 
     
    190184                        serverfiles.localpath(self.item.domain, 
    191185                                              self.item.filename)) 
     186        
     187        if self.item.state == 2 and diff_date: 
     188            tooltip += ("\nServer version: %s\nStatus: old (%d days)" % (self.item.latest, diff_date.days)) 
     189        else: 
     190            tooltip += ("\nServer version: %s" % self.item.latest) 
     191 
    192192        for i in range(1, 4): 
    193193            self.setToolTip(i, tooltip) 
     
    402402        box = OWGUI.widgetBox(self.controlArea, "Files") 
    403403        self.filesView = QTreeWidget(self) 
    404         self.filesView.setHeaderLabels(["Options", "Title", "Size", 
    405                                         "Last Updated"]) 
     404        self.filesView.setHeaderLabels(["", "Data Source", "Update", 
     405                                        "Last Updated", "Size"]) 
    406406        self.filesView.setRootIsDecorated(False) 
    407407        self.filesView.setUniformRowHeights(True) 
     
    418418 
    419419        box = OWGUI.widgetBox(self.controlArea, orientation="horizontal") 
    420         OWGUI.button(box, self, "Update all local files", 
     420        self.updateButton = OWGUI.button(box, self, "Update all", 
    421421                     callback=self.UpdateAll, 
    422                      tooltip="Update all updatable files") 
    423         OWGUI.button(box, self, "Download filtered", 
     422                     tooltip="Update all updatable files", 
     423                     ) 
     424         
     425        self.downloadButton = OWGUI.button(box, self, "Download all", 
    424426                     callback=self.DownloadFiltered, 
    425427                     tooltip="Download all filtered files shown") 
    426         OWGUI.button(box, self, "Cancel", callback=self.Cancel, 
     428        self.cancelButton = OWGUI.button(box, self, "Cancel", callback=self.Cancel, 
    427429                     tooltip="Cancel scheduled downloads/updates.") 
    428430        OWGUI.rubber(box) 
     
    479481        self.setEnabled(False) 
    480482 
     483 
    481484    def SetFilesList(self, serverInfo): 
    482485        """ 
     
    504507            options_widget.item = item 
    505508 
    506             # Connect the actions to the appropriate methods 
    507509            options_widget.installClicked.connect( 
    508510                partial(self.SubmitDownloadTask, item.domain, item.filename) 
     
    521523        for item, tree_item, options_widget in self.updateItems: 
    522524            self.filesView.setItemWidget(tree_item, 0, options_widget) 
     525             
     526            # Add an update button if the file is updateable 
     527            if item.state == 2: 
     528                ButtonWidget = QPushButton("Update") 
     529                layout = QHBoxLayout() 
     530                layout.setSpacing(1) 
     531                layout.setContentsMargins(20, 30, 30, 30) 
     532 
     533                layout.addWidget(ButtonWidget)                  
     534                ButtonWidget.setMaximumHeight(30) 
     535                ButtonWidget.setMaximumWidth(120) 
     536                ButtonWidget.setAutoDefault(False) 
     537 
     538                ButtonWidget.clicked.connect(partial(self.SubmitDownloadTask, item.domain, item.filename)) 
     539 
     540                self.filesView.setItemWidget(tree_item, 2, ButtonWidget) 
    523541 
    524542        self.progress.advance() 
     
    533551        self.SearchUpdate() 
    534552        self.UpdateInfoLabel() 
     553        self.toggleButtons() 
     554        self.cancelButton.setEnabled(False) 
    535555 
    536556        self.progress.setRange(0, 0) 
     557 
     558    def buttonCheck(self, selected_items, state, button): 
     559        for item in selected_items: 
     560            if item.state != state: 
     561                button.setEnabled(False) 
     562            else: 
     563                button.setEnabled(True) 
     564                break 
     565 
     566    def toggleButtons(self): 
     567        selected_items = [item for item, tree_item, _ in self.updateItems if not tree_item.isHidden()] 
     568        self.buttonCheck(selected_items, OUTDATED, self.updateButton) 
     569        self.buttonCheck(selected_items, AVAILABLE, self.downloadButton) 
    537570 
    538571    def HandleError(self, exception): 
     
    564597 
    565598    def UpdateAll(self): 
    566         for item, _, _ in self.updateItems: 
    567             if item.state == OUTDATED: 
     599        for item, tree_item, _ in self.updateItems: 
     600            if item.state == OUTDATED and not tree_item.isHidden(): 
    568601                self.SubmitDownloadTask(item.domain, item.filename) 
    569602 
     
    582615            tree_item.setHidden(hide) 
    583616        self.UpdateInfoLabel() 
     617        self.toggleButtons() 
    584618 
    585619    def SubmitDownloadTask(self, domain, filename): 
     
    587621        Submit the (domain, filename) to be downloaded/updated. 
    588622        """ 
     623        self.cancelButton.setEnabled(True) 
     624 
    589625        index = self.updateItemIndex(domain, filename) 
    590626        _, tree_item, opt_widget = self.updateItems[index] 
     
    655691 
    656692            self.UpdateInfoLabel() 
     693            self.cancelButton.setEnabled(False) 
    657694 
    658695    def SubmitRemoveTask(self, domain, filename): 
Note: See TracChangeset for help on using the changeset viewer.