summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvictor <victor@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2003-11-11 11:29:14 +0800
committervictor <victor@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2003-11-11 11:29:14 +0800
commit5f6261706d4b524d96a1ded5af5446c3ca939d84 (patch)
treecfce92569127c1b80d465f1258775a8cf0d5e747
parent6ba09f9658c7f877214fd3a0448282dcfdb52bbd (diff)
downloadpttbbs-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.h18
-rw-r--r--pttbbs/mbbsd/board.c157
-rw-r--r--pttbbs/mbbsd/fav.c120
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;
}