summaryrefslogtreecommitdiffstats
path: root/views/examples/widget_example.h
diff options
context:
space:
mode:
Diffstat (limited to 'views/examples/widget_example.h')
-rw-r--r--views/examples/widget_example.h222
1 files changed, 168 insertions, 54 deletions
diff --git a/views/examples/widget_example.h b/views/examples/widget_example.h
index 85a7111..609e6ed 100644
--- a/views/examples/widget_example.h
+++ b/views/examples/widget_example.h
@@ -13,8 +13,75 @@
#include "views/widget/root_view.h"
#include "views/widget/widget.h"
+#if defined(OS_LINUX)
+#include "views/widget/widget_gtk.h"
+#endif
+
+namespace {
+
+// A layout manager that layouts child views vertically.
+// TODO(oshima): support horizontal support and
+// move to views/.
+class BoxLayout : public views::LayoutManager {
+ public:
+ BoxLayout() {}
+ virtual ~BoxLayout() {
+ }
+
+ // Overridden from LayoutManager:
+ virtual void Layout(views::View* host) {
+ int height = host->height();
+ int width = host->width();
+ int count = host->GetChildViewCount();
+
+ int y = 0;
+ for (int i = 0; i < count; i++) {
+ views::View* child = host->GetChildViewAt(i);
+ child->SetBounds(0, y, width, height / count);
+ y = height * (i + 1)/ count;
+ }
+ }
+
+ virtual gfx::Size GetPreferredSize(views::View* host) {
+ return host->GetPreferredSize();
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(BoxLayout);
+};
+
+// A layout manager that layouts a single child at
+// the center of the host view.
+class CenterLayout : public views::LayoutManager {
+ public:
+ CenterLayout() {
+ }
+ virtual ~CenterLayout() {
+ }
+
+ // Overridden from LayoutManager:
+ virtual void Layout(views::View* host) {
+ views::View* child = host->GetChildViewAt(0);
+ gfx::Size size = child->GetPreferredSize();
+ child->SetBounds((host->width() - size.width()) / 2,
+ (host->height() - size.height()) / 2,
+ size.width(), size.height());
+ }
+
+ virtual gfx::Size GetPreferredSize(views::View* host) {
+ return host->GetPreferredSize();
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(CenterLayout);
+};
+
+} // namespace
+
namespace examples {
+using views::Widget;
+
// WidgetExample demonstrates how to create a popup widget.
class WidgetExample : public ExampleBase, public views::ButtonListener {
public:
@@ -28,71 +95,118 @@ class WidgetExample : public ExampleBase, public views::ButtonListener {
}
virtual void CreateExampleView(views::View* container) {
- create_button_ = new views::TextButton(this, L"Create a popup widget");
- container->SetLayoutManager(new views::FillLayout);
- container->AddChildView(create_button_);
- // We'll create close_button_ and popup_widget_, when the create button
- // is clicked.
- close_button_ = NULL;
- popup_widget_ = NULL;
+ container->SetLayoutManager(new BoxLayout());
+ BuildButton(container, L"Create a popup widget", POPUP);
+ BuildButton(container, L"Create a transparent popup widget",
+ TRANSPARENT_POPUP);
+#if defined(OS_LINUX)
+ BuildButton(container, L"Create a child widget", CHILD);
+ BuildButton(container,
+ L"Create a transparent child widget", TRANSPARENT_CHILD);
+#endif
}
private:
+ enum Command {
+ POPUP,
+ CHILD,
+ TRANSPARENT_POPUP,
+ TRANSPARENT_CHILD,
+ CLOSE_WIDGET,
+ };
+
+ void BuildButton(views::View* container, const std::wstring& label, int tag) {
+ views::TextButton* button = new views::TextButton(this, label);
+ button->set_tag(tag);
+ container->AddChildView(button);
+ }
+
+ void InitWidget(Widget* widget,
+ const Widget::TransparencyParam transparency) {
+ // Add a button to close the popup widget.
+ views::TextButton* close_button = new views::TextButton(this, L"Close");
+ close_button->set_tag(CLOSE_WIDGET);
+ views::View* widget_container = new views::View();
+ widget_container->SetLayoutManager(new CenterLayout);
+ if (transparency == Widget::Transparent)
+ close_button->set_background(
+ views::Background::CreateStandardPanelBackground());
+ else
+ widget_container->set_background(
+ views::Background::CreateStandardPanelBackground());
+ widget_container->AddChildView(close_button);
+ widget->GetRootView()->SetContentsView(widget_container);
+
+ // Show the widget.
+ widget->Show();
+ }
+
+#if defined(OS_LINUX)
+ void CreateChild(views::View* parent,
+ const Widget::TransparencyParam transparency) {
+ views::WidgetGtk* widget =
+ new views::WidgetGtk(views::WidgetGtk::TYPE_CHILD);
+ if (transparency == Widget::Transparent)
+ widget->MakeTransparent();
+ // Compute where to place the child widget.
+ // We'll place it at the center of the root widget.
+ views::WidgetGtk* parent_widget =
+ static_cast<views::WidgetGtk*>(parent->GetWidget()->GetRootWidget());
+ gfx::Rect bounds;
+ parent_widget->GetBounds(&bounds, false);
+ // Child widget is 200x200 square.
+ bounds.SetRect((bounds.width() - 200) / 2, (bounds.height() - 200) / 2,
+ 200, 200);
+ // Initialize the child widget with the computed bounds.
+ widget->Init(parent_widget->window_contents(), bounds);
+ InitWidget(widget, transparency);
+ }
+#endif
+
+ void CreatePopup(views::View* parent,
+ const Widget::TransparencyParam transparency) {
+ Widget* widget = Widget::CreatePopupWidget(transparency,
+ Widget::AcceptEvents,
+ Widget::DeleteOnDestroy);
+ // Compute where to place the popup widget.
+ // We'll place it right below the create button.
+ gfx::Point point = parent->GetPosition();
+ // The position in point is relative to the parent. Make it absolute.
+ views::View::ConvertPointToScreen(parent, &point);
+ // Add the height of create_button_.
+ point.Offset(0, parent->size().height());
+ gfx::Rect bounds(point.x(), point.y(), 200, 300);
+ // Initialize the popup widget with the computed bounds.
+ widget->Init(NULL, bounds);
+ InitWidget(widget, transparency);
+ }
+
// ButtonListner implementation.
virtual void ButtonPressed(views::Button* sender, const views::Event& event) {
- if (sender == create_button_) {
- // Disable the create button.
- create_button_->SetEnabled(false);
-
- // Create a popup widget.
- popup_widget_ = views::Widget::CreatePopupWidget(
- views::Widget::NotTransparent,
- views::Widget::AcceptEvents,
- views::Widget::DeleteOnDestroy);
-
- // Compute where to place the popup widget.
- // We'll place it right below the create_button_.
- gfx::Point point = create_button_->GetPosition();
- // The position in point is relative to the parent. Make it absolute.
- views::View::ConvertPointToScreen(create_button_, &point);
- // Add the height of create_button_.
- point.Offset(0, create_button_->size().height());
- gfx::Rect bounds(point.x(), point.y(), 200, 300);
-
- // Initialize the popup widget with the computed bounds.
- popup_widget_->Init(NULL, bounds);
-
- // Add a button to close the popup widget.
- close_button_ = new views::TextButton(this, L"Close");
- views::View* widget_container = new views::View;
- widget_container->SetLayoutManager(new views::FillLayout);
- widget_container->set_background(
- views::Background::CreateStandardPanelBackground());
- widget_container->AddChildView(close_button_);
- popup_widget_->GetRootView()->SetContentsView(widget_container);
-
- // Show the popup widget.
- popup_widget_->Show();
- } else if (sender == close_button_) {
- // Close the popup widget. This will delete popup_widget_ as
- // DeleteOnDestroy is specified when the widget was created.
- // Views on the widget will also be deleted.
- popup_widget_->Close();
- // Re-enable the create button.
- create_button_->SetEnabled(true);
- close_button_ = NULL;
- popup_widget_ = NULL;
+ switch (sender->tag()) {
+ case POPUP:
+ CreatePopup(sender, Widget::NotTransparent);
+ break;
+ case TRANSPARENT_POPUP:
+ CreatePopup(sender, Widget::Transparent);
+ break;
+#if defined(OS_LINUX)
+ case CHILD:
+ CreateChild(sender, Widget::NotTransparent);
+ break;
+ case TRANSPARENT_CHILD:
+ CreateChild(sender, Widget::Transparent);
+ break;
+#endif
+ case CLOSE_WIDGET:
+ sender->GetWidget()->Close();
+ break;
}
}
- views::TextButton* create_button_;
- views::TextButton* close_button_;
- views::Widget* popup_widget_;
-
DISALLOW_COPY_AND_ASSIGN(WidgetExample);
};
} // namespace examples
#endif // VIEWS_EXAMPLES_WIDGET_EXAMPLE_H_
-