27
class UI < Gtk::Builder
33
add_from_file('pfview.glade')
34
connect_signals { |handler| method(handler) }
36
@area = get_object('draw')
37
@area.set_gl_capability(Gdk::GLConfig.new(Gdk::GLConfig::MODE_DEPTH | Gdk::GLConfig::MODE_DOUBLE | Gdk::GLConfig::MODE_RGB))
38
@area.set_size_request(@cl.max_width, @cl.max_height)
40
status = get_object('statusbar')
42
@empty_pixbuf = Gdk::Pixbuf.new((0..(3*@cl.max_width*@cl.max_height-1)).map { 0.chr }.join, Gdk::Pixbuf::ColorSpace::RGB, false, 8, @cl.max_width, @cl.max_height, @cl.max_width)
44
rs = get_object('resolution_store')
46
@invalid_resolutions = 0
47
RESOLUTIONS.each { |i|
48
if (i[0] > @cl.max_width) or (i[1] > @cl.max_height) then
49
@invalid_resolutions += 1
51
rs.append()[0] = sprintf('%ix%i',i[0],i[1])
55
resolution = get_object('resolution')
57
resolution.signal_connect('changed') { |widget|
58
@cl.set_resolution(RESOLUTIONS[widget.active + @invalid_resolutions])
59
draw_expose_event_cb(@area, nil)
62
exposure = get_object('exposure')
63
exposure.value = @cl.exposure
65
camera_mode = get_object('camera_mode')
66
camera_mode.active = (@cl.camera_mode > 0)?1:0
70
notifier = INotify::Notifier.new
71
notifier_io = notifier.to_io
73
notifier.watch("saved_camera_images", :moved_from, :moved_to, :create, :delete) {
77
GLib::Timeout.add(1000) {
78
notifier.process if IO.select([notifier_io], [], [], 0)
85
GLib::Timeout.add(100) {
87
status.text = @pending_text
95
get_object('window1').visible = true
97
fps_value_changed_cb(get_object('fps'))
98
display_mode_changed_cb(get_object('display_mode'))
101
lambda{ |text, atonce|
103
#Expecting this called from main thread
105
Gtk.main_iteration while Gtk.events_pending?
107
#This causing crash and blocking as well not working good
112
lambda{ |width, height, data|
113
Gdk::RGB.draw_gray_image(@area.window, @area.style.fg_gc(@area.state), 0, 0, width, height, Gdk::RGB::DITHER_NORMAL, data, width)
118
def gtk_widget_delete(user_data, ev)
121
def gtk_main_quit(user_data)
125
def gtk_widget_hide(widget)
126
widget.visible = false
129
def fps_value_changed_cb(widget)
130
@cl.display_fps = widget.value
133
def display_mode_changed_cb(widget)
134
@cl.display_mode = widget.active
137
def exposure_value_changed_cb(widget)
138
@cl.exposure = widget.value
141
def camera_mode_changed_cb(widget)
142
@cl.camera_mode = widget.active
145
def draw_expose_event_cb(area, event)
146
@area.window.draw_pixbuf(nil, @empty_pixbuf, 0, 0, 0, 0, @cl.max_width, @cl.max_height, Gdk::RGB::DITHER_NORMAL, 0, 0)
150
def capture_clicked_cb(widget)
151
widget.sensitive = false
152
get_object('stop').sensitive = true
153
get_object('replay').sensitive = false
155
save = get_object('save')
156
storage = @cl.start_capture(save.active, get_object('time').value) {
157
get_object('stop').sensitive = false
158
get_object('capture').sensitive = true
159
get_object('replay').sensitive = true
162
if (storage > 0) then
163
save.active = storage
167
def stop_clicked_cb(widget)
171
def replay_clicked_cb(widget)
172
@cl.replay { |width, height, images, frames|
173
Player.new(get_object('fps').value, width, height, images, frames)
178
def update_archive_store()
179
a = get_object('archive')
180
s = get_object('archive_store')
183
cur_dir = (a.active >= 0)?s.get_value(a.active_iter, 1):nil
189
Dir.foreach("saved_camera_images") { |fn|
190
if fn =~ /^(\d{8}_\d{6})(\.(.+))?$/
192
item[0] = $2?sprintf("%s (%s)",$3, $1):"Unknown (#{fn})"
195
active = curid if cur_dir == fn
204
get_object('play').sensitive = true
205
get_object('delete').sensitive = true
207
get_object('play').sensitive = false
208
get_object('delete').sensitive = false
213
get_object('play').sensitive = false
214
get_object('delete').sensitive = false
218
def archive_changed_cb(widget)
219
if widget.active >= 0
220
get_object('play').sensitive = true
221
get_object('delete').sensitive = true
225
def play_clicked_cb(widget)
226
active_iter = get_object('archive').active_iter
227
active = get_object('archive_store').get_value(active_iter, 1)
228
Player.new(get_object('fps').value, nil, nil, active, nil)
231
def delete_clicked_cb(widget)
232
active_iter = get_object('archive').active_iter
233
active = get_object('archive_store').get_value(active_iter, 1)
234
system "rm -rf saved_camera_images/#{active}"
238
get_object('window1').destroy
242
Thread.abort_on_exception = true
244
$freemem = Integer(`free -b | awk 'NR==3 { print $4 }'`)
249
#It interupts Fg_ function in second thread and exception is comming from there...
250
#Kernel.trap("INT") {
255
#GLib::Idle.add { cl.iteration }
257
# We need to do it here, otherewise GC.start call in camera will took to long