static int __GraphLayer_GetLayers( LCUI_GraphLayer *root_glayer, LCUI_GraphLayer *glayer, LCUI_Rect rect, LCUI_Queue *queue ) { int i, total; LCUI_Pos pos; LCUI_Rect tmp; LCUI_GraphLayer *child; LCUI_Queue *child_list; if( !glayer ) { //_DEBUG_MSG("!glayer\n"); return -1; } if( !glayer->visible ) { //_DEBUG_MSG("!glayer_visible\n"); return 1; } child_list = &glayer->child; /* 从底到顶遍历子部件 */ total = Queue_GetTotal( child_list ); //_DEBUG_MSG( "root: %p, cur: %p, child total: %d\n", // root_glayer, glayer, total ); /* 从尾到首,从底到顶,遍历图层 */ for( i=total-1; i>=0; --i ) { child = (LCUI_GraphLayer*)Queue_Get( child_list, i ); /* 忽略无效或不可见的图层 */ if( !child || !child->visible ) { continue; } /* 获取子图层的有效区域及全局坐标 */ tmp = GraphLayer_GetValidRect( root_glayer, child ); pos = GraphLayer_GetGlobalPos( root_glayer, child ); //_DEBUG_MSG( "child: %p, pos: %d,%d, valid rect: %d,%d, %d, %d\n", // child, pos.x, pos.y, tmp.x, tmp.y, tmp.width, tmp.height); //Graph_PrintInfo( &child->graph ); /* 有效区域加上子部件的全局坐标 */ tmp.x += pos.x; tmp.y += pos.y; /* 判断区域是否有效 */ if( !LCUIRect_IsValid(tmp) ) { continue; } /* 若该有效区域与目标区域重叠,则记录子部件,并进行递归 */ if( LCUIRect_Overlay(tmp, rect) ) { Queue_AddPointer( queue, child ); __GraphLayer_GetLayers( root_glayer, child, rect, queue ); } } return 0; }
/* 移动滑块 */ void move_pic_btn(LCUI_Widget *widget, LCUI_WidgetEvent *event) { LCUI_Size size; LCUI_Rect des, rect; LCUI_Pos pos, parent; need_move_pic_btn = FALSE; parent = Widget_GetGlobalPos(widget->parent); pos = Pos_Sub(event->drag.new_pos, parent); Widget_Move(widget, pos); if(event->drag.end_click) {/* 如果拖动已经结束 */ rect = Widget_GetRect(widget); size = Widget_GetSize(widget->parent); des = Rect(size.w-10, 0, 30, 30);/* 目标区域 */ /* 如果部件区域与目标区域重叠,则退出程序 */ if(LCUIRect_Overlay(rect, des)) { LCUI_MainLoop_Quit(NULL); } else {/* 否则,让部件回到起始位置,这个使用的是匀速移动 */ need_move_pic_btn = TRUE; } } }
/* 将矩形数据追加至队列 */ static int RectQueue_Add( LCUI_Queue* queue, LCUI_Rect rect ) { int i, flag = 0; LCUI_Rect *rect_ptr, *cur_rect_ptr; LCUI_Queue rect_buff; if( rect.width <= 0 || rect.height <= 0 ) { return -1; } DEBUG_MSG("add new rect: %d,%d,%d,%d, current total: %d\n", rect.x, rect.y, rect.width, rect.height, queue->total_num); Queue_Init( &rect_buff, sizeof(LCUI_Rect), NULL ); for (i=0; i<queue->total_num; ++i) { cur_rect_ptr = (LCUI_Rect*)Queue_Get( queue, i ); if( !cur_rect_ptr ) { break; } DEBUG_MSG("[%d] rect: %d,%d,%d,%d\n", i, cur_rect_ptr->x, cur_rect_ptr->y, cur_rect_ptr->width, cur_rect_ptr->height); /* 如果矩形无效,或者被新增的矩形区域包含,则删除 */ if ( cur_rect_ptr->width <= 0 || cur_rect_ptr->height <= 0 || LCUIRect_IncludeRect( rect, *cur_rect_ptr) ) { Queue_Delete ( queue, i ); continue; } /* 如果与现有的矩形相同,或被现有的矩形包含 */ if( LCUIRect_Equal( rect, *cur_rect_ptr) || LCUIRect_IncludeRect( *cur_rect_ptr, rect ) ) { flag = 1; break; } /* 如果新增的矩形与队列中的矩形不重叠 */ if( !LCUIRect_Overlay(rect, *cur_rect_ptr) ) { continue; } continue; // 暂时不对相交的矩形进行分割 DEBUG_MSG("[%d] rect overlay, start cut\n", i); /* 根据当前区域,分割新区域 */ LCUIRect_Cut( *cur_rect_ptr, rect, &rect_buff ); for( i=0; i<rect_buff.total_num; ++i ) { rect_ptr = (LCUI_Rect*)Queue_Get( &rect_buff, i ); if( !rect_ptr ) { break; } DEBUG_MSG("[%d] add child rect: %d,%d,%d,%d\n", i, rect_ptr->x, rect_ptr->y, rect_ptr->width, rect_ptr->height); RectQueue_Add( queue, *rect_ptr ); } flag = 1; break; } /* 销毁队列 */ Queue_Destroy( &rect_buff ); if ( flag == 0 ) { return Queue_Add( queue, &rect ); } return -1; }