[pitivi] viewer: Resizing from the corner
- From: Alexandru Băluț <alexbalut src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pitivi] viewer: Resizing from the corner
- Date: Mon, 6 Aug 2018 11:43:41 +0000 (UTC)
commit 25609f3ab7996e865ec275298c70a384823cabe3
Author: HarishFulara07 <harish14143 iiitd ac in>
Date: Fri Jul 27 01:57:25 2018 +0530
viewer: Resizing from the corner
pitivi/viewer/viewer.py | 92 ++++++++++++++++++++++++++++++++++++++++---------
1 file changed, 75 insertions(+), 17 deletions(-)
---
diff --git a/pitivi/viewer/viewer.py b/pitivi/viewer/viewer.py
index 9a14aee9..9affab43 100644
--- a/pitivi/viewer/viewer.py
+++ b/pitivi/viewer/viewer.py
@@ -77,7 +77,6 @@ class ViewerContainer(Gtk.Box, Loggable):
def __init__(self, app):
Gtk.Box.__init__(self)
- self.set_border_width(SPACING)
self.app = app
self.settings = app.settings
@@ -101,6 +100,9 @@ class ViewerContainer(Gtk.Box, Loggable):
if not self.settings.viewerDocked:
self.undock()
+ self.__cursor = None
+ self.__translation = None
+
def setPipeline(self, pipeline, position=None):
"""Sets the displayed pipeline.
@@ -138,18 +140,9 @@ class ViewerContainer(Gtk.Box, Loggable):
self.target = ViewerWidget(self.overlay_stack)
if self.docked:
- self.pack_start(self.target, True, True, 0)
- # Force the AspectFrame to be tall (and wide) enough to look good.
- # TODO: review this code to create a smarter algorithm.
- if not self._compactMode:
- req = self.buttons.get_preferred_size()[0]
- width = req.width
- height = int(width / self.target.props.ratio)
- width += 110 # Magic number to minimize dead padding
- self.target.set_size_request(width, height)
+ self.pack_start(self.target, expand=True, fill=True, padding=0)
else:
- self.external_vbox.pack_start(self.target, False, False, 0)
- self.target.props.expand = True
+ self.external_vbox.pack_start(self.target, expand=True, fill=False, padding=0)
self.external_vbox.child_set(self.target, fill=True)
self.setDisplayAspectRatio(self.app.project_manager.current_project.getDAR())
@@ -205,12 +198,38 @@ class ViewerContainer(Gtk.Box, Loggable):
"configure-event", self._externalWindowConfigureCb)
self.external_vbox = vbox
+ # Corner marker.
+ corner = Gtk.DrawingArea()
+ # Number of lines to draw in the corner marker.
+ lines = 3
+ # Space between each line.
+ space = 5
+ # Margin from left and bottom of viewer container.
+ margin = 2
+ corner_size = space * lines + margin
+ corner.set_size_request(corner_size, corner_size)
+ corner.set_halign(Gtk.Align.START)
+ corner.add_events(Gdk.EventMask.ENTER_NOTIFY_MASK |
+ Gdk.EventMask.BUTTON_PRESS_MASK |
+ Gdk.EventMask.BUTTON_RELEASE_MASK |
+ Gdk.EventMask.POINTER_MOTION_MASK)
+ hpane = self.app.gui.editor.mainhpaned
+ vpane = self.app.gui.editor.toplevel_widget
+ corner.connect("draw", self.__corner_draw_cb, lines, space, margin)
+ corner.connect("enter-notify-event", self.__corner_enter_notify_cb)
+ corner.connect("button-press-event", self.__corner_button_press_cb, hpane, vpane)
+ corner.connect("button-release-event", self.__corner_button_release_cb)
+ corner.connect("motion-notify-event", self.__corner_motion_notify_cb, hpane, vpane)
+ self.pack_end(corner, False, False, 0)
+
# Buttons/Controls
bbox = Gtk.Box()
bbox.set_orientation(Gtk.Orientation.HORIZONTAL)
bbox.set_property("valign", Gtk.Align.CENTER)
bbox.set_property("halign", Gtk.Align.CENTER)
- self.pack_end(bbox, False, False, SPACING)
+ bbox.set_margin_left(SPACING)
+ bbox.set_margin_right(SPACING)
+ self.pack_end(bbox, False, False, 0)
self.goToStart_button = Gtk.ToolButton()
self.goToStart_button.set_icon_name("media-skip-backward")
@@ -274,11 +293,48 @@ class ViewerContainer(Gtk.Box, Loggable):
self.timecode_entry.get_accessible().set_name("timecode_entry")
self.undock_button.get_accessible().set_name("undock_button")
- self.buttons = bbox
self.buttons_container = bbox
self.show_all()
self.external_vbox.show_all()
+ def __corner_draw_cb(self, unused_widget, cr, lines, space, margin):
+ cr.set_line_width(1)
+
+ marker_color = self.app.gui.get_style_context().lookup_color("borders")
+ cr.set_source_rgb(marker_color.color.red,
+ marker_color.color.green,
+ marker_color.color.blue)
+
+ cr.translate(margin, 0)
+ for i in range(lines):
+ cr.move_to(0, space * i)
+ cr.line_to(space * (lines - i), space * lines)
+ cr.stroke()
+
+ def __corner_enter_notify_cb(self, widget, unused_event):
+ if not self.__cursor:
+ self.__cursor = Gdk.Cursor.new(Gdk.CursorType.BOTTOM_LEFT_CORNER)
+ widget.get_window().set_cursor(self.__cursor)
+
+ def __corner_button_press_cb(self, unused_widget, event, hpane, vpane):
+ if event.button == 1:
+ # The mouse pointer position is w.r.t the root of the screen
+ # whereas the positions of panes is w.r.t the root of the
+ # mainwindow. We need to find the translation that takes us
+ # from screen coordinate system to mainwindow coordinate system.
+ self.__translation = (event.x_root - hpane.get_position(),
+ event.y_root - vpane.get_position())
+
+ def __corner_button_release_cb(self, unused_widget, unused_event):
+ self.__translation = None
+
+ def __corner_motion_notify_cb(self, unused_widget, event, hpane, vpane):
+ if self.__translation is None:
+ return
+
+ hpane.set_position(event.x_root - self.__translation[0])
+ vpane.set_position(event.y_root - self.__translation[1])
+
def activateCompactMode(self):
self.back_button.hide()
self.forward_button.hide()
@@ -353,6 +409,7 @@ class ViewerContainer(Gtk.Box, Loggable):
self.pipeline.setState(Gst.State.NULL)
self.remove(self.target)
self.__createNewViewer()
+ self.buttons_container.set_margin_bottom(SPACING)
self.external_vbox.pack_end(self.buttons_container, False, False, 0)
self.undock_button.hide()
@@ -360,7 +417,7 @@ class ViewerContainer(Gtk.Box, Loggable):
self.fullscreen_button.set_icon_name("view-fullscreen")
self.fullscreen_button.set_tooltip_text(
_("Show this window in fullscreen"))
- self.buttons.pack_end(
+ self.buttons_container.pack_end(
self.fullscreen_button, expand=False, fill=False, padding=6)
self.fullscreen_button.show()
self.fullscreen_button.connect("toggled", self._toggleFullscreen)
@@ -392,6 +449,7 @@ class ViewerContainer(Gtk.Box, Loggable):
self.undock_button.show()
self.fullscreen_button.destroy()
self.external_vbox.remove(self.buttons_container)
+ self.buttons_container.set_margin_bottom(0)
self.pack_end(self.buttons_container, False, False, 0)
self.show()
@@ -490,8 +548,8 @@ class ViewerWidget(Gtk.AspectFrame, Loggable):
def __init__(self, widget):
# Prevent black frames and flickering while resizing or changing focus:
# The aspect ratio gets overridden by setDisplayAspectRatio.
- Gtk.AspectFrame.__init__(self, xalign=0.5, yalign=0.5,
- ratio=4.0 / 3.0, obey_child=False)
+ Gtk.AspectFrame.__init__(self, xalign=0.5, yalign=0.5, ratio=4 / 3,
+ border_width=SPACING, obey_child=False)
Loggable.__init__(self)
self.add(widget)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]