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 ('group', 'dark red', 'dark green', ('standout', 'underline')), 73 ('button', 'black', 'dark red', 'standout'), 74 ('bgbutton', 'black', 'dark blue', 'standout'), 75 ('editbox', 'dark gray','light gray'), 76 ('bg', 'dark green', 'black'), 77 ('bgl', 'dark green', 'light gray'), 78 ] )
79
80 -class CaseBuilderBrowser(CaseBuilderTUI):
81 """A browser of all the available descriptions"""
82 - def __init__(self):
83 CaseBuilderTUI.__init__(self) 84 85 self.descriptions=CaseBuilderDescriptionList() 86 if len(self.descriptions)==0: 87 error("No description-files (.pfcb) found in path",config().get("CaseBuilder","descriptionpath")) 88 89 self.items=[] 90 91 mxlen=apply(max,map(lambda x:len(x[2]),self.descriptions)+[0]) 92 93 for i,d in enumerate(self.descriptions): 94 txt=urwid.Text([('button',d[2]+" "*(mxlen-len(d[2])))," ",d[1],"\n",d[3]]) 95 if i%2==0: 96 attr='bgl' 97 else: 98 attr='bg' 99 self.items.append(urwid.AttrWrap(txt,attr,'bgbutton')) 100 101 self.walk=urwid.SimpleListWalker(self.items) 102 self.listbox = urwid.ListBox(self.walk) 103 104 self.statusText=urwid.Text(" Press <ESC> to exit <ENTER> to select description") 105 106 footer = urwid.AttrWrap( self.statusText, 'header' ) 107 108 top = urwid.Frame(self.listbox, footer=footer) 109 if len(self.descriptions)%2==0: 110 self.top=urwid.AttrWrap(top,'bgl') 111 else: 112 self.top=urwid.AttrWrap(top,'bg') 113 114 self.ui.run_wrapper(self.runTUI)
115
116 - def runTUI(self):
117 size = self.ui.get_cols_rows() 118 119 txt = urwid.Text(('banner', " Hello World "), align="center") 120 wrap1 = urwid.AttrWrap( txt, 'streak' ) 121 fill = urwid.Filler( wrap1 ) 122 wrap2 = urwid.AttrWrap( fill, 'bg' ) 123 124 self.goOn=True 125 126 while self.goOn: 127 self.draw_screen(size) 128 keys = self.ui.get_input() 129 if "esc" in keys: 130 break 131 elif "enter" in keys: 132 w,i=self.walk.get_focus() 133 cb=CaseBuilderDialog(self.descriptions[i][1]) 134 if cb.run(): 135 break 136 else: 137 continue 138 for k in keys: 139 if k=="window resize": 140 size = self.ui.get_cols_rows() 141 continue 142 elif k=="down": 143 w,p=self.walk.get_focus() 144 self.walk.set_focus(p+1) 145 continue 146 elif k=="up": 147 w,p=self.walk.get_focus() 148 if p>0: 149 self.walk.set_focus(p-1) 150 continue 151 self.top.keypress( size, k )
152
153 - def draw_screen(self,size):
154 canvas = self.top.render( size, focus=True ) 155 self.ui.draw_screen( size, canvas )
156
157 -class CaseBuilderDialog(CaseBuilderTUI):
158 """A dialog for a CaswBuilder-dialog"""
159 - def __init__(self,fName):
160 CaseBuilderTUI.__init__(self) 161 162 self.desc=CaseBuilderFile(fName) 163 164 # print "Read case description",self.desc.name() 165 166 items=[] 167 168 items.append( 169 urwid.AttrWrap( 170 urwid.Text("Builder Template: " 171 + self.desc.name()+"\n"+self.desc.description() 172 ),'banner')) 173 items.append( 174 urwid.AttrWrap( 175 urwid.Divider("-"),'banner')) 176 items.append( 177 urwid.AttrWrap( 178 urwid.Text("Data Template: " 179 + self.desc.templatePath() 180 ),'banner')) 181 items.append( 182 urwid.AttrWrap( 183 urwid.Divider("="),'banner')) 184 185 self.caseField=urwid.Edit(('banner',"Name of the generated case ")) 186 items.append(urwid.AttrWrap(self.caseField,'editbox')) 187 188 items.append( 189 urwid.AttrWrap( 190 urwid.Divider("="),'banner')) 191 192 args=self.desc.arguments() 193 mLen=apply(max,map(len,args)) 194 aDesc=self.desc.argumentDescriptions() 195 aDef=self.desc.argumentDefaults() 196 self.argfields=[] 197 198 groups=[None]+self.desc.argumentGroups() 199 gDesc=self.desc.argumentGroupDescription() 200 201 for g in groups: 202 if g!=None: 203 items.append(urwid.AttrWrap(urwid.Text("\n"+g+" - "+gDesc[g]),"group")) 204 for a in self.desc.groupArguments(g): 205 items.append(urwid.Text(aDesc[a])) 206 fld=urwid.Edit(('banner',a+" "*(mLen+1-len(a))),edit_text=aDef[a]) 207 self.argfields.append(fld) 208 items.append(urwid.AttrWrap(fld,'editbox')) 209 210 items.append( 211 urwid.AttrWrap( 212 urwid.Divider("="),'banner')) 213 214 self.forceCheck=urwid.CheckBox("ForceOverwrite") 215 items.append( 216 urwid.Columns( 217 [ urwid.AttrWrap(self.forceCheck,'bgbutton') ] 218 )) 219 220 items.append( 221 urwid.Padding( 222 urwid.AttrWrap(urwid.Button("Generate Case",self.doGenerate),'bgbutton','button'), 223 align='center',width=20)) 224 225 self.items = urwid.SimpleListWalker(items) 226 self.listbox = urwid.ListBox(self.items) 227 self.statusText = urwid.Text("Dummy") 228 footer = urwid.AttrWrap( self.statusText, 'header' ) 229 230 self.setStatus("") 231 232 top = urwid.Frame(self.listbox, footer=footer) 233 self.top=urwid.AttrWrap(top,'bg') 234 self.done=False
235
236 - def run(self):
237 self.ui.run_wrapper(self.runTUI) 238 return self.done
239
240 - def setStatus(self,text):
241 self.statusText.set_text([('alert',text)," Press ESC to exit"])
242
243 - def doGenerate(self,button):
244 self.goOn=False 245 self.ui.stop() 246 caseName=self.caseField.get_edit_text() 247 if len(caseName)==0: 248 self.setStatus("Casename empty") 249 self.goOn=True 250 return 251 252 if path.exists(caseName): 253 if not self.forceCheck.get_state(): 254 self.setStatus("Directory "+caseName+" already existing") 255 self.goOn=True 256 return 257 else: 258 self.setStatus("Overwriting directory "+caseName) 259 shutil.rmtree(caseName) 260 261 self.setStatus("Generating the case "+caseName) 262 args={} 263 for i,a in enumerate(self.desc.arguments()): 264 args[a]=self.argfields[i].get_edit_text() 265 if len(args[a])==0: 266 self.setStatus("No argument "+a+" was given") 267 self.goOn=True 268 return 269 270 msg=self.desc.verifyArguments(args) 271 if msg: 272 self.setStatus(msg) 273 self.goOn=True 274 return 275 276 self.setStatus("With the arguments "+str(args)) 277 278 self.desc.buildCase(caseName,args) 279 280 self.done=True
281
282 - def runTUI(self):
283 size = self.ui.get_cols_rows() 284 285 txt = urwid.Text(('banner', " Hello World "), align="center") 286 wrap1 = urwid.AttrWrap( txt, 'streak' ) 287 fill = urwid.Filler( wrap1 ) 288 wrap2 = urwid.AttrWrap( fill, 'bg' ) 289 290 self.goOn=True 291 292 while self.goOn: 293 self.draw_screen(size) 294 keys = self.ui.get_input() 295 if "esc" in keys: 296 break 297 for k in keys: 298 if k=="window resize": 299 size = self.ui.get_cols_rows() 300 continue 301 self.top.keypress( size, k )
302
303 - def draw_screen(self,size):
304 canvas = self.top.render( size, focus=True ) 305 self.ui.draw_screen( size, canvas )
306