diff options
author | hikhvar | 2015-06-15 10:26:52 +0200 |
---|---|---|
committer | hikhvar | 2015-06-15 10:26:52 +0200 |
commit | 7120fe0a8a5da606b5f50f51475696c49a63b0c4 (patch) | |
tree | 16a2838a9e9304fd09c3aadd0eb00d766e2768ba | |
download | aur-7120fe0a8a5da606b5f50f51475696c49a63b0c4.tar.gz |
Initial copy from old aur
-rw-r--r-- | .SRCINFO | 22 | ||||
-rw-r--r-- | PKGBUILD | 52 | ||||
-rw-r--r-- | wxglade.install | 12 | ||||
-rw-r--r-- | wxglade.sh | 2 | ||||
-rw-r--r-- | wxglade_0.7.0+.diff | 770 |
5 files changed, 858 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO new file mode 100644 index 000000000000..f5e71d0e8ffd --- /dev/null +++ b/.SRCINFO @@ -0,0 +1,22 @@ +pkgbase = wxglade + pkgdesc = GUI designer for wxWidgets that can generate Python, C++, Perl, Lisp and XRC code + pkgver = 0.7.0 + pkgrel = 3 + url = http://wxglade.sourceforge.net/ + install = wxglade.install + arch = any + license = MIT + makedepends = python2 + makedepends = gendesk + makedepends = imagemagick + depends = wxpython + depends = desktop-file-utils + source = http://downloads.sourceforge.net/sourceforge/wxglade/wxGlade-0.7.0.tar.gz + source = wxglade.sh + source = wxglade_0.7.0+.diff + sha256sums = 0e7f8dc48bc0da606dad5d5c65188b62b90702e9807b988ff023b460c5fa2f99 + sha256sums = 4549c2034453475f06265fa1c845db3b4c006ab9b17d0386aecd2a276577a6e0 + sha256sums = e3de27c537f082c3df416a0f0e85b503200b0681c9e710669de49dd6a4b1370d + +pkgname = wxglade + diff --git a/PKGBUILD b/PKGBUILD new file mode 100644 index 000000000000..da7586a8bbec --- /dev/null +++ b/PKGBUILD @@ -0,0 +1,52 @@ +# Maintainer: Christoph Robbert <chrobbert@gmail.com> +# Contributor: Alexander Rødseth <rodseth@gmail.com> +# Contributor: Brad Fanella <bradfanella@archlinux.us> +# Contributor: jrutila +# Contributor: grimi <grimi@poczta.fm> +# Contributor: jht <stefano@inventati.org> + +pkgname=wxglade +pkgver=0.7.0 +pkgrel=3 +pkgdesc='GUI designer for wxWidgets that can generate Python, C++, Perl, Lisp and XRC code' +arch=('any') +license=('MIT') +url='http://wxglade.sourceforge.net/' +depends=('wxpython' 'desktop-file-utils') +makedepends=('python2' 'gendesk' 'imagemagick') +install="$pkgname.install" +source=("http://downloads.sourceforge.net/sourceforge/wxglade/wxGlade-$pkgver.tar.gz" + 'wxglade.sh' + 'wxglade_0.7.0+.diff') +sha256sums=('0e7f8dc48bc0da606dad5d5c65188b62b90702e9807b988ff023b460c5fa2f99' + '4549c2034453475f06265fa1c845db3b4c006ab9b17d0386aecd2a276577a6e0' + 'e3de27c537f082c3df416a0f0e85b503200b0681c9e710669de49dd6a4b1370d') + +prepare() { + gendesk -f -n --pkgname "$pkgname" --pkgdesc "$pkgdesc" --exec 'wxglade %F' \ + --name 'wxGlade' --mimetypes 'application/x-wxg' + convert "wxGlade-$pkgver/icons/icon.xpm" "$pkgname.png" +} + +package() { + mkdir -p "$pkgdir/usr/bin" "$pkgdir/usr/share/doc/wxGlade" + + patch -p1 -f -d "wxGlade-$pkgver" -i ../wxglade_0.7.0+.diff + install -Dm644 "wxGlade-$pkgver/docs/man/$pkgname.1" \ + "$pkgdir/usr/share/man/man1/$pkgname.1" + rm -rf "wxGlade-$pkgver/docs/man" + mv "wxGlade-$pkgver/docs/"* "$pkgdir/usr/share/doc/wxGlade/" + cp -R "wxGlade-$pkgver/" "$pkgdir/usr/share/wxGlade/" + + python2 -m compileall "$pkgdir/usr/share/wxGlade/" + + install -Dm755 "$srcdir/$pkgname.sh" "$pkgdir/usr/bin/$pkgname" + install -Dm644 "wxGlade-$pkgver/license.txt" \ + "$pkgdir/usr/share/licenses/$pkgname/license.txt" + install -Dm644 "$pkgname.png" \ + "$pkgdir/usr/share/pixmaps/$pkgname.png" + install -Dm644 "$pkgname.desktop" \ + "$pkgdir/usr/share/applications/$pkgname.desktop" +} + +# vim:set ts=2 sw=2 et: diff --git a/wxglade.install b/wxglade.install new file mode 100644 index 000000000000..88620003c2bc --- /dev/null +++ b/wxglade.install @@ -0,0 +1,12 @@ +post_install() { + update-desktop-database -q +} + +post_upgrade() { + post_install $1 +} + +post_remove() { + post_install $1 +} + diff --git a/wxglade.sh b/wxglade.sh new file mode 100644 index 000000000000..812fae31bb6a --- /dev/null +++ b/wxglade.sh @@ -0,0 +1,2 @@ +#!/bin/sh +python2 /usr/share/wxGlade/wxglade.py "$@" diff --git a/wxglade_0.7.0+.diff b/wxglade_0.7.0+.diff new file mode 100644 index 000000000000..4139105c59a1 --- /dev/null +++ b/wxglade_0.7.0+.diff @@ -0,0 +1,770 @@ +diff --git a/application.py b/application.py +--- a/application.py ++++ b/application.py +@@ -694,17 +694,20 @@ class Application(object): + self.notebook, + ) + +- out = misc.UnicodeStringIO(self.encoding) ++ # temporary buffer for XML ++ tmp_xml = misc.UnicodeStringIO('utf-8') + + from xml_parse import CodeWriter + try: + # generate the code from the xml buffer +- cw = self.get_language() +- if preview and cw == 'python': # of course cw == 'python', but... +- overwrite = self.overwrite ++ codewriter = self.get_language() ++ ++ # save and overwrite some code generation settings ++ if preview and codewriter == 'python': ++ overwrite_save = self.overwrite + self.overwrite = True +- class_names = common.app_tree.write(out) # write the xml onto a +- # temporary buffer ++ ++ class_names = common.app_tree.write(tmp_xml) + + out_path = os.path.expanduser(self.output_path.strip()) + if not os.path.isabs(out_path) and self.filename: +@@ -713,15 +716,15 @@ class Application(object): + out_path = os.path.normpath(out_path) + else: + out_path = None +- CodeWriter( +- common.code_writers[cw], +- out.getvalue(), True, +- preview=preview, +- out_path=out_path, +- class_names=class_names, +- ) +- if preview and cw == 'python': +- self.overwrite = overwrite ++ ++ CodeWriter(common.code_writers[codewriter], tmp_xml.getvalue(), ++ True, preview=preview, out_path=out_path, ++ class_names=class_names) ++ ++ # restore saved settings ++ if preview and codewriter == 'python': ++ self.overwrite = overwrite_save ++ + except (errors.WxgBaseException, IOError, OSError), inst: + wx.MessageBox( + _("Error generating code:\n%s") % inst, +diff --git a/bugdialog_ui.py b/bugdialog_ui.py +--- a/bugdialog_ui.py ++++ b/bugdialog_ui.py +@@ -17,7 +17,7 @@ import gettext + class UIBugDialog(wx.Dialog): + def __init__(self, *args, **kwds): + # begin wxGlade: UIBugDialog.__init__ +- kwds["style"] = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER | wx.THICK_FRAME ++ kwds["style"] = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER + wx.Dialog.__init__(self, *args, **kwds) + self.notebook_1 = wx.Notebook(self, wx.ID_ANY, style=wx.NB_BOTTOM) + self.nb1_pane_summary = wx.Panel(self.notebook_1, wx.ID_ANY) +diff --git a/common.py b/common.py +--- a/common.py ++++ b/common.py +@@ -6,10 +6,13 @@ Global variables + @license: MIT (see license.txt) - THIS PROGRAM COMES WITH NO WARRANTY + """ + ++import codecs + import ConfigParser + import logging ++import os + import os.path + import sys ++import types + import zipfile + + import config +@@ -988,23 +991,28 @@ def make_object_button(widget, icon_path + + def encode_from_xml(label, encoding=None): + """\ +- Returns a str which is the encoded version of the unicode label ++ Returns a str which is the encoded version of the unicode msg + """ + if encoding is None: + encoding = app_tree.app.encoding + return label.encode(encoding, 'replace') + + +-def encode_to_xml(label, encoding=None): ++def encode_to_xml(item): + """\ +- returns a utf-8 encoded representation of label. This is equivalent to: +- str(label).decode(encoding).encode('utf-8') ++ Decode the item to a Unicode string. The encoding to UTF-8 will be done ++ later. ++ ++ Non-string items will be converted to string automatically. ++ ++ @rtype: unicode + """ +- if encoding is None: +- encoding = app_tree.app.encoding +- if type(label) == type(u''): +- return label.encode('utf-8') +- return str(label).decode(encoding).encode('utf-8') ++ if isinstance(item, types.UnicodeType): ++ return item ++ if not isinstance(item, types.StringTypes): ++ item = str(item) ++ item = item.decode(app_tree.app.encoding) ++ return item + + + def save_file(filename, content, which='wxg'): +@@ -1012,6 +1020,8 @@ def save_file(filename, content, which=' + Save I{content} to file named I{filename} and, if user's preferences say + so and I{filename} exists, makes a backup copy of it. + ++ @note: The content of 'wxg' files must be Unicode always! ++ + @note: Exceptions that may occur while performing the operations are not + handled. + +@@ -1022,6 +1032,7 @@ def save_file(filename, content, which=' + @param which: Kind of backup: 'wxg' or 'codegen' + """ + if which == 'wxg': ++ assert isinstance(content, types.UnicodeType) + do_backup = config.preferences.wxg_backup + elif which == 'codegen': + do_backup = config.preferences.codegen_backup +@@ -1030,8 +1041,7 @@ def save_file(filename, content, which=' + 'Unknown value "%s" for parameter "which"!' % which + ) + try: +- if do_backup and \ +- filename not in config._backed_up and \ ++ if do_backup and filename not in config._backed_up and \ + os.path.isfile(filename): + # make a backup copy of filename + infile = open(filename) +@@ -1044,13 +1054,20 @@ def save_file(filename, content, which=' + savecontent = True + if os.path.isfile(filename): + oldfile = open(filename) +- savecontent = (oldfile.read() != content) ++ oldcontent = oldfile.read() ++ if which == 'wxg': ++ # decode from utf-8 to unicode ++ oldcontent = oldcontent.decode('utf-8') ++ savecontent = (oldcontent != content) + oldfile.close() + if savecontent: + directory = os.path.dirname(filename) + if directory and not os.path.isdir(directory): + os.makedirs(directory) + outfile = open(filename, 'w') ++ if which == 'wxg': ++ # encode from unicode to utf-8 ++ content = content.encode('utf-8') + outfile.write(content) + outfile.close() + finally: +@@ -1226,9 +1243,16 @@ def init_paths(): + config.appdata_path, 'file_history.txt' + ) + +- config.log_file = os.path.join( +- config.appdata_path, 'wxglade.log' +- ) ++ config.log_file = os.path.join(config.appdata_path, 'wxglade.log') ++ ++ # create missing application data directory, otherwise log initialisation ++ # will failed with an IOError "No such file or directory" ++ # The file logger will be initialised after this function returns. ++ if not os.path.isdir(config.appdata_path): ++ try: ++ os.makedirs(config.appdata_path, 0700) ++ except (IOError, OSError), e: ++ logging.error(_('Failed to create config directory: "%s"'), e) + + + def init_preferences(): +@@ -1255,16 +1279,12 @@ def save_preferences(): + os.makedirs(path) + # always save the file history + if config.use_file_history: +- fh = palette.file_history +- count = fh.GetCount() +- encoding = 'utf-8' +- filenames = [encode_to_xml(fh.GetHistoryFile(i), encoding) +- for i in +- range(min(config.preferences.number_history, count))] +- outfile = open(config.history_file, 'w') +- print >> outfile, "# -*- coding: %s -*-" % encoding +- for filename in filenames: +- print >> outfile, filename ++ content = u'# -*- coding: utf-8 -*-\n' ++ for pos in range(min(config.preferences.number_history, ++ palette.file_history.GetCount())): ++ content += u'%s\n' % palette.file_history.GetHistoryFile(pos) ++ outfile = codecs.open(config.history_file, 'w', encoding='utf-8') ++ outfile.write(content) + outfile.close() + if config.preferences.changed: + outfile = open(config.rc_file, 'w') +@@ -1280,22 +1300,14 @@ def load_history(): + @see: L{config.history_file} + @see: L{config.use_file_history} + +- @rtype: list[str] ++ @rtype: list[unicode] + """ + try: +- history = open(config.history_file) +- lines = history.readlines() +- if lines and lines[0].startswith('# -*- coding:'): +- try: +- encoding = 'utf-8' +- lines = [e.decode(encoding) for e in lines[1:]] +- except Exception: +- logging.exception(_("Internal Error")) +- lines = lines[1:] +- history.close() +- if config.use_gui: +- import misc +- lines = [misc.wxstr(e, 'utf-8') for e in lines] ++ infile = codecs.open(config.history_file, encoding='utf-8') ++ lines = infile.readlines() ++ if lines and lines[0].startswith(u'# -*- coding:'): ++ lines = lines[1:] ++ infile.close() + return lines + except IOError: + # don't consider this an error +@@ -1389,6 +1401,15 @@ class Preferences(ConfigParser.ConfigPar + self.changed = True + + def set_geometry(self, name, geometry): ++ """\ ++ Save the current widget position and size ++ ++ @param name: Widget name ++ @type name: str ++ ++ @param geometry: Position and Size ++ @type geometry: (int, int, int, int) ++ """ + if geometry is not None: + section = 'geometry_%s' % name + if not self.has_section(section): +@@ -1399,14 +1420,25 @@ class Preferences(ConfigParser.ConfigPar + self.set(section, 'h', geometry[3]) + + def get_geometry(self, name): ++ """\ ++ Return saved widget position and size. ++ ++ @param name: Widget name ++ @type name: str ++ ++ @rtype: (int, int, int, int) | None ++ """ + section = 'geometry_%s' % name +- if self.has_section(section): +- x = self.get(section, 'x') +- y = self.get(section, 'y') +- w = self.get(section, 'w') +- h = self.get(section, 'h') ++ if not self.has_section(section): ++ return None ++ try: ++ x = int(self.get(section, 'x')) ++ y = int(self.get(section, 'y')) ++ w = int(self.get(section, 'w')) ++ h = int(self.get(section, 'h')) + return x, y, w, h +- else: +- return None ++ except: ++ pass ++ return None + + # end of class Preferences +diff --git a/config.py b/config.py +--- a/config.py ++++ b/config.py +@@ -385,11 +385,7 @@ def get_version(suffix=True): + @see: L{read_version_file()} + @see: L{get_hg_version()} + """ +- release = read_version_file() +- if not release: +- release = get_hg_version() +- if not release: +- release = 'not found' ++ release = '0.7.0' + + if suffix and hasattr(sys, 'frozen'): + release = '%s (standalone edition)' % release +diff --git a/log.py b/log.py +--- a/log.py ++++ b/log.py +@@ -374,15 +374,20 @@ def init(filename='wxglade.log', encodin + + # instantiate file handler + if filename: +- file_logger = logging.handlers.RotatingFileHandler( +- filename, +- maxBytes=100 * 1024, +- encoding=encoding, +- backupCount=1, +- ) +- file_logger.setFormatter(file_formatter) +- file_logger.setLevel(logging.NOTSET) +- logger.addHandler(file_logger) ++ log_directory = os.path.dirname(filename) ++ if not os.path.isdir(log_directory): ++ logging.warning(_('Logging directory "%s" does not exists. Skip ' ++ 'file logger initialisation!'), log_directory) ++ else: ++ file_logger = logging.handlers.RotatingFileHandler( ++ filename, ++ maxBytes=100 * 1024, ++ encoding=encoding, ++ backupCount=1, ++ ) ++ file_logger.setFormatter(file_formatter) ++ file_logger.setLevel(logging.NOTSET) ++ logger.addHandler(file_logger) + + # instantiate string handler + string_logger = StringHandler(storeAsUnicode=False) +diff --git a/main.py b/main.py +--- a/main.py ++++ b/main.py +@@ -14,6 +14,7 @@ import os + import os.path + import sys + import time ++import types + import wx + from xml.sax import SAXParseException + +@@ -181,7 +182,7 @@ class wxGladeFrame(wx.Frame): + + # load the available code generators + core_buttons, local_buttons, sizer_buttons = common.init_codegen() +- ++ + append_item = misc.append_item + self.TREE_ID = TREE_ID = wx.NewId() + append_item(view_menu, TREE_ID, _("Show &Tree\tF2")) +@@ -209,11 +210,11 @@ class wxGladeFrame(wx.Frame): + GENERATE_CODE_ID = wx.NewId() + append_item(file_menu, GENERATE_CODE_ID, _("&Generate Code\tCtrl+G"), + wx.ART_EXECUTABLE_FILE) +- ++ + file_menu.AppendSeparator() + IMPORT_ID = wx.NewId() + append_item(file_menu, IMPORT_ID, _("&Import from XRC...\tCtrl+I")) +- ++ + EXIT_ID = wx.NewId() + file_menu.AppendSeparator() + append_item(file_menu, EXIT_ID, _('E&xit\tCtrl+Q'), wx.ART_QUIT) +@@ -247,7 +248,7 @@ class wxGladeFrame(wx.Frame): + files.reverse() + for path in files: + self.file_history.AddFileToHistory(path.strip()) +- ++ + def open_from_history(event): + if not self.ask_save(): + return +@@ -274,9 +275,9 @@ class wxGladeFrame(wx.Frame): + else: + common.remove_autosaved(filename) + self._open_app(filename) +- ++ + wx.EVT_MENU_RANGE(self, wx.ID_FILE1, wx.ID_FILE9, open_from_history) +- ++ + wx.EVT_MENU(self, TREE_ID, self.show_tree) + wx.EVT_MENU(self, PROPS_ID, self.show_props_window) + wx.EVT_MENU(self, RAISE_ID, self.raise_all) +@@ -375,7 +376,7 @@ class wxGladeFrame(wx.Frame): + sizer.Add(sb) + self.SetSizer(sizer) + sizer.Fit(self) +- ++ + # Properties window + frame_style = wx.DEFAULT_FRAME_STYLE + frame_tool_win = config.preferences.frame_tool_win +@@ -383,13 +384,13 @@ class wxGladeFrame(wx.Frame): + frame_style |= wx.FRAME_NO_TASKBAR | wx.FRAME_FLOAT_ON_PARENT + frame_style &= ~wx.MINIMIZE_BOX + if wx.Platform != '__WXGTK__': frame_style |= wx.FRAME_TOOL_WINDOW +- ++ + self.frame2 = wx.Frame(self, -1, _('Properties - <%s>' % _('app')), + style=frame_style) + self.frame2.SetBackgroundColour(wx.SystemSettings_GetColour( + wx.SYS_COLOUR_BTNFACE)) + self.frame2.SetIcon(icon) +- ++ + sizer_tmp = wx.BoxSizer(wx.VERTICAL) + property_panel = wxGladePropertyPanel(self.frame2, -1) + +@@ -402,7 +403,7 @@ class wxGladeFrame(wx.Frame): + sz.Show(misc.hidden_property_panel, False) + self.property_frame = self.frame2 + #-------------------------------------------------------- +- ++ + property_panel.SetAutoLayout(True) + self.hidden_frame = wx.Frame(self, -1, "") + self.hidden_frame.Hide() +@@ -420,7 +421,7 @@ class wxGladeFrame(wx.Frame): + self.tree_frame = wx.Frame(self, -1, _('wxGlade: Tree'), + style=frame_style) + self.tree_frame.SetIcon(icon) +- ++ + app = application.Application(common.property_panel) + common.app_tree = WidgetTree(self.tree_frame, app) + self.tree_frame.SetSize((300, 300)) +@@ -436,45 +437,60 @@ class wxGladeFrame(wx.Frame): + wx.EVT_CLOSE(self.tree_frame, on_tree_frame_close) + # check to see if there are some remembered values + prefs = config.preferences ++ ++ self_geometry = None ++ property_geomentry = None ++ tree_geometry = None ++ + if prefs.remember_geometry: +- #self._logger.debug('initializing geometry') +- try: +- x, y, w, h = prefs.get_geometry('main') +- misc.set_geometry(self, (x, y)) +- except Exception: +- pass +- misc.set_geometry(self.frame2, prefs.get_geometry('properties')) +- misc.set_geometry(self.tree_frame, prefs.get_geometry('tree')) +- else: ++ self_geometry = prefs.get_geometry('main') ++ if isinstance(self_geometry, types.TupleType): ++ self_geometry = wx.Rect(*self_geometry) ++ ++ property_geomentry = prefs.get_geometry('properties') ++ if isinstance(property_geomentry, types.TupleType): ++ property_geomentry = wx.Rect(*property_geomentry) ++ ++ tree_geometry = prefs.get_geometry('tree') ++ if isinstance(tree_geometry, types.TupleType): ++ tree_geometry = wx.Rect(*tree_geometry) ++ ++ if not self_geometry: ++ self_geometry = wx.Rect() ++ self_geometry.TopLeft = wx.Display().GetClientArea().GetTopLeft() ++ self_geometry.Size = (-1, -1) ++ ++ self._set_geometry(self, self_geometry) ++ self.Show() ++ self_geometry.Size = self.GetSize() ++ ++ if not property_geomentry: ++ property_geomentry = wx.Rect() ++ property_geomentry.Position = self_geometry.BottomLeft ++ property_geomentry.Size = (345, 350) ++ # sometimes especially on GTK GetSize seems to ignore window ++ # decorations (bug still exists on wx3) ++ if wx.Platform != '__WXMSW__': ++ property_geomentry.Y += 40 ++ ++ # set size on Mac manually + if wx.Platform == '__WXMAC__': +- self.frame2.SetSize((345, 384)) # I've been told this is OK... +- self.SetPosition((0, 45)) # to avoid the OS X menubar +- else: +- self.frame2.SetSize((max(self.GetSize()[0], 250), 350)) +- self.SetPosition((0, 0)) +- x, y = self.GetPosition() +- h = self.GetSize()[1] +- w = self.frame2.GetSize()[0] ++ property_geomentry.Size = (345, 384) ++ ++ self._set_geometry(self.frame2, property_geomentry) ++ self.frame2.Show() ++ ++ if not tree_geometry: ++ tree_geometry = wx.Rect() ++ tree_geometry.Position = self_geometry.TopRight ++ tree_geometry.Size = (250, 350) ++ # sometimes especially on GTK GetSize seems to ignore window ++ # decorations (bug still exists on wx3) + if wx.Platform != '__WXMSW__': +- # under X, IceWM (and Sawfish, too), GetSize seems to ignore +- # window decorations +- h += 60 +- w += 10 +- self.frame2.SetPosition((x, y+h)) +- self.tree_frame.SetPosition((x+w, y)) +- self.Show() ++ tree_geometry.X += 10 ++ ++ self._set_geometry(self.tree_frame, tree_geometry) + self.tree_frame.Show() +- self.frame2.Show() +- +- #self._skip_activate = False +-## if frame_tool_win: +-## def on_iconize(event): +-## if event.Iconized(): +-## self.hide_all() +-## else: +-## self.show_and_raise() +-## event.Skip() +-## wx.EVT_ICONIZE(self, on_iconize) + + if wx.Platform == '__WXMSW__': + import about +@@ -522,7 +538,7 @@ class wxGladeFrame(wx.Frame): + add_to_history=False): + common.app_tree.app.saved = False + common.app_tree.app.filename = None +- self.user_message(_("Recovery from auto save complete")) ++ self.user_message(_("Auto save loaded")) + common.remove_autosaved() + else: + common.remove_autosaved() +@@ -653,7 +669,7 @@ class wxGladeFrame(wx.Frame): + wildcard="wxGlade files (*.wxg)|*.wxg|" + "wxGlade Template files (*.wgt)|*.wgt|" + "XML files (*.xml)|*.xml|All files|*", +- flags=wx.OPEN|wx.FILE_MUST_EXIST, ++ flags=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST, + default_path=self.cur_dir) + if infile: + if common.check_autosaved(infile) and \ +@@ -764,10 +780,13 @@ class wxGladeFrame(wx.Frame): + if config.preferences.autosave and self.autosave_timer is not None: + self.autosave_timer.Start() + +- self.user_message( +- _("Loaded %s (%.2f seconds)") % +- (misc.wxstr(common.app_tree.app.filename), end - start) +- ) ++ duration = end - start ++ if infilename: ++ self.user_message( ++ _("Loaded %s in %.2f seconds") % ( ++ misc.wxstr(os.path.basename(infilename)), duration)) ++ else: ++ self.user_message(_("Loaded in %.2f seconds") % duration) + + return True + +@@ -806,7 +825,7 @@ class wxGladeFrame(wx.Frame): + if config.preferences.autosave and \ + self.autosave_timer is not None: + self.autosave_timer.Start() +- self.user_message(_("Saved %s") % filename) ++ self.user_message(_("Saved %s") % os.path.basename(filename)) + + def save_app_as(self, event): + """\ +@@ -849,11 +868,11 @@ class wxGladeFrame(wx.Frame): + # first, let's see if we have to save the geometry... + prefs = config.preferences + if prefs.remember_geometry: +- prefs.set_geometry('main', misc.get_geometry(self)) ++ prefs.set_geometry('main', self._get_geometry(self)) + prefs.set_geometry('tree', +- misc.get_geometry(self.tree_frame)) ++ self._get_geometry(self.tree_frame)) + prefs.set_geometry('properties', +- misc.get_geometry(self.frame2)) ++ self._get_geometry(self.frame2)) + prefs.changed = True + common.app_tree.clear() + if self.about_box: +@@ -919,7 +938,7 @@ class wxGladeFrame(wx.Frame): + infilename = misc.FileSelector( + _("Import file"), + wildcard="XRC files (*.xrc)" "|*.xrc|All files|*", +- flags=wx.OPEN | wx.FILE_MUST_EXIST, ++ flags=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST, + default_path=self.cur_dir) + if infilename: + ibuffer = StringIO.StringIO() +@@ -945,6 +964,41 @@ class wxGladeFrame(wx.Frame): + "File->Save As Template..."), _("Information"), + style=wx.OK|wx.ICON_INFORMATION) + ++ def _set_geometry(self, win, geometry): ++ """\ ++ Set position and/or size of widget. ++ ++ @param win: Frame to set position and/or size ++ @type win: wx.Frame ++ ++ @param geometry: Position and Size ++ @type geometry: (int, int, int, int) ++ """ ++ assert isinstance(geometry, (wx.Point, wx.Rect)) ++ ++ if not geometry: ++ return ++ ++ if isinstance(geometry, wx.Point): ++ win.SetPosition(geometry) ++ else: ++ win.SetDimensions(*geometry.Get()) ++ ++ def _get_geometry(self, widget): ++ """\ ++ Return widgets position and size. ++ ++ @param widget: Frame to return position and/or size ++ @type widget: wx.Frame ++ ++ @rtype: wx.Rect | None ++ """ ++ pos_size = widget.Rect ++ client_area = wx.Display().ClientArea ++ if client_area.Contains(pos_size.TopLeft): ++ return pos_size.Get() ++ return None ++ + # end of class wxGladeFrame + + +diff --git a/misc.py b/misc.py +--- a/misc.py ++++ b/misc.py +@@ -462,28 +462,6 @@ def _reverse_dict(src): + ret[val] = key + return ret + +- +-def get_geometry(win): +- x, y = win.GetPosition() +- w, h = win.GetSize() +- if 0 <= x <= wx.SystemSettings_GetMetric(wx.SYS_SCREEN_X) and \ +- 0 <= y <= wx.SystemSettings_GetMetric(wx.SYS_SCREEN_Y): +- return x, y, w, h +- return None +- +- +-def set_geometry(win, geometry): +- if geometry is None: +- return +- try: +- if len(geometry) == 4: +- win.SetDimensions(*[int(x) for x in geometry]) +- else: +- win.SetPosition([int(x) for x in geometry]) +- except Exception: +- logging.exception(_('Internal Error')) +- +- + # snagged out of the Python cookbook + def import_name(module_path, name): + import imp +diff --git a/templates_ui.py b/templates_ui.py +--- a/templates_ui.py ++++ b/templates_ui.py +@@ -21,7 +21,7 @@ except AttributeError: + class TemplateInfoDialog(wx.Dialog): + def __init__(self, *args, **kwds): + # begin wxGlade: TemplateInfoDialog.__init__ +- kwds["style"] = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER | wx.MAXIMIZE_BOX | wx.THICK_FRAME ++ kwds["style"] = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER | wx.MAXIMIZE_BOX + wx.Dialog.__init__(self, *args, **kwds) + self.template_name = wx.TextCtrl(self, wx.ID_ANY, "") + self.author = wx.TextCtrl(self, wx.ID_ANY, "") +diff --git a/widgets/bitmap_button/bitmap_button.py b/widgets/bitmap_button/bitmap_button.py +--- a/widgets/bitmap_button/bitmap_button.py ++++ b/widgets/bitmap_button/bitmap_button.py +@@ -40,10 +40,9 @@ class EditBitmapButton(ManagedBase, Edit + + # initialise properties remaining staff + self.access_functions['bitmap'] = (self.get_bitmap, self.set_bitmap) +- self.properties['bitmap'] = FileDialogProperty(self, 'bitmap', None, +- style=wx.OPEN | +- wx.FILE_MUST_EXIST, +- can_disable=False, label=_("bitmap")) ++ self.properties['bitmap'] = FileDialogProperty( ++ self, 'bitmap', None, style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST, ++ can_disable=False, label=_("bitmap")) + self.access_functions['default'] = (self.get_default, self.set_default) + self.access_functions['style'] = (self.get_style, self.set_style) + self.properties['default'] = CheckBoxProperty(self, 'default', None, label=_("default")) +@@ -51,7 +50,9 @@ class EditBitmapButton(ManagedBase, Edit + self.access_functions['disabled_bitmap'] = (self.get_disabled_bitmap, + self.set_disabled_bitmap) + self.properties['disabled_bitmap'] = FileDialogProperty( +- self, 'disabled_bitmap', None, style=wx.OPEN|wx.FILE_MUST_EXIST, label=_("disabled bitmap")) ++ self, 'disabled_bitmap', None, ++ style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST, ++ label=_("disabled bitmap")) + self.properties['style'] = CheckListProperty( + self, 'style', self.widget_writer) + +diff --git a/widgets/dialog/dialog.py b/widgets/dialog/dialog.py +--- a/widgets/dialog/dialog.py ++++ b/widgets/dialog/dialog.py +@@ -37,9 +37,9 @@ class EditDialog(TopLevelBase, EditStyle + # icon property + self.icon = "" + self.access_functions['icon'] = (self.get_icon, self.set_icon) +- prop['icon'] = FileDialogProperty(self, 'icon', None, +- style=wx.OPEN|wx.FILE_MUST_EXIST, +- can_disable=True, label=_("Icon")) ++ prop['icon'] = FileDialogProperty( ++ self, 'icon', None, style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST, ++ can_disable=True, label=_("Icon")) + # centered property + self.centered = False + self.access_functions['centered'] = (self.get_centered, +diff --git a/widgets/frame/frame.py b/widgets/frame/frame.py +--- a/widgets/frame/frame.py ++++ b/widgets/frame/frame.py +@@ -51,7 +51,7 @@ class EditFrame(TopLevelBase, EditStyles + self, 'toolbar', label=_('Has ToolBar')) + # icon property + prop['icon'] = FileDialogProperty( +- self, 'icon', style=wx.OPEN | wx.FILE_MUST_EXIST, ++ self, 'icon', style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST, + label=_("icon")) + # centered property + self.centered = False +diff --git a/widgets/static_bitmap/static_bitmap.py b/widgets/static_bitmap/static_bitmap.py +--- a/widgets/static_bitmap/static_bitmap.py ++++ b/widgets/static_bitmap/static_bitmap.py +@@ -38,7 +38,7 @@ class EditStaticBitmap(ManagedBase, Edit + self.access_functions['attribute'] = (self.get_attribute, + self.set_attribute) + self.bitmap_prop = FileDialogProperty(self, 'bitmap', None, +- style=wx.OPEN | wx.FILE_MUST_EXIST, can_disable=False, ++ style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST, can_disable=False, + label=_("bitmap")) + prop = self.properties + prop['bitmap'] = self.bitmap_prop +diff --git a/wxglade.py b/wxglade.py +--- a/wxglade.py ++++ b/wxglade.py +@@ -50,7 +50,7 @@ Copyright (C) 2007-2012 Alberto Griggio + Copyright (C) 2011-2014 Carsten Grohmann + License MIT: The MIT License + <http://www.opensource.org/licenses/mit-license.php>""") % +- config.version ++ config.get_version() + ) + parser.add_option( + '-h', |