`
@@ -634,26 +640,37 @@ export class HaMediaPlayerBrowse extends LitElement {
.graphic=${mediaClass.show_list_images ? "medium" : "avatar"}
dir=${computeRTLDirection(this.hass)}
>
-
-
-
+ ${backgroundImage === "none" && !child.can_play
+ ? html``
+ : html`
+ ${child.can_play
+ ? html``
+ : nothing}
+
`}
${child.title}
`;
@@ -899,7 +916,6 @@ export class HaMediaPlayerBrowse extends LitElement {
overflow-y: auto;
box-sizing: border-box;
height: 100%;
- position: relative;
}
/* HEADER */
@@ -913,7 +929,7 @@ export class HaMediaPlayerBrowse extends LitElement {
top: 0;
right: 0;
left: 0;
- z-index: 5;
+ z-index: 3;
padding: 16px;
}
.header_button {
@@ -1154,6 +1170,8 @@ export class HaMediaPlayerBrowse extends LitElement {
mwc-list-item .graphic {
background-size: contain;
+ background-repeat: no-repeat;
+ background-position: center;
border-radius: 2px;
display: flex;
align-content: center;
diff --git a/src/data/media-player.ts b/src/data/media-player.ts
index 65f34dba53..deccb121dd 100644
--- a/src/data/media-player.ts
+++ b/src/data/media-player.ts
@@ -106,6 +106,8 @@ export type MediaPlayerBrowseAction = "pick" | "play";
export const BROWSER_PLAYER = "browser";
+export type MediaPlayerLayoutType = "grid" | "list" | "auto";
+
export type MediaClassBrowserSetting = {
icon: string;
thumbnail_ratio?: string;
@@ -117,12 +119,13 @@ export const MediaClassBrowserSettings: {
[type: string]: MediaClassBrowserSetting;
} = {
album: { icon: mdiAlbum, layout: "grid" },
- app: { icon: mdiApplication, layout: "grid" },
+ app: { icon: mdiApplication, layout: "grid", show_list_images: true },
artist: { icon: mdiAccountMusic, layout: "grid", show_list_images: true },
channel: {
icon: mdiTelevisionClassic,
thumbnail_ratio: "portrait",
layout: "grid",
+ show_list_images: true,
},
composer: {
icon: mdiAccountMusicOutline,
@@ -139,6 +142,7 @@ export const MediaClassBrowserSettings: {
icon: mdiTelevisionClassic,
layout: "grid",
thumbnail_ratio: "portrait",
+ show_list_images: true,
},
game: {
icon: mdiGamepadVariant,
@@ -146,15 +150,21 @@ export const MediaClassBrowserSettings: {
thumbnail_ratio: "portrait",
},
genre: { icon: mdiDramaMasks, layout: "grid", show_list_images: true },
- image: { icon: mdiImage, layout: "grid" },
- movie: { icon: mdiMovie, thumbnail_ratio: "portrait", layout: "grid" },
- music: { icon: mdiMusic },
+ image: { icon: mdiImage, layout: "grid", show_list_images: true },
+ movie: {
+ icon: mdiMovie,
+ thumbnail_ratio: "portrait",
+ layout: "grid",
+ show_list_images: true,
+ },
+ music: { icon: mdiMusic, show_list_images: true },
playlist: { icon: mdiPlaylistMusic, layout: "grid", show_list_images: true },
podcast: { icon: mdiPodcast, layout: "grid" },
season: {
icon: mdiTelevisionClassic,
layout: "grid",
thumbnail_ratio: "portrait",
+ show_list_images: true,
},
track: { icon: mdiFileMusic },
tv_show: {
@@ -163,7 +173,7 @@ export const MediaClassBrowserSettings: {
thumbnail_ratio: "portrait",
},
url: { icon: mdiWeb },
- video: { icon: mdiVideo, layout: "grid" },
+ video: { icon: mdiVideo, layout: "grid", show_list_images: true },
};
export interface MediaPickedEvent {
diff --git a/src/panels/media-browser/ha-panel-media-browser.ts b/src/panels/media-browser/ha-panel-media-browser.ts
index 986cb57c22..56bca1c6bf 100644
--- a/src/panels/media-browser/ha-panel-media-browser.ts
+++ b/src/panels/media-browser/ha-panel-media-browser.ts
@@ -1,4 +1,11 @@
-import { mdiArrowLeft } from "@mdi/js";
+import {
+ mdiGrid,
+ mdiListBoxOutline,
+ mdiArrowLeft,
+ mdiAlphaABoxOutline,
+ mdiDotsVertical,
+} from "@mdi/js";
+import { ActionDetail } from "@material/mwc-list";
import "@material/mwc-button";
import {
css,
@@ -26,6 +33,7 @@ import {
MediaPickedEvent,
MediaPlayerItem,
mediaPlayerPlayMedia,
+ MediaPlayerLayoutType,
} from "../../data/media-player";
import {
ResolvedMediaSource,
@@ -64,6 +72,8 @@ class PanelMediaBrowser extends LitElement {
@state() _currentItem?: MediaPlayerItem;
+ @state() _preferredLayout: MediaPlayerLayoutType = "auto";
+
private _navigateIds: MediaPlayerItemId[] = [
{
media_content_id: undefined,
@@ -113,10 +123,48 @@ class PanelMediaBrowser extends LitElement {
.currentItem=${this._currentItem}
@media-refresh=${this._refreshMedia}
>
+
+
+
+ ${this.hass.localize("ui.components.media-browser.auto")}
+
+
+
+ ${this.hass.localize("ui.components.media-browser.grid")}
+
+
+
+ ${this.hass.localize("ui.components.media-browser.list")}
+
+
+
@@ -130,6 +178,20 @@ class PanelMediaBrowser extends LitElement {
`;
}
+ private async _handleMenuAction(ev: CustomEvent) {
+ switch (ev.detail.index) {
+ case 0:
+ this._preferredLayout = "auto";
+ break;
+ case 1:
+ this._preferredLayout = "grid";
+ break;
+ case 2:
+ this._preferredLayout = "list";
+ break;
+ }
+ }
+
public willUpdate(changedProps: PropertyValues): void {
super.willUpdate(changedProps);
@@ -288,6 +350,9 @@ class PanelMediaBrowser extends LitElement {
:host([narrow]) ha-media-player-browse {
height: calc(100vh - (57px + var(--header-height)));
}
+ .selected_menu_item {
+ color: var(--primary-color);
+ }
ha-bar-media-player {
position: fixed;
diff --git a/src/translations/en.json b/src/translations/en.json
index 17e01be2ab..95601f7fc2 100644
--- a/src/translations/en.json
+++ b/src/translations/en.json
@@ -703,7 +703,10 @@
"url": "URL",
"video": "Video"
},
- "media_player_unavailable": "The selected media player is unavailable."
+ "media_player_unavailable": "The selected media player is unavailable.",
+ "auto": "Auto",
+ "grid": "Grid",
+ "list": "List"
},
"calendar": {
"label": "Calendar",