From cd6498ee8dc8700e73e00bf3a49f8d15fe14872f Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Sat, 24 Sep 2016 15:17:45 +0000
Subject: [PATCH] correctly handle dynamic changes of "readOnly" status

---
 contrib/mobile/iOS/Onelab/Parameter.h         |  1 -
 contrib/mobile/iOS/Onelab/Parameter.mm        | 63 +++++--------------
 .../iOS/Onelab/ParametersViewController.mm    |  4 +-
 3 files changed, 16 insertions(+), 52 deletions(-)

diff --git a/contrib/mobile/iOS/Onelab/Parameter.h b/contrib/mobile/iOS/Onelab/Parameter.h
index 6fd94dfd34..5b0af90ec1 100644
--- a/contrib/mobile/iOS/Onelab/Parameter.h
+++ b/contrib/mobile/iOS/Onelab/Parameter.h
@@ -14,7 +14,6 @@
 -(void)setLabelFrame:(CGRect)frame;
 -(NSString *)getName;
 -(UILabel *)getLabel;
--(bool)isReadOnly;
 +(double)getHeight;
 -(void)refresh;
 @end
diff --git a/contrib/mobile/iOS/Onelab/Parameter.mm b/contrib/mobile/iOS/Onelab/Parameter.mm
index 43ff566713..0bb9760b2f 100644
--- a/contrib/mobile/iOS/Onelab/Parameter.mm
+++ b/contrib/mobile/iOS/Onelab/Parameter.mm
@@ -45,8 +45,6 @@
   }
 }
 
--(bool) isReadOnly {return NO;}
-
 +(double)getHeight
 {
   return 60.0f;
@@ -58,7 +56,6 @@
 {
   self = [super init];
   if(self){
-    label.alpha = (string.getReadOnly())? 0.439216f : 1.0f;
     [label setText:[Utils getStringFromCString:string.getShortName().c_str()]];
     name = [Utils getStringFromCString:string.getName().c_str()];
     button = [UIButton buttonWithType:UIButtonTypeSystem];
@@ -102,7 +99,10 @@
 {
   std::vector<onelab::string> string;
   onelab::server::instance()->get(string, [name UTF8String]);
+  if(string.size() < 1) return;
   [button setTitle:[Utils getStringFromCString:string[0].getValue().c_str()] forState:UIControlStateNormal];
+  [button setEnabled:(string[0].getReadOnly() ? FALSE : TRUE)];
+  [label setEnabled:(string[0].getReadOnly() ? FALSE : TRUE)];
 }
 
 -(void)setFrame:(CGRect)frame
@@ -115,14 +115,6 @@
   return button;
 }
 
--(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 60.f;
@@ -134,7 +126,6 @@
 {
   self = [super init];
   if(self) {
-    label.alpha = (number.getReadOnly())? 0.439216f : 1.0f;
     [label setText:[Utils getStringFromCString:number.getShortName().c_str()]];
     name = [Utils getStringFromCString:number.getName().c_str()];
     button = [UIButton buttonWithType:UIButtonTypeSystem];
@@ -194,8 +185,11 @@
 {
   std::vector<onelab::number> number;
   onelab::server::instance()->get(number, [name UTF8String]);
+  if(number.size() < 1) return;
   [button setTitle:[Utils getStringFromCString:number[0].getValueLabel(number[0].getValue()).c_str()]
           forState:UIControlStateNormal];
+  [button setEnabled:(number[0].getReadOnly() ? FALSE : TRUE)];
+  [label setEnabled:(number[0].getReadOnly() ? FALSE : TRUE)];
 }
 
 -(void)setFrame:(CGRect)frame
@@ -208,14 +202,6 @@
   return button;
 }
 
--(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;
@@ -227,7 +213,6 @@
 {
   self = [super init];
   if(self) {
-    label.alpha = (number.getReadOnly())? 0.439216f : 1.0f;
     [label setText:[Utils getStringFromCString:number.getShortName().c_str()]];
     name = [Utils getStringFromCString:number.getName().c_str()];
     checkbox = [[UISwitch alloc] init];
@@ -241,7 +226,10 @@
 {
   std::vector<onelab::number> number;
   onelab::server::instance()->get(number, [name UTF8String]);
+  if(number.size() < 1) return;
   [checkbox setSelected:(number[0].getValue() == 1)];
+  [checkbox setEnabled:(number[0].getReadOnly() ? FALSE : TRUE)];
+  [label setEnabled:(number[0].getReadOnly() ? FALSE : TRUE)];
 }
 
 -(void) valueChange:(UISwitch *)sender
@@ -264,14 +252,6 @@
   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;
@@ -284,7 +264,6 @@
   self = [super init];
   if(self) {
     name = [Utils getStringFromCString:number.getName().c_str()];
-    label.alpha = (number.getReadOnly())? 0.439216f : 1.0f;
     stepper = [[UIStepper alloc] init];
     [stepper setValue:number.getValue()];
     [stepper setStepValue:1];
@@ -317,6 +296,8 @@
   [stepper setValue:number[0].getValue()];
   [label setText:[NSString stringWithFormat:@"%@ %d", [Utils getStringFromCString:number[0].getShortName().c_str()],
                            (int)number[0].getValue()]];
+  [stepper setEnabled:(number[0].getReadOnly() ? FALSE : TRUE)];
+  [label setEnabled:(number[0].getReadOnly() ? FALSE : TRUE)];
 }
 
 -(void)setFrame:(CGRect)frame
@@ -340,7 +321,6 @@
 {
   self = [super init];
   if(self) {
-    label.alpha = (number.getReadOnly())? 0.439216f : 1.0f;
     name = [Utils getStringFromCString:number.getName().c_str()];
     slider = [[UISlider alloc] init];
     [slider setMaximumValue:number.getMax()];
@@ -365,6 +345,8 @@
   [slider setValue:number[0].getValue()];
   [label setText:[NSString stringWithFormat:@"%@ %g", [Utils getStringFromCString:number[0].getShortName().c_str()],
                            number[0].getValue()]];
+  [slider setEnabled:(number[0].getReadOnly() ? FALSE : TRUE)];
+  [label setEnabled:(number[0].getReadOnly() ? FALSE : TRUE)];
 }
 
 -(void)sliderValueChanged:(UISlider *)sender
@@ -389,14 +371,6 @@
   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 65.0f;
@@ -408,7 +382,6 @@
 {
   self = [super init];
   if(self) {
-    label.alpha = (number.getReadOnly())? 0.439216f : 1.0f;
     [label setText:[Utils getStringFromCString:number.getShortName().c_str()]];
     name = [Utils getStringFromCString:number.getName().c_str()];
     textbox = [[UITextField alloc] init];
@@ -432,6 +405,8 @@
   onelab::server::instance()->get(number, [name UTF8String]);
   if(number.size() < 1) return;
   [textbox setText:[NSString stringWithFormat:@"%g", number[0].getValue()]];
+  [textbox setEnabled:(number[0].getReadOnly() ? FALSE : TRUE)];
+  [label setEnabled:(number[0].getReadOnly() ? FALSE : TRUE)];
   [textbox reloadInputViews];
 }
 
@@ -467,14 +442,6 @@
   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;
diff --git a/contrib/mobile/iOS/Onelab/ParametersViewController.mm b/contrib/mobile/iOS/Onelab/ParametersViewController.mm
index 42a66cf253..e2ce710778 100644
--- a/contrib/mobile/iOS/Onelab/ParametersViewController.mm
+++ b/contrib/mobile/iOS/Onelab/ParametersViewController.mm
@@ -133,8 +133,7 @@
   }
   else if(p.getMin() >= p.getMax() ||
           p.getMin() == -onelab::number::maxNumber() ||
-          p.getMax() == onelab::number::maxNumber() ||
-          p.getReadOnly()) { // text box
+          p.getMax() == onelab::number::maxNumber()) { // text box
     ParameterNumberTextbox *param = [[ParameterNumberTextbox alloc] initWithNumber:p];
     [section addObject:param];
   }
@@ -378,7 +377,6 @@ NSString *GetSectionTitle(NSString *name)
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
   }
   [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
-  [cell setUserInteractionEnabled:!([tmp isReadOnly])];
   [tmp setLabelFrame:CGRectMake(20, 5, tableView.frame.size.width - 40, cell.frame.size.height/2)];
   [cell addSubview:[tmp getLabel]];
   if([tmp isKindOfClass:[ParameterStringList class]]) {
-- 
GitLab