static void Update_Label(LCUI_Widget *widget) /* 功能:更新label部件 */ { int mode; LCUI_Size max; LCUI_Label *label; label = Get_Widget_PrivData( widget ); if(!Graph_Valid(&widget->background_image)) { mode = GRAPH_MIX_FLAG_REPLACE; /* 替换模式 */ } else { mode = GRAPH_MIX_FLAG_OVERLAY; /* 叠加模式 */ } /* 先绘制文本位图,在绘制前它会更新位图尺寸 */ TextLayer_Draw( widget, &label->layer, mode ); /* 获取尺寸 */ max = TextLayer_Get_Size( &label->layer ); if( widget->dock == DOCK_TYPE_NONE && label->auto_size && Size_Cmp( max, widget->size ) != 0 ) { /* 如果开启了自动调整大小,并且尺寸有改变 */ Resize_Widget(widget, max ); Refresh_Widget(widget); } }
static int TextBox_ScrollBar_Update_Pos( LCUI_Widget *widget ) /* 更新滚动条的位置 */ { static ScrollBar_Data scrollbar_data; static LCUI_Pos area_pos; static LCUI_Size layer_size, area_size; static LCUI_Widget *scrollbar[2]; static LCUI_TextLayer *layer; area_size = Get_Container_Size( widget ); scrollbar[0] = TextBox_Get_Scrollbar( widget, 0 ); scrollbar[1] = TextBox_Get_Scrollbar( widget, 1 ); if( scrollbar[0]->visible ) { area_size.w -= Get_Widget_Width( scrollbar[0] ); } if( scrollbar[1]->visible ) { area_size.h -= Get_Widget_Height( scrollbar[1] ); } if( area_size.h <= 0 || area_size.w <= 0 ) { return -1; } layer = TextBox_Get_TextLayer( widget ); if( !layer->enable_multiline ) { return 1; } layer_size = TextLayer_Get_Size( layer ); if( layer_size.h <= 0 || layer_size.w <= 0 ) { return -2; } area_pos = TextBox_ViewArea_Get_Pos( widget ); ScrollBar_Set_MaxNum( scrollbar[0], layer_size.h - area_size.h ); if( area_pos.y + area_size.h > layer_size.h ) { area_pos.y = layer_size.h - area_size.h; } if( area_pos.x + area_size.w > layer_size.w ) { area_pos.x = layer_size.w - area_size.w; } if( area_pos.y < 0 ) { area_pos.y = 0; } if( area_pos.x < 0 ) { area_pos.x = 0; } ScrollBar_Set_CurrentNum( scrollbar[0], area_pos.y ); scrollbar_data = ScrollBar_Get_Data( scrollbar[0] ); TextBox_VertScroll_TextLayer( scrollbar_data, widget ); ScrollBar_Set_MaxNum( scrollbar[1], layer_size.w - area_size.w ); ScrollBar_Set_CurrentNum( scrollbar[1], area_pos.x ); scrollbar_data = ScrollBar_Get_Data( scrollbar[1] ); TextBox_HoriScroll_TextLayer( scrollbar_data, widget ); return 0; }
static void Update_Label(LCUI_Widget *widget) /* 功能:更新label部件 */ { int mode; LCUI_Size max; LCUI_TextLayer *layer; layer = Get_Widget_PrivData( widget ); max = TextLayer_Get_Size( layer ); if( widget->auto_size && Size_Cmp( max, widget->size ) != 0 ) { /* 如果开启了自动调整大小,并且尺寸有改变 */ Resize_Widget(widget, max ); Refresh_Widget(widget); return; } if(!Graph_Valid(&widget->background_image)) { mode = GRAPH_MIX_FLAG_REPLACE; /* 替换模式 */ } else { mode = GRAPH_MIX_FLAG_OVERLAY; /* 叠加模式 */ } layer = Get_Widget_PrivData( widget ); TextLayer_Draw( widget, layer, mode ); }
int TextBox_ViewArea_Update( LCUI_Widget *widget ) /* 更新文本框的文本显示区域 */ { static int cursor_h; static ScrollBar_Data scrollbar_data; static LCUI_Pos cursor_pos, area_pos; static LCUI_Size layer_size, area_size; static LCUI_Widget *scrollbar[2]; static LCUI_TextLayer *layer; //printf("TextBox_ViewArea_Update(): enter\n"); /* 获取显示区域的尺寸 */ area_size = Get_Container_Size( widget ); /* 获取滚动条 */ scrollbar[0] = TextBox_Get_Scrollbar( widget, 0 ); scrollbar[1] = TextBox_Get_Scrollbar( widget, 1 ); /* 如果滚动条可见,那么区域尺寸就需要减去滚动条占用的尺寸 */ if( scrollbar[0]->visible ) { area_size.w -= Get_Widget_Width( scrollbar[0] ); } if( scrollbar[1]->visible ) { area_size.h -= Get_Widget_Height( scrollbar[1] ); } if( area_size.h <= 0 || area_size.w <= 0 ) { return -1; } layer = TextBox_Get_TextLayer( widget ); layer_size = TextLayer_Get_Size( layer ); if( layer_size.h <= 0 || layer_size.w <= 0 ) { return -2; } /* 获取显示区域的位置 */ area_pos = TextBox_ViewArea_Get_Pos( widget ); /* 获取光标的坐标 */ cursor_pos = TextLayer_Get_Cursor_FixedPixelPos( layer ); /* 获取当前行的最大高度作为光标的高度 */ cursor_h = TextLayer_CurRow_Get_MaxHeight( layer ); /* 设定滚动条的数据中的最大值 */ ScrollBar_Set_MaxNum( scrollbar[0], layer_size.h - area_size.h ); DEBUG_MSG("cursor_pos: %d,%d\n", cursor_pos.x, cursor_pos.y); DEBUG_MSG("area_rect: %d,%d,%d,%d\n", area_pos.x, area_pos.y,area_size.w, area_size.h ); DEBUG_MSG("layer_size: %d,%d\n", layer_size.w, layer_size.h); /* 检测光标Y轴坐标是否超出显示区域的范围 */ if( cursor_pos.y < area_pos.y ) { area_pos.y = cursor_pos.y; } if(cursor_pos.y + cursor_h > area_pos.y + area_size.h ) { area_pos.y = cursor_pos.y + cursor_h - area_size.h; } /* 如果显示区域在Y轴上超过文本图层的范围 */ if( area_pos.y + area_size.h > layer_size.h ) { area_pos.y = layer_size.h - area_size.h; } if( area_pos.y < 0 ) { area_pos.y = 0; } /* 设定滚动条的数据中的当前值 */ ScrollBar_Set_CurrentNum( scrollbar[0], area_pos.y ); /* 获取滚动条的数据,供滚动文本层利用 */ scrollbar_data = ScrollBar_Get_Data( scrollbar[0] ); //printf("scrollbar_data: size: %d / %d, num: %d / %d\n", //scrollbar_data.current_size, scrollbar_data.max_size, //scrollbar_data.current_num, scrollbar_data.max_num); /* 根据数据,滚动文本图层至响应的位置,也就是移动文本显示区域 */ TextBox_VertScroll_TextLayer( scrollbar_data, widget ); /* 设定滚动条的数据中的最大值 */ ScrollBar_Set_MaxNum( scrollbar[1], layer_size.w - area_size.w ); if( cursor_pos.x < area_pos.x ) { area_pos.x = cursor_pos.x; } if(cursor_pos.x +5 > area_pos.x + area_size.w ) { area_pos.x = cursor_pos.x+5 - area_size.w; } if( area_pos.x + area_size.w > layer_size.w ) { area_pos.x = layer_size.w - area_size.w; } if( area_pos.x < 0 ) { area_pos.x = 0; } /* 设定滚动条的数据中的当前值 */ ScrollBar_Set_CurrentNum( scrollbar[1], area_pos.x ); /* 获取滚动条的数据,供滚动文本层利用 */ scrollbar_data = ScrollBar_Get_Data( scrollbar[1] ); //printf("scrollbar_data: size: %d / %d, num: %d / %d\n", //scrollbar_data.current_size, scrollbar_data.max_size, //scrollbar_data.current_num, scrollbar_data.max_num); TextBox_HoriScroll_TextLayer( scrollbar_data, widget ); //printf("TextBox_ViewArea_Update(): quit\n"); return 0; }
static void TextBox_ScrollBar_Update_Size( LCUI_Widget *widget ) /* 更新滚动条的长度 */ { int tmp; char size_str[15]; LCUI_Size area_size, layer_size; LCUI_Widget *scrollbar[2], *label; LCUI_TextLayer *layer; label = TextBox_Get_Label( widget ); /* 获取文本图层 */ layer = TextBox_Get_TextLayer( widget ); /* 获取文本图层和文本框区域的尺寸 */ layer_size = TextLayer_Get_Size( layer ); area_size = Get_Container_Size( widget ); /* 获取纵向和横向滚动条 */ scrollbar[0] = TextBox_Get_Scrollbar( widget, 0 ); scrollbar[1] = TextBox_Get_Scrollbar( widget, 1 ); /* 如果文本图层高度超过显示区域 */ if( layer->enable_multiline && area_size.h > 0 && layer_size.h > area_size.h ) { tmp = area_size.w - Get_Widget_Width( scrollbar[0] ); snprintf( size_str, sizeof(size_str)-1, "%dpx", tmp ); Set_Widget_Size( label, size_str, NULL ); /* 修改滚动条中记录的最大值和当前值,让滚动条在更新后有相应的长度 */ ScrollBar_Set_MaxSize( scrollbar[0], layer_size.h ); ScrollBar_Set_CurrentSize( scrollbar[0], area_size.h ); Show_Widget( scrollbar[0] ); /* 如果横向滚动条可见 */ if( scrollbar[1]->visible ) { tmp = area_size.h - Get_Widget_Height( scrollbar[1] ); snprintf( size_str, sizeof(size_str)-1, "%dpx", tmp ); Set_Widget_Size( scrollbar[0], NULL, size_str ); } else { Set_Widget_Size( scrollbar[0], NULL, "100%" ); } } else { /* 不需要显示滚动条 */ Hide_Widget( scrollbar[0] ); Set_Widget_Size( label, "100%", NULL ); } /* 和上面的处理基本一样,这个是处理横向滚动条 */ if( layer->enable_multiline && area_size.w > 0 && layer_size.w > area_size.w ) { tmp = area_size.h - Get_Widget_Height( scrollbar[1] ); snprintf( size_str, sizeof(size_str)-1, "%dpx", tmp ); Set_Widget_Size( label, NULL, size_str ); ScrollBar_Set_MaxSize( scrollbar[1], layer_size.w ); ScrollBar_Set_CurrentSize( scrollbar[1], area_size.w ); Show_Widget( scrollbar[1] ); if( scrollbar[0]->visible ) { tmp = area_size.w - Get_Widget_Width( scrollbar[0] ); snprintf( size_str, sizeof(size_str)-1, "%dpx", tmp ); Set_Widget_Size( scrollbar[1], size_str, NULL ); } else { Set_Widget_Size( scrollbar[1], "100%", NULL ); } } else { Set_Widget_Size( label, NULL, "100%" ); Hide_Widget( scrollbar[1] ); } }