20
20
#include "LauncherModel.h"
21
#include "LauncherIcon.h"
21
#include "AbstractLauncherIcon.h"
23
#include <UnityCore/GLibWrapper.h>
24
#include <UnityCore/Variant.h>
33
RemoveArg(AbstractLauncherIcon::Ptr const& icon_, LauncherModel* model)
34
: icon(icon_), self(model)
37
AbstractLauncherIcon::Ptr icon;
31
38
LauncherModel* self;
34
41
LauncherModel::LauncherModel()
38
46
LauncherModel::~LauncherModel()
40
for (auto icon : _inner_shelf)
43
for (auto icon : _inner_main)
47
bool LauncherModel::IconShouldShelf(LauncherIcon* icon)
49
return icon->Type() == LauncherIcon::TYPE_TRASH;
52
bool LauncherModel::CompareIcons(LauncherIcon* first, LauncherIcon* second)
54
if (first->Type() < second->Type())
50
std::string LauncherModel::GetName() const
52
return "LauncherModel";
55
void LauncherModel::AddProperties(GVariantBuilder* builder)
57
unity::variant::BuilderWrapper(builder)
58
.add("selection", selection_);
61
unity::debug::Introspectable::IntrospectableList const& LauncherModel::GetIntrospectableChildren()
63
introspection_results_.clear();
65
for (auto icon : _inner)
66
introspection_results_.push_back(icon.GetPointer());
68
return introspection_results_;
71
bool LauncherModel::IconShouldShelf(AbstractLauncherIcon::Ptr icon) const
73
return icon->GetIconType() == AbstractLauncherIcon::TYPE_TRASH;
76
bool LauncherModel::CompareIcons(AbstractLauncherIcon::Ptr first, AbstractLauncherIcon::Ptr second)
78
if (first->GetIconType() < second->GetIconType())
56
else if (first->Type() > second->Type())
80
else if (first->GetIconType() > second->GetIconType())
59
83
return first->SortPriority() < second->SortPriority();
72
96
for (it = main_begin(); it != main_end(); it++)
74
98
_inner.push_back(*it);
75
(*it)->SetSortPriority(i++);
99
(*it)->SetSortPriority(i);
78
103
for (it = shelf_begin(); it != shelf_end(); it++)
80
105
_inner.push_back(*it);
81
(*it)->SetSortPriority(i++);
106
(*it)->SetSortPriority(i);
84
return !std::equal(begin(), end(), copy.begin());
110
return copy.size() == _inner.size() && !std::equal(begin(), end(), copy.begin());
88
LauncherModel::AddIcon(LauncherIcon* icon)
114
LauncherModel::AddIcon(AbstractLauncherIcon::Ptr icon)
90
icon->SinkReference();
92
116
if (IconShouldShelf(icon))
93
_inner_shelf.push_front(icon);
117
_inner_shelf.push_back(icon);
95
_inner_main.push_front(icon);
119
_inner_main.push_back(icon);
107
LauncherModel::RemoveIcon(LauncherIcon* icon)
131
LauncherModel::RemoveIcon(AbstractLauncherIcon::Ptr icon)
111
_inner_shelf.remove(icon);
112
_inner_main.remove(icon);
135
_inner_shelf.erase(std::remove(_inner_shelf.begin(), _inner_shelf.end(), icon), _inner_shelf.end());
136
_inner_main.erase(std::remove(_inner_main.begin(), _inner_main.end(), icon), _inner_main.end());
114
138
size = _inner.size();
139
_inner.erase(std::remove(_inner.begin(), _inner.end(), icon), _inner.end());
117
141
if (size != _inner.size())
119
143
icon_removed.emit(icon);
125
148
LauncherModel::RemoveCallback(gpointer data)
127
RemoveArg* arg = (RemoveArg*) data;
150
RemoveArg* arg = static_cast<RemoveArg*>(data);
129
arg->self->RemoveIcon(arg->icon);
154
arg->self->RemoveIcon(arg->icon);
136
LauncherModel::OnIconRemove(LauncherIcon* icon)
162
LauncherModel::OnIconRemove(AbstractLauncherIcon::Ptr icon)
138
RemoveArg* arg = (RemoveArg*) g_malloc0(sizeof(RemoveArg));
164
RemoveArg* arg = new RemoveArg(icon, this);
142
165
g_timeout_add(1000, &LauncherModel::RemoveCallback, arg);
152
175
LauncherModel::Sort()
154
_inner_shelf.sort(&LauncherModel::CompareIcons);
155
_inner_main.sort(&LauncherModel::CompareIcons);
177
std::stable_sort(_inner_shelf.begin(), _inner_shelf.end(), &LauncherModel::CompareIcons);
178
std::stable_sort(_inner_main.begin(), _inner_main.end(), &LauncherModel::CompareIcons);
158
181
order_changed.emit();
162
LauncherModel::IconHasSister(LauncherIcon* icon)
185
LauncherModel::IconHasSister(AbstractLauncherIcon::Ptr icon) const
167
if (icon && icon->Type() == AbstractLauncherIcon::TYPE_DEVICE)
190
if (icon && icon->GetIconType() == AbstractLauncherIcon::TYPE_DEVICE)
170
193
if (IconShouldShelf(icon))
195
it = _inner_shelf.begin();
196
end = _inner_shelf.end();
200
it = _inner_main.begin();
201
end = _inner_main.end();
181
204
for (; it != end; ++it)
183
LauncherIcon* iter_icon = *it;
206
AbstractLauncherIcon::Ptr iter_icon = *it;
184
207
if ((iter_icon != icon)
185
&& iter_icon->Type() == icon->Type())
208
&& iter_icon->GetIconType() == icon->GetIconType())
193
LauncherModel::ReorderBefore(LauncherIcon* icon, LauncherIcon* other, bool save)
216
LauncherModel::ReorderAfter(AbstractLauncherIcon::Ptr icon, AbstractLauncherIcon::Ptr other)
218
if (icon == other || icon.IsNull() || other.IsNull())
198
LauncherModel::iterator it;
221
if (icon->GetIconType() != other->GetIconType())
202
for (it = begin(); it != end(); it++)
225
for (LauncherModel::iterator it = begin(); it != end(); ++it)
204
227
if ((*it) == icon)
232
(*it)->SetSortPriority(i);
235
icon->SetSortPriority(i);
240
(*it)->SetSortPriority(i);
249
LauncherModel::ReorderBefore(AbstractLauncherIcon::Ptr icon, AbstractLauncherIcon::Ptr other, bool save)
251
if (icon == other || icon.IsNull() || other.IsNull())
254
if (icon->GetIconType() != other->GetIconType())
259
for (auto icon_it : _inner)
267
if (icon_it == other)
212
269
icon->SetSortPriority(i);
213
270
if (i != j && save)
271
icon_it->SaveCenter();
217
(*it)->SetSortPriority(i);
274
icon_it->SetSortPriority(i);
218
275
if (i != j && save)
276
icon_it->SaveCenter();
224
(*it)->SetSortPriority(i);
281
icon_it->SetSortPriority(i);
225
282
if (i != j && save)
283
icon_it->SaveCenter();
236
LauncherModel::ReorderSmart(LauncherIcon* icon, LauncherIcon* other, bool save)
293
LauncherModel::ReorderSmart(AbstractLauncherIcon::Ptr icon, AbstractLauncherIcon::Ptr other, bool save)
295
if (icon == other || icon.IsNull() || other.IsNull())
241
LauncherModel::iterator it;
298
if (icon->GetIconType() != other->GetIconType())
245
303
bool skipped = false;
246
for (it = begin(); it != end(); it++)
304
for (auto icon_it : _inner)
313
if (icon_it == other)
259
317
icon->SetSortPriority(i);
260
318
if (i != j && save)
319
icon_it->SaveCenter();
265
(*it)->SetSortPriority(i);
323
icon_it->SetSortPriority(i);
266
324
if (i != j && save)
325
icon_it->SaveCenter();
272
330
icon->SetSortPriority(i);
273
331
if (i != j && save)
332
icon_it->SaveCenter();
280
(*it)->SetSortPriority(i);
338
icon_it->SetSortPriority(i);
281
339
if (i != j && save)
340
icon_it->SaveCenter();
292
LauncherModel::Size()
350
LauncherModel::Size() const
294
352
return _inner.size();
355
AbstractLauncherIcon::Ptr LauncherModel::Selection () const
357
return _inner[selection_];
360
int LauncherModel::SelectionIndex() const
365
void LauncherModel::SetSelection(int selection)
367
int new_selection = std::min<int>(Size() - 1, std::max<int> (0, selection));
369
if (new_selection == selection_)
372
selection_ = new_selection;
373
selection_changed.emit(Selection());
376
void LauncherModel::SelectNext()
378
int temp = selection_;
381
while (temp != selection_)
386
if (_inner[temp]->GetQuirk(AbstractLauncherIcon::QUIRK_VISIBLE))
389
selection_changed.emit(Selection());
396
void LauncherModel::SelectPrevious()
398
int temp = selection_;
401
while (temp != selection_)
406
if (_inner[temp]->GetQuirk(AbstractLauncherIcon::QUIRK_VISIBLE))
409
selection_changed.emit(Selection());
299
419
LauncherModel::iterator