Fix mugshot camera

This commit is contained in:
Sean Davis 2016-10-18 00:03:13 -04:00
parent e728762d9f
commit 88cd84e855
3 changed files with 65 additions and 43 deletions

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.18.3 --> <!-- Generated with glade 3.20.0 -->
<interface> <interface>
<requires lib="gtk+" version="3.0"/> <requires lib="gtk+" version="3.0"/>
<requires lib="camera_mugshot_dialog" version="1.0"/> <requires lib="camera_mugshot_dialog" version="1.0"/>

View File

@ -53,25 +53,10 @@ class CameraBox(GtkClutter.Embed):
self.state = Gst.State.NULL self.state = Gst.State.NULL
self.parent = parent self.parent = parent
self.stage = self.get_stage() video_texture = self.setup_ui()
self.layout_manager = Clutter.BoxLayout()
self.scroll = Clutter.ScrollActor.new() self.camera = Cheese.Camera.new(video_texture,
self.scroll.set_scroll_mode(Clutter.ScrollMode.HORIZONTALLY) "Mugshot", 1280, 720)
self.textures_box = Clutter.Actor(layout_manager=self.layout_manager)
self.textures_box.set_x_align(Clutter.ActorAlign.CENTER)
self.scroll.add_actor(self.textures_box)
self.stage.add_actor(self.scroll)
self.video_texture = Clutter.Texture.new()
self.layout_manager.pack(
self.video_texture, expand=True, x_fill=False, y_fill=False,
x_align=Clutter.BoxAlignment.CENTER, y_align=Clutter.BoxAlignment.CENTER)
self.camera = Cheese.Camera.new(self.video_texture, "Mugshot", 100, 100)
Cheese.Camera.setup(self.camera, None) Cheese.Camera.setup(self.camera, None)
Cheese.Camera.play(self.camera) Cheese.Camera.play(self.camera)
self.state = Gst.State.PLAYING self.state = Gst.State.PLAYING
@ -88,12 +73,70 @@ class CameraBox(GtkClutter.Embed):
device_monitor.connect("added", added) device_monitor.connect("added", added)
device_monitor.coldplug() device_monitor.coldplug()
self.connect("size-allocate", self.on_size_allocate)
self.camera.connect("photo-taken", self.on_photo_taken) self.camera.connect("photo-taken", self.on_photo_taken)
self.camera.connect("state-flags-changed", self.on_state_flags_changed) self.camera.connect("state-flags-changed", self.on_state_flags_changed)
self._save_filename = "" self._save_filename = ""
def setup_ui(self):
viewport = self.get_stage()
video_preview = Clutter.Actor.new()
video_preview.set_content_gravity(Clutter.ContentGravity.RESIZE_ASPECT)
video_preview.set_x_expand(True)
video_preview.set_y_expand(True)
video_preview.props.min_height = 100.0
video_preview.props.min_width = 100.0
video_texture = video_preview
viewport_layout = Clutter.Actor.new()
viewport_layout.add_child(video_preview)
viewport_layout_manager = Clutter.BinLayout()
background_layer = Clutter.Actor.new()
status, background_layer.props.background_color = Clutter.Color.from_string("Black")
background_layer.props.x = 0
background_layer.props.y = 0
background_layer.props.width = 100
background_layer.props.height = 100
video_preview.props.request_mode = Clutter.RequestMode.HEIGHT_FOR_WIDTH
viewport.add_child(background_layer)
viewport_layout.set_layout_manager(viewport_layout_manager)
viewport.add_child(viewport_layout)
viewport.connect("allocation_changed", self.on_stage_resize, viewport_layout, background_layer)
return video_texture
def on_stage_resize(self, actor, box, flags, layout, background):
s_width, s_height = self.get_stage().get_size()
v_width = self.camera.props.format.width
v_height = self.camera.props.format.height
square = min(s_width, s_height)
if v_width > v_height:
scale = square / v_height
v_height = square
v_width = v_width * scale
else:
scale = square / v_width
v_height = v_height * scale
v_width = square
x_adj, y_adj = (s_width - v_width) / 2.0, (s_height - v_height) / 2.0
layout.set_size(v_width, v_height)
layout.set_x(x_adj)
layout.set_y(y_adj)
background.set_size(s_width, s_height)
def on_state_flags_changed(self, camera, state): def on_state_flags_changed(self, camera, state):
self.state = state self.state = state
self.emit("gst-state-changed", self.state) self.emit("gst-state-changed", self.state)
@ -109,27 +152,6 @@ class CameraBox(GtkClutter.Embed):
def stop(self): def stop(self):
Cheese.Camera.stop(self.camera) Cheese.Camera.stop(self.camera)
def on_size_allocate(self, widget, allocation):
vheight = self.video_texture.get_height()
vwidth = self.video_texture.get_width()
if vheight == 0 or vwidth == 0:
vformat = self.camera.get_current_video_format()
vheight = vformat.height
vwidth = vformat.width
height = allocation.height
mult = vheight / height
width = round(vwidth / mult, 1)
self.video_texture.set_height(height)
self.video_texture.set_width(width)
point = Clutter.Point()
point.x = (self.video_texture.get_width() - allocation.width) / 2
point.y = 0
self.scroll.scroll_to_point(point)
def take_photo(self, target_filename): def take_photo(self, target_filename):
self._save_filename = target_filename self._save_filename = target_filename
return self.camera.take_photo_pixbuf() return self.camera.take_photo_pixbuf()

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-31 20:17-0400\n" "POT-Creation-Date: 2016-10-18 00:02-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -103,7 +103,7 @@ msgstr ""
#. Set the record button to retry, and disable it until the capture #. Set the record button to retry, and disable it until the capture
#. finishes. #. finishes.
#: ../mugshot/CameraMugshotDialog.py:244 #: ../mugshot/CameraMugshotDialog.py:266
msgid "Retry" msgid "Retry"
msgstr "" msgstr ""