diff options
author | tfarina@chromium.org <tfarina@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-15 02:56:30 +0000 |
---|---|---|
committer | tfarina@chromium.org <tfarina@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-15 02:56:30 +0000 |
commit | 75b985094ca3603b5d566227a3dc2d0b62fcf51c (patch) | |
tree | 23e30d8df3b4527c80a56fc9eb61cd67c43e5677 /ui/views/examples/native_theme_button_example.cc | |
parent | e5c49f5cb6e52f3d3f23f6f514421d3247d4c01b (diff) | |
download | chromium_src-75b985094ca3603b5d566227a3dc2d0b62fcf51c.zip chromium_src-75b985094ca3603b5d566227a3dc2d0b62fcf51c.tar.gz chromium_src-75b985094ca3603b5d566227a3dc2d0b62fcf51c.tar.bz2 |
views: Move examples/ directory to ui/views/.
BUG=104039
R=ben@chromium.org
Review URL: http://codereview.chromium.org/8555013
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@110023 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/views/examples/native_theme_button_example.cc')
-rw-r--r-- | ui/views/examples/native_theme_button_example.cc | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/ui/views/examples/native_theme_button_example.cc b/ui/views/examples/native_theme_button_example.cc new file mode 100644 index 0000000..e11bfcd --- /dev/null +++ b/ui/views/examples/native_theme_button_example.cc @@ -0,0 +1,255 @@ +// Copyright (c) 2011 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/views/examples/native_theme_button_example.h" + +#include <string> + +#include "base/logging.h" +#include "base/stringprintf.h" +#include "base/utf_string_conversions.h" +#include "ui/base/animation/throb_animation.h" +#include "ui/base/models/combobox_model.h" +#include "ui/gfx/canvas.h" +#include "ui/views/examples/example_combobox_model.h" +#include "views/controls/label.h" +#include "views/layout/grid_layout.h" +#include "views/native_theme_painter.h" + +namespace { + +const char* kParts[] = { + "PushButton", + "RadioButton", + "Checkbox", +}; + +const char* kStates[] = { + "Disabled", + "Normal", + "Hot", + "Pressed", + "<Dynamic>", +}; + +} // namespace + +namespace examples { + +ExampleNativeThemeButton::ExampleNativeThemeButton( + views::ButtonListener* listener, + views::Combobox* cb_part, + views::Combobox* cb_state) + : CustomButton(listener), + cb_part_(cb_part), + cb_state_(cb_state), + count_(0), + is_checked_(false), + is_indeterminate_(false) { + cb_part_->set_listener(this); + cb_state_->set_listener(this); + + painter_.reset(new views::NativeThemePainter(this)); + set_background(views::Background::CreateBackgroundPainter( + false, painter_.get())); +} + +ExampleNativeThemeButton::~ExampleNativeThemeButton() { +} + +std::string ExampleNativeThemeButton::MessWithState() { + const char* message = NULL; + switch (GetThemePart()) { + case gfx::NativeTheme::kPushButton: + message = "Pressed! count:%d"; + break; + case gfx::NativeTheme::kRadio: + is_checked_ = !is_checked_; + message = is_checked_ ? "Checked! count:%d" : "Unchecked! count:%d"; + break; + case gfx::NativeTheme::kCheckbox: + if (is_indeterminate_) { + is_checked_ = false; + is_indeterminate_ = false; + } else if (!is_checked_) { + is_checked_ = true; + } else { + is_checked_ = false; + is_indeterminate_ = true; + } + + message = is_checked_ ? "Checked! count:%d" : + is_indeterminate_ ? "Indeterminate! count:%d" : "Unchecked! count:%d"; + break; + default: + DCHECK(false); + } + + return base::StringPrintf(message, ++count_); +} + +void ExampleNativeThemeButton::ItemChanged(views::Combobox* combo_box, + int prev_index, + int new_index) { + SchedulePaint(); +} + +gfx::NativeTheme::Part ExampleNativeThemeButton::GetThemePart() const { + int selected = cb_part_->selected_item(); + switch (selected) { + case 0: + return gfx::NativeTheme::kPushButton; + case 1: + return gfx::NativeTheme::kRadio; + case 2: + return gfx::NativeTheme::kCheckbox; + default: + DCHECK(false); + } + return gfx::NativeTheme::kPushButton; +} + +gfx::Rect ExampleNativeThemeButton::GetThemePaintRect() const { + gfx::NativeTheme::ExtraParams extra; + gfx::NativeTheme::State state = GetThemeState(&extra); + gfx::Size size(gfx::NativeTheme::instance()->GetPartSize(GetThemePart(), + state, + extra)); + gfx::Rect rect(size); + rect.set_x(GetMirroredXForRect(rect)); + return rect; +} + +gfx::NativeTheme::State ExampleNativeThemeButton::GetThemeState( + gfx::NativeTheme::ExtraParams* params) const { + GetExtraParams(params); + + int selected = cb_state_->selected_item(); + if (selected > 3) { + switch (state()) { + case BS_DISABLED: + return gfx::NativeTheme::kDisabled; + case BS_NORMAL: + return gfx::NativeTheme::kNormal; + case BS_HOT: + return gfx::NativeTheme::kHovered; + case BS_PUSHED: + return gfx::NativeTheme::kPressed; + default: + DCHECK(false); + } + } + + switch (selected) { + case 0: + return gfx::NativeTheme::kDisabled; + case 1: + return gfx::NativeTheme::kNormal; + case 2: + return gfx::NativeTheme::kHovered; + case 3: + return gfx::NativeTheme::kPressed; + default: + DCHECK(false); + } + return gfx::NativeTheme::kNormal; +} + +void ExampleNativeThemeButton::GetExtraParams( + gfx::NativeTheme::ExtraParams* params) const { + + params->button.checked = is_checked_; + params->button.indeterminate = is_indeterminate_; + params->button.is_default = false; + params->button.has_border = false; + params->button.classic_state = 0; + params->button.background_color = SkColorSetARGB(0, 0, 0, 0); +} + +const ui::Animation* ExampleNativeThemeButton::GetThemeAnimation() const { + int selected = cb_state_->selected_item(); + return selected <= 3 ? NULL : hover_animation_.get(); +} + +gfx::NativeTheme::State ExampleNativeThemeButton::GetBackgroundThemeState( + gfx::NativeTheme::ExtraParams* params) const { + GetExtraParams(params); + return gfx::NativeTheme::kNormal; +} + +gfx::NativeTheme::State ExampleNativeThemeButton::GetForegroundThemeState( + gfx::NativeTheme::ExtraParams* params) const { + GetExtraParams(params); + return gfx::NativeTheme::kHovered; +} + +gfx::Size ExampleNativeThemeButton::GetPreferredSize() { + return painter_.get() == NULL ? gfx::Size() : painter_->GetPreferredSize(); +} + +void ExampleNativeThemeButton::OnPaintBackground(gfx::Canvas* canvas) { + // Fill the background with a known colour so that we know where the bounds + // of the View are. + canvas->FillRect(SkColorSetRGB(255, 128, 128), GetLocalBounds()); + CustomButton::OnPaintBackground(canvas); +} + +//////////////////////////////////////////////////////////////////////////////// + +NativeThemeButtonExample::NativeThemeButtonExample(ExamplesMain* main) + : ExampleBase(main, "Native Theme Button") { +} + +NativeThemeButtonExample::~NativeThemeButtonExample() { +} + +void NativeThemeButtonExample::CreateExampleView(views::View* container) { + views::GridLayout* layout = new views::GridLayout(container); + container->SetLayoutManager(layout); + + layout->AddPaddingRow(0, 8); + + views::ColumnSet* column_set = layout->AddColumnSet(0); + column_set->AddPaddingColumn(0, 8); + column_set->AddColumn(views::GridLayout::LEADING, views::GridLayout::FILL, + 0.1f, views::GridLayout::USE_PREF, 0, 0); + column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, + 0.9f, views::GridLayout::USE_PREF, 0, 0); + column_set->AddPaddingColumn(0, 8); + + layout->StartRow(0, 0); + layout->AddView(new views::Label(ASCIIToUTF16("Part:"))); + views::Combobox* cb_part = new views::Combobox( + new ExampleComboboxModel(kParts, arraysize(kParts))); + cb_part->SetSelectedItem(0); + layout->AddView(cb_part); + + layout->StartRow(0, 0); + layout->AddView(new views::Label(ASCIIToUTF16("State:"))); + views::Combobox* cb_state = new views::Combobox( + new ExampleComboboxModel(kStates, arraysize(kStates))); + cb_state->SetSelectedItem(0); + layout->AddView(cb_state); + + layout->AddPaddingRow(0, 32); + + button_ = new ExampleNativeThemeButton(this, cb_part, cb_state); + + column_set = layout->AddColumnSet(1); + column_set->AddPaddingColumn(0, 16); + column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, + 1, views::GridLayout::USE_PREF, 0, 0); + column_set->AddPaddingColumn(0, 16); + layout->StartRow(1, 1); + layout->AddView(button_); + + layout->AddPaddingRow(0, 8); +} + +void NativeThemeButtonExample::ButtonPressed(views::Button* sender, + const views::Event& event) { + PrintStatus(button_->MessWithState().c_str()); +} + +} // namespace examples |