News - Added text input support for jar launcher. - Updated MoltenVK to https://github.com/KhronosGroup/MoltenVK/commit/d880f4c Internal changes - Added more handling cases to avoid missing call to pojav_initOpenGL() - Moved custom control’s global functions and properties to ControlLayout. - Moved dylib framework outside its folder, as it’s not necessary to be bundled in framework. - Reusing custom controls to produce flexible buttons in jar launcher, which might be extended in the future. Fixes - Multistage text input (Japanese, Chinese, etc) should now work again. - Pointer lock should now function properly again. - Updated README.md to reflect current stuff
83 lines
2.6 KiB
Objective-C
83 lines
2.6 KiB
Objective-C
#import "ControlButton.h"
|
|
#import "ControlLayout.h"
|
|
#import "ControlSubButton.h"
|
|
#import "CustomControlsUtils.h"
|
|
#import "../LauncherPreferences.h"
|
|
#import "../ios_uikit_bridge.h"
|
|
#import "../utils.h"
|
|
|
|
@interface ControlLayout ()
|
|
@end
|
|
|
|
@implementation ControlLayout
|
|
|
|
- (void)loadControlLayout:(NSMutableDictionary *)layoutDictionary {
|
|
self.layoutDictionary = layoutDictionary;
|
|
|
|
CGFloat currentScale = [self.layoutDictionary[@"scaledAt"] floatValue];
|
|
CGFloat savedScale = [getPreference(@"button_scale") floatValue];
|
|
loadControlObject(self, self.layoutDictionary);
|
|
|
|
self.layoutDictionary[@"scaledAt"] = @(savedScale);
|
|
}
|
|
|
|
- (void)loadControlFile:(NSString *)name {
|
|
[self removeAllButtons];
|
|
|
|
NSString *controlFilePath = [NSString stringWithFormat:@"%s/controlmap/%@", getenv("POJAV_HOME"), name];
|
|
|
|
self.layoutDictionary = parseJSONFromFile(controlFilePath);
|
|
if (self.layoutDictionary[@"error"] != nil) {
|
|
showDialog(currentVC(), localize(@"Error", nil), [NSString stringWithFormat:@"Could not open %@: %@", controlFilePath, [self.layoutDictionary[@"error"] localizedDescription]]);
|
|
return;
|
|
}
|
|
[self loadControlLayout:self.layoutDictionary];
|
|
}
|
|
|
|
- (void)removeAllButtons {
|
|
[self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
|
|
[self.layoutDictionary removeAllObjects];
|
|
}
|
|
|
|
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
|
|
{
|
|
return action == @selector(actionMenuExit:) ||
|
|
action == @selector(actionMenuSave:) ||
|
|
action == @selector(actionMenuLoad:) ||
|
|
action == @selector(actionMenuSetDef:) ||
|
|
action == @selector(actionMenuAddButton:) ||
|
|
action == @selector(actionMenuAddDrawer:) ||
|
|
action == @selector(actionMenuAddSubButton:) ||
|
|
action == @selector(actionMenuBtnCopy:) ||
|
|
action == @selector(actionMenuBtnDelete:) ||
|
|
action == @selector(actionMenuBtnEdit:) ||
|
|
action == @selector(actionMenuBtnSafeArea:);
|
|
}
|
|
|
|
- (BOOL)canBecomeFirstResponder {
|
|
return YES;
|
|
}
|
|
|
|
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
|
|
UIView *result = [super hitTest:point withEvent:event];
|
|
if (result == self && !isControlModifiable) {
|
|
return nil;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
- (void)setFrame:(CGRect)frame {
|
|
[super setFrame:frame];
|
|
|
|
for (UIView *view in self.subviews) {
|
|
if (![view isKindOfClass:ControlButton.class] ||
|
|
([view isKindOfClass:ControlSubButton.class] &&
|
|
![((ControlSubButton *)view).parentDrawer.drawerData[@"orientation"] isEqualToString:@"FREE"])) {
|
|
continue;
|
|
}
|
|
[(ControlButton *)view update];
|
|
}
|
|
}
|
|
|
|
@end
|