More drag/resize handle work
This commit is contained in:
		@@ -6,16 +6,25 @@ gi.require_version('Gtk', '3.0')
 | 
				
			|||||||
gi.require_version('Gdk', '3.0')
 | 
					gi.require_version('Gdk', '3.0')
 | 
				
			||||||
from gi.repository import Gtk
 | 
					from gi.repository import Gtk
 | 
				
			||||||
from gi.repository import Gdk
 | 
					from gi.repository import Gdk
 | 
				
			||||||
 | 
					from gi.repository import GLib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Application imports
 | 
					# Application imports
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class BodyGrid(Gtk.Grid):
 | 
					class BodyGrid(Gtk.Grid):
 | 
				
			||||||
    def __init__(self, gdk_window):
 | 
					    def __init__(self, window, gdk_window):
 | 
				
			||||||
        super(BodyGrid, self).__init__()
 | 
					        super(BodyGrid, self).__init__()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._gdk_window = gdk_window
 | 
					        self._gdk_window   = gdk_window
 | 
				
			||||||
        self.is_dragging = False
 | 
					        self._window       = window
 | 
				
			||||||
 | 
					        self._is_dragging  = False
 | 
				
			||||||
 | 
					        self._update_block = False
 | 
				
			||||||
 | 
					        self._drag_start_x = 0
 | 
				
			||||||
 | 
					        self._drag_start_y = 0
 | 
				
			||||||
 | 
					        self._current_x, \
 | 
				
			||||||
 | 
					        self._current_y    = window.get_position()
 | 
				
			||||||
 | 
					        self._w1           = 0.0
 | 
				
			||||||
 | 
					        self._h1           = 0.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._setup_styling()
 | 
					        self._setup_styling()
 | 
				
			||||||
        self._setup_signals()
 | 
					        self._setup_signals()
 | 
				
			||||||
@@ -39,60 +48,40 @@ class BodyGrid(Gtk.Grid):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _load_widgets(self):
 | 
					    def _load_widgets(self):
 | 
				
			||||||
        top_left     = Gtk.Button("")
 | 
					        drag_button  = Gtk.Button("")
 | 
				
			||||||
        top_right    = Gtk.Button("")
 | 
					 | 
				
			||||||
        bottom_left  = Gtk.Button("")
 | 
					 | 
				
			||||||
        bottom_right = Gtk.Button("")
 | 
					        bottom_right = Gtk.Button("")
 | 
				
			||||||
        box          = Gtk.Box()
 | 
					        # box          = Gtk.Box()
 | 
				
			||||||
        box2         = Gtk.Box()
 | 
					        box2         = Gtk.Box()
 | 
				
			||||||
        box3         = Gtk.Box()
 | 
					        box3         = Gtk.Box()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ctx1 = top_left.get_style_context()
 | 
					        ctx  = drag_button.get_style_context()
 | 
				
			||||||
        ctx1.add_class("expand-button")
 | 
					        ctx.add_class("expand-button")
 | 
				
			||||||
        ctx2 = top_right.get_style_context()
 | 
					        ctx2 = bottom_right.get_style_context()
 | 
				
			||||||
        ctx2.add_class("expand-button")
 | 
					        ctx2.add_class("expand-button")
 | 
				
			||||||
        ctx3 = bottom_left.get_style_context()
 | 
					 | 
				
			||||||
        ctx3.add_class("expand-button")
 | 
					 | 
				
			||||||
        ctx4 = bottom_right.get_style_context()
 | 
					 | 
				
			||||||
        ctx4.add_class("expand-button")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        width, height = 1, 1
 | 
					 | 
				
			||||||
        row, col      = 1, 1
 | 
					        row, col      = 1, 1
 | 
				
			||||||
        self.attach(top_left, col, row, width, height)
 | 
					        self.attach(drag_button, col, row, 5, 1)
 | 
				
			||||||
        row, col      = 1, 5
 | 
					 | 
				
			||||||
        self.attach(top_right, col, row, width, height)
 | 
					 | 
				
			||||||
        row, col      = 5, 1
 | 
					 | 
				
			||||||
        self.attach(bottom_left, col, row, width, height)
 | 
					 | 
				
			||||||
        row, col      = 5, 5
 | 
					 | 
				
			||||||
        self.attach(bottom_right, col, row, width, height)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        row, col      = 1, 2
 | 
					 | 
				
			||||||
        self.attach(box, col, row, 1, 1)
 | 
					 | 
				
			||||||
        row, col      = 2, 1
 | 
					        row, col      = 2, 1
 | 
				
			||||||
        self.attach(box2, col, row, 4, 2)
 | 
					        self.attach(box2, col, row, 5, 3)
 | 
				
			||||||
        row, col      = 5, 2
 | 
					        row, col      = 5, 1
 | 
				
			||||||
        self.attach(box3, col, row, 1, 1)
 | 
					        self.attach(box3, col, row, 4, 1)
 | 
				
			||||||
 | 
					        row, col      = 5, 5
 | 
				
			||||||
 | 
					        self.attach(bottom_right, col, row, 1, 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        box.set_vexpand(True)
 | 
					        drag_button.set_vexpand(True)
 | 
				
			||||||
        box.set_hexpand(True)
 | 
					        drag_button.set_hexpand(True)
 | 
				
			||||||
        box2.set_vexpand(True)
 | 
					        box2.set_vexpand(True)
 | 
				
			||||||
        box2.set_hexpand(True)
 | 
					        box2.set_hexpand(True)
 | 
				
			||||||
        box3.set_vexpand(True)
 | 
					        box3.set_vexpand(True)
 | 
				
			||||||
        box3.set_hexpand(True)
 | 
					        box3.set_hexpand(True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        top_left.connect("button-press-event", self._press_event)
 | 
					
 | 
				
			||||||
        top_right.connect("button-press-event", self._press_event)
 | 
					        drag_button.connect("button-press-event", self._press_event)
 | 
				
			||||||
        bottom_left.connect("button-press-event", self._press_event)
 | 
					        drag_button.connect("motion-notify-event", self._move_motion_event)
 | 
				
			||||||
 | 
					        drag_button.connect("button-release-event", self._release_event)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        bottom_right.connect("button-press-event", self._press_event)
 | 
					        bottom_right.connect("button-press-event", self._press_event)
 | 
				
			||||||
 | 
					        bottom_right.connect("motion-notify-event", self._resize_motion_event)
 | 
				
			||||||
        top_left.connect("motion-notify-event", self._resize_motion_event_tl)
 | 
					 | 
				
			||||||
        top_right.connect("motion-notify-event", self._resize_motion_event_tr)
 | 
					 | 
				
			||||||
        bottom_left.connect("motion-notify-event", self._resize_motion_event_bl)
 | 
					 | 
				
			||||||
        bottom_right.connect("motion-notify-event", self._resize_motion_event_br)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        top_left.connect("button-release-event", self._release_event)
 | 
					 | 
				
			||||||
        top_right.connect("button-release-event", self._release_event)
 | 
					 | 
				
			||||||
        bottom_left.connect("button-release-event", self._release_event)
 | 
					 | 
				
			||||||
        bottom_right.connect("button-release-event", self._release_event)
 | 
					        bottom_right.connect("button-release-event", self._release_event)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _press_event(self, widget = None, eve = None):
 | 
					    def _press_event(self, widget = None, eve = None):
 | 
				
			||||||
@@ -100,27 +89,59 @@ class BodyGrid(Gtk.Grid):
 | 
				
			|||||||
        cursor = Gdk.Cursor(Gdk.CursorType.CROSSHAIR)
 | 
					        cursor = Gdk.Cursor(Gdk.CursorType.CROSSHAIR)
 | 
				
			||||||
        window.get_window().set_cursor(cursor)
 | 
					        window.get_window().set_cursor(cursor)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.is_dragging = True
 | 
					        self._is_dragging  = True
 | 
				
			||||||
 | 
					        self._drag_start_x = eve.x
 | 
				
			||||||
 | 
					        self._drag_start_y = eve.y
 | 
				
			||||||
 | 
					        self._w1           = self._window.get_size()[0]  # Ref window width
 | 
				
			||||||
 | 
					        self._h1           = self._window.get_size()[1]  # Ref window height
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _resize_motion_event_tl(self, widget = None, eve = None):
 | 
					    def _resize_motion_event(self, widget = None, eve = None):
 | 
				
			||||||
        if self.is_dragging:
 | 
					        if self._update_block:
 | 
				
			||||||
            self._gdk_window.begin_resize_drag(Gdk.WindowEdge.NORTH_WEST, 1, eve.x_root, eve.y_root, eve.time)
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _resize_motion_event_tr(self, widget = None, eve = None):
 | 
					        x1 = self._drag_start_x
 | 
				
			||||||
        if self.is_dragging:
 | 
					        y1 = self._drag_start_y
 | 
				
			||||||
            self._gdk_window.begin_resize_drag(Gdk.WindowEdge.NORTH_EAST, 1, eve.x_root, eve.y_root, eve.time)
 | 
					        x2 = eve.x
 | 
				
			||||||
 | 
					        y2 = eve.y
 | 
				
			||||||
 | 
					        w  = 0
 | 
				
			||||||
 | 
					        h  = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _resize_motion_event_bl(self, widget = None, eve = None):
 | 
					        if x2 > x1: # Is growing
 | 
				
			||||||
        if self.is_dragging:
 | 
					            w = self._w1 + (x2 - x1)
 | 
				
			||||||
            self._gdk_window.begin_resize_drag(Gdk.WindowEdge.SOUTH_WEST, 1, eve.x_root, eve.y_root, eve.time)
 | 
					        else:       # Is shrinking
 | 
				
			||||||
 | 
					            w = self._w1 - (x1 - x2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _resize_motion_event_br(self, widget = None, eve = None):
 | 
					        if y2 > y1: # Is growing
 | 
				
			||||||
        if self.is_dragging:
 | 
					            h = self._h1 + (y2 - y1)
 | 
				
			||||||
            self._gdk_window.begin_resize_drag(Gdk.WindowEdge.SOUTH_EAST, 1, eve.x_root, eve.y_root, eve.time)
 | 
					        else:       # Is shrinking
 | 
				
			||||||
 | 
					            h = self._h1 - (y1 - y2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._update_block = True
 | 
				
			||||||
 | 
					        self._window.resize(w, h)
 | 
				
			||||||
 | 
					        self._update_block = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _move_motion_event(self, widget = None, eve = None):
 | 
				
			||||||
 | 
					        if self._update_block:
 | 
				
			||||||
 | 
					            self._drag_start_x = eve.x
 | 
				
			||||||
 | 
					            self._drag_start_y = eve.y
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if self._is_dragging:
 | 
				
			||||||
 | 
					            offset_x = eve.x - self._drag_start_x
 | 
				
			||||||
 | 
					            offset_y = eve.y - self._drag_start_y
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            self._current_x += offset_x
 | 
				
			||||||
 | 
					            self._current_y += offset_y
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            self._update_block = True
 | 
				
			||||||
 | 
					            self._window.move(self._current_x, self._current_y)
 | 
				
			||||||
 | 
					            self._update_block = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _release_event(self, widget = None, eve = None):
 | 
					    def _release_event(self, widget = None, eve = None):
 | 
				
			||||||
        window       = self.get_parent()
 | 
					        window       = self.get_parent()
 | 
				
			||||||
        watch_cursor = Gdk.Cursor(Gdk.CursorType.ARROW)
 | 
					        watch_cursor = Gdk.Cursor(Gdk.CursorType.ARROW)
 | 
				
			||||||
        window.get_window().set_cursor(watch_cursor)
 | 
					        window.get_window().set_cursor(watch_cursor)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.is_dragging = False
 | 
					        self._is_dragging   = False
 | 
				
			||||||
 | 
					        self._drag_start_x = 0
 | 
				
			||||||
 | 
					        self._drag_start_y = 0
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,6 +31,7 @@ class RegionWindow(Gtk.Window):
 | 
				
			|||||||
        self.set_resizable(True)
 | 
					        self.set_resizable(True)
 | 
				
			||||||
        self.set_skip_pager_hint(True)
 | 
					        self.set_skip_pager_hint(True)
 | 
				
			||||||
        self.set_skip_taskbar_hint(True)
 | 
					        self.set_skip_taskbar_hint(True)
 | 
				
			||||||
 | 
					        self.set_has_resize_grip(True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _setup_signals(self):
 | 
					    def _setup_signals(self):
 | 
				
			||||||
        ...
 | 
					        ...
 | 
				
			||||||
@@ -40,7 +41,7 @@ class RegionWindow(Gtk.Window):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    def _load_widgets(self):
 | 
					    def _load_widgets(self):
 | 
				
			||||||
        gdk_window = self.get_screen().get_root_window()
 | 
					        gdk_window = self.get_screen().get_root_window()
 | 
				
			||||||
        self.add( BodyGrid(gdk_window) )
 | 
					        self.add( BodyGrid(self, gdk_window) )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _set_window_data(self) -> None:
 | 
					    def _set_window_data(self) -> None:
 | 
				
			||||||
        screen = self.get_screen()
 | 
					        screen = self.get_screen()
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user