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

📄 button.c

📁 SEAL是DOS 下的32位保护模式的GUI程序
💻 C
字号:
/******************************************************************
 * SEAL 2.0                                                       *
 * Copyright (c) 1999-2002 SEAL Developers. All Rights Reserved.  *
 *                                                                *
 * Web site: http://sealsystem.sourceforge.net/                   *
 * E-mail (current maintainer): orudge@users.sourceforge.net      *
 ******************************************************************/

/*
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

/* Revision History (as of 02/04/2002):
 *
 * 02/04/2002: Made icon control work properly with skins (orudge)
 */

#include <seal.h>
#include <button.h>


p_button    (*button_init) ( p_button o, t_rect r, l_text caption, l_dword message, l_int flags ) = &_button_init;
p_icon      (*icon_init) ( p_icon o, t_rect r, BITMAP *icon, l_dword message, l_int flags ) = &_icon_init;
p_icobutton (*icobutton_init) ( p_icobutton o, t_rect r, BITMAP *icon, l_text caption, l_dword message, l_int flags ) = &_icobutton_init;

p_skin skin_btnotov = NULL;
p_skin skin_btup   = NULL;
p_skin skin_btdown = NULL;



/* icon class */

l_bool  icon_done ( p_object o )
{
  if ( obj_exist(o) <= 0 ) return false;
  if ( ICON(o)->flags & IF_SELFIMAGE ) /* image of icon is internal */

      destroy_bitmap(ICON(o)->icon);

  ICON(o)->icon = NULL;
  return view_done(o);

};


void  icon_set_state ( p_object o, l_dword st, l_bool set )
{
  view_set_state(o, st, set);

  if ( st & OB_SF_FOCUSED ) {

    VIEW(o)->draw_view(VIEW(o));

  };
};


void icon_draw (p_view o)
{
   t_rect  r = o->get_local_extent(o);
   t_rect  safe = r;
   t_point p;

   BITMAP *out = o->begin_paint(o, &p, safe);

   if (out)
   {
      if (ICON(o)->icon)
      {
         if (ICON(o)->flags & IF_STRETCH)
            stretch_sprite(out, ICON(o)->icon, p.x, p.y, rect_sizex(r)+1, rect_sizey(r)+1);
         else
         { /* center icon */
            p_view  own = VIEW(OBJECT(o)->owner_view(OBJECT(o)));
            l_rect dx = (rect_sizex(r)-IMAGE_WIDTH(ICON(o)->icon))/2;
            l_rect dy = (rect_sizey(r)-IMAGE_HEIGHT(ICON(o)->icon))/2;

            if (!use_skins)
            {
               l_color color = own?own->brush.color:color_3d_face;

               rectfill(out, r.a.x+p.x, r.a.y+p.y, r.b.x+p.x, r.b.y+p.y, color);
            }

            draw_sprite(out, ICON(o)->icon, p.x+dx, p.y+dy);
         }
      }
      else
      {
         if (!use_skins)
            rectfill(out, r.a.x+p.x, r.a.y+p.y, r.b.x+p.x, r.b.y+p.y, color_3d_face);
      }
   }

   o->end_of_paint(o, safe);
}


void  icon_translate_event ( p_object o, t_event *event )
{
  RETVIEW(o, event);


  view_translate_event(o, event); /* old translate_event function */


  /* keyboard event */
  if ( event->type & EV_KEYBOARD && OBJECT(keyb)->state & KB_SF_KEYDOWN ) {


    if ( keyb->code == TO_KEY(KB_ENTER) )

        if ( o->is_state(o, OB_SF_FOCUSED) ) {

          set_event(event, EV_MESSAGE, ICON(o)->message, o);

          o->put_event(o, event);

          clear_event(event);
        };

  };


  /* mouse event */
  if ( event->type & EV_MOUSE ) {

     if ( OBJECT(mouse)->state & MO_SF_MOUSELDOWN ) {

        clear_event(event);

        o->select(o);

        if ( OBJECT(mouse)->state & MO_SF_MOUSEDOUBLE ) {

          set_event(event, EV_MESSAGE, BUTTON(o)->message, o);

          o->put_event(o, event);

          clear_event(event);

        };
     };

     if ( OBJECT(mouse)->state & MO_SF_MOUSELAUTO ) { /* dragging */

        VIEW(o)->drag_view(VIEW(o), DM_DRAGMOVE, event);
        clear_event(event);

     };

  };
};





/* button class */

l_bool  button_done ( p_object o )
{
  if ( !view_done(o) ) return false;

  afree(&(BUTTON(o)->caption));

  return true;

};


void  button_set_state ( p_object o, l_dword st, l_bool set )
{
  view_set_state(o, st, set);

  if ( st & OB_SF_FOCUSED ) {

    VIEW(o)->draw_view(VIEW(o));

  };
};


void  button_set_options ( p_object o, l_dword op, l_bool set )
{
  obj_set_options(o, op, set);

  if ( op & OB_OF_ENABLE ) {

    VIEW(o)->draw_view(VIEW(o));

  };

};


l_bool button_is_default ( p_button o )
{
  p_object p = OBJECT(o)->find_match_view ( OBJECT(o), OB_SF_FOCUSED, 0, false );

  /* selected is not button */
  if ( p && !(p->tag & TAG_BUTTON) && BUTTON(o)->flags & BF_DEFAULT )

    return true;

  else if ( OBJECT(o)->is_state(OBJECT(o), OB_SF_FOCUSED) )

          return true; /* selected is me */

  return false;
};

void  button_translate_event ( p_object o, t_event *event )
{
  //p43
  if ( VIEW(o)->is_mouse_in_view(VIEW(o)) && (BUTTON(o)->flags & BF_UNDERSEL) && !(BUTTON(o)->flags & BF_NOSEL)) {
    if ( desktop->get_top_view_under_mouse(desktop) == VIEW(o)) {
      if ( !(BUTTON(o)->flags & BF_OVER) && event->type & EV_MOUSE ) {
        BUTTON(o)->flags |= BF_OVER;
        BUTTON(o)->draw_state(BUTTON(o), 0);
      };
    } else if (BUTTON(o)->flags & BF_OVER) {
      BUTTON(o)->flags &= ~BF_OVER;
      BUTTON(o)->draw_state(BUTTON(o), 0);
    };
  } else {
    if (BUTTON(o)->flags & BF_OVER) {
      BUTTON(o)->flags &= ~BF_OVER;
      BUTTON(o)->draw_state(BUTTON(o), 0);
    }
  }

  RETVIEW(o, event);

  view_translate_event(o, event); /* old translate_event function */

  /* keyboard event */
  if ( event->type & EV_KEYBOARD && OBJECT(keyb)->state & KB_SF_KEYDOWN ) {

    if ( keyb->code == TO_KEY(KB_ENTER) )

        if ( BUTTON(o)->is_default(BUTTON(o)) ) {

          set_event(event, EV_MESSAGE, BUTTON(o)->message, o);

          o->put_event(o, event);

          clear_event(event);

        };

  };


  /* mouse event */

  if ( event->type & EV_MOUSE && OBJECT(mouse)->state & MO_SF_MOUSELDOWN ) {

      l_bool in_view = false;

//      o->select(o);

      while ( OBJECT(mouse)->state & MO_SF_MOUSELPRESS ) {

        l_bool safe_in_view = in_view;

        in_view = VIEW(o)->is_mouse_in_view(VIEW(o));

        if ( in_view != safe_in_view )

          BUTTON(o)->draw_state(BUTTON(o), in_view);

        o->get_event(o, event);

      };

      if ( in_view ) {

        if (BUTTON(o)->flags & BF_OVER) BUTTON(o)->flags &= ~BF_OVER;

        BUTTON(o)->draw_state(BUTTON(o), false);

        set_event(event, EV_MESSAGE, BUTTON(o)->message, o);

        o->put_event(o, event);

        clear_event(event);

      };
  };
};


void  button_draw_state ( p_button o, l_int press )
{
  t_rect  r = VIEW(o)->get_local_extent(VIEW(o));
  t_rect  safe = r;
  t_point p;

  BITMAP *out = VIEW(o)->begin_paint(VIEW(o), &p, safe);

  if ( out ) {
    if ( o->skin_btdown && o->skin_btup ) {
      p_skin act = press ? o->skin_btdown : o->skin_btup;

      if ( o->skin_btnotov && !press && o->flags & BF_UNDERSEL && !(o->flags & BF_OVER) ) act = o->skin_btnotov;

      draw_skin(out,act,rect_move(r,p.x,p.y),&r);

      textout_draw_rect(out, VIEW(o)->font, o->caption, -1, r.a.x, r.a.y,
                             r.b.x, r.b.y, TX_ALIGN_CENTER, act->text, TX_NOCOLOR, 0);

    } else {
	  l_bool idwn = (press == -1 && o->flags & BF_UNDERSEL) || press == 1;
      l_color fcolor = color_3d_text;

      if ( !OBJECT(o)->is_options(OBJECT(o), OB_OF_ENABLE) ) /* disable button */
        fcolor = color_3d_shadow;

      VIEW(o)->background(VIEW(o), out, rect_move(r, p.x, p.y));

      if ( OBJECT(o)->is_state(OBJECT(o), OB_SF_FOCUSED) ) {

        rect(out, r.a.x+p.x, r.a.y+p.y, r.b.x+p.x, r.b.y+p.y, color_3d_border);

        r = rect_assign(r.a.x+1, r.a.y+1, r.b.x-1, r.b.y-1);

      };

      textout_draw_rect(out, VIEW(o)->font, o->caption, -1, r.a.x+p.x+2+(idwn?1:0), r.a.y+p.y+2+(idwn?1:0),
                             r.b.x+p.x-2+(idwn?1:0), r.b.y+p.y-2+(idwn?1:0), TX_ALIGN_CENTER, fcolor, TX_NOCOLOR, 0);

      if ( !press ) {

        if ( o->flags & BF_DARROUND )
          button3d(VIEW(o), out, r.a.x+p.x, r.a.y+p.y, r.b.x+p.x, r.b.y+p.y, 0);

        else if ( !(o->flags & BF_PUSH) )
          if ( !(o->flags & BF_UNDERSEL) || o->flags & BF_OVER )
              button3d(VIEW(o), out, r.a.x+p.x, r.a.y+p.y, r.b.x+p.x, r.b.y+p.y, 0);

      } else if ( idwn )
          button3d(VIEW(o), out, r.a.x+p.x, r.a.y+p.y, r.b.x+p.x, r.b.y+p.y, 1);
    };
  };

  VIEW(o)->end_of_paint(VIEW(o), safe);

};


void  button_draw ( p_view o ) {
  BUTTON(o)->draw_state(BUTTON(o), false);
};

/* icobutton class */

l_bool  icobutton_done ( p_object o ) {
  if ( obj_exist(o) <= 0 ) return false;

  if ( BUTTON(o)->flags & IBF_SELFIMAGE )

      destroy_bitmap(ICOBUTTON(o)->icon);

  ICOBUTTON(o)->icon = NULL;
  return button_done(o);

};

void  icobutton_draw_state ( p_button o, l_int press ) {
  p_icobutton ib = ICOBUTTON(o);

  t_rect  r = VIEW(o)->get_local_extent(VIEW(o));
  t_rect  safe = r;
  t_point p;

  BITMAP *out = VIEW(o)->begin_paint(VIEW(o), &p, safe);

  if ( out ) {

    l_color fcolor = color_3d_light;

    VIEW(o)->background(VIEW(o), out, rect_move(r, p.x, p.y));


    if ( !OBJECT(o)->is_options(OBJECT(o), OB_OF_ENABLE) ) /* disable button */

      fcolor = color_3d_shadow;


    if ( ib->icon ) { /* center icon if exist */
        BITMAP *icon = ( ib->dwnicon && press != 0 ) ? ib->dwnicon : ib->icon;
        l_rect dx = (rect_sizex(r)-IMAGE_WIDTH(icon))/2;
        l_rect dy = (rect_sizey(r)-IMAGE_HEIGHT(icon)-((o->caption)?get_text_height(VIEW(o)->font):0))/2;
        l_bool idwn = (press == -1 && o->flags & BF_UNDERSEL) || ( press == 1 && !( o->flags & BF_NOSEL ) );

        if ( idwn ) {
	      dx++;
		  dy++;
	    };

        draw_sprite(out, icon, p.x+dx, p.y+dy);

        if ( o->caption ) textout_draw_rect(out,VIEW(o)->font,o->caption,-1,p.x+(idwn?1:0),p.y+dy+icon->h,p.x+r.b.x+(idwn?1:0),p.y+dy+icon->h+get_text_height(VIEW(o)->font),TX_ALIGN_CENTER,color_3d_text,TX_NOCOLOR,1);

    };

      if ( !press ) {

        if ( o->flags & BF_DARROUND ) {
          button3d(VIEW(o), out, r.a.x+p.x, r.a.y+p.y, r.b.x+p.x, r.b.y+p.y, 0);

        } else
        if ( !(o->flags & BF_PUSH) ) {
          if (!(o->flags & BF_UNDERSEL) || o->flags & BF_OVER)
            //if ( !(o->flags & BF_DARROUND) ) {
             // button(out, r.a.x+p.x, r.a.y+p.y, r.b.x+p.x, r.b.y+p.y, color_3d_light, color_3d_dark);
            //} else {
              button3d(VIEW(o), out, r.a.x+p.x, r.a.y+p.y, r.b.x+p.x, r.b.y+p.y, 0);
            //}
        };

      } else

        if ( (press == -1 && o->flags & BF_UNDERSEL) || ( press == 1 && !( o->flags & BF_NOSEL ) ) )
           //if ( o->flags & BF_DARROUND )
              button3d(VIEW(o), out, r.a.x+p.x, r.a.y+p.y, r.b.x+p.x, r.b.y+p.y, 1);
           //else
           //   button(out, r.a.x+p.x, r.a.y+p.y, r.b.x+p.x, r.b.y+p.y,  color_3d_dark ,color_3d_light);
  };

  VIEW(o)->end_of_paint(VIEW(o), safe);

};



p_icon  _icon_init ( p_icon o, t_rect r, BITMAP *icon, l_dword message, l_int flags )
{
  if ( !o ) return NULL;

  clear_type(o, sizeof(t_icon));

  view_init(VIEW(o), r);


  /* object's functions */

  OBJECT(o)->translate_event = &icon_translate_event;
  OBJECT(o)->set_state = &icon_set_state;
  OBJECT(o)->done = &icon_done;


  /* view's declarations */

  VIEW(o)->drag_mode |= DM_DRAGMOVE;
  VIEW(o)->draw = &icon_draw;


  /* icon's declarations */

  o->flags = flags;
  o->message = message;
  o->icon = icon;

  return o;
};



p_button  _button_init ( p_button o, t_rect r, l_text caption, l_dword message, l_int flags )
{
  if ( !o ) return NULL;

  clear_type(o, sizeof(t_button));

  view_init(&o->obclass, r);

  /* object's declarations */

  OBJECT(o)->tag |= TAG_BUTTON;


  /* button's declarations */

  o->caption = (l_text)_strdup((char*)caption);
  o->message = message;
  o->flags = flags;


  /* object's functions */

  OBJECT(o)->translate_event = &button_translate_event;
  OBJECT(o)->set_state = &button_set_state;
  OBJECT(o)->set_options = &button_set_options;
  OBJECT(o)->done = &button_done;


  /* view's functions */

  VIEW(o)->draw = &button_draw;


  /* button's functions */

  o->draw_state = &button_draw_state;
  o->is_default = &button_is_default;

  VIEW(o)->brush.state &= ~BRUSH_LARGE3D;
  /* function calls */
  if ( flags & BF_DARROUND || !(flags & BF_UNDERSEL) )
    VIEW(o)->brush.state |= BRUSH_LARGE3D;
  else
    VIEW(o)->brush.state |= BRUSH_LIGHT3D;

//  VIEW(o)->set_palette(VIEW(o), pal_button);
  VIEW(o)->brush.color = color_3d_face;
//  VIEW(o)->brush.skin = skin_button;
  if ( !skin_btup && !skin_btdown && !skin_btnotov && use_skins ) {
    skin_btup = get_skin(skin_file,"btup");
    skin_btdown = get_skin(skin_file,"btdown");
    skin_btnotov = get_skin(skin_file,"btnotover");
  };

  if ( use_skins ) {
    VIEW(o)->transparent = true;
    o->skin_btup = skin_btup;
    o->skin_btdown = skin_btdown;
    o->skin_btnotov = skin_btnotov;
    if ( skin_btnotov && !(o->flags & BF_UNDERSEL)) o->flags |= BF_UNDERSEL;
  };
  return o;
};


p_icobutton  _icobutton_init ( p_icobutton o, t_rect r, BITMAP *icon, l_text caption, l_dword message, l_int flags )
{
  if ( !o ) return NULL;

  clear_type(o, sizeof(t_icobutton));

  button_init(&o->obclass, r, NULL, message, flags);


  /* icobutton's declarations */

  o->icon = icon;
  o->dwnicon = NULL;

  /* object's functions */

  OBJECT(o)->done = &icobutton_done;


  /* button's functions */

  BUTTON(o)->draw_state = &icobutton_draw_state;


  VIEW(o)->info_text = _strdup(caption);

  return o;
};

⌨️ 快捷键说明

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