921f82f5d35745ed0a59c0328e1d2c5ad45edeec
[dcpomatic.git] / hacks / python-playback / thumbs.py
1 # GUI to display thumbnails and allow cropping
2 # to be set up
3
4 import os
5 import sys
6 import pygtk
7 pygtk.require('2.0')
8 import gtk
9 import film
10 import player
11
12 class Thumbs(gtk.Dialog):
13     def __init__(self, film):
14         gtk.Dialog.__init__(self)
15         self.film = film
16         self.controls = gtk.Table()
17         self.controls.set_col_spacings(4)
18         self.thumb_adj = gtk.Adjustment(0, 0, self.film.thumbs() - 1, 1, 10)
19         self.add_control("Thumbnail", self.thumb_adj, 0)
20         self.left_crop_adj = gtk.Adjustment(self.film.left_crop, 0, 1024, 1, 128)
21         self.add_control("Left crop", self.left_crop_adj, 1)
22         self.right_crop_adj = gtk.Adjustment(self.film.right_crop, 0, 1024, 1, 128)
23         self.add_control("Right crop", self.right_crop_adj, 2)
24         self.top_crop_adj = gtk.Adjustment(self.film.top_crop, 0, 1024, 1, 128)
25         self.add_control("Top crop", self.top_crop_adj, 3)
26         self.bottom_crop_adj = gtk.Adjustment(self.film.bottom_crop, 0, 1024, 1, 128)
27         self.add_control("Bottom crop", self.bottom_crop_adj, 4)
28         self.display_image = gtk.Image()
29         self.update_display()
30         window_box = gtk.HBox()
31         window_box.set_spacing(12)
32
33         controls_vbox = gtk.VBox()
34         controls_vbox.set_spacing(4)
35         controls_vbox.pack_start(self.controls, False, False)
36         
37         window_box.pack_start(controls_vbox, True, True)
38         window_box.pack_start(self.display_image)
39         
40         self.set_title("%s Thumbnails" % film.name)
41         self.get_content_area().add(window_box)
42         self.add_button("Close", gtk.RESPONSE_ACCEPT)
43         self.show_all()
44
45         for a in [self.thumb_adj, self.left_crop_adj, self.right_crop_adj, self.top_crop_adj, self.bottom_crop_adj]:
46             a.connect('value-changed', self.update_display, self)
47
48     def add_control(self, name, adj, n):
49         l = gtk.Label(name)
50         l.set_alignment(1, 0.5)
51         self.controls.attach(l, 0, 1, n, n + 1)
52         s = gtk.SpinButton(adj)
53         self.controls.attach(s, 1, 2, n, n + 1)
54
55     def update_display(self, a = None, b = None):
56         thumb_pixbuf = gtk.gdk.pixbuf_new_from_file(self.film.thumb(self.thumb_adj.get_value()))
57         self.width = thumb_pixbuf.get_width()
58         self.height = thumb_pixbuf.get_height()
59         left = self.left_crop()
60         right = self.right_crop()
61         top = self.top_crop()
62         bottom = self.bottom_crop()
63         pixbuf = thumb_pixbuf.subpixbuf(left, top, self.width - left - right, self.height - top - bottom)
64         self.display_image.set_from_pixbuf(pixbuf)
65
66     def top_crop(self):
67         return int(self.top_crop_adj.get_value())
68
69     def bottom_crop(self):
70         return int(self.bottom_crop_adj.get_value())
71
72     def left_crop(self):
73         return int(self.left_crop_adj.get_value())
74     
75     def right_crop(self):
76         return int(self.right_crop_adj.get_value())