restore osc profile decode for ios12
This commit is contained in:
@@ -24,11 +24,13 @@ NS_ASSUME_NONNULL_BEGIN
|
||||
@interface LayoutOnScreenControlsViewController : UIViewController
|
||||
- (void)profileRefresh;
|
||||
- (void)reloadOnScreenWidgetViews;
|
||||
- (void)presentProfilesTableView;
|
||||
|
||||
@property LayoutOnScreenControls *layoutOSC; // object that contains a view which contains the on screen controller buttons that allows the user to drag and positions each button on the screen using touch
|
||||
@property (nonatomic) NSMutableSet* OnScreenWidgetViews;
|
||||
|
||||
@property int OSCSegmentSelected;
|
||||
@property (nonatomic, assign) bool quickSwitchEnabled;
|
||||
|
||||
@property (weak, nonatomic) IBOutlet UIButton *trashCanButton;
|
||||
@property (weak, nonatomic) IBOutlet UIButton *undoButton;
|
||||
|
||||
+28
-16
@@ -129,6 +129,7 @@
|
||||
[OSCProfilesManager setOnScreenWidgetViewsSet:self.OnScreenWidgetViews]; // pass the keyboard button dict to profiles manager
|
||||
|
||||
isToolbarHidden = NO; // keeps track if the toolbar is hidden up above the screen so that we know whether to hide or show it when the user taps the toolbar's hide/show button
|
||||
_quickSwitchEnabled = false;
|
||||
|
||||
widgetSizeSliderLabel = [[UILabel alloc] init];
|
||||
widgetHeightSliderLabel = [[UILabel alloc] init];
|
||||
@@ -182,7 +183,7 @@
|
||||
object:nil];
|
||||
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(profileRefresh)
|
||||
selector:@selector(handleProfileTablViewDismiss)
|
||||
name:@"OscLayoutTableViewCloseNotification"
|
||||
object:nil];
|
||||
|
||||
@@ -225,7 +226,6 @@
|
||||
}];
|
||||
}];
|
||||
});
|
||||
[self profileRefresh];
|
||||
}
|
||||
|
||||
|
||||
@@ -233,10 +233,13 @@
|
||||
- (void) viewDidAppear:(BOOL)animated {
|
||||
OnScreenWidgetView.editMode = true;
|
||||
selectedWidgetView = nil;
|
||||
[super viewWillAppear:animated];
|
||||
[self profileRefresh];
|
||||
[super viewDidAppear:animated];
|
||||
}
|
||||
|
||||
- (void) viewWillAppear:(BOOL)animated{
|
||||
self.navigationController.navigationBar.hidden = _quickSwitchEnabled;
|
||||
[self profileRefresh];
|
||||
}
|
||||
|
||||
#pragma mark - Class Helper Functions
|
||||
|
||||
@@ -730,6 +733,7 @@
|
||||
}
|
||||
|
||||
- (void)setupProfileLableAndSliders{
|
||||
//if(_quickSwitchEnabled) return;
|
||||
// self.currentProfileLabel.frame = CGRectMake(0, 0, 180, 35);
|
||||
// CGFloat profileLabelXPosition = self.view.bounds.size.width - self.currentProfileLabel.frame.size.width - 20;
|
||||
CGFloat sliderXPosition = (self.view.bounds.size.width - self.widgetSizeSlider.frame.size.width)/2 ;
|
||||
@@ -737,7 +741,7 @@
|
||||
|
||||
// Set the label's frame with the calculated x-position
|
||||
self.currentProfileLabel.frame = CGRectMake(profileLabelXPosition, self.currentProfileLabel.frame.origin.y, self.currentProfileLabel.frame.size.width, self.currentProfileLabel.frame.size.height);
|
||||
self.currentProfileLabel.hidden = NO; // Show Current Profile display
|
||||
self.currentProfileLabel.hidden = _quickSwitchEnabled; // Show Current Profile display
|
||||
if (@available(iOS 13.0, *)) {
|
||||
self.currentProfileLabel.textAlignment = NSTextAlignmentNatural;
|
||||
self.currentProfileLabel.numberOfLines = 2;
|
||||
@@ -747,7 +751,7 @@
|
||||
[self.currentProfileLabel setText:[LocalizationHelper localizedStringForKey:@"Profile: %@",[profilesManager getSelectedProfile].name]]; // display current profile name when profile is being refreshed.
|
||||
|
||||
// button size sliders
|
||||
self.widgetSizeSlider.hidden = NO;
|
||||
self.widgetSizeSlider.hidden = _quickSwitchEnabled;
|
||||
self.widgetSizeSlider.frame = CGRectMake(sliderXPosition, self.widgetSizeSlider.frame.origin.y, self.widgetSizeSlider.frame.size.width, self.widgetSizeSlider.frame.size.height);
|
||||
[self.widgetSizeSlider addTarget:self action:@selector(widgetSizeSliderMoved) forControlEvents:(UIControlEventValueChanged)];
|
||||
widgetSizeSliderLabel.text = [LocalizationHelper localizedStringForKey:@"Widget Size"];
|
||||
@@ -764,10 +768,10 @@
|
||||
// Align vertically with the slider
|
||||
[widgetSizeSliderLabel.centerYAnchor constraintEqualToAnchor:self.widgetSizeSlider.centerYAnchor]
|
||||
]];
|
||||
widgetSizeSliderLabel.hidden = NO;
|
||||
widgetSizeSliderLabel.hidden = _quickSwitchEnabled;
|
||||
|
||||
// button height sliders
|
||||
self.widgetHeightSlider.hidden = NO;
|
||||
self.widgetHeightSlider.hidden = _quickSwitchEnabled;
|
||||
self.widgetHeightSlider.frame = CGRectMake(sliderXPosition, self.widgetHeightSlider.frame.origin.y, self.widgetHeightSlider.frame.size.width, self.widgetHeightSlider.frame.size.height);
|
||||
[self.widgetHeightSlider addTarget:self action:@selector(widgetHeightSliderMoved) forControlEvents:(UIControlEventValueChanged)];
|
||||
// button height label
|
||||
@@ -785,10 +789,10 @@
|
||||
// Align vertically with the slider
|
||||
[widgetHeightSliderLabel.centerYAnchor constraintEqualToAnchor:self.widgetHeightSlider.centerYAnchor]
|
||||
]];
|
||||
widgetHeightSliderLabel.hidden = NO;
|
||||
widgetHeightSliderLabel.hidden = _quickSwitchEnabled;
|
||||
|
||||
// button alpha label
|
||||
self.widgetAlphaSlider.hidden = NO;
|
||||
self.widgetAlphaSlider.hidden = _quickSwitchEnabled;
|
||||
self.widgetAlphaSlider.frame = CGRectMake(sliderXPosition, self.widgetAlphaSlider.frame.origin.y, self.widgetAlphaSlider.frame.size.width, self.widgetAlphaSlider.frame.size.height);
|
||||
[self.widgetAlphaSlider addTarget:self action:@selector(widgetAlphaSliderMoved) forControlEvents:(UIControlEventValueChanged)];
|
||||
widgetAlphaSliderLabel.text = [LocalizationHelper localizedStringForKey:@"Widget Alpha"];
|
||||
@@ -805,11 +809,11 @@
|
||||
// Align vertically with the slider
|
||||
[widgetAlphaSliderLabel.centerYAnchor constraintEqualToAnchor:self.widgetAlphaSlider.centerYAnchor]
|
||||
]];
|
||||
widgetAlphaSliderLabel.hidden = NO;
|
||||
widgetAlphaSliderLabel.hidden = _quickSwitchEnabled;
|
||||
|
||||
|
||||
// border Width slider
|
||||
self.widgetBorderWidthSlider.hidden = NO;
|
||||
self.widgetBorderWidthSlider.hidden = _quickSwitchEnabled;
|
||||
self.widgetBorderWidthSlider.frame = CGRectMake(CGRectGetMaxX(self.currentProfileLabel.frame)-self.widgetBorderWidthSlider.frame.size.width, self.widgetBorderWidthSlider.frame.origin.y, self.widgetBorderWidthSlider.frame.size.width, self.widgetBorderWidthSlider.frame.size.height);
|
||||
|
||||
[self.widgetBorderWidthSlider addTarget:self action:@selector(widgetBorderWidthSliderMoved) forControlEvents:(UIControlEventValueChanged)];
|
||||
@@ -825,7 +829,7 @@
|
||||
// Align vertically with the slider
|
||||
[widgetBorderWidthSliderLabel.centerYAnchor constraintEqualToAnchor:self.widgetBorderWidthSlider.centerYAnchor]
|
||||
]];
|
||||
widgetBorderWidthSliderLabel.hidden = NO;
|
||||
widgetBorderWidthSliderLabel.hidden = _quickSwitchEnabled;
|
||||
|
||||
|
||||
|
||||
@@ -882,6 +886,10 @@
|
||||
stickIndicatorOffsetSliderLabel.hidden = stickIndicatorOffsetExplain.hidden = self.stickIndicatorOffsetSlider.hidden;
|
||||
}
|
||||
|
||||
- (void)handleProfileTablViewDismiss{
|
||||
[self profileRefresh];
|
||||
if(_quickSwitchEnabled) [self dismissViewControllerAnimated:NO completion:nil];
|
||||
}
|
||||
|
||||
/* Basically the same method as loadTapped, without parameter*/
|
||||
// Make sure whenever self view controller load the selected profile and layout its buttons.
|
||||
@@ -917,9 +925,7 @@
|
||||
// [self presentViewController:vc animated:YES completion:nil];
|
||||
}
|
||||
|
||||
|
||||
/* Presents the view controller that lists all OSC profiles the user can choose from */
|
||||
- (IBAction) loadTapped:(id)sender {
|
||||
- (void) presentProfilesTableView{
|
||||
UIStoryboard *storyboard;
|
||||
BOOL isIPhone = ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone);
|
||||
if (isIPhone) {
|
||||
@@ -959,9 +965,15 @@
|
||||
[self->selectedWidgetView.stickBallLayer removeFromSuperlayer];
|
||||
[self->selectedWidgetView.crossMarkLayer removeFromSuperlayer];
|
||||
_oscProfilesTableViewController.currentOSCButtonLayers = self.layoutOSC.OSCButtonLayers;
|
||||
|
||||
[self presentViewController:_oscProfilesTableViewController animated:YES completion:nil];
|
||||
}
|
||||
|
||||
/* Presents the view controller that lists all OSC profiles the user can choose from */
|
||||
- (IBAction) loadTapped:(id)sender {
|
||||
[self presentProfilesTableView];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - Touch
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ const double NAV_BAR_HEIGHT = 50;
|
||||
return [self getCurrentOrientation]; // 90 Degree rotation not allowed in streaming or app view
|
||||
}
|
||||
|
||||
- (void) viewWillDisappear:(BOOL)animated{
|
||||
- (void) viewDidDisappear:(BOOL)animated{
|
||||
[super viewWillDisappear:animated];
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:@"OscLayoutTableViewCloseNotification" object:self]; // notify other view that oscLayoutManager is closing
|
||||
}
|
||||
@@ -268,14 +268,7 @@ didPickDocumentsAtURLs:(NSArray<NSURL *> *)urls {
|
||||
NSMutableArray *profilesEncoded;
|
||||
// 解码原始的NSArray对象,得到包含编码对象的数组
|
||||
error = nil;
|
||||
if (@available(iOS 13.0, *)) {
|
||||
// 在 iOS 13 及以上使用 unarchivedObjectOfClasses
|
||||
profilesEncoded = [NSKeyedUnarchiver unarchivedObjectOfClasses:classes fromData:fileData error:&error];
|
||||
} else {
|
||||
// 在 iOS 12 及以下使用 unarchiveObjectWithData(旧方法)
|
||||
profilesEncoded = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSMutableArray class] fromData:fileData error:&error];
|
||||
}
|
||||
|
||||
profilesEncoded = [NSKeyedUnarchiver unarchivedObjectOfClasses:classes fromData:fileData error:&error];
|
||||
restoreFailed = error != nil;
|
||||
|
||||
UIAlertController *restoredAlertController = [UIAlertController alertControllerWithTitle: [LocalizationHelper localizedStringForKey:@""] message: [LocalizationHelper localizedStringForKey:@"Pofiles imported"] preferredStyle:UIAlertControllerStyleAlert];
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
@interface StreamFrameViewController : GCEventViewController <ConnectionCallbacks, ControllerSupportDelegate, UserInteractionDelegate, UIScrollViewDelegate>
|
||||
#else
|
||||
@interface StreamFrameViewController : UIViewController <ConnectionCallbacks, ControllerSupportDelegate, UserInteractionDelegate, UIScrollViewDelegate>
|
||||
@interface StreamFrameViewController : UIViewController <ConnectionCallbacks, ControllerSupportDelegate, UserInteractionDelegate, UIScrollViewDelegate, ToolBoxSpecialEntryDelegate>
|
||||
|
||||
#endif
|
||||
@property (nonatomic) StreamConfiguration* streamConfig;
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
CustomEdgeSlideGestureRecognizer *_slideToCmdToolRecognizer;
|
||||
CustomTapGestureRecognizer *_oscLayoutTapRecoginizer;
|
||||
LayoutOnScreenControlsViewController *_layoutOnScreenControlsVC;
|
||||
CommandManagerViewController* cmdManViewController;
|
||||
ToolBoxViewController* toolBoxViewController;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -96,7 +96,8 @@
|
||||
|
||||
- (void)configOscLayoutTool{
|
||||
if([self isOscLayoutToolEnabled]){
|
||||
if(![cmdManViewController.specialEntries containsObject:@"widgetTool"]) [cmdManViewController.specialEntries insertObject:@"widgetTool" atIndex:0];
|
||||
if(![toolBoxViewController.specialEntries containsObject:@"widgetLayoutTool"]) [toolBoxViewController.specialEntries insertObject:@"widgetLayoutTool" atIndex:0];
|
||||
if(![toolBoxViewController.specialEntries containsObject:@"widgetSwitchTool"]) [toolBoxViewController.specialEntries insertObject:@"widgetSwitchTool" atIndex:1];
|
||||
_oscLayoutTapRecoginizer = [[CustomTapGestureRecognizer alloc] initWithTarget:self action:@selector(layoutOSC)];
|
||||
_oscLayoutTapRecoginizer.numberOfTouchesRequired = _settings.oscLayoutToolFingers.intValue; //tap a predefined number of fingers to open osc layout tool
|
||||
_oscLayoutTapRecoginizer.tapDownTimeThreshold = 0.2;
|
||||
@@ -120,11 +121,14 @@
|
||||
_layoutOnScreenControlsVC.view.backgroundColor = UIColor.clearColor;
|
||||
_layoutOnScreenControlsVC.modalPresentationStyle = UIModalPresentationOverCurrentContext;
|
||||
}
|
||||
else [cmdManViewController.specialEntries removeObject:@"widgetTool"];
|
||||
else{
|
||||
[toolBoxViewController.specialEntries removeObject:@"widgetLayoutTool"];
|
||||
[toolBoxViewController.specialEntries removeObject:@"widgetSwitchTool"];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)presentCommandManagerViewController{
|
||||
[self presentViewController:cmdManViewController animated:YES completion:nil];
|
||||
[self presentViewController:toolBoxViewController animated:YES completion:nil];
|
||||
}
|
||||
|
||||
- (void)configSwipeGestures{
|
||||
@@ -258,12 +262,7 @@
|
||||
selector:@selector(expandSettingsView) // //force expand settings view to update resolution table, and all setting includes current fullscreen resolution will be updated.
|
||||
name:@"SettingsOverlayButtonPressedNotification"
|
||||
object:nil];
|
||||
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(layoutOSC) // //force expand settings view to update resolution table, and all setting includes current fullscreen resolution will be updated.
|
||||
name:@"OscLayoutToolOpenedFromCmdToolNotification"
|
||||
object:nil];
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
#if TARGET_OS_TV
|
||||
@@ -361,7 +360,8 @@
|
||||
|
||||
_streamView = [[StreamView alloc] initWithFrame:self.view.frame];
|
||||
|
||||
cmdManViewController = [[CommandManagerViewController alloc] init];
|
||||
toolBoxViewController = [[ToolBoxViewController alloc] init];
|
||||
toolBoxViewController.specialEntryDelegate = self;
|
||||
|
||||
/*
|
||||
_settings.externalDisplayMode.intValue:
|
||||
@@ -464,12 +464,26 @@
|
||||
[self.view addSubview:_tipLabel];
|
||||
}
|
||||
|
||||
- (void)layoutOSC{
|
||||
- (void)openWidgetLayoutTool{
|
||||
[self->_streamView disableOnScreenControls];
|
||||
[self->_streamView clearOnScreenKeyboardButtons]; // clear all onScreenKeyboardButtons before entering edit mode
|
||||
_layoutOnScreenControlsVC.quickSwitchEnabled = false;
|
||||
_layoutOnScreenControlsVC.toolbarStackView.hidden = false;
|
||||
_layoutOnScreenControlsVC.toolbarRootView.hidden = false;
|
||||
[self presentViewController:_layoutOnScreenControlsVC animated:YES completion:nil];
|
||||
}
|
||||
|
||||
- (void)switchWidgetProfile{
|
||||
[self->_streamView disableOnScreenControls];
|
||||
[self->_streamView clearOnScreenKeyboardButtons]; // clear all onScreenKeyboardButtons before entering edit mode
|
||||
_layoutOnScreenControlsVC.quickSwitchEnabled = true;
|
||||
_layoutOnScreenControlsVC.toolbarStackView.hidden = true;
|
||||
_layoutOnScreenControlsVC.toolbarRootView.hidden = true;
|
||||
[self presentViewController:_layoutOnScreenControlsVC animated:NO completion:^{
|
||||
[self->_layoutOnScreenControlsVC presentProfilesTableView];
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)oscLayoutClosed{
|
||||
// Handle the callback
|
||||
[self->_streamView disableOnScreenControls]; // add this to get realtime back menu working.
|
||||
|
||||
+16
-7
@@ -8,8 +8,13 @@
|
||||
|
||||
import UIKit
|
||||
|
||||
@objc public class CommandManagerViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
|
||||
@objc public class ToolBoxViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
|
||||
|
||||
@objc protocol ToolBoxSpecialEntryDelegate: NSObjectProtocol {
|
||||
@objc optional func openWidgetLayoutTool()
|
||||
@objc optional func switchWidgetProfile()
|
||||
}
|
||||
@objc weak var specialEntryDelegate: ToolBoxSpecialEntryDelegate?
|
||||
public let tableView = UITableView()
|
||||
private let addButton = UIButton(type: .system)
|
||||
private let deleteButton = UIButton(type: .system)
|
||||
@@ -19,9 +24,10 @@ import UIKit
|
||||
private let viewBackgroundColor = UIColor(white: 0.2, alpha: 0.8);
|
||||
private let highlightColor = UIColor(white: 0.39, alpha: 0.8);
|
||||
private let titleLabel = UILabel()
|
||||
@objc public var specialEntries : NSMutableArray = ["widgetTool"]
|
||||
@objc public var specialEntries : NSMutableArray = ["widgetLayoutTool"]
|
||||
private let specialEntryAliasDic : [String:String] = [
|
||||
"widgetTool":SwiftLocalizationHelper.localizedString(forKey: "[ Open On-Screen Widget Tool ]")
|
||||
"widgetSwitchTool":SwiftLocalizationHelper.localizedString(forKey: "[ Switch among on-screen widget profiles ]"),
|
||||
"widgetLayoutTool":SwiftLocalizationHelper.localizedString(forKey: "[ Open on-screen widget tool ]")
|
||||
]
|
||||
|
||||
private var viewPinned: Bool = false
|
||||
@@ -333,15 +339,18 @@ import UIKit
|
||||
}
|
||||
|
||||
private func handleSpecialEntries(index:Int){
|
||||
usleep(1000*100)
|
||||
dismiss(animated: true, completion: nil)
|
||||
switch specialEntries[index] as? String {
|
||||
case "widgetTool":
|
||||
usleep(1000*150)
|
||||
dismiss(animated: true, completion: nil)
|
||||
NotificationCenter.default.post(name: Notification.Name("OscLayoutToolOpenedFromCmdToolNotification"),object: nil) // inform streamFrameViewController to open osc tool
|
||||
case "widgetLayoutTool":
|
||||
specialEntryDelegate?.openWidgetLayoutTool!()
|
||||
case "widgetSwitchTool":
|
||||
specialEntryDelegate?.switchWidgetProfile?()
|
||||
default: break
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private func sendKeyboardCommand(_ cmd: RemoteCommand) {
|
||||
print("Sending key-value")
|
||||
let keyboardCmdStrings = CommandManager.shared.extractKeyStringsFromComboCommand(from: cmd.cmdString)
|
||||
Reference in New Issue
Block a user