mirror of
				https://github.com/TomHarte/CLK.git
				synced 2025-10-30 14:16:04 +00:00 
			
		
		
		
	Starts towards offering display-type selection.
This commit is contained in:
		| @@ -324,7 +324,8 @@ void MainWindow::launchMachine() { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// Set user-friendly default options. | 	// Set user-friendly default options. | ||||||
| 	const std::string longMachineName = Machine::LongNameForTargetMachine(targets[0]->machine); | 	const auto machineType = targets[0]->machine; | ||||||
|  | 	const std::string longMachineName = Machine::LongNameForTargetMachine(machineType); | ||||||
| 	const auto configurable = machine->configurable_device(); | 	const auto configurable = machine->configurable_device(); | ||||||
| 	if(configurable) { | 	if(configurable) { | ||||||
| 		configurable->set_options(Machine::AllOptionsByMachineName()[longMachineName]); | 		configurable->set_options(Machine::AllOptionsByMachineName()[longMachineName]); | ||||||
| @@ -348,8 +349,104 @@ void MainWindow::launchMachine() { | |||||||
| 	setWindowTitle(QString::fromStdString(longMachineName)); | 	setWindowTitle(QString::fromStdString(longMachineName)); | ||||||
|  |  | ||||||
| 	// TODO: add machine-specific UI. | 	// TODO: add machine-specific UI. | ||||||
|  |  | ||||||
|  | 	switch(machineType) { | ||||||
|  | 		case Analyser::Machine::AmstradCPC: | ||||||
|  | 			addDisplayMenu("Television", "", "", "Monitor"); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Analyser::Machine::AppleII: | ||||||
|  | 			addDisplayMenu("Colour", "Monochrome", "", ""); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Analyser::Machine::AtariST: | ||||||
|  | 			addDisplayMenu("Television", "", "", "Monitor"); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Analyser::Machine::ColecoVision: | ||||||
|  | 			addDisplayMenu("Composite", "", "S-Video", ""); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Analyser::Machine::Vic20: | ||||||
|  | 			addDisplayMenu("Composite", "", "S-Video", ""); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Analyser::Machine::Electron: | ||||||
|  | 			addDisplayMenu("Composite", "", "S-Video", "RGB"); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Analyser::Machine::MasterSystem: | ||||||
|  | 			addDisplayMenu("Composite", "", "S-Video", "SCART"); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Analyser::Machine::MSX: | ||||||
|  | 			addDisplayMenu("Composite", "", "S-Video", "SCART"); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		case Analyser::Machine::Oric: | ||||||
|  | 			addDisplayMenu("Composite", "", "", "SCART"); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
|  | 		default: break; | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void MainWindow::addDisplayMenu(const std::string &compositeColour, const std::string &compositeMono, const std::string &svideo, const std::string &rgb) { | ||||||
|  | 	// Create a display menu. | ||||||
|  | 	QMenu *const displayMenu = menuBar()->addMenu(tr("&Display")); | ||||||
|  |  | ||||||
|  | 	QAction *compositeColourAction = nullptr; | ||||||
|  | 	QAction *compositeMonochromeAction = nullptr; | ||||||
|  | 	QAction *sVideoAction = nullptr; | ||||||
|  | 	QAction *rgbAction = nullptr; | ||||||
|  |  | ||||||
|  | 	// Add all requested actions. | ||||||
|  | #define Add(name, action)								\ | ||||||
|  | 	if(!name.empty()) {									\ | ||||||
|  | 		action = new QAction(tr(name.c_str()), this);	\ | ||||||
|  | 		action->setCheckable(true);						\ | ||||||
|  | 		displayMenu->addAction(action);					\ | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	Add(compositeColour, compositeColourAction); | ||||||
|  | 	Add(compositeMono, compositeMonochromeAction); | ||||||
|  | 	Add(svideo, sVideoAction); | ||||||
|  | 	Add(rgb, rgbAction); | ||||||
|  |  | ||||||
|  | #undef Add | ||||||
|  |  | ||||||
|  | 	// TODO: use the existing machine configuration and/or settings to determine what is currently ticked. | ||||||
|  | 	auto options = machine->configurable_device()->get_options(); | ||||||
|  | 	Configurable::Display defaultDisplay = Configurable::Display::RGB;//Reflection::get<Configurable::Display>(*options, "output"); | ||||||
|  |  | ||||||
|  | 	// Add actions to the generated options. | ||||||
|  | 	size_t index = 0; | ||||||
|  | 	for(auto action: {compositeColourAction, compositeMonochromeAction, sVideoAction, rgbAction}) { | ||||||
|  | 		constexpr Configurable::Display displaySelections[] = { | ||||||
|  | 			Configurable::Display::CompositeColour, | ||||||
|  | 			Configurable::Display::CompositeMonochrome, | ||||||
|  | 			Configurable::Display::SVideo, | ||||||
|  | 			Configurable::Display::RGB, | ||||||
|  | 		}; | ||||||
|  | 		const Configurable::Display displaySelection = displaySelections[index]; | ||||||
|  | 		++index; | ||||||
|  |  | ||||||
|  | 		if(!action) continue; | ||||||
|  |  | ||||||
|  | 		action->setChecked(displaySelection == defaultDisplay); | ||||||
|  | 		connect(action, &QAction::triggered, this, [=] { | ||||||
|  | 			for(auto otherAction: {compositeColourAction, compositeMonochromeAction, sVideoAction, rgbAction}) { | ||||||
|  | 				if(otherAction && otherAction != action) otherAction->setChecked(false); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			auto options = machine->configurable_device()->get_options(); | ||||||
|  | 			Reflection::set(*options, "output", int(displaySelection)); | ||||||
|  | 			machine->configurable_device()->set_options(options); | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void MainWindow::speaker_did_complete_samples(Outputs::Speaker::Speaker *, const std::vector<int16_t> &buffer) { | void MainWindow::speaker_did_complete_samples(Outputs::Speaker::Speaker *, const std::vector<int16_t> &buffer) { | ||||||
| 	audioBuffer.write(buffer); | 	audioBuffer.write(buffer); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -99,6 +99,8 @@ class MainWindow : public QMainWindow, public Outputs::Speaker::Speaker::Delegat | |||||||
| 		static inline int mainWindowCount = 0; | 		static inline int mainWindowCount = 0; | ||||||
|  |  | ||||||
| 		void deleteMachine(); | 		void deleteMachine(); | ||||||
|  |  | ||||||
|  | 		void addDisplayMenu(const std::string &compositeColour, const std::string &compositeMono, const std::string &svideo, const std::string &rgb); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #endif // MAINWINDOW_H | #endif // MAINWINDOW_H | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user