More fixes.

This commit is contained in:
Martín Lucas Golini
2020-04-22 03:06:06 -03:00
parent 5f1d776750
commit 51b290f776
7 changed files with 76 additions and 73 deletions

View File

@@ -364,6 +364,8 @@ class EE_API Node : public Transformable {
bool isLoadingState() const;
virtual void onIdChange();
bool isClosing() const;
protected:
typedef std::map<Uint32, std::map<Uint32, EventCallback>> EventsMap;
friend class EventDispatcher;

View File

@@ -88,6 +88,7 @@ class EE_API UISceneNode : public SceneNode {
protected:
friend class EE::UI::UIWindow;
friend class EE::UI::UIWidget;
UIWidget* mRoot;
Sizef mDpSize;
Uint32 mFlags;
@@ -135,6 +136,8 @@ class EE_API UISceneNode : public SceneNode {
void checkShortcuts( const Uint32& KeyCode, const Uint32& Mod );
KeyboardShortcuts::iterator existsShortcut( const Uint32& KeyCode, const Uint32& Mod );
void onWidgetDelete( Node* node );
};
}} // namespace EE::UI

View File

@@ -690,6 +690,10 @@ void Node::onIdChange() {
sendCommonEvent( Event::OnIdChange );
}
bool Node::isClosing() const {
return 0 != ( mNodeFlags & NODE_FLAG_CLOSE );
}
Uint32 Node::getIdHash() const {
return mIdHash;
}

View File

@@ -39,13 +39,13 @@ UINode::UINode() :
mForeground( NULL ),
mBorder( NULL ),
mDragButton( EE_BUTTON_LMASK ),
mSkinColor( Color::White ) {
mSkinColor( Color::White ),
mUISceneNode( SceneManager::instance()->getUISceneNode() ) {
mNodeFlags |= NODE_FLAG_UINODE | NODE_FLAG_OVER_FIND_ALLOWED;
if ( NULL != SceneManager::instance()->getUISceneNode() )
setParent( (Node*)SceneManager::instance()->getUISceneNode()->getRoot() );
if ( NULL != mUISceneNode )
setParent( (Node*)mUISceneNode->getRoot() );
}
UINode::~UINode() {
removeSkin();

View File

@@ -385,30 +385,6 @@ void UISceneNode::update( const Time& elapsed ) {
SceneManager::instance()->setCurrentUISceneNode( this );
if ( !mDirtyStyle.empty() ) {
std::vector<UIWidget*> inCloseList;
for ( auto& widget : mDirtyStyle ) {
if ( mCloseList.count( widget ) > 0 ) {
inCloseList.push_back( widget );
}
}
for ( auto& widget : inCloseList ) {
mDirtyStyle.erase( widget );
}
}
if ( !mDirtyStyleState.empty() ) {
std::vector<UIWidget*> inCloseList;
for ( auto& widget : mDirtyStyleState ) {
if ( mCloseList.count( widget ) > 0 ) {
inCloseList.push_back( widget );
}
}
for ( auto& widget : inCloseList ) {
mDirtyStyleState.erase( widget );
}
}
SceneNode::update( elapsed );
if ( !mDirtyStyle.empty() ) {
@@ -433,6 +409,20 @@ void UISceneNode::update( const Time& elapsed ) {
SceneManager::instance()->setCurrentUISceneNode( uiSceneNode );
}
void UISceneNode::onWidgetDelete( Node* node ) {
if ( node->isWidget() ) {
UIWidget* widget = node->asType<UIWidget>();
if ( mDirtyStyle.find( widget ) != mDirtyStyle.end() ) {
mDirtyStyle.erase( widget );
}
if ( mDirtyStyleState.find( widget ) != mDirtyStyleState.end() ) {
mDirtyStyleState.erase( widget );
}
}
}
const bool& UISceneNode::isLoading() const {
return mIsLoading;
}
@@ -456,6 +446,9 @@ void UISceneNode::setVerbose( bool verbose ) {
void UISceneNode::invalidateStyle( UIWidget* node ) {
eeASSERT( NULL != node );
if ( node->isClosing() )
return;
Node* itNode = NULL;
if ( mDirtyStyle.count( node ) > 0 )
@@ -489,6 +482,9 @@ void UISceneNode::invalidateStyle( UIWidget* node ) {
void UISceneNode::invalidateStyleState( UIWidget* node ) {
eeASSERT( NULL != node );
if ( node->isClosing() )
return;
Node* itNode = NULL;
if ( mDirtyStyleState.count( node ) > 0 )

View File

@@ -1,5 +1,6 @@
#include <algorithm>
#include <eepp/scene/actions/actions.hpp>
#include <eepp/scene/scenemanager.hpp>
#include <eepp/ui/css/shorthanddefinition.hpp>
#include <eepp/ui/css/stylesheetproperty.hpp>
#include <eepp/ui/css/stylesheetselector.hpp>
@@ -43,9 +44,9 @@ UIWidget::UIWidget( const std::string& tag ) :
mAttributesTransactionCount( 0 ) {
mNodeFlags |= NODE_FLAG_WIDGET;
if ( NULL != mSceneNode && !isSceneNodeLoading() && !isLoadingState() ) {
getUISceneNode()->invalidateStyle( this );
getUISceneNode()->invalidateStyleState( this );
if ( NULL != mUISceneNode && !isSceneNodeLoading() && !isLoadingState() ) {
mUISceneNode->invalidateStyle( this );
mUISceneNode->invalidateStyleState( this );
}
createStyle();
@@ -56,6 +57,8 @@ UIWidget::UIWidget( const std::string& tag ) :
UIWidget::UIWidget() : UIWidget( "widget" ) {}
UIWidget::~UIWidget() {
if ( !SceneManager::instance()->isShootingDown() && NULL != mUISceneNode )
mUISceneNode->onWidgetDelete( this );
eeSAFE_DELETE( mStyle );
eeSAFE_DELETE( mTooltip );
}
@@ -223,18 +226,8 @@ void UIWidget::createTooltip() {
void UIWidget::onChildCountChange( Node* child, const bool& removed ) {
UINode::onChildCountChange( child, removed );
if ( !isSceneNodeLoading() && getUISceneNode() != NULL ) {
UISceneNode* sceneNode = getUISceneNode();
Node* child = getFirstChild();
UIWidget* widget = NULL;
while ( NULL != child ) {
if ( child->isWidget() && ( widget = child->asType<UIWidget>() ) &&
NULL != widget->getUIStyle() && widget->getUIStyle()->isStructurallyVolatile() ) {
sceneNode->invalidateStyleState( widget );
}
child = child->getNextNode();
};
}
if ( !isSceneNodeLoading() && getUISceneNode() != NULL )
getUISceneNode()->invalidateStyleState( this );
}
Vector2f UIWidget::getTooltipPosition() {
@@ -585,9 +578,7 @@ void UIWidget::reportStyleStateChange() {
}
bool UIWidget::isSceneNodeLoading() const {
return NULL != getSceneNode() && getSceneNode()->isUISceneNode()
? static_cast<UISceneNode*>( getSceneNode() )->isLoading()
: false;
return NULL != mUISceneNode ? mUISceneNode->isLoading() : false;
}
const std::string& UIWidget::getMinWidthEq() const {

View File

@@ -278,8 +278,13 @@ void InputTextBuffer::update( InputEvent* Event ) {
if ( isActive() ) {
Input* Input = mWindow->getInput();
Uint32 c = InputHelper::convertKeyCharacter(
Event->key.keysym.sym, Event->key.keysym.unicode, Event->key.keysym.mod );
Uint32 keyChar = 0;
if ( Event->Type == InputEvent::TextInput || Event->Type == InputEvent::KeyDown ||
Event->Type == InputEvent::KeyUp ) {
InputHelper::convertKeyCharacter( Event->key.keysym.sym, Event->key.keysym.unicode,
Event->key.keysym.mod );
}
if ( isFreeEditingEnabled() ) {
switch ( Event->Type ) {
@@ -312,7 +317,7 @@ void InputTextBuffer::update( InputEvent* Event ) {
( Event->key.keysym.sym == KEY_X ||
Event->key.keysym.sym == KEY_V ) ) ||
Event->key.keysym.sym == KEY_DELETE ) ||
c == KEY_BACKSPACE ) {
keyChar == KEY_BACKSPACE ) {
removeSelection();
break;
}
@@ -329,7 +334,8 @@ void InputTextBuffer::update( InputEvent* Event ) {
if ( Input->isShiftPressed() || Input->isControlPressed() ) {
if ( !onlyNumbersAllowed() &&
( ( ( Event->key.keysym.mod & KEYMOD_SHIFT ) && c == KEY_INSERT ) ||
( ( ( Event->key.keysym.mod & KEYMOD_SHIFT ) &&
keyChar == KEY_INSERT ) ||
( ( Event->key.keysym.mod & KEYMOD_CTRL ) &&
Event->key.keysym.sym == KEY_V ) ) ) {
String txt = mWindow->getClipboard()->getWideText();
@@ -360,26 +366,26 @@ void InputTextBuffer::update( InputEvent* Event ) {
}
if ( Input->isControlPressed() ) {
if ( c == KEY_LEFT ) {
if ( keyChar == KEY_LEFT ) {
promptToLeftFirstNoChar();
break;
} else if ( c == KEY_RIGHT ) {
} else if ( keyChar == KEY_RIGHT ) {
promptToRightFirstNoChar();
break;
} else if ( c == KEY_BACKSPACE ) {
} else if ( keyChar == KEY_BACKSPACE ) {
eraseToPrevNoChar();
break;
} else if ( c == KEY_DELETE ) {
} else if ( keyChar == KEY_DELETE ) {
eraseToNextNoChar();
break;
}
}
}
if ( ( c == KEY_BACKSPACE || c == KEY_DELETE ) ) {
if ( ( keyChar == KEY_BACKSPACE || keyChar == KEY_DELETE ) ) {
if ( mText.size() ) {
if ( mPromptPos < (int)mText.size() ) {
if ( c == KEY_BACKSPACE ) {
if ( keyChar == KEY_BACKSPACE ) {
if ( mPromptPos > 0 ) {
mText.erase( mPromptPos - 1, 1 );
setCursorPos( mPromptPos - 1 );
@@ -387,7 +393,7 @@ void InputTextBuffer::update( InputEvent* Event ) {
} else {
mText.erase( mPromptPos, 1 );
}
} else if ( c == KEY_BACKSPACE ) {
} else if ( keyChar == KEY_BACKSPACE ) {
mText.resize( mText.size() - 1 );
autoPrompt( true );
}
@@ -397,7 +403,7 @@ void InputTextBuffer::update( InputEvent* Event ) {
setChangedSinceLastUpdate( true );
onBufferChange();
}
} else if ( ( c == KEY_RETURN || c == KEY_KP_ENTER ) ) {
} else if ( ( keyChar == KEY_RETURN || keyChar == KEY_KP_ENTER ) ) {
if ( setSupportNewLine() && canAdd() ) {
String::insertChar( mText, mPromptPos, '\n' );
@@ -412,13 +418,13 @@ void InputTextBuffer::update( InputEvent* Event ) {
if ( mEnterCall )
mEnterCall();
} else if ( c == KEY_LEFT ) {
} else if ( keyChar == KEY_LEFT ) {
if ( ( mPromptPos - 1 ) >= 0 ) {
setCursorPos( mPromptPos - 1 );
autoPrompt( false );
shiftSelection( mPromptPos + 1 );
}
} else if ( c == KEY_RIGHT ) {
} else if ( keyChar == KEY_RIGHT ) {
if ( ( mPromptPos + 1 ) < (int)mText.size() ) {
setCursorPos( mPromptPos + 1 );
autoPrompt( false );
@@ -426,16 +432,16 @@ void InputTextBuffer::update( InputEvent* Event ) {
} else if ( ( mPromptPos + 1 ) == (int)mText.size() ) {
autoPrompt( true );
}
} else if ( c == KEY_UP ) {
} else if ( keyChar == KEY_UP ) {
movePromptRowUp( false );
} else if ( c == KEY_DOWN ) {
} else if ( keyChar == KEY_DOWN ) {
movePromptRowDown( true );
} else if ( c == KEY_PAGEUP ) {
} else if ( keyChar == KEY_PAGEUP ) {
movePromptRowUp( true );
} else if ( c == KEY_PAGEDOWN ) {
} else if ( keyChar == KEY_PAGEDOWN ) {
movePromptRowDown( false );
} else if ( c == KEY_TAB ) {
tryAddChar( c );
} else if ( keyChar == KEY_TAB ) {
tryAddChar( keyChar );
}
break;
@@ -444,7 +450,7 @@ void InputTextBuffer::update( InputEvent* Event ) {
if ( setSupportNewLine() ) {
int lPromtpPos = mPromptPos;
if ( c == KEY_END ) {
if ( keyChar == KEY_END ) {
for ( Uint32 i = mPromptPos; i < mText.size(); i++ ) {
if ( mText[i] == '\n' ) {
setCursorPos( i );
@@ -461,7 +467,7 @@ void InputTextBuffer::update( InputEvent* Event ) {
shiftSelection( lPromtpPos );
}
if ( c == KEY_HOME ) {
if ( keyChar == KEY_HOME ) {
if ( 0 != mPromptPos ) {
for ( Int32 i = (Int32)mPromptPos - 1; i >= 0; i-- ) {
if ( mText[i] == '\n' ) {
@@ -482,13 +488,13 @@ void InputTextBuffer::update( InputEvent* Event ) {
} else {
int lPromtpPos = mPromptPos;
if ( c == KEY_END ) {
if ( keyChar == KEY_END ) {
autoPrompt( true );
shiftSelection( lPromtpPos );
}
if ( c == KEY_HOME ) {
if ( keyChar == KEY_HOME ) {
setCursorPos( 0 );
autoPrompt( false );
@@ -502,10 +508,11 @@ void InputTextBuffer::update( InputEvent* Event ) {
if ( Event->Type == InputEvent::TextInput ) {
tryAddChar( Event->text.text );
} else if ( Event->Type == InputEvent::KeyDown ) {
if ( c == KEY_BACKSPACE && mText.size() > 0 ) {
if ( keyChar == KEY_BACKSPACE && mText.size() > 0 ) {
mText.resize( mText.size() - 1 );
} else if ( ( c == KEY_RETURN || c == KEY_KP_ENTER ) && !Input->isMetaPressed() &&
!Input->isAltPressed() && !Input->isControlPressed() ) {
} else if ( ( keyChar == KEY_RETURN || keyChar == KEY_KP_ENTER ) &&
!Input->isMetaPressed() && !Input->isAltPressed() &&
!Input->isControlPressed() ) {
if ( setSupportNewLine() && canAdd() )
mText += '\n';