From 6d07723fb637dcd1b509e7fa466c95b138724499 Mon Sep 17 00:00:00 2001 From: Angelo Haller Date: Sun, 20 Sep 2020 19:51:09 -0500 Subject: [PATCH] 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. --- windows/table.cpp | 44 ++++++++++++-------------------------------- 1 file changed, 12 insertions(+), 32 deletions(-) diff --git a/windows/table.cpp b/windows/table.cpp index 85a51c1a..75b99195 100644 --- a/windows/table.cpp +++ b/windows/table.cpp @@ -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()"); } }