| 50 | | |
| 51 | | GraphicsWindowWX* gw = new GraphicsWindowWX(frame, wxID_ANY, wxDefaultPosition, |
| 52 | | wxSize(width, height), wxSUNKEN_BORDER, wxT("osgviewerWX"), attributes); |
| | 55 | attributes[6] = 0; |
| | 56 | |
| | 57 | OSGCanvas *canvas = new OSGCanvas(frame, wxID_ANY, wxDefaultPosition, |
| | 58 | wxSize(width, height), wxSUNKEN_BORDER, wxT("osgviewerWX"), attributes); |
| | 59 | |
| | 60 | GraphicsWindowWX* gw = new GraphicsWindowWX(canvas); |
| | 61 | |
| | 62 | canvas->SetGraphicsWindow(gw); |
| 104 | | BEGIN_EVENT_TABLE(GraphicsWindowWX, wxGLCanvas) |
| 105 | | EVT_SIZE (GraphicsWindowWX::OnSize) |
| 106 | | EVT_PAINT (GraphicsWindowWX::OnPaint) |
| 107 | | EVT_ERASE_BACKGROUND (GraphicsWindowWX::OnEraseBackground) |
| 108 | | |
| 109 | | EVT_CHAR (GraphicsWindowWX::OnChar) |
| 110 | | EVT_KEY_UP (GraphicsWindowWX::OnKeyUp) |
| 111 | | |
| 112 | | EVT_ENTER_WINDOW (GraphicsWindowWX::OnMouseEnter) |
| 113 | | EVT_LEFT_DOWN (GraphicsWindowWX::OnMouseDown) |
| 114 | | EVT_MIDDLE_DOWN (GraphicsWindowWX::OnMouseDown) |
| 115 | | EVT_RIGHT_DOWN (GraphicsWindowWX::OnMouseDown) |
| 116 | | EVT_LEFT_UP (GraphicsWindowWX::OnMouseUp) |
| 117 | | EVT_MIDDLE_UP (GraphicsWindowWX::OnMouseUp) |
| 118 | | EVT_RIGHT_UP (GraphicsWindowWX::OnMouseUp) |
| 119 | | EVT_MOTION (GraphicsWindowWX::OnMouseMotion) |
| | 114 | BEGIN_EVENT_TABLE(OSGCanvas, wxGLCanvas) |
| | 115 | EVT_SIZE (OSGCanvas::OnSize) |
| | 116 | EVT_PAINT (OSGCanvas::OnPaint) |
| | 117 | EVT_ERASE_BACKGROUND (OSGCanvas::OnEraseBackground) |
| | 118 | |
| | 119 | EVT_CHAR (OSGCanvas::OnChar) |
| | 120 | EVT_KEY_UP (OSGCanvas::OnKeyUp) |
| | 121 | |
| | 122 | EVT_ENTER_WINDOW (OSGCanvas::OnMouseEnter) |
| | 123 | EVT_LEFT_DOWN (OSGCanvas::OnMouseDown) |
| | 124 | EVT_MIDDLE_DOWN (OSGCanvas::OnMouseDown) |
| | 125 | EVT_RIGHT_DOWN (OSGCanvas::OnMouseDown) |
| | 126 | EVT_LEFT_UP (OSGCanvas::OnMouseUp) |
| | 127 | EVT_MIDDLE_UP (OSGCanvas::OnMouseUp) |
| | 128 | EVT_RIGHT_UP (OSGCanvas::OnMouseUp) |
| | 129 | EVT_MOTION (OSGCanvas::OnMouseMotion) |
| | 138 | } |
| | 139 | |
| | 140 | OSGCanvas::~OSGCanvas() |
| | 141 | { |
| | 142 | } |
| | 143 | |
| | 144 | void OSGCanvas::OnPaint( wxPaintEvent& WXUNUSED(event) ) |
| | 145 | { |
| | 146 | /* must always be here */ |
| | 147 | wxPaintDC dc(this); |
| | 148 | } |
| | 149 | |
| | 150 | void OSGCanvas::OnSize(wxSizeEvent& event) |
| | 151 | { |
| | 152 | // this is also necessary to update the context on some platforms |
| | 153 | wxGLCanvas::OnSize(event); |
| | 154 | |
| | 155 | // set GL viewport (not called by wxGLCanvas::OnSize on all platforms...) |
| | 156 | int width, height; |
| | 157 | GetClientSize(&width, &height); |
| | 158 | |
| | 159 | if (_graphics_window.valid()) |
| | 160 | { |
| | 161 | // update the window dimensions, in case the window has been resized. |
| | 162 | _graphics_window->getEventQueue()->windowResize(0, 0, width, height); |
| | 163 | _graphics_window->resized(0,0,width,height); |
| | 164 | } |
| | 165 | } |
| | 166 | |
| | 167 | void OSGCanvas::OnEraseBackground(wxEraseEvent& WXUNUSED(event)) |
| | 168 | { |
| | 169 | /* Do nothing, to avoid flashing on MSW */ |
| | 170 | } |
| | 171 | |
| | 172 | void OSGCanvas::OnChar(wxKeyEvent &event) |
| | 173 | { |
| | 174 | #if wxUSE_UNICODE |
| | 175 | int key = event.GetUnicodeKey(); |
| | 176 | #else |
| | 177 | int key = event.GetKeyCode(); |
| | 178 | #endif |
| | 179 | |
| | 180 | if (_graphics_window.valid()) |
| | 181 | _graphics_window->getEventQueue()->keyPress(key); |
| | 182 | |
| | 183 | // If this key event is not processed here, we should call |
| | 184 | // event.Skip() to allow processing to continue. |
| | 185 | } |
| | 186 | |
| | 187 | void OSGCanvas::OnKeyUp(wxKeyEvent &event) |
| | 188 | { |
| | 189 | #if wxUSE_UNICODE |
| | 190 | int key = event.GetUnicodeKey(); |
| | 191 | #else |
| | 192 | int key = event.GetKeyCode(); |
| | 193 | #endif |
| | 194 | |
| | 195 | if (_graphics_window.valid()) |
| | 196 | _graphics_window->getEventQueue()->keyRelease(key); |
| | 197 | |
| | 198 | // If this key event is not processed here, we should call |
| | 199 | // event.Skip() to allow processing to continue. |
| | 200 | } |
| | 201 | |
| | 202 | void OSGCanvas::OnMouseEnter(wxMouseEvent &event) |
| | 203 | { |
| | 204 | // Set focus to ourselves, so keyboard events get directed to us |
| | 205 | SetFocus(); |
| | 206 | } |
| | 207 | |
| | 208 | void OSGCanvas::OnMouseDown(wxMouseEvent &event) |
| | 209 | { |
| | 210 | if (_graphics_window.valid()) |
| | 211 | { |
| | 212 | _graphics_window->getEventQueue()->mouseButtonPress(event.GetX(), event.GetY(), |
| | 213 | event.GetButton()); |
| | 214 | } |
| | 215 | } |
| | 216 | |
| | 217 | void OSGCanvas::OnMouseUp(wxMouseEvent &event) |
| | 218 | { |
| | 219 | if (_graphics_window.valid()) |
| | 220 | { |
| | 221 | _graphics_window->getEventQueue()->mouseButtonRelease(event.GetX(), event.GetY(), |
| | 222 | event.GetButton()); |
| | 223 | } |
| | 224 | } |
| | 225 | |
| | 226 | void OSGCanvas::OnMouseMotion(wxMouseEvent &event) |
| | 227 | { |
| | 228 | if (_graphics_window.valid()) |
| | 229 | _graphics_window->getEventQueue()->mouseMotion(event.GetX(), event.GetY()); |
| | 230 | } |
| | 231 | |
| | 232 | void OSGCanvas::UseCursor(bool value) |
| | 233 | { |
| | 234 | if (value) |
| | 235 | { |
| | 236 | // show the old cursor |
| | 237 | SetCursor(_oldCursor); |
| | 238 | } |
| | 239 | else |
| | 240 | { |
| | 241 | // remember the old cursor |
| | 242 | _oldCursor = GetCursor(); |
| | 243 | |
| | 244 | // hide the cursor |
| | 245 | // - can't find a way to do this neatly, so create a 1x1, transparent image |
| | 246 | wxImage image(1,1); |
| | 247 | image.SetMask(true); |
| | 248 | image.SetMaskColour(0, 0, 0); |
| | 249 | wxCursor cursor(image); |
| | 250 | SetCursor(cursor); |
| | 251 | |
| | 252 | // On wxGTK, only works as of version 2.7.0 |
| | 253 | // (http://trac.wxwidgets.org/ticket/2946) |
| | 254 | // SetCursor( wxStockCursor( wxCURSOR_BLANK ) ); |
| | 255 | } |
| | 256 | } |
| | 257 | |
| | 258 | GraphicsWindowWX::GraphicsWindowWX(OSGCanvas *canvas) |
| | 259 | { |
| | 260 | _canvas = canvas; |
| 158 | | GraphicsWindowWX::~GraphicsWindowWX() |
| 159 | | { |
| 160 | | } |
| 161 | | |
| 162 | | void GraphicsWindowWX::OnPaint( wxPaintEvent& WXUNUSED(event) ) |
| 163 | | { |
| 164 | | /* must always be here */ |
| 165 | | wxPaintDC dc(this); |
| 166 | | } |
| 167 | | |
| 168 | | void GraphicsWindowWX::OnSize(wxSizeEvent& event) |
| 169 | | { |
| 170 | | // this is also necessary to update the context on some platforms |
| 171 | | wxGLCanvas::OnSize(event); |
| 172 | | |
| 173 | | // set GL viewport (not called by wxGLCanvas::OnSize on all platforms...) |
| 174 | | int width, height; |
| 175 | | GetClientSize(&width, &height); |
| 176 | | |
| 177 | | // update the window dimensions, in case the window has been resized. |
| 178 | | getEventQueue()->windowResize(0, 0, width, height); |
| 179 | | resized(0,0,width,height); |
| 180 | | } |
| 181 | | |
| 182 | | void GraphicsWindowWX::OnEraseBackground(wxEraseEvent& WXUNUSED(event)) |
| 183 | | { |
| 184 | | /* Do nothing, to avoid flashing on MSW */ |
| 185 | | } |
| 186 | | |
| 187 | | void GraphicsWindowWX::OnChar(wxKeyEvent &event) |
| 188 | | { |
| 189 | | #if wxUSE_UNICODE |
| 190 | | int key = event.GetUnicodeKey(); |
| 191 | | #else |
| 192 | | int key = event.GetKeyCode(); |
| 193 | | #endif |
| 194 | | getEventQueue()->keyPress(key); |
| 195 | | |
| 196 | | // If this key event is not processed here, we should call |
| 197 | | // event.Skip() to allow processing to continue. |
| 198 | | } |
| 199 | | |
| 200 | | void GraphicsWindowWX::OnKeyUp(wxKeyEvent &event) |
| 201 | | { |
| 202 | | #if wxUSE_UNICODE |
| 203 | | int key = event.GetUnicodeKey(); |
| 204 | | #else |
| 205 | | int key = event.GetKeyCode(); |
| 206 | | #endif |
| 207 | | getEventQueue()->keyRelease(key); |
| 208 | | |
| 209 | | // If this key event is not processed here, we should call |
| 210 | | // event.Skip() to allow processing to continue. |
| 211 | | } |
| 212 | | |
| 213 | | void GraphicsWindowWX::OnMouseEnter(wxMouseEvent &event) |
| 214 | | { |
| 215 | | // Set focus to ourselves, so keyboard events get directed to us |
| 216 | | SetFocus(); |
| 217 | | } |
| 218 | | |
| 219 | | void GraphicsWindowWX::OnMouseDown(wxMouseEvent &event) |
| 220 | | { |
| 221 | | getEventQueue()->mouseButtonPress(event.GetX(), event.GetY(), |
| 222 | | event.GetButton()); |
| 223 | | } |
| 224 | | |
| 225 | | void GraphicsWindowWX::OnMouseUp(wxMouseEvent &event) |
| 226 | | { |
| 227 | | getEventQueue()->mouseButtonRelease(event.GetX(), event.GetY(), |
| 228 | | event.GetButton()); |
| 229 | | } |
| 230 | | |
| 231 | | void GraphicsWindowWX::OnMouseMotion(wxMouseEvent &event) |
| 232 | | { |
| 233 | | getEventQueue()->mouseMotion(event.GetX(), event.GetY()); |
| 234 | | } |
| 235 | | |
| 236 | | |