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):
61
63 """Common stuff between the TUIs"""
64
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
80 """A browser of all the available descriptions"""
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
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
153 canvas = self.top.render( size, focus=True )
154 self.ui.draw_screen( size, canvas )
155
157 """A dialog for a CaswBuilder-dialog"""
159 CaseBuilderTUI.__init__(self)
160
161 self.desc=CaseBuilderFile(fName)
162
163
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
229 self.ui.run_wrapper(self.runTUI)
230 return self.done
231
233 self.statusText.set_text([('alert',text)," Press ESC to exit"])
234
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
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
296 canvas = self.top.render( size, focus=True )
297 self.ui.draw_screen( size, canvas )
298