Package PyFoam :: Package Applications :: Module APoMaFoX
[hide private]
[frames] | no frames]

Source Code for Module PyFoam.Applications.APoMaFoX

  1  """ 
  2  Application-class that implements pyFoamAPoMaFoX.py (A Poor Man's FoamX) 
  3  """ 
  4  from optparse import OptionGroup 
  5  from os import path 
  6  import os 
  7  import shutil 
  8   
  9  from PyFoamApplication import PyFoamApplication 
 10  from CaseBuilderBackend import CaseBuilderFile,CaseBuilderDescriptionList 
 11  from CommonCaseBuilder import CommonCaseBuilder 
 12  from PyFoam import configuration as config 
 13   
 14  from PyFoam.Error import error 
 15   
 16  try: 
 17      import urwid 
 18  except ImportError: 
 19      error("This application needs an installed urwid-library") 
 20       
 21  try: 
 22      import urwid.curses_display 
 23  except ImportError: 
 24      error("This application needs an installed curses-library") 
 25       
26 -class APoMaFoX(PyFoamApplication, 27 CommonCaseBuilder):
28 - def __init__(self,args=None):
29 description=""" 30 APoMaFoX is "A Poor Mans FoamX". 31 32 A small text interface to the CaseBuilder-Functionality 33 """ 34 PyFoamApplication.__init__(self, 35 args=args, 36 description=description, 37 usage="%prog <caseBuilderFile>", 38 interspersed=True, 39 nr=0, 40 exactNr=False)
41
42 - def addOptions(self):
44
45 - def run(self):
46 if self.pathInfo(): 47 return 48 49 if len(self.parser.getArgs())==0: 50 CaseBuilderBrowser() 51 elif len(self.parser.getArgs())==1: 52 fName=self.searchDescriptionFile(self.parser.getArgs()[0]) 53 54 if not path.exists(fName): 55 error("The description file",fName,"does not exist") 56 57 dialog=CaseBuilderDialog(fName) 58 dialog.run() 59 else: 60 error("Too many arguments")
61
62 -class CaseBuilderTUI(object):
63 """Common stuff between the TUIs""" 64
65 - def __init__(self):
66 self.ui = urwid.curses_display.Screen() 67 68 self.ui.register_palette( [ 69 ('alert', 'light gray', 'dark red', 'standout'), 70 ('header', 'black', 'dark cyan', 'standout'), 71 ('banner', 'black', 'dark green', ('standout', 'underline')), 72 ('button', 'black', 'dark red', 'standout'), 73 ('bgbutton', 'black', 'dark blue', 'standout'), 74 ('editbox', 'dark gray','light gray'), 75 ('bg', 'dark green', 'black'), 76 ('bgl', 'dark green', 'light gray'), 77 ] )
78
79 -class CaseBuilderBrowser(CaseBuilderTUI):
80 """A browser of all the available descriptions"""
81 - def __init__(self):
82 CaseBuilderTUI.__init__(self) 83 84 self.descriptions=CaseBuilderDescriptionList() 85 if len(self.descriptions)==0: 86 error("No description-files (.pfcb) found in path",config().get("CaseBuilder","descriptionpath")) 87 88 self.items=[] 89 90 mxlen=apply(max,map(lambda x:len(x[2]),self.descriptions)+[0]) 91 92 for i,d in enumerate(self.descriptions): 93 txt=urwid.Text([('button',d[2]+" "*(mxlen-len(d[2])))," ",d[1],"\n",d[3]]) 94 if i%2==0: 95 attr='bgl' 96 else: 97 attr='bg' 98 self.items.append(urwid.AttrWrap(txt,attr,'bgbutton')) 99 100 self.walk=urwid.SimpleListWalker(self.items) 101 self.listbox = urwid.ListBox(self.walk) 102 103 self.statusText=urwid.Text(" Press <ESC> to exit <ENTER> to select description") 104 105 footer = urwid.AttrWrap( self.statusText, 'header' ) 106 107 top = urwid.Frame(self.listbox, footer=footer) 108 if len(self.descriptions)%2==0: 109 self.top=urwid.AttrWrap(top,'bgl') 110 else: 111 self.top=urwid.AttrWrap(top,'bg') 112 113 self.ui.run_wrapper(self.runTUI)
114
115 - def runTUI(self):
116 size = self.ui.get_cols_rows() 117 118 txt = urwid.Text(('banner', " Hello World "), align="center") 119 wrap1 = urwid.AttrWrap( txt, 'streak' ) 120 fill = urwid.Filler( wrap1 ) 121 wrap2 = urwid.AttrWrap( fill, 'bg' ) 122 123 self.goOn=True 124 125 while self.goOn: 126 self.draw_screen(size) 127 keys = self.ui.get_input() 128 if "esc" in keys: 129 break 130 elif "enter" in keys: 131 w,i=self.walk.get_focus() 132 cb=CaseBuilderDialog(self.descriptions[i][1]) 133 if cb.run(): 134 break 135 else: 136 continue 137 for k in keys: 138 if k=="window resize": 139 size = self.ui.get_cols_rows() 140 continue 141 elif k=="down": 142 w,p=self.walk.get_focus() 143 self.walk.set_focus(p+1) 144 continue 145 elif k=="up": 146 w,p=self.walk.get_focus() 147 if p>0: 148 self.walk.set_focus(p-1) 149 continue 150 self.top.keypress( size, k )
151
152 - def draw_screen(self,size):
153 canvas = self.top.render( size, focus=True ) 154 self.ui.draw_screen( size, canvas )
155
156 -class CaseBuilderDialog(CaseBuilderTUI):
157 """A dialog for a CaswBuilder-dialog"""
158 - def __init__(self,fName):
159 CaseBuilderTUI.__init__(self) 160 161 self.desc=CaseBuilderFile(fName) 162 163 # print "Read case description",self.desc.name() 164 165 items=[] 166 167 items.append( 168 urwid.AttrWrap( 169 urwid.Text("Builder Template: " 170 + self.desc.name()+"\n"+self.desc.description() 171 ),'banner')) 172 items.append( 173 urwid.AttrWrap( 174 urwid.Divider("-"),'banner')) 175 items.append( 176 urwid.AttrWrap( 177 urwid.Text("Data Template: " 178 + self.desc.templatePath() 179 ),'banner')) 180 items.append( 181 urwid.AttrWrap( 182 urwid.Divider("="),'banner')) 183 184 self.caseField=urwid.Edit(('banner',"Name of the generated case ")) 185 items.append(urwid.AttrWrap(self.caseField,'editbox')) 186 187 items.append( 188 urwid.AttrWrap( 189 urwid.Divider("="),'banner')) 190 191 args=self.desc.arguments() 192 mLen=apply(max,map(len,args)) 193 aDesc=self.desc.argumentDescriptions() 194 aDef=self.desc.argumentDefaults() 195 self.argfields=[] 196 for a in args: 197 items.append(urwid.Text(aDesc[a])) 198 fld=urwid.Edit(('banner',a+" "*(mLen+1-len(a))),edit_text=aDef[a]) 199 self.argfields.append(fld) 200 items.append(urwid.AttrWrap(fld,'editbox')) 201 202 items.append( 203 urwid.AttrWrap( 204 urwid.Divider("="),'banner')) 205 206 self.forceCheck=urwid.CheckBox("ForceOverwrite") 207 items.append( 208 urwid.Columns( 209 [ urwid.AttrWrap(self.forceCheck,'bgbutton') ] 210 )) 211 212 items.append( 213 urwid.Padding( 214 urwid.AttrWrap(urwid.Button("Generate Case",self.doGenerate),'bgbutton','button'), 215 align='center',width=20)) 216 217 self.items = urwid.SimpleListWalker(items) 218 self.listbox = urwid.ListBox(self.items) 219 self.statusText = urwid.Text("Dummy") 220 footer = urwid.AttrWrap( self.statusText, 'header' ) 221 222 self.setStatus("") 223 224 top = urwid.Frame(self.listbox, footer=footer) 225 self.top=urwid.AttrWrap(top,'bg') 226 self.done=False
227
228 - def run(self):
229 self.ui.run_wrapper(self.runTUI) 230 return self.done
231
232 - def setStatus(self,text):
233 self.statusText.set_text([('alert',text)," Press ESC to exit"])
234
235 - def doGenerate(self,button):
236 self.goOn=False 237 self.ui.stop() 238 caseName=self.caseField.get_edit_text() 239 if len(caseName)==0: 240 self.setStatus("Casename empty") 241 self.goOn=True 242 return 243 244 if path.exists(caseName): 245 if not self.forceCheck.get_state(): 246 self.setStatus("Directory "+caseName+" already existing") 247 self.goOn=True 248 return 249 else: 250 self.setStatus("Overwriting directory "+caseName) 251 shutil.rmtree(caseName) 252 253 self.setStatus("Generating the case "+caseName) 254 args={} 255 for i,a in enumerate(self.desc.arguments()): 256 args[a]=self.argfields[i].get_edit_text() 257 if len(args[a])==0: 258 self.setStatus("No argument "+a+" was given") 259 self.goOn=True 260 return 261 262 msg=self.desc.verifyArguments(args) 263 if msg: 264 self.setStatus(msg) 265 self.goOn=True 266 return 267 268 self.setStatus("With the arguments "+str(args)) 269 270 self.desc.buildCase(caseName,args) 271 272 self.done=True
273
274 - def runTUI(self):
275 size = self.ui.get_cols_rows() 276 277 txt = urwid.Text(('banner', " Hello World "), align="center") 278 wrap1 = urwid.AttrWrap( txt, 'streak' ) 279 fill = urwid.Filler( wrap1 ) 280 wrap2 = urwid.AttrWrap( fill, 'bg' ) 281 282 self.goOn=True 283 284 while self.goOn: 285 self.draw_screen(size) 286 keys = self.ui.get_input() 287 if "esc" in keys: 288 break 289 for k in keys: 290 if k=="window resize": 291 size = self.ui.get_cols_rows() 292 continue 293 self.top.keypress( size, k )
294
295 - def draw_screen(self,size):
296 canvas = self.top.render( size, focus=True ) 297 self.ui.draw_screen( size, canvas )
298