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 ('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
81 """A browser of all the available descriptions"""
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
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
154 canvas = self.top.render( size, focus=True )
155 self.ui.draw_screen( size, canvas )
156
158 """A dialog for a CaswBuilder-dialog"""
160 CaseBuilderTUI.__init__(self)
161
162 self.desc=CaseBuilderFile(fName)
163
164
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
237 self.ui.run_wrapper(self.runTUI)
238 return self.done
239
241 self.statusText.set_text([('alert',text)," Press ESC to exit"])
242
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
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
304 canvas = self.top.render( size, focus=True )
305 self.ui.draw_screen( size, canvas )
306