~3v1n0/unity/scale-window-cast-protection

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*-
/*
 * Copyright (C) 2010-2012 Canonical Ltd
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3 as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Authored by: Jason Smith <jason.smith@canonical.com>
 *              Marco Trevisan <marco.trevisan@canonical.com>
 */

#ifndef LAUNCHERMODEL_H
#define LAUNCHERMODEL_H

#include <UnityCore/GLibSource.h>
#include "AbstractLauncherIcon.h"
#include "unity-shared/Introspectable.h"

namespace unity
{
namespace launcher
{

class LauncherModel : public unity::debug::Introspectable, public sigc::trackable
{
public:
  typedef std::shared_ptr<LauncherModel> Ptr;
  typedef std::vector<AbstractLauncherIcon::Ptr> Base;
  typedef Base::iterator iterator;
  typedef Base::const_iterator const_iterator;
  typedef Base::reverse_iterator reverse_iterator;
  typedef Base::reverse_iterator const_reverse_iterator;

  LauncherModel();

  void AddIcon(AbstractLauncherIcon::Ptr const& icon);
  void RemoveIcon(AbstractLauncherIcon::Ptr const& icon);
  void Save();
  void Sort();
  int  Size() const;

  bool IconHasSister(AbstractLauncherIcon::Ptr const& icon) const;
  int IconIndex(AbstractLauncherIcon::Ptr const& icon) const;

  void ReorderAfter(AbstractLauncherIcon::Ptr const& icon, AbstractLauncherIcon::Ptr const& other);
  void ReorderBefore(AbstractLauncherIcon::Ptr const& icon, AbstractLauncherIcon::Ptr const& other, bool animate);
  void ReorderSmart(AbstractLauncherIcon::Ptr const& icon, AbstractLauncherIcon::Ptr const& other, bool animate);

  AbstractLauncherIcon::Ptr const& Selection() const;
  int SelectionIndex() const;
  void SetSelection(int selection);
  void SelectNext();
  void SelectPrevious();

  AbstractLauncherIcon::Ptr GetClosestIcon(AbstractLauncherIcon::Ptr const& icon, bool& is_before) const;

  iterator begin();
  iterator end();
  iterator at(int index);
  reverse_iterator rbegin();
  reverse_iterator rend();

  iterator main_begin();
  iterator main_end();
  reverse_iterator main_rbegin();
  reverse_iterator main_rend();

  iterator shelf_begin();
  iterator shelf_end();
  reverse_iterator shelf_rbegin();
  reverse_iterator shelf_rend();

  sigc::signal<void, AbstractLauncherIcon::Ptr const&> icon_added;
  sigc::signal<void, AbstractLauncherIcon::Ptr const&> icon_removed;
  sigc::signal<void, AbstractLauncherIcon::Ptr const&> selection_changed;
  sigc::signal<void> order_changed;
  sigc::signal<void> saved;

protected:
  // Introspectable methods
  std::string GetName() const;
  void AddProperties(debug::IntrospectionData&);
  IntrospectableList GetIntrospectableChildren();

private:
  Base             _inner;
  Base             _inner_shelf;
  Base             _inner_main;
  int              selection_;
  glib::SourceManager timeouts_;

  bool Populate();
  void PopulatePart(iterator begin, iterator end);
  void OnIconRemove(AbstractLauncherIcon::Ptr const& icon);
  bool IconShouldShelf(AbstractLauncherIcon::Ptr const& icon) const;
  static bool CompareIcons(AbstractLauncherIcon::Ptr const& first, AbstractLauncherIcon::Ptr const& second);

  /* Template Methods */
public:
  template<class T>
  std::list<AbstractLauncherIcon::Ptr> GetSublist()
  {
    std::list<AbstractLauncherIcon::Ptr> result;

    for (iterator it = begin(), e = end(); it != e; ++it)
    {
      T* var = dynamic_cast<T*>((*it).GetPointer());

      if (var)
        result.push_back(*it);
    }

    return result;
  }
};

}
}

#endif // LAUNCHERMODEL_H