Index: chrome/browser/ui/panels/panel_manager.cc |
diff --git a/chrome/browser/ui/panels/panel_manager.cc b/chrome/browser/ui/panels/panel_manager.cc |
index 7e2fefdbb4373ca3532e2acbc32a02ad43a3792a..ae5bbe22801b42eaf74ecd6ded6ad688ff0ced65 100644 |
--- a/chrome/browser/ui/panels/panel_manager.cc |
+++ b/chrome/browser/ui/panels/panel_manager.cc |
@@ -4,55 +4,28 @@ |
#include "chrome/browser/ui/panels/panel_manager.h" |
-#include <algorithm> |
- |
-#include "base/bind.h" |
#include "base/logging.h" |
#include "base/memory/scoped_ptr.h" |
-#include "base/message_loop.h" |
#include "chrome/browser/ui/browser.h" |
#include "chrome/browser/ui/browser_list.h" |
#include "chrome/browser/ui/panels/panel_mouse_watcher.h" |
+#include "chrome/browser/ui/panels/panel_strip.h" |
#include "chrome/browser/ui/window_sizer.h" |
#include "chrome/common/chrome_notification_types.h" |
#include "content/public/browser/notification_service.h" |
#include "content/public/browser/notification_source.h" |
namespace { |
-// Invalid panel index. |
-const size_t kInvalidPanelIndex = static_cast<size_t>(-1); |
- |
-// Width of spacing between first panel and the right edge of the screen. |
-// Leaving a larger gap at the edge of the screen allows access to UI |
-// elements located on the bottom right of windows. |
-const int kRightScreenEdgeSpacingWidth = 24; |
- |
-// Width to height ratio is used to compute the default width or height |
-// when only one value is provided. |
-const double kPanelDefaultWidthToHeightRatio = 1.62; // golden ratio |
- |
-// Maxmium width and height of a panel based on the factor of the working |
-// area. |
-const double kPanelMaxWidthFactor = 0.35; |
-const double kPanelMaxHeightFactor = 0.5; |
- |
-// Occasionally some system, like Windows, might not bring up or down the bottom |
-// bar when the mouse enters or leaves the bottom screen area. This is the |
-// maximum time we will wait for the bottom bar visibility change notification. |
-// After the time expires, we bring up/down the titlebars as planned. |
-const int kMaxMillisecondsWaitForBottomBarVisibilityChange = 1000; |
- |
-// See usage below. |
-#if defined(TOOLKIT_GTK) |
-const int kMillisecondsBeforeCollapsingFromTitleOnlyState = 2000; |
-#else |
-const int kMillisecondsBeforeCollapsingFromTitleOnlyState = 0; |
-#endif |
-} // namespace |
+const int kOverflowStripThickness = 24; |
-// static |
-const int PanelManager::kPanelMinWidth = 100; |
-const int PanelManager::kPanelMinHeight = 20; |
+// Width of spacing around panel strip and the left/right edges of the screen. |
+const int kPanelStripLeftMargin = kOverflowStripThickness + 6; |
+const int kPanelStripRightMargin = 24; |
+ |
+// Height of panel strip is based on the factor of the working area. |
+const double kPanelStripHeightFactor = 0.5; |
+ |
+} // namespace |
// static |
PanelManager* PanelManager::GetInstance() { |
@@ -61,24 +34,14 @@ PanelManager* PanelManager::GetInstance() { |
} |
PanelManager::PanelManager() |
- : minimized_panel_count_(0), |
- are_titlebars_up_(false), |
- dragging_panel_index_(kInvalidPanelIndex), |
- dragging_panel_original_x_(0), |
- delayed_titlebar_action_(NO_ACTION), |
- remove_delays_for_testing_(false), |
- titlebar_action_factory_(this), |
- auto_sizing_enabled_(true), |
- mouse_watching_disabled_(false) { |
- panel_mouse_watcher_.reset(PanelMouseWatcher::Create()); |
+ : panel_mouse_watcher_(PanelMouseWatcher::Create()), |
+ auto_sizing_enabled_(true) { |
+ panel_strip_.reset(new PanelStrip(this)); |
auto_hiding_desktop_bar_ = AutoHidingDesktopBar::Create(this); |
OnDisplayChanged(); |
} |
PanelManager::~PanelManager() { |
- DCHECK(panels_.empty()); |
- DCHECK(panels_pending_to_remove_.empty()); |
- DCHECK_EQ(0, minimized_panel_count_); |
} |
void PanelManager::OnDisplayChanged() { |
@@ -101,51 +64,26 @@ void PanelManager::SetWorkArea(const gfx::Rect& work_area) { |
auto_hiding_desktop_bar_->UpdateWorkArea(work_area_); |
AdjustWorkAreaForAutoHidingDesktopBars(); |
+ Layout(); |
+} |
- Rearrange(panels_.begin(), StartingRightPosition()); |
+void PanelManager::Layout() { |
+ int height = |
+ static_cast<int>(adjusted_work_area_.height() * kPanelStripHeightFactor); |
+ gfx::Rect panel_strip_bounds; |
+ panel_strip_bounds.set_x(adjusted_work_area_.x() + kPanelStripLeftMargin); |
+ panel_strip_bounds.set_y(adjusted_work_area_.bottom() - height); |
+ panel_strip_bounds.set_width(adjusted_work_area_.width() - |
+ kPanelStripLeftMargin - kPanelStripRightMargin); |
+ panel_strip_bounds.set_height(height); |
+ panel_strip_->SetBounds(panel_strip_bounds); |
} |
Panel* PanelManager::CreatePanel(Browser* browser) { |
int width = browser->override_bounds().width(); |
int height = browser->override_bounds().height(); |
- |
Panel* panel = new Panel(browser, gfx::Size(width, height)); |
- |
- int max_panel_width = GetMaxPanelWidth(); |
- int max_panel_height = GetMaxPanelHeight(); |
- panel->SetSizeRange(gfx::Size(kPanelMinWidth, kPanelMinHeight), |
- gfx::Size(max_panel_width, max_panel_height)); |
- |
- // Auto resizable is enabled only if no initial size is provided. |
- bool auto_resize = (width == 0 && height == 0); |
- panel->SetAutoResizable(auto_resize); |
- |
- // Adjust the width and height to fit into our constraint. |
- if (!auto_resize) { |
- if (height == 0) |
- height = width / kPanelDefaultWidthToHeightRatio; |
- if (width == 0) |
- width = height * kPanelDefaultWidthToHeightRatio; |
- } |
- |
- if (width < kPanelMinWidth) |
- width = kPanelMinWidth; |
- else if (width > max_panel_width) |
- width = max_panel_width; |
- |
- if (height < kPanelMinHeight) |
- height = kPanelMinHeight; |
- else if (height > max_panel_height) |
- height = max_panel_height; |
- |
- panel->set_restored_size(gfx::Size(width, height)); |
- |
- // Layout the new panel. |
- int y = adjusted_work_area_.bottom() - height; |
- int x = GetRightMostAvailablePosition() - width; |
- panel->Initialize(gfx::Rect(x, y, width, height)); |
- |
- panels_.push_back(panel); |
+ panel_strip_->AddPanel(panel); |
content::NotificationService::current()->Notify( |
chrome::NOTIFICATION_PANEL_ADDED, |
@@ -155,50 +93,17 @@ Panel* PanelManager::CreatePanel(Browser* browser) { |
return panel; |
} |
-int PanelManager::GetMaxPanelWidth() const { |
- return static_cast<int>(adjusted_work_area_.width() * kPanelMaxWidthFactor); |
-} |
- |
-int PanelManager::GetMaxPanelHeight() const { |
- return static_cast<int>(adjusted_work_area_.height() * kPanelMaxHeightFactor); |
-} |
- |
int PanelManager::StartingRightPosition() const { |
- return adjusted_work_area_.right() - kRightScreenEdgeSpacingWidth; |
-} |
- |
-int PanelManager::GetRightMostAvailablePosition() const { |
- return panels_.empty() ? StartingRightPosition() : |
- (panels_.back()->GetBounds().x() - kPanelsHorizontalSpacing); |
+ return panel_strip_->StartingRightPosition(); |
} |
void PanelManager::Remove(Panel* panel) { |
- // If we're in the process of dragging, delay the removal. |
- if (dragging_panel_index_ != kInvalidPanelIndex) { |
- panels_pending_to_remove_.push_back(panel); |
+ if (panel_strip_->Remove(panel)) |
return; |
- } |
- |
- DoRemove(panel); |
-} |
- |
-void PanelManager::DelayedRemove() { |
- for (size_t i = 0; i < panels_pending_to_remove_.size(); ++i) |
- DoRemove(panels_pending_to_remove_[i]); |
- panels_pending_to_remove_.clear(); |
+ // TODO(jianli): else try removing from overflow strip |
} |
-void PanelManager::DoRemove(Panel* panel) { |
- Panels::iterator iter = find(panels_.begin(), panels_.end(), panel); |
- if (iter == panels_.end()) |
- return; |
- |
- if (panel->expansion_state() != Panel::EXPANDED) |
- DecrementMinimizedPanels(); |
- |
- gfx::Rect bounds = (*iter)->GetBounds(); |
- Rearrange(panels_.erase(iter), bounds.right()); |
- |
+void PanelManager::OnPanelRemoved(Panel* panel) { |
content::NotificationService::current()->Notify( |
chrome::NOTIFICATION_PANEL_REMOVED, |
content::Source<Panel>(panel), |
@@ -206,337 +111,35 @@ void PanelManager::DoRemove(Panel* panel) { |
} |
void PanelManager::StartDragging(Panel* panel) { |
- for (size_t i = 0; i < panels_.size(); ++i) { |
- if (panels_[i] == panel) { |
- dragging_panel_index_ = i; |
- dragging_panel_bounds_ = panel->GetBounds(); |
- dragging_panel_original_x_ = dragging_panel_bounds_.x(); |
- break; |
- } |
- } |
+ panel_strip_->StartDragging(panel); |
} |
void PanelManager::Drag(int delta_x) { |
- DCHECK(dragging_panel_index_ != kInvalidPanelIndex); |
- |
- if (!delta_x) |
- return; |
- |
- // Moves this panel to the dragging position. |
- Panel* dragging_panel = panels_[dragging_panel_index_]; |
- gfx::Rect new_bounds(dragging_panel->GetBounds()); |
- new_bounds.set_x(new_bounds.x() + delta_x); |
- dragging_panel->SetPanelBounds(new_bounds); |
- |
- // Checks and processes other affected panels. |
- if (delta_x > 0) |
- DragRight(); |
- else |
- DragLeft(); |
-} |
- |
-void PanelManager::DragLeft() { |
- Panel* dragging_panel = panels_[dragging_panel_index_]; |
- |
- // This is the left corner of the dragging panel. We use it to check against |
- // all the panels on its left. |
- int dragging_panel_left_boundary = dragging_panel->GetBounds().x(); |
- |
- // This is the right corner which a panel will be moved to. |
- int current_panel_right_boundary = |
- dragging_panel_bounds_.x() + dragging_panel_bounds_.width(); |
- |
- // Checks the panels to the left of the dragging panel. |
- size_t current_panel_index = dragging_panel_index_ + 1; |
- for (; current_panel_index < panels_.size(); ++current_panel_index) { |
- Panel* current_panel = panels_[current_panel_index]; |
- |
- // Current panel will only be affected if the left corner of dragging |
- // panel goes beyond the middle position of the current panel. |
- if (dragging_panel_left_boundary > current_panel->GetBounds().x() + |
- current_panel->GetBounds().width() / 2) |
- break; |
- |
- // Moves current panel to the new position. |
- gfx::Rect bounds(current_panel->GetBounds()); |
- bounds.set_x(current_panel_right_boundary - bounds.width()); |
- current_panel_right_boundary -= bounds.width() + kPanelsHorizontalSpacing; |
- current_panel->SetPanelBounds(bounds); |
- |
- // Updates the index of current panel since it has been moved to the |
- // position of previous panel. |
- panels_[current_panel_index - 1] = current_panel; |
- } |
- |
- // Updates the position and index of dragging panel as the result of moving |
- // other affected panels. |
- if (current_panel_index != dragging_panel_index_ + 1) { |
- dragging_panel_bounds_.set_x(current_panel_right_boundary - |
- dragging_panel_bounds_.width()); |
- dragging_panel_index_ = current_panel_index - 1; |
- panels_[dragging_panel_index_] = dragging_panel; |
- } |
-} |
- |
-void PanelManager::DragRight() { |
- Panel* dragging_panel = panels_[dragging_panel_index_]; |
- |
- // This is the right corner of the dragging panel. We use it to check against |
- // all the panels on its right. |
- int dragging_panel_right_boundary = dragging_panel->GetBounds().x() + |
- dragging_panel->GetBounds().width() - 1; |
- |
- // This is the left corner which a panel will be moved to. |
- int current_panel_left_boundary = dragging_panel_bounds_.x(); |
- |
- // Checks the panels to the right of the dragging panel. |
- int current_panel_index = static_cast<int>(dragging_panel_index_) - 1; |
- for (; current_panel_index >= 0; --current_panel_index) { |
- Panel* current_panel = panels_[current_panel_index]; |
- |
- // Current panel will only be affected if the right corner of dragging |
- // panel goes beyond the middle position of the current panel. |
- if (dragging_panel_right_boundary < current_panel->GetBounds().x() + |
- current_panel->GetBounds().width() / 2) |
- break; |
- |
- // Moves current panel to the new position. |
- gfx::Rect bounds(current_panel->GetBounds()); |
- bounds.set_x(current_panel_left_boundary); |
- current_panel_left_boundary += bounds.width() + kPanelsHorizontalSpacing; |
- current_panel->SetPanelBounds(bounds); |
- |
- // Updates the index of current panel since it has been moved to the |
- // position of previous panel. |
- panels_[current_panel_index + 1] = current_panel; |
- } |
- |
- // Updates the position and index of dragging panel as the result of moving |
- // other affected panels. |
- if (current_panel_index != static_cast<int>(dragging_panel_index_) - 1) { |
- dragging_panel_bounds_.set_x(current_panel_left_boundary); |
- dragging_panel_index_ = current_panel_index + 1; |
- panels_[dragging_panel_index_] = dragging_panel; |
- } |
+ panel_strip_->Drag(delta_x); |
} |
void PanelManager::EndDragging(bool cancelled) { |
- DCHECK(dragging_panel_index_ != kInvalidPanelIndex); |
- |
- if (cancelled) { |
- Drag(dragging_panel_original_x_ - |
- panels_[dragging_panel_index_]->GetBounds().x()); |
- } else { |
- panels_[dragging_panel_index_]->SetPanelBounds( |
- dragging_panel_bounds_); |
- } |
- |
- dragging_panel_index_ = kInvalidPanelIndex; |
- |
- DelayedRemove(); |
+ panel_strip_->EndDragging(cancelled); |
} |
void PanelManager::OnPanelExpansionStateChanged( |
Panel::ExpansionState old_state, Panel::ExpansionState new_state) { |
- DCHECK_NE(new_state, old_state); |
- switch (new_state) { |
- case Panel::EXPANDED: |
- DecrementMinimizedPanels(); |
- break; |
- case Panel::MINIMIZED: |
- case Panel::TITLE_ONLY: |
- if (old_state == Panel::EXPANDED) |
- IncrementMinimizedPanels(); |
- break; |
- default: |
- break; |
- } |
-} |
- |
-void PanelManager::IncrementMinimizedPanels() { |
- if (!mouse_watching_disabled_ && !minimized_panel_count_) |
- panel_mouse_watcher_->AddObserver(this); |
- minimized_panel_count_++; |
- DCHECK_LE(minimized_panel_count_, num_panels()); |
-} |
- |
-void PanelManager::DecrementMinimizedPanels() { |
- minimized_panel_count_--; |
- DCHECK_GE(minimized_panel_count_, 0); |
- if (!mouse_watching_disabled_ && !minimized_panel_count_) |
- panel_mouse_watcher_->RemoveObserver(this); |
+ panel_strip_->OnPanelExpansionStateChanged(old_state, new_state); |
} |
void PanelManager::OnPreferredWindowSizeChanged( |
Panel* panel, const gfx::Size& preferred_window_size) { |
if (!auto_sizing_enabled_) |
return; |
- |
- gfx::Rect bounds = panel->GetBounds(); |
- |
- // The panel width: |
- // * cannot grow or shrink to go beyond [min_width, max_width] |
- int new_width = preferred_window_size.width(); |
- if (new_width > panel->max_size().width()) |
- new_width = panel->max_size().width(); |
- if (new_width < panel->min_size().width()) |
- new_width = panel->min_size().width(); |
- |
- if (new_width != bounds.width()) { |
- int delta = bounds.width() - new_width; |
- bounds.set_x(bounds.x() + delta); |
- bounds.set_width(new_width); |
- |
- // Reposition all the panels on the left. |
- int panel_index = -1; |
- for (int i = 0; i < static_cast<int>(panels_.size()); ++i) { |
- if (panels_[i] == panel) { |
- panel_index = i; |
- break; |
- } |
- } |
- DCHECK(panel_index >= 0); |
- for (int i = static_cast<int>(panels_.size()) -1; i > panel_index; |
- --i) { |
- gfx::Rect this_bounds = panels_[i]->GetBounds(); |
- this_bounds.set_x(this_bounds.x() + delta); |
- panels_[i]->SetPanelBounds(this_bounds); |
- } |
- } |
- |
- // The panel height: |
- // * cannot grow or shrink to go beyond [min_height, max_height] |
- int new_height = preferred_window_size.height(); |
- if (new_height > panel->max_size().height()) |
- new_height = panel->max_size().height(); |
- if (new_height < panel->min_size().height()) |
- new_height = panel->min_size().height(); |
- |
- // Only need to adjust bounds height when panel is expanded. |
- gfx::Size restored_size = panel->restored_size(); |
- if (new_height != restored_size.height() && |
- panel->expansion_state() == Panel::EXPANDED) { |
- bounds.set_y(bounds.y() - new_height + bounds.height()); |
- bounds.set_height(new_height); |
- } |
- |
- gfx::Size new_size = gfx::Size(new_width, new_height); |
- if (new_size != restored_size) |
- panel->set_restored_size(new_size); |
- |
- panel->SetPanelBounds(bounds); |
+ panel_strip_->OnPreferredWindowSizeChanged(panel, preferred_window_size); |
} |
bool PanelManager::ShouldBringUpTitlebars(int mouse_x, int mouse_y) const { |
- // We should always bring up the titlebar if the mouse is over the |
- // visible auto-hiding bottom bar. |
- if (auto_hiding_desktop_bar_->IsEnabled(AutoHidingDesktopBar::ALIGN_BOTTOM) && |
- auto_hiding_desktop_bar_->GetVisibility( |
- AutoHidingDesktopBar::ALIGN_BOTTOM) == |
- AutoHidingDesktopBar::VISIBLE && |
- mouse_y >= adjusted_work_area_.bottom()) |
- return true; |
- |
- for (Panels::const_iterator iter = panels_.begin(); |
- iter != panels_.end(); ++iter) { |
- if ((*iter)->ShouldBringUpTitlebar(mouse_x, mouse_y)) |
- return true; |
- } |
- return false; |
+ return panel_strip_->ShouldBringUpTitlebars(mouse_x, mouse_y); |
} |
void PanelManager::BringUpOrDownTitlebars(bool bring_up) { |
- if (are_titlebars_up_ == bring_up) |
- return; |
- are_titlebars_up_ = bring_up; |
- |
- int task_delay_milliseconds = 0; |
- |
- // If the auto-hiding bottom bar exists, delay the action until the bottom |
- // bar is fully visible or hidden. We do not want both bottom bar and panel |
- // titlebar to move at the same time but with different speeds. |
- if (auto_hiding_desktop_bar_->IsEnabled(AutoHidingDesktopBar::ALIGN_BOTTOM)) { |
- AutoHidingDesktopBar::Visibility visibility = auto_hiding_desktop_bar_-> |
- GetVisibility(AutoHidingDesktopBar::ALIGN_BOTTOM); |
- if (visibility != (bring_up ? AutoHidingDesktopBar::VISIBLE |
- : AutoHidingDesktopBar::HIDDEN)) { |
- // Occasionally some system, like Windows, might not bring up or down the |
- // bottom bar when the mouse enters or leaves the bottom screen area. |
- // Thus, we schedule a delayed task to do the work if we do not receive |
- // the bottom bar visibility change notification within a certain period |
- // of time. |
- task_delay_milliseconds = |
- kMaxMillisecondsWaitForBottomBarVisibilityChange; |
- } |
- } |
- |
- // On some OSes, the interaction with native Taskbars/Docks may be improved |
- // if the panels do not go back to minimized state too fast. For example, |
- // it makes it possible to hit the titlebar on OSX if Dock has Magnifying |
- // enabled - the panels stay up for a while after Dock magnification effect |
- // stops covering the panels. |
- // |
- // Another example would be taskbar in auto-hide mode on Linux. In this mode |
- // taskbar will cover the panel in title hover mode, leaving it up for a few |
- // seconds would allow the user to be able to click on it. |
- // |
- // Currently, no platforms use both delays. |
- DCHECK(task_delay_milliseconds == 0); |
- if (!bring_up) |
- task_delay_milliseconds = kMillisecondsBeforeCollapsingFromTitleOnlyState; |
- |
- // OnAutoHidingDesktopBarVisibilityChanged will handle this. |
- delayed_titlebar_action_ = bring_up ? BRING_UP : BRING_DOWN; |
- if (remove_delays_for_testing_) |
- task_delay_milliseconds = 0; |
- |
- // If user moves the mouse in and out of mouse tracking area, we might have |
- // previously posted but not yet dispatched task in the queue. New action |
- // should always 'reset' the delays so cancel any tasks that haven't run yet |
- // and post a new one. |
- titlebar_action_factory_.InvalidateWeakPtrs(); |
- MessageLoop::current()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&PanelManager::DelayedBringUpOrDownTitlebarsCheck, |
- titlebar_action_factory_.GetWeakPtr()), |
- task_delay_milliseconds); |
-} |
- |
-void PanelManager::DelayedBringUpOrDownTitlebarsCheck() { |
- // Task was already processed or cancelled - bail out. |
- if (delayed_titlebar_action_ == NO_ACTION) |
- return; |
- |
- bool need_to_bring_up_titlebars = (delayed_titlebar_action_ == BRING_UP); |
- |
- delayed_titlebar_action_ = NO_ACTION; |
- |
- // Check if the action is still needed based on the latest mouse position. The |
- // user could move the mouse into the tracking area and then quickly move it |
- // out of the area. In case of this, cancel the action. |
- if (are_titlebars_up_ != need_to_bring_up_titlebars) |
- return; |
- |
- DoBringUpOrDownTitlebars(need_to_bring_up_titlebars); |
-} |
- |
-void PanelManager::DoBringUpOrDownTitlebars(bool bring_up) { |
- for (Panels::const_iterator iter = panels_.begin(); |
- iter != panels_.end(); ++iter) { |
- Panel* panel = *iter; |
- |
- // Skip any panel that is drawing the attention. |
- if (panel->IsDrawingAttention()) |
- continue; |
- |
- if (bring_up) { |
- if (panel->expansion_state() == Panel::MINIMIZED) |
- panel->SetExpansionState(Panel::TITLE_ONLY); |
- } else { |
- if (panel->expansion_state() == Panel::TITLE_ONLY) |
- panel->SetExpansionState(Panel::MINIMIZED); |
- } |
- } |
+ panel_strip_->BringUpOrDownTitlebars(bring_up); |
} |
void PanelManager::AdjustWorkAreaForAutoHidingDesktopBars() { |
@@ -558,16 +161,7 @@ void PanelManager::AdjustWorkAreaForAutoHidingDesktopBars() { |
int PanelManager::GetBottomPositionForExpansionState( |
Panel::ExpansionState expansion_state) const { |
- int bottom = adjusted_work_area_.bottom(); |
- // If there is an auto-hiding desktop bar aligned to the bottom edge, we need |
- // to move the title-only panel above the auto-hiding desktop bar. |
- if (expansion_state == Panel::TITLE_ONLY && |
- auto_hiding_desktop_bar_->IsEnabled(AutoHidingDesktopBar::ALIGN_BOTTOM)) { |
- bottom -= auto_hiding_desktop_bar_->GetThickness( |
- AutoHidingDesktopBar::ALIGN_BOTTOM); |
- } |
- |
- return bottom; |
+ return panel_strip_->GetBottomPositionForExpansionState(expansion_state); |
} |
BrowserWindow* PanelManager::GetNextBrowserWindowToActivate( |
@@ -584,70 +178,35 @@ BrowserWindow* PanelManager::GetNextBrowserWindowToActivate( |
return NULL; |
} |
-void PanelManager::MoveToPanelStrip(Panel* panel) { |
- // TODO(jennb) - implement. |
-} |
- |
void PanelManager::MoveToOverflowStrip(Panel* panel, bool is_new) { |
// TODO(jianli) - implement. |
} |
-void PanelManager::OnMouseMove(const gfx::Point& mouse_position) { |
- bool bring_up_titlebars = ShouldBringUpTitlebars(mouse_position.x(), |
- mouse_position.y()); |
- BringUpOrDownTitlebars(bring_up_titlebars); |
-} |
- |
void PanelManager::OnAutoHidingDesktopBarThicknessChanged() { |
AdjustWorkAreaForAutoHidingDesktopBars(); |
- Rearrange(panels_.begin(), StartingRightPosition()); |
+ Layout(); |
} |
void PanelManager::OnAutoHidingDesktopBarVisibilityChanged( |
AutoHidingDesktopBar::Alignment alignment, |
AutoHidingDesktopBar::Visibility visibility) { |
- if (delayed_titlebar_action_ == NO_ACTION) |
- return; |
- |
- AutoHidingDesktopBar::Visibility expected_visibility = |
- delayed_titlebar_action_ == BRING_UP ? AutoHidingDesktopBar::VISIBLE |
- : AutoHidingDesktopBar::HIDDEN; |
- if (visibility != expected_visibility) |
- return; |
- |
- DoBringUpOrDownTitlebars(delayed_titlebar_action_ == BRING_UP); |
- delayed_titlebar_action_ = NO_ACTION; |
-} |
- |
-void PanelManager::Rearrange(Panels::iterator iter_to_start, |
- int rightmost_position) { |
- for (Panels::iterator iter = iter_to_start; iter != panels_.end(); ++iter) { |
- Panel* panel = *iter; |
- gfx::Rect new_bounds(panel->GetBounds()); |
- new_bounds.set_x(rightmost_position - new_bounds.width()); |
- new_bounds.set_y( |
- GetBottomPositionForExpansionState(panel->expansion_state()) - |
- new_bounds.height()); |
- if (new_bounds != panel->GetBounds()) |
- panel->SetPanelBounds(new_bounds); |
- |
- rightmost_position = new_bounds.x() - kPanelsHorizontalSpacing; |
- } |
+ panel_strip_->OnAutoHidingDesktopBarVisibilityChanged(alignment, visibility); |
} |
void PanelManager::RemoveAll() { |
- // This should not be called when we're in the process of dragging. |
- DCHECK(dragging_panel_index_ == kInvalidPanelIndex); |
- |
- // Make a copy of the iterator as closing panels can modify the vector. |
- Panels panels_copy = panels_; |
+ panel_strip_->RemoveAll(); |
+ // TODO(jianli): overflow_strip_->RemoveAll(); |
+} |
- // Start from the bottom to avoid reshuffling. |
- for (Panels::reverse_iterator iter = panels_copy.rbegin(); |
- iter != panels_copy.rend(); ++iter) |
- (*iter)->Close(); |
+int PanelManager::num_panels() const { |
+ return panel_strip_->num_panels(); |
+ // TODO(jianli): + overflow_strip_->num_panels(); |
} |
bool PanelManager::is_dragging_panel() const { |
- return dragging_panel_index_ != kInvalidPanelIndex; |
+ return panel_strip_->is_dragging_panel(); |
+} |
+ |
+const PanelManager::Panels& PanelManager::panels() const { |
+ return panel_strip_->panels(); |
} |