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