Changeset 3833:e8f6d2e5db14 in orange


Ignore:
Timestamp:
05/06/08 15:01:28 (6 years ago)
Author:
gregor <gregor@…>
Branch:
default
Convert:
4d47dab089218e70ce8c273c356157084059963b
Message:
  • widget can be dragged onto canvas also when a label is pressed and dragged
  • no resizing of the tab when a button is pressed
File:
1 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeCanvas/orngTabs.py

    r3816 r3833  
    1515WB_TABBAR_TEXT = 2 
    1616 
     17# we have to use a custom class since QLabel by default ignores the mouse 
     18# events if it is showing text (it does not ignore events if it's showing an icon) 
     19class OrangeLabel(QLabel): 
     20    def mousePressEvent(self, e): 
     21        pos = self.mapToParent(e.pos()) 
     22        ev = QMouseEvent(e.type(), pos, e.button(), e.buttons(), e.modifiers()) 
     23        self.parent().mousePressEvent(ev) 
     24 
     25    def mouseMoveEvent(self, e): 
     26        pos = self.mapToParent(e.pos()) 
     27        ev = QMouseEvent(e.type(), pos, e.button(), e.buttons(), e.modifiers()) 
     28        self.parent().mouseMoveEvent(ev) 
     29 
     30    def mouseReleaseEvent(self, e): 
     31        pos = self.mapToParent(e.pos()) 
     32        ev = QMouseEvent(e.type(), pos, e.button(), e.buttons(), e.modifiers()) 
     33        self.parent().mouseReleaseEvent(ev) 
     34 
    1735class WidgetButton(QFrame): 
    1836    def __init__(self, parent, buttonType = 2, size=30): 
    19         QFrame.__init__(self, parent) 
     37        QFrame.__init__(self) 
    2038        self.shiftPressed = 0 
    2139        self.buttonType = buttonType 
     
    2341        self.setLayout(buttonType == WB_TOOLBOX and QHBoxLayout() or QVBoxLayout()) 
    2442        self.pixmapWidget = QLabel(self) 
    25          
    26         self.textWidget = QLabel(self) 
     43 
     44        self.textWidget = OrangeLabel(self) 
    2745        if buttonType == WB_TABBAR_NO_TEXT: 
    2846            self.textWidget.hide() 
    29              
     47 
    3048        self.layout().setMargin(3) 
    3149        if buttonType != WB_TOOLBOX: 
    3250            self.layout().setSpacing(0) 
    33          
    34          
     51 
     52    # we need to handle context menu event, otherwise we get a popup when pressing the right button on one of the icons 
     53    def contextMenuEvent(self, ev): 
     54        ev.accept() 
     55 
    3556    def setData(self, name, nameKey, tabs, canvasDlg): 
    3657        self.widgetTabs = tabs 
     
    3859        self.nameKey = nameKey 
    3960        self.canvasDlg = canvasDlg 
    40                          
     61 
    4162        self.pixmapWidget.setPixmap(QPixmap(self.getFullIconName())) 
    4263        self.pixmapWidget.setScaledContents(1) 
    4364        self.pixmapWidget.setFixedSize(QSize(self.iconSize, self.iconSize)) 
    44  
    4565 
    4666        #split long names into two lines 
     
    4969            numSpaces = count(buttonName, " ") 
    5070            if numSpaces == 1: buttonName = replace(buttonName, " ", "<br>") 
    51             elif numSpaces > 1:  
     71            elif numSpaces > 1: 
    5272                mid = len(buttonName)/2; i = 0 
    5373                found = 0 
     
    5878            else: 
    5979                buttonName += "<br>" 
    60          
     80 
    6181        self.layout().addWidget(self.pixmapWidget) 
    6282        self.layout().addWidget(self.textWidget) 
    63          
     83 
    6484        if self.buttonType != WB_TOOLBOX: 
    6585            self.textWidget.setText("<div align=\"center\">" + buttonName + "</div>") 
     
    6888        else: 
    6989            self.textWidget.setText(name) 
    70                       
     90 
    7191        # build the tooltip 
    7292        inputs = self.getInputs() 
     
    89109        self.setToolTip(tooltipText) 
    90110 
    91          
     111 
    92112    def getFileName(self): 
    93113        return str(self.widgetTabs.widgetInfo[self.nameKey]["fileName"]) 
     
    155175        return self.nameKey[:self.nameKey.index("-")].strip() 
    156176 
    157      
     177 
    158178    def mouseMoveEvent(self, e): 
    159179        ### Semaphore "busy" is needed for some widgets whose loading takes more time, e.g. Select Data 
     
    164184        if not isinstance(win, orngDoc.SchemaDoc): 
    165185            return 
    166          
     186 
    167187        self.busy = 1 
    168                  
     188 
    169189        vrect = QRectF(win.visibleRegion().boundingRect()) 
    170190        inside = win.canvasView.rect().contains(win.canvasView.mapFromGlobal(self.mapToGlobal(e.pos()))) 
    171191        p = QPointF(win.canvasView.mapFromGlobal(self.mapToGlobal(e.pos()))) + QPointF(win.canvasView.mapToScene(QPoint(0,0))) 
    172         
     192 
    173193        dinwin, widget = getattr(self, "widgetDragging", (None, None)) 
    174194        if dinwin and (dinwin != win or not inside): 
     
    176196             delattr(self, "widgetDragging") 
    177197             dinwin.canvasView.scene().update() 
    178         
     198 
    179199        if inside: 
    180200            if not widget: 
    181201                widget = win.addWidget(self, p.x(), p.y()) 
    182202                self.widgetDragging = win, widget 
    183              
     203 
    184204            # in case we got an exception when creating a widget instance 
    185205            if widget == None: 
    186206                delattr(self, "busy") 
    187207                return 
    188              
     208 
    189209            widget.setCoords(p.x() - widget.rect().width()/2, p.y() - widget.rect().height()/2) 
    190210            win.canvasView.scene().update() 
    191              
     211 
    192212            import orngCanvasItems 
    193213            items = win.canvas.collidingItems(widget) 
    194214            widget.invalidPosition = widget.selected = (win.canvasView.findItemTypeCount(items, orngCanvasItems.CanvasWidget) > 0) 
    195              
     215 
    196216        delattr(self, "busy") 
    197217 
    198218    def mousePressEvent(self, e): 
    199219        self.setFrameShape(QFrame.StyledPanel) 
     220        self.layout().setMargin(self.layout().margin()-2) 
    200221 
    201222 
    202223    def mouseReleaseEvent(self, e): 
     224        self.layout().setMargin(self.layout().margin()+2) 
    203225        self.setFrameShape(QFrame.NoFrame) 
     226 
    204227        dinwin, widget = getattr(self, "widgetDragging", (None, None)) 
    205228        self.shiftPressed = e.modifiers() & Qt.ShiftModifier 
     
    211234                dinwin.addLine(dinwin.widgets[-2], dinwin.widgets[-1]) 
    212235            delattr(self, "widgetDragging") 
    213         else:  # not dragging, just a click 
    214             if e.button() == Qt.RightButton: 
    215                 self.clicked(True) 
    216         QWidget.mouseReleaseEvent(self, e) 
    217          
     236 
     237 
    218238        # we say that we clicked the button only if we released the mouse inside the button 
    219239        if e.pos().x() >= 0 and e.pos().x() < self.width() and e.pos().y() > 0 and e.pos().y() < self.height(): 
    220             self.clicked() 
    221          
     240            self.clicked(e.button() == Qt.RightButton) 
     241 
    222242    def clicked(self, rightClick = False): 
    223243        win = self.canvasDlg.workspace.activeSubWindow() 
     
    254274        self.tabDict = {} 
    255275        self.tabs = [] 
    256          
     276 
    257277    # read the xml registry and show all installed widgets 
    258278    def readInstalledWidgets(self, registryFileName, widgetTabList, widgetDir, picsDir, defaultPic): 
     
    265285        if (categories == None): 
    266286            return 
    267          
     287 
    268288        categoryList = categories.getElementsByTagName("category") 
    269289        categoryNames = [str(cat.getAttribute("name")) for cat in categoryList] 
     
    273293            if tab[0] in categoryNames:        # add a category only if there are some widgets in the folder 
    274294                self.insertWidgetTab(tab[0], tab[1]) 
    275          
     295 
    276296        # now insert widgets into tabs + create additional tabs 
    277297        for category in categoryList: 
     
    288308            else: 
    289309                self.tabs[i][2].adjustSize() 
    290          
     310 
    291311 
    292312    # add all widgets inside the category to the tab 
    293313    def insertWidgetsToTab(self, category): 
    294314        strCategory = str(category.getAttribute("name")) 
    295          
    296         if self.tabDict.has_key(strCategory):  
     315 
     316        if self.tabDict.has_key(strCategory): 
    297317            tab = self.tabDict[strCategory] 
    298         else:     
     318        else: 
    299319            tab = self.insertWidgetTab(strCategory) 
    300320 
     
    356376            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} 
    357377            button.setData(nameList[i], strCategory + " - " + nameList[i], self, self.canvasDlg) 
    358              
     378 
    359379            if exIndex != priorityList[i] / 1000: 
    360380                for k in range(priorityList[i]/1000 - exIndex): 
    361381                    tab.layout().addSpacing(10) 
    362382                exIndex = priorityList[i] / 1000 
    363              
     383 
    364384            tab.layout().addWidget(button) 
    365385            tab.widgets.append(button) 
    366386            self.allWidgets.append(button) 
    367     
    368        
     387 
     388 
    369389 
    370390class WidgetTabs(WidgetListBase, QTabWidget): 
     
    374394        self.setMinimumWidth(10)    # this way the < and > button will show if tab dialog is too small 
    375395 
     396 
    376397    def insertWidgetTab(self, name, show = 1): 
    377398        tab = WidgetScrollArea(self) 
    378399        tab.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn) 
    379400        tab.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) 
    380          
     401 
    381402        widgetSpace = QWidget(self) 
    382403        widgetSpace.setLayout(QHBoxLayout()) 
     
    386407        widgetSpace.widgets = [] 
    387408        tab.setWidget(widgetSpace) 
    388          
     409 
    389410        self.tabDict[name] = widgetSpace 
    390          
     411 
    391412        if show: 
    392413            self.addTab(tab, name) 
     
    395416            tab.hide() 
    396417            self.tabs.append((name, 0, widgetSpace)) 
    397                  
     418 
    398419        return widgetSpace 
    399      
    400                 
    401                 
     420 
     421 
     422 
    402423class MyQToolBox(QToolBox): 
    403424    def __init__(self, size, parent): 
    404425        QToolBox.__init__(self, parent) 
    405426        self.desiredSize = size 
    406          
     427 
    407428    def sizeHint(self): 
    408429        return QSize(self.desiredSize, 100) 
     
    414435        QDockWidget.__init__(self, "Widgets") 
    415436        self.toolbox = MyQToolBox(canvasDlg.settings["toolboxWidth"], self) 
    416         self.toolbox.setFocusPolicy(Qt.ClickFocus)    # this is needed otherwise the document window will sometimes strangely lose focus and the output window will be focused  
     437        self.toolbox.setFocusPolicy(Qt.ClickFocus)    # this is needed otherwise the document window will sometimes strangely lose focus and the output window will be focused 
    417438        self.toolbox.layout().setSpacing(0) 
    418439        self.setWidget(self.toolbox) 
    419      
     440 
    420441 
    421442    def insertWidgetTab(self, name, show = 1): 
     
    433454        tab.layout().setContentsMargins(6, 6, 6, 6) 
    434455        self.tabDict[name] = tab 
    435          
    436          
     456 
     457 
    437458        if show: 
    438459            self.toolbox.addItem(sa, name) 
     
    441462            sa.hide() 
    442463            self.tabs.append((name, 0, tab)) 
    443          
     464 
    444465        return tab 
Note: See TracChangeset for help on using the changeset viewer.