2006-07-20 19:16:07 +04:00
#
# Copyright (C) 2006 Red Hat, Inc.
# Copyright (C) 2006 Hugh O. Brock <hbrock@redhat.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
import threading
import gtk
2006-11-06 23:00:39 +03:00
import gtk . gdk
2006-07-20 19:16:07 +04:00
import gtk . glade
import gobject
# Displays a progress bar while executing the "callback" method.
2006-07-24 21:50:11 +04:00
class vmmAsyncJob ( gobject . GObject ) :
2006-07-20 20:52:00 +04:00
# This thin wrapper only exists so we can put debugging
# code in the run() method every now & then
class asyncJobWorker ( threading . Thread ) :
def __init__ ( self , callback , args ) :
threading . Thread . __init__ ( self , target = callback , args = args )
def run ( self ) :
threading . Thread . run ( self )
2007-01-11 00:11:57 +03:00
def __init__ ( self , config , callback , args = None , title = " Progress " ) :
2006-07-20 19:16:07 +04:00
self . __gobject_init__ ( )
self . config = config
2006-11-07 17:40:34 +03:00
self . pbar_glade = gtk . glade . XML ( self . config . get_glade_file ( ) , " vmm-progress " , domain = " virt-manager " )
2006-07-20 19:16:07 +04:00
self . pbar_win = self . pbar_glade . get_widget ( " vmm-progress " )
self . pbar = self . pbar_glade . get_widget ( " pbar " )
self . pbar_win . set_title ( title )
self . pbar_win . hide ( )
2007-01-11 00:11:57 +03:00
args . insert ( 0 , self )
2006-07-24 21:50:11 +04:00
self . bg_thread = vmmAsyncJob . asyncJobWorker ( callback , args )
2007-01-11 00:11:57 +03:00
self . is_pulsing = False
2006-07-20 19:16:07 +04:00
def run ( self ) :
2007-01-11 00:11:57 +03:00
self . timer = gobject . timeout_add ( 100 , self . exit_if_necessary )
2006-07-20 19:16:07 +04:00
self . pbar_win . present ( )
2006-11-06 23:00:39 +03:00
self . pbar_win . window . set_cursor ( gtk . gdk . Cursor ( gtk . gdk . WATCH ) )
2006-07-20 19:16:07 +04:00
self . bg_thread . start ( )
gtk . main ( )
gobject . source_remove ( self . timer )
self . timer = 0
self . pbar_win . destroy ( )
2007-01-11 00:11:57 +03:00
def pulse_pbar ( self , text = _ ( " Working... " ) ) :
self . is_pulsing = True
self . pbar . set_text ( text )
def set_pbar_fraction ( self , frac , text ) :
# callback for progress meter when file size is known
self . is_pulsing = False
self . pbar . set_text ( text )
self . pbar . set_fraction ( frac )
def set_pbar_done ( self , text ) :
#callback for progress meter when progress is done
self . is_pulsing = False
self . pbar . set_text ( text )
self . pbar . set_fraction ( 1 )
def exit_if_necessary ( self ) :
2006-07-20 19:16:07 +04:00
if ( self . bg_thread . isAlive ( ) ) :
2007-01-11 00:11:57 +03:00
if ( self . is_pulsing ) :
self . pbar . pulse ( )
2006-07-20 20:52:00 +04:00
return True
2006-07-20 19:16:07 +04:00
else :
gtk . main_quit ( )
2006-07-20 20:52:00 +04:00
return False
2007-01-11 00:11:57 +03:00