SameBoy | Accurate GB/GBC emulator |
| download: https://git.y1.nz/archives/sameboy.tar.gz | |
| README | Files | Log | Refs | LICENSE |
Cocoa/GBCheatTextFieldCell.m
1 #import "GBCheatTextFieldCell.h"
2
3 @interface GBCheatTextView : NSTextView
4 @property bool usesAddressFormat;
5 @end
6
7 @implementation GBCheatTextView
8
9 - (bool)_internalInsertText:(NSString *)string replacementRange:(NSRange)range
10 {
11 if (range.location == NSNotFound) {
12 range = self.selectedRange;
13 }
14
15 NSString *new = [self.string stringByReplacingCharactersInRange:range withString:string];
16 if (!self.usesAddressFormat) {
17 NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^(\\$[0-9A-Fa-f]{1,2}|[0-9]{1,3})$" options:0 error:NULL];
18 if ([regex numberOfMatchesInString:new options:0 range:NSMakeRange(0, new.length)]) {
19 [super insertText:string replacementRange:range];
20 return true;
21 }
22 if ([regex numberOfMatchesInString:[@"$" stringByAppendingString:new] options:0 range:NSMakeRange(0, new.length + 1)]) {
23 [super insertText:string replacementRange:range];
24 [super insertText:@"$" replacementRange:NSMakeRange(0, 0)];
25 return true;
26 }
27 if ([new isEqualToString:@"$"] || [string length] == 0) {
28 self.string = @"$00";
29 self.selectedRange = NSMakeRange(1, 2);
30 return true;
31 }
32 }
33 else {
34 NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^(\\$[0-9A-Fa-f]{1,3}:)?\\$[0-9a-fA-F]{1,4}$" options:0 error:NULL];
35 if ([regex numberOfMatchesInString:new options:0 range:NSMakeRange(0, new.length)]) {
36 [super insertText:string replacementRange:range];
37 return true;
38 }
39 if ([string length] == 0) {
40 NSUInteger index = [new rangeOfString:@":"].location;
41 if (index != NSNotFound) {
42 if (range.location > index) {
43 self.string = [[new componentsSeparatedByString:@":"] firstObject];
44 self.selectedRange = NSMakeRange(self.string.length, 0);
45 return true;
46 }
47 self.string = [[new componentsSeparatedByString:@":"] lastObject];
48 self.selectedRange = NSMakeRange(0, 0);
49 return true;
50 }
51 else if ([[self.string substringWithRange:range] isEqualToString:@":"]) {
52 self.string = [[self.string componentsSeparatedByString:@":"] lastObject];
53 self.selectedRange = NSMakeRange(0, 0);
54 return true;
55 }
56 }
57 if ([new isEqualToString:@"$"] || [string length] == 0) {
58 self.string = @"$0000";
59 self.selectedRange = NSMakeRange(1, 4);
60 return true;
61 }
62 if (([string isEqualToString:@"$"] || [string isEqualToString:@":"]) && range.length == 0 && range.location == 0) {
63 if ([self _internalInsertText:@"$00:" replacementRange:range]) {
64 self.selectedRange = NSMakeRange(1, 2);
65 return true;
66 }
67 }
68 if ([string isEqualToString:@":"] && range.length + range.location == self.string.length) {
69 if ([self _internalInsertText:@":$0" replacementRange:range]) {
70 self.selectedRange = NSMakeRange(self.string.length - 2, 2);
71 return true;
72 }
73 }
74 if ([string isEqualToString:@"$"]) {
75 if ([self _internalInsertText:@"$0" replacementRange:range]) {
76 self.selectedRange = NSMakeRange(range.location + 1, 1);
77 return true;
78 }
79 }
80 }
81 return false;
82 }
83
84 - (NSUndoManager *)undoManager
85 {
86 return nil;
87 }
88
89 - (void)insertText:(id)string replacementRange:(NSRange)replacementRange
90 {
91 if (![self _internalInsertText:string replacementRange:replacementRange]) {
92 if (![self _internalInsertText:[@"$" stringByAppendingString:string] replacementRange:replacementRange]) {
93 NSBeep();
94 }
95 }
96 }
97
98 /* Private API, don't tell the police! */
99 - (void)_userReplaceRange:(NSRange)range withString:(NSString *)string
100 {
101 [self insertText:string replacementRange:range];
102 }
103
104 @end
105
106 @implementation GBCheatTextFieldCell
107 {
108 bool _drawing, _editing;
109 GBCheatTextView *_fieldEditor;
110 }
111
112 - (NSTextView *)fieldEditorForView:(NSView *)controlView
113 {
114 if (_fieldEditor) {
115 _fieldEditor.usesAddressFormat = self.usesAddressFormat;
116 return _fieldEditor;
117 }
118 _fieldEditor = [[GBCheatTextView alloc] initWithFrame:controlView.frame];
119 _fieldEditor.fieldEditor = true;
120 _fieldEditor.usesAddressFormat = self.usesAddressFormat;
121 return _fieldEditor;
122 }
123 @end
This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.