Implement a setting to hide party actors in the carousel, update rendering logic, and bump the module version.

This commit is contained in:
CPTN Cosmo 2026-01-24 15:17:37 +01:00
parent 4a550233c0
commit bf1f956f2b
No known key found for this signature in database
4 changed files with 55 additions and 7 deletions

View file

@ -46,7 +46,11 @@
"CarouselEffect": "Übergangseffekt",
"CarouselEffectHint": "Animationseffekt beim Wechseln der Karten.",
"CarouselGMMode": "GM Karussell-Verhalten",
"CarouselGMModeHint": "Wie der GM im Karussell behandelt werden soll."
"CarouselGMModeHint": "Wie der GM im Karussell dargestellt werden soll.",
"CarouselHidePlayers": "Spieler im Karussell verbergen",
"CarouselHidePlayersHint": "Wenn aktiviert, werden Spielercharaktere nicht im Karussell angezeigt.",
"CarouselHidePartyActor": "Party-Actor im Karussell verbergen",
"CarouselHidePartyActorHint": "Wenn aktiviert, werden Actors vom Typ 'Party' nicht im Karussell angezeigt."
},
"OpenStream": "Stream-Ansicht öffnen",
"ModeNumeric": "Numerisch (3/6)",

View file

@ -54,7 +54,11 @@
"CarouselEffect": "Transition Effect",
"CarouselEffectHint": "Animation effect when switching cards.",
"CarouselGMMode": "GM Carousel Behavior",
"CarouselGMModeHint": "How the GM should constitute in the carousel."
"CarouselGMModeHint": "How the GM should constitute in the carousel.",
"CarouselHidePlayers": "Hide Players in Carousel",
"CarouselHidePlayersHint": "If enabled, party actors (players) will not be shown in the carousel.",
"CarouselHidePartyActor": "Hide 'Party' Actor in Carousel",
"CarouselHidePartyActorHint": "If enabled, actors with the type 'Party' will not be shown in the carousel."
},
"OpenStream": "Open Stream View",
"ModeNumeric": "Numeric (3/6)",

View file

@ -1,7 +1,7 @@
{
"id": "dh-stream-overlay",
"title": "Daggerheart Stream Overlay",
"version": "2.0.0",
"version": "2.0.1",
"compatibility": {
"minimum": "13",
"verified": "13"
@ -45,6 +45,6 @@
"packFolders": [],
"url": "https://github.com/cptn-cosmo/dh-stream-overlay",
"manifest": "https://git.geeks.gay/cosmo/dh-stream-overlay/raw/branch/main/module.json",
"download": "https://git.geeks.gay/cosmo/dh-stream-overlay/releases/download/2.0.0/dh-stream-overlay.zip",
"download": "https://git.geeks.gay/cosmo/dh-stream-overlay/releases/download/2.0.1/dh-stream-overlay.zip",
"description": "A stream overlay module for Daggerheart that displays chat and a linked party actor sheet."
}

View file

@ -278,6 +278,26 @@ Hooks.once("init", () => {
onChange: () => { if (document.body.classList.contains("stream")) location.reload(); }
});
game.settings.register("dh-stream-overlay", "carouselHidePlayers", {
name: "DH_STREAM_OVERLAY.Settings.CarouselHidePlayers",
hint: "DH_STREAM_OVERLAY.Settings.CarouselHidePlayersHint",
scope: "world",
config: true,
type: Boolean,
default: false,
onChange: () => { if (document.body.classList.contains("stream")) location.reload(); }
});
game.settings.register("dh-stream-overlay", "carouselHidePartyActor", {
name: "DH_STREAM_OVERLAY.Settings.CarouselHidePartyActor",
hint: "DH_STREAM_OVERLAY.Settings.CarouselHidePartyActorHint",
scope: "world",
config: true,
type: Boolean,
default: false,
onChange: () => { if (document.body.classList.contains("stream")) location.reload(); }
});
});
// =============================================================================
@ -504,10 +524,12 @@ function renderPartyOverlay(container) {
let carouselEnabled = false;
let carouselEffect = "fade";
let carouselGMMode = "cycle";
let carouselHidePartyActor = false;
try {
carouselEnabled = game.settings.get("dh-stream-overlay", "carouselEnabled");
carouselEffect = game.settings.get("dh-stream-overlay", "carouselEffect");
carouselGMMode = game.settings.get("dh-stream-overlay", "carouselGMMode");
carouselHidePartyActor = game.settings.get("dh-stream-overlay", "carouselHidePartyActor");
} catch (e) { }
const renderPips = (val, max, type) => {
@ -578,6 +600,9 @@ function renderPartyOverlay(container) {
players.forEach(user => {
const actor = user.character;
if (!actor) return;
// Filter Party Actor from Carousel if enabled
if (carouselEnabled && carouselHidePartyActor && actor.type.toLowerCase() === "party") return;
const system = actor.system || {};
const items = actor.items;
@ -759,21 +784,36 @@ function renderPartyOverlay(container) {
let carouselClass = `carousel-mode effect-${carouselEffect}`;
// GM Logic
// Check hide players setting
let hidePlayers = false;
try { hidePlayers = game.settings.get("dh-stream-overlay", "carouselHidePlayers"); } catch (e) { }
if (carouselGMMode === "static") {
// Static grid for GM, Carousel for Players
// Wrap in a flex container
container.innerHTML = `
<div class="dh-carousel-wrapper">
${gms.length > 0 ? `<div class="dh-party-grid layout-${layoutMode} dh-static-gm">${gmHtml}</div>` : ""}
${players.length > 0 ? `<div class="dh-party-grid layout-${layoutMode} ${carouselClass}">${playerHtml}</div>` : ""}
${(!hidePlayers && players.length > 0) ? `<div class="dh-party-grid layout-${layoutMode} ${carouselClass}">${playerHtml}</div>` : ""}
</div>`;
} else if (carouselGMMode === "hidden") {
// Only Players in Carousel
container.innerHTML = `<div class="dh-party-grid layout-${layoutMode} ${carouselClass}">${playerHtml}</div>`;
if (!hidePlayers && players.length > 0) {
container.innerHTML = `<div class="dh-party-grid layout-${layoutMode} ${carouselClass}">${playerHtml}</div>`;
} else {
container.innerHTML = ""; // Nothing to show
}
} else {
// "cycle" or default - Mixed
container.innerHTML = `<div class="dh-party-grid layout-${layoutMode} ${carouselClass}">${gmHtml}${playerHtml}</div>`;
let mixedContent = gmHtml;
if (!hidePlayers) mixedContent += playerHtml;
if (mixedContent) {
container.innerHTML = `<div class="dh-party-grid layout-${layoutMode} ${carouselClass}">${mixedContent}</div>`;
} else {
container.innerHTML = "";
}
}
} else {