NEURON
secbrows.cpp
Go to the documentation of this file.
1 #include <../../nrnconf.h>
2 #include "classreg.h"
3 #include "gui-redirect.h"
4 
5 #if HAVE_IV
6 
7 #include <InterViews/layout.h>
8 #include <IV-look/kit.h>
9 #include <OS/string.h>
10 #include <stdio.h>
11 #include "apwindow.h"
12 #include "secbrows.h"
13 #include "oclist.h"
14 #include "ivoc.h"
15 #include "objcmd.h"
16 #endif
17 
18 #include "nrnoc2iv.h"
19 #include "membfunc.h"
21 extern Object** (*nrnpy_gui_helper_)(const char* name, Object* obj);
22 extern double (*nrnpy_object_to_double_)(Object*);
23 
24 //-----------------------------------------
25 static double sb_select(void* v) {
26  TRY_GUI_REDIRECT_ACTUAL_DOUBLE("SectionBrowser.select", v);
27 #if HAVE_IV
28  IFGUI
29  Section* sec = chk_access();
30  ((OcSectionBrowser*) v)->select_section(sec);
31  ENDGUI
32 #endif
33  return 1.;
34 }
35 static double sb_select_action(void* v) {
36  TRY_GUI_REDIRECT_ACTUAL_DOUBLE("SectionBrowser.select_action", v);
37 #if HAVE_IV
38  IFGUI
39  char* str_action = NULL;
40  Object* obj_action = NULL;
41  if (hoc_is_object_arg(1)) {
42  obj_action = *hoc_objgetarg(1);
43  } else {
44  str_action = gargstr(1);
45  }
46 
47  ((OcSectionBrowser*) v)->set_select_action(str_action, obj_action);
48  ENDGUI
49 #endif
50  return 1.;
51 }
52 static double sb_accept_action(void* v) {
53  TRY_GUI_REDIRECT_ACTUAL_DOUBLE("SectionBrowser.accept_action", v);
54 #if HAVE_IV
55  IFGUI
56  char* str_action = NULL;
57  Object* obj_action = NULL;
58  if (hoc_is_object_arg(1)) {
59  obj_action = *hoc_objgetarg(1);
60  } else {
61  str_action = gargstr(1);
62  }
63 
64  ((OcSectionBrowser*) v)->set_accept_action(str_action, obj_action);
65  ENDGUI
66 #endif
67  return 1.;
68 }
69 static Member_func sb_members[] = {"select",
70  sb_select,
71  "select_action",
73  "accept_action",
75  0,
76  0};
77 static void* sb_cons(Object*) {
78  TRY_GUI_REDIRECT_OBJ("SectionBrowser", NULL);
79  Object* ob;
80 #if HAVE_IV
82  IFGUI
83  if (ifarg(1)) {
84  ob = *hoc_objgetarg(1);
85  b = new OcSectionBrowser(ob);
86  } else {
87  b = new OcSectionBrowser(NULL);
88  }
89  b->ref();
90  Window* w = new StandardWindow(b->standard_glyph());
91  w->map();
92  ENDGUI
93  return (void*) b;
94 #else
95  return 0;
96 #endif
97 }
98 static void sb_destruct(void* v) {
99  TRY_GUI_REDIRECT_NO_RETURN("~SectionBrowser", v);
100 #if HAVE_IV
102 #endif
103 }
105  class2oc("SectionBrowser", sb_cons, sb_destruct, sb_members, NULL, NULL, NULL);
106 }
107 
108 #if HAVE_IV
109 
111  : OcBrowser() {
112  long i;
113  select_is_pycallback_ = false;
114  accept_is_pycallback_ = false;
115  if (ob) {
116  SectionList sl(ob);
117  Section* sec;
118  scnt_ = 0;
119  for (sec = sl.begin(); sec; sec = sl.next()) {
120  ++scnt_;
121  }
122  if (scnt_) {
123  psec_ = new Section*[scnt_];
124  }
125  scnt_ = 0;
126  for (sec = sl.begin(); sec; sec = sl.next()) {
127  psec_[scnt_++] = sec;
128  }
129  } else {
130  struct hoc_Item* qsec;
131  scnt_ = 0;
132  // ForAllSections(sec) //{
133  ITERATE(qsec, section_list) {
134  ++scnt_;
135  }
136  psec_ = new Section*[scnt_];
137  scnt_ = 0;
138  // ForAllSections(sec) //{
139  ITERATE(qsec, section_list) {
140  Section* sec = hocSEC(qsec);
141  psec_[scnt_++] = sec;
142  }
143  }
144  for (i = 0; i < scnt_; ++i) {
145  append_item(secname(psec_[i]));
146  section_ref(psec_[i]);
147  }
148  select_ = NULL;
149  accept_ = NULL;
150 }
151 
153  long i;
154  for (i = 0; i < scnt_; ++i) {
156  }
157  delete[] psec_;
158  if (select_) {
159  delete select_;
160  }
161  if (accept_) {
162  delete accept_;
163  }
164 }
165 
167  if (accept_) {
168  long i = selected();
169  if (i < 0) {
170  return;
171  }
172  nrn_pushsec(psec_[i]);
173  if (accept_is_pycallback_) {
175  (*nrnpy_call_python_with_section)(accept_pycallback_, psec_[i]);
176  } else {
177  // should not be able to get here
178  }
179  } else {
180  accept_->execute();
181  }
182  nrn_popsec();
183  }
184 }
186  long i;
187  if (sec->prop)
188  for (i = 0; i < scnt_; ++i) {
189  if (psec_[i] == sec) {
191  return;
192  }
193  }
194  OcBrowser::select(-1);
195 }
196 void OcSectionBrowser::set_select_action(const char* s, Object* pyact) {
197  if (select_) {
198  delete select_;
199  }
200  if (pyact) {
201  select_is_pycallback_ = true;
202  select_pycallback_ = pyact;
203  // note: we won't actually invoke this but necessary to avoid segfault
204  select_ = new HocCommand(pyact);
205  } else {
206  select_is_pycallback_ = false;
207  select_ = new HocCommand(s);
208  }
209 }
210 void OcSectionBrowser::set_accept_action(const char* s, Object* pyact) {
211  if (accept_) {
212  delete accept_;
213  }
214  if (pyact) {
215  accept_is_pycallback_ = true;
216  accept_pycallback_ = pyact;
217  // note: we won't actually invoke this but necessary to avoid segfault
218  accept_ = new HocCommand(pyact);
219  } else {
220  accept_is_pycallback_ = false;
221  accept_ = new HocCommand(s);
222  }
223 }
225  GlyphIndex old = selected();
226  OcBrowser::select(i);
227  if (i >= 0 && old != i && select_) {
228  if (psec_[i]->prop) {
229  nrn_pushsec(psec_[i]);
230  if (select_is_pycallback_) {
232  (*nrnpy_call_python_with_section)(select_pycallback_, psec_[i]);
233  } else {
234  // should not be able to get here
235  }
236  } else {
237  select_->execute();
238  }
239  nrn_popsec();
240  } else {
241  state(i)->set(TelltaleState::is_enabled, false);
242  OcBrowser::select(old);
243  }
244  }
245 }
246 //-----------------------------------------
248  : MonoGlyph(NULL) {
249  int i;
250  LayoutKit& lk = *LayoutKit::instance();
251  WidgetKit& wk = *WidgetKit::instance();
252  Button* b[3];
253  b[0] = wk.palette_button("Parameters", NULL);
254  b[1] = wk.palette_button("States", NULL);
255  b[2] = wk.palette_button("Assigned", NULL);
256  PolyGlyph* vb = lk.vbox(b[0], b[1], b[2]);
257  for (i = 0; i < 3; ++i) {
258  tts_[i] = b[i]->state();
259  Resource::ref(tts_[i]);
260  }
261  tts_[0]->set(TelltaleState::is_chosen, true);
262  body(wk.inset_frame(lk.margin(vb, 5)));
263 }
264 
266  int i;
267  for (i = 0; i < 3; ++i) {
269  }
270 }
271 
273  return select(0);
274 }
276  return select(1);
277 }
279  return select(2);
280 }
281 bool MechVarType::select(int i) {
282  return tts_[i]->test(TelltaleState::is_chosen);
283 }
284 
285 //---------------------------------------------------------------------
286 
287 #define MSBEGIN 2
289  : MonoGlyph(NULL) {
290  int i;
291  LayoutKit& lk = *LayoutKit::instance();
292  WidgetKit& wk = *WidgetKit::instance();
293  ScrollBox* vsb = lk.vscrollbox(5);
294  Button* b;
295  tts_ = new TelltaleState*[n_memb_func];
296  for (i = MSBEGIN; i < n_memb_func; ++i) {
297  b = wk.palette_button(memb_func[i].sym->name, NULL);
298  b->state()->set(TelltaleState::is_chosen, true);
299  vsb->append(b);
300  tts_[i] = b->state();
301  }
302  body(lk.hbox(lk.vcenter(wk.inset_frame(lk.margin(lk.natural_span(vsb, 200, 100), 5)), 1.0),
303  lk.hspace(4),
304  wk.vscroll_bar(vsb)));
305  // body(wk.inset_frame(lk.margin(vsb, 5)));
306 }
307 
309  delete[] tts_;
310 }
312  if (type >= MSBEGIN && type < n_memb_func && tts_[type]->test(TelltaleState::is_chosen)) {
313  return true;
314  }
315  return false;
316 }
317 
318 int MechSelector::begin() {
319  iterator_ = MSBEGIN - 1;
320  return next();
321 }
322 bool MechSelector::done() {
323  if (iterator_ >= n_memb_func) {
324  return true;
325  } else {
326  return false;
327  }
328 }
329 int MechSelector::next() {
330  while (!done()) {
331  ++iterator_;
332  if (is_selected(iterator_)) {
333  return iterator_;
334  }
335  }
336  return 0;
337 }
338 
339 //---------------------------------------------------------------------
340 class SectionBrowserImpl {
341  friend class SectionBrowser;
342  SectionBrowserImpl();
343  ~SectionBrowserImpl();
344  MechSelector* ms_;
345  MechVarType* mvt_;
346  Section** psec_;
347  int scnt_;
348  void make_panel(Section*);
349 };
350 /* static */ class BrowserAccept: public Action {
351  public:
352  BrowserAccept(SectionBrowser*);
353  virtual ~BrowserAccept();
354  virtual void execute();
355 
356  private:
357  SectionBrowser* sb_;
358 };
359 BrowserAccept::BrowserAccept(SectionBrowser* sb) {
360  sb_ = sb;
361 }
362 BrowserAccept::~BrowserAccept() {}
363 void BrowserAccept::execute() {
364  sb_->accept();
365 }
366 
367 SectionBrowserImpl::SectionBrowserImpl() {
368  struct hoc_Item* qsec;
369  scnt_ = 0;
370  // ForAllSections(sec) //{
371  ITERATE(qsec, section_list) {
372  Section* sec = hocSEC(qsec);
373  ++scnt_;
374  }
375  psec_ = new Section*[scnt_];
376  scnt_ = 0;
377  // ForAllSections(sec) //{
378  ITERATE(qsec, section_list) {
379  Section* sec = hocSEC(qsec);
380  psec_[scnt_++] = sec;
381  section_ref(sec);
382  }
383  ms_ = new MechSelector();
384  ms_->ref();
385  mvt_ = new MechVarType();
386  mvt_->ref();
387 }
388 SectionBrowserImpl::~SectionBrowserImpl() {
389  for (int i = 0; i < scnt_; ++i) {
390  section_unref(psec_[i]);
391  }
392  delete[] psec_;
393  ms_->unref();
394  mvt_->unref();
395 }
396 
398  : OcBrowser(new BrowserAccept(this), NULL) {
399  LayoutKit& lk = *LayoutKit::instance();
400  WidgetKit& wk = *WidgetKit::instance();
401  sbi_ = new SectionBrowserImpl;
402  for (int i = 0; i < sbi_->scnt_; ++i) {
403  append_item(secname(sbi_->psec_[i]));
404  }
405 }
406 
408  : OcBrowser(NULL, NULL) {}
409 
411  delete sbi_;
412 }
413 
414 void SectionBrowser::accept() {
415  printf("accepted %d\n", int(selected()));
416  Section* sec = sbi_->psec_[int(selected())];
417  if (sec->prop) {
418  nrn_pushsec(sec);
419  if (sbi_->mvt_->parameter_select()) {
420  section_menu(-1, nrnocCONST, sbi_->ms_);
421  }
422  if (sbi_->mvt_->state_select()) {
423  section_menu(.5, STATE, sbi_->ms_);
424  }
425  if (sbi_->mvt_->assigned_select()) {
426  section_menu(.5, 2, sbi_->ms_);
427  }
428  nrn_popsec();
429  } else {
430  printf("This section was deleted\n");
431  }
432 }
433 
435  if (sbi_->psec_[int(i)]->prop) {
436  FileBrowser::select(i);
437  } else {
438  FileBrowser::select(-1);
439  }
440  // printf("selected\n");
441 }
442 
444  LayoutKit& lk = *LayoutKit::instance();
445  WidgetKit& wk = *WidgetKit::instance();
446  SectionBrowser* sb = new SectionBrowser();
447  Window* w = new StandardWindow(lk.hbox(sb->standard_glyph(),
448  lk.hspace(5),
449  lk.vbox(sb->sbi_->mvt_, lk.vspace(5), sb->sbi_->ms_)));
450  w->map();
451 }
452 
453 //---------------------------------------------------
454 /* static */ class PBrowserAccept: public Action {
455  public:
456  PBrowserAccept(PointProcessBrowser*);
457  virtual ~PBrowserAccept();
458  virtual void execute();
459 
460  private:
462 };
463 PBrowserAccept::PBrowserAccept(PointProcessBrowser* b) {
464  b_ = b;
465 }
466 PBrowserAccept::~PBrowserAccept() {}
468  b_->accept();
469 }
470 
471 /* static */ class PPBImpl {
472  friend class PointProcessBrowser;
473  PPBImpl(OcList*);
474  virtual ~PPBImpl();
475  OcList* ocl_;
476 };
477 
478 PPBImpl::PPBImpl(OcList* ocl) {
479  ocl_ = ocl;
480  Resource::ref(ocl_);
481 }
482 PPBImpl::~PPBImpl() {
483  Resource::unref(ocl_);
484 }
485 
487  : OcBrowser(new PBrowserAccept(this), NULL) {
488  ppbi_ = new PPBImpl(ocl);
489  long i, cnt = ocl->count();
490  for (i = 0; i < cnt; ++i) {
491  append_pp(ocl->object(i));
492  }
493 }
494 
496  delete ppbi_;
497 }
498 
500  LayoutKit& lk = *LayoutKit::instance();
501  WidgetKit& wk = *WidgetKit::instance();
503  SectionBrowser* sb = new SectionBrowser();
504  Window* w = new StandardWindow(
505  lk.hbox(sb->standard_glyph(), lk.hspace(5), ppb->standard_glyph()));
506  w->map();
507 }
508 
511 }
512 
514  GlyphIndex i = selected();
515  if (i >= 0) {
516  remove_selectable(i);
517  ppbi_->ocl_->remove(i);
518  refresh();
519  }
520 }
521 
523  ppbi_->ocl_->append(ob);
524  append_pp(ob);
525  select(ppbi_->ocl_->count() - 1);
526  refresh();
527 }
528 
530  FileBrowser::select(i);
531  Object* ob = ppbi_->ocl_->object(i);
532  printf("selected %s\n", hoc_object_name(ob));
533 }
534 
536  printf("PointProcessBrowser::accept\n");
537 }
538 #endif
#define Window
Definition: _defines.h:333
#define TelltaleState
Definition: _defines.h:296
#define ScrollBox
Definition: _defines.h:253
#define WidgetKit
Definition: _defines.h:331
#define MonoGlyph
Definition: _defines.h:181
#define GlyphIndex
Definition: _defines.h:23
#define Button
Definition: _defines.h:62
#define PolyGlyph
Definition: _defines.h:207
#define LayoutKit
Definition: _defines.h:161
#define Action
Definition: _defines.h:27
const char * secname(Section *sec)
Definition: cabcode.cpp:1776
void nrn_pushsec(Section *sec)
Definition: cabcode.cpp:99
Section * chk_access(void)
Definition: cabcode.cpp:444
void nrn_popsec(void)
Definition: cabcode.cpp:123
Memb_func * memb_func
Definition: init.cpp:123
short type
Definition: cabvars.h:9
int execute(bool notify=true)
Definition: objcmd.cpp:102
int iterator_
Definition: secbrows.h:45
bool is_selected(int type)
virtual ~MechSelector()
TelltaleState ** tts_
Definition: secbrows.h:44
bool parameter_select()
bool state_select()
virtual ~MechVarType()
bool select(int)
bool assigned_select()
TelltaleState * tts_[3]
Definition: secbrows.h:30
virtual Glyph * standard_glyph()
virtual void append_item(const char *)
virtual void select_and_adjust(GlyphIndex)
Definition: oclist.h:12
long count()
Definition: oclist.cpp:187
Object * object(long)
Definition: oclist.cpp:231
virtual void set_select_action(const char *, Object *)
virtual void select(GlyphIndex)
virtual void set_accept_action(const char *, Object *)
virtual void select_section(Section *)
Section ** psec_
Definition: secbrows.h:59
virtual ~OcSectionBrowser()
HocCommand * accept_
Definition: secbrows.h:62
Object * accept_pycallback_
Definition: secbrows.h:66
Object * select_pycallback_
Definition: secbrows.h:64
HocCommand * select_
Definition: secbrows.h:61
virtual void accept()
bool select_is_pycallback_
Definition: secbrows.h:63
OcSectionBrowser(Object *)
bool accept_is_pycallback_
Definition: secbrows.h:65
virtual ~PointProcessBrowser()
virtual void add_pp(Object *)
PPBImpl * ppbi_
Definition: secbrows.h:95
PointProcessBrowser(OcList *)
virtual void append_pp(Object *)
virtual void select(GlyphIndex)
static void make_point_process_browser(OcList *)
virtual void remove_pp()
virtual void ref() const
Definition: resource.cpp:47
virtual void unref() const
Definition: resource.cpp:52
static void make_section_browser()
virtual void select(GlyphIndex)
virtual ~SectionBrowser()
SectionBrowserImpl * sbi_
Definition: secbrows.h:79
void execute(Inst *p)
Definition: code.cpp:2661
int hoc_is_object_arg(int narg)
Definition: code.cpp:756
char * hoc_object_name(Object *ob)
Definition: hoc_oop.cpp:72
#define TRY_GUI_REDIRECT_ACTUAL_DOUBLE(name, obj)
Definition: gui-redirect.h:71
#define TRY_GUI_REDIRECT_NO_RETURN(name, obj)
Definition: gui-redirect.h:47
#define TRY_GUI_REDIRECT_OBJ(name, obj)
Definition: gui-redirect.h:12
#define IFGUI
Definition: hocdec.h:372
#define gargstr
Definition: hocdec.h:14
#define ENDGUI
Definition: hocdec.h:373
#define hocSEC(q)
Definition: hoclist.h:66
Object ** hoc_objgetarg(int)
Definition: code.cpp:1587
void
int ifarg(int)
Definition: code.cpp:1581
#define v
Definition: md1redef.h:4
#define sec
Definition: md1redef.h:13
#define i
Definition: md1redef.h:12
#define prop
Definition: md1redef.h:29
#define nrnocCONST
Definition: membfunc.h:69
#define STATE
Definition: membfunc.h:71
#define ITERATE(itm, lst)
Definition: model.h:25
char * name
Definition: init.cpp:16
#define printf
Definition: mwprefix.h:26
void section_ref(Section *)
Definition: solve.cpp:575
void section_unref(Section *)
Definition: solve.cpp:565
hoc_List * section_list
Definition: init.cpp:102
void class2oc(const char *, void *(*cons)(Object *), void(*destruct)(void *), Member_func *, int(*checkpoint)(void **), Member_ret_obj_func *, Member_ret_str_func *)
Definition: hoc_oop.cpp:1560
int n_memb_func
Definition: init.cpp:440
static realtype b_
static void * sb_cons(Object *)
Definition: secbrows.cpp:77
double(* nrnpy_object_to_double_)(Object *)
Definition: xmenu.cpp:14
static void sb_destruct(void *v)
Definition: secbrows.cpp:98
void SectionBrowser_reg()
Definition: secbrows.cpp:104
static Member_func sb_members[]
Definition: secbrows.cpp:69
static double sb_accept_action(void *v)
Definition: secbrows.cpp:52
static double sb_select_action(void *v)
Definition: secbrows.cpp:35
void(* nrnpy_call_python_with_section)(Object *, Section *)
Definition: secbrows.cpp:20
static double sb_select(void *v)
Definition: secbrows.cpp:25
void section_menu(double, int, MechSelector *=NULL)
sl
Definition: seclist.cpp:181
#define cnt
Definition: spt2queue.cpp:19
#define NULL
Definition: sptree.h:16
Definition: hocdec.h:227
char * name
Definition: model.h:72
struct Symbol * sym
Definition: hoclist.h:45