OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ash/shelf/shelf_model.h" | 5 #include "mash/shelf/shelf_model.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "ash/ash_switches.h" | 9 #include "mash/shelf/shelf_model_observer.h" |
10 #include "ash/shelf/shelf_model_observer.h" | 10 #include "mojo/common/common_type_converters.h" |
| 11 #include "mojo/shell/public/cpp/application_impl.h" |
11 | 12 |
12 namespace ash { | 13 namespace mash { |
| 14 namespace shelf { |
13 | 15 |
14 namespace { | 16 namespace { |
15 | 17 |
16 int ShelfItemTypeToWeight(ShelfItemType type) { | 18 int ShelfItemTypeToWeight(ShelfItemType type) { |
17 switch (type) { | 19 switch (type) { |
18 case TYPE_APP_LIST: | 20 case TYPE_APP_LIST: |
19 // TODO(skuhne): If the app list item becomes movable again, this need | 21 // TODO(skuhne): If the app list item becomes movable again, this need |
20 // to be a fallthrough. | 22 // to be a fallthrough. |
21 return 0; | 23 return 0; |
22 case TYPE_BROWSER_SHORTCUT: | 24 case TYPE_BROWSER_SHORTCUT: |
23 case TYPE_APP_SHORTCUT: | 25 case TYPE_APP_SHORTCUT: |
24 return 1; | 26 return 1; |
25 case TYPE_WINDOWED_APP: | 27 case TYPE_WINDOWED_APP: |
26 case TYPE_PLATFORM_APP: | 28 case TYPE_PLATFORM_APP: |
| 29 case TYPE_MOJO_APP: |
27 return 2; | 30 return 2; |
28 case TYPE_DIALOG: | 31 case TYPE_DIALOG: |
29 return 3; | 32 return 3; |
30 case TYPE_APP_PANEL: | 33 case TYPE_APP_PANEL: |
31 return 4; | 34 return 4; |
32 case TYPE_UNDEFINED: | 35 case TYPE_UNDEFINED: |
33 NOTREACHED() << "ShelfItemType must be set"; | 36 NOTREACHED() << "ShelfItemType must be set"; |
34 return -1; | 37 return -1; |
35 } | 38 } |
36 | 39 |
37 NOTREACHED() << "Invalid type " << type; | 40 NOTREACHED() << "Invalid type " << type; |
38 return 1; | 41 return 1; |
39 } | 42 } |
40 | 43 |
41 bool CompareByWeight(const ShelfItem& a, const ShelfItem& b) { | 44 bool CompareByWeight(const ShelfItem& a, const ShelfItem& b) { |
42 return ShelfItemTypeToWeight(a.type) < ShelfItemTypeToWeight(b.type); | 45 return ShelfItemTypeToWeight(a.type) < ShelfItemTypeToWeight(b.type); |
43 } | 46 } |
44 | 47 |
45 } // namespace | 48 } // namespace |
46 | 49 |
47 ShelfModel::ShelfModel() : next_id_(1), status_(STATUS_NORMAL) { | 50 ShelfModel::ShelfModel(mojo::ApplicationImpl* app) |
| 51 : next_id_(1), status_(STATUS_NORMAL), binding_(this) { |
| 52 app->ConnectToService("mojo:desktop_wm", &user_window_controller_); |
| 53 user_window_controller_->AddUserWindowObserver( |
| 54 binding_.CreateInterfacePtrAndBind()); |
48 } | 55 } |
49 | 56 |
50 ShelfModel::~ShelfModel() { | 57 ShelfModel::~ShelfModel() { |
51 } | 58 } |
52 | 59 |
53 int ShelfModel::Add(const ShelfItem& item) { | 60 int ShelfModel::Add(const ShelfItem& item) { |
54 return AddAt(items_.size(), item); | 61 return AddAt(static_cast<int>(items_.size()), item); |
55 } | 62 } |
56 | 63 |
57 int ShelfModel::AddAt(int index, const ShelfItem& item) { | 64 int ShelfModel::AddAt(int index, const ShelfItem& item) { |
58 index = ValidateInsertionIndex(item.type, index); | 65 index = ValidateInsertionIndex(item.type, index); |
59 items_.insert(items_.begin() + index, item); | 66 items_.insert(items_.begin() + index, item); |
60 items_[index].id = next_id_++; | 67 items_[index].id = next_id_++; |
61 FOR_EACH_OBSERVER(ShelfModelObserver, observers_, ShelfItemAdded(index)); | 68 FOR_EACH_OBSERVER(ShelfModelObserver, observers_, ShelfItemAdded(index)); |
62 return index; | 69 return index; |
63 } | 70 } |
64 | 71 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 } | 118 } |
112 | 119 |
113 int ShelfModel::ItemIndexByID(ShelfID id) const { | 120 int ShelfModel::ItemIndexByID(ShelfID id) const { |
114 ShelfItems::const_iterator i = ItemByID(id); | 121 ShelfItems::const_iterator i = ItemByID(id); |
115 return i == items_.end() ? -1 : static_cast<int>(i - items_.begin()); | 122 return i == items_.end() ? -1 : static_cast<int>(i - items_.begin()); |
116 } | 123 } |
117 | 124 |
118 int ShelfModel::GetItemIndexForType(ShelfItemType type) { | 125 int ShelfModel::GetItemIndexForType(ShelfItemType type) { |
119 for (size_t i = 0; i < items_.size(); ++i) { | 126 for (size_t i = 0; i < items_.size(); ++i) { |
120 if (items_[i].type == type) | 127 if (items_[i].type == type) |
121 return i; | 128 return static_cast<int>(i); |
122 } | 129 } |
123 return -1; | 130 return -1; |
124 } | 131 } |
125 | 132 |
126 ShelfItems::const_iterator ShelfModel::ItemByID(int id) const { | 133 ShelfItems::const_iterator ShelfModel::ItemByID(int id) const { |
127 for (ShelfItems::const_iterator i = items_.begin(); | 134 for (ShelfItems::const_iterator i = items_.begin(); |
128 i != items_.end(); ++i) { | 135 i != items_.end(); ++i) { |
129 if (i->id == id) | 136 if (i->id == id) |
130 return i; | 137 return i; |
131 } | 138 } |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
175 index = std::max(std::lower_bound(items_.begin(), items_.end(), weight_dummy, | 182 index = std::max(std::lower_bound(items_.begin(), items_.end(), weight_dummy, |
176 CompareByWeight) - items_.begin(), | 183 CompareByWeight) - items_.begin(), |
177 static_cast<ShelfItems::difference_type>(index)); | 184 static_cast<ShelfItems::difference_type>(index)); |
178 index = std::min(std::upper_bound(items_.begin(), items_.end(), weight_dummy, | 185 index = std::min(std::upper_bound(items_.begin(), items_.end(), weight_dummy, |
179 CompareByWeight) - items_.begin(), | 186 CompareByWeight) - items_.begin(), |
180 static_cast<ShelfItems::difference_type>(index)); | 187 static_cast<ShelfItems::difference_type>(index)); |
181 | 188 |
182 return index; | 189 return index; |
183 } | 190 } |
184 | 191 |
185 } // namespace ash | 192 void ShelfModel::OnUserWindowObserverAdded( |
| 193 mojo::Array<mash::wm::mojom::UserWindowPtr> user_windows) { |
| 194 for (size_t i = 0; i < user_windows.size(); ++i) |
| 195 OnUserWindowAdded(std::move(user_windows[i])); |
| 196 } |
| 197 |
| 198 void ShelfModel::OnUserWindowAdded(mash::wm::mojom::UserWindowPtr user_window) { |
| 199 ShelfItem item; |
| 200 item.type = TYPE_MOJO_APP; |
| 201 item.status = STATUS_RUNNING; |
| 202 item.window_id = user_window->window_id; |
| 203 item.title = user_window->window_title.To<base::string16>(); |
| 204 Add(item); |
| 205 } |
| 206 |
| 207 void ShelfModel::OnUserWindowRemoved(uint32_t window_id) { |
| 208 RemoveItemAt(ItemIndexByWindowID(window_id)); |
| 209 } |
| 210 |
| 211 void ShelfModel::OnUserWindowTitleChanged(uint32_t window_id, |
| 212 const mojo::String& window_title) { |
| 213 const int index = ItemIndexByWindowID(window_id); |
| 214 ShelfItem old_item(items_[index]); |
| 215 items_[index].title = window_title.To<base::string16>(); |
| 216 FOR_EACH_OBSERVER(ShelfModelObserver, observers_, |
| 217 ShelfItemChanged(index, old_item)); |
| 218 } |
| 219 |
| 220 int ShelfModel::ItemIndexByWindowID(uint32_t window_id) const { |
| 221 for (size_t i = 0; i < items_.size(); ++i) { |
| 222 if (items_[i].window_id == window_id) |
| 223 return static_cast<int>(i); |
| 224 } |
| 225 return -1; |
| 226 } |
| 227 |
| 228 } // namespace shelf |
| 229 } // namespace mash |
OLD | NEW |