/gpump/trunk

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/gpump/trunk

« back to all changes in this revision

Viewing changes to src/settings-data.js

  • Committer: Gustav Hartvigsson
  • Date: 2014-06-08 11:03:55 UTC
  • Revision ID: gustav.hartvigsson@gmail.com-20140608110355-iclqvmqxobyrmm6j
* removed old stuffs

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* This file is part of GPump, a Pump.io client.
2
 
 *
3
 
 * GPump (THE SOFTWARE) is made available under the terms and conditions of the
4
 
 * GNU Lesser General Public Licence 3.0. A copy of the licence can be read
5
 
 * in the file lgpl-3.0.txt in the root of this project.
6
 
 */
7
 
 
8
 
 
9
 
const Gio = imports.gi.Gio;
10
 
const GLib = imports.gi.GLib;
11
 
const Lang = imports.lang;
12
 
const System = imports.system;
13
 
 
14
 
let _default_settings_object = null;
15
 
 
16
 
/** @file
17
 
 */
18
 
 
19
 
/**
20
 
 * Please use this function when getting the settings data object. It is not
21
 
 * good to have multiple instances of the settings data object, it may
22
 
 * cause problems down the line.
23
 
 */
24
 
function get_settings () {
25
 
  if (!_default_settings_object) {
26
 
    _default_settings_object = new SettingsData ();
27
 
  }
28
 
  return _default_settings_object;
29
 
}
30
 
 
31
 
/**
32
 
 * NO NOT CREATE INSTANCES FROM THIS OBJECT, USE THE get_settings () FUNCTION!
33
 
 */
34
 
const SettingsData = new Lang.Class ({
35
 
  Name: 'SettingsData',
36
 
  
37
 
  /* Member definitions */
38
 
  _settings_file_path: String,
39
 
  _settings: Array,
40
 
  _settings_file: Gio.File,
41
 
  
42
 
  _init: function () {
43
 
    /* First we construct the path for where to store the settings file. */
44
 
    this._settings_file_path = "";
45
 
    this._settings_file_path += GLib.get_user_config_dir ();
46
 
    this._settings_file_path += "/gpump/gpump.json";
47
 
    print ("Config file is: " + this._settings_file_path);
48
 
    
49
 
    this._settings_file = Gio.File.new_for_path (this._settings_file_path);
50
 
    
51
 
    /* Then we check that the file exists. If the file doen not ekist we
52
 
     * construct some sane default values.
53
 
     */
54
 
    if (!GLib.file_test (this._settings_file_path, GLib.FileTest.EXISTS)) {
55
 
      /* -1 is undefined, and will be set at construction of the window */
56
 
      this._settings = {
57
 
        ui: {
58
 
          x: -1,
59
 
          y: -1,
60
 
          h: 500,
61
 
          w: 500
62
 
        },
63
 
        main: {
64
 
          privacy: {
65
 
            show_full_name: true,
66
 
            only_show_avatar: false
67
 
          },
68
 
          use_dark: false,
69
 
          first_run: true
70
 
        }
71
 
      };
72
 
      // DEBUG:
73
 
      print (JSON.stringify (this._settings, null, 2).toString () );
74
 
      
75
 
      let file_stream = this._settings_file.create (Gio.FileCreateFlags.PRIVATE,
76
 
                                                    null);
77
 
      file_stream.write_all (JSON.stringify (
78
 
          this._settings, null, 2).toString (), null);
79
 
      
80
 
      file_stream.close (null);
81
 
      
82
 
    } else {
83
 
      /* The file exists, we load the settings data into memory */
84
 
      let file_stream = this._settings_file.read (null);
85
 
      
86
 
      /* See: http://stackoverflow.com/a/21146281
87
 
       */
88
 
      let file_info = this._settings_file.query_info("standard::size",
89
 
                                             Gio.FileQueryInfoFlags.NONE, null);
90
 
      let size = file_info.get_size ();
91
 
      
92
 
      let buffer = file_stream.read_bytes (size, null).get_data ();
93
 
      
94
 
      this._settings = JSON.parse (buffer);
95
 
      
96
 
      //DEBUG:
97
 
      print (JSON.stringify (this._settings, null, 2).toString () );
98
 
      
99
 
    }
100
 
  },
101
 
  
102
 
  /**
103
 
   * Sets a value in the setting object.
104
 
   * 
105
 
   * return: false on fail
106
 
   * return: true when everything is OK.
107
 
   */
108
 
  set_setting: function (setting, value) {
109
 
    if (typeof setting != "string") {
110
 
      print ("ERROR: The \"setting\" parameter must be a string.");
111
 
      return false;
112
 
    }
113
 
    switch (setting) {
114
 
      case "ui.x":
115
 
        if (typeof value == "number") {
116
 
          this._settings.ui.x = value;
117
 
        } else {
118
 
          print ("The setting \"ui.x\" must be a number.");
119
 
        }
120
 
        break;
121
 
      case "ui.y":
122
 
        if (typeof value == "number") {
123
 
          this._settings.ui.y = value;
124
 
        } else {
125
 
          print ("The setting \"ui.y\" must be a number.");
126
 
        }
127
 
        break;
128
 
      case "ui.h":
129
 
        if (typeof value == "number") {
130
 
          this._settings.ui.h = value;
131
 
        } else {
132
 
          print ("The setting \"ui.h\" must be a number.");
133
 
        }
134
 
        break;
135
 
      case "ui.w":
136
 
        if (typeof value == "number") {
137
 
          this._settings.ui.w = value;
138
 
        } else {
139
 
          print ("The setting \"ui.w\" must be a number.");
140
 
        }
141
 
        break;
142
 
      case "main.use_dark":
143
 
        if (typeof value == "boolean") {
144
 
          this._settings.main.use_dark = value;
145
 
        } else {
146
 
          print ("The setting \"main.use_dark\" must be a boolean.");
147
 
        }
148
 
        break;
149
 
      case "main.first_run":
150
 
        if (typeof value == "boolean") {
151
 
          this._settings.main.first_run = value;
152
 
        } else {
153
 
          print ("The setting \"main.first_run\" must be a boolean.");
154
 
        }
155
 
        break;
156
 
      case "main.privacy.show_full_name":
157
 
        if (typeof value == "boolean") {
158
 
          this._settings.main.privacy.show_full_name = value;
159
 
        } else {
160
 
          print (
161
 
          "The setting \"main.privacy.show_full_name\" must be a boolean.");
162
 
        }
163
 
        break;
164
 
      case "main.privacy.only_show_avatar":
165
 
        if (typeof value == "boolean") {
166
 
          this._settings.main.privacy.only_show_avatar = value;
167
 
        } else {
168
 
          print (
169
 
          "The setting \"main.privacy.only_show_avatar\" must be a boolean.");
170
 
        }
171
 
        break;
172
 
      default:
173
 
        
174
 
        print ("ERROR: The setting \"" + setting + "\" does not exist.");
175
 
        return false;
176
 
        break;
177
 
    }
178
 
    
179
 
    return true;
180
 
  },
181
 
  
182
 
  /**
183
 
   * Gets a value from the settings object.
184
 
   *
185
 
   * returns a complex object with two field: ok and data.
186
 
   *
187
 
   * If ok is false something went wrong and the data field will be undefined.
188
 
   *
189
 
   * If ok is true everything is ok and the data field will be set to the value.
190
 
   */
191
 
  get_setting: function (setting) {
192
 
    let ret_data = {
193
 
      ok: true,
194
 
      data: undefined
195
 
    };
196
 
    
197
 
    if (typeof setting != "string") {
198
 
      print ("ERROR: The \"setting\" parameter must be a string.");
199
 
      ret_data.ok = false;
200
 
      return ret_data;
201
 
    }
202
 
    
203
 
    switch (setting) {
204
 
      case "ui.x":
205
 
        ret_data.data = this._settings.ui.x;
206
 
        break;
207
 
      case "ui.y":
208
 
        ret_data.data = this._settings.ui.y;
209
 
        break;
210
 
      case "ui.h":
211
 
        ret_data.data = this._settings.ui.h;
212
 
        break;
213
 
      case "ui.w":
214
 
        ret_data.data = this._settings.ui.w;
215
 
        break;
216
 
      case "main.use_dark":
217
 
        ret_data.data = this._settings.main.use_dark;
218
 
        break;
219
 
      case "main.first_run":
220
 
        ret_data.data = this._settings.main.first_run;
221
 
        break;
222
 
      case "main.privacy.show_full_name":
223
 
        ret_data.data = this._settings.main.privacy.show_full_name;
224
 
        break;
225
 
      case "main.privacy.only_show_avatar":
226
 
        ret_data.data = this._settings.main.privacy.only_show_avatar;
227
 
        break;
228
 
      default:
229
 
        ret_data.ok = false;
230
 
        print ("ERROR: The setting \"" + setting + "\" does not exist.");
231
 
        break;
232
 
    }
233
 
    
234
 
    return ret_data;
235
 
  },
236
 
  
237
 
  /**
238
 
   * Commits changes to the settings object to file.
239
 
   */
240
 
  commit_to_file: function () {
241
 
    print (JSON.stringify (this._settings, null, 2).toString () );
242
 
      
243
 
      let file_stream = this._settings_file.replace (null,
244
 
                                                    false,
245
 
                                                    Gio.FileCreateFlags.PRIVATE,
246
 
                                                    null);
247
 
      file_stream.write_all (JSON.stringify (
248
 
          this._settings, null, 2).toString (), null);
249
 
      
250
 
      file_stream.close (null);
251
 
  }
252
 
  
253
 
  // End of class.
254
 
});
255
 
 
256
 
 
257