Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(46)

Unified Diff: chrome/browser/ui/panels/panel_strip.cc

Issue 8776035: Add PanelOverflowStrip to handle panel overflow. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/panels/panel_strip.cc
diff --git a/chrome/browser/ui/panels/panel_strip.cc b/chrome/browser/ui/panels/panel_strip.cc
index e94c1575008af4e0f8e288867aa06034d3b191f1..f855d7f2c31213fe6239daea10a3369a5839e58b 100644
--- a/chrome/browser/ui/panels/panel_strip.cc
+++ b/chrome/browser/ui/panels/panel_strip.cc
@@ -12,6 +12,7 @@
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/panels/panel_manager.h"
#include "chrome/browser/ui/panels/panel_mouse_watcher.h"
+#include "chrome/browser/ui/panels/panel_overflow_strip.h"
#include "chrome/common/chrome_notification_types.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_source.h"
@@ -73,13 +74,10 @@ void PanelStrip::SetDisplayArea(const gfx::Rect& new_area) {
gfx::Rect old_area = display_area_;
display_area_ = new_area;
- if (panels_.empty() || new_area.width() == old_area.width())
+ if (panels_.empty())
return;
- if (new_area.width() < old_area.width())
- Rearrange();
- else
- MovePanelsFromOverflowIfNeeded();
+ Rearrange();
}
void PanelStrip::AddPanel(Panel* panel) {
@@ -132,6 +130,9 @@ void PanelStrip::AddPanel(Panel* panel) {
// Keep panel visible in the strip even if overlap would occur.
// Panel is moved to overflow from the strip after a delay.
+ // TODO(jianli): remove the guard when overflow support is enabled on other
+ // platforms. http://crbug.com/105073
+#if defined(OS_WIN)
if (x < display_area_.x()) {
x = display_area_.x();
int delay_ms = remove_delays_for_testing_ ? 0 :
@@ -144,6 +145,7 @@ void PanelStrip::AddPanel(Panel* panel) {
true), // new panel
delay_ms);
}
+#endif
panel->Initialize(gfx::Rect(x, y, width, height));
}
@@ -334,20 +336,36 @@ void PanelStrip::EndDragging(bool cancelled) {
}
void PanelStrip::OnPanelExpansionStateChanged(
- Panel::ExpansionState old_state, Panel::ExpansionState new_state) {
- DCHECK_NE(new_state, old_state);
- switch (new_state) {
+ Panel* panel, Panel::ExpansionState old_state) {
+ gfx::Size size = panel->restored_size();
+ Panel::ExpansionState expansion_state = panel->expansion_state();
+ switch (expansion_state) {
case Panel::EXPANDED:
- DecrementMinimizedPanels();
+ if (old_state == Panel::TITLE_ONLY || old_state == Panel::MINIMIZED)
+ DecrementMinimizedPanels();
break;
- case Panel::MINIMIZED:
case Panel::TITLE_ONLY:
+ size.set_height(panel->TitleOnlyHeight());
+ if (old_state == Panel::EXPANDED)
+ IncrementMinimizedPanels();
+ break;
+ case Panel::MINIMIZED:
+ size.set_height(Panel::kMinimizedPanelHeight);
if (old_state == Panel::EXPANDED)
IncrementMinimizedPanels();
break;
default:
+ NOTREACHED();
break;
}
+
+ int bottom = GetBottomPositionForExpansionState(expansion_state);
+ gfx::Rect bounds = panel->GetBounds();
+ panel->SetPanelBounds(
+ gfx::Rect(bounds.right() - size.width(),
+ bottom - size.height(),
+ size.width(),
+ size.height()));
}
void PanelStrip::IncrementMinimizedPanels() {
@@ -573,10 +591,14 @@ void PanelStrip::Rearrange() {
gfx::Rect new_bounds(panel->GetBounds());
int x = rightmost_position - new_bounds.width();
+ // TODO(jianli): remove the guard when overflow support is enabled on other
+ // platforms. http://crbug.com/105073
+#if defined(OS_WIN)
if (x < display_area_.x()) {
MovePanelsToOverflow(panel_index);
break;
}
+#endif
new_bounds.set_x(rightmost_position - new_bounds.width());
new_bounds.set_y(
@@ -587,8 +609,12 @@ void PanelStrip::Rearrange() {
rightmost_position = new_bounds.x() - kPanelsHorizontalSpacing;
}
+ // TODO(jianli): remove the guard when overflow support is enabled on other
+ // platforms. http://crbug.com/105073
+#if defined(OS_WIN)
if (panel_index == panels_.size())
MovePanelsFromOverflowIfNeeded();
+#endif
}
void PanelStrip::MovePanelsToOverflow(size_t overflow_point) {
@@ -602,20 +628,18 @@ void PanelStrip::MovePanelToOverflow(Panel* panel, bool is_new) {
if (!DoRemove(panel))
return;
- // TODO(jianli): Replace with the real code using overflow strip.
- // panel_manager_->panel_overflow_strip()->AddPanel(panel, is_new);
+ panel_manager_->panel_overflow_strip()->AddPanel(panel, is_new);
}
void PanelStrip::MovePanelsFromOverflowIfNeeded() {
- // TODO(jianli): Replace with the real code using overflow strip.
- // PanelOverflowStrip* overflow = panel_manager_->panel_overflow_strip();
- // Panel* candidate;
- // while (candidate = overflow->FirstPanel() &&
- // GetRightMostAvailablePosition -
- // candidate->GetRestoredSize().width() >= display_area_.x()) {
- // overflow->Remove(candidate);
- // AddPanel(candidate);
- // }
+ PanelOverflowStrip* overflow_strip = panel_manager_->panel_overflow_strip();
+ Panel* overflow_panel;
+ while ((overflow_panel = overflow_strip->first_panel()) &&
+ GetRightMostAvailablePosition() -
+ overflow_panel->restored_size().width() >= display_area_.x()) {
+ overflow_strip->Remove(overflow_panel);
+ AddPanel(overflow_panel);
+ }
}
void PanelStrip::RemoveAll() {

Powered by Google App Engine
This is Rietveld 408576698