Index: ash/system/bluetooth/tray_bluetooth.cc |
diff --git a/ash/system/bluetooth/tray_bluetooth.cc b/ash/system/bluetooth/tray_bluetooth.cc |
index 27a3ae836e2f4796919780b7827d0f53bc13c8d1..d79523871b3622f87d449f4fcf0fc7a4c8d07a39 100644 |
--- a/ash/system/bluetooth/tray_bluetooth.cc |
+++ b/ash/system/bluetooth/tray_bluetooth.cc |
@@ -6,6 +6,7 @@ |
#include "ash/session/session_state_delegate.h" |
#include "ash/shell.h" |
+#include "ash/system/tray/fixed_sized_image_view.h" |
#include "ash/system/tray/fixed_sized_scroll_view.h" |
#include "ash/system/tray/hover_highlight_view.h" |
#include "ash/system/tray/system_tray.h" |
@@ -24,11 +25,19 @@ |
#include "ui/views/controls/image_view.h" |
#include "ui/views/controls/label.h" |
#include "ui/views/layout/box_layout.h" |
+#include "ui/views/layout/fill_layout.h" |
namespace ash { |
namespace tray { |
namespace { |
+// Constants of special layout for bluetooth device entries. |
+const int kDeviceLabelLeftMargin = 7; |
+const int kDeviceTypeIconAreaWidth = 60; |
+const int kConnectedIconSize = 10; |
+const int kConnectedIconOffsetTop = 26; |
+const int kConnectedIconOffsetLeft = 33; |
+ |
// Updates bluetooth device |device| in the |list|. If it is new, append to the |
// end of the |list|; otherwise, keep it at the same place, but update the data |
// with new device info provided by |device|. |
@@ -60,6 +69,95 @@ void RemoveObsoleteBluetoothDevicesFromList( |
} |
} |
+// Returns a resource id of an icon which corresponds to the given device type. |
+int GetDeviceIconResourceId(ash::BluetoothDeviceInfo::DeviceType device_type) { |
+ switch (device_type) { |
+ case ash::BluetoothDeviceInfo::DEVICE_COMPUTER: |
+ return IDR_AURA_UBER_TRAY_BLUETOOTH_DEVICE_COMPUTER; |
+ case ash::BluetoothDeviceInfo::DEVICE_PHONE: |
+ return IDR_AURA_UBER_TRAY_BLUETOOTH_DEVICE_SMARTPHONE; |
+ case ash::BluetoothDeviceInfo::DEVICE_AUDIO: |
+ case ash::BluetoothDeviceInfo::DEVICE_CAR_AUDIO: |
+ return IDR_AURA_UBER_TRAY_BLUETOOTH_DEVICE_HEADSET; |
+ case ash::BluetoothDeviceInfo::DEVICE_VIDEO: |
+ return IDR_AURA_UBER_TRAY_BLUETOOTH_DEVICE_VIDEOCAM; |
+ case ash::BluetoothDeviceInfo::DEVICE_JOYSTICK: |
+ case ash::BluetoothDeviceInfo::DEVICE_GAMEPAD: |
+ return IDR_AURA_UBER_TRAY_BLUETOOTH_DEVICE_GAMEPAD; |
+ case ash::BluetoothDeviceInfo::DEVICE_KEYBOARD: |
+ case ash::BluetoothDeviceInfo::DEVICE_KEYBOARD_MOUSE_COMBO: |
+ return IDR_AURA_UBER_TRAY_BLUETOOTH_DEVICE_KEYBOARD; |
+ case ash::BluetoothDeviceInfo::DEVICE_TABLET: |
+ case ash::BluetoothDeviceInfo::DEVICE_MOUSE: |
+ return IDR_AURA_UBER_TRAY_BLUETOOTH_DEVICE_MOUSE; |
+ default: |
+ return IDR_AURA_UBER_TRAY_BLUETOOTH_DEVICE_BLUETOOTH; |
+ } |
+} |
+ |
+// Special layout for bluetooth device entries. |
+class BluetoothDeviceListEntry : public HoverHighlightView { |
+ public: |
+ BluetoothDeviceListEntry(ViewClickListener* listener, |
+ const gfx::ImageSkia& image, |
+ const base::string16& text, |
+ bool highlight, |
+ bool checked, |
+ bool enabled) |
+ : HoverHighlightView(listener), device_icon_(nullptr) { |
+ SetEnabled(enabled); |
+ |
+ AddDeviceTypeIcon(image); |
+ AddDeviceLabel(text, highlight); |
+ if (checked) |
+ AddCheckmarkOnDeviceIcon(); |
+ |
+ // Overwrites the layout mode which was set as FillLayout by AddLabel(). |
+ SetLayoutManager( |
+ new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0)); |
+ } |
+ |
+ private: |
+ views::ImageView* device_icon_; |
+ |
+ void AddDeviceTypeIcon(const gfx::ImageSkia& image) { |
+ device_icon_ = new FixedSizedImageView(kDeviceTypeIconAreaWidth, 0); |
+ device_icon_->SetImage(image); |
+ device_icon_->SetEnabled(enabled()); |
+ AddChildView(device_icon_); |
+ } |
+ |
+ void AddDeviceLabel(const base::string16& text, bool highlight) { |
+ AddLabel(text, gfx::ALIGN_LEFT, highlight); |
+ int left_margin = kDeviceLabelLeftMargin; |
+ int right_margin = kTrayPopupPaddingHorizontal; |
+ if (base::i18n::IsRTL()) |
+ std::swap(left_margin, right_margin); |
+ text_label()->SetBorder( |
+ views::Border::CreateEmptyBorder(5, left_margin, 5, right_margin)); |
+ } |
+ |
+ void AddCheckmarkOnDeviceIcon() { |
+ device_icon_->SetLayoutManager(new views::FillLayout()); |
+ ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
+ const gfx::ImageSkia* checkmark = |
+ rb.GetImageNamed(IDR_AURA_UBER_TRAY_BLUETOOTH_DEVICE_CONNECTED) |
+ .ToImageSkia(); |
+ views::ImageView* checkmark_view = |
+ new FixedSizedImageView(kConnectedIconSize, kConnectedIconSize); |
+ checkmark_view->SetImage(checkmark); |
+ checkmark_view->SetEnabled(enabled()); |
+ checkmark_view->SetHorizontalAlignment(views::ImageView::LEADING); |
+ checkmark_view->SetVerticalAlignment(views::ImageView::LEADING); |
+ checkmark_view->SetBorder(views::Border::CreateEmptyBorder( |
+ kConnectedIconOffsetTop, kConnectedIconOffsetLeft, 0, |
+ kDeviceTypeIconAreaWidth - kConnectedIconOffsetLeft - |
+ kConnectedIconSize)); |
+ device_icon_->AddChildView(checkmark_view); |
+ ; |
jennyz
2016/04/27 23:27:38
nit: Remove empty ";" line.
|
+ } |
+}; |
+ |
} // namespace |
class BluetoothDefaultView : public TrayItemMore { |
@@ -272,9 +370,12 @@ class BluetoothDetailedView : public TrayDetailsView, |
bool highlight, |
bool checked, |
bool enabled) { |
+ ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
for (size_t i = 0; i < list.size(); ++i) { |
- HoverHighlightView* container = |
- AddScrollListItem(list[i].display_name, highlight, checked, enabled); |
+ const gfx::ImageSkia* icon = |
+ rb.GetImageSkiaNamed(GetDeviceIconResourceId(list[i].device_type)); |
+ HoverHighlightView* container = AddBluetoothDeviceListEntry( |
+ list[i].display_name, icon, highlight, checked, enabled); |
device_map_[container] = list[i].address; |
} |
} |
@@ -291,6 +392,18 @@ class BluetoothDetailedView : public TrayDetailsView, |
return container; |
} |
+ // Add an bluetooth device entry to the scrollable device list. |
+ HoverHighlightView* AddBluetoothDeviceListEntry(const base::string16& text, |
+ const gfx::ImageSkia* icon, |
+ bool highlight, |
+ bool checked, |
+ bool enabled) { |
+ BluetoothDeviceListEntry* container = new BluetoothDeviceListEntry( |
+ this, *icon, text, highlight, checked, enabled); |
+ scroll_content()->AddChildView(container); |
+ return container; |
+ } |
+ |
// Add settings entries. |
void AppendSettingsEntries() { |
if (!ash::Shell::GetInstance()-> |