[Scummvm-git-logs] scummvm master -> 1d316e9c4f6781027778560902d3b75bad8a3073

sev- noreply at scummvm.org
Tue Sep 9 14:43:35 UTC 2025


This automated email contains information about 4 new commits which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
523c599ec6 DIRECTOR: DT: Make Score switching work per selected window
30408be51c DIRECTOR: DT: Added window selection to Channels view
06d8e7657a DIRECTOR: DT: Made Channels window more usable
1d316e9c4f DIRECTOR: DT: Added window selection to the Cast window


Commit: 523c599ec6dbe7e23445d10be1fa36141f645fea
    https://github.com/scummvm/scummvm/commit/523c599ec6dbe7e23445d10be1fa36141f645fea
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-09-09T16:27:05+02:00

Commit Message:
DIRECTOR: DT: Make Score switching work per selected window

Changed paths:
    engines/director/debugger/dt-internal.h
    engines/director/debugger/dt-score.cpp


diff --git a/engines/director/debugger/dt-internal.h b/engines/director/debugger/dt-internal.h
index a5d26b6ca7f..08754f918ac 100644
--- a/engines/director/debugger/dt-internal.h
+++ b/engines/director/debugger/dt-internal.h
@@ -203,7 +203,7 @@ typedef struct ImGuiState {
 	} _hoveredScoreCast;
 
 	Common::Array<Common::Array<Common::Pair<uint, uint>>> _continuationData;
-	bool _loadedContinuationData = false;
+	Common::String _loadedContinuationData;
 
 	Common::String _scoreWindow;
 	int _scoreMode = 0;
diff --git a/engines/director/debugger/dt-score.cpp b/engines/director/debugger/dt-score.cpp
index 57c116f8b35..fce98b2f46d 100644
--- a/engines/director/debugger/dt-score.cpp
+++ b/engines/director/debugger/dt-score.cpp
@@ -49,12 +49,15 @@ const char *modes2[] = {
 
 #define FRAME_PAGE_SIZE 100
 
-static void buildContinuationData() {
-	if (_state->_loadedContinuationData) {
+static void buildContinuationData(Window *window) {
+	if (_state->_loadedContinuationData == window->getCurrentMovie()->getMacName()) {
 		return;
 	}
 
-	Score *score = g_director->getCurrentMovie()->getScore();
+	_state->_scorePageSlider = 0;
+	_state->_continuationData.clear();
+
+	Score *score = window->getCurrentMovie()->getScore();
 	uint numFrames = score->_scoreCache.size();
 
 	uint numChannels = score->_scoreCache[0]->_sprites.size();
@@ -120,11 +123,11 @@ static void buildContinuationData() {
 		}
 	}
 
-	_state->_loadedContinuationData = true;
+	_state->_loadedContinuationData = window->getCurrentMovie()->getMacName();
 }
 
-static void displayScoreChannel(int ch, int mode, int modeSel) {
-	Score *score = g_director->getCurrentMovie()->getScore();
+static void displayScoreChannel(int ch, int mode, int modeSel, Window *window) {
+	Score *score = window->getCurrentMovie()->getScore();
 	uint numFrames = score->_scoreCache.size();
 
 	const uint currentFrameNum = score->getCurrentFrameNum();
@@ -152,7 +155,7 @@ static void displayScoreChannel(int ch, int mode, int modeSel) {
 			if (mode == kModeMember) {
 				score->_channels[ch]->_visible = !score->_channels[ch]->_visible;
 
-				g_director->getCurrentWindow()->render(true);
+				window->render(true);
 			}
 		}
 
@@ -337,7 +340,7 @@ static void displayScoreChannel(int ch, int mode, int modeSel) {
 				else
 					_state->_selectedChannel = ch;
 
-				g_director->getCurrentWindow()->render(true);
+					window->render(true);
 			}
 		}
 
@@ -350,9 +353,10 @@ static void displayScoreChannel(int ch, int mode, int modeSel) {
 	ImGui::PopFont();
 }
 
-void windowList(Common::String *target) {
+Window *windowList(Common::String *target) {
 	const Common::Array<Window *> *windowList = g_director->getWindowList();
 	const Common::String selWin = *target;
+	Window *res = nullptr;
 
 	Common::String stage = g_director->getStage()->getCurrentMovie()->getMacName();
 
@@ -362,13 +366,16 @@ void windowList(Common::String *target) {
 		if (window->getCurrentMovie()->getMacName() == selWin) {
 			// Found the selected window
 			found = true;
+			res = window;
 			break;
 		}
 	}
 
 	// Our default is Stage
-	if (selWin.empty() || windowList->empty() || !found)
+	if (selWin.empty() || windowList->empty() || !found) {
 		*target = stage;
+		res = g_director->getStage();
+	}
 
 	ImGui::Text("Window:");
 	ImGui::SameLine();
@@ -378,28 +385,35 @@ void windowList(Common::String *target) {
 		if (ImGui::Selectable(stage.c_str(), selected))
 			*target = stage;
 
-		if (selected)
+		if (selected) {
 			ImGui::SetItemDefaultFocus();
+			res = g_director->getStage();
+		}
 
 		for (auto window : (*windowList)) {
 			Common::String winName = window->getCurrentMovie()->getMacName();
 			selected = (*target == winName);
-			if (ImGui::Selectable(winName.c_str(), selected))
+			if (ImGui::Selectable(winName.c_str(), selected)) {
 				*target = winName;
+				res = window;
+			}
 
-			if (selected)
+			if (selected) {
 				ImGui::SetItemDefaultFocus();
+				res = window;
+			}
+
 		}
 		ImGui::EndCombo();
 	}
+
+	return res;
 }
 
 void showScore() {
 	if (!_state->_w.score)
 		return;
 
-	buildContinuationData();
-
 	ImVec2 pos(40, 40);
 	ImGui::SetNextWindowPos(pos, ImGuiCond_FirstUseEver);
 
@@ -407,11 +421,13 @@ void showScore() {
 	ImGui::SetNextWindowSize(windowSize, ImGuiCond_FirstUseEver);
 
 	if (ImGui::Begin("Score", &_state->_w.score)) {
-		windowList(&_state->_scoreWindow);
+		Window *selectedWindow = windowList(&_state->_scoreWindow);
 
-		Score *score = g_director->getCurrentMovie()->getScore();
+		buildContinuationData(selectedWindow);
+
+		Score *score = selectedWindow->getCurrentMovie()->getScore();
 		uint numFrames = score->_scoreCache.size();
-		Cast *cast = g_director->getCurrentMovie()->getCast();
+		Cast *cast = selectedWindow->getCurrentMovie()->getCast();
 
 		if (!numFrames) {
 			ImGui::Text("No frames");
@@ -709,12 +725,12 @@ void showScore() {
 			}
 
 			{
-				displayScoreChannel(0, kChTempo, 0);
-				displayScoreChannel(0, kChPalette, 0);
-				displayScoreChannel(0, kChTransition, 0);
-				displayScoreChannel(0, kChSound1, 0);
-				displayScoreChannel(0, kChSound2, 0);
-				displayScoreChannel(0, kChScript, 0);
+				displayScoreChannel(0, kChTempo, 0, selectedWindow);
+				displayScoreChannel(0, kChPalette, 0, selectedWindow);
+				displayScoreChannel(0, kChTransition, 0, selectedWindow);
+				displayScoreChannel(0, kChSound1, 0, selectedWindow);
+				displayScoreChannel(0, kChSound2, 0, selectedWindow);
+				displayScoreChannel(0, kChScript, 0, selectedWindow);
 			}
 			ImGui::TableNextRow();
 
@@ -722,22 +738,22 @@ void showScore() {
 
 			for (int ch = 0; ch < (int)numChannels - 1; ch++) {
 				if (mode == kModeExtended) // This will render empty row
-					displayScoreChannel(ch + 1, kModeExtended, _state->_scoreMode);
+					displayScoreChannel(ch + 1, kModeExtended, _state->_scoreMode, selectedWindow);
 
 				if (mode == kModeMember || mode == kModeExtended)
-					displayScoreChannel(ch + 1, kModeMember, _state->_scoreMode);
+					displayScoreChannel(ch + 1, kModeMember, _state->_scoreMode, selectedWindow);
 
 				if (mode == kModeBehavior || mode == kModeExtended)
-					displayScoreChannel(ch + 1, kModeBehavior, _state->_scoreMode);
+					displayScoreChannel(ch + 1, kModeBehavior, _state->_scoreMode, selectedWindow);
 
 				if (mode == kModeInk || mode == kModeExtended)
-					displayScoreChannel(ch + 1, kModeInk, _state->_scoreMode);
+					displayScoreChannel(ch + 1, kModeInk, _state->_scoreMode, selectedWindow);
 
 				if (mode == kModeBlend || mode == kModeExtended)
-					displayScoreChannel(ch + 1, kModeBlend, _state->_scoreMode);
+					displayScoreChannel(ch + 1, kModeBlend, _state->_scoreMode, selectedWindow);
 
 				if (mode == kModeLocation || mode == kModeExtended)
-					displayScoreChannel(ch + 1, kModeLocation, _state->_scoreMode);
+					displayScoreChannel(ch + 1, kModeLocation, _state->_scoreMode, selectedWindow);
 			}
 			ImGui::EndTable();
 		}


Commit: 30408be51cf36844c9f4d6d8bf44cd23ef7a6386
    https://github.com/scummvm/scummvm/commit/30408be51cf36844c9f4d6d8bf44cd23ef7a6386
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-09-09T16:32:33+02:00

Commit Message:
DIRECTOR: DT: Added window selection to Channels view

Changed paths:
    engines/director/debugger/dt-score.cpp


diff --git a/engines/director/debugger/dt-score.cpp b/engines/director/debugger/dt-score.cpp
index fce98b2f46d..2b7d9c42d25 100644
--- a/engines/director/debugger/dt-score.cpp
+++ b/engines/director/debugger/dt-score.cpp
@@ -353,7 +353,7 @@ static void displayScoreChannel(int ch, int mode, int modeSel, Window *window) {
 	ImGui::PopFont();
 }
 
-Window *windowList(Common::String *target) {
+Window *windowListCombo(Common::String *target) {
 	const Common::Array<Window *> *windowList = g_director->getWindowList();
 	const Common::String selWin = *target;
 	Window *res = nullptr;
@@ -421,7 +421,7 @@ void showScore() {
 	ImGui::SetNextWindowSize(windowSize, ImGuiCond_FirstUseEver);
 
 	if (ImGui::Begin("Score", &_state->_w.score)) {
-		Window *selectedWindow = windowList(&_state->_scoreWindow);
+		Window *selectedWindow = windowListCombo(&_state->_scoreWindow);
 
 		buildContinuationData(selectedWindow);
 
@@ -788,10 +788,12 @@ void showChannels() {
 	ImGui::SetNextWindowSize(windowSize, ImGuiCond_FirstUseEver);
 
 	if (ImGui::Begin("Channels", &_state->_w.channels)) {
-		Score *score = g_director->getCurrentMovie()->getScore();
+		Window *selectedWindow = windowListCombo(&_state->_scoreWindow);
+
+		Score *score = selectedWindow->getCurrentMovie()->getScore();
 		const Frame &frame = *score->_currentFrame;
 
-		CastMemberID defaultPalette = g_director->getCurrentMovie()->_defaultPalette;
+		CastMemberID defaultPalette = selectedWindow->getCurrentMovie()->_defaultPalette;
 		ImGui::Text("TMPO:   tempo: %d, skipFrameFlag: %d, blend: %d, currentFPS: %d",
 			frame._mainChannels.tempo, frame._mainChannels.skipFrameFlag, frame._mainChannels.blend, score->_currentFrameRate);
 		if (!frame._mainChannels.palette.paletteId.isNull()) {
@@ -854,7 +856,7 @@ void showChannels() {
 					if (ImGui::IsItemClicked(0)) {
 						score->_channels[i]->_visible = !score->_channels[i]->_visible;
 
-						g_director->getCurrentWindow()->render(true);
+						selectedWindow->render(true);
 					}
 
 					if (score->_channels[i]->_visible)
@@ -875,7 +877,7 @@ void showChannels() {
 						_state->_selectedChannel = i + 1;
 					 }
 
-					g_director->getCurrentWindow()->render(true);
+					selectedWindow->render(true);
 				}
 
 				ImGui::TableNextColumn();


Commit: 06d8e7657a964136826bc3508f14e20864480ed0
    https://github.com/scummvm/scummvm/commit/06d8e7657a964136826bc3508f14e20864480ed0
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-09-09T16:36:03+02:00

Commit Message:
DIRECTOR: DT: Made Channels window more usable

Changed paths:
    engines/director/debugger/dt-score.cpp


diff --git a/engines/director/debugger/dt-score.cpp b/engines/director/debugger/dt-score.cpp
index 2b7d9c42d25..66ec95bad15 100644
--- a/engines/director/debugger/dt-score.cpp
+++ b/engines/director/debugger/dt-score.cpp
@@ -810,7 +810,7 @@ void showChannels() {
 		ImGui::Text("SND: 2  sound2: %d, soundType2: %d", frame._mainChannels.sound2.member, frame._mainChannels.soundType2);
 		ImGui::Text("LSCR:   actionId: %s", frame._mainChannels.actionId.asString().c_str());
 
-		if (ImGui::BeginTable("Channels", 22, ImGuiTableFlags_Borders)) {
+		if (ImGui::BeginTable("Channels", 22, ImGuiTableFlags_Borders | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_RowBg)) {
 			ImGuiTableFlags flags = ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_AngledHeader;
 			ImGui::TableSetupColumn("##toggle", flags);
 			ImGui::TableSetupColumn("CH", flags);


Commit: 1d316e9c4f6781027778560902d3b75bad8a3073
    https://github.com/scummvm/scummvm/commit/1d316e9c4f6781027778560902d3b75bad8a3073
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-09-09T16:43:12+02:00

Commit Message:
DIRECTOR: DT: Added window selection to the Cast window

Changed paths:
    engines/director/debugger/debugtools.cpp
    engines/director/debugger/dt-cast.cpp
    engines/director/debugger/dt-internal.h
    engines/director/debugger/dt-save-state.cpp
    engines/director/debugger/dt-score.cpp


diff --git a/engines/director/debugger/debugtools.cpp b/engines/director/debugger/debugtools.cpp
index af2d7595912..9f7226b00de 100644
--- a/engines/director/debugger/debugtools.cpp
+++ b/engines/director/debugger/debugtools.cpp
@@ -410,6 +410,63 @@ ImColor brightenColor(const ImColor& color, float factor) {
 	return ImColor(col);
 }
 
+Window *windowListCombo(Common::String *target) {
+	const Common::Array<Window *> *windowList = g_director->getWindowList();
+	const Common::String selWin = *target;
+	Window *res = nullptr;
+
+	Common::String stage = g_director->getStage()->getCurrentMovie()->getMacName();
+
+	// Check if the relevant window is gone
+	bool found = false;
+	for (auto window : (*windowList)) {
+		if (window->getCurrentMovie()->getMacName() == selWin) {
+			// Found the selected window
+			found = true;
+			res = window;
+			break;
+		}
+	}
+
+	// Our default is Stage
+	if (selWin.empty() || windowList->empty() || !found) {
+		*target = stage;
+		res = g_director->getStage();
+	}
+
+	ImGui::Text("Window:");
+	ImGui::SameLine();
+
+	if (ImGui::BeginCombo("##window", selWin.c_str())) {
+		bool selected = (*target == stage);
+		if (ImGui::Selectable(stage.c_str(), selected))
+			*target = stage;
+
+		if (selected) {
+			ImGui::SetItemDefaultFocus();
+			res = g_director->getStage();
+		}
+
+		for (auto window : (*windowList)) {
+			Common::String winName = window->getCurrentMovie()->getMacName();
+			selected = (*target == winName);
+			if (ImGui::Selectable(winName.c_str(), selected)) {
+				*target = winName;
+				res = window;
+			}
+
+			if (selected) {
+				ImGui::SetItemDefaultFocus();
+				res = window;
+			}
+
+		}
+		ImGui::EndCombo();
+	}
+
+	return res;
+}
+
 static void showSettings() {
 	if (!_state->_w.settings)
 		return;
diff --git a/engines/director/debugger/dt-cast.cpp b/engines/director/debugger/dt-cast.cpp
index 3d4a6eeddbc..3cce2d83d3f 100644
--- a/engines/director/debugger/dt-cast.cpp
+++ b/engines/director/debugger/dt-cast.cpp
@@ -32,6 +32,7 @@
 #include "director/castmember/script.h"
 #include "director/movie.h"
 #include "director/types.h"
+#include "director/window.h"
 
 namespace Director {
 namespace DT {
@@ -116,6 +117,8 @@ void showCast() {
 	ImGui::SetNextWindowSize(ImVec2(480, 480), ImGuiCond_FirstUseEver);
 
 	if (ImGui::Begin("Cast", &_state->_w.cast)) {
+		Window *selectedWindow = windowListCombo(&_state->_castWindow);
+
 		// display a toolbar with: grid/list/filters buttons + name filter
 		ImGuiEx::toggleButton(ICON_MS_LIST, &_state->_cast._listView);
 		ImGui::SetItemTooltip("List");
@@ -146,7 +149,7 @@ void showCast() {
 		// display a list or a grid
 		const float sliderHeight = _state->_cast._listView ? 0.f : 38.f;
 		const ImVec2 childsize = ImGui::GetContentRegionAvail();
-		Movie *movie = g_director->getCurrentMovie();
+		Movie *movie = selectedWindow->getCurrentMovie();
 		ImGui::BeginChild("##cast", ImVec2(childsize.x, childsize.y - sliderHeight));
 		if (_state->_cast._listView) {
 			if (ImGui::BeginTable("Resources", 5, ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Resizable | ImGuiTableFlags_RowBg)) {
diff --git a/engines/director/debugger/dt-internal.h b/engines/director/debugger/dt-internal.h
index 08754f918ac..84b31699530 100644
--- a/engines/director/debugger/dt-internal.h
+++ b/engines/director/debugger/dt-internal.h
@@ -206,6 +206,8 @@ typedef struct ImGuiState {
 	Common::String _loadedContinuationData;
 
 	Common::String _scoreWindow;
+	Common::String _channelsWindow;
+	Common::String _castWindow;
 	int _scoreMode = 0;
 	int _scoreFrameOffset = 1;
 	int _scorePageSlider = 0;
@@ -243,6 +245,7 @@ void showImage(const ImGuiImage &image, const char *name, float thumbnailSize);
 ImVec4 convertColor(uint32 color);
 void displayVariable(const Common::String &name, bool changed, bool outOfScope = false);
 ImColor brightenColor(const ImColor &color, float factor);
+Window *windowListCombo(Common::String *target);
 Common::String formatHandlerName(int scriptId, int castId, Common::String handlerName, ScriptType scriptType, bool childScript);
 
 void showCast();        // dt-cast.cpp
diff --git a/engines/director/debugger/dt-save-state.cpp b/engines/director/debugger/dt-save-state.cpp
index eb8c932f6bb..4bab8cc1f96 100644
--- a/engines/director/debugger/dt-save-state.cpp
+++ b/engines/director/debugger/dt-save-state.cpp
@@ -92,6 +92,8 @@ void saveCurrentState() {
 
 	// Other settings
 	json["ScoreWindow"] = new Common::JSONValue(_state->_scoreWindow);
+	json["ChannelsWindow"] = new Common::JSONValue(_state->_channelsWindow);
+	json["CastWindow"] = new Common::JSONValue(_state->_castWindow);
 
 	// Save the JSON
 	Common::JSONValue save(json);
@@ -173,6 +175,8 @@ void loadSavedState() {
 
 	// Load other settings
 	_state->_scoreWindow = saved->asObject()["ScoreWindow"]->asString();
+	_state->_channelsWindow = saved->asObject()["ChannelsWindow"]->asString();
+	_state->_castWindow = saved->asObject()["CastWindow"]->asString();
 
 	free(data);
 	delete saved;
diff --git a/engines/director/debugger/dt-score.cpp b/engines/director/debugger/dt-score.cpp
index 66ec95bad15..e3b576bb962 100644
--- a/engines/director/debugger/dt-score.cpp
+++ b/engines/director/debugger/dt-score.cpp
@@ -353,63 +353,6 @@ static void displayScoreChannel(int ch, int mode, int modeSel, Window *window) {
 	ImGui::PopFont();
 }
 
-Window *windowListCombo(Common::String *target) {
-	const Common::Array<Window *> *windowList = g_director->getWindowList();
-	const Common::String selWin = *target;
-	Window *res = nullptr;
-
-	Common::String stage = g_director->getStage()->getCurrentMovie()->getMacName();
-
-	// Check if the relevant window is gone
-	bool found = false;
-	for (auto window : (*windowList)) {
-		if (window->getCurrentMovie()->getMacName() == selWin) {
-			// Found the selected window
-			found = true;
-			res = window;
-			break;
-		}
-	}
-
-	// Our default is Stage
-	if (selWin.empty() || windowList->empty() || !found) {
-		*target = stage;
-		res = g_director->getStage();
-	}
-
-	ImGui::Text("Window:");
-	ImGui::SameLine();
-
-	if (ImGui::BeginCombo("##window", selWin.c_str())) {
-		bool selected = (*target == stage);
-		if (ImGui::Selectable(stage.c_str(), selected))
-			*target = stage;
-
-		if (selected) {
-			ImGui::SetItemDefaultFocus();
-			res = g_director->getStage();
-		}
-
-		for (auto window : (*windowList)) {
-			Common::String winName = window->getCurrentMovie()->getMacName();
-			selected = (*target == winName);
-			if (ImGui::Selectable(winName.c_str(), selected)) {
-				*target = winName;
-				res = window;
-			}
-
-			if (selected) {
-				ImGui::SetItemDefaultFocus();
-				res = window;
-			}
-
-		}
-		ImGui::EndCombo();
-	}
-
-	return res;
-}
-
 void showScore() {
 	if (!_state->_w.score)
 		return;




More information about the Scummvm-git-logs mailing list