Redesigning UITextInput and all the derivatives to use TextDocument.

This commit is contained in:
Martín Lucas Golini
2020-06-15 01:44:29 -03:00
parent 271b0dc92a
commit 651039b0e8
23 changed files with 370 additions and 297 deletions
+1 -1
View File
@@ -55,7 +55,7 @@
<ScrollBar id="scrollbarpadding" orientation="horizontal" layout_width="200dp" layout_height="wrap_content" padding="8dp" background="#12345666" layout_to_bottom_of="slider" />
<SpinBox id="spinbox" layout_width="200dp" layout_height="wrap_content" padding="8dp" background="#54345666" layout_to_bottom_of="scrollbar" />
<SpinBox id="spinbox" layout_width="200dp" layout_height="wrap_content" padding="8dp" background="#54345666" layout_to_bottom_of="scrollbar" allow-float="true" />
<TextEdit layout_width="200dp" layout_height="50dp" layout_gravity="bottom|center_horizontal" padding="8dp" margin-bottom="140dp" />
</RelativeLayout>
+6 -16
View File
@@ -158,10 +158,10 @@ properties.
* All properties can be used as attributes of the XML node.
* XML attributes are treated as inline CSS styling.
* For example:
* Something like:
* `LinearLayout { layout-width: match_parent; layout_height: match_parent; orientation: vertical; }`
* is similar to (but not equivalent, since specificity of inline CSS is higher):
* `<LinearLayout layout_width="match_parent" layout_height="match_parent" orientation="vertical"></LinearLayout>`
* Something like:
* `LinearLayout { layout-width: match_parent; layout_height: match_parent; orientation: vertical; }`
* is similar to (but not equivalent, since specificity of inline CSS is higher):
* `<LinearLayout layout_width="match_parent" layout_height="match_parent" orientation="vertical"></LinearLayout>`
* CSS standard properties directly linked to the Mozilla docs are fully supported, otherwise a clarification will appear.
* _Applicable to_ will link to the EE::UI::UIWidget that can use that property, and betweeen parenthesis is the CSS element name.
@@ -611,16 +611,6 @@ Same as [background-size](#background-size) but for the foreground.
---
### free-editing
Allows the cursor to move freely in an input.
* Applicable to: EE::UI::UITextInput (TextInput)
* Data Type: [boolean](#boolean-data-type)
* Default value: `true`
---
### gravity
Sets the horizontal and vertical align of the inner elements/contents of a widget (for example the
@@ -1401,9 +1391,9 @@ Defines how the scrollbar should fit inside an scrollable element.
* Data Type: [string-list](#string-list-data-type)
* Value List:
* `inclusive`: The scrollbar is part of the scrollable element container, this means that it will
be on top of the content (scrollbars on mobile usually behave like this).
be on top of the content (scrollbars on mobile usually behave like this).
* `exclusive`: The scrollbar is outside the scrollable element container, this means that it will not
be on top of the content (scrollbars on desktop usually behave like this).
be on top of the content (scrollbars on desktop usually behave like this).
* Default value: `exclusive`
---
+4 -1
View File
@@ -238,13 +238,16 @@ class EE_API String {
/** Converts from any basic type to std::string */
template <class T> static std::string toStr( const T& i ) {
std::ostringstream ss;
ss << i;
ss << std::fixed << i;
return ss.str();
}
static std::string fromFloat( const Float& value, const std::string& append = "",
const std::string& prepend = "" );
static std::string fromDouble( const double& value, const std::string& append = "",
const std::string& prepend = "" );
/** Converts from a string to type */
template <class T>
static bool fromString( T& t, const std::string& s,
+3
View File
@@ -91,6 +91,9 @@ class EE_API Text {
/** @return The cached text height */
Float getTextHeight();
/** @return The line espacing */
Float getLineSpacing();
/** Draw the cached text on screen */
void draw( const Float& X, const Float& Y, const Vector2f& Scale = Vector2f::One,
const Float& Rotation = 0, BlendMode Effect = BlendAlpha,
@@ -133,7 +133,6 @@ enum class PropertyId : Uint32 {
AllowEditing = String::hash( "allow-editing" ),
Locked = String::hash( "locked" ),
MaxLength = String::hash( "max-length" ),
FreeEditing = String::hash( "free-editing" ),
Numeric = String::hash( "numeric" ),
AllowFloat = String::hash( "allow-float" ),
TouchDrag = String::hash( "touch-drag" ),
-2
View File
@@ -25,8 +25,6 @@ class EE_API UIComboBox : public UIWidget {
UINode* getButton() const { return mButton; }
InputTextBuffer* getInputTextBuffer();
const String& getText();
virtual bool applyProperty( const StyleSheetProperty& attribute );
+14 -16
View File
@@ -24,25 +24,25 @@ class EE_API UISpinBox : public UIWidget {
const Rectf& getPadding() const;
virtual void setClickStep( const Float& step );
virtual void setClickStep( const double& step );
const Float& getClickStep() const;
const double& getClickStep() const;
virtual Uint32 onMessage( const NodeMessage* Msg );
void addValue( const Float& value );
void addValue( const double& value );
virtual UISpinBox* setMinValue( const Float& MinVal );
virtual UISpinBox* setMinValue( const double& minVal );
const Float& getMinValue() const;
const double& getMinValue() const;
virtual UISpinBox* setMaxValue( const Float& MaxVal );
virtual UISpinBox* setMaxValue( const double& maxVal );
const Float& getMaxValue() const;
const double& getMaxValue() const;
virtual UISpinBox* setValue( const Float& Val );
virtual UISpinBox* setValue( const double& val );
const Float& getValue() const;
const double& getValue() const;
UINode* getButtonPushUp() const;
@@ -50,7 +50,7 @@ class EE_API UISpinBox : public UIWidget {
UITextInput* getTextInput() const;
UISpinBox* setAllowOnlyNumbers( bool allow );
UISpinBox* allowFloatingPoint( bool allow );
bool dotsInNumbersAllowed();
@@ -63,15 +63,13 @@ class EE_API UISpinBox : public UIWidget {
UITextInput* mInput;
UIWidget* mPushUp;
UIWidget* mPushDown;
Float mMinValue;
Float mMaxValue;
Float mValue;
Float mClickStep;
double mMinValue;
double mMaxValue;
double mValue;
double mClickStep;
void adjustChilds();
void internalValue( const Float& Val, const bool& Force = false );
virtual void onSizeChange();
virtual void onPositionChange();
+47 -17
View File
@@ -1,13 +1,17 @@
#ifndef EE_UICUITEXTINPUT_H
#define EE_UICUITEXTINPUT_H
#include <eepp/ui/doc/textdocument.hpp>
#include <eepp/ui/keyboardshortcut.hpp>
#include <eepp/ui/uinode.hpp>
#include <eepp/ui/uitextview.hpp>
#include <eepp/window/inputtextbuffer.hpp>
using namespace EE::UI::Doc;
namespace EE { namespace UI {
class EE_API UITextInput : public UITextView {
class EE_API UITextInput : public UITextView, public TextDocument::Client {
public:
static UITextInput* New();
@@ -27,12 +31,8 @@ class EE_API UITextInput : public UITextView {
virtual void draw();
void pushIgnoredChar( const Uint32& ch );
virtual void setTheme( UITheme* Theme );
InputTextBuffer* getInputTextBuffer();
UITextInput* setAllowEditing( const bool& allow );
const bool& isEditingAllowed() const;
@@ -43,13 +43,9 @@ class EE_API UITextInput : public UITextView {
virtual void shrinkText( const Uint32& MaxWidth );
UITextInput* setMaxLength( Uint32 maxLength );
UITextInput* setMaxLength( const Uint32& maxLength );
Uint32 getMaxLength();
UITextInput* setFreeEditing( bool support );
bool isFreeEditingEnabled();
const Uint32& getMaxLength();
virtual bool applyProperty( const StyleSheetProperty& attribute );
@@ -90,8 +86,21 @@ class EE_API UITextInput : public UITextView {
UITextView* setHintOutlineColor( const Color& outlineColor );
/** Block all the inserts, allow only numeric characters. */
void setAllowOnlyNumbers( const bool& onlyNumbers, const bool& allowFloat = false );
/** @return If is only allowing numbers */
bool onlyNumbersAllowed();
/** @return If is only allowing numbers, it allow floating point numbers? */
bool floatingPointAllowed();
TextDocument& getDocument();
KeyBindings& getKeyBindings();
protected:
InputTextBuffer mTextBuffer;
TextDocument mDoc;
Float mWaitCursorTime;
Vector2f mCurPos;
Text* mHintCache;
@@ -99,6 +108,11 @@ class EE_API UITextInput : public UITextView {
int mCursorPos;
bool mAllowEditing;
bool mShowingWait;
bool mOnlyNumbers;
bool mAllowFloat;
Uint32 mMaxLength{0};
KeyBindings mKeyBindings;
void resetWaitCursor();
virtual void alignFix();
@@ -107,8 +121,6 @@ class EE_API UITextInput : public UITextView {
virtual void onSizeChange();
void privOnPressEnter();
void autoPadding();
virtual Uint32 onMouseDown( const Vector2i& position, const Uint32& flags );
@@ -145,11 +157,29 @@ class EE_API UITextInput : public UITextView {
virtual Int32 selCurEnd();
void onCursorPositionChange();
virtual void onDocumentTextChanged();
void onBufferChange();
virtual void onDocumentCursorChange( const TextPosition& );
void onInputSelectionChange();
virtual void onDocumentSelectionChange( const TextRange& );
virtual void onDocumentLineCountChange( const size_t& lastCount, const size_t& newCount );
virtual void onDocumentLineChanged( const Int64& lineIndex );
void registerKeybindings();
void registerCommands();
void copy();
void cut();
void paste();
virtual Uint32 onKeyDown( const KeyEvent& event );
virtual Uint32 onTextInput( const TextInputEvent& event );
};
}} // namespace EE::UI
+2 -2
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.12.1, 2020-05-28T19:06:17. -->
<!-- Written by QtCreator 4.12.1, 2020-06-15T00:15:41. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
@@ -89,7 +89,7 @@
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{6d057187-158a-4883-8d5b-d470a6b6b025}</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">10</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">19</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">15</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">../../make/linux</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+5
View File
@@ -424,6 +424,11 @@ std::string String::fromFloat( const Float& value, const std::string& append,
return prepend + toStr( value ) + append;
}
std::string String::fromDouble( const double& value, const std::string& append,
const std::string& prepend ) {
return prepend + toStr( value ) + append;
}
void String::insertChar( String& str, const unsigned int& pos, const StringBaseType& tchar ) {
str.insert( str.begin() + pos, tchar );
}
+5 -1
View File
@@ -272,7 +272,7 @@ Float Text::getOutlineThickness() const {
Vector2f Text::findCharacterPos( std::size_t index ) {
// Make sure that we have a valid font
if ( !mFont )
if ( !mFont || mString.empty() )
return Vector2f();
// Adjust the index if it's out of range
@@ -535,6 +535,10 @@ Float Text::getTextHeight() {
: 0;
}
Float Text::getLineSpacing() {
return NULL != mFont ? mFont->getLineSpacing( mRealFontSize ) : 0;
}
void Text::draw( const Float& X, const Float& Y, const Vector2f& Scale, const Float& Rotation,
BlendMode Effect, const OriginPoint& rotationCenter,
const OriginPoint& scaleCenter ) {
+1 -1
View File
@@ -581,7 +581,7 @@ void MapEditor::createLighContainer() {
mUIBlueTxt->getSize().getHeight() + 16 ),
UI_NODE_DEFAULT_FLAGS | UI_AUTO_SIZE, Text::Shadow );
mLightRadius = UISpinBox::New()->setAllowOnlyNumbers( false )->setValue( 100 );
mLightRadius = UISpinBox::New()->setValue( 100 );
mLightRadius->setParent( mLightCont )
->setSize( 100, 0 )
->setPosition( Txt->getPosition().x,
+5 -5
View File
@@ -62,7 +62,7 @@ UIMapNew::UIMapNew( UIMap* Map, std::function<void()> NewMapCb, bool ResizeMap )
Vector2f( Txt->getPosition().x + DistFromTitle, Txt->getPosition().y + DistFromTitle ),
UI_NODE_DEFAULT_FLAGS, Text::Shadow );
mUIMapWidth = UISpinBox::New()->setAllowOnlyNumbers( false )->setValue( 100 );
mUIMapWidth = UISpinBox::New()->setValue( 100 );
mUIMapWidth->setParent( mUIWindow->getContainer() )
->setSize( 53, 0 )
->setPosition( Txt->getPosition().x + Txt->getSize().getWidth(), Txt->getPosition().y );
@@ -77,7 +77,7 @@ UIMapNew::UIMapNew( UIMap* Map, std::function<void()> NewMapCb, bool ResizeMap )
Vector2f( Txt->getPosition().x, Txt->getPosition().y + Txt->getSize().getHeight() + 8 ),
UI_NODE_DEFAULT_FLAGS, Text::Shadow );
mUIMapHeight = UISpinBox::New()->setAllowOnlyNumbers( false )->setValue( 100 );
mUIMapHeight = UISpinBox::New()->setValue( 100 );
mUIMapHeight->setParent( mUIWindow->getContainer() )
->setSize( 53, 0 )
->setPosition( Txt->getPosition().x + Txt->getSize().getWidth(), Txt->getPosition().y );
@@ -96,7 +96,7 @@ UIMapNew::UIMapNew( UIMap* Map, std::function<void()> NewMapCb, bool ResizeMap )
Vector2f( Txt->getPosition().x + DistFromTitle, Txt->getPosition().y + DistFromTitle ),
UI_NODE_DEFAULT_FLAGS, Text::Shadow );
mUIMapTWidth = UISpinBox::New()->setAllowOnlyNumbers( false )->setValue( 32 );
mUIMapTWidth = UISpinBox::New()->setValue( 32 );
mUIMapTWidth->setParent( mUIWindow->getContainer() )
->setSize( 53, 0 )
->setPosition( Txt->getPosition().x + Txt->getSize().getWidth(), Txt->getPosition().y );
@@ -111,7 +111,7 @@ UIMapNew::UIMapNew( UIMap* Map, std::function<void()> NewMapCb, bool ResizeMap )
Vector2f( Txt->getPosition().x, Txt->getPosition().y + Txt->getSize().getHeight() + 8 ),
UI_NODE_DEFAULT_FLAGS, Text::Shadow );
mUIMapTHeight = UISpinBox::New()->setAllowOnlyNumbers( false )->setValue( 32 );
mUIMapTHeight = UISpinBox::New()->setValue( 32 );
mUIMapTHeight->setParent( mUIWindow->getContainer() )
->setSize( 53, 0 )
->setPosition( Txt->getPosition().x + Txt->getSize().getWidth(), Txt->getPosition().y );
@@ -126,7 +126,7 @@ UIMapNew::UIMapNew( UIMap* Map, std::function<void()> NewMapCb, bool ResizeMap )
Vector2f( 16, mUIMapTHeight->getPosition().y + mUIMapTHeight->getSize().getHeight() + 8 ),
UI_NODE_DEFAULT_FLAGS | UI_AUTO_SIZE, Text::Shadow );
mUIMapMaxLayers = UISpinBox::New()->setAllowOnlyNumbers( false )->setValue( 8 );
mUIMapMaxLayers = UISpinBox::New()->setValue( 8 );
mUIMapMaxLayers->setParent( mUIWindow->getContainer() )
->setSize( 53, 0 )
->setPosition( Txt->getPosition().x + DistFromTitle, Txt->getPosition().y + DistFromTitle );
@@ -276,7 +276,6 @@ void StyleSheetSpecification::registerDefaultProperties() {
registerProperty( "allow-editing", "" ).setType( PropertyType::Bool );
registerProperty( "locked", "" ).setType( PropertyType::Bool );
registerProperty( "max-length", "" ).setType( PropertyType::NumberInt );
registerProperty( "free-editing", "" ).setType( PropertyType::Bool );
registerProperty( "numeric", "" ).setType( PropertyType::Bool );
registerProperty( "allow-float", "" ).setType( PropertyType::Bool );
registerProperty( "touch-drag", "" ).setType( PropertyType::Bool );
-7
View File
@@ -14,7 +14,6 @@ UIComboBox::UIComboBox() : UIWidget( "combobox" ), mDropDownList( NULL ), mButto
mDropDownList->setVisible( true );
mDropDownList->setEnabled( true );
mDropDownList->setAllowEditing( true );
mDropDownList->setFreeEditing( true );
mDropDownList->setTextSelection( true );
mDropDownList->addEventListener( Event::OnPaddingChange,
[this]( const Event* ) { onPaddingChange(); } );
@@ -64,10 +63,6 @@ UIListBox* UIComboBox::getListBox() {
return mDropDownList->getListBox();
}
InputTextBuffer* UIComboBox::getInputTextBuffer() {
return mDropDownList->getInputTextBuffer();
}
const String& UIComboBox::getText() {
return mDropDownList->getText();
}
@@ -159,7 +154,6 @@ bool UIComboBox::applyProperty( const StyleSheetProperty& attribute ) {
case PropertyId::Text:
case PropertyId::AllowEditing:
case PropertyId::MaxLength:
case PropertyId::FreeEditing:
case PropertyId::Numeric:
case PropertyId::AllowFloat:
case PropertyId::Hint:
@@ -207,7 +201,6 @@ std::string UIComboBox::getPropertyString( const PropertyDefinition* propertyDef
case PropertyId::Text:
case PropertyId::AllowEditing:
case PropertyId::MaxLength:
case PropertyId::FreeEditing:
case PropertyId::Numeric:
case PropertyId::AllowFloat:
case PropertyId::Hint:
+2 -1
View File
@@ -85,7 +85,8 @@ void UIDropDownList::setFriendControl( UINode* friendCtrl ) {
}
void UIDropDownList::onAutoSize() {
Float max = eemax<Float>( PixelDensity::dpToPxI( getSkinSize().getHeight() ), getTextHeight() );
Float max = eemax<Float>( PixelDensity::dpToPxI( getSkinSize().getHeight() ),
mTextCache->getLineSpacing() );
if ( mHeightPolicy == SizePolicy::WrapContent ) {
setInternalPixelsHeight( eeceil( max + mRealPadding.Top + mRealPadding.Bottom ) );
+57 -58
View File
@@ -13,7 +13,7 @@ UISpinBox* UISpinBox::New() {
UISpinBox::UISpinBox() :
UIWidget( "spinbox" ),
mMinValue( 0.f ),
mMaxValue( std::numeric_limits<Float>::max() ),
mMaxValue( std::numeric_limits<double>::max() ),
mValue( 0 ),
mClickStep( 1.f ) {
mInput = UITextInput::NewWithTag( "spinbox::input" );
@@ -37,11 +37,12 @@ UISpinBox::UISpinBox() :
mPushDown->setSize( 8, 8 );
mPushDown->addEventListener( Event::OnSizeChange, cb );
mInput->getInputTextBuffer()->setAllowOnlyNumbers( true, false );
mInput->setAllowOnlyNumbers( true, false );
mInput->addEventListener( Event::OnBufferChange,
cb::Make1( this, &UISpinBox::onBufferChange ) );
internalValue( mValue, true );
double val = mValue;
mValue += 1;
setValue( val );
applyDefaultTheme();
}
@@ -117,11 +118,11 @@ const Rectf& UISpinBox::getPadding() const {
return mInput->getPadding();
}
void UISpinBox::setClickStep( const Float& step ) {
void UISpinBox::setClickStep( const double& step ) {
mClickStep = step;
}
const Float& UISpinBox::getClickStep() const {
const double& UISpinBox::getClickStep() const {
return mClickStep;
}
@@ -148,30 +149,54 @@ Uint32 UISpinBox::onMessage( const NodeMessage* Msg ) {
return 0;
}
void UISpinBox::addValue( const Float& value ) {
void UISpinBox::addValue( const double& value ) {
if ( !mInput->getText().size() )
mInput->setText( String::toStr( static_cast<Int32>( mMinValue ) ) );
this->setValue( mValue + value );
setValue( mValue + value );
}
void UISpinBox::internalValue( const Float& Val, const bool& Force ) {
if ( Force || Val != mValue ) {
if ( Val >= mMinValue && Val <= mMaxValue ) {
Float iValN = ( Float )(Int32)Val;
Float fValN = (Float)iValN;
UISpinBox* UISpinBox::setValue( const double& val ) {
if ( val != mValue ) {
if ( val >= mMinValue && val <= mMaxValue ) {
double iValN = (double)(Int64)val;
double fValN = (double)iValN;
if ( fValN == Val ) {
mInput->setText( String::toStr( iValN ) );
mValue = val;
if ( fValN == val ) {
mInput->setText( String::toStr( (Int64)iValN ) );
} else {
mInput->setText( String::toStr( Val ) );
mInput->setText( String::toStr( val ) );
}
mValue = Val;
onValueChange();
}
}
return this;
}
void UISpinBox::onBufferChange( const Event* ) {
if ( !mInput->getText().size() ) {
setValue( 0 );
} else {
double val = mValue;
if ( '.' == mInput->getText()[mInput->getText().size() - 1] ) {
Uint32 pos = (Uint32)mInput->getText().find_first_of( "." );
if ( pos != mInput->getText().size() - 1 )
mInput->setText( mInput->getText().substr( 0, mInput->getText().size() - 1 ) );
} else {
bool res = String::fromString<double>( val, mInput->getText() );
if ( res && val != mValue && val >= mMinValue && val <= mMaxValue ) {
mValue = val;
onValueChange();
}
}
}
}
void UISpinBox::onSizeChange() {
@@ -186,17 +211,12 @@ void UISpinBox::onPositionChange() {
adjustChilds();
}
UISpinBox* UISpinBox::setValue( const Float& Val ) {
internalValue( Val, false );
return this;
}
const Float& UISpinBox::getValue() const {
const double& UISpinBox::getValue() const {
return mValue;
}
UISpinBox* UISpinBox::setMinValue( const Float& MinVal ) {
mMinValue = MinVal;
UISpinBox* UISpinBox::setMinValue( const double& minVal ) {
mMinValue = minVal;
if ( mValue < mMinValue )
mValue = mMinValue;
@@ -204,12 +224,12 @@ UISpinBox* UISpinBox::setMinValue( const Float& MinVal ) {
return this;
}
const Float& UISpinBox::getMinValue() const {
const double& UISpinBox::getMinValue() const {
return mMinValue;
}
UISpinBox* UISpinBox::setMaxValue( const Float& MaxVal ) {
mMaxValue = MaxVal;
UISpinBox* UISpinBox::setMaxValue( const double& maxVal ) {
mMaxValue = maxVal;
if ( mValue > mMaxValue )
mValue = mMaxValue;
@@ -217,30 +237,10 @@ UISpinBox* UISpinBox::setMaxValue( const Float& MaxVal ) {
return this;
}
const Float& UISpinBox::getMaxValue() const {
const double& UISpinBox::getMaxValue() const {
return mMaxValue;
}
void UISpinBox::onBufferChange( const Event* ) {
if ( !mInput->getText().size() ) {
setValue( 0 );
} else {
Float Val = mValue;
if ( '.' == mInput->getText()[mInput->getText().size() - 1] ) {
Uint32 pos = (Uint32)mInput->getText().find_first_of( "." );
if ( pos != mInput->getText().size() - 1 )
mInput->setText( mInput->getText().substr( 0, mInput->getText().size() - 1 ) );
} else {
bool Res = String::fromString<Float>( Val, mInput->getText() );
if ( Res )
setValue( Val );
}
}
}
UINode* UISpinBox::getButtonPushUp() const {
return mPushUp;
}
@@ -253,14 +253,14 @@ UITextInput* UISpinBox::getTextInput() const {
return mInput;
}
UISpinBox* UISpinBox::setAllowOnlyNumbers( bool allow ) {
mInput->getInputTextBuffer()->setAllowOnlyNumbers( true, allow );
UISpinBox* UISpinBox::allowFloatingPoint( bool allow ) {
mInput->setAllowOnlyNumbers( true, allow );
return this;
}
bool UISpinBox::dotsInNumbersAllowed() {
return mInput->getInputTextBuffer()->dotsInNumbersAllowed();
return mInput->floatingPointAllowed();
}
void UISpinBox::onAlphaChange() {
@@ -283,13 +283,13 @@ std::string UISpinBox::getPropertyString( const PropertyDefinition* propertyDef,
switch ( propertyDef->getPropertyId() ) {
case PropertyId::MinValue:
return String::fromFloat( getMinValue() );
return String::fromDouble( getMinValue() );
case PropertyId::MaxValue:
return String::fromFloat( getMaxValue() );
return String::fromDouble( getMaxValue() );
case PropertyId::Value:
return String::fromFloat( getValue() );
return String::fromDouble( getValue() );
case PropertyId::ClickStep:
return String::fromFloat( getClickStep() );
return String::fromDouble( getClickStep() );
default:
return UIWidget::getPropertyString( propertyDef, propertyIndex );
}
@@ -317,7 +317,6 @@ bool UISpinBox::applyProperty( const StyleSheetProperty& attribute ) {
case PropertyId::Text:
case PropertyId::AllowEditing:
case PropertyId::MaxLength:
case PropertyId::FreeEditing:
case PropertyId::Numeric:
case PropertyId::AllowFloat:
case PropertyId::Hint:
+5 -6
View File
@@ -28,7 +28,7 @@ UITextEdit::UITextEdit() :
mTextInput->setFlags( UI_TEXT_SELECTION_ENABLED | UI_VALIGN_TOP );
mTextInput->unsetFlags( UI_VALIGN_CENTER | UI_AUTO_SIZE );
mTextInput->clipDisable();
mTextInput->getInputTextBuffer()->isNewLineEnabled( true );
//mTextInput->getInputTextBuffer()->isNewLineEnabled( true );
mTextInput->setVisible( true );
mTextInput->setEnabled( true );
mTextInput->setSize( getSize() );
@@ -288,7 +288,7 @@ void UITextEdit::onInputSizeChange( const Event* Event ) {
if ( mHScrollBar->isVisible() )
aSize.y -= mHScrollBar->getPixelsSize().getHeight();
String text( mTextInput->getInputTextBuffer()->getBuffer() );
/*String text( mTextInput->getInputTextBuffer()->getBuffer() );
shrinkText( aSize.getWidth() );
@@ -298,7 +298,7 @@ void UITextEdit::onInputSizeChange( const Event* Event ) {
mTextInput->getInputTextBuffer()->setBuffer( text );
shrinkText( aSize.getWidth() );
}
}*/
textInputTryResize( aSize, iSize );
@@ -393,7 +393,7 @@ void UITextEdit::fixScroll() {
}
void UITextEdit::fixScrollToCursor() {
if ( Font::getHorizontalAlign( mTextInput->getFlags() ) == UI_HALIGN_LEFT ) {
/*if ( Font::getHorizontalAlign( mTextInput->getFlags() ) == UI_HALIGN_LEFT ) {
Sizef aSize( getAvailableSize() );
if ( mVScrollBar->isVisible() )
@@ -449,7 +449,7 @@ void UITextEdit::fixScrollToCursor() {
fixScroll();
mSkipValueChange = false;
}
}*/
invalidateDraw();
}
@@ -576,7 +576,6 @@ bool UITextEdit::applyProperty( const StyleSheetProperty& attribute ) {
break;
}
case PropertyId::MaxLength:
case PropertyId::FreeEditing:
case PropertyId::Numeric:
case PropertyId::AllowFloat:
case PropertyId::Hint:
+186 -117
View File
@@ -8,6 +8,7 @@
#include <eepp/ui/uitextinput.hpp>
#include <eepp/ui/uitheme.hpp>
#include <eepp/ui/uithememanager.hpp>
#include <eepp/window/clipboard.hpp>
#include <eepp/window/engine.hpp>
#include <pugixml/pugixml.hpp>
@@ -22,7 +23,13 @@ UITextInput* UITextInput::NewWithTag( const std::string& tag ) {
}
UITextInput::UITextInput( const std::string& tag ) :
UITextView( tag ), mCursorPos( 0 ), mAllowEditing( true ), mShowingWait( true ) {
UITextView( tag ),
mCursorPos( 0 ),
mAllowEditing( true ),
mShowingWait( true ),
mOnlyNumbers( false ),
mAllowFloat( false ),
mKeyBindings( getUISceneNode()->getWindow()->getInput() ) {
mHintCache = Text::New();
UITheme* theme = getUISceneNode()->getUIThemeManager()->getDefaultTheme();
@@ -50,16 +57,9 @@ UITextInput::UITextInput( const std::string& tag ) :
setFlags( UI_AUTO_PADDING | UI_AUTO_SIZE | UI_TEXT_SELECTION_ENABLED );
clipEnable();
mTextBuffer.start();
mTextBuffer.setActive( false );
mTextBuffer.setFreeEditing( true );
mTextBuffer.setTextSelectionEnabled( isTextSelectionEnabled() );
mTextBuffer.setReturnCallback( cb::Make0( this, &UITextInput::privOnPressEnter ) );
mTextBuffer.setCursorPositionChangeCallback(
cb::Make0( this, &UITextInput::onCursorPositionChange ) );
mTextBuffer.setBufferChangeCallback( cb::Make0( this, &UITextInput::onBufferChange ) );
mTextBuffer.setSelectionChangeCallback(
cb::Make0( this, &UITextInput::onInputSelectionChange ) );
mDoc.registerClient( this );
registerCommands();
registerKeybindings();
applyDefaultTheme();
}
@@ -88,8 +88,7 @@ void UITextInput::onCursorPosChange() {
}
void UITextInput::drawWaitingCursor() {
if ( mVisible && mTextBuffer.isActive() && mTextBuffer.isFreeEditingEnabled() &&
mShowingWait ) {
if ( mVisible && hasFocus() && mShowingWait ) {
bool disableSmooth = mShowingWait && GLi->isLineSmooth();
if ( disableSmooth )
@@ -116,7 +115,7 @@ void UITextInput::drawWaitingCursor() {
}
void UITextInput::updateWaitingCursor( const Time& time ) {
if ( mVisible && mTextBuffer.isActive() && mTextBuffer.isFreeEditingEnabled() ) {
if ( mVisible && hasFocus() ) {
mWaitCursorTime += time.asMilliseconds();
if ( mWaitCursorTime >= 500.f ) {
@@ -150,7 +149,7 @@ void UITextInput::draw() {
if ( isClipped() ) {
clipSmartDisable();
}
} else if ( !mHintCache->getString().empty() && !mTextBuffer.isActive() ) {
} else if ( !mHintCache->getString().empty() ) {
if ( isClipped() ) {
clipSmartEnable( mScreenPos.x + mRealPadding.Left, mScreenPos.y + mRealPadding.Top,
mSize.getWidth() - mRealPadding.Left - mRealPadding.Right,
@@ -176,8 +175,6 @@ Uint32 UITextInput::onFocus() {
UINode::onFocus();
if ( mAllowEditing ) {
mTextBuffer.setActive( true );
resetWaitCursor();
getSceneNode()->getWindow()->startTextInput();
@@ -187,7 +184,6 @@ Uint32 UITextInput::onFocus() {
}
Uint32 UITextInput::onFocusLoss() {
mTextBuffer.setActive( false );
getSceneNode()->getWindow()->stopTextInput();
return UITextView::onFocusLoss();
}
@@ -197,14 +193,6 @@ Uint32 UITextInput::onPressEnter() {
return 0;
}
void UITextInput::privOnPressEnter() {
onPressEnter();
}
void UITextInput::pushIgnoredChar( const Uint32& ch ) {
mTextBuffer.pushIgnoredChar( ch );
}
void UITextInput::resetWaitCursor() {
mShowingWait = true;
mWaitCursorTime = 0.f;
@@ -214,21 +202,28 @@ void UITextInput::alignFix() {
Vector2f rOffset( mRealAlignOffset );
UITextView::alignFix();
switch ( Font::getVerticalAlign( getFlags() ) ) {
case UI_VALIGN_CENTER:
mRealAlignOffset.y =
( Float )( ( Int32 )( ( mSize.y - mRealPadding.Top - mRealPadding.Bottom ) / 2 -
mTextCache->getLineSpacing() / 2 ) ) -
1;
break;
case UI_VALIGN_BOTTOM:
mRealAlignOffset.y =
mSize.y - mRealPadding.Top - mRealPadding.Bottom - mTextCache->getLineSpacing();
break;
case UI_VALIGN_TOP:
mRealAlignOffset.y = 0;
break;
}
if ( Font::getHorizontalAlign( getFlags() ) == UI_HALIGN_LEFT ) {
Uint32 NLPos = 0;
Uint32 LineNum = mTextBuffer.getCurPosLinePos( NLPos );
Text textCache( mTextCache->getFont(), mTextCache->getCharacterSize() );
textCache.setString(
mTextBuffer.getBuffer().substr( NLPos, mTextBuffer.getCursorPosition() - NLPos ) );
Float tW = textCache.getTextWidth();
Float tW = mTextCache->findCharacterPos( selCurEnd() ).x;
mCurPos.x = tW;
mCurPos.y = (Float)LineNum * (Float)mTextCache->getFont()->getLineSpacing(
mTextCache->getCharacterSizePx() );
mCurPos.y = 0;
if ( !mTextBuffer.setSupportNewLine() && mSize.getWidth() > 0 ) {
if ( mSize.getWidth() > 0 ) {
mRealAlignOffset.x = rOffset.x;
Float tX = mRealAlignOffset.x + tW;
@@ -263,7 +258,7 @@ void UITextInput::onThemeLoaded() {
void UITextInput::onAutoSize() {
if ( mHeightPolicy == SizePolicy::WrapContent ) {
int minHeight = eemax<int>( mTextCache->getTextHeight(),
int minHeight = eemax<int>( mTextCache->getLineSpacing(),
PixelDensity::dpToPxI( getSkinSize().getHeight() ) );
setInternalPixelsHeight( minHeight + mRealPadding.Top + mRealPadding.Bottom );
} else if ( ( mFlags & UI_AUTO_SIZE ) && 0 == getSize().getHeight() ) {
@@ -283,16 +278,8 @@ void UITextInput::autoPadding() {
}
}
InputTextBuffer* UITextInput::getInputTextBuffer() {
return &mTextBuffer;
}
UITextInput* UITextInput::setAllowEditing( const bool& allow ) {
mAllowEditing = allow;
if ( !mAllowEditing && mTextBuffer.isActive() )
mTextBuffer.setActive( false );
return this;
}
@@ -303,9 +290,8 @@ const bool& UITextInput::isEditingAllowed() const {
UITextView* UITextInput::setText( const String& text ) {
UITextView::setText( text );
mTextBuffer.setBuffer( text );
mTextBuffer.cursorToEnd();
mDoc.reset();
mDoc.textInput( text );
return this;
}
@@ -314,15 +300,7 @@ const String& UITextInput::getText() {
return UITextView::getText();
}
void UITextInput::shrinkText( const Uint32& MaxWidth ) {
mTextCache->setString( mTextBuffer.getBuffer() );
UITextView::shrinkText( MaxWidth );
mTextBuffer.setBuffer( mTextCache->getString() );
alignFix();
}
void UITextInput::shrinkText( const Uint32& ) {}
void UITextInput::updateText() {}
@@ -332,8 +310,6 @@ Uint32 UITextInput::onMouseDown( const Vector2i& position, const Uint32& flags )
UITextView::onMouseDown( position, flags );
if ( endPos != selCurEnd() && -1 != selCurEnd() ) {
mTextBuffer.setCursorPosition( selCurEnd() );
onCursorPositionChange();
resetWaitCursor();
}
@@ -344,8 +320,6 @@ Uint32 UITextInput::onMouseDoubleClick( const Vector2i& Pos, const Uint32& Flags
UITextView::onMouseDoubleClick( Pos, Flags );
if ( isTextSelectionEnabled() && ( Flags & EE_BUTTON_LMASK ) && selCurEnd() != -1 ) {
mTextBuffer.setCursorPosition( selCurEnd() );
onCursorPositionChange();
resetWaitCursor();
}
@@ -369,46 +343,33 @@ Uint32 UITextInput::onMouseLeave( const Vector2i& Pos, const Uint32& Flags ) {
}
void UITextInput::selCurInit( const Int32& init ) {
if ( mTextBuffer.selCurInit() != init ) {
mTextBuffer.selCurInit( init );
invalidateDraw();
if ( mDoc.getSelection().start().column() != init && -1 != init ) {
mDoc.setSelection( {{0, init}, mDoc.getSelection().end()} );
}
}
void UITextInput::selCurEnd( const Int32& end ) {
if ( mTextBuffer.selCurEnd() != end ) {
mTextBuffer.selCurEnd( end );
invalidateDraw();
if ( mTextBuffer.selCurEnd() != mTextBuffer.selCurInit() ) {
mTextBuffer.setCursorPosition( end );
onCursorPosChange();
}
if ( mDoc.getSelection().end().column() != end && -1 != end ) {
mDoc.setSelection( {mDoc.getSelection().start(), {0, end}} );
} else if ( -1 == end ) {
mDoc.setSelection( mDoc.getSelection().end() );
}
}
Int32 UITextInput::selCurInit() {
return mTextBuffer.selCurInit();
return mDoc.getSelection().start().column();
}
Int32 UITextInput::selCurEnd() {
return mTextBuffer.selCurEnd();
return mDoc.getSelection().end().column();
}
void UITextInput::onCursorPositionChange() {
if ( mCursorPos != mTextBuffer.getCursorPosition() ) {
alignFix();
mCursorPos = mTextBuffer.getCursorPosition();
mWaitCursorTime = 0.f;
mShowingWait = true;
onCursorPosChange();
}
}
void UITextInput::onBufferChange() {
void UITextInput::onDocumentTextChanged() {
Vector2f offSet = mRealAlignOffset;
UITextView::setText( mTextBuffer.getBuffer() );
const String& text = mDoc.line( 0 ).getText();
UITextView::setText( !text.empty() ? text.substr( 0, text.size() - 1 ) : "" );
updateText();
@@ -418,35 +379,33 @@ void UITextInput::onBufferChange() {
alignFix();
mCursorPos = mTextBuffer.getCursorPosition();
mTextBuffer.setChangedSinceLastUpdate( false );
invalidateDraw();
sendCommonEvent( Event::OnBufferChange );
}
void UITextInput::onInputSelectionChange() {
void UITextInput::onDocumentCursorChange( const TextPosition& ) {
alignFix();
mWaitCursorTime = 0.f;
mShowingWait = true;
onCursorPosChange();
}
void UITextInput::onDocumentSelectionChange( const TextRange& ) {
onSelectionChange();
}
UITextInput* UITextInput::setMaxLength( Uint32 maxLength ) {
mTextBuffer.setMaxLength( maxLength );
void UITextInput::onDocumentLineCountChange( const size_t&, const size_t& ) {}
void UITextInput::onDocumentLineChanged( const Int64& ) {}
UITextInput* UITextInput::setMaxLength( const Uint32& maxLength ) {
mMaxLength = maxLength;
return this;
}
Uint32 UITextInput::getMaxLength() {
return mTextBuffer.getMaxLength();
}
UITextInput* UITextInput::setFreeEditing( bool support ) {
mTextBuffer.setFreeEditing( support );
return this;
}
bool UITextInput::isFreeEditingEnabled() {
return mTextBuffer.isFreeEditingEnabled();
const Uint32& UITextInput::getMaxLength() {
return mMaxLength;
}
std::string UITextInput::getPropertyString( const PropertyDefinition* propertyDef,
@@ -461,12 +420,10 @@ std::string UITextInput::getPropertyString( const PropertyDefinition* propertyDe
return isEditingAllowed() ? "true" : "false";
case PropertyId::MaxLength:
return String::toStr( getMaxLength() );
case PropertyId::FreeEditing:
return isFreeEditingEnabled() ? "true" : "false";
case PropertyId::Numeric:
return getInputTextBuffer()->onlyNumbersAllowed() ? "true" : "false";
return onlyNumbersAllowed() ? "true" : "false";
case PropertyId::AllowFloat:
return getInputTextBuffer()->dotsInNumbersAllowed() ? "true" : "false";
return floatingPointAllowed() ? "true" : "false";
case PropertyId::Hint:
return getHint().toUtf8();
case PropertyId::HintColor:
@@ -503,16 +460,11 @@ bool UITextInput::applyProperty( const StyleSheetProperty& attribute ) {
case PropertyId::MaxLength:
setMaxLength( attribute.asUint() );
break;
case PropertyId::FreeEditing:
setFreeEditing( attribute.asBool() );
break;
case PropertyId::Numeric:
getInputTextBuffer()->setAllowOnlyNumbers(
attribute.asBool(), getInputTextBuffer()->dotsInNumbersAllowed() );
setAllowOnlyNumbers( attribute.asBool(), floatingPointAllowed() );
break;
case PropertyId::AllowFloat:
getInputTextBuffer()->setAllowOnlyNumbers( getInputTextBuffer()->onlyNumbersAllowed(),
attribute.asBool() );
setAllowOnlyNumbers( onlyNumbersAllowed(), attribute.asBool() );
break;
case PropertyId::Hint:
if ( NULL != getUISceneNode() )
@@ -677,4 +629,121 @@ UITextView* UITextInput::setHintFontStyle( const Uint32& fontStyle ) {
return this;
}
void UITextInput::copy() {
getUISceneNode()->getWindow()->getClipboard()->setText( mDoc.getSelectedText() );
}
void UITextInput::cut() {
getUISceneNode()->getWindow()->getClipboard()->setText( mDoc.getSelectedText() );
mDoc.deleteSelection();
}
void UITextInput::paste() {
String pasted( getUISceneNode()->getWindow()->getClipboard()->getText() );
String::replaceAll( pasted, "\n", "" );
mDoc.textInput( pasted );
}
void UITextInput::registerCommands() {
mDoc.setCommand( "copy", [&] { copy(); } );
mDoc.setCommand( "cut", [&] { cut(); } );
mDoc.setCommand( "paste", [&] { paste(); } );
mDoc.setCommand( "press-enter", [&] { onPressEnter(); } );
}
void UITextInput::registerKeybindings() {
mKeyBindings.addKeybinds( {
{{KEY_BACKSPACE, KEYMOD_CTRL}, "delete-to-previous-word"},
{{KEY_BACKSPACE, KEYMOD_SHIFT}, "delete-to-previous-char"},
{{KEY_BACKSPACE, 0}, "delete-to-previous-char"},
{{KEY_DELETE, KEYMOD_CTRL}, "delete-to-next-word"},
{{KEY_DELETE, 0}, "delete-to-next-char"},
{{KEY_KP_ENTER, 0}, "press-enter"},
{{KEY_RETURN, 0}, "press-enter"},
{{KEY_LEFT, KEYMOD_CTRL | KEYMOD_SHIFT}, "select-to-previous-word"},
{{KEY_LEFT, KEYMOD_CTRL}, "move-to-previous-word"},
{{KEY_LEFT, KEYMOD_SHIFT}, "select-to-previous-char"},
{{KEY_LEFT, 0}, "move-to-previous-char"},
{{KEY_RIGHT, KEYMOD_CTRL | KEYMOD_SHIFT}, "select-to-next-word"},
{{KEY_RIGHT, KEYMOD_CTRL}, "move-to-next-word"},
{{KEY_RIGHT, KEYMOD_SHIFT}, "select-to-next-char"},
{{KEY_RIGHT, 0}, "move-to-next-char"},
{{KEY_Z, KEYMOD_CTRL | KEYMOD_SHIFT}, "redo"},
{{KEY_HOME, KEYMOD_CTRL | KEYMOD_SHIFT}, "select-to-start-of-doc"},
{{KEY_HOME, KEYMOD_SHIFT}, "select-to-start-of-content"},
{{KEY_HOME, KEYMOD_CTRL}, "move-to-start-of-doc"},
{{KEY_HOME, 0}, "move-to-start-of-content"},
{{KEY_END, KEYMOD_CTRL | KEYMOD_SHIFT}, "select-to-end-of-doc"},
{{KEY_END, KEYMOD_SHIFT}, "select-to-end-of-line"},
{{KEY_END, KEYMOD_CTRL}, "move-to-end-of-doc"},
{{KEY_END, 0}, "move-to-end-of-line"},
{{KEY_Y, KEYMOD_CTRL}, "redo"},
{{KEY_Z, KEYMOD_CTRL}, "undo"},
{{KEY_C, KEYMOD_CTRL}, "copy"},
{{KEY_X, KEYMOD_CTRL}, "cut"},
{{KEY_V, KEYMOD_CTRL}, "paste"},
{{KEY_A, KEYMOD_CTRL}, "select-all"},
} );
}
Uint32 UITextInput::onKeyDown( const KeyEvent& event ) {
std::string cmd = mKeyBindings.getCommandFromKeyBind( {event.getKeyCode(), event.getMod()} );
if ( !cmd.empty() ) {
// Allow copy selection on locked mode
if ( mAllowEditing ) {
mDoc.execute( cmd );
return 1;
}
}
return 0;
}
Uint32 UITextInput::onTextInput( const TextInputEvent& event ) {
if ( !mAllowEditing )
return 0;
Input* input = getUISceneNode()->getWindow()->getInput();
if ( !input->isControlPressed() && !( input->isAltPressed() && input->isShiftPressed() ) ) {
if ( input->isAltPressed() && !event.getText().empty() && event.getText()[0] == '\t' )
return 0;
const String& text = event.getText();
for ( size_t i = 0; i < text.size(); i++ ) {
if ( text[i] == '\n' )
return 0;
if ( mOnlyNumbers &&
( ( mAllowFloat && text[i] == '.' && mDoc.find( "." ).isValid() ) ||
!String::isNumber( text[i], mAllowFloat ) ) ) {
return 0;
}
}
mDoc.textInput( text );
return 1;
}
return 0;
}
void UITextInput::setAllowOnlyNumbers( const bool& onlyNumbers, const bool& allowFloat ) {
mOnlyNumbers = onlyNumbers;
mAllowFloat = allowFloat;
}
bool UITextInput::onlyNumbersAllowed() {
return mOnlyNumbers;
}
bool UITextInput::floatingPointAllowed() {
return mAllowFloat;
}
TextDocument& UITextInput::getDocument() {
return mDoc;
}
KeyBindings& UITextInput::getKeyBindings() {
return mKeyBindings;
}
}} // namespace EE::UI
+12 -26
View File
@@ -44,7 +44,7 @@ void UITextInputPassword::draw() {
if ( isClipped() ) {
clipSmartDisable();
}
} else if ( !mHintCache->getString().empty() && !mTextBuffer.isActive() ) {
} else if ( !mHintCache->getString().empty() ) {
if ( isClipped() ) {
clipSmartEnable( mScreenPos.x + mRealPadding.Left, mScreenPos.y + mRealPadding.Top,
mSize.getWidth() - mRealPadding.Left - mRealPadding.Right,
@@ -106,31 +106,17 @@ void UITextInputPassword::alignFix() {
}
if ( Font::getHorizontalAlign( getFlags() ) == UI_HALIGN_LEFT ) {
Uint32 NLPos = 0;
Uint32 LineNum = mTextBuffer.getCurPosLinePos( NLPos );
String curStr(
mTextBuffer.getBuffer().substr( NLPos, mTextBuffer.getCursorPosition() - NLPos ) );
String pasStr;
for ( size_t i = 0; i < curStr.size(); i++ )
pasStr += mBulletCharacter;
mPassCache->setString( pasStr );
Float tW = mPassCache->getTextWidth();
Float tW = mPassCache->findCharacterPos( selCurEnd() ).x;
Float tX = mRealAlignOffset.x + tW;
mCurPos.x = tW;
mCurPos.y = (Float)LineNum * (Float)mPassCache->getFont()->getLineSpacing(
mPassCache->getCharacterSizePx() );
mCurPos.y = 0;
if ( !mTextBuffer.setSupportNewLine() ) {
if ( tX < 0.f )
mRealAlignOffset.x = -( mRealAlignOffset.x + ( tW - mRealAlignOffset.x ) );
else if ( tX > mSize.getWidth() - mRealPadding.Left - mRealPadding.Right )
mRealAlignOffset.x = mSize.getWidth() - mRealPadding.Left - mRealPadding.Right -
( mRealAlignOffset.x + ( tW - mRealAlignOffset.x ) );
if ( tX < 0.f ) {
mRealAlignOffset.x = -( mRealAlignOffset.x + ( tW - mRealAlignOffset.x ) );
} else if ( tX > mSize.getWidth() - mRealPadding.Left - mRealPadding.Right ) {
mRealAlignOffset.x = mSize.getWidth() - mRealPadding.Left - mRealPadding.Right -
( mRealAlignOffset.x + ( tW - mRealAlignOffset.x ) );
}
}
}
@@ -141,10 +127,10 @@ void UITextInputPassword::updateText() {
void UITextInputPassword::updatePass( const String& pass ) {
String newTxt;
for ( size_t i = 0; i < pass.size(); i++ )
newTxt += mBulletCharacter;
if ( !pass.empty() ) {
for ( size_t i = 0; i < pass.size() - 1; i++ )
newTxt += mBulletCharacter;
}
mPassCache->setString( newTxt );
}
-1
View File
@@ -590,7 +590,6 @@ void UITextView::recalculate() {
void UITextView::resetSelCache() {
mLastSelCurInit = mLastSelCurEnd = -1;
invalidateDraw();
onSelectionChange();
}
+1 -1
View File
@@ -428,7 +428,7 @@ void EETest::createBaseUI() {
->setPosition( 60, 110 )
->setSize( 80, 24 );
UISpinBox::New()->setAllowOnlyNumbers( true )->setParent( C )->setPosition( 80, 150 )->setSize(
UISpinBox::New()->allowFloatingPoint( true )->setParent( C )->setPosition( 80, 150 )->setSize(
80, 24 );
mScrollBar = UIScrollBar::New();
+14 -16
View File
@@ -656,25 +656,22 @@ void App::initSearchBar() {
} );
};
auto addReturnListener = [&]( UIWidget* widget, std::string cmd ) {
widget->addEventListener( Event::KeyDown, [this, cmd]( const Event* event ) {
const KeyEvent* keyEvent = static_cast<const KeyEvent*>( event );
if ( keyEvent->getKeyCode() == KEY_RETURN )
mSearchBarLayout->execute( cmd );
widget->addEventListener( Event::OnPressEnter, [this, cmd]( const Event* ) {
mSearchBarLayout->execute( cmd );
} );
};
UITextInput* findInput = mSearchBarLayout->find<UITextInput>( "search_find" );
UITextInput* replaceInput = mSearchBarLayout->find<UITextInput>( "search_replace" );
UICheckBox* caseSensitiveChk = mSearchBarLayout->find<UICheckBox>( "case_sensitive" );
findInput->getInputTextBuffer()->pushIgnoredChar( '\t' );
replaceInput->getInputTextBuffer()->pushIgnoredChar( '\t' );
findInput->addEventListener( Event::OnTextChanged, [&, findInput]( const Event* ) {
if ( !findInput->getText().empty() ) {
findNextText( findInput->getText(), caseSensitiveChk->isChecked() );
} else if ( mCurEditor ) {
mCurEditor->getDocument().setSelection(
mCurEditor->getDocument().getSelection().start() );
}
} );
findInput->addEventListener(
Event::OnTextChanged, [&, findInput, caseSensitiveChk]( const Event* ) {
if ( !findInput->getText().empty() ) {
findNextText( findInput->getText(), caseSensitiveChk->isChecked() );
} else if ( mCurEditor ) {
mCurEditor->getDocument().setSelection(
mCurEditor->getDocument().getSelection().start() );
}
} );
mSearchBarLayout->addCommand( "close-searchbar", [&] {
mSearchBarLayout->setEnabled( false )->setVisible( false );
mCurEditor->setFocus();
@@ -727,7 +724,7 @@ void App::showFindView() {
String text = mCurEditor->getDocument().getSelectedText();
if ( !text.empty() ) {
findInput->setText( text );
findInput->getInputTextBuffer()->selectAll();
findInput->getDocument().selectAll();
}
}
@@ -947,7 +944,8 @@ void App::init( const std::string& file, const Float& pidelDensity ) {
mTheme = UITheme::load( "uitheme", "uitheme", "", font, resPath + "assets/ui/breeze.css" );
mUISceneNode->setStyleSheet( mTheme->getStyleSheet() );
mUISceneNode->getUIThemeManager()
mUISceneNode
->getUIThemeManager()
//->setDefaultEffectsEnabled( true )
->setDefaultTheme( mTheme )
->setDefaultFont( font )