If you need to use separate files, the following should work:

WIDGET FILE, eg, mywidget.rb:
class Shoes::Mywidget<<Shoes::Widget
....
end

MAIN FILE:
require 'mywidget'

Shoes.app do
...
mywidget
...
end

Good luck and consider taking part in the Ruby programing with Shoes course
at rubylearning.org

K

2008/12/14 Jordan Applewhite <[email protected]>

> Hi again!  Thank you for taking the time to post these great tips.  I've
> been experimenting with them, but I'm still hung up on something.
>
> If I want to define a class that inherits from Widget in a separate file,
> what do I have to require or include to make the interpreter recognize
> "Widget"?  If I want to make a class in a separate file that returns a para
> for appending to an app block, what do I require or include in that file
> that will allow me to define a method that uses para?  If Shoes were a
> library, it seems that I would (require "shoes") or something, then start
> instantiating objects.  Since shoes is more of a ruby distribution, this
> process is a little unintuitive for me.
>
> I've searched the Shoebox, looked at the bundled examples, and checked the
> manual, and I can't find a single example of a Shoes app that spans multiple
> files.  Even the widget example on Hackety.org (Martin DeMello) uses a test
> app at the bottom of the file.  I've been reading and rereading the Block
> Redirection passage in the Rules section of the manual, but I can't glean
> from that how to accomplish what I want.
>
> I'm probably missing something elementary and obvious, but I've spent my
> coding time for the last few days stuck on this problem.  Isolating all
> creation and manipulation of Shoes objects in the main app is a good
> workaround, but it would be so helpful if I could store Widgets and shoesy
> classes in separate files, sans Shoes.app block.  This would let me build a
> toolkit of reusable components that are ready to be included and
> instantiated in the Shoes app du jour.
>
> Thanks again.  As a Shoes newbie and hobby programmer, I appreciate your
> patience and your thoughtful examples.
>
> On Sat, Dec 13, 2008 at 8:59 PM, Krzysztof B. Wicher <[email protected]>wrote:
>
>> The easiest way to do what you want is to write a class which inherits
>> from Shoes::Widget and then you do not have to worry about  providing
>> reference to the main Shoes.app class (using the global variable e.g.
>> $app=self).
>>
>> class Myclass << Widget
>> ...
>> ....
>> end
>> Shoes.app do
>> myclass ... #it is not an error - you do not start with a capital letter,
>> since you are creating a widget you use it as e.g. rect, oval, float etc
>> ...
>> end
>>
>> Have a look on the latest version of my menu widget for the example (
>> http://s3.amazonaws.com/shoes_code/public/versions/178/menu_widget.rb)
>>
>> Hope it helps.
>>
>> K
>>
>> On Sun, Dec 14, 2008 at 12:47 AM, Jordan Applewhite <
>> [email protected]> wrote:
>>
>>> I'm trying to make a class that has an array of paras, stacks, or some
>>> other Shoes object.  Then, I want to instantiate that class from the file
>>> that contains Shoes.app and append those elements to a slot therein.  I'm
>>> having a difficult time figuring out how to get my class to recognize the
>>> shoes objects and methods.  I've tried requiring different shoes source
>>> files and using the $app variable found in the expert-tankspank.rb sample
>>> (is $app  part of the Ruby language or is it a Shoes construct?).  How do
>>> you use shoes elements in your classes outside of the main Shoes.app file?
>>>
>>>
>>> I'm so very confused.  Halp!
>>>
>>> Thanks!
>>>
>>
>>
>
>
> 2008/12/14 Karel Minařík <[email protected]>
>
> Thanks. Of course, it would be better if Sheep/Dog objects had their
>> respective private `draw()` methods, but it would just clutter this concise
>> code I guess, bringing no other value then purely academical.
>>
>>  Thanks for posting your code, I personally learned a lot about Ruby from
>>> reading it.
>>>
>>
>> That's great, thanks :)
>>
>> Karel
>>
>>
>> On 14.12.2008, at 11:17, Krzysztof B. Wicher wrote:
>>
>>  Hi Karel,
>>>
>>> It is a really nice solution. I think there is no single best way for
>>> using Shoe objects in external classes. In my case, I also started with $app
>>> because at that time inheritance from Widget was buggy but at the end I
>>> wanted to have the possibility to use the methods available for Widgets
>>> without rewriting them.
>>> In your case, using classes with a module is probably optimal.
>>>
>>> Thanks for posting your code, I personally learned a lot about Ruby from
>>> reading it.
>>>
>>> k
>>>
>>> On Sun, Dec 14, 2008 at 7:45 AM, Karel Minařík <[email protected]>
>>> wrote:
>>> Hi,
>>>
>>> I also started with the global $app variable from the tank example, but
>>> needed some much much more cleaner way -- my code being an educational
>>> piece.
>>>
>>> Of course, for "standard GUI" elements like the popup menu example
>>> Krzysztof posted -- that's prime example for the inheritance solution.
>>>
>>> I didn't like to go the inheritance way in a simple game I did recently
>>> ("favor composition over inheritance" etc), so I came up with wrapping the
>>> Shoes object in a Canvas class:
>>>
>>> -->
>>> http://github.com/karmi/sheep_in_your_shoes/tree/master/sheep_in_your_shoes.rb#L21-30
>>>
>>> This way I can then write things like `Canvas.get.width` or `Canvas.draw
>>> { oval 0, 0, 15, 15 }`.
>>>
>>> I set the reference to canvas in the beginning of the `Shoes.app do ...
>>> end` block:
>>>
>>> -->
>>> http://github.com/karmi/sheep_in_your_shoes/tree/master/sheep_in_your_shoes.rb#L191
>>>
>>> So the different responsibility is separated into different classes.
>>>
>>> I'd be interested to know what you think about this approach.
>>>
>>>
>>> Karel
>>>
>>>
>>>
>>> On 14.12.2008, at 4:50, Alexander Rakoczy wrote:
>>>
>>> Try designing your external files as modules, too, that get included
>>> into your Shoes.app block.
>>>
>>> See:
>>> http://help.shoooes.net/Rules.html
>>>
>>> And check out some of the apps in the shoebox.
>>>
>>> On Sat, Dec 13, 2008 at 21:05, Christopher Small
>>> <[email protected]> wrote:
>>>
>>> I did something similar to what you are describing without making a
>>> widget.
>>> I was storing the Shoes objects in class attributes of an outside class,
>>> but
>>> did all the creating and storing of these objects from within the
>>> Shoes.app
>>> block. For my application this was a pretty clean approach. If this would
>>> be
>>> messy for yours, then perhaps a widget is the way to go.
>>>
>>> Cheers
>>>
>>> Chris
>>>
>>>
>>>
>>> On Dec 13, 2008, at 4:47 PM, Jordan Applewhite wrote:
>>>
>>> I'm trying to make a class that has an array of paras, stacks, or some
>>> other Shoes object.  Then, I want to instantiate that class from the file
>>> that contains Shoes.app and append those elements to a slot therein.  I'm
>>> having a difficult time figuring out how to get my class to recognize the
>>> shoes objects and methods.  I've tried requiring different shoes source
>>> files and using the $app variable found in the expert-tankspank.rb sample
>>> (is $app  part of the Ruby language or is it a Shoes construct?).  How do
>>> you use shoes elements in your classes outside of the main Shoes.app
>>> file?
>>>
>>> I'm so very confused.  Halp!
>>>
>>> Thanks!
>>>
>>>
>>>
>>>
>>>
>>> --
>>> alexander rakoczy
>>>
>>>
>>>
>>
>

Reply via email to