Hi guys,
I had some success yesterday so thought I should complete this thread by
showing how I got it working.
The LogWindowDialog class is not included because it includes a lot of
details that are irrelevant for the topic. In that class I create a
Log4r outputter and formatter to pass LogEvent objects straight to the
dialog which are then serialised and output into a TextCtrl widget.
Seems to work fairly well with the few examples I’ve tried. If the Ruby
script kicks off an external app the UI will be unresponsive.
Code below. Hope it helps others.
Cheers,
Dave
== Description
Generic log window dialog that integrates with our Pipeline::Log
objects for displaying log messages to users.
=== Example Usage
# To auto-popup the display of the log dialog:
Pipeline::GUI::LogWindow::show_dialog( true ) do
# Do something that will log messages, dialog only displayed on
# errors.
end
# To force the display of the log dialog:
Pipeline::GUI::LogWindow::show_dialog( ) do
# Do something that will log messages
end
class LogWindow < Wx::App
#---------------------------------------------------------------------
Class Methods
#---------------------------------------------------------------------
def initialize( log, auto_popup, title = ‘Log’, &block )
super( )
@log = log
@auto_popup = auto_popup
@title = title
@proc = Proc.new( ) do
yield
end
end
Use this method to explicitly display a log dialog box. Only
log messages generated after this call will be displayed.
def LogWindow::show_dialog( auto_popup = false, log =
LogSystem::instance().rootlog, title = ‘Log’ )
begin
dlg = LogWindow.new( log, auto_popup, title ) do
yield if ( block_given? )
end
dlg.main_loop( )
rescue Exception => ex
throw ex unless ( ‘exit’ == ex.message )
end
end
#---------------------------------------------------------------------
Instance Methods
#---------------------------------------------------------------------
def on_init( )
Wx::every( 25 ) do
Thread::pass( )
end
dlg = LogWindowDialog::new( @log, @title, @auto_popup )
dlg.show( ) unless ( @auto_popup )
script_thread = Thread.new do
@proc.call( )
exit( ) if ( @auto_popup and ( not dlg.is_shown ) )
end
script_thread.join( )
end
end
== Description
Log window dialog.
class LogWindowDialog < Wx::Dialog
…
end