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

Unified Diff: ui/app_list/search_result_view.cc

Issue 10386224: app_list: Add search box and search result view for v2. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix win_aura 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
« ui/app_list/apps_grid_view.h ('K') | « ui/app_list/search_result_view.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/app_list/search_result_view.cc
diff --git a/ui/app_list/search_result_view.cc b/ui/app_list/search_result_view.cc
new file mode 100644
index 0000000000000000000000000000000000000000..c0221fda8a1576f813d4ce2df804985cf3cfc4b7
--- /dev/null
+++ b/ui/app_list/search_result_view.cc
@@ -0,0 +1,198 @@
+// 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 "ui/app_list/search_result_view.h"
+
+#include "ui/app_list/search_result.h"
+#include "ui/app_list/search_result_list_view.h"
+#include "ui/gfx/canvas.h"
+#include "ui/gfx/font.h"
+#include "ui/gfx/render_text.h"
+#include "ui/views/controls/image_view.h"
+
+namespace {
+
+const int kPreferredWidth = 300;
+const int kPreferredHeight = 48;
+const int kIconViewWidth = 48;
+const int kIconPadding = 8;
+const int kTextTrailPadding = kIconPadding;
+const int kBorderSize = 1;
+
+const SkColor kBorderColor = SkColorSetRGB(0xF1, 0xF1, 0xF1);
+
+const SkColor kDefaultTextColor = SkColorSetRGB(0x33, 0x33, 0x33);
+const SkColor kDimmedTextColor = SK_ColorGRAY;
+const SkColor kURLTextColor = SkColorSetRGB(0x00, 0x99, 0x33);
+
+// rgba(77,144,254,0.2)
+const SkColor kSelectedBorderColor = SkColorSetARGB(51, 77, 144, 254);
+// rgba(77,144,254,0.33)
+const SkColor kSelectedBackgroundColor = SkColorSetARGB(84, 77, 144, 254);
+const SkColor kHoverAndPushedColor = SkColorSetARGB(51, 77, 144, 254);
+
+// A non-interactive image view to display result icon.
+class IconView : public views::ImageView {
+ public:
+ IconView() : ImageView() {}
+ virtual ~IconView() {}
+
+ private:
+ // views::View overrides:
+ virtual bool HitTest(const gfx::Point& l) const OVERRIDE {
+ return false;
+ }
+
+ DISALLOW_COPY_AND_ASSIGN(IconView);
+};
+
+// Creates a RenderText of given |text| and |styles|. Callers takes ownership
+// of returned RenderText.
+gfx::RenderText* CreateRenderText(const string16& text,
+ const app_list::SearchResult::Tags& tags) {
+ gfx::RenderText* render_text = gfx::RenderText::CreateRenderText();
+ render_text->SetText(text);
+
+ gfx::StyleRange default_style;
+ default_style.foreground = kDefaultTextColor;
+ render_text->set_default_style(default_style);
+ render_text->ApplyDefaultStyle();
+
+ for (app_list::SearchResult::Tags::const_iterator it = tags.begin();
+ it != tags.end();
+ ++it) {
+ // NONE means default style so do nothing.
+ if (it->styles == app_list::SearchResult::Tag::NONE)
+ continue;
+
+ gfx::StyleRange style;
+ style.range = it->range;
+
+ if (it->styles & app_list::SearchResult::Tag::MATCH)
+ style.font_style = gfx::Font::BOLD;
+ if (it->styles & app_list::SearchResult::Tag::URL)
+ style.foreground = kURLTextColor;
+ if (it->styles & app_list::SearchResult::Tag::DIM)
+ style.foreground = kDimmedTextColor;
+
+ render_text->ApplyStyleRange(style);
+ }
+
+ return render_text;
+}
+
+} // namespace
+
+namespace app_list {
+
+// static
+const char SearchResultView::kViewClassName[] = "ui/app_list/SearchResultView";
+
+SearchResultView::SearchResultView(SearchResultListView* list_view,
+ views::ButtonListener* listener)
+ : views::CustomButton(listener),
+ result_(NULL),
+ list_view_(list_view),
+ icon_(NULL) {
+ icon_ = new IconView;
+ AddChildView(icon_);
+}
+
+SearchResultView::~SearchResultView() {
+}
+
+void SearchResultView::SetResult(const SearchResult* result) {
+ result_ = result;
+
+ icon_->SetImage(result_ ? result_->icon() : gfx::ImageSkia());
+ UpdateTitleText();
+ UpdateDetailsText();
+ SchedulePaint();
+}
+
+void SearchResultView::UpdateTitleText() {
+ if (!result_ || result_->title().empty()) {
+ title_text_.reset();
+ } else {
+ title_text_.reset(CreateRenderText(result_->title(),
+ result_->title_tags()));
+ }
+}
+
+void SearchResultView::UpdateDetailsText() {
+ if (!result_ || result_->details().empty()) {
+ details_text_.reset();
+ } else {
+ details_text_.reset(CreateRenderText(result_->details(),
+ result_->details_tags()));
+ }
+}
+
+std::string SearchResultView::GetClassName() const {
+ return kViewClassName;
+}
+
+gfx::Size SearchResultView::GetPreferredSize() {
+ return gfx::Size(kPreferredWidth, kPreferredHeight);
+}
+
+void SearchResultView::Layout() {
+ gfx::Rect rect(GetContentsBounds());
+ if (rect.IsEmpty())
+ return;
+
+ gfx::Rect icon_bounds(rect);
+ icon_bounds.set_width(kIconViewWidth);
+ icon_bounds.Inset(kIconPadding, kIconPadding);
+ icon_->SetBoundsRect(icon_bounds.Intersect(rect));
+}
+
+void SearchResultView::OnPaint(gfx::Canvas* canvas) {
+ gfx::Rect rect(GetContentsBounds());
+ if (rect.IsEmpty())
+ return;
+
+ gfx::Rect content_rect(rect);
+ content_rect.set_height(rect.height() - kBorderSize);
+
+ bool selected = list_view_->IsResultViewSelected(this);
+ if (selected) {
+ canvas->FillRect(content_rect, kSelectedBackgroundColor);
+ } else if (state() == BS_HOT || state() == BS_PUSHED) {
+ canvas->FillRect(content_rect, kHoverAndPushedColor);
+ }
+
+ gfx::Rect border_bottom = rect.Subtract(content_rect);
+ canvas->FillRect(border_bottom,
+ selected ? kSelectedBorderColor : kBorderColor);
+
+ gfx::Rect text_bounds(rect);
+ text_bounds.set_x(kIconViewWidth);
+ text_bounds.set_width(rect.width() - kIconViewWidth - kTextTrailPadding);
+
+ if (title_text_.get() && details_text_.get()) {
+ gfx::Size title_size(text_bounds.width(),
+ title_text_->GetStringSize().height());
+ gfx::Size details_size(text_bounds.width(),
+ details_text_->GetStringSize().height());
+ int total_height = title_size.height() + + details_size.height();
+ int y = text_bounds.y() + (text_bounds.height() - total_height) / 2;
+
+ title_text_->SetDisplayRect(gfx::Rect(gfx::Point(text_bounds.x(), y),
+ title_size));
+ title_text_->Draw(canvas);
+
+ y += title_size.height();
+ details_text_->SetDisplayRect(gfx::Rect(gfx::Point(text_bounds.x(), y),
+ details_size));
+ details_text_->Draw(canvas);
+ } else if (title_text_.get()) {
+ gfx::Size title_size(text_bounds.width(),
+ title_text_->GetStringSize().height());
+ title_text_->SetDisplayRect(text_bounds.Center(title_size));
+ title_text_->Draw(canvas);
+ }
+}
+
+} // namespace app_list
« ui/app_list/apps_grid_view.h ('K') | « ui/app_list/search_result_view.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698