2
* Copyright (C) 2010 Canonical Ltd
4
* This program is free software: you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License version 3 as
6
* published by the Free Software Foundation.
8
* This program is distributed in the hope that it will be useful,
9
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
* GNU General Public License for more details.
13
* You should have received a copy of the GNU General Public License
14
* along with this program. If not, see <http://www.gnu.org/licenses/>.
16
* Authored by Mirco "MacSlow" Müller <mirco.mueller@canonical.com>
17
* Neil Jagdish Patel <neil.patel@canonical.com>
23
namespace Unity.Places
25
public class View : Ctk.Box
27
public static const float PADDING = 8.0f;
29
public Shell shell { get; construct; }
31
public PlaceModel model { get; construct; }
33
private Ctk.VBox content_box;
34
private LayeredBin layered_bin;
36
public PlaceEntry home_entry;
37
public PlaceSearchBar search_bar;
38
private Unity.Place.Renderer? renderer;
39
private unowned PlaceEntry? active_entry = null;
41
private bool is_showing = false;
43
public View (Shell shell, PlaceModel model)
45
Object (shell:shell, orientation:Ctk.Orientation.VERTICAL, model:model);
47
Testing.ObjectRegistry.get_default ().register ("UnityPlacesView", this);
54
shell.get_stage ().captured_event.connect (on_stage_event_captured);
59
public void about_to_show ()
61
if (home_entry is PlaceHomeEntry)
66
home_entry = new PlaceHomeEntry (shell, model);
68
content_box = new Ctk.VBox (4);
69
content_box.padding = {
75
pack (content_box, true, true);
78
search_bar = new PlaceSearchBar ();
79
content_box.pack (search_bar, false, true);
81
search_bar.entry.text.captured_event.connect (on_stage_event_captured);
82
search_bar.entry.text.activatable = true;
83
search_bar.entry.text.activate.connect (() => {
84
if (renderer is Clutter.Actor)
86
renderer.activate_default ();
90
layered_bin = new LayeredBin ();
91
content_box.pack (layered_bin, true, true);
101
on_entry_view_activated (home_entry, 0);
104
public void hidden ()
108
if (active_entry is PlaceEntry)
110
active_entry.active = false;
113
remove_current_renderer ();
116
public void on_entry_view_activated (PlaceEntry entry, uint section_id)
118
if (active_entry is PlaceEntry)
120
active_entry.active = false;
122
if (active_entry != home_entry)
123
active_entry.renderer_info_changed.disconnect (on_entry_renderer_info_changed);
125
active_entry = entry;
128
update_views (entry, section_id);
130
entry.renderer_info_changed.connect (on_entry_renderer_info_changed);
133
/* Fade out previous results view if we had one, and set
134
* this.renderer = null */
135
private void remove_current_renderer ()
137
if (renderer is Clutter.Actor)
139
var anim = renderer.animate (Clutter.AnimationMode.EASE_OUT_QUAD,
143
layered_bin.remove_actor (renderer);
148
private void update_views (PlaceEntry entry, uint section_id=0)
150
search_bar.set_active_entry_view (entry, 0, section_id);
152
remove_current_renderer ();
154
/* Create the correct results view */
155
renderer = lookup_renderer (entry);
157
layered_bin.add_actor (renderer);
158
renderer.opacity = 0;
159
renderer.animate (Clutter.AnimationMode.EASE_OUT_QUAD, 300,
161
renderer.set_models (entry.entry_groups_model,
162
entry.entry_results_model,
163
entry.entry_renderer_hints);
165
renderer.activated.connect (on_result_activated);
168
private void on_entry_renderer_info_changed (PlaceEntry entry)
170
update_views (entry);
173
private Unity.Place.Renderer lookup_renderer (PlaceEntry entry)
175
string? browser_path = null;
177
/* FIXME: This is meant to be all automated, it's just we havent got
180
if (entry.hints != null)
182
foreach (Gee.Map.Entry<string,string> e in entry.hints)
184
if (e.key == "UnityPlaceBrowserPath")
185
browser_path = e.value;
189
if (browser_path != null)
190
return new FolderBrowserRenderer ();
191
else if (entry.entry_renderer_name == "UnityHomeScreen")
192
return new HomeRenderer ();
194
return new DefaultRenderer ();
197
private void on_result_activated (string uri, string mimetype)
199
ActivationStatus result;
201
if (active_entry is PlaceHomeEntry)
203
var e = (active_entry as PlaceHomeEntry).get_entry_for_uri (uri);
206
result = e.parent.activate (uri, mimetype);
209
Place.activate_fallback.begin (uri);
210
result = ActivationStatus.ACTIVATED_FALLBACK;
213
else if (active_entry == null || active_entry.parent == null)
215
Place.activate_fallback.begin (uri);
216
result = ActivationStatus.ACTIVATED_FALLBACK;
220
result = active_entry.parent.activate (uri, mimetype);
225
case ActivationStatus.ACTIVATED_SHOW_DASH:
227
case ActivationStatus.NOT_ACTIVATED:
228
case ActivationStatus.ACTIVATED_HIDE_DASH:
229
case ActivationStatus.ACTIVATED_FALLBACK:
230
global_shell.hide_unity ();
233
warning ("Unexpected activation status: %u", result);
238
private bool on_stage_event_captured (Clutter.Event event)
240
if (event.type == Clutter.EventType.KEY_PRESS)
244
if (ev.keyval == 0xff1b) /* Escape */
246
/* Try and do a context pop */
247
if (search_bar.sections.active_section_n != 0)
249
search_bar.sections.set_active_section (0);