1
0
mirror of https://github.com/TomHarte/CLK.git synced 2025-10-26 17:17:58 +00:00

Compare commits

...

49 Commits

Author SHA1 Message Date
Thomas Harte
5bfedff8d1 Mutate dangling printf to a LOG. 2021-07-16 17:32:05 -04:00
Thomas Harte
c8638c0ffb Merge pull request #977 from TomHarte/MouseFade
Slightly adjusts macOS mouse hiding semantics.
2021-07-16 17:25:59 -04:00
Thomas Harte
8a95b91e2a Merge pull request #976 from TomHarte/DiskIIClocking
Correct Disk II sleeping test to allow for spin-down.
2021-07-16 17:22:04 -04:00
Thomas Harte
c226be612f Slightly adjusts mouse hiding semantics.
This allows the Macintosh and ST to fade out volume and settings even without having captured the mouse.
2021-07-16 17:21:25 -04:00
Thomas Harte
c8699d9770 Correct Disk II sleeping test to allow for spin-down. 2021-07-16 17:12:57 -04:00
Thomas Harte
a0799e14cc Merge pull request #975 from TomHarte/LEDStyles
Classify some LEDs as 'persistent'
2021-07-15 22:05:14 -04:00
Thomas Harte
dea6048849 Add documentation. 2021-07-15 22:00:10 -04:00
Thomas Harte
813e252539 Ignore hidden files. 2021-07-15 21:57:25 -04:00
Thomas Harte
b41e29a83b Slows CPC typer to avoid dropped characters. 2021-07-15 21:54:02 -04:00
Thomas Harte
d35c7ad127 Take advantage of persistence flag for more intelligent LED presentation. 2021-07-15 21:49:11 -04:00
Thomas Harte
ea63415d0e Exposes persistent LED flag to Swift. 2021-07-15 21:34:14 -04:00
Thomas Harte
52ea3b741c Introduces a presentation flag for LEDs.
All existing receivers ignore it.
2021-07-15 21:26:02 -04:00
Thomas Harte
2731ca8c92 Merge pull request #974 from TomHarte/KickstartROMs
Introduces Amiga ROMs to the catalogue.
2021-07-15 21:14:50 -04:00
Thomas Harte
af1ade9433 Introduces Amiga ROMs to the catalogue. 2021-07-15 21:09:20 -04:00
Thomas Harte
fc248951cc Merge pull request #973 from TomHarte/TransientActivity
Converts activity indicators to transient in-window presentation.
2021-07-15 20:15:33 -04:00
Thomas Harte
84547ee1c1 Reduce spurious in-window appearances. 2021-07-15 19:53:40 -04:00
Thomas Harte
a42848c62f Add windowed LED reappearance upon blink.
Also fix crash-at-startup for fullscreen.
2021-07-15 19:51:23 -04:00
Thomas Harte
c7b5d69431 Add extra usage hint. 2021-07-15 19:50:43 -04:00
Thomas Harte
81374b70b5 Switch to transient LED presentation in windowed mode. 2021-07-15 19:22:23 -04:00
Thomas Harte
47a530fd5c Fixes LED ordering.
Still work to do on capturing the proper window title.
2021-07-14 22:01:42 -04:00
Thomas Harte
58451d7c0c Attempts to incorporate LEDs into the window title when in windowed mode. 2021-07-14 21:43:58 -04:00
Thomas Harte
5c8f8c76fe Thus ends the View menu. 2021-07-14 21:02:58 -04:00
Thomas Harte
ae1d1bdb5b Wires up controller for QuickLoadOptions. 2021-07-14 21:02:04 -04:00
Thomas Harte
33cc1154a2 Simplify ViewFader and avoid second-guessing when to hard-set opacity. 2021-07-14 20:50:41 -04:00
Thomas Harte
4bc0b75c30 Ensure Macintosh controller is effective. 2021-07-14 20:50:12 -04:00
Thomas Harte
eb8ec1efb1 Makes ViewFader the full master of fading. 2021-07-14 19:03:44 -04:00
Thomas Harte
616f8efc47 Improves optional hysteresis. 2021-07-13 23:40:15 -04:00
Thomas Harte
29e4369420 Attempts to switch activity indicators to smart in-window presentation. 2021-07-13 23:32:00 -04:00
Thomas Harte
bd7f7bc8d7 Remove dead 'show options'. 2021-07-13 22:28:03 -04:00
Thomas Harte
e689ca92c4 Minor rearrangements, for cleanliness. 2021-07-13 22:26:50 -04:00
Thomas Harte
4ef3005072 Merge pull request #972 from TomHarte/InWindowOptions
macOS: moves machine options into the emulation window
2021-07-13 22:06:08 -04:00
Thomas Harte
174c837767 Switches to a logarithmic volume dial. 2021-07-13 21:45:07 -04:00
Thomas Harte
486bb911a9 Adapts ZX80/81 options. 2021-07-13 21:26:20 -04:00
Thomas Harte
754221d697 Adapts QuickLoadOptions.
Not that it currently seems to be used.
2021-07-13 21:21:02 -04:00
Thomas Harte
3c36c90729 Adapts QuickLoadCompositeOptions. 2021-07-13 21:17:52 -04:00
Thomas Harte
3d1d15a25b Updates the Oric options. 2021-07-13 19:32:23 -04:00
Thomas Harte
000d99f26c Adapts the Macintosh options. 2021-07-13 19:26:29 -04:00
Thomas Harte
524e2abc8c Adapts composite options. 2021-07-13 19:19:47 -04:00
Thomas Harte
00bab98e09 Converts the Apple II options into an in-window view. 2021-07-13 19:14:54 -04:00
Thomas Harte
6d98349be1 Fully invests in options controllers, distinct from the views.
Per MVC, I should have been doing something closer to this from day one.
2021-07-13 19:04:24 -04:00
Thomas Harte
d24d153c08 Use modern constraint specification, add layers to XIBs. 2021-07-12 22:55:53 -04:00
Thomas Harte
b01561712c Tightens spacing slightly. 2021-07-12 22:49:42 -04:00
Thomas Harte
324edcb391 Starts towards using an in-window options panel.
With the same fade in/out behaviour as the volume control.
2021-07-12 22:38:08 -04:00
Thomas Harte
6e62e4e296 Merge branch 'master' of github.com:TomHarte/CLK 2021-07-12 22:01:25 -04:00
Thomas Harte
f81ecbf4a0 Force icons back to white. 2021-07-12 22:01:19 -04:00
Thomas Harte
4370456323 Switch to an NSVisualEffectView for volume controls.
It provides a background that better contrasts with arbitrary content.
2021-07-12 21:28:04 -04:00
Thomas Harte
a424ed7c00 Makes for slightly more straightforward constraints. 2021-07-12 19:25:06 -04:00
Thomas Harte
a2065f59a1 Adds a 0.1 second pause before exit-related menu fadeout.
This is because the system may post a quick succession of exits and enters if the view hierarchy changes.
2021-07-12 19:12:04 -04:00
Thomas Harte
c1bd7f5c67 Pull release links up closer to the lede. 2021-07-12 10:03:03 -04:00
36 changed files with 891 additions and 764 deletions

View File

@@ -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.

View File

@@ -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;
} }

View 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.

View File

@@ -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.

View File

@@ -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;
}; };

View File

@@ -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_);
} }

View File

@@ -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();
} }

View File

@@ -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;

View File

@@ -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,

View File

@@ -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 */,

View File

@@ -1,113 +1,105 @@
<?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"/> <rect key="frame" x="0.0" y="0.0" width="200" height="131"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> <subviews>
<rect key="contentRect" x="300" y="76" width="200" height="131"/> <levelIndicator verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ySY-ir-hzb" userLabel="First indicator">
<rect key="screenRect" x="0.0" y="0.0" width="1440" height="900"/> <rect key="frame" x="8" y="105" width="16" height="18"/>
<view key="contentView" id="tpZ-0B-QQu"> <constraints>
<rect key="frame" x="0.0" y="0.0" width="200" height="131"/> <constraint firstAttribute="width" secondItem="ySY-ir-hzb" secondAttribute="height" multiplier="1:1" id="UX0-hT-7Td"/>
<autoresizingMask key="autoresizingMask"/> </constraints>
<subviews> <levelIndicatorCell key="cell" alignment="left" maxValue="1" warningValue="2" criticalValue="2" levelIndicatorStyle="continuousCapacity" id="DhQ-Di-tRT"/>
<levelIndicator verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ySY-ir-hzb" userLabel="First indicator"> </levelIndicator>
<rect key="frame" x="20" y="95" width="17" height="16"/> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Tah-UQ-vdf">
<constraints> <rect key="frame" x="30" y="107" width="59" height="16"/>
<constraint firstAttribute="width" secondItem="ySY-ir-hzb" secondAttribute="height" multiplier="1:1" id="UX0-hT-7Td"/> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Activity 1" id="a5P-Ci-RzC">
</constraints> <font key="font" metaFont="system"/>
<levelIndicatorCell key="cell" alignment="left" maxValue="1" warningValue="2" criticalValue="2" levelIndicatorStyle="continuousCapacity" id="DhQ-Di-tRT"/> <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
</levelIndicator> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Tah-UQ-vdf"> </textFieldCell>
<rect key="frame" x="44" y="94" width="59" height="17"/> </textField>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Activity 1" id="a5P-Ci-RzC"> <levelIndicator verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ncQ-wN-C61" userLabel="Second indicator">
<font key="font" metaFont="system"/> <rect key="frame" x="8" y="81" width="16" height="18"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> <constraints>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <constraint firstAttribute="width" secondItem="ncQ-wN-C61" secondAttribute="height" multiplier="1:1" id="176-v3-mVW"/>
</textFieldCell> </constraints>
</textField> <levelIndicatorCell key="cell" alignment="left" maxValue="1" warningValue="2" criticalValue="2" levelIndicatorStyle="continuousCapacity" id="jlb-bk-FPd"/>
<levelIndicator verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ncQ-wN-C61" userLabel="Second indicator"> </levelIndicator>
<rect key="frame" x="20" y="70" width="17" height="16"/> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="14O-Lq-Npx">
<constraints> <rect key="frame" x="30" y="83" width="61" height="16"/>
<constraint firstAttribute="width" secondItem="ncQ-wN-C61" secondAttribute="height" multiplier="1:1" id="176-v3-mVW"/> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Activity 2" id="NE1-CO-pGI">
</constraints> <font key="font" metaFont="system"/>
<levelIndicatorCell key="cell" alignment="left" maxValue="1" warningValue="2" criticalValue="2" levelIndicatorStyle="continuousCapacity" id="jlb-bk-FPd"/> <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
</levelIndicator> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="14O-Lq-Npx"> </textFieldCell>
<rect key="frame" x="44" y="69" width="61" height="17"/> </textField>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Activity 2" id="NE1-CO-pGI"> <levelIndicator verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0rV-Th-Zwt" userLabel="Third indicator">
<font key="font" metaFont="system"/> <rect key="frame" x="8" y="57" width="16" height="18"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> <constraints>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <constraint firstAttribute="width" secondItem="0rV-Th-Zwt" secondAttribute="height" multiplier="1:1" id="Ai8-b3-Nn5"/>
</textFieldCell> </constraints>
</textField> <levelIndicatorCell key="cell" alignment="left" maxValue="1" warningValue="2" criticalValue="2" levelIndicatorStyle="continuousCapacity" id="CJy-Jn-eCL"/>
<levelIndicator verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0rV-Th-Zwt" userLabel="Third indicator"> </levelIndicator>
<rect key="frame" x="20" y="45" width="17" height="16"/> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Acy-tT-OFH">
<constraints> <rect key="frame" x="30" y="59" width="61" height="16"/>
<constraint firstAttribute="width" secondItem="0rV-Th-Zwt" secondAttribute="height" multiplier="1:1" id="Ai8-b3-Nn5"/> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Activity 3" id="FSR-y6-7WE">
</constraints> <font key="font" metaFont="system"/>
<levelIndicatorCell key="cell" alignment="left" maxValue="1" warningValue="2" criticalValue="2" levelIndicatorStyle="continuousCapacity" id="CJy-Jn-eCL"/> <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
</levelIndicator> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Acy-tT-OFH"> </textFieldCell>
<rect key="frame" x="44" y="44" width="61" height="17"/> </textField>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Activity 3" id="FSR-y6-7WE"> <levelIndicator verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="bvH-EJ-TYb" userLabel="Fourth indicator">
<font key="font" metaFont="system"/> <rect key="frame" x="8" y="33" width="16" height="18"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> <constraints>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <constraint firstAttribute="width" secondItem="bvH-EJ-TYb" secondAttribute="height" multiplier="1:1" id="cKc-q1-2Q4"/>
</textFieldCell> </constraints>
</textField> <levelIndicatorCell key="cell" alignment="left" maxValue="1" warningValue="2" criticalValue="2" levelIndicatorStyle="continuousCapacity" id="eoN-hl-30l"/>
<levelIndicator verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="bvH-EJ-TYb" userLabel="Fourth indicator"> </levelIndicator>
<rect key="frame" x="20" y="20" width="17" height="16"/> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="R0g-Oa-VB5">
<constraints> <rect key="frame" x="30" y="35" width="62" height="16"/>
<constraint firstAttribute="width" secondItem="bvH-EJ-TYb" secondAttribute="height" multiplier="1:1" id="cKc-q1-2Q4"/> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Activity 4" id="aGr-cd-jC0">
</constraints> <font key="font" metaFont="system"/>
<levelIndicatorCell key="cell" alignment="left" maxValue="1" warningValue="2" criticalValue="2" levelIndicatorStyle="continuousCapacity" id="eoN-hl-30l"/> <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
</levelIndicator> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="R0g-Oa-VB5"> </textFieldCell>
<rect key="frame" x="44" y="19" width="62" height="17"/> </textField>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Activity 4" id="aGr-cd-jC0"> </subviews>
<font key="font" metaFont="system"/> <constraints>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> <constraint firstItem="14O-Lq-Npx" firstAttribute="centerY" secondItem="ncQ-wN-C61" secondAttribute="centerY" id="0Ht-U2-sPg"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <constraint firstItem="bvH-EJ-TYb" firstAttribute="top" secondItem="0rV-Th-Zwt" secondAttribute="bottom" constant="8" symbolic="YES" id="0xw-qA-6vP"/>
</textFieldCell> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="14O-Lq-Npx" secondAttribute="trailing" constant="8" id="5eo-XI-a3W"/>
</textField> <constraint firstItem="Tah-UQ-vdf" firstAttribute="centerY" secondItem="ySY-ir-hzb" secondAttribute="centerY" id="6Hn-ts-mTi"/>
</subviews> <constraint firstItem="R0g-Oa-VB5" firstAttribute="leading" secondItem="bvH-EJ-TYb" secondAttribute="trailing" constant="8" symbolic="YES" id="Dgy-JI-nA1"/>
<constraints> <constraint firstItem="R0g-Oa-VB5" firstAttribute="centerY" secondItem="bvH-EJ-TYb" secondAttribute="centerY" id="Gfq-mB-Y1z"/>
<constraint firstItem="14O-Lq-Npx" firstAttribute="centerY" secondItem="ncQ-wN-C61" secondAttribute="centerY" id="0Ht-U2-sPg"/> <constraint firstItem="Acy-tT-OFH" firstAttribute="centerY" secondItem="0rV-Th-Zwt" secondAttribute="centerY" id="ImF-rK-oOr"/>
<constraint firstItem="bvH-EJ-TYb" firstAttribute="top" secondItem="0rV-Th-Zwt" secondAttribute="bottom" constant="9" id="0xw-qA-6vP"/> <constraint firstItem="Acy-tT-OFH" firstAttribute="leading" secondItem="0rV-Th-Zwt" secondAttribute="trailing" constant="8" symbolic="YES" id="JSU-pZ-l9Q"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="14O-Lq-Npx" secondAttribute="trailing" constant="20" id="5eo-XI-a3W"/> <constraint firstItem="ySY-ir-hzb" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="8" id="KMh-EO-rxE"/>
<constraint firstItem="Tah-UQ-vdf" firstAttribute="centerY" secondItem="ySY-ir-hzb" secondAttribute="centerY" id="6Hn-ts-mTi"/> <constraint firstItem="0rV-Th-Zwt" firstAttribute="top" secondItem="ncQ-wN-C61" secondAttribute="bottom" constant="8" symbolic="YES" id="Q2g-yM-nlJ"/>
<constraint firstItem="R0g-Oa-VB5" firstAttribute="leading" secondItem="bvH-EJ-TYb" secondAttribute="trailing" constant="10" id="Dgy-JI-nA1"/> <constraint firstItem="ncQ-wN-C61" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="8" id="QUI-Hc-Bcl"/>
<constraint firstItem="R0g-Oa-VB5" firstAttribute="centerY" secondItem="bvH-EJ-TYb" secondAttribute="centerY" id="Gfq-mB-Y1z"/> <constraint firstItem="0rV-Th-Zwt" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="8" id="bKh-4L-mqj"/>
<constraint firstItem="Acy-tT-OFH" firstAttribute="centerY" secondItem="0rV-Th-Zwt" secondAttribute="centerY" id="ImF-rK-oOr"/> <constraint firstItem="bvH-EJ-TYb" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="8" id="cPA-Ls-fLj"/>
<constraint firstItem="Acy-tT-OFH" firstAttribute="leading" secondItem="0rV-Th-Zwt" secondAttribute="trailing" constant="10" id="JSU-pZ-l9Q"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="Tah-UQ-vdf" secondAttribute="trailing" constant="8" id="igX-7U-TeE"/>
<constraint firstItem="ySY-ir-hzb" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="20" id="KMh-EO-rxE"/> <constraint firstItem="14O-Lq-Npx" firstAttribute="leading" secondItem="ncQ-wN-C61" secondAttribute="trailing" constant="8" symbolic="YES" id="jjP-qH-Pqg"/>
<constraint firstItem="0rV-Th-Zwt" firstAttribute="top" secondItem="ncQ-wN-C61" secondAttribute="bottom" constant="9" id="Q2g-yM-nlJ"/> <constraint firstItem="Tah-UQ-vdf" firstAttribute="leading" secondItem="ySY-ir-hzb" secondAttribute="trailing" constant="8" symbolic="YES" id="lux-Nz-K7E"/>
<constraint firstItem="ncQ-wN-C61" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="20" id="QUI-Hc-Bcl"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="Acy-tT-OFH" secondAttribute="trailing" constant="8" id="mEe-VT-dNr"/>
<constraint firstItem="0rV-Th-Zwt" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="20" id="bKh-4L-mqj"/> <constraint firstItem="ncQ-wN-C61" firstAttribute="top" secondItem="ySY-ir-hzb" secondAttribute="bottom" constant="8" symbolic="YES" id="mSc-jj-amw"/>
<constraint firstItem="bvH-EJ-TYb" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="20" id="cPA-Ls-fLj"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="R0g-Oa-VB5" secondAttribute="trailing" constant="8" id="sR8-Ph-suC"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="Tah-UQ-vdf" secondAttribute="trailing" constant="20" id="igX-7U-TeE"/> <constraint firstItem="ySY-ir-hzb" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="8" id="wbj-48-DYq"/>
<constraint firstItem="14O-Lq-Npx" firstAttribute="leading" secondItem="ncQ-wN-C61" secondAttribute="trailing" constant="10" id="jjP-qH-Pqg"/> </constraints>
<constraint firstItem="Tah-UQ-vdf" firstAttribute="leading" secondItem="ySY-ir-hzb" secondAttribute="trailing" constant="10" id="lux-Nz-K7E"/> <point key="canvasLocation" x="57" y="80"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="Acy-tT-OFH" secondAttribute="trailing" constant="20" id="mEe-VT-dNr"/> </visualEffectView>
<constraint firstItem="ncQ-wN-C61" firstAttribute="top" secondItem="ySY-ir-hzb" secondAttribute="bottom" constant="9" id="mSc-jj-amw"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="R0g-Oa-VB5" secondAttribute="trailing" constant="20" id="sR8-Ph-suC"/>
<constraint firstItem="ySY-ir-hzb" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="20" id="wbj-48-DYq"/>
</constraints>
</view>
<point key="canvasLocation" x="84" y="115"/>
</window>
</objects> </objects>
</document> </document>

View File

@@ -8,62 +8,58 @@
<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"/> <subviews>
<rect key="contentRect" x="80" y="150" width="200" height="159"/> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="kDb-7g-cVx">
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1440"/> <rect key="frame" x="10" y="39" width="178" height="18"/>
<view key="contentView" id="tpZ-0B-QQu"> <buttonCell key="cell" type="check" title="Use Square Pixels" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="h9q-Wb-em8">
<rect key="frame" x="0.0" y="0.0" width="200" height="84"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<autoresizingMask key="autoresizingMask"/> <font key="font" metaFont="system"/>
<subviews> </buttonCell>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="kDb-7g-cVx"> <connections>
<rect key="frame" x="18" y="47" width="162" height="18"/> <action selector="optionDidChange:" target="9AQ-Iv-Pbm" id="5ef-un-Yck"/>
<buttonCell key="cell" type="check" title="Use Square Pixels" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="h9q-Wb-em8"> </connections>
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> </button>
<font key="font" metaFont="system"/> <popUpButton wantsLayer="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ex3-VM-58z">
</buttonCell> <rect key="frame" x="9" y="8" width="183" height="25"/>
<connections> <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">
<action selector="optionDidChange:" target="ZW7-Bw-4RP" id="pNS-aK-0no"/> <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
</connections> <font key="font" metaFont="menu"/>
</button> <menu key="menu" id="BUS-Pl-jBm">
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ex3-VM-58z"> <items>
<rect key="frame" x="17" y="16" width="167" height="25"/> <menuItem title="Colour" state="on" tag="1" id="gOu-dv-tre"/>
<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"> <menuItem title="Monochrome" tag="3" id="qhQ-ab-jRo"/>
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> </items>
<font key="font" metaFont="menu"/> </menu>
<menu key="menu" id="BUS-Pl-jBm"> </popUpButtonCell>
<items> <connections>
<menuItem title="Colour" state="on" tag="1" id="gOu-dv-tre"/> <action selector="setDisplayType:" target="9AQ-Iv-Pbm" id="Bad-uY-0fe"/>
<menuItem title="Monochrome" tag="3" id="qhQ-ab-jRo"/> </connections>
</items> </popUpButton>
</menu> </subviews>
</popUpButtonCell> <constraints>
<connections> <constraint firstAttribute="bottom" secondItem="ex3-VM-58z" secondAttribute="bottom" constant="12" id="4ZS-q5-TJL"/>
<action selector="setDisplayType:" target="ZW7-Bw-4RP" id="f7A-2O-wR8"/> <constraint firstItem="ex3-VM-58z" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="12" id="8Pj-Ns-TrJ"/>
</connections> <constraint firstAttribute="trailing" secondItem="kDb-7g-cVx" secondAttribute="trailing" constant="12" id="KHa-of-eY7"/>
</popUpButton> <constraint firstItem="kDb-7g-cVx" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="12" id="OcZ-Xa-394"/>
</subviews> <constraint firstAttribute="trailing" secondItem="ex3-VM-58z" secondAttribute="trailing" constant="12" id="QWA-lY-ugz"/>
<constraints> <constraint firstItem="ex3-VM-58z" firstAttribute="top" secondItem="kDb-7g-cVx" secondAttribute="bottom" constant="8" id="jDW-N8-c4V"/>
<constraint firstAttribute="bottom" secondItem="ex3-VM-58z" secondAttribute="bottom" constant="20" symbolic="YES" id="4ZS-q5-TJL"/> <constraint firstItem="kDb-7g-cVx" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="12" id="wdj-PF-zxO"/>
<constraint firstItem="ex3-VM-58z" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="20" id="8Pj-Ns-TrJ"/> </constraints>
<constraint firstAttribute="trailing" secondItem="kDb-7g-cVx" secondAttribute="trailing" constant="20" symbolic="YES" id="KHa-of-eY7"/> <point key="canvasLocation" x="-311" y="120"/>
<constraint firstItem="kDb-7g-cVx" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="20" symbolic="YES" id="OcZ-Xa-394"/> </visualEffectView>
<constraint firstAttribute="trailing" secondItem="ex3-VM-58z" secondAttribute="trailing" constant="20" id="QWA-lY-ugz"/> <customObject id="9AQ-Iv-Pbm" customClass="AppleIIController" customModule="Clock_Signal" customModuleProvider="target">
<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"/>
</constraints>
</view>
<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>

View File

@@ -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"/> <subviews>
<rect key="contentRect" x="80" y="150" width="200" height="121"/> <button wantsLayer="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="pzn-mL-BPh">
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1440"/> <rect key="frame" x="5" y="73" width="97" height="32"/>
<view key="contentView" id="aQh-Pm-DEo"> <buttonCell key="cell" type="push" title="Reset" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="W9s-t2-TJ5">
<rect key="frame" x="0.0" y="0.0" width="200" height="121"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<autoresizingMask key="autoresizingMask"/> <font key="font" metaFont="system"/>
<subviews> </buttonCell>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="rQO-uD-fwn"> <connections>
<rect key="frame" x="13" y="74" width="88" height="32"/> <action selector="optionWasPressed:" target="rEM-g1-brS" id="ZHe-AL-yL6"/>
<buttonCell key="cell" type="push" title="Reset" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="l3H-0m-aK0"> </connections>
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> </button>
<font key="font" metaFont="system"/> <button verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="nEt-YK-aWs">
</buttonCell> <rect key="frame" x="10" y="33" width="180" height="18"/>
<connections> <buttonCell key="cell" type="check" title="Left Player Difficulty" bezelStyle="regularSquare" imagePosition="left" inset="2" id="YOY-n5-F4C">
<action selector="optionWasPressed:" target="gsl-7V-TTU" id="wbx-SP-OZc"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
</connections> <font key="font" metaFont="system"/>
</button> </buttonCell>
<button translatesAutoresizingMaskIntoConstraints="NO" id="3qw-C1-NYW"> <connections>
<rect key="frame" x="18" y="58" width="162" height="18"/> <action selector="optionDidChange:" target="rEM-g1-brS" id="BNC-7F-wGh"/>
<buttonCell key="cell" type="check" title="Black and White" bezelStyle="regularSquare" imagePosition="left" inset="2" id="UP7-mf-IKo"> </connections>
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> </button>
<font key="font" metaFont="system"/> <button translatesAutoresizingMaskIntoConstraints="NO" id="pDu-eg-6n6">
</buttonCell> <rect key="frame" x="10" y="11" width="180" height="18"/>
<connections> <buttonCell key="cell" type="check" title="Right Player Difficulty" bezelStyle="regularSquare" imagePosition="left" inset="2" id="Q2e-Fa-VyK">
<action selector="optionDidChange:" target="gsl-7V-TTU" id="s5e-66-aY1"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
</connections> <font key="font" metaFont="system"/>
</button> </buttonCell>
<button translatesAutoresizingMaskIntoConstraints="NO" id="Xbc-cw-Sc2"> <connections>
<rect key="frame" x="18" y="36" width="162" height="18"/> <action selector="optionDidChange:" target="rEM-g1-brS" id="R7C-ej-dZT"/>
<buttonCell key="cell" type="check" title="Left Player Difficulty" bezelStyle="regularSquare" imagePosition="left" inset="2" id="wlJ-8s-PEh"> </connections>
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> </button>
<font key="font" metaFont="system"/> <button wantsLayer="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="YqD-w8-fXK">
</buttonCell> <rect key="frame" x="100" y="73" width="97" height="32"/>
<connections> <buttonCell key="cell" type="push" title="Select" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="0DC-Xk-VFt">
<action selector="optionDidChange:" target="gsl-7V-TTU" id="PbG-zF-y0W"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
</connections> <font key="font" metaFont="system"/>
</button> </buttonCell>
<button translatesAutoresizingMaskIntoConstraints="NO" id="kPV-Tm-TTc"> <connections>
<rect key="frame" x="18" y="14" width="162" height="18"/> <action selector="optionWasPressed:" target="rEM-g1-brS" id="Bhc-5F-4Vj"/>
<buttonCell key="cell" type="check" title="Right Player Difficulty" bezelStyle="regularSquare" imagePosition="left" inset="2" id="F05-cA-66S"> </connections>
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> </button>
<font key="font" metaFont="system"/> <button verticalHuggingPriority="251" verticalCompressionResistancePriority="751" translatesAutoresizingMaskIntoConstraints="NO" id="YZK-m7-ihU">
</buttonCell> <rect key="frame" x="10" y="55" width="180" height="18"/>
<connections> <buttonCell key="cell" type="check" title="Black and White" bezelStyle="regularSquare" imagePosition="left" inset="2" id="IxG-1J-fdG">
<action selector="optionDidChange:" target="gsl-7V-TTU" id="XMR-tK-HN5"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
</connections> <font key="font" metaFont="system"/>
</button> </buttonCell>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="nt7-8K-xY9"> <connections>
<rect key="frame" x="99" y="74" width="88" height="32"/> <action selector="optionDidChange:" target="rEM-g1-brS" id="4cx-8C-XGe"/>
<buttonCell key="cell" type="push" title="Select" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="8Na-Z1-EXS"> </connections>
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> </button>
<font key="font" metaFont="system"/> </subviews>
</buttonCell> <constraints>
<connections> <constraint firstItem="nEt-YK-aWs" firstAttribute="leading" secondItem="fX1-EX-wGf" secondAttribute="leading" constant="12" id="20c-09-a5v"/>
<action selector="optionWasPressed:" target="gsl-7V-TTU" id="db2-Bu-6h9"/> <constraint firstAttribute="bottom" secondItem="pDu-eg-6n6" secondAttribute="bottom" constant="12" id="8QS-y2-cgI"/>
</connections> <constraint firstItem="pDu-eg-6n6" firstAttribute="leading" secondItem="fX1-EX-wGf" secondAttribute="leading" constant="12" id="Dee-tQ-00F"/>
</button> <constraint firstAttribute="trailing" secondItem="pDu-eg-6n6" secondAttribute="trailing" constant="12" id="IWs-rY-q36"/>
</subviews> <constraint firstItem="pDu-eg-6n6" firstAttribute="top" secondItem="nEt-YK-aWs" secondAttribute="bottom" constant="6" symbolic="YES" id="JSd-1z-mM4"/>
<constraints> <constraint firstAttribute="trailing" secondItem="nEt-YK-aWs" secondAttribute="trailing" constant="12" id="N00-Kz-j5a"/>
<constraint firstItem="3qw-C1-NYW" firstAttribute="leading" secondItem="aQh-Pm-DEo" secondAttribute="leading" constant="20" id="1Ri-ZO-GJy"/> <constraint firstAttribute="trailing" secondItem="YqD-w8-fXK" secondAttribute="trailing" constant="12" id="RgG-Tb-nuK"/>
<constraint firstItem="nt7-8K-xY9" firstAttribute="leading" secondItem="rQO-uD-fwn" secondAttribute="trailing" constant="12" id="46p-Z3-kgW"/> <constraint firstItem="pzn-mL-BPh" firstAttribute="leading" secondItem="fX1-EX-wGf" secondAttribute="leading" constant="12" id="Yxt-HC-m81"/>
<constraint firstItem="nt7-8K-xY9" firstAttribute="top" secondItem="aQh-Pm-DEo" secondAttribute="top" constant="20" id="6Uc-12-11y"/> <constraint firstItem="YZK-m7-ihU" firstAttribute="leading" secondItem="fX1-EX-wGf" secondAttribute="leading" constant="12" id="ZTU-hR-Diu"/>
<constraint firstItem="Xbc-cw-Sc2" firstAttribute="leading" secondItem="aQh-Pm-DEo" secondAttribute="leading" constant="20" id="7es-iv-JOh"/> <constraint firstItem="YqD-w8-fXK" firstAttribute="top" secondItem="pzn-mL-BPh" secondAttribute="top" id="bXS-W9-gSe"/>
<constraint firstItem="kPV-Tm-TTc" firstAttribute="top" secondItem="Xbc-cw-Sc2" secondAttribute="bottom" constant="6" id="Env-nl-M2e"/> <constraint firstItem="YqD-w8-fXK" firstAttribute="leading" secondItem="pzn-mL-BPh" secondAttribute="trailing" constant="12" symbolic="YES" id="bnf-6C-Sld"/>
<constraint firstAttribute="trailing" secondItem="kPV-Tm-TTc" secondAttribute="trailing" constant="20" id="Fim-Ej-8Ux"/> <constraint firstItem="nEt-YK-aWs" firstAttribute="top" secondItem="YZK-m7-ihU" secondAttribute="bottom" constant="6" symbolic="YES" id="nFp-NE-u5J"/>
<constraint firstAttribute="trailing" secondItem="Xbc-cw-Sc2" secondAttribute="trailing" constant="20" id="HkS-6c-WZm"/> <constraint firstItem="YqD-w8-fXK" firstAttribute="width" secondItem="pzn-mL-BPh" secondAttribute="width" id="sqT-6s-tFr"/>
<constraint firstItem="3qw-C1-NYW" firstAttribute="top" secondItem="nt7-8K-xY9" secondAttribute="bottom" constant="6" id="Hxq-Pm-o4G"/> <constraint firstAttribute="trailing" secondItem="YZK-m7-ihU" secondAttribute="trailing" constant="12" id="x5C-Rx-M6l"/>
<constraint firstAttribute="trailing" secondItem="nt7-8K-xY9" secondAttribute="trailing" constant="20" id="JRO-de-WQp"/> <constraint firstItem="YqD-w8-fXK" firstAttribute="bottom" secondItem="pzn-mL-BPh" secondAttribute="bottom" id="xcM-in-P3E"/>
<constraint firstItem="rQO-uD-fwn" firstAttribute="top" secondItem="aQh-Pm-DEo" secondAttribute="top" constant="20" id="N3p-aY-2Nx"/> <constraint firstItem="YZK-m7-ihU" firstAttribute="top" secondItem="pzn-mL-BPh" secondAttribute="bottom" constant="8" id="yJE-zt-BYM"/>
<constraint firstItem="nt7-8K-xY9" firstAttribute="width" secondItem="rQO-uD-fwn" secondAttribute="width" id="NOc-hJ-8Mm"/> <constraint firstItem="pzn-mL-BPh" firstAttribute="top" secondItem="fX1-EX-wGf" secondAttribute="top" constant="12" id="zJ3-Ii-K5M"/>
<constraint firstItem="Xbc-cw-Sc2" firstAttribute="top" secondItem="3qw-C1-NYW" secondAttribute="bottom" constant="6" id="ORX-bF-2WS"/> </constraints>
<constraint firstItem="kPV-Tm-TTc" firstAttribute="leading" secondItem="aQh-Pm-DEo" secondAttribute="leading" constant="20" id="x8p-Hm-xeu"/> <point key="canvasLocation" x="139" y="230"/>
<constraint firstItem="rQO-uD-fwn" firstAttribute="leading" secondItem="aQh-Pm-DEo" secondAttribute="leading" constant="20" id="xhD-iY-vt2"/> </visualEffectView>
<constraint firstAttribute="trailing" secondItem="3qw-C1-NYW" secondAttribute="trailing" constant="20" id="yff-e9-OBY"/> <customObject id="rEM-g1-brS" customClass="Atari2600OptionsController" customModule="Clock_Signal" customModuleProvider="target">
</constraints>
</view>
<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>

View File

@@ -1,56 +1,52 @@
<?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"/> <subviews>
<rect key="contentRect" x="80" y="150" width="200" height="61"/> <popUpButton wantsLayer="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="rh8-km-57n">
<rect key="screenRect" x="0.0" y="0.0" width="1440" height="900"/> <rect key="frame" x="9" y="8" width="183" height="25"/>
<view key="contentView" id="tpZ-0B-QQu"> <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">
<rect key="frame" x="0.0" y="0.0" width="200" height="61"/> <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<autoresizingMask key="autoresizingMask"/> <font key="font" metaFont="menu"/>
<subviews> <menu key="menu" id="L06-TO-EF0">
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="rh8-km-57n"> <items>
<rect key="frame" x="18" y="17" width="165" height="26"/> <menuItem title="RGB Monitor" state="on" id="tJM-kX-gaK"/>
<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"> <menuItem title="S-Video" tag="2" id="Mtc-Ht-iY8"/>
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> <menuItem title="Television" tag="1" id="fFm-fS-rWG"/>
<font key="font" metaFont="menu"/> </items>
<menu key="menu" id="L06-TO-EF0"> </menu>
<items> </popUpButtonCell>
<menuItem title="RGB Monitor" state="on" id="tJM-kX-gaK"/> <connections>
<menuItem title="S-Video" tag="2" id="Mtc-Ht-iY8"/> <action selector="setDisplayType:" target="MXS-dG-Doo" id="5Vp-mv-kZU"/>
<menuItem title="Television" tag="1" id="fFm-fS-rWG"/> </connections>
</items> </popUpButton>
</menu> </subviews>
</popUpButtonCell> <constraints>
<connections> <constraint firstItem="rh8-km-57n" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="12" id="B6L-VS-2cN"/>
<action selector="setDisplayType:" target="ZW7-Bw-4RP" id="PAH-CZ-zlk"/> <constraint firstItem="rh8-km-57n" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="12" id="VRo-6R-IKd"/>
</connections> <constraint firstAttribute="bottom" secondItem="rh8-km-57n" secondAttribute="bottom" constant="12" id="jHA-lf-e7V"/>
</popUpButton> <constraint firstAttribute="trailing" secondItem="rh8-km-57n" secondAttribute="trailing" constant="12" id="urO-Ac-aqK"/>
</subviews> </constraints>
<constraints> <point key="canvasLocation" x="-118" y="120"/>
<constraint firstItem="rh8-km-57n" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="20" id="B6L-VS-2cN"/> </visualEffectView>
<constraint firstItem="rh8-km-57n" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="20" id="VRo-6R-IKd"/> <customObject id="MXS-dG-Doo" customClass="MachineController" customModule="Clock_Signal" customModuleProvider="target">
<constraint firstAttribute="bottom" secondItem="rh8-km-57n" secondAttribute="bottom" constant="20" id="jHA-lf-e7V"/>
<constraint firstAttribute="trailing" secondItem="rh8-km-57n" secondAttribute="trailing" constant="20" id="urO-Ac-aqK"/>
</constraints>
</view>
<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>

View File

@@ -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"> <subviews>
<rect key="frame" x="1" y="1" width="298" height="46"/> <imageView wantsLayer="YES" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="3hK-SA-aKj">
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <rect key="frame" x="8" y="12" width="32.5" height="14"/>
<subviews> <constraints>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Hzw-P6-1dH"> <constraint firstAttribute="width" constant="32" id="tY0-07-0UK"/>
<rect key="frame" x="258" y="8" width="32" height="30"/> </constraints>
<constraints> <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSTouchBarAudioOutputVolumeOffTemplate" id="HbG-Ey-djw"/>
<constraint firstAttribute="width" constant="32" id="WrK-W9-mPP"/> <color key="contentTintColor" name="textColor" catalog="System" colorSpace="catalog"/>
</constraints> </imageView>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSTouchBarAudioOutputVolumeHighTemplate" id="5dB-4Y-iEl"/> <slider verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="bmN-Nb-BBh">
<color key="contentTintColor" name="controlColor" catalog="System" colorSpace="catalog"/> <rect key="frame" x="46" y="2" width="248" height="28"/>
</imageView> <sliderCell key="cell" continuous="YES" state="on" alignment="left" minValue="1" maxValue="2" doubleValue="2" tickMarkPosition="above" sliderType="linear" id="wtR-Vo-Q9e"/>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="p0w-Ti-Tu9"> <connections>
<rect key="frame" x="8" y="8" width="32" height="30"/> <action selector="setVolume:" target="-2" id="Ptv-pk-zbl"/>
<constraints> </connections>
<constraint firstAttribute="width" constant="32" id="dZn-Fc-fRU"/> </slider>
</constraints> <imageView wantsLayer="YES" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="pG5-Iv-llF">
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSTouchBarAudioOutputVolumeOffTemplate" id="mUH-aA-T9N"/> <rect key="frame" x="300" y="11.5" width="32.5" height="15"/>
<color key="contentTintColor" name="controlColor" catalog="System" colorSpace="catalog"/> <constraints>
</imageView> <constraint firstAttribute="width" constant="32" id="Nq1-7v-zbT"/>
<slider verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="zaz-lB-Iyt"> </constraints>
<rect key="frame" x="46" y="14" width="206" height="19"/> <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSTouchBarAudioOutputVolumeHighTemplate" id="iJG-ib-H5S"/>
<sliderCell key="cell" continuous="YES" state="on" alignment="left" maxValue="1" doubleValue="1" tickMarkPosition="above" sliderType="linear" id="Zvz-Og-dGA"/> <color key="contentTintColor" name="textColor" catalog="System" colorSpace="catalog"/>
<connections> </imageView>
<action selector="setVolume:" target="-2" id="eEc-5v-I2c"/> </subviews>
</connections>
</slider>
</subviews>
<constraints>
<constraint firstItem="p0w-Ti-Tu9" firstAttribute="leading" secondItem="gwO-Ty-LCX" secondAttribute="leading" constant="8" id="1t0-CW-zp9"/>
<constraint firstItem="Hzw-P6-1dH" firstAttribute="top" secondItem="gwO-Ty-LCX" secondAttribute="top" constant="8" id="OHP-c3-2Aa"/>
<constraint firstAttribute="trailing" secondItem="Hzw-P6-1dH" secondAttribute="trailing" constant="8" id="W24-Wx-bdQ"/>
<constraint firstItem="zaz-lB-Iyt" firstAttribute="centerY" secondItem="p0w-Ti-Tu9" secondAttribute="centerY" id="f3C-My-T0S"/>
<constraint firstItem="zaz-lB-Iyt" firstAttribute="leading" secondItem="p0w-Ti-Tu9" secondAttribute="trailing" constant="8" id="n0g-y6-wHP"/>
<constraint firstItem="p0w-Ti-Tu9" firstAttribute="centerY" secondItem="gwO-Ty-LCX" secondAttribute="centerY" id="uTt-VY-o8c"/>
<constraint firstItem="Hzw-P6-1dH" firstAttribute="leading" secondItem="zaz-lB-Iyt" secondAttribute="trailing" constant="8" id="xCS-qF-Gz8"/>
<constraint firstAttribute="bottom" secondItem="Hzw-P6-1dH" secondAttribute="bottom" constant="8" id="yaF-k8-W5B"/>
</constraints>
</view>
<constraints> <constraints>
<constraint firstAttribute="width" constant="300" id="HKL-vy-Mov"/> <constraint firstItem="bmN-Nb-BBh" firstAttribute="top" secondItem="l9e-qt-jMo" secondAttribute="top" constant="8" id="Bdo-LI-B9k"/>
<constraint firstAttribute="bottom" secondItem="bmN-Nb-BBh" secondAttribute="bottom" constant="8" id="Lu6-q8-0Ie"/>
<constraint firstItem="bmN-Nb-BBh" firstAttribute="leading" secondItem="3hK-SA-aKj" secondAttribute="trailing" constant="8" symbolic="YES" id="Lvd-Pp-IyL"/>
<constraint firstAttribute="width" constant="340" id="S3o-RO-Jjm"/>
<constraint firstAttribute="trailing" secondItem="pG5-Iv-llF" secondAttribute="trailing" constant="8" id="fMW-9R-UvR"/>
<constraint firstItem="pG5-Iv-llF" firstAttribute="leading" secondItem="bmN-Nb-BBh" secondAttribute="trailing" constant="8" symbolic="YES" id="tMb-ac-ZX2"/>
<constraint firstItem="3hK-SA-aKj" firstAttribute="centerY" secondItem="bmN-Nb-BBh" secondAttribute="centerY" id="wuj-yd-xkH"/>
<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>
<color key="fillColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/> </visualEffectView>
</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>

View File

@@ -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"/> <subviews>
<rect key="contentRect" x="80" y="150" width="200" height="54"/> <button translatesAutoresizingMaskIntoConstraints="NO" id="zPG-yW-4Gy">
<rect key="screenRect" x="0.0" y="0.0" width="1440" height="900"/> <rect key="frame" x="10" y="11" width="178" height="34"/>
<view key="contentView" id="tpZ-0B-QQu"> <buttonCell key="cell" type="check" title="Start Quickly" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="alI-Mw-35c">
<rect key="frame" x="0.0" y="0.0" width="200" height="54"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<autoresizingMask key="autoresizingMask"/> <font key="font" metaFont="system"/>
<subviews> </buttonCell>
<button translatesAutoresizingMaskIntoConstraints="NO" id="zPG-yW-4Gy"> <connections>
<rect key="frame" x="18" y="18" width="164" height="18"/> <action selector="setFastBooting:" target="Lt7-Vu-Vry" id="8X7-my-U0u"/>
<buttonCell key="cell" type="check" title="Start Quickly" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="alI-Mw-35c"> </connections>
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> </button>
<font key="font" metaFont="system"/> </subviews>
</buttonCell> <constraints>
<connections> <constraint firstAttribute="bottom" secondItem="zPG-yW-4Gy" secondAttribute="bottom" constant="12" id="7u0-BP-FXG"/>
<action selector="setFastBooting:" target="ZW7-Bw-4RP" id="AgA-2q-qUU"/> <constraint firstAttribute="trailing" secondItem="zPG-yW-4Gy" secondAttribute="trailing" constant="12" id="Mtb-hf-4ap"/>
</connections> <constraint firstItem="zPG-yW-4Gy" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="12" id="imk-5k-8nm"/>
</button> <constraint firstItem="zPG-yW-4Gy" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="12" id="jAt-iF-uaT"/>
</subviews> </constraints>
<constraints> <point key="canvasLocation" x="6" y="154"/>
<constraint firstAttribute="bottom" secondItem="zPG-yW-4Gy" secondAttribute="bottom" constant="20" id="7u0-BP-FXG"/> </visualEffectView>
<constraint firstAttribute="trailing" secondItem="zPG-yW-4Gy" secondAttribute="trailing" constant="20" id="Mtb-hf-4ap"/> <customObject id="Lt7-Vu-Vry" customClass="MachineController" customModule="Clock_Signal" customModuleProvider="target">
<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="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="20" id="jAt-iF-uaT"/>
</constraints>
</view>
<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>

View File

@@ -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">

View File

@@ -1,70 +1,66 @@
<?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"/> <subviews>
<rect key="contentRect" x="80" y="150" width="200" height="83"/> <button translatesAutoresizingMaskIntoConstraints="NO" id="zPG-yW-4Gy">
<rect key="screenRect" x="0.0" y="0.0" width="1440" height="900"/> <rect key="frame" x="10" y="39" width="199" height="22"/>
<view key="contentView" id="tpZ-0B-QQu"> <buttonCell key="cell" type="check" title="Load Quickly" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="alI-Mw-35c">
<rect key="frame" x="0.0" y="0.0" width="222" height="83"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<autoresizingMask key="autoresizingMask"/> <font key="font" metaFont="system"/>
<subviews> </buttonCell>
<button translatesAutoresizingMaskIntoConstraints="NO" id="zPG-yW-4Gy"> <connections>
<rect key="frame" x="18" y="47" width="186" height="18"/> <action selector="setFastLoading:" target="nbv-6C-VPa" id="tpC-fs-r5t"/>
<buttonCell key="cell" type="check" title="Load Quickly" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="alI-Mw-35c"> </connections>
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> </button>
<font key="font" metaFont="system"/> <popUpButton wantsLayer="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="rh8-km-57n">
</buttonCell> <rect key="frame" x="9" y="8" width="204" height="25"/>
<connections> <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">
<action selector="setFastLoading:" target="ZW7-Bw-4RP" id="yyv-gz-xoa"/> <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
</connections> <font key="font" metaFont="menu"/>
</button> <menu key="menu" id="L06-TO-EF0">
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="rh8-km-57n"> <items>
<rect key="frame" x="18" y="17" width="187" height="25"/> <menuItem title="SCART" state="on" id="tJM-kX-gaK"/>
<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"> <menuItem title="Composite" tag="1" id="fFm-fS-rWG"/>
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> <menuItem title="Composite Monochrome" tag="3" id="hjs-qh-WKP"/>
<font key="font" metaFont="menu"/> </items>
<menu key="menu" id="L06-TO-EF0"> </menu>
<items> </popUpButtonCell>
<menuItem title="SCART" state="on" id="tJM-kX-gaK"/> <connections>
<menuItem title="Composite" tag="1" id="fFm-fS-rWG"/> <action selector="setDisplayType:" target="nbv-6C-VPa" id="hhU-gc-qm2"/>
<menuItem title="Composite Monochrome" tag="3" id="hjs-qh-WKP"/> </connections>
</items> </popUpButton>
</menu> </subviews>
</popUpButtonCell> <constraints>
<connections> <constraint firstAttribute="trailing" secondItem="zPG-yW-4Gy" secondAttribute="trailing" constant="12" id="Mtb-hf-4ap"/>
<action selector="setDisplayType:" target="ZW7-Bw-4RP" id="PAH-CZ-zlk"/> <constraint firstItem="rh8-km-57n" firstAttribute="top" secondItem="zPG-yW-4Gy" secondAttribute="bottom" constant="8" id="ScX-pe-t0x"/>
</connections> <constraint firstItem="rh8-km-57n" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="12" id="VRo-6R-IKd"/>
</popUpButton> <constraint firstAttribute="bottom" secondItem="rh8-km-57n" secondAttribute="bottom" constant="12" id="g0Y-mW-nla"/>
</subviews> <constraint firstItem="zPG-yW-4Gy" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="12" id="imk-5k-8nm"/>
<constraints> <constraint firstItem="zPG-yW-4Gy" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="12" id="jAt-iF-uaT"/>
<constraint firstAttribute="trailing" secondItem="zPG-yW-4Gy" secondAttribute="trailing" constant="20" id="Mtb-hf-4ap"/> <constraint firstAttribute="trailing" secondItem="rh8-km-57n" secondAttribute="trailing" constant="12" id="urO-Ac-aqK"/>
<constraint firstItem="rh8-km-57n" firstAttribute="top" secondItem="zPG-yW-4Gy" secondAttribute="bottom" constant="8" id="ScX-pe-t0x"/> </constraints>
<constraint firstItem="rh8-km-57n" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="20" id="VRo-6R-IKd"/> <point key="canvasLocation" x="-309.5" y="-24"/>
<constraint firstAttribute="bottom" secondItem="rh8-km-57n" secondAttribute="bottom" constant="20" id="g0Y-mW-nla"/> </visualEffectView>
<constraint firstItem="zPG-yW-4Gy" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="20" id="imk-5k-8nm"/> <customObject id="nbv-6C-VPa" customClass="MachineController" customModule="Clock_Signal" customModuleProvider="target">
<constraint firstItem="zPG-yW-4Gy" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="20" id="jAt-iF-uaT"/>
<constraint firstAttribute="trailing" secondItem="rh8-km-57n" secondAttribute="trailing" constant="20" id="urO-Ac-aqK"/>
</constraints>
</view>
<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>

View File

@@ -1,69 +1,66 @@
<?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"/> <subviews>
<rect key="contentRect" x="80" y="150" width="200" height="83"/> <button translatesAutoresizingMaskIntoConstraints="NO" id="e1J-pw-zGw">
<rect key="screenRect" x="0.0" y="0.0" width="1440" height="900"/> <rect key="frame" x="10" y="39" width="178" height="21"/>
<view key="contentView" id="tpZ-0B-QQu"> <buttonCell key="cell" type="check" title="Load Quickly" bezelStyle="regularSquare" imagePosition="left" alignment="left" state="on" inset="2" id="tD6-UB-ESB">
<rect key="frame" x="0.0" y="0.0" width="200" height="83"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<autoresizingMask key="autoresizingMask"/> <font key="font" metaFont="system"/>
<subviews> </buttonCell>
<button translatesAutoresizingMaskIntoConstraints="NO" id="e1J-pw-zGw"> <connections>
<rect key="frame" x="18" y="47" width="164" height="18"/> <action selector="setFastLoading:" target="bLp-5J-WqC" id="cKN-Dr-jRZ"/>
<buttonCell key="cell" type="check" title="Load Quickly" bezelStyle="regularSquare" imagePosition="left" alignment="left" state="on" inset="2" id="tD6-UB-ESB"> </connections>
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> </button>
<font key="font" metaFont="system"/> <popUpButton wantsLayer="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="rh8-km-57n">
</buttonCell> <rect key="frame" x="9" y="8" width="183" height="25"/>
<connections> <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">
<action selector="setFastLoading:" target="ZW7-Bw-4RP" id="JmG-Ks-jSh"/> <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
</connections> <font key="font" metaFont="menu"/>
</button> <menu key="menu" id="L06-TO-EF0">
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="rh8-km-57n"> <items>
<rect key="frame" x="18" y="17" width="165" height="26"/> <menuItem title="RGB Monitor" state="on" id="tJM-kX-gaK"/>
<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"> <menuItem title="S-Video" tag="2" id="Mtc-Ht-iY8"/>
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> <menuItem title="Television" tag="1" id="fFm-fS-rWG"/>
<font key="font" metaFont="menu"/> </items>
<menu key="menu" id="L06-TO-EF0"> </menu>
<items> </popUpButtonCell>
<menuItem title="RGB Monitor" state="on" id="tJM-kX-gaK"/> <connections>
<menuItem title="S-Video" tag="2" id="Mtc-Ht-iY8"/> <action selector="setDisplayType:" target="bLp-5J-WqC" id="tYR-gr-Qq6"/>
<menuItem title="Television" tag="1" id="fFm-fS-rWG"/> </connections>
</items> </popUpButton>
</menu> </subviews>
</popUpButtonCell> <constraints>
<connections> <constraint firstItem="rh8-km-57n" firstAttribute="top" secondItem="e1J-pw-zGw" secondAttribute="bottom" constant="8" id="GLg-6X-Lj2"/>
<action selector="setDisplayType:" target="ZW7-Bw-4RP" id="PAH-CZ-zlk"/> <constraint firstItem="e1J-pw-zGw" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="12" id="HSD-3d-Bl7"/>
</connections> <constraint firstAttribute="trailing" secondItem="e1J-pw-zGw" secondAttribute="trailing" constant="12" id="Q9M-FH-92N"/>
</popUpButton> <constraint firstItem="rh8-km-57n" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="12" id="VRo-6R-IKd"/>
</subviews> <constraint firstAttribute="bottom" secondItem="rh8-km-57n" secondAttribute="bottom" constant="12" id="rwd-hx-LPv"/>
<constraints> <constraint firstItem="e1J-pw-zGw" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="12" id="ul9-lf-Y3u"/>
<constraint firstItem="rh8-km-57n" firstAttribute="top" secondItem="e1J-pw-zGw" secondAttribute="bottom" constant="8" id="GLg-6X-Lj2"/> <constraint firstAttribute="trailing" secondItem="rh8-km-57n" secondAttribute="trailing" constant="12" id="urO-Ac-aqK"/>
<constraint firstItem="e1J-pw-zGw" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="20" id="HSD-3d-Bl7"/> </constraints>
<constraint firstAttribute="trailing" secondItem="e1J-pw-zGw" secondAttribute="trailing" constant="20" id="Q9M-FH-92N"/> <point key="canvasLocation" x="39" y="114.5"/>
<constraint firstItem="rh8-km-57n" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="20" id="VRo-6R-IKd"/> </visualEffectView>
<constraint firstItem="e1J-pw-zGw" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="20" id="ul9-lf-Y3u"/> <customObject id="bLp-5J-WqC" customClass="MachineController" customModule="Clock_Signal" customModuleProvider="target">
<constraint firstAttribute="trailing" secondItem="rh8-km-57n" secondAttribute="trailing" constant="20" id="urO-Ac-aqK"/>
</constraints>
</view>
<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>

View File

@@ -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"/> <subviews>
<rect key="contentRect" x="80" y="150" width="200" height="54"/> <button translatesAutoresizingMaskIntoConstraints="NO" id="e1J-pw-zGw">
<rect key="screenRect" x="0.0" y="0.0" width="1440" height="900"/> <rect key="frame" x="10" y="11" width="178" height="22"/>
<view key="contentView" id="tpZ-0B-QQu"> <buttonCell key="cell" type="check" title="Load Quickly" bezelStyle="regularSquare" imagePosition="left" alignment="left" state="on" inset="2" id="tD6-UB-ESB">
<rect key="frame" x="0.0" y="0.0" width="200" height="54"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<autoresizingMask key="autoresizingMask"/> <font key="font" metaFont="system"/>
<subviews> </buttonCell>
<button translatesAutoresizingMaskIntoConstraints="NO" id="e1J-pw-zGw"> <connections>
<rect key="frame" x="18" y="18" width="164" height="18"/> <action selector="setFastLoading:" target="cWS-AS-crO" id="aed-8n-jk7"/>
<buttonCell key="cell" type="check" title="Load Quickly" bezelStyle="regularSquare" imagePosition="left" alignment="left" state="on" inset="2" id="tD6-UB-ESB"> </connections>
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> </button>
<font key="font" metaFont="system"/> </subviews>
</buttonCell> <constraints>
<connections> <constraint firstAttribute="bottom" secondItem="e1J-pw-zGw" secondAttribute="bottom" constant="12" id="5ce-DO-a4T"/>
<action selector="setFastLoading:" target="ZW7-Bw-4RP" id="JmG-Ks-jSh"/> <constraint firstItem="e1J-pw-zGw" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="12" id="HSD-3d-Bl7"/>
</connections> <constraint firstAttribute="trailing" secondItem="e1J-pw-zGw" secondAttribute="trailing" constant="12" id="Q9M-FH-92N"/>
</button> <constraint firstItem="e1J-pw-zGw" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="12" id="ul9-lf-Y3u"/>
</subviews> </constraints>
<constraints> <point key="canvasLocation" x="-118" y="114"/>
<constraint firstAttribute="bottom" secondItem="e1J-pw-zGw" secondAttribute="bottom" constant="20" id="5ce-DO-a4T"/> </visualEffectView>
<constraint firstItem="e1J-pw-zGw" firstAttribute="leading" secondItem="tpZ-0B-QQu" secondAttribute="leading" constant="20" id="HSD-3d-Bl7"/> <customObject id="cWS-AS-crO" customClass="MachineController" customModule="Clock_Signal" customModuleProvider="target">
<constraint firstAttribute="trailing" secondItem="e1J-pw-zGw" secondAttribute="trailing" constant="20" id="Q9M-FH-92N"/>
<constraint firstItem="e1J-pw-zGw" firstAttribute="top" secondItem="tpZ-0B-QQu" secondAttribute="top" constant="20" id="ul9-lf-Y3u"/>
</constraints>
</view>
<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>

View File

@@ -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"/> <subviews>
<rect key="contentRect" x="80" y="150" width="261" height="100"/> <button ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="sBT-cU-h7s">
<rect key="screenRect" x="0.0" y="0.0" width="1440" height="900"/> <rect key="frame" x="10" y="63" width="245" height="18"/>
<view key="contentView" id="7Pv-WL-2Rq"> <buttonCell key="cell" type="check" title="Load Tapes Quickly" bezelStyle="regularSquare" imagePosition="left" alignment="left" state="on" inset="2" id="w0l-ha-esm">
<rect key="frame" x="0.0" y="0.0" width="261" height="100"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <font key="font" metaFont="system"/>
<subviews> </buttonCell>
<button translatesAutoresizingMaskIntoConstraints="NO" id="sBT-cU-h7s"> <connections>
<rect key="frame" x="18" y="64" width="225" height="18"/> <action selector="setFastLoading:" target="ehh-jE-OeP" id="QEr-7F-9Ms"/>
<buttonCell key="cell" type="check" title="Load Tapes Quickly" bezelStyle="regularSquare" imagePosition="left" alignment="left" state="on" inset="2" id="w0l-ha-esm"> </connections>
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> </button>
<font key="font" metaFont="system"/> <button ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="qSb-72-6Os">
</buttonCell> <rect key="frame" x="10" y="41" width="245" height="18"/>
<connections> <buttonCell key="cell" type="check" title="Control Tape Motor Automatically" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="CzC-YT-lgA">
<action selector="setFastLoading:" target="ota-g7-hOL" id="me0-h2-Ga5"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
</connections> <font key="font" metaFont="system"/>
</button> </buttonCell>
<button translatesAutoresizingMaskIntoConstraints="NO" id="qSb-72-6Os"> <connections>
<rect key="frame" x="18" y="44" width="225" height="18"/> <action selector="setAutomaticTapeMotorConrol:" target="ehh-jE-OeP" id="CgR-12-6cc"/>
<buttonCell key="cell" type="check" title="Control Tape Motor Automatically" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="CzC-YT-lgA"> </connections>
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> </button>
<font key="font" metaFont="system"/> <button wantsLayer="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="tkN-gI-RmT">
</buttonCell> <rect key="frame" x="12" y="11" width="243" height="19"/>
<connections> <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">
<action selector="setAutomaticTapeMotorConrol:" target="ota-g7-hOL" id="bpF-1P-tga"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
</connections> <font key="font" metaFont="cellTitle"/>
</button> </buttonCell>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="tkN-gI-RmT"> <connections>
<rect key="frame" x="20" y="19" width="221" height="19"/> <action selector="playOrPauseTape:" target="ehh-jE-OeP" id="lxp-zi-DWI"/>
<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"> </connections>
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> </button>
<font key="font" metaFont="cellTitle"/> </subviews>
</buttonCell> <constraints>
<connections> <constraint firstItem="qSb-72-6Os" firstAttribute="leading" secondItem="7Pv-WL-2Rq" secondAttribute="leading" constant="12" id="05p-Jn-ueX"/>
<action selector="playOrPauseTape:" target="ota-g7-hOL" id="O0K-pL-nOr"/> <constraint firstAttribute="trailing" secondItem="sBT-cU-h7s" secondAttribute="trailing" constant="12" id="79b-2A-2c7"/>
</connections> <constraint firstItem="sBT-cU-h7s" firstAttribute="top" secondItem="7Pv-WL-2Rq" secondAttribute="top" constant="12" id="E5m-wo-X92"/>
</button> <constraint firstItem="qSb-72-6Os" firstAttribute="top" secondItem="sBT-cU-h7s" secondAttribute="bottom" constant="6" symbolic="YES" id="WxD-kP-vwf"/>
</subviews> <constraint firstAttribute="bottom" secondItem="tkN-gI-RmT" secondAttribute="bottom" constant="12" id="Xnu-On-nOA"/>
<constraints> <constraint firstItem="tkN-gI-RmT" firstAttribute="leading" secondItem="7Pv-WL-2Rq" secondAttribute="leading" constant="12" id="fHf-K0-PsU"/>
<constraint firstItem="qSb-72-6Os" firstAttribute="leading" secondItem="7Pv-WL-2Rq" secondAttribute="leading" constant="20" id="05p-Jn-ueX"/> <constraint firstItem="tkN-gI-RmT" firstAttribute="top" secondItem="qSb-72-6Os" secondAttribute="bottom" constant="8" id="gLh-vE-Cqk"/>
<constraint firstAttribute="trailing" secondItem="sBT-cU-h7s" secondAttribute="trailing" constant="20" id="79b-2A-2c7"/> <constraint firstAttribute="trailing" secondItem="qSb-72-6Os" secondAttribute="trailing" constant="12" id="mQz-p8-aYf"/>
<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="leading" secondItem="7Pv-WL-2Rq" secondAttribute="leading" constant="12" id="nDy-Xc-Ug9"/>
<constraint firstItem="qSb-72-6Os" firstAttribute="top" secondItem="sBT-cU-h7s" secondAttribute="bottom" constant="6" id="WxD-kP-vwf"/> <constraint firstAttribute="trailing" secondItem="tkN-gI-RmT" secondAttribute="trailing" constant="12" id="vgD-A3-m6T"/>
<constraint firstAttribute="bottom" secondItem="tkN-gI-RmT" secondAttribute="bottom" constant="20" id="Xnu-On-nOA"/> </constraints>
<constraint firstItem="tkN-gI-RmT" firstAttribute="leading" secondItem="7Pv-WL-2Rq" secondAttribute="leading" constant="20" id="fHf-K0-PsU"/> <point key="canvasLocation" x="38.5" y="118"/>
<constraint firstItem="tkN-gI-RmT" firstAttribute="top" secondItem="qSb-72-6Os" secondAttribute="bottom" constant="8" id="gLh-vE-Cqk"/> </visualEffectView>
<constraint firstAttribute="trailing" secondItem="qSb-72-6Os" secondAttribute="trailing" constant="20" id="mQz-p8-aYf"/> <customObject id="ehh-jE-OeP" customClass="ZX8081Controller" customModule="Clock_Signal" customModuleProvider="target">
<constraint firstItem="sBT-cU-h7s" firstAttribute="leading" secondItem="7Pv-WL-2Rq" secondAttribute="leading" constant="20" id="nDy-Xc-Ug9"/>
<constraint firstAttribute="trailing" secondItem="tkN-gI-RmT" secondAttribute="trailing" constant="20" id="vgD-A3-m6T"/>
</constraints>
</view>
<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>

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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,17 +195,39 @@ 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)
} }
} }
} }
// MARK: - Volume Control. private func updateActivityViewVisibility(_ isAppLaunch : Bool = false, changed: String? = nil) {
@IBAction func setVolume(_ sender: NSSlider!) { if let window = self.windowControllers.first?.window, let activityFader = self.activityFader {
if let machine = self.machine { // Rules applied below:
machine.setVolume(sender.floatValue) //
setUserDefaultsVolume(sender.floatValue) // 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)
}
} }
} }
// This class is pure nonsense to work around Xcode's opaque behaviour. // MARK: - In-window panels (i.e. options, volume).
// 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) { private var optionsFader: ViewFader! = nil
volumeView = view
}
func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {
volumeView.isHidden = true
}
}
fileprivate var animationFader: ViewFader? = nil
internal func scanTargetViewDidShowOSMouseCursor(_ view: CSScanTargetView) { internal func scanTargetViewDidShowOSMouseCursor(_ view: CSScanTargetView) {
// The OS mouse cursor became visible, so show the volume controls. // The OS mouse cursor became visible, so show the volume controls.
animationFader = nil optionsFader.animateIn()
volumeView.layer?.removeAllAnimations()
volumeView.isHidden = false
volumeView.layer?.opacity = 1.0
} }
internal func scanTargetViewWillHideOSMouseCursor(_ view: CSScanTargetView) { internal func scanTargetViewWouldHideOSMouseCursor(_ view: CSScanTargetView) {
// The OS mouse cursor will be hidden, so hide the volume controls. // The OS mouse cursor will be hidden, so hide the volume controls.
if !volumeView.isHidden && volumeView.layer?.animation(forKey: "opacity") == nil { optionsFader.animateOut(delay: 0.0)
let fadeAnimation = CABasicAnimation(keyPath: "opacity") }
fadeAnimation.fromValue = 1.0
fadeAnimation.toValue = 0.0 // MARK: - Helpers for fading things in and out.
fadeAnimation.duration = 0.2
animationFader = ViewFader(view: volumeView) /// Maintains a list of views and offers in-and-out animations on those,
fadeAnimation.delegate = animationFader /// testing current state as necessary and otherwise coordinating with
volumeView.layer?.add(fadeAnimation, forKey: "opacity") /// CoreAnimation.
volumeView.layer?.opacity = 0.0 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.
@IBAction func setVolume(_ sender: NSSlider!) {
if let machine = self.machine {
let linearValue = log2(sender.floatValue)
machine.setVolume(linearValue)
setUserDefaultsVolume(linearValue)
} }
} }

View File

@@ -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

View File

@@ -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;

View File

@@ -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;
} }

View File

@@ -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

View File

@@ -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";

View File

@@ -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.

View File

@@ -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,30 +281,26 @@ 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. //
// // TODO: should I really need to invert the y coordinate myself? It suggests I
// TODO: should I really need to invert the y coordinate myself? It suggests I // might have an error in mapping here.
// might have an error in mapping here. const NSPoint windowCentre = [self convertPoint:CGPointMake(self.bounds.size.width * 0.5, self.bounds.size.height * 0.5) toView:nil];
const NSPoint windowCentre = [self convertPoint:CGPointMake(self.bounds.size.width * 0.5, self.bounds.size.height * 0.5) toView:nil]; const NSPoint screenCentre = [self.window convertPointToScreen:windowCentre];
const NSPoint screenCentre = [self.window convertPointToScreen:windowCentre]; const CGRect screenFrame = self.window.screen.frame;
const CGRect screenFrame = self.window.screen.frame; CGWarpMouseCursorPosition(NSMakePoint(
CGWarpMouseCursorPosition(NSMakePoint( screenFrame.origin.x + screenCentre.x,
screenFrame.origin.x + screenCentre.x, screenFrame.origin.y + screenFrame.size.height - screenCentre.y
screenFrame.origin.y + screenFrame.size.height - screenCentre.y ));
));
[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;

View File

@@ -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");

View File

@@ -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;

View File

@@ -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);
} }

View File

@@ -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