Hi Georges, may you add the attached patch to the current Debian package. It fixes the bug reported by Karsten as well as a second minor bug in the Perl code generator.
Yes, the fix isn't in a release version yet. The fix is in the stable branch of wxGlade. You can download the stable version of wxGlade always from Bitbucket (https://bitbucket.org/agriggio/wxglade/downloads#branch-downloads) and execute it directly. Regards, Carsten Karsten Hilbert schrieb am 02.05.2016: > Hi Carsten, > > > this bug is already fixed in the stable branch of wxGlade 0.7.2 with > > changeset 62797578d6d2 "Fix PyDeadObject errors and crashes during > > cut and paste". > > Great ! You mean in an unreleased version thereof ? Because: > > wxglade: > Installiert: 0.7.2-1 > Installationskandidat: 0.7.2-1 > Versionstabelle: > *** 0.7.2-1 990 > 990 ftp://ftp.de.debian.org/debian stretch/main i386 > Packages 500 ftp://ftp.de.debian.org/debian unstable/main i386 > Packages 100 /var/lib/dpkg/status > > > You have three different possibibilties to report wxGlade bugs: > > - send bug reports to the mailing list, > > - file a ticket on Sourceforge > > or > > - send email to my private email address. > > I should've done as I used to do -- email you directly. > > Anyway, no harm done. > > Karsten
diff --git a/NEWS.txt b/NEWS.txt --- a/NEWS.txt +++ b/NEWS.txt @@ -25,6 +25,9 @@ Bugs: - Fix generated code for wxDatePickerCtrl - Add workaround for missing wxDefaultDateTime in wxPerl - Fix missing icons in release packages + - Fix PyDeadObject errors and crashes during cut and paste + - System colour constants named incorrectly in Perl (sf bug #184, + Thanks to Sue D. Nymme) Deprecation - In place modifications for generated source files will be removed in one diff --git a/README.SF.md b/README.SF.md --- a/README.SF.md +++ b/README.SF.md @@ -26,8 +26,8 @@ Files MD5 checksums ------------- b13cdf9eff9857f6f07f1bd6bf50348a wxGlade-0.7.2-setup.exe - 81d3270ba1c764d482b0fed00c6f9c59 wxGlade-0.7.2.tar.gz - 69885a306f694222655fe63d3443191b wxGlade-0.7.2.zip + 16395cd62adba4b53da371fe59707a33 wxGlade-0.7.2.tar.gz + 61ca7513da4913045854c1b0a62a04a3 wxGlade-0.7.2.zip e57843ad4d0cb6bf1fc2aab7c46aaa73 wxGlade-SAE-0.7.2-setup.exe diff --git a/edit_sizers/edit_sizers.py b/edit_sizers/edit_sizers.py --- a/edit_sizers/edit_sizers.py +++ b/edit_sizers/edit_sizers.py @@ -372,9 +372,12 @@ class SizerSlot(object): self.menu.AppendSeparator() misc.append_item(self.menu, PREVIEW_ID, _('Preview')) - wx.EVT_MENU(self.widget, REMOVE_ID, self.remove) - wx.EVT_MENU(self.widget, PASTE_ID, self.clipboard_paste) - wx.EVT_MENU(self.widget, PREVIEW_ID, self.preview_parent) + def bind(method): + return lambda e: wx.CallAfter(method) + + wx.EVT_MENU(self.widget, REMOVE_ID, bind(self.remove)) + wx.EVT_MENU(self.widget, PASTE_ID, bind(self.clipboard_paste)) + wx.EVT_MENU(self.widget, PREVIEW_ID, bind(self.preview_parent)) def remove(self, *args): if not self.sizer.is_virtual(): @@ -409,9 +412,12 @@ class SizerSlot(object): @see: L{clipboard.paste()} """ + if self.widget: + self.widget.Hide() if clipboard.paste(self.parent, self.sizer, self.pos): common.app_tree.app.saved = False - self.widget.Hide() + else: + self.widget.Show() def on_select_and_paste(self, *args): """\ @@ -422,11 +428,11 @@ class SizerSlot(object): self.widget.SetFocus() self.clipboard_paste() - def delete(self, delete_widget=True): + def delete(self): if misc.currently_under_mouse is self.widget: misc.currently_under_mouse = None - if delete_widget and self.widget: + if self.widget: self.widget.Hide() # unbind events to prevent new created (and queued) events @@ -1182,7 +1188,7 @@ class SizerBase(Sizer): try: old_child = self.children[pos] if isinstance(old_child.item, SizerSlot): - old_child.item.delete(False) + old_child.item.delete() self.children[pos] = SizerItem(item, pos, option, flag, border, size) except IndexError: # this shouldn't happen! diff --git a/tests/casefiles/bug184.cpp b/tests/casefiles/bug184.cpp new file mode 100755 --- /dev/null +++ b/tests/casefiles/bug184.cpp @@ -0,0 +1,74 @@ +// -*- C++ -*- +// +// generated by wxGlade f5bfb036bf72 on Fri Apr 22 21:37:27 2016 +// +// Example for compiling a single file project under Linux using g++: +// g++ MyApp.cpp $(wx-config --libs) $(wx-config --cxxflags) -o MyApp +// +// Example for compiling a multi file project under Linux using g++: +// g++ main.cpp $(wx-config --libs) $(wx-config --cxxflags) -o MyApp Dialog1.cpp Frame1.cpp +// + +#include "bug184.h" + +// begin wxGlade: ::extracode +// end wxGlade + + + +Bug184_Frame::Bug184_Frame(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style): + wxFrame(parent, id, title, pos, size, style) +{ + // begin wxGlade: Bug184_Frame::Bug184_Frame + label_1 = new wxStaticText(this, wxID_ANY, _("Just a label")); + + set_properties(); + do_layout(); + // end wxGlade +} + + +void Bug184_Frame::set_properties() +{ + // begin wxGlade: Bug184_Frame::set_properties + SetTitle(_("frame_1")); + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BACKGROUND)); + // end wxGlade +} + + +void Bug184_Frame::do_layout() +{ + // begin wxGlade: Bug184_Frame::do_layout + wxBoxSizer* sizer_1 = new wxBoxSizer(wxVERTICAL); + sizer_1->Add(label_1, 1, wxALIGN_CENTER|wxALL|wxEXPAND, 5); + SetSizer(sizer_1); + sizer_1->Fit(this); + Layout(); + // end wxGlade +} + + +class MyApp: public wxApp { +public: + bool OnInit(); +protected: + wxLocale m_locale; // locale we'll be using +}; + +IMPLEMENT_APP(MyApp) + +bool MyApp::OnInit() +{ + m_locale.Init(); +#ifdef APP_LOCALE_DIR + m_locale.AddCatalogLookupPathPrefix(wxT(APP_LOCALE_DIR)); +#endif + m_locale.AddCatalog(wxT(APP_CATALOG)); + + wxInitAllImageHandlers(); + Bug184_Frame* Frame184 = new Bug184_Frame(NULL, wxID_ANY, wxEmptyString); + SetTopWindow(Frame184); + Frame184->Show(); + return true; +} diff --git a/tests/casefiles/bug184.h b/tests/casefiles/bug184.h new file mode 100755 --- /dev/null +++ b/tests/casefiles/bug184.h @@ -0,0 +1,51 @@ +// -*- C++ -*- +// +// generated by wxGlade f5bfb036bf72 on Fri Apr 22 21:37:27 2016 +// +// Example for compiling a single file project under Linux using g++: +// g++ MyApp.cpp $(wx-config --libs) $(wx-config --cxxflags) -o MyApp +// +// Example for compiling a multi file project under Linux using g++: +// g++ main.cpp $(wx-config --libs) $(wx-config --cxxflags) -o MyApp Dialog1.cpp Frame1.cpp +// + +#ifndef BUG184_H +#define BUG184_H + +#include <wx/wx.h> +#include <wx/image.h> +#include <wx/intl.h> + +#ifndef APP_CATALOG +#define APP_CATALOG "app" // replace with the appropriate catalog name +#endif + + +// begin wxGlade: ::dependencies +// end wxGlade + +// begin wxGlade: ::extracode +// end wxGlade + + +class Bug184_Frame: public wxFrame { +public: + // begin wxGlade: Bug184_Frame::ids + // end wxGlade + + Bug184_Frame(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_FRAME_STYLE); + +private: + // begin wxGlade: Bug184_Frame::methods + void set_properties(); + void do_layout(); + // end wxGlade + +protected: + // begin wxGlade: Bug184_Frame::attributes + wxStaticText* label_1; + // end wxGlade +}; // wxGlade: end class + + +#endif // BUG184_H diff --git a/tests/casefiles/bug184.lisp b/tests/casefiles/bug184.lisp new file mode 100755 --- /dev/null +++ b/tests/casefiles/bug184.lisp @@ -0,0 +1,79 @@ +#!/usr/bin/env lisp +;;; +;;; generated by wxGlade edb3dab3dd59+ on Sat Apr 23 17:23:16 2016 +;;; + +(asdf:operate 'asdf:load-op 'wxcl) +(use-package "FFI") +(ffi:default-foreign-language :stdc) + + +;;; begin wxGlade: dependencies +(use-package :wxCL) +(use-package :wxColour) +(use-package :wxEvent) +(use-package :wxEvtHandler) +(use-package :wxFrame) +(use-package :wxSizer) +(use-package :wxStaticText) +(use-package :wxWindow) +(use-package :wx_main) +(use-package :wx_wrapper) +;;; end wxGlade + +;;; begin wxGlade: extracode +;;; end wxGlade + + +(defclass Bug184_Frame() + ((top-window :initform nil :accessor slot-top-window) + (label-1 :initform nil :accessor slot-label-1) + (sizer-1 :initform nil :accessor slot-sizer-1))) + +(defun make-Bug184_Frame () + (let ((obj (make-instance 'Bug184_Frame))) + (init obj) + (set-properties obj) + (do-layout obj) + obj)) + +(defmethod init ((obj Bug184_Frame)) +"Method creates the objects contained in the class." + ;;; begin wxGlade: Bug184_Frame.__init__ + (setf (slot-label-1 obj) (wxStaticText_Create (slot-top-window obj) wxID_ANY (_"Just a label") -1 -1 -1 -1 0)) + ;;; end wxGlade + ) + +(defmethod set-properties ((obj Bug184_Frame)) + ;;; begin wxGlade: Bug184_Frame.__set_properties + (wxFrame_SetTitle (slot-top-window obj) (_"frame_1")) + (wxWindow_SetBackgroundColour (slot-top-window obj) (wxSystemSettings_GetColour wxSYS_COLOUR_BACKGROUND)) + ;;; end wxGlade + ) + +(defmethod do-layout ((obj Bug184_Frame)) + ;;; begin wxGlade: Bug184_Frame.__do_layout + (setf (slot-sizer-1 obj) (wxBoxSizer_Create wxVERTICAL)) + (wxSizer_AddWindow (slot-sizer-1 obj) (slot-label-1 obj) 1 (logior wxALIGN_CENTER wxALL wxEXPAND) 5 nil) + (wxWindow_SetSizer (slot-top-window obj) (slot-sizer-1 obj)) + (wxSizer_Fit (slot-sizer-1 obj) (slot-top-window obj)) + (wxFrame_layout (slot-Frame184 self)) + ;;; end wxGlade + ) + +;;; end of class Bug184_Frame + + +(defun init-func (fun data evt) + (let ((Frame184 (make-Bug184_Frame))) + (ELJApp_SetTopWindow (slot-top-window Frame184)) + (wxWindow_Show (slot-top-window Frame184)))) +;;; end of class MyApp + + (setf (textdomain) "app") ;; replace with the appropriate catalog name + (defun _ (msgid) (gettext msgid "app")) + + +(unwind-protect + (Eljapp_initializeC (wxclosure_Create #'init-func nil) 0 nil) + (ffi:close-foreign-library "../miscellaneous/wxc-msw2.6.2.dll")) diff --git a/tests/casefiles/bug184.pl b/tests/casefiles/bug184.pl new file mode 100755 --- /dev/null +++ b/tests/casefiles/bug184.pl @@ -0,0 +1,96 @@ +#!/usr/bin/perl -w -- +# +# generated by wxGlade f5bfb036bf72 on Fri Apr 22 21:35:44 2016 +# +# To get wxPerl visit http://www.wxperl.it +# + +use Wx 0.15 qw[:allclasses]; +use strict; + +# begin wxGlade: dependencies +# end wxGlade + +# begin wxGlade: extracode +# end wxGlade + +package Bug184_Frame; + +use Wx qw[:everything]; +use base qw(Wx::Frame); +use strict; + +use Wx::Locale gettext => '_T'; +sub new { + my( $self, $parent, $id, $title, $pos, $size, $style, $name ) = @_; + $parent = undef unless defined $parent; + $id = -1 unless defined $id; + $title = "" unless defined $title; + $pos = wxDefaultPosition unless defined $pos; + $size = wxDefaultSize unless defined $size; + $name = "" unless defined $name; + + # begin wxGlade: Bug184_Frame::new + $self = $self->SUPER::new( $parent, $id, $title, $pos, $size, $style, $name ); + $self->{label_1} = Wx::StaticText->new($self, wxID_ANY, _T("Just a label")); + + $self->__set_properties(); + $self->__do_layout(); + + # end wxGlade + return $self; + +} + + +sub __set_properties { + my $self = shift; + # begin wxGlade: Bug184_Frame::__set_properties + $self->SetTitle(_T("frame_1")); + $self->SetBackgroundColour(Wx::SystemSettings::GetColour(wxSYS_COLOUR_BACKGROUND)); + # end wxGlade +} + +sub __do_layout { + my $self = shift; + # begin wxGlade: Bug184_Frame::__do_layout + $self->{sizer_1} = Wx::BoxSizer->new(wxVERTICAL); + $self->{sizer_1}->Add($self->{label_1}, 1, wxALIGN_CENTER|wxALL|wxEXPAND, 5); + $self->SetSizer($self->{sizer_1}); + $self->{sizer_1}->Fit($self); + $self->Layout(); + # end wxGlade +} + +# end of class Bug184_Frame + +1; + +package MyApp; + +use base qw(Wx::App); +use strict; + +sub OnInit { + my( $self ) = shift; + + Wx::InitAllImageHandlers(); + + my $Frame184 = Bug184_Frame->new(); + + $self->SetTopWindow($Frame184); + $Frame184->Show(1); + + return 1; +} +# end of class MyApp + +package main; + +unless(caller){ + my $local = Wx::Locale->new("English", "en", "en"); # replace with ?? + $local->AddCatalog("app"); # replace with the appropriate catalog name + + my $app = MyApp->new(); + $app->MainLoop(); +} diff --git a/tests/casefiles/bug184.py b/tests/casefiles/bug184.py new file mode 100755 --- /dev/null +++ b/tests/casefiles/bug184.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- +# +# generated by wxGlade f5bfb036bf72 on Fri Apr 22 21:37:33 2016 +# + +import wx + +# begin wxGlade: dependencies +import gettext +# end wxGlade + +# begin wxGlade: extracode +# end wxGlade + + +class Bug184_Frame(wx.Frame): + def __init__(self, *args, **kwds): + # begin wxGlade: Bug184_Frame.__init__ + wx.Frame.__init__(self, *args, **kwds) + self.label_1 = wx.StaticText(self, wx.ID_ANY, _("Just a label")) + + self.__set_properties() + self.__do_layout() + # end wxGlade + + def __set_properties(self): + # begin wxGlade: Bug184_Frame.__set_properties + self.SetTitle(_("frame_1")) + self.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_BACKGROUND)) + # end wxGlade + + def __do_layout(self): + # begin wxGlade: Bug184_Frame.__do_layout + sizer_1 = wx.BoxSizer(wx.VERTICAL) + sizer_1.Add(self.label_1, 1, wx.ALIGN_CENTER | wx.ALL | wx.EXPAND, 5) + self.SetSizer(sizer_1) + sizer_1.Fit(self) + self.Layout() + # end wxGlade + +# end of class Bug184_Frame +class MyApp(wx.App): + def OnInit(self): + Frame184 = Bug184_Frame(None, wx.ID_ANY, "") + self.SetTopWindow(Frame184) + Frame184.Show() + return True + +# end of class MyApp + +if __name__ == "__main__": + gettext.install("app") # replace with the appropriate catalog name + + app = MyApp(0) + app.MainLoop() \ No newline at end of file diff --git a/tests/casefiles/bug184.wxg b/tests/casefiles/bug184.wxg new file mode 100644 --- /dev/null +++ b/tests/casefiles/bug184.wxg @@ -0,0 +1,21 @@ +<?xml version="1.0"?> +<!-- generated by wxGlade edb3dab3dd59+ on Sat Apr 23 17:23:26 2016 --> + +<application class="MyApp" encoding="UTF-8" for_version="2.8" header_extension=".h" indent_amount="4" indent_symbol="space" is_template="0" language="perl" name="app" option="0" overwrite="1" path="/home/carsten/Projekte.cvs/wxglade/tests/casefiles/bug184.pl" source_extension=".cpp" top_window="Frame184" use_gettext="1" use_new_namespace="1"> + <object class="Bug184_Frame" name="Frame184" base="EditFrame"> + <title>frame_1</title> + <background>wxSYS_COLOUR_BACKGROUND</background> + <object class="wxBoxSizer" name="sizer_1" base="EditBoxSizer"> + <orient>wxVERTICAL</orient> + <object class="sizeritem"> + <flag>wxALL|wxEXPAND|wxALIGN_CENTER</flag> + <border>5</border> + <option>1</option> + <object class="wxStaticText" name="label_1" base="EditStaticText"> + <attribute>1</attribute> + <label>Just a label</label> + </object> + </object> + </object> + </object> +</application> diff --git a/tests/casefiles/bug184.xrc b/tests/casefiles/bug184.xrc new file mode 100644 --- /dev/null +++ b/tests/casefiles/bug184.xrc @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- generated by wxGlade f5bfb036bf72 on Fri Apr 22 21:37:31 2016 --> + +<resource version="2.3.0.1"> + <object class="wxFrame" name="Frame184" subclass="Bug184_Frame"> + <title>frame_1</title> + <object class="wxBoxSizer"> + <orient>wxVERTICAL</orient> + <object class="sizeritem"> + <option>1</option> + <flag>wxALIGN_CENTER|wxALL|wxEXPAND</flag> + <border>5</border> + <object class="wxStaticText" name="label_1"> + <label>Just a label</label> + </object> + </object> + </object> + </object> +</resource> diff --git a/tests/test_bugs.py b/tests/test_bugs.py --- a/tests/test_bugs.py +++ b/tests/test_bugs.py @@ -75,3 +75,12 @@ class TestCodeGen(WXGladeBaseTest): self._compare(result_app, generated_app, app_filename) self._compare(result_frame_cpp, generated_frame_cpp , 'Bug179_Frame.c++') self._compare(result_frame_h, generated_frame_h, 'Bug179_Frame.hpp') + + def test_bug184(self): + """\ + Test bug #184 - Perl code generation: System colour constants named + incorrectly. + + That's the test case for SF bug #184. + """ + self._test_all('bug184') \ No newline at end of file diff --git a/wcodegen/__init__.py b/wcodegen/__init__.py --- a/wcodegen/__init__.py +++ b/wcodegen/__init__.py @@ -295,6 +295,7 @@ class PerlMixin(BaseLanguageMixin): name.startswith('wxSPLASH_') or \ name.startswith('wxST_') or \ name.startswith('wxSys_') or \ + name.startswith('wxSYS_COLOUR_') or \ name.startswith('wxSW_') or \ name.startswith('wxSASH_') or \ name.startswith('wxTB_') or \ diff --git a/wxglade b/wxglade --- a/wxglade +++ b/wxglade @@ -44,7 +44,6 @@ for INTERPRETER in $INTERPRETER_LIST; do break done - if [ ! "$PYTHON_BIN" ]; then echo "ERROR: No interpreter for Python 2 found!" echo " Please install Python 2 to run wxGlade!" @@ -71,7 +70,7 @@ for DIR in \ "${CURR_DIR}/../lib/python${PY_VERSION}/dist-packages/wxglade" \ ; do BINARY="${DIR}/wxglade.py" - if [ -x "${BINARY}" ]; then + if [ -e "${BINARY}" ]; then WXG_BINARY="$BINARY" break fi
pgp_rHvyx1axD.pgp
Description: Digitale Signatur von OpenPGP