#!/usr/bin/env python
# coding=utf-8
#
# View a PD100 ipcam
# Requires pd100.py
#
# Author: Patrick Salecker
# URL: http://www.salecker.org/software/pd100/en
# Last modified: 06.12.2009

import sys

import gtk
import gobject

import pd100

class Viewer():
	def __init__(self):
		self.gtkwin=gtk.Window(gtk.WINDOW_TOPLEVEL)
		self.gtkwin.set_position(gtk.WIN_POS_CENTER)
		self.gtkwin.set_title("pd100 viewer")
		self.gtkwin.connect("destroy", self.destroy)
		self.gtkwin.show()

		self.da=gtk.DrawingArea()
		self.da.connect("expose_event", self.expose_image)
		self.da.show()
		self.da_size=False
		self.gtkwin.add(self.da)
		
		gobject.threads_init()
		self.pd100_thread=pd100.MainThread()
		self.pd100_thread.start()
		
		gobject.timeout_add(100, self.update_image)
	
	def expose_image(self,widget,event=None):
		#print "expose"
		if self.pd100_thread.is_ready():
			jpeg=self.pd100_thread.get_jpeg()
			if len(jpeg)==0:
				return
			
			loader = gtk.gdk.PixbufLoader("jpeg")
			loader.write(jpeg)
			loader.close()
			pixbuf = loader.get_pixbuf()
			
			if self.da_size is False:
				self.da.set_size_request(pixbuf.get_width(), pixbuf.get_height())
				self.da_size=True
		
			ctx=widget.window.cairo_create()
			ctx.set_source_pixbuf(pixbuf,0,0)
			ctx.paint()
	
	def update_image(self):
		if self.da.window!=None:
			self.expose_image(self.da)
		return True
		
	def destroy(self,bla=None):
		print "Viewer Exit"
		self.pd100_thread.stop()
		sys.exit()

if __name__ == '__main__':
	win=Viewer()
	try:
		gtk.main()
	except KeyboardInterrupt:
		win.destroy()
