X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Ftext-controller-relayouter.cpp;h=8888859fc1df857b1b9a78bcd3f69d088998216f;hp=2b362c0a18a887e028c787155e3148fa31b9c225;hb=c4f615acb91de4d6809319fb72700d22298b81c8;hpb=8112af2d369becef537a1decac926550675f71ef diff --git a/dali-toolkit/internal/text/text-controller-relayouter.cpp b/dali-toolkit/internal/text/text-controller-relayouter.cpp index 2b362c0..8888859 100644 --- a/dali-toolkit/internal/text/text-controller-relayouter.cpp +++ b/dali-toolkit/internal/text/text-controller-relayouter.cpp @@ -636,14 +636,27 @@ bool Controller::Relayouter::DoRelayout(Controller& controller, const Size& size void Controller::Relayouter::CalculateVerticalOffset(Controller& controller, const Size& controlSize) { - Controller::Impl& impl = *controller.mImpl; - ModelPtr& model = impl.mModel; - Size layoutSize = model->mVisualModel->GetLayoutSize(); + Controller::Impl& impl = *controller.mImpl; + ModelPtr& model = impl.mModel; + VisualModelPtr& visualModel = model->mVisualModel; + Size layoutSize = model->mVisualModel->GetLayoutSize(); + Size oldLayoutSize = layoutSize; + float offsetY = 0.f; + bool needRecalc = false; + float defaultFontLineHeight = impl.GetDefaultFontLineHeight(); if(fabsf(layoutSize.height) < Math::MACHINE_EPSILON_1000) { // Get the line height of the default font. - layoutSize.height = impl.GetDefaultFontLineHeight(); + layoutSize.height = defaultFontLineHeight; + } + + if (layoutSize.height != defaultFontLineHeight) + { + // This code prevents the wrong positioning of cursor when the layout size is bigger/smaller than defaultFontLineHeight. + // This situation occurs when the size of placeholder text is different from the default text. + layoutSize.height = defaultFontLineHeight; + needRecalc = true; } switch(model->mVerticalAlignment) @@ -651,19 +664,34 @@ void Controller::Relayouter::CalculateVerticalOffset(Controller& controller, con case VerticalAlignment::TOP: { model->mScrollPosition.y = 0.f; + offsetY = 0.f; break; } case VerticalAlignment::CENTER: { model->mScrollPosition.y = floorf(0.5f * (controlSize.height - layoutSize.height)); // try to avoid pixel alignment. + if (needRecalc) offsetY = floorf(0.5f * (layoutSize.height - oldLayoutSize.height)); break; } case VerticalAlignment::BOTTOM: { model->mScrollPosition.y = controlSize.height - layoutSize.height; + if (needRecalc) offsetY = layoutSize.height - oldLayoutSize.height; break; } } + + if (needRecalc) + { + // Update glyphPositions according to recalculation. + const Length positionCount = visualModel->mGlyphPositions.Count(); + Vector& glyphPositions = visualModel->mGlyphPositions; + for(Length index = 0u; index < positionCount; index++) + { + glyphPositions[index].y += offsetY; + } + } + } } // namespace Text