Added cUIDropDownList and cUIComboBox ( both working, but not full featured ).

Added support for alpha fading for skins.
Fixed double linked list of cUIControl.
Fixed some minor bugs.
This commit is contained in:
spartanj
2010-11-29 04:41:36 -03:00
parent 6088fdd207
commit e2dc300efd
31 changed files with 551 additions and 166 deletions

View File

@@ -161,5 +161,7 @@
#include "ui/cuiprogressbar.hpp"
#include "ui/cuilistbox.hpp"
#include "ui/cuilistboxitem.hpp"
#include "ui/cuidropdownlist.hpp"
#include "ui/cuicombobox.hpp"
using namespace EE::UI;
#endif

View File

@@ -160,13 +160,13 @@ void cFont::Draw( cTextCache& TextCache, const eeFloat& X, const eeFloat& Y, con
glRotatef( Angle, 0.0f, 0.0f, 1.0f );
glScalef( Scale, Scale, 1.0f );
glTranslatef( -Center.x, -Center.y, 0.f );
glTranslatef( X, Y, 0.f );
}
std::vector<eeVertexCoords>& RenderCoords = TextCache.VertextCoords();
std::vector<eeColorA>& Colors = TextCache.Colors();
#ifndef EE_GLES
if ( !TextCache.CachedCoords() ) {
#else
@@ -193,7 +193,7 @@ void cFont::Draw( cTextCache& TextCache, const eeFloat& X, const eeFloat& Y, con
if ( Char >= 0 && Char < tGlyphSize ) {
eeTexCoords* C = &mTexCoords[ Char ];
switch(Char) {
case L'\v':
{
@@ -245,7 +245,7 @@ void cFont::Draw( cTextCache& TextCache, const eeFloat& X, const eeFloat& Y, con
RenderCoords[ numvert ].Vertex[1] = cY + C->Vertex[ z + 1 ] + nY;
numvert++;
}
#ifdef EE_GLES
glColorPointer( 4, GL_UNSIGNED_BYTE, 0, reinterpret_cast<char*>( &Colors[0] ) );
glTexCoordPointer( 2, GL_FLOAT, sizeof(eeVertexCoords), reinterpret_cast<char*>( &RenderCoords[ numvert - 4 ] ) );
@@ -424,9 +424,9 @@ void cFont::CacheWidth( const std::wstring& Text, std::vector<eeFloat>& LinesWid
eeFloat Width = 0, MaxWidth = 0;
Int32 CharID;
Int32 Lines = 1;
Int32 tGlyphSize = (Int32)mGlyphs.size();
for (std::size_t i = 0; i < Text.size(); ++i) {
CharID = static_cast<Int32>( Text.at(i) );
@@ -471,7 +471,7 @@ void cFont::ShrinkText( std::string& Str, const Uint32& MaxWidth ) {
char * tStringLoop = &Str[0];
char * tLastSpace = NULL;
Uint32 tGlyphSize = (Uint32)mGlyphs.size();
while ( *tStringLoop ) {
if ( (Uint32)( *tStringLoop ) < tGlyphSize ) {
eeGlyph * pChar = &mGlyphs[ ( *tStringLoop ) ];

View File

@@ -385,11 +385,12 @@ void cEETest::CreateUI() {
CreateAquaTextureAtlas();
/*
cTextureGroupLoader tgl( MyPath + "data/aqua.etg" );
TF->GetByName( "data/aqua.png" )->TextureFilter( TEX_FILTER_NEAREST );
cUIThemeManager::instance()->Add( cUITheme::LoadFromShapeGroup( cShapeGroupManager::instance()->GetByName( "aqua" ), "aqua", "aqua" ) );
*/
//cUIManager::instance()->SetTheme( "aqua" );
cUIManager::instance()->DefaultTheme( "aqua" );
Params.Border.Width( 2 );
@@ -422,7 +423,7 @@ void cEETest::CreateUI() {
Child2->Visible( true );
Child2->Enabled( true );
Child2->StartRotation( 0.f, 360.f * 10.f, 5000.f * 10.f );
/*
cUIGfx::CreateParams GfxParams;
GfxParams.Parent( C );
GfxParams.PosSet( 160, 100 );
@@ -436,7 +437,7 @@ void cEETest::CreateUI() {
Gfx->StartAlphaAnim( 100.f, 255.f, 1000.f );
Gfx->AlphaInterpolation()->Loop( true );
Gfx->AlphaInterpolation()->SetTotalTime( 1000.f );
*/
cUITextBox::CreateParams TextParams;
TextParams.Parent( C );
TextParams.PosSet( 0, 0 );
@@ -471,7 +472,7 @@ void cEETest::CreateUI() {
Button->Text( L"Click Me" );
Button->AddEventListener( cUIEvent::EventMouseClick, cb::Make1( this, &cEETest::ButtonClick ) );
TextParams.PosSet( 120, 20 );
TextParams.PosSet( 130, 20 );
TextParams.Size = eeSize( 80, 22 );
TextParams.Flags = UI_VALIGN_CENTER | UI_HALIGN_LEFT;
cUICheckBox * Checkbox = eeNew( cUICheckBox, ( TextParams ) );
@@ -479,13 +480,13 @@ void cEETest::CreateUI() {
Checkbox->Text( L"Check Me" );
Checkbox->Enabled( true );
TextParams.PosSet( 120, 40 );
TextParams.PosSet( 130, 40 );
cUIRadioButton * RadioButton = eeNew( cUIRadioButton, ( TextParams ) );
RadioButton->Visible( true );
RadioButton->Text( L"Check Me" );
RadioButton->Enabled( true );
TextParams.PosSet( 120, 60 );
TextParams.PosSet( 130, 60 );
RadioButton = eeNew( cUIRadioButton, ( TextParams ) );
RadioButton->Visible( true );
RadioButton->Text( L"Check Me 2" );
@@ -567,6 +568,36 @@ void cEETest::CreateUI() {
mListBox->AddListBoxItems( wstr );
}
cUIDropDownList::CreateParams DDLParams;
DDLParams.Parent( C );
DDLParams.PosSet( 20, 55 );
DDLParams.Size = eeSize( 100, 19 );
DDLParams.Flags = UI_CLIP_ENABLE | UI_AUTO_PADDING | UI_VALIGN_CENTER | UI_HALIGN_LEFT;
cUIDropDownList * mDropDownList = eeNew( cUIDropDownList, ( DDLParams ) );
mDropDownList->Visible( true );
mDropDownList->Enabled( true );
std::vector<std::wstring> combostrs;
combostrs.push_back( L"Plane" );
combostrs.push_back( L"Car" );
combostrs.push_back( L"Bus" );
combostrs.push_back( L"Train" );
mDropDownList->ListBox()->AddListBoxItems( combostrs );
mDropDownList->ListBox()->SetSelected( 0 );
cUIComboBox::CreateParams ComboParams;
ComboParams.Parent( C );
ComboParams.PosSet( 20, 80 );
ComboParams.Size = eeSize( 100, 19 );
DDLParams.Flags = UI_CLIP_ENABLE | UI_AUTO_PADDING | UI_VALIGN_CENTER | UI_HALIGN_LEFT;
cUIComboBox * mComboBox = eeNew( cUIComboBox, ( ComboParams ) );
mComboBox->Visible( true );
mComboBox->Enabled( true );
mComboBox->ListBox()->AddListBoxItems( combostrs );
mComboBox->ListBox()->SetSelected( 0 );
mBuda = L"El mono ve el pez en el agua y sufre. Piensa que su mundo es el único que existe, el mejor, el real. Sufre porque es bueno y tiene compasión, lo ve y piensa: \"Pobre se está ahogando no puede respirar\". Y lo saca, lo saca y se queda tranquilo, por fin lo salvé. Pero el pez se retuerce de dolor y muere. Por eso te mostré el sueño, es imposible meter el mar en tu cabeza, que es un balde.";
TTFB->ShrinkText( mBuda, 400 );
@@ -597,7 +628,7 @@ void cEETest::ButtonClick( const cUIEvent * Event ) {
Gfx->StartMovement( eeVector2i( eeRandi( 0, EE->GetWidth() ), -64 ), eeVector2i( eeRandi( 0, EE->GetWidth() ), EE->GetHeight() + 64 ), 2500 );
Gfx->CloseFadeOut( 3500 );
mListBox->AddListBoxItem( L"Test ListBox " + toWStr( mListBox->Size()+1 ) + L" testing it right now!" );
mListBox->AddListBoxItem( L"Test ListBox " + toWStr( mListBox->Count() + 1 ) + L" testing it right now!" );
}
}

76
src/ui/cuicombobox.cpp Normal file
View File

@@ -0,0 +1,76 @@
#include "cuicombobox.hpp"
namespace EE { namespace UI {
cUIComboBox::cUIComboBox( cUIComboBox::CreateParams& Params ) :
cUIDropDownList( Params )
{
mType |= UI_TYPE_GET( UI_TYPE_COMBOBOX );
AllowEditing( true );
ApplyDefaultTheme();
}
cUIComboBox::~cUIComboBox() {
}
void cUIComboBox::SetTheme( cUITheme * Theme ) {
cUIControl::SetTheme( Theme, "combobox" );
AutoPadding();
OnSizeChange();
}
Uint32 cUIComboBox::OnMouseClick( const eeVector2i& Pos, const Uint32 Flags ) {
if ( Flags & EE_BUTTON_LMASK ) {
eeVector2i CtrlPos = Pos;
ScreenToControl( CtrlPos );
Int32 btnWidth = 0;
if ( NULL != mSkinState && NULL != mSkinState->GetSkin() ) {
if ( mSkinState->GetSkin()->GetType() == cUISkin::UISkinComplex ) {
cUISkinComplex * tComplex = reinterpret_cast<cUISkinComplex*> ( mSkinState->GetSkin() );
cShape * tShape = tComplex->GetShapeSide( cUISkinState::StateNormal, cUISkinComplex::Right );
if ( NULL != tShape )
btnWidth = tShape->RealSize().Width();
}
}
// Fix for scaled/rotated combobox
if ( CtrlPos.x >= mSize.Width() - btnWidth ) {
ShowListBox();
} else {
cUITextInput::OnMouseClick( Pos, Flags );
}
}
return 1;
}
void cUIComboBox::OnItemSelected( const cUIEvent * Event ) {
if ( mListBox->Visible() ) {
mListBox->Enabled( false );
mListBox->Visible( false );
}
mTextBuffer.Buffer( mListBox->GetItemSelectedText() );
eeVector2f offSet = mAlignOffset;
Text( mTextBuffer.Buffer() );
mAlignOffset = offSet;
ResetWaitCursor();
AlignFix();
mCursorPos = mTextBuffer.CurPos();
}
}}

24
src/ui/cuicombobox.hpp Normal file
View File

@@ -0,0 +1,24 @@
#ifndef EE_UICUICOMBOBOX_HPP
#define EE_UICUICOMBOBOX_HPP
#include "cuidropdownlist.hpp"
namespace EE { namespace UI {
class cUIComboBox : public cUIDropDownList {
public:
cUIComboBox( cUIComboBox::CreateParams& Params );
~cUIComboBox();
virtual void SetTheme( cUITheme * Theme );
Uint32 OnMouseClick( const eeVector2i& Pos, const Uint32 Flags );
protected:
virtual void OnItemSelected( const cUIEvent * Event );
};
}}
#endif

View File

@@ -135,7 +135,7 @@ void cUIControl::Size( const eeSize& Size ) {
OnSizeChange();
}
void cUIControl::Size( const Int32 Width, const Int32 Height ) {
void cUIControl::Size( const Int32& Width, const Int32& Height ) {
Size( eeSize( Width, Height ) );
}
@@ -178,8 +178,8 @@ cUIControl * cUIControl::Parent() const {
}
void cUIControl::Parent( cUIControl * parent ) {
if ( NULL != Parent() )
Parent()->ChildRemove( this );
if ( NULL != mParentCtrl )
mParentCtrl->ChildRemove( this );
mParentCtrl = parent;
@@ -187,6 +187,19 @@ void cUIControl::Parent( cUIControl * parent ) {
mParentCtrl->ChildAdd( this );
}
bool cUIControl::IsParentOf( cUIControl * Ctrl ) {
cUIControl * tParent = Ctrl->Parent();
while ( NULL != tParent ) {
if ( this == tParent )
return true;
tParent = tParent->Parent();
}
return false;
}
void cUIControl::CenterHorizontal() {
cUIControl * Ctrl = Parent();
@@ -219,7 +232,7 @@ void cUIControl::Draw() {
BorderDraw();
if ( NULL != mSkinState )
mSkinState->Draw( (eeFloat)mScreenPos.x, (eeFloat)mScreenPos.y, (eeFloat)mSize.Width(), (eeFloat)mSize.Height() );
mSkinState->Draw( (eeFloat)mScreenPos.x, (eeFloat)mScreenPos.y, (eeFloat)mSize.Width(), (eeFloat)mSize.Height(), 255 );
}
}
@@ -401,19 +414,18 @@ EE_PRE_BLEND_FUNC& cUIControl::Blend() {
}
void cUIControl::ToFront() {
Parent()->ChildRemove( this );
mNext = NULL;
Parent()->ChildAdd( this );
mParentCtrl->ChildRemove( this );
mParentCtrl->ChildAdd( this );
}
void cUIControl::ToBack() {
Parent()->ChildRemove( this );
Parent()->ChildAddAt( this, 0 );
mParentCtrl->ChildRemove( this );
mParentCtrl->ChildAddAt( this, 0 );
}
void cUIControl::ToPos( const Uint32& Pos ) {
Parent()->ChildRemove( this );
Parent()->ChildAddAt( this, Pos );
mParentCtrl->ChildRemove( this );
mParentCtrl->ChildAddAt( this, Pos );
}
void cUIControl::OnVisibleChange() {
@@ -561,17 +573,9 @@ void cUIControl::ChildAdd( cUIControl * ChildCtrl ) {
mChild = ChildCtrl;
mChildLast = ChildCtrl;
} else {
/*
cUIControl * ChildLoop = mChild;
while ( NULL != ChildLoop->mNext )
ChildLoop = ChildLoop->mNext;
ChildLoop->mNext = ChildCtrl;
*/
mChildLast->mNext = ChildCtrl;
ChildCtrl->mPrev = mChildLast;
ChildCtrl->mNext = NULL;
mChildLast = ChildCtrl;
}
}
@@ -615,26 +619,17 @@ void cUIControl::ChildRemove( cUIControl * ChildCtrl ) {
if ( NULL != mChild )
mChild->mPrev = NULL;
} else {
/*
cUIControl * ChildLoop = mChild;
while ( NULL != ChildLoop->mNext ) {
if ( ChildCtrl == ChildLoop->mNext ) {
ChildLoop->mNext = ChildLoop->mNext->mNext;
return;
}
ChildLoop = ChildLoop->mNext;
}
*/
if ( mChildLast == ChildCtrl )
mChildLast = mChildLast->mPrev;
ChildCtrl->mPrev->mNext = ChildCtrl->mNext;
if ( NULL != ChildCtrl->mNext )
if ( NULL != ChildCtrl->mNext ) {
ChildCtrl->mNext->mPrev = ChildCtrl->mPrev;
ChildCtrl->mNext = NULL;
}
ChildCtrl->mPrev = NULL;
}
}
@@ -675,31 +670,6 @@ cUIControl * cUIControl::ChildAt( Uint32 Index ) const {
}
cUIControl * cUIControl::ChildPrev( cUIControl * Ctrl, bool Loop ) const {
/*
cUIControl * ChildLoop = NULL;
if ( NULL != mChild ) {
if ( mChild != Ctrl ) {
ChildLoop = mChild;
while ( NULL != ChildLoop ) {
if ( ChildLoop->mNext == Ctrl )
break;
ChildLoop = ChildLoop->mNext;
}
} else if ( Loop ) {
ChildLoop = mChild;
while ( NULL != ChildLoop->mNext )
ChildLoop = ChildLoop->mNext;
}
}
return ChildLoop;
*/
if ( Loop && Ctrl == mChild && NULL != mChild->mNext )
return mChildLast;
@@ -728,19 +698,6 @@ cUIControl * cUIControl::OverFind( const eeVector2f& Point ) {
UpdateQuad();
if ( PointInsidePolygon2( mPoly, Point ) ) {
/*
cUIControl * ChildLoop = mChild;
while ( NULL != ChildLoop ) {
cUIControl * ChildOver = ChildLoop->OverFind( Point );
if ( NULL != ChildOver )
pOver = ChildOver;
ChildLoop = ChildLoop->mNext;
}
*/
cUIControl * ChildLoop = mChildLast;
while ( NULL != ChildLoop ) {
@@ -755,6 +712,7 @@ cUIControl * cUIControl::OverFind( const eeVector2f& Point ) {
ChildLoop = ChildLoop->mPrev;
}
if ( NULL == pOver )
pOver = const_cast<cUIControl *>( reinterpret_cast<const cUIControl *>( this ) );
}

View File

@@ -96,7 +96,7 @@ class EE_API cUIControl {
void Size( const eeSize& Size );
void Size( const Int32 Width, const Int32 Height );
void Size( const Int32& Width, const Int32& Height );
eeRecti Rect() const;
@@ -299,6 +299,8 @@ class EE_API cUIControl {
cUIControl * ChildPrev( cUIControl * Ctrl, bool Loop = false ) const;
cUIControl * ChildNext( cUIControl * Ctrl, bool Loop = false ) const;
bool IsParentOf( cUIControl * Ctrl );
virtual cUIControl * OverFind( const eeVector2f& Point );

View File

@@ -24,6 +24,20 @@ cUIControlAnim::~cUIControlAnim() {
eeSAFE_DELETE( mMoveAnim );
}
void cUIControlAnim::Draw() {
if ( mVisible ) {
if ( mFlags & UI_FILL_BACKGROUND )
BackgroundDraw();
if ( mFlags & UI_BORDER )
BorderDraw();
if ( NULL != mSkinState )
mSkinState->Draw( (eeFloat)mScreenPos.x, (eeFloat)mScreenPos.y, (eeFloat)mSize.Width(), (eeFloat)mSize.Height(), (Uint32)mAlpha );
}
}
const eeFloat& cUIControlAnim::Angle() const {
return mAngle;
}

View File

@@ -50,6 +50,8 @@ class EE_API cUIControlAnim : public cUIDragable {
cInterpolation * AlphaInterpolation();
cWaypoints * MovementInterpolation();
virtual void Draw();
protected:
friend class cUIManager;

117
src/ui/cuidropdownlist.cpp Normal file
View File

@@ -0,0 +1,117 @@
#include "cuidropdownlist.hpp"
#include "cuimanager.hpp"
namespace EE { namespace UI {
cUIDropDownList::cUIDropDownList( cUIDropDownList::CreateParams& Params ) :
cUITextInput( Params ),
mListBox( Params.ListBox ),
mMinNumVisibleItems( Params.MinNumVisibleItems )
{
mType |= UI_TYPE_GET( UI_TYPE_DROPDOWNLIST );
if ( NULL == mListBox ) {
cUIListBox::CreateParams LBParams;
LBParams.Size = eeSize( mSize.Width(), mMinNumVisibleItems * mSize.Height() );
LBParams.Flags = UI_CLIP_ENABLE | UI_AUTO_PADDING;
LBParams.FontSelectedColor = eeColorA( 255, 255, 255, 255 );
mListBox = eeNew( cUIListBox, ( LBParams ) );
}
mListBox->Enabled( false );
mListBox->Visible( false );
AllowEditing( false );
ApplyDefaultTheme();
mListBox->AddEventListener( cUIEvent::EventOnComplexControlFocusLoss, cb::Make1( this, &cUIDropDownList::OnListBoxFocusLoss ) );
mListBox->AddEventListener( cUIEvent::EventOnSelected, cb::Make1( this, &cUIDropDownList::OnItemSelected ) );
}
cUIDropDownList::~cUIDropDownList() {
}
void cUIDropDownList::SetTheme( cUITheme * Theme ) {
cUIControl::SetTheme( Theme, "dropdownlist" );
AutoPadding();
OnSizeChange();
}
cUIListBox * cUIDropDownList::ListBox() const {
return mListBox;
}
Uint32 cUIDropDownList::OnMouseClick( const eeVector2i& Pos, const Uint32 Flags ) {
if ( Flags & EE_BUTTON_LMASK )
ShowListBox();
return 1;
}
void cUIDropDownList::ShowListBox() {
if ( !mListBox->Visible() ) {
mListBox->Parent( cUIManager::instance()->MainControl() );
eeVector2i Pos = mScreenPos;
Pos.y += mSize.Height();
mListBox->Pos( Pos );
eeRecti tPadding = mListBox->PaddingContainer();
if ( mMinNumVisibleItems < mListBox->Count() )
mListBox->Size( mSize.Width(), (Int32)( mMinNumVisibleItems * mSize.Height() ) + tPadding.Top );
else
mListBox->Size( mSize.Width(), (Int32)( mListBox->Count() * mSize.Height() ) + tPadding.Top );
mListBox->Enabled( true );
mListBox->Visible( true );
cUIManager::instance()->FocusControl( mListBox );
} else {
mListBox->Enabled( false );
mListBox->Visible( false );
}
}
void cUIDropDownList::OnListBoxFocusLoss( const cUIEvent * Event ) {
if ( cUIManager::instance()->FocusControl() != this ) {
mListBox->Enabled( false );
mListBox->Visible( false );
}
}
void cUIDropDownList::OnItemSelected( const cUIEvent * Event ) {
if ( mListBox->Visible() ) {
mListBox->Enabled( false );
mListBox->Visible( false );
}
Text( mListBox->GetItemSelectedText() );
}
void cUIDropDownList::Update() {
cUITextInput::Update();
if ( mEnabled && mVisible ) {
if ( ( mControlFlags & UI_CTRL_FLAG_HAS_FOCUS ) )
mListBox->ManageKeyboard();
if ( IsMouseOver() ) {
Uint32 Flags = cUIManager::instance()->GetInput()->ClickTrigger();
if ( Flags & EE_BUTTONS_WUWD ) {
if ( Flags & EE_BUTTON_WUMASK ) {
mListBox->SelectPrev();
} else if ( Flags & EE_BUTTON_WDMASK ) {
mListBox->SelectNext();
}
}
}
}
}
}}

View File

@@ -0,0 +1,50 @@
#ifndef EE_UICUIDROPDOWNLIST_HPP
#define EE_UICUIDROPDOWNLIST_HPP
#include "cuitextinput.hpp"
#include "cuilistbox.hpp"
namespace EE { namespace UI {
class EE_API cUIDropDownList : public cUITextInput {
public:
class CreateParams : public cUITextInput::CreateParams {
public:
inline CreateParams() :
cUITextInput::CreateParams(),
ListBox( NULL ),
MinNumVisibleItems( 6 )
{
}
inline ~CreateParams() {}
cUIListBox * ListBox;
Uint32 MinNumVisibleItems;
};
cUIDropDownList( cUIDropDownList::CreateParams& Params );
~cUIDropDownList();
virtual void SetTheme( cUITheme * Theme );
cUIListBox * ListBox() const;
Uint32 OnMouseClick( const eeVector2i& Pos, const Uint32 Flags );
virtual void Update();
protected:
cUIListBox * mListBox;
Uint32 mMinNumVisibleItems;
void ShowListBox();
void OnListBoxFocusLoss( const cUIEvent * Event );
virtual void OnItemSelected( const cUIEvent * Event );
};
}}
#endif

View File

@@ -33,6 +33,7 @@ class EE_API cUIEvent {
EventOnPressEnter,
EventOnValueChange,
EventOnSelected,
EventOnComplexControlFocusLoss,
EventUser,
EventForceDWord = 0xFFFFFFFF
};

View File

@@ -25,7 +25,7 @@ cUIListBox::cUIListBox( cUIListBox::CreateParams& Params ) :
mVisibleFirst(0),
mVisibleLast(0)
{
mType |= UI_TYPE_LISTBOX;
mType |= UI_TYPE_GET( UI_TYPE_LISTBOX );
if ( NULL == Params.Font && NULL != cUIThemeManager::instance()->DefaultFont() )
mFont = cUIThemeManager::instance()->DefaultFont();
@@ -459,9 +459,6 @@ void cUIListBox::UpdateScroll( bool FromScrollChange ) {
mVisibleLast = i;
} else {
//Item->Enabled( false );
//Item->Visible( false );
eeSAFE_DELETE( mItems[i] );
Item = NULL;
}
@@ -509,9 +506,6 @@ void cUIListBox::UpdateScroll( bool FromScrollChange ) {
mVisibleLast = i;
} else {
//Item->Enabled( false );
//Item->Visible( false );
eeSAFE_DELETE( mItems[i] );
Item = NULL;
}
@@ -570,6 +564,15 @@ Uint32 cUIListBox::GetItemSelectedIndex() const {
return 0xFFFFFFFF;
}
std::wstring cUIListBox::GetItemSelectedText() const {
std::wstring tstr;
if ( mSelected.size() )
return mTexts[ mSelected.front() ];
return tstr;
}
std::list<Uint32> cUIListBox::GetItemsSelectedIndex() const {
return mSelected;
}
@@ -702,54 +705,99 @@ const bool& cUIListBox::AllowHorizontalScroll() const {
return mAllowHorizontalScroll;
}
Uint32 cUIListBox::Size() {
Uint32 cUIListBox::Count() {
return (Uint32)mItems.size();
}
void cUIListBox::SetSelected( Uint32 Index ) {
if ( Index < mItems.size() ) {
if ( IsMultiSelect() ) {
for ( std::list<Uint32>::iterator it = mSelected.begin(); it != mSelected.end(); it++ ) {
if ( *it == Index )
return;
}
} else {
if ( mSelected.size() )
mSelected.clear();
}
mSelected.push_back( Index );
if ( NULL != mItems[ Index ] ) {
mItems[ Index ]->Select();
} else {
UpdateScroll();
}
}
}
void cUIListBox::SelectPrev() {
if ( !IsMultiSelect() && mSelected.size() ) {
Int32 SelIndex = mSelected.front() - 1;
if ( SelIndex >= 0 ) {
if ( NULL == mItems[ mSelected.front() ] )
CreateItemIndex( mSelected.front() );
if ( NULL == mItems[ SelIndex ] )
CreateItemIndex( SelIndex );
mItems[ mSelected.front() ]->Unselect();
if ( ScrollBar()->Visible() ) {
if ( mItems[ SelIndex ]->Pos().y < 0 ) {
ScrollBar()->Value( (eeFloat)( SelIndex * mRowHeight ) / (eeFloat)( ( mItems.size() - 1 ) * mRowHeight ) );
cUIManager::instance()->FocusControl( mItems[ SelIndex ] );
}
}
mItems[ SelIndex ]->Select();
}
}
}
void cUIListBox::SelectNext() {
if ( !IsMultiSelect() && mSelected.size() ) {
Int32 SelIndex = mSelected.front() + 1;
if ( SelIndex < (Int32)mItems.size() ) {
if ( NULL == mItems[ mSelected.front() ] )
CreateItemIndex( mSelected.front() );
if ( NULL == mItems[ SelIndex ] )
CreateItemIndex( SelIndex );
mItems[ mSelected.front() ]->Unselect();
if ( ScrollBar()->Visible() ) {
if ( mItems[ SelIndex ]->Pos().y + (Int32)RowHeight() > mContainer->Size().Height() ) {
ScrollBar()->Value( (eeFloat)( SelIndex * mRowHeight ) / (eeFloat)( ( mItems.size() - 1 ) * mRowHeight ) );
cUIManager::instance()->FocusControl( mItems[ SelIndex ] );
}
}
mItems[ SelIndex ]->Select();
}
}
}
void cUIListBox::ManageKeyboard() {
if ( !mSelected.size() || mFlags & UI_MULTI_SELECT )
return;
cInput * KM = cUIManager::instance()->GetInput();
Int32 SelIndex = 0;
if ( eeGetTicks() - mLastTickMove > 100 ) {
if ( KM->IsKeyDown( KEY_DOWN ) ) {
mLastTickMove = eeGetTicks();
SelIndex = mSelected.front() + 1;
if ( SelIndex < (Int32)mItems.size() ) {
mItems[ mSelected.front() ]->Unselect();
if ( ScrollBar()->Visible() ) {
if ( mItems[ SelIndex ]->Pos().y + (Int32)RowHeight() > mContainer->Size().Height() ) {
ScrollBar()->Value( (eeFloat)( SelIndex * mRowHeight ) / (eeFloat)( ( mItems.size() - 1 ) * mRowHeight ) );
cUIManager::instance()->FocusControl( mItems[ SelIndex ] );
}
}
mItems[ SelIndex ]->Select();
}
SelectNext();
} else if ( KM->IsKeyDown( KEY_UP ) ) {
mLastTickMove = eeGetTicks();
SelIndex = mSelected.front() - 1;
if ( SelIndex >= 0 ) {
mItems[ mSelected.front() ]->Unselect();
if ( ScrollBar()->Visible() ) {
if ( mItems[ SelIndex ]->Pos().y < 0 ) {
ScrollBar()->Value( (eeFloat)( SelIndex * mRowHeight ) / (eeFloat)( ( mItems.size() - 1 ) * mRowHeight ) );
cUIManager::instance()->FocusControl( mItems[ SelIndex ] );
}
}
mItems[ mSelected.front() - 1 ]->Select();
}
SelectPrev();
} else if ( KM->IsKeyDown( KEY_PAGEUP ) ) {
mLastTickMove = eeGetTicks();
@@ -765,17 +813,33 @@ void cUIListBox::ManageKeyboard() {
} else if ( KM->IsKeyDown( KEY_PAGEDOWN ) ) {
mLastTickMove = eeGetTicks();
if ( mSelected.front() != Size() - 1 ) {
if ( mSelected.front() != Count() - 1 ) {
mItems[ mSelected.front() ]->Unselect();
ScrollBar()->Value( 1 );
cUIManager::instance()->FocusControl( mItems[ Size() - 1 ] );
cUIManager::instance()->FocusControl( mItems[ Count() - 1 ] );
mItems[ Size() - 1 ]->Select();
mItems[ Count() - 1 ]->Select();
}
}
}
}
Uint32 cUIListBox::OnMessage( const cUIMessage * Msg ) {
switch ( Msg->Msg() ) {
case cUIMessage::MsgFocusLoss:
{
cUIControl * FocusCtrl = cUIManager::instance()->FocusControl();
if ( this != FocusCtrl && !IsParentOf( FocusCtrl ) )
SendCommonEvent( cUIEvent::EventOnComplexControlFocusLoss );
return 1;
}
}
return 0;
}
}}

View File

@@ -73,6 +73,8 @@ class EE_API cUIListBox : public cUIControlAnim {
cUIListBoxItem * GetItemSelected();
std::wstring GetItemSelectedText() const;
Uint32 GetItemSelectedIndex() const;
std::list<Uint32> GetItemsSelectedIndex() const;
@@ -115,10 +117,19 @@ class EE_API cUIListBox : public cUIControlAnim {
const bool& AllowHorizontalScroll() const;
Uint32 Size();
Uint32 Count();
virtual Uint32 OnMessage( const cUIMessage * Msg );
void SetSelected( Uint32 Index );
void SelectPrev();
void SelectNext();
protected:
friend class cUIListBoxItem;
friend class cUIListBoxContainer;
friend class cUIDropDownList;
Uint32 mRowHeight;
bool mScrollAlwaysVisible;

View File

@@ -18,9 +18,10 @@ void cUIListBoxContainer::Update() {
cUIListBox * LBParent = reinterpret_cast<cUIListBox*> ( Parent() );
if ( LBParent->mItems.size() ) {
for ( Uint32 i = LBParent->mVisibleFirst; i <= LBParent->mVisibleLast; i++ )
for ( Uint32 i = LBParent->mVisibleFirst; i <= LBParent->mVisibleLast; i++ ) {
if ( NULL != LBParent->mItems[i] )
LBParent->mItems[i]->Update();
}
}
}

View File

@@ -7,7 +7,7 @@ namespace EE { namespace UI {
cUIListBoxItem::cUIListBoxItem( cUITextBox::CreateParams& Params ) :
cUITextBox( Params )
{
mType |= UI_TYPE_LISTBOXITEM;
mType |= UI_TYPE_GET( UI_TYPE_LISTBOXITEM );
ApplyDefaultTheme();
}
@@ -72,6 +72,9 @@ void cUIListBoxItem::Update() {
cUIListBox * LBParent = reinterpret_cast<cUIListBox*> ( Parent()->Parent() );
Uint32 Flags = cUIManager::instance()->GetInput()->ClickTrigger();
if ( NULL != LBParent && LBParent->Alpha() != mAlpha )
Alpha( LBParent->Alpha() );
if ( IsMouseOver() ) {
if ( Flags & EE_BUTTONS_WUWD )
LBParent->ScrollBar()->Slider()->ManageClick( Flags );

View File

@@ -100,9 +100,15 @@ cUIControl * cUIManager::FocusControl() const {
void cUIManager::FocusControl( cUIControl * Ctrl ) {
if ( NULL != Ctrl && Ctrl != mFocusControl ) {
mFocusControl->OnFocusLoss();
cUIControl * CtrlFocusLoss = mFocusControl;
mFocusControl = Ctrl;
CtrlFocusLoss->OnFocusLoss();
SendMsg( CtrlFocusLoss, cUIMessage::MsgFocusLoss );
mFocusControl->OnFocus();
SendMsg( mFocusControl, cUIMessage::MsgFocus );
}
}
@@ -127,12 +133,8 @@ void cUIManager::Update() {
if ( mKM->PressTrigger() ) {
if ( NULL != mOverControl ) {
if ( mOverControl != mFocusControl ) {
mOverControl->OnFocus();
mFocusControl->OnFocusLoss();
mFocusControl = mOverControl;
}
if ( mOverControl != mFocusControl )
FocusControl( mOverControl );
mOverControl->OnMouseDown( mKM->GetMousePos(), mKM->PressTrigger() );
}

View File

@@ -16,6 +16,8 @@ class EE_API cUIMessage {
MsgMouseEnter,
MsgMouseExit,
MsgWindowResize,
MsgFocus,
MsgFocusLoss,
MsgUser,
MsgForceDWord = 0xFFFFFFFF
};

View File

@@ -22,7 +22,7 @@ class EE_API cUISkin {
virtual ~cUISkin();
virtual void Draw( const eeFloat& X, const eeFloat& Y, const eeFloat& Width, const eeFloat& Height, const Uint32& State ) = 0;
virtual void Draw( const eeFloat& X, const eeFloat& Y, const eeFloat& Width, const eeFloat& Height, const Uint32& Alpha, const Uint32& State ) = 0;
virtual void SetSkin( const Uint32& State ) = 0;

View File

@@ -27,15 +27,20 @@ cUISkinComplex::~cUISkinComplex() {
}
void cUISkinComplex::Draw( const eeFloat& X, const eeFloat& Y, const eeFloat& Width, const eeFloat& Height, const Uint32& State ) {
void cUISkinComplex::Draw( const eeFloat& X, const eeFloat& Y, const eeFloat& Width, const eeFloat& Height, const Uint32& Alpha, const Uint32& State ) {
cShape * tShape = mShape[ State ][ UpLeft ];
mTempColor = mColor[ State ];
if ( mTempColor.Alpha != Alpha ) {
mTempColor.Alpha = (Uint8)( (eeFloat)mTempColor.Alpha * ( (eeFloat)Alpha / 255.f ) );
}
eeSize uls;
if ( NULL != tShape ) {
uls = tShape->RealSize();
tShape->Draw( X, Y, mColor[ State ] );
tShape->Draw( X, Y, mTempColor );
}
tShape = mShape[ State ][ DownLeft ];
@@ -45,7 +50,7 @@ void cUISkinComplex::Draw( const eeFloat& X, const eeFloat& Y, const eeFloat& Wi
if ( NULL != tShape ) {
dls = tShape->RealSize();
tShape->Draw( X, Y + Height - dls.Height(), mColor[ State ] );
tShape->Draw( X, Y + Height - dls.Height(), mTempColor );
}
tShape = mShape[ State ][ UpRight ];
@@ -55,7 +60,7 @@ void cUISkinComplex::Draw( const eeFloat& X, const eeFloat& Y, const eeFloat& Wi
if ( NULL != tShape ) {
urs = tShape->RealSize();
tShape->Draw( X + Width - urs.Width(), Y, mColor[ State ] );
tShape->Draw( X + Width - urs.Width(), Y, mTempColor );
}
tShape = mShape[ State ][ DownRight ];
@@ -65,7 +70,7 @@ void cUISkinComplex::Draw( const eeFloat& X, const eeFloat& Y, const eeFloat& Wi
if ( NULL != tShape ) {
drs = tShape->RealSize();
tShape->Draw( X + Width - drs.Width(), Y + Height - drs.Height(), mColor[ State ] );
tShape->Draw( X + Width - drs.Width(), Y + Height - drs.Height(), mTempColor );
}
tShape = mShape[ State ][ Left ];
@@ -73,7 +78,7 @@ void cUISkinComplex::Draw( const eeFloat& X, const eeFloat& Y, const eeFloat& Wi
if ( NULL != tShape ) {
tShape->DestHeight( Height - uls.Height() - dls.Height() );
tShape->Draw( X, Y + uls.Height(), mColor[ State ] );
tShape->Draw( X, Y + uls.Height(), mTempColor );
tShape->ResetDestWidthAndHeight();
@@ -86,7 +91,7 @@ void cUISkinComplex::Draw( const eeFloat& X, const eeFloat& Y, const eeFloat& Wi
if ( NULL != tShape ) {
tShape->DestWidth( Width - uls.Width() - urs.Width() );
tShape->Draw( X + uls.Width(), Y, mColor[ State ] );
tShape->Draw( X + uls.Width(), Y, mTempColor );
tShape->ResetDestWidthAndHeight();
@@ -105,7 +110,7 @@ void cUISkinComplex::Draw( const eeFloat& X, const eeFloat& Y, const eeFloat& Wi
tShape->DestHeight( Height - urs.Height() - drs.Height() );
tShape->Draw( X + Width - urs.Width(), Y + urs.Height(), mColor[ State ] );
tShape->Draw( X + Width - urs.Width(), Y + urs.Height(), mTempColor );
tShape->ResetDestWidthAndHeight();
}
@@ -115,7 +120,7 @@ void cUISkinComplex::Draw( const eeFloat& X, const eeFloat& Y, const eeFloat& Wi
if ( NULL != tShape ) {
tShape->DestWidth( Width - dls.Width() - drs.Width() );
tShape->Draw( X + dls.Width(), Y + Height - tShape->RealSize().Height(), mColor[ State ] );
tShape->Draw( X + dls.Width(), Y + Height - tShape->RealSize().Height(), mTempColor );
tShape->ResetDestWidthAndHeight();
}
@@ -126,7 +131,7 @@ void cUISkinComplex::Draw( const eeFloat& X, const eeFloat& Y, const eeFloat& Wi
tShape->DestWidth( Width - uls.Width() - urs.Width() );
tShape->DestHeight( Height - uls.Height() - urs.Height() );
tShape->Draw( X + uls.Width(), Y + uls.Height(), mColor[ State ] );
tShape->Draw( X + uls.Width(), Y + uls.Height(), mTempColor );
tShape->ResetDestWidthAndHeight();
}

View File

@@ -27,7 +27,7 @@ class EE_API cUISkinComplex : public cUISkin {
virtual ~cUISkinComplex();
virtual void Draw( const eeFloat& X, const eeFloat& Y, const eeFloat& Width, const eeFloat& Height, const Uint32& State );
virtual void Draw( const eeFloat& X, const eeFloat& Y, const eeFloat& Width, const eeFloat& Height, const Uint32& Alpha, const Uint32& State );
void SetSkin( const Uint32& State );
@@ -40,6 +40,7 @@ class EE_API cUISkinComplex : public cUISkin {
virtual cUISkin * Copy();
protected:
cShape * mShape[ cUISkinState::StateCount ][ SideCount ];
eeColorA mTempColor;
void StateNormalToState( const Uint32& State );
};

View File

@@ -15,14 +15,19 @@ cUISkinSimple::cUISkinSimple( const std::string& Name ) :
cUISkinSimple::~cUISkinSimple() {
}
void cUISkinSimple::Draw( const eeFloat& X, const eeFloat& Y, const eeFloat& Width, const eeFloat& Height, const Uint32& State ) {
void cUISkinSimple::Draw( const eeFloat& X, const eeFloat& Y, const eeFloat& Width, const eeFloat& Height, const Uint32& Alpha, const Uint32& State ) {
cShape * tShape = mShape[ State ];
mTempColor = mColor[ State ];
if ( NULL != tShape ) {
tShape->DestWidth( Width );
tShape->DestHeight( Height );
tShape->Draw( X, Y, mColor[ State ] );
if ( mTempColor.Alpha != Alpha ) {
mTempColor.Alpha = (Uint8)( (eeFloat)mTempColor.Alpha * ( (eeFloat)Alpha / 255.f ) );
}
tShape->Draw( X, Y, mTempColor );
tShape->ResetDestWidthAndHeight();
}

View File

@@ -12,7 +12,7 @@ class EE_API cUISkinSimple : public cUISkin {
virtual ~cUISkinSimple();
virtual void Draw( const eeFloat& X, const eeFloat& Y, const eeFloat& Width, const eeFloat& Height, const Uint32& State );
virtual void Draw( const eeFloat& X, const eeFloat& Y, const eeFloat& Width, const eeFloat& Height, const Uint32& Alpha, const Uint32& State );
void SetSkin( const Uint32& State );
@@ -23,6 +23,7 @@ class EE_API cUISkinSimple : public cUISkin {
virtual cUISkin * Copy();
protected:
cShape * mShape[ cUISkinState::StateCount ];
eeColorA mTempColor;
void StateNormalToState( const Uint32& State );
};

View File

@@ -14,9 +14,9 @@ cUISkinState::cUISkinState( cUISkin * Skin ) :
cUISkinState::~cUISkinState() {
}
void cUISkinState::Draw( const eeFloat& X, const eeFloat& Y, const eeFloat& Width, const eeFloat& Height ) {
void cUISkinState::Draw( const eeFloat& X, const eeFloat& Y, const eeFloat& Width, const eeFloat& Height, const Uint32& Alpha ) {
if ( NULL != mSkin )
mSkin->Draw( X, Y, Width, Height, mCurState );
mSkin->Draw( X, Y, Width, Height, Alpha, mCurState );
}
void cUISkinState::StateBack( const Uint32& State ) {

View File

@@ -29,7 +29,7 @@ class cUISkinState {
cUISkin * GetSkin() const;
void Draw( const eeFloat& X, const eeFloat& Y, const eeFloat& Width, const eeFloat& Height );
void Draw( const eeFloat& X, const eeFloat& Y, const eeFloat& Width, const eeFloat& Height, const Uint32& Alpha );
protected:
friend class cUIControl;

View File

@@ -33,7 +33,7 @@ cUITextBox::~cUITextBox() {
void cUITextBox::Draw() {
if ( mVisible ) {
cUIControl::Draw();
cUIControlAnim::Draw();
if ( mTextCache->GetTextWidth() ) {
if ( mFlags & UI_CLIP_ENABLE )
@@ -82,7 +82,6 @@ const eeColorA& cUITextBox::Color() const {
void cUITextBox::Color( const eeColorA& color ) {
mFontColor = color;
Alpha( color.A() );
mTextCache->Color( mFontColor );
}
const eeColorA& cUITextBox::ShadowColor() const {
@@ -92,12 +91,15 @@ const eeColorA& cUITextBox::ShadowColor() const {
void cUITextBox::ShadowColor( const eeColorA& color ) {
mFontShadowColor = color;
Alpha( color.A() );
mTextCache->ShadowColor( mFontColor );
}
void cUITextBox::Alpha( const eeFloat& alpha ) {
cUIControlAnim::Alpha( alpha );
mFontColor.Alpha = (Uint8)alpha;
mFontShadowColor.Alpha = (Uint8)alpha;
mTextCache->Color( mFontColor );
}
void cUITextBox::AutoShrink() {

View File

@@ -82,8 +82,13 @@ void cUITextInput::Draw() {
}
Uint32 cUITextInput::OnMouseClick( const eeVector2i& Pos, const Uint32 Flags ) {
mTextBuffer.Active( true );
ResetWaitCursor();
cUIControlAnim::OnMouseClick( Pos, Flags );
if ( mAllowEditing ) {
mTextBuffer.Active( true );
ResetWaitCursor();
}
return 1;
}

View File

@@ -42,7 +42,9 @@ static const char * UI_THEME_ELEMENTS[] = {
"progressbar",
"progressbar_filler",
"listbox",
"listboxitem"
"listboxitem",
"dropdownlist",
"combobox"
};
cUITheme * cUITheme::LoadFromPath( const std::string& Path, const std::string& Name, const std::string& NameAbbr, const std::string ImgExt ) {

View File

@@ -66,6 +66,8 @@ Uint32 EE_API VAlignGet( Uint32 Flags );
#define UI_TYPE_PROGRESSBAR (11)
#define UI_TYPE_LISTBOX (12)
#define UI_TYPE_LISTBOXITEM (13)
#define UI_TYPE_DROPDOWNLIST (14)
#define UI_TYPE_COMBOBOX (15)
#define UI_TYPE_GET(X) ( 1 << (X) )