[fxruby-users] Class with looping objects

Douglas Allen kb9agt at gmail.com
Wed Mar 3 18:40:55 EST 2010


I'm too inexperienced with FXRuby to really help you but have you ever
worked with the foxGUIb?

I can almost see the same things going on but with different approaches. I
like that it uses more attribute_reader after building all the widgets. It
just has such a nice clean format. here's a simple app:

# source generated by foxGUIb 1.0.0

class MainWindow
    def initialize( parent)
        construct_widget_tree( parent)
        init if respond_to? 'init'
    end

    def construct_widget_tree( parent)
        @topwin=
        FX::MainWindow.new(parent){|w|
            @MainWindow=w
            w.wdg_name='MainWindow'
            w.backColor=Fox::FXRGBA(212,208,200,255)
            w.width=216
            w.hSpacing=0
            w.shown=true
            w.y=167
            w.height=218
            w.title="MainWindow"
            w.vSpacing=0
            w.x=262
            FX::VerticalFrame.new(@MainWindow){|w|
                @VerticalFrame=w
                w.wdg_name='VerticalFrame'
                w.baseColor=Fox::FXRGBA(212,208,200,255)
                w.backColor=Fox::FXRGBA(212,208,200,255)
                w.width=216
                w.height=218
                w.shadowColor=Fox::FXRGBA(139,137,132,255)
                FX::Button.new(@VerticalFrame){|w|
                    @Button=w
                    w.wdg_name='Button'
                    w.baseColor=Fox::FXRGBA(212,208,200,255)
                    w.text="click to see what happens!"
                    w.backColor=Fox::FXRGBA(212,208,200,255)

w.font=FX::Font.new.from_s('Sans|90|0|0|0|0|0').to_FXFont
                    w.width=153
                    w.height=23
                    w.shadowColor=Fox::FXRGBA(139,137,132,255)
                    @Button.connect(Fox::SEL_LEFTBUTTONRELEASE){
                        @Text.appendText "lmb up\n"
                        0 # this prevents fox from blocking the builtin
event handler for leftbuttonpress
                    }
                    @Button.connect(Fox::SEL_LEFTBUTTONPRESS){
                        @Text.appendText "lmb down\n"
                        0 # this prevents fox from blocking the builtin
event handler for leftbuttonpress
                    }
                    @Button.connect(Fox::SEL_COMMAND){
                        @Text.appendText "click!\n"
                    }
                }
                FX::Text.new(@VerticalFrame){|w|
                    @Text=w
                    w.wdg_name='Text'

w.font=FX::Font.new.from_s('Sans|90|0|0|0|0|0').to_FXFont
                    w.width=216
                    w.selBackColor=Fox::FXRGBA(10,36,106,255)
                    w.y=23
                    w.height=195
                }
            }
        }
    end
    attr_reader :topwin
    attr_reader :MainWindow
    attr_reader :VerticalFrame
    attr_reader :Button
    attr_reader :Text
end

#unit test
if __FILE__==$0
    require 'libGUIb16'
    app=FX::App.new
    w=MainWindow.new app
    w.topwin.show(Fox::PLACEMENT_SCREEN)
    app.create
    app.run
end

notice require 'libGUIb16' and then it uses 'fox16' or 'fox14' in its'
system.
I'm amazed at the size of the GUI builder app. Nothing large like Glade or
IronRuby.

On 3/3/10, Stuart Clarke <stuart_clarke86 at yahoo.com> wrote:
>
> See code below, many thanks:
>
> require 'fox16'
> include Fox
>
> require "find"
> require "fileutils"
>
> class ScriptGui < FXMainWindow #SUBCLASS FOR CREATING A WINDOW, CONTAINS
> ALL THE CUSTOMISATION INFORMATION
>   def initialize(app)
>     super(app, "Script", :width => 700, :height => 200)
>     frame = FXVerticalFrame.new(self, LAYOUT_LEFT|LAYOUT_FILL_X)
>     #FRAMES FOR INPUT
>     frame1 = FXHorizontalFrame.new(frame,
> LAYOUT_SIDE_TOP|FRAME_NONE|LAYOUT_FILL_X|LAYOUT_FILL_Y)
>
>
>     inputFileA = FXButton.new(frame1, "Input File")
>     inputFileA.connect(SEL_COMMAND) do
>         #the connect will ensure the following block is performed
>       dialog = FXFileDialog.new(self, "Select file")
>       dialog.patternList = ["Text Files (*.txt)", "All Files (*)"]
>  #recognised file types
>       dialog.selectMode = SELECTFILE_EXISTING
>        #select a file
>       if dialog.execute != 0
>                     #display the box and wait fot user response
>         @aInput.text = dialog.filename
>                 #if the user selects a file it write it in inputfield
>       end
>     end
>     @aInput = FXTextField.new(frame1, 90, :opts =>
> JUSTIFY_LEFT|FRAME_SUNKEN|FRAME_THICK)
>
>     FXHorizontalSeparator.new(frame, :opts =>
> LAYOUT_FILL_X|SEPARATOR_GROOVE)
>
>     buttonCode = FXButton.new(frame, "Run").connect(SEL_COMMAND,
> method(:matcher))                         #call method matcher to commence
> process
>   end
>
>   def matcher(sender, sel, ptr)
>     #set up hash for itemC and doc ID
>     @hashMapping = Hash.new {|h,k| h[k] = []}
>
>     #process loadfile to capture doc ID's & itemC values.
>     IO.foreach(@aInput.to_s) do |data|
>             #go through the input concordance loadfile
>       fields = data.split(" ")
>                 #split the field on this
>       itemA =  fields[13].delete("þ").downcase
>
>       itemB = fields[0].delete("þ,\"")
>
>       itemC = fields[35].delete("þ,\"")
>
>       if itemA.to_s.downcase == "pdf"
>         @hashMapping[itemC] << itemB
>
>     end
>     end
>
>     Find.find(@aInput.to_s) do |curPath2|
>
>       if File.file?(curPath2) and curPath2[/\.txt$/]
>         itemCFN = File.basename(curPath2, ".txt").strip.to_s.downcase
>    #grabs the file name stripping whitespace
>         finditemC(curPath2, itemCFN)
>
>       end
>     end
>   end
>
>   def finditemC(curPath2, itemCFN)
>
>     @hashMapping.each do |itemDetail|
>       @entryArray = []
>
>       entry = itemDetail.to_s.strip
>
>       @entryArray << itemDetail.to_s.strip
>
>       if entry.match(/#{itemCFN}/)
>
>         puts itemCFN
>       end
>     end
>   end
>
>   def create
>     super
>       show(PLACEMENT_SCREEN)
>             #SHOW THE GUI ON THE SCREEN
>     end
>   end
>
> #CONSTRUCTOR
> if __FILE__ == $0
>   FXApp.new do |app|
>     ScriptGui.new(app)
>     app.create#CALLS THE METHOD CREATE TO ENSURE ALL NEEDED INFO IS ADDED
>     app.run#STARTS THE CREATION OF THE WINDOWS
>   end
> end
>
> --- On *Tue, 2/3/10, Joey Kinsella <jkinsella at ancillaryservices.com>*wrote:
>
>
> From: Joey Kinsella <jkinsella at ancillaryservices.com>
> Subject: Re: [fxruby-users] Class with looping objects
> To: fxruby-users at rubyforge.org
> Date: Tuesday, 2 March, 2010, 13:58
>
> It would be much easier to help you if we could see at least example code
> (similar to what your doing.)
> However, the error you displayed below tells me your doing something
> incorrectly. Are you sure self.close() is really what you want to do?
> Perhaps you should try self.hide()/self.show(). I don't know, without actual
> code it's hard to tell what you are trying to do. But I hope this helps.
>
> On Tue, Mar 2, 2010 at 4:34 AM, Stuart Clarke <stuart_clarke86 at yahoo.com<http://mc/compose?to=stuart_clarke86@yahoo.com>
> > wrote:
>
>>  Hi,
>>
>> Thanks for your reply.
>>
>> I have tried this previously and I get the following error:
>>
>> C:/Ruby/lib/ruby/gems/1.8/gems/fxruby-1.6.16-x86-mswin32-60/lib/fox16/aliases.rb:4812:in
>> `getText': This FXTextField * already released (RuntimeError)
>>
>> Code is:
>>
>>   buttonCode = FXButton.new(frame, "Run").connect(SEL_COMMAND,
>> method(:matcher))
>> end
>> def matcher(sender, sel, ptr)
>>    self.close(true)
>> #....
>>
>> Just to clarify, when matcher runs, it does
>>
>> Matcher object - get first item and call object2
>> Object2 does stuff and then we go back to object matcher and get the next
>> item
>> This loop continues until all items have been through both objects then
>> once finished the run button pops up again and the processing is done, at
>> this point I want a GUI.
>>
>> Thanks a lot
>>
>> Stuart
>>
>>
>> --- On *Mon, 1/3/10, Joey Kinsella <jkinsella at ancillaryservices.com<http://mc/compose?to=jkinsella@ancillaryservices.com>
>> >* wrote:
>>
>>
>> From: Joey Kinsella <jkinsella at ancillaryservices.com<http://mc/compose?to=jkinsella@ancillaryservices.com>
>> >
>> Subject: Re: [fxruby-users] Class with looping objects
>>
>> To: fxruby-users at rubyforge.org<http://mc/compose?to=fxruby-users@rubyforge.org>
>> Date: Monday, 1 March, 2010, 14:43
>>
>> Couldn't you just do:
>>
>> def initialize
>>   # ...
>>   button = FXButton.new(frame, "Run").connect(SEL_COMMAND,
>> method(:matcher))
>>   # ...
>> end
>>
>> def matcher(sender, selector, data)
>>   # ...
>>   self.close # (true) # if you want to notify the messaging system.
>> end
>>
>> or well, something along those lines.. button is a reference to an
>> FXButton object, It should never equal SEL_KEYRELEASE in this respect. Also
>> the code above is assuming that it's an object which extends FXMainWindow.
>>
>> Hope this helps,
>> -Joey
>>
>> On Mon, Mar 1, 2010 at 6:09 AM, Stuart Clarke <stuart_clarke86 at yahoo.com<http://mc/compose?to=stuart_clarke86@yahoo.com>
>> > wrote:
>>
>>> Hi,
>>>
>>> I have a GUI which triggers an object to do some stuff, when you press
>>> the FXButton it calls matcher e.g.
>>>
>>> button = FXButton.new(frame, "Run").connect(SEL_COMMAND,
>>> method(:matcher))
>>>
>>> This button remains in a pressed state until the object has finished
>>> running, when it is complete the button pops back up. I am trying to add a
>>> popup box to respond to the button popping up (or processing finished) like
>>> so:
>>>
>>> if button == SEL_KEYRELEASE
>>>   FXMessageBox.information(self, MBOX_OK, "Complete")
>>>   mainwindow.close
>>> end
>>>
>>> This however does not work, any ideas how I can acheive this?
>>>
>>> Many thanks
>>>
>>> --- On *Fri, 26/2/10, Stuart Clarke <stuart_clarke86 at yahoo.com<http://mc/compose?to=stuart_clarke86@yahoo.com>
>>> >* wrote:
>>>
>>>
>>> From: Stuart Clarke <stuart_clarke86 at yahoo.com<http://mc/compose?to=stuart_clarke86@yahoo.com>
>>> >
>>> Subject: [fxruby-users] Class with looping objects
>>> To: fxruby-users at rubyforge.org<http://mc/compose?to=fxruby-users@rubyforge.org>
>>> Date: Friday, 26 February, 2010, 19:38
>>>
>>>
>>> Hi all,
>>>
>>> Apologies if this is a stupid question but it is getting the best of me.
>>>
>>> I have a class which contains a GUI object which has serveral text fields
>>> and buttons which when used trigger the use of further objects which all
>>> loop through data, the structure is as follows:
>>>
>>> class
>>> def GUI
>>> GUI calls object1
>>> end
>>> def object1 loops through some data one entry at a time and for each
>>> entry passes to a new object
>>> end
>>> def object2 loops through passed data and does stuff
>>> end
>>> then the next bit of data does the same thing in object1
>>>
>>>
>>> What I need is a gui that pops up when my script runs through all of
>>> objects for each bit of data. Any ideas? I just need to know when the loop
>>> is complete, at present I press the go button on my fx GUI and it stays
>>> pressed in until all processing is done then pops back out. At this point I
>>> need a Gui.
>>>
>>> I hope this makes sense,
>>>
>>> Many thanks
>>>
>>>
>>>
>>> _______________________________________________
>>> fxruby-users mailing list
>>> fxruby-users at rubyforge.org<http://mc/compose?to=fxruby-users@rubyforge.org>
>>> http://rubyforge.org/mailman/listinfo/fxruby-users
>>>
>>>
>>>
>>> _______________________________________________
>>> fxruby-users mailing list
>>> fxruby-users at rubyforge.org<http://mc/compose?to=fxruby-users@rubyforge.org>
>>> http://rubyforge.org/mailman/listinfo/fxruby-users
>>>
>>
>> --
>> If you are not the intended recipient, you are hereby notified
>> that any dissemination, distribution, copying or other use of
>> this communication is strictly prohibited.  If you have
>> received this communication in error, please notify us
>> immediately.
>>
>>
>> -----Inline Attachment Follows-----
>>
>>
>> _______________________________________________
>> fxruby-users mailing list
>> fxruby-users at rubyforge.org<http://mc/compose?to=fxruby-users@rubyforge.org>
>> http://rubyforge.org/mailman/listinfo/fxruby-users
>>
>>
>>
>> _______________________________________________
>> fxruby-users mailing list
>> fxruby-users at rubyforge.org<http://mc/compose?to=fxruby-users@rubyforge.org>
>> http://rubyforge.org/mailman/listinfo/fxruby-users
>>
>
> --
> If you are not the intended recipient, you are hereby notified
> that any dissemination, distribution, copying or other use of
> this communication is strictly prohibited.  If you have
> received this communication in error, please notify us
> immediately.
>
>
> -----Inline Attachment Follows-----
>
> _______________________________________________
> fxruby-users mailing list
> fxruby-users at rubyforge.org<http://mc/compose?to=fxruby-users@rubyforge.org>
> http://rubyforge.org/mailman/listinfo/fxruby-users
>
>
>
> _______________________________________________
> fxruby-users mailing list
> fxruby-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/fxruby-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://rubyforge.org/pipermail/fxruby-users/attachments/20100303/cde6d487/attachment-0001.html>


More information about the fxruby-users mailing list