Codebase list ruby-fxruby / ddfc60e lib / fox16 / splashscreen.rb
ddfc60e

Tree @ddfc60e (Download .tar.gz)

splashscreen.rb @ddfc60eraw · history · blame

#
# Splashscreen component, contributed by David Naseby.
#

require 'fox16/colors'

module Fox
  #
  # The FXSplashScreen window...
  #
  class FXSplashScreen < FXDialogBox

    #
    # Return an initialized FXSplashScreen instance.
    #
    # ==== Parameters:
    #
    # +owner+::	Owner window for this dialog box [FXWindow]
    # +title+::	Title string for this dialog box [String]
    # +text+::	   Message text for this dialog box [String]
    # +action+::	The action
    #
    def initialize( owner, title, text, action )
	   # Initialize the base class first
      super(owner, title)

      # Store the action block
      @action = action

      # Construct the window contents
      FXVerticalFrame.new( self ) do |frame|
        text.each_line do |line|
          FXLabel.new( frame, line.strip )
        end
        FXLabel.new( frame, "Click OK to continue (this may take a few moments)...." )
        @status = FXLabel.new( frame, " " )
        @accept = FXButton.new( frame, "&OK", nil, self, ID_ACCEPT,
          FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT|LAYOUT_CENTER_Y)
        @accept.enabled = false
      end
    end

    def execute(placement = PLACEMENT_OWNER)
      Thread.new do
        sleep 1
        @action.call method( :update_status )
        update_status "Completed"
        @accept.enabled = true
      end
      super
    end

    def update_status(msg)
      @status.text = msg
    end
  end
end

if $0 == __FILE__
  # @private
  class FakeSite # :nodoc:
    def open( &status )
      yield ">>>>> Opening Site" if block_given?
      sleep 5
      yield "site open" if block_given?
    end
  end
  fake_site = FakeSite.new

  include Fox

  FXApp.new( "Test SplashScreen" ) do |theApp|
    FXMainWindow.new( theApp, "Hello" ) do |mainWin|
      FXButton.new( mainWin, "Show Splash" ).connect( SEL_COMMAND ) do
        lv = FXSplashScreen.new( mainWin, "Opening Site", "Welcome to Sitebuilder!\nOpening the site.\n",  lambda{ |proc| fake_site.open( &proc ) } )
        lv.execute
      end
      mainWin.show
    end
    theApp.create
    theApp.run
  end
end