Fix windows table insertion/deletion to match API.

Fix double row insertion bug on uiTableModelRowInserted().
Fix uiTableModelRowDeleted() to match API.
Remove redundant call to update row count.
Remove TODOs that have been implemented.
Use more readable win32 macros.
This commit is contained in:
Angelo Haller 2020-09-20 19:51:09 -05:00
parent 7336dce8c8
commit 6d07723fb6
1 changed files with 12 additions and 32 deletions

View File

@ -24,28 +24,19 @@ void uiFreeTableModel(uiTableModel *m)
uiprivFree(m);
}
// TODO document that when this is called, the model must return the new row count when asked
void uiTableModelRowInserted(uiTableModel *m, int newIndex)
{
LVITEMW item;
int newCount;
newCount = uiprivTableModelNumRows(m);
ZeroMemory(&item, sizeof (LVITEMW));
LVITEMW item = {};
item.mask = 0;
item.iItem = newIndex;
item.iSubItem = 0;
for (auto t : *(m->tables)) {
// actually insert the rows
if (SendMessageW(t->hwnd, LVM_SETITEMCOUNT, (WPARAM) newCount, LVSICF_NOINVALIDATEALL) == 0)
logLastError(L"error calling LVM_SETITEMCOUNT in uiTableModelRowInserted()");
// and redraw every row from the new row down to simulate adding it
if (SendMessageW(t->hwnd, LVM_REDRAWITEMS, (WPARAM) newIndex, (LPARAM) (newCount - 1)) == FALSE)
logLastError(L"error calling LVM_REDRAWITEMS in uiTableModelRowInserted()");
// update selection state
if (SendMessageW(t->hwnd, LVM_INSERTITEM, 0, (LPARAM) (&item)) == (LRESULT) (-1))
logLastError(L"error calling LVM_INSERTITEM in uiTableModelRowInserted() to update selection state");
for (auto t : *(m->tables)) {
if (ListView_InsertItem(t->hwnd, &item) == -1)
logLastError(L"error calling ListView_InsertItem in uiTableModelRowInserted()");
// redraw every row from the new row down to simulate adding it
if (ListView_RedrawItems(t->hwnd, newIndex, ListView_GetItemCount(t->hwnd)-1) == -1)
logLastError(L"error calling ListView_RedrawItems in uiTableModelRowInserted()");
}
}
@ -57,25 +48,14 @@ void uiTableModelRowChanged(uiTableModel *m, int index)
logLastError(L"error calling LVM_UPDATE in uiTableModelRowChanged()");
}
// TODO document that when this is called, the model must return the OLD row count when asked
// TODO for this and the above, see what GTK+ requires and adjust accordingly
void uiTableModelRowDeleted(uiTableModel *m, int oldIndex)
{
int newCount;
newCount = uiprivTableModelNumRows(m);
newCount--;
for (auto t : *(m->tables)) {
// update selection state
if (SendMessageW(t->hwnd, LVM_DELETEITEM, (WPARAM) oldIndex, 0) == (LRESULT) (-1))
logLastError(L"error calling LVM_DELETEITEM in uiTableModelRowDeleted() to update selection state");
// actually delete the rows
if (SendMessageW(t->hwnd, LVM_SETITEMCOUNT, (WPARAM) newCount, LVSICF_NOINVALIDATEALL) == 0)
logLastError(L"error calling LVM_SETITEMCOUNT in uiTableModelRowDeleted()");
// and redraw every row from the new nth row down to simulate removing the old nth row
if (SendMessageW(t->hwnd, LVM_REDRAWITEMS, (WPARAM) oldIndex, (LPARAM) (newCount - 1)) == FALSE)
logLastError(L"error calling LVM_REDRAWITEMS in uiTableModelRowDeleted()");
if (ListView_DeleteItem(t->hwnd, oldIndex) == -1)
logLastError(L"error calling ListView_DeleteItem() in uiTableModelRowDeleted()");
// redraw every row from the new nth row down to simulate removing the old nth row
if (ListView_RedrawItems(t->hwnd, oldIndex, ListView_GetItemCount(t->hwnd)-1) == -1)
logLastError(L"error calling ListView_RedrawItems() in uiTableModelRowDeleted()");
}
}