📄 badctrls.c
字号:
RETVIEW(o, event);
/* check if we're clicked by the mouse */
if (event->type & EV_MOUSE && OBJECT(mouse)->state & MO_SF_MOUSELDOWN)
{
l_int tab_h = 21;
l_int x;
l_int old_active = BAD_TABBOOK(o)->active;
x = r.a.x+p.x+1;
for (i=0;i<BAD_TABBOOK(o)->tabs;i++) {
l_int tab_width = FONT_GETSTRWIDTH(VIEW(o)->font, BAD_TABBOOK(o)->title[i], -1)+10;
l_int y1 = r.a.y+p.y+1;
t_rect rr;
if (i == BAD_TABBOOK(o)->active) y1--;
rr = rect_assign(x, y1, x+tab_width, r.a.y+p.y+tab_h);
if (mouse->where.x >= rr.a.x && mouse->where.x <= rr.b.x && mouse->where.y >= rr.a.y && mouse->where.y <= rr.b.y ) {
// BAD_TABBOOK(o)->active = i;
if (i != old_active) {
BAD_TABBOOK(o)->select_tab(BAD_TABBOOK(o), i);
};
while (OBJECT(mouse)->state & MO_SF_MOUSELPRESS)
{
o->get_event(o, event);
};
break;
};
x += tab_width+3;
};
};
if (event->type != EV_NOTHING)
for (i=0;i<BAD_TABBOOK(o)->tabs;i++)
OBJECT(BAD_TABBOOK(o)->tab[i])->translate_event(OBJECT(BAD_TABBOOK(o)->tab[i]), event);
};
void bad_tabbook_tab_translate_event(p_object o, t_event *event)
{
p_object oo, f = o->first_view(o);
view_translate_event(o, event);
if (VIEW(o) != BAD_TABBOOK(o->owner->owner)->tab[BAD_TABBOOK(o->owner->owner)->active]) return;
oo = f;
do {
if (oo != o) oo->translate_event(oo, event);
oo = oo->next_view(oo);
} while (oo != f);
};
void bad_tabbook_draw_tab(p_view o)
{
t_rect r = VIEW(o)->get_local_extent(VIEW(o));
t_point p;
BITMAP *out = o->begin_paint(o, &p, r);
if ( out ) {
rectfill(out, r.a.x+p.x, r.a.y+p.y, r.b.x+p.x, r.b.y+p.y, o->get_color(o, 0));
};
o->end_of_paint(o, r);
};
void bad_tabbook_draw(p_view o)
{
t_rect r = VIEW(o)->get_local_extent(VIEW(o));
t_point p;
BITMAP *out = VIEW(o)->begin_paint(VIEW(o), &p, r);
if ( out ) {
l_int tab_h = 21;
l_int i,x;
rectfill(out, r.a.x+p.x, r.a.y+p.y, r.b.x+p.x, r.a.x+p.y+tab_h, VIEW(o)->get_color(VIEW(o), 0));
draw_bevel(out, r.a.x+p.x, r.a.y+p.y+tab_h, r.b.x+p.x-1, r.b.y+p.y-1, VIEW(o)->get_color(VIEW(o), 1), VIEW(o)->get_color(VIEW(o), 2));
draw_bevel(out, r.a.x+p.x, r.a.y+p.y+tab_h, r.b.x+p.x, r.b.y+p.y, VIEW(o)->get_color(VIEW(o), 1), VIEW(o)->get_color(VIEW(o), 3));
x = r.a.x+p.x+1;
for (i=0;i<BAD_TABBOOK(o)->tabs;i++) {
l_int tab_width = FONT_GETSTRWIDTH(VIEW(o)->font, BAD_TABBOOK(o)->title[i], -1)+10;
l_int y1 = r.a.y+p.y+1;
l_int xx = 0;
if (i == BAD_TABBOOK(o)->active) {
y1--;
xx = 1;
};
line(out, x-xx, y1+1, x-xx, r.a.y+p.y+tab_h-1, VIEW(o)->get_color(VIEW(o), 1));
line(out, x-xx+1, y1, x+tab_width+xx-1, y1, VIEW(o)->get_color(VIEW(o), 1));
line(out, x+tab_width+xx-1, y1+1, x+xx+tab_width-1, r.a.y+p.y+tab_h-1, VIEW(o)->get_color(VIEW(o), 2));
line(out, x+tab_width+xx, y1+1, x+tab_width+xx, r.a.y+p.y+tab_h-1, VIEW(o)->get_color(VIEW(o), 3));
if (i == BAD_TABBOOK(o)->active) {
textout_draw_rect(out, VIEW(o)->font, BAD_TABBOOK(o)->title[i], -1, x+2, r.a.y+p.y, x+tab_width-2, r.a.y+p.y+tab_h-2, TX_ALIGN_CENTER, VIEW(o)->get_color(VIEW(o), 5), TX_NOCOLOR, 0);
line(out, x-xx+1, r.a.y+p.y+tab_h, x+tab_width+xx-1, r.a.y+p.y+tab_h, VIEW(o)->get_color(VIEW(o), 0));
} else {
light_image(out, x-xx+2, y1+1, x+tab_width+xx-1, r.a.y+p.y+tab_h-1, -10, -10, -10);
textout_draw_rect(out, VIEW(o)->font, BAD_TABBOOK(o)->title[i], -1, x+2, r.a.y+p.y+1, x+tab_width-2, r.a.y+p.y+tab_h-1, TX_ALIGN_CENTER, VIEW(o)->get_color(VIEW(o), 5), TX_NOCOLOR, 0);
};
x += tab_width+3;
};
};
VIEW(o)->end_of_paint(VIEW(o), r);
};
void bad_tabbook_select_tab(p_bad_tabbook o, l_int newtab)
{
if (newtab != o->active) {
t_rect r = rect_assign(-5, -5, -4, -4);
BAD_TABBOOK(o)->tab[o->active]->change_bounds(BAD_TABBOOK(o)->tab[o->active], r);
o->active = newtab;
VIEW(o)->draw_view(VIEW(o));
r = VIEW(o)->bounds;
r = rect_assign(1, 22, rect_sizex(r)-2, rect_sizey(r)-2);
BAD_TABBOOK(o)->tab[o->active]->change_bounds(BAD_TABBOOK(o)->tab[o->active], r);
// BAD_TABBOOK(o)->tab[newtab]->show(BAD_TABBOOK(o)->tab[newtab]);
if (o->on_changed) o->on_changed(o, o->active);
};
};
void bad_tabbook_add_tab(p_bad_tabbook o, l_text title)
{
t_rect r = VIEW(o)->bounds;
if (o->tabs == 64) return;
// r = rect_assign(1, 22, rect_sizex(r)-2, rect_sizey(r)-2);
r = rect_assign(-5, -5, -4, -4);
o->title[o->tabs] = strdup(title);
o->tab[o->tabs] = view_init(malloc(sizeof(t_view)), r);
o->tab[o->tabs]->set_palette(o->tab[o->tabs], pal_bad_common);
o->tab[o->tabs]->draw = &bad_tabbook_draw_tab;
OBJECT(o->tab[o->tabs])->translate_event = &bad_tabbook_tab_translate_event;
// VIEW(o->tab[o->tabs])->hide(VIEW(o->tab[o->tabs]));
OBJECT(o)->insert(OBJECT(o), OBJECT(o->tab[o->tabs]));
o->tabs++;
VIEW(o)->draw_view(VIEW(o));
VIEW(o->tab[o->active])->draw_view(VIEW(o->tab[o->active]));
};
void bad_tabbook_remove_tab(p_bad_tabbook o, l_int tab)
{
// do nothing
};
p_bad_tabbook _bad_tabbook_init(p_bad_tabbook o, t_rect r, l_text ftitle)
{
t_rect rr;
if (!o) return NULL;
clear_type(o, sizeof(t_bad_tabbook));
view_init(&o->obclass, r);
rr = rect_assign(1, 22, rect_sizex(r)-2, rect_sizey(r)-2);
o->title[0] = strdup(ftitle);
o->tab[0] = view_init(malloc(sizeof(t_view)), rr);
o->active = 0;
o->tabs = 1;
o->tab[0]->set_palette(o->tab[0], pal_bad_common);
o->tab[0]->draw = &bad_tabbook_draw_tab;
OBJECT(o->tab[0])->translate_event = &bad_tabbook_tab_translate_event;
OBJECT(o)->insert(OBJECT(o), OBJECT(o->tab[0]));
OBJECT(o)->translate_event = &bad_tabbook_translate_event;
OBJECT(o)->set_state = &bad_tabbook_set_state;
VIEW(o)->draw = &bad_tabbook_draw;
VIEW(o)->set_palette(VIEW(o), pal_bad_common);
o->select_tab = &bad_tabbook_select_tab;
o->add_tab = &bad_tabbook_add_tab;
o->on_changed = NULL;
return o;
};
/* t_bad_iconbox */
void bad_iconbox_draw_icon(p_bad_iconbox o, BITMAP *out, t_point p, t_point xy, l_int item)
{
p_bad_iconbox_item i = o->icons->at(o->icons, item);
l_color c = VIEW(o)->get_color(VIEW(o), 10);
l_color b = TX_NOCOLOR;
l_int w, h;
if (i)
{
if (i->selected)
{
c = VIEW(o)->get_color(VIEW(o), 9);
b = VIEW(o)->get_color(VIEW(o), 8);
};
stretch_sprite(out, i->icon, xy.x+p.x, xy.y+p.y, 32, 32);
get_size_of_ftext(i->caption, VIEW(o)->font, &w, &h);
textout_draw_rect(out, VIEW(o)->font, i->caption, -1, xy.x+p.x+16-w/2, xy.y+p.y+38, xy.x+p.x+16+w/2, xy.y+p.y+38+h, TX_ALIGN_CENTER, c, b, 1);
};
}
void bad_iconbox_draw(p_view o)
{
p_bad_iconbox ib = ((p_bad_iconbox)(o));
l_int i, x = ib->spacing.x/2, y = ib->spacing.y/2;
t_rect r = o->get_local_extent(o);
t_point p;
BITMAP *out = o->begin_paint(VIEW(o), &p, r);
if (out) {
if (ib->flags & BIB_3D_BORDER) {
x += 2;
y += 2;
};
if (ib->scr) y -= ib->scr->pos;
if (ib->flags & BIB_BACKGROUND_IMAGE) {
if (ib->flags & BIB_DESKTOP_PLACEMENT)
stretch_sprite(out, o->brush.background, 0, 0, desktop->bounds.b.x, desktop->bounds.b.y);
else
stretch_sprite(out, o->brush.background, r.a.x+p.x, r.a.y+p.y, r.b.x+p.x, r.b.y+p.y);
} else
fade_rect(out, r.a.x+p.x, r.a.y+p.y, r.b.x+p.x, r.b.y+p.y, o->brush.color, o->brush.color2, FR_VER);
if (ib->count > 0) {
l_int rectsizey = rect_sizey(r);
for (i=0;i<ib->count;i++) {
if (y > -38-ib->spacing.y)
bad_iconbox_draw_icon(ib, out, p, point_assign(x, y), i);
if (ib->flags & BIB_PLACE_HORIZONTAL)
{
x += 38+ib->spacing.x;
if (x+ib->spacing.x+32 > rect_sizex(r)) {
y += 38+ib->spacing.y;
x = ib->spacing.x/2;
};
} else {
y += 38+ib->spacing.y;
if (y+ib->spacing.y+32 > rect_sizey(r)) {
x += 38+ib->spacing.x;
y = ib->spacing.y/2;
};
};
if (y > rectsizey) break;
};
};
if (ib->selection.a.x > -1) {
draw_bevel(out, ib->selection.a.x, ib->selection.a.y, ib->selection.b.x, ib->selection.b.y, o->get_color(o, 0), o->get_color(o, 2));
draw_bevel(out, ib->selection.a.x+1, ib->selection.a.y+1, ib->selection.b.x-1, ib->selection.b.y-1, o->get_color(o, 0), o->get_color(o, 2));
light_image(out, ib->selection.a.x+2, ib->selection.a.y+2, ib->selection.b.x-2, ib->selection.b.y-2, -25, -25, -25);
};
if (ib->flags & BIB_3D_BORDER) {
draw_bevel(out, r.a.x+p.x, r.a.y+p.y, r.b.x+p.x, r.b.y+p.y, o->get_color(o, 2), o->get_color(o, 1));
draw_bevel(out, r.a.x+p.x+1, r.a.y+p.y+1, r.b.x+p.x-1, r.b.y+p.y-1, o->get_color(o, 3), o->get_color(o, 0));
};
};
r.b.x += 15;
o->draw_sub_views(o, VIEW(OBJECT(o)->first_view(OBJECT(o))), VIEW(OBJECT(o)->first_view(OBJECT(o))));
o->end_of_paint(o, r);
};
t_point bad_iconbox_icon_position(p_bad_iconbox o, l_int item)
{
l_int x = o->spacing.x/2, y = o->spacing.y/2, i;
t_rect r = VIEW(o)->get_local_extent(VIEW(o));
if (o->flags & BIB_3D_BORDER) {
x += 2;
y += 2;
};
if (o->scr) y -= o->scr->pos;
for (i=item;i;i--)
if (o->flags & BIB_PLACE_HORIZONTAL)
{
x += 38+o->spacing.x;
if (x+o->spacing.x+32 > rect_sizex(r)) {
y += 38+o->spacing.y;
x = o->spacing.x/2;
};
} else {
y += 38+o->spacing.y;
if (y+o->spacing.y+32 > rect_sizey(r)) {
x += 38+o->spacing.x;
y = o->spacing.y/2;
};
};
return point_assign(x, y);
}
l_bool bad_iconbox_mouse_under_icon_at(p_bad_iconbox o, l_int item)
{
t_point p = VIEW(o)->get_global_point(VIEW(o), point_assign(0, 0));
t_point ip = bad_iconbox_icon_position(o, item);
return (mouse->where.x >= ip.x+p.x && mouse->where.x <= ip.x+p.x+31 && mouse->where.y >= ip.y+p.y && mouse->where.y <= ip.y+p.y+31);
}
void bad_iconbox_add(p_bad_iconbox o, BITMAP *icon, l_text caption)
{
p_bad_iconbox_item i = (t_bad_iconbox_item *) malloc(sizeof(t_bad_iconbox_item));
t_point p = bad_iconbox_icon_position(o, o->count);
i->icon = create_bitmap(icon->w, icon->h);
blit(icon, i->icon, 0, 0, 0, 0, icon->w, icon->h);
i->caption = strdup(caption);
i->selected = FALSE;
o->icons->insert(o->icons, i);
if (o->scr) o->scr->change_max(o->scr, p.y+o->scr->pos);
o->count += 1;
if (p.y < -38+o->spacing.y || p.y > VIEW(o)->bounds.b.y-VIEW(o)->bounds.a.y)
VIEW(o->scr)->draw_view(VIEW(o->scr));
else
VIEW(o)->draw_view(VIEW(o));
};
void bad_iconbox_clear(p_bad_iconbox o)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -