NEURON
ocpicker.cpp
Go to the documentation of this file.
1 #include <../../nrnconf.h>
2 #if HAVE_IV // to end of file
3 
4 #include <algorithm>
5 #include <OS/list.h>
6 #include <InterViews/hit.h>
7 #include <stdio.h>
8 #include "ocpicker.h"
9 #include "rubband.h"
10 
11 /*static*/ class ButtonHandler {
12  public:
13  ButtonHandler(EventButton, OcHandler*);
14  ButtonHandler(EventButton, Rubberband*);
15  ~ButtonHandler();
16  OcHandler* handler_;
17  Rubberband* rband_;
18  EventButton eb_;
19 };
20 
21 ButtonHandler::ButtonHandler(EventButton eb, OcHandler* a) {
22  eb_ = eb;
23  handler_ = a;
24  rband_ = NULL;
25  Resource::ref(a);
26 }
27 
28 ButtonHandler::ButtonHandler(EventButton eb, Rubberband* rb) {
29  eb_ = eb;
30  handler_ = NULL;
31  rband_ = rb;
32  Resource::ref(rb);
33 }
34 
35 ButtonHandler::~ButtonHandler() {
36  Resource::unref(handler_);
37  Resource::unref(rband_);
38 }
39 
41  ms_ = unknown;
42  for (int i = 0; i < unknown; ++i) {
43  handlers_[i] = new std::vector<ButtonHandler*>();
44  }
45 }
47  for (int i = 0; i < unknown; ++i) {
48  for (auto& item: *handlers_[i]) {
49  delete item;
50  }
51  delete handlers_[i];
52  }
53 }
54 bool StandardPicker::pick(Canvas* c, Glyph* glyph, int depth, Hit& h) {
55  if (!h.event()) {
56  return false;
57  }
58  const Event& e = *h.event();
59  if (e.grabber()) {
60  h.target(depth, glyph, 0, e.grabber());
61  return true;
62  }
63  event(e);
64 
65  for (const auto& b: *handlers_[ms_]) {
66  if (b->eb_ == Event::any || b->eb_ == mb_) {
67  if (b->handler_) {
68  h.target(depth, glyph, 0, b->handler_);
69  } else {
70  b->rband_->canvas(c);
71  h.target(depth, glyph, 0, b->rband_);
72  }
73  return true;
74  }
75  }
76  return false;
77 }
78 
79 /* from /interviews/input.cpp */
80 void StandardPicker::event(const Event& e) {
81  switch (e.type()) {
82  case Event::down:
83  // printf("press\n");
84  ms_ = press;
85  mb_ = e.pointer_button();
86  break;
87  case Event::motion:
88  if ((ms_ == drag || ms_ == press) &&
89  (e.left_is_down() || e.right_is_down() || e.middle_is_down())) {
90  // printf("drag\n");
91  ms_ = drag;
92  } else {
93  // printf("motion\n");
94  ms_ = motion;
95  mb_ = 0;
96  }
97  break;
98  case Event::up:
99  // printf("release\n");
100  ms_ = release;
101  mb_ = e.pointer_button();
102  break;
103  }
104 }
105 
106 void StandardPicker::unbind(int m, EventButton eb) {
107  for (auto& b: *handlers_[m]) {
108  if (b->eb_ == Event::any || b->eb_ == eb) {
109  delete b;
110  b = nullptr;
111  }
112  }
113  handlers_[m]->erase(std::remove(handlers_[m]->begin(), handlers_[m]->end(), nullptr),
114  handlers_[m]->end());
115 }
116 
117 void StandardPicker::bind(int m, EventButton eb, OcHandler* h) {
118  unbind(m, eb);
119  if (h) {
120  handlers_[m]->push_back(new ButtonHandler(eb, h));
121  }
122 }
123 
125  int m = 1;
126  unbind(m, eb);
127  if (rb) {
128  handlers_[m]->push_back(new ButtonHandler(eb, rb));
129  }
130 }
131 
133  for (int m = 0; m < unknown; ++m) {
134  unbind(m, eb);
135  }
136 }
137 #endif
#define Canvas
Definition: _defines.h:63
#define Hit
Definition: _defines.h:145
#define Event
Definition: _defines.h:105
#define EventButton
Definition: _defines.h:19
#define Glyph
Definition: _defines.h:130
virtual void ref() const
Definition: resource.cpp:42
virtual void unref() const
Definition: resource.cpp:47
void bind_press(EventButton eb, Rubberband *)
virtual bool pick(Canvas *, Glyph *, int depth, Hit &h)
std::vector< ButtonHandler * > * handlers_[unknown]
Definition: ocpicker.h:70
void remove_all(EventButton)
void event(const Event &)
virtual ~StandardPicker()
EventButton mb_
Definition: ocpicker.h:69
void unbind(int, EventButton)
void bind(int, EventButton eb, OcHandler *h)
#define i
Definition: md1redef.h:19
static int c
Definition: hoc.cpp:169
static double remove(void *v)
Definition: ocdeck.cpp:205
#define NULL
Definition: spdefs.h:105