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

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 94932)
+++ chrome/browser/ui/panels/panel_manager.cc (working copy)
@@ -16,8 +16,9 @@
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.
Dmitry Titov 2011/08/05 19:02:20 We do have notifications today with smaller sizes,
jianli 2011/08/09 19:56:16 Done.
+const int kPanelMinWidthPixels = 100;
+const int kPanelMinHeightPixels = 100;
// Default width and height of a panel.
const int kPanelDefaultWidthPixels = 240;
@@ -110,6 +111,7 @@
Panel* panel = new Panel(browser, bounds);
panels_.push_back(panel);
+ UpdateMaximumSizeForAllPanels();
return panel;
}
@@ -271,6 +273,69 @@
DelayedRemove();
}
+void PanelManager::UpdatePreferredSize(Panel* panel,
+ const gfx::Size& pref_size) {
+ gfx::Size non_client_size = panel->GetNonClientAreaSize();
+
+ // We need to get and set the restored bounds since the preferred size change
+ // might be triggered when the panel is not expanded.
+ gfx::Rect bounds = panel->GetRestoredBounds();
+
+ // The panel width:
+ // * cannot grow more than the maximum width
+ // * cannot grow to take more than the available horizontal space
Dmitry Titov 2011/08/05 19:02:20 what is exactly 'available horizontal space'? Not
jianli 2011/08/09 19:56:16 Updated comment.
+ // * cannot shrink to be smaller than the initial width
+ int new_panel_width = pref_size.width() + non_client_size.width();
+ if (new_panel_width > max_width_)
+ new_panel_width = max_width_;
+ if (new_panel_width - bounds.width() > current_x_)
+ new_panel_width = bounds.width() + current_x_;
+
+ if (new_panel_width > bounds.width() ||
+ (new_panel_width < bounds.width() &&
+ new_panel_width > panel->initial_size_.width())) {
+ int delta = bounds.width() - new_panel_width;
+ bounds.set_x(bounds.x() + delta);
+ bounds.set_width(new_panel_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 more than the maximum height
+ // * cannot shrink to be smaller than the initial height
+ int new_panel_height = pref_size.height() + non_client_size.height();
+ if (new_panel_height > max_height_)
+ new_panel_height = max_height_;
+
+ if (new_panel_height > bounds.height() ||
+ (new_panel_height < bounds.height() &&
+ new_panel_height > panel->initial_size_.height())) {
+ bounds.set_y(bounds.y() - new_panel_height + bounds.height());
+ bounds.set_height(new_panel_height);
+ }
+
+ panel->SetRestoredBounds(bounds);
+ current_x_ =
+ panels_.back()->GetBounds().x() - kPanelsHorizontalSpacing;
+
+ UpdateMaximumSizeForAllPanels();
+}
+
bool PanelManager::ShouldBringUpTitleBarForAllMinimizedPanels(
int mouse_x, int mouse_y) const {
for (Panels::const_iterator iter = panels_.begin();
@@ -310,6 +375,8 @@
if (new_bounds != (*iter)->GetBounds())
(*iter)->SetPanelBounds(new_bounds);
}
+
+ UpdateMaximumSizeForAllPanels();
}
bool PanelManager::ComputeBoundsForNextPanel(gfx::Rect* bounds,
@@ -356,3 +423,13 @@
iter != panels_.rend(); ++iter)
(*iter)->Close();
}
+
+void PanelManager::UpdateMaximumSizeForAllPanels() {
+ for (Panels::const_iterator iter = panels_.begin();
+ iter != panels_.end(); ++iter) {
+ Panel* panel = *iter;
+ int width_can_grow_to = panel->GetBounds().width() + current_x_;
Dmitry Titov 2011/08/05 19:02:20 It is a bit unclear why we give the same area of t
jianli 2011/08/09 19:56:16 Added comment.
+ panel->SetMaximumSize(
+ gfx::Size(std::min(width_can_grow_to, max_width_), max_height_));
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698