comctl32: listview: Compute the state icon rect in GetItemMetrics.
This commit is contained in:
parent
f0ddaedc29
commit
88bdc3af95
|
@ -1886,10 +1886,11 @@ static void LISTVIEW_GetItemOrigin(LISTVIEW_INFO *infoPtr, INT nItem, LPPOINT lp
|
||||||
* [I] lpLVItem : item to compute the measures for
|
* [I] lpLVItem : item to compute the measures for
|
||||||
* [O] lprcBox : ptr to Box rectangle
|
* [O] lprcBox : ptr to Box rectangle
|
||||||
* Same as LVM_GETITEMRECT with LVIR_BOUNDS
|
* Same as LVM_GETITEMRECT with LVIR_BOUNDS
|
||||||
* [0] lprcSelectBox : ptr to State icon rectangle
|
* [0] lprcSelectBox : ptr to select box rectangle
|
||||||
* Same as LVM_GETITEMRECT with LVIR_SELECTEDBOUNDS
|
* Same as LVM_GETITEMRECT with LVIR_SELECTEDBOUNDS
|
||||||
* [O] lprcIcon : ptr to Icon rectangle
|
* [O] lprcIcon : ptr to Icon rectangle
|
||||||
* Same as LVM_GETITEMRECT with LVIR_ICON
|
* Same as LVM_GETITEMRECT with LVIR_ICON
|
||||||
|
* [O] lprcStateIcon: ptr to State Icon rectangle
|
||||||
* [O] lprcLabel : ptr to Label rectangle
|
* [O] lprcLabel : ptr to Label rectangle
|
||||||
* Same as LVM_GETITEMRECT with LVIR_LABEL
|
* Same as LVM_GETITEMRECT with LVIR_LABEL
|
||||||
*
|
*
|
||||||
|
@ -1898,7 +1899,7 @@ static void LISTVIEW_GetItemOrigin(LISTVIEW_INFO *infoPtr, INT nItem, LPPOINT lp
|
||||||
*/
|
*/
|
||||||
static void LISTVIEW_GetItemMetrics(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem,
|
static void LISTVIEW_GetItemMetrics(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem,
|
||||||
LPRECT lprcBox, LPRECT lprcSelectBox,
|
LPRECT lprcBox, LPRECT lprcSelectBox,
|
||||||
LPRECT lprcIcon, LPRECT lprcLabel)
|
LPRECT lprcIcon, LPRECT lprcStateIcon, LPRECT lprcLabel)
|
||||||
{
|
{
|
||||||
UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
|
UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
|
||||||
BOOL doSelectBox = FALSE, doIcon = FALSE, doLabel = FALSE, oversizedBox = FALSE;
|
BOOL doSelectBox = FALSE, doIcon = FALSE, doLabel = FALSE, oversizedBox = FALSE;
|
||||||
|
@ -1917,7 +1918,7 @@ static void LISTVIEW_GetItemMetrics(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVI
|
||||||
}
|
}
|
||||||
if (lprcSelectBox) doSelectBox = TRUE;
|
if (lprcSelectBox) doSelectBox = TRUE;
|
||||||
if (lprcLabel) doLabel = TRUE;
|
if (lprcLabel) doLabel = TRUE;
|
||||||
if (doLabel || lprcIcon) doIcon = TRUE;
|
if (doLabel || lprcIcon || lprcStateIcon) doIcon = TRUE;
|
||||||
if (doSelectBox)
|
if (doSelectBox)
|
||||||
{
|
{
|
||||||
doIcon = TRUE;
|
doIcon = TRUE;
|
||||||
|
@ -1942,9 +1943,9 @@ static void LISTVIEW_GetItemMetrics(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVI
|
||||||
Box.top = 0;
|
Box.top = 0;
|
||||||
Box.bottom = infoPtr->nItemHeight;
|
Box.bottom = infoPtr->nItemHeight;
|
||||||
|
|
||||||
/************************************************************/
|
/******************************************************************/
|
||||||
/* compute ICON bounding box (ala LVM_GETITEMRECT) */
|
/* compute ICON bounding box (ala LVM_GETITEMRECT) and STATEICON */
|
||||||
/************************************************************/
|
/******************************************************************/
|
||||||
if (doIcon)
|
if (doIcon)
|
||||||
{
|
{
|
||||||
LONG state_width = 0;
|
LONG state_width = 0;
|
||||||
|
@ -1983,6 +1984,16 @@ static void LISTVIEW_GetItemMetrics(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVI
|
||||||
}
|
}
|
||||||
if(lprcIcon) *lprcIcon = Icon;
|
if(lprcIcon) *lprcIcon = Icon;
|
||||||
TRACE(" - icon=%s\n", wine_dbgstr_rect(&Icon));
|
TRACE(" - icon=%s\n", wine_dbgstr_rect(&Icon));
|
||||||
|
|
||||||
|
/* TODO: is this correct? */
|
||||||
|
if (lprcStateIcon)
|
||||||
|
{
|
||||||
|
lprcStateIcon->left = Icon.left - state_width;
|
||||||
|
lprcStateIcon->right = Icon.left;
|
||||||
|
lprcStateIcon->top = Icon.top;
|
||||||
|
lprcStateIcon->bottom = lprcStateIcon->top + infoPtr->iconSize.cy;
|
||||||
|
TRACE(" - state icon=%s\n", wine_dbgstr_rect(lprcStateIcon));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else Icon.right = 0;
|
else Icon.right = 0;
|
||||||
|
|
||||||
|
@ -2144,7 +2155,7 @@ static void LISTVIEW_GetItemBox(LISTVIEW_INFO *infoPtr, INT nItem, LPRECT lprcBo
|
||||||
lvItem.stateMask = LVIS_FOCUSED;
|
lvItem.stateMask = LVIS_FOCUSED;
|
||||||
lvItem.state = (lvItem.mask & LVIF_TEXT ? LVIS_FOCUSED : 0);
|
lvItem.state = (lvItem.mask & LVIF_TEXT ? LVIS_FOCUSED : 0);
|
||||||
}
|
}
|
||||||
LISTVIEW_GetItemMetrics(infoPtr, &lvItem, lprcBox, 0, 0, 0);
|
LISTVIEW_GetItemMetrics(infoPtr, &lvItem, lprcBox, 0, 0, 0, 0);
|
||||||
|
|
||||||
OffsetRect(lprcBox, Position.x + Origin.x, Position.y + Origin.y);
|
OffsetRect(lprcBox, Position.x + Origin.x, Position.y + Origin.y);
|
||||||
}
|
}
|
||||||
|
@ -3714,7 +3725,7 @@ static BOOL LISTVIEW_DrawItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT nItem, INT nS
|
||||||
WCHAR szDispText[DISP_TEXT_SIZE] = { '\0' };
|
WCHAR szDispText[DISP_TEXT_SIZE] = { '\0' };
|
||||||
static const WCHAR szCallback[] = { '(', 'c', 'a', 'l', 'l', 'b', 'a', 'c', 'k', ')', 0 };
|
static const WCHAR szCallback[] = { '(', 'c', 'a', 'l', 'l', 'b', 'a', 'c', 'k', ')', 0 };
|
||||||
DWORD cdsubitemmode = CDRF_DODEFAULT;
|
DWORD cdsubitemmode = CDRF_DODEFAULT;
|
||||||
RECT* lprcFocus, rcSelect, rcBox, rcIcon, rcLabel;
|
RECT *lprcFocus, rcSelect, rcBox, rcIcon, rcLabel, rcStateIcon;
|
||||||
NMLVCUSTOMDRAW nmlvcd;
|
NMLVCUSTOMDRAW nmlvcd;
|
||||||
HIMAGELIST himl;
|
HIMAGELIST himl;
|
||||||
LVITEMW lvItem;
|
LVITEMW lvItem;
|
||||||
|
@ -3743,10 +3754,11 @@ static BOOL LISTVIEW_DrawItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT nItem, INT nS
|
||||||
lprcFocus = infoPtr->bFocus && (lvItem.state & LVIS_FOCUSED) ? &infoPtr->rcFocus : 0;
|
lprcFocus = infoPtr->bFocus && (lvItem.state & LVIS_FOCUSED) ? &infoPtr->rcFocus : 0;
|
||||||
|
|
||||||
if (!lprcFocus) lvItem.state &= ~LVIS_FOCUSED;
|
if (!lprcFocus) lvItem.state &= ~LVIS_FOCUSED;
|
||||||
LISTVIEW_GetItemMetrics(infoPtr, &lvItem, &rcBox, &rcSelect, &rcIcon, &rcLabel);
|
LISTVIEW_GetItemMetrics(infoPtr, &lvItem, &rcBox, &rcSelect, &rcIcon, &rcStateIcon, &rcLabel);
|
||||||
OffsetRect(&rcBox, pos.x, pos.y);
|
OffsetRect(&rcBox, pos.x, pos.y);
|
||||||
OffsetRect(&rcSelect, pos.x, pos.y);
|
OffsetRect(&rcSelect, pos.x, pos.y);
|
||||||
OffsetRect(&rcIcon, pos.x, pos.y);
|
OffsetRect(&rcIcon, pos.x, pos.y);
|
||||||
|
OffsetRect(&rcStateIcon, pos.x, pos.y);
|
||||||
OffsetRect(&rcLabel, pos.x, pos.y);
|
OffsetRect(&rcLabel, pos.x, pos.y);
|
||||||
TRACE(" rcBox=%s, rcSelect=%s, rcIcon=%s. rcLabel=%s\n",
|
TRACE(" rcBox=%s, rcSelect=%s, rcIcon=%s. rcLabel=%s\n",
|
||||||
wine_dbgstr_rect(&rcBox), wine_dbgstr_rect(&rcSelect),
|
wine_dbgstr_rect(&rcBox), wine_dbgstr_rect(&rcSelect),
|
||||||
|
@ -3783,8 +3795,7 @@ static BOOL LISTVIEW_DrawItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT nItem, INT nS
|
||||||
{
|
{
|
||||||
TRACE("uStateImage=%d\n", uStateImage);
|
TRACE("uStateImage=%d\n", uStateImage);
|
||||||
ImageList_Draw(infoPtr->himlState, uStateImage - 1, hdc,
|
ImageList_Draw(infoPtr->himlState, uStateImage - 1, hdc,
|
||||||
rcIcon.left - infoPtr->iconStateSize.cx,
|
rcStateIcon.left, rcStateIcon.top, ILD_NORMAL);
|
||||||
rcIcon.top, ILD_NORMAL);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5645,19 +5656,19 @@ static BOOL LISTVIEW_GetItemRect(LISTVIEW_INFO *infoPtr, INT nItem, LPRECT lprc)
|
||||||
switch(lprc->left)
|
switch(lprc->left)
|
||||||
{
|
{
|
||||||
case LVIR_ICON:
|
case LVIR_ICON:
|
||||||
LISTVIEW_GetItemMetrics(infoPtr, &lvItem, NULL, NULL, lprc, NULL);
|
LISTVIEW_GetItemMetrics(infoPtr, &lvItem, NULL, NULL, lprc, NULL, NULL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LVIR_LABEL:
|
case LVIR_LABEL:
|
||||||
LISTVIEW_GetItemMetrics(infoPtr, &lvItem, NULL, NULL, NULL, lprc);
|
LISTVIEW_GetItemMetrics(infoPtr, &lvItem, NULL, NULL, NULL, NULL, lprc);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LVIR_BOUNDS:
|
case LVIR_BOUNDS:
|
||||||
LISTVIEW_GetItemMetrics(infoPtr, &lvItem, lprc, NULL, NULL, NULL);
|
LISTVIEW_GetItemMetrics(infoPtr, &lvItem, lprc, NULL, NULL, NULL, NULL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LVIR_SELECTBOUNDS:
|
case LVIR_SELECTBOUNDS:
|
||||||
LISTVIEW_GetItemMetrics(infoPtr, &lvItem, NULL, lprc, NULL, NULL);
|
LISTVIEW_GetItemMetrics(infoPtr, &lvItem, NULL, lprc, NULL, NULL, NULL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -5719,12 +5730,12 @@ static BOOL LISTVIEW_GetSubItemRect(LISTVIEW_INFO *infoPtr, INT nItem, LPRECT lp
|
||||||
switch(lprc->left)
|
switch(lprc->left)
|
||||||
{
|
{
|
||||||
case LVIR_ICON:
|
case LVIR_ICON:
|
||||||
LISTVIEW_GetItemMetrics(infoPtr, &lvItem, NULL, NULL, lprc, NULL);
|
LISTVIEW_GetItemMetrics(infoPtr, &lvItem, NULL, NULL, lprc, NULL, NULL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LVIR_LABEL:
|
case LVIR_LABEL:
|
||||||
case LVIR_BOUNDS:
|
case LVIR_BOUNDS:
|
||||||
LISTVIEW_GetItemMetrics(infoPtr, &lvItem, lprc, NULL, NULL, NULL);
|
LISTVIEW_GetItemMetrics(infoPtr, &lvItem, lprc, NULL, NULL, NULL, NULL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -6203,7 +6214,7 @@ static INT LISTVIEW_HitTest(LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht, BOOL s
|
||||||
if (!LISTVIEW_GetItemW(infoPtr, &lvItem)) return -1;
|
if (!LISTVIEW_GetItemW(infoPtr, &lvItem)) return -1;
|
||||||
if (!infoPtr->bFocus) lvItem.state &= ~LVIS_FOCUSED;
|
if (!infoPtr->bFocus) lvItem.state &= ~LVIS_FOCUSED;
|
||||||
|
|
||||||
LISTVIEW_GetItemMetrics(infoPtr, &lvItem, &rcBox, NULL, &rcIcon, &rcLabel);
|
LISTVIEW_GetItemMetrics(infoPtr, &lvItem, &rcBox, NULL, &rcIcon, &rcState, &rcLabel);
|
||||||
LISTVIEW_GetItemOrigin(infoPtr, iItem, &Position);
|
LISTVIEW_GetItemOrigin(infoPtr, iItem, &Position);
|
||||||
opt.x = lpht->pt.x - Position.x - Origin.x;
|
opt.x = lpht->pt.x - Position.x - Origin.x;
|
||||||
opt.y = lpht->pt.y - Position.y - Origin.y;
|
opt.y = lpht->pt.y - Position.y - Origin.y;
|
||||||
|
@ -6215,9 +6226,6 @@ static INT LISTVIEW_HitTest(LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht, BOOL s
|
||||||
TRACE("rcBounds=%s\n", wine_dbgstr_rect(&rcBounds));
|
TRACE("rcBounds=%s\n", wine_dbgstr_rect(&rcBounds));
|
||||||
if (!PtInRect(&rcBounds, opt)) return -1;
|
if (!PtInRect(&rcBounds, opt)) return -1;
|
||||||
|
|
||||||
rcState = rcIcon;
|
|
||||||
OffsetRect(&rcState, -infoPtr->iconStateSize.cx, 0);
|
|
||||||
|
|
||||||
if (PtInRect(&rcIcon, opt))
|
if (PtInRect(&rcIcon, opt))
|
||||||
lpht->flags |= LVHT_ONITEMICON;
|
lpht->flags |= LVHT_ONITEMICON;
|
||||||
else if (PtInRect(&rcLabel, opt))
|
else if (PtInRect(&rcLabel, opt))
|
||||||
|
|
Loading…
Reference in New Issue