diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index 546ce430cf8b7..f5f69eb467b13 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd @@ -6743,10 +6743,23 @@ To shut down the device, press and hold the power button on the device again. [i18n] Frequently used controls like Wi-Fi, Bluetooth and volume controls are in Quick Settings. You can also go here to take screenshots. </message> + <!-- TODO(b/286455407): Update strings once finalized with UX Writing --> <!-- Game Dashboard strings --> + <message name="IDS_ASH_GAME_DASHBOARD_CONTROLS_TILE_BUTTON_TITLE" translateable="false" desc="The display name for the Game Dashboard game controls tile."> + Controls + </message> <message name="IDS_ASH_GAME_DASHBOARD_MAIN_MENU_BUTTON_TITLE" desc="The title of the Game Dashboard main menu button."> Game Dashboard </message> + <message name="IDS_ASH_GAME_DASHBOARD_RECORD_GAME_TILE_BUTTON_TITLE" translateable="false" desc="The display name for the Game Dashboard record game tile."> + Record game + </message> + <message name="IDS_ASH_GAME_DASHBOARD_SCREENSHOT_TILE_BUTTON_TITLE" translateable="false" desc="The display name for the Game Dashboard screenshot tile."> + Take screenshot + </message> + <message name="IDS_ASH_GAME_DASHBOARD_TOOLBAR_TILE_BUTTON_TITLE" translateable="false" desc="The display name for the Game Dashboard toolbar tile."> + Toolbar + </message> </messages> </release> </grit> diff --git a/ash/ash_strings_grd/IDS_ASH_GAME_DASHBOARD_CONTROLS_TILE_BUTTON_TITLE.png.sha1 b/ash/ash_strings_grd/IDS_ASH_GAME_DASHBOARD_CONTROLS_TILE_BUTTON_TITLE.png.sha1 new file mode 100644 index 0000000000000..8a3ff409468c4 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_GAME_DASHBOARD_CONTROLS_TILE_BUTTON_TITLE.png.sha1 @@ -0,0 +1 @@ +5e5b18224581ab5e95c7c60a0569215d7c517d03 \ No newline at end of file diff --git a/ash/ash_strings_grd/IDS_ASH_GAME_DASHBOARD_RECORD_GAME_TILE_BUTTON_TITLE.png.sha1 b/ash/ash_strings_grd/IDS_ASH_GAME_DASHBOARD_RECORD_GAME_TILE_BUTTON_TITLE.png.sha1 new file mode 100644 index 0000000000000..03897d05474f5 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_GAME_DASHBOARD_RECORD_GAME_TILE_BUTTON_TITLE.png.sha1 @@ -0,0 +1 @@ +a2bbb87cc5826ca13dd1c349f08485b09607a38a \ No newline at end of file diff --git a/ash/ash_strings_grd/IDS_ASH_GAME_DASHBOARD_SCREENSHOT_TILE_BUTTON_TITLE.png.sha1 b/ash/ash_strings_grd/IDS_ASH_GAME_DASHBOARD_SCREENSHOT_TILE_BUTTON_TITLE.png.sha1 new file mode 100644 index 0000000000000..57230c84cb192 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_GAME_DASHBOARD_SCREENSHOT_TILE_BUTTON_TITLE.png.sha1 @@ -0,0 +1 @@ +b96eb0c8a42b7322cd25830f270ed2c81fa4c2e2 \ No newline at end of file diff --git a/ash/ash_strings_grd/IDS_ASH_GAME_DASHBOARD_TOOLBAR_TILE_BUTTON_TITLE.png.sha1 b/ash/ash_strings_grd/IDS_ASH_GAME_DASHBOARD_TOOLBAR_TILE_BUTTON_TITLE.png.sha1 new file mode 100644 index 0000000000000..283d4fa0a4acd --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_GAME_DASHBOARD_TOOLBAR_TILE_BUTTON_TITLE.png.sha1 @@ -0,0 +1 @@ +a73f270b85623a86ad712e33a145a22239953426 \ No newline at end of file diff --git a/ash/game_dashboard/game_dashboard_main_menu_view.cc b/ash/game_dashboard/game_dashboard_main_menu_view.cc index 2e627f814a10b..51f984dba8880 100644 --- a/ash/game_dashboard/game_dashboard_main_menu_view.cc +++ b/ash/game_dashboard/game_dashboard_main_menu_view.cc @@ -6,24 +6,52 @@ #include <memory> +#include "ash/public/cpp/app_types_util.h" +#include "ash/public/cpp/ash_view_ids.h" +#include "ash/strings/grit/ash_strings.h" +#include "ash/system/unified/feature_tile.h" +#include "components/vector_icons/vector_icons.h" +#include "ui/base/l10n/l10n_util.h" #include "ui/base/metadata/metadata_impl_macros.h" -#include "ui/views/layout/table_layout.h" #include "ui/views/view.h" #include "ui/views/widget/widget.h" +#include "ui/wm/core/window_util.h" namespace ash { namespace { constexpr int kBubbleCornerRadius = 8; -// Padding between the edges of the menu and the elements. +// Horizontal padding for the border around the main menu. constexpr int kPaddingWidth = 12; +// Vertical padding for the border around the main menu. +constexpr int kPaddingHeight = 15; +// Padding between children in a row or column. +constexpr int kCenterPadding = 8; + +// Creates an individual Game Dashboard Tile. +std::unique_ptr<FeatureTile> CreateTile(base::RepeatingClosure callback, + bool is_togglable, + FeatureTile::TileType type, + int id, + const gfx::VectorIcon& icon, + const std::u16string& text) { + auto tile = + std::make_unique<FeatureTile>(std::move(callback), is_togglable, type); + tile->SetID(id); + tile->SetVisible(true); + tile->SetVectorIcon(icon); + tile->SetLabel(text); + tile->SetTooltipText(text); + return tile; +} } // namespace GameDashboardMainMenuView::GameDashboardMainMenuView( views::Widget* main_menu_button_widget) { DCHECK(main_menu_button_widget); + set_corner_radius(kBubbleCornerRadius); set_close_on_deactivate(false); set_internal_name("GameDashboardMainMenuView"); @@ -32,21 +60,59 @@ GameDashboardMainMenuView::GameDashboardMainMenuView( SetAnchorView(main_menu_button_widget->GetContentsView()); SetArrow(views::BubbleBorder::Arrow::NONE); SetButtons(ui::DIALOG_BUTTON_NONE); + SetLayoutManager(std::make_unique<views::BoxLayout>( + views::BoxLayout::Orientation::kVertical, + gfx::Insets::VH(kPaddingHeight, kPaddingWidth), kCenterPadding)); - auto* layout = SetLayoutManager(std::make_unique<views::TableLayout>()); - layout->AddPaddingColumn(views::TableLayout::kFixedSize, kPaddingWidth) - .AddColumn(views::LayoutAlignment::kStart, - views::LayoutAlignment::kCenter, - views::TableLayout::kFixedSize, - views::TableLayout::ColumnSize::kUsePreferred, 0, 0) - .AddPaddingColumn(views::TableLayout::kFixedSize, kPaddingWidth) - .AddPaddingRow(views::TableLayout::kFixedSize, kPaddingWidth) - .AddRows(1, views::TableLayout::kFixedSize) - .AddPaddingRow(views::TableLayout::kFixedSize, kPaddingWidth); + AddShortcutTilesRow(); + + SizeToPreferredSize(); } GameDashboardMainMenuView::~GameDashboardMainMenuView() = default; +void GameDashboardMainMenuView::OnToolbarTilePressed() { + // TODO(b/273641426): Add support when toolbar tile is pressed. +} + +void GameDashboardMainMenuView::OnRecordGameTilePressed() { + // TODO(b/273641250): Add support when record game tile is pressed. +} + +void GameDashboardMainMenuView::OnScreenshotTilePressed() { + // TODO(b/273641464): Add support when screenshot tile is pressed. +} + +void GameDashboardMainMenuView::AddShortcutTilesRow() { + views::BoxLayoutView* container = + AddChildView(std::make_unique<views::BoxLayoutView>()); + container->SetOrientation(views::BoxLayout::Orientation::kHorizontal); + container->SetBetweenChildSpacing(kCenterPadding); + + container->AddChildView(CreateTile( + base::BindRepeating(&GameDashboardMainMenuView::OnToolbarTilePressed, + base::Unretained(this)), + /*is_togglable=*/false, FeatureTile::TileType::kCompact, + VIEW_ID_GD_TOOLBAR_TILE, vector_icons::kVideogameAssetOutlineIcon, + l10n_util::GetStringUTF16( + IDS_ASH_GAME_DASHBOARD_TOOLBAR_TILE_BUTTON_TITLE))); + // TODO(b/273641132): Filter out record game button based on device info. + container->AddChildView(CreateTile( + base::BindRepeating(&GameDashboardMainMenuView::OnRecordGameTilePressed, + base::Unretained(this)), + /*is_togglable=*/false, FeatureTile::TileType::kCompact, + VIEW_ID_GD_RECORD_TILE, vector_icons::kVideocamIcon, + l10n_util::GetStringUTF16( + IDS_ASH_GAME_DASHBOARD_RECORD_GAME_TILE_BUTTON_TITLE))); + container->AddChildView(CreateTile( + base::BindRepeating(&GameDashboardMainMenuView::OnScreenshotTilePressed, + base::Unretained(this)), + /*is_togglable=*/true, FeatureTile::TileType::kCompact, + VIEW_ID_GD_SCREENSHOT_TILE, vector_icons::kVideocamIcon, + l10n_util::GetStringUTF16( + IDS_ASH_GAME_DASHBOARD_SCREENSHOT_TILE_BUTTON_TITLE))); +} + BEGIN_METADATA(GameDashboardMainMenuView, views::BubbleDialogDelegateView) END_METADATA diff --git a/ash/game_dashboard/game_dashboard_main_menu_view.h b/ash/game_dashboard/game_dashboard_main_menu_view.h index df53b4ba55577..7dbcacd73a95f 100644 --- a/ash/game_dashboard/game_dashboard_main_menu_view.h +++ b/ash/game_dashboard/game_dashboard_main_menu_view.h @@ -21,6 +21,19 @@ class GameDashboardMainMenuView : public views::BubbleDialogDelegateView { GameDashboardMainMenuView& operator=(const GameDashboardMainMenuView) = delete; ~GameDashboardMainMenuView() override; + + private: + // Callbacks for the tiles and buttons in the main menu view. + // Handles showing and hiding the toolbar. + void OnToolbarTilePressed(); + // Handles toggling the game recording. + void OnRecordGameTilePressed(); + // Handles taking a screenshot of the game window when pressed. + void OnScreenshotTilePressed(); + + // Adds a row of shortcut tiles to the main menu view for users to quickly + // access common functionality. + void AddShortcutTilesRow(); }; } // namespace ash diff --git a/ash/public/cpp/ash_view_ids.h b/ash/public/cpp/ash_view_ids.h index 2c5cc970ab1cd..578d1c08fd3f8 100644 --- a/ash/public/cpp/ash_view_ids.h +++ b/ash/public/cpp/ash_view_ids.h @@ -34,6 +34,13 @@ enum ViewID { VIEW_ID_CAST_CAST_VIEW_LABEL, VIEW_ID_CAST_MAIN_VIEW, VIEW_ID_CAST_SELECT_VIEW, + + // Game Dashboard elements + VIEW_ID_GD_CONTROLS_TILE, + VIEW_ID_GD_RECORD_TILE, + VIEW_ID_GD_SCREENSHOT_TILE, + VIEW_ID_GD_TOOLBAR_TILE, + // The entry to add wifi network in the quick settings network subpage. VIEW_ID_JOIN_NETWORK_ENTRY,