Skip to content
Snippets Groups Projects
Commit 72c8aa05 authored by Maxime Graulich's avatar Maxime Graulich
Browse files

Fix parameters on iOS

parent 56dfcaf8
Branches
Tags
No related merge requests found
......@@ -27,4 +27,6 @@
@property (weak, nonatomic) IBOutlet UILabel *detailDescriptionLabel;
@property (nonatomic, retain) NSString *initialModel;
@end
......@@ -55,6 +55,7 @@
[self configureView];
scaleFactor = 1.;
setObjCBridge((__bridge void*) self);
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(requestRender) name:@"requestRender" object:nil];
if(![[UIDevice currentDevice].model isEqualToString:@"iPad"] && ![[UIDevice currentDevice].model isEqualToString:@"iPad Simulator"]){
UIBarButtonItem *settings = [[UIBarButtonItem alloc] initWithTitle:@"Settings" style:UIBarButtonItemStyleBordered target:self action:@selector(showSettings)];
UIBarButtonItem *postpro = [[UIBarButtonItem alloc] initWithTitle:@"Post processing" style:UIBarButtonItemStyleBordered target:self action:@selector(showPostpro)];
......@@ -117,7 +118,7 @@
sender.numberOfTapsRequired = 2;
if(sender.state == UIGestureRecognizerStateEnded){
scaleFactor = 1;
glView->mContext->eventHandler(5);
glView->mContext->eventHandler(10);
[glView drawView];
}
}
......@@ -352,7 +353,7 @@ void messageFromCpp (void *self, std::string level, std::string msg)
{
if(level == "RequestRender"){
[(__bridge id)self requestRender];
//[[NSNotificationCenter defaultCenter] postNotificationName:@"refreshParameters" object:nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"refreshParameters" object:nil];
}
else if(level == "Error")
;//[(__bridge id)self showAlert:msg title:level];
......
......@@ -11,7 +11,7 @@
@class DetailViewController;
@interface MasterViewController : UITableViewController <UIPickerViewDataSource, UIPickerViewDelegate, UITextFieldDelegate>
@interface MasterViewController : UITableViewController
{
@private
NSMutableArray *_sections;
......@@ -23,4 +23,6 @@
@property (strong, nonatomic) DetailViewController *detailViewController;
- (void)resetParameters:(id)sender;
@end
......@@ -7,8 +7,8 @@
//
#import "MasterViewController.h"
#import "DetailViewController.h"
#import "parameter.h"
@interface MasterViewController () {
......@@ -28,19 +28,45 @@
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshObject:) name:@"refreshParameters" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshParameters:) name:@"refreshParameters" object:nil];
runButton = [[UIBarButtonItem alloc] initWithTitle:@"Run" style:UIBarButtonItemStyleBordered target:self action:@selector(runWithNewParameter)];
[runButton setTitle:@"Run"];
self.navigationItem.leftBarButtonItem = runButton;
UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshObject:)];
self.navigationItem.rightBarButtonItem = addButton;
UIBarButtonItem *refresh = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(resetParameters:)];
self.navigationItem.rightBarButtonItem = refresh;
self.detailViewController = (DetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController];
_sections = [[NSMutableArray alloc] init];
_sectionstitle = [[NSMutableArray alloc] init];
}
- (void) addParameterNumber:(onelab::number)p inSection:(NSMutableArray*)section
{
if(p.getChoices().size() && p.getChoices().size() == p.getValueLabels().size()) { // enumeration
parameterNumberList *param = [[parameterNumberList alloc] initWithNumber:p];
[section addObject:param];
}
else if(p.getChoices().size() == 2 && p.getChoices()[0] == 0 && p.getChoices()[1] == 1) { // check box
parameterNumberCheckbox *param = [[parameterNumberCheckbox alloc] initWithNumber:p];
[section addObject:param];
}
else if(p.getStep() == 0) { // text box
parameterNumberTextbox *param = [[parameterNumberTextbox alloc] initWithNumber:p];
[section addObject:param];
}
else
{
parameterNumberRange *param = [[parameterNumberRange alloc] initWithNumber:p];
[section addObject:param];
}
}
- (void) addParameterString:(onelab::string)p inSection:(NSMutableArray*)section
{
parameterStringList *param = [[parameterStringList alloc] initWithString:p];
[section addObject:param];
}
- (void) getAvailableParam
{
std::vector<onelab::number> number;
......@@ -49,34 +75,29 @@
{
if(!number[i].getVisible()) continue;
NSString *name=[NSString stringWithCString:number[i].getName().c_str() encoding:[NSString defaultCStringEncoding]];
NSArray *splitedname = [name componentsSeparatedByString:@"/"];
NSString * sectiontitle = [splitedname objectAtIndex:0];
NSString * sectiontitle = [[name componentsSeparatedByString:@"/"] objectAtIndex:0];
bool found = false;
for(int j=0;j<[_sectionstitle count];j++)
{
NSString *title = [_sectionstitle objectAtIndex:j];
if([title isEqualToString:@"Post proccessing"])
{
[_sections removeObjectAtIndex:j];
[_sectionstitle removeObjectAtIndex:j];
}
if([title isEqualToString:sectiontitle]) // the section already exists
{
NSMutableArray *section = [_sections objectAtIndex:j];
for(int k=0; k<[section count];k++)
if([[section objectAtIndex: k] isEqualToString:name]){found = true; break;}
if([[(parameter*)[section objectAtIndex: k] getName] isEqualToString:name]){found = true; break;}
if(!found)
[section addObject:name];
[self addParameterNumber:number[i] inSection:section];
found = true;
break;
}
}
if(found) continue;
// we have to create the section
NSMutableArray *newSection = [[NSMutableArray alloc] initWithObjects:name, nil];
NSMutableArray *newSection = [[NSMutableArray alloc] init];
[_sections addObject:newSection];
[_sectionstitle addObject:sectiontitle];
[self addParameterNumber:number[i] inSection:[_sections lastObject]];
}
std::vector<onelab::string> string;
onelab::server::instance()->get(string);
......@@ -85,8 +106,7 @@
if(!string[i].getVisible()) continue;
if(string[i].getKind() == "file") continue;
NSString *name=[NSString stringWithCString:string[i].getName().c_str() encoding:[NSString defaultCStringEncoding]];
NSArray *splitedname = [name componentsSeparatedByString:@"/"];
NSString * sectiontitle = [splitedname objectAtIndex:0];
NSString * sectiontitle = [[name componentsSeparatedByString:@"/"] objectAtIndex:0];
bool found = false;
for(int j=0;j<[_sectionstitle count];j++)
......@@ -96,18 +116,19 @@
{
NSMutableArray *section = [_sections objectAtIndex:j];
for(int k=0; k<[section count];k++)
if([[section objectAtIndex: k] isEqualToString:name]){found = true; break;} // the parameters is already in the section
if([[(parameter*)[section objectAtIndex: k] getName] isEqualToString:name]){found = true; break;} // the parameters is already in the section
if(!found)
[section addObject:name];
[self addParameterString:string[i] inSection:section];
found = true;
break;
}
}
if(found) continue;
// we have to create the section
NSMutableArray *newSection = [[NSMutableArray alloc] initWithObjects:name, nil];
NSMutableArray *newSection = [[NSMutableArray alloc] init];
[_sections addObject:newSection];
[_sectionstitle addObject:sectiontitle];
[self addParameterString:string[i] inSection:[_sections lastObject]];
}
}
......@@ -128,64 +149,20 @@
{
return YES;
}
- (void)refreshObject:(id)sender
- (void)refreshParameters:(id)sender
{
[self getAvailableParam]; // Get the param
[self.tableView reloadData];
}
- (void)resetParameters:(id)sender
{
onelab_cb("reset");
[_sections removeAllObjects];
[_sectionstitle removeAllObjects];
[self.tableView reloadData];
[self getAvailableParam]; // Get the param
for(int i=0; i<_sections.count;i++) // Refresh they values
{
NSMutableArray *mSection = [_sections objectAtIndex:i];
for(int n=0; n <mSection.count;n++)
{
NSString *paramName = [mSection objectAtIndex:n];
std::vector<onelab::number> number;
onelab::server::instance()->get(number,[paramName UTF8String]);
if(number.size() > 0){
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath: [NSIndexPath indexPathForRow:n inSection:i]];
for(UIView *v in cell.subviews)
{
if ([v isKindOfClass:UISlider.class]){
UISlider *slider = (UISlider*)v;
[slider setValue:number[0].getValue()];
break;
}
else if([v isKindOfClass:UIPickerView.class]){
UIView *picker = (UISlider*)v;
[(UIPickerView *)picker reloadAllComponents];
int index=0;
for(int i=0;i<number[0].getChoices().size();i++)
if(number[0].getChoices()[i] == number[0].getValue()){index = i; break;}
[(UIPickerView *)picker selectRow:index inComponent:0 animated:YES];
break;
}
else if([v isKindOfClass:UITextField.class])
{
UITextField *text = (UITextField*) v;
[text setText:[NSString stringWithFormat:@"%f", number[0].getValue()]];
break;
}
}
}
std::vector<onelab::string> string;
onelab::server::instance()->get(string,[paramName UTF8String]);
if(string.size() > 0) {
UIView *picker = [self.tableView viewWithTag:(1000*i+n)];
if([picker isKindOfClass:UIPickerView.class]){
[(UIPickerView *)picker reloadAllComponents];
int index = -1;
for(int i=0;i<string[0].getChoices().size();i++)
if(string[0].getChoices()[i] == string[0].getValue()){index = i; break;}
if(index >= 0)
[(UIPickerView *)picker selectRow:index inComponent:0 animated:YES];
}
}
}
}
[self.tableView reloadData];
onelab_cb("check");
[[NSNotificationCenter defaultCenter] postNotificationName:@"requestRender" object:nil];
}
......@@ -193,13 +170,15 @@
{
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // TODO fix Run/Stop for iPhone
[runButton setTitle:@"Stop"];
[self refreshControl];
[self.view setNeedsDisplay];
[runButton setAction:@selector(stopRunning)];
self.navigationItem.rightBarButtonItem.enabled = NO;
onelab_cb("compute");
[runButton setTitle:@"Run"];
[self refreshControl];
[self.view setNeedsDisplay];
[runButton setAction:@selector(runWithNewParameter)];
[self getAvailableParam];
self.navigationItem.rightBarButtonItem.enabled = YES;
//[[NSNotificationCenter defaultCenter] postNotificationName:@"refreshParameters" object:nil];
});
if(![[UIDevice currentDevice].model isEqualToString:@"iPad"] && ![[UIDevice currentDevice].model isEqualToString:@"iPad Simulator"])
[self.navigationController popViewControllerAnimated:YES];
......@@ -234,242 +213,54 @@
{
// get the param with his name
NSMutableArray *sectionContent = [_sections objectAtIndex:[indexPath section]];
NSString *paramName = [sectionContent objectAtIndex:[indexPath row]];
std::vector<onelab::number> number;
std::vector<onelab::string> string;
parameter *tmp = [sectionContent objectAtIndex:[indexPath row]];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:paramName];
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if(cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:paramName];
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[[tmp getLabel] text]];
else
return cell;
onelab::server::instance()->get(number,[paramName UTF8String]);
onelab::server::instance()->get(string,[paramName UTF8String]);
if(number.size() > 0)
{
UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(20, 5, cell.frame.size.width - 40, cell.frame.size.height/2)];
if(number[0].getReadOnly())
{
[cell setUserInteractionEnabled:NO];
lbl.alpha = 0.439216f;
}
if(number[0].getLabel() != "")
[lbl setText:[NSString stringWithCString:number[0].getLabel().c_str() encoding:[NSString defaultCStringEncoding]]];
else
[lbl setText:[NSString stringWithCString:number[0].getName().c_str() encoding:[NSString defaultCStringEncoding]]];
[lbl setBackgroundColor:[UIColor clearColor]];
lbl.tag = -(1000 * indexPath.section + indexPath.row);
[cell addSubview:lbl];
if(number[0].getChoices().size() && number[0].getChoices().size() == number[0].getValueLabels().size()) // enumeration
{
UIPickerView *picker = [[UIPickerView alloc] initWithFrame:CGRectMake(20, cell.frame.size.height/2+5, cell.frame.size.width - 40, cell.frame.size.height/2)];
picker.showsSelectionIndicator = YES;
picker.tag = 1000 * indexPath.section + indexPath.row;
[picker setDataSource:self];
[picker setDelegate:self];
for(int row=0;row<number[0].getChoices().size();row++)
if(number[0].getValue() == number[0].getChoices()[row])[picker selectRow:row inComponent:0 animated:NO];
[cell addSubview:picker];
}
else if(number[0].getChoices().size() == 2 && number[0].getChoices()[0] == 0 && number[0].getChoices()[1] == 1) // check box
{
UISwitch *swtch = [[UISwitch alloc] initWithFrame:CGRectMake(10, 5, cell.frame.size.width - 40, cell.frame.size.height)];
lbl.tag = 1000 * indexPath.section + indexPath.row;
[swtch setSelected:(number[0].getValue() == 1)];
[lbl setFrame:CGRectMake(100, 5, cell.frame.size.width - 110, cell.frame.size.height)];
[cell addSubview:swtch];
}
else if(number[0].getStep() == 0) // text box
{
UITextField *textfield = [[UITextField alloc] initWithFrame:CGRectMake(20, cell.frame.size.height/2+5, cell.frame.size.width - 40, cell.frame.size.height/2)];
textfield.tag = 1000 * indexPath.section + indexPath.row;
[textfield setBorderStyle:UITextBorderStyleRoundedRect];
[textfield setText:[NSString stringWithFormat:@"%f",number[0].getValue()]];
[textfield setKeyboardType:UIKeyboardTypeNumberPad];
[textfield addTarget:self action:@selector(PViewNbIso:) forControlEvents:UIControlEventValueChanged];
[textfield setDelegate:self];
[cell addSubview:textfield];
}
else // slider with range
{
UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake(20, cell.frame.size.height/2+5, cell.frame.size.width - 40, cell.frame.size.height/2)];
slider.tag = 1000 * indexPath.section + indexPath.row;
[slider setMaximumValue:number[0].getMax()];
[slider setMinimumValue:number[0].getMin()];
[slider setValue:number[0].getValue()];
//TODO add step ?
[slider addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventTouchUpOutside];
[slider addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventTouchUpInside];
[lbl setText:[NSString stringWithFormat:@"%@ %f" ,[NSString stringWithCString:number[0].getLabel().c_str() encoding:[NSString defaultCStringEncoding]], number[0].getValue()]];
[cell addSubview:slider];
}
[cell setUserInteractionEnabled:!([tmp isReadOnly])];
[tmp setLabelFrame:CGRectMake(20, 5, cell.frame.size.width - 40, cell.frame.size.height/2)];
[cell addSubview:[tmp getLabel]];
if([tmp isKindOfClass:[parameterStringList class]]) {
parameterStringList *param = (parameterStringList *)tmp;
[param setFrame:CGRectMake(20, cell.frame.size.height/2+5, cell.frame.size.width - 40, cell.frame.size.height/2)];
[cell addSubview:[param getList]];
}
else if(string.size() > 0)
{
UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(20, 5, cell.frame.size.width - 40, cell.frame.size.height/2)];
if(string[0].getReadOnly())
{
[cell setUserInteractionEnabled:NO];
lbl.alpha = 0.439216f;
}
[lbl setText:[NSString stringWithCString:string[0].getLabel().c_str() encoding:[NSString defaultCStringEncoding]]];
[lbl setBackgroundColor:[UIColor clearColor]];
lbl.tag = -(1000 * indexPath.section + indexPath.row);
UIPickerView *picker = [[UIPickerView alloc] initWithFrame:CGRectMake(20, cell.frame.size.height/2+5, cell.frame.size.width - 40, cell.frame.size.height/2)];
picker.showsSelectionIndicator = YES;
picker.tag = 1000 * indexPath.section + indexPath.row;
[picker setDataSource:self];
[picker setDelegate:self];
for(int row=0;row<string[0].getChoices().size();row++)
if(string[0].getValue() == string[0].getChoices()[row])[picker selectRow:row inComponent:0 animated:NO];
[cell addSubview:picker];
[cell addSubview:lbl];
else if([tmp isKindOfClass:[parameterNumberList class]]) {
parameterNumberList *param = (parameterNumberList *)tmp;
[param setFrame:CGRectMake(20, cell.frame.size.height/2+5, cell.frame.size.width - 40, cell.frame.size.height/2)];
[cell addSubview:[param getList]];
}
else if([tmp isKindOfClass:[parameterNumberCheckbox class]]) {
parameterNumberCheckbox *param = (parameterNumberCheckbox *)tmp;
[param setLabelFrame:CGRectMake(100, 5, cell.frame.size.width - 110, cell.frame.size.height)];
[param setFrame:CGRectMake(10, 5, cell.frame.size.width - 40, cell.frame.size.height)];
[cell addSubview:[param getCheckbox]];
}
else if([tmp isKindOfClass:[parameterNumberRange class]]) {
parameterNumberRange *param = (parameterNumberRange *)tmp;
[param setFrame:CGRectMake(20, cell.frame.size.height/2+5, cell.frame.size.width - 40, cell.frame.size.height/2)];
[cell addSubview:[param getSlider]];
}
else if([tmp isKindOfClass:[parameterNumberTextbox class]]) {
parameterNumberTextbox *param = (parameterNumberTextbox *)tmp;
[param setFrame:CGRectMake(20, cell.frame.size.height/2+5, cell.frame.size.width - 40, cell.frame.size.height/2)];
[cell addSubview:[param getTextbox]];
}
return cell;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *paramName = [[_sections objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
std::vector<onelab::number> number;
onelab::server::instance()->get(number,[paramName UTF8String]);
if(number.size() > 0){
if(number[0].getChoices().size() && number[0].getChoices().size() == number[0].getValueLabels().size()) // enumeration
return 200.f;
if(number[0].getChoices().size() == 2 && number[0].getChoices()[0] == 0 && number[0].getChoices()[1] == 1) // check box
return 40.f;
return 60.f;
}
std::vector<onelab::string> string;
onelab::server::instance()->get(string,[paramName UTF8String]);
if(string.size() > 0) return 200.f;
return 50.f;
parameter *param = [[_sections objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
return [[param class] getHeight];
}
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
return [_sectionstitle objectAtIndex:section];
}
-(void)sliderValueChanged:(UISlider *)sender
{
int nsection = (int)(sender.tag/1000), nrow = sender.tag%1000;
NSString *title = [[_sections objectAtIndex:nsection] objectAtIndex:nrow];
std::vector<onelab::number> number;
onelab::server::instance()->get(number,[title UTF8String]);
number[0].setValue(sender.value);
onelab::server::instance()->set(number[0]);
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath: [NSIndexPath indexPathForRow:nrow inSection:nsection]];
UILabel *lbl = nil;
for(UIView *v in cell.subviews)
if ([v isKindOfClass:UILabel.class]){
lbl = (UILabel*)v;
break;
}
if(lbl != nil)
[lbl setText:[NSString stringWithFormat:@"%s %f" ,number[0].getLabel().c_str(), sender.value]];
if(onelab_cb("check") == 1)
[[NSNotificationCenter defaultCenter] postNotificationName:@"requestRender" object:nil];
}
#pragma mark - pickerView
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
int nsection = (int)(pickerView.tag/1000), nrow = pickerView.tag%1000;
NSString *title = [[_sections objectAtIndex:nsection] objectAtIndex:nrow];
std::vector<onelab::string> string;
std::vector<onelab::number> number;
onelab::server::instance()->get(string,[title UTF8String]);
onelab::server::instance()->get(number,[title UTF8String]);
if(string.size() > 0) return string[0].getChoices().size();
else if(number.size() > 0) return number[0].getChoices().size();
else return 0;
}
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
int nsection = (int)(pickerView.tag/1000), nrow = pickerView.tag%1000;
NSString *title = [[_sections objectAtIndex:nsection] objectAtIndex:nrow];
std::vector<onelab::string> string;
std::vector<onelab::number> number;
onelab::server::instance()->get(string,[title UTF8String]);
onelab::server::instance()->get(number,[title UTF8String]);
if(string.size() > 0)
{
return [NSString stringWithCString:string[0].getChoices()[row].c_str() encoding:[NSString defaultCStringEncoding]];
}
else if(number.size() > 0) return [NSString stringWithCString:number[0].getValueLabel(number[0].getChoices()[row]).c_str() encoding:[NSString defaultCStringEncoding]];
else return @"?";
}
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 1;
}
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
int nsection = (int)(pickerView.tag/1000), nrow = pickerView.tag%1000;
NSString *title = [[_sections objectAtIndex:nsection] objectAtIndex:nrow];
std::vector<onelab::string> string;
std::vector<onelab::number> number;
onelab::server::instance()->get(string,[title UTF8String]);
onelab::server::instance()->get(number,[title UTF8String]);
int index = [pickerView selectedRowInComponent:0];
if(string.size() > 0)
{
std::string selected = string[0].getChoices()[index];
string[0].setValue(selected);
onelab::server::instance()->set(string[0]);
}
else if(number.size() > 0)
{
double selected = number[0].getChoices()[index];
number[0].setValue(selected);
onelab::server::instance()->set(number[0]);
}
if(onelab_cb("check") == 1)
[[NSNotificationCenter defaultCenter] postNotificationName:@"requestRender" object:nil];
}
#pragma mark - textfield
-(BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
int nsection = (int)(textField.tag/1000), nrow = textField.tag%1000;
NSString *title = [[_sections objectAtIndex:nsection] objectAtIndex:nrow];
std::vector<onelab::string> string;
std::vector<onelab::number> number;
onelab::server::instance()->get(string,[title UTF8String]);
onelab::server::instance()->get(number,[title UTF8String]);
if(number.size() > 0)
{
number[0].setValue([textField.text doubleValue]);
onelab::server::instance()->set(number[0]);
}
else if(string.size() > 0)
{
string[0].setValue([textField.text UTF8String]);
onelab::server::instance()->set(string[0]);
}
return YES;
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField endEditing:YES];
return YES;
}
@end
//
// parameter.h
// Onelab
//
// Created by Maxime Graulich on 07/08/13.
// Copyright (c) 2013 Maxime Graulich. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <Gmsh/onelab.h>
#import "drawContext.h"
@interface parameter : NSObject
{
@protected
NSString *name;
UILabel *label;
}
-(id)init;
-(void)setFrame:(CGRect)frame;
-(void)setLabelFrame:(CGRect)frame;
-(NSString *)getName;
-(UILabel *)getLabel;
-(bool)isReadOnly;
+(double)getHeight;
@end
@interface parameterStringList : parameter <UIPickerViewDataSource, UIPickerViewDelegate>
{
@protected
UIPickerView *picker;
}
-(id)initWithString:(onelab::string)string;
-(UIPickerView *)getList;
@end
@interface parameterNumberList : parameter <UIPickerViewDataSource, UIPickerViewDelegate, UITextFieldDelegate>
{
@protected
UIPickerView *picker;
}
-(id)initWithNumber:(onelab::number)number;
-(UIPickerView *)getList;
@end
@interface parameterNumberCheckbox : parameter
{
@protected
UISwitch *checkbox;
}
-(id)initWithNumber:(onelab::number)number;
-(UISwitch *)getCheckbox;
@end
@interface parameterNumberRange : parameter
{
@protected
UISlider *slider;
}
-(id)initWithNumber:(onelab::number)number;
-(UISlider *)getSlider;
@end
@interface parameterNumberTextbox : parameter <UITextFieldDelegate>
{
@protected
UITextField *textbox;
}
-(id)initWithNumber:(onelab::number)number;
-(UITextField *)getTextbox;
@end
//
// parameter.m
// Onelab
//
// Created by Maxime Graulich on 07/08/13.
// Copyright (c) 2013 Maxime Graulich. All rights reserved.
//
#import "parameter.h"
@implementation parameter
-(id)init
{
self = [super init];
if(self)
{
label = [[UILabel alloc] init];
[label setBackgroundColor:[UIColor clearColor]];
}
return self;
}
-(NSString *)getName
{
return name;
}
-(UILabel *)getLabel
{
return label;
}
-(void)setFrame:(CGRect)frame
{
return;
}
-(void)setLabelFrame:(CGRect)frame
{
[label setFrame:frame];
}
-(bool)isReadOnly
{
return NO;
}
+(double)getHeight
{
return 60.0f;
}
@end
@implementation parameterStringList
-(id) initWithString:(onelab::string)string
{
self = [super init];
if(self)
{
label.alpha = (string.getReadOnly())? 0.439216f : 1.0f;
[label setText:[NSString stringWithCString:(string.getLabel() != "")?string.getLabel().c_str():string.getName().c_str() encoding:[NSString defaultCStringEncoding]]];
name = [NSString stringWithCString:string.getName().c_str() encoding:[NSString defaultCStringEncoding]];
picker = [[UIPickerView alloc] init];
picker.showsSelectionIndicator = YES;
[picker setDataSource:self];
[picker setDelegate:self];
for(int row=0;row<string.getChoices().size();row++)
if(string.getValue() == string.getChoices()[row])[picker selectRow:row inComponent:0 animated:NO];
}
return self;
}
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 1;
}
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
std::vector<onelab::string> string;
onelab::server::instance()->get(string,[name UTF8String]);
if(string.size() < 1) return 0;
return string[0].getChoices().size();
}
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
std::vector<onelab::string> string;
onelab::server::instance()->get(string,[name UTF8String]);
if(string.size() < 1) return @"NULL";
return [NSString stringWithCString:string[0].getChoices()[row].c_str() encoding:[NSString defaultCStringEncoding]];
}
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
std::vector<onelab::string> string;
onelab::server::instance()->get(string,[name UTF8String]);
if(string.size() < 1) return;
std::string selected = string[0].getChoices()[row];
string[0].setValue(selected);
onelab::server::instance()->set(string[0]);
if(onelab_cb("check") == 1)
[[NSNotificationCenter defaultCenter] postNotificationName:@"requestRender" object:nil];
}
-(void)setFrame:(CGRect)frame
{
[picker setFrame:frame];
}
-(UIPickerView *)getList
{
return picker;
}
-(bool)isReadOnly
{
std::vector<onelab::string> string;
onelab::server::instance()->get(string,[name UTF8String]);
if(string.size() < 1) return YES;
return string[0].getReadOnly();
}
+(double)getHeight
{
return 200.0f;
}
@end
@implementation parameterNumberList
-(id) initWithNumber:(onelab::number) number
{
self = [super init];
if(self)
{
label.alpha = (number.getReadOnly())? 0.439216f : 1.0f;
[label setText:[NSString stringWithCString:(number.getLabel() != "")?number.getLabel().c_str():number.getName().c_str() encoding:[NSString defaultCStringEncoding]]];
name = [NSString stringWithCString:number.getName().c_str() encoding:[NSString defaultCStringEncoding]];
picker = [[UIPickerView alloc] init];
picker.showsSelectionIndicator = YES;
[picker setDataSource:self];
[picker setDelegate:self];
for(int row=0;row<number.getChoices().size();row++)
if(number.getValue() == number.getChoices()[row])[picker selectRow:row inComponent:0 animated:NO];
}
return self;
}
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 1;
}
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
std::vector<onelab::number> number;
onelab::server::instance()->get(number,[name UTF8String]);
if(number.size() < 1) return 0;
return number[0].getChoices().size();
}
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
std::vector<onelab::number> number;
onelab::server::instance()->get(number,[name UTF8String]);
if(number.size() < 1) return @"NULL";
return [NSString stringWithCString:number[0].getValueLabel(number[0].getChoices()[row]).c_str() encoding:[NSString defaultCStringEncoding]];
}
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
std::vector<onelab::number> number;
onelab::server::instance()->get(number,[name UTF8String]);
if(number.size() < 1) return;
double selected = number[0].getChoices()[row];
number[0].setValue(selected);
onelab::server::instance()->set(number[0]);
if(onelab_cb("check") == 1)
[[NSNotificationCenter defaultCenter] postNotificationName:@"requestRender" object:nil];
}
-(void)setFrame:(CGRect)frame
{
[picker setFrame:frame];
}
-(UIPickerView *)getList
{
return picker;
}
-(bool)isReadOnly
{
std::vector<onelab::number> number;
onelab::server::instance()->get(number,[name UTF8String]);
if(number.size() < 1) return YES;
return number[0].getReadOnly();
}
+(double)getHeight
{
return 200.0f;
}
@end
@implementation parameterNumberCheckbox
-(id) initWithNumber:(onelab::number) number
{
self = [super init];
if(self)
{
label.alpha = (number.getReadOnly())? 0.439216f : 1.0f;
[label setText:[NSString stringWithCString:(number.getLabel() != "")?number.getLabel().c_str():number.getName().c_str() encoding:[NSString defaultCStringEncoding]]];
name = [NSString stringWithCString:number.getName().c_str() encoding:[NSString defaultCStringEncoding]];
checkbox = [[UISwitch alloc] init];
[checkbox setSelected:(number.getValue() == 1)];
[checkbox addTarget:self action:@selector(valueChange:) forControlEvents:UIControlEventValueChanged];
}
return self;
}
-(void) valueChange:(UISwitch *)sender
{
std::vector<onelab::number> number;
onelab::server::instance()->get(number,[name UTF8String]);
if(number.size() < 1) return;
number[0].setValue(([sender isOn])? 1 : 0);
onelab::server::instance()->set(number[0]);
if(onelab_cb("check") == 1)
[[NSNotificationCenter defaultCenter] postNotificationName:@"requestRender" object:nil];
}
-(void)setFrame:(CGRect)frame
{
[checkbox setFrame:frame];
}
-(UISwitch *)getCheckbox
{
return checkbox;
}
-(bool)isReadOnly
{
std::vector<onelab::number> number;
onelab::server::instance()->get(number,[name UTF8String]);
if(number.size() < 1) return YES;
return number[0].getReadOnly();
}
+(double)getHeight
{
return 40.0f;
}
@end
@implementation parameterNumberRange
-(id) initWithNumber:(onelab::number) number
{
self = [super init];
if(self)
{
label.alpha = (number.getReadOnly())? 0.439216f : 1.0f;
name = [NSString stringWithCString:number.getName().c_str() encoding:[NSString defaultCStringEncoding]];
slider = [[UISlider alloc] init];
[slider setMaximumValue:number.getMax()];
[slider setMinimumValue:number.getMin()];
[slider setValue:number.getValue()];
//TODO add step ?
[slider addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventTouchUpOutside];
[slider addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventTouchUpInside];
[label setText:[NSString stringWithFormat:@"%@ %f" ,[NSString stringWithCString:(number.getLabel() != "")?number.getLabel().c_str():number.getName().c_str() encoding:[NSString defaultCStringEncoding]], number.getValue()]];
}
return self;
}
-(void)sliderValueChanged:(UISlider *)sender
{
std::vector<onelab::number> number;
onelab::server::instance()->get(number,[name UTF8String]);
if(number.size() < 1) return;
number[0].setValue(sender.value);
onelab::server::instance()->set(number[0]);
[label setText:[NSString stringWithFormat:@"%s %f" ,(number[0].getLabel() != "")?number[0].getLabel().c_str():number[0].getName().c_str(), number[0].getValue()]];
if(onelab_cb("check") == 1)
[[NSNotificationCenter defaultCenter] postNotificationName:@"requestRender" object:nil];
}
-(void)setFrame:(CGRect)frame
{
[slider setFrame:frame];
}
-(UISlider *)getSlider
{
return slider;
}
-(bool)isReadOnly
{
std::vector<onelab::number> number;
onelab::server::instance()->get(number,[name UTF8String]);
if(number.size() < 1) return YES;
return number[0].getReadOnly();
}
+(double)getHeight
{
return 60.0f;
}
@end
@implementation parameterNumberTextbox
-(id)initWithNumber:(onelab::number)number
{
self = [super init];
if(self)
{
label.alpha = (number.getReadOnly())? 0.439216f : 1.0f;
[label setText:[NSString stringWithCString:(number.getLabel() != "")?number.getLabel().c_str():number.getName().c_str() encoding:[NSString defaultCStringEncoding]]];
name = [NSString stringWithCString:number.getName().c_str() encoding:[NSString defaultCStringEncoding]];
textbox = [[UITextField alloc] init];
[textbox setBorderStyle:UITextBorderStyleRoundedRect];
[textbox setKeyboardType:UIKeyboardTypeNumberPad];
[textbox setText:[NSString stringWithFormat:@"%f", number.getValue()]];
[textbox setDelegate:self];
}
return self;
}
-(BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
std::vector<onelab::number> number;
onelab::server::instance()->get(number,[name UTF8String]);
if(number.size() < 1) return YES;
number[0].setValue([textField.text doubleValue]);
onelab::server::instance()->set(number[0]);
return YES;
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
return [textField endEditing:YES];
}
-(void)setFrame:(CGRect)frame
{
[textbox setFrame:frame];
}
-(UITextField *)getTextbox
{
return textbox;
}
-(bool)isReadOnly
{
std::vector<onelab::number> number;
onelab::server::instance()->get(number,[name UTF8String]);
if(number.size() < 1) return YES;
return number[0].getReadOnly();
}
+(double)getHeight
{
return 60.f;
}
@end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment