diff options
author | nkostylev@chromium.org <nkostylev@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-02 02:17:42 +0000 |
---|---|---|
committer | nkostylev@chromium.org <nkostylev@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-02 02:17:42 +0000 |
commit | b1336f6e026bc492b51ab3680b06d4e6e83dc076 (patch) | |
tree | c87e2aa1a5191fc14788f7d59f545fdde93e0543 | |
parent | e11e56c9dff5f348191b639cbc0358022be9d9f9 (diff) | |
download | chromium_src-b1336f6e026bc492b51ab3680b06d4e6e83dc076.zip chromium_src-b1336f6e026bc492b51ab3680b06d4e6e83dc076.tar.gz chromium_src-b1336f6e026bc492b51ab3680b06d4e6e83dc076.tar.bz2 |
[cros] Create separate window for network dropdown on WebUI OOBE.
Control works and is positioned correctly.
Some UI polishing is needed:
- Bring visual style closer to select elements, update width on all of them.
- Control is not refreshed on recreation.
- Switching back to network screen, background flashes.
BUG=chromium-os:16177
TEST=Manual. Booted with WebUI OOBE, observed working control. Switched between screens.
Review URL: http://codereview.chromium.org/7285029
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@91403 0039d316-1c4b-4281-b951-d872f2087c98
6 files changed, 162 insertions, 12 deletions
diff --git a/chrome/browser/chromeos/login/webui_login_display.cc b/chrome/browser/chromeos/login/webui_login_display.cc index d098f38..25b1c60 100644 --- a/chrome/browser/chromeos/login/webui_login_display.cc +++ b/chrome/browser/chromeos/login/webui_login_display.cc @@ -51,7 +51,6 @@ void WebUILoginDisplay::Init(const std::vector<UserManager::User>& users, bool show_new_user) { // Testing that the delegate has been set. DCHECK(delegate_); - users_ = users; } diff --git a/chrome/browser/chromeos/login/webui_login_display_host.cc b/chrome/browser/chromeos/login/webui_login_display_host.cc index 46d8be1..06cd45a 100644 --- a/chrome/browser/chromeos/login/webui_login_display_host.cc +++ b/chrome/browser/chromeos/login/webui_login_display_host.cc @@ -77,7 +77,6 @@ void WebUILoginDisplayHost::StartWizard(const std::string& first_screen_name, void WebUILoginDisplayHost::StartSignInScreen() { LoadURL(GURL(kLoginURL)); - WebUILoginDisplay::GetInstance()->set_login_window(login_window_); BaseLoginDisplayHost::StartSignInScreen(); } @@ -100,6 +99,7 @@ void WebUILoginDisplayHost::LoadURL(const GURL& url) { login_view_->UpdateWindowType(); login_window_->Show(); + WebUILoginDisplay::GetInstance()->set_login_window(login_window_); } login_view_->LoadURL(url); } diff --git a/chrome/browser/resources/chromeos/oobe.html b/chrome/browser/resources/chromeos/oobe.html index dc31471..ed4b160 100644 --- a/chrome/browser/resources/chromeos/oobe.html +++ b/chrome/browser/resources/chromeos/oobe.html @@ -48,7 +48,7 @@ <div i18n-content="selectNetwork" class="label" class="menu-control"></div> <div class="menu-area"> - <!-- TODO(nkostylev): Embed network control. --> + <div id="network-control"></div> </div> </div> </div> diff --git a/chrome/browser/resources/chromeos/oobe.js b/chrome/browser/resources/chromeos/oobe.js index 35dae9e..9afc950 100644 --- a/chrome/browser/resources/chromeos/oobe.js +++ b/chrome/browser/resources/chromeos/oobe.js @@ -59,16 +59,38 @@ cr.define('cr.ui', function() { // Adjust inner container height based on new step's height. $('inner-container').style.height = newStep.offsetHeight; - oldStep.addEventListener('webkitTransitionEnd', function f(e) { - oldStep.removeEventListener('webkitTransitionEnd', f); - oldStep.classList.add('hidden'); - }); + if (this.currentStep_ != nextStepIndex) { + oldStep.addEventListener('webkitTransitionEnd', function f(e) { + oldStep.removeEventListener('webkitTransitionEnd', f); + oldStep.classList.add('hidden'); + if (nextStepIndex == 0) + Oobe.refreshNetworkControl(); + }); + } else if (nextStepIndex == 0) { + Oobe.refreshNetworkControl(); + } this.currentStep_ = nextStepIndex; $('oobe').className = nextStepId; }, }; /** + * Returns offset (top, left) of the element. + * @param {!Element} element HTML element + * @return {!Object} The offset (top, left). + */ + Oobe.getOffset = function(element) { + var x = 0; + var y = 0; + while(element && !isNaN(element.offsetLeft) && !isNaN(element.offsetTop)) { + x += element.offsetLeft - element.scrollLeft; + y += element.offsetTop - element.scrollTop; + element = element.offsetParent; + } + return { top: y, left: x }; + }; + + /** * Initializes the OOBE flow. This will cause all C++ handlers to * be invoked to do final setup. */ @@ -113,6 +135,15 @@ cr.define('cr.ui', function() { }; /** + * Refreshes position of the network control (on connect screen). + */ + Oobe.refreshNetworkControl = function() { + var controlOffset = Oobe.getOffset($('network-control')); + chrome.send('networkControlPosition', + [controlOffset.left, controlOffset.top]); + }; + + /** * Sets usage statistics checkbox. * @param {bool} whether the checkbox is checked. */ diff --git a/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc index e8db746..41fa64c 100644 --- a/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc @@ -6,20 +6,61 @@ #include "base/memory/scoped_ptr.h" #include "base/values.h" +#include "chrome/browser/chromeos/login/webui_login_display.h" +#include "chrome/browser/chromeos/status/network_dropdown_button.h" +#include "chrome/browser/chromeos/wm_ipc.h" #include "grit/chromium_strings.h" #include "grit/generated_resources.h" +#include "views/layout/fill_layout.h" +#include "views/widget/widget.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/gfx/rect.h" + +namespace { + +// JS API callbacks names. +const char kJsApiNetworkOnExit[] = "networkOnExit"; +const char kJsApiNetworkControlPosition[] = "networkControlPosition"; + +// Width/height of the network control window. +const int kNetworkControlWidth = 150; +const int kNetworkControlHeight = 25; + +// Offsets for the network dropdown control menu. +const int kMenuHorizontalOffset = -3; +const int kMenuVerticalOffset = -1; + +// Initializes menu button default properties. +static void InitMenuButtonProperties(views::MenuButton* menu_button) { + menu_button->set_focusable(true); + menu_button->SetEnabledColor(SK_ColorBLACK); + menu_button->SetHighlightColor(SK_ColorBLACK); + menu_button->SetHoverColor(SK_ColorBLACK); + menu_button->set_animate_on_state_change(false); + // Menu is positioned by bottom right corner of the MenuButton. + menu_button->set_menu_offset(kMenuHorizontalOffset, kMenuVerticalOffset); +} + +} // namespace namespace chromeos { +// NetworkScreenHandler, public: ----------------------------------------------- + NetworkScreenHandler::NetworkScreenHandler() - : screen_(NULL), is_continue_enabled_(false), show_on_init_(false) { + : network_window_(NULL), + screen_(NULL), + is_continue_enabled_(false), + show_on_init_(false) { } NetworkScreenHandler::~NetworkScreenHandler() { ClearErrors(); + CloseNetworkWindow(); } +// NetworkScreenHandler, NetworkScreenActor implementation: -------------------- + void NetworkScreenHandler::SetDelegate(NetworkScreenActor::Delegate* screen) { screen_ = screen; } @@ -37,6 +78,7 @@ void NetworkScreenHandler::Show() { } void NetworkScreenHandler::Hide() { + CloseNetworkWindow(); } void NetworkScreenHandler::ShowError(const string16& message) { @@ -74,6 +116,8 @@ void NetworkScreenHandler::EnableContinue(bool enabled) { *enabled_value); } +// NetworkScreenHandler, OobeMessageHandler implementation: -------------------- + void NetworkScreenHandler::GetLocalizedStrings( DictionaryValue* localized_strings) { localized_strings->SetString("networkScreenTitle", @@ -98,14 +142,68 @@ void NetworkScreenHandler::Initialize() { } } +// NetworkScreenHandler, WebUIMessageHandler implementation: ------------------- + void NetworkScreenHandler::RegisterMessages() { - web_ui_->RegisterMessageCallback("networkOnExit", - NewCallback(this, &NetworkScreenHandler::OnExit)); + web_ui_->RegisterMessageCallback(kJsApiNetworkControlPosition, + NewCallback(this, &NetworkScreenHandler::HandleNetworkControlPosition)); + web_ui_->RegisterMessageCallback(kJsApiNetworkOnExit, + NewCallback(this, &NetworkScreenHandler::HandleOnExit)); +} + +// NetworkScreenHandler, private: ---------------------------------------------- + +void NetworkScreenHandler::HandleNetworkControlPosition(const ListValue* args) { + const size_t kParamCount = 2; + double x, y; + if (args->GetSize() != kParamCount || + !args->GetDouble(0, &x) || + !args->GetDouble(1, &y)) { + NOTREACHED(); + return; + } + network_control_pos_.SetPoint(static_cast<int>(x), static_cast<int>(y)); + CreateOrUpdateNetworkWindow(); } -void NetworkScreenHandler::OnExit(const ListValue* args) { +void NetworkScreenHandler::HandleOnExit(const ListValue* args) { ClearErrors(); screen_->OnContinuePressed(); } +void NetworkScreenHandler::CreateOrUpdateNetworkWindow() { + views::Widget* login_window = WebUILoginDisplay::GetLoginWindow(); + gfx::Rect login_bounds = login_window->GetWindowScreenBounds(); + gfx::Rect bounds(login_bounds.x() + network_control_pos_.x(), + login_bounds.y() + network_control_pos_.y(), + kNetworkControlWidth, kNetworkControlHeight); + if (!network_window_) { + views::Widget::InitParams widget_params( + views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); + widget_params.bounds = bounds; + widget_params.double_buffer = true; + widget_params.parent = login_window->GetNativeView(); + network_window_ = new views::Widget; + network_window_->Init(widget_params); + std::vector<int> params; + chromeos::WmIpc::instance()->SetWindowType( + network_window_->GetNativeView(), + chromeos::WM_IPC_WINDOW_CHROME_INFO_BUBBLE, + ¶ms); + NetworkDropdownButton* button = + new NetworkDropdownButton(false, login_window->GetNativeWindow()); + InitMenuButtonProperties(button); + network_window_->SetContentsView(button); + network_window_->Show(); + } else { + network_window_->SetBounds(bounds); + } +} + +void NetworkScreenHandler::CloseNetworkWindow() { + if (network_window_) + network_window_->Close(); + network_window_ = NULL; +} + } // namespace chromeos diff --git a/chrome/browser/ui/webui/chromeos/login/network_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/network_screen_handler.h index 968df19..3f78580 100644 --- a/chrome/browser/ui/webui/chromeos/login/network_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/network_screen_handler.h @@ -9,9 +9,14 @@ #include "chrome/browser/chromeos/login/network_screen_actor.h" #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" #include "content/browser/webui/web_ui.h" +#include "ui/gfx/point.h" class ListValue; +namespace views { +class Widget; +} + namespace chromeos { // WebUI implementation of NetworkScreenActor. It is used to interact with @@ -41,8 +46,22 @@ class NetworkScreenHandler : public NetworkScreenActor, virtual void RegisterMessages(); private: + // Handles change of the network control position. + void HandleNetworkControlPosition(const ListValue* args); + // Handles moving off the screen. - void OnExit(const ListValue* args); + void HandleOnExit(const ListValue* args); + + // Creates network window or updates it's bounds. + void CreateOrUpdateNetworkWindow(); + + // Closes network window. + void CloseNetworkWindow(); + + // Window that contains network dropdown button. + // TODO(nkostylev): Temporary solution till we have + // RenderWidgetHostViewViews working. + views::Widget* network_window_; NetworkScreenActor::Delegate* screen_; @@ -51,6 +70,9 @@ class NetworkScreenHandler : public NetworkScreenActor, // Keeps whether screen should be shown right after initialization. bool show_on_init_; + // Position of the network control. + gfx::Point network_control_pos_; + DISALLOW_COPY_AND_ASSIGN(NetworkScreenHandler); }; |