views: Add support for auto-hide menubar.

This commit is contained in:
Cheng Zhao 2014-08-07 13:47:58 +08:00
parent b139d97f3d
commit 8a9e1824c3
6 changed files with 47 additions and 11 deletions

View file

@ -94,13 +94,15 @@ NativeWindowViews::NativeWindowViews(content::WebContents* web_contents,
const mate::Dictionary& options) const mate::Dictionary& options)
: NativeWindow(web_contents, options), : NativeWindow(web_contents, options),
window_(new views::Widget), window_(new views::Widget),
menu_bar_(NULL),
web_view_(inspectable_web_contents()->GetView()->GetView()), web_view_(inspectable_web_contents()->GetView()->GetView()),
menu_bar_autohide_(false),
menu_bar_show_(false),
keyboard_event_handler_(new views::UnhandledKeyboardEventHandler), keyboard_event_handler_(new views::UnhandledKeyboardEventHandler),
use_content_size_(false), use_content_size_(false),
resizable_(true) { resizable_(true) {
options.Get(switches::kResizable, &resizable_); options.Get(switches::kResizable, &resizable_);
options.Get(switches::kTitle, &title_); options.Get(switches::kTitle, &title_);
options.Get(switches::kAutoHideMenuBar, &menu_bar_autohide_);
int width = 800, height = 600; int width = 800, height = 600;
options.Get(switches::kWidth, &width); options.Get(switches::kWidth, &width);
@ -242,7 +244,7 @@ gfx::Size NativeWindowViews::GetContentSize() {
gfx::Size content_size = gfx::Size content_size =
window_->non_client_view()->frame_view()->GetBoundsForClientView().size(); window_->non_client_view()->frame_view()->GetBoundsForClientView().size();
if (menu_bar_) if (menu_bar_ && menu_bar_show_)
content_size.set_height(content_size.height() - kMenuBarHeight); content_size.set_height(content_size.height() - kMenuBarHeight);
return content_size; return content_size;
} }
@ -383,12 +385,15 @@ void NativeWindowViews::SetMenu(ui::MenuModel* menu_model) {
if (!menu_bar_) { if (!menu_bar_) {
gfx::Size content_size = GetContentSize(); gfx::Size content_size = GetContentSize();
menu_bar_ = new MenuBar; menu_bar_.reset(new MenuBar);
AddChildViewAt(menu_bar_, 0); menu_bar_->set_owned_by_client();
if (!menu_bar_autohide_) {
SetMenuBarVisibility(true);
if (use_content_size_) if (use_content_size_)
SetContentSize(content_size); SetContentSize(content_size);
} }
}
menu_bar_->SetMenu(menu_model); menu_bar_->SetMenu(menu_model);
Layout(); Layout();
@ -529,6 +534,14 @@ views::NonClientFrameView* NativeWindowViews::CreateNonClientFrameView(
void NativeWindowViews::HandleKeyboardEvent( void NativeWindowViews::HandleKeyboardEvent(
content::WebContents*, content::WebContents*,
const content::NativeWebKeyboardEvent& event) { const content::NativeWebKeyboardEvent& event) {
if (menu_bar_autohide_ &&
(event.modifiers & content::NativeWebKeyboardEvent::AltKey) &&
(event.windowsKeyCode == 164 || event.windowsKeyCode == 165) &&
(event.type == blink::WebInputEvent::RawKeyDown)) {
SetMenuBarVisibility(!menu_bar_show_);
Layout();
}
keyboard_event_handler_->HandleKeyboardEvent(event, GetFocusManager()); keyboard_event_handler_->HandleKeyboardEvent(event, GetFocusManager());
} }
@ -558,11 +571,22 @@ gfx::Rect NativeWindowViews::ContentBoundsToWindowBounds(
const gfx::Rect& bounds) { const gfx::Rect& bounds) {
gfx::Rect window_bounds = gfx::Rect window_bounds =
window_->non_client_view()->GetWindowBoundsForClientBounds(bounds); window_->non_client_view()->GetWindowBoundsForClientBounds(bounds);
if (menu_bar_) if (menu_bar_ && menu_bar_show_)
window_bounds.set_height(window_bounds.height() + kMenuBarHeight); window_bounds.set_height(window_bounds.height() + kMenuBarHeight);
return window_bounds; return window_bounds;
} }
void NativeWindowViews::SetMenuBarVisibility(bool visible) {
if (!menu_bar_)
return;
menu_bar_show_ = visible;
if (visible)
AddChildView(menu_bar_.get());
else
RemoveChildView(menu_bar_.get());
}
// static // static
NativeWindow* NativeWindow::Create(content::WebContents* web_contents, NativeWindow* NativeWindow::Create(content::WebContents* web_contents,
const mate::Dictionary& options) { const mate::Dictionary& options) {

View file

@ -121,10 +121,16 @@ class NativeWindowViews : public NativeWindow,
// in client area we need to substract/add menu bar's height in convertions. // in client area we need to substract/add menu bar's height in convertions.
gfx::Rect ContentBoundsToWindowBounds(const gfx::Rect& content_bounds); gfx::Rect ContentBoundsToWindowBounds(const gfx::Rect& content_bounds);
// Show/Hide the menu bar.
void SetMenuBarVisibility(bool visible);
scoped_ptr<views::Widget> window_; scoped_ptr<views::Widget> window_;
MenuBar* menu_bar_;
views::View* web_view_; // Managed by inspectable_web_contents_. views::View* web_view_; // Managed by inspectable_web_contents_.
scoped_ptr<MenuBar> menu_bar_;
bool menu_bar_autohide_;
bool menu_bar_show_;
#if defined(USE_X11) #if defined(USE_X11)
scoped_ptr<GlobalMenuBarX11> global_menu_bar_; scoped_ptr<GlobalMenuBarX11> global_menu_bar_;
#endif #endif

View file

@ -24,10 +24,10 @@ void MenuLayout::Layout(views::View* host) {
gfx::Rect web_view_bounds = gfx::Rect( gfx::Rect web_view_bounds = gfx::Rect(
0, menu_height_, size.width(), size.height() - menu_height_); 0, menu_height_, size.width(), size.height() - menu_height_);
views::View* menu_bar = host->child_at(0); views::View* web_view = host->child_at(0);
views::View* web_view = host->child_at(1); views::View* menu_bar = host->child_at(1);
menu_bar->SetBoundsRect(menu_Bar_bounds);
web_view->SetBoundsRect(web_view_bounds); web_view->SetBoundsRect(web_view_bounds);
menu_bar->SetBoundsRect(menu_Bar_bounds);
} }
gfx::Size MenuLayout::GetPreferredSize(views::View* host) { gfx::Size MenuLayout::GetPreferredSize(views::View* host) {

View file

@ -48,6 +48,9 @@ const char kWebPreferences[] = "web-preferences";
// The factor of which page should be zoomed. // The factor of which page should be zoomed.
const char kZoomFactor[] = "zoom-factor"; const char kZoomFactor[] = "zoom-factor";
// The menu bar is hidden unless "Alt" is pressed.
const char kAutoHideMenuBar[] = "auto-hide-menu-bar";
} // namespace switches } // namespace switches
} // namespace atom } // namespace atom

View file

@ -32,6 +32,7 @@ extern const char kAcceptFirstMouse[];
extern const char kUseContentSize[]; extern const char kUseContentSize[];
extern const char kWebPreferences[]; extern const char kWebPreferences[];
extern const char kZoomFactor[]; extern const char kZoomFactor[];
extern const char kAutoHideMenuBar[];
} // namespace switches } // namespace switches

View file

@ -55,6 +55,8 @@ You can also create a window without chrome by using
`manual-enable-iframe` or `disable`. `manual-enable-iframe` or `disable`.
* `accept-first-mouse` Boolean - Whether the web view accepts a single * `accept-first-mouse` Boolean - Whether the web view accepts a single
mouse-down event that simultaneously activates the window mouse-down event that simultaneously activates the window
* `auto-hide-menu-bar` Boolean - Auto hide the menu bar unless the `Alt`
key is pressed.
* `web-preferences` Object - Settings of web page's features * `web-preferences` Object - Settings of web page's features
* `javascript` Boolean * `javascript` Boolean
* `web-security` Boolean * `web-security` Boolean