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

Fix parameters on iOS

parent 56dfcaf8
No related branches found
No related tags found
No related merge requests found
...@@ -27,4 +27,6 @@ ...@@ -27,4 +27,6 @@
@property (weak, nonatomic) IBOutlet UILabel *detailDescriptionLabel; @property (weak, nonatomic) IBOutlet UILabel *detailDescriptionLabel;
@property (nonatomic, retain) NSString *initialModel;
@end @end
...@@ -55,6 +55,7 @@ ...@@ -55,6 +55,7 @@
[self configureView]; [self configureView];
scaleFactor = 1.; scaleFactor = 1.;
setObjCBridge((__bridge void*) self); 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"]){ 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 *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)]; UIBarButtonItem *postpro = [[UIBarButtonItem alloc] initWithTitle:@"Post processing" style:UIBarButtonItemStyleBordered target:self action:@selector(showPostpro)];
...@@ -117,7 +118,7 @@ ...@@ -117,7 +118,7 @@
sender.numberOfTapsRequired = 2; sender.numberOfTapsRequired = 2;
if(sender.state == UIGestureRecognizerStateEnded){ if(sender.state == UIGestureRecognizerStateEnded){
scaleFactor = 1; scaleFactor = 1;
glView->mContext->eventHandler(5); glView->mContext->eventHandler(10);
[glView drawView]; [glView drawView];
} }
} }
...@@ -352,7 +353,7 @@ void messageFromCpp (void *self, std::string level, std::string msg) ...@@ -352,7 +353,7 @@ void messageFromCpp (void *self, std::string level, std::string msg)
{ {
if(level == "RequestRender"){ if(level == "RequestRender"){
[(__bridge id)self requestRender]; [(__bridge id)self requestRender];
//[[NSNotificationCenter defaultCenter] postNotificationName:@"refreshParameters" object:nil]; [[NSNotificationCenter defaultCenter] postNotificationName:@"refreshParameters" object:nil];
} }
else if(level == "Error") else if(level == "Error")
;//[(__bridge id)self showAlert:msg title:level]; ;//[(__bridge id)self showAlert:msg title:level];
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
@class DetailViewController; @class DetailViewController;
@interface MasterViewController : UITableViewController <UIPickerViewDataSource, UIPickerViewDelegate, UITextFieldDelegate> @interface MasterViewController : UITableViewController
{ {
@private @private
NSMutableArray *_sections; NSMutableArray *_sections;
...@@ -23,4 +23,6 @@ ...@@ -23,4 +23,6 @@
@property (strong, nonatomic) DetailViewController *detailViewController; @property (strong, nonatomic) DetailViewController *detailViewController;
- (void)resetParameters:(id)sender;
@end @end
...@@ -7,8 +7,8 @@ ...@@ -7,8 +7,8 @@
// //
#import "MasterViewController.h" #import "MasterViewController.h"
#import "DetailViewController.h" #import "DetailViewController.h"
#import "parameter.h"
@interface MasterViewController () { @interface MasterViewController () {
...@@ -28,19 +28,45 @@ ...@@ -28,19 +28,45 @@
{ {
[super viewDidLoad]; [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib. // 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 = [[UIBarButtonItem alloc] initWithTitle:@"Run" style:UIBarButtonItemStyleBordered target:self action:@selector(runWithNewParameter)];
[runButton setTitle:@"Run"]; [runButton setTitle:@"Run"];
self.navigationItem.leftBarButtonItem = runButton; self.navigationItem.leftBarButtonItem = runButton;
UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshObject:)]; UIBarButtonItem *refresh = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(resetParameters:)];
self.navigationItem.rightBarButtonItem = addButton; self.navigationItem.rightBarButtonItem = refresh;
self.detailViewController = (DetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController]; self.detailViewController = (DetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController];
_sections = [[NSMutableArray alloc] init]; _sections = [[NSMutableArray alloc] init];
_sectionstitle = [[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 - (void) getAvailableParam
{ {
std::vector<onelab::number> number; std::vector<onelab::number> number;
...@@ -49,34 +75,29 @@ ...@@ -49,34 +75,29 @@
{ {
if(!number[i].getVisible()) continue; if(!number[i].getVisible()) continue;
NSString *name=[NSString stringWithCString:number[i].getName().c_str() encoding:[NSString defaultCStringEncoding]]; NSString *name=[NSString stringWithCString:number[i].getName().c_str() encoding:[NSString defaultCStringEncoding]];
NSArray *splitedname = [name componentsSeparatedByString:@"/"]; NSString * sectiontitle = [[name componentsSeparatedByString:@"/"] objectAtIndex:0];
NSString * sectiontitle = [splitedname objectAtIndex:0];
bool found = false; bool found = false;
for(int j=0;j<[_sectionstitle count];j++) for(int j=0;j<[_sectionstitle count];j++)
{ {
NSString *title = [_sectionstitle objectAtIndex: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 if([title isEqualToString:sectiontitle]) // the section already exists
{ {
NSMutableArray *section = [_sections objectAtIndex:j]; NSMutableArray *section = [_sections objectAtIndex:j];
for(int k=0; k<[section count];k++) 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) if(!found)
[section addObject:name]; [self addParameterNumber:number[i] inSection:section];
found = true; found = true;
break; break;
} }
} }
if(found) continue; if(found) continue;
// we have to create the section // we have to create the section
NSMutableArray *newSection = [[NSMutableArray alloc] initWithObjects:name, nil]; NSMutableArray *newSection = [[NSMutableArray alloc] init];
[_sections addObject:newSection]; [_sections addObject:newSection];
[_sectionstitle addObject:sectiontitle]; [_sectionstitle addObject:sectiontitle];
[self addParameterNumber:number[i] inSection:[_sections lastObject]];
} }
std::vector<onelab::string> string; std::vector<onelab::string> string;
onelab::server::instance()->get(string); onelab::server::instance()->get(string);
...@@ -85,8 +106,7 @@ ...@@ -85,8 +106,7 @@
if(!string[i].getVisible()) continue; if(!string[i].getVisible()) continue;
if(string[i].getKind() == "file") continue; if(string[i].getKind() == "file") continue;
NSString *name=[NSString stringWithCString:string[i].getName().c_str() encoding:[NSString defaultCStringEncoding]]; NSString *name=[NSString stringWithCString:string[i].getName().c_str() encoding:[NSString defaultCStringEncoding]];
NSArray *splitedname = [name componentsSeparatedByString:@"/"]; NSString * sectiontitle = [[name componentsSeparatedByString:@"/"] objectAtIndex:0];
NSString * sectiontitle = [splitedname objectAtIndex:0];
bool found = false; bool found = false;
for(int j=0;j<[_sectionstitle count];j++) for(int j=0;j<[_sectionstitle count];j++)
...@@ -96,18 +116,19 @@ ...@@ -96,18 +116,19 @@
{ {
NSMutableArray *section = [_sections objectAtIndex:j]; NSMutableArray *section = [_sections objectAtIndex:j];
for(int k=0; k<[section count];k++) 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) if(!found)
[section addObject:name]; [self addParameterString:string[i] inSection:section];
found = true; found = true;
break; break;
} }
} }
if(found) continue; if(found) continue;
// we have to create the section // we have to create the section
NSMutableArray *newSection = [[NSMutableArray alloc] initWithObjects:name, nil]; NSMutableArray *newSection = [[NSMutableArray alloc] init];
[_sections addObject:newSection]; [_sections addObject:newSection];
[_sectionstitle addObject:sectiontitle]; [_sectionstitle addObject:sectiontitle];
[self addParameterString:string[i] inSection:[_sections lastObject]];
} }
} }
...@@ -128,64 +149,20 @@ ...@@ -128,64 +149,20 @@
{ {
return YES; return YES;
} }
- (void)refreshParameters:(id)sender
- (void)refreshObject:(id)sender {
[self getAvailableParam]; // Get the param
[self.tableView reloadData];
}
- (void)resetParameters:(id)sender
{ {
onelab_cb("reset"); onelab_cb("reset");
[_sections removeAllObjects]; [_sections removeAllObjects];
[_sectionstitle removeAllObjects]; [_sectionstitle removeAllObjects];
[self.tableView reloadData];
[self getAvailableParam]; // Get the param [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]; [self.tableView reloadData];
onelab_cb("check");
[[NSNotificationCenter defaultCenter] postNotificationName:@"requestRender" object:nil]; [[NSNotificationCenter defaultCenter] postNotificationName:@"requestRender" object:nil];
} }
...@@ -193,13 +170,15 @@ ...@@ -193,13 +170,15 @@
{ {
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // TODO fix Run/Stop for iPhone dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // TODO fix Run/Stop for iPhone
[runButton setTitle:@"Stop"]; [runButton setTitle:@"Stop"];
[self refreshControl]; [self.view setNeedsDisplay];
[runButton setAction:@selector(stopRunning)]; [runButton setAction:@selector(stopRunning)];
self.navigationItem.rightBarButtonItem.enabled = NO;
onelab_cb("compute"); onelab_cb("compute");
[runButton setTitle:@"Run"]; [runButton setTitle:@"Run"];
[self refreshControl]; [self.view setNeedsDisplay];
[runButton setAction:@selector(runWithNewParameter)]; [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"]) if(![[UIDevice currentDevice].model isEqualToString:@"iPad"] && ![[UIDevice currentDevice].model isEqualToString:@"iPad Simulator"])
[self.navigationController popViewControllerAnimated:YES]; [self.navigationController popViewControllerAnimated:YES];
...@@ -234,242 +213,54 @@ ...@@ -234,242 +213,54 @@
{ {
// get the param with his name // get the param with his name
NSMutableArray *sectionContent = [_sections objectAtIndex:[indexPath section]]; NSMutableArray *sectionContent = [_sections objectAtIndex:[indexPath section]];
NSString *paramName = [sectionContent objectAtIndex:[indexPath row]]; parameter *tmp = [sectionContent objectAtIndex:[indexPath row]];
std::vector<onelab::number> number;
std::vector<onelab::string> string;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:paramName]; UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if(cell == nil) if(cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:paramName]; cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[[tmp getLabel] text]];
else else
return cell; return cell;
onelab::server::instance()->get(number,[paramName UTF8String]); [cell setUserInteractionEnabled:!([tmp isReadOnly])];
onelab::server::instance()->get(string,[paramName UTF8String]); [tmp setLabelFrame:CGRectMake(20, 5, cell.frame.size.width - 40, cell.frame.size.height/2)];
if(number.size() > 0) [cell addSubview:[tmp getLabel]];
{ if([tmp isKindOfClass:[parameterStringList class]]) {
UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(20, 5, cell.frame.size.width - 40, cell.frame.size.height/2)]; parameterStringList *param = (parameterStringList *)tmp;
if(number[0].getReadOnly()) [param setFrame:CGRectMake(20, cell.frame.size.height/2+5, cell.frame.size.width - 40, cell.frame.size.height/2)];
{ [cell addSubview:[param getList]];
[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];
}
} }
else if(string.size() > 0) else if([tmp isKindOfClass:[parameterNumberList class]]) {
{ parameterNumberList *param = (parameterNumberList *)tmp;
UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(20, 5, cell.frame.size.width - 40, cell.frame.size.height/2)]; [param setFrame:CGRectMake(20, cell.frame.size.height/2+5, cell.frame.size.width - 40, cell.frame.size.height/2)];
if(string[0].getReadOnly()) [cell addSubview:[param getList]];
{ }
[cell setUserInteractionEnabled:NO]; else if([tmp isKindOfClass:[parameterNumberCheckbox class]]) {
lbl.alpha = 0.439216f; parameterNumberCheckbox *param = (parameterNumberCheckbox *)tmp;
} [param setLabelFrame:CGRectMake(100, 5, cell.frame.size.width - 110, cell.frame.size.height)];
[lbl setText:[NSString stringWithCString:string[0].getLabel().c_str() encoding:[NSString defaultCStringEncoding]]]; [param setFrame:CGRectMake(10, 5, cell.frame.size.width - 40, cell.frame.size.height)];
[lbl setBackgroundColor:[UIColor clearColor]]; [cell addSubview:[param getCheckbox]];
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)]; else if([tmp isKindOfClass:[parameterNumberRange class]]) {
picker.showsSelectionIndicator = YES; parameterNumberRange *param = (parameterNumberRange *)tmp;
picker.tag = 1000 * indexPath.section + indexPath.row; [param setFrame:CGRectMake(20, cell.frame.size.height/2+5, cell.frame.size.width - 40, cell.frame.size.height/2)];
[picker setDataSource:self]; [cell addSubview:[param getSlider]];
[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:[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; return cell;
} }
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{ {
NSString *paramName = [[_sections objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]; parameter *param = [[_sections objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
return [[param class] getHeight];
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;
} }
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{ {
return [_sectionstitle objectAtIndex: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 @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