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 "nrnpy.h"
20 #include "membfunc.h"
21 
22 //-----------------------------------------
23 static double sb_select(void* v) {
24  TRY_GUI_REDIRECT_ACTUAL_DOUBLE("SectionBrowser.select", v);
25 #if HAVE_IV
26  if (hoc_usegui) {
27  Section* sec = chk_access();
28  ((OcSectionBrowser*) v)->select_section(sec);
29  }
30 #endif
31  return 1.;
32 }
33 static double sb_select_action(void* v) {
34  TRY_GUI_REDIRECT_ACTUAL_DOUBLE("SectionBrowser.select_action", v);
35 #if HAVE_IV
36  if (hoc_usegui) {
37  char* str_action = NULL;
38  Object* obj_action = NULL;
39  if (hoc_is_object_arg(1)) {
40  obj_action = *hoc_objgetarg(1);
41  } else {
42  str_action = gargstr(1);
43  }
44 
45  ((OcSectionBrowser*) v)->set_select_action(str_action, obj_action);
46  }
47 #endif
48  return 1.;
49 }
50 static double sb_accept_action(void* v) {
51  TRY_GUI_REDIRECT_ACTUAL_DOUBLE("SectionBrowser.accept_action", v);
52 #if HAVE_IV
53  if (hoc_usegui) {
54  char* str_action = NULL;
55  Object* obj_action = NULL;
56  if (hoc_is_object_arg(1)) {
57  obj_action = *hoc_objgetarg(1);
58  } else {
59  str_action = gargstr(1);
60  }
61 
62  ((OcSectionBrowser*) v)->set_accept_action(str_action, obj_action);
63  }
64 #endif
65  return 1.;
66 }
67 static Member_func sb_members[] = {{"select", sb_select},
68  {"select_action", sb_select_action},
69  {"accept_action", sb_accept_action},
70  {nullptr, nullptr}};
71 static void* sb_cons(Object*) {
72  TRY_GUI_REDIRECT_OBJ("SectionBrowser", NULL);
73  Object* ob;
74 #if HAVE_IV
76  if (hoc_usegui) {
77  if (ifarg(1)) {
78  ob = *hoc_objgetarg(1);
79  b = new OcSectionBrowser(ob);
80  } else {
81  b = new OcSectionBrowser(NULL);
82  }
83  b->ref();
84  Window* w = new StandardWindow(b->standard_glyph());
85  w->map();
86  }
87  return (void*) b;
88 #else
89  return 0;
90 #endif
91 }
92 static void sb_destruct(void* v) {
93  TRY_GUI_REDIRECT_NO_RETURN("~SectionBrowser", v);
94 #if HAVE_IV
96 #endif
97 }
99  class2oc("SectionBrowser", sb_cons, sb_destruct, sb_members, nullptr, nullptr);
100 }
101 
102 #if HAVE_IV
103 
105  : OcBrowser() {
106  long i;
107  select_is_pycallback_ = false;
108  accept_is_pycallback_ = false;
109  if (ob) {
110  SectionList sl(ob);
111  Section* sec;
112  scnt_ = 0;
113  for (sec = sl.begin(); sec; sec = sl.next()) {
114  ++scnt_;
115  }
116  if (scnt_) {
117  psec_ = new Section*[scnt_];
118  }
119  scnt_ = 0;
120  for (sec = sl.begin(); sec; sec = sl.next()) {
121  psec_[scnt_++] = sec;
122  }
123  } else {
124  scnt_ = 0;
125  for (const Section* sec: range_sec(section_list)) {
126  ++scnt_;
127  }
128  psec_ = new Section*[scnt_];
129  scnt_ = 0;
130  for (Section* sec: range_sec(section_list)) {
131  psec_[scnt_++] = sec;
132  }
133  }
134  for (i = 0; i < scnt_; ++i) {
135  append_item(secname(psec_[i]));
136  section_ref(psec_[i]);
137  }
138  select_ = NULL;
139  accept_ = NULL;
140 }
141 
143  long i;
144  for (i = 0; i < scnt_; ++i) {
146  }
147  delete[] psec_;
148  if (select_) {
149  delete select_;
150  }
151  if (accept_) {
152  delete accept_;
153  }
154 }
155 
157  if (accept_) {
158  long i = selected();
159  if (i < 0) {
160  return;
161  }
162  nrn_pushsec(psec_[i]);
163  if (accept_is_pycallback_) {
166  } else {
167  // should not be able to get here
168  }
169  } else {
170  accept_->execute();
171  }
172  nrn_popsec();
173  }
174 }
176  long i;
177  if (sec->prop)
178  for (i = 0; i < scnt_; ++i) {
179  if (psec_[i] == sec) {
181  return;
182  }
183  }
184  OcBrowser::select(-1);
185 }
186 void OcSectionBrowser::set_select_action(const char* s, Object* pyact) {
187  if (select_) {
188  delete select_;
189  }
190  if (pyact) {
191  select_is_pycallback_ = true;
192  select_pycallback_ = pyact;
193  // note: we won't actually invoke this but necessary to avoid segfault
194  select_ = new HocCommand(pyact);
195  } else {
196  select_is_pycallback_ = false;
197  select_ = new HocCommand(s);
198  }
199 }
200 void OcSectionBrowser::set_accept_action(const char* s, Object* pyact) {
201  if (accept_) {
202  delete accept_;
203  }
204  if (pyact) {
205  accept_is_pycallback_ = true;
206  accept_pycallback_ = pyact;
207  // note: we won't actually invoke this but necessary to avoid segfault
208  accept_ = new HocCommand(pyact);
209  } else {
210  accept_is_pycallback_ = false;
211  accept_ = new HocCommand(s);
212  }
213 }
215  GlyphIndex old = selected();
216  OcBrowser::select(i);
217  if (i >= 0 && old != i && select_) {
218  if (psec_[i]->prop) {
219  nrn_pushsec(psec_[i]);
220  if (select_is_pycallback_) {
223  } else {
224  // should not be able to get here
225  }
226  } else {
227  select_->execute();
228  }
229  nrn_popsec();
230  } else {
231  state(i)->set(TelltaleState::is_enabled, false);
232  OcBrowser::select(old);
233  }
234  }
235 }
236 //-----------------------------------------
238  : MonoGlyph(NULL) {
239  int i;
240  LayoutKit& lk = *LayoutKit::instance();
241  WidgetKit& wk = *WidgetKit::instance();
242  Button* b[3];
243  b[0] = wk.palette_button("Parameters", NULL);
244  b[1] = wk.palette_button("States", NULL);
245  b[2] = wk.palette_button("Assigned", NULL);
246  PolyGlyph* vb = lk.vbox(b[0], b[1], b[2]);
247  for (i = 0; i < 3; ++i) {
248  tts_[i] = b[i]->state();
249  Resource::ref(tts_[i]);
250  }
251  tts_[0]->set(TelltaleState::is_chosen, true);
252  body(wk.inset_frame(lk.margin(vb, 5)));
253 }
254 
256  int i;
257  for (i = 0; i < 3; ++i) {
259  }
260 }
261 
263  return select(0);
264 }
266  return select(1);
267 }
269  return select(2);
270 }
271 bool MechVarType::select(int i) {
272  return tts_[i]->test(TelltaleState::is_chosen);
273 }
274 
275 //---------------------------------------------------------------------
276 
277 #define MSBEGIN 2
279  : MonoGlyph(NULL) {
280  int i;
281  LayoutKit& lk = *LayoutKit::instance();
282  WidgetKit& wk = *WidgetKit::instance();
283  ScrollBox* vsb = lk.vscrollbox(5);
284  Button* b;
285  tts_ = new TelltaleState*[n_memb_func];
286  for (i = MSBEGIN; i < n_memb_func; ++i) {
287  b = wk.palette_button(memb_func[i].sym->name, NULL);
288  b->state()->set(TelltaleState::is_chosen, true);
289  vsb->append(b);
290  tts_[i] = b->state();
291  }
292  body(lk.hbox(lk.vcenter(wk.inset_frame(lk.margin(lk.natural_span(vsb, 200, 100), 5)), 1.0),
293  lk.hspace(4),
294  wk.vscroll_bar(vsb)));
295  // body(wk.inset_frame(lk.margin(vsb, 5)));
296 }
297 
299  delete[] tts_;
300 }
302  if (type >= MSBEGIN && type < n_memb_func && tts_[type]->test(TelltaleState::is_chosen)) {
303  return true;
304  }
305  return false;
306 }
307 
308 int MechSelector::begin() {
309  iterator_ = MSBEGIN - 1;
310  return next();
311 }
312 bool MechSelector::done() {
313  if (iterator_ >= n_memb_func) {
314  return true;
315  } else {
316  return false;
317  }
318 }
319 int MechSelector::next() {
320  while (!done()) {
321  ++iterator_;
322  if (is_selected(iterator_)) {
323  return iterator_;
324  }
325  }
326  return 0;
327 }
328 
329 //---------------------------------------------------------------------
330 class SectionBrowserImpl {
331  friend class SectionBrowser;
332  SectionBrowserImpl();
333  ~SectionBrowserImpl();
334  MechSelector* ms_;
335  MechVarType* mvt_;
336  Section** psec_;
337  int scnt_;
338  void make_panel(Section*);
339 };
340 /* static */ class BrowserAccept: public Action {
341  public:
342  BrowserAccept(SectionBrowser*);
343  virtual ~BrowserAccept();
344  virtual void execute();
345 
346  private:
347  SectionBrowser* sb_;
348 };
349 BrowserAccept::BrowserAccept(SectionBrowser* sb) {
350  sb_ = sb;
351 }
352 BrowserAccept::~BrowserAccept() {}
353 void BrowserAccept::execute() {
354  sb_->accept();
355 }
356 
357 SectionBrowserImpl::SectionBrowserImpl() {
358  scnt_ = 0;
359  for (const Section* sec: range_sec(section_list)) {
360  ++scnt_;
361  }
362  psec_ = new Section*[scnt_];
363  scnt_ = 0;
364  for (Section* sec: range_sec(section_list)) {
365  psec_[scnt_++] = sec;
366  section_ref(sec);
367  }
368  ms_ = new MechSelector();
369  ms_->ref();
370  mvt_ = new MechVarType();
371  mvt_->ref();
372 }
373 SectionBrowserImpl::~SectionBrowserImpl() {
374  for (int i = 0; i < scnt_; ++i) {
375  section_unref(psec_[i]);
376  }
377  delete[] psec_;
378  ms_->unref();
379  mvt_->unref();
380 }
381 
383  : OcBrowser(new BrowserAccept(this), NULL) {
384  LayoutKit& lk = *LayoutKit::instance();
385  WidgetKit& wk = *WidgetKit::instance();
386  sbi_ = new SectionBrowserImpl;
387  for (int i = 0; i < sbi_->scnt_; ++i) {
388  append_item(secname(sbi_->psec_[i]));
389  }
390 }
391 
393  : OcBrowser(NULL, NULL) {}
394 
396  delete sbi_;
397 }
398 
399 void SectionBrowser::accept() {
400  printf("accepted %d\n", int(selected()));
401  Section* sec = sbi_->psec_[int(selected())];
402  if (sec->prop) {
403  nrn_pushsec(sec);
404  if (sbi_->mvt_->parameter_select()) {
405  section_menu(-1, nrnocCONST, sbi_->ms_);
406  }
407  if (sbi_->mvt_->state_select()) {
408  section_menu(.5, STATE, sbi_->ms_);
409  }
410  if (sbi_->mvt_->assigned_select()) {
411  section_menu(.5, 2, sbi_->ms_);
412  }
413  nrn_popsec();
414  } else {
415  printf("This section was deleted\n");
416  }
417 }
418 
420  if (sbi_->psec_[int(i)]->prop) {
421  FileBrowser::select(i);
422  } else {
423  FileBrowser::select(-1);
424  }
425  // printf("selected\n");
426 }
427 
429  LayoutKit& lk = *LayoutKit::instance();
430  WidgetKit& wk = *WidgetKit::instance();
431  SectionBrowser* sb = new SectionBrowser();
432  Window* w = new StandardWindow(lk.hbox(sb->standard_glyph(),
433  lk.hspace(5),
434  lk.vbox(sb->sbi_->mvt_, lk.vspace(5), sb->sbi_->ms_)));
435  w->map();
436 }
437 
438 //---------------------------------------------------
439 /* static */ class PBrowserAccept: public Action {
440  public:
441  PBrowserAccept(PointProcessBrowser*);
442  virtual ~PBrowserAccept();
443  virtual void execute();
444 
445  private:
447 };
448 PBrowserAccept::PBrowserAccept(PointProcessBrowser* b) {
449  b_ = b;
450 }
451 PBrowserAccept::~PBrowserAccept() {}
452 void PBrowserAccept::execute() {
453  b_->accept();
454 }
455 
456 /* static */ class PPBImpl {
457  friend class PointProcessBrowser;
458  PPBImpl(OcList*);
459  virtual ~PPBImpl();
460  OcList* ocl_;
461 };
462 
463 PPBImpl::PPBImpl(OcList* ocl) {
464  ocl_ = ocl;
465  Resource::ref(ocl_);
466 }
467 PPBImpl::~PPBImpl() {
468  Resource::unref(ocl_);
469 }
470 
472  : OcBrowser(new PBrowserAccept(this), NULL) {
473  ppbi_ = new PPBImpl(ocl);
474  long i, cnt = ocl->count();
475  for (i = 0; i < cnt; ++i) {
476  append_pp(ocl->object(i));
477  }
478 }
479 
481  delete ppbi_;
482 }
483 
485  LayoutKit& lk = *LayoutKit::instance();
486  WidgetKit& wk = *WidgetKit::instance();
488  SectionBrowser* sb = new SectionBrowser();
489  Window* w = new StandardWindow(
490  lk.hbox(sb->standard_glyph(), lk.hspace(5), ppb->standard_glyph()));
491  w->map();
492 }
493 
496 }
497 
499  GlyphIndex i = selected();
500  if (i >= 0) {
501  remove_selectable(i);
502  ppbi_->ocl_->remove(i);
503  refresh();
504  }
505 }
506 
508  ppbi_->ocl_->append(ob);
509  append_pp(ob);
510  select(ppbi_->ocl_->count() - 1);
511  refresh();
512 }
513 
515  FileBrowser::select(i);
516  Object* ob = ppbi_->ocl_->object(i);
517  printf("selected %s\n", hoc_object_name(ob));
518 }
519 
521  printf("PointProcessBrowser::accept\n");
522 }
523 #endif
#define Window
Definition: _defines.h:330
#define TelltaleState
Definition: _defines.h:293
#define ScrollBox
Definition: _defines.h:250
#define WidgetKit
Definition: _defines.h:328
#define MonoGlyph
Definition: _defines.h:179
#define GlyphIndex
Definition: _defines.h:21
#define Button
Definition: _defines.h:60
#define PolyGlyph
Definition: _defines.h:205
#define LayoutKit
Definition: _defines.h:159
#define Action
Definition: _defines.h:25
Section * chk_access()
Definition: cabcode.cpp:449
const char * secname(Section *sec)
name of section (for use in error messages)
Definition: cabcode.cpp:1674
void nrn_pushsec(Section *sec)
Definition: cabcode.cpp:130
void nrn_popsec(void)
Definition: cabcode.cpp:154
int execute(bool notify=true)
Definition: objcmd.cpp:94
int iterator_
Definition: secbrows.h:44
bool is_selected(int type)
virtual ~MechSelector()
TelltaleState ** tts_
Definition: secbrows.h:43
bool parameter_select()
bool state_select()
virtual ~MechVarType()
bool select(int)
bool assigned_select()
TelltaleState * tts_[3]
Definition: secbrows.h:29
virtual Glyph * standard_glyph()
virtual void append_item(const char *)
virtual void select_and_adjust(GlyphIndex)
Definition: oclist.h:11
long count()
Definition: oclist.cpp:175
Object * object(long)
Definition: oclist.cpp:219
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:58
virtual ~OcSectionBrowser()
HocCommand * accept_
Definition: secbrows.h:61
Object * accept_pycallback_
Definition: secbrows.h:65
Object * select_pycallback_
Definition: secbrows.h:63
HocCommand * select_
Definition: secbrows.h:60
virtual void accept()
bool select_is_pycallback_
Definition: secbrows.h:62
OcSectionBrowser(Object *)
bool accept_is_pycallback_
Definition: secbrows.h:64
virtual ~PointProcessBrowser()
virtual void add_pp(Object *)
PPBImpl * ppbi_
Definition: secbrows.h:94
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:42
virtual void unref() const
Definition: resource.cpp:47
static void make_section_browser()
virtual void select(GlyphIndex)
virtual ~SectionBrowser()
SectionBrowserImpl * sbi_
Definition: secbrows.h:78
void class2oc(const char *, ctor_f *cons, dtor_f *destruct, Member_func *, Member_ret_obj_func *, Member_ret_str_func *)
Definition: hoc_oop.cpp:1631
char * gargstr(int narg)
Definition: code2.cpp:227
#define cnt
Definition: tqueue.hpp:44
#define v
Definition: md1redef.h:11
#define sec
Definition: md1redef.h:20
#define i
Definition: md1redef.h:19
#define prop
Definition: md1redef.h:38
#define b_(arg)
Definition: crout.hpp:137
int hoc_is_object_arg(int narg)
Definition: code.cpp:876
char * hoc_object_name(Object *ob)
Definition: hoc_oop.cpp:73
#define TRY_GUI_REDIRECT_ACTUAL_DOUBLE(name, obj)
Definition: gui-redirect.h:55
#define TRY_GUI_REDIRECT_NO_RETURN(name, obj)
Definition: gui-redirect.h:40
#define TRY_GUI_REDIRECT_OBJ(name, obj)
Definition: gui-redirect.h:10
int hoc_usegui
Definition: hoc.cpp:121
constexpr auto range_sec(hoc_List *iterable)
Definition: hoclist.h:50
Object ** hoc_objgetarg(int)
Definition: code.cpp:1614
#define nrnocCONST
Definition: membfunc.hpp:63
#define STATE
Definition: membfunc.hpp:65
printf
Definition: extdef.h:5
impl_ptrs methods
Collection of pointers to functions with python-version-specific implementations.
Definition: nrnpy.cpp:21
void section_ref(Section *)
Definition: solve.cpp:520
void section_unref(Section *)
Definition: solve.cpp:509
s
Definition: multisend.cpp:521
int ifarg(int)
Definition: code.cpp:1607
std::vector< Memb_func > memb_func
Definition: init.cpp:145
short type
Definition: cabvars.h:10
hoc_List * section_list
Definition: init.cpp:113
int n_memb_func
Definition: init.cpp:448
static void call_python_with_section(Object *pyact, Section *sec)
Definition: nrnpy_p2h.cpp:36
static void * sb_cons(Object *)
Definition: secbrows.cpp:71
static void sb_destruct(void *v)
Definition: secbrows.cpp:92
void SectionBrowser_reg()
Definition: secbrows.cpp:98
static Member_func sb_members[]
Definition: secbrows.cpp:67
static double sb_accept_action(void *v)
Definition: secbrows.cpp:50
static double sb_select_action(void *v)
Definition: secbrows.cpp:33
static double sb_select(void *v)
Definition: secbrows.cpp:23
void section_menu(double, int, MechSelector *=NULL)
#define NULL
Definition: spdefs.h:105
Definition: hocdec.h:173
void(* call_python_with_section)(Object *, Section *)
Definition: nrnpy.h:29