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 >> >> >> >
