#!/usr/bin/env python

import threading
import signal

import pygtk
pygtk.require('2.0')

import gtk
import gtk.glade

class Application:
    def __init__(self):
	signals = {
	    'on_window1_destroy': self.OnWindowDestroy,
	    'on_button1_clicked': self.OnButtonClicked
	}

	glade_window = gtk.glade.XML('example.glade', 'window1')
	glade_window.signal_autoconnect(signals)

	self.store = gtk.ListStore(str)
	renderer = gtk.CellRendererText()
	column = gtk.TreeViewColumn('Foos', renderer, text=0)
	view = gtk.TreeView(self.store)
	view.append_column(column)
	self.sw = gtk.ScrolledWindow()
	self.sw.add(view)

	self.vbox = glade_window.get_widget('vbox1')
	self.vbox.add(self.sw)
	self.vbox.show_all()

	self.pbar = gtk.ProgressBar()

	signal.signal(signal.SIGINT, signal.SIG_DFL)
	gtk.threads_init()
	#gtk.threads_enter()
	gtk.main()
	#gtk.threads_leave()

    def OnWindowDestroy(self, widget):
	gtk.main_quit()

    def OnButtonClicked(self, widget):
	self.thread_finished = False
	self.vbox.remove(self.sw)
	self.vbox.pack_start(self.pbar)
	self.vbox.show_all()
	gtk.timeout_add(50, self.OnTimerTick)
	thread = threading.Thread(target=self.DoThread)
	thread.start()

    def OnTimerTick(self):
	gtk.threads_enter()

	if not self.thread_finished:
	    self.pbar.pulse()
	    print 'Plusing ProgressBar, since '+ \
		'thread_finished is '+`self.thread_finished`
	else:
	    self.vbox.remove(self.pbar)
	    self.vbox.add(self.sw)
	    self.vbox.show_all()

	gtk.threads_leave()
	return not self.thread_finished

    def DoThread(self):
	for i in range(10000):
	    string = 'foo '+`i`
	    gtk.threads_enter()
	    self.store.append([string])
	    gtk.threads_leave()
	self.thread_finished = True
	print 'thread_finished is True'

if __name__ == '__main__':
    application = Application()
