//----------------------------------------------------------------------------// Rectf ComponentArea::getPixelRect(const Window& wnd, const Rectf& container) const { Rectf pixelRect; // use a property? if (isAreaFetchedFromProperty()) { pixelRect = CoordConverter::asAbsolute( wnd.getProperty<URect>(d_namedSource), wnd.getPixelSize()); } else if (isAreaFetchedFromNamedArea()) { return WidgetLookManager::getSingleton() .getWidgetLook(d_namedAreaSourceLook) .getNamedArea(d_namedSource) .getArea() .getPixelRect(wnd, container); } // not via property or named area- calculate using Dimensions else { // sanity check, we mus be able to form a Rect from what we represent. assert(d_left.getDimensionType() == DT_LEFT_EDGE || d_left.getDimensionType() == DT_X_POSITION); assert(d_top.getDimensionType() == DT_TOP_EDGE || d_top.getDimensionType() == DT_Y_POSITION); assert(d_right_or_width.getDimensionType() == DT_RIGHT_EDGE || d_right_or_width.getDimensionType() == DT_WIDTH); assert(d_bottom_or_height.getDimensionType() == DT_BOTTOM_EDGE || d_bottom_or_height.getDimensionType() == DT_HEIGHT); pixelRect.left(d_left.getBaseDimension().getValue(wnd, container) + container.left()); pixelRect.top(d_top.getBaseDimension().getValue(wnd, container) + container.top()); if (d_right_or_width.getDimensionType() == DT_WIDTH) pixelRect.setWidth(d_right_or_width.getBaseDimension().getValue(wnd, container)); else pixelRect.right(d_right_or_width.getBaseDimension().getValue(wnd, container) + container.left()); if (d_bottom_or_height.getDimensionType() == DT_HEIGHT) pixelRect.setHeight(d_bottom_or_height.getBaseDimension().getValue(wnd, container)); else pixelRect.bottom(d_bottom_or_height.getBaseDimension().getValue(wnd, container) + container.top()); } return pixelRect; }
void FalagardMultiLineEditbox::cacheCaretImagery(const Rectf& textArea) { MultiLineEditbox* w = (MultiLineEditbox*)d_window; const Font* fnt = w->getFont(); // require a font so that we can calculate caret position. if (fnt) { // get line that caret is in size_t caretLine = w->getLineNumberFromIndex(w->getCaretIndex()); const MultiLineEditbox::LineList& d_lines = w->getFormattedLines(); // if caret line is valid. if (caretLine < d_lines.size()) { // calculate pixel offsets to where caret should be drawn size_t caretLineIdx = w->getCaretIndex() - d_lines[caretLine].d_startIdx; float ypos = caretLine * fnt->getLineSpacing(); float xpos = fnt->getTextAdvance(w->getText().substr(d_lines[caretLine].d_startIdx, caretLineIdx)); // // get base offset to target layer for cursor. // Renderer* renderer = System::getSingleton().getRenderer(); // float baseZ = renderer->getZLayer(7) - renderer->getCurrentZ(); // get WidgetLookFeel for the assigned look. const WidgetLookFeel& wlf = getLookNFeel(); // get caret imagery const ImagerySection& caretImagery = wlf.getImagerySection("Caret"); // calculate finat destination area for caret Rectf caretArea; caretArea.left(textArea.left() + xpos); caretArea.top(textArea.top() + ypos); caretArea.setWidth(caretImagery.getBoundingRect(*w).getSize().d_width); caretArea.setHeight(fnt->getLineSpacing()); caretArea.offset(Vector2f(-w->getHorzScrollbar()->getScrollPosition(), -w->getVertScrollbar()->getScrollPosition())); // cache the caret image for rendering. caretImagery.render(*w, caretArea, 0, &textArea); } } }