Skip to content

Commit

Permalink
Add support for pressing escape while dragging a dock window
Browse files Browse the repository at this point in the history
This will return the window to its start drag position when Escape is
pressed *while* holding the mouse down; inline with the normal behavior
of windows.
  • Loading branch information
sccolbert committed Mar 24, 2014
1 parent f4a575d commit e732d2b
Showing 1 changed file with 57 additions and 12 deletions.
69 changes: 57 additions & 12 deletions enaml/qt/docking/q_dock_container.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from atom.api import Typed, Bool

from enaml.qt.QtCore import Qt, QMargins, QPoint, QRect, QEvent, Signal
from enaml.qt.QtGui import QApplication, QLayout, QIcon
from enaml.qt.QtGui import QApplication, QLayout, QIcon, QCursor

from .event_types import QDockItemEvent, DockItemUndocked
from .q_dock_area import QDockArea
Expand Down Expand Up @@ -117,9 +117,15 @@ class FrameState(QDockFrame.FrameState):
#: The original title bar press position.
press_pos = Typed(QPoint)

#: The position of the frame when first moved.
start_pos = Typed(QPoint)

#: Whether or not the dock item is being dragged.
dragging = Bool(False)

#: Whether the frame was maximized before moving.
frame_was_maximized = Bool(False)

#: Whether the dock item is maximized in the dock area.
item_is_maximized = Bool(False)

Expand Down Expand Up @@ -422,6 +428,8 @@ def reset(self):
state = self.frame_state
state.dragging = False
state.press_pos = None
state.start_pos = None
state.frame_was_maximized = False
state.in_dock_bar = False
self.showNormal()
self.unfloat()
Expand Down Expand Up @@ -542,14 +550,16 @@ def untab(self, pos):
state = self.frame_state
state.mouse_title = True
state.dragging = True
state.frame_was_maximized = False
self.float()
self.raiseFrame()
title_bar = self.dockItem().titleBarWidget()
title_pos = QPoint(title_bar.width() / 2, title_bar.height() / 2)
margins = self.layout().contentsMargins()
offset = QPoint(margins.left(), margins.top())
state.press_pos = title_bar.mapTo(self, title_pos) + offset
self.move(pos - state.press_pos)
state.start_pos = pos - state.press_pos
self.move(state.start_pos)
self.show()
self.grabMouse()
self.activateWindow()
Expand Down Expand Up @@ -661,6 +671,25 @@ def closeEvent(self, event):
"""
self.manager().close_container(self, event)

def keyPressEvent(self, event):
""" Handle the key press event for the dock container.
If the Escape key is pressed while dragging a floating
container, the container will be released. If it is not
released over a dock target, it will be moved back to its
starting position.
"""
super(QDockContainer, self).keyPressEvent(event)
state = self.frame_state
if state.dragging and event.key() == Qt.Key_Escape:
pos = state.start_pos
self._releaseFrame();
if self.isWindow() and pos is not None:
self.move(pos)
if state.frame_was_maximized:
self.showMaximized()

def titleBarMousePressEvent(self, event):
""" Handle a mouse press event on the title bar.
Expand All @@ -674,6 +703,7 @@ def titleBarMousePressEvent(self, event):
state = self.frame_state
if state.press_pos is None:
state.press_pos = event.pos()
state.start_pos = self.pos()
return True
return False

Expand Down Expand Up @@ -709,7 +739,8 @@ def titleBarMouseMoveEvent(self, event):
# normal size. The next move event will move the window.
state.dragging = True
if self.isWindow():
if self.isMaximized():
state.frame_was_maximized = self.isMaximized();
if state.frame_was_maximized:
coeff = state.press_pos.x() / float(self.width())
self.showNormal()
state.press_pos = _computePressPos(self, coeff)
Expand All @@ -734,13 +765,34 @@ def titleBarMouseMoveEvent(self, event):
self.raiseFrame()
margins = self.layout().contentsMargins()
state.press_pos += QPoint(0, margins.top())
self.move(global_pos - state.press_pos)
state.start_pos = global_pos - state.press_pos
self.move(state.start_pos)
self.show()
self.grabMouse()
self.activateWindow()
self.raise_()
return True

def _releaseFrame(self):
""" A helper method which releases the frame grab.
Returns
-------
result : bool
True if the frame was released, False otherwise.
"""
state = self.frame_state
if state.press_pos is not None:
self.releaseMouse()
if self.isWindow():
self.manager().drag_release_frame(self, QCursor.pos())
state.dragging = False
state.press_pos = None
state.start_pos = None
return True
return False

def titleBarMouseReleaseEvent(self, event):
""" Handle a mouse release event on the title bar.
Expand All @@ -751,12 +803,5 @@ def titleBarMouseReleaseEvent(self, event):
"""
if event.button() == Qt.LeftButton:
state = self.frame_state
if state.press_pos is not None:
self.releaseMouse()
if self.isWindow():
self.manager().drag_release_frame(self, event.globalPos())
state.dragging = False
state.press_pos = None
return True
return self._releaseFrame()
return False

0 comments on commit e732d2b

Please sign in to comment.