Changeset 4990:87fb2777ff37 in orange


Ignore:
Timestamp:
07/18/08 11:37:11 (6 years ago)
Author:
gregor <gregor@…>
Branch:
default
Convert:
74b72320bffa638c1e036da062b097471552d7e6
Message:
  • added tree view for showing the list of widgets
Location:
orange/OrangeCanvas
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeCanvas/orngCanvas.pyw

    r4963 r4990  
    44from PyQt4.QtCore import * 
    55from PyQt4.QtGui import * 
    6 import sys, os, cPickle 
     6import sys, os, cPickle, orngGui 
    77import orngTabs, orngDoc, orngDlgs, orngOutput 
    88import orange, user, orngMisc, orngRegistry, orngOrangeFoldersQt4 
     
    1717        self.recentDocs = [] 
    1818        self.iDocIndex = 1 
    19         self.iconSizeList = ["32 x 32", "40 x 40", "48 x 48", "60 x 60"] 
     19        self.iconSizeList = ["16 x 16", "32 x 32", "40 x 40", "48 x 48", "60 x 60"] 
    2020        self.iconSizeDict = dict((val, int(val[:2])) for val in self.iconSizeList) 
    2121        self.originalPalette = QApplication.palette() 
     
    9090        self.toolbar.addAction(QIcon(self.file_print), "Print", self.menuItemPrinter) 
    9191 
    92         self.widgetListTypeGroup = QActionGroup(self) 
    93         self.widgetListTypeGroup.addAction(self.widgetListTypeToolbar.addAction(QIcon(self.text_icon), "Show list of widgets in a toolbox", self.widgetListTypeChanged)) 
    94         self.widgetListTypeGroup.addAction(self.widgetListTypeToolbar.addAction(QIcon(self.text_icon), "Show list of widgets in a tab bar", self.widgetListTypeChanged)) 
    95         self.widgetListTypeGroup.addAction(self.widgetListTypeToolbar.addAction(QIcon(self.text_icon), "Show list of widgets and their names in a tab bar ", self.widgetListTypeChanged)) 
    96         for action in self.widgetListTypeGroup.actions(): 
    97             action.setCheckable(1) 
    98         self.widgetListTypeGroup.actions()[self.settings["widgetListType"]].setChecked(1) 
     92        w = QWidget() 
     93        w.setLayout(QHBoxLayout()) 
     94        self.widgetListTypeToolbar.addWidget(w) 
     95        self.widgetOrganizationCombo = orngGui.comboBox(w, label = "Style:", orientation = "horizontal", items = ["Tool box", "Tree view", "Tabs without labels", "Tabs with labels"]) 
     96         
     97        self.connect(self.widgetOrganizationCombo, SIGNAL('activated(int)'), self.widgetListTypeChanged) 
     98        try:        # maybe we will someday remove some of the options and the index will be too big 
     99            self.widgetOrganizationCombo.setCurrentIndex(self.settings["widgetListType"]) 
     100        except: 
     101            pass 
     102         
     103#        self.widgetListTypeGroup = QActionGroup(self) 
     104#        self.widgetListTypeGroup.addAction(self.widgetListTypeToolbar.addAction(QIcon(self.text_icon), "Show list of widgets in a toolbox", self.widgetListTypeChanged)) 
     105#        self.widgetListTypeGroup.addAction(self.widgetListTypeToolbar.addAction(QIcon(self.text_icon), "Show list of widgets in a tab bar", self.widgetListTypeChanged)) 
     106#        self.widgetListTypeGroup.addAction(self.widgetListTypeToolbar.addAction(QIcon(self.text_icon), "Show list of widgets and their names in a tab bar ", self.widgetListTypeChanged)) 
     107#        for action in self.widgetListTypeGroup.actions(): 
     108#            action.setCheckable(1) 
     109#        self.widgetListTypeGroup.actions()[self.settings["widgetListType"]].setChecked(1) 
    99110 
    100111 
     
    192203            if isinstance(self.widgetsToolBar, QToolBar): 
    193204                self.removeToolBar(self.widgetsToolBar) 
    194             if isinstance(self.widgetsToolBar, orngTabs.WidgetToolBox): 
     205            elif isinstance(self.widgetsToolBar, orngTabs.WidgetToolBox): 
    195206                self.settings["toolboxWidth"] = self.widgetsToolBar.toolbox.width() 
    196207                self.removeDockWidget(self.widgetsToolBar) 
     208            elif isinstance(self.widgetsToolBar, orngTabs.WidgetTree): 
     209                self.settings["toolboxWidth"] = self.widgetsToolBar.treeWidget.width() 
     210                self.removeDockWidget(self.widgetsToolBar) 
    197211 
    198212        if self.settings["widgetListType"] == 0: 
    199213            self.tabs = self.widgetsToolBar = orngTabs.WidgetToolBox(self, self.widgetInfo) 
     214            self.addDockWidget(Qt.LeftDockWidgetArea, self.widgetsToolBar) 
     215        elif self.settings["widgetListType"] == 1: 
     216            self.tabs = self.widgetsToolBar = orngTabs.WidgetTree(self, self.widgetInfo) 
    200217            self.addDockWidget(Qt.LeftDockWidgetArea, self.widgetsToolBar) 
    201218        else: 
     
    568585                win.canvas.update() 
    569586 
    570     def widgetListTypeChanged(self): 
    571         self.settings["widgetListType"] = self.widgetListTypeGroup.actions().index(self.widgetListTypeGroup.checkedAction()) 
     587    def widgetListTypeChanged(self, ind): 
     588        self.settings["widgetListType"] = ind 
    572589        self.createWidgetsToolbar(0) 
    573590 
  • orange/OrangeCanvas/orngTabs.py

    r4897 r4990  
    1212 
    1313WB_TOOLBOX = 0 
    14 WB_TABBAR_NO_TEXT = 1 
    15 WB_TABBAR_TEXT = 2 
     14WB_TREEVIEW = 1 
     15WB_TABBAR_NO_TEXT = 2 
     16WB_TABBAR_TEXT = 3 
    1617 
    1718# we have to use a custom class since QLabel by default ignores the mouse 
     
    3334        self.parent().mouseReleaseEvent(ev) 
    3435 
    35 class WidgetButton(QFrame): 
     36 
     37 
     38class WidgetButtonBase(): 
     39    def __init__(self): 
     40        self.shiftPressed = 0 
     41                 
     42    def getFileName(self): 
     43        return str(self.widgetTabs.widgetInfo[self.nameKey]["fileName"]) 
     44 
     45    def getFullIconName(self): 
     46        name = self.getIconName() 
     47        widgetDir = str(self.widgetTabs.widgetInfo[self.nameKey]["directory"])#os.path.split(self.getFileName())[0] 
     48 
     49        for paths in [(self.canvasDlg.picsDir, name), 
     50                      (self.canvasDlg.widgetDir, name), 
     51                      (name,), 
     52                      (widgetDir, name), 
     53                      (widgetDir, "icons", name)]: 
     54            fname = os.path.join(*paths) 
     55            if os.path.exists(fname): 
     56                return fname 
     57 
     58        return self.canvasDlg.defaultPic 
     59 
     60    def getIconName(self): 
     61        return str(self.widgetTabs.widgetInfo[self.nameKey]["iconName"]) 
     62 
     63    def getPriority(self): 
     64        return self.widgetTabs.widgetInfo[self.nameKey]["priority"] 
     65 
     66    def getDescription(self): 
     67        return str(self.widgetTabs.widgetInfo[self.nameKey]["description"]) 
     68 
     69    def getAuthor(self): 
     70        if self.widgetTabs.widgetInfo[self.nameKey].has_key("author"): 
     71            return str(self.widgetTabs.widgetInfo[self.nameKey]["author"]) 
     72        else: return "" 
     73 
     74    # get inputs as instances of InputSignal 
     75    def getInputs(self): 
     76        return self.widgetTabs.widgetInfo[self.nameKey]["inputs"] 
     77 
     78    # get outputs as instances of OutputSignal 
     79    def getOutputs(self): 
     80        return self.widgetTabs.widgetInfo[self.nameKey]["outputs"] 
     81 
     82    def getMajorInputs(self): 
     83        ret = [] 
     84        for signal in self.widgetTabs.widgetInfo[self.nameKey]["inputs"]: 
     85            if signal.default: 
     86                ret.append(signal) 
     87        return ret 
     88 
     89    def getMajorOutputs(self): 
     90        ret = [] 
     91        for signal in self.widgetTabs.widgetInfo[self.nameKey]["outputs"]: 
     92            if signal.default: 
     93                ret.append(signal) 
     94        return ret 
     95 
     96    def getMinorInputs(self): 
     97        ret = [] 
     98        for signal in self.widgetTabs.widgetInfo[self.nameKey]["inputs"]: 
     99            if not signal.default: 
     100                ret.append(signal) 
     101        return ret 
     102 
     103    def getMinorOutputs(self): 
     104        ret = [] 
     105        for signal in self.widgetTabs.widgetInfo[self.nameKey]["outputs"]: 
     106            if not signal.default: 
     107                ret.append(signal) 
     108        return ret 
     109 
     110    def getCategory(self): 
     111        return self.nameKey[:self.nameKey.index("-")].strip() 
     112     
     113    def clicked(self, rightClick = False): 
     114        win = self.canvasDlg.workspace.activeSubWindow() 
     115        if (win and isinstance(win, orngDoc.SchemaDoc)): 
     116            win.addWidget(self) 
     117            if (rightClick or self.shiftPressed) and len(win.widgets) > 1: 
     118                win.addLine(win.widgets[-2], win.widgets[-1]) 
     119        elif (isinstance(win, orngOutput.OutputWindow)): 
     120            QMessageBox.information(self,'Orange Canvas','Unable to add widget instance to Output window. Please select a document window first.',QMessageBox.Ok) 
     121        else: 
     122            QMessageBox.information(self,'Orange Canvas','Unable to add widget instance. Please open a document window first.',QMessageBox.Ok) 
     123 
     124 
     125     
     126         
     127class WidgetButton(QFrame, WidgetButtonBase): 
    36128    def __init__(self, parent, buttonType = 2, size=30): 
    37129        QFrame.__init__(self) 
    38         self.shiftPressed = 0 
     130        WidgetButtonBase.__init__(self) 
    39131        self.buttonType = buttonType 
    40132        self.iconSize = size 
     
    54146        ev.accept() 
    55147 
    56     def setData(self, name, nameKey, tabs, canvasDlg): 
     148    def setButtonData(self, name, nameKey, tabs, canvasDlg): 
    57149        self.widgetTabs = tabs 
    58150        self.name = name 
     
    108200        tooltipText = "<b><b>&nbsp;%s</b></b><hr><b>Description:</b><br>&nbsp;&nbsp;%s<hr>%s<hr>%s" % (name, self.getDescription(), formatedInList[:-4], formatedOutList[:-4]) 
    109201        self.setToolTip(tooltipText) 
    110  
    111  
    112     def getFileName(self): 
    113         return str(self.widgetTabs.widgetInfo[self.nameKey]["fileName"]) 
    114  
    115     def getFullIconName(self): 
    116         name = self.getIconName() 
    117         widgetDir = str(self.widgetTabs.widgetInfo[self.nameKey]["directory"])#os.path.split(self.getFileName())[0] 
    118  
    119         for paths in [(self.canvasDlg.picsDir, name), 
    120                       (self.canvasDlg.widgetDir, name), 
    121                       (name,), 
    122                       (widgetDir, name), 
    123                       (widgetDir, "icons", name)]: 
    124             fname = os.path.join(*paths) 
    125             if os.path.exists(fname): 
    126                 return fname 
    127  
    128         return self.canvasDlg.defaultPic 
    129  
    130     def getIconName(self): 
    131         return str(self.widgetTabs.widgetInfo[self.nameKey]["iconName"]) 
    132  
    133     def getPriority(self): 
    134         return self.widgetTabs.widgetInfo[self.nameKey]["priority"] 
    135  
    136     def getDescription(self): 
    137         return str(self.widgetTabs.widgetInfo[self.nameKey]["description"]) 
    138  
    139     def getAuthor(self): 
    140         if self.widgetTabs.widgetInfo[self.nameKey].has_key("author"): 
    141             return str(self.widgetTabs.widgetInfo[self.nameKey]["author"]) 
    142         else: return "" 
    143  
    144     # get inputs as instances of InputSignal 
    145     def getInputs(self): 
    146         return self.widgetTabs.widgetInfo[self.nameKey]["inputs"] 
    147  
    148     # get outputs as instances of OutputSignal 
    149     def getOutputs(self): 
    150         return self.widgetTabs.widgetInfo[self.nameKey]["outputs"] 
    151  
    152     def getMajorInputs(self): 
    153         ret = [] 
    154         for signal in self.widgetTabs.widgetInfo[self.nameKey]["inputs"]: 
    155             if signal.default: 
    156                 ret.append(signal) 
    157         return ret 
    158  
    159     def getMajorOutputs(self): 
    160         ret = [] 
    161         for signal in self.widgetTabs.widgetInfo[self.nameKey]["outputs"]: 
    162             if signal.default: 
    163                 ret.append(signal) 
    164         return ret 
    165  
    166     def getMinorInputs(self): 
    167         ret = [] 
    168         for signal in self.widgetTabs.widgetInfo[self.nameKey]["inputs"]: 
    169             if not signal.default: 
    170                 ret.append(signal) 
    171         return ret 
    172  
    173     def getMinorOutputs(self): 
    174         ret = [] 
    175         for signal in self.widgetTabs.widgetInfo[self.nameKey]["outputs"]: 
    176             if not signal.default: 
    177                 ret.append(signal) 
    178         return ret 
    179  
    180     def getCategory(self): 
    181         return self.nameKey[:self.nameKey.index("-")].strip() 
    182  
    183  
     202    
    184203    def mouseMoveEvent(self, e): 
    185204        ### Semaphore "busy" is needed for some widgets whose loading takes more time, e.g. Select Data 
     
    226245        self.layout().setMargin(self.layout().margin()-2) 
    227246 
    228  
     247         
    229248    def mouseReleaseEvent(self, e): 
    230249        self.layout().setMargin(self.layout().margin()+2) 
    231250        self.setFrameShape(QFrame.NoFrame) 
    232  
    233251        dinwin, widget = getattr(self, "widgetDragging", (None, None)) 
    234252        self.shiftPressed = e.modifiers() & Qt.ShiftModifier 
     
    241259            delattr(self, "widgetDragging") 
    242260 
    243  
    244         # we say that we clicked the button only if we released the mouse inside the button 
    245         if e.pos().x() >= 0 and e.pos().x() < self.width() and e.pos().y() > 0 and e.pos().y() < self.height(): 
    246             self.clicked(e.button() == Qt.RightButton) 
    247  
    248     def clicked(self, rightClick = False): 
    249         win = self.canvasDlg.workspace.activeSubWindow() 
    250         if (win and isinstance(win, orngDoc.SchemaDoc)): 
    251             win.addWidget(self) 
    252             if (rightClick or self.shiftPressed) and len(win.widgets) > 1: 
    253                 win.addLine(win.widgets[-2], win.widgets[-1]) 
    254         elif (isinstance(win, orngOutput.OutputWindow)): 
    255             QMessageBox.information(self,'Orange Canvas','Unable to add widget instance to Output window. Please select a document window first.',QMessageBox.Ok) 
    256         else: 
    257             QMessageBox.information(self,'Orange Canvas','Unable to add widget instance. Please open a document window first.',QMessageBox.Ok) 
    258  
    259  
    260261    def wheelEvent(self, ev): 
    261262        if self.parent() and self.buttonType != WB_TOOLBOX: 
     
    264265        else: 
    265266            QFrame.wheelEvent(self, ev) 
     267 
     268 
     269class WidgetTreeItem(QTreeWidgetItem, WidgetButtonBase): 
     270    def __init__(self, parent): 
     271        QTreeWidgetItem.__init__(self, parent) 
     272        WidgetButtonBase.__init__(self) 
     273     
     274    def adjustSize(self): 
     275        pass 
     276     
     277    def setButtonData(self, name, nameKey, tabs, canvasDlg): 
     278        self.widgetTabs = tabs 
     279        self.name = name 
     280        self.nameKey = nameKey 
     281        self.canvasDlg = canvasDlg 
     282        self.setIcon(0, QIcon(self.getFullIconName())) 
     283        self.setText(0, name) 
     284         
     285 
    266286             
    267287class WidgetScrollArea(QScrollArea): 
     
    308328                if isinstance(self, WidgetTabs): 
    309329                    self.removeTab(self.indexOf(self.tabs[i][2].tab)) 
     330                elif isinstance(self, WidgetTree): 
     331                    self.tabs[i][2].parent().removeChild(self.tabs[i][2]) 
    310332                else: 
    311333                    self.toolbox.widget(i).hide() 
    312334                    self.toolbox.removeItem(i) 
    313335                self.tabs.remove(self.tabs[i]) 
    314             else: 
     336            elif hasattr(self.tabs[i][2], "adjustSize"): 
    315337                self.tabs[i][2].adjustSize() 
    316338 
     
    377399        exIndex = 0 
    378400        widgetTypeList = self.canvasDlg.settings["widgetListType"] 
    379         try: 
    380             iconSize = self.canvasDlg.iconSizeDict[self.canvasDlg.settings["iconSize"]] 
    381         except: 
    382             iconSize = 48 
     401        iconSize = self.canvasDlg.iconSizeDict[self.canvasDlg.settings["iconSize"]] 
     402 
    383403        for i in range(len(priorityList)): 
    384             button = WidgetButton(tab, widgetTypeList, iconSize) 
    385             self.widgetInfo[strCategory + " - " + nameList[i]] = {"fileName": fileNameList[i], "iconName": iconNameList[i], "author" : authorList[i], "description":descriptionList[i], "priority":priorityList, "inputs": inputList[i], "outputs" : outputList[i], "button": button, "directory": directory} 
    386             button.setData(nameList[i], strCategory + " - " + nameList[i], self, self.canvasDlg) 
    387  
    388             if exIndex != priorityList[i] / 1000: 
    389                 for k in range(priorityList[i]/1000 - exIndex): 
    390                     tab.layout().addSpacing(10) 
    391                 exIndex = priorityList[i] / 1000 
    392  
    393             tab.layout().addWidget(button) 
     404            if isinstance(self, WidgetTree): 
     405                button = WidgetTreeItem(tab) 
     406                self.widgetInfo[strCategory + " - " + nameList[i]] = {"fileName": fileNameList[i], "iconName": iconNameList[i], "author" : authorList[i], "description":descriptionList[i], "priority":priorityList, "inputs": inputList[i], "outputs" : outputList[i], "button": button, "directory": directory} 
     407                button.setButtonData(nameList[i], strCategory + " - " + nameList[i], self, self.canvasDlg) 
     408                #tab.insertChild(tab.childCount(), button) 
     409            else: 
     410                button = WidgetButton(tab, widgetTypeList, iconSize) 
     411                self.widgetInfo[strCategory + " - " + nameList[i]] = {"fileName": fileNameList[i], "iconName": iconNameList[i], "author" : authorList[i], "description":descriptionList[i], "priority":priorityList, "inputs": inputList[i], "outputs" : outputList[i], "button": button, "directory": directory} 
     412                button.setButtonData(nameList[i], strCategory + " - " + nameList[i], self, self.canvasDlg) 
     413                if exIndex != priorityList[i] / 1000: 
     414                    for k in range(priorityList[i]/1000 - exIndex): 
     415                        tab.layout().addSpacing(10) 
     416                    exIndex = priorityList[i] / 1000 
     417                tab.layout().addWidget(button) 
     418                         
    394419            tab.widgets.append(button) 
    395420            self.allWidgets.append(button) 
     421             
    396422 
    397423 
     
    429455 
    430456 
    431 class MyQToolBox(QToolBox): 
    432     def __init__(self, size, parent): 
    433         QToolBox.__init__(self, parent) 
    434         self.desiredSize = size 
    435  
    436     def sizeHint(self): 
    437         return QSize(self.desiredSize, 100) 
     457 
     458class WidgetTree(WidgetListBase, QDockWidget): 
     459    def __init__(self, canvasDlg, widgetInfo, *args): 
     460        WidgetListBase.__init__(self, canvasDlg, widgetInfo) 
     461        QDockWidget.__init__(self, "Widgets") 
     462        self.treeWidget = MyTreeWidget(canvasDlg, self) 
     463        self.treeWidget.setFocusPolicy(Qt.ClickFocus)    # this is needed otherwise the document window will sometimes strangely lose focus and the output window will be focused 
     464        self.setWidget(self.treeWidget) 
     465        iconSize = self.canvasDlg.iconSizeDict[self.canvasDlg.settings["iconSize"]] 
     466        self.treeWidget.setIconSize(QSize(iconSize,iconSize)) 
     467                 
     468 
     469    def insertWidgetTab(self, name, show = 1): 
     470        item = QTreeWidgetItem(self.treeWidget) 
     471        item.setText(0, name) 
     472        item.setBackground(0, QBrush(QColor(200,200,200))) 
     473        item.widgets = [] 
     474        self.tabDict[name] = item 
     475          
     476        if show: 
     477            self.treeWidget.insertTopLevelItem(self.treeWidget.topLevelItemCount(), item) 
     478        self.tabs.append((name, 2*int(show), item)) 
     479 
     480        return item 
     481 
    438482 
    439483 
     
    472516 
    473517        return tab 
     518 
     519 
     520class MyQToolBox(QToolBox): 
     521    def __init__(self, size, parent): 
     522        QToolBox.__init__(self, parent) 
     523        self.desiredSize = size 
     524 
     525    def sizeHint(self): 
     526        return QSize(self.desiredSize, 100) 
     527 
     528 
     529class MyTreeWidget(QTreeWidget): 
     530    def __init__(self, canvasDlg, parent = None): 
     531        QTreeWidget.__init__(self, parent) 
     532        self.canvasDlg = canvasDlg 
     533        self.setMouseTracking(1) 
     534        self.setHeaderHidden(1) 
     535 
     536         
     537    def mouseMoveEvent(self, e): 
     538        QTreeWidget.mouseMoveEvent(self, e) 
     539        ### Semaphore "busy" is needed for some widgets whose loading takes more time, e.g. Select Data 
     540        ### Since the active window cannot change during dragging, we wouldn't have to remember the window; but let's leave the code in, it can't hurt 
     541        if hasattr(self, "busy"): 
     542            return 
     543        win = self.canvasDlg.workspace.activeSubWindow() 
     544        if not isinstance(win, orngDoc.SchemaDoc): 
     545            return 
     546 
     547        self.busy = 1 
     548 
     549        vrect = QRectF(win.visibleRegion().boundingRect()) 
     550        inside = win.canvasView.rect().contains(win.canvasView.mapFromGlobal(self.mapToGlobal(e.pos()))) 
     551        p = QPointF(win.canvasView.mapFromGlobal(self.mapToGlobal(e.pos()))) + QPointF(win.canvasView.mapToScene(QPoint(0,0))) 
     552 
     553        dinwin, widget = getattr(self, "widgetDragging", (None, None)) 
     554        if dinwin and (dinwin != win or not inside): 
     555             dinwin.removeWidget(widget) 
     556             delattr(self, "widgetDragging") 
     557             dinwin.canvasView.scene().update() 
     558 
     559        if inside: 
     560            if not widget and self.selectedItems() != [] and isinstance(self.selectedItems()[0], WidgetTreeItem): 
     561                widget = win.addWidget(self.selectedItems()[0], p.x(), p.y()) 
     562                self.widgetDragging = win, widget 
     563 
     564            # in case we got an exception when creating a widget instance 
     565            if widget == None: 
     566                delattr(self, "busy") 
     567                return 
     568 
     569            widget.setCoords(p.x() - widget.rect().width()/2, p.y() - widget.rect().height()/2) 
     570            win.canvasView.scene().update() 
     571 
     572            import orngCanvasItems 
     573            items = win.canvas.collidingItems(widget) 
     574            widget.invalidPosition = widget.selected = (win.canvasView.findItemTypeCount(items, orngCanvasItems.CanvasWidget) > 0) 
     575 
     576        delattr(self, "busy") 
     577         
     578    def mouseReleaseEvent(self, e): 
     579        QTreeWidget.mouseReleaseEvent(self, e) 
     580        dinwin, widget = getattr(self, "widgetDragging", (None, None)) 
     581        self.shiftPressed = e.modifiers() & Qt.ShiftModifier 
     582        if widget: 
     583            if widget.invalidPosition: 
     584                dinwin.removeWidget(widget) 
     585                dinwin.canvasView.scene().update() 
     586            elif self.shiftPressed and len(dinwin.widgets) > 1: 
     587                dinwin.addLine(dinwin.widgets[-2], dinwin.widgets[-1]) 
     588            delattr(self, "widgetDragging") 
     589        else: 
     590            win = self.canvasDlg.workspace.activeSubWindow() 
     591            if (win and isinstance(win, orngDoc.SchemaDoc)): 
     592                if self.selectedItems() and isinstance(self.selectedItems()[0], WidgetTreeItem): 
     593                    win.addWidget(self.selectedItems()[0]) 
     594#                    if (rightClick or self.shiftPressed) and len(win.widgets) > 1: 
     595#                        win.addLine(win.widgets[-2], win.widgets[-1]) 
     596            elif (isinstance(win, orngOutput.OutputWindow)): 
     597                QMessageBox.information(self,'Orange Canvas','Unable to add widget instance to Output window. Please select a document window first.',QMessageBox.Ok) 
     598            else: 
     599                QMessageBox.information(self,'Orange Canvas','Unable to add widget instance. Please open a document window first.',QMessageBox.Ok) 
     600             
Note: See TracChangeset for help on using the changeset viewer.