Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix table row inserted/deleted documentation and windows implementation. #515

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 14 additions & 11 deletions ui.h
Original file line number Diff line number Diff line change
Expand Up @@ -1324,11 +1324,13 @@ _UI_EXTERN uiTableModel *uiNewTableModel(uiTableModelHandler *mh);
// free table models currently associated with a uiTable.
_UI_EXTERN void uiFreeTableModel(uiTableModel *m);

// uiTableModelRowInserted() tells any uiTable associated with m
// that a new row has been added to m at index index. You call
// this function when the number of rows in your model has
// changed; after calling it, NumRows() should returm the new row
// count.
// uiTableModelRowInserted() tell all uiTables associated with
// the uiTableModel m that a new row has been added to m at
// index newIndex.
// You must insert the row data in your model before calling this
// function.
// NumRows() must represent the new row count before you call
// this function.
_UI_EXTERN void uiTableModelRowInserted(uiTableModel *m, int newIndex);

// uiTableModelRowChanged() tells any uiTable associated with m
Expand All @@ -1337,12 +1339,13 @@ _UI_EXTERN void uiTableModelRowInserted(uiTableModel *m, int newIndex);
// this if your data changes at some other point.
_UI_EXTERN void uiTableModelRowChanged(uiTableModel *m, int index);

// uiTableModelRowDeleted() tells any uiTable associated with m
// that the row at index index has been deleted. You call this
// function when the number of rows in your model has changed;
// after calling it, NumRows() should returm the new row
// count.
// TODO for this and Inserted: make sure the "after" part is right; clarify if it's after returning or after calling
// uiTableModelRowDeleted() tells all uiTables associated with
// the uiTableModel m that the row at index oldIndex has been
// deleted.
// You must delete the row from your model before you call this
// function.
// NumRows() must represent the new row count before you call
// this function.
_UI_EXTERN void uiTableModelRowDeleted(uiTableModel *m, int oldIndex);
// TODO reordering/moving

Expand Down
44 changes: 12 additions & 32 deletions windows/table.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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");
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()");
}
}

Expand All @@ -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()");
}
}

Expand Down