Module gui
[hide private]
[frames] | no frames]

Source Code for Module gui

   1  #!/usr/bin/env python 
   2  # -*- coding: utf-8 -*- 
   3  #-------------------------------------------------------------------- 
   4  # Filename: __main__.py 
   5  # Author: Mazhugin Aleksey 
   6  # Created: 2019/07/25 
   7  # ID: $Id: gui.py 64 2019-09-13 16:31:34Z Aleksey $ 
   8  # URL: $URL: file:///D:/svn_/pybag/trunc/src/gui.py $ 
   9  # Copyright: Copyright (c) 2019, Mazhugin Aleksey. 
  10  # License: BSD 
  11  #-------------------------------------------------------------------- 
  12   
  13   
  14  """ 
  15  PYBAG - Crossplatform files synchronization and backup portable tools. 
  16   
  17  GUI implementation. 
  18  """ 
  19   
  20  #__docformat__ = "restructuredtext" # "epytext" 
  21   
  22   
  23  # Importing 
  24  import re 
  25  import webbrowser 
  26  import time 
  27  import threading  # @UnusedImport 
  28  import traceback  # @UnusedImport 
  29  import cfg # @UnusedImport 
  30  from const import * # @UnusedWildImport 
  31  from iof import *  # @UnusedWildImport 
  32  from termcolors import TermColors 
  33  from help import _tips, __about__, _usage, __license__ 
  34  from cli import command_class, f_add, cmd_dist, z_gp_class, cmd_remove,\ 
  35      cmd_relocate, dbstartswith, getpathdirdb, f_stat, z_r, f_syncread,\ 
  36      f_synccompare, f_syncsync, f_syncclear, dbsave, cmd_cleandb 
  37   
  38   
  39   
  40  # Start Implementation 
  41   
  42   
  43  try: 
  44      try: 
  45          import wxversion 
  46          wxversion.ensureMinimal('2.8') 
  47      except Exception,exc: 
  48          log(u'ERROR: When import wxversion - %s \n' % (str(exc),)) 
  49          pass 
  50      ##wxversion.select('2.6') 
  51      import wx 
  52      log(u'wxPython version (%s).' % (wx.__version__,)) 
  53      #from wx.lib.embeddedimage import PyEmbeddedImage 
  54  except Exception,exc: 
  55      prt0(u'ERROR: When import wx - %s \n\nFor correct GUI you need wxPython 2.8.9 or greater.' % (str(exc),)) 
  56      wx = None 
  57  ##        s=u'' 
  58  ##        tbs = traceback.format_exc() 
  59  ##        print u'\n\tTRACEBACK: %s\n' % (str(tbs),) 
  60      pass 
  61  if not wx: 
  62      prt0( u'No needed wxPython found. Use command line interface.\n' ) 
  63   
  64   
  65  # wxPython v 4.0 compatibility 
  66   
  67  if not hasattr(wx, 'ST_SIZEGRIP'): 
  68      setattr(wx, 'ST_SIZEGRIP',wx.STB_SIZEGRIP) 
  69   
  70  if not hasattr(wx, 'SystemSettings_GetColour'): 
  71      setattr(wx, 'SystemSettings_GetColour', wx.SystemSettings.GetColour) 
  72   
  73  # def imagelist_addicon(imglist, pyembimg): 
  74  #     """ 
  75  #     Add 
  76  #     """ 
  77  #     imglist.Add(pyembimg.getBitmap()) 
  78  #     #self._imgList.AddIcon(catalog[t].getIcon()) 
  79   
  80   
  81  catalog = {} 
  82  """Icons catalog.""" 
  83  index = [] 
  84  """Icons index.""" 
  85   
  86  SELSTATEALL = 1 
  87  SELSTATEDEFAULT = 0 
  88  SELSTATECLEAR = 2 
  89  btnSelectRoots_state = SELSTATEDEFAULT 
  90  """Current state of button.""" 
  91   
  92   
  93   
  94  AppState ={} #: Application state for GUI UI update. 
  95   
  96  AppState.update( 
  97      ff_ok = False, 
  98      ##ff_equ = False, 
  99      ff_bag = True, 
 100      ff_orig = True, 
 101      ff_del = True, 
 102      ff_ch = True, 
 103      ff_new = True, 
 104      ff_err = True, 
 105      ff_conf = True, 
 106      ff_warn = True, 
 107      ff_forced = True, 
 108      ff_unch = False, 
 109      ff_file = True, 
 110      ff_dir = True, 
 111      ff_sym = True, 
 112      ff_unk = True, 
 113      ff_ign = False, 
 114      ff_ts = True, 
 115      ) 
 116  AppState[P_OUTPUT] = True 
 117  _filter = { 
 118      u'ff_ok': u'filter_ok', 
 119      ##u'ff_equ' : u'filter_equal', 
 120      u'ff_bag' : u'filter_bag', 
 121      u'ff_orig' : u'filter_origin', 
 122      u'ff_del' : u'filter_delete', 
 123      u'ff_ch' : u'filter_changed', 
 124      u'ff_new' : u'filter_new', 
 125      u'ff_err' : u'filter_error', 
 126      u'ff_conf' : u'filter_conflict', 
 127      u'ff_warn' : u'filter_warning', 
 128      u'ff_forced' : u'filter_forced', 
 129      u'ff_unch' : u'filter_unchanged', 
 130      u'ff_file' : u'filter_file', 
 131      u'ff_dir' : u'filter_directory', 
 132      u'ff_sym' : u'filter_symlink', 
 133      u'ff_unk' : u'filter_unknown', 
 134      u'ff_ign' : u'filter_ignored', 
 135      u'ff_ts' : u'filter_ts', 
 136      P_OUTPUT : P_OUTPUT 
 137      } 
 138   
 139  _outlock = threading.Lock() 
 140  """ 
 141  Lock object for gui print. 
 142  """ 
 143   
 144  _outtxt = u'' 
 145  """ 
 146  Text printed from GUI. 
 147  """ 
 148   
 149   
150 -def start_gui(cmd):
151 """ 152 Start GUI. 153 """ 154 log(u'start GUI') 155 156 import icons 157 icons.loadimages(catalog, index) 158 # Fill columns from config. 159 cfg.Z_COLUMN_CHOISE = FillColFromConfig() 160 161 #Z_APP = wx.PySimpleApp() 162 if cfg.Z_APP is None: 163 cfg.Z_APP = wx.App() 164 165 #initGUI() 166 cfg.Z_GUI = frmMain_class(None) 167 cfg.Z_GUI.Show() 168 cfg.Z_APP.MainLoop() ##Not use for dialog - infinite loop 169 log(u'end GUI')
170 171 # end start gui 172 173 # Next code was initGUI() in last. 174 175 # Columns in default order [(configname, colname, show, size, align), ...] 176 cfg.Z_COLUMN_CHOISE_DEFAULT = [ 177 (u'err', u'Error', 0, 16, wx.LIST_FORMAT_CENTER), 178 (u'forced', u'Forced', 0, 16, wx.LIST_FORMAT_CENTER), 179 (u'dir', u'Direction', 0, 32, wx.LIST_FORMAT_CENTER), 180 (u'stateicon', u'State', 1, 38, wx.LIST_FORMAT_CENTER), 181 (u'actionicon', u'Action', 1, 38, wx.LIST_FORMAT_CENTER), 182 (u'path', u'Path', 1, 350, wx.LIST_FORMAT_LEFT), 183 (u'desc', u'Description', 1, 350, wx.LIST_FORMAT_LEFT), 184 (u'type', u'Type', 0, 16, wx.LIST_FORMAT_CENTER), 185 (u'mdatedb', u'MDate DB', 0, 80, wx.LIST_FORMAT_LEFT), 186 (u'gmdatedb', u'GMT MDate DB', 0, 80, wx.LIST_FORMAT_LEFT), 187 (u'lmdatedb', u'Local MDate DB', 0, 80, wx.LIST_FORMAT_LEFT), 188 (u'crc32db', u'CRC32 DB', 0, 80, wx.LIST_FORMAT_RIGHT), 189 (u'sizedb', u'Size DB', 0, 80, wx.LIST_FORMAT_RIGHT), 190 (u'mdatebag', u'MDate bag', 0, 80, wx.LIST_FORMAT_LEFT), 191 (u'gmdatebag', u'GMT MDate bag', 0, 80, wx.LIST_FORMAT_LEFT), 192 (u'lmdatebag', u'Local MDate bag', 0, 80, wx.LIST_FORMAT_LEFT), 193 (u'crc32bag', u'CRC32 bag', 0, 80, wx.LIST_FORMAT_RIGHT), 194 (u'sizebag', u'Size bag', 0, 80, wx.LIST_FORMAT_RIGHT), 195 (u'mdateorigin', u'MDate origin', 0, 80, wx.LIST_FORMAT_LEFT), 196 (u'gmdateorigin', u'GMT MDate origin', 0, 80, wx.LIST_FORMAT_LEFT), 197 (u'lmdateorigin', u'Local MDate origin', 0, 80, wx.LIST_FORMAT_LEFT), 198 (u'crc32origin', u'CRC32 origin', 0, 80, wx.LIST_FORMAT_RIGHT), 199 (u'sizeorigin', u'Size origin', 0, 80, wx.LIST_FORMAT_RIGHT), 200 (u'symlinkdb', u'Symlink DB', 0, 250, wx.LIST_FORMAT_LEFT), 201 (u'symlinkbag', u'Symlink bag', 0, 250, wx.LIST_FORMAT_LEFT), 202 (u'symlinkorigin', u'Symlink origin', 0, 250, wx.LIST_FORMAT_LEFT), 203 (u'timeshift', u'TS', 0, 16, wx.LIST_FORMAT_CENTER), 204 ] 205 """Columns in default order for GUI list.""" 206 207 _column_choise_dict = dict([(i[COL_NAME],i) for i in cfg.Z_COLUMN_CHOISE_DEFAULT]) 208
209 -def FillColFromConfig():
210 """ 211 Return list with columns. 212 If no columns in config then use default. 213 """ 214 log(u'FillColFromConfig: start') 215 cc = [] 216 k = _column_choise_dict 217 if cfg.Z_CP.has_section(P_GUI): 218 for i in range(len(cfg.Z_COLUMN_CHOISE_DEFAULT)): 219 if cfg.Z_CP.has_option(P_GUI, u'column%d' % i): 220 # column0 = name, visible, width 221 try: 222 n, v, w = tuple([j.strip() for j in cfg.Z_CP.get(P_GUI, u'column%d' % i).split(u',')]) 223 v = int(v) 224 w = int(w) 225 if n in k: 226 cc.append( (n,k[n][COL_HEADING], v, w, k[n][COL_FORMAT]) ) 227 else: 228 log(u'initGUI: ERROR when load columns from config: Wrong column name "%s".' % n) 229 except Exception, exc: 230 log(u'initGUI: ERROR when load columns from config: %s.' % str(exc)) 231 # quit 232 ##end if 233 ##end for 234 if len(cc) <1: 235 # Use default columns. 236 log(u'initGUI: columns not found.') 237 cc = cfg.Z_COLUMN_CHOISE_DEFAULT 238 # Test for all columns. 239 k = [i[COL_NAME] for i in cc] # keys 240 for i in cfg.Z_COLUMN_CHOISE_DEFAULT: 241 if not i[COL_NAME] in k: 242 # Add absant column, do not visible 243 cc.append( (i[COL_NAME],i[COL_HEADING], 0, i[COL_WIDTH], i[COL_FORMAT]) ) 244 else: 245 # Use default columns. 246 cc = cfg.Z_COLUMN_CHOISE_DEFAULT 247 ##end if 248 log(u'FillColFromConfig: end') 249 return cc
250 ##end def 251 252
253 -def WriteCols2Config(cols):
254 """ 255 Write columns to config L{cfg.Z_CP}. 256 """ 257 # Columns in default order [(configname, colname, show, size, align), ...] 258 try: 259 log(u'WriteCols2Config: start') 260 if cfg.Z_CP.has_section(P_GUI): 261 for i in cfg.Z_CP.options(P_GUI): 262 if i.startswith(u'column'): 263 cfg.Z_CP.remove_option(P_GUI, i) 264 else: 265 cfg.Z_CP.add_section(P_GUI) 266 for j in range(len(cols)): 267 i = cols[j] 268 v = u'%s, %d, %d' % (i[COL_NAME], \ 269 i[COL_VISIBLE], i[COL_WIDTH]) 270 cfg.Z_CP.set(P_GUI, u'column%d' % j, v) 271 log(u'WriteCols2Config: column%d = %s' % (j,v)) 272 except Exception, exc: 273 log(u'WriteCols2Config: ERROR %s' % str(exc)) 274 log(u'WriteCols2Config: end')
275
276 -def LoadAppStateFromConfig():
277 """ 278 """ 279 if not cfg.Z_CP.has_section(P_GUI): 280 cfg.Z_CP.add_section(P_GUI) 281 for k in _filter.keys(): 282 if cfg.Z_CP.has_option(P_GUI, _filter[k]): 283 AppState[k] = bool(int(cfg.Z_CP.get(P_GUI, _filter[k]))) 284 log(u'LoadAppStateFromConfig: %s = %d' % (k,int(AppState[k])))
285
286 -def SaveAppStateToConfig():
287 """ 288 """ 289 if not cfg.Z_CP.has_section(P_GUI): 290 cfg.Z_CP.add_section(P_GUI) 291 292 for o in cfg.Z_CP.options(P_GUI): 293 if o.startswith(u'filter_'): 294 cfg.Z_CP.remove_option(P_GUI, o) 295 for k in _filter.keys(): 296 cfg.Z_CP.set(P_GUI, _filter[k], str(int(AppState[k])))
297 298
299 -class dlgTips_class(wx.Dialog):
300 - def __init__(self, *args, **kwds):
301 # begin wxGlade: dlgTips_class.__init__ 302 kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_DIALOG_STYLE 303 wx.Dialog.__init__(self, *args, **kwds) 304 self.SetSize((600, 300)) 305 self.label_16 = wx.StaticText(self, wx.ID_ANY, "Tips", style=wx.ALIGN_CENTER) 306 self.static_line_2 = wx.StaticLine(self, wx.ID_ANY) 307 self.txtTips = wx.TextCtrl(self, wx.ID_ANY, "", style=wx.BORDER_NONE | wx.TE_AUTO_URL | wx.TE_CHARWRAP | wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_WORDWRAP) 308 self.static_line_6 = wx.StaticLine(self, wx.ID_ANY) 309 self.btnPrev = wx.Button(self, wx.ID_ANY, "<<<") 310 self.btnNext = wx.Button(self, wx.ID_ANY, ">>>") 311 self.btnClose = wx.Button(self, wx.ID_ANY, "Close") 312 self.chboxShowTips = wx.CheckBox(self, wx.ID_ANY, "Show tips at startup.") 313 314 self.__set_properties() 315 self.__do_layout() 316 317 self.Bind(wx.EVT_TEXT_URL, self.txtTips_url_handler, self.txtTips) 318 self.Bind(wx.EVT_BUTTON, self.btnPrev_handler, self.btnPrev) 319 self.Bind(wx.EVT_BUTTON, self.btnNext_handler, self.btnNext) 320 self.Bind(wx.EVT_BUTTON, self.btnClose_handler, self.btnClose) 321 # end wxGlade 322 323 self.Bind(wx.EVT_INIT_DIALOG, self.Init_handler) 324 self.Bind(wx.EVT_CLOSE, self.dlgClose_handler)
325
326 - def __set_properties(self):
327 # begin wxGlade: dlgTips_class.__set_properties 328 self.SetTitle("PYBAG - Tips") 329 self.SetSize((600, 300)) 330 self.label_16.SetFont(wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) 331 self.txtTips.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE)) 332 self.chboxShowTips.SetValue(1)
333 # end wxGlade 334
335 - def __do_layout(self):
336 # begin wxGlade: dlgTips_class.__do_layout 337 sizer_25 = wx.BoxSizer(wx.VERTICAL) 338 sizer_27 = wx.BoxSizer(wx.HORIZONTAL) 339 sizer_26 = wx.BoxSizer(wx.HORIZONTAL) 340 sizer_25.Add(self.label_16, 0, wx.ALIGN_CENTER | wx.ALL, 10) 341 sizer_25.Add(self.static_line_2, 0, wx.EXPAND, 0) 342 sizer_25.Add(self.txtTips, 3, wx.ALL | wx.EXPAND, 10) 343 sizer_25.Add(self.static_line_6, 0, wx.EXPAND, 0) 344 sizer_26.Add(self.btnPrev, 0, wx.ALIGN_CENTER | wx.ALL, 2) 345 sizer_26.Add(self.btnNext, 0, wx.ALIGN_CENTER | wx.ALL, 2) 346 sizer_25.Add(sizer_26, 1, wx.EXPAND, 0) 347 sizer_27.Add(self.btnClose, 0, wx.ALIGN_CENTER | wx.ALL, 2) 348 sizer_27.Add(self.chboxShowTips, 1, wx.ALL | wx.EXPAND, 15) 349 sizer_25.Add(sizer_27, 1, wx.EXPAND, 0) 350 self.SetSizer(sizer_25) 351 self.Layout()
352 # end wxGlade 353
354 - def txtTips_url_handler(self, event): # wxGlade: dlgTips_class.<event_handler>
355 try: 356 if event.GetMouseEvent().LeftUp(): 357 url = self.txtTips.GetRange(event.GetURLStart(), event.GetURLEnd()) 358 webbrowser.open(url) 359 except Exception,exc: 360 prt0(u'ERROR in program: %s.' % (traceback.format_exc(),),place=u'dlgTips.txtTips_Url_handler', 361 error=exc) 362 event.Skip()
363
364 - def Init_handler(self, event):
365 self.chboxShowTips.Value = cfg.SHOWTIPS 366 self.ShowTip()
367
368 - def ShowTip(self):
369 """ 370 Show tip and increase number. 371 If number < 0 then show last tip. 372 """ 373 last = len(_tips) - 1 374 if cfg.TIPSNUMBER > last: 375 cfg.TIPSNUMBER = 0 376 if cfg.TIPSNUMBER < 0: 377 cfg.TIPSNUMBER = last 378 self.txtTips.SetValue(_tips[cfg.TIPSNUMBER]) 379 self.Refresh() 380 cfg.TIPSNUMBER += 1
381
382 - def btnPrev_handler(self, event): # wxGlade: dlgTips_class.<event_handler>
383 cfg.TIPSNUMBER -= 2 384 self.ShowTip() 385 event.Skip() 386
387 - def btnNext_handler(self, event): # wxGlade: dlgTips_class.<event_handler>
388 self.ShowTip() 389 event.Skip() 390
391 - def btnClose_handler(self, event): # wxGlade: dlgTips_class.<event_handler>
392 self.Close() 393 event.Skip() 394
395 - def dlgClose_handler(self, event): # wxGlade: dlgTips_class.<event_handler>
396 cfg.SHOWTIPS = self.chboxShowTips.IsChecked() 397 log(u'dlgTips.dlgClose_handler: set SHOWTIPS=%s' % cfg.SHOWTIPS) 398 self.EndModal(0) 399 event.Skip(False) 400 401 # end of class dlgTips_class 402 403
404 -class dlgPrefs_class(wx.Dialog):
405 - def __init__(self, *args, **kwds):
406 # begin wxGlade: dlgPrefs_class.__init__ 407 kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER 408 wx.Dialog.__init__(self, *args, **kwds) 409 self.SetSize((600, 570)) 410 self.nbookPrefs = wx.Notebook(self, wx.ID_ANY, style=0) 411 self.panelPrefsGlobal = wx.Panel(self.nbookPrefs, wx.ID_ANY) 412 self.label_6 = wx.StaticText(self.panelPrefsGlobal, wx.ID_ANY, "Verbosity:") 413 self.cboxGlobalVerbosity = wx.ComboBox(self.panelPrefsGlobal, wx.ID_ANY, choices=["-1 - Not at all", "0 - Only global errors", "1 - Errors and success", "2 - Errors and conflicts", "3 - Normal output (errors, conflicts, warnings)", "4 - Large output (as 3 and file operations)", "5 - Logging output"], style=wx.CB_DROPDOWN | wx.CB_READONLY) 414 self.chboxGlobalEmulation = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Enable emulation by default.") 415 self.chboxGlobalLogging = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Enable logging by default.") 416 self.chboxGlobalDebug = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Enable debug output by default.") 417 self.checkboxGlobalColorize = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Colorize output in text (console) mode.") 418 self.label_15 = wx.StaticText(self.panelPrefsGlobal, wx.ID_ANY, "Modification time delta:") 419 self.spinGlobalMDDELTA = wx.SpinCtrl(self.panelPrefsGlobal, wx.ID_ANY, "5", min=0, max=10000, style=0) 420 self.chboxGlobalOutput = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Show output window.") 421 self.chboxGlobalTip = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Show tips window at start up.") 422 self.chboxGlobalFilterOk = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Synchronization OK") 423 self.chboxGlobalFilterWarn = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Warnings") 424 self.chboxGlobalFilterConf = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Conflicts") 425 self.chboxGlobalFilterErr = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Errors") 426 self.chboxGlobalFilterBag = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Bag direction") 427 self.chboxGlobalFilterOrig = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Origin direction") 428 self.chboxGlobalFilterNew = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "New items") 429 self.chboxGlobalFilterCh = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Changed items") 430 self.chboxGlobalFilterDel = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Deleted items") 431 self.chboxGlobalFilterIgn = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Ignored items") 432 self.chboxGlobalFilterUnch = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Unchanged items") 433 self.chboxGlobalFilterForced = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Forced operation") 434 self.chboxGlobalFilterFile = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "File") 435 self.chboxGlobalFilterDir = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Directories") 436 self.chboxGlobalFilterSym = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Symlinks") 437 self.chboxGlobalFilterUnk = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Unknown items") 438 self.chboxGlobalFilterTs = wx.CheckBox(self.panelPrefsGlobal, wx.ID_ANY, "Time shifted items") 439 self.panelPrefsRoots = wx.Panel(self.nbookPrefs, wx.ID_ANY) 440 self.lboxRoots = wx.ListBox(self.panelPrefsRoots, wx.ID_ANY, choices=[], style=wx.LB_HSCROLL | wx.LB_NEEDED_SB | wx.LB_SINGLE | wx.LB_SORT) 441 self.label_12 = wx.StaticText(self.panelPrefsRoots, wx.ID_ANY, "Symlink action:") 442 self.cboxRootsSymlink = wx.ComboBox(self.panelPrefsRoots, wx.ID_ANY, choices=[], style=wx.CB_DROPDOWN | wx.CB_READONLY) 443 self.label_13 = wx.StaticText(self.panelPrefsRoots, wx.ID_ANY, "Compare method:") 444 self.cboxRootsCompare = wx.ComboBox(self.panelPrefsRoots, wx.ID_ANY, choices=[], style=wx.CB_DROPDOWN | wx.CB_READONLY) 445 self.label_14 = wx.StaticText(self.panelPrefsRoots, wx.ID_ANY, "Ignore pattern (wilds (* and ?) separated by\ncomma, or regexp started with ! ).") 446 self.txtIgnore = wx.TextCtrl(self.panelPrefsRoots, wx.ID_ANY, "") 447 self.chboxRootsBackup = wx.CheckBox(self.panelPrefsRoots, wx.ID_ANY, "Check if root is backup.") 448 self.chboxRootsSelectDefault = wx.CheckBox(self.panelPrefsRoots, wx.ID_ANY, "Select by default for synchronization.") 449 self.nbookPrefs_pane_3 = wx.Panel(self.nbookPrefs, wx.ID_ANY) 450 self.lboxColumns = wx.ListBox(self.nbookPrefs_pane_3, wx.ID_ANY, choices=[]) 451 self.btnColumnsUp = wx.Button(self.nbookPrefs_pane_3, wx.ID_UP, "") 452 self.btnColumnsDown = wx.Button(self.nbookPrefs_pane_3, wx.ID_DOWN, "") 453 self.btnColumnsCurrent = wx.Button(self.nbookPrefs_pane_3, wx.ID_ANY, "Get current") 454 self.btnColumnsConfig = wx.Button(self.nbookPrefs_pane_3, wx.ID_ANY, "From config") 455 self.btnColumnsDefault = wx.Button(self.nbookPrefs_pane_3, wx.ID_ANY, "Reset to default") 456 self.label_17 = wx.StaticText(self.nbookPrefs_pane_3, wx.ID_ANY, "Column width", style=wx.ALIGN_CENTER) 457 self.spinColWidth = wx.SpinCtrl(self.nbookPrefs_pane_3, wx.ID_ANY, "", min=0, max=2000, style=0) 458 self.chboxColVisible = wx.CheckBox(self.nbookPrefs_pane_3, wx.ID_ANY, "Visible") 459 self.btnColumnsApply = wx.Button(self.nbookPrefs_pane_3, wx.ID_ANY, "Apply") 460 self.chboxColumnsSave = wx.CheckBox(self.nbookPrefs_pane_3, wx.ID_ANY, "Save columns changes when exit from PyBAG (save only if emulation mode turn off).") 461 self.btnOk = wx.Button(self, wx.ID_ANY, "Ok") 462 self.btnCancel = wx.Button(self, wx.ID_ANY, "Cancel") 463 464 self.__set_properties() 465 self.__do_layout() 466 467 self.Bind(wx.EVT_LISTBOX, self.lboxRoots_handler, self.lboxRoots) 468 self.Bind(wx.EVT_LISTBOX, self.lboxColumns_selected_handler, self.lboxColumns) 469 self.Bind(wx.EVT_BUTTON, self.btnColumnsUp_handler, self.btnColumnsUp) 470 self.Bind(wx.EVT_BUTTON, self.btnColumnsDown_handler, self.btnColumnsDown) 471 self.Bind(wx.EVT_BUTTON, self.btnColumnsCurrent_handler, self.btnColumnsCurrent) 472 self.Bind(wx.EVT_BUTTON, self.btnColumnsConfig_handler, self.btnColumnsConfig) 473 self.Bind(wx.EVT_BUTTON, self.btnColumnsDefault_handler, self.btnColumnsDefault) 474 self.Bind(wx.EVT_BUTTON, self.btnColumnsApply_handler, self.btnColumnsApply) 475 self.Bind(wx.EVT_BUTTON, self.btnOk_handler, self.btnOk) 476 self.Bind(wx.EVT_BUTTON, self.btnCancel_handler, self.btnCancel) 477 # end wxGlade 478 479 self.cursel = u'' #: Current selection in lboxRoots. 480 self.cboxRootsCompare.AppendItems(z_compare_choice) 481 self.cboxRootsSymlink.AppendItems(z_symlink_choice) 482 483 self.Bind(wx.EVT_INIT_DIALOG, self.Init_handler)
484
485 - def __set_properties(self):
486 # begin wxGlade: dlgPrefs_class.__set_properties 487 self.SetTitle("Preferences") 488 self.SetSize((600, 570)) 489 self.cboxGlobalVerbosity.SetToolTipString("Verbosity level") 490 self.cboxGlobalVerbosity.SetSelection(4) 491 self.lboxColumns.SetFont(wx.Font(8, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, "")) 492 self.btnColumnsCurrent.SetToolTipString("Get columns positions from window") 493 self.btnColumnsConfig.SetToolTipString("Get columns position from configuration file") 494 self.btnColumnsDefault.SetToolTipString("Reset columns position to program default") 495 self.spinColWidth.SetToolTipString("Set column width in pixels") 496 self.chboxColVisible.SetToolTipString("Show / hide column")
497 # end wxGlade 498
499 - def __do_layout(self):
500 # begin wxGlade: dlgPrefs_class.__do_layout 501 sizer_12 = wx.BoxSizer(wx.VERTICAL) 502 sizer_14 = wx.BoxSizer(wx.HORIZONTAL) 503 sizer_13 = wx.BoxSizer(wx.HORIZONTAL) 504 sizer_21 = wx.BoxSizer(wx.VERTICAL) 505 sizer_22 = wx.BoxSizer(wx.HORIZONTAL) 506 sizer_24 = wx.BoxSizer(wx.VERTICAL) 507 sizer_15 = wx.BoxSizer(wx.HORIZONTAL) 508 sizer_16 = wx.BoxSizer(wx.VERTICAL) 509 sizer_17 = wx.BoxSizer(wx.HORIZONTAL) 510 sizer_20 = wx.StaticBoxSizer(wx.StaticBox(self.panelPrefsGlobal, wx.ID_ANY, "Default item list filter:"), wx.VERTICAL) 511 sizer_19 = wx.BoxSizer(wx.VERTICAL) 512 sizer_19.Add(self.label_6, 0, wx.ALL, 2) 513 sizer_19.Add(self.cboxGlobalVerbosity, 0, wx.ALL | wx.EXPAND, 2) 514 sizer_19.Add((10, 10), 0, 0, 0) 515 sizer_19.Add(self.chboxGlobalEmulation, 0, wx.ALL, 2) 516 sizer_19.Add(self.chboxGlobalLogging, 0, wx.ALL, 2) 517 sizer_19.Add(self.chboxGlobalDebug, 0, wx.ALL, 2) 518 sizer_19.Add(self.checkboxGlobalColorize, 0, wx.ALL, 2) 519 sizer_19.Add((10, 10), 0, 0, 0) 520 sizer_19.Add(self.label_15, 0, wx.ALL, 2) 521 sizer_19.Add(self.spinGlobalMDDELTA, 0, wx.ALL, 2) 522 sizer_19.Add((10, 10), 0, 0, 0) 523 sizer_19.Add(self.chboxGlobalOutput, 0, wx.ALL, 2) 524 sizer_19.Add((10, 10), 0, 0, 0) 525 sizer_19.Add(self.chboxGlobalTip, 0, wx.ALL, 2) 526 sizer_17.Add(sizer_19, 1, wx.EXPAND, 0) 527 sizer_20.Add(self.chboxGlobalFilterOk, 0, wx.ALL, 2) 528 sizer_20.Add(self.chboxGlobalFilterWarn, 0, wx.ALL, 2) 529 sizer_20.Add(self.chboxGlobalFilterConf, 0, wx.ALL, 2) 530 sizer_20.Add(self.chboxGlobalFilterErr, 0, wx.ALL, 2) 531 sizer_20.Add(self.chboxGlobalFilterBag, 0, wx.ALL, 2) 532 sizer_20.Add(self.chboxGlobalFilterOrig, 0, wx.ALL, 2) 533 sizer_20.Add(self.chboxGlobalFilterNew, 0, wx.ALL, 2) 534 sizer_20.Add(self.chboxGlobalFilterCh, 0, wx.ALL, 2) 535 sizer_20.Add(self.chboxGlobalFilterDel, 0, wx.ALL, 2) 536 sizer_20.Add(self.chboxGlobalFilterIgn, 0, wx.ALL, 2) 537 sizer_20.Add(self.chboxGlobalFilterUnch, 0, wx.ALL, 2) 538 sizer_20.Add(self.chboxGlobalFilterForced, 0, wx.ALL, 2) 539 sizer_20.Add(self.chboxGlobalFilterFile, 0, wx.ALL, 2) 540 sizer_20.Add(self.chboxGlobalFilterDir, 0, wx.ALL, 2) 541 sizer_20.Add(self.chboxGlobalFilterSym, 0, wx.ALL, 2) 542 sizer_20.Add(self.chboxGlobalFilterUnk, 0, wx.ALL, 2) 543 sizer_20.Add(self.chboxGlobalFilterTs, 0, wx.ALL, 2) 544 sizer_17.Add(sizer_20, 1, 0, 0) 545 self.panelPrefsGlobal.SetSizer(sizer_17) 546 sizer_15.Add(self.lboxRoots, 1, wx.ALL | wx.EXPAND, 2) 547 sizer_16.Add(self.label_12, 0, wx.ALL, 2) 548 sizer_16.Add(self.cboxRootsSymlink, 0, wx.ALL | wx.EXPAND, 2) 549 sizer_16.Add((20, 20), 0, 0, 0) 550 sizer_16.Add(self.label_13, 0, wx.ALL, 2) 551 sizer_16.Add(self.cboxRootsCompare, 0, wx.ALL | wx.EXPAND, 2) 552 sizer_16.Add((20, 20), 0, 0, 0) 553 sizer_16.Add(self.label_14, 0, wx.ALL, 2) 554 sizer_16.Add(self.txtIgnore, 0, wx.ALL | wx.EXPAND, 2) 555 sizer_16.Add((20, 20), 0, 0, 0) 556 sizer_16.Add(self.chboxRootsBackup, 0, wx.ALL, 2) 557 sizer_16.Add((20, 20), 0, 0, 0) 558 sizer_16.Add(self.chboxRootsSelectDefault, 0, wx.ALL, 2) 559 sizer_15.Add(sizer_16, 1, wx.ALL | wx.EXPAND, 2) 560 self.panelPrefsRoots.SetSizer(sizer_15) 561 sizer_22.Add(self.lboxColumns, 2, wx.ALL | wx.EXPAND, 5) 562 sizer_24.Add(self.btnColumnsUp, 0, wx.ALL | wx.EXPAND, 5) 563 sizer_24.Add(self.btnColumnsDown, 0, wx.ALL | wx.EXPAND, 5) 564 sizer_24.Add(self.btnColumnsCurrent, 0, wx.ALL | wx.EXPAND, 5) 565 sizer_24.Add(self.btnColumnsConfig, 0, wx.ALL | wx.EXPAND, 5) 566 sizer_24.Add(self.btnColumnsDefault, 0, wx.ALL | wx.EXPAND, 5) 567 sizer_24.Add(self.label_17, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 5) 568 sizer_24.Add(self.spinColWidth, 0, wx.ALL | wx.EXPAND, 5) 569 sizer_24.Add(self.chboxColVisible, 0, wx.ALL, 5) 570 sizer_24.Add(self.btnColumnsApply, 0, wx.ALL | wx.EXPAND, 5) 571 sizer_22.Add(sizer_24, 1, wx.EXPAND, 0) 572 sizer_21.Add(sizer_22, 1, wx.EXPAND, 0) 573 sizer_21.Add(self.chboxColumnsSave, 0, wx.ALL | wx.EXPAND, 10) 574 self.nbookPrefs_pane_3.SetSizer(sizer_21) 575 self.nbookPrefs.AddPage(self.panelPrefsGlobal, "Global preferences") 576 self.nbookPrefs.AddPage(self.panelPrefsRoots, "Roots preferences") 577 self.nbookPrefs.AddPage(self.nbookPrefs_pane_3, "Columns preferences") 578 sizer_13.Add(self.nbookPrefs, 1, wx.ALL | wx.EXPAND, 2) 579 sizer_12.Add(sizer_13, 1, wx.ALL | wx.EXPAND, 2) 580 sizer_14.Add(self.btnOk, 0, wx.ALL, 2) 581 sizer_14.Add(self.btnCancel, 0, wx.ALIGN_RIGHT | wx.ALL, 2) 582 sizer_12.Add(sizer_14, 0, wx.ALL | wx.EXPAND, 2) 583 self.SetSizer(sizer_12) 584 self.Layout()
585 # end wxGlade 586
587 - def lboxRoots_handler(self, event): # wxGlade: dlgPrefs_class.<event_handler>
588 try: 589 sel = self.lboxRoots.GetString(self.lboxRoots.GetSelection()) 590 dbg(u'dlgPrefs.lboxRoots_handler: sel="%s".' % (sel,)) 591 self.saveRootsPage() 592 self.cursel = sel 593 self.loadRootsPage() 594 except Exception,exc: 595 prt0(u'ERROR in program: %s.' % (traceback.format_exc(),),place=u'dlgPrefs.lboxRoots_handler', 596 error=exc) 597 event.Skip(False)
598
599 - def btnOk_handler(self, event): # wxGlade: dlgPrefs_class.<event_handler>
600 try: 601 mddelta = self.spinGlobalMDDELTA.GetValue() 602 cfg.Z_CP.setopt(u'root', P_MDDELTA,str(mddelta)) 603 self.saveRootsPage() 604 WriteCols2Config(self.cols) 605 if not cfg.Z_CP.has_section(P_GUI): 606 cfg.Z_CP.add_section(P_GUI) 607 cfg.Z_CP.set(P_GUI, P_SHOWTIPS, str(int(self.chboxGlobalTip.GetValue()))) 608 cfg.SHOWTIPS = bool(int(self.chboxGlobalTip.GetValue())) 609 cfg.Z_CP.set(P_GUI, P_WRITECOLSATEXIT, str(int(self.chboxColumnsSave.GetValue()))) 610 611 cfg.Z_CP.setopt(u'root', P_DEBUG, str(int(self.chboxGlobalDebug.GetValue()))) 612 cfg.Z_CP.setopt(u'root', P_EMUL, str(int(self.chboxGlobalEmulation.GetValue()))) 613 cfg.Z_CP.setopt(u'root', P_LOGGING, str(int(self.chboxGlobalLogging.GetValue()))) 614 cfg.Z_CP.setopt(u'root', P_VERB, str(int(self.cboxGlobalVerbosity.GetSelection()-1))) 615 cfg.Z_CP.setopt(u'root', P_COLORIZE, str(int(self.checkboxGlobalColorize.GetValue()))) 616 617 for k in _filter.keys(): 618 if k.startswith(u'ff_'): 619 n = u'chboxGlobalFilter' + k[3:].capitalize() 620 AppState[k] = getattr(self, n).GetValue() 621 AppState[P_OUTPUT] = self.chboxGlobalOutput.GetValue() 622 SaveAppStateToConfig() 623 cfg.Z_CP.save() # In Z_CP emulation test have too. 624 if cfg.PYBAG_EMUL: 625 prt0(u'Emulation on. Do not save.',place=u'dlgPrefs.btnOk_handler') 626 else: 627 prt0(u'Preferences saved.',place=u'dlgPrefs.btnOk_handler') 628 except Exception,exc: 629 prt0(u'ERROR in program: %s.' % (traceback.format_exc(),),place=u'dlgPrefs.btnOk_handler', 630 error=exc) 631 self.EndModal(0) 632 event.Skip(False) 633
634 - def Init_handler(self, event):
635 log(u'dlgPrefs.Init_handler: Init handler') 636 try: 637 # x-XXX mddelta not used ??? 638 mddelta = cfg.Z_CP.getopt(u'root', P_MDDELTA, False, cfg.MDDELTA) 639 self.spinGlobalMDDELTA.SetValue(int(mddelta)) 640 self.chboxGlobalDebug.SetValue( bool(int(cfg.Z_CP.getopt(u'root', P_DEBUG, False, PYBAG_DEBUG_DEFAULT))) ) 641 self.chboxGlobalEmulation.SetValue( bool(int(cfg.Z_CP.getopt(u'root', P_EMUL, False, PYBAG_EMUL_DEFAULT))) ) 642 self.chboxGlobalLogging.SetValue( bool(int(cfg.Z_CP.getopt(u'root', P_LOGGING, False, PYBAG_LOG_DEFAULT))) ) 643 verb = int(cfg.Z_CP.getopt(u'root', P_VERB, False, VERBOSE_DEFAULT)) 644 self.cboxGlobalVerbosity.SetSelection(verb + 1) 645 colorize = cfg.Z_CP.getopt(u'root', P_COLORIZE, False, PYBAG_COLORIZE_DEFAULT) 646 self.checkboxGlobalColorize.SetValue(bool(int(colorize))) 647 if cfg.Z_CP.has_section(P_GUI): 648 v = False 649 if cfg.Z_CP.has_option(P_GUI,P_WRITECOLSATEXIT): 650 v = cfg.Z_CP.get(P_GUI,P_WRITECOLSATEXIT) 651 v = bool(int( (v in [u'0', u'1'] and v) or u'0' )) 652 self.chboxColumnsSave.SetValue(v) 653 self.chboxGlobalTip.SetValue(cfg.SHOWTIPS) 654 rs = cfg.Z_CP.getrootsbag() 655 self.lboxRoots.Set(rs) 656 self.lboxRoots.Select(-1) 657 self.cursel = u'' 658 self.loadRootsPage() 659 LoadAppStateFromConfig() 660 for k in _filter.keys(): 661 if k.startswith(u'ff_'): 662 n = u'chboxGlobalFilter' + k[3:].capitalize() 663 getattr(self, n).SetValue(AppState[k]) 664 self.chboxGlobalOutput.SetValue(AppState[P_OUTPUT]) 665 # Fill columns 666 self.cols = FillColFromConfig() 667 self.FillColumns() 668 self.chboxColVisible.SetValue(False) 669 self.spinColWidth.SetValue(0) 670 self.lboxColumns.Select(wx.NOT_FOUND) 671 except Exception,exc: 672 prt0(u'ERROR in program: %s.' % (traceback.format_exc(),),place=u'dlgPrefs.Init_handler', 673 error=exc) 674 event.Skip()
675
676 - def GetColText(self, coldata):
677 """ 678 Return string for fill listbox. 679 Format I{coldata} in default order [(configname, colname, show, size, align), ...]. 680 """ 681 v = coldata[COL_VISIBLE] and u'X' or u'-' 682 s = u' ' + v 683 s += u'...' + coldata[COL_HEADING] + u'.'*(25-len(coldata[COL_HEADING])) 684 d = u'%d' % coldata[COL_WIDTH] 685 s += u'.'*(5-len(d)) + d 686 return s
687
688 - def FillColumns(self):
689 """ 690 Fill list box from C{self.cols}. 691 Format in default order [(configname, colname, show, size, align), ...]. 692 """ 693 self.lboxColumns.Clear() 694 #idx = 0 695 for i in self.cols: 696 #v = bool(int(i[COL_VISIBLE])) 697 self.lboxColumns.Append(self.GetColText(i))
698 ##self.lboxColumns.Check(self.lboxColumns.GetCount()-1, v) 699
700 - def btnCancel_handler(self, event): # wxGlade: dlgPrefs_class.<event_handler>
701 log(u'dlgPrefs.btnCancel_handler: Cancel.') 702 self.EndModal(-1) 703 event.Skip(False) 704
705 - def loadRootsPage(self):
706 """ 707 """ 708 log(u'dlgPrefs.loadRootsPage: start') 709 710 try: 711 if self.cursel: 712 rn = cfg.Z_CP.findroot(self.cursel) 713 log(u'dlgPrefs.loadRootsPage: rn = "%s"' % (rn,)) 714 ignore = cfg.Z_CP.getopt(rn, P_IGNORE, False, P_DEFIGNORE) 715 symlink = cfg.Z_CP.getopt(rn, P_SYMLINK, False, P_DEFSYMLINK) 716 compare = cfg.Z_CP.getopt(rn, P_COMPARE, False, P_DEFCOMPARE) 717 backup = cfg.Z_CP.getopt(rn, P_BACKUP, False, P_DEFBACKUP) 718 seldef = cfg.Z_CP.getopt(rn, P_SELECTDEFAULT, False, P_DEFSELECTDEFAULT) 719 backup = backup == P_BACKUPYES 720 seldef = seldef == P_SELECTDEFAULTYES 721 sym = self.cboxRootsSymlink.FindString(symlink) 722 _cmp = self.cboxRootsCompare.FindString(compare) 723 else: 724 log(u'dlgPrefs.loadRootsPage: no cursel') 725 ignore = u'' 726 sym = -1 727 _cmp = -1 728 backup = False 729 seldef = False 730 self.txtIgnore.SetValue(ignore) 731 self.cboxRootsCompare.Select(_cmp) 732 self.cboxRootsSymlink.Select(sym) 733 self.chboxRootsBackup.SetValue(backup) 734 self.chboxRootsSelectDefault.SetValue(seldef) 735 except Exception,exc: 736 prt0(u'ERROR in program: %s.' % (traceback.format_exc(),),place=u'dlgPrefs.loadRootsPage', 737 error=exc) 738 log(u'dlgPrefs.loadRootsPage: end')
739
740 - def saveRootsPage(self):
741 """ 742 """ 743 log(u'dlgPrefs.saveRootsPage: start') 744 try: 745 if self.cursel: 746 dbg(u'dlgPrefs.saveRootsPage: cursel is good') 747 _cmp = self.cboxRootsCompare.GetSelection() 748 sym = self.cboxRootsSymlink.GetSelection() 749 ignore = self.txtIgnore.GetValue() 750 symlink = self.cboxRootsSymlink.GetString(sym) 751 compare = self.cboxRootsCompare.GetString(_cmp) 752 backup = (self.chboxRootsBackup.GetValue() and P_BACKUPYES) or P_BACKUPNO 753 seldef = (self.chboxRootsSelectDefault.GetValue() and P_SELECTDEFAULTYES) or P_SELECTDEFAULTNO 754 rn = cfg.Z_CP.findroot(self.cursel) 755 cfg.Z_CP.setopt(rn, P_IGNORE, ignore) 756 cfg.Z_CP.setopt(rn, P_COMPARE, compare) 757 cfg.Z_CP.setopt(rn, P_SYMLINK, symlink) 758 cfg.Z_CP.setopt(rn, P_BACKUP, backup) 759 cfg.Z_CP.setopt(rn, P_SELECTDEFAULT, seldef) 760 ##end if 761 except Exception,exc: 762 prt0(u'ERROR in program: %s.' % (traceback.format_exc(),),place=u'dlgPrefs.saveRootsPage', 763 error=exc) 764 log(u'dlgPrefs.saveRootsPage: end')
765
766 - def btnColumnsUp_handler(self, event): # wxGlade: dlgPrefs_class.<event_handler>
767 idx = self.lboxColumns.GetSelection() 768 if idx != wx.NOT_FOUND: 769 if idx > 0: 770 cx = self.cols[idx-1] 771 self.cols[idx-1] = self.cols[idx] 772 self.cols[idx] = cx 773 self.FillColumns() 774 self.lboxColumns.Select(idx-1) 775 event.Skip(False) 776
777 - def btnColumnsDown_handler(self, event): # wxGlade: dlgPrefs_class.<event_handler>
778 idx = self.lboxColumns.GetSelection() 779 if idx != wx.NOT_FOUND: 780 if idx < len(self.cols)-1: 781 cx = self.cols[idx+1] 782 self.cols[idx+1] = self.cols[idx] 783 self.cols[idx] = cx 784 self.FillColumns() 785 self.lboxColumns.Select(idx+1) 786 event.Skip(False) 787
788 - def btnColumnsCurrent_handler(self, event): # wxGlade: dlgPrefs_class.<event_handler>
789 self.cols = cfg.Z_COLUMN_CHOISE[:] 790 self.FillColumns() 791 self.chboxColVisible.SetValue(False) 792 self.spinColWidth.SetValue(0) 793 self.lboxColumns.Select(wx.NOT_FOUND) 794 event.Skip(False) 795
796 - def btnColumnsDefault_handler(self, event): # wxGlade: dlgPrefs_class.<event_handler>
797 self.cols = cfg.Z_COLUMN_CHOISE_DEFAULT[:] 798 self.FillColumns() 799 self.chboxColVisible.SetValue(False) 800 self.spinColWidth.SetValue(0) 801 self.lboxColumns.Select(wx.NOT_FOUND) 802 event.Skip(False) 803
804 - def btnColumnsApply_handler(self, event): # wxGlade: dlgPrefs_class.<event_handler>
805 #order [(configname, colname, show, size, align), ...]. 806 idx = self.lboxColumns.GetSelection() 807 if idx != wx.NOT_FOUND: 808 cd = self.cols[idx] 809 v = int(self.chboxColVisible.GetValue()) 810 w = self.spinColWidth.GetValue() 811 self.cols[idx] = (cd[COL_NAME],cd[COL_HEADING],v,w,cd[COL_FORMAT]) 812 self.FillColumns() 813 self.lboxColumns.Select(idx) 814 event.Skip(False) 815
816 - def btnColumnsConfig_handler(self, event): # wxGlade: dlgPrefs_class.<event_handler>
817 self.cols = FillColFromConfig() 818 self.FillColumns() 819 self.chboxColVisible.SetValue(False) 820 self.spinColWidth.SetValue(0) 821 self.lboxColumns.Select(wx.NOT_FOUND) 822 event.Skip(False) 823
824 - def lboxColumns_selected_handler(self, event): # wxGlade: dlgPrefs_class.<event_handler>
825 try: 826 log(u'lboxColumns_selected_handler: start') 827 idx = self.lboxColumns.GetSelection() 828 if idx != wx.NOT_FOUND: 829 self.chboxColVisible.SetValue(self.cols[idx][COL_VISIBLE]) 830 self.spinColWidth.SetValue(self.cols[idx][COL_WIDTH]) 831 else: 832 self.chboxColVisible.SetValue(False) 833 self.spinColWidth.SetValue(0) 834 except Exception, exc: 835 log(u'lboxColumns_selected_handler: ERROR %s' % str(exc)) 836 event.Skip() 837 838 # end of class dlgPrefs_class 839 840
841 -class dlgAddRoot_class(wx.Dialog):
842 - def __init__(self, *args, **kwds):
843 # begin wxGlade: dlgAddRoot_class.__init__ 844 kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_DIALOG_STYLE 845 wx.Dialog.__init__(self, *args, **kwds) 846 self.label_8 = wx.StaticText(self, wx.ID_ANY, "Path for adding: ") 847 self.txtPath = wx.TextCtrl(self, wx.ID_ANY, "") 848 self.btnPathSelect = wx.Button(self, wx.ID_ANY, ". . .") 849 self.rbPathType = wx.RadioBox(self, wx.ID_ANY, "Select path type.", choices=["Directory", "File or symlink"], majorDimension=0, style=wx.RA_SPECIFY_COLS) 850 self.static_line_4 = wx.StaticLine(self, wx.ID_ANY) 851 self.label_9 = wx.StaticText(self, wx.ID_ANY, "Select symlink action.") 852 self.cboxSymlink = wx.ComboBox(self, wx.ID_ANY, choices=["Copy", "Ignore"], style=wx.CB_DROPDOWN | wx.CB_READONLY) 853 self.label_10 = wx.StaticText(self, wx.ID_ANY, "Select compare method.") 854 self.cboxCompare = wx.ComboBox(self, wx.ID_ANY, choices=["Statistic", "CRC32"], style=wx.CB_DROPDOWN | wx.CB_READONLY) 855 self.label_11 = wx.StaticText(self, wx.ID_ANY, "Ignore filter. You may use system wildchar (*,?), separated by comma or can use\nregexp starts with ! .") 856 self.txtIgnore = wx.TextCtrl(self, wx.ID_ANY, "") 857 self.chboxBackup = wx.CheckBox(self, wx.ID_ANY, "Backup root.") 858 self.chboxDefault = wx.CheckBox(self, wx.ID_ANY, "Mark root default.") 859 self.btnAdd = wx.Button(self, wx.ID_ANY, "Add root") 860 self.button_2 = wx.Button(self, wx.ID_ANY, "Cancel") 861 862 self.__set_properties() 863 self.__do_layout() 864 865 self.Bind(wx.EVT_BUTTON, self.btnPathSelect_handler, self.btnPathSelect) 866 self.Bind(wx.EVT_BUTTON, self.btnAddRoot_handler, self.btnAdd) 867 self.Bind(wx.EVT_BUTTON, self.btnCancel_handler, self.button_2) 868 # end wxGlade 869 870 self.cboxCompare.Clear() 871 log(u'log(Z_COLUMN_CHOISE)===%s' % str(z_compare_choice)) 872 self.cboxCompare.AppendItems(z_compare_choice) 873 self.cboxCompare.SetSelection(self.cboxCompare.FindString(P_DEFCOMPARE)) 874 self.cboxSymlink.Clear() 875 self.cboxSymlink.AppendItems(z_symlink_choice) 876 self.cboxSymlink.SetSelection(self.cboxSymlink.FindString(P_DEFSYMLINK))
877
878 - def __set_properties(self):
879 # begin wxGlade: dlgAddRoot_class.__set_properties 880 self.SetTitle("Add root") 881 self.btnPathSelect.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) 882 self.btnPathSelect.SetToolTipString("Select path ...") 883 self.rbPathType.SetSelection(0) 884 self.cboxSymlink.SetSelection(0) 885 self.cboxCompare.SetSelection(0) 886 self.chboxDefault.SetValue(1)
887 # end wxGlade 888
889 - def __do_layout(self):
890 # begin wxGlade: dlgAddRoot_class.__do_layout 891 sizer_2 = wx.BoxSizer(wx.VERTICAL) 892 sizer_11 = wx.BoxSizer(wx.HORIZONTAL) 893 sizer_32 = wx.BoxSizer(wx.HORIZONTAL) 894 sizer_8 = wx.BoxSizer(wx.HORIZONTAL) 895 sizer_10 = wx.BoxSizer(wx.VERTICAL) 896 sizer_9 = wx.BoxSizer(wx.VERTICAL) 897 sizer_6 = wx.BoxSizer(wx.HORIZONTAL) 898 sizer_6.Add(self.label_8, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 2) 899 sizer_6.Add(self.txtPath, 2, wx.ALL | wx.EXPAND, 2) 900 sizer_6.Add(self.btnPathSelect, 0, wx.ALL, 2) 901 sizer_2.Add(sizer_6, 0, wx.EXPAND, 0) 902 sizer_2.Add(self.rbPathType, 0, wx.ALL, 5) 903 sizer_2.Add(self.static_line_4, 0, wx.ALL | wx.EXPAND, 3) 904 sizer_9.Add(self.label_9, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 2) 905 sizer_9.Add(self.cboxSymlink, 1, wx.ALL | wx.EXPAND, 5) 906 sizer_8.Add(sizer_9, 1, 0, 0) 907 sizer_10.Add(self.label_10, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 2) 908 sizer_10.Add(self.cboxCompare, 1, wx.ALL | wx.EXPAND, 5) 909 sizer_8.Add(sizer_10, 1, 0, 0) 910 sizer_2.Add(sizer_8, 0, wx.EXPAND, 0) 911 sizer_2.Add(self.label_11, 0, wx.ALL, 2) 912 sizer_2.Add(self.txtIgnore, 0, wx.ALL | wx.EXPAND, 2) 913 sizer_32.Add(self.chboxBackup, 0, wx.ALL, 10) 914 sizer_32.Add(self.chboxDefault, 0, wx.ALL, 10) 915 sizer_2.Add(sizer_32, 1, wx.EXPAND, 0) 916 sizer_11.Add(self.btnAdd, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 2) 917 sizer_11.Add(self.button_2, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 2) 918 sizer_2.Add(sizer_11, 0, wx.EXPAND, 0) 919 self.SetSizer(sizer_2) 920 sizer_2.Fit(self) 921 self.Layout()
922 # end wxGlade 923
924 - def btnPathSelect_handler(self, event): # wxGlade: dlgAddRoot_class.<event_handler>
925 sel = self.rbPathType.GetSelection() 926 if sel == 0: 927 # Dir dialog 928 path = wx.DirSelector(u'Select diroctory for adding.') 929 elif sel == 1: 930 # File dialog 931 path = wx.FileSelector(u'Select file or symlink for adding.') 932 self.txtPath.SetValue(path) 933 event.Skip(False)
934
935 - def btnAddRoot_handler(self, event): # wxGlade: dlgAddRoot_class.<event_handler>
936 path = self.txtPath.GetValue() 937 if path: 938 cmd = command_class 939 setattr(cmd,'fs',[path]) 940 _cmp = self.cboxCompare.GetValue() 941 ign = self.txtIgnore.GetValue() 942 sym = self.cboxSymlink.GetValue() 943 backup = str(int(self.chboxBackup.GetValue())) 944 seldef = str(int(self.chboxDefault.GetValue())) 945 dbg(u'dlgAddRoot.btnAddRoot_handler: ',sym, ' ',_cmp,' ',ign,' ', backup,' ',seldef) 946 ##_cmp = ['stat', 'crc32'][_cmp] 947 ##sym = ['c', 'i'][sym] 948 #dbg(u'dlgAddRoot.btnAddRoot_handler: ',sym, ' ',_cmp,' ',ign) 949 setattr(cmd,'k',[sym]) 950 setattr(cmd,'e',[ign]) 951 setattr(cmd,'s',[_cmp]) 952 setattr(cmd,'b',[backup]) 953 setattr(cmd,'x',[seldef]) 954 setattr(cmd,'r',[]) 955 try: 956 f_add(cmd) 957 except Exception,exc: 958 prt0(u'ERROR in programm.',place=u'dlgAddRoot.btnAddRoot_handler', error=exc) 959 self.EndModal(0) 960 else: 961 wx.MessageBox(u'Path not selected!', u'Error.',wx.OK | wx.ICON_ERROR) 962 event.Skip() 963
964 - def btnCancel_handler(self, event): # wxGlade: dlgAddRoot_class.<event_handler>
965 self.EndModal(0) 966 event.Skip() 967 968 # end of class dlgAddRoot_class 969 970
971 -class dlgInfo_class(wx.Dialog):
972 - def __init__(self, *args, **kwds):
973 # begin wxGlade: dlgInfo_class.__init__ 974 kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_DIALOG_STYLE 975 wx.Dialog.__init__(self, *args, **kwds) 976 self.SetSize((600, 500)) 977 self.bmpBag = wx.StaticBitmap(self, wx.ID_ANY, catalog['pybag'].getBitmap()) 978 global IDLBLNAME; IDLBLNAME = wx.NewId() 979 self.lblName = wx.StaticText(self, IDLBLNAME, "P Y B A G", style=wx.ALIGN_CENTER) 980 self.static_line_3 = wx.StaticLine(self, wx.ID_ANY) 981 global IDTXTINFO; IDTXTINFO = wx.NewId() 982 self.txtInfo = wx.TextCtrl(self, IDTXTINFO, "Synchronization tool.\n\nhttp://pybag.sourceforge.net\n", style=wx.BORDER_NONE | wx.TE_AUTO_URL | wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_RICH | wx.TE_WORDWRAP) 983 self.static_line_5 = wx.StaticLine(self, wx.ID_ANY) 984 self.btnOk = wx.Button(self, wx.ID_CLOSE, "") 985 986 self.__set_properties() 987 self.__do_layout() 988 989 self.Bind(wx.EVT_TEXT_URL, self.txtInfo_Url_handler, self.txtInfo) 990 self.Bind(wx.EVT_BUTTON, self.btnOk_handler, self.btnOk)
991 # end wxGlade 992
993 - def __set_properties(self):
994 # begin wxGlade: dlgInfo_class.__set_properties 995 self.SetTitle("Info") 996 self.SetSize((600, 500)) 997 self.lblName.SetBackgroundColour(wx.Colour(212, 208, 200)) 998 self.lblName.SetForegroundColour(wx.Colour(35, 142, 35)) 999 self.lblName.SetFont(wx.Font(18, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) 1000 self.txtInfo.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE)) 1001 self.txtInfo.SetFont(wx.Font(8, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, ""))
1002 # end wxGlade 1003
1004 - def __do_layout(self):
1005 # begin wxGlade: dlgInfo_class.__do_layout 1006 sizer_3 = wx.BoxSizer(wx.VERTICAL) 1007 sizer_4 = wx.BoxSizer(wx.HORIZONTAL) 1008 sizer_4.Add(self.bmpBag, 0, wx.ALIGN_CENTER | wx.ALL, 20) 1009 sizer_4.Add((100, 1), 0, 0, 0) 1010 sizer_4.Add(self.lblName, 0, wx.ALIGN_CENTER | wx.ALL | wx.EXPAND, 20) 1011 sizer_3.Add(sizer_4, 0, wx.EXPAND, 0) 1012 sizer_3.Add(self.static_line_3, 0, wx.ALL | wx.EXPAND, 5) 1013 sizer_3.Add(self.txtInfo, 2, wx.ALL | wx.EXPAND, 10) 1014 sizer_3.Add(self.static_line_5, 0, wx.ALL | wx.EXPAND, 5) 1015 sizer_3.Add(self.btnOk, 0, wx.ALIGN_CENTER | wx.ALL | wx.EXPAND, 10) 1016 self.SetSizer(sizer_3) 1017 self.Layout() 1018 self.Centre()
1019 # end wxGlade 1020
1021 - def btnOk_handler(self, event): # wxGlade: dlgInfo_class.<event_handler>
1022 self.EndModal(0) 1023 event.Skip()
1024
1025 - def txtInfo_Url_handler(self, event): # wxGlade: dlgInfo_class.<event_handler>
1026 try: 1027 if event.GetMouseEvent().LeftUp(): 1028 url = self.txtInfo.GetRange(event.GetURLStart(), event.GetURLEnd()) 1029 webbrowser.open(url) 1030 except Exception,exc: 1031 prt0(u'ERROR in program: %s.' % (traceback.format_exc(),),place=u'dlgInfo.txtInfo_Url_handler', 1032 error=exc) 1033 event.Skip() 1034 1035 # end of class dlgInfo_class 1036
1037 -class PyBAGListCtrl_class(wx.ListCtrl):
1038
1039 - def __init__(self, *args, **kwds):
1040 super(PyBAGListCtrl_class,self).__init__(*args, **kwds) 1041 ##wx.ListCtrl.__init__(self, *args, **kwds) 1042 1043 self.ks=[] #: keys list from db, sorted in needed order. 1044 self.SetItemCount(0) 1045 self.colkeys = [] #: Column keys by index. 1046 self.thread = None #: Running filtering thread.
1047
1048 - def Clear(self):
1049 log(u'PyBAGListCtrl_class.Clear().') 1050 self.ks=[] #: keys list from db, sorted in needed order. 1051 self.SetItemCount(0) 1052 lks = len(self.ks)-1 1053 if lks>=0: 1054 self.RefreshItems(0, lks) 1055 self.Refresh()
1056
1057 - def GetSelectionKeys(self):
1058 """ 1059 Return list of keys selected items. 1060 """ 1061 log(u'GetSelectionKeys: start') 1062 r = [] 1063 ln = self.GetItemCount() 1064 ##dbg(u'GetSelectionKeys: len=%d' % ln) 1065 for i in range(ln): 1066 ##li = self.GetItemState(i, wx.LIST_STATE_SELECTED) 1067 ##dbg(u'i=%d, li=%s' % (i, str(li))) 1068 if self.GetItemState(i, wx.LIST_STATE_SELECTED): 1069 # Add to selection. 1070 r.append(self.ks[i]) 1071 log(u'PyBAGListCtrl_class.GetSelektionKeys: return %d selected items.' % len(r)) 1072 return r
1073
1074 - def FillKeys(self):
1075 """ 1076 Fill keys from global L{cfg.Z_LISTKS}. 1077 """ 1078 log(u'FillKeys: start') 1079 if cfg.LOCK[LI_THREAD] and not cfg.LOCK[LI_FILTERRUNNING]: 1080 # Filtering is ended 1081 dbg(u'FillKeys: set thread to None.') 1082 cfg.LOCK[LI_THREAD] = None 1083 self.ks = cfg.Z_LISTKS 1084 cfg.Z_LISTKS = [] 1085 self.SetItemCount(len(self.ks)) 1086 self.RefreshItems(0, len(self.ks)-1) 1087 self.Refresh() 1088 wx.CallAfter(self.FilterKeys) 1089 log(u'FillKeys: end')
1090
1091 - def FilterKeys(self):
1092 """ 1093 Filter keys to Z_LISTKS by L{AppState}. 1094 """ 1095 log(u'FilterKeys: start') 1096 if cfg.IsDBCompared or cfg.IsDBSynced: 1097 log(u'FilterKeys: fill filtering') 1098 if cfg.LOCK[LI_UPDATEFILTER]: 1099 log(u'FilterKeys: need update') 1100 # If thread exists and need update then stay flag True. 1101 cfg.LOCK[LI_UPDATEFILTER] = cfg.LOCK[LI_THREAD] 1102 if not cfg.LOCK[LI_UPDATEFILTER]: 1103 # Run filtering thread. 1104 cfg.LOCK[LI_FILTERRUNNING] = True 1105 cfg.LOCK[LI_THREAD] = threading.Thread( target=self._filterkeys, args=(AppState.copy(),) ) 1106 cfg.Z_LISTKS = [] 1107 cfg.LOCK[LI_THREAD].start() 1108 else: 1109 log(u'FilterKeys: do not update') 1110 ##LOCK[LI_FILTERRUNNING] = False 1111 elif cfg.IsDBReaded: 1112 log(u'FilterKeys: fill reading') 1113 cfg.Z_LISTKS = cfg.Z_DB.keys() 1114 cfg.Z_LISTKS.sort() 1115 log(u'FilterKeys: end')
1116
1117 - def _filterkeys(self,filter): # @ReservedAssignment
1118 """ 1119 Thread function. 1120 """ 1121 cfg.LOCK[LI_FILTERRUNNING] = True 1122 ks = [] 1123 log(u'_filterkeys: start') 1124 1125 DBDBFLAG_ = DBDBFLAG 1126 DBDBPATH_ = DBDBPATH 1127 DBDIR_ = DBDIR 1128 #LOOPN_ = LOOPN 1129 #LN = 0 1130 try: 1131 REPORTFILTER_ = 0 1132 ##REPORTFILTEROK_ = 0 1133 SYNCFILTER_ = 0 1134 if filter[u'ff_bag']: 1135 REPORTFILTER_ |= DBDIRBAG 1136 if filter[u'ff_orig']: 1137 REPORTFILTER_ |= DBDIRORIG 1138 if filter[u'ff_ch']: 1139 REPORTFILTER_ |= DBDIRCOPY 1140 if filter[u'ff_new']: 1141 REPORTFILTER_ |= DBDIRNEW 1142 if filter[u'ff_del']: 1143 REPORTFILTER_ |= DBDIRDELETE 1144 if filter[u'ff_warn']: 1145 REPORTFILTER_ |= DBDIRWARNING 1146 if filter[u'ff_conf']: 1147 REPORTFILTER_ |= DBDIRCONFLICT 1148 SYNCFILTER_ |= DBSYNCCONFLICT 1149 if filter[u'ff_err']: 1150 REPORTFILTER_ |= DBDIRERROR 1151 SYNCFILTER_ |= DBSYNCERROR 1152 if filter[u'ff_ign']: 1153 REPORTFILTER_ |= DBDIRIGNORED 1154 if filter[u'ff_forced']: 1155 REPORTFILTER_ |= DBDIRFORCED 1156 if filter[u'ff_unch']: 1157 REPORTFILTER_ |= DBDIRUNCHANGED 1158 if filter[u'ff_ok']: 1159 SYNCFILTER_ |= DBSYNCOK 1160 if filter[u'ff_ts']: 1161 REPORTFILTER_ |= DBDIRTS 1162 1163 1164 REPORTTYPE_ = u'' 1165 if filter[u'ff_file']: 1166 REPORTTYPE_ += u'f' 1167 if filter[u'ff_dir']: 1168 REPORTTYPE_ += u'd' 1169 if filter[u'ff_sym']: 1170 REPORTTYPE_ += u's' 1171 if filter[u'ff_unk']: 1172 REPORTTYPE_ += u'u' 1173 1174 REPORTPATTCMP_ = cfg.REPORTPATTCMP 1175 1176 for k,vdb in cfg.Z_DB.iteritems(): 1177 if cfg.IsDBSynced: 1178 t = (vdb[DBSYNC] & SYNCFILTER_) and (REPORTFILTER_ & vdb[DBDIR_]) 1179 else: 1180 t = REPORTFILTER_ & vdb[DBDIR_] 1181 if t and (vdb[DBDBFLAG_] in REPORTTYPE_) and \ 1182 not (REPORTPATTCMP_.match(vdb[DBDBPATH_]) is None): 1183 ks.append(k) 1184 except Exception, exc: 1185 log(u'_filterkeys: ERROR - "%s"' % str(exc)) 1186 cfg.Z_LISTKS = ks 1187 cfg.Z_LISTKS.sort() 1188 cfg.LOCK[LI_FILTERRUNNING] = False 1189 wx.CallAfter(self.FillKeys) 1190 log(u'_filterkeys: end')
1191
1192 - def OnGetItemAttr(self, itemid):
1193 return None
1194
1195 - def OnGetItemImage(self, itemid):
1196 self.OnGetItemColumnImage(itemid,0)
1197
1198 - def GetColChoiseIdx(self, idx):
1199 for i in range(len(cfg.Z_COLUMN_CHOISE)): 1200 if cfg.Z_COLUMN_CHOISE[i][COL_NAME] == idx: 1201 return i 1202 return -1 # Not found
1203
1204 - def MoveColLeft(self, colid):
1205 log(u'MoveColLeft: start(%d)' % colid) 1206 try: 1207 cn = self.colkeys[colid] 1208 if (colid > 0) and (colid < len(self.colkeys)): 1209 # Move 1210 cnx = self.colkeys[colid-1] 1211 ci = self.GetColChoiseIdx(cn) 1212 cix = self.GetColChoiseIdx(cnx) 1213 vx = cfg.Z_COLUMN_CHOISE[cix] 1214 cfg.Z_COLUMN_CHOISE[cix] = cfg.Z_COLUMN_CHOISE[ci] 1215 cfg.Z_COLUMN_CHOISE[ci] = vx 1216 self.RefreshColumns() 1217 except Exception, exc: 1218 log(u'MoveColLeft: ERROR %s' % str(exc))
1219
1220 - def MoveColRight(self, colid):
1221 log(u'MoveColRight: start(%d)' % colid) 1222 try: 1223 cn = self.colkeys[colid] 1224 if (colid >= 0) and (colid < (len(self.colkeys)-1)): 1225 # Move 1226 cnx = self.colkeys[colid+1] 1227 ci = self.GetColChoiseIdx(cn) 1228 cix = self.GetColChoiseIdx(cnx) 1229 vx = cfg.Z_COLUMN_CHOISE[cix] 1230 cfg.Z_COLUMN_CHOISE[cix] = cfg.Z_COLUMN_CHOISE[ci] 1231 cfg.Z_COLUMN_CHOISE[ci] = vx 1232 self.RefreshColumns() 1233 except Exception, exc: 1234 log(u'MoveColRight: ERROR %s' % str(exc))
1235
1236 - def OnGetItemColumnImage(self, itemid, column):
1237 ## +XXX Comment debug for speed !!! 1238 try: 1239 ##dbg(u'OnGetItemColumnImage: start (%d, %d)' % (itemid, column)) 1240 cn = self.colkeys[column] 1241 ##dbg(u'OnGetItemColumnImage: colname=%s' % cn) 1242 ret = -1 1243 vdb = cfg.Z_DB[self.ks[itemid]] 1244 _dir = vdb[DBDIR] 1245 if cn == u'stateicon': 1246 # Calculate state icon 1247 icn = u'' 1248 if (_dir & DBDIRBAG) and vdb[DBORIGREAD]: 1249 f = vdb[DBORIGFLAG] 1250 elif (_dir & DBDIRORIG) and vdb[DBBAGREAD]: 1251 f = vdb[DBBAGFLAG] 1252 elif vdb[DBDBREAD]: 1253 f = vdb[DBDBFLAG] 1254 elif vdb[DBBAGREAD]: 1255 f = vdb[DBBAGFLAG] 1256 else: 1257 f = vdb[DBORIGFLAG] 1258 if _dir & DBDIRIGNORED: 1259 icn = u'ign' 1260 else: 1261 if f == DBFLAGFILE: 1262 icn = u'file' 1263 elif f == DBFLAGDIR: 1264 icn = u'dir' 1265 elif f == DBFLAGSYMLINK: 1266 icn = u'sym' 1267 elif f == DBFLAGUNKNOWN: 1268 icn = u'unk' 1269 else: 1270 icn = u'wrong' 1271 if cfg.IsDBCompared and icn != u'wrong': 1272 ##dbg(u'IsDBCompared or cfg.IsDBSynced') 1273 if vdb[DBDIR] & DBDIRWARNING: 1274 icn += u'warn' 1275 elif vdb[DBDIR] & DBDIRCONFLICT: 1276 icn += u'conf' 1277 elif vdb[DBDIR] & DBDIRERROR: 1278 icn += u'err' 1279 elif cfg.IsDBSynced: 1280 if (vdb[DBSYNC] & DBSYNCOK) and (icn != u'wrong'): 1281 icn += u'ok' 1282 elif (vdb[DBSYNC] & DBSYNCIGNORED) or (_dir & DBDIRIGNORED): 1283 icn = u'ign' 1284 elif vdb[DBSYNC] & DBSYNCCONFLICT: 1285 icn += u'conf' 1286 elif vdb[DBSYNC] & (DBSYNCERROR | DBSYNCERRCOMPARE): 1287 icn += u'err' 1288 ##dbg(u'OnGetItemColumnImage: stateicon=%s' % icn) 1289 if icn: 1290 ret = cfg.IMGINDEX[icn] 1291 elif cn == u'actionicon': 1292 # Calculate action icon 1293 icn = u'' 1294 if cfg.IsDBSynced: 1295 if vdb[DBSYNC] & DBSYNCOK: 1296 icn = u'ok' 1297 elif vdb[DBSYNC] & DBSYNCIGNORED: 1298 icn = u'ign' 1299 elif vdb[DBSYNC] & (DBSYNCCONFLICT | DBSYNCERRCOMPARE): 1300 icn = u'conf' 1301 elif vdb[DBSYNC] & DBSYNCERROR: 1302 icn = u'err' 1303 else: 1304 if _dir & DBDIRNEW: 1305 if _dir & DBDIRBAG: 1306 icn = u'bagnew' 1307 elif _dir & DBDIRORIG: 1308 icn = u'orignew' 1309 else: 1310 icn = u'wrong' 1311 else: 1312 if _dir & DBDIRDELETE: 1313 icn = u'del' 1314 elif _dir & DBDIRIGNORED: 1315 icn = u'ign' 1316 elif _dir & DBDIRUNCHANGED: 1317 # Unchanged or timeshifted. 1318 if _dir & DBDIRTS: 1319 if cfg.TSDIR == TSDIRBAG: 1320 icn = u'unchtsbag' 1321 elif cfg.TSDIR == TSDIRORIG: 1322 icn = u'unchtsorig' 1323 else: 1324 icn = u'wrong' 1325 else: 1326 icn = u'unch' 1327 elif _dir & DBDIRBAG: 1328 icn = u'bag' 1329 elif _dir & DBDIRORIG: 1330 icn = u'orig' 1331 else: 1332 icn = u'wrong' 1333 if _dir & DBDIRFORCED and icn != u'wrong': 1334 icn += u'forced' 1335 if icn: 1336 ret = cfg.IMGINDEX[icn] 1337 except Exception, exc: 1338 log(u'OnGetItemColumnImage: ERROR - "%s"' % str(exc)) 1339 log(u'OnGetItemColumnImage: start (%d, %d)' % (itemid, column)) 1340 ret = cfg.IMGINDEX[u'wrong'] 1341 return ret
1342
1343 - def OnGetItemText(self, itemid, column):
1344 # -XXX Comment debug for speed !!! 1345 ret = u'' 1346 DBDIR_ = DBDIR 1347 dbdirbagorig = DBDIRBAG | DBDIRORIG 1348 dbdirnewbag = DBDIRNEW | DBDIRBAG 1349 dbdirneworig = DBDIRNEW | DBDIRORIG 1350 dbdircopybag = DBDIRCOPY | DBDIRBAG 1351 dbdircopyorig = DBDIRCOPY | DBDIRORIG 1352 dbdirerrconf = DBDIRERROR | DBDIRCONFLICT 1353 1354 try: 1355 # x-XXX KLUDGE Clear DB in mnuOptionsStat_handler because in process DB is reset(??? in 0.4.0 not reset) 1356 # and OnGetItemText ... fail find keay in DB... 1357 # I am can not find where problem ... 1358 1359 #dbg(u'OnGetItemText: (i=%d, c=%d)' % (itemid, column)) 1360 #dbg(u'OnGetItemText: self.colkeys=%s' % str(self.colkeys)) 1361 #dbg(u'OnGetItemText: self.ks[itemid]=%s' % str((itemid < len(self.ks)) and self.ks[itemid] or "NO ITEM ID")) 1362 #dbg(u'OnGetItemText: len(self.ks)=%d' % len(self.ks)) 1363 #dbg(u'OnGetItemText: self.ks=%s' % str(self.ks)) 1364 cn = self.colkeys[column] 1365 #dbg(u'OnGetItemText: self.ks[itemid] in cfg.Z_DB =%s' % str(self.ks[itemid] in cfg.Z_DB)) 1366 vdb = cfg.Z_DB[self.ks[itemid]] 1367 #dbg(u'OnGetItemText: vdb =%s' % unicode(vdb)) 1368 #dbg(u'OnGetItemText: db key=%s' % vdb[DBDBPATH]) 1369 if cn == u'forced': 1370 return (vdb[DBDIR] & DBDIRFORCED and u'!') or u' ' 1371 elif cn == u'actionicon': 1372 # Calculate action icon 1373 ret = u'' 1374 elif cn == u'stateicon': 1375 ret = u'' 1376 elif cn == u'desc': 1377 ret = vdb[DBDESC] + vdb[DBDESCMAN] 1378 elif cn == u'dir': 1379 vdbdir_ = vdb[DBDIR_] 1380 if vdbdir_ & DBDIRTS: 1381 if cfg.TSDIR == TSDIRBAG: 1382 unch = u'<==' 1383 elif cfg.TSDIR == TSDIRORIG: 1384 unch = u'==>' 1385 else: 1386 unch = u'###' # Error in filter. 1387 else: 1388 unch = u'===' 1389 ret = (vdbdir_ & DBDIRUNCHANGED and unch) or \ 1390 (vdbdir_ & DBDIRIGNORED and u'---') or \ 1391 (vdbdir_ & DBDIRDELETE and u'xxx') or \ 1392 (vdbdir_ & DBDIRDB and not (vdb[DBDIR_] & dbdirbagorig) and u'===') or \ 1393 ((vdbdir_ & dbdirnewbag == dbdirnewbag) and u'<<<') or \ 1394 ((vdbdir_ & dbdirneworig == dbdirneworig) and u'>>>') or \ 1395 ((vdbdir_ & dbdircopybag == dbdircopybag) and u'<--') or \ 1396 ((vdbdir_ & dbdircopyorig == dbdircopyorig) and u'-->') or \ 1397 (vdbdir_ & dbdirerrconf and u'***') or \ 1398 u'###' # Error in filter. 1399 elif cn == u'err': 1400 ret = (vdb[DBDIR_] & DBDIRERROR and u'e') or \ 1401 (vdb[DBDIR_] & DBDIRWARNING and u'w') or \ 1402 (vdb[DBDIR_] & DBDIRCONFLICT and u'c') or u' ' 1403 elif cn == u'path': 1404 ret = vdb[DBDBPATH] 1405 elif cn == u'type': 1406 ret = vdb[DBDBFLAG] or u' ' 1407 elif cn == u'crc32db': 1408 ret = u'0x%08X' % vdb[DBDBCRC32] 1409 elif cn == u'sizedb': 1410 ret = z_u(vdb[DBDBSIZE]) 1411 elif cn == u'crc32bag': 1412 ret = u'0x%08X' % vdb[DBBAGCRC32] 1413 elif cn == u'sizebag': 1414 ret = z_u(vdb[DBBAGSIZE]) 1415 elif cn == u'crc32origin': 1416 ret = u'0x%08X' % vdb[DBORIGCRC32] 1417 elif cn == u'sizeorigin': 1418 ret = z_u(vdb[DBORIGSIZE]) 1419 elif cn == u'symlinkdb': 1420 ret = vdb[DBDBLINK] 1421 elif cn == u'symlinkbag': 1422 ret = vdb[DBBAGLINK] 1423 elif cn == u'symlinkorigin': 1424 ret = vdb[DBORIGLINK] 1425 elif cn == u'mdatedb': 1426 ret = (vdb[DBDBFLAG] == DBFLAGFILE) and z_u(vdb[DBDBMDATE]) or u'-' 1427 elif cn == u'gmdatedb': 1428 ret = (vdb[DBDBFLAG] == DBFLAGFILE) and time.strftime(cfg.TIMEFORMAT, time.gmtime(vdb[DBDBMDATE])) or u'-' 1429 elif cn == u'lmdatedb': 1430 ret = (vdb[DBDBFLAG] == DBFLAGFILE) and time.strftime(cfg.TIMEFORMAT, time.localtime(vdb[DBDBMDATE])) or u'-' 1431 elif cn == u'mdatebag': 1432 ret = (vdb[DBBAGFLAG] == DBFLAGFILE) and z_u(vdb[DBBAGMDATE]) or u'-' 1433 elif cn == u'gmdatebag': 1434 ret = (vdb[DBBAGFLAG] == DBFLAGFILE) and time.strftime(cfg.TIMEFORMAT, time.gmtime(vdb[DBBAGMDATE])) or u'-' 1435 elif cn == u'lmdatebag': 1436 ret = (vdb[DBBAGFLAG] == DBFLAGFILE) and time.strftime(cfg.TIMEFORMAT, time.localtime(vdb[DBBAGMDATE])) or u'-' 1437 elif cn == u'mdateorigin': 1438 ret = (vdb[DBORIGFLAG] == DBFLAGFILE) and z_u(vdb[DBORIGMDATE]) or u'-' 1439 elif cn == u'gmdateorigin': 1440 ret = (vdb[DBORIGFLAG] == DBFLAGFILE) and time.strftime(cfg.TIMEFORMAT, time.gmtime(vdb[DBORIGMDATE])) or u'-' 1441 elif cn == u'lmdateorigin': 1442 ret = (vdb[DBORIGFLAG] == DBFLAGFILE) and time.strftime(cfg.TIMEFORMAT, time.localtime(vdb[DBORIGMDATE])) or u'-' 1443 elif cn == u'timeshift': 1444 if vdb[DBDIR_] & DBDIRTS: 1445 if cfg.TSDIR == TSDIRBAG: 1446 ret = u'b' 1447 elif cfg.TSDIR == TSDIRORIG: 1448 ret = u'o' 1449 else: 1450 ret = u'#' # Error in filter. 1451 else: 1452 ret = u' ' 1453 else: 1454 ret = u'!!!WRONG!!!' 1455 except Exception, exc: 1456 log(u'OnGetItemText: ERROR - "%s"' % str(exc)) 1457 log(u'OnGetItemText: EXCEPTION - "%s"' % traceback.format_exc(5)) 1458 log(u'OnGetItemText: (i=%d, c=%d), self.colkeys=%s' % (itemid, column, str(self.colkeys))) 1459 if not ret: 1460 ret = u'ERROR in OnGetItemText' 1461 ##dbg(u'OnGetItemText: ret=%s' % ret) 1462 return ret
1463
1464 - def RefreshColumns(self):
1465 log(u'RefreshColumns: start') 1466 try: 1467 self.DeleteAllColumns() 1468 self.colkeys = [] 1469 ccur = 0 1470 for i in cfg.Z_COLUMN_CHOISE: 1471 if i[COL_VISIBLE]: 1472 self.colkeys.append(i[COL_NAME]) 1473 self.InsertColumn(ccur, i[COL_HEADING], i[COL_FORMAT], i[COL_WIDTH]) 1474 ccur += 1 1475 except Exception,exc: 1476 log(u'RefreshColumns: ERROR - "%s"' % str(exc)) 1477 log(u'RefreshColumns: colkeys=%s' % str(self.colkeys))
1478 1479 1480 ##end PyBAGListCtrl_class 1481
1482 -class frmMain_class(wx.Frame):
1483 - def __init__(self, *args, **kwds):
1484 # begin wxGlade: frmMain_class.__init__ 1485 kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE 1486 wx.Frame.__init__(self, *args, **kwds) 1487 self.SetSize((1088, 500)) 1488 1489 # Menu Bar 1490 self.mnuBar = wx.MenuBar() 1491 global IDMNUFILEREAD; IDMNUFILEREAD = wx.NewId() 1492 global IDMNUFILECOMPARE; IDMNUFILECOMPARE = wx.NewId() 1493 global IDMNUFILESYNC; IDMNUFILESYNC = wx.NewId() 1494 global IDMNUFILEADD; IDMNUFILEADD = wx.NewId() 1495 global IDMNUFILEREMOVE; IDMNUFILEREMOVE = wx.NewId() 1496 global IDMNUFILEDIST; IDMNUFILEDIST = wx.NewId() 1497 global IDMNUFILERELOCATE; IDMNUFILERELOCATE = wx.NewId() 1498 global IDMNUFILECLEANDB; IDMNUFILECLEANDB = wx.NewId() 1499 global IDMNUFILETIPS; IDMNUFILETIPS = wx.NewId() 1500 global IDMNUFILESAVEOUT; IDMNUFILESAVEOUT = wx.NewId() 1501 global IDMNUFILEEXIT; IDMNUFILEEXIT = wx.NewId() 1502 global IDMNUVIEWPROP; IDMNUVIEWPROP = wx.NewId() 1503 global IDMNUVIEWOUT; IDMNUVIEWOUT = wx.NewId() 1504 global IDMNUVIEWCLEAROUT; IDMNUVIEWCLEAROUT = wx.NewId() 1505 global IDMNUVIEWEMUL; IDMNUVIEWEMUL = wx.NewId() 1506 global IDMNUVIEWLOGGING; IDMNUVIEWLOGGING = wx.NewId() 1507 global IDMNUVIEWDEBUG; IDMNUVIEWDEBUG = wx.NewId() 1508 global IDMNUVIEWVERB; IDMNUVIEWVERB = wx.NewId() 1509 global IDMNUVIEWVERBNO; IDMNUVIEWVERBNO = wx.NewId() 1510 global IDMNUVIEWVERB0; IDMNUVIEWVERB0 = wx.NewId() 1511 global IDMNUVIEWVERB1; IDMNUVIEWVERB1 = wx.NewId() 1512 global IDMNUVIEWVERB2; IDMNUVIEWVERB2 = wx.NewId() 1513 global IDMNUVIEWVERB3; IDMNUVIEWVERB3 = wx.NewId() 1514 global IDMNUVIEWVERB4; IDMNUVIEWVERB4 = wx.NewId() 1515 global IDMNUVIEWVERB5; IDMNUVIEWVERB5 = wx.NewId() 1516 global IDMNUROOTSSELALL; IDMNUROOTSSELALL = wx.NewId() 1517 global IDMNUROOTSUNSELALL; IDMNUROOTSUNSELALL = wx.NewId() 1518 global IDMNUROOTSSELDEF; IDMNUROOTSSELDEF = wx.NewId() 1519 global IDMNUACTIONBAG; IDMNUACTIONBAG = wx.NewId() 1520 global IDMNUACTIONORIG; IDMNUACTIONORIG = wx.NewId() 1521 global IDMNUACTIONDEL; IDMNUACTIONDEL = wx.NewId() 1522 global IDMNUACTIONUNCH; IDMNUACTIONUNCH = wx.NewId() 1523 global IDMNUACTIONRESTORE; IDMNUACTIONRESTORE = wx.NewId() 1524 global IDMNUACTIONTS; IDMNUACTIONTS = wx.NewId() 1525 global IDMNUACTIONTSBAG; IDMNUACTIONTSBAG = wx.NewId() 1526 global IDMNUACTIONTSORIG; IDMNUACTIONTSORIG = wx.NewId() 1527 global IDMNUACTIONTSRESET; IDMNUACTIONTSRESET = wx.NewId() 1528 global IDMNUFILTEROK; IDMNUFILTEROK = wx.NewId() 1529 global IDMNUFILTERWARN; IDMNUFILTERWARN = wx.NewId() 1530 global IDMNUFILTERCONF; IDMNUFILTERCONF = wx.NewId() 1531 global IDMNUFILTERERR; IDMNUFILTERERR = wx.NewId() 1532 global IDMNUFILTERBAG; IDMNUFILTERBAG = wx.NewId() 1533 global IDMNUFILTERORIG; IDMNUFILTERORIG = wx.NewId() 1534 global IDMNUFILTERNEW; IDMNUFILTERNEW = wx.NewId() 1535 global IDMNUFILTERCH; IDMNUFILTERCH = wx.NewId() 1536 global IDMNUFILTERDEL; IDMNUFILTERDEL = wx.NewId() 1537 global IDMNUFILTERIGN; IDMNUFILTERIGN = wx.NewId() 1538 global IDMNUFILTERUNCH; IDMNUFILTERUNCH = wx.NewId() 1539 global IDMNUFILTERFORCED; IDMNUFILTERFORCED = wx.NewId() 1540 global IDMNUFILTERFILE; IDMNUFILTERFILE = wx.NewId() 1541 global IDMNUFILTERDIR; IDMNUFILTERDIR = wx.NewId() 1542 global IDMNUFILTERSYM; IDMNUFILTERSYM = wx.NewId() 1543 global IDMNUFILTERUNK; IDMNUFILTERUNK = wx.NewId() 1544 global IDMNUFILTERTS; IDMNUFILTERTS = wx.NewId() 1545 global IDMNUOPTIONSSTAT; IDMNUOPTIONSSTAT = wx.NewId() 1546 global IDMNUOPTIONSPREFS; IDMNUOPTIONSPREFS = wx.NewId() 1547 global IDMNUHELPABOUT; IDMNUHELPABOUT = wx.NewId() 1548 global IDMNUHELPUSAGE; IDMNUHELPUSAGE = wx.NewId() 1549 global IDMNUABOUTLICENSE; IDMNUABOUTLICENSE = wx.NewId() 1550 self.mnuFile = wx.Menu() 1551 self.mnuBar.mnuFileRead = self.mnuFile.Append(IDMNUFILEREAD, "&Read and Compare", "Read items and compare") 1552 self.Bind(wx.EVT_MENU, self.mnuFileRead_handler, id=IDMNUFILEREAD) 1553 self.mnuBar.mnuFileCompare = self.mnuFile.Append(IDMNUFILECOMPARE, "&Compare", "Compare files") 1554 self.Bind(wx.EVT_MENU, self.mnuFileCompare_handler, id=IDMNUFILECOMPARE) 1555 self.mnuBar.mnuFileSync = self.mnuFile.Append(IDMNUFILESYNC, "&Synchronize", "Synchronize files") 1556 self.Bind(wx.EVT_MENU, self.mnuFileSync_handler, id=IDMNUFILESYNC) 1557 self.mnuFile.AppendSeparator() 1558 self.mnuBar.mnuFileAdd = self.mnuFile.Append(IDMNUFILEADD, "&Add root ...", "Add new root") 1559 self.Bind(wx.EVT_MENU, self.mnuFileAdd_handler, id=IDMNUFILEADD) 1560 self.mnuBar.mnuFileRemove = self.mnuFile.Append(IDMNUFILEREMOVE, "Re&move root ...", "Remove root") 1561 self.Bind(wx.EVT_MENU, self.mnuFileRemove_handler, id=IDMNUFILEREMOVE) 1562 self.mnuFile.AppendSeparator() 1563 self.mnuBar.mnuFileDist = self.mnuFile.Append(IDMNUFILEDIST, "&Distribute ...", "Distribute") 1564 self.Bind(wx.EVT_MENU, self.mnuFileDist_handler, id=IDMNUFILEDIST) 1565 self.mnuBar.mnuFileRelocate = self.mnuFile.Append(IDMNUFILERELOCATE, "Re&locate ...", "Relocate") 1566 self.Bind(wx.EVT_MENU, self.mnuFileRelocate_handler, id=IDMNUFILERELOCATE) 1567 self.mnuBar.mnuFileCleanDB = self.mnuFile.Append(IDMNUFILECLEANDB, "Clean D&B", "Clean DB from old records.") 1568 self.Bind(wx.EVT_MENU, self.mnuFileCleanDB_handler, id=IDMNUFILECLEANDB) 1569 self.mnuFile.AppendSeparator() 1570 self.mnuBar.mnuFileTips = self.mnuFile.Append(IDMNUFILETIPS, "Show &tips", "Show tips window") 1571 self.Bind(wx.EVT_MENU, self.mnuFileTips_handler, id=IDMNUFILETIPS) 1572 self.mnuFile.AppendSeparator() 1573 self.mnuBar.mnuFileSaveOut = self.mnuFile.Append(IDMNUFILESAVEOUT, "Save &output ...", "Save PYBAG output") 1574 self.Bind(wx.EVT_MENU, self.mnuFileSaveOut_handler, id=IDMNUFILESAVEOUT) 1575 self.mnuFile.AppendSeparator() 1576 self.mnuBar.mnuFileExit = self.mnuFile.Append(IDMNUFILEEXIT, "E&xit", "Exit from PYBAG") 1577 self.Bind(wx.EVT_MENU, self.mnuFileExit_handler, id=IDMNUFILEEXIT) 1578 self.mnuBar.Append(self.mnuFile, "&File") 1579 self.mnuView = wx.Menu() 1580 self.mnuBar.mnuViewProp = self.mnuView.Append(IDMNUVIEWPROP, "Item &properties", "Show item properties") 1581 self.Bind(wx.EVT_MENU, self.mnuViewProp_handler, id=IDMNUVIEWPROP) 1582 self.mnuView.AppendSeparator() 1583 self.mnuBar.mnuViewOut = self.mnuView.Append(IDMNUVIEWOUT, "&Output", "Show/Hide PYBAG output", wx.ITEM_CHECK) 1584 self.Bind(wx.EVT_MENU, self.mnuViewOut_handler, id=IDMNUVIEWOUT) 1585 self.mnuBar.mnuViewClearout = self.mnuView.Append(IDMNUVIEWCLEAROUT, "&Clear output", "Clear output") 1586 self.Bind(wx.EVT_MENU, self.mnuViewClearout_handler, id=IDMNUVIEWCLEAROUT) 1587 self.mnuView.AppendSeparator() 1588 self.mnuBar.mnuViewEmul = self.mnuView.Append(IDMNUVIEWEMUL, "E&mulation", "Enable/Disable emulation mode.", wx.ITEM_CHECK) 1589 self.Bind(wx.EVT_MENU, self.mnuViewEmul_handler, id=IDMNUVIEWEMUL) 1590 self.mnuBar.mnuViewLogging = self.mnuView.Append(IDMNUVIEWLOGGING, "&Logging", "Enable/Disable logging", wx.ITEM_CHECK) 1591 self.Bind(wx.EVT_MENU, self.mnuViewLogging_handler, id=IDMNUVIEWLOGGING) 1592 self.mnuBar.mnuViewDebug = self.mnuView.Append(IDMNUVIEWDEBUG, "&Debug logging", "Enable/Disable debug logging", wx.ITEM_CHECK) 1593 self.Bind(wx.EVT_MENU, self.mnuViewDebug_handler, id=IDMNUVIEWDEBUG) 1594 mnuViewVerb = wx.Menu() 1595 self.mnuBar.mnuViewVerbNo = mnuViewVerb.Append(IDMNUVIEWVERBNO, "-1 - N&o output at all", "No output at all", wx.ITEM_RADIO) 1596 self.Bind(wx.EVT_MENU, self.mnuViewVerbNo_handler, id=IDMNUVIEWVERBNO) 1597 self.mnuBar.mnuViewVerb0 = mnuViewVerb.Append(IDMNUVIEWVERB0, "0 - &Global errors", "Only global errors", wx.ITEM_RADIO) 1598 self.Bind(wx.EVT_MENU, self.mnuViewVerb0_handler, id=IDMNUVIEWVERB0) 1599 self.mnuBar.mnuViewVerb1 = mnuViewVerb.Append(IDMNUVIEWVERB1, "1 - &Errors and success", "Output errors and success", wx.ITEM_RADIO) 1600 self.Bind(wx.EVT_MENU, self.mnuViewVerb1_handler, id=IDMNUVIEWVERB1) 1601 self.mnuBar.mnuViewVerb2 = mnuViewVerb.Append(IDMNUVIEWVERB2, "2 - Errors and &conflicts", "Output errors and conflicts", wx.ITEM_RADIO) 1602 self.Bind(wx.EVT_MENU, self.mnuViewVerb2_handler, id=IDMNUVIEWVERB2) 1603 self.mnuBar.mnuViewVerb3 = mnuViewVerb.Append(IDMNUVIEWVERB3, "3 - &Normal", "Show Errors, conflicts and warnings.", wx.ITEM_RADIO) 1604 self.Bind(wx.EVT_MENU, self.mnuViewVerb3_handler, id=IDMNUVIEWVERB3) 1605 self.mnuBar.mnuViewVerb4 = mnuViewVerb.Append(IDMNUVIEWVERB4, "4 - &Large", "As normal and show file processing", wx.ITEM_RADIO) 1606 self.Bind(wx.EVT_MENU, self.mnuViewVerb4_handler, id=IDMNUVIEWVERB4) 1607 self.mnuBar.mnuViewVerb5 = mnuViewVerb.Append(IDMNUVIEWVERB5, "5 - Logg&ing output", "Show logging output", wx.ITEM_RADIO) 1608 self.Bind(wx.EVT_MENU, self.mnuViewVerb5_handler, id=IDMNUVIEWVERB5) 1609 self.mnuView.AppendMenu(IDMNUVIEWVERB, "&Verbosity", mnuViewVerb, "") 1610 self.mnuBar.Append(self.mnuView, "&View") 1611 self.mnuRoots = wx.Menu() 1612 self.mnuBar.mnuRootsSelall = self.mnuRoots.Append(IDMNUROOTSSELALL, "&Select all roots", "Select all roots") 1613 self.Bind(wx.EVT_MENU, self.mnuRootsSelall_handler, id=IDMNUROOTSSELALL) 1614 self.mnuBar.mnuRootsUnselall = self.mnuRoots.Append(IDMNUROOTSUNSELALL, "&Unselect all roots", "Unselect all roots") 1615 self.Bind(wx.EVT_MENU, self.mnuRootsUnselall_handler, id=IDMNUROOTSUNSELALL) 1616 self.mnuBar.mnuRootsSeldef = self.mnuRoots.Append(IDMNUROOTSSELDEF, "Select &default", "Select &default") 1617 self.Bind(wx.EVT_MENU, self.mnuRootsSeldef_hundler, id=IDMNUROOTSSELDEF) 1618 self.mnuBar.Append(self.mnuRoots, "&Roots") 1619 self.mnuAction = wx.Menu() 1620 self.mnuBar.mnuActionBag = self.mnuAction.Append(IDMNUACTIONBAG, "Force to &bag", "Force to bag") 1621 self.Bind(wx.EVT_MENU, self.mnuActionBag_handler, id=IDMNUACTIONBAG) 1622 self.mnuBar.mnuActionOrig = self.mnuAction.Append(IDMNUACTIONORIG, "Force to &origin", "Force to origin") 1623 self.Bind(wx.EVT_MENU, self.mnuActionOrig_handler, id=IDMNUACTIONORIG) 1624 self.mnuBar.mnuActionDel = self.mnuAction.Append(IDMNUACTIONDEL, "Force &delete", "Force delete") 1625 self.Bind(wx.EVT_MENU, self.mnuActionDel_handler, id=IDMNUACTIONDEL) 1626 self.mnuBar.mnuActionUnch = self.mnuAction.Append(IDMNUACTIONUNCH, "Force &unchanged", "Force unchanged") 1627 self.Bind(wx.EVT_MENU, self.mnuActionUnch_handler, id=IDMNUACTIONUNCH) 1628 self.mnuBar.mnuActionRestore = self.mnuAction.Append(IDMNUACTIONRESTORE, "&Restore default action", "Restore default action") 1629 self.Bind(wx.EVT_MENU, self.mnuActionRestore_handler, id=IDMNUACTIONRESTORE) 1630 mnuActionTs = wx.Menu() 1631 self.mnuBar.mnuActionTsbag = mnuActionTs.Append(IDMNUACTIONTSBAG, "Time shift to &bag", "Use this item as template for time shift to bag") 1632 self.Bind(wx.EVT_MENU, self.mnuActionTsbag_handler, id=IDMNUACTIONTSBAG) 1633 self.mnuBar.mnuActionTsorig = mnuActionTs.Append(IDMNUACTIONTSORIG, "Time shift to &origin", "Use this item as template for time shift to origin") 1634 self.Bind(wx.EVT_MENU, self.mnuActionTsorig_handler, id=IDMNUACTIONTSORIG) 1635 self.mnuBar.mnuActionTsreset = mnuActionTs.Append(IDMNUACTIONTSRESET, "&Reset time shift", "Reset time shift") 1636 self.Bind(wx.EVT_MENU, self.mnuActionTsreset_handler, id=IDMNUACTIONTSRESET) 1637 self.mnuAction.AppendMenu(IDMNUACTIONTS, "&Time shift", mnuActionTs, "") 1638 self.mnuBar.Append(self.mnuAction, "&Action") 1639 self.mnuFilter = wx.Menu() 1640 self.mnuBar.mnuFilterOk = self.mnuFilter.Append(IDMNUFILTEROK, "Show OK s&ynchronization", "Show OK synchronization", wx.ITEM_CHECK) 1641 self.Bind(wx.EVT_MENU, self.mnuFilterOk_handler, id=IDMNUFILTEROK) 1642 self.mnuBar.mnuFilterWarn = self.mnuFilter.Append(IDMNUFILTERWARN, "Show &warnings", "Show warnings", wx.ITEM_CHECK) 1643 self.Bind(wx.EVT_MENU, self.mnuFilterWarn_handler, id=IDMNUFILTERWARN) 1644 self.mnuBar.mnuFilterConf = self.mnuFilter.Append(IDMNUFILTERCONF, "Show &conflicts", "Show conflicts", wx.ITEM_CHECK) 1645 self.Bind(wx.EVT_MENU, self.mnuFilterConf_handler, id=IDMNUFILTERCONF) 1646 self.mnuBar.mnuFilterErr = self.mnuFilter.Append(IDMNUFILTERERR, "Show &errors", "Show errors", wx.ITEM_CHECK) 1647 self.Bind(wx.EVT_MENU, self.mnuFilterErr_handler, id=IDMNUFILTERERR) 1648 self.mnuBar.mnuFilterBag = self.mnuFilter.Append(IDMNUFILTERBAG, "Show copied to &bag", "Show copied to bag", wx.ITEM_CHECK) 1649 self.Bind(wx.EVT_MENU, self.mnuFilterBag_handler, id=IDMNUFILTERBAG) 1650 self.mnuBar.mnuFilterOrig = self.mnuFilter.Append(IDMNUFILTERORIG, "Show copied to &origin", "Show copied to origin", wx.ITEM_CHECK) 1651 self.Bind(wx.EVT_MENU, self.mnuFilterOrig_handler, id=IDMNUFILTERORIG) 1652 self.mnuBar.mnuFilterNew = self.mnuFilter.Append(IDMNUFILTERNEW, "Show &new", "Show new", wx.ITEM_CHECK) 1653 self.Bind(wx.EVT_MENU, self.mnuFilterNew_handler, id=IDMNUFILTERNEW) 1654 self.mnuBar.mnuFilterCh = self.mnuFilter.Append(IDMNUFILTERCH, "Show c&hanged", "Show changed", wx.ITEM_CHECK) 1655 self.Bind(wx.EVT_MENU, self.mnuFilterCh_handler, id=IDMNUFILTERCH) 1656 self.mnuBar.mnuFilterDel = self.mnuFilter.Append(IDMNUFILTERDEL, "Show &deleted", "Show deleted", wx.ITEM_CHECK) 1657 self.Bind(wx.EVT_MENU, self.mnuFilterDel_handler, id=IDMNUFILTERDEL) 1658 self.mnuBar.mnuFilterIgn = self.mnuFilter.Append(IDMNUFILTERIGN, "Show &ignored", "Show ignored", wx.ITEM_CHECK) 1659 self.Bind(wx.EVT_MENU, self.mnuFilterIgn_handler, id=IDMNUFILTERIGN) 1660 self.mnuBar.mnuFilterUnch = self.mnuFilter.Append(IDMNUFILTERUNCH, "Show &unchanged", "Show unchanged", wx.ITEM_CHECK) 1661 self.Bind(wx.EVT_MENU, self.mnuFilterUnch_handler, id=IDMNUFILTERUNCH) 1662 self.mnuBar.mnuFilterForced = self.mnuFilter.Append(IDMNUFILTERFORCED, "Show &forced", "Show forced", wx.ITEM_CHECK) 1663 self.Bind(wx.EVT_MENU, self.mnuFilterForced_handler, id=IDMNUFILTERFORCED) 1664 self.mnuBar.mnuFilterFile = self.mnuFilter.Append(IDMNUFILTERFILE, "Show files &1", "Show files", wx.ITEM_CHECK) 1665 self.Bind(wx.EVT_MENU, self.mnuFilterFile_handler, id=IDMNUFILTERFILE) 1666 self.mnuBar.mnuFilterDir = self.mnuFilter.Append(IDMNUFILTERDIR, "Show directories &2", "Show directories", wx.ITEM_CHECK) 1667 self.Bind(wx.EVT_MENU, self.mnuFilterDir_handler, id=IDMNUFILTERDIR) 1668 self.mnuBar.mnuFilterSym = self.mnuFilter.Append(IDMNUFILTERSYM, "Show symlinks &3", "Show symlinks", wx.ITEM_CHECK) 1669 self.Bind(wx.EVT_MENU, self.mnuFilterSym_handler, id=IDMNUFILTERSYM) 1670 self.mnuBar.mnuFilterUnk = self.mnuFilter.Append(IDMNUFILTERUNK, "Show unknown &4", "Show unknown items", wx.ITEM_CHECK) 1671 self.Bind(wx.EVT_MENU, self.mnuFilterUnk_handler, id=IDMNUFILTERUNK) 1672 self.mnuBar.mnuFilterTs = self.mnuFilter.Append(IDMNUFILTERTS, "Show &time shifted items", "Show time shifted items", wx.ITEM_CHECK) 1673 self.Bind(wx.EVT_MENU, self.mnuFilterTs_handler, id=IDMNUFILTERTS) 1674 self.mnuBar.Append(self.mnuFilter, "Fi&lter") 1675 self.mnuOptions = wx.Menu() 1676 self.mnuBar.mnuOptionsStat = self.mnuOptions.Append(IDMNUOPTIONSSTAT, "&Statistics ...", "Show statistics about roots.") 1677 self.Bind(wx.EVT_MENU, self.mnuOptionsStat_handler, id=IDMNUOPTIONSSTAT) 1678 self.mnuOptions.AppendSeparator() 1679 self.mnuBar.mnuOptionsPrefs = self.mnuOptions.Append(IDMNUOPTIONSPREFS, "&Preferences ...", "Preferences") 1680 self.Bind(wx.EVT_MENU, self.mnuOptionsPrefs_handler, id=IDMNUOPTIONSPREFS) 1681 self.mnuBar.Append(self.mnuOptions, "&Options") 1682 self.mnuHelp = wx.Menu() 1683 self.mnuBar.mnuHelpAbout = self.mnuHelp.Append(IDMNUHELPABOUT, "&About", "About") 1684 self.Bind(wx.EVT_MENU, self.mnuHelpAbout_handler, id=IDMNUHELPABOUT) 1685 self.mnuBar.mnuHelpUsage = self.mnuHelp.Append(IDMNUHELPUSAGE, "&Usage", "Show usage info") 1686 self.Bind(wx.EVT_MENU, self.mnuHelpUsage_handler, id=IDMNUHELPUSAGE) 1687 self.mnuBar.mnuAboutLicense = self.mnuHelp.Append(IDMNUABOUTLICENSE, "&License", "Show license information.") 1688 self.Bind(wx.EVT_MENU, self.mnuAboutLicense_handler, id=IDMNUABOUTLICENSE) 1689 self.mnuBar.Append(self.mnuHelp, "&Help") 1690 self.SetMenuBar(self.mnuBar) 1691 # Menu Bar end 1692 self.sbarSBar = self.CreateStatusBar(1, wx.ST_SIZEGRIP) 1693 1694 # Tool Bar 1695 self.tBar = wx.ToolBar(self, -1) 1696 self.SetToolBar(self.tBar) 1697 global IDTOOLCOMPARE; IDTOOLCOMPARE = wx.NewId() 1698 global IDTOOLSYNC; IDTOOLSYNC = wx.NewId() 1699 global IDTOOLFILTEROK; IDTOOLFILTEROK = wx.NewId() 1700 global IDTOOLFILTERWARN; IDTOOLFILTERWARN = wx.NewId() 1701 global IDTOOLFILTERCONF; IDTOOLFILTERCONF = wx.NewId() 1702 global IDTOOLFILTERERR; IDTOOLFILTERERR = wx.NewId() 1703 global IDTOOLFILTERBAG; IDTOOLFILTERBAG = wx.NewId() 1704 global IDTOOLFILTERORIG; IDTOOLFILTERORIG = wx.NewId() 1705 global IDTOOLFILTERNEW; IDTOOLFILTERNEW = wx.NewId() 1706 global IDTOOLFILTERCHANGED; IDTOOLFILTERCHANGED = wx.NewId() 1707 global IDTOOLFILTERDELETE; IDTOOLFILTERDELETE = wx.NewId() 1708 global IDTOOLFILTERIGNORED; IDTOOLFILTERIGNORED = wx.NewId() 1709 global IDTOOLFILTERUNCH; IDTOOLFILTERUNCH = wx.NewId() 1710 global IDTOOLFILTERFORCED; IDTOOLFILTERFORCED = wx.NewId() 1711 global IDTOOLFILTERFILE; IDTOOLFILTERFILE = wx.NewId() 1712 global IDTOOLFILTERDIR; IDTOOLFILTERDIR = wx.NewId() 1713 global IDTOOLFILTERSYM; IDTOOLFILTERSYM = wx.NewId() 1714 global IDTOOLFILTERUNK; IDTOOLFILTERUNK = wx.NewId() 1715 global IDTOOLFILTERTS; IDTOOLFILTERTS = wx.NewId() 1716 global IDTOOLFORCEUNCHANGED; IDTOOLFORCEUNCHANGED = wx.NewId() 1717 global IDTOOLFORCEBAG; IDTOOLFORCEBAG = wx.NewId() 1718 global IDTOOLFORCEORIG; IDTOOLFORCEORIG = wx.NewId() 1719 global IDTOOLFORCEDEL; IDTOOLFORCEDEL = wx.NewId() 1720 global IDTOOLFORCERESTORE; IDTOOLFORCERESTORE = wx.NewId() 1721 self.tBar.AddLabelTool(IDTOOLCOMPARE, "Compare", catalog['compare'].getBitmap(), wx.NullBitmap, wx.ITEM_NORMAL, "Compare files", "Compare files") 1722 self.tBar.AddLabelTool(IDTOOLSYNC, "Sync", catalog['sync'].getBitmap(), wx.NullBitmap, wx.ITEM_NORMAL, "Synchronize files", "Synchronize files") 1723 self.tBar.AddSeparator() 1724 self.tBar.AddLabelTool(IDTOOLFILTEROK, "FilterOk", catalog['ok'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter OK synchronization", "Show OK synchronization") 1725 self.tBar.AddLabelTool(IDTOOLFILTERWARN, "FilterWarn", catalog['warn'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter Warning", "Show warnings") 1726 self.tBar.AddLabelTool(IDTOOLFILTERCONF, "FilterConf", catalog['conf'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter conflicts", "Show conflicts") 1727 self.tBar.AddLabelTool(IDTOOLFILTERERR, "FilterErr", catalog['err'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter errors", "Show errors") 1728 self.tBar.AddLabelTool(IDTOOLFILTERBAG, "FilterBag", catalog['bag'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter bag", "Show to bag") 1729 self.tBar.AddLabelTool(IDTOOLFILTERORIG, "FilterOrigin", catalog['orig'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter origin", "Show to origin") 1730 self.tBar.AddLabelTool(IDTOOLFILTERNEW, "FilterNew", catalog['new'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter new", "Show new items") 1731 self.tBar.AddLabelTool(IDTOOLFILTERCHANGED, "FilterChanged", catalog['changed'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter changed", "Show changed items") 1732 self.tBar.AddLabelTool(IDTOOLFILTERDELETE, "FilterDelete", catalog['del'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter delete", "Show deleted items") 1733 self.tBar.AddLabelTool(IDTOOLFILTERIGNORED, "FilterIgnored", catalog['ign'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter ignored", "Show ignored items") 1734 self.tBar.AddLabelTool(IDTOOLFILTERUNCH, "FilterUnch", catalog['unch'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter unchanged", "Show unchanged items") 1735 self.tBar.AddLabelTool(IDTOOLFILTERFORCED, "FilterForced", catalog['forced'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter forced", "Show forced items") 1736 self.tBar.AddLabelTool(IDTOOLFILTERFILE, "FilterFile", catalog['file'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter file", "Show files") 1737 self.tBar.AddLabelTool(IDTOOLFILTERDIR, "FilterDir", catalog['dir'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter directory", "Show directories") 1738 self.tBar.AddLabelTool(IDTOOLFILTERSYM, "FilterSym", catalog['sym'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter symlink", "Show symlinks") 1739 self.tBar.AddLabelTool(IDTOOLFILTERUNK, "FilterUnk", catalog['unk'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter unknown items", "Show unknown items") 1740 self.tBar.AddLabelTool(IDTOOLFILTERTS, "FilterTs", catalog['ts'].getBitmap(), wx.NullBitmap, wx.ITEM_CHECK, "Filter time shifted items", "Show time shifted items") 1741 self.tBar.AddSeparator() 1742 self.tBar.AddLabelTool(IDTOOLFORCEUNCHANGED, "ForceUnchanged", catalog['unchforced'].getBitmap(), wx.BitmapFromImage(catalog['unchforced'].getImage().ConvertToGreyscale()), wx.ITEM_NORMAL, "Force unchanged", "Do not synchronize file") 1743 self.tBar.AddLabelTool(IDTOOLFORCEBAG, "ForceBag", catalog['bagforced'].getBitmap(), wx.BitmapFromImage(catalog['bagforced'].getImage().ConvertToGreyscale()), wx.ITEM_NORMAL, "Force to bag", "Force to bag") 1744 self.tBar.AddLabelTool(IDTOOLFORCEORIG, "ForceOrigin", catalog['origforced'].getBitmap(), wx.BitmapFromImage(catalog['origforced'].getImage().ConvertToGreyscale()), wx.ITEM_NORMAL, "Force to origin", "Force to origin") 1745 self.tBar.AddLabelTool(IDTOOLFORCEDEL, "ForceDel", catalog['delforced'].getBitmap(), wx.BitmapFromImage(catalog['delforced'].getImage().ConvertToGreyscale()), wx.ITEM_NORMAL, "Force delete", "Force delete") 1746 self.tBar.AddLabelTool(IDTOOLFORCERESTORE, "ForceRestore", catalog['restore'].getBitmap(), wx.BitmapFromImage(catalog['restore'].getImage().ConvertToGreyscale()), wx.ITEM_NORMAL, "Restore", "Restore comparision result") 1747 # Tool Bar end 1748 global IDSPLITTER; IDSPLITTER = wx.NewId() 1749 self.Splitter = wx.SplitterWindow(self, IDSPLITTER, style=wx.SP_3D | wx.SP_BORDER | wx.SP_LIVE_UPDATE | wx.SP_PERMIT_UNSPLIT) 1750 1751 self.splitPanel1 = wx.Panel(self.Splitter, wx.ID_ANY) 1752 global IDCLBOXROOTS; IDCLBOXROOTS = wx.NewId() 1753 self.clboxRoots = wx.CheckListBox(self.splitPanel1, IDCLBOXROOTS, choices=[], style=wx.LB_ALWAYS_SB | wx.LB_EXTENDED | wx.LB_SORT) 1754 global IDBTNSELECTROOTS; IDBTNSELECTROOTS = wx.NewId() 1755 self.btnSelectRoots = wx.Button(self.splitPanel1, IDBTNSELECTROOTS, "Select All") 1756 self.label_4 = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Auto Conflict:") 1757 global IDCBOXAUTOACTION; IDCBOXAUTOACTION = wx.NewId() 1758 self.cboxAutoAction = wx.ComboBox(self.splitPanel1, IDCBOXAUTOACTION, choices=[], style=wx.CB_DROPDOWN | wx.CB_READONLY) 1759 self.label_5 = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Verbosity:") 1760 global IDCBOXVERBOSITY; IDCBOXVERBOSITY = wx.NewId() 1761 self.cboxVerbosity = wx.ComboBox(self.splitPanel1, IDCBOXVERBOSITY, choices=["-1 - Not at all", "0 - Only global errors", "1 - Errors and success", "2 - Errors and conflicts", "3 - Normal output (errors, conflicts, warnings)", "4 - Large output (as 3 and file operations)", "5 - Logging output"], style=wx.CB_DROPDOWN | wx.CB_READONLY) 1762 global IDCHBOXEMUL; IDCHBOXEMUL = wx.NewId() 1763 self.chboxEmul = wx.CheckBox(self.splitPanel1, IDCHBOXEMUL, "Emulation") 1764 global IDCHBOXLOGGING; IDCHBOXLOGGING = wx.NewId() 1765 self.chboxLogging = wx.CheckBox(self.splitPanel1, IDCHBOXLOGGING, "Logging") 1766 global IDCHBOXDEBUG; IDCHBOXDEBUG = wx.NewId() 1767 self.chboxDebug = wx.CheckBox(self.splitPanel1, IDCHBOXDEBUG, "Debug logging") 1768 self.label_7 = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Modify date delta") 1769 global IDSPINMDDELTA; IDSPINMDDELTA = wx.NewId() 1770 self.spinMDDELTA = wx.SpinCtrl(self.splitPanel1, IDSPINMDDELTA, "5", min=0, max=10000) 1771 self.chboxBackupMode = wx.CheckBox(self.splitPanel1, wx.ID_ANY, "Backup full synch") 1772 self.label_19 = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Time shift", style=wx.ALIGN_CENTER) 1773 self.lblTsDir = wx.StaticText(self.splitPanel1, wx.ID_ANY, "None", style=wx.ALIGN_CENTER) 1774 self.lblTsValueBag = wx.StaticText(self.splitPanel1, wx.ID_ANY, "b:0.0", style=wx.ALIGN_CENTER) 1775 self.lblTsValueOrigin = wx.StaticText(self.splitPanel1, wx.ID_ANY, "o:0.0", style=wx.ALIGN_CENTER) 1776 self.label_18 = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Path filter (wilds, !regexp):", style=wx.ALIGN_CENTER) 1777 self.txtFilter = wx.TextCtrl(self.splitPanel1, wx.ID_ANY, "*", style=wx.TE_PROCESS_ENTER) 1778 self.btnFilterRefresh = wx.Button(self.splitPanel1, wx.ID_ANY, "Refresh list") 1779 global IDLISTFILES; IDLISTFILES = wx.NewId() 1780 self.listFiles = PyBAGListCtrl_class(self.splitPanel1, IDLISTFILES, style=wx.BORDER_STATIC | wx.LC_HRULES | wx.LC_REPORT | wx.LC_VIRTUAL | wx.LC_VRULES) 1781 self.lblErrors = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Errors: 100") 1782 self.lblConflicts = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Conflicts: 100") 1783 self.lblWarnings = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Warnings: 100") 1784 self.lblAllItems = wx.StaticText(self.splitPanel1, wx.ID_ANY, "All items: 100") 1785 self.lblNewBag = wx.StaticText(self.splitPanel1, wx.ID_ANY, "New in bag: 100") 1786 self.lblNewOrig = wx.StaticText(self.splitPanel1, wx.ID_ANY, "New in origin: 100") 1787 self.lblChangeBag = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Changed in bag: 100") 1788 self.lblChangeOrig = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Changed in origin: 100") 1789 self.lblDelBag = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Deleted in bag: 100") 1790 self.lblDelOrig = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Deleted in origin: 100") 1791 self.lblIgnored = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Ignored: 100") 1792 self.lblTimeshifted = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Timeshifted: 100") 1793 self.static_line_1 = wx.StaticLine(self.splitPanel1, wx.ID_ANY) 1794 self.label_1 = wx.StaticText(self.splitPanel1, wx.ID_ANY, "File:") 1795 self.txtFile = wx.TextCtrl(self.splitPanel1, wx.ID_ANY, "", style=wx.BORDER_NONE | wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_WORDWRAP) 1796 self.label_2 = wx.StaticText(self.splitPanel1, wx.ID_ANY, "Desc:") 1797 self.txtDesc = wx.TextCtrl(self.splitPanel1, wx.ID_ANY, "", style=wx.BORDER_NONE | wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_WORDWRAP) 1798 self.splitPanel2 = wx.Panel(self.Splitter, wx.ID_ANY, style=wx.BORDER_SIMPLE | wx.TAB_TRAVERSAL) 1799 global IDBTNCLEAR; IDBTNCLEAR = wx.NewId() 1800 self.btnClear_copy = wx.Button(self.splitPanel2, IDBTNCLEAR, "Clear") 1801 global IDTXTOUT; IDTXTOUT = wx.NewId() 1802 self.txtOut = wx.TextCtrl(self.splitPanel2, IDTXTOUT, "", style=wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_RICH | wx.TE_WORDWRAP) 1803 1804 self.__set_properties() 1805 self.__do_layout() 1806 1807 self.Bind(wx.EVT_TOOL, self.tBarCompare_handler, id=IDTOOLCOMPARE) 1808 self.Bind(wx.EVT_TOOL, self.tBarSync_handler, id=IDTOOLSYNC) 1809 self.Bind(wx.EVT_TOOL, self.mnuFilterOk_handler, id=IDTOOLFILTEROK) 1810 self.Bind(wx.EVT_TOOL, self.mnuFilterWarn_handler, id=IDTOOLFILTERWARN) 1811 self.Bind(wx.EVT_TOOL, self.mnuFilterConf_handler, id=IDTOOLFILTERCONF) 1812 self.Bind(wx.EVT_TOOL, self.mnuFilterErr_handler, id=IDTOOLFILTERERR) 1813 self.Bind(wx.EVT_TOOL, self.mnuFilterBag_handler, id=IDTOOLFILTERBAG) 1814 self.Bind(wx.EVT_TOOL, self.mnuFilterOrig_handler, id=IDTOOLFILTERORIG) 1815 self.Bind(wx.EVT_TOOL, self.mnuFilterNew_handler, id=IDTOOLFILTERNEW) 1816 self.Bind(wx.EVT_TOOL, self.mnuFilterCh_handler, id=IDTOOLFILTERCHANGED) 1817 self.Bind(wx.EVT_TOOL, self.mnuFilterDel_handler, id=IDTOOLFILTERDELETE) 1818 self.Bind(wx.EVT_TOOL, self.mnuFilterIgn_handler, id=IDTOOLFILTERIGNORED) 1819 self.Bind(wx.EVT_TOOL, self.mnuFilterUnch_handler, id=IDTOOLFILTERUNCH) 1820 self.Bind(wx.EVT_TOOL, self.mnuFilterForced_handler, id=IDTOOLFILTERFORCED) 1821 self.Bind(wx.EVT_TOOL, self.mnuFilterFile_handler, id=IDTOOLFILTERFILE) 1822 self.Bind(wx.EVT_TOOL, self.mnuFilterDir_handler, id=IDTOOLFILTERDIR) 1823 self.Bind(wx.EVT_TOOL, self.mnuFilterSym_handler, id=IDTOOLFILTERSYM) 1824 self.Bind(wx.EVT_TOOL, self.mnuFilterUnk_handler, id=IDTOOLFILTERUNK) 1825 self.Bind(wx.EVT_TOOL, self.mnuFilterTs_handler, id=IDTOOLFILTERTS) 1826 self.Bind(wx.EVT_TOOL, self.tBarForceUnchanged_handler, id=IDTOOLFORCEUNCHANGED) 1827 self.Bind(wx.EVT_TOOL, self.tBarForceBag_handler, id=IDTOOLFORCEBAG) 1828 self.Bind(wx.EVT_TOOL, self.tBarForceOrig_handler, id=IDTOOLFORCEORIG) 1829 self.Bind(wx.EVT_TOOL, self.tBarForceDel_handler, id=IDTOOLFORCEDEL) 1830 self.Bind(wx.EVT_TOOL, self.tBarForceRestore_handler, id=IDTOOLFORCERESTORE) 1831 self.Bind(wx.EVT_BUTTON, self.btnSelectRoots_handler, self.btnSelectRoots) 1832 self.Bind(wx.EVT_COMBOBOX, self.cboxAutoAction_handler, self.cboxAutoAction) 1833 self.Bind(wx.EVT_COMBOBOX, self.cboxVerbosity_handler, self.cboxVerbosity) 1834 self.Bind(wx.EVT_CHECKBOX, self.chboxEmul_handler, self.chboxEmul) 1835 self.Bind(wx.EVT_CHECKBOX, self.chboxLogging_handler, self.chboxLogging) 1836 self.Bind(wx.EVT_CHECKBOX, self.chboxDebug_handler, self.chboxDebug) 1837 self.Bind(wx.EVT_SPINCTRL, self.spinMDDELTA_handler, self.spinMDDELTA) 1838 self.Bind(wx.EVT_CHECKBOX, self.chboxBackupMode_handler, self.chboxBackupMode) 1839 self.Bind(wx.EVT_TEXT, self.txtFilter_text_handler, self.txtFilter) 1840 self.Bind(wx.EVT_TEXT_ENTER, self.txtFilter_enter_handler, self.txtFilter) 1841 self.Bind(wx.EVT_BUTTON, self.btnFilterRefresh_handler, self.btnFilterRefresh) 1842 self.Bind(wx.EVT_LIST_COL_CLICK, self.listFiles_col_click_handler, self.listFiles) 1843 self.Bind(wx.EVT_LIST_COL_END_DRAG, self.listFiles_col_end_drag_handler, self.listFiles) 1844 self.Bind(wx.EVT_LIST_COL_RIGHT_CLICK, self.listFiles_col_rclick_handler, self.listFiles) 1845 self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.listFiles_item_activated_handler, self.listFiles) 1846 self.Bind(wx.EVT_LIST_ITEM_RIGHT_CLICK, self.listFiles_item_rclick_handler, self.listFiles) 1847 self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.listFiles_item_selected_handler, self.listFiles) 1848 self.Bind(wx.EVT_BUTTON, self.btnClear_handler, self.btnClear_copy) 1849 self.Bind(wx.EVT_SPLITTER_DCLICK, self.Splitter_dclick_handler, self.Splitter) 1850 # end wxGlade 1851 1852 1853 self.Bind(wx.EVT_CLOSE, self.frmMain_Close_handler) 1854 1855 self.colidrclicked = -1 #: Last column clicked right button 1856 1857 # Context menu for listFiles_col_rclick 1858 global IDMNUCTXRCOLLEFT; IDMNUCTXRCOLLEFT = wx.NewId() 1859 global IDMNUCTXRCOLRIGHT; IDMNUCTXRCOLRIGHT = wx.NewId() 1860 global IDMNUCTXRCOLERR; IDMNUCTXRCOLERR = wx.NewId() 1861 global IDMNUCTXRCOLSTATEICON; IDMNUCTXRCOLSTATEICON = wx.NewId() 1862 global IDMNUCTXRCOLACTIONICON; IDMNUCTXRCOLACTIONICON = wx.NewId() 1863 global IDMNUCTXRCOLFORCED; IDMNUCTXRCOLFORCED = wx.NewId() 1864 global IDMNUCTXRCOLDIR; IDMNUCTXRCOLDIR = wx.NewId() 1865 global IDMNUCTXRCOLPATH; IDMNUCTXRCOLPATH = wx.NewId() 1866 global IDMNUCTXRCOLDESC; IDMNUCTXRCOLDESC = wx.NewId() 1867 global IDMNUCTXRCOLTYPE; IDMNUCTXRCOLTYPE = wx.NewId() 1868 global IDMNUCTXRCOLMDATEDB; IDMNUCTXRCOLMDATEDB = wx.NewId() 1869 global IDMNUCTXRCOLGMDATEDB; IDMNUCTXRCOLGMDATEDB = wx.NewId() 1870 global IDMNUCTXRCOLLMDATEDB; IDMNUCTXRCOLLMDATEDB = wx.NewId() 1871 global IDMNUCTXRCOLCRC32DB; IDMNUCTXRCOLCRC32DB = wx.NewId() 1872 global IDMNUCTXRCOLSIZEDB; IDMNUCTXRCOLSIZEDB = wx.NewId() 1873 global IDMNUCTXRCOLMDATEBAG; IDMNUCTXRCOLMDATEBAG = wx.NewId() 1874 global IDMNUCTXRCOLGMDATEBAG; IDMNUCTXRCOLGMDATEBAG = wx.NewId() 1875 global IDMNUCTXRCOLLMDATEBAG; IDMNUCTXRCOLLMDATEBAG = wx.NewId() 1876 global IDMNUCTXRCOLCRC32BAG; IDMNUCTXRCOLCRC32BAG = wx.NewId() 1877 global IDMNUCTXRCOLSIZEBAG; IDMNUCTXRCOLSIZEBAG = wx.NewId() 1878 global IDMNUCTXRCOLMDATEORIG; IDMNUCTXRCOLMDATEORIG = wx.NewId() 1879 global IDMNUCTXRCOLGMDATEORIG; IDMNUCTXRCOLGMDATEORIG = wx.NewId() 1880 global IDMNUCTXRCOLLMDATEORIG; IDMNUCTXRCOLLMDATEORIG = wx.NewId() 1881 global IDMNUCTXRCOLCRC32ORIG; IDMNUCTXRCOLCRC32ORIG = wx.NewId() 1882 global IDMNUCTXRCOLSIZEORIG; IDMNUCTXRCOLSIZEORIG = wx.NewId() 1883 global IDMNUCTXRCOLSYMLINKDB; IDMNUCTXRCOLSYMLINKDB = wx.NewId() 1884 global IDMNUCTXRCOLSYMLINKBAG; IDMNUCTXRCOLSYMLINKBAG = wx.NewId() 1885 global IDMNUCTXRCOLSYMLINKORIG; IDMNUCTXRCOLSYMLINKORIG = wx.NewId() 1886 global IDMNUCTXRCOLTS; IDMNUCTXRCOLTS = wx.NewId() 1887 global IDMNUCTXRCOLDEFAULT; IDMNUCTXRCOLDEFAULT = wx.NewId() 1888 1889 self.mnuctxrcol = wx.Menu() 1890 self.mnuctxrcolLeft = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLLEFT, "To left", "Move column left", wx.ITEM_NORMAL) 1891 self.mnuctxrcol.AppendItem(self.mnuctxrcolLeft) 1892 self.Bind(wx.EVT_MENU, self.mnuctxrcolLeft_handler, self.mnuctxrcolLeft) 1893 1894 self.mnuctxrcolRight = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLRIGHT, "To right", "Move column right", wx.ITEM_NORMAL) 1895 self.mnuctxrcol.AppendItem(self.mnuctxrcolRight) 1896 self.Bind(wx.EVT_MENU, self.mnuctxrcolRight_handler, self.mnuctxrcolRight) 1897 self.mnuctxrcol.AppendSeparator() 1898 1899 self.mnuctxrcolErr = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLERR, "Error", "Show/hide column", wx.ITEM_CHECK) 1900 self.mnuctxrcol.AppendItem(self.mnuctxrcolErr) 1901 self.Bind(wx.EVT_MENU, self.mnuctxrcolErr_handler, self.mnuctxrcolErr) 1902 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolErr_updateui, self.mnuctxrcolErr) 1903 1904 self.mnuctxrcolStateicon = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLSTATEICON, "State", "Show/hide column", wx.ITEM_CHECK) 1905 self.mnuctxrcol.AppendItem(self.mnuctxrcolStateicon) 1906 self.Bind(wx.EVT_MENU, self.mnuctxrcolStateicon_handler, self.mnuctxrcolStateicon) 1907 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolStateicon_updateui, self.mnuctxrcolStateicon) 1908 1909 self.mnuctxrcolActionicon = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLACTIONICON, "Action", "Show/hide column", wx.ITEM_CHECK) 1910 self.mnuctxrcol.AppendItem(self.mnuctxrcolActionicon) 1911 self.Bind(wx.EVT_MENU, self.mnuctxrcolActionicon_handler, self.mnuctxrcolActionicon) 1912 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolActionicon_updateui, self.mnuctxrcolActionicon) 1913 1914 self.mnuctxrcolForced = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLFORCED, "Forced", "Show/hide column", wx.ITEM_CHECK) 1915 self.mnuctxrcol.AppendItem(self.mnuctxrcolForced) 1916 self.Bind(wx.EVT_MENU, self.mnuctxrcolForced_handler, self.mnuctxrcolForced) 1917 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolForced_updateui, self.mnuctxrcolForced) 1918 1919 self.mnuctxrcolDir = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLDIR, "Dir", "Show/hide column", wx.ITEM_CHECK) 1920 self.mnuctxrcol.AppendItem(self.mnuctxrcolDir) 1921 self.Bind(wx.EVT_MENU, self.mnuctxrcolDir_handler, self.mnuctxrcolDir) 1922 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolDir_updateui, self.mnuctxrcolDir) 1923 1924 self.mnuctxrcolPath = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLPATH, "Path", "Show/hide column", wx.ITEM_CHECK) 1925 self.mnuctxrcol.AppendItem(self.mnuctxrcolPath) 1926 self.Bind(wx.EVT_MENU, self.mnuctxrcolPath_handler, self.mnuctxrcolPath) 1927 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolPath_updateui, self.mnuctxrcolPath) 1928 1929 self.mnuctxrcolDesc = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLDESC, "Description", "Show/hide column", wx.ITEM_CHECK) 1930 self.mnuctxrcol.AppendItem(self.mnuctxrcolDesc) 1931 self.Bind(wx.EVT_MENU, self.mnuctxrcolDesc_handler, self.mnuctxrcolDesc) 1932 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolDesc_updateui, self.mnuctxrcolDesc) 1933 1934 self.mnuctxrcolType = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLTYPE, "Type", "Show/hide column", wx.ITEM_CHECK) 1935 self.mnuctxrcol.AppendItem(self.mnuctxrcolType) 1936 self.Bind(wx.EVT_MENU, self.mnuctxrcolType_handler, self.mnuctxrcolType) 1937 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolType_updateui, self.mnuctxrcolType) 1938 1939 self.mnuctxrcolMdatedb = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLMDATEDB, "MDate DB", "Show/hide column", wx.ITEM_CHECK) 1940 self.mnuctxrcol.AppendItem(self.mnuctxrcolMdatedb) 1941 self.Bind(wx.EVT_MENU, self.mnuctxrcolMdatedb_handler, self.mnuctxrcolMdatedb) 1942 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolMdatedb_updateui, self.mnuctxrcolMdatedb) 1943 1944 self.mnuctxrcolGMdatedb = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLGMDATEDB, "GMT Date DB", "Show/hide column", wx.ITEM_CHECK) 1945 self.mnuctxrcol.AppendItem(self.mnuctxrcolGMdatedb) 1946 self.Bind(wx.EVT_MENU, self.mnuctxrcolGMdatedb_handler, self.mnuctxrcolGMdatedb) 1947 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolGMdatedb_updateui, self.mnuctxrcolGMdatedb) 1948 1949 self.mnuctxrcolLMdatedb = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLLMDATEDB, "Local Date DB", "Show/hide column", wx.ITEM_CHECK) 1950 self.mnuctxrcol.AppendItem(self.mnuctxrcolLMdatedb) 1951 self.Bind(wx.EVT_MENU, self.mnuctxrcolLMdatedb_handler, self.mnuctxrcolLMdatedb) 1952 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolLMdatedb_updateui, self.mnuctxrcolLMdatedb) 1953 1954 self.mnuctxrcolCrc32db = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLCRC32DB, "CRC32 DB", "Show/hide column", wx.ITEM_CHECK) 1955 self.mnuctxrcol.AppendItem(self.mnuctxrcolCrc32db) 1956 self.Bind(wx.EVT_MENU, self.mnuctxrcolCrc32db_handler, self.mnuctxrcolCrc32db) 1957 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolCrc32db_updateui, self.mnuctxrcolCrc32db) 1958 1959 self.mnuctxrcolSizedb = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLSIZEDB, "Size DB", "Show/hide column", wx.ITEM_CHECK) 1960 self.mnuctxrcol.AppendItem(self.mnuctxrcolSizedb) 1961 self.Bind(wx.EVT_MENU, self.mnuctxrcolSizedb_handler, self.mnuctxrcolSizedb) 1962 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolSizedb_updateui, self.mnuctxrcolSizedb) 1963 1964 self.mnuctxrcolMdatebag = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLMDATEBAG, "MDate bag", "Show/hide column", wx.ITEM_CHECK) 1965 self.mnuctxrcol.AppendItem(self.mnuctxrcolMdatebag) 1966 self.Bind(wx.EVT_MENU, self.mnuctxrcolMdatebag_handler, self.mnuctxrcolMdatebag) 1967 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolMdatebag_updateui, self.mnuctxrcolMdatebag) 1968 1969 self.mnuctxrcolGMdatebag = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLGMDATEBAG, "GMT Date bag", "Show/hide column", wx.ITEM_CHECK) 1970 self.mnuctxrcol.AppendItem(self.mnuctxrcolGMdatebag) 1971 self.Bind(wx.EVT_MENU, self.mnuctxrcolGMdatebag_handler, self.mnuctxrcolGMdatebag) 1972 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolGMdatebag_updateui, self.mnuctxrcolGMdatebag) 1973 1974 self.mnuctxrcolLMdatebag = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLLMDATEBAG, "Locale Date bag", "Show/hide column", wx.ITEM_CHECK) 1975 self.mnuctxrcol.AppendItem(self.mnuctxrcolLMdatebag) 1976 self.Bind(wx.EVT_MENU, self.mnuctxrcolLMdatebag_handler, self.mnuctxrcolLMdatebag) 1977 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolLMdatebag_updateui, self.mnuctxrcolLMdatebag) 1978 1979 self.mnuctxrcolCrc32bag = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLCRC32BAG, "CRC32 bag", "Show/hide column", wx.ITEM_CHECK) 1980 self.mnuctxrcol.AppendItem(self.mnuctxrcolCrc32bag) 1981 self.Bind(wx.EVT_MENU, self.mnuctxrcolCrc32bag_handler, self.mnuctxrcolCrc32bag) 1982 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolCrc32bag_updateui, self.mnuctxrcolCrc32bag) 1983 1984 self.mnuctxrcolSizebag = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLSIZEBAG, "Size bag", "Show/hide column", wx.ITEM_CHECK) 1985 self.mnuctxrcol.AppendItem(self.mnuctxrcolSizebag) 1986 self.Bind(wx.EVT_MENU, self.mnuctxrcolSizebag_handler, self.mnuctxrcolSizebag) 1987 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolSizebag_updateui, self.mnuctxrcolSizebag) 1988 1989 self.mnuctxrcolMdateorig = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLMDATEORIG, "MDate origin", "Show/hide column", wx.ITEM_CHECK) 1990 self.mnuctxrcol.AppendItem(self.mnuctxrcolMdateorig) 1991 self.Bind(wx.EVT_MENU, self.mnuctxrcolMdateorig_handler, self.mnuctxrcolMdateorig) 1992 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolMdateorig_updateui, self.mnuctxrcolMdateorig) 1993 1994 self.mnuctxrcolGMdateorig = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLGMDATEORIG, "GMT Date origin", "Show/hide column", wx.ITEM_CHECK) 1995 self.mnuctxrcol.AppendItem(self.mnuctxrcolGMdateorig) 1996 self.Bind(wx.EVT_MENU, self.mnuctxrcolGMdateorig_handler, self.mnuctxrcolGMdateorig) 1997 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolGMdateorig_updateui, self.mnuctxrcolGMdateorig) 1998 1999 self.mnuctxrcolLMdateorig = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLLMDATEORIG, "Locale Date origin", "Show/hide column", wx.ITEM_CHECK) 2000 self.mnuctxrcol.AppendItem(self.mnuctxrcolLMdateorig) 2001 self.Bind(wx.EVT_MENU, self.mnuctxrcolLMdateorig_handler, self.mnuctxrcolLMdateorig) 2002 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolLMdateorig_updateui, self.mnuctxrcolLMdateorig) 2003 2004 self.mnuctxrcolCrc32orig = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLCRC32ORIG, "CRC32 origin", "Show/hide column", wx.ITEM_CHECK) 2005 self.mnuctxrcol.AppendItem(self.mnuctxrcolCrc32orig) 2006 self.Bind(wx.EVT_MENU, self.mnuctxrcolCrc32orig_handler, self.mnuctxrcolCrc32orig) 2007 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolCrc32orig_updateui, self.mnuctxrcolCrc32orig) 2008 2009 self.mnuctxrcolSizeorig = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLSIZEORIG, "Size origin", "Show/hide column", wx.ITEM_CHECK) 2010 self.mnuctxrcol.AppendItem(self.mnuctxrcolSizeorig) 2011 self.Bind(wx.EVT_MENU, self.mnuctxrcolSizeorig_handler, self.mnuctxrcolSizeorig) 2012 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolSizeorig_updateui, self.mnuctxrcolSizeorig) 2013 2014 self.mnuctxrcolSymlinkdb = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLSYMLINKDB, "Symlink DB", "Show/hide column", wx.ITEM_CHECK) 2015 self.mnuctxrcol.AppendItem(self.mnuctxrcolSymlinkdb) 2016 self.Bind(wx.EVT_MENU, self.mnuctxrcolSymlinkdb_handler, self.mnuctxrcolSymlinkdb) 2017 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolSymlinkdb_updateui, self.mnuctxrcolSymlinkdb) 2018 2019 self.mnuctxrcolSymlinkbag = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLSYMLINKBAG, "Symlink bag", "Show/hide column", wx.ITEM_CHECK) 2020 self.mnuctxrcol.AppendItem(self.mnuctxrcolSymlinkbag) 2021 self.Bind(wx.EVT_MENU, self.mnuctxrcolSymlinkbag_handler, self.mnuctxrcolSymlinkbag) 2022 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolSymlinkbag_updateui, self.mnuctxrcolSymlinkbag) 2023 2024 self.mnuctxrcolSymlinkorigin = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLSYMLINKORIG, "Symlink origin", "Show/hide column", wx.ITEM_CHECK) 2025 self.mnuctxrcol.AppendItem(self.mnuctxrcolSymlinkorigin) 2026 self.Bind(wx.EVT_MENU, self.mnuctxrcolSymlinkorigin_handler, self.mnuctxrcolSymlinkorigin) 2027 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolSymlinkorigin_updateui, self.mnuctxrcolSymlinkorigin) 2028 2029 self.mnuctxrcolTs = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLTS, "Time shift", "Show/hide column", wx.ITEM_CHECK) 2030 self.mnuctxrcol.AppendItem(self.mnuctxrcolTs) 2031 self.Bind(wx.EVT_MENU, self.mnuctxrcolTs_handler, self.mnuctxrcolTs) 2032 self.Bind(wx.EVT_UPDATE_UI, self.mnuctxrcolTs_updateui, self.mnuctxrcolTs) 2033 self.mnuctxrcol.AppendSeparator() 2034 2035 self.mnuctxrcolDefault = wx.MenuItem(self.mnuctxrcol, IDMNUCTXRCOLDEFAULT, "Reset to config", "Reset columns to saved in preferences", wx.ITEM_NORMAL) 2036 self.mnuctxrcol.AppendItem(self.mnuctxrcolDefault) 2037 self.Bind(wx.EVT_MENU, self.mnuctxrcolDefault_handler, self.mnuctxrcolDefault) 2038 2039 2040 self._outstream = outstream() #: Output stream. 2041 self._sys_stdout = sys.stdout #: Default out stream. 2042 # Assign new out stream. 2043 sys.stdout = self._outstream 2044 self.progress = None #: Progress dialog. 2045 2046 self.ForceDir = DBDIRNONE #: Direction for force. 2047 2048 self.readdur = 0.0 #: Reading duration. 2049 2050 self.read_ign = 0#: Ignored items while read. 2051 2052 self.cmpdur = 0.0 #: Comparing duration. 2053 2054 self.syncdur = 0.0 #: Synchronization duration. 2055 2056 sx, sy = self.GetSize() # @UnusedVariable 2057 self.SplitPos = int(sy/3.0*2.0) #: Splitter position. 2058 2059 self.LoadConfig() 2060 2061 self.spinMDDELTA.SetValue(cfg.MDDELTA) 2062 2063 # Colors for text control, setup later. 2064 self.BackColor = self.ForeColor = None 2065 self.cboxVerbosity.SetSelection(cfg.VERBOSE+1) 2066 2067 # Init LOCK 2068 cfg.LOCK[LI_CANCEL] = False 2069 cfg.LOCK[LI_DESC] = u'' 2070 2071 self._imgList= wx.ImageList(32,32,True) #: Image list for listFiles. 2072 2073 2074 cfg.IMGINDEX = dict([ ( t, self._imgList.Add(catalog[t].getBitmap()) ) for t in \ 2075 (u'file',u'filewarn', u'fileconf', u'fileerr', u'fileok', \ 2076 u'dir', u'dirwarn', u'dirconf', u'direrr', u'dirok', \ 2077 u'sym', u'symwarn', u'symconf', u'symerr', u'symok', \ 2078 u'unk', u'unkwarn', u'unkconf', u'unkerr', u'unkok', \ 2079 u'bagnew', u'orignew', \ 2080 u'del', u'delforced', \ 2081 u'unch', u'unchforced', \ 2082 u'ign', u'ignforced', \ 2083 u'bag', u'bagforced', u'orig', u'origforced', \ 2084 u'wrong', u'ok', u'warn', u'conf', u'err', \ 2085 u'unchtsbag', u'unchtsorig')]) 2086 2087 # Tree initialization. 2088 #InsertColumn(col, heading, format=wxLIST_FORMAT_LEFT, width=-1) 2089 self.listFiles.SetImageList(self._imgList, wx.IMAGELIST_DRAW_NORMAL) 2090 ##self.listFiles.SetImageList(self._imgList, wx.IMAGELIST_DRAW_FOCUSED) 2091 self.listFiles.SetImageList(self._imgList, wx.IMAGELIST_DRAW_SELECTED) 2092 ##self.listFiles.SetColumn(2,u'Files and actions', wx.LIST_FORMAT_CENTER, 450) 2093 self.listFiles.RefreshColumns() 2094 ##self.listFiles.InsertColumn(1,u'', wx.LIST_FORMAT_CENTER) 2095 ##self.listFiles.InsertColumn(2,u'Files and actions', wx.LIST_FORMAT_CENTER, 450) 2096 ##self.listFiles.InsertColumn(3,u'Description', wx.LIST_FORMAT_CENTER, 450) 2097 2098 2099 self.InfoDlg = dlgInfo_class(self) #: Information dialog. 2100 self.dlgAddRoot = dlgAddRoot_class(self) #: Add root dialog. 2101 self.dlgPrefs = dlgPrefs_class(self) #: Preference dialog. 2102 self.dlgTips = dlgTips_class(self) #: Tips dialog. 2103 2104 2105 # UI update bind. 2106 ## TOOL 2107 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, id=IDTOOLFORCEBAG) 2108 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, id=IDTOOLFORCEORIG) 2109 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, id=IDTOOLFORCEDEL) 2110 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, id=IDTOOLFORCERESTORE) 2111 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, id=IDTOOLFORCEUNCHANGED) 2112 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterOk_updateui, id=IDTOOLFILTEROK) 2113 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterWarn_updateui, id=IDTOOLFILTERWARN) 2114 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterConf_updateui, id=IDTOOLFILTERCONF) 2115 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterErr_updateui, id=IDTOOLFILTERERR) 2116 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterBag_updateui, id=IDTOOLFILTERBAG) 2117 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterOrig_updateui, id=IDTOOLFILTERORIG) 2118 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterNew_updateui, id=IDTOOLFILTERNEW) 2119 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterCh_updateui, id=IDTOOLFILTERCHANGED) 2120 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterDel_updateui, id=IDTOOLFILTERDELETE) 2121 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterIgn_updateui, id=IDTOOLFILTERIGNORED) 2122 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterUnch_updateui, id=IDTOOLFILTERUNCH) 2123 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterForced_updateui, id=IDTOOLFILTERFORCED) 2124 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterFile_updateui, id=IDTOOLFILTERFILE) 2125 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterDir_updateui, id=IDTOOLFILTERDIR) 2126 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterSym_updateui, id=IDTOOLFILTERSYM) 2127 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterUnk_updateui, id=IDTOOLFILTERUNK) 2128 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterTs_updateui, id=IDTOOLFILTERTS) 2129 ## MENU 2130 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, self.mnuBar.mnuActionBag) 2131 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, self.mnuBar.mnuActionOrig) 2132 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, self.mnuBar.mnuActionDel) 2133 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, self.mnuBar.mnuActionRestore) 2134 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, self.mnuBar.mnuActionUnch) 2135 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, self.mnuBar.mnuActionTsbag) 2136 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, self.mnuBar.mnuActionTsorig) 2137 self.Bind(wx.EVT_UPDATE_UI, self.mnuAction_updateui, self.mnuBar.mnuActionTsreset) 2138 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterOk_updateui, self.mnuBar.mnuFilterOk) 2139 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterWarn_updateui, self.mnuBar.mnuFilterWarn) 2140 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterConf_updateui, self.mnuBar.mnuFilterConf) 2141 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterErr_updateui, self.mnuBar.mnuFilterErr) 2142 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterBag_updateui, self.mnuBar.mnuFilterBag) 2143 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterOrig_updateui, self.mnuBar.mnuFilterOrig) 2144 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterNew_updateui, self.mnuBar.mnuFilterNew) 2145 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterCh_updateui, self.mnuBar.mnuFilterCh) 2146 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterDel_updateui, self.mnuBar.mnuFilterDel) 2147 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterIgn_updateui, self.mnuBar.mnuFilterIgn) 2148 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterUnch_updateui, self.mnuBar.mnuFilterUnch) 2149 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterForced_updateui, self.mnuBar.mnuFilterForced) 2150 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterFile_updateui, self.mnuBar.mnuFilterFile) 2151 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterDir_updateui, self.mnuBar.mnuFilterDir) 2152 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterSym_updateui, self.mnuBar.mnuFilterSym) 2153 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterUnk_updateui, self.mnuBar.mnuFilterUnk) 2154 self.Bind(wx.EVT_UPDATE_UI, self.mnuFilterTs_updateui, self.mnuBar.mnuFilterTs) 2155 self.Bind(wx.EVT_UPDATE_UI,self.mnuViewDebug_updateui, id=IDMNUVIEWDEBUG) 2156 self.Bind(wx.EVT_UPDATE_UI,self.mnuViewEmul_updateui, id=IDMNUVIEWEMUL) 2157 self.Bind(wx.EVT_UPDATE_UI,self.mnuViewLogging_updateui, id=IDMNUVIEWLOGGING) 2158 self.Bind(wx.EVT_UPDATE_UI,self.mnuViewOut_updateui, id=IDMNUVIEWOUT) 2159 self.Bind(wx.EVT_UPDATE_UI,self.mnuViewVerbNo_updateui, id=IDMNUVIEWVERBNO) 2160 self.Bind(wx.EVT_UPDATE_UI,self.mnuViewVerb0_updateui, id=IDMNUVIEWVERB0) 2161 self.Bind(wx.EVT_UPDATE_UI,self.mnuViewVerb1_updateui, id=IDMNUVIEWVERB1) 2162 self.Bind(wx.EVT_UPDATE_UI,self.mnuViewVerb2_updateui, id=IDMNUVIEWVERB2) 2163 self.Bind(wx.EVT_UPDATE_UI,self.mnuViewVerb3_updateui, id=IDMNUVIEWVERB3) 2164 self.Bind(wx.EVT_UPDATE_UI,self.mnuViewVerb4_updateui, id=IDMNUVIEWVERB4) 2165 self.Bind(wx.EVT_UPDATE_UI,self.mnuViewVerb5_updateui, id=IDMNUVIEWVERB5) 2166 ## CTRLS 2167 self.Bind(wx.EVT_UPDATE_UI,self.chboxDebug_updateui, id=IDCHBOXDEBUG) 2168 self.Bind(wx.EVT_UPDATE_UI,self.chboxEmul_updateui, id=IDCHBOXEMUL) 2169 self.Bind(wx.EVT_UPDATE_UI,self.chboxLogging_updateui, id=IDCHBOXLOGGING) 2170 ##self.Bind(wx.EVT_UPDATE_UI,self.lblTs_updateui, self.lblTsDir) # CPU Huge load 2171 ##self.Bind(wx.EVT_UPDATE_UI,self.cboxVerbosity_updateui, id=IDCBOXVERBOSITY) # Not need 2172 self.Bind(wx.EVT_CHECKLISTBOX, self.clboxRoots_toggled, id=IDCLBOXROOTS) 2173 2174 self.thread = None 2175 2176 if cfg.SHOWTIPS: 2177 log(u'frmMain.__init__: Show tips start.') 2178 self.dlgTips.ShowModal() 2179 log(u'frmMain.__init__: Show tips end.') 2180 2181 self.UpdateRoots() 2182 2183 global IDTIMER; IDTIMER = wx.NewId() 2184 self.timer = wx.Timer(self, IDTIMER) 2185 self.Bind(wx.EVT_TIMER, self.timer_handler, id=IDTIMER) 2186 self.timer.Start(300)
2187
2188 - def __set_properties(self):
2189 # begin wxGlade: frmMain_class.__set_properties 2190 self.SetTitle("PYBAG") 2191 _icon = wx.NullIcon 2192 _icon.CopyFromBitmap(catalog['pybag'].getBitmap()) 2193 self.SetIcon(_icon) 2194 self.sbarSBar.SetStatusWidths([-1]) 2195 2196 self.tBar.SetToolBitmapSize((32, 32)) 2197 self.tBar.Realize() 2198 self.clboxRoots.SetMinSize((132, 63)) 2199 self.clboxRoots.SetToolTipString("Select roots for synchronization") 2200 self.btnSelectRoots.SetToolTipString("Select All, Clear All, Default") 2201 self.label_4.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) 2202 self.cboxAutoAction.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) 2203 self.cboxAutoAction.SetToolTipString("Auto action for conflict recolve") 2204 self.label_5.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) 2205 self.cboxVerbosity.SetToolTipString("Verbosity level") 2206 self.cboxVerbosity.SetSelection(4) 2207 self.chboxEmul.SetValue(1) 2208 self.chboxLogging.SetValue(1) 2209 self.label_7.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) 2210 self.chboxBackupMode.SetMinSize((150, 40)) 2211 self.chboxBackupMode.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) 2212 self.chboxBackupMode.SetToolTipString("Check for full synchronization backup roots") 2213 self.label_19.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) 2214 self.label_18.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) 2215 self.txtFilter.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) 2216 self.txtFilter.SetToolTipString("Press ENTER for refresh list or button below") 2217 self.listFiles.SetToolTipString("Bag files list") 2218 self.lblErrors.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) 2219 self.lblConflicts.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) 2220 self.lblWarnings.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) 2221 self.txtFile.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_MENU)) 2222 self.txtFile.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) 2223 self.txtDesc.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_MENU)) 2224 self.Splitter.SetMinimumPaneSize(20) 2225 # end wxGlade 2226 2227 self.cboxAutoAction.AppendItems([i[0] for i in z_action_choise]) 2228 self.cboxAutoAction.SetSelection(0) 2229 sx,sy = wx.GetDisplaySize() 2230 if sx > 1200: 2231 sx = 1200 + 40 2232 if sy > 700: 2233 sy = 700 + 40 2234 self.SetSize((sx - 40, sy - 40))
2235
2236 - def __do_layout(self):
2237 # begin wxGlade: frmMain_class.__do_layout 2238 sizerMain = wx.BoxSizer(wx.VERTICAL) 2239 sizer_output = wx.BoxSizer(wx.VERTICAL) 2240 sizer_1 = wx.BoxSizer(wx.HORIZONTAL) 2241 sizer_18 = wx.BoxSizer(wx.VERTICAL) 2242 sizerSelDesc = wx.BoxSizer(wx.HORIZONTAL) 2243 sizerSelFile = wx.BoxSizer(wx.HORIZONTAL) 2244 sizerInfo2 = wx.BoxSizer(wx.HORIZONTAL) 2245 sizerInfo1 = wx.BoxSizer(wx.HORIZONTAL) 2246 sizer_29 = wx.BoxSizer(wx.HORIZONTAL) 2247 sizer_30 = wx.BoxSizer(wx.VERTICAL) 2248 sizerAction = wx.BoxSizer(wx.HORIZONTAL) 2249 sizer_23 = wx.BoxSizer(wx.VERTICAL) 2250 sizer_28 = wx.BoxSizer(wx.VERTICAL) 2251 sizer_5 = wx.BoxSizer(wx.VERTICAL) 2252 sizer_7 = wx.BoxSizer(wx.VERTICAL) 2253 grid_sizer_1 = wx.FlexGridSizer(2, 2, 0, 0) 2254 sizer_31 = wx.BoxSizer(wx.VERTICAL) 2255 sizer_31.Add(self.clboxRoots, 1, wx.ALL | wx.EXPAND, 2) 2256 sizer_31.Add(self.btnSelectRoots, 0, wx.EXPAND, 0) 2257 sizer_29.Add(sizer_31, 1, wx.EXPAND, 0) 2258 grid_sizer_1.Add(self.label_4, 0, wx.ALL, 2) 2259 grid_sizer_1.Add(self.cboxAutoAction, 3, wx.ALL | wx.EXPAND, 2) 2260 grid_sizer_1.Add(self.label_5, 0, wx.ALL, 2) 2261 grid_sizer_1.Add(self.cboxVerbosity, 3, wx.ALL | wx.EXPAND, 2) 2262 grid_sizer_1.AddGrowableCol(1) 2263 sizerAction.Add(grid_sizer_1, 3, wx.EXPAND | wx.LEFT | wx.RIGHT, 2) 2264 sizer_7.Add(self.chboxEmul, 0, wx.ALL, 2) 2265 sizer_7.Add(self.chboxLogging, 0, wx.ALL, 2) 2266 sizer_7.Add(self.chboxDebug, 0, wx.ALL, 2) 2267 sizerAction.Add(sizer_7, 0, wx.ALIGN_CENTER | wx.EXPAND | wx.LEFT | wx.RIGHT, 2) 2268 sizer_5.Add(self.label_7, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.LEFT | wx.RIGHT, 2) 2269 sizer_5.Add(self.spinMDDELTA, 1, wx.ALIGN_CENTER, 0) 2270 sizer_5.Add(self.chboxBackupMode, 0, wx.ALIGN_CENTER | wx.LEFT | wx.RIGHT | wx.TOP, 2) 2271 sizerAction.Add(sizer_5, 2, wx.LEFT | wx.RIGHT, 2) 2272 sizer_28.Add(self.label_19, 0, wx.ALL, 2) 2273 sizer_28.Add(self.lblTsDir, 0, wx.ALL, 2) 2274 sizer_28.Add(self.lblTsValueBag, 0, wx.ALL, 2) 2275 sizer_28.Add(self.lblTsValueOrigin, 0, wx.ALL, 2) 2276 sizerAction.Add(sizer_28, 1, wx.EXPAND | wx.LEFT | wx.RIGHT, 2) 2277 sizer_23.Add(self.label_18, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.LEFT | wx.RIGHT, 2) 2278 sizer_23.Add(self.txtFilter, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.EXPAND | wx.RIGHT, 2) 2279 sizer_23.Add(self.btnFilterRefresh, 2, wx.ALIGN_CENTER | wx.ALL, 2) 2280 sizerAction.Add(sizer_23, 2, wx.EXPAND | wx.LEFT | wx.RIGHT, 2) 2281 sizer_30.Add(sizerAction, 0, wx.EXPAND, 0) 2282 sizer_30.Add(self.listFiles, 6, wx.EXPAND, 0) 2283 sizer_29.Add(sizer_30, 8, wx.EXPAND, 0) 2284 sizer_18.Add(sizer_29, 5, wx.EXPAND, 0) 2285 sizerInfo1.Add(self.lblErrors, 1, wx.ALL, 2) 2286 sizerInfo1.Add(self.lblConflicts, 1, wx.ALL, 2) 2287 sizerInfo1.Add(self.lblWarnings, 1, wx.ALL, 2) 2288 sizerInfo1.Add(self.lblAllItems, 1, wx.ALL, 2) 2289 sizerInfo1.Add(self.lblNewBag, 1, wx.ALL, 2) 2290 sizerInfo1.Add(self.lblNewOrig, 1, wx.ALL, 2) 2291 sizer_18.Add(sizerInfo1, 0, wx.ALL | wx.EXPAND, 2) 2292 sizerInfo2.Add(self.lblChangeBag, 1, wx.ALL, 2) 2293 sizerInfo2.Add(self.lblChangeOrig, 1, wx.ALL, 2) 2294 sizerInfo2.Add(self.lblDelBag, 1, wx.ALL, 2) 2295 sizerInfo2.Add(self.lblDelOrig, 1, wx.ALL, 2) 2296 sizerInfo2.Add(self.lblIgnored, 1, wx.ALL, 2) 2297 sizerInfo2.Add(self.lblTimeshifted, 1, wx.ALL, 2) 2298 sizer_18.Add(sizerInfo2, 0, wx.ALL | wx.EXPAND, 2) 2299 sizer_18.Add(self.static_line_1, 0, wx.EXPAND, 0) 2300 sizerSelFile.Add(self.label_1, 0, 0, 0) 2301 sizerSelFile.Add((20, 1), 0, 0, 0) 2302 sizerSelFile.Add(self.txtFile, 1, wx.EXPAND | wx.LEFT, 2) 2303 sizer_18.Add(sizerSelFile, 0, wx.ALL | wx.EXPAND, 2) 2304 sizerSelDesc.Add(self.label_2, 0, 0, 0) 2305 sizerSelDesc.Add((20, 1), 0, 0, 0) 2306 sizerSelDesc.Add(self.txtDesc, 1, wx.EXPAND | wx.LEFT, 2) 2307 sizer_18.Add(sizerSelDesc, 0, wx.ALL | wx.EXPAND, 2) 2308 self.splitPanel1.SetSizer(sizer_18) 2309 label_3 = wx.StaticText(self.splitPanel2, wx.ID_ANY, "Output:") 2310 sizer_1.Add(label_3, 0, wx.ALL, 1) 2311 sizer_1.Add((40, 1), 0, 0, 0) 2312 sizer_1.Add(self.btnClear_copy, 0, 0, 0) 2313 sizer_output.Add(sizer_1, 0, 0, 0) 2314 sizer_output.Add(self.txtOut, 3, wx.ALL | wx.EXPAND, 2) 2315 self.splitPanel2.SetSizer(sizer_output) 2316 self.Splitter.SplitHorizontally(self.splitPanel1, self.splitPanel2) 2317 sizerMain.Add(self.Splitter, 1, wx.EXPAND, 0) 2318 self.SetSizer(sizerMain) 2319 self.Layout() 2320 self.Centre() 2321 # end wxGlade 2322 2323 self.sizerMain = sizerMain 2324 self.sizer_output = sizer_output 2325 self.sizerInfo1 = sizerInfo1 2326 self.sizerInfo2 = sizerInfo2 2327 self.sizerSelDesc = sizerSelDesc 2328 self.sizerSelFile = sizerSelFile 2329 2330 self.lblErrors.SetLabel(u'') 2331 self.lblConflicts.SetLabel(u'') 2332 self.lblWarnings.SetLabel(u'') 2333 self.lblAllItems.SetLabel(u'') 2334 self.lblNewBag.SetLabel(u'') 2335 self.lblNewOrig.SetLabel(u'') 2336 self.lblChangeBag.SetLabel(u'') 2337 self.lblChangeOrig.SetLabel(u'') 2338 self.lblDelBag.SetLabel(u'') 2339 self.lblDelOrig.SetLabel(u'') 2340 self.lblIgnored.SetLabel(u'') 2341 self.lblTimeshifted.SetLabel(u'') 2342 self.sizerMain.Show(self.sizerInfo1,False,True) 2343 self.sizerMain.Show(self.sizerInfo2,False,True) 2344 self.sizerMain.Show(self.sizerSelDesc,False,True) 2345 self.sizerMain.Show(self.sizerSelFile,False,True) 2346 self.sizerMain.Layout()
2347
2348 - def LoadConfig(self):
2349 2350 log(u'frmMain.LoadConfig: read GUI config.') 2351 try: 2352 LoadAppStateFromConfig() 2353 2354 if cfg.Z_CP.has_section(P_GUI): 2355 cfg.WRITECOLSATEXIT = False 2356 if cfg.Z_CP.has_option(P_GUI,P_WRITECOLSATEXIT): 2357 v = cfg.Z_CP.get(P_GUI,P_WRITECOLSATEXIT) 2358 cfg.WRITECOLSATEXIT = bool(int( (v in [u'0', u'1'] and v) or u'0' )) 2359 log(u'frmMain.LoadConfig: set '+P_WRITECOLSATEXIT+u' to %d' % cfg.WRITECOLSATEXIT) 2360 2361 cfg.SHOWTIPS = True 2362 if cfg.Z_CP.has_option(P_GUI,P_SHOWTIPS): 2363 v = cfg.Z_CP.get(P_GUI,P_SHOWTIPS) 2364 cfg.SHOWTIPS = bool(int( (v in [u'0', u'1'] and v) or u'1' )) 2365 log(u'frmMain.LoadConfig: set '+P_SHOWTIPS+u' to %d' % cfg.SHOWTIPS) 2366 2367 cfg.TIPSNUMBER = 0 2368 if cfg.Z_CP.has_option(P_GUI,P_TIPSNUMBER): 2369 v = cfg.Z_CP.get(P_GUI,P_TIPSNUMBER) 2370 try: 2371 cfg.TIPSNUMBER = int(v) 2372 except: 2373 log(u'Wrong tips number "%s".' % z_u(v)) 2374 log(u'frmMain.LoadConfig: set '+P_TIPSNUMBER+u' to %d' % cfg.TIPSNUMBER) 2375 2376 2377 if AppState[P_OUTPUT]: 2378 ##self.Splitter.SplitHorizontally(self.splitPanel1, self.splitPanel2, self.SplitPos) 2379 self.Splitter.SetSashPosition(self.SplitPos) 2380 else: 2381 ##self.SplitPos = self.Splitter.GetSashPosition() 2382 self.Splitter.Unsplit() 2383 2384 except Exception, exc: 2385 log(u'frmMain.LoadConfig: ERROR %s' % str(exc))
2386
2387 - def UpdateRoots(self):
2388 # Update roots list. 2389 rs = cfg.Z_CP.getrootsbag() 2390 self.clboxRoots.Clear() 2391 self.clboxRoots.AppendItems(rs) 2392 self.RootsSelectDefault()
2393
2394 - def RootsSelectAll(self):
2395 c = self.clboxRoots.GetCount() 2396 for i in range(c): 2397 self.clboxRoots.Check(i, True) 2398 self.clboxRoots.SetToolTipString(u'Select roots for synchronization. ' \ 2399 u'Selected %d from %d roots.' % (c,c)) 2400 cfg.IsDBReaded = False 2401 cfg.IsDBSynced = False 2402 cfg.IsDBCompared = False 2403 self.listFiles.Clear()
2404
2405 - def RootsSelectDefault(self):
2406 2407 cnt = self.clboxRoots.GetCount() 2408 s = 0 2409 for i in range(cnt): 2410 rs = self.clboxRoots.GetString(i) 2411 rn = cfg.Z_CP.findroot(rs) 2412 assert rn is not None # Roots from list must exists. 2413 seldef = cfg.Z_CP.getopt(rn, P_SELECTDEFAULT, False, P_SELECTDEFAULTNO) 2414 seldef = seldef==P_SELECTDEFAULTYES 2415 if seldef: 2416 self.clboxRoots.Check(i, True) 2417 #prt1(u'\tRoot "%s" marked.' % rn) 2418 s = s + 1 2419 else: 2420 self.clboxRoots.Check(i, False) 2421 #prt1(u'\tRoot "%s" unselect.' % rn) 2422 self.clboxRoots.SetToolTipString(u'Select roots for synchronization. ' \ 2423 u'Selected %d from %d roots.' % (s,cnt)) 2424 cfg.IsDBReaded = False 2425 cfg.IsDBSynced = False 2426 cfg.IsDBCompared = False 2427 self.listFiles.Clear()
2428
2429 - def RootsUnselectAll(self):
2430 c = self.clboxRoots.GetCount() 2431 for i in range(c): 2432 self.clboxRoots.Check(i, False) 2433 self.clboxRoots.SetToolTipString(u'Select roots for synchronization. ' \ 2434 u'Selected %d from %d roots.' % (0,c)) 2435 cfg.IsDBReaded = False 2436 cfg.IsDBSynced = False 2437 cfg.IsDBCompared = False 2438 self.listFiles.Clear()
2439
2440 - def clboxRoots_toggled(self, event):
2441 s = 0 2442 c = self.clboxRoots.GetCount() 2443 for i in range(c): 2444 if self.clboxRoots.IsChecked(i): 2445 s += 1 2446 self.clboxRoots.SetToolTipString(u'Select roots for synchronization. ' \ 2447 u'Selected %d from %d roots.' % (s,c)) 2448 cfg.IsDBReaded = False 2449 cfg.IsDBSynced = False 2450 cfg.IsDBCompared = False 2451 self.listFiles.Clear()
2452
2453 - def mnuFileCompare_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2454 self.tBarCompare_handler(event)
2455
2456 - def mnuFileSync_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2457 self.tBarSync_handler(event) 2458
2459 - def mnuFileAdd_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2460 self.tBarAddRoot_handler(event) 2461
2462 - def mnuFileRemove_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2463 try: 2464 cfg.IsDBReaded = False 2465 cfg.IsDBCompared = False 2466 cfg.IsDBSynced = False 2467 self.listFiles.Clear() 2468 self.TSReset() 2469 rs = cfg.Z_CP.getrootsbag() 2470 if len(rs) > 0: 2471 rs.sort() 2472 r = wx.GetSingleChoice(u'Select root for deleteing.',u'Delete root',rs) 2473 if r: 2474 cmd = command_class() 2475 setattr(cmd,u'fs',[r]) 2476 cmd_remove(cmd) 2477 except Exception,exc: 2478 prt0(u'ERROR in program %s.' % (traceback.format_exc(),),place=u'frmMain.tBarRmRoot_handler', 2479 error=exc) 2480 cfg.Z_CP = z_gp_class() 2481 cfg.Z_CP.load() 2482 self.UpdateRoots() 2483 event.Skip(False) 2484
2485 - def mnuFileDist_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2486 ar1 = [u'Initialize', u'Copy additional files', u'Initialize and copy files'] 2487 s = wx.GetSingleChoice(u'Select needed actions and in next step you can select path and roots.', 2488 u'Distribute PYBAG',ar1) 2489 if s != u'': 2490 cmd = command_class() 2491 setattr(cmd,u'fs',[]) 2492 setattr(cmd,u'i',[]) 2493 setattr(cmd,u'z',[]) 2494 setattr(cmd,u'a',[]) 2495 setattr(cmd,u'r',[]) 2496 if s == u'Initialize': 2497 setattr(cmd,u'i',[u'']) 2498 dbg(u'frmMain.mnuFileDist_handler: -i') 2499 elif s == u'Copy additional files': 2500 setattr(cmd,u'z',[u'']) 2501 dbg(u'frmMain.mnuFileDist_handler: -z') 2502 elif s == u'Initialize and copy files': 2503 setattr(cmd,u'z',[u'']) 2504 setattr(cmd,u'i',[u'']) 2505 dbg(u'frmMain.mnuFileDist_handler: -z -i') 2506 # Select path. 2507 path = wx.DirSelector(u'Select path to distribute PYBAG.') 2508 dbg(u'frmMain.mnuFileDist_handler: path="%s"' % (path,)) 2509 if path: 2510 # Select root. 2511 setattr(cmd,u'fs',[path]) 2512 rs = cfg.Z_CP.getrootsbag() 2513 rs.sort() 2514 dlg = wx.MultiChoiceDialog(self, u'Select roots to distibute or none.',u'Distribute PYBAG',rs) 2515 ret = dlg.ShowModal() 2516 if ret == wx.ID_OK: 2517 # Process. 2518 sr = dlg.GetSelections() 2519 for i in sr: 2520 cmd.r.append(rs[i]) 2521 dbg(u'frmMain.mnuFileDist_handler: roots="%s"' % (str(cmd.r),)) 2522 cmd_dist(cmd) 2523 del dlg 2524 event.Skip(False) 2525
2526 - def mnuFileSaveOut_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2527 dlg = wx.FileDialog(self, u'Select a file.', style=wx.FD_SAVE) 2528 r = dlg.ShowModal() 2529 if r == wx.ID_OK: 2530 # Save. 2531 path = dlg.GetPath() 2532 f = None 2533 try: 2534 f = codecs.open(path,'w', 'utf_8', 'strict', 0) 2535 txt = self.txtOut.GetValue() 2536 2537 f.write(txt) 2538 except Exception,exc: 2539 prt0(u'ERROR in programm: %s.' % (traceback.format_exc(),),place=u'frmMain.mnuFileSaveOut_handler', 2540 error=exc) 2541 finally: 2542 if f: 2543 f.close() 2544 del dlg 2545 event.Skip(False) 2546
2547 - def mnuFileExit_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2548 self.Close() 2549 event.Skip(False) 2550
2551 - def mnuViewOut_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2552 r = not AppState['output'] 2553 dbg(u'mnuViewOut_handler: Show output = %s.' % (r,)) 2554 AppState['output'] = r 2555 if r: 2556 self.Splitter.SplitHorizontally(self.splitPanel1, self.splitPanel2, self.SplitPos) 2557 else: 2558 self.SplitPos = self.Splitter.GetSashPosition() 2559 self.Splitter.Unsplit() 2560 event.Skip(False) 2561
2562 - def mnuViewLogging_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2563 cfg.PYBAG_LOG = not cfg.PYBAG_LOG 2564 event.Skip(False) 2565
2566 - def mnuViewDebug_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2567 cfg.PYBAG_DEBUG = not cfg.PYBAG_DEBUG 2568 event.Skip(False) 2569
2570 - def mnuViewVerbNo_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2571 cfg.VERBOSE = -1 2572 self.cboxVerbosity_updateui() 2573 event.Skip(False) 2574
2575 - def mnuViewVerb0_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2576 cfg.VERBOSE = 0 2577 self.cboxVerbosity_updateui() 2578 event.Skip(False) 2579
2580 - def mnuViewVerb1_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2581 cfg.VERBOSE = 1 2582 self.cboxVerbosity_updateui() 2583 event.Skip(False) 2584
2585 - def mnuViewVerb2_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2586 cfg.VERBOSE = 2 2587 self.cboxVerbosity_updateui() 2588 event.Skip(False) 2589
2590 - def mnuViewVerb3_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2591 cfg.VERBOSE = 3 2592 self.cboxVerbosity_updateui() 2593 event.Skip(False) 2594
2595 - def mnuViewVerb4_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2596 cfg.VERBOSE = 4 2597 self.cboxVerbosity_updateui() 2598 event.Skip(False) 2599
2600 - def mnuViewVerb5_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2601 cfg.VERBOSE = 5 2602 self.cboxVerbosity_updateui() 2603 event.Skip(False) 2604
2605 - def mnuOptionsPrefs_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2606 cfg.IsDBReaded = False 2607 cfg.IsDBCompared = False 2608 cfg.IsDBSynced = False 2609 self.listFiles.Clear() 2610 self.TSReset() 2611 self.dlgPrefs.ShowModal() 2612 # Reload configuration. 2613 cfg.Z_CP = z_gp_class() 2614 cfg.Z_CP.load() 2615 if AppState[P_OUTPUT]: 2616 ##self.Splitter.SplitHorizontally(self.splitPanel1, self.splitPanel2, self.SplitPos) 2617 self.Splitter.SetSashPosition(self.SplitPos) 2618 else: 2619 ##self.SplitPos = self.Splitter.GetSashPosition() 2620 self.Splitter.Unsplit() 2621 if cfg.Z_CP.has_section(P_GUI): 2622 if cfg.Z_CP.has_option(P_GUI,P_WRITECOLSATEXIT): 2623 cfg.WRITECOLSATEXIT = bool(int(cfg.Z_CP.get(P_GUI,P_WRITECOLSATEXIT))) 2624 self.listFiles.RefreshColumns() 2625 event.Skip(False) 2626
2627 - def mnuHelpAbout_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2628 s = u'Python version: %s\nwxPython version: %s\n\n%s' % (sys.version,wx.version(), 2629 TermColors.skipTags(__about__)) 2630 2631 self.InfoDlg.txtInfo.SetValue(s) 2632 self.InfoDlg.ShowModal() 2633 event.Skip(False) 2634
2635 - def mnuHelpUsage_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2636 self.InfoDlg.txtInfo.SetValue(TermColors.skipTags(_usage)) 2637 self.InfoDlg.ShowModal() 2638 event.Skip(False) 2639
2640 - def tBarCompare_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2641 log(u'frmMain.tBarCompare_handler: start') 2642 cfg.BACKUPMODE = self.chboxBackupMode.IsChecked() 2643 if not cfg.LOCK[LI_FILTERRUNNING]: 2644 prt0(u'Backup mode is %s' % int(cfg.BACKUPMODE)) 2645 self.listFiles.Clear() 2646 self.StartWork(self.do_compare, self.do_compare2) 2647 else: 2648 wx.MessageBox(u'Filtering is running. Try more later.', u'Filtering.') 2649 log(u'frmMain.tBarCompare_handler: end') 2650 event.Skip(False) 2651
2652 - def tBarSync_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2653 log(u'frmMain.tBarSync_handler: start') 2654 cfg.BACKUPMODE = self.chboxBackupMode.IsChecked() 2655 if not cfg.LOCK[LI_FILTERRUNNING]: 2656 prt0(u'Backup mode is %s' % int(cfg.BACKUPMODE)) 2657 self.listFiles.Clear() 2658 self.StartWork(self.do_sync, self.do_sync2) 2659 else: 2660 wx.MessageBox(u'Filtering is running. Try more later.', u'Filtering.') 2661 log(u'frmMain.tBarSync_handler: end') 2662 event.Skip(False) 2663
2664 - def tBarAddRoot_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2665 try: 2666 cfg.IsDBReaded = False 2667 cfg.IsDBCompared = False 2668 cfg.IsDBSynced = False 2669 self.listFiles.Clear() 2670 self.TSReset() 2671 self.dlgAddRoot.ShowModal() 2672 except Exception,exc: 2673 prt0(u'ERROR in program %s.' % (traceback.format_exc(),),place=u'frmMain.tBarAddRoot_handler', 2674 error=exc) 2675 cfg.Z_CP = z_gp_class() 2676 cfg.Z_CP.load() 2677 self.UpdateRoots() 2678 event.Skip(False) 2679
2680 - def tBarForceUnchanged_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2681 log(u'frmMain.tBarForceUnchanged_handler: start') 2682 if cfg.IsDBCompared: 2683 global ForceAction, ForceKs, ForceRet 2684 ForceAction = u'skip' 2685 ForceKs = self.listFiles.GetSelectionKeys() 2686 self.StartWork(self.set_force, self.set_force2) 2687 log(u'frmMain.tBarForceUnchanged_handler: end') 2688 event.Skip(False) 2689
2690 - def tBarForceBag_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2691 log(u'frmMain.tBarForceBag_handler: start') 2692 if cfg.IsDBCompared: 2693 global ForceAction, ForceKs, ForceRet 2694 ForceAction = u'bag' 2695 ForceKs = self.listFiles.GetSelectionKeys() 2696 self.StartWork(self.set_force, self.set_force2) 2697 log(u'frmMain.tBarForceBag_handler: end') 2698 event.Skip(False) 2699
2700 - def tBarForceOrig_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2701 log(u'frmMain.tBarForceOrig_handler: start') 2702 if cfg.IsDBCompared: 2703 global ForceAction, ForceKs, ForceRet 2704 ForceAction = u'origin' 2705 ForceKs = self.listFiles.GetSelectionKeys() 2706 self.StartWork(self.set_force, self.set_force2) 2707 log(u'frmMain.tBarForceOrig_handler: end') 2708 event.Skip(False) 2709
2710 - def tBarForceDel_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2711 log(u'frmMain.tBarForceDel_handler: start') 2712 if cfg.IsDBCompared: 2713 global ForceAction, ForceKs, ForceRet 2714 ForceAction = u'delete' 2715 ForceKs = self.listFiles.GetSelectionKeys() 2716 self.StartWork(self.set_force, self.set_force2) 2717 log(u'frmMain.tBarForceDel_handler: end') 2718 event.Skip(False) 2719
2720 - def tBarForceRestore_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2721 log(u'frmMain.tBarForceRestore_handler: start') 2722 if cfg.IsDBCompared: 2723 global ForceAction, ForceKs, ForceRet 2724 ForceAction = u'restore' 2725 ForceKs = self.listFiles.GetSelectionKeys() 2726 self.StartWork(self.set_force, self.set_force2) 2727 log(u'frmMain.tBarForceRestore_handler: end') 2728 event.Skip(False) 2729
2730 - def cboxAutoAction_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2731 event.Skip() 2732
2733 - def cboxVerbosity_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2734 log(u'frmMain.cboxVerbosity_handler: start') 2735 d = self.cboxVerbosity.GetSelection() 2736 cfg.VERBOSE = d - 1 2737 prt(u'Set verbosity level to "%d"' % (cfg.VERBOSE,)) #, cfg.VERBOSE=-1) 2738 log(u'frmMain.cboxVerbosity_handler: end') 2739 event.Skip() 2740
2741 - def chboxDebug_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2742 log(u'frmMain.chboxDebug_handler: start') 2743 cfg.PYBAG_DEBUG = self.chboxDebug.GetValue() 2744 prt3(u'Debug level changed to "%s".' % (cfg.PYBAG_DEBUG,)) 2745 log(u'frmMain.chboxDebug_handler: end') 2746 event.Skip() 2747
2748 - def mnuViewEmul_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2749 cfg.PYBAG_EMUL = not cfg.PYBAG_EMUL 2750 prt3(u'Emulation level changed to "%s".' % (cfg.PYBAG_EMUL,)) 2751 event.Skip(False) 2752
2753 - def chboxEmul_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2754 log(u'frmMain.chboxEmul_handler: start') 2755 cfg.PYBAG_EMUL = self.chboxEmul.GetValue() 2756 prt3(u'Emulation level changed to "%s".' % (cfg.PYBAG_EMUL,)) 2757 log(u'frmMain.chboxEmul_handler: end') 2758 event.Skip(False) 2759
2760 - def chboxLogging_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2761 log(u'frmMain.chboxLogging_handler: start') 2762 cfg.PYBAG_LOG = self.chboxLogging.GetValue() 2763 prt3(u'Logging level changed to "%s".' % (cfg.PYBAG_LOG,)) 2764 log(u'frmMain.chboxLogging_handler: end') 2765 event.Skip(False) 2766
2767 - def spinMDDELTA_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2768 log(u'frmMain.spinMDDELTA_handler: start') 2769 cfg.MDDELTA = float(self.spinMDDELTA.GetValue()) 2770 prt3(u'MDDELTA changed to "%s".' % (cfg.MDDELTA,)) 2771 log(u'frmMain.spinMDDELTA_handler: end') 2772 event.Skip(False) 2773
2774 - def frmMain_Close_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2775 log(u'frmMain.Close_handler: start') 2776 cfg.LOCK[LI_CANCEL] = True 2777 # Pause 1 sec - allow thread exit if running. 2778 wx.Yield() 2779 try: 2780 if self.timer and self.timer.IsRunning(): 2781 self.timer.Stop() 2782 except Exception, exc: 2783 log(u'frmMain_Close_handler: ERROR %s' % str(exc)) 2784 wx.Yield() 2785 if self.progress: 2786 self.progress.Destroy() 2787 self.progress = None 2788 try: 2789 if cfg.WRITECOLSATEXIT: 2790 WriteCols2Config(cfg.Z_COLUMN_CHOISE) 2791 if not cfg.Z_CP.has_section(P_GUI): 2792 cfg.Z_CP.add_section(P_GUI) 2793 cfg.Z_CP.set(P_GUI, P_SHOWTIPS, str(int(cfg.SHOWTIPS))) 2794 cfg.Z_CP.set(P_GUI, P_WRITECOLSATEXIT, str(int(cfg.WRITECOLSATEXIT))) 2795 cfg.Z_CP.set(P_GUI, P_TIPSNUMBER, str(cfg.TIPSNUMBER)) 2796 cfg.Z_CP.save() 2797 except Exception, exc: 2798 log(u'frmMain_close: ERROR %s' % str(exc)) 2799 try: 2800 sys.stdout = self._sys_stdout 2801 del self._outstream 2802 except: 2803 pass 2804 self.Hide() # Because for huge bags more long window not hidded, ? clean memory ? 2805 log(u'frmMain.Close_handler: end') 2806 event.Skip() 2807
2808 - def btnClear_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2809 self.txtOut.Clear() 2810 event.Skip(False) 2811
2812 - def mnuViewClearout_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2813 self.btnClear_handler(event) 2814 event.Skip(False) 2815
2816 - def mnuViewDebug_updateui(self,event):
2817 event.Check(cfg.PYBAG_DEBUG)
2818
2819 - def mnuViewEmul_updateui(self,event):
2820 event.Check(cfg.PYBAG_EMUL)
2821
2822 - def mnuViewLogging_updateui(self,event):
2823 event.Check(cfg.PYBAG_LOG)
2824
2825 - def mnuViewOut_updateui(self,event):
2826 event.Check(AppState['output'])
2827
2828 - def mnuAction_updateui(self,event):
2829 event.Enable(cfg.IsDBCompared and not cfg.IsDBSynced)
2830
2831 - def mnuFilterOk_updateui(self,event):
2832 event.Check(AppState['ff_ok'])
2833
2834 - def mnuFilterWarn_updateui(self,event):
2835 event.Check(AppState['ff_warn'])
2836
2837 - def mnuFilterConf_updateui(self,event):
2838 event.Check(AppState['ff_conf'])
2839
2840 - def mnuFilterErr_updateui(self,event):
2841 event.Check(AppState['ff_err'])
2842
2843 - def mnuFilterBag_updateui(self,event):
2844 event.Check(AppState['ff_bag'])
2845
2846 - def mnuFilterOrig_updateui(self,event):
2847 event.Check(AppState['ff_orig'])
2848
2849 - def mnuFilterNew_updateui(self,event):
2850 event.Check(AppState['ff_new'])
2851
2852 - def mnuFilterDel_updateui(self,event):
2853 event.Check(AppState['ff_del'])
2854
2855 - def mnuFilterIgn_updateui(self,event):
2856 event.Check(AppState['ff_ign'])
2857
2858 - def mnuFilterCh_updateui(self,event):
2859 event.Check(AppState['ff_ch'])
2860
2861 - def mnuFilterUnch_updateui(self,event):
2862 event.Check(AppState['ff_unch'])
2863
2864 - def mnuFilterForced_updateui(self,event):
2865 event.Check(AppState['ff_forced'])
2866
2867 - def mnuFilterFile_updateui(self,event):
2868 event.Check(AppState['ff_file'])
2869
2870 - def mnuFilterDir_updateui(self,event):
2871 event.Check(AppState['ff_dir'])
2872
2873 - def mnuFilterSym_updateui(self,event):
2874 event.Check(AppState['ff_sym'])
2875
2876 - def mnuFilterUnk_updateui(self,event):
2877 event.Check(AppState['ff_unk'])
2878
2879 - def mnuFilterTs_updateui(self,event):
2880 event.Check(AppState['ff_ts'])
2881
2882 - def mnuViewVerbNo_updateui(self,event):
2883 event.Check(cfg.VERBOSE < 0)
2884
2885 - def mnuViewVerb0_updateui(self,event):
2886 event.Check(cfg.VERBOSE == 0)
2887
2888 - def mnuViewVerb1_updateui(self,event):
2889 event.Check(cfg.VERBOSE == 1)
2890
2891 - def mnuViewVerb2_updateui(self,event):
2892 event.Check(cfg.VERBOSE == 2)
2893
2894 - def mnuViewVerb3_updateui(self,event):
2895 event.Check(cfg.VERBOSE == 3)
2896
2897 - def mnuViewVerb4_updateui(self,event):
2898 event.Check(cfg.VERBOSE == 4)
2899
2900 - def mnuViewVerb5_updateui(self,event):
2901 event.Check(cfg.VERBOSE == 5)
2902
2903 - def chboxDebug_updateui(self,event):
2904 event.Check(cfg.PYBAG_DEBUG)
2905
2906 - def chboxEmul_updateui(self,event):
2907 self.chboxEmul.SetValue(cfg.PYBAG_EMUL)
2908
2909 - def chboxLogging_updateui(self,event):
2910 self.chboxLogging.SetValue(cfg.PYBAG_LOG)
2911
2912 - def lblTs_updateui(self,event = None):
2913 if cfg.TSDIR == TSDIRBAG: 2914 d = u'Bag' 2915 elif cfg.TSDIR == TSDIRORIG: 2916 d = u'Origin' 2917 else: 2918 d = u'None' 2919 self.lblTsDir.SetLabel(d) 2920 self.lblTsValueBag.SetLabel(u'b:%s' % str(cfg.TSBAG)) 2921 self.lblTsValueOrigin.SetLabel(u'o:%s' % str(cfg.TSORIG))
2922
2923 - def cboxVerbosity_updateui(self):
2924 # Must call from menu command. 2925 r = cfg.VERBOSE 2926 r += 1 2927 self.cboxVerbosity.SetSelection(r) 2928 prt(u'Set verbosity level to "%d"' % (cfg.VERBOSE,)) #, cfg.VERBOSE=-1)
2929
2930 - def mnuFileRead_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2931 cfg.IsDBReaded = False 2932 self.tBarCompare_handler(event) 2933 ##event.Skip(False) 2934
2935 - def mnuOptionsStat_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2936 # x-XXX KLUDGE Clear DB because in process DB is reset(??? in 0.4.0 not reset) 2937 # and OnGetItemText ... fail find keay in DB... 2938 # I am can not find where problem ... 2939 cfg.IsDBReaded = False 2940 cfg.IsDBSynced = False 2941 cfg.IsDBCompared = False 2942 self.listFiles.Clear() 2943 self._stat_info = u'' 2944 self.StartWork(self.do_stat, self.do_stat2) 2945 event.Skip(False) 2946
2947 - def mnuAboutLicense_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2948 self.InfoDlg.txtInfo.SetValue(TermColors.skipTags(__license__)) 2949 self.InfoDlg.ShowModal() 2950 event.Skip(False) 2951
2952 - def mnuFileRelocate_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2953 rs = cfg.Z_CP.getrootsbag() 2954 rs.sort() 2955 root = wx.GetSingleChoice(u'Select root for relocate.', 2956 u'Relocate',rs) 2957 if rs: 2958 rn = cfg.Z_CP.findroot(root) 2959 if rn: 2960 f = cfg.Z_CP.getrootsflag(rn) 2961 if f == DBFLAGDIR: 2962 path = wx.DirSelector(u'Select new root origin location') 2963 else: 2964 path = wx.FileSelector(u'Select new root origin location') 2965 if path: 2966 cmd = command_class() 2967 setattr(cmd,u'fs',[]) 2968 setattr(cmd,u'r',[root + u'=' + path]) 2969 # x-XXX WAS "self." but may be "cfg." 2970 cfg.IsDBReaded = False 2971 cfg.IsDBCompared = False 2972 cfg.IsDBSynced = False 2973 self.listFiles.Clear() 2974 cmd_relocate(cmd) 2975 cfg.Z_CP = z_gp_class() 2976 cfg.Z_CP.load() 2977 event.Skip(False) 2978
2979 - def Splitter_dclick_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2980 self.SplitPos = self.Splitter.GetSashPosition() 2981 AppState['output'] = False 2982 self.Splitter.Unsplit() 2983 event.Skip() 2984 2985
2986 - def listFiles_item_selected_handler(self, event): # wxGlade: frmMain_class.<event_handler>
2987 try: 2988 itemid = self.listFiles.GetFocusedItem() 2989 ##dbg(u'listFiles_item_selected_handler: (%d)' % (itemid,)) 2990 if itemid > -1: 2991 vdb = cfg.Z_DB[self.listFiles.ks[itemid]] 2992 # Change info 2993 desc = vdb[DBDESC] + vdb[DBDESCMAN] 2994 _file = vdb[DBDBPATH] 2995 self.txtFile.SetValue(_file) 2996 self.txtDesc.SetValue(desc) 2997 else: 2998 self.txtFile.SetValue(u'') 2999 self.txtDesc.SetValue(u'') 3000 except Exception, exc: 3001 log(u'listFiles_item_selected_handler: (%d) ERROR "%s"' % (itemid,str(exc))) 3002 event.Skip() 3003
3004 - def listFiles_col_rclick_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3005 # Context listFiles menu 3006 self.colidrclicked = event.GetColumn() 3007 self.PopupMenu(self.mnuctxrcol) 3008 event.Skip() 3009
3010 - def listFiles_col_click_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3011 # XXX Implement col click handler. 3012 log("Event handler `listFiles_col_click_handler' not implemented") 3013 event.Skip() 3014
3015 - def mnuActionBag_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3016 self.tBarForceBag_handler(event) 3017
3018 - def mnuActionOrig_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3019 self.tBarForceOrig_handler(event) 3020
3021 - def mnuActionDel_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3022 self.tBarForceDel_handler(event) 3023
3024 - def mnuActionUnch_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3025 self.tBarForceUnchanged_handler(event) 3026
3027 - def mnuActionRestore_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3028 self.tBarForceRestore_handler(event) 3029
3030 - def mnuActionTsbag_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3031 log(u'frmMain.mnuActionTsbag_handler: start') 3032 if cfg.IsDBCompared: 3033 try: 3034 sk = self.listFiles.GetSelectionKeys() 3035 if sk: 3036 sk = sk[0] 3037 # Change TS 3038 vdb = cfg.Z_DB[sk] 3039 # Only for all readed and files. 3040 rd = vdb[DBBAGREAD] and vdb[DBDBREAD] and vdb[DBORIGREAD] and (vdb[DBDBFLAG]==DBFLAGFILE) 3041 mdb = vdb[DBDBMDATE] - vdb[DBBAGMDATE] 3042 mdo = vdb[DBDBMDATE] - vdb[DBORIGMDATE] 3043 if abs(mdb) <= cfg.MDDELTA: 3044 mdb = 0.0 3045 if abs(mdo) <= cfg.MDDELTA: 3046 mdo = 0.0 3047 if rd: 3048 if mdb: 3049 cfg.TSBAG = mdb 3050 cfg.TSORIG = 0.0 3051 cfg.TSDIR = TSDIRBAG 3052 elif mdo: 3053 cfg.TSORIG = mdo 3054 cfg.TSBAG = 0.0 3055 cfg.TSDIR = TSDIRBAG 3056 else: 3057 # Not shift detected. 3058 cfg.TSBAG = 0.0 3059 cfg.TSORIG = 0.0 3060 cfg.TSDIR = TSDIRNONE 3061 prt4(u'Set TSBAG=%f, TSORIG=%f, TSDIR=%s.' % (cfg.TSBAG, cfg.TSORIG, [u'None',u'Bag',u'Origin'][cfg.TSDIR])) 3062 # Compare again 3063 self.tBarCompare_handler(event) 3064 except Exception, exc: 3065 log(u'frmMain.mnuActionTsbag_handler: ERROR: %s' % str(exc)) 3066 self.lblTs_updateui() 3067 log(u'frmMain.mnuActionTsbag_handler: end') 3068 event.Skip(False) # Stop event search. 3069
3070 - def mnuActionTsorig_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3071 log(u'frmMain.mnuActionTsorig_handler: start') 3072 if cfg.IsDBCompared: 3073 try: 3074 sk = self.listFiles.GetSelectionKeys() 3075 if sk: 3076 sk = sk[0] 3077 # Change TS 3078 vdb = cfg.Z_DB[sk] 3079 # Only for all readed and files. 3080 rd = vdb[DBBAGREAD] and vdb[DBDBREAD] and vdb[DBORIGREAD] and (vdb[DBDBFLAG]==DBFLAGFILE) 3081 mdb = vdb[DBDBMDATE] - vdb[DBBAGMDATE] 3082 mdo = vdb[DBDBMDATE] - vdb[DBORIGMDATE] 3083 if abs(mdb) <= cfg.MDDELTA: 3084 mdb = 0.0 3085 if abs(mdo) <= cfg.MDDELTA: 3086 mdo = 0.0 3087 if rd: 3088 if mdb: 3089 cfg.TSBAG = mdb 3090 cfg.TSORIG = 0.0 3091 cfg.TSDIR = TSDIRORIG 3092 elif mdo: 3093 cfg.TSORIG = mdo 3094 cfg.TSBAG = 0.0 3095 cfg.TSDIR = TSDIRORIG 3096 else: 3097 # Not shift detected. 3098 cfg.TSBAG = 0.0 3099 cfg.TSORIG = 0.0 3100 cfg.TSDIR = TSDIRNONE 3101 prt4(u'Set TSBAG=%f, TSORIG=%f, TSDIR=%s.' % (cfg.TSBAG, cfg.TSORIG, [u'None',u'Bag',u'Origin'][cfg.TSDIR])) 3102 # Compare again 3103 self.tBarCompare_handler(event) 3104 except Exception, exc: 3105 log(u'frmMain.mnuActionTsbag_handler: ERROR: %s' % str(exc)) 3106 self.lblTs_updateui() 3107 log(u'frmMain.mnuActionTsorig_handler: end') 3108 event.Skip(False) # Stop event search. 3109
3110 - def TSReset(self):
3111 # Change TS 3112 cfg.TSBAG = 0.0 3113 cfg.TSORIG = 0.0 3114 cfg.TSDIR = TSDIRNONE 3115 self.lblTs_updateui() 3116 prt4(u'Reset time shift.')
3117
3118 - def mnuActionTsreset_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3119 log(u'frmMain.mnuActionTsreset_handler: start') 3120 if cfg.IsDBCompared: 3121 try: 3122 self.TSReset() 3123 # Compare again 3124 self.tBarCompare_handler(event) 3125 except Exception, exc: 3126 log(u'frmMain.mnuActionTsbag_handler: ERROR: %s' % str(exc)) 3127 log(u'frmMain.mnuActionTsreset_handler: end') 3128 event.Skip(False) # Stop event search. 3129
3130 - def mnuFilterOk_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3131 AppState['ff_ok'] = not AppState['ff_ok'] 3132 log(u'mnuFilterOk_handler: %d' % int(AppState['ff_ok'])) 3133 cfg.LOCK[LI_UPDATEFILTER] = True 3134 self.listFiles.FilterKeys() 3135
3136 - def mnuFilterWarn_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3137 AppState['ff_warn'] = not AppState['ff_warn'] 3138 log(u'mnuFilterWarn_handler: %d' % int(AppState['ff_warn'])) 3139 cfg.LOCK[LI_UPDATEFILTER] = True 3140 self.listFiles.FilterKeys() 3141
3142 - def mnuFilterConf_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3143 AppState['ff_conf'] = not AppState['ff_conf'] 3144 log(u'mnuFilterConf_handler: %d' % int(AppState['ff_conf'])) 3145 cfg.LOCK[LI_UPDATEFILTER] = True 3146 self.listFiles.FilterKeys() 3147
3148 - def mnuFilterErr_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3149 AppState['ff_err'] = not AppState['ff_err'] 3150 log(u'mnuFilterErr_handler: %d' % int(AppState['ff_err'])) 3151 cfg.LOCK[LI_UPDATEFILTER] = True 3152 self.listFiles.FilterKeys() 3153
3154 - def mnuFilterBag_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3155 AppState['ff_bag'] = not AppState['ff_bag'] 3156 log(u'mnuFilterBag_handler: %d' % int(AppState['ff_bag'])) 3157 cfg.LOCK[LI_UPDATEFILTER] = True 3158 self.listFiles.FilterKeys() 3159
3160 - def mnuFilterOrig_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3161 AppState['ff_orig'] = not AppState['ff_orig'] 3162 log(u'mnuFilterOrig_handler: %d' % int(AppState['ff_orig'])) 3163 cfg.LOCK[LI_UPDATEFILTER] = True 3164 self.listFiles.FilterKeys() 3165
3166 - def mnuFilterNew_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3167 AppState['ff_new'] = not AppState['ff_new'] 3168 log(u'mnuFilterNew_handler: %d' % int(AppState['ff_new'])) 3169 cfg.LOCK[LI_UPDATEFILTER] = True 3170 self.listFiles.FilterKeys() 3171
3172 - def mnuFilterCh_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3173 AppState['ff_ch'] = not AppState['ff_ch'] 3174 log(u'mnuFilterCh_handler: %d' % int(AppState['ff_ch'])) 3175 cfg.LOCK[LI_UPDATEFILTER] = True 3176 self.listFiles.FilterKeys() 3177
3178 - def mnuFilterDel_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3179 AppState['ff_del'] = not AppState['ff_del'] 3180 log(u'mnuFilterDel_handler: %d' % int(AppState['ff_del'])) 3181 cfg.LOCK[LI_UPDATEFILTER] = True 3182 self.listFiles.FilterKeys() 3183
3184 - def mnuFilterIgn_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3185 AppState['ff_ign'] = not AppState['ff_ign'] 3186 log(u'mnuFilterIgn_handler: %d' % int(AppState['ff_ign'])) 3187 cfg.LOCK[LI_UPDATEFILTER] = True 3188 self.listFiles.FilterKeys() 3189
3190 - def mnuFilterUnch_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3191 AppState['ff_unch'] = not AppState['ff_unch'] 3192 log(u'mnuFilterUnch_handler: %d' % int(AppState['ff_unch'])) 3193 cfg.LOCK[LI_UPDATEFILTER] = True 3194 self.listFiles.FilterKeys() 3195
3196 - def mnuFilterForced_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3197 AppState['ff_forced'] = not AppState['ff_forced'] 3198 log(u'mnuFilterForced_handler: %d' % int(AppState['ff_forced'])) 3199 cfg.LOCK[LI_UPDATEFILTER] = True 3200 self.listFiles.FilterKeys() 3201
3202 - def mnuFilterFile_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3203 AppState['ff_file'] = not AppState['ff_file'] 3204 log(u'mnuFilterFile_handler: %d' % int(AppState['ff_file'])) 3205 cfg.LOCK[LI_UPDATEFILTER] = True 3206 self.listFiles.FilterKeys() 3207
3208 - def mnuFilterDir_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3209 AppState['ff_dir'] = not AppState['ff_dir'] 3210 log(u'mnuFilterDir_handler: %d' % int(AppState['ff_dir'])) 3211 cfg.LOCK[LI_UPDATEFILTER] = True 3212 self.listFiles.FilterKeys() 3213
3214 - def mnuFilterSym_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3215 AppState['ff_sym'] = not AppState['ff_sym'] 3216 log(u'mnuFilterSym_handler: %d' % int(AppState['ff_sym'])) 3217 cfg.LOCK[LI_UPDATEFILTER] = True 3218 self.listFiles.FilterKeys() 3219
3220 - def mnuFilterUnk_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3221 AppState['ff_unk'] = not AppState['ff_unk'] 3222 log(u'mnuFilterUnk_handler: %d' % int(AppState['ff_unk'])) 3223 cfg.LOCK[LI_UPDATEFILTER] = True 3224 self.listFiles.FilterKeys() 3225
3226 - def mnuFilterTs_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3227 AppState['ff_ts'] = not AppState['ff_ts'] 3228 log(u'mnuFilterTs_handler: %d' % int(AppState['ff_ts'])) 3229 cfg.LOCK[LI_UPDATEFILTER] = True 3230 self.listFiles.FilterKeys() 3231
3232 - def txtFilter_enter_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3233 self.btnFilterRefresh_handler(event) 3234 ##event.Skip() 3235
3236 - def txtFilter_text_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3237 r = self.PattCMP() 3238 if not self.BackColor: 3239 self.BackColor = self.txtFilter.GetBackgroundColour() 3240 self.ForeColor = self.txtFilter.GetForegroundColour() 3241 if r: 3242 self.txtFilter.SetBackgroundColour(self.BackColor) 3243 self.txtFilter.SetForegroundColour(self.ForeColor) 3244 self.txtFilter.Refresh(True) 3245 else: 3246 self.txtFilter.SetBackgroundColour(self.ForeColor) 3247 self.txtFilter.SetForegroundColour(self.BackColor) 3248 self.txtFilter.Refresh(True) 3249 event.Skip() 3250
3251 - def chboxBackupMode_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3252 log(u'chboxBackupMode_handler: Backup mode changed to %s' % int(self.chboxBackupMode.IsChecked())) 3253 cfg.IsDBReaded = cfg.IsDBCompared = cfg.IsDBSynced = False 3254 self.listFiles.Clear() 3255
3256 - def btnFilterRefresh_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3257 cfg.LOCK[LI_UPDATEFILTER] = True 3258 self.listFiles.FilterKeys() 3259
3260 - def listFiles_item_rclick_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3261 # Context listFiles menu 3262 self.mnuctxlist = None # XXX May be need delete or destroy for ctx menu? 3263 self.mnuctxlist = wx.Menu() 3264 if cfg.IsDBCompared and not cfg.IsDBSynced: 3265 self.mnuctxlist.AppendItem(self.mnuActionBag) 3266 self.mnuctxlist.AppendItem(self.mnuActionOrig) 3267 self.mnuctxlist.AppendItem(self.mnuActionDel) 3268 self.mnuctxlist.AppendItem(self.mnuActionUnch) 3269 self.mnuctxlist.AppendItem(self.mnuActionRestore) 3270 self.mnuctxlist.AppendSeparator() 3271 self.mnuctxlist.AppendItem(self.mnuViewProp) 3272 self.PopupMenu(self.mnuctxlist) 3273 event.Skip() 3274
3275 - def mnuViewProp_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3276 try: 3277 itemid = self.listFiles.GetFocusedItem() 3278 ##dbg(u'listFiles_item_selected_handler: (%d)' % (itemid,)) 3279 if itemid > -1: 3280 vdb = cfg.Z_DB[self.listFiles.ks[itemid]] 3281 # Generate info 3282 s = vdb[DBDBPATH] 3283 s += u'\n\nDESCRIPTION: ' + vdb[DBDESC] + vdb[DBDESCMAN] 3284 3285 s += u'\n\n' + u'-'*50 + u'\n\n' 3286 if vdb[DBBAGREAD]: 3287 # Fill bag info 3288 s += u'BAG PATH: ' + vdb[DBBAGPATH] + u'\n' 3289 s += u'BAG TYPE: ' + vdb[DBBAGFLAG] + u'\n' 3290 s += u'BAG LINK: ' + vdb[DBBAGLINK] + u'\n' 3291 s += u'BAG SIZE: ' + z_u(vdb[DBBAGSIZE]) + u'\n' 3292 s += u'BAG CRC32: ' + u'0x%08X' % vdb[DBBAGCRC32] + u'\n' 3293 s += u'BAG TIME SEC: ' + z_u(vdb[DBBAGMDATE]) + u'\n' 3294 s += u'BAG TIME GMT: ' + time.strftime(cfg.TIMEFORMAT, time.gmtime(vdb[DBBAGMDATE])) + u'\n' 3295 s += u'BAG TIME LOC: ' + time.strftime(cfg.TIMEFORMAT, time.localtime(vdb[DBBAGMDATE])) + u'\n' 3296 else: 3297 s += u'In bag item not found.' 3298 3299 s += u'\n\n' + u'-'*50 + u'\n\n' 3300 if vdb[DBORIGREAD]: 3301 # Fill bag info 3302 s += u'ORIGIN PATH: ' + vdb[DBORIGPATH] + u'\n' 3303 s += u'ORIGIN TYPE: ' + vdb[DBORIGFLAG] + u'\n' 3304 s += u'ORIGIN LINK: ' + vdb[DBORIGLINK] + u'\n' 3305 s += u'ORIGIN SIZE: ' + z_u(vdb[DBORIGSIZE]) + u'\n' 3306 s += u'ORIGIN CRC32: ' + u'0x%08X' % vdb[DBORIGCRC32] + u'\n' 3307 s += u'ORIGIN TIME SEC: ' + z_u(vdb[DBORIGMDATE]) + u'\n' 3308 s += u'ORIGIN TIME GMT: ' + time.strftime(cfg.TIMEFORMAT, time.gmtime(vdb[DBORIGMDATE])) + u'\n' 3309 s += u'ORIGIN TIME LOC: ' + time.strftime(cfg.TIMEFORMAT, time.localtime(vdb[DBORIGMDATE])) + u'\n' 3310 else: 3311 s += u'In origin item not found.' 3312 3313 s += u'\n\n' + u'-'*50 + u'\n\n' 3314 if vdb[DBDBREAD]: 3315 # Fill bag info 3316 s += u'DB PATH: ' + vdb[DBDBPATH] + u'\n' 3317 s += u'DB TYPE: ' + vdb[DBDBFLAG] + u'\n' 3318 s += u'DB LINK: ' + vdb[DBDBLINK] + u'\n' 3319 s += u'DB SIZE: ' + z_u(vdb[DBDBSIZE]) + u'\n' 3320 s += u'DB CRC32: ' + u'0x%08X' % vdb[DBDBCRC32] + u'\n' 3321 s += u'DB TIME SEC: ' + z_u(vdb[DBDBMDATE]) + u'\n' 3322 s += u'DB TIME GMT: ' + time.strftime(cfg.TIMEFORMAT, time.gmtime(vdb[DBDBMDATE])) + u'\n' 3323 s += u'DB TIME LOC: ' + time.strftime(cfg.TIMEFORMAT, time.localtime(vdb[DBDBMDATE])) + u'\n' 3324 else: 3325 s += u'In database item not found.' 3326 3327 self.InfoDlg.txtInfo.SetValue(s) 3328 self.InfoDlg.ShowModal() 3329 except Exception, exc: 3330 log(u'mnuViewProp_handler: (%d) ERROR "%s"' % (itemid,str(exc))) 3331 event.Skip(False) 3332
3333 - def listFiles_item_activated_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3334 self.mnuViewProp_handler(event) 3335
3336 - def mnuctxrcolLeft_handler(self, event):
3337 self.listFiles.MoveColLeft(self.colidrclicked) 3338 event.Skip()
3339
3340 - def mnuctxrcolRight_handler(self, event):
3341 self.listFiles.MoveColRight(self.colidrclicked) 3342 event.Skip()
3343
3344 - def mnuctxrcolErr_handler(self, event):
3345 self.ToggleCol(event, u'err') 3346 event.Skip()
3347
3348 - def mnuctxrcolErr_updateui(self, event):
3349 self.UpdateColMnuUI(event, u'err') 3350 event.Skip(False)
3351
3352 - def mnuctxrcolStateicon_handler(self, event):
3353 self.ToggleCol(event, u'stateicon') 3354 event.Skip()
3355
3356 - def mnuctxrcolStateicon_updateui(self, event):
3357 self.UpdateColMnuUI(event, u'stateicon') 3358 event.Skip(False)
3359
3360 - def mnuctxrcolActionicon_handler(self, event):
3361 self.ToggleCol(event, u'actionicon') 3362 event.Skip()
3363
3364 - def mnuctxrcolActionicon_updateui(self, event):
3365 self.UpdateColMnuUI(event, u'actionicon') 3366 event.Skip(False)
3367
3368 - def mnuctxrcolForced_handler(self, event):
3369 self.ToggleCol(event, u'forced') 3370 event.Skip()
3371
3372 - def mnuctxrcolForced_updateui(self, event):
3373 self.UpdateColMnuUI(event, u'forced') 3374 event.Skip(False)
3375
3376 - def mnuctxrcolDir_handler(self, event):
3377 self.ToggleCol(event, u'dir') 3378 event.Skip()
3379
3380 - def mnuctxrcolDir_updateui(self, event):
3381 self.UpdateColMnuUI(event, u'dir') 3382 event.Skip(False)
3383
3384 - def mnuctxrcolPath_handler(self, event):
3385 self.ToggleCol(event, u'path') 3386 event.Skip()
3387
3388 - def mnuctxrcolPath_updateui(self, event):
3389 self.UpdateColMnuUI(event, u'path') 3390 event.Skip(False)
3391
3392 - def mnuctxrcolDesc_handler(self, event):
3393 self.ToggleCol(event, u'desc') 3394 event.Skip()
3395
3396 - def mnuctxrcolDesc_updateui(self, event):
3397 self.UpdateColMnuUI(event, u'desc') 3398 event.Skip(False)
3399
3400 - def mnuctxrcolType_handler(self, event):
3401 self.ToggleCol(event, u'type') 3402 event.Skip()
3403
3404 - def mnuctxrcolType_updateui(self, event):
3405 self.UpdateColMnuUI(event, u'type') 3406 event.Skip(False)
3407
3408 - def mnuctxrcolMdatedb_handler(self, event):
3409 self.ToggleCol(event, u'mdatedb') 3410 event.Skip()
3411
3412 - def mnuctxrcolMdatedb_updateui(self, event):
3413 self.UpdateColMnuUI(event, u'mdatedb') 3414 event.Skip(False)
3415
3416 - def mnuctxrcolGMdatedb_handler(self, event):
3417 self.ToggleCol(event, u'gmdatedb') 3418 event.Skip()
3419
3420 - def mnuctxrcolGMdatedb_updateui(self, event):
3421 self.UpdateColMnuUI(event, u'gmdatedb') 3422 event.Skip(False)
3423
3424 - def mnuctxrcolLMdatedb_handler(self, event):
3425 self.ToggleCol(event, u'lmdatedb') 3426 event.Skip()
3427
3428 - def mnuctxrcolLMdatedb_updateui(self, event):
3429 self.UpdateColMnuUI(event, u'lmdatedb') 3430 event.Skip(False)
3431
3432 - def mnuctxrcolCrc32db_handler(self, event):
3433 self.ToggleCol(event, u'crc32db') 3434 event.Skip()
3435
3436 - def mnuctxrcolCrc32db_updateui(self, event):
3437 self.UpdateColMnuUI(event, u'crc32db') 3438 event.Skip(False)
3439
3440 - def mnuctxrcolSizedb_handler(self, event):
3441 self.ToggleCol(event, u'sizedb') 3442 event.Skip()
3443
3444 - def mnuctxrcolSizedb_updateui(self, event):
3445 self.UpdateColMnuUI(event, u'sizedb') 3446 event.Skip(False)
3447
3448 - def mnuctxrcolMdatebag_handler(self, event):
3449 self.ToggleCol(event, u'mdatebag') 3450 event.Skip()
3451
3452 - def mnuctxrcolMdatebag_updateui(self, event):
3453 self.UpdateColMnuUI(event, u'mdatebag') 3454 event.Skip(False)
3455
3456 - def mnuctxrcolGMdatebag_handler(self, event):
3457 self.ToggleCol(event, u'gmdatebag') 3458 event.Skip()
3459
3460 - def mnuctxrcolGMdatebag_updateui(self, event):
3461 self.UpdateColMnuUI(event, u'gmdatebag') 3462 event.Skip(False)
3463
3464 - def mnuctxrcolLMdatebag_handler(self, event):
3465 self.ToggleCol(event, u'lmdatebag') 3466 event.Skip()
3467
3468 - def mnuctxrcolLMdatebag_updateui(self, event):
3469 self.UpdateColMnuUI(event, u'lmdatebag') 3470 event.Skip(False)
3471
3472 - def mnuctxrcolCrc32bag_handler(self, event):
3473 self.ToggleCol(event, u'crc32bag') 3474 event.Skip()
3475
3476 - def mnuctxrcolCrc32bag_updateui(self, event):
3477 self.UpdateColMnuUI(event, u'crc32bag') 3478 event.Skip(False)
3479
3480 - def mnuctxrcolSizebag_handler(self, event):
3481 self.ToggleCol(event, u'sizebag') 3482 event.Skip()
3483
3484 - def mnuctxrcolSizebag_updateui(self, event):
3485 self.UpdateColMnuUI(event, u'sizebag') 3486 event.Skip(False)
3487
3488 - def mnuctxrcolMdateorig_handler(self, event):
3489 self.ToggleCol(event, u'mdateorigin') 3490 event.Skip()
3491
3492 - def mnuctxrcolMdateorig_updateui(self, event):
3493 self.UpdateColMnuUI(event, u'mdateorigin') 3494 event.Skip(False)
3495
3496 - def mnuctxrcolGMdateorig_handler(self, event):
3497 self.ToggleCol(event, u'gmdateorigin') 3498 event.Skip()
3499
3500 - def mnuctxrcolGMdateorig_updateui(self, event):
3501 self.UpdateColMnuUI(event, u'gmdateorigin') 3502 event.Skip(False)
3503
3504 - def mnuctxrcolLMdateorig_handler(self, event):
3505 self.ToggleCol(event, u'lmdateorigin') 3506 event.Skip()
3507
3508 - def mnuctxrcolLMdateorig_updateui(self, event):
3509 self.UpdateColMnuUI(event, u'lmdateorigin') 3510 event.Skip(False)
3511
3512 - def mnuctxrcolCrc32orig_handler(self, event):
3513 self.ToggleCol(event, u'crc32origin') 3514 event.Skip()
3515
3516 - def mnuctxrcolCrc32orig_updateui(self, event):
3517 self.UpdateColMnuUI(event, u'crc32origin') 3518 event.Skip(False)
3519
3520 - def mnuctxrcolSizeorig_handler(self, event):
3521 self.ToggleCol(event, u'sizeorigin') 3522 event.Skip()
3523
3524 - def mnuctxrcolSizeorig_updateui(self, event):
3525 self.UpdateColMnuUI(event, u'sizeorigin') 3526 event.Skip(False)
3527
3528 - def mnuctxrcolSymlinkdb_handler(self, event):
3529 self.ToggleCol(event, u'symlinkdb') 3530 event.Skip()
3531
3532 - def mnuctxrcolSymlinkdb_updateui(self, event):
3533 self.UpdateColMnuUI(event, u'symlinkdb') 3534 event.Skip(False)
3535
3536 - def mnuctxrcolSymlinkbag_handler(self, event):
3537 self.ToggleCol(event, u'symlinkbag') 3538 event.Skip()
3539
3540 - def mnuctxrcolSymlinkbag_updateui(self, event):
3541 self.UpdateColMnuUI(event, u'symlinkbag') 3542 event.Skip(False)
3543
3544 - def mnuctxrcolSymlinkorigin_handler(self, event):
3545 self.ToggleCol(event, u'symlinkorigin') 3546 event.Skip()
3547
3548 - def mnuctxrcolSymlinkorigin_updateui(self, event):
3549 self.UpdateColMnuUI(event, u'symlinkorigin') 3550 event.Skip(False)
3551
3552 - def mnuctxrcolTs_handler(self, event):
3553 self.ToggleCol(event, u'timeshift') 3554 event.Skip()
3555
3556 - def mnuctxrcolTs_updateui(self, event):
3557 self.UpdateColMnuUI(event, u'timeshift') 3558 event.Skip(False)
3559
3560 - def mnuctxrcolDefault_handler(self, event):
3561 try: 3562 log(u'mnuctxrcolDefault_handler') 3563 cfg.Z_COLUMN_CHOISE = FillColFromConfig() 3564 self.listFiles.RefreshColumns() 3565 except Exception, exc: 3566 log(u'mnuctxrcolDefault_handler: ERROR %s' % str(exc)) 3567 event.Skip(False)
3568
3569 - def mnuFileTips_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3570 self.dlgTips.ShowModal() 3571 event.Skip() 3572
3573 - def listFiles_col_end_drag_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3574 # Columns in default order [(configname, colname, show, size, align), ...] 3575 try: 3576 log(u'listFiles_col_end_drag_handler: start') 3577 item = event.GetColumn() 3578 w = self.listFiles.GetColumnWidth(item) 3579 n = self.listFiles.colkeys[item] 3580 idx = self.listFiles.GetColChoiseIdx(n) 3581 cd = cfg.Z_COLUMN_CHOISE[idx] 3582 log(u'listFiles_col_end_drag_handler: idx=%d, name=%s, w=%d' % (idx,n,w)) 3583 cfg.Z_COLUMN_CHOISE[idx] = (cd[COL_NAME],cd[COL_HEADING],cd[COL_VISIBLE],w,cd[COL_FORMAT]) 3584 except Exception, exc: 3585 log(u'listFiles_col_end_drag_handler: ERROR %s' % str(exc)) 3586 event.Skip() 3587 3588
3589 - def mnuRootsSelall_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3590 self.RootsSelectAll() 3591 event.Skip() 3592
3593 - def mnuRootsUnselall_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3594 self.RootsUnselectAll() 3595 event.Skip() 3596
3597 - def btnSelectRoots_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3598 global btnSelectRoots_state; 3599 3600 if btnSelectRoots_state==SELSTATEALL: 3601 btnSelectRoots_state = SELSTATECLEAR 3602 self.btnSelectRoots.SetLabel("Select default") 3603 self.RootsUnselectAll() 3604 elif btnSelectRoots_state==SELSTATEDEFAULT: 3605 btnSelectRoots_state = SELSTATEALL 3606 self.btnSelectRoots.SetLabel("Clear all") 3607 self.RootsSelectAll() 3608 elif btnSelectRoots_state==SELSTATECLEAR: 3609 btnSelectRoots_state = SELSTATEDEFAULT 3610 self.btnSelectRoots.SetLabel("Select all") 3611 self.RootsSelectDefault() 3612 3613 event.Skip() 3614
3615 - def mnuRootsSeldef_hundler(self, event): # wxGlade: frmMain_class.<event_handler>
3616 self.RootsSelectDefault() 3617 event.Skip() 3618
3619 - def mnuFileCleanDB_handler(self, event): # wxGlade: frmMain_class.<event_handler>
3620 cfg.IsDBReaded = False 3621 cfg.IsDBCompared = False 3622 cfg.IsDBSynced = False 3623 self.listFiles.Clear() 3624 #self.TSReset() ??? 3625 self.StartWork(self.do_cleandb, self.do_cleandb2) 3626 event.Skip(False) 3627 3628 # end of class frmMain_class 3629
3630 - def UpdateColMnuUI(self, event, idx):
3631 try: 3632 dbg(u'UpdateColMnuUI: start(%s)' % idx) 3633 i = self.listFiles.GetColChoiseIdx(idx) 3634 dbg(u'UpdateColMnuUI: Z_COLUMN_CHOISE[%d][COL_VISIBLE] = %s' % (i,str(cfg.Z_COLUMN_CHOISE[i][COL_VISIBLE]))) 3635 if (i > -1) and (cfg.Z_COLUMN_CHOISE[i][COL_VISIBLE]): 3636 dbg(u'UpdateColMnuUI: set True') 3637 event.Check(True) 3638 else: 3639 dbg(u'UpdateColMnuUI: set False') 3640 event.Check(False) 3641 except Exception, exc: 3642 log(u'UpdateColMnuUI: ERROR %s' % str(exc))
3643
3644 - def ToggleCol(self, event, idx):
3645 log(u'ToggleCol: start(%s)' % idx) 3646 try: 3647 i = self.listFiles.GetColChoiseIdx(idx) 3648 if i > -1: 3649 # Columns in default order [(configname, heading, show, size, align), ...] 3650 v = int(not bool(cfg.Z_COLUMN_CHOISE[i][COL_VISIBLE])) 3651 log(u'ToggleCol: i=%d, vis=%d' % (i,v)) 3652 cfg.Z_COLUMN_CHOISE[i] = (cfg.Z_COLUMN_CHOISE[i][COL_NAME], \ 3653 cfg.Z_COLUMN_CHOISE[i][COL_HEADING], v, \ 3654 cfg.Z_COLUMN_CHOISE[i][COL_WIDTH], cfg.Z_COLUMN_CHOISE[i][COL_FORMAT]) 3655 self.listFiles.RefreshColumns() 3656 except Exception, exc: 3657 log(u'ToggleCol: ERROR %s' % str(exc))
3658
3659 - def PattCMP(self):
3660 """ 3661 Try compile from txtFilter. If Ok return True and set L{cfg.REPORTPATTCMP} 3662 to compiled regexp, otherwise return False and do not change L{cfg.REPORTPATTCMP}. 3663 """ 3664 r = True # Right pattern. 3665 3666 _filter = self.txtFilter.Value 3667 # Compile report option. 3668 if _filter: 3669 cire = _filter 3670 else: 3671 cire = u'!.*' 3672 if cire[0] == u'!': 3673 cire = cire[1:] # Remove "!" form regexp 3674 else: 3675 # Convert wilds to regexp. 3676 cire = cire.replace(u'\\',u'\\\\').replace(u'|',u'\\|').replace(u'.',u'\\.').replace(u'*',u'.*'). \ 3677 replace(u'?',u'.?').replace(u'$',u'\\$').replace(u'^',u'\\^').replace(u'{',u'\\{'). \ 3678 replace(u'(',u'\\(').replace(u'[',u'\\[').replace(u'+',u'\\+').split(u',') 3679 cire = u'|'.join([u'('+i+u'$)' for i in cire if i]) 3680 if not cire: 3681 cire = u'.*' # Match any path. 3682 try: 3683 log(u'PattCMP: cire = "%s"' % z_u(cire)) 3684 ci = re.compile(cire, re.LOCALE | re.UNICODE) 3685 except Exception, exc: 3686 log(u'PattCMP: Error when compiling _filter string "%s". ERROR="%s"' % (cire, str(exc))) 3687 r = False 3688 if r: 3689 cfg.REPORTPATTCMP = ci 3690 return r
3691 3692
3693 - def timer_handler(self,event):
3694 """ 3695 """ 3696 if cfg.PYBAG_DEBUG: 3697 dbg(u'frmMain.timer_handler: start') 3698 if self.thread: 3699 # Thread. 3700 if self.thread.isAlive(): 3701 # Thread is running. 3702 if cfg.LOCK[LI_CANCEL]: 3703 log(u'frmMain.timer_handler: Cancel but thread running yet.') 3704 else: 3705 # Update progress. 3706 if self.progress: 3707 ##dbg(u'frmMain.timer_handler: update progress start') 3708 p100 = cfg.LOCK[LI_PERCENT100] 3709 p = cfg.LOCK[LI_PERCENT] 3710 if p100 == 0: 3711 p100 = 99 3712 msg = cfg.LOCK[LI_DESC] 3713 if p >= p100: 3714 p = p100 - 1 3715 p = float(p) / p100 * cfg.LOCK[LI_PERCENTPART] + cfg.LOCK[LI_PERCENTGLOBAL] 3716 ##dbg(u'doprogress: gauge try update (%%%d).' % (int(p),)) 3717 c,s = self.progress.Update(int(p), msg) # @UnusedVariable 3718 ##dbg(u'doprogress: c,s=(%s,%s).' % (c,s)) 3719 if not c: 3720 cfg.LOCK[LI_CANCEL] = True 3721 prt0(u'OPERATION CANCELED', place=u'frmMain.timer_handler') 3722 ##dbg(u'frmMain.timer_handler: update progress end') 3723 else: 3724 # Thread is exited. 3725 self.thread = None 3726 self.progress.Destroy() 3727 self.progress = None 3728 if not cfg.LOCK[LI_CANCEL]: 3729 fun2 = cfg.LOCK[LI_FUN2] 3730 if fun2: 3731 cfg.LOCK[LI_FUN2] = None 3732 dbg(u'frmMain.timer_handler: call after fun2 "%s"' % fun2.__name__) 3733 wx.CallAfter(fun2) 3734 cfg.LOCK[LI_CANCEL] = False 3735 log(u'frmMain.timer_handler: thread exited') 3736 else: 3737 # No thread. 3738 if self.progress: 3739 ##self.progress.Destroy() 3740 self.progress = None 3741 cfg.LOCK[LI_CANCEL] = False 3742 # Update text output. 3743 try: 3744 global _outtxt 3745 _outlock.acquire() 3746 if _outtxt: 3747 self.txtOut.AppendText(_outtxt) 3748 _outtxt = u'' 3749 except: 3750 pass 3751 finally: 3752 _outlock.release()
3753 3754 ##end timer_handler 3755
3756 - def set_force(self):
3757 """ 3758 Thread function. 3759 """ 3760 # FillList implementation 3761 log(u'frmMain.set_force: start') 3762 global ForceAction, ForceKs, ForceRet 3763 action = ForceAction 3764 ForceRet = u'' 3765 fks = ForceKs 3766 db = cfg.Z_DB 3767 dbks = cfg.Z_KS 3768 dbstartswith_ = dbstartswith 3769 DBDBPATH_ = DBDBPATH 3770 DBPATH_ = DBPATH 3771 DBDBFLAG_ = DBDBFLAG 3772 DBBAGFLAG_ = DBBAGFLAG 3773 DBORIGFLAG_ = DBORIGFLAG 3774 DBFLAGDIR_ = DBFLAGDIR # @UnusedVariable 3775 DBBAGREAD_ = DBBAGREAD 3776 DBORIGREAD_ = DBORIGREAD 3777 DBDBREAD_ = DBDBREAD 3778 DBDIRMAN_ = DBDIRMAN 3779 DBDIR_ = DBDIR 3780 DBDIRNONE_ = DBDIRNONE 3781 DBDESCMAN_ = DBDESCMAN 3782 DBDESCNONE_ = DBDESCNONE # @UnusedVariable 3783 LOCK_ = cfg.LOCK 3784 LI_PERCENT_ = LI_PERCENT 3785 LI_CANCEL_ = LI_CANCEL 3786 dbbagdel = DBDIRBAG | DBDIRDELETE | DBDIRFORCED 3787 dborigdel = DBDIRORIG | DBDIRDELETE | DBDIRFORCED 3788 dbdbdel = DBDIRDB | DBDIRDELETE | DBDIRFORCED 3789 dbbag = DBDIRBAG | DBDIRDB | DBDIRCOPY | DBDIRFORCED 3790 dbunchanged = DBDIRUNCHANGED | DBDIRFORCED 3791 ##dbignored = DBDIRIGNORED | DBDIRFORCED 3792 dborig = DBDIRORIG | DBDIRDB | DBDIRCOPY | DBDIRFORCED 3793 doout = cfg.PYBAG_DEBUG 3794 3795 def act(v): 3796 """ 3797 """ 3798 ##dbg(u'act: start.') 3799 try: 3800 rdbag = v[DBBAGREAD_] 3801 rdorig = v[DBORIGREAD_] 3802 rddb = v[DBDBREAD_] 3803 if v[DBDIRMAN_] == DBDIRNONE_: 3804 # Save original compared direction. 3805 v[DBDIRMAN_] = v[DBDIR_] 3806 v[DBDESCMAN_] = u' Manualy forced: ' 3807 if action == u'delete': 3808 # Delete. 3809 ##dbg(u'act: delete') 3810 v[DBDIR_] = DBDIRNONE_ 3811 if rdbag: 3812 v[DBDIR_] = dbbagdel 3813 v[DBDESCMAN_] += u'Delete in bag.' 3814 if rdorig: 3815 v[DBDIR_] |= dborigdel 3816 v[DBDESCMAN_] += u'Delete in origin.' 3817 if rddb: 3818 v[DBDIR_] |= dbdbdel 3819 v[DBDESCMAN_] += u'Delete in db.' 3820 if not (rdbag or rdorig): 3821 v[DBDESCMAN_] += u'Nothing for deleting.' 3822 else: 3823 # Test for parent no delete. 3824 p = getpathdirdb(v[DBPATH_]) 3825 while p: 3826 pv = db[p] 3827 if pv[DBDIR_] & DBDIRDELETE: 3828 log(u'act(%s): Forced unchange parent "%s"' % (v[DBDBPATH_],p)) 3829 pv[DBDIR_] = dbunchanged 3830 pv[DBDESCMAN] += u' Unchange (not all childeren deleted).' 3831 p = getpathdirdb(p) 3832 ##while 3833 if action == u'bag': 3834 # To bag. 3835 ##dbg(u'act: to bag') 3836 if rdorig: 3837 v[DBDIR_] = dbbag 3838 v[DBDESCMAN_] += u'Copy to bag. ' 3839 else: 3840 v[DBDIR_] = (v[DBDIR_] & DBDIRNEW) | dbunchanged 3841 v[DBDESCMAN_] += u'Nothing copy to bag. Unchange.' 3842 elif action == u'origin': 3843 # To origin. 3844 ##dbg(u'act: to origin') 3845 if rdbag: 3846 v[DBDIR_] = dborig 3847 v[DBDESCMAN_] += u'Copy to origin.' 3848 else: 3849 v[DBDIR_] = dbunchanged ##(v[DBDIR_] & DBDIRNEW) | 3850 v[DBDESCMAN_] += u'Nothing copy to origin. Unchange.' 3851 elif action == u'skip': 3852 # Unchanged. 3853 ##dbg(u'act: skip') 3854 v[DBDIR_] = dbunchanged ##(v[DBDIR_] & DBDIRNEW) | 3855 v[DBDESCMAN_] += u'Unchanged.' 3856 elif action == u'restore': 3857 # Restore compared. 3858 ##dbg(u'act: restore') 3859 if v[DBDIRMAN_] != DBDIRNONE_: 3860 v[DBDIR_] = v[DBDIRMAN_] 3861 v[DBDESCMAN_] = u'' ##DBDESCNONE_ 3862 else: 3863 log(u'act: ERROR action "%s"' % (action,)) 3864 v[DBDESCMAN_] += u'ERROR action "%s"' % (action,) 3865 ##end if 3866 ##end if action 3867 ##dbg(u'act: end.') 3868 except Exception, exc: 3869 log(u'act(%s): ERROR %s' % (v[DBPATH_],str(exc)))
3870 ##def act 3871 3872 try: 3873 # IMPLEMENTATION do_action. 3874 3875 tm = time.time() 3876 3877 if not (action in O_ACTION): 3878 r = u'Unknown action "%s".' % action 3879 return r 3880 3881 dl = [] # Directory list for test actions recursive. 3882 if doout: 3883 dbg(u'frmMain.set_force: for start.') 3884 3885 cfg.LOCK[LI_PERCENTGLOBAL] = 1 3886 cfg.LOCK[LI_PERCENTPART] = 100 3887 cfg.LOCK[LI_PERCENT] = 0 3888 cfg.LOCK[LI_PERCENT100] = len(cfg.Z_DB) 3889 cfg.LOCK[LI_DESC] = 'Force ...' 3890 if cfg.LOCK[LI_CANCEL]: 3891 # Canceled 3892 log(u'frmMain.set_force: canceled') 3893 return u'Force canceled.' 3894 3895 LOOPN_ = LOOPN 3896 LN = 0 3897 #dbks.sort() Already sorted in f_syncread 3898 3899 for idb in dbks: 3900 LN += 1 3901 if LN > LOOPN_: 3902 LOCK_[LI_PERCENT_] += LN 3903 LN = 0 3904 if LOCK_[LI_CANCEL_]: 3905 log(u'frmMain.set_force: canceled.') 3906 ForceKs = u'Force canceled.' 3907 return 3908 vdb = db[idb] 3909 path = vdb[DBDBPATH_] 3910 if doout: 3911 dbg(u'\nfrmMain.set_force: for(path) = "%s".' % z_u(path)) 3912 dbg(u'frmMain.set_force: loop for dli start.') 3913 3914 # Recursive test. 3915 kk = True # not act yet 3916 for dli in dl[:]: 3917 if doout: 3918 dbg(u'do_action: dli = "%s".' % dli) 3919 if dbstartswith_(idb, dli): 3920 act(vdb) 3921 kk = False # already act 3922 if doout: 3923 dbg(u'do_action: act ok.') 3924 else: 3925 if doout: 3926 dbg(u'do_action: remove dli from dl = "%s"' % z_u(dli)) 3927 dl.remove(dli) # Normally no more matched values (array sorted). 3928 dbg(u'do_action: loop for dli end.') 3929 ##end for 3930 # Path test if not act yet. 3931 if kk and (idb in fks): 3932 dbg(u'frmMain.set_force: if kk --> act.') 3933 act(vdb) 3934 if (vdb[DBDBFLAG_]==DBFLAGDIR) or (vdb[DBBAGFLAG_]==DBFLAGDIR) or (vdb[DBORIGFLAG_]==DBFLAGDIR): 3935 # Add dir to recursive list. 3936 if doout: 3937 dbg(u'do_action: add idb to dl = "%s"' % z_u(idb)) 3938 dl.append(idb) 3939 ##end if 3940 ##end for idb 3941 tm = time.time() - tm 3942 prt4(u'\nForce time is %.3f' % tm) 3943 3944 except Exception, exc: 3945 prt0(u'ERROR in program.',place=u'frmMain.set_force',error=exc) 3946 log(u'frmMain.set_force: end') 3947 ##end set_force 3948
3949 - def set_force2(self):
3950 """ 3951 """ 3952 cfg.LOCK[LI_UPDATEFILTER] = True 3953 self.listFiles.FilterKeys()
3954
3955 - def do_stat(self):
3956 """ 3957 Calculate statistics. 3958 3959 Resultat save into self._stat_info variable. 3960 """ 3961 cmd = command_class() 3962 setattr(cmd,'r',[]) 3963 setattr(cmd,'x',[]) 3964 prt1() 3965 cfg.LOCK[LI_PERCENTPART] = 100 # Global percents. 3966 cfg.LOCK[LI_PERCENTGLOBAL] = 0 3967 prt1(u'Calculate statistics, please wait...') 3968 self._stat_info = f_stat(cmd) 3969 prt(self._stat_info,verbosity=-100)
3970
3971 - def do_stat2(self):
3972 if not cfg.LOCK[LI_CANCEL]: 3973 self.InfoDlg.txtInfo.SetValue(TermColors.skipTags(self._stat_info)) 3974 self.InfoDlg.ShowModal() 3975 del self._stat_info
3976
3977 - def do_cleandb(self):
3978 """ 3979 Calculate statistics. 3980 3981 Resultat save into self._stat_info variable. 3982 """ 3983 cmd = command_class() 3984 setattr(cmd,'r',[]) 3985 prt1() 3986 cfg.LOCK[LI_PERCENTPART] = 100 # Global percents. 3987 cfg.LOCK[LI_PERCENTGLOBAL] = 0 3988 prt1(u'Clean DB, please wait...') 3989 try: 3990 cmd = command_class() 3991 #setattr(cmd,u'fs',[r]) # no options need 3992 cmd_cleandb(cmd) 3993 except Exception,exc: 3994 prt0(u'ERROR in program %s.' % (traceback.format_exc(),),place=u'mnuFileCleanDB_handler', 3995 error=exc)
3996
3997 - def do_cleandb2(self):
3998 cfg.Z_CP = z_gp_class() 3999 cfg.Z_CP.load() 4000 self.UpdateRoots()
4001
4002 - def do_read(self):
4003 """ 4004 Thread function. 4005 """ 4006 log(u'frmMain.do_readdb: start') 4007 z_r.clear() 4008 # Determine direction. 4009 try: 4010 prt1() 4011 cfg.LOCK[LI_PERCENTPART] = 100 # Global percents. 4012 cfg.LOCK[LI_PERCENTGLOBAL] = 0 4013 if cfg.LOCK[LI_CANCEL]: 4014 # Canceled 4015 dbg(u'frmMain.do_read: canceled') 4016 return 4017 prt1(u'Reading ...\n') 4018 cmd = command_class() 4019 cmd.fs = [] 4020 cmd.f = [] 4021 cmd.x = [] 4022 cnt = self.clboxRoots.GetCount() 4023 for i in range(cnt): 4024 if self.clboxRoots.IsChecked(i): 4025 rn = self.clboxRoots.GetString(i) 4026 prt1(u'\tRoot "%s" marked for synchronization.' % rn) 4027 cmd.f.append(rn) 4028 if not cmd.f: 4029 prt1(u'No roots selected. Cancel.') 4030 cfg.LOCK[LI_CANCEL] = True 4031 return 4032 tm0 = time.time() 4033 4034 cfg.IsDBReaded = False 4035 cfg.IsDBSynced = False 4036 cfg.IsDBCompared = False 4037 self.listFiles.Clear() 4038 self.read_ign = f_syncread(cmd) 4039 if cfg.LOCK[LI_CANCEL]: 4040 # Canceled 4041 dbg(u'frmMain.do_read: canceled') 4042 return 4043 cfg.IsDBReaded = True 4044 tm1 = time.time() 4045 prt1() 4046 prt1(u'\tIgnored %d items in bag and origin.' % self.read_ign) 4047 prt1() 4048 prt1( u'\t all items = %d' % len(cfg.Z_DB)) 4049 self.readdur = tm1-tm0 4050 prt1(u'Reading duration is %.3f sec.' % (self.readdur,)) 4051 prt1() 4052 if z_r.e: 4053 prt0( u'ERROR occur:', error=z_r.e) 4054 z_r.clear() 4055 4056 except Exception, exc: 4057 prt0(u'\nError then reading DB.\n', place=u'frmMain.do_readdb', error=exc) 4058 4059 log(u'frmMain.do_readdb: end')
4060 ##end do_read 4061
4062 - def do_read2(self):
4063 ##global cfg.IsDBReaded,IsDBCompared,IsDBSynced 4064 self.TSReset() 4065 self.lblErrors.SetLabel(u'') 4066 self.lblConflicts.SetLabel(u'') 4067 self.lblWarnings.SetLabel(u'') 4068 self.lblAllItems.SetLabel(u'All items: %d' % len(cfg.Z_DB)) 4069 self.lblNewBag.SetLabel(u'') 4070 self.lblNewOrig.SetLabel(u'') 4071 self.lblChangeBag.SetLabel(u'') 4072 self.lblChangeOrig.SetLabel(u'') 4073 self.lblDelBag.SetLabel(u'') 4074 self.lblDelOrig.SetLabel(u'') 4075 self.lblIgnored.SetLabel(u'Ignored: %d' % self.read_ign) 4076 self.lblTimeshifted.SetLabel(u'') 4077 self.sizerMain.Show(self.sizerInfo1,False,True) 4078 self.sizerMain.Show(self.sizerInfo2,True,True) 4079 self.sizerMain.Show(self.sizerSelDesc,True,True) 4080 self.sizerMain.Show(self.sizerSelFile,True,True) 4081 self.sizerMain.Layout() 4082 # XXX Yield ??? 4083 #wx.Yield() 4084 self.listFiles.FillKeys()
4085
4086 - def do_compare(self):
4087 """ 4088 Compare files in GUI. 4089 4090 Thread function. 4091 """ 4092 log(u'frmMain.do_compare: start') 4093 try: 4094 4095 if not cfg.IsDBReaded: 4096 self.do_read() 4097 ## else: 4098 ## self.readdur = 0.0 4099 d = self.cboxAutoAction.GetSelection() 4100 if cfg.LOCK[LI_CANCEL]: 4101 # Canceled 4102 dbg(u'frmMain.do_compare: canceled') 4103 return 4104 _dir = z_action_choise[d][1] 4105 dbg( u'frmMain.do_compare: _dir=%s (%s)' % (z_u(_dir),z_action_choise[d][0]) ) 4106 prt1() 4107 prt1(u'Comparing ...\n') 4108 # Workin. 4109 cfg.LOCK[LI_PERCENTPART] = 100 # Global percents. 4110 cfg.LOCK[LI_PERCENTGLOBAL] = 0 4111 # errors, conflicts, warnings, modbag, modorig, changed, deleted, new, ignored. 4112 prt1() 4113 tm0 = time.time() 4114 cfg.IsDBCompared = False 4115 cfg.IsDBSynced = False 4116 self.compare_re,self.compare_rc,self.compare_rw,self.compare_rbn,self.compare_ron, \ 4117 self.compare_rbc,self.compare_roc,self.compare_rbd,self.compare_rod, \ 4118 self.compare_rign, self.compare_rts = f_synccompare(_dir) 4119 if cfg.LOCK[LI_CANCEL]: 4120 # Canceled 4121 dbg(u'frmMain.do_compare: canceled') 4122 return 4123 cfg.IsDBCompared = True 4124 tm1 = time.time() 4125 prt1() 4126 prt1( u'\t errors = %d' % self.compare_re) 4127 prt1( u'\t conflicts = %d' % self.compare_rc) 4128 prt1( u'\t warnings = %d' % self.compare_rw) 4129 prt1( u'\t all items = %d' % len(cfg.Z_DB)) 4130 prt1( u'\t new in bag = %d' % self.compare_rbn) 4131 prt1( u'\t new in origin = %d' % self.compare_ron) 4132 prt1( u'\t changed in bag = %d' % self.compare_rbc) 4133 prt1( u'\t changed in origin = %d' % self.compare_roc) 4134 prt1( u'\t deleted in bag = %d' % self.compare_rbd) 4135 prt1( u'\t deleted in origin = %d' % self.compare_rod) 4136 prt1( u'\t ignored = %d' % self.compare_rign) 4137 prt1( u'\t timeshifted = %d' % self.compare_rts) 4138 prt1() 4139 prt1(u'Reading duration is %.3f sec.' % (self.readdur,)) 4140 prt1() 4141 self.cmpdur = tm1-tm0 4142 prt1(u'Comparing duration is %.3f sec.' % (self.cmpdur,)) 4143 prt1() 4144 prt1(u'Summary reading and comparing duration is %.3f sec.' % (self.readdur+self.cmpdur,)) 4145 prt1() 4146 z_r.clear() 4147 4148 except Exception, exc: 4149 prt0(u'\nERROR then compare.', place=u'frmMain.do_compare', error=exc) 4150 4151 log(u'frmMain.do_compare: end')
4152
4153 - def do_compare2(self):
4154 ##global cfg.IsDBReaded,IsDBCompared,IsDBSynced 4155 self.lblErrors.SetLabel(u'Errors: %d' % (self.compare_re,)) 4156 self.lblConflicts.SetLabel(u'Conflicts: %d' % (self.compare_rc,)) 4157 self.lblWarnings.SetLabel(u'Warnings: %d' % (self.compare_rw,)) 4158 self.lblAllItems.SetLabel(u'All items: %d' % len(cfg.Z_DB)) 4159 self.lblNewBag.SetLabel(u'New in bag: %d' % (self.compare_rbn,)) 4160 self.lblNewOrig.SetLabel(u'New in origin: %d' % (self.compare_ron,)) 4161 self.lblChangeBag.SetLabel(u'Changed in bag: %d' % (self.compare_rbc,)) 4162 self.lblChangeOrig.SetLabel(u'Changed in origin: %d' % (self.compare_roc,)) 4163 self.lblDelBag.SetLabel(u'Deleted in bag: %d' % (self.compare_rbd,)) 4164 self.lblDelOrig.SetLabel(u'Deleted in origin: %d' % (self.compare_rod,)) 4165 self.lblIgnored.SetLabel(u'Ignored: %d' % (self.compare_rign,)) 4166 self.lblTimeshifted.SetLabel(u'Timeshifted: %d' % (self.compare_rts,)) 4167 self.sizerMain.Show(self.sizerInfo1,True,True) 4168 self.sizerMain.Show(self.sizerInfo2,True,True) 4169 self.sizerMain.Show(self.sizerSelDesc,True,True) 4170 self.sizerMain.Show(self.sizerSelFile,True,True) 4171 self.sizerMain.Layout() 4172 cfg.LOCK[LI_UPDATEFILTER] = True 4173 self.listFiles.FilterKeys()
4174
4175 - def do_sync(self):
4176 """ 4177 Synchronize. 4178 4179 Thread function. 4180 """ 4181 log(u'frmMain.do_sync: start') 4182 try: 4183 4184 if not cfg.IsDBCompared: 4185 self.do_compare() 4186 ## else: 4187 ## self.cmpdur = 0.0 4188 4189 prt1(u'Syncronizing ...\n') 4190 cfg.LOCK[LI_PERCENTPART] = 85 # Global percents. 4191 cfg.LOCK[LI_PERCENTGLOBAL] = 0 4192 if cfg.LOCK[LI_CANCEL]: 4193 # Canceled 4194 dbg(u'frmMain.do_sync: canceled') 4195 return 4196 tm0 = time.time() 4197 cfg.IsDBCompared = False 4198 cfg.IsDBReaded = False 4199 cfg.IsDBSynced = False 4200 # deleted, new, copied, unchengad, errored. 4201 self.sync_sd, self.sync_sn, self.sync_sc, self.sync_su, self.sync_se, self.sync_ts = f_syncsync() 4202 if cfg.LOCK[LI_CANCEL]: 4203 # Canceled 4204 dbg(u'frmMain.do_sync: canceled') 4205 return 4206 tm1 = time.time() 4207 prt1() 4208 prt1( u'\t all items = %d' % len(cfg.Z_DB)) 4209 prt1( u'\t errors after comparing = %d' % self.sync_su) 4210 prt1( u'\t errors in syncronizing = %d' % self.sync_se) 4211 prt1( u'\t new = %d' % self.sync_sn) 4212 prt1( u'\t copied = %d' % self.sync_sc) 4213 prt1( u'\t deleted = %d' % self.sync_sd) 4214 prt1( u'\t timeshifted = %d' % self.sync_ts) 4215 z_r.clear() 4216 prt1() 4217 prt1(u'Clearing ...\n') 4218 cfg.LOCK[LI_PERCENTPART] = 10 # Global percents. 4219 cfg.LOCK[LI_PERCENTGLOBAL] = 85 4220 f_syncclear() 4221 tm2 = time.time() 4222 prt1() 4223 prt1(u'Save DB ...\n') 4224 cfg.LOCK[LI_PERCENTPART] = 5 # Global percents. 4225 cfg.LOCK[LI_PERCENTGLOBAL] = 95 4226 cfg.LOCK[LI_DESC] = 'Save DB ...' 4227 dbsave(cfg.Z_DB) 4228 cfg.IsDBSynced = True 4229 tm3 = time.time() 4230 prt1() 4231 prt1(u'Syncronization compete.') 4232 prt1() 4233 prt1(u'Reading duration is %.3f sec.' % (self.readdur,)) 4234 prt1() 4235 prt1(u'Comparing duration is %.3f sec.' % (self.cmpdur,)) 4236 prt1() 4237 prt1(u'Synchronization duration is %.3f sec.' % (tm1-tm0,)) 4238 prt1(u'Clearing duration is %.3f sec.' % (tm2-tm1,)) 4239 prt1(u'Save duration is %.3f sec.' % (tm3-tm2,)) 4240 prt1() 4241 self.syncdur = tm3-tm0 + self.readdur + self.cmpdur 4242 prt1(u'Summary duration is %.3f sec.' % (self.syncdur,)) 4243 prt1() 4244 4245 except Exception, exc: 4246 prt0(u'\nERROR then sync.', place=u'frmMain.do_sync', error=exc) 4247 log(u'end cmd_sync')
4248
4249 - def do_sync2(self):
4250 ##global cfg.IsDBReaded,IsDBCompared,IsDBSynced 4251 self.TSReset() 4252 self.lblErrors.SetLabel(u'') 4253 self.lblConflicts.SetLabel(u'') 4254 self.lblWarnings.SetLabel(u'') 4255 self.lblAllItems.SetLabel(u'All items: %d' % len(cfg.Z_DB)) 4256 self.lblNewBag.SetLabel(u'') 4257 self.lblNewOrig.SetLabel(u'') 4258 self.lblChangeBag.SetLabel(u'Comparing errors: %d' % (self.sync_su,)) 4259 self.lblChangeOrig.SetLabel(u'Synchronization errors: %d' % (self.sync_se,)) 4260 self.lblDelBag.SetLabel(u'New: %d' % (self.sync_sn,)) 4261 self.lblDelOrig.SetLabel(u'Copied: %d' % (self.sync_sc,)) 4262 self.lblIgnored.SetLabel(u'Deleted: %d' % (self.sync_sd,)) 4263 self.lblTimeshifted.SetLabel(u'Timeshifted: %d' % (self.sync_ts,)) 4264 self.sizerMain.Show(self.sizerInfo1,False,True) 4265 self.sizerMain.Show(self.sizerInfo2,True,True) 4266 self.sizerMain.Show(self.sizerSelDesc,True,True) 4267 self.sizerMain.Show(self.sizerSelFile,True,True) 4268 self.sizerMain.Layout() 4269 cfg.LOCK[LI_UPDATEFILTER] = True 4270 self.listFiles.FilterKeys()
4271
4272 - def StartWork(self, fun, fun2=None):
4273 """ 4274 Launch "fun" as working thread. Return True for success, False otherwise. 4275 "fun2" will be running after thread exited. 4276 """ 4277 log(u'frmMain.StartWork: start') 4278 ret = False 4279 if not self.thread: 4280 # Not thread started. Create new. 4281 self.thread = threading.Thread(target=fun, name=fun.__name__) 4282 cfg.LOCK[LI_CANCEL] = False 4283 cfg.LOCK[LI_FUN2] = fun2 4284 self.progress = None 4285 self.thread.start() 4286 self.progress = wx.ProgressDialog('Work progress.','Working ...',100,self, wx.PD_CAN_ABORT | 4287 wx.PD_APP_MODAL | wx.PD_ELAPSED_TIME | wx.PD_ESTIMATED_TIME | 4288 wx.PD_REMAINING_TIME | wx.PD_SMOOTH) 4289 ret = True 4290 else: 4291 prt0(u'One command already running!!!', place=u'frmMain.StartWork') 4292 log(u'frmMain.StartWork: end') 4293 return ret
4294 4295 ## #end of class frmMain_class 4296 4297
4298 -class outstream(object):
4299 """ 4300 Output stream. Accumulate all output and put it to txtOut control. 4301 4302 Used for replace sys.stdout. 4303 Have handler which called each time after writing. 4304 4305 @note: Safe for multithreading. 4306 """ 4307
4308 - def write(self, *arg):
4309 """ 4310 Write arguments to output text string. 4311 """ 4312 def red(a,b): 4313 return a + unicode(b, cfg.z_outep, 'replace')
4314 try: 4315 # decode from system output encoding (print statement). 4316 s = reduce(red, arg, u'') 4317 try: 4318 global _outtxt 4319 _outlock.acquire() 4320 _outtxt = _outtxt + s 4321 finally: 4322 _outlock.release() 4323 ##s = reduce(lambda a, b: a + z_u(b), arg, u'') # wrong encoding/decoding 4324 except Exception, exc: 4325 pass
4326 4327 ##end outstream 4328 4329
4330 -def ask_yn(msg, title=u''):
4331 """ 4332 Show msg and return Yes (True) or No (False) result. 4333 4334 @param msg: Message for show. 4335 @type msg: string 4336 @param title: Window title. 4337 @type title: string 4338 @return: Yes or No result. 4339 @rtype: boolean 4340 """ 4341 if cfg.Z_APP is None: 4342 cfg.Z_APP = wx.App() 4343 r = wx.MessageBox(msg,title, 4344 style = wx.YES_NO) 4345 r = r == wx.YES 4346 return r
4347 4348
4349 -def ask_ok(msg, title=u''):
4350 """ 4351 Show msg with OK button. 4352 param msg: Message for show. 4353 @type msg: string 4354 @param title: Window title. 4355 @type title: string 4356 """ 4357 if cfg.Z_APP is None: 4358 cfg.Z_APP = wx.App() 4359 wx.MessageBox(msg,title,style = wx.OK)
4360 4361 4362 4363 4364 #******************************************************************************* 4365 4366 4367 4368 4369 4370 # End Implemetation 4371