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:
parent
7336dce8c8
commit
6d07723fb6
|
@ -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()");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue