From 1d04e440a0b36680374fd56275b7cddf911a17fa Mon Sep 17 00:00:00 2001 From: upstream svn Date: Sat, 5 Mar 2011 23:08:58 +0000 Subject: [PATCH] Prevent flicker caused by unnecessary sort when a list control is already sorted correctly --- .svn-revision | 2 +- src/MuleListCtrl.cpp | 27 +++++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/.svn-revision b/.svn-revision index 50be988e..ab2acdaf 100644 --- a/.svn-revision +++ b/.svn-revision @@ -1 +1 @@ -10472 +10473 diff --git a/src/MuleListCtrl.cpp b/src/MuleListCtrl.cpp index bc09d6cd..39c2df20 100644 --- a/src/MuleListCtrl.cpp +++ b/src/MuleListCtrl.cpp @@ -391,11 +391,34 @@ void CMuleListCtrl::SortList() m_isSorting = true; + MuleSortData sortdata(m_sort_orders, m_sort_func); + + // In many cases control already has correct order, and sorting causes nasty flickering. + // Make one pass through it to check if sorting is necessary at all. + int nrItems = GetItemCount(); + bool clean = true; + long lastItemdata = 0; + if (nrItems > 1) { + lastItemdata = GetItemData(0); + } + for (int i = 1; i < nrItems; i++) { + long nextItemdata = GetItemData(i); + if (SortProc(lastItemdata, nextItemdata, (long int)&sortdata) > 0) { + // ok - we need to sort + clean = false; + break; + } + lastItemdata = nextItemdata; + } + if (clean) { + // no need to sort + m_isSorting = false; + return; + } + // Positions are likely to be invalid after sorting. ResetTTS(); - MuleSortData sortdata(m_sort_orders, m_sort_func); - // Store the current selected items ItemDataList selectedItems = GetSelectedItems(); // Store the focused item -- 2.11.4.GIT