/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/app.js

  • Committer: Gustav Hartvigsson
  • Date: 2015-06-05 19:06:14 UTC
  • Revision ID: gustav.hartvigsson@gmail.com-20150605190614-s410mh65n2jdxtcv
* Cleaded up a lille code
* Fixed a nasty segfault that could occur if the conig folder did not exist.

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 Gettext = imports.gettext;
 
10
const Gio = imports.gi.Gio;
 
11
const GLib = imports.gi.GLib;
 
12
const GObject = imports.gi.GObject;
 
13
const Gtk = imports.gi.Gtk;
 
14
const _ = imports.gettext.gettext;
 
15
const Lang = imports.lang;
 
16
 
 
17
const SettingsData = imports.settings_data;
 
18
/* const Style = imports.style; */
 
19
const PreferencesUI = imports.preferences_ui;
 
20
const UserMenu = imports.user_menu;
 
21
const UserButton = imports.user_button;
 
22
 
 
23
/** @class
 
24
 * This class is the main application class, it creates the main wiev
 
25
 * and basically is what runs the program.
 
26
 */
 
27
const Application = new Lang.Class ({
 
28
  Name: "Application",
 
29
  Extends: Gtk.Application,
 
30
  
 
31
  _init: function () {
 
32
    this.settings = SettingsData.get_settings ();
 
33
    
 
34
    Gettext.bindtextdomain ("gpump", "./locale/"); //FIXME
 
35
    Gettext.textdomain ("gpump");
 
36
    GLib.set_prgname ("gpump");
 
37
    
 
38
    this.parent ({
 
39
      application_id: "org.gego.gpump",
 
40
      flags: Gio.ApplicationFlags.FLAGS_NONE,
 
41
      register_session: true,
 
42
    });
 
43
    GLib.set_application_name (_("GPump"));
 
44
    
 
45
  },
 
46
  
 
47
  vfunc_activate: function () {
 
48
    /* Guarantee that only one window is present at any time. */
 
49
    let w_list = this.get_windows ();
 
50
    if (w_list.length) {
 
51
      w_list[0].present ();
 
52
      w_list[0].move (this.settings.get_setting ("ui.x").data,
 
53
                             this.settings.get_setting ("ui.y").data);
 
54
      return;
 
55
    }
 
56
    
 
57
    this._prepare_window ();
 
58
    this._prepare_app_menu ();
 
59
    this._prepare_header_bar ();
 
60
    
 
61
    /* Style.load_css (); */
 
62
    
 
63
    this.window.show_all ();
 
64
  },
 
65
  
 
66
  /**
 
67
   * This function is used to prepare the window, it also initializes and adds
 
68
   * the headerbar to it.
 
69
   */
 
70
  _prepare_window: function () {
 
71
    
 
72
    this.window = new Gtk.ApplicationWindow ({
 
73
      application: this,
 
74
      type: Gtk.WindowType.TOPLEVEL,
 
75
      title: GLib.get_application_name (),
 
76
      default_height: 500,
 
77
      default_width: 500,
 
78
      height_request: 500,
 
79
      width_request: 500,
 
80
      window_position: Gtk.WindowPosition.CENTER
 
81
    });
 
82
    
 
83
    this.window.set_titlebar ((this.headerbar = new Gtk.HeaderBar({
 
84
      title: GLib.get_application_name (),
 
85
      subtitle: _("A Pump.io client"),
 
86
      show_close_button: true
 
87
    })));
 
88
    
 
89
    if (!(this.settings.get_setting ("ui.x").data < 0 &&
 
90
        this.settings.get_setting ("ui.y").data < 0)){
 
91
      this.window.move (this.settings.get_setting ("ui.x").data,
 
92
                                       this.settings.get_setting ("ui.y").data);
 
93
    }
 
94
    
 
95
    var gtk_settings = Gtk.Settings.get_default ();
 
96
      if ( this.settings.get_setting ("main.use_dark").data ) {
 
97
        gtk_settings["gtk_application_prefer_dark_theme"] = true;
 
98
      } else {
 
99
        gtk_settings["gtk_application_prefer_dark_theme"] = false;
 
100
      }
 
101
    
 
102
    print ("derp!\n");
 
103
    
 
104
    
 
105
    
 
106
    this.window.add ((this.layout = new Gtk.Box ({
 
107
      orientation: Gtk.Orientation.VERTICAL
 
108
    })));
 
109
    
 
110
    /* * Building the stack switched views */
 
111
    /* switcher */
 
112
    /* Hack to centre the damn switcher */
 
113
    this.layout.pack_start ((this.switcher_box = new Gtk.Box ({
 
114
      orientation: Gtk.Orientation.HORIZONTAL
 
115
    })), false, false, 0);
 
116
    
 
117
    this.switcher_box.set_center_widget (
 
118
      (this.stack_switcher = new Gtk.StackSwitcher ())
 
119
    );
 
120
    
 
121
    /* the stack */
 
122
    this.layout.pack_end ((this.stack = new Gtk.Stack ({
 
123
      homogeneous: true,
 
124
      transition_duration: 250,
 
125
      transition_type: Gtk.StackTransitionType.CROSSFADE
 
126
    })), true, true, 0);
 
127
    
 
128
    /* main view */
 
129
    this.stack.add_titled ((new Gtk.ScrolledWindow ({
 
130
      child: (this.main_list_box = new Gtk.ListBox()),
 
131
      margin: 1
 
132
    })), "main", _("Main"));
 
133
    
 
134
    
 
135
    /* 'mean while' view */
 
136
    this.stack.add_titled ((new Gtk.ScrolledWindow ({
 
137
      child: (this.mw_list_box = new Gtk.ListBox()),
 
138
      margin: 1
 
139
    })), "meanwhile", _("Meanwhile"));
 
140
    
 
141
    /* * Hook up the stack and the stack switcher */
 
142
    this.stack_switcher.set_stack (this.stack);
 
143
    
 
144
    /* * Hide the window so, so we can show it later */
 
145
    this.window.connect ('delete_event',
 
146
                         Lang.bind (this, function () {
 
147
      print ("balls to it!");
 
148
      this._save_settings ();
 
149
      this.window.hide ();
 
150
      /* To Prevent the widow from rely being destroyed? */
 
151
      return true;
 
152
    }));
 
153
    
 
154
    this.add_window (this.window);
 
155
  },
 
156
  
 
157
  /**
 
158
   * This function is used to create the application menu.
 
159
   */
 
160
  _prepare_app_menu: function () {
 
161
    let menu = new Gio.Menu ();
 
162
    let section = new Gio.Menu ();
 
163
    
 
164
    section.append (_("Preferences"), "app.preferences");
 
165
    menu.append_section (null, section);
 
166
    
 
167
    section = new Gio.Menu ();
 
168
    section.append (_("About"), "app.about");
 
169
    section.append (_("Quit"), "app.quit");
 
170
    menu.append_section (null, section);
 
171
    
 
172
    this.set_app_menu (menu);
 
173
    
 
174
    let about_action = new Gio.SimpleAction ({name: "about"});
 
175
    about_action.connect ('activate', Lang.bind (this, function () {
 
176
      let about_dialog = new Gtk.AboutDialog ({use_header_bar: true,
 
177
        transient_for: this.window,
 
178
        modal: true,
 
179
        version: "pre-alpha ~BZR~",
 
180
        program_name: GLib.get_application_name (),
 
181
        copyright: "Gustav \'Gego/XAREN\' Hartvigsson, 2014",
 
182
        license_type: Gtk.License.LGPL_3_0});
 
183
      
 
184
      about_dialog.authors =
 
185
                          ["Gustav Hartvigsson <gustav.hartvigsson@gmail.com>"];
 
186
      about_dialog.connect ("response", function () {
 
187
        about_dialog.destroy ();
 
188
      });
 
189
      about_dialog.run ();
 
190
    }));
 
191
    this.add_action (about_action);
 
192
    
 
193
    let quit_action = new Gio.SimpleAction ({name: "quit"});
 
194
    quit_action.connect ('activate', Lang.bind (this, function () {
 
195
      this._save_settings ();
 
196
      this.quit ();
 
197
    }));
 
198
    this.add_action (quit_action);
 
199
    
 
200
    let preferences_action = new Gio.SimpleAction ({name: "preferences"});
 
201
    preferences_action.connect ('activate', Lang.bind (this, function (){
 
202
      let pref_dialog = new PreferencesUI.PreferencesUI ({
 
203
        transient_for: this.window
 
204
      });
 
205
      pref_dialog.run ();
 
206
    }));
 
207
    this.add_action (preferences_action);
 
208
  },
 
209
  
 
210
  /**
 
211
   * This function is used to prepare the hearderbar by adding buttons and
 
212
   * assigning callback functions to them.
 
213
   */
 
214
  _prepare_header_bar: function () {
 
215
    
 
216
    this.headerbar.pack_start ((this.new_post_btn = new Gtk.Button ({
 
217
      image: (new Gtk.Image ({icon_name: 'text-editor-symbolic'})),
 
218
      tooltip_text: _("Create new post"),
 
219
    })));
 
220
    
 
221
   this.new_post_btn.get_style_context ().add_class ("image-button");
 
222
    
 
223
    this.headerbar.pack_start ((this.refresh_btn = new Gtk.Button({
 
224
      image: (new Gtk.Image ({icon_name: 'emblem-synchronizing-symbolic'})),
 
225
      tooltip_text: _("Refresh the stream"),
 
226
    })));
 
227
    
 
228
    this.refresh_btn.get_style_context ().add_class ("image-button");
 
229
    
 
230
    this.headerbar.pack_end ((this.user_menu_btn = new UserButton.UserButton ({
 
231
      image: (new Gtk.Image ({icon_name: 'mail-send-symbolic'})),
 
232
      tooltip_text: _("Switch and manage users"),
 
233
      popover: (this.user_menu = new UserMenu.UserMenu ()),
 
234
    })));
 
235
    
 
236
  },
 
237
  
 
238
  _save_settings: function () {
 
239
    let allocation = this.window.get_allocation ();
 
240
    this.settings.set_setting ("ui.h", allocation.height);
 
241
    this.settings.set_setting ("ui.w", allocation.width);
 
242
    
 
243
    let win_pos = this.window.get_position ();
 
244
    this.settings.set_setting ("ui.x", win_pos[0]);
 
245
    this.settings.set_setting ("ui.y", win_pos[1]);
 
246
    this.settings.commit_to_file ();
 
247
  }
 
248
  
 
249
});