| Index: chrome/browser/views/tabs/dragged_tab_controller.cc
|
| ===================================================================
|
| --- chrome/browser/views/tabs/dragged_tab_controller.cc (revision 11336)
|
| +++ chrome/browser/views/tabs/dragged_tab_controller.cc (working copy)
|
| @@ -19,146 +19,111 @@
|
| #include "chrome/common/animation.h"
|
| #include "chrome/common/gfx/chrome_canvas.h"
|
| #include "chrome/common/notification_service.h"
|
| +#include "chrome/common/resource_bundle.h"
|
| #include "chrome/views/event.h"
|
| #include "chrome/views/root_view.h"
|
| +#include "grit/theme_resources.h"
|
| #include "skia/include/SkBitmap.h"
|
|
|
| static const int kHorizontalMoveThreshold = 16; // pixels
|
|
|
| namespace {
|
|
|
| -// Horizontal width of DockView. The height is 3/4 of this. If you change this,
|
| -// be sure and update the constants in DockInfo (kEnableDeltaX/kEnableDeltaY).
|
| -const int kDropWindowSize = 100;
|
| -
|
| // Delay, in ms, during dragging before we bring a window to front.
|
| const int kBringToFrontDelay = 750;
|
|
|
| -// TODO (glen): nuke this class in favor of something pretty. Consider this
|
| -// class a placeholder for the real thing.
|
| +// Radius of the rect drawn by DockView.
|
| +const int kRoundedRectRadius = 4;
|
| +
|
| +// Spacing between tab icons when DockView is showing a docking location that
|
| +// contains more than one tab.
|
| +const int kTabSpacing = 4;
|
| +
|
| +// DockView is the view responsible for giving a visual indicator of where a
|
| +// dock is going to occur.
|
| +
|
| class DockView : public views::View {
|
| public:
|
| - explicit DockView(DockInfo::Type type)
|
| - : size_(kDropWindowSize),
|
| - rect_radius_(4),
|
| - stroke_size_(4),
|
| - inner_stroke_size_(2),
|
| - inner_margin_(8),
|
| - inner_padding_(8),
|
| - type_(type) {}
|
| + explicit DockView(DockInfo::Type type) : type_(type) {}
|
|
|
| virtual gfx::Size GetPreferredSize() {
|
| - return gfx::Size(size_, size_);
|
| + return gfx::Size(DockInfo::popup_width(), DockInfo::popup_height());
|
| }
|
|
|
| virtual void PaintBackground(ChromeCanvas* canvas) {
|
| - int h = size_ * 3 / 4;
|
| - int outer_x = (width() - size_) / 2;
|
| - int outer_y = (height() - h) / 2;
|
| - switch (type_) {
|
| - case DockInfo::MAXIMIZE:
|
| - outer_y = 0;
|
| - break;
|
| - case DockInfo::LEFT_HALF:
|
| - outer_x = 0;
|
| - break;
|
| - case DockInfo::RIGHT_HALF:
|
| - outer_x = width() - size_;
|
| - break;
|
| - case DockInfo::BOTTOM_HALF:
|
| - outer_y = height() - h;
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| + SkRect outer_rect = { SkIntToScalar(0), SkIntToScalar(0),
|
| + SkIntToScalar(width()),
|
| + SkIntToScalar(height()) };
|
|
|
| - SkRect outer_rect = { SkIntToScalar(outer_x),
|
| - SkIntToScalar(outer_y),
|
| - SkIntToScalar(outer_x + size_),
|
| - SkIntToScalar(outer_y + h) };
|
| -
|
| // Fill the background rect.
|
| SkPaint paint;
|
| - paint.setColor(SkColorSetRGB(58, 58, 58));
|
| + paint.setColor(SkColorSetRGB(108, 108, 108));
|
| paint.setStyle(SkPaint::kFill_Style);
|
| - canvas->drawRoundRect(outer_rect, SkIntToScalar(rect_radius_),
|
| - SkIntToScalar(rect_radius_), paint);
|
| + canvas->drawRoundRect(outer_rect, SkIntToScalar(kRoundedRectRadius),
|
| + SkIntToScalar(kRoundedRectRadius), paint);
|
|
|
| - // Outline the background rect.
|
| - paint.setFlags(SkPaint::kAntiAlias_Flag);
|
| - paint.setStrokeWidth(SkIntToScalar(stroke_size_));
|
| - paint.setColor(SK_ColorBLACK);
|
| - paint.setStyle(SkPaint::kStroke_Style);
|
| - canvas->drawRoundRect(outer_rect, SkIntToScalar(rect_radius_),
|
| - SkIntToScalar(rect_radius_), paint);
|
| + ResourceBundle& rb = ResourceBundle::GetSharedInstance();
|
|
|
| - // Then the inner rect.
|
| - int inner_x = outer_x + inner_margin_;
|
| - int inner_y = outer_y + inner_margin_;
|
| - int inner_width =
|
| - (size_ - inner_margin_ - inner_margin_ - inner_padding_) / 2;
|
| - int inner_height = (h - inner_margin_ - inner_margin_);
|
| + SkBitmap* high_icon = rb.GetBitmapNamed(IDR_DOCK_HIGH);
|
| + SkBitmap* wide_icon = rb.GetBitmapNamed(IDR_DOCK_WIDE);
|
| +
|
| switch (type_) {
|
| case DockInfo::LEFT_OF_WINDOW:
|
| - case DockInfo::RIGHT_OF_WINDOW:
|
| - DrawWindow(canvas, inner_x, inner_y, inner_width, inner_height);
|
| - DrawWindow(canvas, inner_x + inner_width + inner_padding_, inner_y,
|
| - inner_width, inner_height);
|
| + case DockInfo::LEFT_HALF:
|
| + canvas->DrawBitmapInt(*high_icon,
|
| + width() / 2 - high_icon->width() - kTabSpacing / 2,
|
| + (height() - high_icon->height()) / 2);
|
| + if (type_ == DockInfo::LEFT_OF_WINDOW) {
|
| + DrawBitmapWithAlpha(canvas, *high_icon, width() / 2 + kTabSpacing / 2,
|
| + (height() - high_icon->height()) / 2);
|
| + }
|
| break;
|
|
|
| - case DockInfo::TOP_OF_WINDOW:
|
| - case DockInfo::BOTTOM_OF_WINDOW:
|
| - inner_height =
|
| - (h - inner_margin_ - inner_margin_ - inner_padding_) / 2;
|
| - inner_width += inner_width + inner_padding_;
|
| - DrawWindow(canvas, inner_x, inner_y, inner_width, inner_height);
|
| - DrawWindow(canvas, inner_x, inner_y + inner_height + inner_padding_,
|
| - inner_width, inner_height);
|
| - break;
|
|
|
| - case DockInfo::MAXIMIZE:
|
| - inner_width += inner_width + inner_padding_;
|
| - DrawWindow(canvas, inner_x, inner_y, inner_width, inner_height);
|
| + case DockInfo::RIGHT_OF_WINDOW:
|
| + case DockInfo::RIGHT_HALF:
|
| + canvas->DrawBitmapInt(*high_icon, width() / 2 + kTabSpacing / 2,
|
| + (height() - high_icon->height()) / 2);
|
| + if (type_ == DockInfo::RIGHT_OF_WINDOW) {
|
| + DrawBitmapWithAlpha(canvas, *high_icon,
|
| + width() / 2 - high_icon->width() - kTabSpacing / 2,
|
| + (height() - high_icon->height()) / 2);
|
| + }
|
| break;
|
|
|
| - case DockInfo::LEFT_HALF:
|
| - DrawWindow(canvas, inner_x, inner_y, inner_width, inner_height);
|
| + case DockInfo::TOP_OF_WINDOW:
|
| + canvas->DrawBitmapInt(*wide_icon, (width() - wide_icon->width()) / 2,
|
| + height() / 2 - high_icon->height());
|
| break;
|
|
|
| - case DockInfo::RIGHT_HALF:
|
| - DrawWindow(canvas, inner_x + inner_width + inner_padding_, inner_y,
|
| - inner_width, inner_height);
|
| + case DockInfo::MAXIMIZE: {
|
| + SkBitmap* max_icon = rb.GetBitmapNamed(IDR_DOCK_MAX);
|
| + canvas->DrawBitmapInt(*max_icon, (width() - max_icon->width()) / 2,
|
| + (height() - max_icon->height()) / 2);
|
| break;
|
| + }
|
|
|
| case DockInfo::BOTTOM_HALF:
|
| - inner_height =
|
| - (h - inner_margin_ - inner_margin_ - inner_padding_) / 2;
|
| - inner_width += inner_width + inner_padding_;
|
| - DrawWindow(canvas, inner_x, inner_y + inner_height + inner_padding_,
|
| - inner_width, inner_height);
|
| + case DockInfo::BOTTOM_OF_WINDOW:
|
| + canvas->DrawBitmapInt(*wide_icon, (width() - wide_icon->width()) / 2,
|
| + height() / 2 + kTabSpacing / 2);
|
| + if (type_ == DockInfo::BOTTOM_OF_WINDOW) {
|
| + DrawBitmapWithAlpha(canvas, *wide_icon,
|
| + (width() - wide_icon->width()) / 2,
|
| + height() / 2 - kTabSpacing / 2 - wide_icon->height());
|
| + }
|
| break;
|
| }
|
| }
|
|
|
| private:
|
| - void DrawWindow(ChromeCanvas* canvas, int x, int y, int w, int h) {
|
| - canvas->FillRectInt(SkColorSetRGB(160, 160, 160), x, y, w, h);
|
| -
|
| + void DrawBitmapWithAlpha(ChromeCanvas* canvas, const SkBitmap& image,
|
| + int x, int y) {
|
| SkPaint paint;
|
| - paint.setStrokeWidth(SkIntToScalar(inner_stroke_size_));
|
| - paint.setColor(SK_ColorWHITE);
|
| - paint.setStyle(SkPaint::kStroke_Style);
|
| - SkRect rect = { SkIntToScalar(x), SkIntToScalar(y), SkIntToScalar(x + w),
|
| - SkIntToScalar(y + h) };
|
| - canvas->drawRect(rect, paint);
|
| + paint.setAlpha(128);
|
| + canvas->DrawBitmapInt(image, x, y, paint);
|
| }
|
|
|
| - int size_;
|
| - int rect_radius_;
|
| - int stroke_size_;
|
| - int inner_stroke_size_;
|
| - int inner_margin_;
|
| - int inner_padding_;
|
| DockInfo::Type type_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(DockView);
|
| @@ -189,40 +154,20 @@
|
| popup_(NULL),
|
| popup_hwnd_(NULL),
|
| #pragma warning(suppress: 4355) // Okay to pass "this" here.
|
| - hot_animation_(this),
|
| - enable_animation_(this),
|
| + animation_(this),
|
| hidden_(false),
|
| in_enable_area_(info.in_enable_area()) {
|
| - gfx::Rect bounds(info.hot_spot().x() - kDropWindowSize / 2,
|
| - info.hot_spot().y() - kDropWindowSize / 2,
|
| - kDropWindowSize, kDropWindowSize);
|
| - switch (info.type()) {
|
| - case DockInfo::MAXIMIZE:
|
| - bounds.Offset(0, kDropWindowSize / 2);
|
| - break;
|
| - case DockInfo::LEFT_HALF:
|
| - bounds.Offset(kDropWindowSize / 2, 0);
|
| - break;
|
| - case DockInfo::RIGHT_HALF:
|
| - bounds.Offset(-kDropWindowSize / 2, 0);
|
| - break;
|
| - case DockInfo::BOTTOM_HALF:
|
| - bounds.Offset(0, -kDropWindowSize / 2);
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| -
|
| popup_ = new views::WidgetWin;
|
| popup_->set_window_style(WS_POPUP);
|
| popup_->set_window_ex_style(WS_EX_LAYERED | WS_EX_TOOLWINDOW |
|
| WS_EX_TOPMOST);
|
| popup_->SetLayeredAlpha(0x00);
|
| - popup_->Init(NULL, bounds, false);
|
| + popup_->Init(NULL, info.GetPopupRect(), false);
|
| popup_->SetContentsView(new DockView(info.type()));
|
| - hot_animation_.Show();
|
| if (info.in_enable_area())
|
| - enable_animation_.Show();
|
| + animation_.Reset(1);
|
| + else
|
| + animation_.Show();
|
| popup_->SetWindowPos(HWND_TOP, 0, 0, 0, 0,
|
| SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOMOVE | SWP_SHOWWINDOW);
|
| popup_hwnd_ = popup_->GetHWND();
|
| @@ -237,10 +182,7 @@
|
| void UpdateInEnabledArea(bool in_enable_area) {
|
| if (in_enable_area != in_enable_area_) {
|
| in_enable_area_ = in_enable_area;
|
| - if (!in_enable_area_)
|
| - enable_animation_.Hide();
|
| - else
|
| - enable_animation_.Show();
|
| + UpdateLayeredAlpha();
|
| }
|
| }
|
|
|
| @@ -263,15 +205,11 @@
|
| return;
|
| }
|
| hidden_ = true;
|
| - enable_animation_.Hide();
|
| - hot_animation_.Hide();
|
| + animation_.Hide();
|
| }
|
|
|
| virtual void AnimationProgressed(const Animation* animation) {
|
| - popup_->SetLayeredAlpha(
|
| - static_cast<BYTE>((hot_animation_.GetCurrentValue() +
|
| - enable_animation_.GetCurrentValue()) / 2 * 255.0));
|
| - popup_->GetRootView()->SchedulePaint();
|
| + UpdateLayeredAlpha();
|
| }
|
|
|
| virtual void AnimationEnded(const Animation* animation) {
|
| @@ -279,9 +217,15 @@
|
| return;
|
| popup_->Close();
|
| delete this;
|
| - return;
|
| }
|
|
|
| + virtual void UpdateLayeredAlpha() {
|
| + double scale = in_enable_area_ ? 1 : .5;
|
| + popup_->SetLayeredAlpha(
|
| + static_cast<BYTE>(animation_.GetCurrentValue() * scale * 255.0));
|
| + popup_->GetRootView()->SchedulePaint();
|
| + }
|
| +
|
| private:
|
| // DraggedTabController that created us.
|
| DraggedTabController* controller_;
|
| @@ -293,12 +237,9 @@
|
| // method on popup_ after we close it.
|
| HWND popup_hwnd_;
|
|
|
| - // Animation corresponding to !DockInfo::in_enable_area.
|
| - SlideAnimation hot_animation_;
|
| + // Animation for when first made visible.
|
| + SlideAnimation animation_;
|
|
|
| - // Animation corresponding to DockInfo::in_enable_area.
|
| - SlideAnimation enable_animation_;
|
| -
|
| // Have we been hidden?
|
| bool hidden_;
|
|
|
| @@ -560,7 +501,6 @@
|
| }
|
| }
|
|
|
| -
|
| void DraggedTabController::ChangeDraggedContents(TabContents* new_contents) {
|
| if (dragged_contents_) {
|
| NotificationService::current()->RemoveObserver(
|
|
|