From 513072a50b120b48aa90428031cab68f7c781fbe Mon Sep 17 00:00:00 2001 From: Julien Lengrand-Lambert Date: Tue, 28 Aug 2012 08:04:46 +0200 Subject: [PATCH] Finally starting to have something looking like a GUI --- ivolution/data/media/icons/0_Readme_First.txt | 29 ++ ivolution/data/media/icons/accepted_48.png | Bin 0 -> 4488 bytes ivolution/data/media/icons/cancel_48.png | Bin 0 -> 4552 bytes ivolution/data/media/icons/folder_add_48.png | Bin 0 -> 4171 bytes ivolution/data/media/icons/spanner_48.png | Bin 0 -> 4015 bytes ivolution/gui_wx/IvolutionTemplate.py | 377 ++++++------------ ivolution/gui_wx/IvolutionTemplate.v1 | 274 +++++++++++++ ivolution/gui_wx/IvolutionWindow.py | 4 +- ivolution/gui_wx/IvolutionWindow.v1 | 288 +++++++++++++ 9 files changed, 714 insertions(+), 258 deletions(-) create mode 100644 ivolution/data/media/icons/0_Readme_First.txt create mode 100644 ivolution/data/media/icons/accepted_48.png create mode 100644 ivolution/data/media/icons/cancel_48.png create mode 100644 ivolution/data/media/icons/folder_add_48.png create mode 100644 ivolution/data/media/icons/spanner_48.png create mode 100644 ivolution/gui_wx/IvolutionTemplate.v1 create mode 100644 ivolution/gui_wx/IvolutionWindow.v1 diff --git a/ivolution/data/media/icons/0_Readme_First.txt b/ivolution/data/media/icons/0_Readme_First.txt new file mode 100644 index 0000000..da15172 --- /dev/null +++ b/ivolution/data/media/icons/0_Readme_First.txt @@ -0,0 +1,29 @@ + + +Function Free Icon Set + +--- + +http://www.wefunction.com + +--- + +This Set was brought to you by Function +Design & Development Studio. + +Make sure you share these Icons using this +link only: + +http://www.wefunction.com/function-free-icon-set + +--- + +We're looking for New Clients for Web Design & Blog +Design Projects, we build and design fully unique +design & development solutions + +--- + +contact: liam@wefunction.com + +Website: www.wefunction.com \ No newline at end of file diff --git a/ivolution/data/media/icons/accepted_48.png b/ivolution/data/media/icons/accepted_48.png new file mode 100644 index 0000000000000000000000000000000000000000..ac921152ee0f1eb2eeb3185b21910e242e7ad91e GIT binary patch literal 4488 zcmV;35qIv1P)004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000U( 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 VC5IYZFJb@y002ovPDHLkV1f}8?}q>Y literal 0 HcmV?d00001 diff --git a/ivolution/data/media/icons/spanner_48.png b/ivolution/data/media/icons/spanner_48.png new file mode 100644 index 0000000000000000000000000000000000000000..da40555962d663aba270274c08ede2ca4edc4a4a GIT binary patch literal 4015 zcmV;g4^Z%lP)004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000U( zX+uL$P-t&-Z*ypGa3D!TLm+T+Z)Rz1WdHz3$DNjUR8-d%htIutdZEoQ(iwV_E---f zE+8EQQ5a?h7|H;{3{7l^s6a#!5dlSzpnw6Rp-8NVVj(D~U=K(TP+~BOsHkK{)=GSN zdGF=r_s6~8+Gp=`_t|@&wJrc8PaiHX1(pIJnJ3@}dN|Wpg-6h_{Qw4dfB~ieFj?uT zzCrH6KqN0W7kawL3H*!R3;{^|zGdj?Pp5H0=h0sk8Wyh&7ga7GLtw0fuTQ>mB{3?=`JbBsZ3rr0E=h-EE#ca>7pWA znp#_08k!lIeo?6Zy7)IG?(HJI3i#YJh}QRq?XUb&>HuKOifXg#4_nNB06Mk;Ab0-{ zo8}<^Bt?B|zwyO+XySQ^7YI^qjEyrhGmW?$mXWxizw3WG{0)8aJtOgUzn6#Z%86wP zlLT~e-B>9}DMCIyJ(bDg&<+1Q#Q!+(uk%&0*raG}W_n!s* z`>t?__>spaFD&Aut10z!o?HH?RWufnX30 z)&drY2g!gBGC?lb3<^LI*ah~2N>BspK_h4ZCqM@{4K9Go;5xVo?tlki1dM~{UdPU)xj{ZqAQTQoLvauf5<ZgZNI6o6v>;tbFLDbRL8g&+C=7~%qN5B^ zwkS_j2#SSDLv276qbgBHQSGQ6)GgE~Y6kTQO-3uB4bV1dFZ3#O96A$SfG$Tjpxe-w z(09<|=rSYbRd;g|%>I!rO<0Hzgl9y5R$!^~o_Sb3}g)(-23Wnu-`0_=Y5 zG3+_)Aa)%47DvRX;>>XFxCk5%mxn9IHQ~!?W?(_!4|Qz6*Z? zKaQU#NE37jc7$L;0%0?ug3v;^M0iMeMI;i{iPppbBA2*{SV25ayh0o$z9Y$y^hqwH zNRp7WlXQf1o^+4&icBVJlO4$sWC3|6xsiO4{FwY!f+Arg;U&SA*eFpY(JnD4@j?SR-`K0DzX#{6;CMMSAv!Fl>(L4DIHeoQ<_y) zQT9+yRo<_BQF&U0rsAlQpi-uCR%J?+qH3?oRV`CJr}~U8OLw9t(JSaZ^cgiJHBU96 zTCG~Y+Pu1sdWd?SdaL>)4T1(kBUYnKqg!J}Q&rPfGgq@&^S%~di=h>-wNI;8Yff87 zJ4}0Dt zz%@8vFt8N8)OsmzY2DIcLz1DBVTNI|;iwVK$j2zpsKe-mv8Hi^@owW@<4-0QCP^ms zCJ#(yOjnrZnRc1}YNl_-GOIGXZB90KH{WR9Y5sDV!7|RWgUjw(P%L~cwpnyre6+N( zHrY-t*ICY4 zUcY?IPTh`aS8F$7Pq&Y@KV(1Rpyt4IsB?JYsNu+VY;c@#(sN31I_C7k*~FRe+~z#z zV&k&j<-9B6>fu`G+V3Xg7UEXv_SjwBJ8G6!a$8Ik+VFL5OaMFr+(FGBh%@F?24>HLNsjWR>x%^{cLj zD}-~yJ0q|Wp%D!cv#Z@!?_E6}X%SfvIkZM+P1c&LYZcZetvwSZ8O4k`8I6t(i*Abk z!1QC*F=u1EVya_iST3x6tmkY;b{Tt$W5+4wOvKv7mc~xT*~RUNn~HacFOQ$*x^OGG zFB3cyY7*uW{SuEPE+mB|wI<_|qmxhZWO#|Zo)ndotdxONgVci5ku;mMy=gOiZ+=5M zl)fgtQ$Q8{O!WzMgPUHd;& z##i2{a;|EvR;u1nJ$Hb8VDO;h!Im23nxdNbhq#CC)_T;o*J;<4AI2QcIQ+Cew7&Oi z#@CGv3JpaKACK^kj2sO-+S6#&*x01hRMHGL3!A5oMIO8Pjq5j^Eru<%t+dvnoA$o+&v?IGcZV;atwS+4HIAr!T}^80(JeesFQs#oIjrJ^h!wFI~Cpe)(drQ}4Me zc2`bcwYhrg8sl2Wb<6AReHMLfKUnZUby9Y>+)@{ z+t=@`yfZKqGIV!1a(Lt}`|jkuqXC)@%*Rcr{xo>6OEH*lc%TLr*1x5{cQYs>ht;Of}f>-u708W z;=5lQf9ac9H8cK_|8n8i;#cyoj=Wy>x_j1t_VJtKH}i9aZ{^<}eaCp$`#$Xb#C+xl z?1zevdLO$!d4GDiki4+)8~23s`{L#u!T5@%*c><*F)^BGjQ(meWBkEr zW{8`3`DKZJfzh9I>N+rHFj^QaaSpI-fpS|*8HK`H`nJ5S=XtUbF%T}TCwbB~dHQ~y zbI$jCpI4TqKo)~NE}2Xsl}bUWRPOp@S+>C8@CrspMv>S|LMF(No09`al>=4P_8s9u zHj*75ABWrRhFqb5K3@xKr3Ll%_3+*E?fUqP!3zru7#+P0o6U;cTmc1zg)kHuaJ{z= z%}1O6Kk&%NZP@L0>S-D|R9;Dv@Y^*vPPeqcU?|!GhgVi`i(2s{GRk;)c^PprPMPLH zCX?~iOPQW}`6Uz-=(iw#{|v7F@+*SD06!RujKHFp;4q04oK8vn0A{lp@wiC8)7adU z@bKX>Zrtd{D|DFHMhu&e!5OJK@E`z>cL+vfInP9+Q9~}5V`9RGwKallillI$z3nW< z|DM2%e-^E+El`pOGXnqg^Hr!-DyURSa66!-(dI**my5_+g#XUh=@AZx*;fRDL7aW{ z46n?gOWi*(05KkiPN&1d!aNoi7a=ARh(21!GJzy1#aqC1z=WsKXrNK6IrPvycDsA| z=^YLS{4>+Y%ac=CH@Ram8)Tp~sP|GDf{?@2Jv%ptrlzLDtNITTN;LKe^>uZaob*8< zS3K^ohWFRya?t@2h;M9A3)Il-^|bFEDl8UMRG1G39vHZZrO+arH8mI;8{_3;nX*r< zR*Tx&S}3XK^JFTlui=$2JcC|TS}W1~%+uS^UpntLUObJ#=gLVgC0yxO~dJQ(B~9~ilWHN$Swp& zwS&*^C!b!#J8!=QlhL^66|g7ReZ3EJv$G^5JE`{pWvHQSB+9CQUwuqqCX*STcVEJr zZ@f+iFzpFt8@7R&3Ct2?+V98udK4iV5v5YWMKM1=4+RZA^W#E-G6$-rOid;edcOV^ z9p~C%qh9Vew!jSN^?Ld2MsN2MbirKp@CfYcLp)pm}AbbvkQtspl(nw70=} z0O(f6cmBMCp<%MVawG2<^ItyX^qn~p1G2?RyAj(Um0C%`PAczZbauQ3J6(wf4Ivhb zV$kD3d3iaKQj%xGz$zLGZUh7t#U!H9C|_l?&q>hFE_S1<^W34JJgNKlr;(eNN5CYs z8a9h{d5F`PyUTO$>?D%nnLQ7Qk5xRAT z;qy(B7v~dH#>-4Dh-+k*ZD&rS%4R!gb+_#olnN#H)RQM)#PHBC{^WBaPG&_hN~x zk-1b3nSM4xFqw?>f~F&Tv*5&u7q*v!N?TG~%mpWq;3{bkQ++mKN9T$}BDiwpJJ{@2 z)>g7e4Zn5zZ+hq=Z{;^qrm-XV`yYNp5gB^{c`<`BxAJHyesHZBrdpA&CR*EA>TqrFq%?fl^a4Z(X9KA8HnPon$rdO71$DX%Swt-Kc_YY4c VFg{j$`uhL?002ovPDHLkV1j$9pzHtu literal 0 HcmV?d00001 diff --git a/ivolution/gui_wx/IvolutionTemplate.py b/ivolution/gui_wx/IvolutionTemplate.py index 0fdb7ae..d4aaea2 100644 --- a/ivolution/gui_wx/IvolutionTemplate.py +++ b/ivolution/gui_wx/IvolutionTemplate.py @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +# -*- coding: utf-8 -*- ########################################################################### ## Python code generated with wxFormBuilder (version Jun 30 2011) @@ -9,266 +9,129 @@ import wx import wx.xrc +import wx.aui + +inputid = 1000 +settingsid = 1001 +startid = 1002 +stopid = 1003 +helpid = 1004 ########################################################################### ## Class IvolutionTemplate ########################################################################### class IvolutionTemplate ( wx.Frame ): - - def __init__( self, parent ): - wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"Ivolution", pos = wx.DefaultPosition, size = wx.Size( 250,620 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL ) - - self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize ) - - maingrid = wx.FlexGridSizer( 3, 1, 0, 0 ) - maingrid.SetFlexibleDirection( wx.BOTH ) - maingrid.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - titlelayout = wx.BoxSizer( wx.HORIZONTAL ) - - titlelayout.SetMinSize( wx.Size( 50,50 ) ) - logobox = wx.BoxSizer( wx.VERTICAL ) - - logobox.SetMinSize( wx.Size( 50,50 ) ) - self.logo = wx.StaticBitmap( self, wx.ID_ANY, wx.NullBitmap, wx.DefaultPosition, wx.Size( 50,50 ), 0 ) - logobox.Add( self.logo, 1, wx.ALL, 5 ) - - titlelayout.Add( logobox, 1, wx.FIXED_MINSIZE, 5 ) - - self.title = wx.StaticText( self, wx.ID_ANY, u"Ivolution", wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_CENTRE|wx.ALIGN_LEFT ) - self.title.Wrap( -1 ) - self.title.SetFont( wx.Font( 16, 71, 90, 92, False, wx.EmptyString ) ) - - titlelayout.Add( self.title, 3, wx.ALIGN_LEFT|wx.ALL|wx.EXPAND, 5 ) - - maingrid.Add( titlelayout, 1, wx.EXPAND, 5 ) - - settingsbox = wx.FlexGridSizer( 2, 1, 0, 0 ) - settingsbox.SetFlexibleDirection( wx.BOTH ) - settingsbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - requiredbox = wx.FlexGridSizer( 3, 1, 0, 0 ) - requiredbox.SetFlexibleDirection( wx.BOTH ) - requiredbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.title = wx.StaticText( self, wx.ID_ANY, u"Required parameters:", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.title.Wrap( -1 ) - self.title.SetFont( wx.Font( wx.NORMAL_FONT.GetPointSize(), 70, 90, 92, False, wx.EmptyString ) ) - - requiredbox.Add( self.title, 0, wx.ALL, 5 ) - - inputbox = wx.FlexGridSizer( 2, 1, 0, 0 ) - inputbox.SetFlexibleDirection( wx.BOTH ) - inputbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.inputtitle = wx.StaticText( self, wx.ID_ANY, u"Choose your input folder:", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.inputtitle.Wrap( -1 ) - inputbox.Add( self.inputtitle, 0, wx.ALL, 5 ) - - inputchooserbox = wx.FlexGridSizer( 1, 2, 0, 0 ) - inputchooserbox.SetFlexibleDirection( wx.BOTH ) - inputchooserbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.inputchooserbutton = wx.Button( self, wx.ID_ANY, u"..", wx.DefaultPosition, wx.Size( 30,25 ), 0 ) - inputchooserbox.Add( self.inputchooserbutton, 1, wx.ALL, 5 ) - - self.inputtextbox = wx.StaticText( self, wx.ID_ANY, u"/home/jll/Documents/Ivolutionnnn", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.inputtextbox.Wrap( -1 ) - inputchooserbox.Add( self.inputtextbox, 0, wx.ALL, 5 ) - - inputbox.Add( inputchooserbox, 1, wx.EXPAND, 5 ) - - requiredbox.Add( inputbox, 1, wx.EXPAND, 5 ) - - outputbox = wx.FlexGridSizer( 2, 1, 0, 0 ) - outputbox.SetFlexibleDirection( wx.BOTH ) - outputbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.outputtitle = wx.StaticText( self, wx.ID_ANY, u"Choose your output folder:", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.outputtitle.Wrap( -1 ) - outputbox.Add( self.outputtitle, 0, wx.ALL, 5 ) - - outputchooserbox = wx.FlexGridSizer( 1, 2, 0, 0 ) - outputchooserbox.SetFlexibleDirection( wx.BOTH ) - outputchooserbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.outputchooserbutton = wx.Button( self, wx.ID_ANY, u"..", wx.DefaultPosition, wx.Size( 30,25 ), 0 ) - outputchooserbox.Add( self.outputchooserbutton, 0, wx.ALL, 5 ) - - self.outputchoosertext = wx.StaticText( self, wx.ID_ANY, u"/home/jll/Videos", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.outputchoosertext.Wrap( -1 ) - outputchooserbox.Add( self.outputchoosertext, 0, wx.ALL, 5 ) - - outputbox.Add( outputchooserbox, 1, wx.EXPAND, 5 ) - - requiredbox.Add( outputbox, 1, wx.EXPAND, 5 ) - - settingsbox.Add( requiredbox, 1, wx.EXPAND, 5 ) - - optionalbox = wx.FlexGridSizer( 5, 1, 0, 0 ) - optionalbox.SetFlexibleDirection( wx.BOTH ) - optionalbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.title1 = wx.StaticText( self, wx.ID_ANY, u"Optional parameters:", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.title1.Wrap( -1 ) - self.title1.SetFont( wx.Font( wx.NORMAL_FONT.GetPointSize(), 70, 90, 92, False, wx.EmptyString ) ) - - optionalbox.Add( self.title1, 0, wx.ALL, 5 ) - - typefacebox = wx.FlexGridSizer( 2, 1, 0, 0 ) - typefacebox.SetFlexibleDirection( wx.BOTH ) - typefacebox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.typefacetext = wx.StaticText( self, wx.ID_ANY, u"Type of face:", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.typefacetext .Wrap( -1 ) - typefacebox.Add( self.typefacetext , 0, wx.ALL, 5 ) - - typefacelistChoices = [ u"frontal_face", u"profile_face" ] - self.typefacelist = wx.ComboBox( self, wx.ID_ANY, u"frontal_face", wx.DefaultPosition, wx.DefaultSize, typefacelistChoices, wx.CB_READONLY ) - typefacebox.Add( self.typefacelist, 0, wx.ALL, 5 ) - - optionalbox.Add( typefacebox, 1, wx.EXPAND, 5 ) - - videospeedbox = wx.FlexGridSizer( 2, 1, 0, 0 ) - videospeedbox.SetFlexibleDirection( wx.BOTH ) - videospeedbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.videospeedtext = wx.StaticText( self, wx.ID_ANY, u"Video Speed:", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.videospeedtext.Wrap( -1 ) - videospeedbox.Add( self.videospeedtext, 0, wx.ALL, 5 ) - - videospeedlistChoices = [ u"slow", u"medium", u"fast" ] - self.videospeedlist = wx.ComboBox( self, wx.ID_ANY, u"medium", wx.DefaultPosition, wx.DefaultSize, videospeedlistChoices, wx.CB_READONLY ) - videospeedbox.Add( self.videospeedlist, 0, wx.ALL, 5 ) - - optionalbox.Add( videospeedbox, 1, wx.EXPAND, 5 ) - - videomodebox = wx.FlexGridSizer( 2, 1, 0, 0 ) - videomodebox.SetFlexibleDirection( wx.BOTH ) - videomodebox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.videomodetext = wx.StaticText( self, wx.ID_ANY, u"Choose your prefered mode:", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.videomodetext.Wrap( -1 ) - videomodebox.Add( self.videomodetext, 0, wx.ALL, 5 ) - - videomodechoices = wx.FlexGridSizer( 1, 2, 0, 0 ) - videomodechoices.SetFlexibleDirection( wx.BOTH ) - videomodechoices.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.cropmode = wx.RadioButton( self, wx.ID_ANY, u"Crop Mode", wx.DefaultPosition, wx.DefaultSize, wx.RB_GROUP ) - self.cropmode.SetValue( True ) - videomodechoices.Add( self.cropmode, 0, wx.ALL, 5 ) - - self.conservativemode = wx.RadioButton( self, wx.ID_ANY, u"Conservative Mode", wx.DefaultPosition, wx.DefaultSize, 0 ) - videomodechoices.Add( self.conservativemode , 0, wx.ALL, 5 ) - - videomodebox.Add( videomodechoices, 1, wx.EXPAND, 5 ) - - optionalbox.Add( videomodebox, 1, wx.EXPAND, 5 ) - - filemethodbox = wx.FlexGridSizer( 2, 1, 0, 0 ) - filemethodbox.SetFlexibleDirection( wx.BOTH ) - filemethodbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.filemethodtext = wx.StaticText( self, wx.ID_ANY, u"Choose your prefered method:", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.filemethodtext.Wrap( -1 ) - filemethodbox.Add( self.filemethodtext, 0, wx.ALL, 5 ) - - videomodechoices = wx.FlexGridSizer( 1, 2, 0, 0 ) - videomodechoices.SetFlexibleDirection( wx.BOTH ) - videomodechoices.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.namemode = wx.RadioButton( self, wx.ID_ANY, u"File name", wx.DefaultPosition, wx.DefaultSize, wx.RB_GROUP ) - self.namemode.SetValue( True ) - videomodechoices.Add( self.namemode, 0, wx.ALL, 5 ) - - self.exifmode = wx.RadioButton( self, wx.ID_ANY, u"EXIF metadata", wx.DefaultPosition, wx.DefaultSize, 0 ) - videomodechoices.Add( self.exifmode , 0, wx.ALL, 5 ) - - filemethodbox.Add( videomodechoices, 1, wx.EXPAND, 5 ) - - optionalbox.Add( filemethodbox, 1, wx.EXPAND, 5 ) - - settingsbox.Add( optionalbox, 1, wx.EXPAND, 5 ) - - maingrid.Add( settingsbox, 1, wx.EXPAND, 5 ) - - commandbox = wx.FlexGridSizer( 2, 1, 0, 0 ) - commandbox.SetFlexibleDirection( wx.BOTH ) - commandbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - buttonsbox = wx.FlexGridSizer( 1, 2, 0, 0 ) - buttonsbox.SetFlexibleDirection( wx.BOTH ) - buttonsbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.startbutton = wx.Button( self, wx.ID_ANY, u"Create Movie!", wx.DefaultPosition, wx.DefaultSize, 0 ) - buttonsbox.Add( self.startbutton, 0, wx.ALL, 5 ) - - self.stopbutton = wx.Button( self, wx.ID_ANY, u"Stop processing", wx.DefaultPosition, wx.DefaultSize, 0 ) - buttonsbox.Add( self.stopbutton, 0, wx.ALL, 5 ) - - commandbox.Add( buttonsbox, 1, wx.EXPAND, 5 ) - - self.progressgauge = wx.Gauge( self, wx.ID_ANY, 100, wx.DefaultPosition, wx.DefaultSize, wx.GA_HORIZONTAL ) - commandbox.Add( self.progressgauge , 0, wx.ALL|wx.EXPAND, 5 ) - - maingrid.Add( commandbox, 1, wx.EXPAND, 5 ) - - self.SetSizer( maingrid ) - self.Layout() - self.sb = self.CreateStatusBar( 2, wx.ST_SIZEGRIP, wx.ID_ANY ) - self.menubar = wx.MenuBar( 0 ) - self.filemenu = wx.Menu() - self.menuhelp = wx.MenuItem( self.filemenu, wx.ID_ANY, u"Help"+ u"\t" + u"CTRL + h", wx.EmptyString, wx.ITEM_NORMAL ) - self.filemenu.AppendItem( self.menuhelp ) - - self.menuabout = wx.MenuItem( self.filemenu, wx.ID_ANY, u"About"+ u"\t" + u"CTRL + F12", wx.EmptyString, wx.ITEM_NORMAL ) - self.filemenu.AppendItem( self.menuabout ) - - self.menuexit = wx.MenuItem( self.filemenu, wx.ID_ANY, u"Exit"+ u"\t" + u"CTRL + Q", wx.EmptyString, wx.ITEM_NORMAL ) - self.filemenu.AppendItem( self.menuexit ) - - self.menubar.Append( self.filemenu, u"File" ) - - self.SetMenuBar( self.menubar ) - - - self.Centre( wx.BOTH ) - - # Connect Events - self.inputchooserbutton.Bind( wx.EVT_BUTTON, self.on_input ) - self.outputchooserbutton.Bind( wx.EVT_BUTTON, self.on_output ) - self.startbutton.Bind( wx.EVT_BUTTON, self.on_start ) - self.stopbutton.Bind( wx.EVT_BUTTON, self.on_stop ) - self.Bind( wx.EVT_MENU, self.on_help, id = self.menuhelp.GetId() ) - self.Bind( wx.EVT_MENU, self.on_about, id = self.menuabout.GetId() ) - self.Bind( wx.EVT_MENU, self.on_exit, id = self.menuexit.GetId() ) - - def __del__( self ): - pass - - - # Virtual event handlers, overide them in your derived class - def on_input( self, event ): - event.Skip() - - def on_output( self, event ): - event.Skip() - - def on_start( self, event ): - event.Skip() - - def on_stop( self, event ): - event.Skip() - - def on_help( self, event ): - event.Skip() - - def on_about( self, event ): - event.Skip() - - def on_exit( self, event ): - event.Skip() - + + def __init__( self, parent ): + wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 560,645 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL ) + + self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize ) + + self.statusbar = self.CreateStatusBar( 2, wx.ST_SIZEGRIP, wx.ID_ANY ) + self.menubar = wx.MenuBar( 0 ) + self.filemenu = wx.Menu() + self.exititem = wx.MenuItem( self.filemenu, wx.ID_ANY, u"Exit"+ u"\t" + u"CTRL + q", wx.EmptyString, wx.ITEM_NORMAL ) + self.filemenu.AppendItem( self.exititem ) + + self.menubar.Append( self.filemenu, u"File" ) + + self.aboutmenu = wx.Menu() + self.helpitem = wx.MenuItem( self.aboutmenu, wx.ID_ANY, u"Help"+ u"\t" + u"CTRL + h", wx.EmptyString, wx.ITEM_NORMAL ) + self.aboutmenu.AppendItem( self.helpitem ) + + self.aboutmenu.AppendSeparator() + + self.aboutitem = wx.MenuItem( self.aboutmenu, wx.ID_ANY, u"About"+ u"\t" + u"CTRL + F12", wx.EmptyString, wx.ITEM_NORMAL ) + self.aboutmenu.AppendItem( self.aboutitem ) + + self.menubar.Append( self.aboutmenu, u"About" ) + + self.SetMenuBar( self.menubar ) + + mainsizer = wx.FlexGridSizer( 4, 1, 0, 0 ) + mainsizer.AddGrowableCol( 0 ) + mainsizer.AddGrowableRow( 2 ) + mainsizer.SetFlexibleDirection( wx.BOTH ) + mainsizer.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_ALL ) + + self.toolbar = wx.aui.AuiToolBar( self, wx.ID_ANY, wx.DefaultPosition, wx.Size( -1,25 ), wx.aui.AUI_TB_HORZ_LAYOUT ) + self.toolbar.SetToolBitmapSize( wx.Size( 25,25 ) ) + self.toolbar.SetMinSize( wx.Size( -1,25 ) ) + self.toolbar.SetMaxSize( wx.Size( -1,25 ) ) + + self.toolbar.AddTool( inputid, u"Input", wx.Bitmap( u"../Ivolution/ivolution/data/media/icons/folder_add_48.png", wx.BITMAP_TYPE_ANY ), wx.NullBitmap, wx.ITEM_NORMAL, wx.EmptyString, wx.EmptyString, None ) + + + self.toolbar.AddTool( settingsid, u"Settings", wx.Bitmap( u"../Ivolution/ivolution/data/media/icons/spanner_48.png", wx.BITMAP_TYPE_ANY ), wx.NullBitmap, wx.ITEM_NORMAL, wx.EmptyString, wx.EmptyString, None ) + + + self.toolbar.AddSeparator() + + self.toolbar.AddTool( startid, u"Go!", wx.Bitmap( u"../Ivolution/ivolution/data/media/icons/accepted_48.png", wx.BITMAP_TYPE_ANY ), wx.NullBitmap, wx.ITEM_NORMAL, wx.EmptyString, wx.EmptyString, None ) + + + self.toolbar.AddTool( stopid, u"Stop!", wx.Bitmap( u"../Ivolution/ivolution/data/media/icons/cancel_48.png", wx.BITMAP_TYPE_ANY ), wx.NullBitmap, wx.ITEM_NORMAL, wx.EmptyString, wx.EmptyString, None ) + + + self.toolbar.AddSeparator() + + self.helptool = wx.HyperlinkCtrl( self.toolbar, helpid, u"Ivolution online", u"http://jlengrand.github.com/FaceMovie/", wx.DefaultPosition, wx.DefaultSize, wx.HL_ALIGN_RIGHT ) + self.toolbar.AddControl( self.helptool ) + self.toolbar.Realize() + + mainsizer.Add( self.toolbar, 0, wx.EXPAND|wx.TOP, 0 ) + + self.inputtextbox = wx.StaticText( self, wx.ID_ANY, u"Chosen Folder : ", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.inputtextbox.Wrap( -1 ) + mainsizer.Add( self.inputtextbox, 0, wx.ALL, 5 ) + + self.filelist = wx.ListCtrl( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LC_LIST ) + mainsizer.Add( self.filelist, 0, wx.EXPAND, 5 ) + + self.progressgauge = wx.Gauge( self, wx.ID_ANY, 100, wx.DefaultPosition, wx.DefaultSize, wx.GA_HORIZONTAL ) + mainsizer.Add( self.progressgauge, 0, wx.ALL|wx.EXPAND, 5 ) + + self.SetSizer( mainsizer ) + self.Layout() + + self.Centre( wx.BOTH ) + + # Connect Events + self.Bind( wx.EVT_MENU, self.on_exit, id = self.exititem.GetId() ) + self.Bind( wx.EVT_MENU, self.on_help, id = self.helpitem.GetId() ) + self.Bind( wx.EVT_MENU, self.on_about, id = self.aboutitem.GetId() ) + self.Bind( wx.EVT_TOOL, self.on_input, id = inputid ) + self.Bind( wx.EVT_TOOL, self.on_settings, id = settingsid ) + self.Bind( wx.EVT_TOOL, self.on_start, id = startid ) + self.Bind( wx.EVT_TOOL, self.on_stop, id = stopid ) + self.helptool.Bind( wx.EVT_HYPERLINK, self.on_help ) + + def __del__( self ): + pass + + + # Virtual event handlers, overide them in your derived class + def on_exit( self, event ): + event.Skip() + + def on_help( self, event ): + event.Skip() + + def on_about( self, event ): + event.Skip() + + def on_input( self, event ): + event.Skip() + + def on_settings( self, event ): + event.Skip() + + def on_start( self, event ): + event.Skip() + + def on_stop( self, event ): + event.Skip() + + diff --git a/ivolution/gui_wx/IvolutionTemplate.v1 b/ivolution/gui_wx/IvolutionTemplate.v1 new file mode 100644 index 0000000..0fdb7ae --- /dev/null +++ b/ivolution/gui_wx/IvolutionTemplate.v1 @@ -0,0 +1,274 @@ +# -*- coding: utf-8 -*- + +########################################################################### +## Python code generated with wxFormBuilder (version Jun 30 2011) +## http://www.wxformbuilder.org/ +## +## PLEASE DO "NOT" EDIT THIS FILE! +########################################################################### + +import wx +import wx.xrc + +########################################################################### +## Class IvolutionTemplate +########################################################################### + +class IvolutionTemplate ( wx.Frame ): + + def __init__( self, parent ): + wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"Ivolution", pos = wx.DefaultPosition, size = wx.Size( 250,620 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL ) + + self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize ) + + maingrid = wx.FlexGridSizer( 3, 1, 0, 0 ) + maingrid.SetFlexibleDirection( wx.BOTH ) + maingrid.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + titlelayout = wx.BoxSizer( wx.HORIZONTAL ) + + titlelayout.SetMinSize( wx.Size( 50,50 ) ) + logobox = wx.BoxSizer( wx.VERTICAL ) + + logobox.SetMinSize( wx.Size( 50,50 ) ) + self.logo = wx.StaticBitmap( self, wx.ID_ANY, wx.NullBitmap, wx.DefaultPosition, wx.Size( 50,50 ), 0 ) + logobox.Add( self.logo, 1, wx.ALL, 5 ) + + titlelayout.Add( logobox, 1, wx.FIXED_MINSIZE, 5 ) + + self.title = wx.StaticText( self, wx.ID_ANY, u"Ivolution", wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_CENTRE|wx.ALIGN_LEFT ) + self.title.Wrap( -1 ) + self.title.SetFont( wx.Font( 16, 71, 90, 92, False, wx.EmptyString ) ) + + titlelayout.Add( self.title, 3, wx.ALIGN_LEFT|wx.ALL|wx.EXPAND, 5 ) + + maingrid.Add( titlelayout, 1, wx.EXPAND, 5 ) + + settingsbox = wx.FlexGridSizer( 2, 1, 0, 0 ) + settingsbox.SetFlexibleDirection( wx.BOTH ) + settingsbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + requiredbox = wx.FlexGridSizer( 3, 1, 0, 0 ) + requiredbox.SetFlexibleDirection( wx.BOTH ) + requiredbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.title = wx.StaticText( self, wx.ID_ANY, u"Required parameters:", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.title.Wrap( -1 ) + self.title.SetFont( wx.Font( wx.NORMAL_FONT.GetPointSize(), 70, 90, 92, False, wx.EmptyString ) ) + + requiredbox.Add( self.title, 0, wx.ALL, 5 ) + + inputbox = wx.FlexGridSizer( 2, 1, 0, 0 ) + inputbox.SetFlexibleDirection( wx.BOTH ) + inputbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.inputtitle = wx.StaticText( self, wx.ID_ANY, u"Choose your input folder:", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.inputtitle.Wrap( -1 ) + inputbox.Add( self.inputtitle, 0, wx.ALL, 5 ) + + inputchooserbox = wx.FlexGridSizer( 1, 2, 0, 0 ) + inputchooserbox.SetFlexibleDirection( wx.BOTH ) + inputchooserbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.inputchooserbutton = wx.Button( self, wx.ID_ANY, u"..", wx.DefaultPosition, wx.Size( 30,25 ), 0 ) + inputchooserbox.Add( self.inputchooserbutton, 1, wx.ALL, 5 ) + + self.inputtextbox = wx.StaticText( self, wx.ID_ANY, u"/home/jll/Documents/Ivolutionnnn", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.inputtextbox.Wrap( -1 ) + inputchooserbox.Add( self.inputtextbox, 0, wx.ALL, 5 ) + + inputbox.Add( inputchooserbox, 1, wx.EXPAND, 5 ) + + requiredbox.Add( inputbox, 1, wx.EXPAND, 5 ) + + outputbox = wx.FlexGridSizer( 2, 1, 0, 0 ) + outputbox.SetFlexibleDirection( wx.BOTH ) + outputbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.outputtitle = wx.StaticText( self, wx.ID_ANY, u"Choose your output folder:", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.outputtitle.Wrap( -1 ) + outputbox.Add( self.outputtitle, 0, wx.ALL, 5 ) + + outputchooserbox = wx.FlexGridSizer( 1, 2, 0, 0 ) + outputchooserbox.SetFlexibleDirection( wx.BOTH ) + outputchooserbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.outputchooserbutton = wx.Button( self, wx.ID_ANY, u"..", wx.DefaultPosition, wx.Size( 30,25 ), 0 ) + outputchooserbox.Add( self.outputchooserbutton, 0, wx.ALL, 5 ) + + self.outputchoosertext = wx.StaticText( self, wx.ID_ANY, u"/home/jll/Videos", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.outputchoosertext.Wrap( -1 ) + outputchooserbox.Add( self.outputchoosertext, 0, wx.ALL, 5 ) + + outputbox.Add( outputchooserbox, 1, wx.EXPAND, 5 ) + + requiredbox.Add( outputbox, 1, wx.EXPAND, 5 ) + + settingsbox.Add( requiredbox, 1, wx.EXPAND, 5 ) + + optionalbox = wx.FlexGridSizer( 5, 1, 0, 0 ) + optionalbox.SetFlexibleDirection( wx.BOTH ) + optionalbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.title1 = wx.StaticText( self, wx.ID_ANY, u"Optional parameters:", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.title1.Wrap( -1 ) + self.title1.SetFont( wx.Font( wx.NORMAL_FONT.GetPointSize(), 70, 90, 92, False, wx.EmptyString ) ) + + optionalbox.Add( self.title1, 0, wx.ALL, 5 ) + + typefacebox = wx.FlexGridSizer( 2, 1, 0, 0 ) + typefacebox.SetFlexibleDirection( wx.BOTH ) + typefacebox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.typefacetext = wx.StaticText( self, wx.ID_ANY, u"Type of face:", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.typefacetext .Wrap( -1 ) + typefacebox.Add( self.typefacetext , 0, wx.ALL, 5 ) + + typefacelistChoices = [ u"frontal_face", u"profile_face" ] + self.typefacelist = wx.ComboBox( self, wx.ID_ANY, u"frontal_face", wx.DefaultPosition, wx.DefaultSize, typefacelistChoices, wx.CB_READONLY ) + typefacebox.Add( self.typefacelist, 0, wx.ALL, 5 ) + + optionalbox.Add( typefacebox, 1, wx.EXPAND, 5 ) + + videospeedbox = wx.FlexGridSizer( 2, 1, 0, 0 ) + videospeedbox.SetFlexibleDirection( wx.BOTH ) + videospeedbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.videospeedtext = wx.StaticText( self, wx.ID_ANY, u"Video Speed:", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.videospeedtext.Wrap( -1 ) + videospeedbox.Add( self.videospeedtext, 0, wx.ALL, 5 ) + + videospeedlistChoices = [ u"slow", u"medium", u"fast" ] + self.videospeedlist = wx.ComboBox( self, wx.ID_ANY, u"medium", wx.DefaultPosition, wx.DefaultSize, videospeedlistChoices, wx.CB_READONLY ) + videospeedbox.Add( self.videospeedlist, 0, wx.ALL, 5 ) + + optionalbox.Add( videospeedbox, 1, wx.EXPAND, 5 ) + + videomodebox = wx.FlexGridSizer( 2, 1, 0, 0 ) + videomodebox.SetFlexibleDirection( wx.BOTH ) + videomodebox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.videomodetext = wx.StaticText( self, wx.ID_ANY, u"Choose your prefered mode:", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.videomodetext.Wrap( -1 ) + videomodebox.Add( self.videomodetext, 0, wx.ALL, 5 ) + + videomodechoices = wx.FlexGridSizer( 1, 2, 0, 0 ) + videomodechoices.SetFlexibleDirection( wx.BOTH ) + videomodechoices.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.cropmode = wx.RadioButton( self, wx.ID_ANY, u"Crop Mode", wx.DefaultPosition, wx.DefaultSize, wx.RB_GROUP ) + self.cropmode.SetValue( True ) + videomodechoices.Add( self.cropmode, 0, wx.ALL, 5 ) + + self.conservativemode = wx.RadioButton( self, wx.ID_ANY, u"Conservative Mode", wx.DefaultPosition, wx.DefaultSize, 0 ) + videomodechoices.Add( self.conservativemode , 0, wx.ALL, 5 ) + + videomodebox.Add( videomodechoices, 1, wx.EXPAND, 5 ) + + optionalbox.Add( videomodebox, 1, wx.EXPAND, 5 ) + + filemethodbox = wx.FlexGridSizer( 2, 1, 0, 0 ) + filemethodbox.SetFlexibleDirection( wx.BOTH ) + filemethodbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.filemethodtext = wx.StaticText( self, wx.ID_ANY, u"Choose your prefered method:", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.filemethodtext.Wrap( -1 ) + filemethodbox.Add( self.filemethodtext, 0, wx.ALL, 5 ) + + videomodechoices = wx.FlexGridSizer( 1, 2, 0, 0 ) + videomodechoices.SetFlexibleDirection( wx.BOTH ) + videomodechoices.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.namemode = wx.RadioButton( self, wx.ID_ANY, u"File name", wx.DefaultPosition, wx.DefaultSize, wx.RB_GROUP ) + self.namemode.SetValue( True ) + videomodechoices.Add( self.namemode, 0, wx.ALL, 5 ) + + self.exifmode = wx.RadioButton( self, wx.ID_ANY, u"EXIF metadata", wx.DefaultPosition, wx.DefaultSize, 0 ) + videomodechoices.Add( self.exifmode , 0, wx.ALL, 5 ) + + filemethodbox.Add( videomodechoices, 1, wx.EXPAND, 5 ) + + optionalbox.Add( filemethodbox, 1, wx.EXPAND, 5 ) + + settingsbox.Add( optionalbox, 1, wx.EXPAND, 5 ) + + maingrid.Add( settingsbox, 1, wx.EXPAND, 5 ) + + commandbox = wx.FlexGridSizer( 2, 1, 0, 0 ) + commandbox.SetFlexibleDirection( wx.BOTH ) + commandbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + buttonsbox = wx.FlexGridSizer( 1, 2, 0, 0 ) + buttonsbox.SetFlexibleDirection( wx.BOTH ) + buttonsbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.startbutton = wx.Button( self, wx.ID_ANY, u"Create Movie!", wx.DefaultPosition, wx.DefaultSize, 0 ) + buttonsbox.Add( self.startbutton, 0, wx.ALL, 5 ) + + self.stopbutton = wx.Button( self, wx.ID_ANY, u"Stop processing", wx.DefaultPosition, wx.DefaultSize, 0 ) + buttonsbox.Add( self.stopbutton, 0, wx.ALL, 5 ) + + commandbox.Add( buttonsbox, 1, wx.EXPAND, 5 ) + + self.progressgauge = wx.Gauge( self, wx.ID_ANY, 100, wx.DefaultPosition, wx.DefaultSize, wx.GA_HORIZONTAL ) + commandbox.Add( self.progressgauge , 0, wx.ALL|wx.EXPAND, 5 ) + + maingrid.Add( commandbox, 1, wx.EXPAND, 5 ) + + self.SetSizer( maingrid ) + self.Layout() + self.sb = self.CreateStatusBar( 2, wx.ST_SIZEGRIP, wx.ID_ANY ) + self.menubar = wx.MenuBar( 0 ) + self.filemenu = wx.Menu() + self.menuhelp = wx.MenuItem( self.filemenu, wx.ID_ANY, u"Help"+ u"\t" + u"CTRL + h", wx.EmptyString, wx.ITEM_NORMAL ) + self.filemenu.AppendItem( self.menuhelp ) + + self.menuabout = wx.MenuItem( self.filemenu, wx.ID_ANY, u"About"+ u"\t" + u"CTRL + F12", wx.EmptyString, wx.ITEM_NORMAL ) + self.filemenu.AppendItem( self.menuabout ) + + self.menuexit = wx.MenuItem( self.filemenu, wx.ID_ANY, u"Exit"+ u"\t" + u"CTRL + Q", wx.EmptyString, wx.ITEM_NORMAL ) + self.filemenu.AppendItem( self.menuexit ) + + self.menubar.Append( self.filemenu, u"File" ) + + self.SetMenuBar( self.menubar ) + + + self.Centre( wx.BOTH ) + + # Connect Events + self.inputchooserbutton.Bind( wx.EVT_BUTTON, self.on_input ) + self.outputchooserbutton.Bind( wx.EVT_BUTTON, self.on_output ) + self.startbutton.Bind( wx.EVT_BUTTON, self.on_start ) + self.stopbutton.Bind( wx.EVT_BUTTON, self.on_stop ) + self.Bind( wx.EVT_MENU, self.on_help, id = self.menuhelp.GetId() ) + self.Bind( wx.EVT_MENU, self.on_about, id = self.menuabout.GetId() ) + self.Bind( wx.EVT_MENU, self.on_exit, id = self.menuexit.GetId() ) + + def __del__( self ): + pass + + + # Virtual event handlers, overide them in your derived class + def on_input( self, event ): + event.Skip() + + def on_output( self, event ): + event.Skip() + + def on_start( self, event ): + event.Skip() + + def on_stop( self, event ): + event.Skip() + + def on_help( self, event ): + event.Skip() + + def on_about( self, event ): + event.Skip() + + def on_exit( self, event ): + event.Skip() + + diff --git a/ivolution/gui_wx/IvolutionWindow.py b/ivolution/gui_wx/IvolutionWindow.py index 9fc84fe..79f493d 100644 --- a/ivolution/gui_wx/IvolutionWindow.py +++ b/ivolution/gui_wx/IvolutionWindow.py @@ -47,7 +47,6 @@ class IvolutionWindow(IvolutionTemplate, Observer, Observable): self.console_logger = None self.setup_logger() - self.logo = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap(u"ivolution/data/media/vitruve_50.jpg", wx.BITMAP_TYPE_ANY), wx.DefaultPosition, wx.Size(50, 50), 0) # Sets logo # Sets icon self.SetIcon(wx.Icon('ivolution/data/media/vitruve.ico', wx.BITMAP_TYPE_ICO)) # image = wx.Image("ivolution/data/media/vitruve.png", wx.BITMAP_TYPE_PNG).ConvertToBitmap() @@ -72,6 +71,9 @@ class IvolutionWindow(IvolutionTemplate, Observer, Observable): self.Show(True) # Finally show the frame # Overriding event handling methods + def on_settings(self, event): + print "settings" + def on_start(self, event): """ User asks for starting the algorithm diff --git a/ivolution/gui_wx/IvolutionWindow.v1 b/ivolution/gui_wx/IvolutionWindow.v1 new file mode 100644 index 0000000..9fc84fe --- /dev/null +++ b/ivolution/gui_wx/IvolutionWindow.v1 @@ -0,0 +1,288 @@ +#!/usr/bin/env python +""" +.. module:: IvolutionWindow + :platform: Unix, Windows, Mac + :synopsis: Main Window of the Ivolution GUI designed to be supported by all platforms. + +.. moduleauthor:: Julien Lengrand-Lambert + +""" + +import wx +import wx.lib.newevent + +import os +import logging +import webbrowser + +from .. import get_data # used to load images and files + +from .. import FaceParams +from .. import FacemovieThread + +from ..util.Notifier import Observer +from ..util.Notifier import Observable + +from AboutDialog import AboutDialog +from IvolutionTemplate import IvolutionTemplate + + +class IvolutionWindow(IvolutionTemplate, Observer, Observable): + """ + Main Window of the Ivolution application + """ + def __init__(self, parent, title): + """ + Overrides init frame IvolutionTemplate + """ + IvolutionTemplate.__init__(self, parent) + Observer.__init__(self, title) + Observable.__init__(self) + + self.videospeedlistChoices = [u"slow", u"medium", u"fast"] # FIXME: Is there a way to do better? + self.gaugerange = 100 + + # Sets up logging capability + self.my_logger = None + self.console_logger = None + self.setup_logger() + + self.logo = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap(u"ivolution/data/media/vitruve_50.jpg", wx.BITMAP_TYPE_ANY), wx.DefaultPosition, wx.Size(50, 50), 0) # Sets logo + # Sets icon + self.SetIcon(wx.Icon('ivolution/data/media/vitruve.ico', wx.BITMAP_TYPE_ICO)) + # image = wx.Image("ivolution/data/media/vitruve.png", wx.BITMAP_TYPE_PNG).ConvertToBitmap() + # icon = wx.EmptyIcon() + # icon.CopyFromBitmap(image) + # self.SetIcon(icon) + + # Defines all our parameters neededfor the facemovie + self.root_fo = "" + self.in_fo = "" # Input folder, where images are located + self.out_fo = "" # Input folder, where the video will be saved + self.mode = "crop" # type of video to be created + self.sort = "name" # how image files will be chronologically sorted + self.speed = 1 # Speed of the movie + self.param = "frontal_face" # type of face profile to be searched for + + self.in_fo = "" # Input folder, where images are located + + self.process_running = False + self.facemovie = None + + self.Show(True) # Finally show the frame + + # Overriding event handling methods + def on_start(self, event): + """ + User asks for starting the algorithm + Sets all parameters and start processing + """ + self.my_logger.debug("start pressed") + if not self.process_running: # start only if not already running + self.set_parameters() + self.print_parameters() + # Instantiating the facemovie + self.facemovie = FacemovieThread.FacemovieThread(self.face_params) + self.facemovie.subscribe(self) # I want new information ! Subscribes to facemovie reports + self.subscribe(self.facemovie) # Subscribing facemovie to our messages + + self.facemovie.start() + + self.process_running = True + else: + self.console_logger.error("Cannot start, process already running !") + self.my_logger.error("Cannot start, process already running !") + + def on_stop(self, event): + """ + User asks for stopping the algorithm + Asks the FacemovieThread to terminate + """ + self.my_logger.debug("Stop pressed") + self.console_logger.debug("Stop pressed") + self.notify(["STOP"]) # Asking the Facemovie to stop + self.process_running = False + + #self.on_exit(event) # Finally shuts down the interface + + def on_input(self, event): + """ + Activated when a user clicks to choose its input location + """ + default_dir = "~/Pictures" + self.inputdialog = wx.DirDialog(self, "Please choose your input directory", style=1, defaultPath=default_dir) + + if self.inputdialog.ShowModal() == wx.ID_OK: + self.inputtextbox.SetLabel(self.inputdialog.GetPath()) + self.inputdialog.Destroy() + + def on_output(self, event): + """ + Activated when a user clicks to choose its output location + """ + default_dir = "~/Videos" + self.outputdialog = wx.DirDialog(self, "Please choose your output directory", style=1, defaultPath=default_dir) + + if self.outputdialog.ShowModal() == wx.ID_OK: + self.outputchoosertext.SetLabel(self.outputdialog.GetPath()) + self.outputdialog.Destroy() + + def on_help(self, event): + """ + Opens a browser and points to online help. + """ + url = "http://jlengrand.github.com/FaceMovie/" + webbrowser.open(url, new=2) # in new tab if possible + + def on_about(self, event): + """ + Displays the about box for Ivolution + """ + about = AboutDialog(self, "Ivolution") + about.ShowModal() # Show it + about.Destroy() # finally destroy it when finished. + + def on_exit(self, event): + """ + Called when the IvolutionWindow is closed, or File/Exit is called. + """ + # Clean up code for saving application state should be added here. + self.notify(["STOP"]) # Asking the Facemovie to stop + self.process_running = False + self.Close(True) # Close the frame. + + # system methods + def get_current_mode(self): + """ + """ + if self.cropmode.GetValue(): + mode = "crop" + else: + mode = "conservative" + + return mode + + def get_current_sort(self): + """ + """ + if self.namemode.GetValue(): + sort = "name" + else: + sort = "exif" + + return sort + + def set_parameters(self): + """ + Retrieves all parameters needed for the algorithm to run + """ + self.in_fo = self.inputtextbox.GetLabel() + "/" + self.out_fo = self.outputchoosertext.GetLabel() + "/" + self.param = self.typefacelist.GetValue() + self.speed = self.videospeedlistChoices.index(self.videospeedlist.GetValue()) # We need and integer between 0 and 2 + + self.mode = self.get_current_mode() + self.sort = self.get_current_sort() + + # Instantiating the face_params object that will be needed by the facemovie + par_fo = os.path.join(self.root_fo, get_data("haarcascades")) + self.face_params = FaceParams.FaceParams(par_fo, + self.in_fo, + self.out_fo, + self.param, + self.sort, + self.mode, + self.speed) + + self.print_parameters() + + def print_parameters(self): + print "#########" + print "Settings:" + print "input folder : %s" % (self.in_fo) + print "output folder : %s" % (self.out_fo) + + print "Face Type : %s" % (self.param) + print "Speed chosen : %s" % (self.speed) + print "Mode chosen : %s" % (self.mode) + print "Sort method : %s" % (self.sort) + + print "#########" + + def setup_logger(self): + """ + Configures our logger to save error messages + Start logging in file here + """ + personal_dir = "~/.ivolution" + log_root = 'fm.log' + log_file = os.path.join(os.path.expanduser(personal_dir), log_root) + + # create logger for 'facemovie' + self.my_logger = logging.getLogger('FileLog') + + self.my_logger.setLevel(logging.DEBUG) + # create file handler which logs even debug messages + + #fh = logging.StreamHandler() + fh = logging.FileHandler(log_file) + + fh.setLevel(logging.DEBUG) + # create console handler with a higher log level + self.console_logger = logging.getLogger('ConsoleLog') + self.console_logger.setLevel(logging.DEBUG) # not needed + + ch = logging.StreamHandler() + #ch.setLevel(logging.DEBUG) # not needed + + # add the handlers to the logger + self.my_logger.addHandler(fh) + + self.my_logger.info("######") # Separating different sessions + + formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + # create formatter and add it to the handlers + fh.setFormatter(formatter) + #ch.setFormatter(formatter) + + self.console_logger.addHandler(ch) + + def update(self, message): + """ + Trigerred by FacemovieThread. + Uses the Observer pattern to inform the user about the progress of the current job. + """ + if len(message) == 3: + # notifications + #self.console_logger.debug(message) + self.my_logger.debug(message) + + if message[0] == "PROGRESS": # progress bar + # big steps performed + wx.MutexGuiEnter() # to avoid thread problems + self.progressgauge.SetValue(self.gaugerange * float(message[2])) + self.sb.SetStatusText(message[1], 0) + wx.MutexGuiLeave() + + if float(message[2]) >= 1.0: # 100% of process + self.my_logger.debug("Reached end of facemovie process") + #self.console_logger.debug("Reached end of facemovie process") + self.process_running = False + + elif message[0] == "STATUS": # status label + if message[1] == "Error": + wx.MutexGuiEnter() # to avoid thread problems + self.sb.SetStatusText("Error detected", 0) + self.progressgauge.SetValue(0) + wx.MutexGuiLeave() + self.process_running = False + + wx.MutexGuiEnter() # to avoid thread problems + self.sb.SetStatusText(message[1], 1) + wx.MutexGuiLeave() + + elif len(message) > 1: # system commands shall be ignored + self.console_logger.debug("Unrecognized command") + self.my_logger.debug("Unrecognized command") + self.console_logger.debug(message) + self.my_logger.debug(message) \ No newline at end of file