mirror of
				https://github.com/TomHarte/CLK.git
				synced 2025-10-30 14:16:04 +00:00 
			
		
		
		
	Compare commits
	
		
			49 Commits
		
	
	
		
			2021-07-09
			...
			2021-07-16
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 5bfedff8d1 | ||
|  | c8638c0ffb | ||
|  | 8a95b91e2a | ||
|  | c226be612f | ||
|  | c8699d9770 | ||
|  | a0799e14cc | ||
|  | dea6048849 | ||
|  | 813e252539 | ||
|  | b41e29a83b | ||
|  | d35c7ad127 | ||
|  | ea63415d0e | ||
|  | 52ea3b741c | ||
|  | 2731ca8c92 | ||
|  | af1ade9433 | ||
|  | fc248951cc | ||
|  | 84547ee1c1 | ||
|  | a42848c62f | ||
|  | c7b5d69431 | ||
|  | 81374b70b5 | ||
|  | 47a530fd5c | ||
|  | 58451d7c0c | ||
|  | 5c8f8c76fe | ||
|  | ae1d1bdb5b | ||
|  | 33cc1154a2 | ||
|  | 4bc0b75c30 | ||
|  | eb8ec1efb1 | ||
|  | 616f8efc47 | ||
|  | 29e4369420 | ||
|  | bd7f7bc8d7 | ||
|  | e689ca92c4 | ||
|  | 4ef3005072 | ||
|  | 174c837767 | ||
|  | 486bb911a9 | ||
|  | 754221d697 | ||
|  | 3c36c90729 | ||
|  | 3d1d15a25b | ||
|  | 000d99f26c | ||
|  | 524e2abc8c | ||
|  | 00bab98e09 | ||
|  | 6d98349be1 | ||
|  | d24d153c08 | ||
|  | b01561712c | ||
|  | 324edcb391 | ||
|  | 6e62e4e296 | ||
|  | f81ecbf4a0 | ||
|  | 4370456323 | ||
|  | a424ed7c00 | ||
|  | a2065f59a1 | ||
|  | c1bd7f5c67 | 
| @@ -23,10 +23,19 @@ namespace Activity { | |||||||
| */ | */ | ||||||
| class Observer { | class Observer { | ||||||
| 	public: | 	public: | ||||||
|  | 		/// Provides hints as to the sort of information presented on an LED. | ||||||
|  | 		enum LEDPresentation: uint8_t { | ||||||
|  | 			/// This LED informs the user of some sort of persistent state, e.g. scroll lock. | ||||||
|  | 			/// If this flag is absent then the LED describes an ephemeral state, such as media access. | ||||||
|  | 			Persistent = (1 << 0), | ||||||
|  | 		}; | ||||||
|  |  | ||||||
| 		/// Announces to the receiver that there is an LED of name @c name. | 		/// Announces to the receiver that there is an LED of name @c name. | ||||||
| 		virtual void register_led([[maybe_unused]] const std::string &name) {} | 		virtual void register_led([[maybe_unused]] const std::string &name, [[maybe_unused]] uint8_t presentation = 0) {} | ||||||
|  |  | ||||||
| 		/// Announces to the receiver that there is a drive of name @c name. | 		/// Announces to the receiver that there is a drive of name @c name. | ||||||
|  | 		/// | ||||||
|  | 		/// If a drive has the same name as an LED, that LED goes with this drive. | ||||||
| 		virtual void register_drive([[maybe_unused]] const std::string &name) {} | 		virtual void register_drive([[maybe_unused]] const std::string &name) {} | ||||||
|  |  | ||||||
| 		/// Informs the receiver of the new state of the LED with name @c name. | 		/// Informs the receiver of the new state of the LED with name @c name. | ||||||
|   | |||||||
| @@ -48,9 +48,10 @@ Analyser::Static::TargetList Analyser::Static::Enterprise::GetTargets(const Medi | |||||||
| 		auto volume = Storage::Disk::FAT::GetVolume(media.disks.front()); | 		auto volume = Storage::Disk::FAT::GetVolume(media.disks.front()); | ||||||
| 		if(volume) { | 		if(volume) { | ||||||
| 			// If there's an EXDOS.INI then this disk should be able to boot itself. | 			// If there's an EXDOS.INI then this disk should be able to boot itself. | ||||||
| 			// If not but if there's only one .COM or .BAS, automatically load that. | 			// If not but if there's only one visible .COM or .BAS, automatically load | ||||||
| 			// Failing that, issue a :DIR and give the user a clue as to how to load. | 			// that. Otherwise, issue a :DIR. | ||||||
| 			const Storage::Disk::FAT::File *selected_file = nullptr; | 			using File = Storage::Disk::FAT::File; | ||||||
|  | 			const File *selected_file = nullptr; | ||||||
| 			bool has_exdos_ini = false; | 			bool has_exdos_ini = false; | ||||||
| 			bool did_pick_file = false; | 			bool did_pick_file = false; | ||||||
| 			for(const auto &file: (*volume).root_directory) { | 			for(const auto &file: (*volume).root_directory) { | ||||||
| @@ -59,7 +60,9 @@ Analyser::Static::TargetList Analyser::Static::Enterprise::GetTargets(const Medi | |||||||
| 					break; | 					break; | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
| 				if(insensitive_equal(file.extension, "com") || insensitive_equal(file.extension, "bas")) { | 				if(!(file.attributes & File::Attribute::Hidden) && | ||||||
|  | 					(insensitive_equal(file.extension, "com") || insensitive_equal(file.extension, "bas")) | ||||||
|  | 				) { | ||||||
| 					did_pick_file = !selected_file; | 					did_pick_file = !selected_file; | ||||||
| 					selected_file = &file; | 					selected_file = &file; | ||||||
| 				} | 				} | ||||||
|   | |||||||
| @@ -137,10 +137,15 @@ void DiskII::decide_clocking_preference() { | |||||||
|  |  | ||||||
| 	// If in read mode, clocking is either: | 	// If in read mode, clocking is either: | ||||||
| 	// | 	// | ||||||
| 	//	just-in-time, if drives are running or the shift register has any 1s in it or a flux event hasn't yet passed; or | 	//	just-in-time, if drives are running or the shift register has any 1s in it and shifting may occur, or a flux event hasn't yet passed; or | ||||||
| 	//	none, given that drives are not running, the shift register has already emptied and there's no flux about to be received. | 	//	none, given that drives are not running, the shift register has already emptied or stopped and there's no flux about to be received. | ||||||
| 	if(!(inputs_ & ~input_flux)) { | 	if(!(inputs_ & ~input_flux)) { | ||||||
| 		clocking_preference_ = (!motor_is_enabled_ && !shift_register_ && (inputs_&input_flux)) ? ClockingHint::Preference::None : ClockingHint::Preference::JustInTime; | 		const bool is_stuck_at_nop = | ||||||
|  | 			!flux_duration_ && state_machine_[(state_ & 0xf0) | inputs_ | ((shift_register_&0x80) >> 6)] == state_  && (state_ &0xf) == 0x8; | ||||||
|  |  | ||||||
|  | 		clocking_preference_ = | ||||||
|  | 			(drive_is_sleeping_[0] && drive_is_sleeping_[1] && (!shift_register_ || is_stuck_at_nop) && (inputs_&input_flux)) | ||||||
|  | 				? ClockingHint::Preference::None : ClockingHint::Preference::JustInTime; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// If in writing mode, clocking is real time. | 	// If in writing mode, clocking is real time. | ||||||
|   | |||||||
| @@ -1119,7 +1119,7 @@ template <bool has_fdc> class ConcreteMachine: | |||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		HalfCycles get_typer_frequency() const final { | 		HalfCycles get_typer_frequency() const final { | ||||||
| 			return Cycles(80'000);	// Perform one key transition per frame. | 			return Cycles(160'000);	// Perform one key transition per frame and a half. | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		// See header; sets a key as either pressed or released. | 		// See header; sets a key as either pressed or released. | ||||||
|   | |||||||
| @@ -40,7 +40,7 @@ struct KeyboardMapper: public MachineTypes::MappedKeyboardMachine::KeyboardMappe | |||||||
| struct CharacterMapper: public ::Utility::CharacterMapper { | struct CharacterMapper: public ::Utility::CharacterMapper { | ||||||
| 	const uint16_t *sequence_for_character(char character) const override; | 	const uint16_t *sequence_for_character(char character) const override; | ||||||
|  |  | ||||||
| 	bool needs_pause_after_reset_all_keys() const override	{ return false; } | 	bool needs_pause_after_reset_all_keys() const override	{ return true; } | ||||||
| 	bool needs_pause_after_key(uint16_t key) const override; | 	bool needs_pause_after_key(uint16_t key) const override; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -607,7 +607,7 @@ template <bool has_scsi_bus> class ConcreteMachine: | |||||||
| 		void set_activity_observer(Activity::Observer *observer) final { | 		void set_activity_observer(Activity::Observer *observer) final { | ||||||
| 			activity_observer_ = observer; | 			activity_observer_ = observer; | ||||||
| 			if(activity_observer_) { | 			if(activity_observer_) { | ||||||
| 				activity_observer_->register_led(caps_led); | 				activity_observer_->register_led(caps_led, Activity::Observer::LEDPresentation::Persistent); | ||||||
| 				activity_observer_->set_led_status(caps_led, caps_led_state_); | 				activity_observer_->set_led_status(caps_led, caps_led_state_); | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -303,7 +303,7 @@ class ConcreteMachine: | |||||||
| 							case 0x00:		// i.e. even ports less than 0x40. | 							case 0x00:		// i.e. even ports less than 0x40. | ||||||
| 								if(is_master_system(model_)) { | 								if(is_master_system(model_)) { | ||||||
| 									// TODO: Obey the RAM enable. | 									// TODO: Obey the RAM enable. | ||||||
| 									printf("Memory control: %02x\n", memory_control_); | 									LOG("Memory control: " << PADHEX(2) << memory_control_); | ||||||
| 									memory_control_ = *cycle.value; | 									memory_control_ = *cycle.value; | ||||||
| 									page_cartridge(); | 									page_cartridge(); | ||||||
| 								} | 								} | ||||||
|   | |||||||
| @@ -380,6 +380,34 @@ Description::Description(Name name) { | |||||||
| 		case Name::CPC6128Firmware:		*this = Description(name, "AmstradCPC", "the CPC 6128 firmware", "os6128.rom", 16*1024, 0x0219bb74u);				break; | 		case Name::CPC6128Firmware:		*this = Description(name, "AmstradCPC", "the CPC 6128 firmware", "os6128.rom", 16*1024, 0x0219bb74u);				break; | ||||||
| 		case Name::CPC6128BASIC:		*this = Description(name, "AmstradCPC", "the CPC 6128 BASIC ROM", "basic6128.rom", 16*1024, 0xca6af63du);			break; | 		case Name::CPC6128BASIC:		*this = Description(name, "AmstradCPC", "the CPC 6128 BASIC ROM", "basic6128.rom", 16*1024, 0xca6af63du);			break; | ||||||
|  |  | ||||||
|  | 		case Name::AmigaKickstart10: | ||||||
|  | 			*this = Description(name, "Amiga", "the Kickstart 1.0 ROM", "Kickstart-v1.0-1985-Commodore-A1000-NTSC.rom", 256*1024, 0x299790ffu); | ||||||
|  | 		break; | ||||||
|  | 		case Name::AmigaKickstart11: | ||||||
|  | 			*this = Description(name, "Amiga", "the Kickstart 1.1 ROM", "Kickstart-v1.1-rev31.34-1985-Commodore-A1000.NTSC.rom", 256*1024, 0xd060572au); | ||||||
|  | 		break; | ||||||
|  | 		case Name::AmigaKickstart12: | ||||||
|  | 			*this = Description(name, "Amiga", "the Kickstart 1.2 ROM", "Kickstart-v1.2-rev33.166-1986-Commodore-A1000.rom", 256*1024, 0x9ed783d0u); | ||||||
|  | 		break; | ||||||
|  | 		case Name::AmigaA500Kickstart13: | ||||||
|  | 			*this = Description(name, "Amiga", "the A500/A1000/A2000/CDTV Kickstart 1.3 ROM", "Kickstart-v1.3-rev34.5-1987-Commodore-A500-A1000-A2000-CDTV.rom", 256*1024, 0xc4f0f55fu); | ||||||
|  | 		break; | ||||||
|  | 		case Name::AmigaA3000Kickstart13: | ||||||
|  | 			*this = Description(name, "Amiga", "the A3000 Kickstart 1.3 ROM", "Kickstart-v1.3-rev34.5-1987-Commodore-A3000.rom", 256*1024, 0xe0f37258u); | ||||||
|  | 		break; | ||||||
|  | 		case Name::AmigaKickstart20: | ||||||
|  | 			*this = Description(name, "Amiga", "the Kickstart 2.0 ROM", "Kickstart-v2.0-rev36.143-1990-Commodore-A3000.rom", 512*1024, 0xb333d3c6u); | ||||||
|  | 		break; | ||||||
|  | 		case Name::AmigaA500PlusKickstart204: | ||||||
|  | 			*this = Description(name, "Amiga", "the A500+ Kickstart 2.04 ROM", "Kickstart-v2.04-rev37.175-1991-Commodore-A500plus.rom", 512*1024, 0xc3bdb240u); | ||||||
|  | 		break; | ||||||
|  | 		case Name::AmigaA600Kickstart205: | ||||||
|  | 			*this = Description(name, "Amiga", "the Kickstart 2.05 ROM", "Kickstart-v2.05-rev37.299-1991-Commodore-A600.rom", 512*1024, 0x83028fb5u); | ||||||
|  | 		break; | ||||||
|  | 		case Name::AmigaA500Kickstart31: | ||||||
|  | 			*this = Description(name, "Amiga", "the A500/A600/A2000 Kickstart 3.1 ROM", "Kickstart-v3.1-rev40.63-1993-Commodore-A500-A600-A2000.rom", 512*1024, 0xfc24ae0du); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
| 		case Name::AppleIIEnhancedE:	*this = Description(name, "AppleII", "the Enhanced Apple IIe ROM", "apple2e.rom", 32*1024, 0x65989942u);				break; | 		case Name::AppleIIEnhancedE:	*this = Description(name, "AppleII", "the Enhanced Apple IIe ROM", "apple2e.rom", 32*1024, 0x65989942u);				break; | ||||||
| 		case Name::AppleIIe:			*this = Description(name, "AppleII", "the Apple IIe ROM", "apple2eu.rom", 32*1024, 0xe12be18du);						break; | 		case Name::AppleIIe:			*this = Description(name, "AppleII", "the Apple IIe ROM", "apple2eu.rom", 32*1024, 0xe12be18du);						break; | ||||||
| 		case Name::AppleIIPlus:			*this = Description(name, "AppleII", "the Apple II+ ROM", "apple2.rom", 12*1024, 0xf66f9c26u);							break; | 		case Name::AppleIIPlus:			*this = Description(name, "AppleII", "the Apple II+ ROM", "apple2.rom", 12*1024, 0xf66f9c26u);							break; | ||||||
|   | |||||||
| @@ -31,6 +31,17 @@ enum Name { | |||||||
| 	PRESAdvancedPlus6, | 	PRESAdvancedPlus6, | ||||||
| 	Acorn1770DFS, | 	Acorn1770DFS, | ||||||
|  |  | ||||||
|  | 	// Amiga. | ||||||
|  | 	AmigaKickstart10, | ||||||
|  | 	AmigaKickstart11, | ||||||
|  | 	AmigaKickstart12, | ||||||
|  | 	AmigaA500Kickstart13, | ||||||
|  | 	AmigaA3000Kickstart13, | ||||||
|  | 	AmigaKickstart20, | ||||||
|  | 	AmigaA500PlusKickstart204, | ||||||
|  | 	AmigaA600Kickstart205, | ||||||
|  | 	AmigaA500Kickstart31, | ||||||
|  |  | ||||||
| 	// Amstrad CPC. | 	// Amstrad CPC. | ||||||
| 	AMSDOS, | 	AMSDOS, | ||||||
| 	CPC464Firmware,		CPC464BASIC, | 	CPC464Firmware,		CPC464BASIC, | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ | |||||||
| 		4B051C912669C90B00CA44E8 /* ROMCatalogue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B051C5826670A9300CA44E8 /* ROMCatalogue.cpp */; }; | 		4B051C912669C90B00CA44E8 /* ROMCatalogue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B051C5826670A9300CA44E8 /* ROMCatalogue.cpp */; }; | ||||||
| 		4B051C922669C90B00CA44E8 /* ROMCatalogue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B051C5826670A9300CA44E8 /* ROMCatalogue.cpp */; }; | 		4B051C922669C90B00CA44E8 /* ROMCatalogue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B051C5826670A9300CA44E8 /* ROMCatalogue.cpp */; }; | ||||||
| 		4B051C93266D9D6900CA44E8 /* ROMImages in Resources */ = {isa = PBXBuildFile; fileRef = 4BC9DF441D044FCA00F44158 /* ROMImages */; }; | 		4B051C93266D9D6900CA44E8 /* ROMImages in Resources */ = {isa = PBXBuildFile; fileRef = 4BC9DF441D044FCA00F44158 /* ROMImages */; }; | ||||||
| 		4B051C95266EF50200CA44E8 /* AppleIIOptionsPanel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B051C94266EF50200CA44E8 /* AppleIIOptionsPanel.swift */; }; | 		4B051C95266EF50200CA44E8 /* AppleIIController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B051C94266EF50200CA44E8 /* AppleIIController.swift */; }; | ||||||
| 		4B051C97266EF5F600CA44E8 /* CSAppleII.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B051C96266EF5F600CA44E8 /* CSAppleII.mm */; }; | 		4B051C97266EF5F600CA44E8 /* CSAppleII.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B051C96266EF5F600CA44E8 /* CSAppleII.mm */; }; | ||||||
| 		4B051CA22676F52200CA44E8 /* Enterprise.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B051CA12676F52200CA44E8 /* Enterprise.cpp */; }; | 		4B051CA22676F52200CA44E8 /* Enterprise.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B051CA12676F52200CA44E8 /* Enterprise.cpp */; }; | ||||||
| 		4B051CA32676F52200CA44E8 /* Enterprise.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B051CA12676F52200CA44E8 /* Enterprise.cpp */; }; | 		4B051CA32676F52200CA44E8 /* Enterprise.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B051CA12676F52200CA44E8 /* Enterprise.cpp */; }; | ||||||
| @@ -559,7 +559,7 @@ | |||||||
| 		4B8FE21B1DA19D5F0090D3CE /* Atari2600Options.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4B8FE2131DA19D5F0090D3CE /* Atari2600Options.xib */; }; | 		4B8FE21B1DA19D5F0090D3CE /* Atari2600Options.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4B8FE2131DA19D5F0090D3CE /* Atari2600Options.xib */; }; | ||||||
| 		4B8FE21C1DA19D5F0090D3CE /* MachineDocument.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4B8FE2151DA19D5F0090D3CE /* MachineDocument.xib */; }; | 		4B8FE21C1DA19D5F0090D3CE /* MachineDocument.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4B8FE2151DA19D5F0090D3CE /* MachineDocument.xib */; }; | ||||||
| 		4B8FE21D1DA19D5F0090D3CE /* QuickLoadCompositeOptions.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4B8FE2171DA19D5F0090D3CE /* QuickLoadCompositeOptions.xib */; }; | 		4B8FE21D1DA19D5F0090D3CE /* QuickLoadCompositeOptions.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4B8FE2171DA19D5F0090D3CE /* QuickLoadCompositeOptions.xib */; }; | ||||||
| 		4B8FE2221DA19FB20090D3CE /* MachinePanel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B8FE2211DA19FB20090D3CE /* MachinePanel.swift */; }; | 		4B8FE2221DA19FB20090D3CE /* MachineController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B8FE2211DA19FB20090D3CE /* MachineController.swift */; }; | ||||||
| 		4B8FE2271DA1DE2D0090D3CE /* NSBundle+DataResource.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B8FE2261DA1DE2D0090D3CE /* NSBundle+DataResource.m */; }; | 		4B8FE2271DA1DE2D0090D3CE /* NSBundle+DataResource.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B8FE2261DA1DE2D0090D3CE /* NSBundle+DataResource.m */; }; | ||||||
| 		4B90467422C6FADD000E2074 /* 68000BitwiseTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B90467322C6FADD000E2074 /* 68000BitwiseTests.mm */; }; | 		4B90467422C6FADD000E2074 /* 68000BitwiseTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B90467322C6FADD000E2074 /* 68000BitwiseTests.mm */; }; | ||||||
| 		4B90467622C6FD6E000E2074 /* 68000ArithmeticTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B90467522C6FD6E000E2074 /* 68000ArithmeticTests.mm */; }; | 		4B90467622C6FD6E000E2074 /* 68000ArithmeticTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B90467522C6FD6E000E2074 /* 68000ArithmeticTests.mm */; }; | ||||||
| @@ -588,7 +588,7 @@ | |||||||
| 		4BA91E1D216D85BA00F79557 /* MasterSystemVDPTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4BA91E1C216D85BA00F79557 /* MasterSystemVDPTests.mm */; }; | 		4BA91E1D216D85BA00F79557 /* MasterSystemVDPTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4BA91E1C216D85BA00F79557 /* MasterSystemVDPTests.mm */; }; | ||||||
| 		4BAD13441FF709C700FD114A /* MSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B0E61051FF34737002A9DBD /* MSX.cpp */; }; | 		4BAD13441FF709C700FD114A /* MSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B0E61051FF34737002A9DBD /* MSX.cpp */; }; | ||||||
| 		4BAE49582032881E004BE78E /* CSZX8081.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B14978E1EE4B4D200CE2596 /* CSZX8081.mm */; }; | 		4BAE49582032881E004BE78E /* CSZX8081.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B14978E1EE4B4D200CE2596 /* CSZX8081.mm */; }; | ||||||
| 		4BAE495920328897004BE78E /* ZX8081OptionsPanel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B95FA9C1F11893B0008E395 /* ZX8081OptionsPanel.swift */; }; | 		4BAE495920328897004BE78E /* ZX8081Controller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B95FA9C1F11893B0008E395 /* ZX8081Controller.swift */; }; | ||||||
| 		4BAF2B4E2004580C00480230 /* DMK.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BAF2B4C2004580C00480230 /* DMK.cpp */; }; | 		4BAF2B4E2004580C00480230 /* DMK.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BAF2B4C2004580C00480230 /* DMK.cpp */; }; | ||||||
| 		4BAF2B4F2004580C00480230 /* DMK.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BAF2B4C2004580C00480230 /* DMK.cpp */; }; | 		4BAF2B4F2004580C00480230 /* DMK.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BAF2B4C2004580C00480230 /* DMK.cpp */; }; | ||||||
| 		4BB0A65B2044FD3000FB3688 /* SN76489.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BB0A6592044FD3000FB3688 /* SN76489.cpp */; }; | 		4BB0A65B2044FD3000FB3688 /* SN76489.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BB0A6592044FD3000FB3688 /* SN76489.cpp */; }; | ||||||
| @@ -947,7 +947,7 @@ | |||||||
| 		4BDACBEC22FFA5D20045EF7E /* ncr5380.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BDACBEA22FFA5D20045EF7E /* ncr5380.cpp */; }; | 		4BDACBEC22FFA5D20045EF7E /* ncr5380.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BDACBEA22FFA5D20045EF7E /* ncr5380.cpp */; }; | ||||||
| 		4BDACBED22FFA5D20045EF7E /* ncr5380.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BDACBEA22FFA5D20045EF7E /* ncr5380.cpp */; }; | 		4BDACBED22FFA5D20045EF7E /* ncr5380.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BDACBEA22FFA5D20045EF7E /* ncr5380.cpp */; }; | ||||||
| 		4BDB61EB2032806E0048AF91 /* CSAtari2600.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B2A539A1D117D36003C6002 /* CSAtari2600.mm */; }; | 		4BDB61EB2032806E0048AF91 /* CSAtari2600.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B2A539A1D117D36003C6002 /* CSAtari2600.mm */; }; | ||||||
| 		4BDB61EC203285AE0048AF91 /* Atari2600OptionsPanel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B8FE21F1DA19D7C0090D3CE /* Atari2600OptionsPanel.swift */; }; | 		4BDB61EC203285AE0048AF91 /* Atari2600OptionsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B8FE21F1DA19D7C0090D3CE /* Atari2600OptionsController.swift */; }; | ||||||
| 		4BDDBA991EF3451200347E61 /* Z80MachineCycleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BDDBA981EF3451200347E61 /* Z80MachineCycleTests.swift */; }; | 		4BDDBA991EF3451200347E61 /* Z80MachineCycleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BDDBA981EF3451200347E61 /* Z80MachineCycleTests.swift */; }; | ||||||
| 		4BE0A3EE237BB170002AB46F /* ST.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BE0A3EC237BB170002AB46F /* ST.cpp */; }; | 		4BE0A3EE237BB170002AB46F /* ST.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BE0A3EC237BB170002AB46F /* ST.cpp */; }; | ||||||
| 		4BE0A3EF237BB170002AB46F /* ST.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BE0A3EC237BB170002AB46F /* ST.cpp */; }; | 		4BE0A3EF237BB170002AB46F /* ST.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BE0A3EC237BB170002AB46F /* ST.cpp */; }; | ||||||
| @@ -1040,7 +1040,7 @@ | |||||||
| 		4B04B65622A58CB40006AB58 /* Target.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Target.hpp; sourceTree = "<group>"; }; | 		4B04B65622A58CB40006AB58 /* Target.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Target.hpp; sourceTree = "<group>"; }; | ||||||
| 		4B051C5826670A9300CA44E8 /* ROMCatalogue.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ROMCatalogue.cpp; sourceTree = "<group>"; }; | 		4B051C5826670A9300CA44E8 /* ROMCatalogue.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ROMCatalogue.cpp; sourceTree = "<group>"; }; | ||||||
| 		4B051C5926670A9300CA44E8 /* ROMCatalogue.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = ROMCatalogue.hpp; sourceTree = "<group>"; }; | 		4B051C5926670A9300CA44E8 /* ROMCatalogue.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = ROMCatalogue.hpp; sourceTree = "<group>"; }; | ||||||
| 		4B051C94266EF50200CA44E8 /* AppleIIOptionsPanel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppleIIOptionsPanel.swift; sourceTree = "<group>"; }; | 		4B051C94266EF50200CA44E8 /* AppleIIController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppleIIController.swift; sourceTree = "<group>"; }; | ||||||
| 		4B051C96266EF5F600CA44E8 /* CSAppleII.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = CSAppleII.mm; sourceTree = "<group>"; }; | 		4B051C96266EF5F600CA44E8 /* CSAppleII.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = CSAppleII.mm; sourceTree = "<group>"; }; | ||||||
| 		4B051C98266EF60500CA44E8 /* CSAppleII.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CSAppleII.h; sourceTree = "<group>"; }; | 		4B051C98266EF60500CA44E8 /* CSAppleII.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CSAppleII.h; sourceTree = "<group>"; }; | ||||||
| 		4B051CA02676F52200CA44E8 /* Enterprise.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Enterprise.hpp; sourceTree = "<group>"; }; | 		4B051CA02676F52200CA44E8 /* Enterprise.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Enterprise.hpp; sourceTree = "<group>"; }; | ||||||
| @@ -1545,8 +1545,8 @@ | |||||||
| 		4B8FE2141DA19D5F0090D3CE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = "Clock Signal/Base.lproj/Atari2600Options.xib"; sourceTree = SOURCE_ROOT; }; | 		4B8FE2141DA19D5F0090D3CE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = "Clock Signal/Base.lproj/Atari2600Options.xib"; sourceTree = SOURCE_ROOT; }; | ||||||
| 		4B8FE2161DA19D5F0090D3CE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = "Clock Signal/Base.lproj/MachineDocument.xib"; sourceTree = SOURCE_ROOT; }; | 		4B8FE2161DA19D5F0090D3CE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = "Clock Signal/Base.lproj/MachineDocument.xib"; sourceTree = SOURCE_ROOT; }; | ||||||
| 		4B8FE2181DA19D5F0090D3CE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = "Clock Signal/Base.lproj/QuickLoadCompositeOptions.xib"; sourceTree = SOURCE_ROOT; }; | 		4B8FE2181DA19D5F0090D3CE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = "Clock Signal/Base.lproj/QuickLoadCompositeOptions.xib"; sourceTree = SOURCE_ROOT; }; | ||||||
| 		4B8FE21F1DA19D7C0090D3CE /* Atari2600OptionsPanel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Atari2600OptionsPanel.swift; sourceTree = "<group>"; }; | 		4B8FE21F1DA19D7C0090D3CE /* Atari2600OptionsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Atari2600OptionsController.swift; sourceTree = "<group>"; }; | ||||||
| 		4B8FE2211DA19FB20090D3CE /* MachinePanel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MachinePanel.swift; sourceTree = "<group>"; }; | 		4B8FE2211DA19FB20090D3CE /* MachineController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MachineController.swift; sourceTree = "<group>"; }; | ||||||
| 		4B8FE2251DA1DE2D0090D3CE /* NSBundle+DataResource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSBundle+DataResource.h"; sourceTree = "<group>"; }; | 		4B8FE2251DA1DE2D0090D3CE /* NSBundle+DataResource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSBundle+DataResource.h"; sourceTree = "<group>"; }; | ||||||
| 		4B8FE2261DA1DE2D0090D3CE /* NSBundle+DataResource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSBundle+DataResource.m"; sourceTree = "<group>"; }; | 		4B8FE2261DA1DE2D0090D3CE /* NSBundle+DataResource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSBundle+DataResource.m"; sourceTree = "<group>"; }; | ||||||
| 		4B90467222C6FA31000E2074 /* TestRunner68000.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = TestRunner68000.hpp; sourceTree = "<group>"; }; | 		4B90467222C6FA31000E2074 /* TestRunner68000.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = TestRunner68000.hpp; sourceTree = "<group>"; }; | ||||||
| @@ -1563,7 +1563,7 @@ | |||||||
| 		4B92EAC91B7C112B00246143 /* 6502TimingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 6502TimingTests.swift; sourceTree = "<group>"; }; | 		4B92EAC91B7C112B00246143 /* 6502TimingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 6502TimingTests.swift; sourceTree = "<group>"; }; | ||||||
| 		4B9378E222A199C600973513 /* Audio.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Audio.cpp; sourceTree = "<group>"; }; | 		4B9378E222A199C600973513 /* Audio.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Audio.cpp; sourceTree = "<group>"; }; | ||||||
| 		4B9378E322A199C600973513 /* Audio.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Audio.hpp; sourceTree = "<group>"; }; | 		4B9378E322A199C600973513 /* Audio.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Audio.hpp; sourceTree = "<group>"; }; | ||||||
| 		4B95FA9C1F11893B0008E395 /* ZX8081OptionsPanel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZX8081OptionsPanel.swift; sourceTree = "<group>"; }; | 		4B95FA9C1F11893B0008E395 /* ZX8081Controller.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZX8081Controller.swift; sourceTree = "<group>"; }; | ||||||
| 		4B961408222760E0001A7BF2 /* Screenshot.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Screenshot.hpp; sourceTree = "<group>"; }; | 		4B961408222760E0001A7BF2 /* Screenshot.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Screenshot.hpp; sourceTree = "<group>"; }; | ||||||
| 		4B96F7CB263E30B00092AEE1 /* RawSectorDump.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = RawSectorDump.hpp; sourceTree = "<group>"; }; | 		4B96F7CB263E30B00092AEE1 /* RawSectorDump.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = RawSectorDump.hpp; sourceTree = "<group>"; }; | ||||||
| 		4B96F7CC263E33B10092AEE1 /* DSK.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = DSK.cpp; sourceTree = "<group>"; }; | 		4B96F7CC263E33B10092AEE1 /* DSK.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = DSK.cpp; sourceTree = "<group>"; }; | ||||||
| @@ -2846,11 +2846,11 @@ | |||||||
| 		4B55CE551C3B7D360093A61B /* Documents */ = { | 		4B55CE551C3B7D360093A61B /* Documents */ = { | ||||||
| 			isa = PBXGroup; | 			isa = PBXGroup; | ||||||
| 			children = ( | 			children = ( | ||||||
| 				4B051C94266EF50200CA44E8 /* AppleIIOptionsPanel.swift */, | 				4B051C94266EF50200CA44E8 /* AppleIIController.swift */, | ||||||
| 				4B8FE21F1DA19D7C0090D3CE /* Atari2600OptionsPanel.swift */, | 				4B8FE21F1DA19D7C0090D3CE /* Atari2600OptionsController.swift */, | ||||||
| 				4B55CE5E1C3B7D960093A61B /* MachineDocument.swift */, | 				4B55CE5E1C3B7D960093A61B /* MachineDocument.swift */, | ||||||
| 				4B8FE2211DA19FB20090D3CE /* MachinePanel.swift */, | 				4B8FE2211DA19FB20090D3CE /* MachineController.swift */, | ||||||
| 				4B95FA9C1F11893B0008E395 /* ZX8081OptionsPanel.swift */, | 				4B95FA9C1F11893B0008E395 /* ZX8081Controller.swift */, | ||||||
| 				4B08A56720D72BEF0016CE5A /* Activity.xib */, | 				4B08A56720D72BEF0016CE5A /* Activity.xib */, | ||||||
| 				4BC5FC2E20CDDDEE00410AA0 /* AppleIIOptions.xib */, | 				4BC5FC2E20CDDDEE00410AA0 /* AppleIIOptions.xib */, | ||||||
| 				4B8FE2131DA19D5F0090D3CE /* Atari2600Options.xib */, | 				4B8FE2131DA19D5F0090D3CE /* Atari2600Options.xib */, | ||||||
| @@ -5489,7 +5489,7 @@ | |||||||
| 				4B3FE75E1F3CF68B00448EE4 /* CPM.cpp in Sources */, | 				4B3FE75E1F3CF68B00448EE4 /* CPM.cpp in Sources */, | ||||||
| 				4B2BFDB21DAEF5FF001A68B8 /* Video.cpp in Sources */, | 				4B2BFDB21DAEF5FF001A68B8 /* Video.cpp in Sources */, | ||||||
| 				4BEDA3BF25B25563000C2DBD /* Decoder.cpp in Sources */, | 				4BEDA3BF25B25563000C2DBD /* Decoder.cpp in Sources */, | ||||||
| 				4B051C95266EF50200CA44E8 /* AppleIIOptionsPanel.swift in Sources */, | 				4B051C95266EF50200CA44E8 /* AppleIIController.swift in Sources */, | ||||||
| 				4B4DC82B1D2C27A4003C5BF8 /* SerialBus.cpp in Sources */, | 				4B4DC82B1D2C27A4003C5BF8 /* SerialBus.cpp in Sources */, | ||||||
| 				4BE8EB6625C750B50040BC40 /* DAT.cpp in Sources */, | 				4BE8EB6625C750B50040BC40 /* DAT.cpp in Sources */, | ||||||
| 				4BBFFEE61F7B27F1005F3FEB /* TrackSerialiser.cpp in Sources */, | 				4BBFFEE61F7B27F1005F3FEB /* TrackSerialiser.cpp in Sources */, | ||||||
| @@ -5502,13 +5502,13 @@ | |||||||
| 				4BC890D3230F86020025A55A /* DirectAccessDevice.cpp in Sources */, | 				4BC890D3230F86020025A55A /* DirectAccessDevice.cpp in Sources */, | ||||||
| 				4B7BA03723CEB86000B98D9E /* BD500.cpp in Sources */, | 				4B7BA03723CEB86000B98D9E /* BD500.cpp in Sources */, | ||||||
| 				4B38F3481F2EC11D00D9235D /* AmstradCPC.cpp in Sources */, | 				4B38F3481F2EC11D00D9235D /* AmstradCPC.cpp in Sources */, | ||||||
| 				4B8FE2221DA19FB20090D3CE /* MachinePanel.swift in Sources */, | 				4B8FE2221DA19FB20090D3CE /* MachineController.swift in Sources */, | ||||||
| 				4B4518A41F75FD1C00926311 /* OricMFMDSK.cpp in Sources */, | 				4B4518A41F75FD1C00926311 /* OricMFMDSK.cpp in Sources */, | ||||||
| 				4B4B1A3C200198CA00A0F866 /* KonamiSCC.cpp in Sources */, | 				4B4B1A3C200198CA00A0F866 /* KonamiSCC.cpp in Sources */, | ||||||
| 				4BB0A65B2044FD3000FB3688 /* SN76489.cpp in Sources */, | 				4BB0A65B2044FD3000FB3688 /* SN76489.cpp in Sources */, | ||||||
| 				4B80CD6F2568A82C00176FCC /* DiskIIDrive.cpp in Sources */, | 				4B80CD6F2568A82C00176FCC /* DiskIIDrive.cpp in Sources */, | ||||||
| 				4B894532201967B4007DE474 /* 6502.cpp in Sources */, | 				4B894532201967B4007DE474 /* 6502.cpp in Sources */, | ||||||
| 				4BDB61EC203285AE0048AF91 /* Atari2600OptionsPanel.swift in Sources */, | 				4BDB61EC203285AE0048AF91 /* Atari2600OptionsController.swift in Sources */, | ||||||
| 				4B2E86E225DC95150024F1E9 /* Joystick.cpp in Sources */, | 				4B2E86E225DC95150024F1E9 /* Joystick.cpp in Sources */, | ||||||
| 				4BBB70A8202014E2002FE009 /* MultiProducer.cpp in Sources */, | 				4BBB70A8202014E2002FE009 /* MultiProducer.cpp in Sources */, | ||||||
| 				4B8805F71DCFF6C9003085B1 /* Commodore.cpp in Sources */, | 				4B8805F71DCFF6C9003085B1 /* Commodore.cpp in Sources */, | ||||||
| @@ -5544,7 +5544,7 @@ | |||||||
| 				4B302184208A550100773308 /* DiskII.cpp in Sources */, | 				4B302184208A550100773308 /* DiskII.cpp in Sources */, | ||||||
| 				4BEA52631DF339D7007E74F2 /* SoundGenerator.cpp in Sources */, | 				4BEA52631DF339D7007E74F2 /* SoundGenerator.cpp in Sources */, | ||||||
| 				4BD67DD0209BF27B00AB2146 /* Encoder.cpp in Sources */, | 				4BD67DD0209BF27B00AB2146 /* Encoder.cpp in Sources */, | ||||||
| 				4BAE495920328897004BE78E /* ZX8081OptionsPanel.swift in Sources */, | 				4BAE495920328897004BE78E /* ZX8081Controller.swift in Sources */, | ||||||
| 				4B89451A201967B4007DE474 /* ConfidenceSummary.cpp in Sources */, | 				4B89451A201967B4007DE474 /* ConfidenceSummary.cpp in Sources */, | ||||||
| 				4BE0A3EE237BB170002AB46F /* ST.cpp in Sources */, | 				4BE0A3EE237BB170002AB46F /* ST.cpp in Sources */, | ||||||
| 				4B54C0C51F8D91D90050900F /* Keyboard.cpp in Sources */, | 				4B54C0C51F8D91D90050900F /* Keyboard.cpp in Sources */, | ||||||
|   | |||||||
| @@ -1,37 +1,30 @@ | |||||||
| <?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||||||
| <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14113" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> | <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="18122" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> | ||||||
|     <dependencies> |     <dependencies> | ||||||
|         <deployment identifier="macosx"/> |         <deployment identifier="macosx"/> | ||||||
|         <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14113"/> |         <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="18122"/> | ||||||
|         <capability name="Aspect ratio constraints" minToolsVersion="5.1"/> |  | ||||||
|         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> |         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | ||||||
|     </dependencies> |     </dependencies> | ||||||
|     <objects> |     <objects> | ||||||
|         <customObject id="-2" userLabel="File's Owner" customClass="MachineDocument" customModule="Clock_Signal" customModuleProvider="target"> |         <customObject id="-2" userLabel="File's Owner" customClass="MachineDocument" customModule="Clock_Signal" customModuleProvider="target"> | ||||||
|             <connections> |             <connections> | ||||||
|                 <outlet property="activityPanel" destination="ZW7-Bw-4RP" id="GRG-Q6-RQU"/> |                 <outlet property="activityView" destination="tpZ-0B-QQu" id="afo-Oq-Nyl"/> | ||||||
|             </connections> |             </connections> | ||||||
|         </customObject> |         </customObject> | ||||||
|         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> |         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> | ||||||
|         <customObject id="-3" userLabel="Application" customClass="NSObject"/> |         <customObject id="-3" userLabel="Application" customClass="NSObject"/> | ||||||
|         <window title="Activity" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" frameAutosaveName="" animationBehavior="default" id="ZW7-Bw-4RP" customClass="NSPanel"> |         <visualEffectView hidden="YES" wantsLayer="YES" appearanceType="vibrantDark" blendingMode="withinWindow" material="HUDWindow" state="followsWindowActiveState" translatesAutoresizingMaskIntoConstraints="NO" id="tpZ-0B-QQu"> | ||||||
|             <windowStyleMask key="styleMask" titled="YES" closable="YES" utility="YES" nonactivatingPanel="YES" HUD="YES"/> |  | ||||||
|             <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> |  | ||||||
|             <rect key="contentRect" x="300" y="76" width="200" height="131"/> |  | ||||||
|             <rect key="screenRect" x="0.0" y="0.0" width="1440" height="900"/> |  | ||||||
|             <view key="contentView" id="tpZ-0B-QQu"> |  | ||||||
|             <rect key="frame" x="0.0" y="0.0" width="200" height="131"/> |             <rect key="frame" x="0.0" y="0.0" width="200" height="131"/> | ||||||
|                 <autoresizingMask key="autoresizingMask"/> |  | ||||||
|             <subviews> |             <subviews> | ||||||
|                 <levelIndicator verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ySY-ir-hzb" userLabel="First indicator"> |                 <levelIndicator verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ySY-ir-hzb" userLabel="First indicator"> | ||||||
|                         <rect key="frame" x="20" y="95" width="17" height="16"/> |                     <rect key="frame" x="8" y="105" width="16" height="18"/> | ||||||
|                     <constraints> |                     <constraints> | ||||||
|                         <constraint firstAttribute="width" secondItem="ySY-ir-hzb" secondAttribute="height" multiplier="1:1" id="UX0-hT-7Td"/> |                         <constraint firstAttribute="width" secondItem="ySY-ir-hzb" secondAttribute="height" multiplier="1:1" id="UX0-hT-7Td"/> | ||||||
|                     </constraints> |                     </constraints> | ||||||
|                     <levelIndicatorCell key="cell" alignment="left" maxValue="1" warningValue="2" criticalValue="2" levelIndicatorStyle="continuousCapacity" id="DhQ-Di-tRT"/> |                     <levelIndicatorCell key="cell" alignment="left" maxValue="1" warningValue="2" criticalValue="2" levelIndicatorStyle="continuousCapacity" id="DhQ-Di-tRT"/> | ||||||
|                 </levelIndicator> |                 </levelIndicator> | ||||||
|                 <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Tah-UQ-vdf"> |                 <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Tah-UQ-vdf"> | ||||||
|                         <rect key="frame" x="44" y="94" width="59" height="17"/> |                     <rect key="frame" x="30" y="107" width="59" height="16"/> | ||||||
|                     <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Activity 1" id="a5P-Ci-RzC"> |                     <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Activity 1" id="a5P-Ci-RzC"> | ||||||
|                         <font key="font" metaFont="system"/> |                         <font key="font" metaFont="system"/> | ||||||
|                         <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> |                         <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> | ||||||
| @@ -39,14 +32,14 @@ | |||||||
|                     </textFieldCell> |                     </textFieldCell> | ||||||
|                 </textField> |                 </textField> | ||||||
|                 <levelIndicator verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ncQ-wN-C61" userLabel="Second indicator"> |                 <levelIndicator verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ncQ-wN-C61" userLabel="Second indicator"> | ||||||
|                         <rect key="frame" x="20" y="70" width="17" height="16"/> |                     <rect key="frame" x="8" y="81" width="16" height="18"/> | ||||||
|                     <constraints> |                     <constraints> | ||||||
|                         <constraint firstAttribute="width" secondItem="ncQ-wN-C61" secondAttribute="height" multiplier="1:1" id="176-v3-mVW"/> |                         <constraint firstAttribute="width" secondItem="ncQ-wN-C61" secondAttribute="height" multiplier="1:1" id="176-v3-mVW"/> | ||||||
|                     </constraints> |                     </constraints> | ||||||
|                     <levelIndicatorCell key="cell" alignment="left" maxValue="1" warningValue="2" criticalValue="2" levelIndicatorStyle="continuousCapacity" id="jlb-bk-FPd"/> |                     <levelIndicatorCell key="cell" alignment="left" maxValue="1" warningValue="2" criticalValue="2" levelIndicatorStyle="continuousCapacity" id="jlb-bk-FPd"/> | ||||||
|                 </levelIndicator> |                 </levelIndicator> | ||||||
|                 <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="14O-Lq-Npx"> |                 <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="14O-Lq-Npx"> | ||||||
|                         <rect key="frame" x="44" y="69" width="61" height="17"/> |                     <rect key="frame" x="30" y="83" width="61" height="16"/> | ||||||
|                     <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Activity 2" id="NE1-CO-pGI"> |                     <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Activity 2" id="NE1-CO-pGI"> | ||||||
|                         <font key="font" metaFont="system"/> |                         <font key="font" metaFont="system"/> | ||||||
|                         <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> |                         <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> | ||||||
| @@ -54,14 +47,14 @@ | |||||||
|                     </textFieldCell> |                     </textFieldCell> | ||||||
|                 </textField> |                 </textField> | ||||||
|                 <levelIndicator verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0rV-Th-Zwt" userLabel="Third indicator"> |                 <levelIndicator verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0rV-Th-Zwt" userLabel="Third indicator"> | ||||||
|                         <rect key="frame" x="20" y="45" width="17" height="16"/> |                     <rect key="frame" x="8" y="57" width="16" height="18"/> | ||||||
|                     <constraints> |                     <constraints> | ||||||
|                         <constraint firstAttribute="width" secondItem="0rV-Th-Zwt" secondAttribute="height" multiplier="1:1" id="Ai8-b3-Nn5"/> |                         <constraint firstAttribute="width" secondItem="0rV-Th-Zwt" secondAttribute="height" multiplier="1:1" id="Ai8-b3-Nn5"/> | ||||||
|                     </constraints> |                     </constraints> | ||||||
|                     <levelIndicatorCell key="cell" alignment="left" maxValue="1" warningValue="2" criticalValue="2" levelIndicatorStyle="continuousCapacity" id="CJy-Jn-eCL"/> |                     <levelIndicatorCell key="cell" alignment="left" maxValue="1" warningValue="2" criticalValue="2" levelIndicatorStyle="continuousCapacity" id="CJy-Jn-eCL"/> | ||||||
|                 </levelIndicator> |                 </levelIndicator> | ||||||
|                 <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Acy-tT-OFH"> |                 <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Acy-tT-OFH"> | ||||||
|                         <rect key="frame" x="44" y="44" width="61" height="17"/> |                     <rect key="frame" x="30" y="59" width="61" height="16"/> | ||||||
|                     <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Activity 3" id="FSR-y6-7WE"> |                     <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Activity 3" id="FSR-y6-7WE"> | ||||||
|                         <font key="font" metaFont="system"/> |                         <font key="font" metaFont="system"/> | ||||||
|                         <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> |                         <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> | ||||||
| @@ -69,14 +62,14 @@ | |||||||
|                     </textFieldCell> |                     </textFieldCell> | ||||||
|                 </textField> |                 </textField> | ||||||
|                 <levelIndicator verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="bvH-EJ-TYb" userLabel="Fourth indicator"> |                 <levelIndicator verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="bvH-EJ-TYb" userLabel="Fourth indicator"> | ||||||
|                         <rect key="frame" x="20" y="20" width="17" height="16"/> |                     <rect key="frame" x="8" y="33" width="16" height="18"/> | ||||||
|                     <constraints> |                     <constraints> | ||||||
|                         <constraint firstAttribute="width" secondItem="bvH-EJ-TYb" secondAttribute="height" multiplier="1:1" id="cKc-q1-2Q4"/> |                         <constraint firstAttribute="width" secondItem="bvH-EJ-TYb" secondAttribute="height" multiplier="1:1" id="cKc-q1-2Q4"/> | ||||||
|                     </constraints> |                     </constraints> | ||||||
|                     <levelIndicatorCell key="cell" alignment="left" maxValue="1" warningValue="2" criticalValue="2" levelIndicatorStyle="continuousCapacity" id="eoN-hl-30l"/> |                     <levelIndicatorCell key="cell" alignment="left" maxValue="1" warningValue="2" criticalValue="2" levelIndicatorStyle="continuousCapacity" id="eoN-hl-30l"/> | ||||||
|                 </levelIndicator> |                 </levelIndicator> | ||||||
|                 <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="R0g-Oa-VB5"> |                 <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="R0g-Oa-VB5"> | ||||||
|                         <rect key="frame" x="44" y="19" width="62" height="17"/> |                     <rect key="frame" x="30" y="35" width="62" height="16"/> | ||||||
|                     <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Activity 4" id="aGr-cd-jC0"> |                     <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Activity 4" id="aGr-cd-jC0"> | ||||||
|                         <font key="font" metaFont="system"/> |                         <font key="font" metaFont="system"/> | ||||||
|                         <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> |                         <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> | ||||||
| @@ -86,28 +79,27 @@ | |||||||
|             </subviews> |             </subviews> | ||||||
|             <constraints> |             <constraints> | ||||||
|                 <constraint firstItem="14O-Lq-Npx" firstAttribute="centerY" secondItem="ncQ-wN-C61" secondAttribute="centerY" id="0Ht-U2-sPg"/> |                 <constraint firstItem="14O-Lq-Npx" firstAttribute="centerY" secondItem="ncQ-wN-C61" secondAttribute="centerY" id="0Ht-U2-sPg"/> | ||||||
|                     <constraint firstItem="bvH-EJ-TYb" firstAttribute="top" secondItem="0rV-Th-Zwt" secondAttribute="bottom" constant="9" id="0xw-qA-6vP"/> |                 <constraint firstItem="bvH-EJ-TYb" firstAttribute="top" secondItem="0rV-Th-Zwt" secondAttribute="bottom" constant="8" symbolic="YES" id="0xw-qA-6vP"/> | ||||||
|                     <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="14O-Lq-Npx" secondAttribute="trailing" constant="20" id="5eo-XI-a3W"/> |                 <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="14O-Lq-Npx" secondAttribute="trailing" constant="8" id="5eo-XI-a3W"/> | ||||||
|                 <constraint firstItem="Tah-UQ-vdf" firstAttribute="centerY" secondItem="ySY-ir-hzb" secondAttribute="centerY" id="6Hn-ts-mTi"/> |                 <constraint firstItem="Tah-UQ-vdf" firstAttribute="centerY" secondItem="ySY-ir-hzb" secondAttribute="centerY" id="6Hn-ts-mTi"/> | ||||||
|                     <constraint firstItem="R0g-Oa-VB5" firstAttribute="leading" secondItem="bvH-EJ-TYb" secondAttribute="trailing" constant="10" id="Dgy-JI-nA1"/> |                 <constraint firstItem="R0g-Oa-VB5" firstAttribute="leading" secondItem="bvH-EJ-TYb" secondAttribute="trailing" constant="8" symbolic="YES" id="Dgy-JI-nA1"/> | ||||||
|                 <constraint firstItem="R0g-Oa-VB5" firstAttribute="centerY" secondItem="bvH-EJ-TYb" secondAttribute="centerY" id="Gfq-mB-Y1z"/> |                 <constraint firstItem="R0g-Oa-VB5" firstAttribute="centerY" secondItem="bvH-EJ-TYb" secondAttribute="centerY" id="Gfq-mB-Y1z"/> | ||||||
|                 <constraint firstItem="Acy-tT-OFH" firstAttribute="centerY" secondItem="0rV-Th-Zwt" secondAttribute="centerY" id="ImF-rK-oOr"/> |                 <constraint firstItem="Acy-tT-OFH" firstAttribute="centerY" secondItem="0rV-Th-Zwt" secondAttribute="centerY" id="ImF-rK-oOr"/> | ||||||
|                     <constraint firstItem="Acy-tT-OFH" firstAttribute="leading" secondItem="0rV-Th-Zwt" secondAttribute="trailing" constant="10" id="JSU-pZ-l9Q"/> |                 <constraint firstItem="Acy-tT-OFH" firstAttribute="leading" secondItem="0rV-Th-Zwt" secondAttribute="trailing" constant="8" symbolic="YES" id="JSU-pZ-l9Q"/> | ||||||
|                     <constraint firstItem="ySY-ir-hzb" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="20" id="KMh-EO-rxE"/> |                 <constraint firstItem="ySY-ir-hzb" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="8" id="KMh-EO-rxE"/> | ||||||
|                     <constraint firstItem="0rV-Th-Zwt" firstAttribute="top" secondItem="ncQ-wN-C61" secondAttribute="bottom" constant="9" id="Q2g-yM-nlJ"/> |                 <constraint firstItem="0rV-Th-Zwt" firstAttribute="top" secondItem="ncQ-wN-C61" secondAttribute="bottom" constant="8" symbolic="YES" id="Q2g-yM-nlJ"/> | ||||||
|                     <constraint firstItem="ncQ-wN-C61" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="20" id="QUI-Hc-Bcl"/> |                 <constraint firstItem="ncQ-wN-C61" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="8" id="QUI-Hc-Bcl"/> | ||||||
|                     <constraint firstItem="0rV-Th-Zwt" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="20" id="bKh-4L-mqj"/> |                 <constraint firstItem="0rV-Th-Zwt" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="8" id="bKh-4L-mqj"/> | ||||||
|                     <constraint firstItem="bvH-EJ-TYb" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="20" id="cPA-Ls-fLj"/> |                 <constraint firstItem="bvH-EJ-TYb" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="8" id="cPA-Ls-fLj"/> | ||||||
|                     <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="Tah-UQ-vdf" secondAttribute="trailing" constant="20" id="igX-7U-TeE"/> |                 <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="Tah-UQ-vdf" secondAttribute="trailing" constant="8" id="igX-7U-TeE"/> | ||||||
|                     <constraint firstItem="14O-Lq-Npx" firstAttribute="leading" secondItem="ncQ-wN-C61" secondAttribute="trailing" constant="10" id="jjP-qH-Pqg"/> |                 <constraint firstItem="14O-Lq-Npx" firstAttribute="leading" secondItem="ncQ-wN-C61" secondAttribute="trailing" constant="8" symbolic="YES" id="jjP-qH-Pqg"/> | ||||||
|                     <constraint firstItem="Tah-UQ-vdf" firstAttribute="leading" secondItem="ySY-ir-hzb" secondAttribute="trailing" constant="10" id="lux-Nz-K7E"/> |                 <constraint firstItem="Tah-UQ-vdf" firstAttribute="leading" secondItem="ySY-ir-hzb" secondAttribute="trailing" constant="8" symbolic="YES" id="lux-Nz-K7E"/> | ||||||
|                     <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="Acy-tT-OFH" secondAttribute="trailing" constant="20" id="mEe-VT-dNr"/> |                 <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="Acy-tT-OFH" secondAttribute="trailing" constant="8" id="mEe-VT-dNr"/> | ||||||
|                     <constraint firstItem="ncQ-wN-C61" firstAttribute="top" secondItem="ySY-ir-hzb" secondAttribute="bottom" constant="9" id="mSc-jj-amw"/> |                 <constraint firstItem="ncQ-wN-C61" firstAttribute="top" secondItem="ySY-ir-hzb" secondAttribute="bottom" constant="8" symbolic="YES" id="mSc-jj-amw"/> | ||||||
|                     <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="R0g-Oa-VB5" secondAttribute="trailing" constant="20" id="sR8-Ph-suC"/> |                 <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="R0g-Oa-VB5" secondAttribute="trailing" constant="8" id="sR8-Ph-suC"/> | ||||||
|                     <constraint firstItem="ySY-ir-hzb" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="20" id="wbj-48-DYq"/> |                 <constraint firstItem="ySY-ir-hzb" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="8" id="wbj-48-DYq"/> | ||||||
|             </constraints> |             </constraints> | ||||||
|             </view> |             <point key="canvasLocation" x="57" y="80"/> | ||||||
|             <point key="canvasLocation" x="84" y="115"/> |         </visualEffectView> | ||||||
|         </window> |  | ||||||
|     </objects> |     </objects> | ||||||
| </document> | </document> | ||||||
|   | |||||||
| @@ -8,32 +8,27 @@ | |||||||
|     <objects> |     <objects> | ||||||
|         <customObject id="-2" userLabel="File's Owner" customClass="MachineDocument" customModule="Clock_Signal" customModuleProvider="target"> |         <customObject id="-2" userLabel="File's Owner" customClass="MachineDocument" customModule="Clock_Signal" customModuleProvider="target"> | ||||||
|             <connections> |             <connections> | ||||||
|                 <outlet property="optionsPanel" destination="ZW7-Bw-4RP" id="JpE-wG-zRR"/> |                 <outlet property="optionsController" destination="9AQ-Iv-Pbm" id="fMh-25-smM"/> | ||||||
|  |                 <outlet property="optionsView" destination="tpZ-0B-QQu" id="n0E-oR-8fl"/> | ||||||
|             </connections> |             </connections> | ||||||
|         </customObject> |         </customObject> | ||||||
|         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> |         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> | ||||||
|         <customObject id="-3" userLabel="Application" customClass="NSObject"/> |         <customObject id="-3" userLabel="Application" customClass="NSObject"/> | ||||||
|         <window title="Options" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="" animationBehavior="default" id="ZW7-Bw-4RP" customClass="AppleIIOptionsPanel" customModule="Clock_Signal" customModuleProvider="target"> |         <visualEffectView hidden="YES" wantsLayer="YES" appearanceType="vibrantDark" blendingMode="withinWindow" material="HUDWindow" state="followsWindowActiveState" translatesAutoresizingMaskIntoConstraints="NO" id="tpZ-0B-QQu"> | ||||||
|             <windowStyleMask key="styleMask" titled="YES" closable="YES" utility="YES" nonactivatingPanel="YES" HUD="YES"/> |             <rect key="frame" x="0.0" y="0.0" width="200" height="68"/> | ||||||
|             <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> |  | ||||||
|             <rect key="contentRect" x="80" y="150" width="200" height="159"/> |  | ||||||
|             <rect key="screenRect" x="0.0" y="0.0" width="2560" height="1440"/> |  | ||||||
|             <view key="contentView" id="tpZ-0B-QQu"> |  | ||||||
|                 <rect key="frame" x="0.0" y="0.0" width="200" height="84"/> |  | ||||||
|                 <autoresizingMask key="autoresizingMask"/> |  | ||||||
|             <subviews> |             <subviews> | ||||||
|                 <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="kDb-7g-cVx"> |                 <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="kDb-7g-cVx"> | ||||||
|                         <rect key="frame" x="18" y="47" width="162" height="18"/> |                     <rect key="frame" x="10" y="39" width="178" height="18"/> | ||||||
|                     <buttonCell key="cell" type="check" title="Use Square Pixels" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="h9q-Wb-em8"> |                     <buttonCell key="cell" type="check" title="Use Square Pixels" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="h9q-Wb-em8"> | ||||||
|                         <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> |                         <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> | ||||||
|                         <font key="font" metaFont="system"/> |                         <font key="font" metaFont="system"/> | ||||||
|                     </buttonCell> |                     </buttonCell> | ||||||
|                     <connections> |                     <connections> | ||||||
|                             <action selector="optionDidChange:" target="ZW7-Bw-4RP" id="pNS-aK-0no"/> |                         <action selector="optionDidChange:" target="9AQ-Iv-Pbm" id="5ef-un-Yck"/> | ||||||
|                     </connections> |                     </connections> | ||||||
|                 </button> |                 </button> | ||||||
|                     <popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ex3-VM-58z"> |                 <popUpButton wantsLayer="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ex3-VM-58z"> | ||||||
|                         <rect key="frame" x="17" y="16" width="167" height="25"/> |                     <rect key="frame" x="9" y="8" width="183" height="25"/> | ||||||
|                     <popUpButtonCell key="cell" type="push" title="Colour" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" tag="1" imageScaling="proportionallyDown" inset="2" selectedItem="gOu-dv-tre" id="u3N-Je-c2L"> |                     <popUpButtonCell key="cell" type="push" title="Colour" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" tag="1" imageScaling="proportionallyDown" inset="2" selectedItem="gOu-dv-tre" id="u3N-Je-c2L"> | ||||||
|                         <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> |                         <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> | ||||||
|                         <font key="font" metaFont="menu"/> |                         <font key="font" metaFont="menu"/> | ||||||
| @@ -45,25 +40,26 @@ | |||||||
|                         </menu> |                         </menu> | ||||||
|                     </popUpButtonCell> |                     </popUpButtonCell> | ||||||
|                     <connections> |                     <connections> | ||||||
|                             <action selector="setDisplayType:" target="ZW7-Bw-4RP" id="f7A-2O-wR8"/> |                         <action selector="setDisplayType:" target="9AQ-Iv-Pbm" id="Bad-uY-0fe"/> | ||||||
|                     </connections> |                     </connections> | ||||||
|                 </popUpButton> |                 </popUpButton> | ||||||
|             </subviews> |             </subviews> | ||||||
|             <constraints> |             <constraints> | ||||||
|                     <constraint firstAttribute="bottom" secondItem="ex3-VM-58z" secondAttribute="bottom" constant="20" symbolic="YES" id="4ZS-q5-TJL"/> |                 <constraint firstAttribute="bottom" secondItem="ex3-VM-58z" secondAttribute="bottom" constant="12" id="4ZS-q5-TJL"/> | ||||||
|                     <constraint firstItem="ex3-VM-58z" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="20" id="8Pj-Ns-TrJ"/> |                 <constraint firstItem="ex3-VM-58z" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="12" id="8Pj-Ns-TrJ"/> | ||||||
|                     <constraint firstAttribute="trailing" secondItem="kDb-7g-cVx" secondAttribute="trailing" constant="20" symbolic="YES" id="KHa-of-eY7"/> |                 <constraint firstAttribute="trailing" secondItem="kDb-7g-cVx" secondAttribute="trailing" constant="12" id="KHa-of-eY7"/> | ||||||
|                     <constraint firstItem="kDb-7g-cVx" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="20" symbolic="YES" id="OcZ-Xa-394"/> |                 <constraint firstItem="kDb-7g-cVx" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="12" id="OcZ-Xa-394"/> | ||||||
|                     <constraint firstAttribute="trailing" secondItem="ex3-VM-58z" secondAttribute="trailing" constant="20" id="QWA-lY-ugz"/> |                 <constraint firstAttribute="trailing" secondItem="ex3-VM-58z" secondAttribute="trailing" constant="12" id="QWA-lY-ugz"/> | ||||||
|                 <constraint firstItem="ex3-VM-58z" firstAttribute="top" secondItem="kDb-7g-cVx" secondAttribute="bottom" constant="8" id="jDW-N8-c4V"/> |                 <constraint firstItem="ex3-VM-58z" firstAttribute="top" secondItem="kDb-7g-cVx" secondAttribute="bottom" constant="8" id="jDW-N8-c4V"/> | ||||||
|                     <constraint firstItem="kDb-7g-cVx" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="20" symbolic="YES" id="wdj-PF-zxO"/> |                 <constraint firstItem="kDb-7g-cVx" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="12" id="wdj-PF-zxO"/> | ||||||
|             </constraints> |             </constraints> | ||||||
|             </view> |             <point key="canvasLocation" x="-311" y="120"/> | ||||||
|  |         </visualEffectView> | ||||||
|  |         <customObject id="9AQ-Iv-Pbm" customClass="AppleIIController" customModule="Clock_Signal" customModuleProvider="target"> | ||||||
|             <connections> |             <connections> | ||||||
|                 <outlet property="displayTypeButton" destination="ex3-VM-58z" id="lmZ-aN-lcj"/> |                 <outlet property="displayTypeButton" destination="ex3-VM-58z" id="bmb-7c-ZF7"/> | ||||||
|                 <outlet property="squarePixelButton" destination="kDb-7g-cVx" id="zbx-o8-7yC"/> |                 <outlet property="squarePixelButton" destination="kDb-7g-cVx" id="iGT-6U-vTO"/> | ||||||
|             </connections> |             </connections> | ||||||
|             <point key="canvasLocation" x="-161" y="104.5"/> |         </customObject> | ||||||
|         </window> |  | ||||||
|     </objects> |     </objects> | ||||||
| </document> | </document> | ||||||
|   | |||||||
| @@ -8,97 +8,95 @@ | |||||||
|     <objects> |     <objects> | ||||||
|         <customObject id="-2" userLabel="File's Owner" customClass="MachineDocument" customModule="Clock_Signal" customModuleProvider="target"> |         <customObject id="-2" userLabel="File's Owner" customClass="MachineDocument" customModule="Clock_Signal" customModuleProvider="target"> | ||||||
|             <connections> |             <connections> | ||||||
|                 <outlet property="optionsPanel" destination="gsl-7V-TTU" id="BEE-05-h0B"/> |                 <outlet property="optionsController" destination="rEM-g1-brS" id="xZh-zY-yuv"/> | ||||||
|  |                 <outlet property="optionsView" destination="fX1-EX-wGf" id="dPS-F9-xmL"/> | ||||||
|             </connections> |             </connections> | ||||||
|         </customObject> |         </customObject> | ||||||
|         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> |         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> | ||||||
|         <customObject id="-3" userLabel="Application" customClass="NSObject"/> |         <customObject id="-3" userLabel="Application" customClass="NSObject"/> | ||||||
|         <window title="Options" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="" animationBehavior="default" id="gsl-7V-TTU" customClass="Atari2600OptionsPanel" customModule="Clock_Signal" customModuleProvider="target"> |         <visualEffectView hidden="YES" wantsLayer="YES" appearanceType="vibrantDark" blendingMode="withinWindow" material="HUDWindow" state="followsWindowActiveState" translatesAutoresizingMaskIntoConstraints="NO" id="fX1-EX-wGf"> | ||||||
|             <windowStyleMask key="styleMask" titled="YES" closable="YES" utility="YES" nonactivatingPanel="YES" HUD="YES"/> |             <rect key="frame" x="0.0" y="0.0" width="202" height="112"/> | ||||||
|             <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> |  | ||||||
|             <rect key="contentRect" x="80" y="150" width="200" height="121"/> |  | ||||||
|             <rect key="screenRect" x="0.0" y="0.0" width="2560" height="1440"/> |  | ||||||
|             <view key="contentView" id="aQh-Pm-DEo"> |  | ||||||
|                 <rect key="frame" x="0.0" y="0.0" width="200" height="121"/> |  | ||||||
|                 <autoresizingMask key="autoresizingMask"/> |  | ||||||
|             <subviews> |             <subviews> | ||||||
|                     <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="rQO-uD-fwn"> |                 <button wantsLayer="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="pzn-mL-BPh"> | ||||||
|                         <rect key="frame" x="13" y="74" width="88" height="32"/> |                     <rect key="frame" x="5" y="73" width="97" height="32"/> | ||||||
|                         <buttonCell key="cell" type="push" title="Reset" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="l3H-0m-aK0"> |                     <buttonCell key="cell" type="push" title="Reset" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="W9s-t2-TJ5"> | ||||||
|                         <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> |                         <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> | ||||||
|                         <font key="font" metaFont="system"/> |                         <font key="font" metaFont="system"/> | ||||||
|                     </buttonCell> |                     </buttonCell> | ||||||
|                     <connections> |                     <connections> | ||||||
|                             <action selector="optionWasPressed:" target="gsl-7V-TTU" id="wbx-SP-OZc"/> |                         <action selector="optionWasPressed:" target="rEM-g1-brS" id="ZHe-AL-yL6"/> | ||||||
|                     </connections> |                     </connections> | ||||||
|                 </button> |                 </button> | ||||||
|                     <button translatesAutoresizingMaskIntoConstraints="NO" id="3qw-C1-NYW"> |                 <button verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="nEt-YK-aWs"> | ||||||
|                         <rect key="frame" x="18" y="58" width="162" height="18"/> |                     <rect key="frame" x="10" y="33" width="180" height="18"/> | ||||||
|                         <buttonCell key="cell" type="check" title="Black and White" bezelStyle="regularSquare" imagePosition="left" inset="2" id="UP7-mf-IKo"> |                     <buttonCell key="cell" type="check" title="Left Player Difficulty" bezelStyle="regularSquare" imagePosition="left" inset="2" id="YOY-n5-F4C"> | ||||||
|                         <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> |                         <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> | ||||||
|                         <font key="font" metaFont="system"/> |                         <font key="font" metaFont="system"/> | ||||||
|                     </buttonCell> |                     </buttonCell> | ||||||
|                     <connections> |                     <connections> | ||||||
|                             <action selector="optionDidChange:" target="gsl-7V-TTU" id="s5e-66-aY1"/> |                         <action selector="optionDidChange:" target="rEM-g1-brS" id="BNC-7F-wGh"/> | ||||||
|                     </connections> |                     </connections> | ||||||
|                 </button> |                 </button> | ||||||
|                     <button translatesAutoresizingMaskIntoConstraints="NO" id="Xbc-cw-Sc2"> |                 <button translatesAutoresizingMaskIntoConstraints="NO" id="pDu-eg-6n6"> | ||||||
|                         <rect key="frame" x="18" y="36" width="162" height="18"/> |                     <rect key="frame" x="10" y="11" width="180" height="18"/> | ||||||
|                         <buttonCell key="cell" type="check" title="Left Player Difficulty" bezelStyle="regularSquare" imagePosition="left" inset="2" id="wlJ-8s-PEh"> |                     <buttonCell key="cell" type="check" title="Right Player Difficulty" bezelStyle="regularSquare" imagePosition="left" inset="2" id="Q2e-Fa-VyK"> | ||||||
|                         <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> |                         <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> | ||||||
|                         <font key="font" metaFont="system"/> |                         <font key="font" metaFont="system"/> | ||||||
|                     </buttonCell> |                     </buttonCell> | ||||||
|                     <connections> |                     <connections> | ||||||
|                             <action selector="optionDidChange:" target="gsl-7V-TTU" id="PbG-zF-y0W"/> |                         <action selector="optionDidChange:" target="rEM-g1-brS" id="R7C-ej-dZT"/> | ||||||
|                     </connections> |                     </connections> | ||||||
|                 </button> |                 </button> | ||||||
|                     <button translatesAutoresizingMaskIntoConstraints="NO" id="kPV-Tm-TTc"> |                 <button wantsLayer="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="YqD-w8-fXK"> | ||||||
|                         <rect key="frame" x="18" y="14" width="162" height="18"/> |                     <rect key="frame" x="100" y="73" width="97" height="32"/> | ||||||
|                         <buttonCell key="cell" type="check" title="Right Player Difficulty" bezelStyle="regularSquare" imagePosition="left" inset="2" id="F05-cA-66S"> |                     <buttonCell key="cell" type="push" title="Select" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="0DC-Xk-VFt"> | ||||||
|                             <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> |  | ||||||
|                             <font key="font" metaFont="system"/> |  | ||||||
|                         </buttonCell> |  | ||||||
|                         <connections> |  | ||||||
|                             <action selector="optionDidChange:" target="gsl-7V-TTU" id="XMR-tK-HN5"/> |  | ||||||
|                         </connections> |  | ||||||
|                     </button> |  | ||||||
|                     <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="nt7-8K-xY9"> |  | ||||||
|                         <rect key="frame" x="99" y="74" width="88" height="32"/> |  | ||||||
|                         <buttonCell key="cell" type="push" title="Select" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="8Na-Z1-EXS"> |  | ||||||
|                         <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> |                         <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> | ||||||
|                         <font key="font" metaFont="system"/> |                         <font key="font" metaFont="system"/> | ||||||
|                     </buttonCell> |                     </buttonCell> | ||||||
|                     <connections> |                     <connections> | ||||||
|                             <action selector="optionWasPressed:" target="gsl-7V-TTU" id="db2-Bu-6h9"/> |                         <action selector="optionWasPressed:" target="rEM-g1-brS" id="Bhc-5F-4Vj"/> | ||||||
|  |                     </connections> | ||||||
|  |                 </button> | ||||||
|  |                 <button verticalHuggingPriority="251" verticalCompressionResistancePriority="751" translatesAutoresizingMaskIntoConstraints="NO" id="YZK-m7-ihU"> | ||||||
|  |                     <rect key="frame" x="10" y="55" width="180" height="18"/> | ||||||
|  |                     <buttonCell key="cell" type="check" title="Black and White" bezelStyle="regularSquare" imagePosition="left" inset="2" id="IxG-1J-fdG"> | ||||||
|  |                         <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> | ||||||
|  |                         <font key="font" metaFont="system"/> | ||||||
|  |                     </buttonCell> | ||||||
|  |                     <connections> | ||||||
|  |                         <action selector="optionDidChange:" target="rEM-g1-brS" id="4cx-8C-XGe"/> | ||||||
|                     </connections> |                     </connections> | ||||||
|                 </button> |                 </button> | ||||||
|             </subviews> |             </subviews> | ||||||
|             <constraints> |             <constraints> | ||||||
|                     <constraint firstItem="3qw-C1-NYW" firstAttribute="leading" secondItem="aQh-Pm-DEo" secondAttribute="leading" constant="20" id="1Ri-ZO-GJy"/> |                 <constraint firstItem="nEt-YK-aWs" firstAttribute="leading" secondItem="fX1-EX-wGf" secondAttribute="leading" constant="12" id="20c-09-a5v"/> | ||||||
|                     <constraint firstItem="nt7-8K-xY9" firstAttribute="leading" secondItem="rQO-uD-fwn" secondAttribute="trailing" constant="12" id="46p-Z3-kgW"/> |                 <constraint firstAttribute="bottom" secondItem="pDu-eg-6n6" secondAttribute="bottom" constant="12" id="8QS-y2-cgI"/> | ||||||
|                     <constraint firstItem="nt7-8K-xY9" firstAttribute="top" secondItem="aQh-Pm-DEo" secondAttribute="top" constant="20" id="6Uc-12-11y"/> |                 <constraint firstItem="pDu-eg-6n6" firstAttribute="leading" secondItem="fX1-EX-wGf" secondAttribute="leading" constant="12" id="Dee-tQ-00F"/> | ||||||
|                     <constraint firstItem="Xbc-cw-Sc2" firstAttribute="leading" secondItem="aQh-Pm-DEo" secondAttribute="leading" constant="20" id="7es-iv-JOh"/> |                 <constraint firstAttribute="trailing" secondItem="pDu-eg-6n6" secondAttribute="trailing" constant="12" id="IWs-rY-q36"/> | ||||||
|                     <constraint firstItem="kPV-Tm-TTc" firstAttribute="top" secondItem="Xbc-cw-Sc2" secondAttribute="bottom" constant="6" id="Env-nl-M2e"/> |                 <constraint firstItem="pDu-eg-6n6" firstAttribute="top" secondItem="nEt-YK-aWs" secondAttribute="bottom" constant="6" symbolic="YES" id="JSd-1z-mM4"/> | ||||||
|                     <constraint firstAttribute="trailing" secondItem="kPV-Tm-TTc" secondAttribute="trailing" constant="20" id="Fim-Ej-8Ux"/> |                 <constraint firstAttribute="trailing" secondItem="nEt-YK-aWs" secondAttribute="trailing" constant="12" id="N00-Kz-j5a"/> | ||||||
|                     <constraint firstAttribute="trailing" secondItem="Xbc-cw-Sc2" secondAttribute="trailing" constant="20" id="HkS-6c-WZm"/> |                 <constraint firstAttribute="trailing" secondItem="YqD-w8-fXK" secondAttribute="trailing" constant="12" id="RgG-Tb-nuK"/> | ||||||
|                     <constraint firstItem="3qw-C1-NYW" firstAttribute="top" secondItem="nt7-8K-xY9" secondAttribute="bottom" constant="6" id="Hxq-Pm-o4G"/> |                 <constraint firstItem="pzn-mL-BPh" firstAttribute="leading" secondItem="fX1-EX-wGf" secondAttribute="leading" constant="12" id="Yxt-HC-m81"/> | ||||||
|                     <constraint firstAttribute="trailing" secondItem="nt7-8K-xY9" secondAttribute="trailing" constant="20" id="JRO-de-WQp"/> |                 <constraint firstItem="YZK-m7-ihU" firstAttribute="leading" secondItem="fX1-EX-wGf" secondAttribute="leading" constant="12" id="ZTU-hR-Diu"/> | ||||||
|                     <constraint firstItem="rQO-uD-fwn" firstAttribute="top" secondItem="aQh-Pm-DEo" secondAttribute="top" constant="20" id="N3p-aY-2Nx"/> |                 <constraint firstItem="YqD-w8-fXK" firstAttribute="top" secondItem="pzn-mL-BPh" secondAttribute="top" id="bXS-W9-gSe"/> | ||||||
|                     <constraint firstItem="nt7-8K-xY9" firstAttribute="width" secondItem="rQO-uD-fwn" secondAttribute="width" id="NOc-hJ-8Mm"/> |                 <constraint firstItem="YqD-w8-fXK" firstAttribute="leading" secondItem="pzn-mL-BPh" secondAttribute="trailing" constant="12" symbolic="YES" id="bnf-6C-Sld"/> | ||||||
|                     <constraint firstItem="Xbc-cw-Sc2" firstAttribute="top" secondItem="3qw-C1-NYW" secondAttribute="bottom" constant="6" id="ORX-bF-2WS"/> |                 <constraint firstItem="nEt-YK-aWs" firstAttribute="top" secondItem="YZK-m7-ihU" secondAttribute="bottom" constant="6" symbolic="YES" id="nFp-NE-u5J"/> | ||||||
|                     <constraint firstItem="kPV-Tm-TTc" firstAttribute="leading" secondItem="aQh-Pm-DEo" secondAttribute="leading" constant="20" id="x8p-Hm-xeu"/> |                 <constraint firstItem="YqD-w8-fXK" firstAttribute="width" secondItem="pzn-mL-BPh" secondAttribute="width" id="sqT-6s-tFr"/> | ||||||
|                     <constraint firstItem="rQO-uD-fwn" firstAttribute="leading" secondItem="aQh-Pm-DEo" secondAttribute="leading" constant="20" id="xhD-iY-vt2"/> |                 <constraint firstAttribute="trailing" secondItem="YZK-m7-ihU" secondAttribute="trailing" constant="12" id="x5C-Rx-M6l"/> | ||||||
|                     <constraint firstAttribute="trailing" secondItem="3qw-C1-NYW" secondAttribute="trailing" constant="20" id="yff-e9-OBY"/> |                 <constraint firstItem="YqD-w8-fXK" firstAttribute="bottom" secondItem="pzn-mL-BPh" secondAttribute="bottom" id="xcM-in-P3E"/> | ||||||
|  |                 <constraint firstItem="YZK-m7-ihU" firstAttribute="top" secondItem="pzn-mL-BPh" secondAttribute="bottom" constant="8" id="yJE-zt-BYM"/> | ||||||
|  |                 <constraint firstItem="pzn-mL-BPh" firstAttribute="top" secondItem="fX1-EX-wGf" secondAttribute="top" constant="12" id="zJ3-Ii-K5M"/> | ||||||
|             </constraints> |             </constraints> | ||||||
|             </view> |             <point key="canvasLocation" x="139" y="230"/> | ||||||
|  |         </visualEffectView> | ||||||
|  |         <customObject id="rEM-g1-brS" customClass="Atari2600OptionsController" customModule="Clock_Signal" customModuleProvider="target"> | ||||||
|             <connections> |             <connections> | ||||||
|                 <outlet property="colourButton" destination="3qw-C1-NYW" id="5HZ-fq-XtP"/> |                 <outlet property="colourButton" destination="YZK-m7-ihU" id="9AM-ZO-ck4"/> | ||||||
|                 <outlet property="leftPlayerDifficultyButton" destination="Xbc-cw-Sc2" id="OfB-Hr-fDC"/> |                 <outlet property="leftPlayerDifficultyButton" destination="nEt-YK-aWs" id="wm4-PF-Yni"/> | ||||||
|                 <outlet property="resetButton" destination="rQO-uD-fwn" id="XsE-tH-9oS"/> |                 <outlet property="resetButton" destination="pzn-mL-BPh" id="6TY-c7-uRd"/> | ||||||
|                 <outlet property="rightPlayerDifficultyButton" destination="kPV-Tm-TTc" id="BGU-Hi-AZl"/> |                 <outlet property="rightPlayerDifficultyButton" destination="pDu-eg-6n6" id="TTh-ls-InF"/> | ||||||
|                 <outlet property="selectButton" destination="nt7-8K-xY9" id="AF6-Qk-HZN"/> |                 <outlet property="selectButton" destination="YqD-w8-fXK" id="NUa-y2-gCe"/> | ||||||
|             </connections> |             </connections> | ||||||
|             <point key="canvasLocation" x="157" y="12.5"/> |         </customObject> | ||||||
|         </window> |  | ||||||
|     </objects> |     </objects> | ||||||
| </document> | </document> | ||||||
|   | |||||||
| @@ -1,29 +1,24 @@ | |||||||
| <?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||||||
| <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14113" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> | <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="18122" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> | ||||||
|     <dependencies> |     <dependencies> | ||||||
|         <deployment identifier="macosx"/> |         <deployment identifier="macosx"/> | ||||||
|         <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14113"/> |         <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="18122"/> | ||||||
|         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> |         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | ||||||
|     </dependencies> |     </dependencies> | ||||||
|     <objects> |     <objects> | ||||||
|         <customObject id="-2" userLabel="File's Owner" customClass="MachineDocument" customModule="Clock_Signal" customModuleProvider="target"> |         <customObject id="-2" userLabel="File's Owner" customClass="MachineDocument" customModule="Clock_Signal" customModuleProvider="target"> | ||||||
|             <connections> |             <connections> | ||||||
|                 <outlet property="optionsPanel" destination="ZW7-Bw-4RP" id="JpE-wG-zRR"/> |                 <outlet property="optionsController" destination="MXS-dG-Doo" id="zwz-gg-WjA"/> | ||||||
|  |                 <outlet property="optionsView" destination="tpZ-0B-QQu" id="xhc-MP-y9X"/> | ||||||
|             </connections> |             </connections> | ||||||
|         </customObject> |         </customObject> | ||||||
|         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> |         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> | ||||||
|         <customObject id="-3" userLabel="Application" customClass="NSObject"/> |         <customObject id="-3" userLabel="Application" customClass="NSObject"/> | ||||||
|         <window title="Options" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" frameAutosaveName="" animationBehavior="default" id="ZW7-Bw-4RP" customClass="MachinePanel" customModule="Clock_Signal" customModuleProvider="target"> |         <visualEffectView hidden="YES" wantsLayer="YES" appearanceType="vibrantDark" blendingMode="withinWindow" material="HUDWindow" state="followsWindowActiveState" translatesAutoresizingMaskIntoConstraints="NO" id="tpZ-0B-QQu"> | ||||||
|             <windowStyleMask key="styleMask" titled="YES" closable="YES" utility="YES" nonactivatingPanel="YES" HUD="YES"/> |             <rect key="frame" x="0.0" y="0.0" width="200" height="44"/> | ||||||
|             <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> |  | ||||||
|             <rect key="contentRect" x="80" y="150" width="200" height="61"/> |  | ||||||
|             <rect key="screenRect" x="0.0" y="0.0" width="1440" height="900"/> |  | ||||||
|             <view key="contentView" id="tpZ-0B-QQu"> |  | ||||||
|                 <rect key="frame" x="0.0" y="0.0" width="200" height="61"/> |  | ||||||
|                 <autoresizingMask key="autoresizingMask"/> |  | ||||||
|             <subviews> |             <subviews> | ||||||
|                     <popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="rh8-km-57n"> |                 <popUpButton wantsLayer="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="rh8-km-57n"> | ||||||
|                         <rect key="frame" x="18" y="17" width="165" height="26"/> |                     <rect key="frame" x="9" y="8" width="183" height="25"/> | ||||||
|                     <popUpButtonCell key="cell" type="push" title="RGB Monitor" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="tJM-kX-gaK" id="8SX-c5-ud1"> |                     <popUpButtonCell key="cell" type="push" title="RGB Monitor" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="tJM-kX-gaK" id="8SX-c5-ud1"> | ||||||
|                         <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> |                         <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> | ||||||
|                         <font key="font" metaFont="menu"/> |                         <font key="font" metaFont="menu"/> | ||||||
| @@ -36,21 +31,22 @@ | |||||||
|                         </menu> |                         </menu> | ||||||
|                     </popUpButtonCell> |                     </popUpButtonCell> | ||||||
|                     <connections> |                     <connections> | ||||||
|                             <action selector="setDisplayType:" target="ZW7-Bw-4RP" id="PAH-CZ-zlk"/> |                         <action selector="setDisplayType:" target="MXS-dG-Doo" id="5Vp-mv-kZU"/> | ||||||
|                     </connections> |                     </connections> | ||||||
|                 </popUpButton> |                 </popUpButton> | ||||||
|             </subviews> |             </subviews> | ||||||
|             <constraints> |             <constraints> | ||||||
|                     <constraint firstItem="rh8-km-57n" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="20" id="B6L-VS-2cN"/> |                 <constraint firstItem="rh8-km-57n" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="12" id="B6L-VS-2cN"/> | ||||||
|                     <constraint firstItem="rh8-km-57n" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="20" id="VRo-6R-IKd"/> |                 <constraint firstItem="rh8-km-57n" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="12" id="VRo-6R-IKd"/> | ||||||
|                     <constraint firstAttribute="bottom" secondItem="rh8-km-57n" secondAttribute="bottom" constant="20" id="jHA-lf-e7V"/> |                 <constraint firstAttribute="bottom" secondItem="rh8-km-57n" secondAttribute="bottom" constant="12" id="jHA-lf-e7V"/> | ||||||
|                     <constraint firstAttribute="trailing" secondItem="rh8-km-57n" secondAttribute="trailing" constant="20" id="urO-Ac-aqK"/> |                 <constraint firstAttribute="trailing" secondItem="rh8-km-57n" secondAttribute="trailing" constant="12" id="urO-Ac-aqK"/> | ||||||
|             </constraints> |             </constraints> | ||||||
|             </view> |             <point key="canvasLocation" x="-118" y="120"/> | ||||||
|  |         </visualEffectView> | ||||||
|  |         <customObject id="MXS-dG-Doo" customClass="MachineController" customModule="Clock_Signal" customModuleProvider="target"> | ||||||
|             <connections> |             <connections> | ||||||
|                 <outlet property="displayTypeButton" destination="rh8-km-57n" id="FB2-Zg-VKq"/> |                 <outlet property="displayTypeButton" destination="rh8-km-57n" id="3ln-Pl-G3k"/> | ||||||
|             </connections> |             </connections> | ||||||
|             <point key="canvasLocation" x="175" y="33.5"/> |         </customObject> | ||||||
|         </window> |  | ||||||
|     </objects> |     </objects> | ||||||
| </document> | </document> | ||||||
|   | |||||||
| @@ -1,16 +1,16 @@ | |||||||
| <?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||||||
| <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="15705" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> | <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="18122" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> | ||||||
|     <dependencies> |     <dependencies> | ||||||
|         <deployment identifier="macosx"/> |         <deployment identifier="macosx"/> | ||||||
|         <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="15705"/> |         <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="18122"/> | ||||||
|         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> |         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | ||||||
|     </dependencies> |     </dependencies> | ||||||
|     <objects> |     <objects> | ||||||
|         <customObject id="-2" userLabel="File's Owner" customClass="MachineDocument" customModule="Clock_Signal" customModuleProvider="target"> |         <customObject id="-2" userLabel="File's Owner" customClass="MachineDocument" customModule="Clock_Signal" customModuleProvider="target"> | ||||||
|             <connections> |             <connections> | ||||||
|                 <outlet property="scanTargetView" destination="DEG-fq-cjd" id="5aX-3R-eXQ"/> |                 <outlet property="scanTargetView" destination="DEG-fq-cjd" id="5aX-3R-eXQ"/> | ||||||
|                 <outlet property="volumeSlider" destination="zaz-lB-Iyt" id="flY-Th-oG4"/> |                 <outlet property="volumeSlider" destination="bmN-Nb-BBh" id="1aU-pu-mfB"/> | ||||||
|                 <outlet property="volumeView" destination="4ap-Gi-2AO" id="v4e-k6-Fqf"/> |                 <outlet property="volumeView" destination="l9e-qt-jMo" id="4cE-4e-RhG"/> | ||||||
|                 <outlet property="window" destination="xOd-HO-29H" id="JIz-fz-R2o"/> |                 <outlet property="window" destination="xOd-HO-29H" id="JIz-fz-R2o"/> | ||||||
|             </connections> |             </connections> | ||||||
|         </customObject> |         </customObject> | ||||||
| @@ -21,7 +21,7 @@ | |||||||
|             <windowCollectionBehavior key="collectionBehavior" fullScreenPrimary="YES"/> |             <windowCollectionBehavior key="collectionBehavior" fullScreenPrimary="YES"/> | ||||||
|             <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> |             <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> | ||||||
|             <rect key="contentRect" x="80" y="250" width="600" height="450"/> |             <rect key="contentRect" x="80" y="250" width="600" height="450"/> | ||||||
|             <rect key="screenRect" x="0.0" y="0.0" width="1440" height="877"/> |             <rect key="screenRect" x="0.0" y="0.0" width="2560" height="1440"/> | ||||||
|             <value key="minSize" type="size" width="228" height="171"/> |             <value key="minSize" type="size" width="228" height="171"/> | ||||||
|             <view key="contentView" id="gIp-Ho-8D9"> |             <view key="contentView" id="gIp-Ho-8D9"> | ||||||
|                 <rect key="frame" x="0.0" y="0.0" width="600" height="450"/> |                 <rect key="frame" x="0.0" y="0.0" width="600" height="450"/> | ||||||
| @@ -30,57 +30,50 @@ | |||||||
|                     <view hidden="YES" wantsLayer="YES" translatesAutoresizingMaskIntoConstraints="NO" id="DEG-fq-cjd" customClass="CSScanTargetView"> |                     <view hidden="YES" wantsLayer="YES" translatesAutoresizingMaskIntoConstraints="NO" id="DEG-fq-cjd" customClass="CSScanTargetView"> | ||||||
|                         <rect key="frame" x="0.0" y="0.0" width="600" height="450"/> |                         <rect key="frame" x="0.0" y="0.0" width="600" height="450"/> | ||||||
|                     </view> |                     </view> | ||||||
|                     <box hidden="YES" boxType="custom" cornerRadius="4" title="Box" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="4ap-Gi-2AO"> |                     <visualEffectView hidden="YES" wantsLayer="YES" appearanceType="vibrantDark" blendingMode="withinWindow" material="HUDWindow" state="followsWindowActiveState" translatesAutoresizingMaskIntoConstraints="NO" id="l9e-qt-jMo" userLabel="Volume View"> | ||||||
|                         <rect key="frame" x="150" y="20" width="300" height="48"/> |                         <rect key="frame" x="130" y="20" width="340" height="36"/> | ||||||
|                         <view key="contentView" id="gwO-Ty-LCX"> |  | ||||||
|                             <rect key="frame" x="1" y="1" width="298" height="46"/> |  | ||||||
|                             <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> |  | ||||||
|                         <subviews> |                         <subviews> | ||||||
|                                 <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Hzw-P6-1dH"> |                             <imageView wantsLayer="YES" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="3hK-SA-aKj"> | ||||||
|                                     <rect key="frame" x="258" y="8" width="32" height="30"/> |                                 <rect key="frame" x="8" y="12" width="32.5" height="14"/> | ||||||
|                                 <constraints> |                                 <constraints> | ||||||
|                                         <constraint firstAttribute="width" constant="32" id="WrK-W9-mPP"/> |                                     <constraint firstAttribute="width" constant="32" id="tY0-07-0UK"/> | ||||||
|                                 </constraints> |                                 </constraints> | ||||||
|                                     <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSTouchBarAudioOutputVolumeHighTemplate" id="5dB-4Y-iEl"/> |                                 <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSTouchBarAudioOutputVolumeOffTemplate" id="HbG-Ey-djw"/> | ||||||
|                                     <color key="contentTintColor" name="controlColor" catalog="System" colorSpace="catalog"/> |                                 <color key="contentTintColor" name="textColor" catalog="System" colorSpace="catalog"/> | ||||||
|                             </imageView> |                             </imageView> | ||||||
|                                 <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="p0w-Ti-Tu9"> |                             <slider verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="bmN-Nb-BBh"> | ||||||
|                                     <rect key="frame" x="8" y="8" width="32" height="30"/> |                                 <rect key="frame" x="46" y="2" width="248" height="28"/> | ||||||
|                                     <constraints> |                                 <sliderCell key="cell" continuous="YES" state="on" alignment="left" minValue="1" maxValue="2" doubleValue="2" tickMarkPosition="above" sliderType="linear" id="wtR-Vo-Q9e"/> | ||||||
|                                         <constraint firstAttribute="width" constant="32" id="dZn-Fc-fRU"/> |  | ||||||
|                                     </constraints> |  | ||||||
|                                     <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSTouchBarAudioOutputVolumeOffTemplate" id="mUH-aA-T9N"/> |  | ||||||
|                                     <color key="contentTintColor" name="controlColor" catalog="System" colorSpace="catalog"/> |  | ||||||
|                                 </imageView> |  | ||||||
|                                 <slider verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="zaz-lB-Iyt"> |  | ||||||
|                                     <rect key="frame" x="46" y="14" width="206" height="19"/> |  | ||||||
|                                     <sliderCell key="cell" continuous="YES" state="on" alignment="left" maxValue="1" doubleValue="1" tickMarkPosition="above" sliderType="linear" id="Zvz-Og-dGA"/> |  | ||||||
|                                 <connections> |                                 <connections> | ||||||
|                                         <action selector="setVolume:" target="-2" id="eEc-5v-I2c"/> |                                     <action selector="setVolume:" target="-2" id="Ptv-pk-zbl"/> | ||||||
|                                 </connections> |                                 </connections> | ||||||
|                             </slider> |                             </slider> | ||||||
|  |                             <imageView wantsLayer="YES" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="pG5-Iv-llF"> | ||||||
|  |                                 <rect key="frame" x="300" y="11.5" width="32.5" height="15"/> | ||||||
|  |                                 <constraints> | ||||||
|  |                                     <constraint firstAttribute="width" constant="32" id="Nq1-7v-zbT"/> | ||||||
|  |                                 </constraints> | ||||||
|  |                                 <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSTouchBarAudioOutputVolumeHighTemplate" id="iJG-ib-H5S"/> | ||||||
|  |                                 <color key="contentTintColor" name="textColor" catalog="System" colorSpace="catalog"/> | ||||||
|  |                             </imageView> | ||||||
|                         </subviews> |                         </subviews> | ||||||
|                         <constraints> |                         <constraints> | ||||||
|                                 <constraint firstItem="p0w-Ti-Tu9" firstAttribute="leading" secondItem="gwO-Ty-LCX" secondAttribute="leading" constant="8" id="1t0-CW-zp9"/> |                             <constraint firstItem="bmN-Nb-BBh" firstAttribute="top" secondItem="l9e-qt-jMo" secondAttribute="top" constant="8" id="Bdo-LI-B9k"/> | ||||||
|                                 <constraint firstItem="Hzw-P6-1dH" firstAttribute="top" secondItem="gwO-Ty-LCX" secondAttribute="top" constant="8" id="OHP-c3-2Aa"/> |                             <constraint firstAttribute="bottom" secondItem="bmN-Nb-BBh" secondAttribute="bottom" constant="8" id="Lu6-q8-0Ie"/> | ||||||
|                                 <constraint firstAttribute="trailing" secondItem="Hzw-P6-1dH" secondAttribute="trailing" constant="8" id="W24-Wx-bdQ"/> |                             <constraint firstItem="bmN-Nb-BBh" firstAttribute="leading" secondItem="3hK-SA-aKj" secondAttribute="trailing" constant="8" symbolic="YES" id="Lvd-Pp-IyL"/> | ||||||
|                                 <constraint firstItem="zaz-lB-Iyt" firstAttribute="centerY" secondItem="p0w-Ti-Tu9" secondAttribute="centerY" id="f3C-My-T0S"/> |                             <constraint firstAttribute="width" constant="340" id="S3o-RO-Jjm"/> | ||||||
|                                 <constraint firstItem="zaz-lB-Iyt" firstAttribute="leading" secondItem="p0w-Ti-Tu9" secondAttribute="trailing" constant="8" id="n0g-y6-wHP"/> |                             <constraint firstAttribute="trailing" secondItem="pG5-Iv-llF" secondAttribute="trailing" constant="8" id="fMW-9R-UvR"/> | ||||||
|                                 <constraint firstItem="p0w-Ti-Tu9" firstAttribute="centerY" secondItem="gwO-Ty-LCX" secondAttribute="centerY" id="uTt-VY-o8c"/> |                             <constraint firstItem="pG5-Iv-llF" firstAttribute="leading" secondItem="bmN-Nb-BBh" secondAttribute="trailing" constant="8" symbolic="YES" id="tMb-ac-ZX2"/> | ||||||
|                                 <constraint firstItem="Hzw-P6-1dH" firstAttribute="leading" secondItem="zaz-lB-Iyt" secondAttribute="trailing" constant="8" id="xCS-qF-Gz8"/> |                             <constraint firstItem="3hK-SA-aKj" firstAttribute="centerY" secondItem="bmN-Nb-BBh" secondAttribute="centerY" id="wuj-yd-xkH"/> | ||||||
|                                 <constraint firstAttribute="bottom" secondItem="Hzw-P6-1dH" secondAttribute="bottom" constant="8" id="yaF-k8-W5B"/> |                             <constraint firstItem="3hK-SA-aKj" firstAttribute="leading" secondItem="l9e-qt-jMo" secondAttribute="leading" constant="8" id="y3G-8K-adU"/> | ||||||
|  |                             <constraint firstItem="pG5-Iv-llF" firstAttribute="centerY" secondItem="bmN-Nb-BBh" secondAttribute="centerY" id="yjF-sC-XSG"/> | ||||||
|                         </constraints> |                         </constraints> | ||||||
|                         </view> |                     </visualEffectView> | ||||||
|                         <constraints> |  | ||||||
|                             <constraint firstAttribute="width" constant="300" id="HKL-vy-Mov"/> |  | ||||||
|                         </constraints> |  | ||||||
|                         <color key="fillColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/> |  | ||||||
|                     </box> |  | ||||||
|                 </subviews> |                 </subviews> | ||||||
|                 <constraints> |                 <constraints> | ||||||
|  |                     <constraint firstItem="l9e-qt-jMo" firstAttribute="centerX" secondItem="gIp-Ho-8D9" secondAttribute="centerX" id="63A-k7-XRW"/> | ||||||
|                     <constraint firstItem="DEG-fq-cjd" firstAttribute="centerX" secondItem="gIp-Ho-8D9" secondAttribute="centerX" id="ES5-nL-N3h"/> |                     <constraint firstItem="DEG-fq-cjd" firstAttribute="centerX" secondItem="gIp-Ho-8D9" secondAttribute="centerX" id="ES5-nL-N3h"/> | ||||||
|                     <constraint firstItem="4ap-Gi-2AO" firstAttribute="centerX" secondItem="DEG-fq-cjd" secondAttribute="centerX" id="T41-z9-BsM"/> |                     <constraint firstAttribute="bottom" secondItem="l9e-qt-jMo" secondAttribute="bottom" constant="20" symbolic="YES" id="QG7-P0-OBj"/> | ||||||
|                     <constraint firstItem="4ap-Gi-2AO" firstAttribute="bottom" secondItem="DEG-fq-cjd" secondAttribute="bottom" constant="-20" id="Tly-Uu-96H"/> |  | ||||||
|                     <constraint firstItem="DEG-fq-cjd" firstAttribute="height" secondItem="gIp-Ho-8D9" secondAttribute="height" id="YoB-qI-LFX"/> |                     <constraint firstItem="DEG-fq-cjd" firstAttribute="height" secondItem="gIp-Ho-8D9" secondAttribute="height" id="YoB-qI-LFX"/> | ||||||
|                     <constraint firstItem="DEG-fq-cjd" firstAttribute="centerY" secondItem="gIp-Ho-8D9" secondAttribute="centerY" id="d5Y-3a-CEI"/> |                     <constraint firstItem="DEG-fq-cjd" firstAttribute="centerY" secondItem="gIp-Ho-8D9" secondAttribute="centerY" id="d5Y-3a-CEI"/> | ||||||
|                     <constraint firstItem="DEG-fq-cjd" firstAttribute="width" secondItem="gIp-Ho-8D9" secondAttribute="width" id="mYS-bH-DST"/> |                     <constraint firstItem="DEG-fq-cjd" firstAttribute="width" secondItem="gIp-Ho-8D9" secondAttribute="width" id="mYS-bH-DST"/> | ||||||
| @@ -99,7 +92,7 @@ | |||||||
|         </window> |         </window> | ||||||
|     </objects> |     </objects> | ||||||
|     <resources> |     <resources> | ||||||
|         <image name="NSTouchBarAudioOutputVolumeHighTemplate" width="23" height="30"/> |         <image name="NSTouchBarAudioOutputVolumeHighTemplate" width="22" height="15"/> | ||||||
|         <image name="NSTouchBarAudioOutputVolumeOffTemplate" width="23" height="30"/> |         <image name="NSTouchBarAudioOutputVolumeOffTemplate" width="14" height="14"/> | ||||||
|     </resources> |     </resources> | ||||||
| </document> | </document> | ||||||
|   | |||||||
| @@ -1,49 +1,45 @@ | |||||||
| <?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||||||
| <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> | <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="18122" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> | ||||||
|     <dependencies> |     <dependencies> | ||||||
|         <deployment identifier="macosx"/> |         <deployment identifier="macosx"/> | ||||||
|         <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/> |         <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="18122"/> | ||||||
|         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> |         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | ||||||
|     </dependencies> |     </dependencies> | ||||||
|     <objects> |     <objects> | ||||||
|         <customObject id="-2" userLabel="File's Owner" customClass="MachineDocument" customModule="Clock_Signal" customModuleProvider="target"> |         <customObject id="-2" userLabel="File's Owner" customClass="MachineDocument" customModule="Clock_Signal" customModuleProvider="target"> | ||||||
|             <connections> |             <connections> | ||||||
|                 <outlet property="optionsPanel" destination="ZW7-Bw-4RP" id="JpE-wG-zRR"/> |                 <outlet property="optionsController" destination="Lt7-Vu-Vry" id="Tvy-Sa-5oy"/> | ||||||
|  |                 <outlet property="optionsView" destination="tpZ-0B-QQu" id="Sat-aY-EKi"/> | ||||||
|             </connections> |             </connections> | ||||||
|         </customObject> |         </customObject> | ||||||
|         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> |         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> | ||||||
|         <customObject id="-3" userLabel="Application" customClass="NSObject"/> |         <customObject id="-3" userLabel="Application" customClass="NSObject"/> | ||||||
|         <window title="Options" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="" animationBehavior="default" id="ZW7-Bw-4RP" customClass="MachinePanel" customModule="Clock_Signal" customModuleProvider="target"> |         <visualEffectView hidden="YES" wantsLayer="YES" appearanceType="vibrantDark" blendingMode="withinWindow" material="HUDWindow" state="followsWindowActiveState" translatesAutoresizingMaskIntoConstraints="NO" id="tpZ-0B-QQu"> | ||||||
|             <windowStyleMask key="styleMask" titled="YES" closable="YES" utility="YES" nonactivatingPanel="YES" HUD="YES"/> |             <rect key="frame" x="0.0" y="0.0" width="200" height="56"/> | ||||||
|             <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> |  | ||||||
|             <rect key="contentRect" x="80" y="150" width="200" height="54"/> |  | ||||||
|             <rect key="screenRect" x="0.0" y="0.0" width="1440" height="900"/> |  | ||||||
|             <view key="contentView" id="tpZ-0B-QQu"> |  | ||||||
|                 <rect key="frame" x="0.0" y="0.0" width="200" height="54"/> |  | ||||||
|                 <autoresizingMask key="autoresizingMask"/> |  | ||||||
|             <subviews> |             <subviews> | ||||||
|                 <button translatesAutoresizingMaskIntoConstraints="NO" id="zPG-yW-4Gy"> |                 <button translatesAutoresizingMaskIntoConstraints="NO" id="zPG-yW-4Gy"> | ||||||
|                         <rect key="frame" x="18" y="18" width="164" height="18"/> |                     <rect key="frame" x="10" y="11" width="178" height="34"/> | ||||||
|                     <buttonCell key="cell" type="check" title="Start Quickly" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="alI-Mw-35c"> |                     <buttonCell key="cell" type="check" title="Start Quickly" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="alI-Mw-35c"> | ||||||
|                         <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> |                         <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> | ||||||
|                         <font key="font" metaFont="system"/> |                         <font key="font" metaFont="system"/> | ||||||
|                     </buttonCell> |                     </buttonCell> | ||||||
|                     <connections> |                     <connections> | ||||||
|                             <action selector="setFastBooting:" target="ZW7-Bw-4RP" id="AgA-2q-qUU"/> |                         <action selector="setFastBooting:" target="Lt7-Vu-Vry" id="8X7-my-U0u"/> | ||||||
|                     </connections> |                     </connections> | ||||||
|                 </button> |                 </button> | ||||||
|             </subviews> |             </subviews> | ||||||
|             <constraints> |             <constraints> | ||||||
|                     <constraint firstAttribute="bottom" secondItem="zPG-yW-4Gy" secondAttribute="bottom" constant="20" id="7u0-BP-FXG"/> |                 <constraint firstAttribute="bottom" secondItem="zPG-yW-4Gy" secondAttribute="bottom" constant="12" id="7u0-BP-FXG"/> | ||||||
|                     <constraint firstAttribute="trailing" secondItem="zPG-yW-4Gy" secondAttribute="trailing" constant="20" id="Mtb-hf-4ap"/> |                 <constraint firstAttribute="trailing" secondItem="zPG-yW-4Gy" secondAttribute="trailing" constant="12" id="Mtb-hf-4ap"/> | ||||||
|                     <constraint firstItem="zPG-yW-4Gy" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="20" id="imk-5k-8nm"/> |                 <constraint firstItem="zPG-yW-4Gy" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="12" id="imk-5k-8nm"/> | ||||||
|                     <constraint firstItem="zPG-yW-4Gy" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="20" id="jAt-iF-uaT"/> |                 <constraint firstItem="zPG-yW-4Gy" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="12" id="jAt-iF-uaT"/> | ||||||
|             </constraints> |             </constraints> | ||||||
|             </view> |             <point key="canvasLocation" x="6" y="154"/> | ||||||
|  |         </visualEffectView> | ||||||
|  |         <customObject id="Lt7-Vu-Vry" customClass="MachineController" customModule="Clock_Signal" customModuleProvider="target"> | ||||||
|             <connections> |             <connections> | ||||||
|                 <outlet property="fastBootingButton" destination="zPG-yW-4Gy" id="3Mq-l2-NEp"/> |                 <outlet property="fastBootingButton" destination="zPG-yW-4Gy" id="JcX-R1-SMn"/> | ||||||
|             </connections> |             </connections> | ||||||
|             <point key="canvasLocation" x="-50" y="2"/> |         </customObject> | ||||||
|         </window> |  | ||||||
|     </objects> |     </objects> | ||||||
| </document> | </document> | ||||||
|   | |||||||
| @@ -1,8 +1,8 @@ | |||||||
| <?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||||||
| <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="15705" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> | <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="18122" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> | ||||||
|     <dependencies> |     <dependencies> | ||||||
|         <deployment identifier="macosx"/> |         <deployment identifier="macosx"/> | ||||||
|         <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="15705"/> |         <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="18122"/> | ||||||
|     </dependencies> |     </dependencies> | ||||||
|     <objects> |     <objects> | ||||||
|         <customObject id="-2" userLabel="File's Owner" customClass="NSApplication"> |         <customObject id="-2" userLabel="File's Owner" customClass="NSApplication"> | ||||||
| @@ -141,25 +141,6 @@ | |||||||
|                         </items> |                         </items> | ||||||
|                     </menu> |                     </menu> | ||||||
|                 </menuItem> |                 </menuItem> | ||||||
|                 <menuItem title="View" id="H8h-7b-M4v"> |  | ||||||
|                     <modifierMask key="keyEquivalentModifierMask"/> |  | ||||||
|                     <menu key="submenu" title="View" id="HyV-fh-RgO"> |  | ||||||
|                         <items> |  | ||||||
|                             <menuItem title="Show Activity" keyEquivalent="a" id="WCd-6R-baV"> |  | ||||||
|                                 <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> |  | ||||||
|                                 <connections> |  | ||||||
|                                     <action selector="showActivity:" target="-1" id="oeF-uJ-cOS"/> |  | ||||||
|                                 </connections> |  | ||||||
|                             </menuItem> |  | ||||||
|                             <menuItem title="Show Options" keyEquivalent="o" id="GtG-CV-Uro"> |  | ||||||
|                                 <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> |  | ||||||
|                                 <connections> |  | ||||||
|                                     <action selector="showOptions:" target="-1" id="M6T-DE-Duo"/> |  | ||||||
|                                 </connections> |  | ||||||
|                             </menuItem> |  | ||||||
|                         </items> |  | ||||||
|                     </menu> |  | ||||||
|                 </menuItem> |  | ||||||
|                 <menuItem title="Input" id="5bL-VY-cxd"> |                 <menuItem title="Input" id="5bL-VY-cxd"> | ||||||
|                     <modifierMask key="keyEquivalentModifierMask"/> |                     <modifierMask key="keyEquivalentModifierMask"/> | ||||||
|                     <menu key="submenu" title="Input" id="6yv-Cf-E9r"> |                     <menu key="submenu" title="Input" id="6yv-Cf-E9r"> | ||||||
|   | |||||||
| @@ -1,39 +1,34 @@ | |||||||
| <?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||||||
| <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> | <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="18122" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> | ||||||
|     <dependencies> |     <dependencies> | ||||||
|         <deployment identifier="macosx"/> |         <deployment identifier="macosx"/> | ||||||
|         <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14460.31"/> |         <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="18122"/> | ||||||
|         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> |         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | ||||||
|     </dependencies> |     </dependencies> | ||||||
|     <objects> |     <objects> | ||||||
|         <customObject id="-2" userLabel="File's Owner" customClass="MachineDocument" customModule="Clock_Signal" customModuleProvider="target"> |         <customObject id="-2" userLabel="File's Owner" customClass="MachineDocument" customModule="Clock_Signal" customModuleProvider="target"> | ||||||
|             <connections> |             <connections> | ||||||
|                 <outlet property="optionsPanel" destination="ZW7-Bw-4RP" id="JpE-wG-zRR"/> |                 <outlet property="optionsController" destination="nbv-6C-VPa" id="na0-4N-RFd"/> | ||||||
|  |                 <outlet property="optionsView" destination="tpZ-0B-QQu" id="Sz4-GS-B5l"/> | ||||||
|             </connections> |             </connections> | ||||||
|         </customObject> |         </customObject> | ||||||
|         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> |         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> | ||||||
|         <customObject id="-3" userLabel="Application" customClass="NSObject"/> |         <customObject id="-3" userLabel="Application" customClass="NSObject"/> | ||||||
|         <window title="Options" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="" animationBehavior="default" id="ZW7-Bw-4RP" customClass="MachinePanel" customModule="Clock_Signal" customModuleProvider="target"> |         <visualEffectView hidden="YES" wantsLayer="YES" appearanceType="vibrantDark" blendingMode="withinWindow" material="HUDWindow" state="followsWindowActiveState" translatesAutoresizingMaskIntoConstraints="NO" id="tpZ-0B-QQu"> | ||||||
|             <windowStyleMask key="styleMask" titled="YES" closable="YES" utility="YES" nonactivatingPanel="YES" HUD="YES"/> |             <rect key="frame" x="0.0" y="0.0" width="221" height="72"/> | ||||||
|             <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> |  | ||||||
|             <rect key="contentRect" x="80" y="150" width="200" height="83"/> |  | ||||||
|             <rect key="screenRect" x="0.0" y="0.0" width="1440" height="900"/> |  | ||||||
|             <view key="contentView" id="tpZ-0B-QQu"> |  | ||||||
|                 <rect key="frame" x="0.0" y="0.0" width="222" height="83"/> |  | ||||||
|                 <autoresizingMask key="autoresizingMask"/> |  | ||||||
|             <subviews> |             <subviews> | ||||||
|                 <button translatesAutoresizingMaskIntoConstraints="NO" id="zPG-yW-4Gy"> |                 <button translatesAutoresizingMaskIntoConstraints="NO" id="zPG-yW-4Gy"> | ||||||
|                         <rect key="frame" x="18" y="47" width="186" height="18"/> |                     <rect key="frame" x="10" y="39" width="199" height="22"/> | ||||||
|                     <buttonCell key="cell" type="check" title="Load Quickly" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="alI-Mw-35c"> |                     <buttonCell key="cell" type="check" title="Load Quickly" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="alI-Mw-35c"> | ||||||
|                         <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> |                         <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> | ||||||
|                         <font key="font" metaFont="system"/> |                         <font key="font" metaFont="system"/> | ||||||
|                     </buttonCell> |                     </buttonCell> | ||||||
|                     <connections> |                     <connections> | ||||||
|                             <action selector="setFastLoading:" target="ZW7-Bw-4RP" id="yyv-gz-xoa"/> |                         <action selector="setFastLoading:" target="nbv-6C-VPa" id="tpC-fs-r5t"/> | ||||||
|                     </connections> |                     </connections> | ||||||
|                 </button> |                 </button> | ||||||
|                     <popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="rh8-km-57n"> |                 <popUpButton wantsLayer="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="rh8-km-57n"> | ||||||
|                         <rect key="frame" x="18" y="17" width="187" height="25"/> |                     <rect key="frame" x="9" y="8" width="204" height="25"/> | ||||||
|                     <popUpButtonCell key="cell" type="push" title="SCART" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="tJM-kX-gaK" id="8SX-c5-ud1"> |                     <popUpButtonCell key="cell" type="push" title="SCART" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="tJM-kX-gaK" id="8SX-c5-ud1"> | ||||||
|                         <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> |                         <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> | ||||||
|                         <font key="font" metaFont="menu"/> |                         <font key="font" metaFont="menu"/> | ||||||
| @@ -46,25 +41,26 @@ | |||||||
|                         </menu> |                         </menu> | ||||||
|                     </popUpButtonCell> |                     </popUpButtonCell> | ||||||
|                     <connections> |                     <connections> | ||||||
|                             <action selector="setDisplayType:" target="ZW7-Bw-4RP" id="PAH-CZ-zlk"/> |                         <action selector="setDisplayType:" target="nbv-6C-VPa" id="hhU-gc-qm2"/> | ||||||
|                     </connections> |                     </connections> | ||||||
|                 </popUpButton> |                 </popUpButton> | ||||||
|             </subviews> |             </subviews> | ||||||
|             <constraints> |             <constraints> | ||||||
|                     <constraint firstAttribute="trailing" secondItem="zPG-yW-4Gy" secondAttribute="trailing" constant="20" id="Mtb-hf-4ap"/> |                 <constraint firstAttribute="trailing" secondItem="zPG-yW-4Gy" secondAttribute="trailing" constant="12" id="Mtb-hf-4ap"/> | ||||||
|                 <constraint firstItem="rh8-km-57n" firstAttribute="top" secondItem="zPG-yW-4Gy" secondAttribute="bottom" constant="8" id="ScX-pe-t0x"/> |                 <constraint firstItem="rh8-km-57n" firstAttribute="top" secondItem="zPG-yW-4Gy" secondAttribute="bottom" constant="8" id="ScX-pe-t0x"/> | ||||||
|                     <constraint firstItem="rh8-km-57n" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="20" id="VRo-6R-IKd"/> |                 <constraint firstItem="rh8-km-57n" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="12" id="VRo-6R-IKd"/> | ||||||
|                     <constraint firstAttribute="bottom" secondItem="rh8-km-57n" secondAttribute="bottom" constant="20" id="g0Y-mW-nla"/> |                 <constraint firstAttribute="bottom" secondItem="rh8-km-57n" secondAttribute="bottom" constant="12" id="g0Y-mW-nla"/> | ||||||
|                     <constraint firstItem="zPG-yW-4Gy" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="20" id="imk-5k-8nm"/> |                 <constraint firstItem="zPG-yW-4Gy" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="12" id="imk-5k-8nm"/> | ||||||
|                     <constraint firstItem="zPG-yW-4Gy" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="20" id="jAt-iF-uaT"/> |                 <constraint firstItem="zPG-yW-4Gy" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="12" id="jAt-iF-uaT"/> | ||||||
|                     <constraint firstAttribute="trailing" secondItem="rh8-km-57n" secondAttribute="trailing" constant="20" id="urO-Ac-aqK"/> |                 <constraint firstAttribute="trailing" secondItem="rh8-km-57n" secondAttribute="trailing" constant="12" id="urO-Ac-aqK"/> | ||||||
|             </constraints> |             </constraints> | ||||||
|             </view> |             <point key="canvasLocation" x="-309.5" y="-24"/> | ||||||
|  |         </visualEffectView> | ||||||
|  |         <customObject id="nbv-6C-VPa" customClass="MachineController" customModule="Clock_Signal" customModuleProvider="target"> | ||||||
|             <connections> |             <connections> | ||||||
|                 <outlet property="displayTypeButton" destination="rh8-km-57n" id="FB2-Zg-VKq"/> |                 <outlet property="displayTypeButton" destination="rh8-km-57n" id="yf3-5z-J6H"/> | ||||||
|                 <outlet property="fastLoadingButton" destination="zPG-yW-4Gy" id="aMA-R2-EL8"/> |                 <outlet property="fastLoadingButton" destination="zPG-yW-4Gy" id="u4B-6W-Oez"/> | ||||||
|             </connections> |             </connections> | ||||||
|             <point key="canvasLocation" x="-50" y="16.5"/> |         </customObject> | ||||||
|         </window> |  | ||||||
|     </objects> |     </objects> | ||||||
| </document> | </document> | ||||||
|   | |||||||
| @@ -1,39 +1,34 @@ | |||||||
| <?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||||||
| <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14113" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> | <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="18122" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> | ||||||
|     <dependencies> |     <dependencies> | ||||||
|         <deployment identifier="macosx"/> |         <deployment identifier="macosx"/> | ||||||
|         <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14113"/> |         <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="18122"/> | ||||||
|         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> |         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | ||||||
|     </dependencies> |     </dependencies> | ||||||
|     <objects> |     <objects> | ||||||
|         <customObject id="-2" userLabel="File's Owner" customClass="MachineDocument" customModule="Clock_Signal" customModuleProvider="target"> |         <customObject id="-2" userLabel="File's Owner" customClass="MachineDocument" customModule="Clock_Signal" customModuleProvider="target"> | ||||||
|             <connections> |             <connections> | ||||||
|                 <outlet property="optionsPanel" destination="ZW7-Bw-4RP" id="JpE-wG-zRR"/> |                 <outlet property="optionsController" destination="bLp-5J-WqC" id="nhC-Od-QqW"/> | ||||||
|  |                 <outlet property="optionsView" destination="tpZ-0B-QQu" id="Uje-4H-rLo"/> | ||||||
|             </connections> |             </connections> | ||||||
|         </customObject> |         </customObject> | ||||||
|         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> |         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> | ||||||
|         <customObject id="-3" userLabel="Application" customClass="NSObject"/> |         <customObject id="-3" userLabel="Application" customClass="NSObject"/> | ||||||
|         <window title="Options" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" frameAutosaveName="" animationBehavior="default" id="ZW7-Bw-4RP" customClass="MachinePanel" customModule="Clock_Signal" customModuleProvider="target"> |         <visualEffectView hidden="YES" wantsLayer="YES" appearanceType="vibrantDark" blendingMode="withinWindow" material="HUDWindow" state="followsWindowActiveState" translatesAutoresizingMaskIntoConstraints="NO" id="tpZ-0B-QQu"> | ||||||
|             <windowStyleMask key="styleMask" titled="YES" closable="YES" utility="YES" nonactivatingPanel="YES" HUD="YES"/> |             <rect key="frame" x="0.0" y="0.0" width="200" height="71"/> | ||||||
|             <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> |  | ||||||
|             <rect key="contentRect" x="80" y="150" width="200" height="83"/> |  | ||||||
|             <rect key="screenRect" x="0.0" y="0.0" width="1440" height="900"/> |  | ||||||
|             <view key="contentView" id="tpZ-0B-QQu"> |  | ||||||
|                 <rect key="frame" x="0.0" y="0.0" width="200" height="83"/> |  | ||||||
|                 <autoresizingMask key="autoresizingMask"/> |  | ||||||
|             <subviews> |             <subviews> | ||||||
|                 <button translatesAutoresizingMaskIntoConstraints="NO" id="e1J-pw-zGw"> |                 <button translatesAutoresizingMaskIntoConstraints="NO" id="e1J-pw-zGw"> | ||||||
|                         <rect key="frame" x="18" y="47" width="164" height="18"/> |                     <rect key="frame" x="10" y="39" width="178" height="21"/> | ||||||
|                     <buttonCell key="cell" type="check" title="Load Quickly" bezelStyle="regularSquare" imagePosition="left" alignment="left" state="on" inset="2" id="tD6-UB-ESB"> |                     <buttonCell key="cell" type="check" title="Load Quickly" bezelStyle="regularSquare" imagePosition="left" alignment="left" state="on" inset="2" id="tD6-UB-ESB"> | ||||||
|                         <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> |                         <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> | ||||||
|                         <font key="font" metaFont="system"/> |                         <font key="font" metaFont="system"/> | ||||||
|                     </buttonCell> |                     </buttonCell> | ||||||
|                     <connections> |                     <connections> | ||||||
|                             <action selector="setFastLoading:" target="ZW7-Bw-4RP" id="JmG-Ks-jSh"/> |                         <action selector="setFastLoading:" target="bLp-5J-WqC" id="cKN-Dr-jRZ"/> | ||||||
|                     </connections> |                     </connections> | ||||||
|                 </button> |                 </button> | ||||||
|                     <popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="rh8-km-57n"> |                 <popUpButton wantsLayer="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="rh8-km-57n"> | ||||||
|                         <rect key="frame" x="18" y="17" width="165" height="26"/> |                     <rect key="frame" x="9" y="8" width="183" height="25"/> | ||||||
|                     <popUpButtonCell key="cell" type="push" title="RGB Monitor" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="tJM-kX-gaK" id="8SX-c5-ud1"> |                     <popUpButtonCell key="cell" type="push" title="RGB Monitor" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="tJM-kX-gaK" id="8SX-c5-ud1"> | ||||||
|                         <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> |                         <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> | ||||||
|                         <font key="font" metaFont="menu"/> |                         <font key="font" metaFont="menu"/> | ||||||
| @@ -46,24 +41,26 @@ | |||||||
|                         </menu> |                         </menu> | ||||||
|                     </popUpButtonCell> |                     </popUpButtonCell> | ||||||
|                     <connections> |                     <connections> | ||||||
|                             <action selector="setDisplayType:" target="ZW7-Bw-4RP" id="PAH-CZ-zlk"/> |                         <action selector="setDisplayType:" target="bLp-5J-WqC" id="tYR-gr-Qq6"/> | ||||||
|                     </connections> |                     </connections> | ||||||
|                 </popUpButton> |                 </popUpButton> | ||||||
|             </subviews> |             </subviews> | ||||||
|             <constraints> |             <constraints> | ||||||
|                 <constraint firstItem="rh8-km-57n" firstAttribute="top" secondItem="e1J-pw-zGw" secondAttribute="bottom" constant="8" id="GLg-6X-Lj2"/> |                 <constraint firstItem="rh8-km-57n" firstAttribute="top" secondItem="e1J-pw-zGw" secondAttribute="bottom" constant="8" id="GLg-6X-Lj2"/> | ||||||
|                     <constraint firstItem="e1J-pw-zGw" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="20" id="HSD-3d-Bl7"/> |                 <constraint firstItem="e1J-pw-zGw" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="12" id="HSD-3d-Bl7"/> | ||||||
|                     <constraint firstAttribute="trailing" secondItem="e1J-pw-zGw" secondAttribute="trailing" constant="20" id="Q9M-FH-92N"/> |                 <constraint firstAttribute="trailing" secondItem="e1J-pw-zGw" secondAttribute="trailing" constant="12" id="Q9M-FH-92N"/> | ||||||
|                     <constraint firstItem="rh8-km-57n" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="20" id="VRo-6R-IKd"/> |                 <constraint firstItem="rh8-km-57n" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="12" id="VRo-6R-IKd"/> | ||||||
|                     <constraint firstItem="e1J-pw-zGw" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="20" id="ul9-lf-Y3u"/> |                 <constraint firstAttribute="bottom" secondItem="rh8-km-57n" secondAttribute="bottom" constant="12" id="rwd-hx-LPv"/> | ||||||
|                     <constraint firstAttribute="trailing" secondItem="rh8-km-57n" secondAttribute="trailing" constant="20" id="urO-Ac-aqK"/> |                 <constraint firstItem="e1J-pw-zGw" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="12" id="ul9-lf-Y3u"/> | ||||||
|  |                 <constraint firstAttribute="trailing" secondItem="rh8-km-57n" secondAttribute="trailing" constant="12" id="urO-Ac-aqK"/> | ||||||
|             </constraints> |             </constraints> | ||||||
|             </view> |             <point key="canvasLocation" x="39" y="114.5"/> | ||||||
|  |         </visualEffectView> | ||||||
|  |         <customObject id="bLp-5J-WqC" customClass="MachineController" customModule="Clock_Signal" customModuleProvider="target"> | ||||||
|             <connections> |             <connections> | ||||||
|                 <outlet property="displayTypeButton" destination="rh8-km-57n" id="FB2-Zg-VKq"/> |                 <outlet property="displayTypeButton" destination="rh8-km-57n" id="uX3-tS-5Qu"/> | ||||||
|                 <outlet property="fastLoadingButton" destination="e1J-pw-zGw" id="jj7-OZ-mOH"/> |                 <outlet property="fastLoadingButton" destination="e1J-pw-zGw" id="x6U-1J-qCU"/> | ||||||
|             </connections> |             </connections> | ||||||
|             <point key="canvasLocation" x="175" y="45"/> |         </customObject> | ||||||
|         </window> |  | ||||||
|     </objects> |     </objects> | ||||||
| </document> | </document> | ||||||
|   | |||||||
| @@ -1,49 +1,45 @@ | |||||||
| <?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||||||
| <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14113" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> | <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="18122" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> | ||||||
|     <dependencies> |     <dependencies> | ||||||
|         <deployment identifier="macosx"/> |         <deployment identifier="macosx"/> | ||||||
|         <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14113"/> |         <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="18122"/> | ||||||
|         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> |         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | ||||||
|     </dependencies> |     </dependencies> | ||||||
|     <objects> |     <objects> | ||||||
|         <customObject id="-2" userLabel="File's Owner" customClass="MachineDocument" customModule="Clock_Signal" customModuleProvider="target"> |         <customObject id="-2" userLabel="File's Owner" customClass="MachineDocument" customModule="Clock_Signal" customModuleProvider="target"> | ||||||
|             <connections> |             <connections> | ||||||
|                 <outlet property="optionsPanel" destination="ZW7-Bw-4RP" id="JpE-wG-zRR"/> |                 <outlet property="optionsController" destination="cWS-AS-crO" id="KeQ-V1-s46"/> | ||||||
|  |                 <outlet property="optionsView" destination="e1J-pw-zGw" id="ALr-SV-afm"/> | ||||||
|             </connections> |             </connections> | ||||||
|         </customObject> |         </customObject> | ||||||
|         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> |         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> | ||||||
|         <customObject id="-3" userLabel="Application" customClass="NSObject"/> |         <customObject id="-3" userLabel="Application" customClass="NSObject"/> | ||||||
|         <window title="Options" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" frameAutosaveName="" animationBehavior="default" id="ZW7-Bw-4RP" customClass="MachinePanel" customModule="Clock_Signal" customModuleProvider="target"> |         <visualEffectView wantsLayer="YES" appearanceType="vibrantDark" blendingMode="withinWindow" material="HUDWindow" state="followsWindowActiveState" translatesAutoresizingMaskIntoConstraints="NO" id="tpZ-0B-QQu"> | ||||||
|             <windowStyleMask key="styleMask" titled="YES" closable="YES" utility="YES" nonactivatingPanel="YES" HUD="YES"/> |             <rect key="frame" x="0.0" y="0.0" width="200" height="44"/> | ||||||
|             <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> |  | ||||||
|             <rect key="contentRect" x="80" y="150" width="200" height="54"/> |  | ||||||
|             <rect key="screenRect" x="0.0" y="0.0" width="1440" height="900"/> |  | ||||||
|             <view key="contentView" id="tpZ-0B-QQu"> |  | ||||||
|                 <rect key="frame" x="0.0" y="0.0" width="200" height="54"/> |  | ||||||
|                 <autoresizingMask key="autoresizingMask"/> |  | ||||||
|             <subviews> |             <subviews> | ||||||
|                 <button translatesAutoresizingMaskIntoConstraints="NO" id="e1J-pw-zGw"> |                 <button translatesAutoresizingMaskIntoConstraints="NO" id="e1J-pw-zGw"> | ||||||
|                         <rect key="frame" x="18" y="18" width="164" height="18"/> |                     <rect key="frame" x="10" y="11" width="178" height="22"/> | ||||||
|                     <buttonCell key="cell" type="check" title="Load Quickly" bezelStyle="regularSquare" imagePosition="left" alignment="left" state="on" inset="2" id="tD6-UB-ESB"> |                     <buttonCell key="cell" type="check" title="Load Quickly" bezelStyle="regularSquare" imagePosition="left" alignment="left" state="on" inset="2" id="tD6-UB-ESB"> | ||||||
|                         <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> |                         <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> | ||||||
|                         <font key="font" metaFont="system"/> |                         <font key="font" metaFont="system"/> | ||||||
|                     </buttonCell> |                     </buttonCell> | ||||||
|                     <connections> |                     <connections> | ||||||
|                             <action selector="setFastLoading:" target="ZW7-Bw-4RP" id="JmG-Ks-jSh"/> |                         <action selector="setFastLoading:" target="cWS-AS-crO" id="aed-8n-jk7"/> | ||||||
|                     </connections> |                     </connections> | ||||||
|                 </button> |                 </button> | ||||||
|             </subviews> |             </subviews> | ||||||
|             <constraints> |             <constraints> | ||||||
|                     <constraint firstAttribute="bottom" secondItem="e1J-pw-zGw" secondAttribute="bottom" constant="20" id="5ce-DO-a4T"/> |                 <constraint firstAttribute="bottom" secondItem="e1J-pw-zGw" secondAttribute="bottom" constant="12" id="5ce-DO-a4T"/> | ||||||
|                     <constraint firstItem="e1J-pw-zGw" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="20" id="HSD-3d-Bl7"/> |                 <constraint firstItem="e1J-pw-zGw" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="12" id="HSD-3d-Bl7"/> | ||||||
|                     <constraint firstAttribute="trailing" secondItem="e1J-pw-zGw" secondAttribute="trailing" constant="20" id="Q9M-FH-92N"/> |                 <constraint firstAttribute="trailing" secondItem="e1J-pw-zGw" secondAttribute="trailing" constant="12" id="Q9M-FH-92N"/> | ||||||
|                     <constraint firstItem="e1J-pw-zGw" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="20" id="ul9-lf-Y3u"/> |                 <constraint firstItem="e1J-pw-zGw" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="12" id="ul9-lf-Y3u"/> | ||||||
|             </constraints> |             </constraints> | ||||||
|             </view> |             <point key="canvasLocation" x="-118" y="114"/> | ||||||
|  |         </visualEffectView> | ||||||
|  |         <customObject id="cWS-AS-crO" customClass="MachineController" customModule="Clock_Signal" customModuleProvider="target"> | ||||||
|             <connections> |             <connections> | ||||||
|                 <outlet property="fastLoadingButton" destination="e1J-pw-zGw" id="jj7-OZ-mOH"/> |                 <outlet property="fastLoadingButton" destination="e1J-pw-zGw" id="YjF-pM-Gum"/> | ||||||
|             </connections> |             </connections> | ||||||
|             <point key="canvasLocation" x="175" y="30"/> |         </customObject> | ||||||
|         </window> |  | ||||||
|     </objects> |     </objects> | ||||||
| </document> | </document> | ||||||
|   | |||||||
| @@ -1,77 +1,73 @@ | |||||||
| <?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||||||
| <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14113" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> | <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="18122" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> | ||||||
|     <dependencies> |     <dependencies> | ||||||
|         <deployment identifier="macosx"/> |         <deployment identifier="macosx"/> | ||||||
|         <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14113"/> |         <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="18122"/> | ||||||
|         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> |         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | ||||||
|     </dependencies> |     </dependencies> | ||||||
|     <objects> |     <objects> | ||||||
|         <customObject id="-2" userLabel="File's Owner" customClass="MachineDocument" customModule="Clock_Signal" customModuleProvider="target"> |         <customObject id="-2" userLabel="File's Owner" customClass="MachineDocument" customModule="Clock_Signal" customModuleProvider="target"> | ||||||
|             <connections> |             <connections> | ||||||
|                 <outlet property="optionsPanel" destination="ota-g7-hOL" id="zeO-di-9i3"/> |                 <outlet property="optionsController" destination="ehh-jE-OeP" id="e6i-od-09b"/> | ||||||
|  |                 <outlet property="optionsView" destination="7Pv-WL-2Rq" id="2Qq-nM-Xap"/> | ||||||
|             </connections> |             </connections> | ||||||
|         </customObject> |         </customObject> | ||||||
|         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> |         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> | ||||||
|         <customObject id="-3" userLabel="Application" customClass="NSObject"/> |         <customObject id="-3" userLabel="Application" customClass="NSObject"/> | ||||||
|         <window title="Options" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" frameAutosaveName="" animationBehavior="default" id="ota-g7-hOL" customClass="ZX8081OptionsPanel" customModule="Clock_Signal" customModuleProvider="target"> |         <visualEffectView hidden="YES" wantsLayer="YES" appearanceType="vibrantDark" blendingMode="behindWindow" material="HUDWindow" state="followsWindowActiveState" translatesAutoresizingMaskIntoConstraints="NO" id="7Pv-WL-2Rq"> | ||||||
|             <windowStyleMask key="styleMask" titled="YES" closable="YES" utility="YES" nonactivatingPanel="YES" HUD="YES"/> |             <rect key="frame" x="0.0" y="0.0" width="267" height="100"/> | ||||||
|             <windowPositionMask key="initialPositionMask" leftStrut="YES" topStrut="YES"/> |  | ||||||
|             <rect key="contentRect" x="80" y="150" width="261" height="100"/> |  | ||||||
|             <rect key="screenRect" x="0.0" y="0.0" width="1440" height="900"/> |  | ||||||
|             <view key="contentView" id="7Pv-WL-2Rq"> |  | ||||||
|                 <rect key="frame" x="0.0" y="0.0" width="261" height="100"/> |  | ||||||
|                 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> |  | ||||||
|             <subviews> |             <subviews> | ||||||
|                     <button translatesAutoresizingMaskIntoConstraints="NO" id="sBT-cU-h7s"> |                 <button ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="sBT-cU-h7s"> | ||||||
|                         <rect key="frame" x="18" y="64" width="225" height="18"/> |                     <rect key="frame" x="10" y="63" width="245" height="18"/> | ||||||
|                     <buttonCell key="cell" type="check" title="Load Tapes Quickly" bezelStyle="regularSquare" imagePosition="left" alignment="left" state="on" inset="2" id="w0l-ha-esm"> |                     <buttonCell key="cell" type="check" title="Load Tapes Quickly" bezelStyle="regularSquare" imagePosition="left" alignment="left" state="on" inset="2" id="w0l-ha-esm"> | ||||||
|                         <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> |                         <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> | ||||||
|                         <font key="font" metaFont="system"/> |                         <font key="font" metaFont="system"/> | ||||||
|                     </buttonCell> |                     </buttonCell> | ||||||
|                     <connections> |                     <connections> | ||||||
|                             <action selector="setFastLoading:" target="ota-g7-hOL" id="me0-h2-Ga5"/> |                         <action selector="setFastLoading:" target="ehh-jE-OeP" id="QEr-7F-9Ms"/> | ||||||
|                     </connections> |                     </connections> | ||||||
|                 </button> |                 </button> | ||||||
|                     <button translatesAutoresizingMaskIntoConstraints="NO" id="qSb-72-6Os"> |                 <button ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="qSb-72-6Os"> | ||||||
|                         <rect key="frame" x="18" y="44" width="225" height="18"/> |                     <rect key="frame" x="10" y="41" width="245" height="18"/> | ||||||
|                     <buttonCell key="cell" type="check" title="Control Tape Motor Automatically" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="CzC-YT-lgA"> |                     <buttonCell key="cell" type="check" title="Control Tape Motor Automatically" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="CzC-YT-lgA"> | ||||||
|                         <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> |                         <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> | ||||||
|                         <font key="font" metaFont="system"/> |                         <font key="font" metaFont="system"/> | ||||||
|                     </buttonCell> |                     </buttonCell> | ||||||
|                     <connections> |                     <connections> | ||||||
|                             <action selector="setAutomaticTapeMotorConrol:" target="ota-g7-hOL" id="bpF-1P-tga"/> |                         <action selector="setAutomaticTapeMotorConrol:" target="ehh-jE-OeP" id="CgR-12-6cc"/> | ||||||
|                     </connections> |                     </connections> | ||||||
|                 </button> |                 </button> | ||||||
|                     <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="tkN-gI-RmT"> |                 <button wantsLayer="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="tkN-gI-RmT"> | ||||||
|                         <rect key="frame" x="20" y="19" width="221" height="19"/> |                     <rect key="frame" x="12" y="11" width="243" height="19"/> | ||||||
|                     <buttonCell key="cell" type="roundRect" title="Play Tape" bezelStyle="roundedRect" alignment="center" enabled="NO" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="cTq-f9-Gzx"> |                     <buttonCell key="cell" type="roundRect" title="Play Tape" bezelStyle="roundedRect" alignment="center" enabled="NO" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="cTq-f9-Gzx"> | ||||||
|                         <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> |                         <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> | ||||||
|                         <font key="font" metaFont="cellTitle"/> |                         <font key="font" metaFont="cellTitle"/> | ||||||
|                     </buttonCell> |                     </buttonCell> | ||||||
|                     <connections> |                     <connections> | ||||||
|                             <action selector="playOrPauseTape:" target="ota-g7-hOL" id="O0K-pL-nOr"/> |                         <action selector="playOrPauseTape:" target="ehh-jE-OeP" id="lxp-zi-DWI"/> | ||||||
|                     </connections> |                     </connections> | ||||||
|                 </button> |                 </button> | ||||||
|             </subviews> |             </subviews> | ||||||
|             <constraints> |             <constraints> | ||||||
|                     <constraint firstItem="qSb-72-6Os" firstAttribute="leading" secondItem="7Pv-WL-2Rq" secondAttribute="leading" constant="20" id="05p-Jn-ueX"/> |                 <constraint firstItem="qSb-72-6Os" firstAttribute="leading" secondItem="7Pv-WL-2Rq" secondAttribute="leading" constant="12" id="05p-Jn-ueX"/> | ||||||
|                     <constraint firstAttribute="trailing" secondItem="sBT-cU-h7s" secondAttribute="trailing" constant="20" id="79b-2A-2c7"/> |                 <constraint firstAttribute="trailing" secondItem="sBT-cU-h7s" secondAttribute="trailing" constant="12" id="79b-2A-2c7"/> | ||||||
|                     <constraint firstItem="sBT-cU-h7s" firstAttribute="top" secondItem="7Pv-WL-2Rq" secondAttribute="top" constant="20" id="E5m-wo-X92"/> |                 <constraint firstItem="sBT-cU-h7s" firstAttribute="top" secondItem="7Pv-WL-2Rq" secondAttribute="top" constant="12" id="E5m-wo-X92"/> | ||||||
|                     <constraint firstItem="qSb-72-6Os" firstAttribute="top" secondItem="sBT-cU-h7s" secondAttribute="bottom" constant="6" id="WxD-kP-vwf"/> |                 <constraint firstItem="qSb-72-6Os" firstAttribute="top" secondItem="sBT-cU-h7s" secondAttribute="bottom" constant="6" symbolic="YES" id="WxD-kP-vwf"/> | ||||||
|                     <constraint firstAttribute="bottom" secondItem="tkN-gI-RmT" secondAttribute="bottom" constant="20" id="Xnu-On-nOA"/> |                 <constraint firstAttribute="bottom" secondItem="tkN-gI-RmT" secondAttribute="bottom" constant="12" id="Xnu-On-nOA"/> | ||||||
|                     <constraint firstItem="tkN-gI-RmT" firstAttribute="leading" secondItem="7Pv-WL-2Rq" secondAttribute="leading" constant="20" id="fHf-K0-PsU"/> |                 <constraint firstItem="tkN-gI-RmT" firstAttribute="leading" secondItem="7Pv-WL-2Rq" secondAttribute="leading" constant="12" id="fHf-K0-PsU"/> | ||||||
|                 <constraint firstItem="tkN-gI-RmT" firstAttribute="top" secondItem="qSb-72-6Os" secondAttribute="bottom" constant="8" id="gLh-vE-Cqk"/> |                 <constraint firstItem="tkN-gI-RmT" firstAttribute="top" secondItem="qSb-72-6Os" secondAttribute="bottom" constant="8" id="gLh-vE-Cqk"/> | ||||||
|                     <constraint firstAttribute="trailing" secondItem="qSb-72-6Os" secondAttribute="trailing" constant="20" id="mQz-p8-aYf"/> |                 <constraint firstAttribute="trailing" secondItem="qSb-72-6Os" secondAttribute="trailing" constant="12" id="mQz-p8-aYf"/> | ||||||
|                     <constraint firstItem="sBT-cU-h7s" firstAttribute="leading" secondItem="7Pv-WL-2Rq" secondAttribute="leading" constant="20" id="nDy-Xc-Ug9"/> |                 <constraint firstItem="sBT-cU-h7s" firstAttribute="leading" secondItem="7Pv-WL-2Rq" secondAttribute="leading" constant="12" id="nDy-Xc-Ug9"/> | ||||||
|                     <constraint firstAttribute="trailing" secondItem="tkN-gI-RmT" secondAttribute="trailing" constant="20" id="vgD-A3-m6T"/> |                 <constraint firstAttribute="trailing" secondItem="tkN-gI-RmT" secondAttribute="trailing" constant="12" id="vgD-A3-m6T"/> | ||||||
|             </constraints> |             </constraints> | ||||||
|             </view> |             <point key="canvasLocation" x="38.5" y="118"/> | ||||||
|  |         </visualEffectView> | ||||||
|  |         <customObject id="ehh-jE-OeP" customClass="ZX8081Controller" customModule="Clock_Signal" customModuleProvider="target"> | ||||||
|             <connections> |             <connections> | ||||||
|                 <outlet property="automaticTapeMotorControlButton" destination="qSb-72-6Os" id="bB6-FP-TKM"/> |                 <outlet property="automaticTapeMotorControlButton" destination="qSb-72-6Os" id="SBE-HT-AUj"/> | ||||||
|                 <outlet property="fastLoadingButton" destination="sBT-cU-h7s" id="uWa-EB-mbd"/> |                 <outlet property="fastLoadingButton" destination="sBT-cU-h7s" id="3oI-QE-BRI"/> | ||||||
|                 <outlet property="playOrPauseTapeButton" destination="tkN-gI-RmT" id="UnJ-nb-3mv"/> |                 <outlet property="playOrPauseTapeButton" destination="tkN-gI-RmT" id="cX3-Tp-ZFT"/> | ||||||
|             </connections> |             </connections> | ||||||
|             <point key="canvasLocation" x="28.5" y="15"/> |         </customObject> | ||||||
|         </window> |  | ||||||
|     </objects> |     </objects> | ||||||
| </document> | </document> | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ | |||||||
| //  Copyright 2021 Thomas Harte. All rights reserved. | //  Copyright 2021 Thomas Harte. All rights reserved. | ||||||
| // | // | ||||||
| 
 | 
 | ||||||
| class AppleIIOptionsPanel: MachinePanel { | class AppleIIController: MachineController { | ||||||
| 	var appleII: CSAppleII! { | 	var appleII: CSAppleII! { | ||||||
| 		get { | 		get { | ||||||
| 			return self.machine.appleII | 			return self.machine.appleII | ||||||
| @@ -6,7 +6,7 @@ | |||||||
| //  Copyright 2016 Thomas Harte. All rights reserved. | //  Copyright 2016 Thomas Harte. All rights reserved. | ||||||
| // | // | ||||||
| 
 | 
 | ||||||
| class Atari2600OptionsPanel: MachinePanel { | class Atari2600OptionsController: MachineController { | ||||||
| 	var atari2600: CSAtari2600! { | 	var atari2600: CSAtari2600! { | ||||||
| 		get { | 		get { | ||||||
| 			return self.machine.atari2600 | 			return self.machine.atari2600 | ||||||
| @@ -1,5 +1,5 @@ | |||||||
| // | // | ||||||
| //  MachinePanel.swift | //  MachineController.swift | ||||||
| //  Clock Signal | //  Clock Signal | ||||||
| // | // | ||||||
| //  Created by Thomas Harte on 02/10/2016. | //  Created by Thomas Harte on 02/10/2016. | ||||||
| @@ -8,7 +8,7 @@ | |||||||
| 
 | 
 | ||||||
| import Cocoa | import Cocoa | ||||||
| 
 | 
 | ||||||
| class MachinePanel: NSPanel { | class MachineController: NSObject { | ||||||
| 	var machine: CSMachine! | 	var machine: CSMachine! | ||||||
| 
 | 
 | ||||||
| 	// MARK: IBActions | 	// MARK: IBActions | ||||||
| @@ -46,24 +46,15 @@ class MachineDocument: | |||||||
| 	/// The OpenGL view to receive this machine's display. | 	/// The OpenGL view to receive this machine's display. | ||||||
| 	@IBOutlet weak var scanTargetView: CSScanTargetView! | 	@IBOutlet weak var scanTargetView: CSScanTargetView! | ||||||
|  |  | ||||||
| 	/// The options panel, if any. | 	/// The options view, if any. | ||||||
| 	@IBOutlet var optionsPanel: MachinePanel! | 	@IBOutlet var optionsView: NSView! | ||||||
|  | 	@IBOutlet var optionsController: MachineController! | ||||||
| 	/// An action to display the options panel, if there is one. |  | ||||||
| 	@IBAction func showOptions(_ sender: AnyObject!) { |  | ||||||
| 		optionsPanel?.setIsVisible(true) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/// The activity panel, if one is deemed appropriate. | 	/// The activity panel, if one is deemed appropriate. | ||||||
| 	@IBOutlet var activityPanel: NSPanel! | 	@IBOutlet var activityView: NSView! | ||||||
|  |  | ||||||
| 	/// An action to display the activity panel, if there is one. |  | ||||||
| 	@IBAction func showActivity(_ sender: AnyObject!) { |  | ||||||
| 		activityPanel.setIsVisible(true) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/// The volume view. | 	/// The volume view. | ||||||
| 	@IBOutlet var volumeView: NSBox! | 	@IBOutlet var volumeView: NSView! | ||||||
| 	@IBOutlet var volumeSlider: NSSlider! | 	@IBOutlet var volumeSlider: NSSlider! | ||||||
|  |  | ||||||
| 	// MARK: - NSDocument Overrides and NSWindowDelegate methods. | 	// MARK: - NSDocument Overrides and NSWindowDelegate methods. | ||||||
| @@ -87,14 +78,6 @@ class MachineDocument: | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	private func dismissPanels() { |  | ||||||
| 		activityPanel?.setIsVisible(false) |  | ||||||
| 		activityPanel = nil |  | ||||||
|  |  | ||||||
| 		optionsPanel?.setIsVisible(false) |  | ||||||
| 		optionsPanel = nil |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	override func close() { | 	override func close() { | ||||||
| 		// Close any dangling sheets. | 		// Close any dangling sheets. | ||||||
| 		// | 		// | ||||||
| @@ -112,9 +95,6 @@ class MachineDocument: | |||||||
| 		// Stop the machine, if any. | 		// Stop the machine, if any. | ||||||
| 		machine?.stop() | 		machine?.stop() | ||||||
|  |  | ||||||
| 		// Dismiss panels. |  | ||||||
| 		dismissPanels() |  | ||||||
|  |  | ||||||
| 		// End the update cycle. | 		// End the update cycle. | ||||||
| 		actionLock.lock() | 		actionLock.lock() | ||||||
| 		drawLock.lock() | 		drawLock.lock() | ||||||
| @@ -134,7 +114,9 @@ class MachineDocument: | |||||||
| 	override func windowControllerDidLoadNib(_ aController: NSWindowController) { | 	override func windowControllerDidLoadNib(_ aController: NSWindowController) { | ||||||
| 		super.windowControllerDidLoadNib(aController) | 		super.windowControllerDidLoadNib(aController) | ||||||
| 		aController.window?.contentAspectRatio = self.aspectRatio() | 		aController.window?.contentAspectRatio = self.aspectRatio() | ||||||
| 		volumeSlider.floatValue = userDefaultsVolume() | 		volumeSlider.floatValue = pow(2.0, userDefaultsVolume()) | ||||||
|  |  | ||||||
|  | 		volumeView.layer!.cornerRadius = 5.0 | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	private var missingROMs: String = "" | 	private var missingROMs: String = "" | ||||||
| @@ -171,9 +153,10 @@ class MachineDocument: | |||||||
| 	func windowDidUpdate(_ notification: Notification) { | 	func windowDidUpdate(_ notification: Notification) { | ||||||
| 		if self.windowControllers.count > 0, let window = self.windowControllers[0].window, window.isVisible { | 		if self.windowControllers.count > 0, let window = self.windowControllers[0].window, window.isVisible { | ||||||
| 			// Grab the regular window title, if it's not already stored. | 			// Grab the regular window title, if it's not already stored. | ||||||
| 			if self.unadornedWindowTitle.count == 0 { | 			if self.unadornedWindowTitle == "" { | ||||||
| 				self.unadornedWindowTitle = window.title | 				self.unadornedWindowTitle = window.title | ||||||
| 			} | 			} | ||||||
|  | 			updateWindowTitle() | ||||||
|  |  | ||||||
| 			// If an interaction mode is not yet in effect, pick the proper one and display the relevant thing. | 			// If an interaction mode is not yet in effect, pick the proper one and display the relevant thing. | ||||||
| 			if self.interactionMode == .notStarted { | 			if self.interactionMode == .notStarted { | ||||||
| @@ -200,7 +183,11 @@ class MachineDocument: | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// MARK: - Connections Between Machine and the Outside World | 	func windowDidEnterFullScreen(_ notification: Notification) { | ||||||
|  | 		updateActivityViewVisibility() | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// MARK: - Connections Between Machine and the Outside World. | ||||||
|  |  | ||||||
| 	private func setupMachineOutput() { | 	private func setupMachineOutput() { | ||||||
| 		if let machine = self.machine, let scanTargetView = self.scanTargetView, machine.view != scanTargetView { | 		if let machine = self.machine, let scanTargetView = self.scanTargetView, machine.view != scanTargetView { | ||||||
| @@ -208,16 +195,38 @@ class MachineDocument: | |||||||
| 			let aspectRatio = self.aspectRatio() | 			let aspectRatio = self.aspectRatio() | ||||||
| 			machine.setView(scanTargetView, aspectRatio: Float(aspectRatio.width / aspectRatio.height)) | 			machine.setView(scanTargetView, aspectRatio: Float(aspectRatio.width / aspectRatio.height)) | ||||||
|  |  | ||||||
| 			// Get rid of all existing accessory panels. |  | ||||||
| 			dismissPanels() |  | ||||||
|  |  | ||||||
| 			// Attach an options panel if one is available. | 			// Attach an options panel if one is available. | ||||||
| 			if let optionsPanelNibName = self.machineDescription?.optionsPanelNibName { | 			if let optionsNibName = self.machineDescription?.optionsNibName { | ||||||
| 				Bundle.main.loadNibNamed(optionsPanelNibName, owner: self, topLevelObjects: nil) | 				Bundle.main.loadNibNamed(optionsNibName, owner: self, topLevelObjects: nil) | ||||||
| 				self.optionsPanel.machine = machine | 				if let optionsController = self.optionsController { | ||||||
| 				self.optionsPanel?.establishStoredOptions() | 					optionsController.machine = machine | ||||||
| 				showOptions(self) | 					optionsController.establishStoredOptions() | ||||||
| 				} | 				} | ||||||
|  | 				if let optionsView = self.optionsView, let superview = self.volumeView.superview { | ||||||
|  | 					// Apply rounded edges. | ||||||
|  | 					optionsView.layer!.cornerRadius = 5.0 | ||||||
|  |  | ||||||
|  | 					// Add to the superview. | ||||||
|  | 					superview.addSubview(optionsView) | ||||||
|  |  | ||||||
|  | 					// Apply constraints to appear centred and above the volume view. | ||||||
|  | 					let constraints = [ | ||||||
|  | 						optionsView.centerXAnchor.constraint(equalTo: volumeView.centerXAnchor), | ||||||
|  | 						optionsView.bottomAnchor.constraint(equalTo: volumeView.topAnchor, constant: -8.0), | ||||||
|  | 					] | ||||||
|  | 					superview.addConstraints(constraints) | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			// Set up a fader for the volume and options. | ||||||
|  | 			var fadingViews: [NSView] = [] | ||||||
|  | 			if let optionsView = self.optionsView { | ||||||
|  | 				fadingViews.append(optionsView) | ||||||
|  | 			} | ||||||
|  | 			if let volumeView = self.volumeView { | ||||||
|  | 				fadingViews.append(volumeView) | ||||||
|  | 			} | ||||||
|  | 			optionsFader = ViewFader(views: fadingViews) | ||||||
|  |  | ||||||
| 			// Create and populate an activity display if required. | 			// Create and populate an activity display if required. | ||||||
| 			setupActivityDisplay() | 			setupActivityDisplay() | ||||||
| @@ -390,6 +399,7 @@ class MachineDocument: | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// MARK: - MachinePicker Outlets and Actions | 	// MARK: - MachinePicker Outlets and Actions | ||||||
|  |  | ||||||
| 	@IBOutlet var machinePicker: MachinePicker? | 	@IBOutlet var machinePicker: MachinePicker? | ||||||
| 	@IBOutlet var machinePickerPanel: NSWindow? | 	@IBOutlet var machinePickerPanel: NSWindow? | ||||||
| 	@IBAction func createMachine(_ sender: NSButton?) { | 	@IBAction func createMachine(_ sender: NSButton?) { | ||||||
| @@ -408,6 +418,7 @@ class MachineDocument: | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// MARK: - ROMRequester Outlets and Actions | 	// MARK: - ROMRequester Outlets and Actions | ||||||
|  |  | ||||||
| 	@IBOutlet var romRequesterPanel: NSWindow? | 	@IBOutlet var romRequesterPanel: NSWindow? | ||||||
| 	@IBOutlet var romRequesterText: NSTextField? | 	@IBOutlet var romRequesterText: NSTextField? | ||||||
| 	@IBOutlet var romReceiverErrorField: NSTextField? | 	@IBOutlet var romReceiverErrorField: NSTextField? | ||||||
| @@ -512,7 +523,8 @@ class MachineDocument: | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// MARK: Joystick-via-the-keyboard selection | 	// MARK: - Joystick-via-the-keyboard selection. | ||||||
|  |  | ||||||
| 	@IBAction func useKeyboardAsPhysicalKeyboard(_ sender: NSMenuItem?) { | 	@IBAction func useKeyboardAsPhysicalKeyboard(_ sender: NSMenuItem?) { | ||||||
| 		machine.inputMode = .keyboardPhysical | 		machine.inputMode = .keyboardPhysical | ||||||
| 	} | 	} | ||||||
| @@ -558,9 +570,6 @@ class MachineDocument: | |||||||
| 					menuItem.state = machine.inputMode == .joystick ? .on : .off | 					menuItem.state = machine.inputMode == .joystick ? .on : .off | ||||||
| 					return true | 					return true | ||||||
|  |  | ||||||
| 				case #selector(self.showActivity(_:)): |  | ||||||
| 					return self.activityPanel != nil |  | ||||||
|  |  | ||||||
| 				case #selector(self.insertMedia(_:)): | 				case #selector(self.insertMedia(_:)): | ||||||
| 					return self.machine != nil && self.machine.canInsertMedia | 					return self.machine != nil && self.machine.canInsertMedia | ||||||
|  |  | ||||||
| @@ -570,6 +579,8 @@ class MachineDocument: | |||||||
| 		return super.validateUserInterfaceItem(item) | 		return super.validateUserInterfaceItem(item) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	// MARK: - Screenshots. | ||||||
|  |  | ||||||
| 	/// Saves a screenshot of the machine's current display. | 	/// Saves a screenshot of the machine's current display. | ||||||
| 	@IBAction func saveScreenshot(_ sender: AnyObject!) { | 	@IBAction func saveScreenshot(_ sender: AnyObject!) { | ||||||
| 		// Grab a date formatter and form a file name. | 		// Grab a date formatter and form a file name. | ||||||
| @@ -591,38 +602,57 @@ class MachineDocument: | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// MARK: - Window Title Updates. | 	// MARK: - Window Title Updates. | ||||||
|  |  | ||||||
| 	private var unadornedWindowTitle = "" | 	private var unadornedWindowTitle = "" | ||||||
|  | 	private var mouseIsCaptured = false | ||||||
|  | 	private var windowTitleSuffix = "" | ||||||
|  |  | ||||||
|  | 	private func updateWindowTitle() { | ||||||
|  | 		var title = self.unadornedWindowTitle | ||||||
|  | 		if windowTitleSuffix != "" { | ||||||
|  | 			title += windowTitleSuffix | ||||||
|  | 		} | ||||||
|  | 		if mouseIsCaptured { | ||||||
|  | 			title += " (press ⌘+control to release mouse)" | ||||||
|  | 		} | ||||||
|  | 		self.windowControllers[0].window?.title = title | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	internal func scanTargetViewDidCaptureMouse(_ view: CSScanTargetView) { | 	internal func scanTargetViewDidCaptureMouse(_ view: CSScanTargetView) { | ||||||
| 		self.windowControllers[0].window?.title = self.unadornedWindowTitle + " (press ⌘+control to release mouse)" | 		mouseIsCaptured = true | ||||||
|  | 		updateWindowTitle() | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	internal func scanTargetViewDidReleaseMouse(_ view: CSScanTargetView) { | 	internal func scanTargetViewDidReleaseMouse(_ view: CSScanTargetView) { | ||||||
| 		self.windowControllers[0].window?.title = self.unadornedWindowTitle | 		mouseIsCaptured = false | ||||||
|  | 		updateWindowTitle() | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// MARK: - Activity Display. | 	// MARK: - Activity Display. | ||||||
|  |  | ||||||
| 	private class LED { | 	private class LED { | ||||||
| 		let levelIndicator: NSLevelIndicator | 		let levelIndicator: NSLevelIndicator | ||||||
| 		init(levelIndicator: NSLevelIndicator) { | 		init(levelIndicator: NSLevelIndicator, isPersistent: Bool) { | ||||||
| 			self.levelIndicator = levelIndicator | 			self.levelIndicator = levelIndicator | ||||||
|  | 			self.isPersistent = isPersistent | ||||||
| 		} | 		} | ||||||
| 		var isLit = false | 		var isLit = false | ||||||
| 		var isBlinking = false | 		var isBlinking = false | ||||||
|  | 		var isPersistent = false | ||||||
| 	} | 	} | ||||||
| 	private var leds: [String: LED] = [:] | 	private var leds: [String: LED] = [:] | ||||||
|  | 	private var activityFader: ViewFader! = nil | ||||||
|  |  | ||||||
| 	func setupActivityDisplay() { | 	func setupActivityDisplay() { | ||||||
| 		var leds = machine.leds | 		var leds = machine.leds | ||||||
| 		if leds.count > 0 { | 		if leds.count > 0 { | ||||||
| 			Bundle.main.loadNibNamed("Activity", owner: self, topLevelObjects: nil) | 			Bundle.main.loadNibNamed("Activity", owner: self, topLevelObjects: nil) | ||||||
| 			showActivity(nil) |  | ||||||
|  |  | ||||||
| 			// Inspect the activity panel for indicators. | 			// Inspect the activity panel for indicators. | ||||||
| 			var activityIndicators: [NSLevelIndicator] = [] | 			var activityIndicators: [NSLevelIndicator] = [] | ||||||
| 			var textFields: [NSTextField] = [] | 			var textFields: [NSTextField] = [] | ||||||
| 			if let contentView = self.activityPanel.contentView { | 			if let activityView = self.activityView { | ||||||
| 				for view in contentView.subviews { | 				for view in activityView.subviews { | ||||||
| 					if let levelIndicator = view as? NSLevelIndicator { | 					if let levelIndicator = view as? NSLevelIndicator { | ||||||
| 						activityIndicators.append(levelIndicator) | 						activityIndicators.append(levelIndicator) | ||||||
| 					} | 					} | ||||||
| @@ -646,20 +676,34 @@ class MachineDocument: | |||||||
|  |  | ||||||
| 			// Apply labels and create leds entries. | 			// Apply labels and create leds entries. | ||||||
| 			for c in 0 ..< leds.count { | 			for c in 0 ..< leds.count { | ||||||
| 				textFields[c].stringValue = leds[c] | 				textFields[c].stringValue = leds[c].name | ||||||
| 				self.leds[leds[c]] = LED(levelIndicator: activityIndicators[c]) | 				self.leds[leds[c].name] = LED(levelIndicator: activityIndicators[c], isPersistent: leds[c].isPersisent) | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			// Add a constraints to minimise window height. | 			// Create a fader. | ||||||
| 			let heightConstraint = NSLayoutConstraint( | 			activityFader = ViewFader(views: [self.activityView!]) | ||||||
| 				item: self.activityPanel.contentView!, |  | ||||||
| 				attribute: .bottom, | 			// Add view to window, and constrain. | ||||||
| 				relatedBy: .equal, | 			if let superview = activityIndicators[leds.count-1].superview { | ||||||
| 				toItem: activityIndicators[leds.count-1], | 				superview.addConstraint( | ||||||
| 				attribute: .bottom, | 					activityIndicators[leds.count-1].bottomAnchor.constraint(equalTo: activityIndicators[leds.count-1].superview!.bottomAnchor, constant: -8.0) | ||||||
| 				multiplier: 1.0, | 				) | ||||||
| 				constant: 20.0) | 			} | ||||||
| 			self.activityPanel.contentView?.addConstraint(heightConstraint) | 			if let windowView = self.volumeView.superview { | ||||||
|  | 				windowView.addSubview(self.activityView) | ||||||
|  |  | ||||||
|  | 				let constraints = [ | ||||||
|  | 					self.activityView.rightAnchor.constraint(equalTo: windowView.rightAnchor), | ||||||
|  | 					self.activityView.topAnchor.constraint(equalTo: windowView.topAnchor), | ||||||
|  | 				] | ||||||
|  | 				windowView.addConstraints(constraints) | ||||||
|  |  | ||||||
|  | 				activityView.layer!.cornerRadius = 5.0 | ||||||
|  | 				activityView.layer!.maskedCorners = [.layerMinXMinYCorner] | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			// Show or hide activity view as per current state. | ||||||
|  | 			updateActivityViewVisibility(true) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -669,7 +713,7 @@ class MachineDocument: | |||||||
| 		// pile up — allow there to be only one in flight at a time. | 		// pile up — allow there to be only one in flight at a time. | ||||||
| 		if let led = leds[ledName] { | 		if let led = leds[ledName] { | ||||||
| 			DispatchQueue.main.async { | 			DispatchQueue.main.async { | ||||||
| 				if !led.isBlinking { | 				if !led.isBlinking && led.isLit { | ||||||
| 					led.levelIndicator.floatValue = 0.0 | 					led.levelIndicator.floatValue = 0.0 | ||||||
| 					led.isBlinking = true | 					led.isBlinking = true | ||||||
|  |  | ||||||
| @@ -685,62 +729,128 @@ class MachineDocument: | |||||||
| 	func machine(_ machine: CSMachine, led ledName: String, didChangeToLit isLit: Bool) { | 	func machine(_ machine: CSMachine, led ledName: String, didChangeToLit isLit: Bool) { | ||||||
| 		// If there is such an LED, switch it appropriately. | 		// If there is such an LED, switch it appropriately. | ||||||
| 		if let led = leds[ledName] { | 		if let led = leds[ledName] { | ||||||
| 			DispatchQueue.main.async { | 			DispatchQueue.main.async { [self] in | ||||||
|  | 				// Do nothing for no change of state. | ||||||
|  | 				if led.isLit == isLit { | ||||||
|  | 					return | ||||||
|  | 				} | ||||||
|  |  | ||||||
| 				led.levelIndicator.floatValue = isLit ? 1.0 : 0.0 | 				led.levelIndicator.floatValue = isLit ? 1.0 : 0.0 | ||||||
| 				led.isLit = isLit | 				led.isLit = isLit | ||||||
|  |  | ||||||
|  | 				// Possibly show or hide the activity subview. | ||||||
|  | 				self.updateActivityViewVisibility(false, changed: ledName) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	private func updateActivityViewVisibility(_ isAppLaunch : Bool = false, changed: String? = nil) { | ||||||
|  | 		if let window = self.windowControllers.first?.window, let activityFader = self.activityFader { | ||||||
|  | 			// Rules applied below: | ||||||
|  | 			// | ||||||
|  | 			// Fullscreen: | ||||||
|  | 			//	(i) always show activity view if any persistent LEDs are present; | ||||||
|  | 			//	(ii) otherwise, show activity view only while at least one LED is lit. | ||||||
|  | 			// | ||||||
|  | 			// Windowed: | ||||||
|  | 			//	(i) show while any non-persistent LED is lit; | ||||||
|  | 			//	(ii) show transiently to indicate a change of state in any persistent LED. | ||||||
|  | 			// | ||||||
|  | 			let hasLitLEDs = !self.leds.filter { | ||||||
|  | 				$0.value.isLit && (!$0.value.isPersistent || window.styleMask.contains(.fullScreen)) || | ||||||
|  | 				($0.value.isPersistent && window.styleMask.contains(.fullScreen)) | ||||||
|  | 			}.isEmpty | ||||||
|  | 			let shouldShowTransient = !window.styleMask.contains(.fullScreen) && changed != nil && self.leds[changed!]!.isPersistent | ||||||
|  |  | ||||||
|  | 			if hasLitLEDs { | ||||||
|  | 				activityFader.animateIn() | ||||||
|  | 			} else if shouldShowTransient { | ||||||
|  | 				activityFader.showTransiently(for: 1.0) | ||||||
|  | 			} else { | ||||||
|  | 				activityFader.animateOut(delay: 0.2) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// MARK: - In-window panels (i.e. options, volume). | ||||||
|  |  | ||||||
|  | 	private var optionsFader: ViewFader! = nil | ||||||
|  |  | ||||||
|  | 	internal func scanTargetViewDidShowOSMouseCursor(_ view: CSScanTargetView) { | ||||||
|  | 		// The OS mouse cursor became visible, so show the volume controls. | ||||||
|  | 		optionsFader.animateIn() | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	internal func scanTargetViewWouldHideOSMouseCursor(_ view: CSScanTargetView) { | ||||||
|  | 		// The OS mouse cursor will be hidden, so hide the volume controls. | ||||||
|  | 		optionsFader.animateOut(delay: 0.0) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// MARK: - Helpers for fading things in and out. | ||||||
|  |  | ||||||
|  | 	/// Maintains a list of views and offers in-and-out animations on those, | ||||||
|  | 	/// testing current state as necessary and otherwise coordinating with | ||||||
|  | 	/// CoreAnimation. | ||||||
|  | 	private class ViewFader: NSObject, CAAnimationDelegate { | ||||||
|  | 		private var views: [NSView] | ||||||
|  |  | ||||||
|  | 		init(views: [NSView]) { | ||||||
|  | 			self.views = views | ||||||
|  | 			for view in views { | ||||||
|  | 				view.isHidden = true | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		func animationDidStop(_ animation: CAAnimation, finished: Bool) { | ||||||
|  | 			if finished { | ||||||
|  | 				for view in views { | ||||||
|  | 					view.isHidden = true | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		func animateIn() { | ||||||
|  | 			for view in views { | ||||||
|  | 				view.layer?.removeAllAnimations() | ||||||
|  | 				view.isHidden = false | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		func animateOut(delay : TimeInterval) { | ||||||
|  | 			// Do nothing if already animating out or invisible. | ||||||
|  | 			if views[0].isHidden || views[0].layer?.animation(forKey: "opacity") != nil { | ||||||
|  | 				return | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			for view in views { | ||||||
|  | 				let fadeAnimation = CABasicAnimation(keyPath: "opacity") | ||||||
|  | 				fadeAnimation.beginTime = CACurrentMediaTime() + delay | ||||||
|  | 				fadeAnimation.fromValue = 1.0 | ||||||
|  | 				fadeAnimation.toValue = 0.0 | ||||||
|  | 				fadeAnimation.duration = 0.2 | ||||||
|  | 				fadeAnimation.delegate = self | ||||||
|  |  | ||||||
|  | 				fadeAnimation.fillMode = .forwards | ||||||
|  | 				fadeAnimation.isRemovedOnCompletion = false | ||||||
|  |  | ||||||
|  | 				view.layer?.removeAllAnimations() | ||||||
|  | 				view.layer!.add(fadeAnimation, forKey: "opacity") | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		func showTransiently(for period: TimeInterval) { | ||||||
|  | 			animateIn() | ||||||
|  | 			animateOut(delay: period) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	// MARK: - Volume Control. | 	// MARK: - Volume Control. | ||||||
|  |  | ||||||
| 	@IBAction func setVolume(_ sender: NSSlider!) { | 	@IBAction func setVolume(_ sender: NSSlider!) { | ||||||
| 		if let machine = self.machine { | 		if let machine = self.machine { | ||||||
| 			machine.setVolume(sender.floatValue) | 			let linearValue = log2(sender.floatValue) | ||||||
| 			setUserDefaultsVolume(sender.floatValue) | 			machine.setVolume(linearValue) | ||||||
| 		} | 			setUserDefaultsVolume(linearValue) | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// This class is pure nonsense to work around Xcode's opaque behaviour. |  | ||||||
| 	// If I make the main class a sub of CAAnimationDelegate then the compiler |  | ||||||
| 	// generates a bridging header that doesn't include QuartzCore and therefore |  | ||||||
| 	// can't find a declaration of the CAAnimationDelegate protocol. Doesn't |  | ||||||
| 	// seem to matter what I add explicitly to the link stage, which version of |  | ||||||
| 	// macOS I set as the target, etc. |  | ||||||
| 	// |  | ||||||
| 	// So, the workaround: make my CAAnimationDelegate something that doesn't |  | ||||||
| 	// appear in the bridging header. |  | ||||||
| 	fileprivate class ViewFader: NSObject, CAAnimationDelegate { |  | ||||||
| 		var volumeView: NSView |  | ||||||
|  |  | ||||||
| 		init(view: NSView) { |  | ||||||
| 			volumeView = view |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		func animationDidStop(_ anim: CAAnimation, finished flag: Bool) { |  | ||||||
| 			volumeView.isHidden = true |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	fileprivate var animationFader: ViewFader? = nil |  | ||||||
|  |  | ||||||
| 	internal func scanTargetViewDidShowOSMouseCursor(_ view: CSScanTargetView) { |  | ||||||
| 		// The OS mouse cursor became visible, so show the volume controls. |  | ||||||
| 		animationFader = nil |  | ||||||
| 		volumeView.layer?.removeAllAnimations() |  | ||||||
| 		volumeView.isHidden = false |  | ||||||
| 		volumeView.layer?.opacity = 1.0 |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	internal func scanTargetViewWillHideOSMouseCursor(_ view: CSScanTargetView) { |  | ||||||
| 		// The OS mouse cursor will be hidden, so hide the volume controls. |  | ||||||
| 		if !volumeView.isHidden && volumeView.layer?.animation(forKey: "opacity") == nil { |  | ||||||
| 			let fadeAnimation = CABasicAnimation(keyPath: "opacity") |  | ||||||
| 			fadeAnimation.fromValue = 1.0 |  | ||||||
| 			fadeAnimation.toValue = 0.0 |  | ||||||
| 			fadeAnimation.duration = 0.2 |  | ||||||
| 			animationFader = ViewFader(view: volumeView) |  | ||||||
| 			fadeAnimation.delegate = animationFader |  | ||||||
| 			volumeView.layer?.add(fadeAnimation, forKey: "opacity") |  | ||||||
| 			volumeView.layer?.opacity = 0.0 |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ | |||||||
| //  Copyright 2017 Thomas Harte. All rights reserved. | //  Copyright 2017 Thomas Harte. All rights reserved. | ||||||
| // | // | ||||||
| 
 | 
 | ||||||
| class ZX8081OptionsPanel: MachinePanel { | class ZX8081Controller: MachineController { | ||||||
| 	var zx8081: CSZX8081! { | 	var zx8081: CSZX8081! { | ||||||
| 		get { | 		get { | ||||||
| 			return self.machine.zx8081 | 			return self.machine.zx8081 | ||||||
| @@ -33,6 +33,11 @@ typedef NS_ENUM(NSInteger, CSMachineKeyboardInputMode) { | |||||||
| 	CSMachineKeyboardInputModeJoystick, | 	CSMachineKeyboardInputModeJoystick, | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @interface CSMachineLED: NSObject | ||||||
|  | @property(nonatomic, nonnull, readonly) NSString *name; | ||||||
|  | @property(nonatomic, readonly) BOOL isPersisent; | ||||||
|  | @end | ||||||
|  |  | ||||||
| // Deliberately low; to ensure CSMachine has been declared as an @class already. | // Deliberately low; to ensure CSMachine has been declared as an @class already. | ||||||
| #import "CSAtari2600.h" | #import "CSAtari2600.h" | ||||||
| #import "CSZX8081.h" | #import "CSZX8081.h" | ||||||
| @@ -99,7 +104,7 @@ typedef NS_ENUM(NSInteger, CSMachineKeyboardInputMode) { | |||||||
| @property (nonatomic, nullable) CSJoystickManager *joystickManager; | @property (nonatomic, nullable) CSJoystickManager *joystickManager; | ||||||
|  |  | ||||||
| // LED list. | // LED list. | ||||||
| @property (nonatomic, readonly, nonnull) NSArray<NSString *> *leds; | @property (nonatomic, readonly, nonnull) NSArray<CSMachineLED *> *leds; | ||||||
|  |  | ||||||
| // Special-case accessors; undefined behaviour if accessed for a machine not of the corresponding type. | // Special-case accessors; undefined behaviour if accessed for a machine not of the corresponding type. | ||||||
| @property (nonatomic, readonly, nullable) CSAtari2600 *atari2600; | @property (nonatomic, readonly, nullable) CSAtari2600 *atari2600; | ||||||
|   | |||||||
| @@ -37,7 +37,7 @@ | |||||||
| @interface CSMachine() <CSScanTargetViewDisplayLinkDelegate> | @interface CSMachine() <CSScanTargetViewDisplayLinkDelegate> | ||||||
| - (void)speaker:(Outputs::Speaker::Speaker *)speaker didCompleteSamples:(const int16_t *)samples length:(int)length; | - (void)speaker:(Outputs::Speaker::Speaker *)speaker didCompleteSamples:(const int16_t *)samples length:(int)length; | ||||||
| - (void)speakerDidChangeInputClock:(Outputs::Speaker::Speaker *)speaker; | - (void)speakerDidChangeInputClock:(Outputs::Speaker::Speaker *)speaker; | ||||||
| - (void)addLED:(NSString *)led; | - (void)addLED:(NSString *)led isPersistent:(BOOL)isPersistent; | ||||||
| @end | @end | ||||||
|  |  | ||||||
| struct LockProtectedDelegate { | struct LockProtectedDelegate { | ||||||
| @@ -61,8 +61,8 @@ struct SpeakerDelegate: public Outputs::Speaker::Speaker::Delegate, public LockP | |||||||
| }; | }; | ||||||
|  |  | ||||||
| struct ActivityObserver: public Activity::Observer { | struct ActivityObserver: public Activity::Observer { | ||||||
| 	void register_led(const std::string &name) final { | 	void register_led(const std::string &name, uint8_t flags) final { | ||||||
| 		[machine addLED:[NSString stringWithUTF8String:name.c_str()]]; | 		[machine addLED:[NSString stringWithUTF8String:name.c_str()] isPersistent:flags & Activity::Observer::LEDPresentation::Persistent]; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	void set_led_status(const std::string &name, bool lit) final { | 	void set_led_status(const std::string &name, bool lit) final { | ||||||
| @@ -76,6 +76,19 @@ struct ActivityObserver: public Activity::Observer { | |||||||
| 	__unsafe_unretained CSMachine *machine; | 	__unsafe_unretained CSMachine *machine; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @implementation CSMachineLED | ||||||
|  |  | ||||||
|  | - (instancetype)initWithName:(NSString *)name isPersistent:(BOOL)isPersistent { | ||||||
|  | 	self = [super init]; | ||||||
|  | 	if(self) { | ||||||
|  | 		_name = name; | ||||||
|  | 		_isPersisent = isPersistent; | ||||||
|  | 	} | ||||||
|  | 	return self; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @end | ||||||
|  |  | ||||||
| @implementation CSMachine { | @implementation CSMachine { | ||||||
| 	SpeakerDelegate _speakerDelegate; | 	SpeakerDelegate _speakerDelegate; | ||||||
| 	ActivityObserver _activityObserver; | 	ActivityObserver _activityObserver; | ||||||
| @@ -86,7 +99,7 @@ struct ActivityObserver: public Activity::Observer { | |||||||
| 	MachineTypes::JoystickMachine *_joystickMachine; | 	MachineTypes::JoystickMachine *_joystickMachine; | ||||||
|  |  | ||||||
| 	CSJoystickManager *_joystickManager; | 	CSJoystickManager *_joystickManager; | ||||||
| 	NSMutableArray<NSString *> *_leds; | 	NSMutableArray<CSMachineLED *> *_leds; | ||||||
|  |  | ||||||
| 	CSHighPrecisionTimer *_timer; | 	CSHighPrecisionTimer *_timer; | ||||||
| 	std::atomic_flag _isUpdating; | 	std::atomic_flag _isUpdating; | ||||||
| @@ -623,11 +636,11 @@ struct ActivityObserver: public Activity::Observer { | |||||||
|  |  | ||||||
| #pragma mark - Activity observation | #pragma mark - Activity observation | ||||||
|  |  | ||||||
| - (void)addLED:(NSString *)led { | - (void)addLED:(NSString *)led isPersistent:(BOOL)isPersistent { | ||||||
| 	[_leds addObject:led]; | 	[_leds addObject:[[CSMachineLED alloc] initWithName:led isPersistent:isPersistent]]; | ||||||
| } | } | ||||||
|  |  | ||||||
| - (NSArray<NSString *> *)leds { | - (NSArray<CSMachineLED *> *)leds { | ||||||
| 	return _leds; | 	return _leds; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -134,7 +134,7 @@ typedef int Kilobytes; | |||||||
| - (instancetype)initWithZX80MemorySize:(Kilobytes)memorySize useZX81ROM:(BOOL)useZX81ROM; | - (instancetype)initWithZX80MemorySize:(Kilobytes)memorySize useZX81ROM:(BOOL)useZX81ROM; | ||||||
| - (instancetype)initWithZX81MemorySize:(Kilobytes)memorySize; | - (instancetype)initWithZX81MemorySize:(Kilobytes)memorySize; | ||||||
|  |  | ||||||
| @property(nonatomic, readonly, nullable) NSString *optionsPanelNibName; | @property(nonatomic, readonly, nullable) NSString *optionsNibName; | ||||||
| @property(nonatomic, readonly) NSString *displayName; | @property(nonatomic, readonly) NSString *displayName; | ||||||
|  |  | ||||||
| @end | @end | ||||||
|   | |||||||
| @@ -313,7 +313,7 @@ static Analyser::Static::ZX8081::Target::MemoryModel ZX8081MemoryModelFromSize(K | |||||||
|  |  | ||||||
| // MARK: - NIB mapping | // MARK: - NIB mapping | ||||||
|  |  | ||||||
| - (NSString *)optionsPanelNibName { | - (NSString *)optionsNibName { | ||||||
| 	switch(_targets.front()->machine) { | 	switch(_targets.front()->machine) { | ||||||
| //		case Analyser::Machine::AmstradCPC:		return @"QuickLoadCompositeOptions"; | //		case Analyser::Machine::AmstradCPC:		return @"QuickLoadCompositeOptions"; | ||||||
| 		case Analyser::Machine::AmstradCPC:		return @"CompositeOptions"; | 		case Analyser::Machine::AmstradCPC:		return @"CompositeOptions"; | ||||||
|   | |||||||
| @@ -80,10 +80,12 @@ | |||||||
| - (void)scanTargetViewDidShowOSMouseCursor:(nonnull CSScanTargetView *)view; | - (void)scanTargetViewDidShowOSMouseCursor:(nonnull CSScanTargetView *)view; | ||||||
|  |  | ||||||
| /*! | /*! | ||||||
| 	Announces that the OS mouse cursor will now be hidden. | 	Announces that the OS mouse cursor would now be hidden; 'would' means that if this is not | ||||||
|  | 	a mouse capture-enabled view then it will be hidden, but otherwise it might or might not be | ||||||
|  | 	as per whatever is user-friendly. | ||||||
| 	@param view The view making the announcement. | 	@param view The view making the announcement. | ||||||
| */ | */ | ||||||
| - (void)scanTargetViewWillHideOSMouseCursor:(nonnull CSScanTargetView *)view; | - (void)scanTargetViewWouldHideOSMouseCursor:(nonnull CSScanTargetView *)view; | ||||||
|  |  | ||||||
| /*! | /*! | ||||||
| 	Announces receipt of a file by drag and drop to the delegate. | 	Announces receipt of a file by drag and drop to the delegate. | ||||||
|   | |||||||
| @@ -14,6 +14,9 @@ | |||||||
|  |  | ||||||
| #include <stdatomic.h> | #include <stdatomic.h> | ||||||
|  |  | ||||||
|  | static const NSTimeInterval standardMouseHideInterval = 3.0; | ||||||
|  | static const NSTimeInterval quickMouseHideInterval = 0.1; | ||||||
|  |  | ||||||
| @interface CSScanTargetView () <NSDraggingDestination, CSApplicationEventDelegate> | @interface CSScanTargetView () <NSDraggingDestination, CSApplicationEventDelegate> | ||||||
| @end | @end | ||||||
|  |  | ||||||
| @@ -237,28 +240,31 @@ static CVReturn DisplayLinkCallback(__unused CVDisplayLinkRef displayLink, const | |||||||
| 	[self addTrackingArea:_mouseTrackingArea]; | 	[self addTrackingArea:_mouseTrackingArea]; | ||||||
| } | } | ||||||
|  |  | ||||||
| - (void)scheduleMouseHide { | - (void)scheduleMouseHideAfter:(NSTimeInterval)interval { | ||||||
| 	if(!self.shouldCaptureMouse) { |  | ||||||
| 	[_mouseHideTimer invalidate]; | 	[_mouseHideTimer invalidate]; | ||||||
|  |  | ||||||
| 		_mouseHideTimer = [NSTimer scheduledTimerWithTimeInterval:3.0 repeats:NO block:^(__unused NSTimer * _Nonnull timer) { | 	_mouseHideTimer = [NSTimer scheduledTimerWithTimeInterval:interval repeats:NO block:^(__unused NSTimer * _Nonnull timer) { | ||||||
|  | 		// Don't actually hide the mouse if this is a mouse-capture machine; that makes | ||||||
|  | 		// it fairly confusing as to current application state. | ||||||
|  | 		if(!self.shouldCaptureMouse) { | ||||||
| 			[NSCursor setHiddenUntilMouseMoves:YES]; | 			[NSCursor setHiddenUntilMouseMoves:YES]; | ||||||
| 			[self.responderDelegate scanTargetViewWillHideOSMouseCursor:self]; |  | ||||||
| 		}]; |  | ||||||
| 		} | 		} | ||||||
|  | 		[self.responderDelegate scanTargetViewWouldHideOSMouseCursor:self]; | ||||||
|  | 	}]; | ||||||
| } | } | ||||||
|  |  | ||||||
| - (void)mouseEntered:(NSEvent *)event { | - (void)mouseEntered:(NSEvent *)event { | ||||||
| 	[self.responderDelegate scanTargetViewDidShowOSMouseCursor:self]; |  | ||||||
| 	[super mouseEntered:event]; | 	[super mouseEntered:event]; | ||||||
| 	[self scheduleMouseHide]; |  | ||||||
|  | 	[self.responderDelegate scanTargetViewDidShowOSMouseCursor:self]; | ||||||
|  | 	[self scheduleMouseHideAfter:standardMouseHideInterval]; | ||||||
| } | } | ||||||
|  |  | ||||||
| - (void)mouseExited:(NSEvent *)event { | - (void)mouseExited:(NSEvent *)event { | ||||||
| 	[super mouseExited:event]; | 	[super mouseExited:event]; | ||||||
| 	[_mouseHideTimer invalidate]; |  | ||||||
| 	_mouseHideTimer = nil; | 	// Schedule a really short mouse-hiding interval. | ||||||
| 	[self.responderDelegate scanTargetViewWillHideOSMouseCursor:self]; | 	[self scheduleMouseHideAfter:quickMouseHideInterval]; | ||||||
| } | } | ||||||
|  |  | ||||||
| - (void)releaseMouse { | - (void)releaseMouse { | ||||||
| @@ -275,13 +281,12 @@ static CVReturn DisplayLinkCallback(__unused CVDisplayLinkRef displayLink, const | |||||||
| #pragma mark - Mouse motion | #pragma mark - Mouse motion | ||||||
|  |  | ||||||
| - (void)applyMouseMotion:(NSEvent *)event { | - (void)applyMouseMotion:(NSEvent *)event { | ||||||
| 	if(!self.shouldCaptureMouse) { | 	if(!_mouseIsCaptured) { | ||||||
| 		// Mouse capture is off, so don't play games with the cursor, just schedule it to | 		// Mouse capture is off, so don't play games with the cursor, just schedule it to | ||||||
| 		// hide in the near future. | 		// hide in the near future. | ||||||
| 		[self scheduleMouseHide]; | 		[self scheduleMouseHideAfter:standardMouseHideInterval]; | ||||||
| 		[self.responderDelegate scanTargetViewDidShowOSMouseCursor:self]; | 		[self.responderDelegate scanTargetViewDidShowOSMouseCursor:self]; | ||||||
| 	} else { | 	} else { | ||||||
| 		if(_mouseIsCaptured) { |  | ||||||
| 		// Mouse capture is on, so move the cursor back to the middle of the window, and | 		// Mouse capture is on, so move the cursor back to the middle of the window, and | ||||||
| 		// forward the deltas to the listener. | 		// forward the deltas to the listener. | ||||||
| 		// | 		// | ||||||
| @@ -296,9 +301,6 @@ static CVReturn DisplayLinkCallback(__unused CVDisplayLinkRef displayLink, const | |||||||
| 		)); | 		)); | ||||||
|  |  | ||||||
| 		[self.responderDelegate mouseMoved:event]; | 		[self.responderDelegate mouseMoved:event]; | ||||||
| 		} else { |  | ||||||
| 			[self.responderDelegate scanTargetViewDidShowOSMouseCursor:self]; |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -330,7 +332,7 @@ static CVReturn DisplayLinkCallback(__unused CVDisplayLinkRef displayLink, const | |||||||
| 			_mouseIsCaptured = YES; | 			_mouseIsCaptured = YES; | ||||||
| 			[NSCursor hide]; | 			[NSCursor hide]; | ||||||
| 			CGAssociateMouseAndMouseCursorPosition(false); | 			CGAssociateMouseAndMouseCursorPosition(false); | ||||||
| 			[self.responderDelegate scanTargetViewWillHideOSMouseCursor:self]; | 			[self.responderDelegate scanTargetViewWouldHideOSMouseCursor:self]; | ||||||
| 			[self.responderDelegate scanTargetViewDidCaptureMouse:self]; | 			[self.responderDelegate scanTargetViewDidCaptureMouse:self]; | ||||||
| 			if(self.shouldUsurpCommand) { | 			if(self.shouldUsurpCommand) { | ||||||
| 				((CSApplication *)[NSApplication sharedApplication]).eventDelegate = self; | 				((CSApplication *)[NSApplication sharedApplication]).eventDelegate = self; | ||||||
|   | |||||||
| @@ -1323,7 +1323,7 @@ void MainWindow::addActivityObserver() { | |||||||
| 	activitySource->set_activity_observer(this); | 	activitySource->set_activity_observer(this); | ||||||
| } | } | ||||||
|  |  | ||||||
| void MainWindow::register_led(const std::string &name) { | void MainWindow::register_led(const std::string &name, uint8_t) { | ||||||
| 	std::lock_guard guard(ledStatusesLock); | 	std::lock_guard guard(ledStatusesLock); | ||||||
| 	ledStatuses[name] = false; | 	ledStatuses[name] = false; | ||||||
| 	QMetaObject::invokeMethod(this, "updateStatusBarText"); | 	QMetaObject::invokeMethod(this, "updateStatusBarText"); | ||||||
|   | |||||||
| @@ -152,7 +152,7 @@ class MainWindow : public QMainWindow, public Outputs::Speaker::Speaker::Delegat | |||||||
|  |  | ||||||
| 		KeyboardMapper keyMapper; | 		KeyboardMapper keyMapper; | ||||||
|  |  | ||||||
| 		void register_led(const std::string &) override; | 		void register_led(const std::string &, uint8_t) override; | ||||||
| 		void set_led_status(const std::string &, bool) override; | 		void set_led_status(const std::string &, bool) override; | ||||||
|  |  | ||||||
| 		std::recursive_mutex ledStatusesLock; | 		std::recursive_mutex ledStatusesLock; | ||||||
|   | |||||||
| @@ -271,7 +271,7 @@ class ActivityObserver: public Activity::Observer { | |||||||
|  |  | ||||||
| 	private: | 	private: | ||||||
| 		std::vector<std::string> leds_; | 		std::vector<std::string> leds_; | ||||||
| 		void register_led(const std::string &name) final { | 		void register_led(const std::string &name, uint8_t) final { | ||||||
| 			std::lock_guard lock_guard(mutex); | 			std::lock_guard lock_guard(mutex); | ||||||
| 			leds_.push_back(name); | 			leds_.push_back(name); | ||||||
| 		} | 		} | ||||||
|   | |||||||
| @@ -2,6 +2,8 @@ | |||||||
| # Clock Signal | # Clock Signal | ||||||
| Clock Signal ('CLK') is an emulator for tourists that seeks to be invisible. Users directly launch classic software, avoiding the learning curves associated with emulators and with classic machines. | Clock Signal ('CLK') is an emulator for tourists that seeks to be invisible. Users directly launch classic software, avoiding the learning curves associated with emulators and with classic machines. | ||||||
|  |  | ||||||
|  | macOS and source releases are [hosted on GitHub](https://github.com/TomHarte/CLK/releases). For desktop Linux it is also available as a [Snap](https://snapcraft.io/clock-signal).  | ||||||
|  |  | ||||||
| This emulator seeks to offer: | This emulator seeks to offer: | ||||||
| * single-click load of any piece of source media for any supported platform; | * single-click load of any piece of source media for any supported platform; | ||||||
| * with a heavy signal processing tilt for accurate reproduction of original outputs; | * with a heavy signal processing tilt for accurate reproduction of original outputs; | ||||||
| @@ -23,7 +25,7 @@ It currently contains emulations of the: | |||||||
| * Sinclair ZX80/81; and | * Sinclair ZX80/81; and | ||||||
| * Sinclair ZX Spectrum. | * Sinclair ZX Spectrum. | ||||||
|  |  | ||||||
| macOS and source releases are [hosted on GitHub](https://github.com/TomHarte/CLK/releases). For desktop Linux it is also available as a [Snap](https://snapcraft.io/clock-signal). On the Mac it is a native Cocoa and Metal application; under Linux, BSD and other UNIXes and UNIX-alikes it uses OpenGL and can be built either with Qt or with SDL. | On the Mac it is a native Cocoa and Metal application; under Linux, BSD and other UNIXes and UNIX-alikes it uses OpenGL and can be built either with Qt or with SDL. | ||||||
|  |  | ||||||
| ## Single-step Loading | ## Single-step Loading | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user