diff options
author | victor <victor@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2003-11-11 11:29:14 +0800 |
---|---|---|
committer | victor <victor@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2003-11-11 11:29:14 +0800 |
commit | 5f6261706d4b524d96a1ded5af5446c3ca939d84 (patch) | |
tree | cfce92569127c1b80d465f1258775a8cf0d5e747 | |
parent | 6ba09f9658c7f877214fd3a0448282dcfdb52bbd (diff) | |
download | pttbbs-5f6261706d4b524d96a1ded5af5446c3ca939d84.tar pttbbs-5f6261706d4b524d96a1ded5af5446c3ca939d84.tar.gz pttbbs-5f6261706d4b524d96a1ded5af5446c3ca939d84.tar.bz2 pttbbs-5f6261706d4b524d96a1ded5af5446c3ca939d84.tar.lz pttbbs-5f6261706d4b524d96a1ded5af5446c3ca939d84.tar.xz pttbbs-5f6261706d4b524d96a1ded5af5446c3ca939d84.tar.zst pttbbs-5f6261706d4b524d96a1ded5af5446c3ca939d84.zip |
remove the cursor level
git-svn-id: http://opensvn.csie.org/pttbbs/branches/victor.fav4.bak@1313 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
-rw-r--r-- | pttbbs/include/proto.h | 18 | ||||
-rw-r--r-- | pttbbs/mbbsd/board.c | 157 | ||||
-rw-r--r-- | pttbbs/mbbsd/fav.c | 120 |
3 files changed, 101 insertions, 194 deletions
diff --git a/pttbbs/include/proto.h b/pttbbs/include/proto.h index 6a19d3e8..b21e1f08 100644 --- a/pttbbs/include/proto.h +++ b/pttbbs/include/proto.h @@ -202,7 +202,6 @@ void editunlock(char *fpath); int iseditlocking(char *fpath, char *action); /* fav */ -fav_type_t *get_current_entry(void); void fav_set_old_folder(fav_t *fp); int get_data_number(fav_t *fp); int get_current_fav_level(void); @@ -210,41 +209,36 @@ fav_t *get_current_fav(void); int get_item_type(fav_type_t *ft); char *get_item_title(fav_type_t *ft); char *get_folder_title(int fid); -void set_attr(fav_type_t *ft, int bit, int bool); +void set_attr(fav_type_t *ft, int bit, char bool); void fav_sort_by_name(void); void fav_sort_by_class(void); int fav_load(void); int fav_save(void); -void fav_remove_current(void); -void fav_remove_board_from_whole(int bid); +void fav_remove_item(short id, char type); fav_type_t *getboard(short bid); +fav_type_t *getfolder(short fid); char getbrdattr(short bid); time_t getbrdtime(short bid); void setbrdtime(short bid, time_t t); int fav_getid(fav_type_t *ft); +void fav_tag(short id, char type, char bool); void move_in_current_folder(int from, int to); void fav_move(int from, int to); fav_type_t *fav_add_line(void); fav_type_t *fav_add_folder(void); fav_type_t *fav_add_board(int bid); -void fav_tag_current(int bool); void fav_remove_all_tagged_item(void); void fav_remove_all_tagged_item(void); void fav_add_all_tagged_item(void); void fav_remove_all_tag(void); void fav_set_folder_title(fav_type_t *ft, char *title); int fav_max_folder_level(void); -void fav_folder_in(void); +void fav_folder_in(short fid); void fav_folder_out(void); void fav_free(void); int fav_v3_to_v4(void); int is_visible_item(fav_type_t *ft); -void fav_cursor_up(void); -void fav_cursor_down(void); -void fav_cursor_up_step(short int step); -void fav_cursor_down_step(short int step); -void fav_cursor_set(short int where); -int is_set_attr(fav_type_t *ft, int bit); +int is_set_attr(fav_type_t *ft, char bit); void cleanup(void); /* friend */ diff --git a/pttbbs/mbbsd/board.c b/pttbbs/mbbsd/board.c index 34b55465..5b4391c6 100644 --- a/pttbbs/mbbsd/board.c +++ b/pttbbs/mbbsd/board.c @@ -548,7 +548,7 @@ load_boards(char *key) byMALLOC = 0; needREALLOC = (get_data_number(fav) != brdnum); } - else{ // general case + else { // general case nbrd = (boardstat_t *) MALLOC(sizeof(boardstat_t) * numboards); for (i = 0; i < numboards; i++) { if ((bptr = SHM->bsorted[type][i]) == NULL) @@ -572,7 +572,7 @@ load_boards(char *key) if (class_bid == -1) qsort(nbrd, brdnum, sizeof(boardstat_t), cmpboardfriends); - } else { + } else { /* load boards of a subclass */ int childcount = bptr->childcount; nbrd = (boardstat_t *) malloc(childcount * sizeof(boardstat_t)); for (bptr = bptr->firstchild[type]; bptr != NULL; @@ -588,7 +588,7 @@ load_boards(char *key) needREALLOC = (childcount != brdnum); } - if( needREALLOC && brdnum > 0){ + if( needREALLOC ){ if( byMALLOC ){ boardstat_t *newnbrd; newnbrd = (boardstat_t *)malloc(sizeof(boardstat_t) * brdnum); @@ -611,7 +611,7 @@ search_board() clrtoeol(); CreateNameList(); for (num = 0; num < brdnum; num++) - if (nbrd[num].myattr & BRD_BOARD) + if (yank_flag != 0 || nbrd[num].myattr & BRD_BOARD) AddNameList(B_BH(&nbrd[num])->brdname); namecomplete(MSG_SELECT_BOARD, genbuf); FreeNameList(); @@ -827,39 +827,16 @@ set_menu_BM(char *BM) static char *privateboard = "\n\n\n\n 對不起 此板目前只准看板好友進入 請先向板主申請入境許\可"; -inline static void cursor_set(short int *num, char yank_flag, short int step) +static char +get_fav_type(boardstat_t *ptr) { - (*num) = step; - if (yank_flag == 0 && brdnum > 0) - fav_cursor_set(step); -} - -inline static void cursor_down(short int *num, char yank_flag) -{ - (*num)++; - if (yank_flag == 0 && brdnum > 0) - fav_cursor_down(); -} - -inline static void cursor_up(short int *num, char yank_flag) -{ - (*num)--; - if (yank_flag == 0 && brdnum > 0) - fav_cursor_up(); -} - -inline static void cursor_down_step(short int *num, char yank_flag, short int step) -{ - (*num) += step; - if (yank_flag == 0 && brdnum > 0) - fav_cursor_down_step(step); -} - -inline static void cursor_up_step(short int *num, char yank_flag, short int step) -{ - (*num) -= step; - if (yank_flag == 0 && brdnum > 0) - fav_cursor_up_step(step); + if (ptr->myattr & BRD_FOLDER) + return FAVT_FOLDER; + else if (ptr->myattr & BRD_BOARD) + return FAVT_BOARD; + else if (ptr->myattr & BRD_LINE) + return FAVT_LINE; + return 0; } static void @@ -880,8 +857,6 @@ choose_board(int newflag) do { if (brdnum <= 0) { - if (yank_flag == 0 && brdnum > 0) - fav_cursor_set(num); load_boards(keyword); if (brdnum <= 0 && yank_flag > 0) { if (keyword[0] != 0) { @@ -910,10 +885,9 @@ choose_board(int newflag) /* reset the cursor when out of range */ if (num < 0) - cursor_set(&num, yank_flag, 0); - else if (num >= brdnum){ - cursor_set(&num, yank_flag, brdnum - 1); - } + num = 0; + else if (num >= brdnum) + num = brdnum - 1; if (head < 0) { if (newflag) { @@ -922,10 +896,10 @@ choose_board(int newflag) ptr = &nbrd[num]; if (ptr->myattr & BRD_UNREAD) break; - cursor_down(&num, yank_flag); + num++; } if (num >= brdnum){ - cursor_set(&num, yank_flag, tmp); + num = tmp; } } head = (num / p_lines) * p_lines; @@ -963,23 +937,21 @@ choose_board(int newflag) case 'b': case Ctrl('B'): if (num) { - cursor_up_step(&num, yank_flag, p_lines); + num -= p_lines; break; } case KEY_END: case '$': - cursor_set(&num, yank_flag, brdnum - 1); + num = brdnum - 1; break; case ' ': case KEY_PGDN: case 'N': case Ctrl('F'): - if (num == brdnum - 1){ - cursor_set(&num, yank_flag, 0); - } - else{ - cursor_down_step(&num, yank_flag, p_lines); - } + if (num == brdnum - 1) + num = 0; + else + num += p_lines; break; case Ctrl('C'): cal(); @@ -992,25 +964,25 @@ choose_board(int newflag) case KEY_UP: case 'p': case 'k': - cursor_up(&num, yank_flag); - if (num < 0) - cursor_set(&num, yank_flag, brdnum - 1); + if (num-- <= 0) + num = brdnum - 1; break; case 't': ptr = &nbrd[num]; - if (yank_flag == 0 && get_data_number(get_current_fav()) > 0) - fav_tag_current(2); + //////// + if (yank_flag == 0) { + fav_tag(nbrd[num].bid, get_fav_type(ptr), 2); + } ptr->myattr ^= BRD_TAG; head = 9999; case KEY_DOWN: case 'n': case 'j': - cursor_down(&num, yank_flag); - if (num < brdnum) + if (++num < brdnum) break; case '0': case KEY_HOME: - cursor_set(&num, yank_flag, 0); + num = 0; break; case '1': case '2': @@ -1022,7 +994,7 @@ choose_board(int newflag) case '8': case '9': if ((tmp = search_num(ch, brdnum)) >= 0){ - cursor_set(&num, yank_flag, tmp); + num = tmp; } brdlist_foot(); break; @@ -1116,30 +1088,25 @@ choose_board(int newflag) break; case 'm': if (HAS_PERM(PERM_BASIC)) { + ptr = &nbrd[num]; if (yank_flag == 0) { if (num > brdnum) break; - if (nbrd[num].myattr & BRD_FAV && getans("你確定刪除嗎? [N/y]") == 'y'){ - fav_remove_current(); - - /* nessesery ? */ - if (get_current_fav_level() == 1 && - get_data_number(get_current_fav()) == 0) - ch = 'q'; - - nbrd[num].myattr &= ~BRD_FAV; + if (ptr->myattr & BRD_FAV && getans("你確定刪除嗎? [N/y]") == 'y'){ + fav_remove_item(ptr->bid, get_fav_type(ptr)); + ptr->myattr &= ~BRD_FAV; } } - else{ - if (nbrd[num].myattr & BRD_FAV){ - fav_remove_current(); - nbrd[num].myattr &= ~BRD_FAV; + else { + if (getboard(ptr->bid) != NULL) { + fav_remove_item(ptr->bid, FAVT_BOARD); + ptr->myattr &= ~BRD_FAV; } - else{ - if (fav_add_board(nbrd[num].bid) == NULL) + else { + if (fav_add_board(ptr->bid) == NULL) vmsg("你的最愛太多了啦 真花心"); else - nbrd[num].myattr |= BRD_FAV; + ptr->myattr |= BRD_FAV; } } brdnum = -1; @@ -1175,11 +1142,9 @@ choose_board(int newflag) } break; case 'T': - if (HAS_PERM(PERM_BASIC)) { + if (HAS_PERM(PERM_BASIC) && nbrd[num].myattr & BRD_FOLDER) { char title[64]; - fav_type_t *ft = get_current_entry(); - if (get_item_type(ft) != FAVT_FOLDER) - break; + fav_type_t *ft = getfolder(nbrd[num].bid); strlcpy(title, get_item_title(ft), sizeof(title)); getdata_buf(b_lines - 1, 0, "請輸入檔名:", title, sizeof(title), DOECHO); fav_set_folder_title(ft, title); @@ -1225,6 +1190,15 @@ choose_board(int newflag) case 'z': //vmsg("嘿嘿 這個功\能已經被我的最愛取代掉了喔!"); break; +#ifdef DEBUG + case 'A': + if (1) { + char genbuf[200]; + sprintf(genbuf, "brdnum: %d num: %d", brdnum, num); + vmsg(genbuf); + } + break; +#endif case 'Z': if (!HAS_PERM(PERM_BASIC)) break; @@ -1280,7 +1254,7 @@ choose_board(int newflag) show_brdlist(head, 1, newflag); break; } - cursor_set(&num, yank_flag, tmp); + num = tmp; break; case 'E': if (HAS_PERM(PERM_SYSOP) || (currmode & MODE_MENU)) { @@ -1313,16 +1287,7 @@ choose_board(int newflag) brdnum = -1; } break; -#ifdef DEBUG - case 'A': { - char buf[128]; - fav_type_t *ft = get_current_entry(); - fav_t *fp = get_current_fav(); - sprintf(buf, "d: %d b: %d f: %d bn: %d num: %d t: %d, id: %d", fp->DataTail, fp->nBoards, fp->nFolders, brdnum, num, ft->type, fav_getid(ft)); - vmsg(buf); - } - break; -#endif + case KEY_RIGHT: case '\n': case '\r': @@ -1335,10 +1300,10 @@ choose_board(int newflag) break; else if (ptr->myattr & BRD_FOLDER){ int t = num; - fav_folder_in(); + fav_folder_in(ptr->bid); choose_board(0); fav_folder_out(); - cursor_set(&num, yank_flag, t); + num = t; brdnum = -1; head = 9999; break; @@ -1375,7 +1340,7 @@ choose_board(int newflag) bidtmp = class_bid; currmodetmp = currmode; tmp1 = num; - cursor_set(&num, yank_flag, 0); + num = 0; if (!(B_BH(ptr)->brdattr & BRD_TOP)) class_bid = ptr->bid; else @@ -1401,7 +1366,7 @@ choose_board(int newflag) else choose_board(0); currmode = currmodetmp; /* 離開板板後就把權限拿掉喔 */ - cursor_set(&num, yank_flag, tmp1); + num = tmp1; class_bid = bidtmp; setutmpbid(tmp); brdnum = -1; diff --git a/pttbbs/mbbsd/fav.c b/pttbbs/mbbsd/fav.c index 69f61d06..dd70ce62 100644 --- a/pttbbs/mbbsd/fav.c +++ b/pttbbs/mbbsd/fav.c @@ -11,9 +11,6 @@ static int fav_number; static int fav_stack_num = 0; static fav_t *fav_stack[FAV_MAXDEPTH] = {0}; -/* current fav_type_t placement */ -static int fav_place; - /* fav_tmp is for recordinge while copying, moving, etc. */ static fav_t *fav_tmp; //static int fav_tmp_snum; /* the sequence number in favh in fav_t */ @@ -41,7 +38,6 @@ inline int get_current_fav_level(void){ return fav_stack_num; } -/* "current" means what at the position of the cursor */ inline fav_t *get_current_fav(void){ if (fav_stack_num == 0) return NULL; @@ -56,13 +52,6 @@ inline int get_item_type(fav_type_t *ft){ return ft->type; } -inline fav_type_t *get_current_entry(void){ - fav_t *fp = fav_stack[fav_stack_num - 1]; - if (get_data_number(fp) <= 0) - return NULL; - return &fp->favh[fav_place]; -} - inline void fav_set_tmp_folder(fav_t *fp){ fav_tmp = fp; } @@ -118,7 +107,7 @@ inline static int get_line_num(fav_t *fp) { /* bool: * 0: unset 1: set 2: opposite */ -inline void set_attr(fav_type_t *ft, int bit, int bool){ +void set_attr(fav_type_t *ft, int bit, char bool){ if (bool == 2) bool = !(ft->attr & bit); if (bool) @@ -127,7 +116,7 @@ inline void set_attr(fav_type_t *ft, int bit, int bool){ ft->attr &= ~bit; } -inline int is_set_attr(fav_type_t *ft, int bit){ +int is_set_attr(fav_type_t *ft, char bit){ return ft->attr & bit; } /* --- */ @@ -214,7 +203,7 @@ inline static fav_t *get_fav_root(void){ return fav_stack[0]; } -/* cursor never on an unvisable entry */ +/* is it an unvisable entry */ inline int is_visible_item(fav_type_t *ft){ if (!(ft->attr & FAVH_FAV)) return 0; @@ -321,7 +310,6 @@ inline static int fav_stack_push_fav(fav_t *fp){ if (fav_stack_full()) return -1; fav_stack[fav_stack_num++] = fp; - fav_place = 0; return 0; } @@ -335,9 +323,9 @@ inline static void fav_stack_pop(void){ fav_stack[--fav_stack_num] = NULL; } -void fav_folder_in(void) +void fav_folder_in(short fid) { - fav_type_t *tmp = get_current_entry(); + fav_type_t *tmp = getfolder(fid); if (get_item_type(tmp) == FAVT_FOLDER){ fav_stack_push(tmp); } @@ -348,63 +336,6 @@ void fav_folder_out(void) fav_stack_pop(); } -void fav_cursor_up(void) -{ - fav_t *ft = get_current_fav(); - if (get_data_number(ft) <= 0) - return; - do{ - if (fav_place == 0) - fav_place = ft->DataTail - 1; - else - fav_place--; - }while(!is_visible_item(&ft->favh[fav_place])); -} - -void fav_cursor_down(void) -{ - fav_t *ft = get_current_fav(); - if (get_data_number(ft) <= 0) - return; - do{ - if (fav_place == ft->DataTail - 1) - fav_place = 0; - else - fav_place++; - }while(!is_visible_item(&ft->favh[fav_place])); -} - -void fav_cursor_up_step(short int step) -{ - int i; - for(i = 0; i < step; i++){ - if (fav_place <= 0) - break; - fav_cursor_up(); - } -} - -void fav_cursor_down_step(short int step) -{ - int i; - for(i = 0; i < step; i++){ - if (fav_place >= get_current_fav()->DataTail - 1) - break; - fav_cursor_down(); - } -} - -/* from up to down */ -void fav_cursor_set(short int where) -{ - fav_type_t *ft = get_current_entry(); - fav_place = 0; - if (ft == NULL || ft->fp == NULL) - return; - while(!is_visible_item(get_current_entry())) - fav_cursor_down(); - fav_cursor_down_step(where); -} /* --- */ /* load from the rec file */ @@ -555,11 +486,6 @@ void fav_free(void) } /* --- */ -void fav_remove_current(void) -{ - fav_remove(get_current_fav(), get_current_entry()); -} - static fav_type_t *get_fav_item(short id, int type) { int i; @@ -576,11 +502,21 @@ static fav_type_t *get_fav_item(short id, int type) return NULL; } +void fav_remove_item(short id, char type) +{ + fav_remove(get_current_fav(), get_fav_item(id, type)); +} + fav_type_t *getboard(short bid) { return get_fav_item(bid, FAVT_BOARD); } +fav_type_t *getfolder(short fid) +{ + return get_fav_item(fid, FAVT_FOLDER); +} + char *get_folder_title(int fid) { return get_item_title(get_fav_item(fid, FAVT_FOLDER)); @@ -659,14 +595,14 @@ static void move_in_folder(fav_t *fav, int from, int to) fav_type_t tmp; /* Find real locations of from and to in fav->favh[] */ - for(count = i = 0; count < from; i++) + for(count = i = 0; count <= from; i++) if (is_visible_item(&fav->favh[i])) count++; - from = i; - for(count = i = 0; count < to; i++) + from = i - 1; + for(count = i = 0; count <= to; i++) if (is_visible_item(&fav->favh[i])) count++; - to = i; + to = i - 1; fav_item_copy(&tmp, &fav->favh[from]); @@ -747,8 +683,9 @@ fav_type_t *fav_add_board(int bid) /* everything about the tag in fav mode. * I think we don't have to implement the function 'cross-folder' tag.*/ -inline void fav_tag_current(int bool) { - set_attr(get_current_entry(), FAVH_TAG, bool); + +void fav_tag(short id, char type, char bool) { + set_attr(get_fav_item(id, type), FAVH_TAG, bool); } static void fav_dosomething_tagged_item(fav_t *fp, int (*act)(fav_t *, fav_type_t *)) @@ -761,8 +698,19 @@ static void fav_dosomething_tagged_item(fav_t *fp, int (*act)(fav_t *, fav_type_ } } +static int remove_tagged_item(fav_t *fp, fav_type_t *ft) +{ + int i; + for(i = 0; i < FAV_MAXDEPTH && fav_stack[i] != NULL; i++) + if (fav_stack[i] == get_fav_folder(ft)){ + set_attr(ft, FAVH_TAG, FALSE); + return 0; + } + return fav_remove(fp, ft); +} + inline static int fav_remove_tagged_item(fav_t *fp){ - fav_dosomething_tagged_item(fp, fav_remove); + fav_dosomething_tagged_item(fp, remove_tagged_item); return 0; } |