This commit is contained in:
2026-03-03 23:36:23 +08:00
parent 361ccc12d6
commit 6786a76f41
3 changed files with 277 additions and 2 deletions

View File

@@ -114,6 +114,38 @@ static NSString * const kKBKeyboardLayoutI18nFileName = @"kb_keyboard_layouts_i1
}
}
- (NSArray<KBKeyboardRowConfig *> *)kb_mergeRowsFromBase:(NSArray<KBKeyboardRowConfig *> *)baseRows
override:(NSArray<KBKeyboardRowConfig *> *)overrideRows {
if (baseRows.count == 0) { return overrideRows ?: @[]; }
if (overrideRows.count == 0) { return baseRows; }
NSUInteger maxCount = MAX(baseRows.count, overrideRows.count);
NSMutableArray<KBKeyboardRowConfig *> *merged = [NSMutableArray arrayWithCapacity:maxCount];
for (NSUInteger i = 0; i < maxCount; i++) {
KBKeyboardRowConfig *baseRow = (i < baseRows.count) ? baseRows[i] : nil;
KBKeyboardRowConfig *overrideRow = (i < overrideRows.count) ? overrideRows[i] : nil;
if (!baseRow) {
if (overrideRow) { [merged addObject:overrideRow]; }
continue;
}
if (!overrideRow) {
[merged addObject:baseRow];
continue;
}
KBKeyboardRowConfig *row = [KBKeyboardRowConfig new];
row.height = baseRow.height ?: overrideRow.height;
row.insetLeft = baseRow.insetLeft ?: overrideRow.insetLeft;
row.insetRight = baseRow.insetRight ?: overrideRow.insetRight;
row.gap = baseRow.gap ?: overrideRow.gap;
row.align = baseRow.align.length > 0 ? baseRow.align : overrideRow.align;
BOOL hasOverrideItems = [overrideRow.items isKindOfClass:[NSArray class]] && ((NSArray *)overrideRow.items).count > 0;
row.items = hasOverrideItems ? overrideRow.items : baseRow.items;
row.segments = overrideRow.segments ?: baseRow.segments;
[merged addObject:row];
}
return merged.copy;
}
- (void)kb_loadI18nConfig {
NSString *path = [[NSBundle mainBundle] pathForResource:kKBKeyboardLayoutI18nFileName ofType:@"json"];
NSData *data = path.length ? [NSData dataWithContentsOfFile:path] : nil;
@@ -143,9 +175,18 @@ static NSString * const kKBKeyboardLayoutI18nFileName = @"kb_keyboard_layouts_i1
return;
}
KBKeyboardLayout *layout = [KBKeyboardLayout mj_objectWithKeyValues:obj];
if (layout) {
if (!layout) { return; }
KBKeyboardLayout *baseLayout = mergedLayouts[key];
if (!baseLayout) {
mergedLayouts[key] = layout;
return;
}
KBKeyboardLayout *mergedLayout = [KBKeyboardLayout new];
mergedLayout.rows = [self kb_mergeRowsFromBase:baseLayout.rows override:layout.rows];
mergedLayout.shiftRows = [self kb_mergeRowsFromBase:baseLayout.shiftRows override:layout.shiftRows];
mergedLayouts[key] = mergedLayout;
}];
self.layouts = mergedLayouts.copy;