NEURON
xmenu.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <InterViews/window.h>
4 #include <InterViews/box.h>
5 #include <InterViews/event.h>
6 #include <OS/list.h>
7 #include <OS/string.h>
8 #include <IV-look/kit.h>
9 #include <IV-look/stepper.h>
10 #include <IV-look/dialogs.h>
11 #if defined(MINGW)
12 #define UseFieldEditor 1
13 #else
14 #define UseFieldEditor 0 // Use the FieldSEditor
15 #endif
16 #if UseFieldEditor
17 #include <IV-look/field.h>
18 #define FieldSEditor FieldEditor
19 #else
20 #include "field.h"
21 #endif
22 #include "ocglyph.h"
23 #include "apwindow.h"
24 #include "ivocconf.h"
25 
26 class HocPanel; // panel is a vbox with menus, buttons, value editors, etc.
27 class HocMenu; // popup menu panel item
28 class HocAction; // button/menuItem action
29 class HocValEditor; // field editor with button
30 class HocValAction; // knows what to do when value editor or associated button pressed.
31 class HocItem; // for printing
32 class HocDataPaths;
33 class HocCommand;
34 class HocVarLabel;
35 class HocUpdateItem;
36 class Patch;
37 class BoundedValue;
38 class HocRadioAction;
39 class StepperMenu;
40 class ValEdLabel;
41 class ScenePicker;
42 struct HocSymExtension;
43 
44 
45 class HocPanel: public OcGlyph {
46  public:
47  HocPanel(const char* name, bool horizontal = false);
48  virtual ~HocPanel();
49  virtual void map_window(int scroll = -1); // -1 leave up to panel_scroll attribute
50 
51  void pushButton(const char* name, const char* action, bool activate = false, Object* pyact = 0);
53  const char* name,
54  const char* action,
55  int style,
56  Object* pyvar = NULL,
57  Object* pyact = NULL);
58  HocMenu* menu(const char* name, bool add2menubar = false);
59  MenuItem* menuItem(const char* name,
60  const char* action,
61  bool activate = false,
62  Object* pyact = 0);
64  const char* name,
65  const char* action,
66  Object* pyvar = NULL,
67  Object* pyact = NULL);
68  void valueEd(const char* prompt,
69  const char* variable,
70  const char* action = 0,
71  bool canrun = false,
73  bool deflt = false,
74  bool keep_updated = false,
75  HocSymExtension* extra = NULL,
76  Object* pyvar = NULL,
77  Object* pyact = NULL);
78  void valueEd(const char* prompt,
79  Object* pyvar,
80  Object* pyact = 0,
81  bool canrun = false,
82  bool deflt = false,
83  bool keep_updated = false);
84 
85  // ZFM added vert
87  float low = 0,
88  float high = 100,
89  float resolution = 1,
90  int steps = 10,
91  const char* send_cmd = NULL,
92  bool vert = false,
93  bool slow = false,
94  Object* pyvar = NULL,
95  Object* pysend = NULL);
96  virtual void write(std::ostream&);
97  virtual void save(std::ostream&);
98  virtual HocItem* hoc_item();
99  void label(const char*);
100  void var_label(char**, Object* pyvar = NULL);
102  const char* getName();
103  void itemAppend(const char*);
105  void check_valid_pointers(void*, int);
106  Coord left_, bottom_; // write by makeTray read by dissolve
107  static void save_all(std::ostream&);
108  void data_path(HocDataPaths*, bool);
110  static void keep_updated();
111  static void keep_updated(HocUpdateItem*, bool);
112  static void paneltool(const char* name,
113  const char* procname,
114  const char* action,
115  ScenePicker*,
116  Object* pycallback = NULL,
117  Object* pyselact = NULL);
118 
119  private:
121  std::vector<HocUpdateItem*> elist_;
122  std::vector<HocItem*> ilist_;
123  static std::vector<HocUpdateItem*>* update_list_;
126 };
127 
128 class HocItem: public Resource {
129  public:
130  HocItem(const char*, HocItem* parent = NULL);
131  virtual ~HocItem();
132  virtual void write(std::ostream&);
133  const char* getStr();
134  virtual void help(const char* childpath = NULL);
135  virtual void help_parent(HocItem*);
136 
137  private:
138  CopyString str_;
140 };
141 
142 class HocPushButton: public HocItem {
143  public:
144  HocPushButton(const char*, HocAction*, HocItem* parent = NULL);
145  virtual ~HocPushButton();
146  virtual void write(std::ostream&);
147 
148  private:
150 };
151 
152 class HocRadioButton: public HocItem {
153  public:
154  HocRadioButton(const char*, HocRadioAction*, HocItem* parent = NULL);
155  virtual ~HocRadioButton();
156  virtual void write(std::ostream&);
157 
158  private:
159  HocRadioAction* a_;
160 };
161 
162 class HocMenu: public HocItem {
163  public:
164  HocMenu(const char*, Menu*, MenuItem*, HocItem* parent = NULL, bool add2menubar = false);
165  virtual ~HocMenu();
166  virtual void write(std::ostream&);
167  virtual Menu* menu() {
168  return menu_;
169  }
170  virtual MenuItem* item() {
171  return mi_;
172  }
173 
174  private:
178 };
179 
180 class HocUpdateItem: public HocItem {
181  public:
182  HocUpdateItem(const char*, HocItem* parent = NULL);
183  virtual ~HocUpdateItem();
184  virtual void update_hoc_item();
185  virtual void check_pointer(void*, int vector_size);
186  virtual void data_path(HocDataPaths*, bool);
187 };
188 
189 class HocLabel: public HocItem {
190  public:
191  HocLabel(const char*);
192  virtual ~HocLabel();
193  virtual void write(std::ostream&);
194 };
195 
196 class HocVarLabel: public HocUpdateItem {
197  public:
198  HocVarLabel(char**, PolyGlyph*, Object* pyvar = NULL);
199  virtual ~HocVarLabel();
200  virtual void write(std::ostream&);
201  virtual void update_hoc_item();
202  virtual void check_pointer(void*, int);
203  virtual void data_path(HocDataPaths*, bool);
204 
205  private:
207  char** cpp_;
208  char* cp_;
209  std::string variable_{};
211 };
212 
213 class HocAction: public Action {
214  public:
215  HocAction(const char* action, Object* pyact = NULL);
216  virtual ~HocAction();
217  virtual void execute();
218  const char* name() const;
219  virtual void help();
221 
222  private:
225 };
226 
227 class HocMenuAction: public HocAction {
228  public:
229  HocMenuAction(const char* action, Object* pyact, HocMenu*);
230  virtual ~HocMenuAction();
231  virtual void execute();
232 
233  private:
235  HocPanel* hp_; // a temporary. hm_ is not part of this panel
236 };
237 
239  public:
241  virtual ~HocEditorForItem();
242 
243  virtual void keystroke(const Event&);
244  virtual void press(const Event&);
245  virtual void drag(const Event&);
246  virtual void release(const Event&);
247  virtual void val_inc(const Event&);
248 
249  virtual InputHandler* focus_in();
250  virtual void focus_out();
251 
252  private:
254  int index_;
255 };
256 
257 class HocValStepper: public Stepper {
258  public:
261  virtual ~HocValStepper();
262 
263  virtual void press(const Event&);
264  virtual void release(const Event&);
265  virtual void menu_up(Event&);
266  void default_inc(bool, double);
267  double default_inc();
268  static StepperMenu* menu() {
269  return menu_;
270  }
271 
272  protected:
273  virtual void adjust();
274 
275  private:
276  void left();
277  void middle();
278  void right();
279 
280  private:
282  int steps_;
284  float inc_;
286  static StepperMenu* menu_;
287 };
288 
290  public:
291  HocValEditor(const char* name,
292  const char* variable,
293  ValEdLabel*,
294  HocValAction*,
296  bool canrun = false,
297  HocItem* parent = NULL,
298  Object* pvar = NULL);
299  virtual ~HocValEditor();
301  return fe_;
302  }
303  virtual Stepper* stepper() {
304  return NULL;
305  }
306  virtual void update_hoc_item();
307  void evalField();
308  void audit();
309  virtual void updateField();
310  virtual void write(std::ostream&);
311  virtual void data_path(HocDataPaths*, bool);
312  virtual void check_pointer(void*, int);
313  virtual void print(Printer*, const Allocation&) const;
314  virtual int hoc_default_val_editor() {
315  return 0;
316  }
317  void set_val(double);
318  double get_val();
319  virtual void exec_action();
320  const char* variable() const;
321  virtual void setlimits(float*);
322  virtual double domain_limits(double);
323  bool active() {
324  return active_;
325  }
326 
327  private:
328  friend class HocEditorForItem;
329  friend class HocValStepper;
331  bool active_;
332  bool canrun_;
334  std::string variable_{};
336  ValEdLabel* prompt_;
339 };
340 
342  public:
344  const char* variable,
345  ValEdLabel*,
346  HocValAction*,
348  bool canrun = false,
349  HocItem* parent = NULL,
350  Object* pyvar = NULL);
352  virtual Stepper* stepper() {
353  return vs_;
354  }
355  virtual void updateField();
356  virtual int hoc_default_val_editor() {
357  return 1;
358  }
359  void deflt(double);
360  void def_action();
361  void def_change(float, float);
363  return checkbox_;
364  }
365 
366  private:
367  Button* checkbox_; // not your normal checkbox. see xmenu.cpp
368  double deflt_;
369  double most_recent_;
371 };
372 
374  public:
376  const char* variable,
377  ValEdLabel*,
378  HocValAction*,
380  HocItem* parent = NULL,
381  Object* pyvar = NULL);
383  virtual void write(std::ostream&);
384 };
385 
386 class HocValAction: public HocAction {
387  public:
388  HocValAction(const char* action, Object* pyact = 0);
389  HocValAction(Object* pyaction);
390  virtual ~HocValAction();
392  void execute();
394 #if UseFieldEditor
396  return fea_;
397  }
398 #else
400  return fea_;
401  }
402 #endif
403  private:
405 #if UseFieldEditor
407 #else
409 #endif
410 };
411 
412 
413 // ZFM added vert_
414 class OcSlider: public HocUpdateItem, public Observer {
415  public:
417  float low,
418  float high,
419  float resolution,
420  int nsteps,
421  const char* send_cmd,
422  bool vert,
423  bool slow = false,
424  Object* pyvar = NULL,
425  Object* pysend = NULL);
426  virtual ~OcSlider();
427  virtual void write(std::ostream&);
428 
430 
431  virtual void update(Observable*);
432 
433  virtual void update_hoc_item();
434  virtual void check_pointer(void*, int vector_size);
435  virtual void data_path(HocDataPaths*, bool);
436  virtual double slider_val();
437 
438  private:
439  void audit();
440 
441  private:
442  float resolution_;
447  std::string variable_{};
449  bool vert_;
450  bool slow_;
451 };
452 
453 
454 class HocStateButton: public HocUpdateItem, public Observer {
455  public:
457  const char*,
458  Button*,
459  HocAction*,
460  int,
461  HocItem* parent = NULL,
462  Object* pyvar = NULL);
463  virtual ~HocStateButton();
464  virtual void write(std::ostream&);
465 
466  bool chosen();
468 
469  virtual void update_hoc_item();
470  virtual void check_pointer(void*, int);
471  virtual void data_path(HocDataPaths*, bool);
472  virtual void print(Printer*, const Allocation&) const;
473  enum { CHECKBOX, PALETTE };
474 
475  private:
476  int style_;
477  std::string variable_{};
478  CopyString* name_;
483 };
484 
485 
486 class HocStateMenuItem: public HocUpdateItem, public Observer {
487  public:
489  const char*,
490  MenuItem*,
491  HocAction*,
492  HocItem* parent = NULL,
493  Object* pyvar = NULL);
494  virtual ~HocStateMenuItem();
495  virtual void write(std::ostream&);
496 
497  bool chosen();
499 
500  virtual void update_hoc_item();
501  virtual void check_pointer(void*, int);
502  virtual void data_path(HocDataPaths*, bool);
503  virtual void print(Printer*, const Allocation&) const;
504 
505  private:
506  std::string variable_{};
507  CopyString* name_;
512 };
#define InputHandler
Definition: _defines.h:149
#define Patch
Definition: _defines.h:199
#define TelltaleState
Definition: _defines.h:293
#define Menu
Definition: _defines.h:174
#define Style
Definition: _defines.h:278
#define FieldEditorAction
Definition: _defines.h:110
#define Coord
Definition: _defines.h:17
#define Adjustable
Definition: _defines.h:27
#define Printer
Definition: _defines.h:209
#define MenuItem
Definition: _defines.h:177
#define Event
Definition: _defines.h:105
#define Button
Definition: _defines.h:60
#define PolyGlyph
Definition: _defines.h:205
#define Stepper
Definition: _defines.h:272
#define Action
Definition: _defines.h:25
#define Glyph
Definition: _defines.h:130
virtual ~HocAction()
const char * name() const
HocAction(const char *action, Object *pyact=NULL)
virtual void help()
HocItem * hi_
Definition: xmenu.h:224
virtual void execute()
void hoc_item(HocItem *)
HocCommand * action_
Definition: xmenu.h:223
void deflt(double)
virtual Stepper * stepper()
Definition: xmenu.h:352
HocDefaultValEditor(const char *name, const char *variable, ValEdLabel *, HocValAction *, neuron::container::data_handle< double > pd={}, bool canrun=false, HocItem *parent=NULL, Object *pyvar=NULL)
virtual ~HocDefaultValEditor()
double most_recent_
Definition: xmenu.h:369
Button * checkbox()
Definition: xmenu.h:362
virtual int hoc_default_val_editor()
Definition: xmenu.h:356
HocValStepper * vs_
Definition: xmenu.h:370
virtual void updateField()
Button * checkbox_
Definition: xmenu.h:367
void def_change(float, float)
HocEditorForItem(HocValEditor *, HocValAction *)
virtual void release(const Event &)
virtual void val_inc(const Event &)
virtual void press(const Event &)
virtual void keystroke(const Event &)
virtual ~HocEditorForItem()
virtual void focus_out()
virtual void drag(const Event &)
HocValEditor * hve_
Definition: xmenu.h:253
virtual InputHandler * focus_in()
Definition: xmenu.h:128
virtual void write(std::ostream &)
CopyString str_
Definition: xmenu.h:138
HocItem * help_parent_
Definition: xmenu.h:139
virtual void help_parent(HocItem *)
HocItem(const char *, HocItem *parent=NULL)
virtual ~HocItem()
virtual void help(const char *childpath=NULL)
const char * getStr()
HocLabel(const char *)
virtual ~HocLabel()
virtual void write(std::ostream &)
virtual ~HocMenuAction()
HocPanel * hp_
Definition: xmenu.h:235
virtual void execute()
HocMenuAction(const char *action, Object *pyact, HocMenu *)
HocMenu * hm_
Definition: xmenu.h:234
Definition: xmenu.h:162
HocMenu(const char *, Menu *, MenuItem *, HocItem *parent=NULL, bool add2menubar=false)
virtual ~HocMenu()
virtual void write(std::ostream &)
MenuItem * mi_
Definition: xmenu.h:175
virtual Menu * menu()
Definition: xmenu.h:167
bool add2menubar_
Definition: xmenu.h:177
Menu * menu_
Definition: xmenu.h:176
virtual MenuItem * item()
Definition: xmenu.h:170
Definition: xmenu.h:45
void label(const char *)
void item_append(HocItem *)
void notifyHocValue()
PolyGlyph * box()
void data_path(HocDataPaths *, bool)
void valueEd(const char *prompt, const char *variable, const char *action=0, bool canrun=false, neuron::container::data_handle< double > pd={}, bool deflt=false, bool keep_updated=false, HocSymExtension *extra=NULL, Object *pyvar=NULL, Object *pyact=NULL)
virtual void map_window(int scroll=-1)
HocMenu * menu(const char *name, bool add2menubar=false)
static std::vector< HocUpdateItem * > * update_list_
Definition: xmenu.h:123
static void keep_updated(HocUpdateItem *, bool)
void var_label(char **, Object *pyvar=NULL)
virtual HocItem * hoc_item()
static void save_all(std::ostream &)
void valueEd(const char *prompt, Object *pyvar, Object *pyact=0, bool canrun=false, bool deflt=false, bool keep_updated=false)
std::vector< HocItem * > ilist_
Definition: xmenu.h:122
static void paneltool(const char *name, const char *procname, const char *action, ScenePicker *, Object *pycallback=NULL, Object *pyselact=NULL)
MenuItem * menuItem(const char *name, const char *action, bool activate=false, Object *pyact=0)
void slider(neuron::container::data_handle< double >, float low=0, float high=100, float resolution=1, int steps=10, const char *send_cmd=NULL, bool vert=false, bool slow=false, Object *pyvar=NULL, Object *pysend=NULL)
static void keep_updated()
virtual void save(std::ostream &)
std::vector< HocUpdateItem * > elist_
Definition: xmenu.h:121
void stateButton(neuron::container::data_handle< double > pd, const char *name, const char *action, int style, Object *pyvar=NULL, Object *pyact=NULL)
bool horizontal_
Definition: xmenu.h:124
HocPanel(const char *name, bool horizontal=false)
virtual void write(std::ostream &)
void check_valid_pointers(void *, int)
const char * getName()
InputHandler * ih_
Definition: xmenu.h:125
Coord bottom_
Definition: xmenu.h:106
virtual ~HocPanel()
void pushButton(const char *name, const char *action, bool activate=false, Object *pyact=0)
PolyGlyph * box_
Definition: xmenu.h:120
Coord left_
Definition: xmenu.h:106
MenuItem * menuStateItem(neuron::container::data_handle< double > pd, const char *name, const char *action, Object *pyvar=NULL, Object *pyact=NULL)
void itemAppend(const char *)
virtual void write(std::ostream &)
HocAction * a_
Definition: xmenu.h:149
HocPushButton(const char *, HocAction *, HocItem *parent=NULL)
virtual ~HocPushButton()
HocRadioAction * a_
Definition: xmenu.h:159
virtual void write(std::ostream &)
HocRadioButton(const char *, HocRadioAction *, HocItem *parent=NULL)
virtual ~HocRadioButton()
void button_action()
virtual void update_hoc_item()
virtual ~HocStateButton()
neuron::container::data_handle< double > pval_
Definition: xmenu.h:479
HocAction * action_
Definition: xmenu.h:482
Button * b_
Definition: xmenu.h:481
virtual void data_path(HocDataPaths *, bool)
virtual void check_pointer(void *, int)
std::string variable_
Definition: xmenu.h:477
CopyString * name_
Definition: xmenu.h:478
virtual void print(Printer *, const Allocation &) const
virtual void write(std::ostream &)
int style_
Definition: xmenu.h:476
HocStateButton(neuron::container::data_handle< double >, const char *, Button *, HocAction *, int, HocItem *parent=NULL, Object *pyvar=NULL)
Object * pyvar_
Definition: xmenu.h:480
MenuItem * b_
Definition: xmenu.h:510
virtual void check_pointer(void *, int)
neuron::container::data_handle< double > pval_
Definition: xmenu.h:508
std::string variable_
Definition: xmenu.h:506
virtual void write(std::ostream &)
HocStateMenuItem(neuron::container::data_handle< double >, const char *, MenuItem *, HocAction *, HocItem *parent=NULL, Object *pyvar=NULL)
virtual void data_path(HocDataPaths *, bool)
virtual void update_hoc_item()
HocAction * action_
Definition: xmenu.h:511
CopyString * name_
Definition: xmenu.h:507
Object * pyvar_
Definition: xmenu.h:509
virtual void print(Printer *, const Allocation &) const
virtual ~HocStateMenuItem()
virtual void update_hoc_item()
HocUpdateItem(const char *, HocItem *parent=NULL)
virtual void check_pointer(void *, int vector_size)
virtual ~HocUpdateItem()
virtual void data_path(HocDataPaths *, bool)
FieldSEditorAction * fea_
Definition: xmenu.h:408
void accept(FieldSEditor *)
HocValAction(const char *action, Object *pyact=0)
HocValEditor * fe_
Definition: xmenu.h:404
FieldSEditorAction * fea()
Definition: xmenu.h:399
virtual ~HocValAction()
HocValAction(Object *pyaction)
void execute()
void setFieldSEditor(HocValEditor *)
HocValEditor(const char *name, const char *variable, ValEdLabel *, HocValAction *, neuron::container::data_handle< double > pd={}, bool canrun=false, HocItem *parent=NULL, Object *pvar=NULL)
Object * pyvar_
Definition: xmenu.h:338
neuron::container::data_handle< double > pval_
Definition: xmenu.h:335
HocAction * action_
Definition: xmenu.h:333
virtual void updateField()
virtual void write(std::ostream &)
virtual int hoc_default_val_editor()
Definition: xmenu.h:314
virtual void update_hoc_item()
virtual void print(Printer *, const Allocation &) const
double get_val()
virtual ~HocValEditor()
bool canrun_
Definition: xmenu.h:332
const char * variable() const
virtual void exec_action()
virtual Stepper * stepper()
Definition: xmenu.h:303
ValEdLabel * prompt_
Definition: xmenu.h:336
virtual void setlimits(float *)
void evalField()
virtual void data_path(HocDataPaths *, bool)
void set_val(double)
bool active_
Definition: xmenu.h:331
std::string variable_
Definition: xmenu.h:334
FieldSEditor * field_editor()
Definition: xmenu.h:300
virtual void check_pointer(void *, int)
float * domain_limits_
Definition: xmenu.h:337
virtual double domain_limits(double)
HocEditorForItem * fe_
Definition: xmenu.h:330
bool active()
Definition: xmenu.h:323
virtual ~HocValEditorKeepUpdated()
HocValEditorKeepUpdated(const char *name, const char *variable, ValEdLabel *, HocValAction *, neuron::container::data_handle< double >, HocItem *parent=NULL, Object *pyvar=NULL)
virtual void write(std::ostream &)
float inc_
Definition: xmenu.h:284
HocValStepper(HocValEditor *, Glyph *, Style *, TelltaleState *)
virtual void menu_up(Event &)
virtual ~HocValStepper()
void default_inc(bool, double)
double default_inc()
static HocValStepper * instance(HocValEditor *)
virtual void release(const Event &)
float default_inc_
Definition: xmenu.h:283
HocValEditor * hve_
Definition: xmenu.h:285
bool geometric_
Definition: xmenu.h:281
virtual void adjust()
virtual void press(const Event &)
static StepperMenu * menu_
Definition: xmenu.h:286
int steps_
Definition: xmenu.h:282
static StepperMenu * menu()
Definition: xmenu.h:268
virtual void data_path(HocDataPaths *, bool)
std::string variable_
Definition: xmenu.h:209
virtual ~HocVarLabel()
Object * pyvar_
Definition: xmenu.h:210
char ** cpp_
Definition: xmenu.h:207
char * cp_
Definition: xmenu.h:208
virtual void write(std::ostream &)
Patch * p_
Definition: xmenu.h:206
HocVarLabel(char **, PolyGlyph *, Object *pyvar=NULL)
virtual void check_pointer(void *, int)
virtual void update_hoc_item()
virtual void write(std::ostream &)
void audit()
virtual void data_path(HocDataPaths *, bool)
bool vert_
Definition: xmenu.h:449
std::string variable_
Definition: xmenu.h:447
neuron::container::data_handle< double > pval_
Definition: xmenu.h:445
virtual double slider_val()
float resolution_
Definition: xmenu.h:442
virtual void update(Observable *)
bool slow_
Definition: xmenu.h:450
OcSlider(neuron::container::data_handle< double >, float low, float high, float resolution, int nsteps, const char *send_cmd, bool vert, bool slow=false, Object *pyvar=NULL, Object *pysend=NULL)
BoundedValue * bv_
Definition: xmenu.h:443
Object * pyvar_
Definition: xmenu.h:446
virtual void update_hoc_item()
virtual void check_pointer(void *, int vector_size)
Adjustable * adjustable()
bool scrolling_
Definition: xmenu.h:448
virtual ~OcSlider()
HocCommand * send_
Definition: xmenu.h:444
const char * name
Definition: init.cpp:16
static void activate()
#define NULL
Definition: spdefs.h:105
Definition: hocdec.h:173