git.y1.nz

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.