mirror of
https://github.com/SpartanJ/eepp.git
synced 2026-08-18 06:55:48 +03:00
More fixes.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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 )
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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';
|
||||
|
||||
|
||||
Reference in New Issue
Block a user