Changeset 6966:29fc9a0203b7 in orange


Ignore:
Timestamp:
09/03/10 10:42:18 (4 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
34848c95db8d6febec3649f5338ec426a6041008
Message:
  • added DropShadows effect to canvas items for Qt >= 4.6 (Option Enable drop shadows in the preferences (Widget Options))
  • cleaned up some redundant scene().update() calls
  • removed margins from TreeView, ToolBox widget panels on Mac OSX (better native look)
  • better mouse hit test for canvas lines
  • fixed dragging temp lines from widget input (used to drag as an output line)
Location:
orange/OrangeCanvas
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeCanvas/orngCanvas.pyw

    r6958 r6966  
    189189                import webbrowser 
    190190                webbrowser.open("http://sourceforge.net/projects/numpy/") 
    191  
    192191 
    193192    def createWidgetsToolbar(self): 
     
    304303        # widget popup menu 
    305304        self.widgetPopup = QMenu("Widget", self) 
    306         self.widgetPopup.addAction("Open", self.schema.canvasView.openActiveWidget) 
     305        self.openActiveWidgetAction = self.widgetPopup.addAction("Open", self.schema.canvasView.openActiveWidget) 
    307306        self.widgetPopup.addSeparator() 
    308         rename = self.widgetPopup.addAction("&Rename", self.schema.canvasView.renameActiveWidget, Qt.Key_F2) 
    309         delete = self.widgetPopup.addAction("Remove", self.schema.canvasView.removeActiveWidget, Qt.Key_Delete) 
     307        self.renameActiveWidgetAction = rename = self.widgetPopup.addAction("&Rename", self.schema.canvasView.renameActiveWidget, Qt.Key_F2) 
     308        self.removeActiveWidgetAction = delete = self.widgetPopup.addAction("Remove", self.schema.canvasView.removeActiveWidget, Qt.Key_Delete) 
    310309        delete.setShortcuts([Qt.Key_Delete, Qt.CTRL + Qt.Key_Backspace, Qt.CTRL + Qt.Key_Delete]) 
    311310        self.widgetPopup.addSeparator() 
    312         self.widgetPopup.addAction("Help", self.schema.canvasView.helpOnActiveWidget, Qt.Key_F1) 
     311        self.helpActiveWidgetAction = self.widgetPopup.addAction("Help", self.schema.canvasView.helpOnActiveWidget, Qt.Key_F1) 
    313312        self.widgetPopup.setEnabled(0) 
    314313         
     
    669668#                       "widgetSelectedColor": (0, 255, 0), "widgetActiveColor": (0, 0, 255), "lineColor": (0, 255, 0), 
    670669                       "reportsDir": self.defaultReportsDir, "saveSchemaDir": self.canvasSettingsDir, "saveApplicationDir": self.canvasSettingsDir, 
    671                        "showSignalNames": 1, "useContexts": 1, 
     670                       "showSignalNames": 1, "useContexts": 1, "enableCanvasDropShadows": 0, 
    672671                       "canvasWidth": 700, "canvasHeight": 600, "useDefaultPalette": 0, 
    673672                       "focusOnCatchException": 1, "focusOnCatchOutput": 0, "printOutputInStatusBar": 1, "printExceptionInStatusBar": 1, 
  • orange/OrangeCanvas/orngCanvasItems.py

    r6888 r6966  
    1818        self.widget = None 
    1919 
    20         self.setPen(QPen(QColor(180, 180, 180), 3, Qt.SolidLine))         
     20        self.setPen(QPen(QColor(180, 180, 180), 3, Qt.SolidLine)) 
     21         
     22        if qVersion() >= "4.6" and canvasDlg.settings["enableCanvasDropShadows"]: 
     23            effect = QGraphicsDropShadowEffect(self.scene()) 
     24            effect.setOffset(QPointF(0.0, 0.0)) 
     25            effect.setBlurRadius(7) 
     26            self.setGraphicsEffect(effect)         
    2127         
    2228    def setStartWidget(self, widget): 
     
    6672         
    6773        path = QPainterPath(pos) 
    68         path.cubicTo(pos.x()+60, pos.y(), newPos.x()-60, newPos.y(), newPos.x(),newPos.y()) 
     74        if self.startWidget != None: 
     75            path.cubicTo(pos.x()+60, pos.y(), newPos.x()-60, newPos.y(), newPos.x(),newPos.y()) 
     76        else: 
     77            path.cubicTo(pos.x()-60, pos.y(), newPos.x()+60, newPos.y(), newPos.x(),newPos.y()) 
    6978        self.setPath(path) 
    7079#        self.setLine(pos.x(), pos.y(), newPos.x(), newPos.y()) 
     
    7281    def remove(self): 
    7382        self.hide() 
    74  
    75     # draw the line 
    76 #    def paint(self, painter, option, widget): 
    77 #        print "P" 
    78 #        start = self.line().p1() 
    79 #        end = self.line().p2() 
    80  
    81 #        path = QPainterPath(p1) 
    82 #        path.cubicTo(p1.x()+60, p1.y(), p2.x()-60, p2.y(), p2.x(),p2.y()) 
    83  
    84 #        painter.setPen(QPen(QColor(200, 200, 200), 4, Qt.SolidLine, Qt.RoundCap)) 
    85 #        painter.drawLine(start, end) 
    86 #        painter.drawPath(path) 
    87 #        painter.setPen(QPen(QColor(160, 160, 160), 2, Qt.SolidLine, Qt.RoundCap)) 
    88 #        painter.drawLine(start, end) 
    89 #        painter.drawPath(path) 
    90  
    91     # we don't print temp lines 
    92     def printShape(self, painter): 
    93         pass 
    94  
    95  
    96     # redraw the line 
    97 ##    def repaintLine(self, canvasView): 
    98 ##        p1 = self.startPoint() 
    99 ##        p2 = self.endPoint() 
    100 ##        #canvasView.repaint(QRect(min(p1.x(), p2.x())-5, min(p1.y(), p2.y())-5, abs(p1.x()-p2.x())+10,abs(p1.y()-p2.y())+10)) 
    101 ##        #canvasView.repaint(QRect(min(p1.x(), p2.x()), min(p1.y(), p2.y()), abs(p1.x()-p2.x()),abs(p1.y()-p2.y()))) 
    10283 
    10384# ####################################### 
    10485# # CANVAS LINE 
    10586# ####################################### 
     87         
    10688class CanvasLine(QGraphicsPathItem): 
    107     def __init__(self, signalManager, canvasDlg, view, outWidget, inWidget, canvas, *args): 
    108         QGraphicsLineItem.__init__(self, None, canvas) 
     89    def __init__(self, signalManager, canvasDlg, view, outWidget, inWidget, scene, *args): 
     90        self.outWidget = outWidget 
     91        self.inWidget = inWidget 
     92         
     93        QGraphicsPathItem.__init__(self, None, None) 
    10994        self.signalManager = signalManager 
    11095        self.canvasDlg = canvasDlg 
    111         self.outWidget = outWidget 
    112         self.inWidget = inWidget 
    11396        self.view = view 
    11497        self.setZValue(-10) 
     98         
    11599        self.caption = "" 
     100        self.captionItem = QGraphicsTextItem(self) 
     101        self.captionItem.setDefaultTextColor(QColor(80, 80, 192)) 
     102        self.captionItem.setHtml("<center>%s</center>" % self.caption) 
     103        self.captionItem.setAcceptHoverEvents(False) 
     104        self.captionItem.setVisible(bool(self.canvasDlg.settings["showSignalNames"])) 
     105        self.captionItem.setAcceptedMouseButtons(Qt.NoButton) 
     106         
    116107        self.updateTooltip() 
    117108         
     
    120111        self.setAcceptHoverEvents(True) 
    121112        self.hoverState = False 
    122  
    123     def remove(self): 
     113        if qVersion() >= "4.6" and canvasDlg.settings["enableCanvasDropShadows"]: 
     114            effect = QGraphicsDropShadowEffect(self.scene()) 
     115            effect.setOffset(QPointF(0.0, 0.0)) 
     116            effect.setBlurRadius(7) 
     117            self.setGraphicsEffect(effect) 
     118        if scene is not None: 
     119            scene.addItem(self) 
     120             
     121 
     122    def remove(self):         
    124123        self.hide() 
    125124        self.setToolTip("") 
    126         #self.view.repaint(QRect(min(self.startPoint().x(), self.endPoint().x())-55, min(self.startPoint().y(), self.endPoint().y())-55, abs(self.startPoint().x()-self.endPoint().x())+100,abs(self.startPoint().y()-self.endPoint().y())+100)) 
    127  
     125         
    128126    def getEnabled(self): 
    129127        signals = self.signalManager.findSignals(self.outWidget.instance, self.inWidget.instance) 
     
    137135                signals.append((outName, inName)) 
    138136        return signals 
    139  
    140     def paint(self, painter, option, widget = None): 
     137     
     138    def updatePainterPath(self): 
    141139        p1 = self.outWidget.getRightEdgePoint() 
    142140        p2 = self.inWidget.getLeftEdgePoint() 
    143 #        self.setLine(p1.x(), p1.y(), p2.x(), p2.y()) 
    144          
    145141        path = QPainterPath(p1) 
    146         path.cubicTo(p1.x()+60, p1.y(), p2.x()-60, p2.y(), p2.x(),p2.y()) 
     142        path.cubicTo(p1.x() + 60, p1.y(), p2.x() - 60, p2.y(), p2.x(), p2.y()) 
    147143        self.setPath(path) 
     144        metrics = QFontMetrics(self.captionItem.font()) 
     145        oddLineOffset = -metrics.lineSpacing() / 2 * (len(self.caption.strip().splitlines()) % 2) 
     146        mid = self.path().pointAtPercent(0.5) 
     147        rect = self.captionItem.boundingRect() 
     148        self.captionItem.setPos(mid + QPointF(-rect.width() / 2.0, -rect.height() / 2.0 + oddLineOffset)) 
     149        self.update() 
     150         
     151    def shape(self): 
     152        stroke = QPainterPathStroker() 
     153        stroke.setWidth(6) 
     154        return stroke.createStroke(self.path()) 
     155     
     156    def boundingRect(self): 
     157        rect = QGraphicsPathItem.boundingRect(self) 
     158        textRect = self.captionItem.boundingRect() ## Should work without this but for some reason if using graphics effects the text gets clipped 
     159        textRect.moveTo(self.captionItem.pos()) 
     160        return rect.united(textRect) 
     161 
     162    def paint(self, painter, option, widget = None): 
    148163        painter.setPen(QPen(QColor(200, 200, 200), 6 if self.hoverState == True else 4 , self.getEnabled() and Qt.SolidLine or Qt.DashLine, Qt.RoundCap)) 
    149 #        painter.drawLine(p1, p2) 
    150         painter.drawPath(path) 
     164        painter.drawPath(self.path()) 
    151165        painter.setPen(QPen(QColor(160, 160, 160), 2 , self.getEnabled() and Qt.SolidLine or Qt.DashLine, Qt.RoundCap)) 
    152 #        painter.drawLine(p1, p2) 
    153         painter.drawPath(path) 
    154  
    155         if self.canvasDlg.settings["showSignalNames"]: 
    156             painter.setPen(QColor(80, 80, 192)) 
    157             mid = (p1+p2-QPointF(200, 30))/2  
    158             painter.drawText(mid.x(), mid.y(), 200, 50, Qt.AlignTop | Qt.AlignHCenter, self.caption) 
     166        painter.drawPath(self.path()) 
    159167 
    160168    def updateTooltip(self): 
     
    168176        # print the text with the signals 
    169177        self.caption = "\n".join([outSignal for (outSignal, inSignal) in self.getSignals()]) 
    170 #        l = self.line() 
    171 #        self.update(min(l.x1(), l.x2())-40, min(l.y1(),l.y2())-40, abs(l.x1()-l.x2())+80, abs(l.y1()-l.y2())+80) 
     178        self.captionItem.setHtml("<center>%s</center>" % self.caption.replace("\n", "<br/>")) 
     179        self.updatePainterPath() 
    172180 
    173181    def hoverEnterEvent(self, event): 
     
    178186        self.hoverState = False 
    179187        self.update() 
     188         
    180189 
    181190# ####################################### 
     
    183192# ####################################### 
    184193class CanvasWidget(QGraphicsRectItem): 
    185     def __init__(self, signalManager, canvas, view, widgetInfo, defaultPic, canvasDlg, widgetSettings = {}): 
     194    def __init__(self, signalManager, scene, view, widgetInfo, defaultPic, canvasDlg, widgetSettings = {}): 
    186195        # import widget class and create a class instance 
    187196        m = __import__(widgetInfo.fileName) 
    188         self.instance = m.__dict__[widgetInfo.fileName].__new__(m.__dict__[widgetInfo.fileName], _owInfo = canvasDlg.settings["owInfo"], _owWarning = canvasDlg.settings["owWarning"], _owError = canvasDlg.settings["owError"], _owShowStatus = canvasDlg.settings["owShow"], _useContexts = canvasDlg.settings["useContexts"], _category = widgetInfo.category, _settingsFromSchema = widgetSettings) 
     197        self.instance = m.__dict__[widgetInfo.fileName].__new__(m.__dict__[widgetInfo.fileName], _owInfo=canvasDlg.settings["owInfo"], 
     198                                                                _owWarning = canvasDlg.settings["owWarning"], _owError=canvasDlg.settings["owError"], 
     199                                                                _owShowStatus = canvasDlg.settings["owShow"], _useContexts = canvasDlg.settings["useContexts"], 
     200                                                                _category = widgetInfo.category, _settingsFromSchema = widgetSettings) 
    189201        self.instance.__init__(signalManager=signalManager) 
    190202        self.instance.__dict__["widgetInfo"] = widgetInfo 
     
    199211        self.outLines = []              # list of connected lines on output 
    200212        self.icon = canvasDlg.getWidgetIcon(widgetInfo) 
    201                  
     213         
    202214        self.instance.setProgressBarHandler(view.progressBarHandler)   # set progress bar event handler 
    203215        self.instance.setProcessingHandler(view.processingHandler) 
     
    207219        #self.instance.updateStatusBarState() 
    208220 
    209         QGraphicsRectItem.__init__(self, None, canvas) 
     221        QGraphicsRectItem.__init__(self, None, None) 
    210222        self.signalManager = signalManager 
    211223        self.widgetInfo = widgetInfo 
    212         self.canvas = canvas 
    213224        self.view = view 
    214225        self.canvasDlg = canvasDlg 
     
    227238        self.oldPos = self.pos() 
    228239         
    229         self.infoIcon = QGraphicsPixmapItem(self.canvasDlg.widgetIcons["Info"], None, canvas) 
    230         self.warningIcon = QGraphicsPixmapItem(self.canvasDlg.widgetIcons["Warning"], None, canvas) 
    231         self.errorIcon = QGraphicsPixmapItem(self.canvasDlg.widgetIcons["Error"], None, canvas) 
     240        self.infoIcon = QGraphicsPixmapItem(self.canvasDlg.widgetIcons["Info"], self) 
     241        self.warningIcon = QGraphicsPixmapItem(self.canvasDlg.widgetIcons["Warning"], self) 
     242        self.errorIcon = QGraphicsPixmapItem(self.canvasDlg.widgetIcons["Error"], self) 
    232243        self.infoIcon.hide() 
    233244        self.warningIcon.hide() 
    234245        self.errorIcon.hide() 
    235  
     246         
     247        self.captionItem = QGraphicsTextItem(self) 
     248        self.captionItem.setHtml("<center>%s</center>" % self.caption) 
     249        self.captionItem.document().setTextWidth(200) 
     250         
     251        self.captionItem.setPos(-self.captionItem.boundingRect().width()/2.0 + self.widgetSize.width() / 2.0, self.widgetSize.height() + 2) 
     252        self.captionItem.setAcceptHoverEvents(False) 
     253         
    236254        # do we want to restore last position and size of the widget 
    237255        if self.canvasDlg.settings["saveWidgetsPosition"]: 
     
    240258        self.setAcceptHoverEvents(True) 
    241259        self.hoverState = False 
    242  
     260        self.setFlags(QGraphicsItem.ItemIsSelectable)# | QGraphicsItem.ItemIsMovable) 
     261         
     262        if qVersion() >= "4.6" and self.canvasDlg.settings["enableCanvasDropShadows"]: 
     263            effect = QGraphicsDropShadowEffect() 
     264            effect.setOffset(QPointF(1.1, 3.1)) 
     265            effect.setBlurRadius(7) 
     266            self.setGraphicsEffect(effect) 
     267             
     268        if scene is not None: 
     269            scene.addItem(self) 
     270             
     271        self.update() 
    243272 
    244273    def resetWidgetSize(self): 
     
    246275        self.setRect(0,0, size, size) 
    247276        self.widgetSize = QSizeF(size, size) 
     277        self.update() 
    248278 
    249279    # get the list of connected signal names 
     
    296326    def updateText(self, text): 
    297327        self.caption = str(text) 
     328        self.captionItem.setHtml("<center>%s</center>" % self.caption) 
    298329        self.updateTooltip() 
     330        self.update() 
    299331 
    300332    def updateWidgetState(self): 
     
    305337        self.errorIcon.hide() 
    306338 
    307         yPos = self.y() - 21 - self.progressBarShown * 20 
     339        yPos = - 21 - self.progressBarShown * 20 
    308340        iconNum = sum([widgetState.get("Info", {}).values() != [],  widgetState.get("Warning", {}).values() != [], widgetState.get("Error", {}).values() != []]) 
    309341 
    310342        if self.canvasDlg.settings["ocShow"]:        # if show icons is enabled in canvas options dialog 
    311             startX = self.x() + (self.rect().width()/2) - ((iconNum*(self.canvasDlg.widgetIcons["Info"].width()+2))/2) 
     343            startX = (self.rect().width()/2) - ((iconNum*(self.canvasDlg.widgetIcons["Info"].width()+2))/2) 
    312344            off  = 0 
    313345            if len(widgetState.get("Info", {}).values()) > 0 and self.canvasDlg.settings["ocInfo"]: 
     
    325357        return icon.pixmap().width() + 3 
    326358 
    327     def isSelected(self): 
    328         return self.selected 
    329  
    330     def setSelected(self, selected): 
    331         self.selected = selected 
    332         #self.repaintWidget() 
    333  
    334359    # set coordinates of the widget 
    335360    def setCoords(self, x, y): 
     
    338363            y = round(y/10)*10 
    339364        self.setPos(x, y) 
     365        for line in self.inLines + self.outLines: 
     366            line.updatePainterPath() 
    340367        self.updateWidgetState() 
    341368 
    342369    # we have to increase the default bounding rect so that we also repaint the name of the widget and input/output boxes 
    343370    def boundingRect(self): 
    344         # get the width of the widget's caption 
    345         pixmap = QPixmap(200,40) 
    346         painter = QPainter() 
    347         painter.begin(pixmap) 
    348         width = max(0, painter.boundingRect(QRectF(0,0,200,40), Qt.AlignLeft, self.caption).width() - 60) / 2 
    349         painter.end() 
    350          
    351         #rect = QRectF(-10-width, -4, +10+width, +25) 
    352         rect = QRectF(QPointF(0, 0), self.widgetSize).adjusted(-10-width, -4, +10+width, +25) 
    353         if self.progressBarShown: 
    354             rect.setTop(rect.top()-20) 
    355         widgetState = self.instance.widgetState 
    356         if widgetState.get("Info", {}).values() + widgetState.get("Warning", {}).values() + widgetState.get("Error", {}).values() != []: 
    357             rect.setTop(rect.top()-21) 
    358         return rect 
     371        rect = QRectF(QPointF(0, 0), self.widgetSize).adjusted(-11, -6, 11, 6)#.adjusted(-100, -100, 100, 100) #(-10-width, -4, +10+width, +25) 
     372        rect.setTop(rect.top() - 20 - 21) ## Room for progress bar and warning, error, info icons 
     373        textRect = self.captionItem.boundingRect() ## Should work without this but for some reason if using graphics effects the text gets clipped 
     374        textRect.moveTo(self.captionItem.pos()) 
     375        return rect.united(textRect)  
    359376 
    360377    # is mouse position inside the left signal channel 
     
    425442    # draw the widget 
    426443    def paint(self, painter, option, widget = None): 
    427 #        if self.isProcessing: 
    428 #            color = self.canvasDlg.widgetActiveColor 
    429 #        elif self.selected: 
    430 #            if (self.view.findItemTypeCount(self.canvas.collidingItems(self), CanvasWidget) > 0):       # the position is invalid if it is already occupied by a widget  
    431 #                color = Qt.red 
    432 #            else:                    color = self.canvasDlg.widgetSelectedColor 
    433  
    434         if self.isProcessing or self.selected: 
     444        if self.isProcessing or self.isSelected(): 
    435445            painter.setPen(QPen(QBrush(QColor(125, 162, 206, 192)), 1, Qt.SolidLine, Qt.RoundCap)) 
    436446            painter.setBrush(QBrush(QColor(217, 232, 252, 192))) 
    437             painter.drawRoundedRect(-10, -6, self.widgetSize.width()+20, self.widgetSize.height()+10, 5, 5) 
     447            painter.drawRoundedRect(-10, -5, self.widgetSize.width()+20, self.widgetSize.height()+10, 5, 5) 
    438448 
    439449 
     
    442452        if self.widgetInfo.outputs != []: 
    443453            painter.drawPixmap(self.widgetSize.width()-2, (self.widgetSize.height()-self.edgeSize.height())/2, self.shownRightEdge) 
    444  
    445 #        painter.drawPixmap(0, 0, self.imageFrame.pixmap(self.widgetSize.width(), self.widgetSize.height())) 
    446         #painter.drawPixmap(0, 0, self.image) 
     454             
    447455        if self.hoverState: 
    448456            color = QColor(125, 162, 206) 
     
    452460             
    453461        painter.drawPixmap(0,0, self.icon.pixmap(self.widgetSize.width(), self.widgetSize.height())) 
    454  
    455         # draw the label 
    456         painter.setPen(QPen(QColor(0,0,0))) 
    457         midX, midY = self.widgetSize.width()/2., self.widgetSize.height() + 5 
    458         painter.drawText(midX-200/2, midY, 200, 20, Qt.AlignTop | Qt.AlignHCenter, self.caption) 
    459          
    460         #painter.drawRect(self.boundingRect()) 
    461462         
    462463        yPos = -22 
     
    484485            self.outLines.remove(line) 
    485486        else: 
    486             print "Orange Canvas: Erorr. Unable to remove line" 
     487            print "Orange Canvas: Error. Unable to remove line" 
    487488 
    488489        self.updateTooltip() 
     
    529530        if value < 0 or value > 100: 
    530531            self.updateWidgetState() 
    531         self.canvas.update() 
     532        self.update() 
    532533 
    533534    def setProcessing(self, value): 
    534535        self.isProcessing = value 
    535         self.canvas.update() 
    536         qApp.processEvents() 
    537 ##        self.repaintWidget() 
     536        self.update() 
    538537 
    539538    def hoverEnterEvent(self, event): 
    540539        self.hoverState = True 
    541540        self.update() 
     541        return QGraphicsRectItem.hoverEnterEvent(self, event) 
    542542         
    543543    def hoverLeaveEvent(self, event): 
    544544        self.hoverState = False 
    545545        self.update() 
     546        return QGraphicsRectItem.hoverLeaveEvent(self, event)         
    546547 
    547548class MyCanvasText(QGraphicsSimpleTextItem): 
  • orange/OrangeCanvas/orngDlgs.py

    r6946 r6966  
    441441        generalBox = OWGUI.widgetBox(GeneralTab, "General Options") 
    442442        self.snapToGridCB = OWGUI.checkBox(generalBox, self.settings, "snapToGrid", "Snap widgets to grid", debuggingEnabled = 0) 
     443        self.enableCanvasDropShadowsCB = OWGUI.checkBox(generalBox, self.settings, "enableCanvasDropShadows", "Enable drop shadows in canvas", debuggingEnabled = 0) 
    443444        self.writeLogFileCB  = OWGUI.checkBox(generalBox, self.settings, "writeLogFile", "Save content of the Output window to a log file", debuggingEnabled = 0) 
    444445        self.showSignalNamesCB = OWGUI.checkBox(generalBox, self.settings, "showSignalNames", "Show signal names between widgets", debuggingEnabled = 0) 
  • orange/OrangeCanvas/orngTabs.py

    r6827 r6966  
    140140        if inside: 
    141141            if not widget: 
    142                 widget = schema.addWidget(self.widgetInfo, p.x(), p.y()) 
     142                widget = schema.addWidget(self.widgetInfo, p.x() - 24, p.y() - 24) 
    143143                self.widgetDragging = schema, widget 
    144144 
     
    160160        self.layout().setMargin(self.layout().margin()-2) 
    161161 
    162          
    163162    def mouseReleaseEvent(self, e): 
    164163        self.layout().setMargin(self.layout().margin()+2) 
     
    170169            if widget.invalidPosition: 
    171170                dinwin.removeWidget(widget) 
    172                 dinwin.canvasView.scene().update() 
     171#                dinwin.canvasView.scene().update() 
    173172            elif self.shiftPressed and len(dinwin.widgets) > 1: 
    174173                dinwin.addLine(dinwin.widgets[-2], dinwin.widgets[-1]) 
     
    230229             dinwin.removeWidget(widget) 
    231230             delattr(self, "widgetDragging") 
    232              dinwin.canvasView.scene().update() 
     231#             dinwin.canvasView.scene().update() 
    233232 
    234233        if inside: 
    235234            if not widget and self.selectedItems() != [] and isinstance(self.selectedItems()[0], WidgetTreeItem): 
    236                 widget = schema.addWidget(self.selectedItems()[0].widgetInfo, p.x(), p.y()) 
     235                widget = schema.addWidget(self.selectedItems()[0].widgetInfo, p.x() - 24, p.y() - 24) 
    237236                self.widgetDragging = schema, widget 
    238237 
     
    243242 
    244243            widget.setCoords(p.x() - widget.rect().width()/2, p.y() - widget.rect().height()/2) 
    245             schema.canvasView.scene().update() 
     244#            schema.canvasView.scene().update() 
    246245 
    247246            import orngCanvasItems 
     
    266265            if widget.invalidPosition: 
    267266                dinwin.removeWidget(widget) 
    268                 dinwin.canvasView.scene().update() 
     267#                dinwin.canvasView.scene().update() 
    269268            elif self.shiftPressed and len(dinwin.widgets) > 1: 
    270269                dinwin.addLine(dinwin.widgets[-2], dinwin.widgets[-1]) 
     
    391390        self.containerWidget = QWidget() 
    392391        containerBoxLayout = QBoxLayout(QBoxLayout.TopToBottom, self.containerWidget) 
     392        if sys.platform == "darwin": 
     393            containerBoxLayout.setContentsMargins(0,0,0,0) 
    393394        self.widgetSuggestEdit = OWGUIEx.lineEditHint(self, None, None, useRE = 0, caseSensitive = 0, matchAnywhere = 1, autoSizeListWidget = 1, callback = self.widgetSuggestCallback) 
    394395        self.widgetSuggestEdit.setItems([QListWidgetItem(action.icon(), action.widgetInfo.name) for action in self.actions]) 
     
    477478        self.containerWidget = QWidget() 
    478479        containerBoxLayout = QBoxLayout(QBoxLayout.TopToBottom, self.containerWidget) 
     480        if sys.platform == "darwin": 
     481            containerBoxLayout.setContentsMargins(0, 0, 0, 0) 
    479482        self.widgetSuggestEdit = OWGUIEx.lineEditHint(self, None, None, useRE = 0, caseSensitive = 0, matchAnywhere = 1, autoSizeListWidget = 1, callback = self.widgetSuggestCallback) 
    480483        self.widgetSuggestEdit.setItems([QListWidgetItem(action.icon(), action.widgetInfo.name) for action in self.actions]) 
  • orange/OrangeCanvas/orngView.py

    r6634 r6966  
    3434        self.setAcceptDrops(1) 
    3535        self.viewport().setMouseTracking(True) 
     36        self.connect(self.scene(), SIGNAL("selectionChanged()"), self.onSelectionChanged) 
    3637 
    3738    # ########################################### 
     
    6364            ev.ignore() 
    6465 
     66    def onSelectionChanged(self): 
     67        selected = self.scene().selectedItems() 
     68        one_selected = len(selected) == 1 
     69        n_selected = len(selected) > 0 
     70        self.doc.canvasDlg.widgetPopup.setEnabled(n_selected) 
     71        self.doc.canvasDlg.openActiveWidgetAction.setEnabled(one_selected) 
     72        self.doc.canvasDlg.renameActiveWidgetAction.setEnabled(one_selected) 
     73        self.doc.canvasDlg.removeActiveWidgetAction.setEnabled(n_selected) 
     74        self.doc.canvasDlg.helpActiveWidgetAction.setEnabled(one_selected) 
     75         
    6576    # ########################################### 
    6677    # POPUP MENU - WIDGET actions 
     
    114125            self.doc.removeWidget(item) 
    115126 
    116         self.scene().update() 
     127#        self.scene().update() 
    117128        self.tempWidget = None 
    118         self.doc.canvasDlg.widgetPopup.setEnabled(len(self.getSelectedWidgets()) == 1) 
     129#        self.doc.canvasDlg.widgetPopup.setEnabled(len(self.getSelectedWidgets()) == 1) 
    119130 
    120131    # ########################################### 
     
    139150        self.deleteLine(self.selectedLine) 
    140151        self.selectedLine = None 
    141         self.scene().update() 
     152#        self.scene().update() 
    142153 
    143154    def deleteLine(self, line): 
     
    183194        # do we start drawing a connection line 
    184195        if ev.button() == Qt.LeftButton: 
    185             widgets = [item for item in self.doc.widgets if item.mouseInsideRightChannel(self.mouseDownPosition)] + [item for item in self.doc.widgets if item.mouseInsideLeftChannel(self.mouseDownPosition)]            
     196            widgets = [item for item in self.doc.widgets if item.mouseInsideRightChannel(self.mouseDownPosition) or item.mouseInsideLeftChannel(self.mouseDownPosition)]# + [item for item in self.doc.widgets if item.mouseInsideLeftChannel(self.mouseDownPosition)]            
    186197            if widgets: 
    187198                self.tempWidget = widgets[0] 
     
    198209                            widget.canConnect(self.tempWidget, widget) 
    199210                                                         
    200                 self.scene().update() 
    201                 self.doc.canvasDlg.widgetPopup.setEnabled(len(self.getSelectedWidgets()) == 1) 
    202                 return 
     211#                self.scene().update() 
     212#                self.doc.canvasDlg.widgetPopup.setEnabled(len(self.getSelectedWidgets()) == 1) 
     213                return QGraphicsView.mousePressEvent(self, ev) 
    203214             
    204         activeItem = self.scene().itemAt(self.mouseDownPosition) 
     215        items = self.scene().items(QRectF(self.mouseDownPosition, QSizeF(0 ,0)).adjusted(-2, -2, 2, 2))#, At(self.mouseDownPosition) 
     216        items = [item for item in items if type(item) in [orngCanvasItems.CanvasWidget, orngCanvasItems.CanvasLine]] 
     217        activeItem = items[0] if items else None 
    205218        if not activeItem: 
    206219            self.tempWidget = None 
     
    217230                self.tempWidget = activeItem 
    218231 
    219                 # did we click inside the boxes to draw connections 
    220232                if ev.button() == Qt.LeftButton: 
    221233                    self.bWidgetDragging = True 
    222                     if self.doc.ctrlPressed: 
     234                    if ev.modifiers() & Qt.ControlModifier: #self.doc.ctrlPressed: 
    223235                        activeItem.setSelected(not activeItem.isSelected()) 
    224236                    elif activeItem.isSelected() == 0: 
    225237                        self.unselectAllWidgets() 
    226                         activeItem.setSelected(1) 
     238                        activeItem.setSelected(True) 
    227239 
    228240                    for w in self.getSelectedWidgets(): 
     
    232244                # is we clicked the right mouse button we show the popup menu for widgets 
    233245                elif ev.button() == Qt.RightButton: 
    234                     self.unselectAllWidgets() 
    235                     activeItem.setSelected(1) 
     246                    if not ev.modifiers() & Qt.ControlModifier: 
     247                        self.unselectAllWidgets()  
     248                    activeItem.setSelected(True) 
    236249                    self.doc.canvasDlg.widgetPopup.popup(ev.globalPos()) 
     250                    return # Don't call QGraphicsView.mousePressEvent. It unselects the active item 
    237251                else: 
    238252                    self.unselectAllWidgets() 
     
    247261                self.unselectAllWidgets() 
    248262 
    249         self.doc.canvasDlg.widgetPopup.setEnabled(len(self.getSelectedWidgets()) == 1) 
    250         self.scene().update() 
    251263        return QGraphicsView.mousePressEvent(self, ev) 
    252264 
     
    272284                widget.setSelected(widget in widgets) 
    273285 
    274         self.scene().update() 
     286#        self.scene().update() 
    275287         
    276288        return QGraphicsView.mouseMoveEvent(self, ev) 
     
    354366                     
    355367 
    356         self.scene().update() 
     368#        self.scene().update() 
    357369        self.bWidgetDragging = False 
    358         self.doc.canvasDlg.widgetPopup.setEnabled(len(self.getSelectedWidgets()) == 1) 
     370#        self.doc.canvasDlg.widgetPopup.setEnabled(len(self.getSelectedWidgets()) == 1) 
    359371        return QGraphicsView.mouseReleaseEvent(self, ev) 
    360372 
     
    391403            if widget.instance == widgetInstance: 
    392404                widget.setProcessing(value) 
    393                 self.repaint() 
    394                 widget.update() 
     405#                self.repaint() 
     406#                widget.update() 
    395407                return 
    396408 
Note: See TracChangeset for help on using the changeset viewer.