diff --git a/include/wx/generic/private/rowheightcache.h b/include/wx/generic/private/rowheightcache.h index 23dbcbbd1b..6cb4489e7c 100644 --- a/include/wx/generic/private/rowheightcache.h +++ b/include/wx/generic/private/rowheightcache.h @@ -21,39 +21,40 @@ struct RowRange }; /** -@class RowRanges -A helper class that manages a set of RowRange objects. -It stores the indices that are members of a group in a memory -efficiant way. + A helper class that manages a set of RowRange objects. + + It stores the indices that are members of a group in a memory + efficient way. */ class WXDLLIMPEXP_CORE RowRanges -//class RowRanges { public: /** - Adds a row index to this group by adding it to an existing RowRange - or by creating a new one. + Adds a row index to this group by adding it to an existing RowRange + or by creating a new one. */ void Add(unsigned int row); /** - Removes a row index and all indices after idx from this group. + Removes a row index and all indices after idx from this group. */ void Remove(unsigned int row); /** - Checks whether a row index is contained in this group. + Checks whether a row index is contained in this group. */ bool Has(unsigned int row) const; /** - Returns the number of row indices that are contained in this group. + Returns the number of row indices that are contained in this group. */ unsigned int CountAll() const; /** - Returns the number of rows that are in this group before the given row index. - not including given row. + Returns the number of rows that are in this group before the given row + index. + + Not that this doesn't include the given row. */ unsigned int CountTo(unsigned int row) const; @@ -66,10 +67,11 @@ public: private: wxVector m_ranges; + /** - If a new row index was inserted Cleanup checks if the neighbour ranges - of idx can includes the same row indices and discards - unnecessary RowRange objects. + If a new row index was inserted, Cleanup() checks if the neighbour + ranges of idx can includes the same row indices and discards + unnecessary RowRange objects. */ void CleanUp(unsigned int idx); }; @@ -78,70 +80,75 @@ WX_DECLARE_HASH_MAP(unsigned int, RowRanges*, wxIntegerHash, wxIntegerEqual, HeightToRowRangesMap); /** -@class HeightCache + HeightCache implements a cache mechanism for wxDataViewCtrl. -HeightCache implements a cache mechanism for the DataViewCtrl to give -fast access to: -* the height of one line (GetLineHeight) -* the y-coordinate where a row starts (GetLineStart) -* and vice versa (GetLineAt) + It gives fast access to: + * the height of one line (GetLineHeight) + * the y-coordinate where a row starts (GetLineStart) + * and vice versa (GetLineAt) -The layout of the cache is a hashmap where the keys are all exisiting -row heights in pixels. The values are RowRange objects that represents -all having the specified height. + The layout of the cache is a hashmap where the keys are all existing row + heights in pixels. The values are RowRange objects that represent all rows + having the specified height. -{ -22: RowRange([0..10], [15..17], [20..2000]), -42: RowRange([11..12], [18..18]), -62: RowRange([13..14], [19..19]) -} + An example: + @code + { + 22: RowRange([0..10], [15..17], [20..2000]), + 42: RowRange([11..12], [18..18]), + 62: RowRange([13..14], [19..19]) + } + @endcode -Examples -======== + Examples + ======== -GetLineStart ------------- -To retrieve the y-coordinate of item 1000 it is neccessary to look into -each key of the hashmap *m_heightToRowRange*. Get the row count of -indices lower than 1000 (RowRange::CountTo) and multiplies it wich the -according height. + GetLineStart + ------------ + To retrieve the y-coordinate of item 1000 it is necessary to look into + each key of the hashmap *m_heightToRowRange*. Get the row count of + indices lower than 1000 (RowRange::CountTo) and multiplies it which the + according height. -RowRange([0..10], [15..17], [20..2000]).CountTo(1000) ---> 0..10 are 11 items, 15..17 are 3 items and 20..1000 are 980 items (1000-20) -= 11 + 3 + 980 = 994 items + RowRange([0..10], [15..17], [20..2000]).CountTo(1000) + --> 0..10 are 11 items, 15..17 are 3 items and 20..1000 are 980 items (1000-20) + = 11 + 3 + 980 = 994 items -GetLineStart(1000) --> (22 * 994) + (42 * 3) + (62 * 3) = 22180 + GetLineStart(1000) --> (22 * 994) + (42 * 3) + (62 * 3) = 22180 -GetLineHeight -------------- -To retrieve the line height look into each key and check if row is -contained in RowRange (RowRange::Has) + GetLineHeight + ------------- + To retrieve the line height look into each key and check if row is + contained in RowRange (RowRange::Has) -GetLineAt ---------- -To retrieve the row that starts at a specific y-coordinate. -Look into each key and count all rows. -Use bisect algorithm in combination with GetLineStart() to -find the appropriate item + GetLineAt + --------- + To retrieve the row that starts at a specific y-coordinate. + Look into each key and count all rows. + Use bisect algorithm in combination with GetLineStart() to + find the appropriate item */ class WXDLLIMPEXP_ADV HeightCache { public: - bool GetLineStart(unsigned int row, int &start); - bool GetLineHeight(unsigned int row, int &height); - bool GetLineAt(int y, unsigned int &row); + bool GetLineStart(unsigned int row, int& start); + bool GetLineHeight(unsigned int row, int& height); + bool GetLineAt(int y, unsigned int& row); + + void Put(unsigned int row, int height); - void Put(const unsigned int row, const int height); /** - removes the stored height of the given row from the cache - and invalidates all cached rows (including row) + Removes the stored height of the given row from the cache and + invalidates all cached rows (including the given one). */ - void Remove(const unsigned int row); + void Remove(unsigned int row); + void Clear(); private: bool GetLineInfo(unsigned int row, int &start, int &height); - HeightToRowRangesMap m_heightToRowRange; + + HeightToRowRangesMap m_heightToRowRange; }; diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index 9674e53d5b..1c601f583f 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -3447,7 +3447,7 @@ int wxDataViewMainWindow::GetLineAt( unsigned int y ) const if (!node) { // not really correct... - return row + ((y - yy) / m_lineHeight); + return row + ((y-yy) / m_lineHeight); } item = node->GetItem(); } diff --git a/src/generic/rowheightcache.cpp b/src/generic/rowheightcache.cpp index 5168b86622..21529bccb6 100644 --- a/src/generic/rowheightcache.cpp +++ b/src/generic/rowheightcache.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: wx/private/rowheightcache.h +// Name: generic/rowheightcache.cpp // Purpose: height cache of rows in a dataview // Author: Jens Goepfert (mail@jensgoepfert.de) // Created: 2018-03-06 @@ -27,20 +27,15 @@ #include "wx/generic/private/rowheightcache.h" -// ---------------------------------------------------------------------------- -// private structs -// ---------------------------------------------------------------------------- - // ============================================================================ // implementation // ============================================================================ - // ---------------------------------------------------------------------------- // RowRanges // ---------------------------------------------------------------------------- -void RowRanges::Add(const unsigned int row) +void RowRanges::Add(unsigned int row) { size_t count = m_ranges.size(); size_t rngIdx = 0; @@ -63,7 +58,8 @@ void RowRanges::Add(const unsigned int row) } if (row == rng.to) { - // extend range at the end (set to row+1 because 'to' is not including) + // extend range at the end (set to row+1 because 'to' is not + // including) rng.to = row + 1; CleanUp(rngIdx); return; @@ -71,7 +67,8 @@ void RowRanges::Add(const unsigned int row) if (rng.from > row + 1) { - // this range is already behind row index, so break here and insert a new range before + // this range is already behind row index, so break here and insert + // a new range before break; } } @@ -82,7 +79,7 @@ void RowRanges::Add(const unsigned int row) m_ranges.insert(m_ranges.begin() + rngIdx, newRange); } -void RowRanges::Remove(const unsigned int row) +void RowRanges::Remove(unsigned int row) { size_t count = m_ranges.size(); size_t rngIdx = 0; @@ -129,7 +126,8 @@ void RowRanges::CleanUp(unsigned int idx) if (prevRng->to == rng.from) { // this range starts where the previous range began, so remove this - // and set the to-value of the previous range to the to-value of this range + // and set the to-value of the previous range to the to-value of + // this range prevRng->to = rng.to; m_ranges.erase(m_ranges.begin() + rngIdx); count--; @@ -274,7 +272,8 @@ bool HeightCache::GetLineAt(int y, unsigned int &row) } else { - // should never happen, except the HeightCache has gaps which is an invalid state + // should never happen, except the HeightCache has gaps which is an + // invalid state return false; } } @@ -295,7 +294,7 @@ bool HeightCache::GetLineAt(int y, unsigned int &row) } } -void HeightCache::Put(const unsigned int row, const int height) +void HeightCache::Put(unsigned int row, int height) { RowRanges *rowRanges = m_heightToRowRange[height]; if (rowRanges == NULL) @@ -306,7 +305,7 @@ void HeightCache::Put(const unsigned int row, const int height) rowRanges->Add(row); } -void HeightCache::Remove(const unsigned int row) +void HeightCache::Remove(unsigned int row) { HeightToRowRangesMap::iterator it; for (it = m_heightToRowRange.begin(); it != m_heightToRowRange.end(); ++it) diff --git a/tests/rowheightcache/rowheightcachetest.cpp b/tests/rowheightcache/rowheightcachetest.cpp index 51e0ac1daa..35867565a1 100644 --- a/tests/rowheightcache/rowheightcachetest.cpp +++ b/tests/rowheightcache/rowheightcachetest.cpp @@ -22,11 +22,6 @@ #include "wx/generic/private/rowheightcache.h" -// ---------------------------------------------------------------------------- -// local functions -// ---------------------------------------------------------------------------- - - // ---------------------------------------------------------------------------- // TestRowRangesAdd // ----------------------------------------------------------------------------