Index: athena/home/athena_start_page_view.cc |
diff --git a/athena/home/athena_start_page_view.cc b/athena/home/athena_start_page_view.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..14bab7d77e47c09db75301e447c3d6a73ecb17ee |
--- /dev/null |
+++ b/athena/home/athena_start_page_view.cc |
@@ -0,0 +1,164 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "athena/home/athena_start_page_view.h" |
+ |
+#include "third_party/skia/include/core/SkPaint.h" |
+#include "third_party/skia/include/core/SkPath.h" |
+#include "ui/app_list/app_list_item.h" |
+#include "ui/app_list/app_list_item_list.h" |
+#include "ui/app_list/app_list_model.h" |
+#include "ui/app_list/app_list_view_delegate.h" |
+#include "ui/app_list/views/search_box_view.h" |
+#include "ui/gfx/canvas.h" |
+#include "ui/views/background.h" |
+#include "ui/views/border.h" |
+#include "ui/views/layout/box_layout.h" |
+#include "ui/views/layout/fill_layout.h" |
+#include "ui/views/painter.h" |
+#include "ui/views/shadow_border.h" |
+ |
+namespace { |
+ |
+const size_t kMaxIconNum = 3; |
+const int kIconSize = 50; |
+const int kIconMargin = 25; |
+ |
+// The preferred height for VISIBLE_BOTTOM state. |
+const int kPreferredHeightBottom = 100; |
+ |
+class PlaceHolderButton : public views::ImageButton, |
+ public views::ButtonListener { |
+ public: |
+ PlaceHolderButton() |
+ : ImageButton(this) { |
+ gfx::Canvas canvas(gfx::Size(kIconSize, kIconSize), 1.0f, true); |
+ SkPaint paint; |
+ paint.setStyle(SkPaint::kFill_Style); |
+ paint.setColor(SkColorSetRGB(86, 119, 252)); |
+ paint.setFlags(SkPaint::kAntiAlias_Flag); |
+ canvas.DrawCircle( |
+ gfx::Point(kIconSize / 2, kIconSize / 2), kIconSize / 2, paint); |
+ |
+ scoped_ptr<gfx::ImageSkia> image( |
+ new gfx::ImageSkia(canvas.ExtractImageRep())); |
+ SetImage(STATE_NORMAL, image.get()); |
+ } |
+ |
+ private: |
+ // views::ButtonListener: |
+ virtual void ButtonPressed(views::Button* sender, |
+ const ui::Event& event) OVERRIDE { |
+ // Do nothing: remove these place holders. |
+ } |
+ |
+ DISALLOW_COPY_AND_ASSIGN(PlaceHolderButton); |
+}; |
+ |
+class AppIconButton : public views::ImageButton, |
+ public views::ButtonListener { |
+ public: |
+ explicit AppIconButton(app_list::AppListItem* item) |
+ : ImageButton(this), |
+ item_(item) { |
+ // TODO(mukai): icon should be resized. |
+ SetImage(STATE_NORMAL, &item->icon()); |
+ } |
+ |
+ private: |
+ // views::ButtonListener: |
+ virtual void ButtonPressed(views::Button* sender, |
+ const ui::Event& event) OVERRIDE { |
+ DCHECK_EQ(sender, this); |
+ item_->Activate(event.flags()); |
+ } |
+ |
+ app_list::AppListItem* item_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(AppIconButton); |
+}; |
+ |
+// This class draws the background and border of the search box. |
+class BorderedSearchBoxBackground : public views::Background { |
+ public: |
+ BorderedSearchBoxBackground() {} |
+ virtual ~BorderedSearchBoxBackground() {} |
+ |
+ private: |
+ static const int kBorderWidth = 1; |
+ static const int kCornerRadius = 1; |
+ |
+ // views::Background: |
+ virtual void Paint(gfx::Canvas* canvas, views::View* view) const OVERRIDE { |
+ SkPath path; |
+ gfx::Rect bounds = view->GetContentsBounds(); |
+ bounds.Inset(1, 1); |
+ path.addRoundRect(SkRect::MakeXYWH(bounds.x(), bounds.y(), |
+ bounds.width(), bounds.height()), |
+ kCornerRadius, kCornerRadius, SkPath::kCW_Direction); |
+ SkPaint background_paint; |
+ background_paint.setStyle(SkPaint::kFill_Style); |
+ background_paint.setColor(SK_ColorWHITE); |
+ canvas->DrawPath(path, background_paint); |
+ |
+ SkPaint border_paint; |
+ border_paint.setStyle(SkPaint::kStroke_Style); |
+ border_paint.setColor(SK_ColorGRAY); |
+ border_paint.setStrokeWidth(SkIntToScalar(kBorderWidth)); |
+ canvas->DrawPath(path, border_paint); |
sadrul
2014/08/13 22:01:13
This is a tiny bit unfortunate: because we have vi
Jun Mukai
2014/08/13 23:18:23
split this into two classes, renamed to be more ge
|
+ } |
+ |
+ DISALLOW_COPY_AND_ASSIGN(BorderedSearchBoxBackground); |
+}; |
+ |
+} // namespace |
+ |
+namespace athena { |
+ |
+AthenaStartPageView::AthenaStartPageView( |
+ app_list::AppListViewDelegate* view_delegate) { |
+ app_list::AppListItemList* top_level = |
+ view_delegate->GetModel()->top_level_item_list(); |
+ |
+ views::View* container = new views::View(); |
+ AddChildView(container); |
+ |
+ views::BoxLayout* box_layout = new views::BoxLayout( |
+ views::BoxLayout::kHorizontal, kIconMargin, kIconMargin, kIconMargin); |
+ box_layout->set_main_axis_alignment( |
+ views::BoxLayout::MAIN_AXIS_ALIGNMENT_CENTER); |
+ box_layout->set_cross_axis_alignment( |
+ views::BoxLayout::CROSS_AXIS_ALIGNMENT_CENTER); |
+ container->SetLayoutManager(box_layout); |
+ for (size_t i = 0; i < std::min(top_level->item_count(), kMaxIconNum); ++i) |
+ container->AddChildView(new AppIconButton(top_level->item_at(i))); |
+ |
+ views::View* search_box_container = new views::View(); |
+ search_box_container->set_background(new BorderedSearchBoxBackground()); |
+ search_box_container->SetLayoutManager(new views::FillLayout()); |
+ search_box_container->AddChildView( |
+ new app_list::SearchBoxView(this, view_delegate)); |
+ container->AddChildView(search_box_container); |
+ box_layout->SetFlexForView(search_box_container, 1); |
+ |
+ for (size_t i = 0; i < kMaxIconNum; ++i) |
+ container->AddChildView(new PlaceHolderButton()); |
+ |
+ set_background(views::Background::CreateSolidBackground( |
+ 255, 255, 255, 255 * 0.9)); |
+} |
+ |
+AthenaStartPageView::~AthenaStartPageView() {} |
+ |
+void AthenaStartPageView::Layout() { |
+ gfx::Rect container_bounds = bounds(); |
+ container_bounds.set_height(kPreferredHeightBottom); |
+ child_at(0)->SetBoundsRect(container_bounds); |
+} |
+ |
+void AthenaStartPageView::QueryChanged(app_list::SearchBoxView* sender) { |
+ // Nothing needs to be done. |
+} |
+ |
+} // namespace athena |