diff --git a/src/csui/src/PlayerUiPanels/PlayerDetectionPanel.vue b/src/csui/src/PlayerUiPanels/PlayerDetectionPanel.vue
index eb4d886..947c60f 100644
--- a/src/csui/src/PlayerUiPanels/PlayerDetectionPanel.vue
+++ b/src/csui/src/PlayerUiPanels/PlayerDetectionPanel.vue
@@ -75,6 +75,8 @@
@mouseover="markElement(index, true)"
@mouseleave="markElement(index, false)"
+
+ @click="setPlayer(index)"
>
{{element.tagName}} {{element.id ? `#`:''}}{{element.id}} @ {{element.width}}x{{element.height}}
@@ -124,7 +126,7 @@ export default({
this.eventBus.subscribe('uw-config-broadcast', {function: (config) => this.handleElementStack(config)});
},
mounted() {
- this.eventBus.sendToTunnel('get-player-tree'); // TODO: implement this in PlayerData
+ this.eventBus.sendToTunnel('get-player-tree');
},
computed: {},
methods: {
@@ -135,8 +137,23 @@ export default({
}
},
markElement(parentIndex, enable) {
- console.log('will mark element:', parentIndex, enable);
this.eventBus.sendToTunnel('set-mark-element', {parentIndex, enable});
+ },
+ async setPlayer(index) {
+ // if user agrees with ultrawidify on what element player should be,
+ // we just unset our settings for this site
+ if (this.elementStack[index].heuristics?.autoMatch) {
+ this.settings.setSiteOption(['DOM', 'player', 'manual'], false, this.site);
+ await this.settings.save();
+ this.eventBus.sendToTunnel('get-player-tree');
+ } else {
+ // ensure settings exist:
+ this.settings.setSiteOption(['DOM', 'player', 'manual'], true, this.site);
+ this.settings.setSiteOption(['DOM', 'player', 'useRelativeAncestor'], true, this.site);
+ this.settings.setSiteOption(['DOM', 'player', 'videoAncestor'], index, this.site);
+ await this.settings.save();
+ this.eventBus.sendToTunnel('get-player-tree');
+ }
}
}
})
@@ -169,6 +186,8 @@ export default({
border: 1px solid rgba(255,255,255,0.5);
padding: 0.5rem 1rem;
+ max-width: 30rem;
+
display: flex;
flex-direction: column;
@@ -187,6 +206,13 @@ export default({
display: flex;
flex-direction: row;
flex-wrap: wrap;
+
+ > div {
+ background-color: rgba(255,255,255,0.5);
+ border-radius: 0.25rem;
+ padding: 0.125rem 0.5rem;
+ margin: 0.125rem 0.25rem;
+ }
}
.dimensions {
color: #473c85;
diff --git a/src/ext/lib/Settings.ts b/src/ext/lib/Settings.ts
index f6b3640..f972c81 100644
--- a/src/ext/lib/Settings.ts
+++ b/src/ext/lib/Settings.ts
@@ -622,6 +622,30 @@ class Settings {
getDefaultStretchMode(site?: string) {
return this.active.sites[site ?? window.location.hostname]?.defaultStretch ?? this.active.stretch.default ?? {type: StretchType.NoStretch};
}
+
+ /**
+ * Sets a site option and initializes values if empty.
+ * Does not save settings.
+ * @param path
+ * @param value
+ * @param site
+ */
+ setSiteOption(path: string[], value: any, site?: string) {
+ site = site ?? window.location.hostname;
+
+ if (!this.active.sites[site]) {
+ this.active.sites[site] = {};
+ }
+
+ let object = this.active.sites[site];
+ for (let i = 0; i < path.length - 1; i++) {
+ if (!object[path[i]]) {
+ object[path[i]] = {};
+ }
+ object = object[path[i]];
+ }
+ object[path[path.length - 1]] = value;
+ }
}
export default Settings;
diff --git a/src/ext/lib/video-data/PlayerData.ts b/src/ext/lib/video-data/PlayerData.ts
index 51054a0..ee5c18f 100644
--- a/src/ext/lib/video-data/PlayerData.ts
+++ b/src/ext/lib/video-data/PlayerData.ts
@@ -69,6 +69,20 @@ class PlayerData {
elementStack: any[] = [];
//#endregion
+ //#region event bus configuration
+ private eventBusCommands = {
+ 'get-player-tree': [{
+ function: () => this.handlePlayerTreeRequest()
+ }],
+ 'set-mark-element': [{ // NOTE: is this still used?
+ function: (data) => this.markElement(data)
+ }],
+ 'update-player': [{
+ function: () => this.getPlayer();
+ }]
+ }
+ //#endregion
+
/**
* Gets player aspect ratio. If in full screen, it returns screen aspect ratio unless settings say otherwise.
*/
@@ -95,9 +109,7 @@ class PlayerData {
this.extensionMode = videoData.extensionMode;
this.invalid = false;
this.element = this.getPlayer();
-
- this.eventBus.subscribe('get-player-tree', {function: () => this.handlePlayerTreeRequest()});
- this.eventBus.subscribe('set-mark-element', {function: (data) => this.markElement(data)});
+ this.initEventBus();
// this.notificationService = new PlayerNotificationUi(this.element, this.settings, this.eventBus);
this.ui = new UI('ultrawidifyUi', {parentElement: this.element, eventBus: this.eventBus});
@@ -128,7 +140,14 @@ class PlayerData {
console.error('[Ultrawidify::PlayerData::ctor] There was an error setting up player data. You should be never seeing this message. Error:', e);
this.invalid = true;
}
+ }
+ private initEventBus() {
+ for (const action in this.eventBusCommands) {
+ for (const command of this.eventBusCommands[action]) {
+ this.eventBus.subscribe(action, command);
+ }
+ }
}
/**