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
>