Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2043)

Unified Diff: ash/app_list/page_switcher.cc

Issue 10381018: ash: First pass of Applist v2. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ash/app_list/page_switcher.h ('k') | ash/app_list/pagination_model.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ash/app_list/page_switcher.cc
diff --git a/ash/app_list/page_switcher.cc b/ash/app_list/page_switcher.cc
new file mode 100644
index 0000000000000000000000000000000000000000..275cc09bccf152477144fa55b6929bdd54728245
--- /dev/null
+++ b/ash/app_list/page_switcher.cc
@@ -0,0 +1,158 @@
+// Copyright (c) 2012 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 "ash/app_list/page_switcher.h"
+
+#include "ash/app_list/pagination_model.h"
+#include "third_party/skia/include/core/SkPath.h"
+#include "ui/base/animation/throb_animation.h"
+#include "ui/gfx/canvas.h"
+#include "ui/views/controls/button/custom_button.h"
+#include "ui/views/layout/box_layout.h"
+
+namespace {
+
+const int kButtonSpacing = 10;
+const int kButtonWidth = 60;
+const int kButtonHeight = 6;
+const int kButtonHeightPadding = 10;
+const int kButtonCornerRadius = 2;
+
+// 0.16 black
+const SkColor kHoverColor = SkColorSetARGB(0x2A, 0x00, 0x00, 0x00);
+
+// 0.2 black
+const SkColor kNormalColor = SkColorSetARGB(0x33, 0x00, 0x00, 0x00);
+
+// 0.33 black
+const SkColor kSelectedColor = SkColorSetARGB(0x55, 0x00, 0x00, 0x00);
+
+class PageSwitcherButton : public views::CustomButton {
+ public:
+ PageSwitcherButton(views::ButtonListener* listener)
+ : views::CustomButton(listener),
+ selected_(false) {
+ }
+ virtual ~PageSwitcherButton() {}
+
+ void SetSelected(bool selected) {
+ if (selected == selected_)
+ return;
+
+ selected_ = selected;
+ SchedulePaint();
+ }
+
+ // Overridden from views::View:
+ virtual gfx::Size GetPreferredSize() OVERRIDE {
+ return gfx::Size(kButtonWidth, kButtonHeight + kButtonHeightPadding);
+ }
+
+ virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE {
+ if (selected_ || state() == BS_PUSHED) {
+ PaintButton(canvas, kSelectedColor);
+ } else if (state() == BS_HOT) {
+ PaintButton(canvas, kHoverColor);
+ } else {
+ PaintButton(canvas, kNormalColor);
+ }
+ }
+
+ private:
+ // Paints a button that has two rounded corner at bottom.
+ void PaintButton(gfx::Canvas* canvas, SkColor color) {
+ gfx::Rect rect(GetContentsBounds());
+ rect.set_height(kButtonHeight);
+
+ gfx::Point center = rect.CenterPoint();
+
+ SkPath path;
+ path.incReserve(12);
+ path.moveTo(SkIntToScalar(rect.x()), SkIntToScalar(rect.y()));
+ path.arcTo(SkIntToScalar(rect.x()), SkIntToScalar(rect.bottom()),
+ SkIntToScalar(center.x()), SkIntToScalar(rect.bottom()),
+ SkIntToScalar(kButtonCornerRadius));
+ path.arcTo(SkIntToScalar(rect.right()), SkIntToScalar(rect.bottom()),
+ SkIntToScalar(rect.right()), SkIntToScalar(rect.y()),
+ SkIntToScalar(kButtonCornerRadius));
+ path.lineTo(SkIntToScalar(rect.right()), SkIntToScalar(rect.y()));
+ path.close();
+
+ SkPaint paint;
+ paint.setStyle(SkPaint::kFill_Style);
+ paint.setColor(color);
+ canvas->DrawPath(path, paint);
+ }
+
+ bool selected_;
+
+ DISALLOW_COPY_AND_ASSIGN(PageSwitcherButton);
+};
+
+// Gets PageSwitcherButton at |index| in |buttons|.
+PageSwitcherButton* GetButtonByIndex(views::View* buttons, int index) {
+ return static_cast<PageSwitcherButton*>(buttons->child_at(index));
+}
+
+} // namespace
+
+namespace ash {
+
+PageSwitcher::PageSwitcher(PaginationModel* model)
+ : model_(model),
+ buttons_(NULL) {
+ buttons_ = new views::View;
+ buttons_->SetLayoutManager(new views::BoxLayout(
+ views::BoxLayout::kHorizontal, 0, 0, kButtonSpacing));
+ AddChildView(buttons_);
+
+ TotalPagesChanged();
+ SelectedPageChanged(-1, model->selected_page());
+ model_->AddObserver(this);
+}
+
+PageSwitcher::~PageSwitcher() {
+ model_->RemoveObserver(this);
+}
+
+gfx::Size PageSwitcher::GetPreferredSize() {
+ // Always return a size with correct height so that container resize is not
+ // needed when more pages are added.
+ return gfx::Size(kButtonWidth, kButtonHeight + kButtonHeightPadding);
+}
+
+void PageSwitcher::Layout() {
+ gfx::Rect rect(GetContentsBounds());
+ buttons_->SetBoundsRect(rect.Center(buttons_->GetPreferredSize()));
+}
+
+void PageSwitcher::ButtonPressed(views::Button* sender,
+ const views::Event& event) {
+ for (int i = 0; i < buttons_->child_count(); ++i) {
+ if (sender == static_cast<views::Button*>(buttons_->child_at(i))) {
+ model_->SelectPage(i);
+ break;
+ }
+ }
+}
+
+void PageSwitcher::TotalPagesChanged() {
+ buttons_->RemoveAllChildViews(true);
+ for (int i = 0; i < model_->total_pages(); ++i) {
+ PageSwitcherButton* button = new PageSwitcherButton(this);
+ button->SetSelected(i == model_->selected_page());
+ buttons_->AddChildView(button);
+ }
+ buttons_->SetVisible(model_->total_pages() > 1);
+ Layout();
+}
+
+void PageSwitcher::SelectedPageChanged(int old_selected, int new_selected) {
+ if (old_selected >= 0 && old_selected < buttons_->child_count())
+ GetButtonByIndex(buttons_, old_selected)->SetSelected(false);
+ if (new_selected >= 0 && new_selected < buttons_->child_count())
+ GetButtonByIndex(buttons_, new_selected)->SetSelected(true);
+}
+
+} // namespace ash
« no previous file with comments | « ash/app_list/page_switcher.h ('k') | ash/app_list/pagination_model.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698