Chromium Code Reviews| Index: ui/app_list/views/start_page_view.cc |
| diff --git a/ui/app_list/views/start_page_view.cc b/ui/app_list/views/start_page_view.cc |
| index e4d6487aa663f63f8c504426b1bb9390c56da275..56ba9a3ba10676fc48db875e23b91c752af00c9e 100644 |
| --- a/ui/app_list/views/start_page_view.cc |
| +++ b/ui/app_list/views/start_page_view.cc |
| @@ -10,64 +10,82 @@ |
| #include "ui/app_list/app_list_model.h" |
| #include "ui/app_list/app_list_view_delegate.h" |
| #include "ui/app_list/views/app_list_main_view.h" |
| +#include "ui/app_list/views/search_box_view.h" |
| #include "ui/app_list/views/search_result_list_view.h" |
| #include "ui/app_list/views/tile_item_view.h" |
| #include "ui/gfx/canvas.h" |
| -#include "ui/views/controls/button/custom_button.h" |
| +#include "ui/views/background.h" |
| #include "ui/views/controls/image_view.h" |
| #include "ui/views/controls/label.h" |
| +#include "ui/views/controls/textfield/textfield.h" |
| #include "ui/views/layout/box_layout.h" |
| namespace app_list { |
| namespace { |
| +// Layout constants |
|
tapted
2014/06/18 02:46:05
nit: full-stop at the end of comments. More below.
calamity
2014/06/18 06:49:40
Done.
|
| const int kTopMargin = 30; |
| +const int kInstantContainerSpacing = 20; |
| +// WebView constants |
| const int kWebViewWidth = 200; |
| const int kWebViewHeight = 105; |
| -const int kInstantContainerSpacing = 20; |
| -const int kBarPlaceholderWidth = 490; |
| -const int kBarPlaceholderHeight = 30; |
| +// DummySearchBoxView constants |
| +const int kDummySearchBoxWidth = 490; |
| +const int kDummySearchBoxHeight = 40; |
| +const SkColor kDummySearchBoxBorderColor = |
| + SkColorSetARGB(0x30, 0xD0, 0xD0, 0xD0); |
|
tapted
2014/06/18 02:46:06
If the thing behind the color is always solid, I t
calamity
2014/06/18 06:49:40
Done. Moved this to app_list_constants.h
|
| +const int kDummySearchBoxBorderWidth = 1; |
| +const int kDummySearchBoxBorderBottomWidth = 2; |
| +const int kDummySearchBoxBorderCornerRadius = 2; |
| +// Tile container constants |
| const size_t kNumStartPageTiles = 5; |
| const int kTileSpacing = 10; |
| -// A button that is the placeholder for the search bar in the start page view. |
| -class BarPlaceholderButton : public views::CustomButton { |
| +// A placeholder search box which is sized to fit within the start page view. |
| +class DummySearchBoxView : public SearchBoxView { |
| public: |
| - explicit BarPlaceholderButton(views::ButtonListener* listener) |
| - : views::CustomButton(listener) {} |
| + explicit DummySearchBoxView(SearchBoxViewDelegate* delegate, |
|
tapted
2014/06/18 02:46:05
nit: explicit not required
calamity
2014/06/18 06:49:40
Done.
|
| + AppListViewDelegate* view_delegate) |
| + : SearchBoxView(delegate, view_delegate) {} |
| - virtual ~BarPlaceholderButton() {} |
| + virtual ~DummySearchBoxView() {} |
| // Overridden from views::View: |
| virtual gfx::Size GetPreferredSize() const OVERRIDE { |
| - return gfx::Size(kBarPlaceholderWidth, kBarPlaceholderHeight); |
| + return gfx::Size(kDummySearchBoxWidth, kDummySearchBoxHeight); |
| } |
| - virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE { |
| - PaintButton( |
| - canvas, |
| - state() == STATE_HOVERED ? kPagerHoverColor : kPagerNormalColor); |
| - } |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(DummySearchBoxView); |
| +}; |
| + |
| +class DummySearchBoxBackground : public views::Background { |
|
tapted
2014/06/18 02:46:06
this class needs a brief comment describing what P
calamity
2014/06/18 06:49:40
Done.
|
| + public: |
| + DummySearchBoxBackground() {} |
| + virtual ~DummySearchBoxBackground() {} |
| private: |
| - // Paints a rectangular button. |
| - void PaintButton(gfx::Canvas* canvas, SkColor base_color) { |
| - gfx::Rect rect(GetContentsBounds()); |
| - rect.ClampToCenteredSize( |
| - gfx::Size(kBarPlaceholderWidth, kBarPlaceholderHeight)); |
| + // views::Background overrides: |
| + virtual void Paint(gfx::Canvas* canvas, views::View* view) const OVERRIDE { |
| + gfx::Rect bounds = view->GetContentsBounds(); |
| SkPaint paint; |
| - paint.setAntiAlias(true); |
| - paint.setStyle(SkPaint::kFill_Style); |
| - paint.setColor(base_color); |
| - canvas->DrawRect(rect, paint); |
| + paint.setFlags(SkPaint::kAntiAlias_Flag); |
| + paint.setColor(kDummySearchBoxBorderColor); |
| + canvas->DrawRoundRect(bounds, kDummySearchBoxBorderCornerRadius, paint); |
| + bounds.Inset(kDummySearchBoxBorderWidth, |
| + kDummySearchBoxBorderWidth, |
| + kDummySearchBoxBorderWidth, |
| + kDummySearchBoxBorderBottomWidth); |
| + paint.setColor(SK_ColorWHITE); |
| + canvas->DrawRoundRect(bounds, kDummySearchBoxBorderCornerRadius, paint); |
| } |
| - DISALLOW_COPY_AND_ASSIGN(BarPlaceholderButton); |
| + DISALLOW_COPY_AND_ASSIGN(DummySearchBoxBackground); |
| }; |
| } // namespace |
| @@ -77,13 +95,34 @@ StartPageView::StartPageView(AppListMainView* app_list_main_view, |
| : app_list_main_view_(app_list_main_view), |
| model_(NULL), |
| view_delegate_(view_delegate), |
| + search_box_view_(new DummySearchBoxView(this, view_delegate_)), |
| results_view_( |
| new SearchResultListView(app_list_main_view, view_delegate)), |
| instant_container_(new views::View), |
| tiles_container_(new views::View), |
| show_state_(SHOW_START_PAGE) { |
| - // The view containing the start page WebContents and the BarPlaceholder. |
| + // The view containing the start page WebContents and DummySearchBoxView. |
| + InitInstantContainer(); |
| AddChildView(instant_container_); |
| + |
| + // The view containing the search results. |
| + AddChildView(results_view_); |
| + |
| + // The view containing the start page tiles. |
| + InitTilesContainer(); |
| + AddChildView(tiles_container_); |
| + |
| + SetModel(view_delegate_->GetModel()); |
| + view_delegate_->AddObserver(this); |
| +} |
| + |
| +StartPageView::~StartPageView() { |
| + view_delegate_->RemoveObserver(this); |
| + if (model_) |
| + model_->RemoveObserver(this); |
| +} |
| + |
| +void StartPageView::InitInstantContainer() { |
| views::BoxLayout* instant_layout_manager = new views::BoxLayout( |
| views::BoxLayout::kVertical, 0, 0, kInstantContainerSpacing); |
| instant_layout_manager->set_inside_border_insets( |
| @@ -92,17 +131,27 @@ StartPageView::StartPageView(AppListMainView* app_list_main_view, |
| views::BoxLayout::MAIN_AXIS_ALIGNMENT_END); |
| instant_container_->SetLayoutManager(instant_layout_manager); |
| - views::View* web_view = view_delegate->CreateStartPageWebView( |
| + views::View* web_view = view_delegate_->CreateStartPageWebView( |
| gfx::Size(kWebViewWidth, kWebViewHeight)); |
| if (web_view) |
| instant_container_->AddChildView(web_view); |
| - instant_container_->AddChildView(new BarPlaceholderButton(this)); |
| - // The view containing the search results. |
| - AddChildView(results_view_); |
| + // TODO(calamity): This container is needed to horizontally center the search |
| + // box view. Remove this container once BoxLayout supports CrossAxisAlignment. |
| + views::View* search_box_container = new views::View(); |
| + views::BoxLayout* layout_manager = |
| + new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0); |
| + layout_manager->set_main_axis_alignment( |
| + views::BoxLayout::MAIN_AXIS_ALIGNMENT_CENTER); |
| + search_box_container->SetLayoutManager(layout_manager); |
| - // The view containing the start page tiles. |
| - AddChildView(tiles_container_); |
| + search_box_container->AddChildView(search_box_view_); |
| + search_box_view_->set_background(new DummySearchBoxBackground()); |
|
tapted
2014/06/18 02:46:06
maybe do this in the DummySearchBoxView constructo
calamity
2014/06/18 06:49:40
Done.
|
| + |
| + instant_container_->AddChildView(search_box_container); |
| +} |
| + |
| +void StartPageView::InitTilesContainer() { |
| views::BoxLayout* tiles_layout_manager = |
| new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, kTileSpacing); |
| tiles_layout_manager->set_main_axis_alignment( |
| @@ -113,15 +162,6 @@ StartPageView::StartPageView(AppListMainView* app_list_main_view, |
| tiles_container_->AddChildView(tile_item); |
| tile_views_.push_back(tile_item); |
| } |
| - |
| - SetModel(view_delegate_->GetModel()); |
| - view_delegate_->AddObserver(this); |
| -} |
| - |
| -StartPageView::~StartPageView() { |
| - view_delegate_->RemoveObserver(this); |
| - if (model_) |
| - model_->RemoveObserver(this); |
| } |
| void StartPageView::SetModel(AppListModel* model) { |
| @@ -155,6 +195,9 @@ void StartPageView::SetShowState(ShowState show_state) { |
| instant_container_->SetVisible(show_state == SHOW_START_PAGE); |
| results_view_->SetVisible(show_state == SHOW_SEARCH_RESULTS); |
| + if (show_state == SHOW_START_PAGE) |
| + search_box_view_->search_box()->RequestFocus(); |
| + |
| if (show_state_ == show_state) |
| return; |
| @@ -189,9 +232,12 @@ void StartPageView::Layout() { |
| tiles_container_->SetBoundsRect(bounds); |
| } |
| -void StartPageView::ButtonPressed(views::Button* sender, |
| - const ui::Event& event) { |
| - app_list_main_view_->OnStartPageSearchButtonPressed(); |
| +void StartPageView::QueryChanged(SearchBoxView* sender) { |
| + // Forward the search terms on to the real search box and clear the dummy |
| + // search box. |
| + app_list_main_view_->OnStartPageSearchTextfieldChanged( |
| + sender->search_box()->text()); |
| + sender->search_box()->SetText(base::string16()); |
|
tapted
2014/06/18 02:46:06
each SearchBoxView has a reference to the the same
calamity
2014/06/18 06:49:40
Hmm. This doesn't _actually_ affect anything due t
calamity
2014/06/18 07:08:30
Actually, it looks like this isn't exactly easy. T
|
| } |
| void StartPageView::OnProfilesChanged() { |