* Tried to make the scrolling position less surprising when resizing the window.

Sometimes it even seems to work :-)
* FrameResized() called _UpdateSize(), although DoLayout() already did so.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29910 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2009-04-04 22:22:34 +00:00
parent 3a45db8ab8
commit 7f629a4121
2 changed files with 70 additions and 2 deletions

View File

@ -214,7 +214,17 @@ CharacterView::MinSize()
void void
CharacterView::FrameResized(float width, float height) CharacterView::FrameResized(float width, float height)
{ {
_UpdateSize(); // Scroll to character
if (!fHasTopCharacter)
return;
BRect frame = _FrameFor(fTopCharacter);
if (!frame.IsValid())
return;
BView::ScrollTo(0, frame.top - fTopOffset);
fHasTopCharacter = false;
} }
@ -396,6 +406,7 @@ CharacterView::Draw(BRect updateRect)
void void
CharacterView::DoLayout() CharacterView::DoLayout()
{ {
fHasTopCharacter = _GetTopmostCharacter(fTopCharacter, fTopOffset);
_UpdateSize(); _UpdateSize();
} }
@ -408,7 +419,7 @@ CharacterView::_BlockAt(BPoint point)
if (!IsShowingBlock(i)) if (!IsShowingBlock(i))
continue; continue;
if (fTitleTops[i] < point.y if (fTitleTops[i] <= point.y
&& (i == kNumUnicodeBlocks - 1 || fTitleTops[i + 1] > point.y)) && (i == kNumUnicodeBlocks - 1 || fTitleTops[i + 1] > point.y))
return i; return i;
} }
@ -538,6 +549,57 @@ CharacterView::_UpdateSize()
} }
bool
CharacterView::_GetTopmostCharacter(uint32& character, int32& offset)
{
int32 top = (int32)Bounds().top;
int32 i = _BlockAt(BPoint(0, top));
if (i == -1)
return false;
int32 characterTop = fTitleTops[i] + fTitleHeight;
if (characterTop > top) {
character = kUnicodeBlocks[i].start;
offset = characterTop - top;
return true;
}
int32 lines = (top - characterTop + fCharacterHeight - 1)
/ fCharacterHeight;
character = kUnicodeBlocks[i].start + lines * fCharactersPerLine;
offset = top - characterTop - lines * fCharacterHeight;
return true;
}
BRect
CharacterView::_FrameFor(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
return BRect();
}
int32 diff = character - kUnicodeBlocks[i].start;
int32 y = fTitleTops[i] + fTitleHeight + diff / fCharactersPerLine;
int32 x = fGap / 2 + diff % fCharactersPerLine;
return BRect(x, y, x + fCharacterWidth + fGap, y + fCharacterHeight);
}
return BRect();
}
void void
CharacterView::_CopyToClipboard(const char* text) CharacterView::_CopyToClipboard(const char* text)
{ {

View File

@ -60,6 +60,9 @@ private:
bool _GetCharacterAt(BPoint point, uint32& character, bool _GetCharacterAt(BPoint point, uint32& character,
BRect* _frame = NULL); BRect* _frame = NULL);
void _UpdateSize(); void _UpdateSize();
bool _GetTopmostCharacter(uint32& character,
int32& offset);
BRect _FrameFor(uint32 character);
void _CopyToClipboard(const char* text); void _CopyToClipboard(const char* text);
private: private:
@ -69,6 +72,9 @@ private:
bool fHasCharacter; bool fHasCharacter;
uint32 fCurrentCharacter; uint32 fCurrentCharacter;
BRect fCurrentCharacterFrame; BRect fCurrentCharacterFrame;
bool fHasTopCharacter;
uint32 fTopCharacter;
int32 fTopOffset;
bool fShowPrivateBlocks; bool fShowPrivateBlocks;
bool fShowContainedBlocksOnly; bool fShowContainedBlocksOnly;