// This file is part of VSTGUI. It is subject to the license terms // in the LICENSE file found in the top-level directory of this // distribution and at http://github.com/steinbergmedia/vstgui/LICENSE #include "csearchtextedit.h" #include "../cframe.h" #include "../cgraphicspath.h" #include "../cdrawcontext.h" namespace VSTGUI { //---------------------------------------------------------------------------------------------------- CSearchTextEdit::CSearchTextEdit (const CRect& size, IControlListener* listener, int32_t tag, UTF8StringPtr txt, CBitmap* background, const int32_t style) : CTextEdit (size, listener, tag, nullptr, background, style) { setPlaceholderString ("Search"); } //------------------------------------------------------------------------ void CSearchTextEdit::setClearMarkInset (CPoint inset) { if (inset != clearMarkInset) { clearMarkInset = inset; invalid (); } } //------------------------------------------------------------------------ CPoint CSearchTextEdit::getClearMarkInset () const { return clearMarkInset; } //---------------------------------------------------------------------------------------------------- CRect CSearchTextEdit::getClearMarkRect () const { CRect r (getViewSize ()); if (getHoriAlign () == kRightText) r.right = r.left + getHeight (); else r.left = r.right - getHeight (); r.inset (getClearMarkInset ()); return r; } //---------------------------------------------------------------------------------------------------- CMouseEventResult CSearchTextEdit::onMouseDown (CPoint& where, const CButtonState& buttons) { if (buttons.isLeftButton ()) { if (!getText ().empty ()) { if (getClearMarkRect ().pointInside (where)) { beginEdit (); setText (""); valueChanged (); endEdit (); return kMouseDownEventHandledButDontNeedMovedOrUpEvents; } } } return CTextEdit::onMouseDown (where, buttons); } //---------------------------------------------------------------------------------------------------- void CSearchTextEdit::drawClearMark (CDrawContext* context) const { if (!((platformControl && !platformControl->getText ().empty ()) || !getText ().empty ())) return; auto path = owned (context->createGraphicsPath ()); if (path == nullptr) return; CRect r = getClearMarkRect (); CColor color (fontColor); color.alpha /= 2; context->setFillColor (color); context->setDrawMode (kAntiAliasing); context->drawEllipse (r, kDrawFilled); double h,s,v; color.toHSV (h, s, v); v = 1. - v; color.fromHSV (h, s, v); context->setFrameColor (color); context->setLineWidth (2.); r.inset (r.getWidth () / (M_PI * 2.) + 1, r.getHeight () / (M_PI * 2.) + 1); path->beginSubpath (r.getTopLeft ()); path->addLine (r.getBottomRight ()); path->beginSubpath (r.getBottomLeft ()); path->addLine (r.getTopRight ()); context->setDrawMode (kAntiAliasing); context->drawGraphicsPath (path, CDrawContext::kPathStroked); } //---------------------------------------------------------------------------------------------------- void CSearchTextEdit::draw (CDrawContext *pContext) { drawBack (pContext); drawClearMark (pContext); if (platformControl) { setDirty (false); return; } pContext->setDrawMode (kAntiAliasing); CColor origFontColor (fontColor); if (getText ().empty ()) { CColor color (fontColor); color.alpha /= 2; setFontColor (color); drawPlatformText (pContext, getPlaceholderString (), getTextRect ()); } else drawPlatformText (pContext, getText (), getTextRect ()); setDirty (false); setFontColor (origFontColor); } //------------------------------------------------------------------------ CRect CSearchTextEdit::getTextRect () const { CRect rect = getViewSize (); CRect cmr = getClearMarkRect (); if (getHoriAlign () == kRightText) rect.left = cmr.right; else rect.right = cmr.left; return rect; } //------------------------------------------------------------------------ CRect CSearchTextEdit::platformGetSize () const { return translateToGlobal (getTextRect ()); } //------------------------------------------------------------------------ CRect CSearchTextEdit::platformGetVisibleSize () const { CRect rect = getTextRect (); if (getParentView ()) rect = getParentView ()->asViewContainer ()->getVisibleSize (rect); else if (getFrame ()) rect = getFrame ()->getVisibleSize (rect); return translateToGlobal (rect); } //------------------------------------------------------------------------ void CSearchTextEdit::platformTextDidChange () { invalidRect (getClearMarkRect ()); CTextEdit::platformTextDidChange (); } //------------------------------------------------------------------------ } // VSTGUI