Package Gnumed :: Package timelinelib :: Package wxgui :: Module utils
[frames] | no frames]

Source Code for Module Gnumed.timelinelib.wxgui.utils

  1  # Copyright (C) 2009, 2010, 2011  Rickard Lindberg, Roger Lindberg 
  2  # 
  3  # This file is part of Timeline. 
  4  # 
  5  # Timeline is free software: you can redistribute it and/or modify 
  6  # it under the terms of the GNU General Public License as published by 
  7  # the Free Software Foundation, either version 3 of the License, or 
  8  # (at your option) any later version. 
  9  # 
 10  # Timeline is distributed in the hope that it will be useful, 
 11  # but WITHOUT ANY WARRANTY; without even the implied warranty of 
 12  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 13  # GNU General Public License for more details. 
 14  # 
 15  # You should have received a copy of the GNU General Public License 
 16  # along with Timeline.  If not, see <http://www.gnu.org/licenses/>. 
 17   
 18   
 19  import wx 
 20   
 21  from timelinelib.db.exceptions import TimelineIOError 
 22  from timelinelib.db.objects.category import sort_categories 
 23   
 24   
 25  # Border, in pixels, between controls in a window (should always be used when 
 26  # border is needed) 
 27  BORDER = 5 
 28  # Used by dialogs as a return code when a TimelineIOError has been raised 
 29  ID_ERROR = wx.NewId() 
 30   
 31   
32 -class WildcardHelper(object):
33
34 - def __init__(self, name, extensions):
35 self.name = name 36 self.ext_data = {} 37 self.ext_names = [] 38 self._extract_ext_info(extensions)
39
40 - def wildcard_string(self):
41 return "%s (%s)|%s" % ( 42 self.name, 43 ", ".join(["*." + e for e in self.ext_names]), 44 ";".join(["*." + e for e in self.ext_names]))
45
46 - def get_path(self, dialog):
47 path = dialog.GetPath() 48 for ext_name in self.ext_names: 49 if path.endswith("." + ext_name): 50 return path 51 return "%s.%s" % (path, self.ext_names[0])
52
53 - def get_extension_data(self, path):
54 split_path = path.split(".") 55 if len(split_path) > 1: 56 ext_name = split_path[-1] 57 return self.ext_data.get(ext_name, None) 58 return None
59
60 - def _extract_ext_info(self, extensions):
61 for ext in extensions: 62 if isinstance(ext, tuple): 63 name, data = ext 64 self.ext_data[name] = data 65 self.ext_names.append(name) 66 else: 67 self.ext_names.append(ext)
68 69
70 -def category_tree(category_list, parent=None, remove=None):
71 """ 72 Transform flat list of categories to a tree based on parent attribute. 73 74 The top-level categories have the given parent and each level in the tree 75 is sorted. 76 77 If remove is given then the subtree with remove as root will not be 78 included. 79 80 The tree is represented as a list of tuples, (cat, sub-tree), where cat is 81 the parent category and subtree is the same tree representation of the 82 children. 83 """ 84 children = [child for child in category_list 85 if (child.parent is parent and child is not remove)] 86 sorted_children = sort_categories(children) 87 tree = [(x, category_tree(category_list, x, remove)) 88 for x in sorted_children] 89 return tree
90 91
92 -def show_modal(fn_create_dialog, fn_handle_db_error, fn_success=None):
93 """Show a modal dialog using error handling pattern.""" 94 try: 95 dialog = fn_create_dialog() 96 except TimelineIOError, e: 97 fn_handle_db_error(e) 98 else: 99 dialog_result = dialog.ShowModal() 100 if dialog_result == ID_ERROR: 101 fn_handle_db_error(dialog.error) 102 elif fn_success: 103 fn_success(dialog) 104 dialog.Destroy()
105 106
107 -def create_dialog_db_error_handler(dialog):
108 def handler(error): 109 handle_db_error_in_dialog(dialog, error)
110 return handler 111 112
113 -def handle_db_error_in_dialog(dialog, error):
114 if dialog.IsShown(): 115 # Close the dialog and let the code that created it handle the error. 116 # Eventually this error will end up in the main frame (which is the 117 # only object which can handle the error properly). 118 dialog.error = error 119 dialog.EndModal(ID_ERROR) 120 else: 121 # Re-raise the TimelineIOError exception and let the code that created 122 # the dialog handle the error. 123 raise error
124 125
126 -def _set_focus_and_select(ctrl):
127 ctrl.SetFocus() 128 if hasattr(ctrl, "SelectAll"): 129 ctrl.SelectAll()
130 131
132 -def _display_error_message(message, parent=None):
133 """Display an error message in a modal dialog box""" 134 dial = wx.MessageDialog(parent, message, _("Error"), wx.OK | wx.ICON_ERROR) 135 dial.ShowModal()
136 137
138 -def _ask_question(question, parent=None):
139 """Ask a yes/no question and return the reply.""" 140 return wx.MessageBox(question, _("Question"), 141 wx.YES_NO|wx.CENTRE|wx.NO_DEFAULT, parent)
142 143
144 -def set_wait_cursor(parent):
145 parent.SetCursor(wx.StockCursor(wx.CURSOR_WAIT))
146 147
148 -def set_default_cursor(parent):
149 parent.SetCursor(wx.StockCursor(wx.CURSOR_DEFAULT))
150 151
152 -def time_picker_for(time_type):
153 from timelinelib.wxgui.components.numtimepicker import NumTimePicker 154 from timelinelib.wxgui.components.pydatetimepicker import PyDateTimePicker 155 from timelinelib.wxgui.components.wxdatetimepicker import WxDateTimePicker 156 from timelinelib.time import NumTimeType 157 from timelinelib.time import PyTimeType 158 from timelinelib.time import WxTimeType 159 if isinstance(time_type, PyTimeType): 160 return PyDateTimePicker 161 elif isinstance(time_type, WxTimeType): 162 return WxDateTimePicker 163 elif isinstance(time_type, NumTimeType): 164 return NumTimePicker 165 else: 166 raise ValueError("Unsupported time type: %s" % time_type)
167