From: robk-tahoe Date: Tue, 18 Mar 2008 23:15:36 +0000 (-0700) Subject: confwiz: reworked confwiz look and feel X-Git-Tag: allmydata-tahoe-1.0.0~25 X-Git-Url: https://git.rkrishnan.org/pf/content/en/service/module-simplejson.encoder.html?a=commitdiff_plain;h=605d693fa3417f9fb20ceeb6a295d7467e7cfd24;p=tahoe-lafs%2Ftahoe-lafs.git confwiz: reworked confwiz look and feel this changes the confwiz to have a look and feel much more consistent with that of the innosetup installer it is launched within the context of. this applies, naturally, primarily to windows. --- diff --git a/src/allmydata/gui/amdlogo.py b/src/allmydata/gui/amdlogo.py new file mode 100644 index 00000000..71456926 --- /dev/null +++ b/src/allmydata/gui/amdlogo.py @@ -0,0 +1,173 @@ +#---------------------------------------------------------------------- +# This file was generated by /opt/local/lib/python2.4/site-packages/wx-2.6-mac-unicode/wx/tools/img2py.py +# +from wx import ImageFromStream, BitmapFromImage +from wx import EmptyIcon +import cStringIO, zlib + + +def getData(): + return zlib.decompress( +'x\xda\x01\n\x0f\xf5\xf0\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x006\x00\ +\x00\x006\x08\x06\x00\x00\x00\x8cEj\xdd\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\ +\x08d\x88\x00\x00\x0e\xc1IDATh\x81\xbd\x9ai\x90\\Wu\xc7\x7f\xe7\xde\xb7\xf42\ +\xdd\xa3\x914\x92,\x8d$[\xdedIF62\x8b\xb0\xc16\xa0\x02C\xb1\x84J\xfc!T\xd9\ +\x15\x12Ha\x96PT\x92\xa2\x12 \xa4(Hp\x80\xa2\x1c\x8aP\x10\x92\x94M\x9cJ\x11\ +\x02$\x80C\x19\x8c\xcdb\xcb\x06\x83\xe5\x05!,dY\x8b5\xb24\x9a\x99\xee\xe9\ +\xe5\xdd\xf7\xee\xbd\xf9\xf0^\xcf\xa6\x91=\xd3\x92y]\xb7\xdf\xed\xb7\x9cw\ +\xfe\xf7\x7f\xce\xb9\xe7\xdc\xd7\xc2\x1d\xaf\xe4\x05\xdf\xbc\x03\xef\xf3\xbe\ +\x00(\x10yA\x1f\x19\xbc`\x92m:\x80\xcb\xde\x80\xe8\x9daT=\xaf\x16\x96\x97\t\ +\x12\xa6\xce\xb6\x1bfj\x8c\xb4{\x10\xf86A\xf8sD\x9f\xf3\xc7\x9f{`.\x1b\xc1\ +\xd9?\xbct\xf9\x85\x7f\xbcs\xd5E\x97l]\xbe\x96-\xcb\xd6\xb1\xa2TE\x10\x8c\ +\xb3\x1ci\x9db\xcf\xd8!\xf6\x8e\x8f~\xe4\x87\xc7\x1e\xffv\xa33\xf6/\x84\xa5o\ +\x15t\x9e\x93M\xce\xa9)f\xc9\xf5C\xa5e\xb7\xdf\xb2\xf5\x8d#o\xbf\xe8%\x04\ +\xda`|\x82\xb1\x19\xd6[<\xa0D\x08$ R\x01\x91\xaap\xa8\xd9\xe63{\xbe\xc3w\x9e\ +~\xe0\xbfP\xfaOQ\xfa\xd4\xb9P\xe5\xdc\x01K;\xef\xbb~\xfdK?\xfb\xb1\x1do\rVWC\ +\x1ai\x13\xeb=R\xb0\xe0\x8bo_|{\x1c\x16GY\x87D\xaa\xca\xcf\x8e\x8d\xf2\xe7\ +\xbbo\xff\xf5d2y#:z\xecl\xd5\xd1\xbcm\xe3\xd9\xca\x80\xb4{\xcb\xef]x\xfd\xe7\ +?\xb3\xf3F\x15\x06\x1d\x1aY\x1b\x07\x80\xc7b\xc9\xc8\xf0bq\xe2\xc8HI\xc9\nX\ +\x8e\xae7\xb4|\x93\xf3\x87\xea\\\xb3z\xfb\xca\xdd\xc7\x0f\xbc\xb6\xd1\x9d\ +\xb8\x0f\x15\x1c?\x1b\x95\xd49\x00\xf5\xa6\xab\xd7]\xf9\xb9O\xbc\xec\xad4\ +\xdc\xb34l\x87\x8c\x0c\x83!\xa1K\x1c\x06\xd4\xc2A\xbc+\xd1\xcd4\xb1\xaa3\x18\ +\r\xe2\xb5\xa3K\x17C\x8a\xc1r\xcc\x9cd\xdd\n\xf8\xe8\xcb\xdevq=\xaa\xfd;\xde\ +V\xceF\xad\xb3c\xcc\xd9hYi\xd9]\xb7]s\xd3r\x82I\xda\xce\xe0p\xa4\xa4(-T\xf5\ +\x10\x0f\x8f\x9e\xe4\x0b\x8f\xfe\xd0}\xf1W\xf7M\xde\xb9\xff\xa1\xd6\x0f\x0f\ +\xef\xf3\xc7\xa7\xba\xd1\x05\xb5\x11\x06+!-\xdf"-\xd8\x9b\xb4S\\0\xb4\x8c5\ +\xa5\x91U\xf7>\xfd\x88\xa0\x83{\xfaU\xed\xec|,3\x1f\xfc\xe4\xce?\xfa\xcc\xeb\ +6\xad\xe7\xd9d\x0c\x10\x1c\x96\x81\xb0\xc2\xc4T\xc8\xc7v\xffw\xfa\xcb\x93\ +\xfbo\xc5e_C\x07\xcf\x80dx[\xc3\xda\xcd\x95\xb8\xfe\xc1?\xb8\xf8\xea\xd7\xdd\ +\xf4\xa2+9\xe9\x8e\xe1|\xe1\x7fb\x19\x94a>p\xf7\xb7\xba\xfb\xc7\x0f^\x82\x8e\ +\x0e\xf7\xa3Z\xff\x8c9\xbblye\xc5W\xdf\xb3\xfd\x9a\xda\x94?E\x86\xc7\x92\x11\ +\x06\x9a\xb1\xa6\xe6\xcf\xee\xbd\xe3\xe9\xdf\x8c\x1f|#Ax;:<\x8e\xa86\xa2\xba\ +(=\x89\x0e\x7f\x9b\xfa\xec\xab{\x8e\xed\xed4\xd3\xf05\xd7\x8c\\(\xe3n\x1c\ +\x8b#\x15\x8b\x0e\x1d\x1b\xe2\xf5\xc1=\x87\x9e8\x8aR\x0f\xf4\xa3^\xff>f\xd3K\ +\xae[\xbbem\xb9\xech{S\xf8TBU\x86\xf8\xa7G\x7f\xdc<\xd28z\x13ai\xf7\x19\xe7&\ +Q\x10\x97o\xfd\xc6\xbe{\xbf\xfc\xfd\x03\x07)G1F\x0c)\x19\'\xb3S\\\xbaf\x905\ +\x03\xc37\xe1l_sm\xff\xc0T\xf0\xb2k\xd7]\xca\x94\x9f*\x02\x80!\nC\xee9\xf4\ +\x14\xf7\x1e\xfa\xf9\x9dD\x95\x1f=\xbf\x10\x01\xa5\xfe\xea\xdb\xbf}\xf4H\xec\ +\x06I\xa4\x9b\x0f\x907L\x05c\xac\xa9\xd6\xb7\xe1\xdc\xd6\xbe\xd4\xeb\xe7&\ +\xbc\xa3\x1a\xd7^\xba\xb6^e\xd26HII0X\x0f\xdf=\xf8\x88G\xfc\x9d\x8b\x96\x15D\ +\xa7\xf6\x9e:t\xc7\xc1\x93M\x02\xad\xc9\xb9\xcf\xe8\xaa6k\xebu\x85\xf7\x9b\ +\xfaQ\xb1O`\x9e\x81\xa0t\x9e\x0e\x1d\x1d\xdf\xc5H\x8aQ\x06\xe3<\xe3\xdd\xce\ +\tD\xedY\x92\x7f9\xb0\ +\x94\x0c\xfb\x02\x02\x13H%\xc5HZ\x98\xe2lEr\x10^ \x9fn\xf3y\xa9\x16\x94Y/\ +\x1b\xf0I\x88\xb3\x1e\x15\x80\x89[\x1crG\xe8X\x83F\x9f\xc9p\xa7\x99\xcc\xc4\ +\x90\xc9\x0b\t\x8c\x9c\xb1\x04\x83\xa0\xe6<|\xae\xff8P\x8e\r\xb2\x91\xf2\xe8\ +\x08O\x1c\x18\xef\xec;1z\xa8\x9b\xa5\x9dZ\\\xaam[\xb3\xf6\x82\xcd\x9b\xd6\ +\xa9c+\xf6q\xd8\x1e\x01\x9f\xe7\xe2\xc5\xd0\xcc2\xe1\xbc\x97\xfenL1\x9d\xce6\ +\x98cF\xb3FYYv\xf8\x97\xb0\xfb\xa7\x1d\xee\x7f\xfa\xfe\x7f\xf5\xde|\n\xad\ +\x9f\x02I\xc7\xba\x93\xa5\x83\xe3\xcf\\\x1e\xed+\xff\xed\x9b\xb6m\x7f\xfd\ +\xa5WTx\xd8>B\xe4\xa3\x99\xfb\xe7\xc9LI\xb1K4\xc5%\x97-\xbd\xc4\xd7\x14&\x99\ +\x17\x993\xad--\xce\xf7\x9bxhw\x92\xfd\xf4\xa9\'\xfe\xc4\x07\xfe\x1d\x84\xd1\ +>\x946(\xe5\xd1\xbaC\x18=dTv\xc3\xd7\xf7\xfc\xecS\x13\x8f\xad\xe4\xe2\xf0\ +\x02Z\xd2\x99\x96\x99\x0f\xdd\x8c\xcc\x04C\xb6\xc4\x0f[\xd3{\x05\x01\x01\xd6\ +\xb9\xa2\xba\xc9\xf2\x87\xbb\x0c\xbcx\xe7=\x91Dh\xc5i`\xcaJQ\x16\x9d\xb7\xe2\ +X\xfc\\\xf1\xde\xa5\xe02>\xfc\xe2[\xf8\xc1\xae\xdbx\xdb\x86W\xcd\x04\x8f\xa1\ +\xa8\xc6\xad;\xde\xcb\xdf]\xf5~b\x15\x805,h\x9a\xb3\x810o\xbf\xd0\xfc\x83@\ +\xda\xe6\xca\x95\x97\xf1\x8d\xeb\xff\x9e\xd5\x95a\xb0\x1d\x04(\x89\xa2\xa4d\ +\x06Laz%\xd13\xfd\x02Xx&S\xb4\t5]\xe2\x9f\xaf\xfe\x08\x1f\xbf\xf2]\x0c\x86U`\ +\xd6\x04\xed\x8b7\xfc\x1f\xda\xfav^\xber\x0b7\xde\xf7\xd7\x9ch=\x0bau\x16]\ +\xcf\x01j\xa1=\xd0\xb1\t\xdbV]\x9e\xdd\xf5\x9aO\xb3:\x1eb\xa4\xba\x8a7\xfc\ +\xdf\x07l\xe6\xed\x1cv\x02\x84@\x84@)\xc2^_\x84P\x14\xa2\xdc\xc2>\x96\xb6X_\ +\x1b\xe1?\xaf\xfd$;\x87\xe7\xbem\x9asuo\x01\xe5\xba\xd5Wr\xf7\xae\xdbx\xf1\ +\xf0VH\x17H\xf9\x16\xf0\xa9\x85\x9a\x13\x8f\x88\xf0\x89\xed\xef\xde\xba:\x1c\ +\xba\xcc\x18\xf3\xa2\xab\x96_z\xe9\x87\xb7\xbfk\x93\xb1)%Q\xd3&X\x99\xe3SE\ +\xf0(\x98\xab(M4\xdf\x14\xcd\x14\xaf\x1d\xb9\x86\x9f\xdc\xf0%v\x0eo\xc5\xcf\ +\x8b\rgL\xa9\xb6\x0f]\xc4\xf7v\xdd\xc6\x9b\xef\xf9K\x1ex\xe6A@Ci`f(\x16J\x7f\ +\xe6\x1d\xd7J\x88t(\xc7\xf6\x1e\x1c\xf9\xc5A\xd5\xed8\x13\r\xe8R\xb7\xd1\x90\xed>\xb57\x17\x9e\x17\xcf\x0b\x9a\xa0\x00\ +Z\xf2\t\xad\xa2\x02\x9c\xf5\xf2\x1f\x8f|\xef\xa2\x9f\xd8\xc1r\x8a\x0b#\xb4\ +\xd9\x1b\x9e\xd8\xa8^\xa1(\xab\x80\xb2\xe4>\xd53\xbd@f\x9b\xa2"\x14A\xab\xfc\ +\xbdK\xa4Bw\xe5\xca\xcd\xbcf\xddN\xfe\xe1\xc5\xef\xc9\xad\xc2-\x9c\xba=o\x12\ +\\\xd6\x11\xef\xdd\xfc\xfb\xdc\xbc\xe9\x8d[\xae\xf8\xee\xcdq\xc7\xdb\x05}I\ +\x04\x02\x99\x19u\xb0\x04\xde\xb3}d\xa5:p\xdd\xd8\xfb\x0f\xabg\x11\xc9\xff\ +\xa73h\x85\xcd\xabVq\x18OE)b\xd1\xd3L\x05"\x04\xa89\xbf5\x1a\xe3\x12\xae^\ +\xb9m\xe5\xd7\xae\xfd\xf8 0\tg\x06u\x1a\xb0YtF"Ru\xceU\xad\xb55o\xddUGN\x8d\xb6\x84\ +\x1b9/.\x11\xf9`\xc6\x07z\x0e\xaf\x04=\xcb\x8cr\xff\x10B\xa5\x08\n\x8659@M\ +\xce\x8c.\xda\xe9\xa9\xc0\xec\xf0\xed(\xf9\x01\x8cX\xdd\xedt\x9e\x9el5\x8e\ +\xd5\xea5]*\x95T\xa9T\x92R\xa9$q\x1c\xfb8\x8em\x18\x86\x13\xc0\xa8\xf8\xfc%\ +\x1e@\xd997\x94\xa6i\xd9\x183\x90$\xc9`\xb7\xdb\xad\xb4\xdb\xed\xb85\xd5R&1\ +\xfa\x0b\x8d\xbbnzB\xff\xfa\xf5\x95(\x0e\x05\x01\xe7g\xe6\x0f\xef\xe7\x0c\ +\xb4\xf4z\x02\xd2\xfb\xd7\xac\xe4g\xe6\xc4\x1e\x99\x03J$wt\x11\x11z\xcd{\xe7\ +&Mbn\x90W}\xe9\xcd\x03/\xf9~X\x8d\x83J\xa5\x92V*\x95N\x1c\xc7SQ\x14M\x86a\ +\xd8\t\xc3\xb0\xa9\x94\x1a\xf7\xde\xfbi`\xb3\'\xb8\\\x98\x87\xbc\x9c\x8c\x9d\ +seA\xa241\xe1c\x13\x07\xd7g\xdeV\xc51d\xad\xad\xa7Y6`\x12S\xeb&\xddJ\x92$a\ +\x92\x18mR#i\x9ab3+\xd6fX\xe7\xe6\xc8W"(\xad\t\x82\x80 \x08|\x18\x86>\x8a"\ +\x17\xc7\xb1\x8d\xe38)\x94m*\xa5\xa6\xb4\xd6\xe3\x99\xb8F=\xa8\xb4/\x1f\xdax\ +\xc4k\xb1\xa2\xa4\x0bt\x94Rf\xb6\xee\xbd\x81\x008\r\xd8\xec\xbd\xf7y\xe6\xe0\ +\x9c#\x08\x02lf\tu\x98\x87\xc2\xccA\xa0f\x87\xfc*\x8e\xaa\xcf\xec\x80s\xae\ +\x92eY\xd9Z\x1b9\xe7\x94sN\x9cs\xd2{\xb8R\xca+\xa5\x9cR\xcaj\xad;A\x10t\x95\ +\xd6-D\x9ahZ\x90\xaf\x8ezc\x11\xa5 \x10|j\xb12W75\xaf\xacVJM\x03\xfb\x7f\xee\ +r\xc9\xfc\x835!h\x00\x00\x00\x00IEND\xaeB`\x82`\xcd|Q' ) + +def getBitmap(): + return BitmapFromImage(getImage()) + +def getImage(): + stream = cStringIO.StringIO(getData()) + return ImageFromStream(stream) + +def getIcon(): + icon = EmptyIcon() + icon.CopyFromBitmap(getBitmap()) + return icon + diff --git a/src/allmydata/gui/confwiz.py b/src/allmydata/gui/confwiz.py index c5a4c610..6ef06af9 100644 --- a/src/allmydata/gui/confwiz.py +++ b/src/allmydata/gui/confwiz.py @@ -22,7 +22,8 @@ from allmydata.util.assertutil import precondition from allmydata import uri import allmydata -import amdicon +#import amdicon +import amdlogo import foolscap from twisted.python import usage @@ -194,7 +195,7 @@ class ConfWizApp(wx.App): try: wx.InitAllImageHandlers() - self.login_frame = LoginFrame(self) + self.login_frame = WizardFrame(self, LoginPanel) self.login_frame.CenterOnScreen() self.SetTopWindow(self.login_frame) #self.SetExitOnFrameDelete(True) @@ -207,7 +208,7 @@ class ConfWizApp(wx.App): def swap_to_register_frame(self): try: self.login_frame.Show(False) - self.regiser_frame = RegisterFrame(self) + self.regiser_frame = WizardFrame(self, RegisterPanel) self.regiser_frame.CenterOnScreen() self.SetTopWindow(self.regiser_frame) self.SetExitOnFrameDelete(True) @@ -215,55 +216,48 @@ class ConfWizApp(wx.App): except: DisplayTraceback('config wizard threw an exception') -class LoginFrame(wx.Frame): - def __init__(self, app): - title = 'Allmydata Config Wizard' +class WizardFrame(wx.Frame): + def __init__(self, app, panel_class): + #title = 'Allmydata Config Wizard' + title = 'Setup - Allmydata 3.0' wx.Frame.__init__(self, None, -1, title) self.app = app - self.SetIcon(amdicon.getIcon()) + self.SetIcon(amdlogo.getIcon()) self.Bind(wx.EVT_CLOSE, self.close) - background = wx.Panel(self, -1) - background.SetSizeHints(500, 360, 600, 800) - background.parent = self - self.login_panel = LoginPanel(background, app) - self.reg_btn_panel = RegisterButtonPanel(background, app) - sizer = wx.BoxSizer(wx.VERTICAL) - background_sizer = wx.BoxSizer(wx.VERTICAL) - background_sizer.Add(wx.Size(2,2), 10, wx.EXPAND | wx.ALL, 26) - background_sizer.Add(self.login_panel, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 26) - background_sizer.Add(wx.Size(2,2), 10, wx.EXPAND | wx.ALL, 26) - background_sizer.Add(self.reg_btn_panel, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 26) - background.SetSizer(background_sizer) - sizer.Add(background, 0, wx.EXPAND | wx.ALL, 0) - self.SetSizer(sizer) - self.SetAutoLayout(True) - self.Fit() - self.Layout() + self.SetSizeHints(500, 360, 600, 800) - def close(self, event): - self.Show(False) - self.app.ExitMainLoop() + banner = wx.Panel(self, -1) + banner.SetSize((496,58)) + banner.SetBackgroundColour(wx.WHITE) + banner_label = wx.StaticText(banner, -1, 'Sign in to your account') -class RegisterFrame(wx.Frame): - def __init__(self, app): - title = 'Allmydata Config Wizard' - wx.Frame.__init__(self, None, -1, title) - self.app = app - self.SetIcon(amdicon.getIcon()) - self.Bind(wx.EVT_CLOSE, self.close) + banner_icon = wx.StaticBitmap(banner, -1, amdlogo.getBitmap()) - background = wx.Panel(self, -1) - background.SetSizeHints(500, 360, 600, 800) + banner_sizer = wx.BoxSizer(wx.HORIZONTAL) + banner_sizer.Add(banner_label, 1, wx.EXPAND | wx.ALL, 12) + banner_sizer.Add(banner_icon, 0, wx.ALL, 12) + banner.SetSizer(banner_sizer) + banner.SetAutoLayout(True) + + background = wx.Panel(self, -1, style=wx.SIMPLE_BORDER) background.parent = self - self.register_panel = RegisterPanel(background, app) + + button_panel = wx.Panel(self, -1) + button_panel.SetSize((496, 64)) + + self.panel = panel_class(background, button_panel, app) sizer = wx.BoxSizer(wx.VERTICAL) background_sizer = wx.BoxSizer(wx.VERTICAL) - background_sizer.Add(wx.Size(2,2), 10, wx.EXPAND | wx.ALL, 26) - background_sizer.Add(self.register_panel, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 26) - background_sizer.Add(wx.Size(2,2), 10, wx.EXPAND | wx.ALL, 26) + background_sizer.Add(wx.Size(2,2), 0, wx.EXPAND | wx.ALL, self.panel.padding) + background_sizer.Add(self.panel, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 26) + background_sizer.Add(wx.Size(2,2), 0, wx.EXPAND | wx.ALL, self.panel.padding) background.SetSizer(background_sizer) + + + sizer.Add(banner, 0, wx.EXPAND | wx.HORIZONTAL, 0) sizer.Add(background, 0, wx.EXPAND | wx.ALL, 0) + sizer.Add(button_panel, 0, wx.EXPAND | wx.HORIZONTAL, 0) self.SetSizer(sizer) self.SetAutoLayout(True) self.Fit() @@ -275,7 +269,9 @@ class RegisterFrame(wx.Frame): class LoginPanel(wx.Panel): - def __init__(self, parent, app): + padding = 26 + + def __init__(self, parent, button_panel, app): wx.Panel.__init__(self, parent, -1) self.parent = parent self.app = app @@ -286,24 +282,36 @@ class LoginPanel(wx.Panel): self.pass_label = wx.StaticText(self, -1, 'Password') self.user_field = wx.TextCtrl(self, -1, u'', size=(260,-1)) self.pass_field = wx.TextCtrl(self, -1, u'', size=(260,-1), style=wx.TE_PASSWORD) - self.login_button = wx.Button(self, -1, 'Sign In') self.warning_label = wx.StaticText(self, -1, '') self.warning_label.SetOwnForegroundColour(wx.RED) wx.EVT_CHAR(self.user_field, self.on_user_entry) wx.EVT_CHAR(self.pass_field, self.on_pass_entry) - self.Bind(wx.EVT_BUTTON, self.on_login, self.login_button) - login_sizer = wx.FlexGridSizer(3, 2, 5, 4) + login_sizer = wx.FlexGridSizer(2, 2, 5, 4) login_sizer.Add(self.user_label, 0, wx.ALIGN_RIGHT | wx.ALL, 2) login_sizer.Add(self.user_field, 0, wx.EXPAND | wx.ALL, 2) login_sizer.Add(self.pass_label, 0, wx.ALIGN_RIGHT | wx.ALL, 2) login_sizer.Add(self.pass_field, 0, wx.EXPAND | wx.ALL, 2) - login_sizer.Add(wx.Size(2,2), 0, wx.ALIGN_RIGHT | wx.ALL, 2) - login_sizer.Add(self.login_button, 0, wx.ALIGN_RIGHT | wx.ALL, 2) self.sizer.Add(login_sizer, 1, wx.EXPAND | wx.ALL, 2) self.sizer.Add(self.warning_label, 0, wx.CENTER | wx.ALL, 2) self.SetSizer(self.sizer) self.SetAutoLayout(True) + self.reg_label = wx.StaticText(button_panel, -1, "Don't have an account?") + self.reg_button = wx.Button(button_panel, -1, 'Create Account') + self.login_button = wx.Button(button_panel, -1, 'Sign In') + button_panel.Bind(wx.EVT_BUTTON, self.on_reg_button, self.reg_button) + button_panel.Bind(wx.EVT_BUTTON, self.on_login, self.login_button) + btn_sizer = wx.BoxSizer(wx.HORIZONTAL) + btn_sizer.Add(wx.Size(2,2), 1, wx.EXPAND | wx.ALL, 12) + btn_sizer.Add(self.reg_label, 0, wx.ALIGN_RIGHT | wx.ALL, 12) + btn_sizer.Add(self.reg_button, 0, wx.ALIGN_RIGHT | wx.ALL, 12) + btn_sizer.Add(self.login_button, 0, wx.ALIGN_RIGHT | wx.ALL, 12) + button_panel.SetSizer(btn_sizer) + self.button_panel = button_panel + + def on_reg_button(self, event): + self.app.swap_to_register_frame() + def on_user_entry(self, event): if event.GetKeyCode() == wx.WXK_RETURN: self.pass_field.SetFocus() @@ -356,29 +364,10 @@ class LoginPanel(wx.Panel): # exit self.parent.parent.Close() -class RegisterButtonPanel(wx.Panel): - def __init__(self, parent, app): - wx.Panel.__init__(self, parent, -1) - self.parent = parent - self.app = app - - self.sizer = wx.BoxSizer(wx.VERTICAL) - - self.reg_label = wx.StaticText(self, -1, "Don't have an account?") - self.reg_button = wx.Button(self, -1, 'Create Account') - self.Bind(wx.EVT_BUTTON, self.on_reg_button, self.reg_button) - reg_sizer = wx.FlexGridSizer(1, 2, 5, 4) - reg_sizer.Add(self.reg_label, 0, wx.ALIGN_RIGHT | wx.ALL, 2) - reg_sizer.Add(self.reg_button, 0, wx.ALIGN_RIGHT | wx.ALL, 2) - self.sizer.Add(reg_sizer, 1, wx.EXPAND | wx.ALL, 2) - self.SetSizer(self.sizer) - self.SetAutoLayout(True) - - def on_reg_button(self, event): - self.app.swap_to_register_frame() - class RegisterPanel(wx.Panel): - def __init__(self, parent, app): + padding = 7 + + def __init__(self, parent, button_panel, app): wx.Panel.__init__(self, parent, -1) self.parent = parent self.app = app @@ -391,7 +380,6 @@ class RegisterPanel(wx.Panel): self.user_field = wx.TextCtrl(self, -1, u'', size=(260,-1)) self.pass_field = wx.TextCtrl(self, -1, u'', size=(260,-1), style=wx.TE_PASSWORD) self.conf_field = wx.TextCtrl(self, -1, u'', size=(260,-1), style=wx.TE_PASSWORD) - self.create_account_button = wx.Button(self, -1, 'Create Account') self.subscribe_box = wx.CheckBox(self, -1, 'Sign up for our Newsletter') self.subscribe_box.SetValue(True) self.warning_label = wx.StaticText(self, -1, '') @@ -399,8 +387,7 @@ class RegisterPanel(wx.Panel): wx.EVT_CHAR(self.user_field, self.on_user_entry) wx.EVT_CHAR(self.pass_field, self.on_pass_entry) wx.EVT_CHAR(self.conf_field, self.on_conf_entry) - self.Bind(wx.EVT_BUTTON, self.on_create_account, self.create_account_button) - login_sizer = wx.FlexGridSizer(4, 2, 5, 4) + login_sizer = wx.FlexGridSizer(3, 2, 5, 4) login_sizer.Add(self.user_label, 0, wx.ALIGN_RIGHT | wx.ALL, 2) login_sizer.Add(self.user_field, 0, wx.EXPAND | wx.ALL, 2) login_sizer.Add(self.pass_label, 0, wx.ALIGN_RIGHT | wx.ALL, 2) @@ -408,14 +395,23 @@ class RegisterPanel(wx.Panel): login_sizer.Add(self.conf_label, 0, wx.ALIGN_RIGHT | wx.ALL, 2) login_sizer.Add(self.conf_field, 0, wx.EXPAND | wx.ALL, 2) login_sizer.Add(wx.Size(2,2), 0, wx.ALIGN_RIGHT | wx.ALL, 2) - login_sizer.Add(self.create_account_button, 0, wx.ALIGN_RIGHT | wx.ALL, 2) - self.sizer.Add(login_sizer, 1, wx.EXPAND | wx.ALL, 2) + self.sizer.Add(login_sizer, 0, wx.EXPAND | wx.ALL, 2) self.sizer.Add(self.warning_label, 0, wx.CENTER | wx.ALL, 2) self.sizer.Add(wx.Size(2,2), 0, wx.EXPAND | wx.ALL, 4) self.sizer.Add(self.subscribe_box, 0, wx.CENTER | wx.ALL, 2) self.SetSizer(self.sizer) self.SetAutoLayout(True) + self.reg_button = wx.Button(button_panel, -1, 'Create Account') + button_panel.Bind(wx.EVT_BUTTON, self.on_create_account, self.reg_button) + btn_sizer = wx.BoxSizer(wx.HORIZONTAL) + btn_sizer.Add(wx.Size(2,2), 1, wx.EXPAND | wx.ALL, 12) + btn_sizer.Add(self.reg_button, 0, wx.ALIGN_RIGHT | wx.ALL, 12) + button_panel.SetSizer(btn_sizer) + self.button_panel = button_panel + + self.Fit() + def on_user_entry(self, event): if event.GetKeyCode() == wx.WXK_RETURN: self.pass_field.SetFocus()