static void draw_launchers( HDC hdc, RECT update_rect ) { COLORREF color = SetTextColor( hdc, RGB(255,255,255) ); /* FIXME: depends on background color */ int mode = SetBkMode( hdc, TRANSPARENT ); unsigned int i; LOGFONTW lf; HFONT font; SystemParametersInfoW( SPI_GETICONTITLELOGFONT, sizeof(lf), &lf, 0 ); font = SelectObject( hdc, CreateFontIndirectW( &lf ) ); for (i = 0; i < nb_launchers; i++) { RECT dummy, icon = get_icon_rect( i ), title = get_title_rect( i ); if (IntersectRect( &dummy, &icon, &update_rect )) DrawIconEx( hdc, icon.left, icon.top, launchers[i]->icon, icon_cx, icon_cy, 0, 0, DI_DEFAULTSIZE|DI_NORMAL ); if (IntersectRect( &dummy, &title, &update_rect )) DrawTextW( hdc, launchers[i]->title, -1, &title, DT_CENTER|DT_WORDBREAK|DT_EDITCONTROL|DT_END_ELLIPSIS ); } SelectObject( hdc, font ); SetTextColor( hdc, color ); SetBkMode( hdc, mode ); }
void CL_ListViewLayoutIcons::update_shown_items_grid(CL_Font &font, CL_ListViewItem doc_item) { CL_GraphicContext &gc = listview->get_gc(); shown_items.clear(); row_counter = 0; CL_ListViewItem item = doc_item.get_first_child(); int x = rect_view.left; int y = rect_view.top - scroll_y; int skip_items = (scroll_y/size_cell.height) * max_grid_cols_visible; int skip_rows = skip_items/max_grid_cols_visible; y += skip_rows * size_cell.height; int skip_item_counter = 0; while (item.is_item()) { if (skip_item_counter < skip_items) { item = item.get_next_sibling(); skip_item_counter++; } ListViewShownItem si; si.valid = true; si.item = item; CL_Rect rect_cell(x, y, x+size_cell.width, y+size_cell.height); si.rect_cell.push_back(rect_cell); rect_cell.shrink(rect_cell_shrink.left, rect_cell_shrink.top, rect_cell_shrink.right, rect_cell_shrink.bottom); // part_cell.get_content_box(si.rect_cell); CL_Rect rect_cell_content = rect_cell; si.rect_icon = get_icon_rect(rect_cell_content, item, rect_cell_content.left); const CL_StringRef &text = si.item.get_column(header->get_first_column().get_column_id()).get_text(); CL_Size text_size = font.get_text_size(gc, text); CL_Rect text_rect; text_rect.left = rect_cell_content.get_center().x - text_size.width/2; text_rect.top = rect_cell_content.bottom - text_size.height; text_rect.set_size(text_size); si.descent = font.get_font_metrics().get_descent(); si.rect_text.push_back(text_rect); shown_items.push_back(si); x += size_cell.width; if (x + size_cell.width > rect_view.right) { row_counter++; if (row_counter > (max_rows_visible+1)) break; y += size_cell.height; x = rect_view.left; } item = item.get_next_sibling(); } valid = true; }
static const struct launcher *launcher_from_point( int x, int y ) { RECT icon, title; unsigned int index; if (!nb_launchers) return NULL; index = x / launcher_size + (y / launcher_size) * launchers_per_row; if (index >= nb_launchers) return NULL; icon = get_icon_rect( index ); title = get_title_rect( index ); if ((x < icon.left || x > icon.right || y < icon.top || y > icon.bottom) && (x < title.left || x > title.right || y < title.top || y > title.bottom)) return NULL; return launchers[index]; }
void ListViewLayoutThumbnails::update_shown_items_grid(Font &font, ListViewItem doc_item) { Canvas canvas = listview->get_canvas(); shown_items.clear(); rows.clear(); row_counter = 0; ListViewItem item = doc_item.get_first_child(); int x = rect_view.left; int y = rect_view.top - scroll_y; int skip_items = (scroll_y/size_cell.height) * max_grid_cols_visible; int skip_rows = skip_items/max_grid_cols_visible; y += skip_rows * size_cell.height; int skip_item_counter = 0; while (item.is_item()) { if (skip_item_counter < skip_items) { item = item.get_next_sibling(); skip_item_counter++; continue; } ListViewShownItem si; si.valid = true; si.item = item; Rect rect_cell(x, y, x+size_cell.width, y+size_cell.height); si.rect_cell.push_back(rect_cell); rect_cell.shrink(rect_cell_shrink.left, rect_cell_shrink.top, rect_cell_shrink.right, rect_cell_shrink.bottom); // part_cell.get_content_box(si.rect_cell); Rect rect_cell_content = rect_cell; si.rect_icon = get_icon_rect(rect_cell_content, item, rect_cell_content.left); si.rect_icon_selection = si.rect_icon; si.rect_icon_selection.shrink(icon_sel_shrink_box.left, icon_sel_shrink_box.top, icon_sel_shrink_box.right, icon_sel_shrink_box.bottom); const std::string &text = si.item.get_column(header->get_first_column().get_column_id()).get_text(); Size text_size = font.get_text_size(canvas, text); Rect text_rect; text_rect.left = rect_cell_content.get_center().x - text_size.width/2; text_rect.top = rect_cell_content.bottom - text_size.height; text_rect.set_size(text_size); si.descent = font.get_font_metrics().get_descent(); si.rect_text.push_back(text_rect); shown_items.push_back(si); x += size_cell.width; if (x + size_cell.width > rect_view.right) { row_counter++; if (row_counter > (max_rows_visible+1)) break; y += size_cell.height; x = rect_view.left; } item = item.get_next_sibling(); } valid = true; }