From 74d9b875c2b854cadbd674a37bdde3ea64a4f062 Mon Sep 17 00:00:00 2001 From: dsizzle Date: Sun, 23 Nov 2014 19:47:32 +0000 Subject: [PATCH] CharacterMap: select Unicode block for current character * Scrolling the list of characters now selects the currently visible block in the blocks list. Signed-off-by: Adrien Destugues Fixes #3651, part 1 --- src/apps/charactermap/CharacterView.cpp | 6 ++++++ src/apps/charactermap/CharacterWindow.cpp | 2 ++ src/apps/charactermap/UnicodeBlockView.cpp | 19 +++++++++++++++++++ src/apps/charactermap/UnicodeBlockView.h | 1 + 4 files changed, 28 insertions(+) diff --git a/src/apps/charactermap/CharacterView.cpp b/src/apps/charactermap/CharacterView.cpp index 9a25108816..529e2a9e1f 100644 --- a/src/apps/charactermap/CharacterView.cpp +++ b/src/apps/charactermap/CharacterView.cpp @@ -108,6 +108,12 @@ CharacterView::IsShowingBlock(int32 blockIndex) const void CharacterView::ScrollToBlock(int32 blockIndex) { + // don't scroll if the selected character is already in view. + // this prevents distracting jumps when crossing a block + // boundary in the character view. + if (IsCharacterVisible(fCurrentCharacter)) + return; + if (blockIndex < 0) blockIndex = 0; else if (blockIndex >= (int32)kNumUnicodeBlocks) diff --git a/src/apps/charactermap/CharacterWindow.cpp b/src/apps/charactermap/CharacterWindow.cpp index acfbe0ffe3..46ccb920d2 100644 --- a/src/apps/charactermap/CharacterWindow.cpp +++ b/src/apps/charactermap/CharacterWindow.cpp @@ -319,6 +319,8 @@ CharacterWindow::MessageReceived(BMessage* message) fGlyphView->SetText(glyph); fCodeView->SetText(text); + + fUnicodeBlockView->SelectBlockForCharacter(character); break; } diff --git a/src/apps/charactermap/UnicodeBlockView.cpp b/src/apps/charactermap/UnicodeBlockView.cpp index fd192afb00..a643875cb8 100644 --- a/src/apps/charactermap/UnicodeBlockView.cpp +++ b/src/apps/charactermap/UnicodeBlockView.cpp @@ -118,3 +118,22 @@ UnicodeBlockView::_CreateBlocks() _UpdateBlocks(); } + +void +UnicodeBlockView::SelectBlockForCharacter(uint32 character) +{ + // find block containing the character + + // TODO: could use binary search here + for (uint32 i = 0; i < kNumUnicodeBlocks; i++) { + if (kUnicodeBlocks[i].end < character) + continue; + if (kUnicodeBlocks[i].start > character) { + // Character is not mapped + break; + } + + Select(i); + ScrollToSelection(); + } +} diff --git a/src/apps/charactermap/UnicodeBlockView.h b/src/apps/charactermap/UnicodeBlockView.h index 6bfedbc2a9..03c3d32248 100644 --- a/src/apps/charactermap/UnicodeBlockView.h +++ b/src/apps/charactermap/UnicodeBlockView.h @@ -40,6 +40,7 @@ public: { return fShowContainedBlocksOnly; } bool IsShowingBlock(int32 blockIndex) const; + void SelectBlockForCharacter(uint32 character); private: void _UpdateBlocks();