Hi,
I like your idea. Great work:
I added an error_logger edit box at the bottom so that you do not need to
open the console to see the error.
It is just a draft and can be enhanced:


class DemoApp
attr_reader :msg
  def initialize(code)
    @app = if code.grep(/Shoes.app/).empty?
      eval "Shoes.app { #{code} }"
    else
      eval @code
    end
  end
  def id
    @app.id
  end
  def close
    @app.close
  end
end

# This positioning doesn't appear to work... I wonder how to do it right?
a = Shoes.app :left => 10, :top => 10 do

  # kwicher: ADDED clear the console log
  Shoes.log.clear
  @apps = []
  para "Enter shoes code and submit to see a demo of what it would look
like"
  @e = edit_box :height => 200, :width => '100%'
  @e.focus

  # Would like to have hotkeys for each button, but its unclear how to catch
  # things like ctrl-s from inside the edit_box
  @submit = button "Submit"
  # kwicher: ADDED clear the console log and error_listener edit_box

  @submit.click {Shoes.log.clear;@err.text=''; @apps.push
DemoApp.new(@e.text);}
  @clear = button "Clear"
  # kwicher: ADDED clear the console log and error_listener edit_box
  @clear.click {[email protected] = '';@err.text=''; Shoes.log.clear;}

  @delete = button "Remove Demo Apps"
  @delete.click do
    open_app_ids = Shoes.APPS.map {|a| a.id}
    @apps.each do |a|
      a.close if open_app_ids.include? a.id
    end
    @apps = []
  end

  @load = button "Load from file"
  @load.click do
    filename = ask_open_file
    @e.text = File.read(filename)
    @err.text='';
  end
# kwicher: ADDED error_listener
  every(1) do
Shoes.log.each do |typ, msg, at, mid, rbf, rbl|
@err.text="#{msg}"
end
end
 @e.focus
# kwicher: ADDED error_listener edit_box
  para "=============== Error Messages=============", :align => 'center'
  @err = edit_box :height => 200, :width => '100%'
end

Krzys

On Tue, Jan 13, 2009 at 4:45 AM, Kevin Ball <[email protected]> wrote:

>
> I guess you ask this for removing the DemoApp from the list when it's
>> closed, but maybe you could just not use that class and eval the code
>> straight from the main app? And if the code contains Shoes.app, then
>> run it, else eval it in a new window ( window { eval @e.text } )
>
>
> Interesting... so this doesn't quite work, because within the window @e is
> not defined.  This is definitely not what I expected... I guess this is an
> example of the type of funkiness with blocks that _why warned about.
>
> This is pretty weird though, because as I understood it the funkiness had
> to do with the definition of self within the block, but regardless of self
> I'd expect there to be a closure so @e would be available.  I can work
> around the problem by defining a local variable reference to @e, so while
>
> window {eval @e.text}
>
> doesn't work
>
> e = @e; window {eval e.text}
>
> does.  I guess instance variables are looked up on self, so closures don't
> work in quite the way I'd expect  when it creates a new window, but I can
> work around it.
>
> That said... this doesn't end up solving my problem.  I still haven't found
> a way to get or register a callback for when that window closes, and if I
> try to close an already closed window Shoes crashes, just the same as when I
> tried to close an already closed App.
>
> However, I did discover that Shoes has a method for seeing what apps are
> currently open... Shoes.APPS.  By using this to compare against my list, I
> can avoid trying to close apps twice.  I haven't figured a similar way to do
> bookkeeping for windows.
>
> -Kevin
>

Reply via email to