NEURON
scenepic.cpp
Go to the documentation of this file.
1 #include <../../nrnconf.h>
2 #if HAVE_IV // to end of file
3 
4 #include <IV-look/kit.h>
5 #include <InterViews/layout.h>
6 #include <InterViews/telltale.h>
7 #include <InterViews/window.h>
8 #include <OS/list.h>
9 #include <OS/string.h>
10 #include <stdio.h>
11 #include "ivoc.h"
12 #include "mymath.h"
13 #include "scenevie.h"
14 #include "scenepic.h"
15 #include "rubband.h"
16 #include "apwindow.h"
17 #include "utility.h"
18 #include "oc2iv.h"
19 #include "utils/enumerate.h"
20 
21 #define Scene_SceneMover_ "Translate Scene"
22 #define Scene_SceneZoom_ "ZoomInOut Scene"
23 #define Scene_RoundView_ "RoundView Scene"
24 #define Scene_WholeSceneView_ "WholeScene Scene"
25 #define Scene_WholePlotView_ "View_equal_Plot Scene"
26 #define Scene_ZoomOut10_ "ZoomOut10 Scene"
27 #define Scene_ZoomeIn10_ "ZoomIn10 Scene"
28 #define Scene_SpecView_ "SetView Scene"
29 #define Scene_SizeScene_ "Scene_equal_View Scene"
30 #define Scene_NewView_ "NewView Scene"
31 #define Scene_ShowMenu_ "Scene"
32 #define Scene_ObjectName_ "ObjectName"
33 
34 MenuItem* K::menu_item(const char* name) {
35  Glyph* g =
36  LayoutKit::instance()->r_margin(WidgetKit::instance()->fancy_label(name), 0.0, fil, 0.0);
37  return WidgetKit::instance()->menu_item(g);
38 }
39 
40 MenuItem* K::check_menu_item(const char* name) {
41  Glyph* g =
42  LayoutKit::instance()->r_margin(WidgetKit::instance()->fancy_label(name), 0.0, fil, 0.0);
43  return WidgetKit::instance()->check_menu_item(g);
44 }
45 
46 MenuItem* K::radio_menu_item(TelltaleGroup* tg, const char* name) {
47  Glyph* g =
48  LayoutKit::instance()->r_margin(WidgetKit::instance()->fancy_label(name), 0.0, fil, 0.0);
49  return WidgetKit::instance()->radio_menu_item(tg, g);
50 }
51 
52 /*static*/ class ButtonItemInfo {
53  public:
54  ButtonItemInfo(const char* name, Action*, TelltaleState*, MenuItem* mi = NULL, Menu* m = NULL);
55  virtual ~ButtonItemInfo();
56  GlyphIndex menu_index();
57  TelltaleState* s_;
58  CopyString name_;
59  Action* a_;
60  Menu* parent_;
61  MenuItem* mi_;
62 };
63 ButtonItemInfo::ButtonItemInfo(const char* name,
64  Action* a,
66  MenuItem* mi,
67  Menu* parent) {
68  name_ = name;
69  s_ = s;
70  a_ = a;
71  parent_ = parent;
72  mi_ = mi;
73 }
74 ButtonItemInfo::~ButtonItemInfo() {}
75 
76 GlyphIndex ButtonItemInfo::menu_index() {
77  GlyphIndex i, cnt;
78  if (parent_ && mi_) {
79  cnt = parent_->item_count();
80  for (i = 0; i < cnt; ++i) {
81  if (parent_->item(i) == mi_) {
82  return i;
83  }
84  }
85  }
86  return -1;
87 }
88 
89 /*static*/ class SceneMover: public OcHandler {
90  public:
91  SceneMover();
92  virtual ~SceneMover();
93  virtual bool event(Event&);
94  virtual void help();
95 
96  private:
97  Coord x_, y_;
98  XYView* view_;
99 };
100 
101 /*static*/ class SceneZoom: public OcHandler {
102  public:
103  SceneZoom();
104  virtual ~SceneZoom();
105  virtual bool event(Event&);
106  virtual void help();
107 
108  private:
109  Coord x_, y_, xorg_, yorg_;
110  XYView* view_;
111 };
112 
113 /*static*/ class NewView: public RubberAction {
114  public:
115  NewView();
116  virtual ~NewView();
117  virtual void execute(Rubberband*);
118  virtual void help();
119 };
120 
121 /*static*/ class RoundView: public Action { virtual void execute(); };
122 
123 /*static*/ class WholeSceneView: public Action { virtual void execute(); };
124 
125 /*static*/ class WholePlotView: public Action { virtual void execute(); };
126 
127 /*static*/ class SpecView: public Action { virtual void execute(); };
128 
129 /*static*/ class SizeScene: public Action { virtual void execute(); };
130 
131 /*static*/ class ZoomOut10: public Action { virtual void execute(); };
132 
133 /*static*/ class ZoomIn10: public Action { virtual void execute(); };
134 
135 /*static*/ class SPObjectName: public Action { virtual void execute(); };
136 
137 /*static*/ class ShowMenu: public Action {
138  public:
139  ShowMenu(Menu*);
140  virtual ~ShowMenu();
141  virtual void execute();
142 
143  private:
144  Menu* m_;
145 };
146 
148  if (!picker_) {
149  WidgetKit& k = *WidgetKit::instance();
150  picker_ = new ScenePicker(this);
151 
152  SceneZoom* z = new SceneZoom();
153  SceneMover* m = new SceneMover();
154 
155  Menu* men = k.pulldown();
156  MenuItem* mi = K::menu_item("View . . .");
157  mi->menu(men);
158  picker_->add_menu(mi);
159 
160  picker_->add_menu("View = plot", new WholePlotView(), men);
161  picker_->add_menu("Set View", new SpecView(), men);
162  picker_->add_menu("10% Zoom out", new ZoomOut10(), men);
163  picker_->add_menu("10% Zoom in", new ZoomIn10(), men);
164  picker_->add_radio_menu("NewView", new RubberRect(new NewView()), 0, 0, men);
165  picker_->add_radio_menu("Zoom in/out", z, 0, men);
166  picker_->add_radio_menu("Translate", m, 0, men);
167  picker_->add_menu("Round View", new RoundView(), men);
168  picker_->add_menu("Whole Scene", new WholeSceneView(), men);
169  picker_->add_menu("Scene=View", new SizeScene(), men);
170  picker_->add_menu("Object Name", new SPObjectName(), men);
171  // picker_->add_menu("Show Menu", new ShowMenu(men), men);
172  // picker_->add_menu(k.menu_item("Undo"));
173  // picker_->add_menu(k.menu_item("Redo"));
174  picker_->add_menu(k.menu_item_separator());
175  picker_->bind_select(z);
176  picker_->bind_adjust(m);
177  }
178  return picker_;
179 }
180 
181 /*static*/ class ScenePickerImpl: public OcHandler {
182  public:
183  ScenePickerImpl(Scene*);
184  virtual ~ScenePickerImpl();
185  virtual bool event(Event&);
186  long info_index(const char*);
187 
188  public:
189  friend class ScenePicker;
190  PopupMenu* menu_;
191  Scene* scene_;
192  TelltaleGroup* tg_;
193  CopyString sel_name_;
194  std::vector<ButtonItemInfo*>* bil_;
195  static DismissableWindow* window_;
196 };
197 
198 void ScenePicker::pick_menu(Glyph* glyph, int depth, Hit& h) {
199  h.target(depth, glyph, 0, spi_);
200 }
201 
202 DismissableWindow* ScenePickerImpl::window_;
203 
204 /*static*/ class RadioSelect: public Action {
205  public:
206  RadioSelect(const char*, Action*, Scene*);
207  virtual ~RadioSelect();
208  virtual void execute();
209 
210  private:
211  Action* a_;
212  CopyString name_;
213  Scene* s_;
214 };
215 
216 /*static*/ class RubberTool: public Action {
217  public:
218  RubberTool(Action* sel, Rubberband*, ScenePicker*, int);
219  virtual ~RubberTool();
220  virtual void execute();
221 
222  private:
223  Action* sel_;
224  Rubberband* rb_;
225  ScenePicker* sp_;
226  int tool_;
227 };
228 
229 /*static*/ class HandlerTool: public Action {
230  public:
231  HandlerTool(OcHandler*, ScenePicker*, int);
232  virtual ~HandlerTool();
233  virtual void execute();
234 
235  private:
236  OcHandler* h_;
237  ScenePicker* sp_;
238  int tool_;
239 };
240 
242  spi_ = new ScenePickerImpl(scene);
243  spi_->ref();
244  bind_menu(spi_);
245 }
246 
248  return ScenePickerImpl::window_;
249 }
250 
252  spi_->unref();
253 }
254 
255 
257  return spi_->tg_;
258 }
259 
261  if (m) {
262  m->append_item(mi);
263  } else {
264  spi_->menu_->append_item(mi);
265  }
266  return mi;
267 }
268 
269 MenuItem* ScenePicker::add_menu(const char* name, MenuItem* mi, Menu* m) {
270  Menu* mm;
271  if (m) {
272  mm = m;
273  } else {
274  mm = spi_->menu_->menu();
275  }
276  mm->append_item(mi);
277  spi_->bil_->push_back(new ButtonItemInfo(name, mi->action(), mi->state(), mi, mm));
278  return mi;
279 }
280 
281 MenuItem* ScenePicker::add_menu(const char* name, Action* a, Menu* m) {
282  MenuItem* mi = K::menu_item(name);
283  mi->action(a);
284  return add_menu(name, mi, m);
285 }
286 MenuItem* ScenePicker::add_radio_menu(const char* name, Action* a, Menu* m) {
287  MenuItem* mi = K::radio_menu_item(spi_->tg_, name);
288  mi->action(new RadioSelect(name, a, spi_->scene_));
289  return add_menu(name, mi, m);
290 }
291 Button* ScenePicker::radio_button(const char* name, Action* a) {
292  Button* mi = WidgetKit::instance()->radio_button(spi_->tg_,
293  name,
294  new RadioSelect(name, a, spi_->scene_));
295  spi_->bil_->push_back(new ButtonItemInfo(name, mi->action(), mi->state()));
296  return mi;
297 }
299  Rubberband* rb,
300  Action* sel,
301  int tool,
302  Menu* m) {
303  return add_radio_menu(name, new RubberTool(sel, rb, this, tool), m);
304 }
305 Button* ScenePicker::radio_button(const char* name, Rubberband* rb, Action* sel, int tool) {
306  return radio_button(name, new RubberTool(sel, rb, this, tool));
307 }
308 MenuItem* ScenePicker::add_radio_menu(const char* name, OcHandler* h, int tool, Menu* m) {
309  return add_radio_menu(name, new HandlerTool(h, this, tool), m);
310 }
311 
312 long ScenePickerImpl::info_index(const char* name) {
313  for (const auto&& [i, b]: enumerate(*bil_)) {
314  if (strcmp(b->name_.string(), name) == 0) {
315  return i;
316  }
317  }
318  return -1;
319 }
320 void ScenePicker::exec_item(const char* name) {
321  long i;
322  Scene* s = spi_->scene_;
323  if (s->view_count()) {
324  XYView* v = s->sceneview(0);
326  if (v->canvas()) {
327  ScenePickerImpl::window_ = (DismissableWindow*) v->canvas()->window();
328  }
329  } else {
331  ScenePickerImpl::window_ = NULL;
332  }
333  i = spi_->info_index(name);
334  if (i > -1) {
335  ButtonItemInfo* b = spi_->bil_->at(i);
336  TelltaleState* t = b->s_;
337  bool chosen = t->test(TelltaleState::is_chosen);
338  bool act = !chosen;
339  if (t->test(TelltaleState::is_toggle)) {
340  t->set(TelltaleState::is_chosen, act);
341  act = true;
342  } else if (t->test(TelltaleState::is_choosable)) {
343  t->set(TelltaleState::is_chosen, true);
344  }
345  t->notify();
346  if (act && b->a_ != NULL) {
347  b->a_->execute();
348  }
349  }
350 }
351 
352 void ScenePicker::remove_item(const char* name) {
353  long i = spi_->info_index(name);
354  if (i > -1) {
355  ButtonItemInfo* b = spi_->bil_->at(i);
356  spi_->bil_->erase(spi_->bil_->begin() + i);
357  GlyphIndex j = b->menu_index();
358  if (j > -1) {
359  b->parent_->remove_item(j);
360  }
361  // if (b->mi_) {
362  // delete b->mi_;
363  // }
364  delete b;
365  }
366 }
367 
368 void ScenePicker::insert_item(const char* insert, const char* name, MenuItem* mi) {
369  long i;
370  i = spi_->info_index(insert);
371  if (i > -1) {
372  ButtonItemInfo* b = spi_->bil_->at(i);
373  GlyphIndex j = b->menu_index();
374  if (j > -1) {
375  b->parent_->insert_item(j, mi);
376  spi_->bil_->insert(spi_->bil_->begin() + i,
377  new ButtonItemInfo(name, mi->action(), mi->state(), mi, b->parent_));
378  }
379  }
380 }
381 
382 void ScenePicker::set_scene_tool(int t) {
383  spi_->scene_->tool(t);
384 }
385 
386 void ScenePicker::help() {
387  spi_->scene_->help();
388 }
389 
390 void ScenePicker::select_name(const char* name) {
391  spi_->sel_name_ = name;
392 }
393 
394 const char* ScenePicker::select_name() {
395  return spi_->sel_name_.string();
396 }
397 
398 ScenePickerImpl::ScenePickerImpl(Scene* scene)
399  : sel_name_("") {
400  menu_ = new PopupMenu();
401  menu_->ref();
402  tg_ = new TelltaleGroup();
403  tg_->ref();
404  scene_ = scene; // not ref'ed since picker deleted when scene is deleted
405  bil_ = new std::vector<ButtonItemInfo*>();
406  bil_->reserve(20);
407 }
408 
409 ScenePickerImpl::~ScenePickerImpl() {
410  Resource::unref(menu_);
411  Resource::unref(tg_);
412  for (ButtonItemInfo* bii: *bil_) {
413  delete bii;
414  }
415  delete bil_;
416 }
417 
418 bool ScenePickerImpl::event(Event& e) {
419  // printf("ScenePickerImpl::event\n");
420  window_ = (DismissableWindow*) e.window();
421  menu_->event(e);
422  return false;
423 }
424 
425 RubberTool::RubberTool(Action* sel, Rubberband* rb, ScenePicker* sp, int tool) {
426  sel_ = sel;
427  sp_ = sp;
428  rb_ = rb;
429  Resource::ref(rb_);
430  Resource::ref(sel_);
431  tool_ = tool;
432 }
433 
434 RubberTool::~RubberTool() {
435  Resource::unref(rb_);
436  Resource::unref(sel_);
437 }
438 
439 void RubberTool::execute() {
440  sp_->bind_select(rb_);
441  sp_->set_scene_tool(tool_);
442  if (Oc::helpmode()) {
443  rb_->help();
444  } else if (sel_) {
445  sel_->execute();
446  }
447 }
448 
449 RadioSelect::RadioSelect(const char* name, Action* a, Scene* s)
450  : name_(name) {
451  a_ = a;
452  Resource::ref(a_);
453  s_ = s; // not referenced
454 }
455 
456 RadioSelect::~RadioSelect() {
458 }
459 
460 void RadioSelect::execute() {
462  a_->execute();
463  s_->picker()->select_name(this->name_.string());
464  for (int i = 0; i < s_->view_count(); ++i) {
465  XYView* v = s_->sceneview(i);
466  v->notify();
467  }
468 }
469 
470 HandlerTool::HandlerTool(OcHandler* h, ScenePicker* sp, int tool) {
471  sp_ = sp;
472  h_ = h;
473  Resource::ref(h_);
474  tool_ = tool;
475 }
476 
477 HandlerTool::~HandlerTool() {
478  Resource::unref(h_);
479 }
480 
481 void HandlerTool::execute() {
482  sp_->bind_select(h_);
483  sp_->set_scene_tool(tool_);
484  if (Oc::helpmode()) {
485  if (h_) {
486  h_->help();
487  } else {
488  sp_->help();
489  }
490  }
491 }
492 
493 SceneMover::SceneMover() {
494  x_ = 0;
495  y_ = 0;
496 }
497 
498 SceneMover::~SceneMover() {}
499 
500 void SceneMover::help() {
501  Oc::help(Scene_SceneMover_);
502 }
503 
504 bool SceneMover::event(Event& e) {
505  if (Oc::helpmode()) {
506  if (e.type() == Event::down) {
507  help();
508  }
509  }
510  Coord xold = x_, yold = y_;
511  x_ = e.pointer_x();
512  y_ = e.pointer_y();
513 
514  switch (e.type()) {
515  case Event::down:
516  view_ = XYView::current_pick_view();
517  // view_->rebind();
518  e.grab(this);
519 #ifdef WIN32
520  e.window()->grab_pointer();
521 #endif
522  break;
523  case Event::motion:
524  view_->move_view(x_ - xold, y_ - yold);
525  break;
526  case Event::up:
527  e.ungrab(this);
528 #ifdef WIN32
529  e.window()->ungrab_pointer();
530 #endif
531  break;
532  }
533  return true;
534 }
535 
536 SceneZoom::SceneZoom() {
537  x_ = 0;
538  y_ = 0;
539  xorg_ = 0;
540  yorg_ = 0;
541 }
542 
543 SceneZoom::~SceneZoom() {}
544 
545 void SceneZoom::help() {
546  Oc::help(Scene_SceneZoom_);
547 }
548 
549 bool SceneZoom::event(Event& e) {
550  if (Oc::helpmode()) {
551  if (e.type() == Event::down) {
552  help();
553  }
554  }
555  Coord xold = x_, yold = y_;
556  x_ = e.pointer_x();
557  y_ = e.pointer_y();
558 
559  switch (e.type()) {
560  case Event::down:
561  view_ = XYView::current_pick_view();
562  // view_->rebind();
563  e.grab(this);
564 #ifdef WIN32
565  e.window()->grab_pointer();
566 #endif
567  xorg_ = x_;
568  yorg_ = y_;
569  break;
570  case Event::motion:
571  xold = (x_ - xold) / 50;
572  yold = (y_ - yold) / 50;
573  if (xold > .5)
574  xold = .5;
575  if (yold > .5)
576  yold = .5;
577  if (xold < -.5)
578  xold = -.5;
579  if (yold < -.5)
580  yold = -.5;
581  view_->scale_view(xorg_, yorg_, xold, yold);
582  break;
583  case Event::up:
584  e.ungrab(this);
585 #ifdef WIN32
586  e.window()->ungrab_pointer();
587 #endif
588  break;
589  }
590  return true;
591 }
592 
593 void RoundView::execute() {
594  if (Oc::helpmode()) {
595  Oc::help(Scene_RoundView_);
596  return;
597  }
599  if (!v)
600  return;
601  Coord x1, y1, x2, y2;
602  v->zin(x1, y1, x2, y2);
603  double d1, d2;
604  int ntic;
605  MyMath::round_range_down(x1, x2, d1, d2, ntic);
606  x1 = d1;
607  x2 = d2;
608  MyMath::round_range_down(y1, y2, d1, d2, ntic);
609  y1 = d1;
610  y2 = d2;
611 
612  v->size(x1, y1, x2, y2);
613  v->zout(x1, y1, x2, y2);
614  v->size(x1, y1, x2, y2);
615  v->damage_all();
616 }
617 
618 void WholeSceneView::execute() {
619  if (Oc::helpmode()) {
620  Oc::help(Scene_WholeSceneView_);
621  return;
622  }
624  if (!v)
625  return;
626  Scene& s = *v->scene();
627  v->size(s.x1(), s.y1(), s.x2(), s.y2());
628  Coord x1, y1, x2, y2;
629  v->zout(x1, y1, x2, y2);
630  v->size(x1, y1, x2, y2);
631  v->damage_all();
632 }
633 
634 void WholePlotView::execute() {
635  if (Oc::helpmode()) {
636  Oc::help(Scene_WholePlotView_);
637  return;
638  }
640  if (!v)
641  return;
642  Scene& s = *v->scene();
643  Coord x1, y1, x2, y2;
644  s.wholeplot(x1, y1, x2, y2);
645  MyMath::round(x1, x2, MyMath::Expand, 2);
646  MyMath::round(y1, y2, MyMath::Expand, 2);
647  v->box_size(x1, y1, x2, y2);
648  v->zout(x1, y1, x2, y2);
649  v->box_size(x1, y1, x2, y2);
650  v->damage_all();
651 }
652 
653 void ZoomOut10::execute() {
654  if (Oc::helpmode()) {
655  Oc::help(Scene_ZoomOut10_);
656  return;
657  }
659  Coord x1, x2, y1, y2;
660  v->zout(x1, y1, x2, y2);
661  v->size(x1, y1, x2, y2);
662  v->damage_all();
663 }
664 
665 void ZoomIn10::execute() {
666  if (Oc::helpmode()) {
667  Oc::help(Scene_ZoomeIn10_);
668  return;
669  }
671  if (!v)
672  return;
673  Coord x1, x2, y1, y2;
674  v->zin(x1, y1, x2, y2);
675  v->size(x1, y1, x2, y2);
676  v->damage_all();
677 }
678 
679 void SPObjectName::execute() {
680  if (Oc::helpmode()) {
681  Oc::help(Scene_ObjectName_);
682  }
684  printf("%s\n", hoc_object_name(s->hoc_obj_ptr()));
685 }
686 
687 void SpecView::execute() {
688  if (Oc::helpmode()) {
689  Oc::help(Scene_SpecView_);
690  }
692  if (!v)
693  return;
694  Coord x1, x2, y1, y2;
695  v->zin(x1, y1, x2, y2);
696  bool bx = var_pair_chooser("X size", x1, x2, v->canvas()->window());
697  bool by = var_pair_chooser("Y size", y1, y2, v->canvas()->window());
698  v->size(x1, y1, x2, y2);
699  v->zout(x1, y1, x2, y2);
700  v->size(x1, y1, x2, y2);
701  v->damage_all();
702 }
703 
704 void SizeScene::execute() {
705  if (Oc::helpmode()) {
706  Oc::help(Scene_SizeScene_);
707  return;
708  }
710  if (!v)
711  return;
712  Coord x1, x2, y1, y2;
713  v->zin(x1, y1, x2, y2);
714  v->scene()->new_size(x1, y1, x2, y2);
715  v->zout(x1, y1, x2, y2);
716  v->size(x1, y1, x2, y2);
717 }
718 
719 NewView::NewView() {}
720 NewView::~NewView() {}
721 void NewView::help() {
722  Oc::help(Scene_NewView_);
723 }
724 
725 void NewView::execute(Rubberband* rb) {
726  if (Oc::helpmode()) {
727  help();
728  return;
729  }
730  const Event& e = rb->event();
732  Coord l, b, r, t;
733  Coord x1, y1, x2, y2;
734  ((RubberRect*) rb)->get_rect_canvas(l, b, r, t);
735  ((RubberRect*) rb)->get_rect(x1, y1, x2, y2);
736  XYView* v = cv->new_view(x1, y1, x2, y2);
737  ViewWindow* w = new ViewWindow(v, ((PrintableWindow*) (cv->canvas()->window()))->type());
738  w->place(l + e.pointer_root_x() - e.pointer_x(), b + e.pointer_root_y() - e.pointer_y());
739  w->map();
740 }
741 
742 ShowMenu::ShowMenu(Menu* m) {
743  m_ = m;
744  m->ref();
745 }
746 ShowMenu::~ShowMenu() {
747  Resource::unref(m_);
748 }
749 void ShowMenu::execute() {
750  if (Oc::helpmode()) {
751  Oc::help(Scene_ShowMenu_);
752  return;
753  }
755  v->parent()->viewmenu(m_);
756 }
757 
758 // following doesn't work correctly yet
759 void OcViewGlyph::viewmenu(Glyph* m) {
760  printf("OcViewGlyph::viewmenu()\n");
761  if (!g_) {
762  g_ = body();
763  Resource::ref(g_);
764  LayoutKit& lk = *LayoutKit::instance();
765  WidgetKit& wk = *WidgetKit::instance();
766  PolyGlyph* hbox = lk.hbox(2);
767  hbox->append(lk.center(m, 0, 1));
768  hbox->append(lk.center(view(), 0, 1));
769  body(hbox);
770  printf("add menu\n");
771  } else {
772  printf("delete menu\n");
773  body(g_);
775  g_ = NULL;
776  }
777 }
778 
780  menu_ = WidgetKit::instance()->pulldown();
781  menu_->ref();
782  w_ = NULL;
783  grabbed_ = false;
784 }
785 
788  if (w_) {
789  delete w_;
790  }
791 }
792 
793 bool PopupMenu::event(Event& e) {
794  if (!w_) {
795  w_ = new PopupWindow(menu_);
796  }
797  switch (e.type()) {
798  case Event::down:
799  if (!grabbed_) {
800  Coord l, b;
801  w_->place(e.pointer_root_x(), e.pointer_root_y());
802  w_->align(.8, .9);
803 #if defined(WIN32)
804  l = w_->left();
805  b = w_->bottom();
806  if (b < 0. || l < 0.) {
807  w_->align(0., 0.);
808  w_->place((l > 0.) ? l : 1., (b > 0.) ? b : 20.);
809  }
810  w_->map();
811 #else
812  w_->map();
813  l = w_->left();
814  b = w_->bottom();
815  if (b < 0. || l < 0.) {
816  w_->unmap();
817  w_->align(0., 0.);
818  w_->place((l > 0.) ? l : 1., (b > 0.) ? b : 20.);
819  w_->map();
820  }
821 #endif
822  e.grab(this);
823  grabbed_ = true;
824  menu_->press(e);
825  }
826  break;
827  case Event::motion:
828  if (grabbed_) {
829  menu_->drag(e);
830  }
831  break;
832  case Event::up:
833  if (grabbed_) {
834  e.ungrab(this);
835  grabbed_ = false;
836  w_->unmap();
837  menu_->release(e);
838  }
839  break;
840  }
841  return true;
842 }
843 
845  menu_->append_item(mi);
846 }
847 #endif
#define TelltaleState
Definition: _defines.h:293
#define Menu
Definition: _defines.h:174
#define PopupWindow
Definition: _defines.h:208
#define PopupMenu
Definition: _defines.h:207
#define Coord
Definition: _defines.h:17
#define Hit
Definition: _defines.h:145
#define WidgetKit
Definition: _defines.h:328
#define GlyphIndex
Definition: _defines.h:21
#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 TelltaleGroup
Definition: _defines.h:292
#define RubberRect
Definition: _defines.h:237
#define LayoutKit
Definition: _defines.h:159
#define Action
Definition: _defines.h:25
#define Glyph
Definition: _defines.h:130
static MenuItem * radio_menu_item(TelltaleGroup *, const char *)
static MenuItem * menu_item(const char *)
static MenuItem * check_menu_item(const char *)
static void round_range_down(Coord x1, Coord x2, double &y1, double &y2, int &ntic)
Definition: mymath.cpp:224
static double round(float &x1, float &x2, int direction, int digits)
Definition: mymath.cpp:253
@ Expand
Definition: mymath.h:48
virtual void help()
static void help(const char *)
static bool helpmode()
Definition: ivoc.h:70
XYView * view()
Definition: scenevie.h:93
Glyph * g_
Definition: scenevie.h:101
void viewmenu(Glyph *)
bool grabbed_
Definition: utility.h:77
virtual bool event(Event &)
void append_item(MenuItem *)
virtual ~PopupMenu()
Menu * menu_
Definition: utility.h:75
PopupWindow * w_
Definition: utility.h:76
virtual void map()
virtual void ref() const
Definition: resource.cpp:42
virtual void unref() const
Definition: resource.cpp:47
virtual void execute(Rubberband *)
virtual void help()
virtual bool event(Event &)
ScenePicker * picker()
ScenePicker * picker_
Definition: scenevie.h:335
virtual void pick_menu(Glyph *, int, Hit &)
virtual ~ScenePicker()
virtual const char * select_name()
void insert_item(const char *, const char *, MenuItem *)
MenuItem * add_radio_menu(const char *, Action *, Menu *=NULL)
Button * radio_button(const char *, Action *)
MenuItem * add_menu(MenuItem *, Menu *=NULL)
virtual void help()
TelltaleGroup * telltale_group()
ScenePickerImpl * spi_
Definition: scenepic.h:53
void remove_item(const char *)
virtual void exec_item(const char *)
virtual void set_scene_tool(int)
static DismissableWindow * last_window()
ScenePicker(Scene *)
void bind_menu(Rubberband *rb)
Definition: ocpicker.h:30
void bind_select(Rubberband *rb)
Definition: ocpicker.h:24
void bind_adjust(Rubberband *rb)
Definition: ocpicker.h:27
Canvas * canvas()
virtual Scene * scene() const
virtual XYView * new_view(Coord x1, Coord y1, Coord x2, Coord y2)
static XYView * current_pick_view()
double mm
Definition: coord.h:48
#define fil
Definition: coord.h:41
#define cnt
Definition: tqueue.hpp:44
#define v
Definition: md1redef.h:11
#define i
Definition: md1redef.h:19
#define y_(arg)
Crout matrix decomposition : Forward/Backward substitution.
Definition: crout.hpp:136
constexpr auto enumerate(T &&iterable)
Definition: enumerate.h:90
static RNG::key_type k
Definition: nrnran123.cpp:9
char * hoc_object_name(Object *ob)
Definition: hoc_oop.cpp:73
printf
Definition: extdef.h:5
const char * name
Definition: init.cpp:16
void insert(SparseObj *so, Item *item)
size_t j
s
Definition: multisend.cpp:521
static realtype a_
static N_Vector x_
void handle_old_focus()
#define NULL
Definition: spdefs.h:105
bool var_pair_chooser(const char *, float &x, float &y, Window *w=NULL, Coord x1=400., Coord y1=400.)