1
/* This file is part of GPump, a Pump.io client.
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.
9
const Gio = imports.gi.Gio;
10
const GLib = imports.gi.GLib;
11
const GObject = imports.gi.GObject;
12
const Lang = imports.lang;
13
const System = imports.system;
15
let _default_settings_object = null;
21
* Please use this function when getting the settings data object. It is not
22
* good to have multiple instances of the settings data object, it may
23
* cause problems down the line.
25
* @return The the default @c SettingsData object
27
function get_settings () {
28
if (!_default_settings_object) {
29
_default_settings_object = new SettingsData ();
31
return _default_settings_object;
36
const QUIT_ON_CLOSE = {
38
* Default value, will show the close dialogue on clicking the close button
42
/** Will not exist the app on close of main window */
44
/** Will exit on close of main window */
49
* NO NOT CREATE INSTANCES FROM THIS OBJECT, USE THE get_settings () FUNCTION!
51
const SettingsData = new Lang.Class ({
53
Extends: GObject.Object,
56
* When hooking up to this signal check that the name of the change.
58
* The function signature is <code> function my_callback (String: setting,
59
* Value: value) </code> where @c setting is the name of the setting,
60
* and @c value is the value to be that it has changed to.
62
* @warning Always check the @c value type and the @c setting name.
67
param_types: [GObject.TYPE_STRING, GObject.TYPE_INT]
72
/* Member definitions */
73
_settings_file_path: String,
75
_settings_file: Gio.File,
80
_init: function (params) {
83
/* First we construct the path for where to store the settings file. */
84
this._settings_file_path = "";
85
this._settings_file_path += GLib.get_user_config_dir ();
86
this._settings_file_path += "/gpump/gpump.json";
87
print ("Config file is: " + this._settings_file_path);
89
this._settings_file = Gio.File.new_for_path (this._settings_file_path);
91
/* Then we check that the file exists. If the file does not exists we
92
* construct some sane default values.
94
if (!GLib.file_test (this._settings_file_path, GLib.FileTest.EXISTS)) {
95
/* -1 is undefined, and will be set at construction of the window */
105
show_full_name: true,
106
only_show_avatar: false
110
quit_on_close: QUIT_ON_CLOSE.UNKNOWN
114
print (JSON.stringify (this._settings, null, 2).toString () );
116
let file_stream = this._settings_file.create (Gio.FileCreateFlags.PRIVATE,
118
file_stream.write_all (JSON.stringify (
119
this._settings, null, 2).toString (), null);
121
file_stream.close (null);
124
/* The file exists, we load the settings data into memory */
125
let file_stream = this._settings_file.read (null);
127
/* See: http://stackoverflow.com/a/21146281
129
let file_info = this._settings_file.query_info("standard::size",
130
Gio.FileQueryInfoFlags.NONE, null);
131
let size = file_info.get_size ();
133
let buffer = file_stream.read_bytes (size, null).get_data ();
135
this._settings = JSON.parse (buffer);
138
print (JSON.stringify (this._settings, null, 2).toString () );
144
* Sets a value in the setting object.
146
* @return false on fail
147
* @return true when everything is OK.
149
set_setting: function (setting, value) {
151
if (typeof setting != "string") {
152
print ("ERROR: The \"setting\" parameter must be a string.");
157
if (typeof value == "number") {
158
this._settings.ui.x = value;
160
print ("The setting \"ui.x\" must be a number.");
165
if (typeof value == "number") {
166
this._settings.ui.y = value;
168
print ("The setting \"ui.y\" must be a number.");
173
if (typeof value == "number") {
174
this._settings.ui.h = value;
176
print ("The setting \"ui.h\" must be a number.");
181
if (typeof value == "number") {
182
this._settings.ui.w = value;
184
print ("The setting \"ui.w\" must be a number.");
188
case "main.use_dark":
189
if (typeof value == "boolean") {
190
this._settings.main.use_dark = value;
192
print ("The setting \"main.use_dark\" must be a boolean.");
196
case "main.first_run":
197
if (typeof value == "boolean") {
198
this._settings.main.first_run = value;
200
print ("The setting \"main.first_run\" must be a boolean.");
204
case "main.quit_on_close":
205
if (typeof value == "number") {
206
this._settings.main.quit_on_close = value;
209
"The setting \"main.quit_on_close\" must be a number.");
213
case "main.privacy.show_full_name":
214
if (typeof value == "boolean") {
215
this._settings.main.privacy.show_full_name = value;
218
"The setting \"main.privacy.show_full_name\" must be a boolean.");
222
case "main.privacy.only_show_avatar":
223
if (typeof value == "boolean") {
224
this._settings.main.privacy.only_show_avatar = value;
227
"The setting \"main.privacy.only_show_avatar\" must be a boolean.");
233
print ("ERROR: The setting \"" + setting + "\" does not exist.");
239
/* Because, reasons. */
241
this.emit ("change", setting, value);
248
* Gets a value from the settings object.
250
* @param setting the @c String that corrosponds to the setting to get.
252
* @return a <code> complex object </code> with two field: @c ok and @c data.
254
* If @c ok is false something went wrong and the data field will be undefined.
256
* If @c ok is true everything is ok and the data field will be set to the
259
get_setting: function (setting) {
265
if (typeof setting != "string") {
266
print ("ERROR: The \"setting\" parameter must be a string.");
273
ret_data.data = this._settings.ui.x;
276
ret_data.data = this._settings.ui.y;
279
ret_data.data = this._settings.ui.h;
282
ret_data.data = this._settings.ui.w;
284
case "main.use_dark":
285
ret_data.data = this._settings.main.use_dark;
287
case "main.first_run":
288
ret_data.data = this._settings.main.first_run;
290
case "main.privacy.show_full_name":
291
ret_data.data = this._settings.main.privacy.show_full_name;
293
case "main.privacy.only_show_avatar":
294
ret_data.data = this._settings.main.privacy.only_show_avatar;
296
case "main.quit_on_close":
297
ret_data.data = this._settings.main.quit_on_close;
301
print ("ERROR: The setting \"" + setting + "\" does not exist.");
309
* Commits changes to the settings object to file.
311
commit_to_file: function () {
312
print (JSON.stringify (this._settings, null, 2).toString () );
314
let file_stream = this._settings_file.replace (null,
316
Gio.FileCreateFlags.PRIVATE,
318
file_stream.write_all (JSON.stringify (
319
this._settings, null, 2).toString (), null);
321
file_stream.close (null);