int handle(int ev) { if(ev==FL_PUSH && Fl::event_is_click()) { if(Fl::event_button()==FL_LEFT_MOUSE) { set_selected(); redraw(); menu->anim_flags(Fl_Menu_::LEFT_TO_RIGHT); menu->Fl_Group::focus(-1); menu->popup(w(), 0); clear_selected(); redraw(); return 1; } } return Fl_Widget::handle(ev); }
//for most cases, this takes world coordinates, but not always!!! void g1_human_class::player_clicked(g1_object_class * obj, float gx, float gy,w32 command) { g1_object_type convoy_type=g1_get_object_type(li_convoy.get()); switch (command) { case DEFAULT: { if (obj && obj->player_num==team() && obj->get_flag(g1_object_class::SELECTABLE)) { clear_selected(); if (obj == commander()) { selected_object = 0; } else { g1_convoy_class * c=(g1_convoy_class *)g1_object_type_array[convoy_type]->create_object(convoy_type,0); c->setup(obj); c->player_num=team(); selected_object=c; selected_object->mark_as_selected(); } } else if (selected_object.valid()) { send_selected_units(gx,gy); } else { select_path(gx,gy); } } break; case ATTACK: { if (selected_object.valid()&&selected_object->player_num==team()) { attack_unit(obj,gx,gy); } //remember: this only works if //target is in range break; } case GOTO: if (selected_object.valid()&&selected_object->player_num==team()) { send_selected_units(gx,gy); } break; case SELECT: { //single objects can be selected, even if they don't //belong to the local user if (!obj/*||obj->player_num!=team() ||!obj->get_flag(g1_object_class::SELECTABLE) */) { break; } clear_selected(); g1_convoy_class * c=(g1_convoy_class *)g1_create_object(convoy_type); c->player_num=obj->player_num; if (!obj->get_flag(g1_object_class::SELECTABLE)) { c->player_num=0; } //a slight hack to prevent the user //from actually sending commands //to this unit. c->setup(obj); selected_object=c; selected_object->mark_as_selected(); break; } case ADD_TO_LIST: { if ((selected_object.valid()&&selected_object->id!=g1_get_object_type(li_convoy.get())) || !obj || obj->player_num!=team() || !obj->get_flag(g1_object_class::SELECTABLE)) { break; } if (!selected_object.valid()) { g1_convoy_class * cn=(g1_convoy_class *) g1_create_object(convoy_type); cn->player_num=team(); cn->setup(obj); selected_object=cn; cn->mark_as_selected(); break; } ((g1_convoy_class *)selected_object.get())->add_object(obj); } break; case START_DRAG: { dragstartx=gx; //Screen coordinates!!! dragstarty=gy; break; } case DRAGGING: { dragdestx=gx; dragdesty=gy; //w16 mod; //if (i4_current_app->get_window_manager()->shift_pressed()) // mod=ADD_TO_OLD; //else if (i4_current_app->get_window_manager()->alt_pressed()) // mod=SUB_FROM_OLD; //else // mod=CLEAR_OLD; //select_objects_in_range(dragstartx,dragstarty,dragendx,dragendy,mod); } break; case END_DRAG: { dragstartx=dragstarty=dragdestx=dragdesty=-1; } break; case SELECT_PATH: { select_path(gx,gy); } break; default: break; } }