blob: f94904e127646efa34f7f68153aec350307a2db3 [file]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/devtools/devtools_contents_resizing_strategy.h"
#include <algorithm>
#include "ui/gfx/geometry/rect.h"
using devtools::DockSide;
DevToolsContentsResizingStrategy::DevToolsContentsResizingStrategy()
: hide_inspected_contents_(false) {}
DevToolsContentsResizingStrategy::DevToolsContentsResizingStrategy(
DockSide dock_side,
const gfx::Rect& bounds)
: dock_side_(dock_side),
bounds_(bounds),
hide_inspected_contents_(bounds_.IsEmpty() && !bounds_.x() &&
!bounds_.y()) {}
void DevToolsContentsResizingStrategy::CopyFrom(
const DevToolsContentsResizingStrategy& strategy) {
dock_side_ = strategy.dock_side();
bounds_ = strategy.bounds();
hide_inspected_contents_ = strategy.hide_inspected_contents();
}
bool DevToolsContentsResizingStrategy::Equals(
const DevToolsContentsResizingStrategy& strategy) {
return dock_side_ == strategy.dock_side() && bounds_ == strategy.bounds() &&
hide_inspected_contents_ == strategy.hide_inspected_contents();
}
void ApplyDevToolsContentsResizingStrategy(
const DevToolsContentsResizingStrategy& strategy,
const gfx::Rect& container_bounds,
gfx::Rect* new_devtools_bounds,
gfx::Rect* new_contents_bounds) {
new_devtools_bounds->SetRect(container_bounds.x(), container_bounds.y(),
container_bounds.width(),
container_bounds.height());
const gfx::Rect& bounds = strategy.bounds();
if (bounds.size().IsEmpty() && !strategy.hide_inspected_contents()) {
new_contents_bounds->SetRect(container_bounds.x(), container_bounds.y(),
container_bounds.width(),
container_bounds.height());
return;
}
const int container_width = container_bounds.width();
const int container_height = container_bounds.height();
int left = std::min(bounds.x(), container_width);
int top = std::min(bounds.y(), container_height);
int width = std::min(bounds.width(), container_width);
int height = std::min(bounds.height(), container_height);
// Ensure DevTools gets at least minimum space when container bounds shrink.
constexpr int kMinDevToolsWidth = 250;
constexpr int kMinDevToolsHeight = 72;
switch (strategy.dock_side()) {
case DockSide::kRight: {
const int max_contents_width =
std::max(0, container_width - kMinDevToolsWidth);
width = std::min(width, max_contents_width);
break;
}
case DockSide::kBottom: {
const int max_contents_height =
std::max(0, container_height - kMinDevToolsHeight);
height = std::min(height, max_contents_height);
break;
}
case DockSide::kLeft:
case DockSide::kNone:
break;
}
new_contents_bounds->SetRect(left + container_bounds.x(),
top + container_bounds.y(), width, height);
}