void DeviceProxy_Callback::reset() { if(reset_cb) reset_cb(); }
int Puzzle_Window::handle(int event) { int x = Fl::event_x(); int y = Fl::event_y(); switch (event) { case FL_KEY: switch (Fl::event_key()) { case FL_Escape: case 'Q': case 'q': exit(0); break; case 'S': case 's': solve_cb(this,0); break; case 'D': case 'd': piece = selectPiece(x, y); delete_cb(this,0); break; case 'R': case 'r': reset_cb(this,0); break; case 'O': case 'o': reset_view_cb(this,0); break; default: break; } return 1; case FL_PUSH: mousex = curX = x; mousey = curY = y; switch (Fl::event_button()) { case 1: set_solving(0); left_mouse = true; sel_piece = selectPiece(mousex, mousey); if (!sel_piece) { left_mouse = false; middle_mouse = true; // let it rotate object } else { float selx, sely; if (computeCoords(sel_piece, mousex, mousey, &selx, &sely)) { grabPiece(sel_piece, selx, sely); } } redraw(); break; case 2: middle_mouse = true; redraw(); break; default: piece = selectPiece(x, y); if (piece) menu->child(2)->activate(); else menu->child(2)->deactivate(); menu->popup(x, y); return 1; } // fall through to drag handler: case FL_DRAG: if (middle_mouse && !left_mouse) { if (mousex != x || mousey != y) { trackball(lastquat, (2.0*mousex - W) / W, (H - 2.0*mousey) / H, (2.0*x - W) / W, (H - 2.0*y) / H); spinning = 1; } else { spinning = 0; } changeState(); } else { float selx, sely; computeCoords(sel_piece, x, y, &selx, &sely); moveSelection(selx, sely); } mousex = x; mousey = y; redraw(); return 1; case FL_RELEASE: if (left_mouse) { left_mouse = false; dropSelection(); redraw(); } else if (middle_mouse) { middle_mouse = GL_FALSE; redraw(); } return 1; } return Fl_Gl_Window::handle(event); }