281 dc.DrawRectangle(0, 0, *dc.GetSizeTuple()) |
281 dc.DrawRectangle(0, 0, *dc.GetSizeTuple()) |
282 if self._bitmap: |
282 if self._bitmap: |
283 dc.DrawBitmap(self._bitmap, 0, 0, True) |
283 dc.DrawBitmap(self._bitmap, 0, 0, True) |
284 |
284 |
285 |
285 |
|
286 from threading import Lock |
|
287 REFRESH_PERIOD = 0.1 |
|
288 from time import time as gettime |
286 class LogPseudoFile: |
289 class LogPseudoFile: |
287 """ Base class for file like objects to facilitate StdOut for the Shell.""" |
290 """ Base class for file like objects to facilitate StdOut for the Shell.""" |
288 def __init__(self, output, risecall): |
291 def __init__(self, output, risecall): |
289 self.red_white = wx.TextAttr("RED", "WHITE") |
292 self.red_white = wx.TextAttr("RED", "WHITE") |
290 self.red_yellow = wx.TextAttr("RED", "YELLOW") |
293 self.red_yellow = wx.TextAttr("RED", "YELLOW") |
292 self.default_style = None |
295 self.default_style = None |
293 self.output = output |
296 self.output = output |
294 self.risecall = risecall |
297 self.risecall = risecall |
295 # to prevent rapid fire on rising log panel |
298 # to prevent rapid fire on rising log panel |
296 self.rising_timer = 0 |
299 self.rising_timer = 0 |
|
300 self.lock = Lock() |
|
301 self.RefreshLock = Lock() |
|
302 self.stack = [] |
|
303 self.LastRefreshTime = gettime() |
297 |
304 |
298 def write(self, s, style = None): |
305 def write(self, s, style = None): |
299 if style is None : style=self.black_white |
306 if self.lock.acquire(): |
|
307 self.stack.append((s,style)) |
|
308 self.lock.release() |
|
309 current_time = gettime() |
|
310 if current_time - self.LastRefreshTime > REFRESH_PERIOD and self.RefreshLock.acquire(False): |
|
311 wx.CallAfter(self._write) |
|
312 |
|
313 def _write(self): |
300 self.output.Freeze(); |
314 self.output.Freeze(); |
301 if self.default_style != style: |
315 self.lock.acquire() |
302 self.output.SetDefaultStyle(style) |
316 for s, style in self.stack: |
303 self.default_style = style |
317 if style is None : style=self.black_white |
304 self.output.AppendText(s) |
318 if self.default_style != style: |
305 self.output.ScrollLines(s.count('\n')+1) |
319 self.output.SetDefaultStyle(style) |
|
320 self.default_style = style |
|
321 self.output.AppendText(s) |
|
322 #self.output.ScrollLines(s.count('\n')+1) |
|
323 self.stack = [] |
|
324 self.lock.release() |
306 self.output.ShowPosition(self.output.GetLastPosition()) |
325 self.output.ShowPosition(self.output.GetLastPosition()) |
307 self.output.Thaw() |
326 self.output.Thaw() |
|
327 self.LastRefreshTime = gettime() |
|
328 self.RefreshLock.release() |
308 newtime = time.time() |
329 newtime = time.time() |
309 if newtime - self.rising_timer > 1: |
330 if newtime - self.rising_timer > 1: |
310 self.risecall() |
331 self.risecall() |
311 self.rising_timer = newtime |
332 self.rising_timer = newtime |
312 |
333 |
313 def write_warning(self, s): |
334 def write_warning(self, s): |
314 self.write(s,self.red_white) |
335 self.write(s,self.red_white) |
315 |
336 |
316 def write_error(self, s): |
337 def write_error(self, s): |