1# -*- coding: utf-8 -*-
2#
3# PhotoFilmStrip - Creates movies out of your pictures.
4#
5# Copyright (C) 2011 Jens Goepfert
6#
7
8import locale
9import logging
10import os
11import tempfile
12
13from configparser import ConfigParser
14from photofilmstrip.lib.common.Singleton import Singleton
15from photofilmstrip.lib.util import IsPathWritable
16
17from photofilmstrip import Constants
18
19
20class Settings(Singleton):
21
22    def __init__(self):
23        self.cp = None
24
25        if IsPathWritable(Constants.APP_DIR):
26            setPath = Constants.APP_DIR
27        else:
28            userpath = os.path.expanduser("~")
29            if userpath == "~":
30                userpath = tempfile.gettempdir()
31            setPath = userpath
32
33        self.filename = os.path.join(setPath, '.%s' % Constants.APP_NAME)
34
35        logging.debug("settings file: %s", self.filename)
36
37        self.Load()
38
39    def Load(self):
40        if self.cp is None:
41            self.cp = ConfigParser()
42
43        if os.path.isfile(self.filename):
44            self.cp.read(self.filename, "utf-8")
45
46        if not self.cp.has_section("General"):
47            self.cp.add_section("General")
48
49        if not self.cp.has_section("History"):
50            self.cp.add_section("History")
51
52        if not self.cp.has_section("Profiles"):
53            self.cp.add_section("Profiles")
54
55    def Save(self):
56        try:
57            fd = open(self.filename, 'w', encoding='utf-8')
58            self.cp.write(fd)
59            fd.close()
60        except IOError:
61            pass
62
63    def SetLanguage(self, lang):
64        self.Load()
65        self.cp.set("General", "Language", lang)
66        self.Save()
67
68    def GetLanguage(self):
69        self.Load()
70        if self.cp.has_option("General", "Language"):
71            return self.cp.get("General", "Language")
72        defLang = locale.getdefaultlocale()[0]
73        if defLang is None:
74            defLang = ""
75        return defLang
76
77    def SetFileHistory(self, fileList):
78        self.Load()
79        self.cp.remove_section("History")
80        self.cp.add_section("History")
81        for idx, filename in enumerate(fileList):
82            if idx < 10 and os.path.exists(filename):
83                self.cp.set("History", "%d" % idx, os.path.abspath(filename))
84        self.Save()
85
86    def GetFileHistory(self):
87        self.Load()
88        fileList = []
89        for idx in range(10):
90            if self.cp.has_option("History", str(idx)):
91                filename = self.cp.get("History", str(idx))
92                if os.path.exists(filename) and filename not in fileList:
93                    fileList.append(filename)
94
95        return fileList
96
97    def SetProjectPath(self, path):
98        self.Load()
99        self.cp.set("General", "ProjectPath", path)
100        self.Save()
101
102    def GetProjectPath(self):
103        self.Load()
104        if self.cp.has_option("General", "ProjectPath"):
105            return self.cp.get("General", "ProjectPath")
106        return u""
107
108    def SetImagePath(self, path):
109        self.Load()
110        self.cp.set("General", "ImagePath", path)
111        self.Save()
112
113    def GetImagePath(self):
114        self.Load()
115        if self.cp.has_option("General", "ImagePath"):
116            return self.cp.get("General", "ImagePath")
117        return u""
118
119    def SetAudioPath(self, path):
120        self.Load()
121        self.cp.set("General", "AudioPath", path)
122        self.Save()
123
124    def GetAudioPath(self):
125        self.Load()
126        if self.cp.has_option("General", "AudioPath"):
127            return self.cp.get("General", "AudioPath")
128        return u""
129
130    def SetLastProfile(self, profile):
131        self.Load()
132        self.cp.set("General", "LastProfile", str(profile))
133        self.Save()
134
135    def GetLastProfile(self):
136        self.Load()
137        if self.cp.has_option("General", "LastProfile"):
138            try:
139                return self.cp.get("General", "LastProfile")
140            except:
141                pass
142        return None
143
144    def SetUsedRenderer(self, renderer):
145        self.Load()
146        self.cp.set("General", "Renderer", str(renderer))
147        self.Save()
148
149    def GetUsedRenderer(self):
150        self.Load()
151        if self.cp.has_option("General", "Renderer"):
152            try:
153                return self.cp.getint("General", "Renderer")
154            except:
155                pass
156        return None
157
158    def SetLastKnownVersion(self, version):
159        self.Load()
160        self.cp.set("General", "LastKnownVersion", version)
161        self.Save()
162
163    def GetLastKnownVersion(self):
164        self.Load()
165        if self.cp.has_option("General", "LastKnownVersion"):
166            return self.cp.get("General", "LastKnownVersion")
167        return "0.0.0"
168
169    def SetRenderProperties(self, renderer, props):
170        self.Load()
171        if self.cp.has_section(renderer):
172            self.cp.remove_section(renderer)
173        self.cp.add_section(renderer)
174        for prop, value in props.items():
175            self.cp.set(renderer, prop, value)
176        self.Save()
177
178    def GetRenderProperties(self, renderer):
179        self.Load()
180        result = {}
181        if not self.cp.has_section(renderer):
182            return result
183        for prop, value in self.cp.items(renderer):
184            result[prop] = value
185
186        return result
187