~unity-team/unity/4.0

« back to all changes in this revision

Viewing changes to plugins/unityshell/src/PlacesHomeView.cpp

  • Committer: smspillaz
  • Date: 2012-01-19 08:50:41 UTC
  • mfrom: (1732.3.3 unity.oneiric)
  • Revision ID: sam.spilsbury@canonical.com-20120119085041-ou6f0nbjvp52ot3q
Merge lp:unity/4.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
39
39
 
40
40
#include "PlacesHomeView.h"
41
41
 
42
 
#include "JSONParser.h"
43
42
#include "PlacesSimpleTile.h"
44
43
#include "PlacesStyle.h"
45
44
#include <UnityCore/GLibWrapper.h>
46
45
#include <UnityCore/Variant.h>
47
46
 
48
 
#include <sstream>
49
47
#include <string>
50
48
#include <vector>
51
49
 
52
 
#include <boost/algorithm/string.hpp>
53
 
 
54
50
#define DELTA_DOUBLE_REQUEST 500000000
55
51
 
56
 
namespace
57
 
{
58
 
  const std::string custom_shortcuts_file = "/unity/HomeShortcutsCustomized.json";
59
 
}
60
 
 
61
52
namespace unity
62
53
{
63
54
 
145
136
 
146
137
  expanded.connect(sigc::mem_fun(this, &PlacesHomeView::Refresh));
147
138
 
148
 
  // Wait for the asynchronous loading of the lenses to complete
149
 
  // before refreshing the view for the first time.
150
 
  _lenses.lenses_loaded.connect(sigc::bind(sigc::mem_fun(this, &PlacesHomeView::Refresh), (PlacesGroup*) NULL));
 
139
  Refresh();
151
140
}
152
141
 
153
142
PlacesHomeView::~PlacesHomeView()
174
163
 
175
164
  _layout->Clear();
176
165
 
177
 
  // The following code path allows one to replace the default dash home screen
178
 
  // with a custom home screen, the contents of which are described in a JSON
179
 
  // file. The file is looked for in the following locations in decreasing order
180
 
  // of priority:
181
 
  //   - $XDG_CONFIG_HOME/unity/ (defaults to $HOME/.config/unity/)
182
 
  //   - $DIR/unity/ for $DIR in $XDG_CONFIG_DIRS
183
 
  // The syntax of the file is as follows:
184
 
  // ==========================================================================
185
 
  // {
186
 
  //   "shortcut1": {
187
 
  //     "source": $source,
188
 
  //     "name": $name,
189
 
  //     "name[fr]": $name_in_french,
190
 
  //     […]
191
 
  //     "icon": $icon
192
 
  //   },
193
 
  //   "shortcut2": {
194
 
  //     […]
195
 
  //   },
196
 
  //   […]
197
 
  // }
198
 
  // ==========================================================================
199
 
  // The source attribute may either be a desktop file (full path or just its
200
 
  // basename if it is located in a standard directory), or a lens file
201
 
  // (basename only). This attribute is mandatory.
202
 
  // The 'name' attribute is optional. If present, it will override the default
203
 
  // display name as advertised by the desktop file or by the lens. The name can
204
 
  // be localized in several languages using the square brackets suffix
205
 
  // notation, in which case the locale matching the system’s will be used,
206
 
  // defaulting to the untranslated 'name' attribute if necessary.
207
 
  // The 'icon' attribute is optional. If present, it will override the default
208
 
  // icon as advertised by the desktop file or by the lens. It should be a full
209
 
  // path name.
210
 
  // If the source is a lens, the optional 'filter' attribute allows specifying
211
 
  // a filter in the form "$name:$value", e.g. "type:videos" for the files lens.
212
 
  // If the source is a lens, the optional 'section' attribute allows specifying
213
 
  // a section number (an integer starting at index 0).
214
 
 
215
 
  std::string customShortcuts;
216
 
  std::ostringstream file;
217
 
  // Look for a custom shortcuts file in the user’s home directory first.
218
 
  file << g_get_user_config_dir() << custom_shortcuts_file;
219
 
  if (g_file_test(file.str().c_str(), G_FILE_TEST_EXISTS))
220
 
  {
221
 
    customShortcuts = file.str();
222
 
  }
223
 
  else
224
 
  {
225
 
    // Fall back on the standard XDG directories.
226
 
    gchar** config = (gchar**) g_get_system_config_dirs();
227
 
    for (gint i = 0; config[i]; ++i)
228
 
    {
229
 
      std::ostringstream file;
230
 
      file << config[i] << custom_shortcuts_file;
231
 
      if (g_file_test(file.str().c_str(), G_FILE_TEST_EXISTS))
232
 
      {
233
 
        customShortcuts = file.str();
234
 
        break;
235
 
      }
236
 
    }
237
 
  }
238
 
  json::Parser parser;
239
 
  if ((customShortcuts == "") || !parser.Open(customShortcuts))
240
 
  {
241
 
    // Media Apps
242
 
    markup = g_strdup_printf(temp, _("Media Apps"));
243
 
    shortcut = new Shortcut(PKGDATADIR"/find_media_apps.png",
244
 
                            markup,
245
 
                            icon_size);
246
 
    shortcut->_id = TYPE_PLACE;
247
 
    shortcut->_place_id = g_strdup("applications.lens?filter_type=media");
248
 
    shortcut->_place_section = 9;
249
 
    _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
250
 
    shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
251
 
    g_free(markup);
252
 
 
253
 
    // Internet Apps
254
 
    markup = g_strdup_printf(temp, _("Internet Apps"));
255
 
    shortcut = new Shortcut(PKGDATADIR"/find_internet_apps.png",
256
 
                            markup,
257
 
                            icon_size);
258
 
    shortcut->_id = TYPE_PLACE;
259
 
    shortcut->_place_id = g_strdup("applications.lens?filter_type=internet");
260
 
    shortcut->_place_section = 8;
261
 
    _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
262
 
    shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
263
 
    g_free(markup);
264
 
 
265
 
    // More Apps
266
 
    markup = g_strdup_printf(temp, _("More Apps"));
267
 
    shortcut = new Shortcut(PKGDATADIR"/find_more_apps.png",
268
 
                            markup,
269
 
                            icon_size);
270
 
    shortcut->_id = TYPE_PLACE;
271
 
    shortcut->_place_id = g_strdup("applications.lens");
272
 
    shortcut->_place_section = 0;
273
 
    _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
274
 
    shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
275
 
    g_free(markup);
276
 
 
277
 
    // Find Files
278
 
    markup = g_strdup_printf(temp, _("Find Files"));
279
 
    shortcut = new Shortcut(PKGDATADIR"/find_files.png",
280
 
                            markup,
281
 
                            icon_size);
282
 
    shortcut->_id = TYPE_PLACE;
283
 
    shortcut->_place_id = g_strdup("files.lens");
284
 
    shortcut->_place_section = 0;
285
 
    _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
286
 
    shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
287
 
    g_free(markup);
288
 
 
289
 
    // Browser
290
 
    CreateShortcutFromMime("x-scheme-handler/http", _("Browse the Web"), _browser_alternatives);
291
 
 
292
 
    // Photos
293
 
    // FIXME: Need to figure out the default
294
 
    CreateShortcutFromExec("shotwell", _("View Photos"), _photo_alternatives);
295
 
 
296
 
    CreateShortcutFromMime("x-scheme-handler/mailto", _("Check Email"), _email_alternatives);
297
 
 
298
 
    CreateShortcutFromMime("audio/x-vorbis+ogg", _("Listen to Music"), _music_alternatives);
299
 
  }
300
 
  else
301
 
  {
302
 
    // The custom shortcuts file can contain up to 8 shortcuts.
303
 
    for (int i = 0; i < 8; ++i)
304
 
    {
305
 
      std::ostringstream oss;
306
 
      oss << "shortcut" << (i + 1);
307
 
      std::string slot = oss.str();
308
 
      std::string source;
309
 
      parser.ReadString(slot, "source", source);
310
 
      if (source != "")
311
 
      {
312
 
        std::string icon;
313
 
        parser.ReadString(slot, "icon", icon);
314
 
 
315
 
        std::string name;
316
 
        gchar** languages = (gchar**) g_get_language_names();
317
 
        for (gint i = 0; languages[i]; ++i)
318
 
        {
319
 
          std::ostringstream key;
320
 
          key << "name[" << languages[i] << "]";
321
 
          parser.ReadString(slot, key.str(), name);
322
 
          if (name != "")
323
 
            break;
324
 
        }
325
 
        if (name == "")
326
 
        {
327
 
          parser.ReadString(slot, "name", name);
328
 
        }
329
 
 
330
 
        if (boost::iends_with(source, ".desktop"))
331
 
        {
332
 
          GDesktopAppInfo* info = NULL;
333
 
          if (boost::istarts_with(source, "/"))
334
 
            info = g_desktop_app_info_new_from_filename(source.c_str());
335
 
          else
336
 
            info = g_desktop_app_info_new(source.c_str());
337
 
          if (G_IS_DESKTOP_APP_INFO(info))
338
 
          {
339
 
            if (name == "")
340
 
              name = g_app_info_get_display_name(G_APP_INFO(info));
341
 
            if (icon == "")
342
 
            {
343
 
              gchar* cicon = g_icon_to_string(g_app_info_get_icon(G_APP_INFO(info)));
344
 
              icon = cicon;
345
 
              g_free(cicon);
346
 
            }
347
 
            gchar* exec = g_strdup(g_app_info_get_executable(G_APP_INFO(info)));
348
 
            markup = g_strdup_printf(temp, name.c_str());
349
 
            shortcut = new Shortcut(icon.c_str(), markup, style->GetHomeTileIconSize());
350
 
            shortcut->_id = TYPE_EXEC;
351
 
            shortcut->_exec = exec;
352
 
            _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
353
 
            shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
354
 
            g_free(markup);
355
 
            g_object_unref(info);
356
 
          }
357
 
        }
358
 
        else if (boost::iends_with(source, ".lens"))
359
 
        {
360
 
          unity::dash::Lens::Ptr lens = _lenses.GetLens(source);
361
 
          if (lens)
362
 
          {
363
 
            if (name == "")
364
 
              name = lens->name;
365
 
            if (icon == "")
366
 
              icon = lens->icon_hint;
367
 
          }
368
 
          std::string filter;
369
 
          parser.ReadString(slot, "filter", filter);
370
 
          int section = -1;
371
 
          parser.ReadInt(slot, "section", section);
372
 
          markup = g_strdup_printf(temp, name.c_str());
373
 
          shortcut = new Shortcut(icon.c_str(), markup, style->GetHomeTileIconSize());
374
 
          shortcut->_id = TYPE_PLACE;
375
 
          if (filter != "")
376
 
          {
377
 
            std::vector<std::string> filter_key_value;
378
 
            boost::split(filter_key_value, filter, boost::is_any_of(":"));
379
 
            if (filter_key_value.size() == 2)
380
 
              shortcut->_place_id = g_strdup_printf("%s?filter_%s=%s",
381
 
                                                    source.c_str(),
382
 
                                                    filter_key_value[0].c_str(),
383
 
                                                    filter_key_value[1].c_str());
384
 
            else
385
 
              shortcut->_place_id = g_strdup(source.c_str());
386
 
          }
387
 
          else
388
 
            shortcut->_place_id = g_strdup(source.c_str());
389
 
          if (section != -1)
390
 
            shortcut->_place_section = section;
391
 
          _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
392
 
          shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
393
 
          g_free(markup);
394
 
        }
395
 
      }
396
 
    }
397
 
  }
 
166
  // Media Apps
 
167
  markup = g_strdup_printf(temp, _("Media Apps"));
 
168
  shortcut = new Shortcut(PKGDATADIR"/find_media_apps.png",
 
169
                          markup,
 
170
                          icon_size);
 
171
  shortcut->_id = TYPE_PLACE;
 
172
  shortcut->_place_id = g_strdup("applications.lens?filter_type=media");
 
173
  shortcut->_place_section = 9;
 
174
  _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
 
175
  shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
 
176
  g_free(markup);
 
177
 
 
178
  // Internet Apps
 
179
  markup = g_strdup_printf(temp, _("Internet Apps"));
 
180
  shortcut = new Shortcut(PKGDATADIR"/find_internet_apps.png",
 
181
                          markup,
 
182
                          icon_size);
 
183
  shortcut->_id = TYPE_PLACE;
 
184
  shortcut->_place_id = g_strdup("applications.lens?filter_type=internet");
 
185
  shortcut->_place_section = 8;
 
186
  _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
 
187
  shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
 
188
  g_free(markup);
 
189
 
 
190
  // More Apps
 
191
  markup = g_strdup_printf(temp, _("More Apps"));
 
192
  shortcut = new Shortcut(PKGDATADIR"/find_more_apps.png",
 
193
                          markup,
 
194
                          icon_size);
 
195
  shortcut->_id = TYPE_PLACE;
 
196
  shortcut->_place_id = g_strdup("applications.lens");
 
197
  shortcut->_place_section = 0;
 
198
  _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
 
199
  shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
 
200
  g_free(markup);
 
201
 
 
202
  // Find Files
 
203
  markup = g_strdup_printf(temp, _("Find Files"));
 
204
  shortcut = new Shortcut(PKGDATADIR"/find_files.png",
 
205
                          markup,
 
206
                          icon_size);
 
207
  shortcut->_id = TYPE_PLACE;
 
208
  shortcut->_place_id = g_strdup("files.lens");
 
209
  shortcut->_place_section = 0;
 
210
  _layout->AddView(shortcut, 1, nux::eLeft, nux::eFull);
 
211
  shortcut->sigClick.connect(sigc::mem_fun(this, &PlacesHomeView::OnShortcutClicked));
 
212
  g_free(markup);
 
213
 
 
214
  // Browser
 
215
  CreateShortcutFromMime("x-scheme-handler/http", _("Browse the Web"), _browser_alternatives);
 
216
 
 
217
  // Photos
 
218
  // FIXME: Need to figure out the default
 
219
  CreateShortcutFromExec("shotwell", _("View Photos"), _photo_alternatives);
 
220
 
 
221
  CreateShortcutFromMime("x-scheme-handler/mailto", _("Check Email"), _email_alternatives);
 
222
 
 
223
  CreateShortcutFromMime("audio/x-vorbis+ogg", _("Listen to Music"), _music_alternatives);
398
224
 
399
225
  SetExpanded(true);
400
226
  SetCounts(8, 8);