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

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

Issue 7537030: Make panel adjust bounds per preferred size change notification on Windows. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 4 months 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_manager.cc
===================================================================
--- chrome/browser/ui/panels/panel_manager.cc (revision 98900)
+++ chrome/browser/ui/panels/panel_manager.cc (working copy)
@@ -17,8 +17,10 @@
const size_t kInvalidPanelIndex = static_cast<size_t>(-1);
// Minimum width and height of a panel.
-const int kPanelMinWidthPixels = 64;
-const int kPanelMinHeightPixels = 24;
+// Note: The minimum size of a widget (see widget.cc) is fixed to 100x100.
+// TODO(jianli): Need to fix this to support smaller panel.
+const int kPanelMinWidthPixels = 100;
+const int kPanelMinHeightPixels = 100;
// Default width and height of a panel.
const int kPanelDefaultWidthPixels = 240;
@@ -50,7 +52,8 @@
: dragging_panel_index_(kInvalidPanelIndex),
dragging_panel_original_x_(0),
delayed_titlebar_action_(NO_ACTION),
- ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {
+ ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)),
+ auto_sizing_enabled_(true) {
auto_hiding_desktop_bar_ = AutoHidingDesktopBar::Create(this);
OnDisplayChanged();
}
@@ -107,10 +110,8 @@
height = kPanelDefaultHeightPixels;
}
- int max_panel_width =
- static_cast<int>(adjusted_work_area_.width() * kPanelMaxWidthFactor);
- int max_panel_height =
- static_cast<int>(adjusted_work_area_.height() * kPanelMaxHeightFactor);
+ int max_panel_width = GetMaxPanelWidth();
+ int max_panel_height = GetMaxPanelHeight();
if (width < kPanelMinWidthPixels)
width = kPanelMinWidthPixels;
@@ -139,9 +140,19 @@
Panel* panel = new Panel(browser, gfx::Rect(x, y, width, height));
panels_.push_back(panel);
+ UpdateMaxSizeForAllPanels();
+
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::GetRightMostAvaialblePosition() const {
return panels_.empty() ? adjusted_work_area_.right() :
(panels_.back()->GetBounds().x() - kPanelsHorizontalSpacing);
@@ -303,6 +314,74 @@
DelayedRemove();
}
+void PanelManager::OnPreferredWindowSizeChanged(
+ Panel* panel, const gfx::Size& preferred_window_size) {
+ if (!auto_sizing_enabled_)
+ return;
+
+ gfx::Rect bounds = panel->GetBounds();
+ int restored_height = panel->GetRestoredHeight();
+
+ // The panel width:
+ // * cannot grow or shrink to go beyond [min_width, max_width]
+ // * cannot grow to take more than the available space and go beyond the left
+ // of the work area.
+ 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();
+
+ int right_most_available_position = GetRightMostAvaialblePosition();
+ if (new_width - bounds.width() > right_most_available_position)
+ new_width = bounds.width() + right_most_available_position;
+
+ 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();
+
+ if (new_height != restored_height) {
+ // If the panel is not expanded, we only need to save the new restored
+ // height.
+ if (panel->expansion_state() == Panel::EXPANDED) {
+ bounds.set_y(bounds.y() - new_height + bounds.height());
+ bounds.set_height(new_height);
+ } else {
+ panel->SetRestoredHeight(new_height);
+ }
+ }
+
+ panel->SetPanelBounds(bounds);
+
+ UpdateMaxSizeForAllPanels();
+}
+
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.
@@ -410,6 +489,7 @@
bottom += auto_hiding_desktop_bar_->GetThickness(
AutoHidingDesktopBar::ALIGN_BOTTOM);
}
+
return bottom;
}
@@ -450,6 +530,8 @@
rightmost_position = new_bounds.x() - kPanelsHorizontalSpacing;
}
+
+ UpdateMaxSizeForAllPanels();
}
void PanelManager::RemoveAll() {
@@ -468,3 +550,20 @@
bool PanelManager::is_dragging_panel() const {
return dragging_panel_index_ != kInvalidPanelIndex;
}
+
+void PanelManager::UpdateMaxSizeForAllPanels() {
+ if (!auto_sizing_enabled_)
+ return;
+
+ for (Panels::const_iterator iter = panels_.begin();
+ iter != panels_.end(); ++iter) {
+ Panel* panel = *iter;
+ // A panel can at most grow to take over all the avaialble space that is
+ // returned by GetRightMostAvaialblePosition.
+ int width_can_grow_to =
+ panel->GetBounds().width() + GetRightMostAvaialblePosition();
+ panel->SetMaxSize(gfx::Size(
+ std::min(width_can_grow_to, GetMaxPanelWidth()),
+ GetMaxPanelHeight()));
+ }
+}
« no previous file with comments | « chrome/browser/ui/panels/panel_manager.h ('k') | chrome/browser/ui/views/tab_contents/tab_contents_view_touch.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698