develooper Front page | perl.wxperl.users | Postings from February 2012

Re: [Fwd: wx::dialog and movexy broken?]

Thread Previous | Thread Next
From:
Mark Dootson
Date:
February 9, 2012 01:10
Subject:
Re: [Fwd: wx::dialog and movexy broken?]
Message ID:
4F338D40.8090204@znix.com
Hi,

Looks like a potential bug in wxWidgets / GTK interaction.

It appears that showing and moving a dialog in GTK causes a few extra 
things to happen - including repositioning the dialog with respect to 
the parent window if necessary. (code it would seem checks for changed 
parent position and dialog coordinates to see if some movement is 
necessary, amongst other things).

I have pasted a 'workaround' below which should allow you to use 
Wx::Dialog in this way. You must call 'Show' before 'Move' as 'Show' 
will reposition the dialog with respect to the parent. You must call 
'Move' twice to ensure the internal code does not 'skip' the process by 
assuming a move is not necessary.

I think folks don't hit this bug very often because conceptually a 
Dialog isn't something you would keep hidden and re-show. In most usage 
you would get the user info and destroy the object. You would only have 
a non-modal dialog if you wanted to continue background processing 
whilst asking some questions.

For other top level windows where you don't want or need Wx::Dialog 
features, better to use a Wx::Frame as a base class.

Hope it helps.

Mark


sub ButtonClicked
{
my( $self, $event ) = @_;

if($self->{dialog_state}==0){
     $self->{dialog}->Show(1);
	$self->{dialog}->MoveXY(99,99);
	$self->{dialog}->MoveXY(100,100);
	$self->{dialog_state}=1;
}
else{
	$self->{dialog}->Show(0);
	$self->{dialog_state}=0;
}

}



On 08/02/2012 22:39, jeff wrote:
> One slight correction. That code on ~line 50 should be Movexy(100,100) -
> some folks might be use to seeing MoveXY, but both work and display the
> same odd behavior.
>
>
> -------- Forwarded Message --------
>
> Have some odd behavior here.
> Here is a test simple script. It simple opens and closes a non modal
> dialog by click a button on the main window.
>
> On the 1st click it will open the dialog at the requested location.
> Click the button a 2nd time and it will close.
> Click it a 3rd time and it will center on parent - hiding  the main
> window.
> Move it aside.
> Click it a 4th time and it will close.
> Click it a 5th time and it will open at the requested location.
> And on and on., alternating between the two positions.
>
> The line of interest is ~ line 50.
> Having this behavior in many locations in real code :-(
>
> Anyone have any ideas?   Hopefully we're just being stupid  ;-)
>
> Jeff
>
> ##################################### CUT HERE
> #################################
> use strict;
> use Wx;
> ###########################################################
> #
> # Extend the Frame class to our needs
> #
> package MyFrame;
>
> use Wx::Event qw( EVT_BUTTON );
> use Wx qw/:everything/;
>
> use base qw/Wx::Frame/; # Inherit from Wx::Frame
>
> sub new
> {
> my $class = shift;
>
> my $self = $class->SUPER::new(@_);  # call the superclass' constructor
>
> # Then define a Panel to put the button on
> my $panel = Wx::Panel->new( $self,  # parent
> -1      # id
> );
>
> my $BTNID = 1;  # store the id of the button in $BTNID
>
> $self->{btn} = Wx::Button->new(     $panel,             # parent
> $BTNID,             # ButtonID
> ">>>  Press me<<<", # label
> [50,50]             # position
> );
>
> EVT_BUTTON( $self,          # Object to bind to
> $BTNID,         # ButtonID
> \&ButtonClicked # Subroutine to execute
> );
>
> $self->{dialog} = Wx::Dialog->new($self, -1, "test dialog");
> $self->{dialog_state}=0;
>
> return $self;
> }
>
> sub ButtonClicked
> {
> my( $self, $event ) = @_;
>
> if($self->{dialog_state}==0){
> 	$self->{dialog}->MoveXY
>
> (100, 100);
> 	$self->{dialog}->Show(1);
> 	$self->{dialog_state}=1;
> }
> else{
> 	$self->{dialog}->Show(0);
> 	$self->{dialog_state}=0;
> }
> }
>
> ###########################################################
> #
> # Define our ButtonApp2 class that extends Wx::App
> #
> package ButtonApp2;
>
> use base qw(Wx::App);   # Inherit from Wx::App
>
> sub OnInit
> {
> my $self = shift;
> my $frame = MyFrame->new(   undef,         # Parent window
> -1,            # Window id
> 'Button interaction example', # Title
> [300,400],         # position X, Y
> [200, 150]     # size X, Y
> );
> $self->SetTopWindow($frame);    # Define the toplevel window
> $frame->Show(1);                # Show the frame
> }
>
> ###########################################################
> #
> # The main program
> #
> package main;
>
> my $wxobj = ButtonApp2->new(); # New ButtonApp application
> $wxobj->MainLoop;
>
>
>
>
> ______________________________________________________________________
> This email has been scanned by the Symantec Email Security.cloud service.
> For more information please visit http://www.symanteccloud.com
> ______________________________________________________________________
>
>


Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About