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

📄 badctrls.c

📁 SEAL是DOS 下的32位保护模式的GUI程序
💻 C
📖 第 1 页 / 共 4 页
字号:
  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 + -