void ui_print_database() { FILE *handle; char *command = opt_get_str(STR_PRINT_COMMAND); int mode; if(list_is_empty()) return; switch(statusline_askchoice(_("Print <a>ll, print <s>elected, or <c>ancel?"), S_("keybindings:all/selected/cancel|asc"), 3)) { case 1: mode = ENUM_ALL; break; case 2: if( !selected_items() ) { statusline_msg(_("No selected items")); return; } mode = ENUM_SELECTED; break; default: refresh_screen(); return; } clear_statusline(); if( ! *command || (handle = popen(command, "w")) == NULL) return; fexport("text", handle, mode); pclose(handle); }
void remove_selected_items() { int i, j; if(list_is_empty()) return; if(!selected_items()) selected[curitem] = 1; for(j = LAST_ITEM; j >= 0; j--) { if(selected[j]) { db_free_item(j); /* added for .4 data_s_ */ for(i = j; i < LAST_ITEM; i++) { item_copy(database[i], database[i + 1]); selected[i] = selected[i + 1]; } item_free(&database[LAST_ITEM]); items--; } } if(curitem > LAST_ITEM && items > 0) curitem = LAST_ITEM; adjust_list_capacity(); select_none(); }
void merge_selected_items() { int i, j; int destitem = -1; if((list_is_empty()) || (selected_items() < 2)) return; /* Find the top item */ for(j=0; destitem < 0; j++) if(selected[j]) destitem = j; /* Merge pairwise */ for(j = LAST_ITEM; j > destitem; j--) { if(selected[j]) { item_merge(database[destitem],database[j]); for(i = j; i < LAST_ITEM; i++) { /* TODO: this can be done by moving pointers */ item_copy(database[i], database[i + 1]); selected[i] = selected[i + 1]; } item_free(&database[LAST_ITEM]); items--; } } if(curitem > LAST_ITEM && items > 0) curitem = LAST_ITEM; adjust_list_capacity(); select_none(); }
void ui_print_number_of_items() { char *str = strdup_printf(" " "|%3d/%3d", selected_items(), db_n_items()); mvaddstr(0, COLS-strlen(str), str); free(str); }
void Header::on_group() { const vector< shared_ptr<TraceTreeItem> > items( view_.list_by_type<TraceTreeItem>()); vector< shared_ptr<TraceTreeItem> > selected_items( make_filter_iterator(item_selected, items.begin(), items.end()), make_filter_iterator(item_selected, items.end(), items.end())); stable_sort(selected_items.begin(), selected_items.end(), [](const shared_ptr<TraceTreeItem> &a, const shared_ptr<TraceTreeItem> &b) { return a->visual_v_offset() < b->visual_v_offset(); }); shared_ptr<TraceGroup> group(new TraceGroup()); shared_ptr<TraceTreeItem> mouse_down_item( std::dynamic_pointer_cast<TraceTreeItem>(mouse_down_item_)); shared_ptr<TraceTreeItem> focus_item( mouse_down_item ? mouse_down_item : selected_items.front()); assert(focus_item); assert(focus_item->owner()); focus_item->owner()->add_child_item(group); // Set the group v_offset here before reparenting group->force_to_v_offset(focus_item->layout_v_offset() + focus_item->v_extents().first); for (size_t i = 0; i < selected_items.size(); i++) { const shared_ptr<TraceTreeItem> &r = selected_items[i]; assert(r->owner()); r->owner()->remove_child_item(r); group->add_child_item(r); // Put the items at 1-pixel offsets, so that restack will // stack them in the right order r->set_layout_v_offset(i); } }
void get_commands() { int ch; for(;;) { can_resize = TRUE; /* it's safe to resize now */ if(!opt_get_bool(BOOL_SHOW_CURSOR)) hide_cursor(); if(should_resize) refresh_screen(); ch = getch(); if(!opt_get_bool(BOOL_SHOW_CURSOR)) show_cursor(); can_resize = FALSE; /* it's not safe to resize anymore */ switch(ch) { case 'q': return; case 'Q': quit_abook(QUIT_DONTSAVE); break; case 'P': print_stderr(selected_items() ? -1 : list_get_curitem()); return; case '?': display_help(HELP_MAIN); refresh_screen(); break; case 'a': add_item(); break; case '\r': edit_item(-1); break; case KEY_DC: case 'd': case 'r': ui_remove_items(); break; case 'D': duplicate_item(); break; case 12: refresh_screen(); break; case 'k': case KEY_UP: scroll_up(); break; case 'j': case KEY_DOWN: scroll_down(); break; case 'K': case KEY_PPAGE: page_up(); break; case 'J': case KEY_NPAGE: page_down(); break; case 'g': case KEY_HOME: goto_home(); break; case 'G': case KEY_END: goto_end(); break; case 'w': save_database(); break; case 'l': ui_read_database(); break; case 'i': import_database(); break; case 'e': export_database(); break; case 'C': ui_clear_database(); break; case 'o': ui_open_datafile(); break; case 's': sort_by_field("name"); break; case 'S': sort_surname(); break; case 'F': sort_by_field(NULL); break; case '/': ui_find(0); break; case '\\': ui_find(1); break; case ' ': if(list_get_curitem() >= 0) { list_invert_curitem_selection(); ui_print_number_of_items(); refresh_list(); } break; case '+': select_all(); refresh_list(); break; case '-': select_none(); refresh_list(); break; case '*': invert_selection(); refresh_list(); break; case 'A': move_curitem(MOVE_ITEM_UP); break; case 'Z': move_curitem(MOVE_ITEM_DOWN); break; case 'm': launch_mutt(selected_items() ? -1 : list_get_curitem()); refresh_screen(); break; case 'p': ui_print_database(); break; case 'v': launch_wwwbrowser(list_get_curitem()); refresh_screen(); break; case 'H': launch_callpgm(list_get_curitem(), 'H'); refresh_screen(); break; case 'W': launch_callpgm(list_get_curitem(), 'W'); refresh_screen(); break; case 'M': launch_callpgm(list_get_curitem(), 'M'); refresh_screen(); break; } } }