From 4497ddc28c6b2238ceff73dbb5e83b6d9061f94c Mon Sep 17 00:00:00 2001 From: Remi Rampin Date: Wed, 20 Mar 2013 15:09:42 -0400 Subject: [PATCH 01/12] Hack to replace cells with images during drag Somehow, this doesn't fix the issue. --- dat/gui/cellcontainer.py | 52 +++++++++++++++++++++++++++++++++++----- 1 file changed, 46 insertions(+), 6 deletions(-) diff --git a/dat/gui/cellcontainer.py b/dat/gui/cellcontainer.py index b23efa8..73d687d 100644 --- a/dat/gui/cellcontainer.py +++ b/dat/gui/cellcontainer.py @@ -49,6 +49,8 @@ def __init__(self, cellInfo=None, widget=None, error=None, parent=None): self._parameter_hovered = None self._insert_pos = None + self._saved_widget = None + self._fake_widget = None # Notifications app = get_vistrails_application() @@ -145,16 +147,54 @@ def setCellInfo(self, cellInfo): 'dragging_to_overlays', self._set_dragging) def _set_dragging(self, dragging): - """This is a hack to avoid an issue with Qt's mouse event propagation. - - If we don't set TransparentForMouseEvents on the overlay, when the drag - enters, the overlay will receive the mouse event and propagate it to - us. Thus it is on the call stack and we can't replace it with another - overlay... It would cause a segmentation fault on Mac OS. + """This is a hack to workaround issues related to dragging. """ + # Issue with Qt's mouse event propagation. + # + # If we don't set TransparentForMouseEvents on the overlay, when the + # drag enters, the overlay will receive the mouse event and propagate + # it to us. Thus it is on the call stack and we can't replace it with + # another overlay... It would cause a segmentation fault on Mac OS. self._overlay_scrollarea.setAttribute( QtCore.Qt.WA_TransparentForMouseEvents, dragging) + # Issue with some non-Qt widgets, such as VTK's (that use direct + # rendering) + # We can just replace the cell with an image of the previous content, + # like the spreadsheet does with QCellPresenter + if dragging: + widget = self.containedWidget + if widget is not None: + widget.setParent(None) + self._saved_widget = widget + + if hasattr(widget, 'grabWindowPixmap'): + pixmap = widget.grabWindowPixmap() + else: + pixmap = QtGui.QPixmap.grabWidget(widget) + painter = QtGui.QPainter(pixmap) + painter.setPen(QtGui.QPen(QtGui.QColor(255, 0, 0), 5)) + painter.drawLine( + 5, 5, + pixmap.width() - 10, pixmap.height() - 10) + painter.drawLine( + pixmap.width() - 10, 5, + 5, pixmap.height() - 10) + painter.end() + painter = None + self._fake_widget = QtGui.QLabel() + self._fake_widget.setPixmap(pixmap) + self._fake_widget.setParent(self) + self._fake_widget.raise_() + else: + if self._saved_widget is not None: + self._saved_widget.setParent(self) + self._saved_widget.raise_() + self._saved_widget = None + self._fake_widget.setParent(None) + self._fake_widget.deleteLater() + self._fake_widget = None + def _variable_added(self, controller, varname, renamed_from=None): if (renamed_from is None or controller != self._controller or From 55938311d6c7a603e1375b55ba70d776845c066a Mon Sep 17 00:00:00 2001 From: Remi Rampin Date: Thu, 21 Mar 2013 18:20:17 -0400 Subject: [PATCH 02/12] Adds WA_TransparentForMouseEvents --- dat/gui/cellcontainer.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dat/gui/cellcontainer.py b/dat/gui/cellcontainer.py index 73d687d..a38dc60 100644 --- a/dat/gui/cellcontainer.py +++ b/dat/gui/cellcontainer.py @@ -184,6 +184,8 @@ def _set_dragging(self, dragging): painter = None self._fake_widget = QtGui.QLabel() self._fake_widget.setPixmap(pixmap) + self._fake_widget.setAttribute( + QtCore.Qt.WA_TransparentForMouseEvents, True) self._fake_widget.setParent(self) self._fake_widget.raise_() else: From 0a96c948c1e1775a01fa933fa70da62b35316433 Mon Sep 17 00:00:00 2001 From: Remi Rampin Date: Wed, 3 Apr 2013 16:23:00 -0400 Subject: [PATCH 03/12] Removes scrollarea to avoid VTK having siblings --- dat/gui/cellcontainer.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/dat/gui/cellcontainer.py b/dat/gui/cellcontainer.py index a38dc60..b27f55e 100644 --- a/dat/gui/cellcontainer.py +++ b/dat/gui/cellcontainer.py @@ -64,7 +64,7 @@ def __init__(self, cellInfo=None, widget=None, error=None, parent=None): # Overlay self._overlay = None - self._overlay_scrollarea = QtGui.QScrollArea(self) + self._overlay_scrollarea = QtGui.QScrollArea() # FIXME: no parent self._overlay_scrollarea.setObjectName('overlay_scrollarea') self._overlay_scrollarea.setStyleSheet( 'QScrollArea#overlay_scrollarea {' @@ -74,6 +74,7 @@ def __init__(self, cellInfo=None, widget=None, error=None, parent=None): ' background-color: transparent;' '}') self._overlay_scrollarea.setWidgetResizable(True) + self._overlay_scrollarea.setVisible(False) # Toolbar self._container_toolbar = QtGui.QToolBar(self) @@ -165,6 +166,7 @@ def _set_dragging(self, dragging): if dragging: widget = self.containedWidget if widget is not None: + print "removes widget()" widget.setParent(None) self._saved_widget = widget @@ -190,6 +192,7 @@ def _set_dragging(self, dragging): self._fake_widget.raise_() else: if self._saved_widget is not None: + print "restores widget()" self._saved_widget.setParent(self) self._saved_widget.raise_() self._saved_widget = None @@ -330,12 +333,15 @@ def _set_overlay(self, overlay_class, **kwargs): return if self._overlay is not None: + print "deletes overlay" self._overlay.setParent(None) self._overlay.deleteLater() if overlay_class is None: + print "removes overlay_scrollarea" self._overlay = None - self._overlay_scrollarea.lower() + self._overlay_scrollarea.setParent(None) + self._overlay_scrollarea.setVisible(False) if self._plot is not None: self._set_toolbar_buttons(True) else: @@ -347,7 +353,10 @@ def _set_overlay(self, overlay_class, **kwargs): self.update_pipeline() self._execute_pending = False else: + print "creates overlay %s, adds overlay_scrollarea" % overlay_class.__name__ self._overlay = overlay_class(self, **kwargs) + self._overlay_scrollarea.setParent(self) + self._overlay_scrollarea.setVisible(True) self._overlay_scrollarea.setWidget(self._overlay) self._overlay.show() self._overlay_scrollarea.raise_() From 1de939e3ad3849c220842b16f99d18525a22c7af Mon Sep 17 00:00:00 2001 From: Remi Rampin Date: Thu, 18 Apr 2013 13:46:08 -0400 Subject: [PATCH 04/12] Keeps the scrollarea around during the drag --- dat/gui/cellcontainer.py | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/dat/gui/cellcontainer.py b/dat/gui/cellcontainer.py index b27f55e..b2b3f33 100644 --- a/dat/gui/cellcontainer.py +++ b/dat/gui/cellcontainer.py @@ -49,6 +49,7 @@ def __init__(self, cellInfo=None, widget=None, error=None, parent=None): self._parameter_hovered = None self._insert_pos = None + self._dragging = False self._saved_widget = None self._fake_widget = None @@ -150,6 +151,8 @@ def setCellInfo(self, cellInfo): def _set_dragging(self, dragging): """This is a hack to workaround issues related to dragging. """ + self._dragging = dragging + # Issue with Qt's mouse event propagation. # # If we don't set TransparentForMouseEvents on the overlay, when the @@ -190,6 +193,10 @@ def _set_dragging(self, dragging): QtCore.Qt.WA_TransparentForMouseEvents, True) self._fake_widget.setParent(self) self._fake_widget.raise_() + + self._overlay_scrollarea.setParent(self) + self._overlay_scrollarea.setVisible(True) + self._overlay_scrollarea.lower() else: if self._saved_widget is not None: print "restores widget()" @@ -200,6 +207,8 @@ def _set_dragging(self, dragging): self._fake_widget.deleteLater() self._fake_widget = None + self._set_overlay(None) + def _variable_added(self, controller, varname, renamed_from=None): if (renamed_from is None or controller != self._controller or @@ -338,10 +347,11 @@ def _set_overlay(self, overlay_class, **kwargs): self._overlay.deleteLater() if overlay_class is None: - print "removes overlay_scrollarea" self._overlay = None - self._overlay_scrollarea.setParent(None) - self._overlay_scrollarea.setVisible(False) + if not self._dragging: + print "removes overlay_scrollarea" + self._overlay_scrollarea.setParent(None) + self._overlay_scrollarea.setVisible(False) if self._plot is not None: self._set_toolbar_buttons(True) else: @@ -353,10 +363,12 @@ def _set_overlay(self, overlay_class, **kwargs): self.update_pipeline() self._execute_pending = False else: - print "creates overlay %s, adds overlay_scrollarea" % overlay_class.__name__ + print "creates overlay %s" % overlay_class.__name__ self._overlay = overlay_class(self, **kwargs) - self._overlay_scrollarea.setParent(self) - self._overlay_scrollarea.setVisible(True) + if not self._dragging: + print "adds overlay_scrollarea" + self._overlay_scrollarea.setParent(self) + self._overlay_scrollarea.setVisible(True) self._overlay_scrollarea.setWidget(self._overlay) self._overlay.show() self._overlay_scrollarea.raise_() From 408ceed4141c6b6886ce8a4f0394decb03a42d9d Mon Sep 17 00:00:00 2001 From: Remi Rampin Date: Thu, 18 Apr 2013 13:58:00 -0400 Subject: [PATCH 05/12] Gets a pixmap from the widget *before* removing it VTK will fail to render with "invalid drawable" if its widget is unparented first. --- dat/gui/cellcontainer.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/dat/gui/cellcontainer.py b/dat/gui/cellcontainer.py index b2b3f33..bf82078 100644 --- a/dat/gui/cellcontainer.py +++ b/dat/gui/cellcontainer.py @@ -169,10 +169,6 @@ def _set_dragging(self, dragging): if dragging: widget = self.containedWidget if widget is not None: - print "removes widget()" - widget.setParent(None) - self._saved_widget = widget - if hasattr(widget, 'grabWindowPixmap'): pixmap = widget.grabWindowPixmap() else: @@ -187,6 +183,11 @@ def _set_dragging(self, dragging): 5, pixmap.height() - 10) painter.end() painter = None + + print "removes widget()" + widget.setParent(None) + self._saved_widget = widget + self._fake_widget = QtGui.QLabel() self._fake_widget.setPixmap(pixmap) self._fake_widget.setAttribute( From 77f7cfd5f81a9b22c955f3e766e96df40408d62c Mon Sep 17 00:00:00 2001 From: Tommy Ellqvist Date: Wed, 27 May 2015 15:15:00 +0200 Subject: [PATCH 06/12] Added pixmap replacement for "show overlay" button Also contains fix for "invalid drawable" --- dat/gui/cellcontainer.py | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/dat/gui/cellcontainer.py b/dat/gui/cellcontainer.py index bf82078..ae31b3b 100644 --- a/dat/gui/cellcontainer.py +++ b/dat/gui/cellcontainer.py @@ -270,12 +270,10 @@ def setWidget(self, widget): self.toolBar = None if widget: widget.setParent(self) - widget.show() - self.containedWidget = widget + self._displayed_widget = self.containedWidget = widget if widget is None: return - widget.raise_() self._set_toolbar_buttons(True) self.contentsUpdated() @@ -328,7 +326,7 @@ def contentsUpdated(self): self._set_overlay(None) def _set_overlay(self, overlay_class, **kwargs): - if overlay_class is None: + if overlay_class is None and not self._execute_pending: # Default overlay if self._plot is not None and self.has_error(): self._set_overlay(VariableDroppingOverlay, overlayed=False) @@ -358,6 +356,17 @@ def _set_overlay(self, overlay_class, **kwargs): else: self._set_toolbar_buttons(None) + if self._fake_widget is not None: + print "restores widget()" + self.containedWidget.setParent(self) + self.containedWidget.show() + self.containedWidget.raise_() + self._displayed_widget = self.containedWidget + self._fake_widget.setParent(None) + self._fake_widget.deleteLater() + self.do_layout() + self._fake_widget = None + # Now that we are done with the overlay, we can go on with a # deferred execution if self._execute_pending: @@ -373,6 +382,28 @@ def _set_overlay(self, overlay_class, **kwargs): self._overlay_scrollarea.setWidget(self._overlay) self._overlay.show() self._overlay_scrollarea.raise_() + + widget = self.containedWidget + if widget: + if widget is not None: + if hasattr(widget, 'grabWindowPixmap'): + pixmap = widget.grabWindowPixmap() + else: + pixmap = QtGui.QPixmap.grabWidget(widget) + + print "removes widget()" + self.containedWidget.setParent(None) + self.containedWidget.hide() + + self._fake_widget = QtGui.QLabel(self) + self._fake_widget.setPixmap(pixmap) + self._fake_widget.setAttribute( + QtCore.Qt.WA_TransparentForMouseEvents, True) + self._fake_widget.lower() + self._fake_widget.show() + self._displayed_widget = self._fake_widget + + self.containedWidget.hide() self.do_layout() self._set_toolbar_buttons(None) From 12c348565f0def0e8980b2409ea19b0ee387a8bf Mon Sep 17 00:00:00 2001 From: Remi Rampin Date: Tue, 9 Jun 2015 10:05:32 -0400 Subject: [PATCH 07/12] Removes _displayed_widget --- dat/gui/cellcontainer.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/dat/gui/cellcontainer.py b/dat/gui/cellcontainer.py index ae31b3b..e84e4b1 100644 --- a/dat/gui/cellcontainer.py +++ b/dat/gui/cellcontainer.py @@ -270,7 +270,7 @@ def setWidget(self, widget): self.toolBar = None if widget: widget.setParent(self) - self._displayed_widget = self.containedWidget = widget + self.containedWidget = widget if widget is None: return @@ -361,7 +361,6 @@ def _set_overlay(self, overlay_class, **kwargs): self.containedWidget.setParent(self) self.containedWidget.show() self.containedWidget.raise_() - self._displayed_widget = self.containedWidget self._fake_widget.setParent(None) self._fake_widget.deleteLater() self.do_layout() @@ -401,7 +400,6 @@ def _set_overlay(self, overlay_class, **kwargs): QtCore.Qt.WA_TransparentForMouseEvents, True) self._fake_widget.lower() self._fake_widget.show() - self._displayed_widget = self._fake_widget self.containedWidget.hide() self.do_layout() From 9efdce837797815e8482c7857172fc70af274ae5 Mon Sep 17 00:00:00 2001 From: Remi Rampin Date: Tue, 9 Jun 2015 10:06:16 -0400 Subject: [PATCH 08/12] Removes _saved_widget --- dat/gui/cellcontainer.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/dat/gui/cellcontainer.py b/dat/gui/cellcontainer.py index e84e4b1..fcdfce3 100644 --- a/dat/gui/cellcontainer.py +++ b/dat/gui/cellcontainer.py @@ -50,7 +50,6 @@ def __init__(self, cellInfo=None, widget=None, error=None, parent=None): self._parameter_hovered = None self._insert_pos = None self._dragging = False - self._saved_widget = None self._fake_widget = None # Notifications @@ -186,7 +185,6 @@ def _set_dragging(self, dragging): print "removes widget()" widget.setParent(None) - self._saved_widget = widget self._fake_widget = QtGui.QLabel() self._fake_widget.setPixmap(pixmap) @@ -199,14 +197,15 @@ def _set_dragging(self, dragging): self._overlay_scrollarea.setVisible(True) self._overlay_scrollarea.lower() else: - if self._saved_widget is not None: - print "restores widget()" - self._saved_widget.setParent(self) - self._saved_widget.raise_() - self._saved_widget = None + if self._fake_widget is not None: + widget = self.containedWidget + if widget is not None: + print "restores widget()" + widget.setParent(self) + widget.raise_() self._fake_widget.setParent(None) self._fake_widget.deleteLater() - self._fake_widget = None + self._fake_widget = None self._set_overlay(None) From 8bf76103f46269d3ef4a84d5f2f11e696489fdfe Mon Sep 17 00:00:00 2001 From: Remi Rampin Date: Tue, 9 Jun 2015 12:00:05 -0400 Subject: [PATCH 09/12] Major rewrite of the pixmap-widget logic --- dat/gui/cellcontainer.py | 118 ++++++++++++++++++--------------------- 1 file changed, 55 insertions(+), 63 deletions(-) diff --git a/dat/gui/cellcontainer.py b/dat/gui/cellcontainer.py index fcdfce3..3b80440 100644 --- a/dat/gui/cellcontainer.py +++ b/dat/gui/cellcontainer.py @@ -147,6 +147,31 @@ def setCellInfo(self, cellInfo): app.unregister_notification( 'dragging_to_overlays', self._set_dragging) + def _make_fake_widget(self): + if self._fake_widget is None: + if hasattr(self.containedWidget, 'grabWindowPixmap'): + pixmap = self.containedWidget.grabWindowPixmap() + else: + pixmap = QtGui.QPixmap.grabWidget(self.containedWidget) + painter = QtGui.QPainter(pixmap) + painter.setPen(QtGui.QPen(QtGui.QColor(255, 0, 0), 5)) + painter.drawLine( + 5, 5, + pixmap.width() - 10, pixmap.height() - 10) + painter.drawLine( + pixmap.width() - 10, 5, + 5, pixmap.height() - 10) + painter.end() + painter = None + + self.containedWidget.setParent(None) + self.containedWidget.hide() + + self._fake_widget = QtGui.QLabel(self) + self._fake_widget.setPixmap(pixmap) + self._fake_widget.setAttribute( + QtCore.Qt.WA_TransparentForMouseEvents, True) + def _set_dragging(self, dragging): """This is a hack to workaround issues related to dragging. """ @@ -166,48 +191,27 @@ def _set_dragging(self, dragging): # We can just replace the cell with an image of the previous content, # like the spreadsheet does with QCellPresenter if dragging: - widget = self.containedWidget - if widget is not None: - if hasattr(widget, 'grabWindowPixmap'): - pixmap = widget.grabWindowPixmap() - else: - pixmap = QtGui.QPixmap.grabWidget(widget) - painter = QtGui.QPainter(pixmap) - painter.setPen(QtGui.QPen(QtGui.QColor(255, 0, 0), 5)) - painter.drawLine( - 5, 5, - pixmap.width() - 10, pixmap.height() - 10) - painter.drawLine( - pixmap.width() - 10, 5, - 5, pixmap.height() - 10) - painter.end() - painter = None - - print "removes widget()" - widget.setParent(None) - - self._fake_widget = QtGui.QLabel() - self._fake_widget.setPixmap(pixmap) - self._fake_widget.setAttribute( - QtCore.Qt.WA_TransparentForMouseEvents, True) - self._fake_widget.setParent(self) + if self.containedWidget is not None: + self._make_fake_widget() self._fake_widget.raise_() + self._fake_widget.show() self._overlay_scrollarea.setParent(self) self._overlay_scrollarea.setVisible(True) self._overlay_scrollarea.lower() + + self.do_layout() else: if self._fake_widget is not None: - widget = self.containedWidget - if widget is not None: - print "restores widget()" - widget.setParent(self) - widget.raise_() self._fake_widget.setParent(None) self._fake_widget.deleteLater() self._fake_widget = None + if self.containedWidget is not None: + self.containedWidget.setParent(self) + self.containedWidget.show() + self.containedWidget.raise_() - self._set_overlay(None) + self.do_layout() def _variable_added(self, controller, varname, renamed_from=None): if (renamed_from is None or @@ -262,7 +266,8 @@ def setWidget(self, widget): This is called by the spreadsheet to put or remove a visualization in this cell. """ - if widget != self.containedWidget: + assert self._fake_widget is None + if widget is not self.containedWidget: if self.containedWidget: self.containedWidget.setParent(None) self.containedWidget.deleteLater() @@ -278,6 +283,7 @@ def setWidget(self, widget): self.contentsUpdated() def takeWidget(self): + assert self._fake_widget is None widget = self.containedWidget if widget is not None: widget.setParent(None) @@ -340,14 +346,12 @@ def _set_overlay(self, overlay_class, **kwargs): return if self._overlay is not None: - print "deletes overlay" self._overlay.setParent(None) self._overlay.deleteLater() if overlay_class is None: self._overlay = None if not self._dragging: - print "removes overlay_scrollarea" self._overlay_scrollarea.setParent(None) self._overlay_scrollarea.setVisible(False) if self._plot is not None: @@ -356,14 +360,14 @@ def _set_overlay(self, overlay_class, **kwargs): self._set_toolbar_buttons(None) if self._fake_widget is not None: - print "restores widget()" - self.containedWidget.setParent(self) - self.containedWidget.show() - self.containedWidget.raise_() self._fake_widget.setParent(None) self._fake_widget.deleteLater() + self._fake_widget = None + if self.containedWidget: + self.containedWidget.setParent(self) + self.containedWidget.show() + self.containedWidget.raise_() self.do_layout() - self._fake_widget = None # Now that we are done with the overlay, we can go on with a # deferred execution @@ -371,36 +375,19 @@ def _set_overlay(self, overlay_class, **kwargs): self.update_pipeline() self._execute_pending = False else: - print "creates overlay %s" % overlay_class.__name__ + if self.containedWidget is not None: + self._make_fake_widget() + self._fake_widget.lower() + self._fake_widget.show() + self._overlay = overlay_class(self, **kwargs) if not self._dragging: - print "adds overlay_scrollarea" self._overlay_scrollarea.setParent(self) self._overlay_scrollarea.setVisible(True) self._overlay_scrollarea.setWidget(self._overlay) self._overlay.show() self._overlay_scrollarea.raise_() - widget = self.containedWidget - if widget: - if widget is not None: - if hasattr(widget, 'grabWindowPixmap'): - pixmap = widget.grabWindowPixmap() - else: - pixmap = QtGui.QPixmap.grabWidget(widget) - - print "removes widget()" - self.containedWidget.setParent(None) - self.containedWidget.hide() - - self._fake_widget = QtGui.QLabel(self) - self._fake_widget.setPixmap(pixmap) - self._fake_widget.setAttribute( - QtCore.Qt.WA_TransparentForMouseEvents, True) - self._fake_widget.lower() - self._fake_widget.show() - - self.containedWidget.hide() self.do_layout() self._set_toolbar_buttons(None) @@ -439,8 +426,13 @@ def resizeEvent(self, event): self.do_layout() def do_layout(self): - if self.containedWidget is not None: - self.containedWidget.setGeometry( + if self._fake_widget is not None: + widget = self._fake_widget + else: + widget = self.containedWidget + + if widget is not None: + widget.setGeometry( 4, 4, self.width() - 8, self.height() - 8) self._overlay_scrollarea.setGeometry( From 9327d20f81fa5d5dc8203257b0d6f848577ba910 Mon Sep 17 00:00:00 2001 From: Remi Rampin Date: Tue, 9 Jun 2015 15:48:40 -0400 Subject: [PATCH 10/12] Removes painted red cross on pixmap (for debug) --- dat/gui/cellcontainer.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/dat/gui/cellcontainer.py b/dat/gui/cellcontainer.py index 3b80440..29c9fbb 100644 --- a/dat/gui/cellcontainer.py +++ b/dat/gui/cellcontainer.py @@ -153,16 +153,6 @@ def _make_fake_widget(self): pixmap = self.containedWidget.grabWindowPixmap() else: pixmap = QtGui.QPixmap.grabWidget(self.containedWidget) - painter = QtGui.QPainter(pixmap) - painter.setPen(QtGui.QPen(QtGui.QColor(255, 0, 0), 5)) - painter.drawLine( - 5, 5, - pixmap.width() - 10, pixmap.height() - 10) - painter.drawLine( - pixmap.width() - 10, 5, - 5, pixmap.height() - 10) - painter.end() - painter = None self.containedWidget.setParent(None) self.containedWidget.hide() From a90de6afc4cdfe5744a25ca647fb09bf93be4b6f Mon Sep 17 00:00:00 2001 From: Tommy Ellqvist Date: Mon, 15 Jun 2015 17:20:07 +0200 Subject: [PATCH 11/12] Fixed flickering when dragging variable over existing plot If the plot gets the drag focus first it creates a focus change between the plot and the cell container. This caused a dragExit event each time the mouse was moved. Setting transparentForMouseEvents on currentWidget when creating fake widget seems to fix this. --- dat/gui/cellcontainer.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/dat/gui/cellcontainer.py b/dat/gui/cellcontainer.py index 29c9fbb..78826ae 100644 --- a/dat/gui/cellcontainer.py +++ b/dat/gui/cellcontainer.py @@ -154,6 +154,8 @@ def _make_fake_widget(self): else: pixmap = QtGui.QPixmap.grabWidget(self.containedWidget) + self.containedWidget.setAttribute( + QtCore.Qt.WA_TransparentForMouseEvents, True) self.containedWidget.setParent(None) self.containedWidget.hide() @@ -197,6 +199,9 @@ def _set_dragging(self, dragging): self._fake_widget.deleteLater() self._fake_widget = None if self.containedWidget is not None: + self.containedWidget.setAttribute( + QtCore.Qt.WA_TransparentForMouseEvents, False) + self.containedWidget.setParent(self) self.containedWidget.show() self.containedWidget.raise_() From d88173394b3f7bc99235681516e67c08d549fb7f Mon Sep 17 00:00:00 2001 From: Remi Rampin Date: Mon, 15 Jun 2015 16:58:07 -0400 Subject: [PATCH 12/12] Add missing WA_TransparentForMouseEvents --- dat/gui/cellcontainer.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dat/gui/cellcontainer.py b/dat/gui/cellcontainer.py index 78826ae..21d3250 100644 --- a/dat/gui/cellcontainer.py +++ b/dat/gui/cellcontainer.py @@ -362,6 +362,8 @@ def _set_overlay(self, overlay_class, **kwargs): self.containedWidget.setParent(self) self.containedWidget.show() self.containedWidget.raise_() + self.containedWidget.setAttribute( + QtCore.Qt.WA_TransparentForMouseEvents, False) self.do_layout() # Now that we are done with the overlay, we can go on with a