⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sbox.c

📁 API
💻 C
字号:
#include <stdio.h>
#include <curses.h>
#include <stdlib.h>
#include "tool.h"

#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#define MIN(a, b) (((a) < (b)) ? (a) : (b))

struct _item {
    char flag;
    char *item;
};

struct _bar {
    struct _item *items;
    int itemnum;
    int curno;
    int begno;
};

struct _sbox {
    char *title;
    int x;
    int y;
    int width;
    int height;
    struct _bar *bars;
    int barnum;
    int curno;
} sbox;

int createsbox(height, width, y, x, barnum, title)
    int height;
    int width;
    int y;
    int x;
    int barnum;
    char *title;
{
    int i;

    sbox.title = (char *)malloc(strlen(title) + 1);
    if (!sbox.title) return(-1);
    strcpy(sbox.title, title);

    sbox.barnum = barnum;
    sbox.curno = 0;
    sbox.bars = (struct _bar *)malloc(barnum * sizeof(struct _bar));
    if (!sbox.bars) return(-1);
    for (i = 0; i < barnum; i++) {
	sbox.bars[i].items = NULL;
	sbox.bars[i].itemnum = sbox.bars[i].curno = sbox.bars[i].begno = 0;
    }

    sbox.height = height;
    sbox.width = width;
    sbox.y = y;
    sbox.x = x;

    return(0);
}

int additem(int bar, char *item, char flag)
{
    struct _bar *tmp_bars;
    struct _item *tmp_items;

    if (bar > sbox.barnum - 1) return(-1);

    tmp_bars = sbox.bars + bar;
    tmp_items = (struct _item *)realloc((void *)tmp_bars->items,
		(tmp_bars->itemnum + 1) * sizeof(struct _item));
    if (!tmp_items) return(-1);
    tmp_bars->items = tmp_items;
    tmp_items = tmp_bars->items + tmp_bars->itemnum;
    tmp_items->item = (char *)malloc(strlen(item) + 1);
    if (!tmp_items->item) return(-1);
    strcpy(tmp_items->item, item);
    tmp_items->flag = flag;
    tmp_bars->itemnum += 1;

    return(0);
}

int setitemflag(int bar, int itemno, char flag)
{
    struct _bar *tmp_bars;

    if (bar > sbox.barnum - 1) return(-1);
    tmp_bars = sbox.bars + bar;
    if (itemno > tmp_bars->itemnum - 1) return(-1);
    tmp_bars->items[itemno].flag = flag;

    return(0);
}

int getitemflag(int bar, int itemno, char* pflag)
{
    struct _bar *tmp_bars;

    if (bar > sbox.barnum - 1) return(-1);
    tmp_bars = sbox.bars + bar;
    if (itemno > tmp_bars->itemnum - 1) return(-1);
    *pflag = tmp_bars->items[itemno].flag;

    return(0);
}

void dispitem(win, bar, itemno)
    WINDOW *win;
    int bar;
    int itemno;
{
    char prompt[81], tmp[3];
    int width, x, y, flag;

    if (bar > sbox.barnum - 1) return;

    width = (sbox.width - 4) / sbox.barnum;
    x = 3 + width * bar;
    y = 3 + itemno - sbox.bars[bar].begno;
    if (itemno > sbox.bars[bar].itemnum - 1) {
	sprintf(prompt, "%-*.*s", width - 2, width - 2, "");
	flag = 0;
    } else {
	if (sbox.bars[bar].items[itemno].flag) strcpy(tmp, "√ ");
	else strcpy(tmp, "   ");
	sprintf(prompt, "%s%-*.*s", tmp, width - 5, width - 5,
		sbox.bars[bar].items[itemno].item);
	if (bar == sbox.curno) flag = (itemno == sbox.bars[bar].curno) ? 1 : 0;
	else flag = 0;
    }
    h_winprompt(win, y, x, prompt, 0, flag);
}

void dispprompt(win, y, title)
    WINDOW *win;
    int y;
    char *title;
{
    char prompt[81];

    sprintf(prompt, "%*s%s", (sbox.width - 4 - strlen(title)) / 2, "", title);
    sprintf(prompt, "%-*s", sbox.width - 4, prompt);
    h_winprompt(win, y, 2, prompt, 0, 0);
}

int dispsbox()
{
    WINDOW *sbox_win;
    char filename[128], *flagbak = NULL;
    int ch, i, j, k;
    int toggle, curbar, barbak, curitem, itembak;

    sprintf(filename, "/tmp/.sbox.%d", getpid());
    scr_dump(filename);

    sbox_win = newwin(sbox.height, sbox.width, sbox.y, sbox.x);
    wrefresh(sbox_win);

    if (sbox.title[0]) {
//	Box2(sbox_win, sbox.height, sbox.width);
	dispprompt(sbox_win, 1, sbox.title);
//	dispprompt(sbox_win, sbox.height - 2, "切换: Space  取消: ESC  确认: Enter");
    }

    k = 0;
    for (i = 0; i < sbox.barnum; i++)
	for (j = 0; j < sbox.bars[i].itemnum; j++) {
	    flagbak = (char *)realloc(flagbak, k + 1);
	    if (!flagbak) {
		delwin(sbox_win);
		scr_restore(filename);
		unlink(filename);
		return(-1);
	    }
	    flagbak[k++] = sbox.bars[i].items[j].flag;
	    if (j > sbox.height - 7) continue;
	    dispitem(sbox_win, i, j);
	}
    toggle = curbar = barbak = curitem = itembak = 0;
    while (1) {
	switch (ch = getkey(sbox_win)) {
	    case UP:
		if (curitem == 0) {
		    beep();
		    continue;
		} else
		    curitem--;
		break;
	    case DOWN:
		if (curitem == sbox.bars[curbar].itemnum - 1) {
		    beep();
		    continue;
		} else
		    curitem++;
		break;
	    case LEFT:
		if (sbox.barnum == 1) {
		    beep();
		    continue;
		}
		if (curbar == 0) curbar = sbox.barnum - 1;
		else curbar--;
		break;
	    case RIGHT:
		if (sbox.barnum == 1) {
		    beep();
		    continue;
		}
		curbar = (curbar + 1) % sbox.barnum;
		break;
	    case SPACE:
		toggle = 1;
		break;
	    case ESCAPE:
		k = 0;
		for (i = 0; i < sbox.barnum; i++)
		    for (j = 0; j < sbox.bars[i].itemnum; j++)
			sbox.bars[i].items[j].flag = flagbak[k++];
		break;
	    case ENTER:
		free((void *)flagbak);
		break;
	    default:
		beep();
		continue;
		break;
	}
	if ((ch == ESCAPE) || (ch == ENTER)) break;
	if (toggle) {
	    sbox.bars[curbar].items[curitem].flag =
		!sbox.bars[curbar].items[curitem].flag;
	    dispitem(sbox_win, curbar, curitem);
	    toggle = 0;
	    continue;
	}
	if (curbar != barbak) {
	    sbox.curno = curbar;
	    dispitem(sbox_win, barbak, curitem);
	    i = curitem - sbox.bars[barbak].begno + sbox.bars[curbar].begno;
	    if (i > sbox.bars[curbar].itemnum - 1)
		i = sbox.bars[curbar].itemnum - 1;
	    sbox.bars[curbar].curno = i;
	    dispitem(sbox_win, curbar, i);
	    curitem = i;
	    barbak = curbar;
	    itembak = curitem;
	    continue;
	}
	sbox.bars[curbar].curno = curitem;
	if ((curitem <= sbox.bars[curbar].begno + sbox.height - 7) &&
	(sbox.bars[curbar].begno <= curitem)) {
	    dispitem(sbox_win, curbar, itembak);
	    dispitem(sbox_win, curbar, curitem);
	    itembak = curitem;
	    continue;
	}
	if (curitem < sbox.bars[curbar].begno)
	    sbox.bars[curbar].begno -= 1;
	else
	    sbox.bars[curbar].begno += 1;
	for (i = 0; i < sbox.height - 6; i++)
	    dispitem(sbox_win, curbar, sbox.bars[curbar].begno + i);
	itembak = curitem;
    }

    delwin(sbox_win);
    scr_restore(filename);
    unlink(filename);
    return((ch == ENTER) ? 0 : -1);
}

int freesbox()
{
    int i, j;

    for (i = 0; i < sbox.barnum; i++) {
	for (j = 0; j < sbox.bars[i].itemnum; j++)
	    free((void *)sbox.bars[i].items[j].item);
	free((void *)sbox.bars[i].items);
    }
    free((void *)sbox.bars);

    return(0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -