http://www.perlmonks.org?node_id=1013935


in reply to Tkx g_bind to menu on listbox only for selected row

There does not seem to be an obvious way of doing this. How will I go about solving the problem?

Seems to me a menu does that already :) anyway

my $index = $lb->nearest( $y) ; $lb->activate( $index );

Replies are listed 'Best First'.
Re^2: Tkx g_bind to menu on listbox only for selected row
by Anonymous Monk on Jan 18, 2013 at 01:43 UTC
    <motion>
Re^2: Tkx g_bind to menu on listbox only for selected row
by v4169sgr (Sexton) on Jan 18, 2013 at 08:28 UTC

    Thanks for the reply :) If I understand correctly, this code will select the row in the listbox nearest to the y coordinate of the event.

    I don't actually want to do that. What I want to do is only have the event trigger on mouseover the already selected row, and not the entire listbox. Does that make sense?

      I don't actually want to do that. What I want to do is only have the event trigger on mouseover the already selected row, and not the entire listbox. Does that make sense?

      sure, you have the nearest, just check to see if it is selected

        Thanks for the reply again. I've almost made it work. My problem now is that the y-coordinate returned gets interpreted by nearest() in a way that I don't expect: nearest() seems to expect a y-coordinate relative to the top of the listbox widget, but the y-coordinate given is actually the absolute, screen, coordinate.

        Here's my code snippet:

        $list->g_bind("<Motion>", [sub { my($x,$y) = @_; my @sel_list = $list->curselection(); my $on_target = 0; my $current_index = $list->nearest($y); print "y = " . $y . "current_index = " . $current_index . "\n"; # +test if (length($sel_list[0]) > 0) { my @sel_list_items = split(/ /,$sel_list[0]); if (scalar(@sel_list_items) > 1) { foreach my $sel_list_item (@sel_list_items) { print "sel_list_item = " . $sel_list_item . "\n"; # te +st if ($sel_list_item eq $current_index) { $on_target = 1; } } } } print "on_target = " . $on_target . "\n"; # test if ($on_target == 1) { $listmenu->g_tk___popup($x,$y) } }, Tkx::Ev("%X", "%Y")]);

        I can see that the current_index is always larger than I would expect it to be. Apologies if I am missing something simple!