OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/views/tabs/tab_strip.h" | 5 #include "chrome/browser/views/tabs/tab_strip.h" |
6 | 6 |
7 #include "app/animation_container.h" | 7 #include "app/animation_container.h" |
8 #include "app/drag_drop_types.h" | 8 #include "app/drag_drop_types.h" |
9 #include "app/l10n_util.h" | 9 #include "app/l10n_util.h" |
10 #include "app/resource_bundle.h" | 10 #include "app/resource_bundle.h" |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 // until the user can actually see the tab. | 62 // until the user can actually see the tab. |
63 static const int kNetTabSelectedOffset = -13; | 63 static const int kNetTabSelectedOffset = -13; |
64 | 64 |
65 static const int kNewTabButtonHOffset = -5; | 65 static const int kNewTabButtonHOffset = -5; |
66 static const int kNewTabButtonVOffset = 5; | 66 static const int kNewTabButtonVOffset = 5; |
67 static const int kResizeTabsTimeMs = 300; | 67 static const int kResizeTabsTimeMs = 300; |
68 static const int kSuspendAnimationsTimeMs = 200; | 68 static const int kSuspendAnimationsTimeMs = 200; |
69 static const int kTabHOffset = -16; | 69 static const int kTabHOffset = -16; |
70 static const int kTabStripAnimationVSlop = 40; | 70 static const int kTabStripAnimationVSlop = 40; |
71 | 71 |
72 // Alpha value phantom tabs are rendered at. | |
73 static const int kPhantomTabAlpha = 105; | |
74 | |
75 // Alpha value phantom tab icons are rendered at. | |
76 static const int kPhantomTabIconAlpha = 160; | |
77 | |
78 // Size of the drop indicator. | 72 // Size of the drop indicator. |
79 static int drop_indicator_width; | 73 static int drop_indicator_width; |
80 static int drop_indicator_height; | 74 static int drop_indicator_height; |
81 | 75 |
82 static inline int Round(double x) { | 76 static inline int Round(double x) { |
83 // Why oh why is this not in a standard header? | 77 // Why oh why is this not in a standard header? |
84 return static_cast<int>(floor(x + 0.5)); | 78 return static_cast<int>(floor(x + 0.5)); |
85 } | 79 } |
86 | 80 |
87 namespace { | 81 namespace { |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
323 // do this as during dragging there isn't a theme provider. | 317 // do this as during dragging there isn't a theme provider. |
324 tab->set_theme_provider(GetThemeProvider()); | 318 tab->set_theme_provider(GetThemeProvider()); |
325 return tab; | 319 return tab; |
326 } | 320 } |
327 | 321 |
328 /////////////////////////////////////////////////////////////////////////////// | 322 /////////////////////////////////////////////////////////////////////////////// |
329 // TabStrip, views::View overrides: | 323 // TabStrip, views::View overrides: |
330 | 324 |
331 void TabStrip::PaintChildren(gfx::Canvas* canvas) { | 325 void TabStrip::PaintChildren(gfx::Canvas* canvas) { |
332 // Tabs are painted in reverse order, so they stack to the left. | 326 // Tabs are painted in reverse order, so they stack to the left. |
333 // Phantom tabs appear behind all other tabs and are rendered first. To make | |
334 // them slightly transparent we render them to a different layer. | |
335 if (HasPhantomTabs()) { | |
336 SkRect bounds; | |
337 bounds.set(0, 0, SkIntToScalar(width()), SkIntToScalar(height())); | |
338 canvas->saveLayerAlpha(&bounds, kPhantomTabAlpha, | |
339 SkCanvas::kARGB_ClipLayer_SaveFlag); | |
340 canvas->drawARGB(0, 255, 255, 255, SkXfermode::kClear_Mode); | |
341 for (int i = tab_count() - 1; i >= 0; --i) { | |
342 Tab* tab = GetTabAtTabDataIndex(i); | |
343 if (tab->data().phantom) | |
344 tab->ProcessPaint(canvas); | |
345 } | |
346 canvas->restore(); | |
347 | |
348 canvas->saveLayerAlpha(&bounds, kPhantomTabIconAlpha, | |
349 SkCanvas::kARGB_ClipLayer_SaveFlag); | |
350 canvas->drawARGB(0, 255, 255, 255, SkXfermode::kClear_Mode); | |
351 for (int i = tab_count() - 1; i >= 0; --i) { | |
352 Tab* tab = GetTabAtTabDataIndex(i); | |
353 if (tab->data().phantom) { | |
354 canvas->save(); | |
355 canvas->ClipRectInt(tab->MirroredX(), tab->y(), tab->width(), | |
356 tab->height()); | |
357 canvas->TranslateInt(tab->MirroredX(), tab->y()); | |
358 tab->PaintIcon(canvas); | |
359 canvas->restore(); | |
360 } | |
361 } | |
362 canvas->restore(); | |
363 } | |
364 | |
365 Tab* selected_tab = NULL; | 327 Tab* selected_tab = NULL; |
366 | 328 |
367 Tab* dragging_tab = NULL; | 329 Tab* dragging_tab = NULL; |
368 | 330 |
369 int model_count = GetModelCount(); | 331 int model_count = GetModelCount(); |
370 | 332 |
371 for (int i = tab_count() - 1; i >= 0; --i) { | 333 for (int i = tab_count() - 1; i >= 0; --i) { |
372 Tab* tab = GetTabAtTabDataIndex(i); | 334 Tab* tab = GetTabAtTabDataIndex(i); |
373 // We must ask the _Tab's_ model, not ourselves, because in some situations | 335 // We must ask the _Tab's_ model, not ourselves, because in some situations |
374 // the model will be different to this object, e.g. when a Tab is being | 336 // the model will be different to this object, e.g. when a Tab is being |
375 // removed after its TabContents has been destroyed. | 337 // removed after its TabContents has been destroyed. |
376 if (!tab->data().phantom) { | 338 if (tab->dragging()) { |
377 if (tab->dragging()) { | 339 dragging_tab = tab; |
378 dragging_tab = tab; | 340 } else if (!tab->IsSelected()) { |
379 } else if (!tab->IsSelected()) { | 341 if (tab->render_unselected() && model_count > 1) { |
380 if (tab->render_unselected() && model_count > 1) { | 342 // See comment above kNetTabAnimationSelectedOffset as to why we do |
381 // See comment above kNetTabAnimationSelectedOffset as to why we do | 343 // this. |
382 // this. | 344 Tab* last_tab = GetTabAtModelIndex(model_count - 2); |
383 Tab* last_tab = GetTabAtModelIndex(model_count - 2); | 345 canvas->save(); |
384 canvas->save(); | 346 int clip_x = last_tab->bounds().right() + kNetTabSelectedOffset; |
385 int clip_x = last_tab->bounds().right() + kNetTabSelectedOffset; | 347 int clip_width = width() - clip_x; |
386 int clip_width = width() - clip_x; | 348 clip_x = MirroredXWithWidthInsideView(clip_x, clip_width); |
387 clip_x = MirroredXWithWidthInsideView(clip_x, clip_width); | 349 canvas->ClipRectInt(clip_x, 0, clip_width, height()); |
388 canvas->ClipRectInt(clip_x, 0, clip_width, height()); | 350 tab->ProcessPaint(canvas); |
389 tab->ProcessPaint(canvas); | 351 canvas->restore(); |
390 canvas->restore(); | |
391 } else { | |
392 tab->ProcessPaint(canvas); | |
393 } | |
394 } else { | 352 } else { |
395 selected_tab = tab; | 353 tab->ProcessPaint(canvas); |
396 } | 354 } |
| 355 } else { |
| 356 selected_tab = tab; |
397 } | 357 } |
398 } | 358 } |
399 | 359 |
400 if (GetWindow()->GetNonClientView()->UseNativeFrame()) { | 360 if (GetWindow()->GetNonClientView()->UseNativeFrame()) { |
401 // Make sure unselected tabs are somewhat transparent. | 361 // Make sure unselected tabs are somewhat transparent. |
402 SkPaint paint; | 362 SkPaint paint; |
403 paint.setColor(SkColorSetARGB(200, 255, 255, 255)); | 363 paint.setColor(SkColorSetARGB(200, 255, 255, 255)); |
404 paint.setXfermodeMode(SkXfermode::kDstIn_Mode); | 364 paint.setXfermodeMode(SkXfermode::kDstIn_Mode); |
405 paint.setStyle(SkPaint::kFill_Style); | 365 paint.setStyle(SkPaint::kFill_Style); |
406 canvas->FillRectInt( | 366 canvas->FillRectInt( |
(...skipping 949 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1356 &TabStrip::ResizeLayoutTabs), | 1316 &TabStrip::ResizeLayoutTabs), |
1357 kResizeTabsTimeMs); | 1317 kResizeTabsTimeMs); |
1358 } | 1318 } |
1359 } else { | 1319 } else { |
1360 // Mouse moved quickly out of the tab strip and then into it again, so | 1320 // Mouse moved quickly out of the tab strip and then into it again, so |
1361 // cancel the timer so that the strip doesn't move when the mouse moves | 1321 // cancel the timer so that the strip doesn't move when the mouse moves |
1362 // back over it. | 1322 // back over it. |
1363 resize_layout_factory_.RevokeAll(); | 1323 resize_layout_factory_.RevokeAll(); |
1364 } | 1324 } |
1365 } | 1325 } |
1366 | |
1367 bool TabStrip::HasPhantomTabs() const { | |
1368 for (int i = 0; i < tab_count(); ++i) { | |
1369 if (GetTabAtTabDataIndex(i)->data().phantom) | |
1370 return true; | |
1371 } | |
1372 return false; | |
1373 } | |
OLD | NEW |