int view_navigate_next(GtkTreeView *view) { GtkTreeIter iter; GtkTreeModel *model; GtkTreePath *path; GtkTreeSelection *selection; path = view_get_current_path(view, &model, &selection); if (path != NULL) { gtk_tree_path_next(path); if (!gtk_tree_model_get_iter(model, &iter, path) && gtk_tree_model_get_iter_first(model, &iter)) { gtk_tree_path_free(path); path = gtk_tree_model_get_path(model, &iter); } } if (path != NULL) { select_path(view, selection, path); gtk_tree_path_free(path); } return path != NULL; }
int view_navigate_prev(GtkTreeView *view) { GtkTreeModel *model; GtkTreePath *path; GtkTreeSelection *selection; path = view_get_current_path(view, &model, &selection); if (path != NULL) { if (!gtk_tree_path_prev(path)) { gtk_tree_path_free(path); path = tree_model_get_path_last(model); } } if (path != NULL) { select_path(view, selection, path); gtk_tree_path_free(path); } return path != NULL; }
//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; } }