📄 panel_attr.c
字号:
if (label_x_changed) ip->label_rect.r_left = label_x; if (label_y_changed) ip->label_rect.r_top = label_y; /* now move the value if it's not fixed */ fix_positions(ip); } if (value_x_changed || value_y_changed) { /* value position has changed, so re-compute * default label position. */ rect_construct(&deltas, 0, 0, 0, 0); if (value_x_changed) { deltas.r_left = value_x - ip->value_rect.r_left; ip->value_rect.r_left = value_x; } if (value_y_changed) { deltas.r_top = value_y - ip->value_rect.r_top; ip->value_rect.r_top = value_y; } if (deltas.r_left || deltas.r_top) { /* VALUE_X or VALUE_Y has changed, so tell item to shift * all its components (choices, marks etc.). */ (*ip->ops->layout)(ip, &deltas); /* now move the label if it's not fixed */ fix_positions(ip); } } /* make sure the item rect encloses the label and value */ ip->rect = panel_enclosing_rect(&ip->label_rect, &ip->value_rect); /* for scrolling computations, note new extent of panel, tell scrollbars */ if (potential_new_rect) panel_update_extent(panel, ip->rect); return 1;}/*****************************************************************************//* fix_positions - of label and value rects *//*****************************************************************************/staticfix_positions(ip)register panel_item_handle ip;{ if (!value_fixed(ip)) { struct rect deltas; /* compute the value position as after the label */ /* remember the old position */ rect_construct(&deltas, 0, 0, 0, 0); deltas.r_left = ip->value_rect.r_left; deltas.r_top = ip->value_rect.r_top; switch (ip->layout) { case PANEL_HORIZONTAL: /* after => to right of */ ip->value_rect.r_left = rect_right(&ip->label_rect) + 1 + (ip->label_rect.r_width ? LABEL_X_GAP : 0); ip->value_rect.r_top = ip->label_rect.r_top; break; case PANEL_VERTICAL: /* after => below */ ip->value_rect.r_left = ip->label_rect.r_left; ip->value_rect.r_top = rect_bottom(&ip->label_rect) + 1 + (ip->label_rect.r_height ? LABEL_Y_GAP : 0); break; } /* delta is new postion minus old position */ deltas.r_left = ip->value_rect.r_left - deltas.r_left; deltas.r_top = ip->value_rect.r_top - deltas.r_top; if (deltas.r_left || deltas.r_top) /* VALUE_X or VALUE_Y has changed, so tell item to shift * all its components (choices, marks etc.). */ (*ip->ops->layout)(ip, &deltas); return; } panel_fix_label_position(ip);}panel_fix_label_position(ip)register panel_item_handle ip;{ if (label_fixed(ip)) return; /* compute the label position as before the value. */ switch (ip->layout) { case PANEL_HORIZONTAL: /* before => to left of */ ip->label_rect.r_left = ip->value_rect.r_left; if (ip->label_rect.r_width > 0) ip->label_rect.r_left -= ip->label_rect.r_width + LABEL_X_GAP; ip->label_rect.r_top = ip->value_rect.r_top; break; case PANEL_VERTICAL: /* before => above */ ip->label_rect.r_left = ip->value_rect.r_left; ip->label_rect.r_top = ip->value_rect.r_top; if (ip->label_rect.r_height > 0) ip->label_rect.r_top -= ip->label_rect.r_height + LABEL_Y_GAP; break; }}/*****************************************************************************//* panel_get_generic *//* returns the value of the generic attribute specified by which_attr. *//* NULL is returned if this is not a generic attribute. *//*****************************************************************************/caddr_tpanel_get_generic(ip, which_attr)register panel_item_handle ip;register Panel_attribute which_attr;{ switch (which_attr) { case PANEL_VALUE_X: return (caddr_t) ip->value_rect.r_left; case PANEL_VALUE_Y: return (caddr_t) ip->value_rect.r_top; case PANEL_LABEL_STRING: if (is_string(&ip->label)) return (caddr_t) image_string(&ip->label); else return (caddr_t) NULL; case PANEL_LABEL_FONT: if (is_string(&ip->label)) return (caddr_t) image_font(&ip->label); else return (caddr_t) NULL; case PANEL_LABEL_BOLD: if (is_string(&ip->label)) return (caddr_t) image_bold(&ip->label); else return (caddr_t) NULL; case PANEL_LABEL_SHADED: return (caddr_t) image_shaded(&ip->label); case PANEL_LABEL_IMAGE: if (is_pixrect(&ip->label)) return (caddr_t) image_pixrect(&ip->label); else return (caddr_t) NULL; case PANEL_LABEL_X: return (caddr_t) ip->label_rect.r_left; case PANEL_LABEL_Y: return (caddr_t) ip->label_rect.r_top; case PANEL_ITEM_X: return (caddr_t) ip->rect.r_left; case PANEL_ITEM_Y: return (caddr_t) ip->rect.r_top; case PANEL_ITEM_RECT: return (caddr_t) &ip->rect; case PANEL_ADJUSTABLE: return (caddr_t) adjustable(ip); case PANEL_SHOW_ITEM: return (caddr_t) !hidden(ip); case PANEL_NOTIFY_PROC: return (caddr_t) LINT_CAST(ip->notify); case PANEL_EVENT_PROC: return (caddr_t) LINT_CAST(ip->ops->handle_event); case PANEL_NEXT_ITEM: return (caddr_t) ip->next; case PANEL_PIXWIN: return (caddr_t) ip->panel->pixwin; case PANEL_MOUSE_STATE: return (caddr_t) ip->panel->mouse_state; case PANEL_LAYOUT: return (caddr_t) ip->layout; case PANEL_MENU_TITLE_STRING: return is_string(&ip->menu_title) ? (caddr_t) image_string(&ip->menu_title) : NULL; case PANEL_MENU_TITLE_IMAGE: return is_pixrect(&ip->menu_title) ? (caddr_t) image_pixrect(&ip->menu_title) : NULL; case PANEL_MENU_TITLE_FONT: return is_string(&ip->menu_title) ? (caddr_t) image_font(&ip->menu_title) : NULL; case PANEL_MENU_CHOICE_STRINGS: case PANEL_MENU_CHOICE_IMAGES: case PANEL_MENU_CHOICE_FONTS: case PANEL_MENU_CHOICE_VALUES: return NULL; case PANEL_SHOW_MENU: return (caddr_t) show_menu(ip); case PANEL_SHOW_MENU_MARK: return (caddr_t) show_menu_mark(ip); case PANEL_MENU_MARK_IMAGE: return (caddr_t) ip->menu_mark_on; case PANEL_MENU_NOMARK_IMAGE: return (caddr_t) ip->menu_mark_off; case PANEL_TYPE_IMAGE: return (caddr_t) ip->menu_type_pr; case PANEL_ACCEPT_KEYSTROKE: return (caddr_t) wants_key(ip); case PANEL_CLIENT_DATA: return ip->client_data; case HELP_DATA: return ip->help_data; case PANEL_ITEM_COLOR: return (caddr_t) ip->color_index; case PANEL_PARENT_PANEL: return (caddr_t) ip->panel; default : return (caddr_t) NULL; }} /* panel_get_generic */panel_set_ops(ip, avlist)register panel_item_handle ip;register Attr_avlist avlist;{ register Panel_attribute attr; register panel_ops_handle new_ops; while (attr = (Panel_attribute) *avlist++) { switch (attr) { case PANEL_EVENT_PROC: if (!ops_set(ip)) { new_ops = (panel_ops_handle) LINT_CAST(sv_malloc(sizeof(struct panel_ops))); *new_ops = *ip->ops; ip->ops = new_ops; ip->flags |= OPS_SET; } ip->ops->handle_event = (int (*)()) LINT_CAST(*avlist++); if (!ip->ops->handle_event) ip->ops->handle_event = panel_nullproc; break; default: /* skip past what we don't care about */ avlist = attr_skip(attr, avlist); break; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -