module TkAutoPostMenu

Public Class Methods

extended(_widget) click to toggle source
# File lib/a-tkcommons.rb, line 2802
def self.extended(_widget)
  _widget.__initialize_posting(_widget)
end
included(_widget) click to toggle source
# File lib/a-tkcommons.rb, line 2806
def self.included(_widget)
  _widget.__initialize_posting(_widget)
end

Public Instance Methods

__initialize_posting(_widget=self) click to toggle source
# File lib/a-tkcommons.rb, line 2821
  def __initialize_posting(_widget=self)
    #    parent = TkWinfo.parent(_widget)
    #    parent.bind_append("Enter", proc{p "Enter parent"})
    #    parent.bind_append("Leave", proc{p "Leave parent"})

    chs = TkWinfo.children(_widget)
    hh = 22
    @last_post = nil
    @posting_on = true
    @event_posting_on = false
    @m_show = Hash.new
    chs.each{|ch|
      next if ch.kind_of?(String)
      ch.menu.bind_append("Map", proc{ @m_show[ch.menu] = true })
      ch.menu.bind_append("Unmap", proc{ @m_show[ch.menu] = false })
      ch.bind_append("Enter", proc{|x,y,rx,ry|
        if @posting_on
          if @last_post && @last_post != ch.menu
            @last_post.unpost
            @last_post=nil
          end
          if @last_clicked && @last_clicked != ch.menu
            @last_clicked.unpost
            @last_clicked = nil
          end
          
          ch.menu.post(x-rx,y-ry+hh)
          #just_posted = TkWinfo.containing(x, y+hh)

          chmenus = TkWinfo.children(ch)
          @last_menu_posted = chmenus[0]
          @last_menu_posted.set_focus

          @last_menu_posted.bind("Enter", proc{
            @last_menu_posted.bind("Leave", proc{
              if @posting_on
                @last_post.unpost if @last_post
                @last_post = nil
                @last_menu_posted.bind("Enter", proc{})
                @last_menu_posted.bind("Leave", proc{})
              end
            })
          })
          #@last_post = just_posted
        end

        #@last_post=ch.menu
      }, "%X %Y %x %y")
      ch.bind_append("Leave", proc{
        ch.configure("state"=>:normal, "relief"=>:flat)
        if @posting_on
          if @last_post
            _x = TkWinfo.x(@last_post)
            _y = TkWinfo.y(@last_post)
            ch.event_generate("KeyPress", :keysym=>"Escape")  if Tk.focus.kind_of?(TkMenu) &&  Tk.focus != ch.menu
            @last_post.post(_x,_y) if @last_clicked && @last_clicked == ch.menu
          end
          if @last_post!=ch.menu
            @last_post=ch.menu
          else
            @last_post=nil
          end
          if !Tk.focus.kind_of?(TkMenu)
            @last_post.unpost if @last_post
            @last_post=nil
          end
        end
      })
      ch.bind_append("1", proc{|x,y,rx,ry|
        @posting_on=true if @event_posting_on
        if @last_post && @last_post != ch.menu
          @last_post.unpost
       #   @last_post.bind_remove("1")
          @last_post = nil
        end
        @last_post=ch.menu #if ch.state == 'active'
        ch.configure('state'=>'normal')
        @last_clicked = ch.menu
        
#        ch.menu.bind_append("1", proc{|mx,my,mrx,mry|
#          if ch.menu.index("active").nil?
#            ch.menu.activate(ch.menu.index("@#{mry}"))
#          end
#        }, "%X %Y %x %y")
        
        #@last_post.unpost
        #@last_post.post(0,0)
        #@last_post.set_focus
        @posting_on=true  if @event_posting_on

      }, "%X %Y %x %y")

    }
    _widget.bind_append("Leave", proc{
      if @posting_on  && Tk.focus != @last_menu_posted
        @last_post.unpost if @last_post
        @last_post=nil
        @posting_on = false if @event_posting_on
      end
      TkAfter.new(1000,1, proc{
        one_post = false
        @m_show.each{|m,v|
          one_post = v
          break if v
        }
        @posting_on = one_post if @event_posting_on
      }).start
    })

  end
event_posting_off() click to toggle source
# File lib/a-tkcommons.rb, line 2815
def event_posting_off
  @event_posting_on = false
  @posting_on = true
end
event_posting_on() click to toggle source
# File lib/a-tkcommons.rb, line 2810
def event_posting_on
  @event_posting_on = true
  @posting_on = false
end