1#import "OptionsViewController.h"
2#import "ModelViewController.h"
3#import "ParametersViewController.h"
4#import "PostProcessingViewController.h"
5#import "Utils.h"
6
7#include <gmsh/Context.h>
8#include <gmsh/GmshDefines.h>
9#include <gmsh/PView.h>
10#include <gmsh/PViewData.h>
11#include <gmsh/PViewOptions.h>
12
13@interface OptionsViewController ()
14
15@end
16
17@implementation OptionsViewController
18
19- (id)initWithStyle:(UITableViewStyle)style
20{
21  self = [super initWithStyle:style];
22  if(self) {
23    // Custom initialization
24  }
25  return self;
26}
27
28- (void)viewDidLoad
29{
30  [super viewDidLoad];
31
32  [[NSNotificationCenter defaultCenter] addObserver:self
33                                           selector:@selector(refreshOptions:)
34                                               name:@"refreshParameters"
35                                             object:nil];
36  [[NSNotificationCenter defaultCenter] addObserver:self
37                                           selector:@selector(refreshOptions:)
38                                               name:@"resetParameters"
39                                             object:nil];
40
41  self.navigationItem.title = @"Display";
42
43  [self.navigationController setToolbarHidden:NO];
44  control = [[UISegmentedControl alloc]
45    initWithItems:[[NSArray alloc] initWithObjects:@"Model", @"Display", nil]];
46  UIBarButtonItem *controlBtn =
47    [[UIBarButtonItem alloc] initWithCustomView:control];
48  UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc]
49    initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
50                         target:nil
51                         action:nil];
52  self.toolbarItems = [[NSArray alloc]
53    initWithObjects:flexibleSpace, controlBtn, flexibleSpace, nil];
54  [control addTarget:self
55              action:@selector(indexDidChangeForSegmentedControl:)
56    forControlEvents:UIControlEventValueChanged];
57  if(![[UIDevice currentDevice].model isEqualToString:@"iPad"] &&
58     ![[UIDevice currentDevice].model isEqualToString:@"iPad Simulator"])
59    self.navigationItem.leftBarButtonItem =
60      [[UIBarButtonItem alloc] initWithTitle:@"Back"
61                                       style:UIBarButtonItemStylePlain
62                                      target:self
63                                      action:@selector(backButtonPressed:)];
64  else
65    self.navigationItem.hidesBackButton = true;
66}
67- (void)viewWillAppear:(BOOL)animated
68{
69  control.selectedSegmentIndex = 1;
70  [super viewWillAppear:animated];
71}
72
73- (void)backButtonPressed:(id)sender
74{
75  for(UIViewController *v in [self.navigationController viewControllers])
76    if([v isKindOfClass:[ModelViewController class]])
77      [self.navigationController popToViewController:v animated:YES];
78}
79
80- (void)indexDidChangeForSegmentedControl:(id)sender
81{
82  [self.navigationController popViewControllerAnimated:YES];
83}
84
85- (void)didReceiveMemoryWarning
86{
87  [super didReceiveMemoryWarning];
88  // Dispose of any resources that can be recreated.
89}
90
91- (void)refreshOptions:(id)sender
92{
93  [self performSelectorOnMainThread:@selector(refreshOptions)
94                         withObject:nil
95                      waitUntilDone:NO];
96}
97
98- (void)refreshOptions
99{
100  [self.tableView reloadData];
101}
102
103#pragma mark - Table view data source
104
105- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
106{
107  return 2;
108  // Section 0: Display options
109  // Section 1: Result options
110}
111
112- (NSString *)tableView:(UITableView *)tableView
113  titleForHeaderInSection:(NSInteger)section
114{
115  switch(section) {
116  case 0: return @"Display options";
117  case 1: return @"Result options";
118  default: return @"Other options";
119  }
120}
121
122- (NSInteger)tableView:(UITableView *)tableView
123  numberOfRowsInSection:(NSInteger)section
124{
125  switch(section) {
126  case 0: return 4;
127  case 1: return PView::list.size();
128  default: return 0;
129  }
130}
131
132- (CGFloat)tableView:(UITableView *)tableView
133  heightForRowAtIndexPath:(NSIndexPath *)indexPath
134{
135  return 45.0f;
136}
137
138- (UITableViewCell *)tableView:(UITableView *)tableView
139         cellForRowAtIndexPath:(NSIndexPath *)indexPath
140{
141  UITableViewCell *cell =
142    [tableView dequeueReusableCellWithIdentifier:@"postproCell"];
143  if(cell == nil) {
144    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
145                                  reuseIdentifier:@"postproCell"];
146  }
147  else {
148    cell = nil;
149    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
150                                  reuseIdentifier:@"postproCell"];
151  }
152
153  [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
154  [cell
155    setFrame:CGRectMake(cell.frame.origin.x, cell.frame.origin.x,
156                        tableView.frame.size.width, cell.frame.size.height)];
157  switch(indexPath.section) {
158  case 0: {
159    UISwitch *showHide =
160      [[UISwitch alloc] initWithFrame:CGRectMake(15, 6.5, 100, 30)];
161    UILabel *label = [[UILabel alloc]
162      initWithFrame:CGRectMake(25 + (showHide.frame.size.width), 8,
163                               (tableView.frame.size.width -
164                                (showHide.frame.size.width) - 50),
165                               30)];
166    // set font size at 90% of default size
167    label.font =
168      [label.font fontWithSize:(0.9 * label.font.pointSize)];
169
170    if(indexPath.row == 0) {
171      [label setText:@"Show geometry points"];
172      [showHide setOn:(CTX::instance()->geom.points)];
173      [showHide addTarget:self
174                          action:@selector(setShowGeomPoints:)
175                forControlEvents:UIControlEventValueChanged];
176    }
177    else if(indexPath.row == 1) {
178      [label setText:@"Show geometry curves"];
179      [showHide setOn:(CTX::instance()->geom.curves)];
180      [showHide addTarget:self
181                          action:@selector(setShowGeomCurves:)
182                forControlEvents:UIControlEventValueChanged];
183    }
184    else if(indexPath.row == 2) {
185      [label setText:@"Show mesh surface edges"];
186      [showHide setOn:(CTX::instance()->mesh.surfaceEdges)];
187      [showHide addTarget:self
188                          action:@selector(setShowMeshSurfaceEdges:)
189                forControlEvents:UIControlEventValueChanged];
190    }
191    else if(indexPath.row == 3) {
192      [label setText:@"Show mesh volume edges"];
193      [showHide setOn:CTX::instance()->mesh.volumeEdges];
194      [showHide addTarget:self
195                          action:@selector(setShowMeshVolumeEdges:)
196                forControlEvents:UIControlEventValueChanged];
197    }
198    [cell.contentView addSubview:showHide];
199    [cell.contentView addSubview:label];
200  } break;
201  case 1: {
202    int i = (int)(PView::list.size() - 1 - indexPath.row);
203    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
204    UISwitch *showHide =
205      [[UISwitch alloc] initWithFrame:CGRectMake(15, 6.5, 100, 30)];
206    UILabel *label = [[UILabel alloc]
207      initWithFrame:CGRectMake(25 + (showHide.frame.size.width), 8,
208                               (tableView.frame.size.width -
209                                showHide.frame.size.width - 50),
210                               30)];
211    // set font size at 90% of default size
212    label.font = [label.font fontWithSize:(0.9 * label.font.pointSize)];
213    [showHide setOn:(PView::list[i]->getOptions()->visible == 1)];
214    [showHide setTag:i];
215    [showHide addTarget:self
216                 action:@selector(PViewVisible:)
217       forControlEvents:UIControlEventValueChanged];
218    [label setBackgroundColor:[UIColor clearColor]];
219    [label setText:[Utils getStringFromCString:PView::list[i]
220                                               ->getData()
221                                               ->getName()
222                                               .c_str()]];
223    [cell.contentView addSubview:showHide];
224    [cell.contentView addSubview:label];
225  } break;
226  }
227  return cell;
228}
229
230- (void)tableView:(UITableView *)tableView
231  didSelectRowAtIndexPath:(NSIndexPath *)indexPath
232{
233  if(indexPath.section != 1) return;
234  UIStoryboard *storyboard;
235  if([[UIDevice currentDevice].model isEqualToString:@"iPad"] ||
236     [[UIDevice currentDevice].model isEqualToString:@"iPad Simulator"])
237    storyboard = [UIStoryboard storyboardWithName:@"iPadStoryboard" bundle:nil];
238  else
239    storyboard = [UIStoryboard storyboardWithName:@"iPhoneiPodStoryboard"
240                                           bundle:nil];
241  PostProcessingViewController *postPro = [storyboard
242    instantiateViewControllerWithIdentifier:@"PostProcessingViewController"];
243  [postPro setPView:PView::list[[tableView numberOfRowsInSection:1] - 1 -
244                                indexPath.row]];
245  [self.navigationController pushViewController:postPro animated:YES];
246}
247
248- (void)setShowGeomPoints:(UISwitch *)sender
249{
250  CTX::instance()->geom.points = sender.on;
251  [[NSNotificationCenter defaultCenter] postNotificationName:@"requestRender"
252                                                      object:nil];
253}
254
255- (void)setShowGeomCurves:(UISwitch *)sender
256{
257  CTX::instance()->geom.curves = sender.on;
258  [[NSNotificationCenter defaultCenter] postNotificationName:@"requestRender"
259                                                      object:nil];
260}
261
262- (void)setShowMeshVolumeEdges:(UISwitch *)sender
263{
264  CTX::instance()->mesh.volumeEdges = sender.on;
265  CTX::instance()->mesh.changed = ENT_VOLUME;
266  [[NSNotificationCenter defaultCenter] postNotificationName:@"requestRender"
267                                                      object:nil];
268}
269
270- (void)setShowMeshSurfaceEdges:(UISwitch *)sender
271{
272  CTX::instance()->mesh.surfaceEdges = sender.on;
273  CTX::instance()->mesh.changed = ENT_SURFACE;
274  [[NSNotificationCenter defaultCenter] postNotificationName:@"requestRender"
275                                                      object:nil];
276}
277
278- (IBAction)PViewVisible:(id)sender
279{
280  PView::list[((UISwitch *)sender).tag]->getOptions()->visible =
281    (((UISwitch *)sender).on) ? 1 : 0;
282  [[NSNotificationCenter defaultCenter] postNotificationName:@"requestRender"
283                                                      object:nil];
284}
285
286#pragma mark - textfield
287
288- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
289{
290  int val = (int)[textField.text integerValue];
291  val = (val > 0) ? val : 1;
292  val = (val < 1000) ? val : 1000;
293  [textField setText:[NSString stringWithFormat:@"%d", val]];
294  PView::list[textField.tag]->getOptions()->nbIso = val;
295  PView::list[textField.tag]->setChanged(true);
296  [[NSNotificationCenter defaultCenter] postNotificationName:@"requestRender"
297                                                      object:nil];
298  return YES;
299}
300
301- (BOOL)textFieldShouldReturn:(UITextField *)textField
302{
303  [textField endEditing:YES];
304  return YES;
305}
306
307@end
308