Several fixes and clean up.

--HG--
branch : dev-scenenode
This commit is contained in:
Martín Lucas Golini
2018-02-04 20:59:20 -03:00
parent 9539e8d744
commit c58252075a
20 changed files with 264 additions and 127 deletions

View File

@@ -14,5 +14,5 @@ JoystickEnabled = 0
ParticlesNum = 1000
UseShaders = 1
Music = 0
PixelDensity = 1
PixelDensity = 1.5
DebugUI = 0

View File

@@ -22,6 +22,7 @@ namespace EE { namespace Scene {
class Action;
class ActionManager;
class SceneNode;
class NodeDrawInvalidator;
}}
using namespace EE::Scene;
@@ -43,19 +44,21 @@ enum NODE_FLAGS_VALUES {
NODE_FLAG_DRAGGING = (1<<13),
NODE_FLAG_SKIN_OWNER = (1<<14),
NODE_FLAG_TOUCH_DRAGGING = (1<<15),
NODE_FLAG_DISABLED_BY_MODAL_WINDOW = (1<<16),
NODE_FLAG_OWNED_BY_WINDOW = (1<<17),
NODE_FLAG_DISABLED_BY_NODE = (1<<16),
NODE_FLAG_OWNED_BY_NODE = (1<<17),
NODE_FLAG_REVERSE_DRAW = (1<<18),
NODE_FLAG_FRAME_BUFFER = (1<<19),
NODE_FLAG_CLIP_ENABLE = (1<<20),
NODE_FLAG_SCENENODE = (1<<21),
NODE_FLAG_UISCENENODE = (1<<22),
NODE_FLAG_UINODE = (1<<24),
NODE_FLAG_WIDGET = (1<<25),
NODE_FLAG_WINDOW = (1<<26),
NODE_FLAG_REPORT_SIZE_CHANGE_TO_CHILDS = (1<<27),
NODE_FLAG_OVER_FIND_ALLOWED = (1<<28),
NODE_FLAG_FREE_USE = (1<<29)
NODE_FLAG_REPORT_SIZE_CHANGE_TO_CHILDS = (1<<21),
NODE_FLAG_OVER_FIND_ALLOWED = (1<<22),
NODE_FLAG_SCENENODE = (1<<23),
NODE_FLAG_UISCENENODE = (1<<24),
NODE_FLAG_UINODE = (1<<25),
NODE_FLAG_WIDGET = (1<<26),
NODE_FLAG_WINDOW = (1<<27),
NODE_FLAG_FREE_USE = (1<<28)
};
class EE_API Node : public Transformable {
@@ -303,6 +306,12 @@ class EE_API Node : public Transformable {
SceneNode * getSceneNode();
EventDispatcher * getEventDispatcher();
virtual bool isDrawInvalidator();
virtual bool invalidated();
virtual void invalidate();
protected:
typedef std::map< Uint32, std::map<Uint32, EventCallback> > EventsMap;
friend class EE::Scene::EventDispatcher;
@@ -315,6 +324,7 @@ class EE_API Node : public Transformable {
UintPtr mData;
Node * mParentCtrl;
SceneNode * mSceneNode;
Node * mNodeDrawInvalidator;
Node * mChild; //! Pointer to the first child of the node
Node * mChildLast; //! Pointer to the last child added
Node * mNext; //! Pointer to the next child of the father
@@ -453,6 +463,10 @@ class EE_API Node : public Transformable {
void clipSmartEnable( const Int32 & x, const Int32 & y, const Uint32 & Width, const Uint32 & Height );
void clipSmartDisable();
Node * getDrawInvalidator();
SceneNode * findSceneNode();
};
}}

View File

@@ -3,6 +3,7 @@
#include <eepp/scene/node.hpp>
#include <eepp/window/cursorhelper.hpp>
#include <eepp/system/translator.hpp>
namespace EE { namespace Graphics {
class FrameBuffer;
@@ -23,24 +24,44 @@ class EE_API SceneNode : public Node {
~SceneNode();
Node * loadLayoutFromFile( const std::string& layoutPath, Node * parent = NULL );
Node * loadLayoutFromString( const std::string& layoutString, Node * parent = NULL );
Node * loadLayoutFromMemory( const void * buffer, Int32 bufferSize, Node * parent = NULL );
Node * loadLayoutFromStream( IOStream& stream, Node * parent = NULL );
Node * loadLayoutFromPack( Pack * pack, const std::string& FilePackPath, Node * parent = NULL );
Node * loadLayoutNodes( pugi::xml_node node, Node * parent );
void setTranslator( Translator translator );
Translator& getTranslator();
String getTranslatorString( const std::string& str );
void enableFrameBuffer();
void disableFrameBuffer();
bool ownsFrameBuffer() const;
virtual void draw();
virtual void update( const Time& elapsed );
bool invalidated();
void invalidate();
void enableDrawInvalidation();
void disableDrawInvalidation();
EE::Window::Window * getWindow();
void invalidate();
FrameBuffer * getFrameBuffer() const;
void setEventDispatcher( EventDispatcher * eventDispatcher );
@@ -89,6 +110,7 @@ class EE_API SceneNode : public Node {
void setCursor( EE_CURSOR_TYPE cursor );
virtual bool isDrawInvalidator();
protected:
friend class Node;
@@ -116,6 +138,10 @@ class EE_API SceneNode : public Node {
virtual void matrixUnset();
virtual void preDraw();
virtual void postDraw();
void sendMsg( Node * Ctrl, const Uint32& Msg, const Uint32& Flags = 0 );
virtual void resizeControl( EE::Window::Window * win );

View File

@@ -116,6 +116,8 @@ class EE_API UIWindow : public UIWidget {
bool invalidated();
FrameBuffer * getFrameBuffer() const;
virtual bool isDrawInvalidator();
protected:
class KeyboardShortcut {
public:

View File

@@ -208,6 +208,9 @@ void FrameBufferFBO::reload() {
}
void FrameBufferFBO::resize( const Uint32& Width, const Uint32& Height ) {
if ( Sizei( Width, Height ) == mSize )
return;
mSize.x = Width;
mSize.y = Height;

View File

@@ -17,6 +17,7 @@ Node::Node() :
mData( 0 ),
mParentCtrl( NULL ),
mSceneNode( NULL ),
mNodeDrawInvalidator( NULL ),
mChild( NULL ),
mChildLast( NULL ),
mNext( NULL ),
@@ -203,6 +204,7 @@ Node * Node::setParent( Node * parent ) {
mParentCtrl->childRemove( this );
mParentCtrl = parent;
mNodeDrawInvalidator = getDrawInvalidator();
if ( NULL != mParentCtrl )
mParentCtrl->childAdd( this );
@@ -211,7 +213,7 @@ Node * Node::setParent( Node * parent ) {
onParentChange();
if ( mSceneNode != getSceneNode() )
if ( mSceneNode != findSceneNode() )
onSceneChange();
return this;
@@ -433,18 +435,6 @@ void Node::setNodeFlags( const Uint32& Flags ) {
mNodeFlags = Flags;
}
Uint32 Node::isSceneNode() {
return mNodeFlags & NODE_FLAG_SCENENODE;
}
Uint32 Node::isUISceneNode() {
return mNodeFlags & NODE_FLAG_UISCENENODE;
}
Uint32 Node::isUINode() {
return mNodeFlags & NODE_FLAG_UINODE;
}
void Node::drawChilds() {
if ( isReverseDraw() ) {
Node * ChildLoop = mChildLast;
@@ -556,7 +546,8 @@ void Node::childAddAt( Node * ChildCtrl, Uint32 Pos ) {
childRemove( ChildCtrl );
ChildCtrl->mParentCtrl = this;
ChildCtrl->mSceneNode = ChildCtrl->getSceneNode();
ChildCtrl->mSceneNode = ChildCtrl->findSceneNode();
if ( ChildLoop == NULL ) {
mChild = ChildCtrl;
mChildLast = ChildCtrl;
@@ -774,7 +765,7 @@ Node * Node::overFind( const Vector2f& Point ) {
}
void Node::onSceneChange() {
mSceneNode = getSceneNode();
mSceneNode = findSceneNode();
Node * ChildLoop = mChild;
@@ -808,6 +799,18 @@ Uint32 Node::isFrameBuffer() {
return mNodeFlags & NODE_FLAG_FRAME_BUFFER;
}
Uint32 Node::isSceneNode() {
return mNodeFlags & NODE_FLAG_SCENENODE;
}
Uint32 Node::isUISceneNode() {
return mNodeFlags & NODE_FLAG_UISCENENODE;
}
Uint32 Node::isUINode() {
return mNodeFlags & NODE_FLAG_UINODE;
}
bool Node::isMeOrParentTreeRotated() {
Node * Ctrl = this;
@@ -998,14 +1001,16 @@ void Node::setReverseDraw( bool reverseDraw ) {
}
void Node::invalidateDraw() {
if ( NULL != mSceneNode ) {
mSceneNode->invalidate();
} else if ( NULL == mParentCtrl && isSceneNode() ) {
static_cast<SceneNode*>( this )->invalidate();
if ( NULL != mNodeDrawInvalidator ) {
mNodeDrawInvalidator->invalidate();
}
}
SceneNode * Node::getSceneNode() {
return mSceneNode;
}
SceneNode * Node::findSceneNode() {
Node * Ctrl = mParentCtrl;
while ( Ctrl != NULL ) {
@@ -1319,7 +1324,7 @@ Node * Node::getNextWidget() {
}
}
return mSceneNode;
return NULL;
}
void Node::sendParentSizeChange( const Vector2f& SizeChange ) {
@@ -1394,4 +1399,31 @@ void Node::clipSmartDisable() {
}
}
Node* Node::getDrawInvalidator() {
Node * Ctrl = mParentCtrl;
while ( Ctrl != NULL ) {
if ( Ctrl->isDrawInvalidator() )
return Ctrl;
Ctrl = Ctrl->getParent();
}
return isDrawInvalidator() ? this : NULL;
}
bool Node::isDrawInvalidator() {
return false;
}
void Node::invalidate() {
if ( mVisible && mAlpha != 0.f ) {
writeCtrlFlag( NODE_FLAG_VIEW_DIRTY, 1 );
}
}
bool Node::invalidated() {
return 0 != ( mNodeFlags & NODE_FLAG_VIEW_DIRTY );
}
}}

View File

@@ -64,6 +64,12 @@ void SceneNode::enableFrameBuffer() {
void SceneNode::disableFrameBuffer() {
eeSAFE_DELETE( mFrameBuffer );
writeCtrlFlag( NODE_FLAG_FRAME_BUFFER, 0 );
}
bool SceneNode::ownsFrameBuffer() const {
return 0 != ( mNodeFlags & NODE_FLAG_FRAME_BUFFER );
}
void SceneNode::draw() {
@@ -73,19 +79,36 @@ void SceneNode::draw() {
mWindow->setView( mWindow->getDefaultView() );
if ( mVisible ) {
if ( mNodeFlags & NODE_FLAG_POSITION_DIRTY )
updateScreenPos();
if ( mVisible && 0 != mAlpha ) {
updateScreenPos();
preDraw();
ClippingMask * clippingMask = GLi->getClippingMask();
std::list<Rectf> clips = clippingMask->getPlanesClipped();
if ( !clips.empty() )
clippingMask->clipPlaneDisable();
matrixSet();
clipStart();
if ( NULL == mFrameBuffer || !usesInvalidation() || invalidated() ) {
clipStart();
drawChilds();
drawChilds();
clipEnd();
clipEnd();
}
matrixUnset();
if ( !clips.empty() )
clippingMask->setPlanesClipped( clips );
postDraw();
writeCtrlFlag( NODE_FLAG_VIEW_DIRTY, 0 );
}
mWindow->setView( prevView );
@@ -175,11 +198,12 @@ Sizei SceneNode::getFrameBufferSize() {
}
void SceneNode::createFrameBuffer() {
writeCtrlFlag( NODE_FLAG_FRAME_BUFFER, 1 );
eeSAFE_DELETE( mFrameBuffer );
Sizei fboSize( getFrameBufferSize() );
if ( fboSize.getWidth() < 1 ) fboSize.setWidth(1);
if ( fboSize.getHeight() < 1 ) fboSize.setHeight(1);
mFrameBuffer = FrameBuffer::New( fboSize.getWidth(), fboSize.getHeight(), true, false, true );
mFrameBuffer = FrameBuffer::New( fboSize.getWidth(), fboSize.getHeight(), true, false, false, 4, mWindow );
}
void SceneNode::drawFrameBuffer() {
@@ -361,4 +385,14 @@ void SceneNode::setCursor( EE_CURSOR_TYPE cursor ) {
}
}
bool SceneNode::isDrawInvalidator() {
return NULL != mFrameBuffer;
}
void SceneNode::preDraw() {
}
void SceneNode::postDraw() {
}
}}

View File

@@ -107,7 +107,7 @@ void UIDropDownList::showList() {
if ( !mStyleConfig.PopUpToMainControl )
mListBox->setParent( NULL != mFriendCtrl ? mFriendCtrl->getParent() : getWindowContainer() );
else
mListBox->setParent( getSceneNode() );
mListBox->setParent( mSceneNode );
mListBox->toFront();

View File

@@ -991,8 +991,8 @@ void UIListBox::loadFromXmlNode(const pugi::xml_node & node) {
std::string data = item.text().as_string();
if ( data.size() ) {
if ( NULL != getSceneNode() && getSceneNode()->isUISceneNode() )
items.push_back( static_cast<UISceneNode*>( getSceneNode() )->getTranslatorString( data ) );
if ( NULL != mSceneNode && mSceneNode->isUISceneNode() )
items.push_back( static_cast<UISceneNode*>( mSceneNode )->getTranslatorString( data ) );
}
}

View File

@@ -556,8 +556,6 @@ void UIMenu::loadFromXmlNode( const pugi::xml_node& node ) {
UIWidget::loadFromXmlNode( node );
for ( pugi::xml_node item = node.first_child(); item; item = item.next_sibling() ) {
std::string name( item.name() );
String::toLowerInPlace( name );
@@ -566,26 +564,29 @@ void UIMenu::loadFromXmlNode( const pugi::xml_node& node ) {
std::string text( item.attribute("text").as_string() );
std::string icon( item.attribute("icon").as_string() );
if ( NULL != getSceneNode() && getSceneNode()->isUISceneNode() )
add( static_cast<UISceneNode*>( getSceneNode() )->getTranslatorString( text ), getIconDrawable( icon ) );
if ( NULL != mSceneNode && mSceneNode->isUISceneNode() )
add( static_cast<UISceneNode*>( mSceneNode )->getTranslatorString( text ), getIconDrawable( icon ) );
} else if ( name == "menuseparator" || name == "separator" ) {
addSeparator();
} else if ( name == "menucheckbox" || name == "checkbox" ) {
std::string text( item.attribute("text").as_string() );
bool active( item.attribute("active").as_bool() );
if ( NULL != getSceneNode() && getSceneNode()->isUISceneNode() )
addCheckBox( static_cast<UISceneNode*>( getSceneNode() )->getTranslatorString( text ), active );
if ( NULL != mSceneNode && mSceneNode->isUISceneNode() )
addCheckBox( static_cast<UISceneNode*>( mSceneNode )->getTranslatorString( text ), active );
} else if ( name == "menusubmenu" || name == "submenu" ) {
std::string text( item.attribute("text").as_string() );
std::string icon( item.attribute("icon").as_string() );
UIPopUpMenu * subMenu = UIPopUpMenu::New();
if ( NULL != getDrawInvalidator() )
subMenu->setParent( getDrawInvalidator() );
subMenu->loadFromXmlNode( item );
if ( NULL != getSceneNode() && getSceneNode()->isUISceneNode() )
addSubMenu( static_cast<UISceneNode*>( getSceneNode() )->getTranslatorString( text ), getIconDrawable( icon ), subMenu );
if ( NULL != mSceneNode && mSceneNode->isUISceneNode() )
addSubMenu( static_cast<UISceneNode*>( mSceneNode )->getTranslatorString( text ), getIconDrawable( icon ), subMenu );
}
}

View File

@@ -86,8 +86,8 @@ UIMenu * UIMenuSubMenu::getSubMenu() const {
Uint32 UIMenuSubMenu::onMouseMove( const Vector2i &Pos, const Uint32 Flags ) {
UIMenuItem::onMouseMove( Pos, Flags );
if ( NULL != getSceneNode() && NULL != mSubMenu && !mSubMenu->isVisible() ) {
mTimeOver += getSceneNode()->getElapsed().asMilliseconds();
if ( NULL != mSceneNode && NULL != mSubMenu && !mSubMenu->isVisible() ) {
mTimeOver += mSceneNode->getElapsed().asMilliseconds();
if ( mTimeOver >= mMaxTime ) {
showSubMenu();

View File

@@ -198,29 +198,29 @@ const Sizef& UINode::getRealSize() {
}
void UINode::drawHighlightFocus() {
if ( NULL != getEventDispatcher() && getSceneNode()->getHighlightFocus() && getEventDispatcher()->getFocusControl() == this ) {
if ( NULL != getEventDispatcher() && mSceneNode->getHighlightFocus() && getEventDispatcher()->getFocusControl() == this ) {
Primitives P;
P.setFillMode( DRAW_LINE );
P.setBlendMode( getBlendMode() );
P.setColor( getSceneNode()->getHighlightFocusColor() );
P.setColor( mSceneNode->getHighlightFocusColor() );
P.setLineWidth( PixelDensity::dpToPxI( 1 ) );
P.drawRectangle( getScreenBounds() );
}
}
void UINode::drawOverNode() {
if ( NULL != getEventDispatcher() && getSceneNode()->getHighlightOver() && getEventDispatcher()->getOverControl() == this ) {
if ( NULL != getEventDispatcher() && mSceneNode->getHighlightOver() && getEventDispatcher()->getOverControl() == this ) {
Primitives P;
P.setFillMode( DRAW_LINE );
P.setBlendMode( getBlendMode() );
P.setColor( getSceneNode()->getHighlightOverColor() );
P.setColor( mSceneNode->getHighlightOverColor() );
P.setLineWidth( PixelDensity::dpToPxI( 1 ) );
P.drawRectangle( getScreenBounds() );
}
}
void UINode::drawDebugData() {
if ( NULL != getSceneNode() && getSceneNode()->getDrawDebugData() ) {
if ( NULL != mSceneNode && mSceneNode->getDrawDebugData() ) {
if ( isWidget() ) {
UIWidget * me = static_cast<UIWidget*>( this );
@@ -240,7 +240,7 @@ void UINode::drawDebugData() {
}
void UINode::drawBox() {
if ( NULL != getSceneNode() && getSceneNode()->getDrawBoxes() ) {
if ( NULL != mSceneNode && mSceneNode->getDrawBoxes() ) {
Primitives P;
P.setFillMode( DRAW_LINE );
P.setBlendMode( getBlendMode() );
@@ -698,11 +698,9 @@ Node * UINode::getWindowContainer() {
while ( Ctrl != NULL ) {
if ( Ctrl->isType( UI_TYPE_WINDOW ) ) {
if ( getSceneNode() == Ctrl ) {
return Ctrl;
} else {
return static_cast<UIWindow*>( Ctrl )->getContainer();
}
return static_cast<UIWindow*>( Ctrl )->getContainer();
} else if ( mSceneNode == Ctrl ) {
return mSceneNode;
}
Ctrl = Ctrl->getParent();
@@ -808,7 +806,7 @@ static void UINode_onFadeDone( Action * action, const Action::ActionType& action
}
Interpolation1d * UINode::startAlphaAnim( const Float& From, const Float& To, const Time& TotalTime, const bool& AlphaChilds, const Ease::Interpolation& Type, Interpolation1d::OnPathEndCallback PathEndCallback ) {
Actions::Fade * action = Actions::Fade::New( From, To, TotalTime, Type );
Actions::Fade * action = Actions::Fade::New( From, To, TotalTime, Type, AlphaChilds );
action->getInterpolation()->setPathEndCallback( PathEndCallback );

View File

@@ -96,8 +96,8 @@ Uint32 UIPopUpMenu::onMessage( const NodeMessage * Msg ) {
if ( !Msg->getSender()->isType( UI_TYPE_MENUSUBMENU ) && ( Msg->getFlags() & EE_BUTTONS_LRM ) ) {
sendCommonEvent( Event::OnHideByClick );
if ( isVisible() && NULL != getSceneNode() )
getSceneNode()->setFocus();
if ( isVisible() && NULL != mSceneNode )
mSceneNode->setFocus();
hide();
}

View File

@@ -357,8 +357,8 @@ void UIPushButton::loadFromXmlNode(const pugi::xml_node & node) {
String::toLowerInPlace( name );
if ( "text" == name ) {
if ( NULL != getSceneNode() )
setText( static_cast<UISceneNode*>( getSceneNode() )->getTranslatorString( ait->as_string() ) );
if ( NULL != mSceneNode )
setText( static_cast<UISceneNode*>( mSceneNode )->getTranslatorString( ait->as_string() ) );
} else if ( "textovercolor" == name ) {
setFontOverColor( Color::fromString( ait->as_string() ) );
} else if ( "icon" == name ) {

View File

@@ -459,8 +459,8 @@ void UITextEdit::loadFromXmlNode(const pugi::xml_node & node) {
String::toLowerInPlace( name );
if ( "text" == name ) {
if ( NULL != getSceneNode() && getSceneNode()->isUISceneNode() ) {
setText( static_cast<UISceneNode*>( getSceneNode() )->getTranslatorString( ait->as_string() ) );
if ( NULL != mSceneNode && mSceneNode->isUISceneNode() ) {
setText( static_cast<UISceneNode*>( mSceneNode )->getTranslatorString( ait->as_string() ) );
}
} else if ( "allowediting" == name ) {
setAllowEditing( ait->as_bool() );

View File

@@ -43,8 +43,8 @@ bool UITextInput::isType( const Uint32& type ) const {
}
void UITextInput::update( const Time& time ) {
if ( isMouseOverMeOrChilds() && NULL != getSceneNode() ) {
getSceneNode()->setCursor( EE_CURSOR_IBEAM );
if ( isMouseOverMeOrChilds() && NULL != mSceneNode ) {
mSceneNode->setCursor( EE_CURSOR_IBEAM );
}
UITextView::update( time );
@@ -295,8 +295,8 @@ Uint32 UITextInput::onMouseDoubleClick( const Vector2i& Pos, const Uint32 Flags
Uint32 UITextInput::onMouseExit( const Vector2i& Pos, const Uint32 Flags ) {
UINode::onMouseExit( Pos, Flags );
if ( NULL != getSceneNode() )
getSceneNode()->setCursor( EE_CURSOR_ARROW );
if ( NULL != mSceneNode )
mSceneNode->setCursor( EE_CURSOR_ARROW );
return 1;
}
@@ -349,8 +349,8 @@ void UITextInput::loadFromXmlNode(const pugi::xml_node & node) {
String::toLowerInPlace( name );
if ( "text" == name ) {
if ( NULL != getSceneNode() && getSceneNode()->isUISceneNode() ) {
setText( static_cast<UISceneNode*>( getSceneNode() )->getTranslatorString( ait->as_string() ) );
if ( NULL != mSceneNode && mSceneNode->isUISceneNode() ) {
setText( static_cast<UISceneNode*>( mSceneNode )->getTranslatorString( ait->as_string() ) );
}
} else if ( "allowediting" == name ) {
setAllowEditing( ait->as_bool() );

View File

@@ -534,8 +534,8 @@ void UITextView::loadFromXmlNode(const pugi::xml_node & node) {
String::toLowerInPlace( name );
if ( "text" == name ) {
if ( NULL != getSceneNode() && getSceneNode()->isUISceneNode() )
setText( static_cast<UISceneNode*>( getSceneNode() )->getTranslatorString( ait->as_string() ) );
if ( NULL != mSceneNode && mSceneNode->isUISceneNode() )
setText( static_cast<UISceneNode*>( mSceneNode )->getTranslatorString( ait->as_string() ) );
} else if ( "textcolor" == name ) {
setFontColor( Color::fromString( ait->as_string() ) );
} else if ( "textshadowcolor" == name ) {

View File

@@ -64,7 +64,7 @@ UIWindow::UIWindow( UIWindow::WindowBaseContainerType type, const UIWindowStyleC
}
mContainer->setLayoutSizeRules( FIXED, FIXED );
mContainer->writeCtrlFlag( NODE_FLAG_OWNED_BY_WINDOW, 1 );
mContainer->writeCtrlFlag( NODE_FLAG_OWNED_BY_NODE, 1 );
mContainer->setParent( this );
mContainer->clipEnable();
mContainer->enableReportSizeChangeToChilds();
@@ -113,7 +113,7 @@ void UIWindow::updateWinFlags() {
if ( !( mStyleConfig.WinFlags & UI_WIN_NO_BORDER ) ) {
if ( NULL == mWindowDecoration ) {
mWindowDecoration = UINode::New();
mWindowDecoration->writeCtrlFlag( NODE_FLAG_OWNED_BY_WINDOW, 1 );
mWindowDecoration->writeCtrlFlag( NODE_FLAG_OWNED_BY_NODE, 1 );
}
mWindowDecoration->setParent( this );
@@ -122,7 +122,7 @@ void UIWindow::updateWinFlags() {
if ( NULL == mBorderLeft ) {
mBorderLeft = UINode::New();
mBorderLeft->writeCtrlFlag( NODE_FLAG_OWNED_BY_WINDOW, 1 );
mBorderLeft->writeCtrlFlag( NODE_FLAG_OWNED_BY_NODE, 1 );
}
mBorderLeft->setParent( this );
@@ -131,7 +131,7 @@ void UIWindow::updateWinFlags() {
if ( NULL == mBorderRight ) {
mBorderRight = UINode::New();
mBorderRight->writeCtrlFlag( NODE_FLAG_OWNED_BY_WINDOW, 1 );
mBorderRight->writeCtrlFlag( NODE_FLAG_OWNED_BY_NODE, 1 );
}
mBorderRight->setParent( this );
@@ -140,7 +140,7 @@ void UIWindow::updateWinFlags() {
if ( NULL == mBorderBottom ) {
mBorderBottom = UINode::New();
mBorderBottom->writeCtrlFlag( NODE_FLAG_OWNED_BY_WINDOW, 1 );
mBorderBottom->writeCtrlFlag( NODE_FLAG_OWNED_BY_NODE, 1 );
}
mBorderBottom->setParent( this );
@@ -150,7 +150,7 @@ void UIWindow::updateWinFlags() {
if ( mStyleConfig.WinFlags & UI_WIN_CLOSE_BUTTON ) {
if ( NULL == mButtonClose ) {
mButtonClose = UINode::New();
mButtonClose->writeCtrlFlag( NODE_FLAG_OWNED_BY_WINDOW, 1 );
mButtonClose->writeCtrlFlag( NODE_FLAG_OWNED_BY_NODE, 1 );
needsUpdate = true;
}
@@ -165,7 +165,7 @@ void UIWindow::updateWinFlags() {
if ( isMaximizable() ) {
if ( NULL == mButtonMaximize ) {
mButtonMaximize = UINode::New();
mButtonMaximize->writeCtrlFlag( NODE_FLAG_OWNED_BY_WINDOW, 1 );
mButtonMaximize->writeCtrlFlag( NODE_FLAG_OWNED_BY_NODE, 1 );
needsUpdate = true;
}
@@ -180,7 +180,7 @@ void UIWindow::updateWinFlags() {
if ( mStyleConfig.WinFlags & UI_WIN_MINIMIZE_BUTTON ) {
if ( NULL == mButtonMinimize ) {
mButtonMinimize = UINode::New();
mButtonMinimize->writeCtrlFlag( NODE_FLAG_OWNED_BY_WINDOW, 1 );
mButtonMinimize->writeCtrlFlag( NODE_FLAG_OWNED_BY_NODE, 1 );
needsUpdate = true;
}
@@ -277,13 +277,13 @@ void UIWindow::drawFrameBuffer() {
}
void UIWindow::drawHighlightInvalidation() {
if ( ( mNodeFlags & NODE_FLAG_VIEW_DIRTY ) && NULL != getSceneNode() && getSceneNode()->getHighlightInvalidation() ) {
if ( ( mNodeFlags & NODE_FLAG_VIEW_DIRTY ) && NULL != mSceneNode && mSceneNode->getHighlightInvalidation() ) {
UIWidget::matrixSet();
Primitives P;
P.setFillMode( DRAW_LINE );
P.setBlendMode( getBlendMode() );
P.setColor( getSceneNode()->getHighlightInvalidationColor() );
P.setColor( mSceneNode->getHighlightInvalidationColor() );
P.setLineWidth( PixelDensity::dpToPx( 2 ) );
P.drawRectangle( getScreenBounds() );
@@ -329,22 +329,22 @@ void UIWindow::drawShadow() {
}
Sizei UIWindow::getFrameBufferSize() {
return isResizeable() && (Node*)this != (Node*)getSceneNode() ? Sizei( Math::nextPowOfTwo( (int)mSize.getWidth() ), Math::nextPowOfTwo( (int)mSize.getHeight() ) ) : mSize.ceil().asInt();
return isResizeable() && (Node*)this != mSceneNode ? Sizei( Math::nextPowOfTwo( (int)mSize.getWidth() ), Math::nextPowOfTwo( (int)mSize.getHeight() ) ) : mSize.ceil().asInt();
}
UISceneNode *UIWindow::getUISceneNode() {
return ( NULL != getSceneNode() && getSceneNode()->isUISceneNode() ) ? static_cast<UISceneNode*>( getSceneNode() ) : NULL;
return ( NULL != mSceneNode && mSceneNode->isUISceneNode() ) ? static_cast<UISceneNode*>( mSceneNode ) : NULL;
}
void UIWindow::createModalControl() {
Node * Ctrl = getSceneNode();
Node * Ctrl = mSceneNode;
if ( NULL == Ctrl )
return;
if ( NULL == mModalCtrl ) {
mModalCtrl = UIWidget::New();
mModalCtrl->writeCtrlFlag( NODE_FLAG_OWNED_BY_WINDOW, 1 );
mModalCtrl->writeCtrlFlag( NODE_FLAG_OWNED_BY_NODE, 1 );
mModalCtrl->setParent( Ctrl )->setPosition(0,0)->setSize( Ctrl->getSize() );
mModalCtrl->setAnchors( UI_ANCHOR_LEFT | UI_ANCHOR_TOP | UI_ANCHOR_RIGHT | UI_ANCHOR_BOTTOM );
} else {
@@ -360,17 +360,17 @@ void UIWindow::createModalControl() {
}
void UIWindow::enableByModal() {
if ( isModal() && NULL != getSceneNode() ) {
Node * CtrlChild = getSceneNode()->getFirstChild();
if ( isModal() && NULL != mSceneNode ) {
Node * CtrlChild = mSceneNode->getFirstChild();
while ( NULL != CtrlChild )
{
if ( CtrlChild != mModalCtrl &&
CtrlChild != this &&
CtrlChild->getNodeFlags() & NODE_FLAG_DISABLED_BY_MODAL_WINDOW )
CtrlChild->getNodeFlags() & NODE_FLAG_DISABLED_BY_NODE )
{
CtrlChild->setEnabled( true );
CtrlChild->writeCtrlFlag( NODE_FLAG_DISABLED_BY_MODAL_WINDOW, 0 );
CtrlChild->writeCtrlFlag( NODE_FLAG_DISABLED_BY_NODE, 0 );
}
CtrlChild = CtrlChild->getNextNode();
@@ -379,8 +379,8 @@ void UIWindow::enableByModal() {
}
void UIWindow::disableByModal() {
if ( isModal() && NULL != getSceneNode() ) {
Node * CtrlChild = getSceneNode()->getFirstChild();
if ( isModal() && NULL != mSceneNode ) {
Node * CtrlChild = mSceneNode->getFirstChild();
while ( NULL != CtrlChild )
{
@@ -389,7 +389,7 @@ void UIWindow::disableByModal() {
CtrlChild->isEnabled() )
{
CtrlChild->setEnabled( false );
CtrlChild->writeCtrlFlag( NODE_FLAG_DISABLED_BY_MODAL_WINDOW, 1 );
CtrlChild->writeCtrlFlag( NODE_FLAG_DISABLED_BY_NODE, 1 );
}
CtrlChild = CtrlChild->getNextNode();
@@ -664,8 +664,8 @@ Uint32 UIWindow::onMessage( const NodeMessage * Msg ) {
}
case NodeMessage::WindowResize:
{
if ( isModal() && NULL != mModalCtrl && NULL != getSceneNode() ) {
mModalCtrl->setSize( getSceneNode()->getSize() );
if ( isModal() && NULL != mModalCtrl && NULL != mSceneNode ) {
mModalCtrl->setSize( mSceneNode->getSize() );
}
break;
@@ -995,8 +995,8 @@ bool UIWindow::hide() {
setVisible( false );
}
if ( NULL != getSceneNode() )
getSceneNode()->setFocus();
if ( NULL != mSceneNode )
mSceneNode->setFocus();
if ( NULL != mModalCtrl ) {
mModalCtrl->setEnabled( false );
@@ -1023,14 +1023,14 @@ void UIWindow::onAlphaChange() {
}
void UIWindow::onChildCountChange() {
if ( NULL == mContainer || (Node*)getSceneNode() == (Node*)this )
if ( NULL == mContainer )
return;
Node * child = mChild;
bool found = false;
while ( NULL != child ) {
if ( !( child->getNodeFlags() & NODE_FLAG_OWNED_BY_WINDOW ) ) {
if ( !( child->getNodeFlags() & NODE_FLAG_OWNED_BY_NODE ) ) {
found = true;
break;
}
@@ -1059,7 +1059,7 @@ void UIWindow::setTitle( const String& text ) {
if ( NULL == mTitle ) {
mTitle = UITextView::New();
mTitle->setLayoutSizeRules( FIXED, FIXED );
mTitle->writeCtrlFlag( NODE_FLAG_OWNED_BY_WINDOW, 1 );
mTitle->writeCtrlFlag( NODE_FLAG_OWNED_BY_NODE, 1 );
mTitle->setParent( this );
mTitle->setHorizontalAlign( getHorizontalAlign() );
mTitle->setVerticalAlign( getVerticalAlign() );
@@ -1099,7 +1099,7 @@ UITextView * UIWindow::getTitleTextBox() const {
}
void UIWindow::maximize() {
Node * Ctrl = getSceneNode();
Node * Ctrl = mSceneNode;
if ( NULL == Ctrl )
return;
@@ -1149,7 +1149,7 @@ void UIWindow::internalDraw() {
matrixSet();
if ( !ownsFrameBuffer() || ( NULL != getSceneNode() && !getSceneNode()->usesInvalidation() ) || invalidated() ) {
if ( !ownsFrameBuffer() || ( NULL != mSceneNode && !mSceneNode->usesInvalidation() ) || invalidated() ) {
clipStart();
draw();
@@ -1185,6 +1185,10 @@ FrameBuffer * UIWindow::getFrameBuffer() const {
return mFrameBuffer;
}
bool UIWindow::isDrawInvalidator() {
return true;
}
bool UIWindow::invalidated() {
return 0 != ( mNodeFlags & NODE_FLAG_VIEW_DIRTY );
}
@@ -1192,7 +1196,7 @@ bool UIWindow::invalidated() {
void UIWindow::matrixSet() {
if ( ownsFrameBuffer() ) {
if ( NULL != mFrameBuffer ) {
if ( ( NULL != getSceneNode() && !getSceneNode()->usesInvalidation() ) || invalidated() ) {
if ( ( NULL != mSceneNode && !mSceneNode->usesInvalidation() ) || invalidated() ) {
mFrameBufferBound = true;
mFrameBuffer->bind();

View File

@@ -312,10 +312,13 @@ void UIWinMenu::loadFromXmlNode( const pugi::xml_node& node ) {
UIPopUpMenu * subMenu = UIPopUpMenu::New();
if ( NULL != getDrawInvalidator() )
subMenu->setParent( getDrawInvalidator() );
subMenu->loadFromXmlNode( item );
if ( NULL != getSceneNode() && getSceneNode()->isUISceneNode() )
addMenuButton( static_cast<UISceneNode*>( getSceneNode() )->getTranslatorString( text ), subMenu );
if ( NULL != mSceneNode && mSceneNode->isUISceneNode() )
addMenuButton( static_cast<UISceneNode*>( mSceneNode )->getTranslatorString( text ), subMenu );
}
}

View File

@@ -35,14 +35,14 @@ class UIBlurredWindow : public UIWindow {
if ( !ownsFrameBuffer() )
return;
FrameBuffer * curFBO = FrameBufferManager::instance()->getFromName( "uimain" );
FrameBuffer * curFBO = getSceneNode()->getFrameBuffer();
if ( NULL != curFBO && NULL != curFBO->getTexture() && NULL != mBlurShader ) {
static int fboDiv = 2;
if ( NULL == mFboBlur ) {
mFboBlur = FrameBuffer::New( mSize.x / fboDiv, mSize.y / fboDiv );
} else if ( mFboBlur->getSize().getWidth() != mSize.x / fboDiv || mFboBlur->getSize().getHeight() != mSize.y / fboDiv ) {
} else if ( mFboBlur->getSize().getWidth() != (int)( mSize.x / fboDiv ) || mFboBlur->getSize().getHeight() != (int)( mSize.y / fboDiv ) ) {
mFboBlur->resize( mSize.x / fboDiv, mSize.y / fboDiv );
}
@@ -360,7 +360,7 @@ void EETest::createBaseUI() {
UIWindow * tWin = UIWindow::New();
tWin->setSize( 530, 405 )->setPosition( 320, 240 );
UIWindowStyleConfig windowStyleConfig = tWin->getStyleConfig();
windowStyleConfig.WinFlags = UI_WIN_DRAGABLE_CONTAINER | UI_WIN_SHADOW/*| UI_WIN_FRAME_BUFFER*/;
windowStyleConfig.WinFlags = UI_WIN_DRAGABLE_CONTAINER | UI_WIN_SHADOW | UI_WIN_FRAME_BUFFER;
windowStyleConfig.MinWindowSize = Sizef( 530, 405 );
windowStyleConfig.BaseAlpha = 200;
tWin->setStyleConfig( windowStyleConfig );
@@ -588,14 +588,21 @@ void EETest::createUI() {
eePRINTL( "Texture Atlas Loading Time: %4.3f ms.", TE.getElapsed().asMilliseconds() );
/*Uint32 UI_MAN_OPS = 0;
if ( mDebugUI )
UI_MAN_OPS = UI_MANAGER_HIGHLIGHT_FOCUS | UI_MANAGER_HIGHLIGHT_OVER | UI_MANAGER_DRAW_DEBUG_DATA | UI_MANAGER_DRAW_BOXES | UI_MANAGER_HIGHLIGHT_INVALIDATION;
UIManager::instance()->init(UI_MAN_OPS | UI_MANAGER_USE_DRAW_INVALIDATION | UI_MANAGER_MAIN_CONTROL_IN_FRAME_BUFFER);
UIManager::instance()->setTranslator( mTranslator );*/
UISceneNode * sceneNode = UISceneNode::New();
sceneNode->enableDrawInvalidation();
sceneNode->enableFrameBuffer();
if ( mDebugUI ) {
sceneNode->setDrawBoxes( true );
sceneNode->setDrawDebugData( true );
sceneNode->setHighlightFocus( true );
sceneNode->setHighlightOver( true );
sceneNode->setHighlightInvalidation( true );
}
sceneNode->setTranslator( mTranslator );
SceneManager::instance()->add( sceneNode );
eePRINTL("Node size: %d", sizeof(Node));
@@ -897,7 +904,7 @@ void EETest::createMapEditor() {
UIWindow * tWin = UIWindow::New();
tWin->setSizeWithDecoration( 1024, 768 )->setPosition( 0, 0 );
UIWindowStyleConfig windowStyleConfig = tWin->getStyleConfig();
windowStyleConfig.WinFlags = UI_WIN_DEFAULT_FLAGS | UI_WIN_MAXIMIZE_BUTTON | UI_WIN_DRAGABLE_CONTAINER | UI_WIN_SHADOW/*| UI_WIN_FRAME_BUFFER*/;
windowStyleConfig.WinFlags = UI_WIN_DEFAULT_FLAGS | UI_WIN_MAXIMIZE_BUTTON | UI_WIN_DRAGABLE_CONTAINER | UI_WIN_SHADOW | UI_WIN_FRAME_BUFFER;
windowStyleConfig.MinWindowSize = Sizef( 1024, 768 );
tWin->setStyleConfig( windowStyleConfig );
@@ -914,7 +921,7 @@ void EETest::createETGEditor() {
UIWindow * tWin = UIWindow::New();
tWin->setSizeWithDecoration( 1024, 768 )->setPosition( 0, 0 );
UIWindowStyleConfig windowStyleConfig = tWin->getStyleConfig();
windowStyleConfig.WinFlags = UI_WIN_DEFAULT_FLAGS | UI_WIN_MAXIMIZE_BUTTON | UI_WIN_DRAGABLE_CONTAINER | UI_WIN_SHADOW/*| UI_WIN_FRAME_BUFFER*/;
windowStyleConfig.WinFlags = UI_WIN_DEFAULT_FLAGS | UI_WIN_MAXIMIZE_BUTTON | UI_WIN_DRAGABLE_CONTAINER | UI_WIN_SHADOW | UI_WIN_FRAME_BUFFER;
windowStyleConfig.MinWindowSize = Sizef( 1024, 768 );
tWin->setStyleConfig( windowStyleConfig );
@@ -949,7 +956,7 @@ static void onWinDragStop( const Event * event ) {
void EETest::createDecoratedWindow() {
mUIWindow = UIBlurredWindow::New( mBlur );
mUIWindow->setWinFlags( UI_WIN_DEFAULT_FLAGS | UI_WIN_MAXIMIZE_BUTTON | UI_WIN_SHADOW/*| UI_WIN_FRAME_BUFFER*/ )
mUIWindow->setWinFlags( UI_WIN_DEFAULT_FLAGS | UI_WIN_MAXIMIZE_BUTTON | UI_WIN_SHADOW | UI_WIN_FRAME_BUFFER )
->setMinWindowSize( 530, 350 )->setPosition( 200, 50 );
mUIWindow->addEventListener( Event::OnWindowClose, cb::Make1( this, &EETest::onCloseClick ) );
@@ -971,9 +978,22 @@ void EETest::createDecoratedWindow() {
if ( !Event->getNode()->isType( UI_TYPE_MENUITEM ) )
return;
/*UIMenuItem* menuItem = reinterpret_cast<UIMenuItem*> ( Event->getNode() );
Node * node = Event->getNode();
UIWindow * win = NULL;
while ( NULL != node && NULL == win ) {
if ( node->isWindow() ) {
win = static_cast<UIWindow*>( node );
} else {
node = node->getParent();
}
}
if ( NULL == win )
return;
UIMenuItem* menuItem = reinterpret_cast<UIMenuItem*> ( Event->getNode() );
const String& txt = menuItem->getText();
UIWindow * win = Event->getNode()->getOwnerWindow();
if ( "Hide Border" == txt ) {
win->setWinFlags( win->getWinFlags() | UI_WIN_NO_BORDER );
@@ -983,7 +1003,7 @@ void EETest::createDecoratedWindow() {
menuItem->setText( "Hide Border" );
} else if ( "Close" == txt ) {
win->closeFadeOut( Milliseconds(250) );
}*/
}
} ) );
UIPopUpMenu * PopMenu2 = UIPopUpMenu::New();