Package Gnumed :: Package timelinelib :: Package config :: Module dotfile
[frames] | no frames]

Source Code for Module Gnumed.timelinelib.config.dotfile

  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  """ 
 20  Handle application configuration. 
 21   
 22  This module is global and can be used by all modules. Before accessing 
 23  configurations, the read function should be called. To save the current 
 24  configuration back to file, call the write method. 
 25  """ 
 26   
 27   
 28  import sys 
 29  from ConfigParser import ConfigParser 
 30  from ConfigParser import DEFAULTSECT 
 31  import os.path 
 32   
 33   
 34  # Name used in ConfigParser 
 35  WINDOW_WIDTH = "window_width" 
 36  WINDOW_HEIGHT = "window_height" 
 37  WINDOW_XPOS = "window xpos" 
 38  WINDOW_YPOS = "window ypos" 
 39  WINDOW_MAXIMIZED = "window_maximized" 
 40  SHOW_SIDEBAR = "show_sidebar" 
 41  SHOW_LEGEND = "show_legend" 
 42  SIDEBAR_WIDTH = "sidebar_width" 
 43  RECENT_FILES = "recent_files" 
 44  OPEN_RECENT_AT_STARTUP = "open_recent_at_startup" 
 45  BALLOON_ON_HOVER = "balloon_on_hover" 
 46  WEEK_START = "week_start" 
 47  USE_WIDE_DATE_RANGE = "use_wide_date_range" 
 48  USE_INERTIAL_SCROLLING = "use_inertial_scrolling" 
 49  DEFAULTS = { 
 50      WINDOW_WIDTH: "900", 
 51      WINDOW_HEIGHT: "500", 
 52      WINDOW_XPOS: "-1", 
 53      WINDOW_YPOS: "-1", 
 54      WINDOW_MAXIMIZED: "False", 
 55      SHOW_SIDEBAR: "True", 
 56      SIDEBAR_WIDTH: "200", 
 57      SHOW_LEGEND: "True", 
 58      OPEN_RECENT_AT_STARTUP: "True", 
 59      RECENT_FILES: "", 
 60      BALLOON_ON_HOVER: "True", 
 61      WEEK_START: "monday", 
 62      USE_WIDE_DATE_RANGE: "False", 
 63      USE_INERTIAL_SCROLLING : "False" 
 64  } 
 65  # Some settings 
 66  MAX_NBR_OF_RECENT_FILES_SAVED = 5 
 67  ENCODING = "utf-8" 
 68   
 69   
70 -def read_config(path):
71 config = Config(path) 72 config.read() 73 return config
74 75
76 -class Config(object):
77 """ 78 Provide read and write access to application configuration settings. 79 80 Built as a wrapper around ConfigParser: Properties exist to read and write 81 values but ConfigParser does the actual reading and writing of the 82 configuration file. 83 """ 84
85 - def __init__(self, path):
86 self.path = path 87 self.config_parser = ConfigParser(DEFAULTS)
88
89 - def read(self):
90 """Read settings from file specified in constructor.""" 91 self.config_parser.read(self.path)
92
93 - def write(self):
94 """ 95 Write settings to file specified in constructor and raise IOError if 96 failed. 97 """ 98 f = open(self.path, "w") 99 try: 100 self.config_parser.write(f) 101 finally: 102 f.close()
103
104 - def get_window_size(self):
105 return (self.config_parser.getint(DEFAULTSECT, WINDOW_WIDTH), 106 self.config_parser.getint(DEFAULTSECT, WINDOW_HEIGHT))
107 - def set_window_size(self, size):
108 width, height = size 109 self.config_parser.set(DEFAULTSECT, WINDOW_WIDTH, str(width)) 110 self.config_parser.set(DEFAULTSECT, WINDOW_HEIGHT, str(height))
111 window_size = property(get_window_size, set_window_size) 112
113 - def get_window_pos(self):
114 width, height = self.get_window_size() 115 # Make sure that some area of the window is visible on the screen 116 # Some part of the titlebar must be visible 117 xpos = max(-width + 100, 118 self.config_parser.getint(DEFAULTSECT, WINDOW_XPOS)) 119 # Titlebar must not be above the upper screen border 120 ypos = max(0, self.config_parser.getint(DEFAULTSECT, WINDOW_YPOS)) 121 return (xpos, ypos)
122
123 - def set_window_pos(self, pos):
124 xpos, ypos = pos 125 self.config_parser.set(DEFAULTSECT, WINDOW_XPOS, str(xpos)) 126 self.config_parser.set(DEFAULTSECT, WINDOW_YPOS, str(ypos))
127 window_pos = property(get_window_pos, set_window_pos) 128
129 - def get_window_maximized(self):
130 return self.config_parser.getboolean(DEFAULTSECT, WINDOW_MAXIMIZED)
131 - def set_window_maximized(self, maximized):
132 self.config_parser.set(DEFAULTSECT, WINDOW_MAXIMIZED, str(maximized))
133 window_maximized = property(get_window_maximized, set_window_maximized) 134
135 - def get_show_sidebar(self):
136 return self.config_parser.getboolean(DEFAULTSECT, SHOW_SIDEBAR)
137 - def set_show_sidebar(self, show):
138 self.config_parser.set(DEFAULTSECT, SHOW_SIDEBAR, str(show))
139 show_sidebar = property(get_show_sidebar, set_show_sidebar) 140
141 - def get_show_legend(self):
142 return self.config_parser.getboolean(DEFAULTSECT, SHOW_LEGEND)
143 - def set_show_legend(self, show):
144 self.config_parser.set(DEFAULTSECT, SHOW_LEGEND, str(show))
145 show_legend = property(get_show_legend, set_show_legend) 146
147 - def get_sidebar_width(self):
148 return self.config_parser.getint(DEFAULTSECT, SIDEBAR_WIDTH)
149 - def set_sidebar_width(self, width):
150 self.config_parser.set(DEFAULTSECT, SIDEBAR_WIDTH, str(width))
151 sidebar_width = property(get_sidebar_width, set_sidebar_width) 152
153 - def get_recently_opened(self):
154 ro = self.config_parser.get(DEFAULTSECT, RECENT_FILES).decode(ENCODING).split(",") 155 # Filter out empty elements: "".split(",") will return [""] but we want 156 # the empty list 157 ro_filtered = [x for x in ro if x] 158 return ro_filtered
159 recently_opened = property(get_recently_opened) 160
161 - def append_recently_opened(self, path):
162 if path in [":tutorial:"]: 163 # Special timelines should not be saved 164 return 165 if isinstance(path, str): 166 # This path might have come from the command line so we need to convert 167 # it to unicode 168 path = path.decode(sys.getfilesystemencoding()) 169 abs_path = os.path.abspath(path) 170 current = self.recently_opened 171 # Just keep one entry of the same path in the list 172 if abs_path in current: 173 current.remove(abs_path) 174 current.insert(0, abs_path) 175 self.config_parser.set(DEFAULTSECT, RECENT_FILES, 176 (",".join(current[:MAX_NBR_OF_RECENT_FILES_SAVED])).encode(ENCODING))
177
179 return self.config_parser.getboolean(DEFAULTSECT, OPEN_RECENT_AT_STARTUP)
180 - def set_open_recent_at_startup(self, open):
181 self.config_parser.set(DEFAULTSECT, OPEN_RECENT_AT_STARTUP, str(open))
182 open_recent_at_startup = property(get_open_recent_at_startup, 183 set_open_recent_at_startup) 184
185 - def get_balloon_on_hover(self):
186 return self.config_parser.getboolean(DEFAULTSECT, BALLOON_ON_HOVER)
187 - def set_balloon_on_hover(self, balloon_on_hover):
188 self.config_parser.set(DEFAULTSECT, BALLOON_ON_HOVER, str(balloon_on_hover))
189 balloon_on_hover = property(get_balloon_on_hover, set_balloon_on_hover) 190
191 - def get_week_start(self):
192 return self.config_parser.get(DEFAULTSECT, WEEK_START)
193 - def set_week_start(self, week_start):
194 if not week_start in ["monday", "sunday"]: 195 raise ValueError("Invalid week start.") 196 self.config_parser.set(DEFAULTSECT, WEEK_START, week_start)
197 week_start = property(get_week_start, set_week_start) 198
199 - def get_use_wide_date_range(self):
200 return self.config_parser.getboolean(DEFAULTSECT, USE_WIDE_DATE_RANGE)
201 - def set_use_wide_date_range(self, value):
202 self.config_parser.set(DEFAULTSECT, USE_WIDE_DATE_RANGE, str(value))
203 use_wide_date_range = property(get_use_wide_date_range, set_use_wide_date_range) 204
206 return self.config_parser.getboolean(DEFAULTSECT, USE_INERTIAL_SCROLLING)
207 - def set_use_inertial_scrolling(self, value):
208 self.config_parser.set(DEFAULTSECT, USE_INERTIAL_SCROLLING, str(value))
209 use_inertial_scrolling = property(get_use_inertial_scrolling, set_use_inertial_scrolling)
210