diff -abBdpuNPr --exclude='*.svn' irrlicht-svn-ss/trunk/include/IGUIEditBox.h Irrlicht_starsonata/include/IGUIEditBox.h --- irrlicht-svn-ss/trunk/include/IGUIEditBox.h 2007-07-26 02:11:22.000000000 +0200 +++ Irrlicht_starsonata/include/IGUIEditBox.h 2008-02-21 23:27:30.000000000 +0100 @@ -95,6 +95,10 @@ namespace gui //! Returns maximum amount of characters, previously set by setMax(); virtual s32 getMax() = 0; + + virtual void setPasswordField( bool isPasswordField ) = 0; + + virtual void setCursorPosition( u32 pos ) = 0; }; diff -abBdpuNPr --exclude='*.svn' irrlicht-svn-ss/trunk/include/IGUIEnvironment.h Irrlicht_starsonata/include/IGUIEnvironment.h --- irrlicht-svn-ss/trunk/include/IGUIEnvironment.h 2007-07-26 02:11:22.000000000 +0200 +++ Irrlicht_starsonata/include/IGUIEnvironment.h 2008-05-31 04:53:40.000000000 +0200 @@ -295,7 +311,7 @@ public: Returns a pointer to the created edit box. Returns 0 if an error occured. This pointer should not be dropped. See IUnknown::drop() for more information. */ virtual IGUIEditBox* addEditBox(const wchar_t* text, const core::rect& rectangle, - bool border=true, IGUIElement* parent=0, s32 id=-1) = 0; + bool border=true, bool transparent=false, IGUIElement* parent=0, s32 id=-1) = 0; //! Adds a spin box. /** An edit box with up and down buttons diff -abBdpuNPr --exclude='*.svn' irrlicht-svn-ss/trunk/source/Irrlicht/CDefaultGUIElementFactory.cpp Irrlicht_starsonata/source/Irrlicht/CDefaultGUIElementFactory.cpp --- irrlicht-svn-ss/trunk/source/Irrlicht/CDefaultGUIElementFactory.cpp 2007-07-26 02:11:08.000000000 +0200 +++ Irrlicht_starsonata/source/Irrlicht/CDefaultGUIElementFactory.cpp 2007-10-22 18:56:54.000000000 +0200 @@ -60,7 +62,7 @@ IGUIElement* CDefaultGUIElementFactory:: case EGUIET_MENU: return Environment->addMenu(parent); case EGUIET_EDIT_BOX: - return Environment->addEditBox(0,core::rect(0,0,100,100),true, parent); + return Environment->addEditBox(0,core::rect(0,0,100,100),true, false, parent); case EGUIET_FILE_OPEN_DIALOG: return Environment->addFileOpenDialog(0,true,parent); case EGUIET_IMAGE: diff -abBdpuNPr --exclude='*.svn' irrlicht-svn-ss/trunk/source/Irrlicht/CGUIColorSelectDialog.cpp Irrlicht_starsonata/source/Irrlicht/CGUIColorSelectDialog.cpp --- irrlicht-svn-ss/trunk/source/Irrlicht/CGUIColorSelectDialog.cpp 2007-07-26 02:11:08.000000000 +0200 +++ Irrlicht_starsonata/source/Irrlicht/CGUIColorSelectDialog.cpp 2008-05-23 00:58:20.000000000 +0200 @@ -136,7 +136,7 @@ CGUIColorSelectDialog::CGUIColorSelectDi r.LowerRightCorner.X = r.UpperLeftCorner.X + 35; r.LowerRightCorner.Y = r.UpperLeftCorner.Y + 20; - item.Edit = Environment->addEditBox( Template[i].init, r, true, this); + item.Edit = Environment->addEditBox( Template[i].init, r, true, false, this); item.Edit->setSubElement(true); item.Edit->grab(); diff -abBdpuNPr --exclude='*.svn' irrlicht-svn-ss/trunk/source/Irrlicht/CGUIEditBox.cpp Irrlicht_starsonata/source/Irrlicht/CGUIEditBox.cpp --- irrlicht-svn-ss/trunk/source/Irrlicht/CGUIEditBox.cpp 2007-07-26 02:11:08.000000000 +0200 +++ Irrlicht_starsonata/source/Irrlicht/CGUIEditBox.cpp 2008-06-05 10:15:42.000000000 +0200 @@ -26,11 +26,11 @@ namespace gui { //! constructor -CGUIEditBox::CGUIEditBox(const wchar_t* text, bool border, IGUIEnvironment* environment, +CGUIEditBox::CGUIEditBox(const wchar_t* text, bool border, bool transparent, IGUIEnvironment* environment, IGUIElement* parent, s32 id, const core::rect& rectangle) : IGUIEditBox(environment, parent, id, rectangle), MouseMarking(false), - Border(border), OverrideColorEnabled(false), MarkBegin(0), MarkEnd(0), + Border(border), Transparent(transparent), OverrideColorEnabled(false), IsPasswordField( false ), MarkBegin(0), MarkEnd(0), OverrideColor(video::SColor(101,255,255,255)), OverrideFont(0), LastBreakFont(0), CursorPos(0), HScrollPos(0), VScrollPos(0), Max(0), WordWrap(false), MultiLine(false), AutoScroll(true), @@ -53,6 +53,11 @@ CGUIEditBox::CGUIEditBox(const wchar_t* setTabOrder(-1); breakText(); + + if ( Text.size() ) + { + sendTextChangedEvent(); + } } @@ -70,6 +75,9 @@ CGUIEditBox::~CGUIEditBox() //! Sets another skin independent font. void CGUIEditBox::setOverrideFont(IGUIFont* font) { + if ( OverrideFont == font ) + return; + if (OverrideFont) OverrideFont->drop(); @@ -168,7 +176,7 @@ bool CGUIEditBox::OnEvent(SEvent event) break; } - return Parent ? Parent->OnEvent(event) : false; + return IGUIElement::OnEvent(event); } @@ -177,6 +185,9 @@ bool CGUIEditBox::processKey(const SEven if (!event.KeyInput.PressedDown) return false; + if ( !isVisible() ) + return false; + bool textChanged = false; // control shortcut handling @@ -606,7 +617,10 @@ bool CGUIEditBox::processKey(const SEven // break the text if it has changed if (textChanged) + { breakText(); + sendTextChangedEvent(); + } calculateScrollPos(); @@ -631,8 +645,12 @@ void CGUIEditBox::draw() if (Border) { - skin->draw3DSunkenPane(this, skin->getColor(EGDC_WINDOW), - false, true, frameRect, &AbsoluteClippingRect); + video::SColor color = Environment->hasFocus(this) ? + skin->getColor(EGDC_FOCUSED_EDITBOX) : + skin->getColor(EGDC_WINDOW); + + skin->draw3DSunkenPane(this, color, + false, Transparent, frameRect, &AbsoluteClippingRect); frameRect.UpperLeftCorner.X += skin->getSize(EGDS_TEXT_DISTANCE_X)+1; frameRect.UpperLeftCorner.Y += skin->getSize(EGDS_TEXT_DISTANCE_Y)+1; @@ -656,9 +674,16 @@ void CGUIEditBox::draw() if (LastBreakFont != font) breakText(); + core::stringw finalText(Text); + if ( IsPasswordField ) + { + for ( int i = 0 ; i < (int)finalText.size(); ++i ) + finalText[i] = L'*'; + } + // calculate cursor pos - core::stringw *txtLine = &Text; + core::stringw *txtLine = &finalText; s32 startPos = 0; core::stringw s, s2; @@ -675,7 +700,7 @@ void CGUIEditBox::draw() bool prevOver = OverrideColorEnabled; video::SColor prevColor = OverrideColor; - if (Text.size()) + if (finalText.size()) { if ( !this->IsEnabled && !OverrideColorEnabled ) { @@ -694,7 +719,7 @@ void CGUIEditBox::draw() continue; // get current line - txtLine = (WordWrap || MultiLine) ? &BrokenText[i] : &Text; + txtLine = (WordWrap || MultiLine) ? &BrokenText[i] : &finalText; startPos = (WordWrap || MultiLine) ? BrokenTextPositions[i] : 0; // draw normal text @@ -781,6 +806,7 @@ void CGUIEditBox::setText(const wchar_t* MarkBegin = 0; MarkEnd = 0; breakText(); + sendTextChangedEvent(); } //! Enables or disables automatic scrolling with cursor position @@ -838,6 +864,12 @@ s32 CGUIEditBox::getMax() return Max; } +void CGUIEditBox::setCursorPosition( u32 pos ) +{ + if ( pos < Text.size() ) + CursorPos = pos; +} + bool CGUIEditBox::processMouse(const SEvent& event) { @@ -1187,8 +1219,9 @@ void CGUIEditBox::inputChar(wchar_t c) MarkBegin = 0; MarkEnd = 0; } - } breakText(); + sendTextChangedEvent(); + } } @@ -1249,13 +1282,17 @@ void CGUIEditBox::serializeAttributes(io out->addBool ("OverrideColorEnabled", OverrideColorEnabled ); out->addColor ("OverrideColor", OverrideColor); - // out->addFont("OverrideFont",OverrideFont); out->addInt ("MaxChars", Max); out->addBool ("WordWrap", WordWrap); out->addBool ("MultiLine", MultiLine); out->addBool ("AutoScroll", AutoScroll); out->addEnum ("HTextAlign", HAlign, GUIAlignmentNames); out->addEnum ("VTextAlign", VAlign, GUIAlignmentNames); + out->addBool ("IsPasswordField", IsPasswordField); + + + if ( OverrideFont && OverrideFont->getName().size() ) + out->addString("OverrideFont", OverrideFont->getName().c_str() ); IGUIEditBox::serializeAttributes(out,options); } @@ -1271,13 +1308,32 @@ void CGUIEditBox::deserializeAttributes( setWordWrap(in->getAttributeAsBool("WordWrap")); setMultiLine(in->getAttributeAsBool("MultiLine")); setAutoScroll(in->getAttributeAsBool("AutoScroll")); + setPasswordField(in->getAttributeAsBool("IsPasswordField")); setTextAlignment( (EGUI_ALIGNMENT) in->getAttributeAsEnumeration("HTextAlign", GUIAlignmentNames), (EGUI_ALIGNMENT) in->getAttributeAsEnumeration("VTextAlign", GUIAlignmentNames)); - // setOverrideFont(in->getAttributeAsFont("OverrideFont")); + core::stringc fontName = in->getAttributeAsString("OverrideFont"); + if ( fontName.size() ) + { + setOverrideFont( Environment->getFont(fontName.c_str()) ); + } +} + +void CGUIEditBox::setPasswordField( bool isPasswordField ) +{ + this->IsPasswordField = isPasswordField; } +void CGUIEditBox::sendTextChangedEvent() +{ + SEvent e; + e.EventType = EET_GUI_EVENT; + e.GUIEvent.Caller = this; + e.GUIEvent.Element = 0; + e.GUIEvent.EventType = EGET_EDITBOX_TEXT_CHANGED; + Parent->OnEvent(e); +} } // end namespace gui } // end namespace irr diff -abBdpuNPr --exclude='*.svn' irrlicht-svn-ss/trunk/source/Irrlicht/CGUIEditBox.h Irrlicht_starsonata/source/Irrlicht/CGUIEditBox.h --- irrlicht-svn-ss/trunk/source/Irrlicht/CGUIEditBox.h 2007-07-26 02:11:08.000000000 +0200 +++ Irrlicht_starsonata/source/Irrlicht/CGUIEditBox.h 2008-02-23 00:56:58.000000000 +0100 @@ -18,7 +18,7 @@ namespace gui public: //! constructor - CGUIEditBox(const wchar_t* text, bool border, IGUIEnvironment* environment, + CGUIEditBox(const wchar_t* text, bool border, bool transparent, IGUIEnvironment* environment, IGUIElement* parent, s32 id, const core::rect& rectangle); //! destructor @@ -85,6 +85,10 @@ namespace gui //! Returns maximum amount of characters, previously set by setMax(); virtual s32 getMax(); + virtual void setPasswordField( bool isPasswordField ); + + virtual void setCursorPosition( u32 pos ); + //! Updates the absolute position, splits text if required virtual void updateAbsolutePosition(); @@ -110,9 +114,14 @@ namespace gui bool processMouse(const SEvent& event); s32 getCursorPos(s32 x, s32 y); + // Starsonata, Micha: So far the only way to find out about that was polling. + void sendTextChangedEvent(); + bool MouseMarking; bool Border; + bool Transparent; bool OverrideColorEnabled; + bool IsPasswordField; s32 MarkBegin; s32 MarkEnd; diff -abBpNPwrU2 --exclude='*.svn' irrlicht-svn-ss/trunk/source/Irrlicht/CGUIEnvironment.cpp Irrlicht_starsonata/source/Irrlicht/CGUIEnvironment.cpp --- irrlicht-svn-ss/trunk/source/Irrlicht/CGUIEnvironment.cpp 2007-07-26 02:11:08.000000000 +0200 +++ Irrlicht_starsonata/source/Irrlicht/CGUIEnvironment.cpp 2008-08-15 18:20:47.000000000 +0200 @@ -1136,8 +1450,8 @@ IGUIStaticText* CGUIEnvironment::addStat IGUIEditBox* CGUIEnvironment::addEditBox(const wchar_t* text, const core::rect& rectangle, - bool border, IGUIElement* parent, + bool border, bool transparent, IGUIElement* parent, s32 id) { - IGUIEditBox* d = new CGUIEditBox(text, border, this, + IGUIEditBox* d = new CGUIEditBox(text, border, transparent, this, parent ? parent : this, id, rectangle); diff -abBdpuNPr --exclude='*.svn' irrlicht-svn-ss/trunk/source/Irrlicht/CGUIEnvironment.h Irrlicht_starsonata/source/Irrlicht/CGUIEnvironment.h --- irrlicht-svn-ss/trunk/source/Irrlicht/CGUIEnvironment.h 2007-07-26 02:11:08.000000000 +0200 +++ Irrlicht_starsonata/source/Irrlicht/CGUIEnvironment.h 2008-05-31 04:51:06.000000000 +0200 @@ -121,7 +130,7 @@ public: //! Adds an edit box. The returned pointer must not be dropped. virtual IGUIEditBox* addEditBox(const wchar_t* text, const core::rect& rectangle, - bool border=false, IGUIElement* parent=0, s32 id=-1); + bool border=false, bool transparent=false, IGUIElement* parent=0, s32 id=-1); //! Adds a spin box to the environment virtual IGUISpinBox* addSpinBox(const wchar_t* text, const core::rect& rectangle, diff -abBdpuNPr --exclude='*.svn' irrlicht-svn-ss/trunk/source/Irrlicht/CGUISpinBox.cpp Irrlicht_starsonata/source/Irrlicht/CGUISpinBox.cpp --- irrlicht-svn-ss/trunk/source/Irrlicht/CGUISpinBox.cpp 2007-07-26 02:11:08.000000000 +0200 +++ Irrlicht_starsonata/source/Irrlicht/CGUISpinBox.cpp 2008-03-19 17:57:54.000000000 +0100 @@ -65,7 +65,7 @@ CGUISpinBox::CGUISpinBox(const wchar_t* } core::rect rectEdit(0, 0, rectangle.getWidth() - ButtonWidth - 1, rectangle.getHeight()); - EditBox = Environment->addEditBox(text, rectEdit, true, this, -1); + EditBox = Environment->addEditBox(text, rectEdit, true, false, this, -1); EditBox->grab(); EditBox->setSubElement(true); EditBox->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT);