diff options
author | rdevlin.cronin <rdevlin.cronin@chromium.org> | 2015-05-14 14:16:27 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-05-14 21:16:58 +0000 |
commit | a437dab3e6f188c53f452b35198b770b33a8aa96 (patch) | |
tree | ce2564cf965c9d391060159e67623bdcfd5917ec /extensions/browser | |
parent | b80d3de9f663b35a20860c311a475aef1b1774c8 (diff) | |
download | chromium_src-a437dab3e6f188c53f452b35198b770b33a8aa96.zip chromium_src-a437dab3e6f188c53f452b35198b770b33a8aa96.tar.gz chromium_src-a437dab3e6f188c53f452b35198b770b33a8aa96.tar.bz2 |
[Extensions UI] Add a placeholder icon for extensions in the toolbar
Create a placeholder icon source for extensions that don't have an icon, so that
they don't just look like puzzle pieces in the toolbar.
To start, only use this in the toolbar, but the class is flexible enough that
it could also be used, e.g., in the chrome://extensions page.
BUG=486206
Review URL: https://codereview.chromium.org/1131443006
Cr-Commit-Position: refs/heads/master@{#329932}
Diffstat (limited to 'extensions/browser')
-rw-r--r-- | extensions/browser/extension_icon_placeholder.cc | 103 | ||||
-rw-r--r-- | extensions/browser/extension_icon_placeholder.h | 54 | ||||
-rw-r--r-- | extensions/browser/resources/default_100_percent/extension_action_plain_background.png | bin | 0 -> 287 bytes | |||
-rw-r--r-- | extensions/browser/resources/default_100_percent/extension_icon_plain_background.png | bin | 0 -> 284 bytes | |||
-rw-r--r-- | extensions/browser/resources/default_200_percent/extension_action_plain_background.png | bin | 0 -> 287 bytes | |||
-rw-r--r-- | extensions/browser/resources/default_200_percent/extension_icon_plain_background.png | bin | 0 -> 634 bytes | |||
-rw-r--r-- | extensions/browser/resources/extensions_browser_resources.grd | 2 |
7 files changed, 159 insertions, 0 deletions
diff --git a/extensions/browser/extension_icon_placeholder.cc b/extensions/browser/extension_icon_placeholder.cc new file mode 100644 index 0000000..fc37286 --- /dev/null +++ b/extensions/browser/extension_icon_placeholder.cc @@ -0,0 +1,103 @@ +// Copyright 2015 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 "extensions/browser/extension_icon_placeholder.h" + +#include "base/strings/string_util.h" +#include "base/strings/utf_string_conversions.h" +#include "extensions/grit/extensions_browser_resources.h" +#include "ui/base/resource/resource_bundle.h" +#include "ui/gfx/canvas.h" +#include "ui/gfx/codec/png_codec.h" +#include "ui/gfx/geometry/rect.h" +#include "ui/gfx/geometry/size.h" +#include "ui/gfx/image/canvas_image_source.h" +#include "ui/gfx/image/image_skia.h" + +namespace extensions { + +namespace { + +// Returns the FontStyle to use for the given icon |size|. +ui::ResourceBundle::FontStyle GetFontStyleForIconSize( + extension_misc::ExtensionIcons size) { + switch (size) { + case extension_misc::EXTENSION_ICON_INVALID: + case extension_misc::EXTENSION_ICON_BITTY: + return ui::ResourceBundle::SmallFont; + case extension_misc::EXTENSION_ICON_ACTION: + case extension_misc::EXTENSION_ICON_SMALLISH: + case extension_misc::EXTENSION_ICON_SMALL: + return ui::ResourceBundle::MediumFont; + case extension_misc::EXTENSION_ICON_MEDIUM: + case extension_misc::EXTENSION_ICON_LARGE: + case extension_misc::EXTENSION_ICON_EXTRA_LARGE: + case extension_misc::EXTENSION_ICON_GIGANTOR: + return ui::ResourceBundle::LargeFont; + } + NOTREACHED(); + return ui::ResourceBundle::MediumFont; +} + +// Returns the background image to use for the given icon |size|. +gfx::Image GetBackgroundImageForIconSize(extension_misc::ExtensionIcons size) { + int resource_id = 0; + // Right now, we have resources for a 19x19 (action) and a 48x48 (extensions + // page icon). The implementation of the placeholder scales these correctly, + // so it's not a big deal to use these for other sizes, but if it's something + // that will be done frequently, we should probably make a devoted asset for + // that size. + switch (size) { + case extension_misc::EXTENSION_ICON_INVALID: + case extension_misc::EXTENSION_ICON_BITTY: + case extension_misc::EXTENSION_ICON_ACTION: + case extension_misc::EXTENSION_ICON_SMALLISH: + case extension_misc::EXTENSION_ICON_SMALL: + resource_id = IDR_EXTENSION_ACTION_PLAIN_BACKGROUND; + break; + case extension_misc::EXTENSION_ICON_MEDIUM: + case extension_misc::EXTENSION_ICON_LARGE: + case extension_misc::EXTENSION_ICON_EXTRA_LARGE: + case extension_misc::EXTENSION_ICON_GIGANTOR: + resource_id = IDR_EXTENSION_ICON_PLAIN_BACKGROUND; + break; + } + return ui::ResourceBundle::GetSharedInstance().GetImageNamed(resource_id); +} + +} // namespace + +ExtensionIconPlaceholder::ExtensionIconPlaceholder( + extension_misc::ExtensionIcons size, + const std::string& letter) + : gfx::CanvasImageSource(gfx::Size(size, size), false), + icon_size_(size), + letter_(base::UTF8ToUTF16(letter.substr(0, 1))), + base_image_(GetBackgroundImageForIconSize(size)) { +} + +ExtensionIconPlaceholder::~ExtensionIconPlaceholder() { +} + +gfx::Image ExtensionIconPlaceholder::CreateImage( + extension_misc::ExtensionIcons size, + const std::string& name) { + return gfx::Image(gfx::ImageSkia(new ExtensionIconPlaceholder(size, name), + gfx::Size(size, size))); +} + +void ExtensionIconPlaceholder::Draw(gfx::Canvas* canvas) { + // Draw the background image, correctly scaled. + canvas->DrawImageInt(*base_image_.ToImageSkia(), 0, 0, + base_image_.Size().width(), base_image_.Size().height(), + 0, 0, size().width(), size().height(), true); + gfx::Rect bounds(size().width(), size().height()); + // Draw the letter on top. + canvas->DrawStringRectWithFlags( + letter_, ui::ResourceBundle::GetSharedInstance().GetFontList( + GetFontStyleForIconSize(icon_size_)), + SK_ColorWHITE, bounds, gfx::Canvas::TEXT_ALIGN_CENTER); +} + +} // namespace extensions diff --git a/extensions/browser/extension_icon_placeholder.h b/extensions/browser/extension_icon_placeholder.h new file mode 100644 index 0000000..5c5e902 --- /dev/null +++ b/extensions/browser/extension_icon_placeholder.h @@ -0,0 +1,54 @@ +// Copyright 2015 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. + +#ifndef EXTENSIONS_BROWSER_EXTENSION_ICON_PLACEHOLDER_H_ +#define EXTENSIONS_BROWSER_EXTENSION_ICON_PLACEHOLDER_H_ + +#include <string> + +#include "base/macros.h" +#include "base/strings/string16.h" +#include "extensions/common/constants.h" +#include "ui/gfx/image/canvas_image_source.h" +#include "ui/gfx/image/image.h" + +namespace gfx { +class Canvas; +class Size; +} + +namespace extensions { + +// An extension icon image with a gray background and the first letter of the +// extension name, so that not all extensions without an icon look the same. +class ExtensionIconPlaceholder : public gfx::CanvasImageSource { + public: + ExtensionIconPlaceholder(extension_misc::ExtensionIcons size, + const std::string& name); + ~ExtensionIconPlaceholder() override; + + // Creates an image backed by an ImageSkia with the ExtensionIconPlaceholder + // as its image source. + static gfx::Image CreateImage(extension_misc::ExtensionIcons size, + const std::string& name); + + private: + // gfx::CanvasImageSource: + void Draw(gfx::Canvas* canvas) override; + + // The size this placeholder is filling. + extension_misc::ExtensionIcons icon_size_; + + // The first letter of the extension's name. + base::string16 letter_; + + // The gray background image, on top of which the letter is drawn. + gfx::Image base_image_; + + DISALLOW_COPY_AND_ASSIGN(ExtensionIconPlaceholder); +}; + +} // namespace extensions + +#endif // EXTENSIONS_BROWSER_EXTENSION_ICON_PLACEHOLDER_H_ diff --git a/extensions/browser/resources/default_100_percent/extension_action_plain_background.png b/extensions/browser/resources/default_100_percent/extension_action_plain_background.png Binary files differnew file mode 100644 index 0000000..8464de6 --- /dev/null +++ b/extensions/browser/resources/default_100_percent/extension_action_plain_background.png diff --git a/extensions/browser/resources/default_100_percent/extension_icon_plain_background.png b/extensions/browser/resources/default_100_percent/extension_icon_plain_background.png Binary files differnew file mode 100644 index 0000000..ada0c1c --- /dev/null +++ b/extensions/browser/resources/default_100_percent/extension_icon_plain_background.png diff --git a/extensions/browser/resources/default_200_percent/extension_action_plain_background.png b/extensions/browser/resources/default_200_percent/extension_action_plain_background.png Binary files differnew file mode 100644 index 0000000..8464de6 --- /dev/null +++ b/extensions/browser/resources/default_200_percent/extension_action_plain_background.png diff --git a/extensions/browser/resources/default_200_percent/extension_icon_plain_background.png b/extensions/browser/resources/default_200_percent/extension_icon_plain_background.png Binary files differnew file mode 100644 index 0000000..82dc212 --- /dev/null +++ b/extensions/browser/resources/default_200_percent/extension_icon_plain_background.png diff --git a/extensions/browser/resources/extensions_browser_resources.grd b/extensions/browser/resources/extensions_browser_resources.grd index a04151e..9862163 100644 --- a/extensions/browser/resources/extensions_browser_resources.grd +++ b/extensions/browser/resources/extensions_browser_resources.grd @@ -13,6 +13,8 @@ <structures fallback_to_low_resolution="true"> <structure type="chrome_scaled_image" name="IDR_APP_DEFAULT_ICON" file="app_default_icon.png" /> <structure type="chrome_scaled_image" name="IDR_EXTENSION_DEFAULT_ICON" file="extension_default_icon.png" /> + <structure type="chrome_scaled_image" name="IDR_EXTENSION_ACTION_PLAIN_BACKGROUND" file="extension_action_plain_background.png"/> + <structure type="chrome_scaled_image" name="IDR_EXTENSION_ICON_PLAIN_BACKGROUND" file="extension_icon_plain_background.png"/> </structures> </release> </grit> |