📄 menus.c
字号:
p_menuitem add_menu_item_to_menuitem ( p_menuitem dst, p_menuitem src )
{
if ( dst ) {
p_menuitem last = dst;
while ( last->next ) last = last->next; /* move to last item */
last->next = src;
} else dst = src;
return dst;
};
l_bool add_menu_item_to_menu ( p_menu p, l_int pos, p_menuitem items )
{
p_menuitem first = p?p->items:NULL;
while ( first && pos > 1 ) {
pos--;
first = first->next;
};
if ( first && first->next != items ) {
first->next = items;
return true;
};
return false;
};
p_menu new_menu ( p_menuitem item )
{
p_menu p = (p_menu)_malloc(sizeof(t_menu));
if ( p ) {
clear_type(p, sizeof(t_menu));
p->items = item;
p->current = item;
};
return p;
};
p_menuitem new_menu_line ( p_menuitem next )
{
p_menuitem p = (p_menuitem)_malloc(sizeof(t_menuitem));
if ( p ) {
clear_type(p, sizeof(t_menuitem));
p->next = next;
return p;
};
return next;
};
p_menuitem new_sub_menu_ex ( l_text name, l_bool enable, l_text info_text,
l_font *font, BITMAP *icon, l_font *font_symbol, l_byte chr,
p_menu menu, p_menuitem next )
{
p_menuitem p;
if ( name ) {
p = (p_menuitem)_malloc(sizeof(t_menuitem));
if ( !p ) return next;
clear_type(p, sizeof(t_menuitem));
p->next = next;
p->name = _strdup(name);
p->enable = enable;
p->info_text = _strdup(info_text);
p->font = font;
p->submenu = menu;
p->font_symbol = font_symbol;
p->char_symbol = chr;
if ( !font ) p->font = standard_menuitem_font;
if ( !icon )
p->icon = NULL; //icon_folder(ICON_16);
else
p->icon = icon;
return p;
};
return next;
};
void free_menu_item ( p_menuitem i )
{
if ( i ) {
_free(i->name);
_free(i->info_text);
_free(i->param);
if ( i->flags & MIF_SELFICON )
destroy_bitmap(i->icon);
};
_free(i);
};
void free_menu ( p_menu i )
{
};
p_menuitem new_menu_item_ex ( l_text name, l_text param, l_int hotkey, l_dword message,
l_bool enable, l_text info_text, l_int flags,
l_font *font, BITMAP *icon, l_font *font_symbol, l_byte chr,
p_menuitem next )
{
p_menuitem p;
if ( name && message != 0 ) {
p = (p_menuitem)_malloc(sizeof(t_menuitem));
if ( !p ) return NULL;
clear_type(p, sizeof(t_menuitem));
p->next = next;
p->name = _strdup(name);
p->message = message;
p->enable = enable;
p->hotkey = hotkey;
p->info_text = _strdup(info_text);
p->param = _strdup(param);
p->font = font;
p->font_symbol = font_symbol;
p->char_symbol = chr;
if ( !font ) p->font = standard_menuitem_font;
p->flags = flags;
p->icon = icon;
return p;
};
return next;
};
l_int menu_get_item_flags ( p_menu m, l_dword message )
{
p_menuitem p = m?m->items:NULL;
while ( p ) {
if ( p->submenu ) {
l_int flags = menu_get_item_flags(p->submenu, message);
if ( flags != -1 ) return flags;
} else
if ( p->message == message ) return p->flags;
p = p->next;
};
return -1;
};
l_long menu_get_item_pos ( p_menu m, p_menuitem x )
{
p_menuitem p = m?m->items:NULL;
l_long i = 0;
while ( p ) {
if ( p == x ) return i;
i++;
p = p->next;
};
return -1;
};
p_menuitem menu_get_lastitem_called ( p_menu m )
{
p_menuitem p = m?m->items:NULL;
while ( p ) {
if ( p->submenu ) {
p_menuitem last = menu_get_lastitem_called(p->submenu);
if ( last ) {
last->lastcall = false;
return last;
};
} else
if ( p->lastcall ) { // Fixed 09/09/2001
p->lastcall = false;
return p;
};
p = p->next;
};
return NULL;
};
l_dword menu_get_hotkey_message ( p_menu m, l_int keycode )
{
p_menuitem p = m?m->items:NULL;
while ( p ) {
if ( p->submenu ) {
l_dword msg = menu_get_hotkey_message(p->submenu, keycode);
if ( msg ) return msg;
} else
if ( p->hotkey == keycode ) return p->message;
p = p->next;
};
return MSG_NOTHING;
};
l_int menu_get_max_item ( p_menu m )
{
if ( m && m->items ) {
p_menuitem p = m->items;
l_int i = 0;
while ( p ) {
i++;
p = p->next;
};
return i;
} else
return 0;
};
t_point menu_get_ver_size ( p_menu menu, l_int h )
{
p_menuitem item = menu?menu->items:NULL;
l_rect w = 0;
l_rect maxw = 0;
l_rect maxh = 0;
while ( item ) {
if ( item->name ) {
w = FONT_GETSTRWIDTH(item->font, item->name, -1);
w += FONT_GETSTRWIDTH(item->font, item->param, -1);
w += STANDARD_MENUBOUNDSDIFF_SIZE*2;
maxw = max(w, maxw);
maxh += h;
} else
maxh += STANDARD_MENULINE_SIZE+1;
item = item->next;
};
return point_assign(maxw+60, maxh+4);
};
t_point menu_get_hor_size ( p_menu menu, l_int h, l_int icon_size )
{
p_menuitem item = menu?menu->items:NULL;
l_rect w = 0;
l_rect maxw = 0;
l_rect maxh = 0;
while ( item ) {
if ( item->name ) {
maxw += icon_size;
maxw += FONT_GETSTRWIDTH(item->font, item->name, -1);
maxw += FONT_GETSTRWIDTH(item->font, item->param, -1)+STANDARD_MENUDIFF_SIZE;
} else
maxw += STANDARD_MENULINE_WIDTH+1;
item = item->next;
};
return point_assign(maxw+4, h+4);
};
/* t_hormenu */
void hormenu_translate_event ( p_object o, t_event *event )
{
t_rect r = VIEW(o)->get_local_extent(VIEW(o));
t_point p = VIEW(o)->get_global_point(VIEW(o), point_assign(0, 0));
RETVIEW(o, event);
view_translate_event(o, event); /* old translate_event function */
if ( event->type & EV_MOUSE &&
OBJECT(mouse)->state & MO_SF_MOUSELDOWN ) { /* mouse events */
l_dword msg = 0;
clear_event(event);
if (mouse->where.x > r.a.x+p.x && mouse->where.x <= r.a.x+p.x+8) {
while ( OBJECT(mouse)->state & MO_SF_MOUSELPRESS ) {
o->get_event(o, event);
};
return;
};
menu_clear_lastitem_called(MENUVIEW(o)->menu);
msg = desktop->execute_view(desktop, VIEW(o));
if ( msg != MSG_NOTHING && msg != MSG_CANCEL ) {
set_event(event, EV_MESSAGE, msg, o);
};
o->put_event(o, event);
clear_event(event);
if ( o->owner->prefer == o ) /* only one item, so redraw it for */
MENUVIEW(o)->draw_current_item(MENUVIEW(o));
};
};
p_menuview _hormenu_init_ex ( p_menuview o, t_rect r, l_rect item_size,
l_rect icon_size, p_menu menu )
{
t_rect l = desktop?desktop->get_limits(desktop):r;
t_point s = menu_get_hor_size(menu, item_size, icon_size+5);
if ( !o ) return NULL;
clear_type(o, sizeof(t_menuview));
/* rectangle settings */
r.b.y = r.a.y + s.y;
if ( r.b.x < r.a.x+s.x ) r.b.x = r.a.x + s.x;
view_init(VIEW(o), r);
/* object's functions */
OBJECT(o)->done = &menuview_done;
OBJECT(o)->execute = &hormenu_execute;
OBJECT(o)->set_state = &menuview_set_state;
OBJECT(o)->translate_event = &hormenu_translate_event;
/* view's functions */
VIEW(o)->draw = &hormenu_draw;
VIEW(o)->draw_under_rect = &menuview_draw_under_rect;
VIEW(o)->icon_size = icon_size;
if (use_skins) // OCR - 02/04/2002
VIEW(o)->transparent = TRUE;
/* menuview's functions and declarations */
o->flags |= MF_HORMENU;
o->menu = menu;
o->between = point_assign(icon_size+5, 0);
o->item_size = item_size;
o->save_desktop = &hormenu_save_desktop;
o->is_hor_menu_one_of_parents = &menuview_is_hor_menu_one_of_parents;
o->draw_current_item = &menuview_draw_current_item;
o->draw_item = &hormenu_draw_item;
o->at = &menuview_at;
o->index_of = &menuview_index_of;
o->get_item_box_ex = &hormenu_get_item_box_ex;
o->get_mouseitem_box = &menuview_get_mouseitem_box;
o->get_item_box = &menuview_get_item_box;
o->get_next_item = &menuview_get_next_item;
o->next_item = &menuview_next_item;
o->prev_item = &menuview_prev_item;
o->run_new_menu = &menuview_run_new_menu;
o->get_item_from_mouse = &menuview_get_item_from_mouse;
o->is_mouse_in_one_of_parent_menu = &menuview_is_mouse_in_one_of_parent_menu;
o->is_mouse_in_one_of_parent_item = &menuview_is_mouse_in_one_of_parent_item;
o->is_one_of_subs_state = &menuview_is_one_of_subs_state;
o->top_menuview = &menuview_top_menuview;
/* function calls */
// VIEW(o)->set_palette(VIEW(o), pal_hormenu);
VIEW(o)->brush.color = color_3d_face;
/* VIEW(o)->brush.color2 = color_menu_face_gardient;
VIEW(o)->brush.state |= BRUSH_GRADIENT+BRUSH_GRADIENT_HOR;*/
return o;
};
p_menuview _hormenu_init ( p_menuview o, t_rect r, p_menu menu )
{
return hormenu_init_ex(o, r, standard_menuitem_size, standard_menuicon_size, menu);
};
/* t_menuview */
p_menuview _menuview_init_ex ( p_menuview o, t_rect r, l_rect item_size,
l_rect icon_size, p_menu menu )
{
t_rect l = desktop?desktop->get_limits(desktop):r;
t_point s = menu_get_ver_size(menu, item_size);
if ( !o ) return NULL;
clear_type(o, sizeof(t_menuview));
/* rectangle settings */
if ( r.a.x + s.x < l.b.x ) r.b.x = r.a.x + s.x; else r.a.x = l.b.x - s.x;
if ( r.a.y + s.y < l.b.y ) r.b.y = r.a.y + s.y; else r.a.y = l.b.y - s.y;
r.b.x = r.a.x + s.x;
r.b.y = r.a.y + s.y;
view_init(VIEW(o), r);
/* object's functions */
OBJECT(o)->done = &menuview_done;
OBJECT(o)->execute = &menuview_execute;
OBJECT(o)->set_state = &menuview_set_state;
OBJECT(o)->translate_event = &menuview_translate_event;
/* view's functions */
VIEW(o)->draw = &menuview_draw;
VIEW(o)->size_limits = &menuview_size_limits;
VIEW(o)->draw_under_rect = &menuview_draw_under_rect;
VIEW(o)->icon_size = icon_size;
VIEW(o)->brush.state &= ~BRUSH_LARGE3D;
VIEW(o)->brush.state |= BRUSH_LIGHT3D|BRUSH_DRAWBORDER;
/* menuview's functions and declarations */
o->flags |= MF_VERMENU;
o->menu = menu;
o->between = point_assign(icon_size+5, 0);
o->item_size = item_size;
o->save_desktop = &menuview_save_desktop;
o->is_hor_menu_one_of_parents = &menuview_is_hor_menu_one_of_parents;
o->draw_item = &menuview_draw_item;
o->draw_current_item = &menuview_draw_current_item;
o->at = &menuview_at;
o->index_of = &menuview_index_of;
o->get_item_box_ex = &menuview_get_item_box_ex;
o->get_mouseitem_box = &menuview_get_mouseitem_box;
o->get_item_box = &menuview_get_item_box;
o->get_next_item = &menuview_get_next_item;
o->next_item = &menuview_next_item;
o->prev_item = &menuview_prev_item;
o->run_new_menu = &menuview_run_new_menu;
o->get_item_from_mouse = &menuview_get_item_from_mouse;
o->is_mouse_in_one_of_parent_menu = &menuview_is_mouse_in_one_of_parent_menu;
o->is_mouse_in_one_of_parent_item = &menuview_is_mouse_in_one_of_parent_item;
o->is_one_of_subs_state = &menuview_is_one_of_subs_state;
o->top_menuview = &menuview_top_menuview;
/* function calls */
OBJECT(o)->options |= OB_OF_TOPSELECT;
// VIEW(o)->set_palette(VIEW(o), pal_menu);
switch ( translucide ) {
case 1 : VIEW(o)->trans_effect = 235; break;
case 2 : VIEW(o)->trans_effect = 215; break;
case 3 : VIEW(o)->trans_effect = 195; break;
case 4 : VIEW(o)->trans_effect = 175; break;
case 5 : VIEW(o)->trans_effect = 155; break;
};
VIEW(o)->brush.color = color_menu_face;
VIEW(o)->brush.color2 = color_menu_face_gardient;
VIEW(o)->brush.state |= BRUSH_GRADIENT+BRUSH_GRADIENT_HOR;
return o;
};
p_menuview _menuview_init ( p_menuview o, t_rect r, p_menu menu )
{
return menuview_init_ex(o, r, standard_menuitem_size, standard_menuicon_size, menu);
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -