Password mask for IGUIEditBox

Post those lines of code you feel like sharing or find what you require for your project here; or simply use them as tutorials.
Post Reply
JPulham
Posts: 320
Joined: Sat Nov 19, 2005 12:06 pm

Password mask for IGUIEditBox

Post by JPulham »

I made this for my game and thought it could be useful for someone:

First you modify the include folder:
First add to IGUIEditBox.h (in the class IGUIEditBox):

Code: Select all

...
//Additions by JPulham
virtual void SetPassword(bool use, wchar_t chr = L'*') = 0;
...
now you need to modify the source folder:

Next in CGUIEditBox.h add (in CGUIEditBox):

Code: Select all

...
public:
    ....
    //Additions by JPulham
    virtual void SetPassword(bool use, wchar_t chr = '*');
private:
    ...
    //Additions by JPulham
    bool password;
    wchar_t PWChar;
    ...
finally edit IGUIEditBox.cpp

Code: Select all

...
void CGUIEditBox::SetPassword(bool use, wchar_t chr)
{
    password = use;
    PWChar = chr;
}
...
//replace the draw function with this
void CGUIEditBox::draw()
{
	if (!IsVisible)
		return;

	bool focus = Environment->hasFocus(this);

	IGUISkin* skin = Environment->getSkin();
	if (!skin)
		return;

	irr::video::IVideoDriver* driver = Environment->getVideoDriver();

	core::rect<s32> frameRect(AbsoluteRect);

	// draw the border

	if (Border)
	{
		skin->draw3DSunkenPane(this, skin->getColor(EGDC_WINDOW),
			false, true, frameRect, &AbsoluteClippingRect);
		
		frameRect.UpperLeftCorner.X += skin->getSize(EGDS_TEXT_DISTANCE_X);
	}

	// draw the text
	core::stringw tmpText("");
	
	// If password is enabled then construct a string of PWchar the same length as the Text
	if(password)
    {
        s32 i;
        for(i = 0;i < Text.size();i++)tmpText += PWChar;
    }
	else tmpText = Text;

	IGUIFont* font = OverrideFont;
	if (!OverrideFont)
		font = skin->getFont();

	if (font)
	{
		// calculate cursor pos

		core::stringw s = tmpText.subString(0,CursorPos);
		s32 charcursorpos = font->getDimension(s.c_str()).Width;

		s = tmpText.subString(0, ScrollPos);
		s32 charscrollpos = font->getDimension(s.c_str()).Width;

		core::rect<s32> rct;

		// draw mark

		if (focus && MarkBegin != MarkEnd)
		{
			rct = frameRect;

			rct.LowerRightCorner.Y -= skin->getSize(EGDS_TEXT_DISTANCE_Y);
			rct.UpperLeftCorner.Y += skin->getSize(EGDS_TEXT_DISTANCE_Y);

			s32 realmbgn = MarkBegin < MarkEnd ? MarkBegin : MarkEnd;
			s32 realmend = MarkBegin < MarkEnd ? MarkEnd : MarkBegin;

			s = tmpText.subString(0, realmbgn);
			s32 mbegin = font->getDimension(s.c_str()).Width;

			s = tmpText.subString(realmbgn, realmend - realmbgn);
			s32 mend = font->getDimension(s.c_str()).Width;

			rct.UpperLeftCorner.X  += mbegin - charscrollpos;
			rct.LowerRightCorner.X = rct.UpperLeftCorner.X + mend;

			driver->draw2DRectangle(skin->getColor(EGDC_HIGH_LIGHT), rct, &AbsoluteClippingRect);
		}

		// draw cursor

		if (focus && (os::Timer::getTime() - BlinkStartTime) % 700 < 350)
		{
			rct = frameRect;
			rct.UpperLeftCorner.X += charcursorpos;
			rct.UpperLeftCorner.X -= charscrollpos;

			font->draw(L"_", rct, 
				OverrideColorEnabled ? OverrideColor : skin->getColor(EGDC_BUTTON_TEXT),
				false, true, &AbsoluteClippingRect);
		}

		// draw Text

		if (tmpText.size())
		{
			rct = frameRect;
			rct.UpperLeftCorner.X -= charscrollpos;

			// Save the override color information.
			// Then, alter it if the edit box is disabled.
			bool prevOver = OverrideColorEnabled;
			video::SColor prevColor = OverrideColor;
			if ( !this->IsEnabled && !OverrideColorEnabled )
			{
				OverrideColorEnabled = true;
				OverrideColor = skin->getColor( EGDC_GRAY_TEXT );
			}

			if (focus && MarkBegin != MarkEnd)
			{
				// marked Text

                font->draw(tmpText.c_str(), rct, 
					OverrideColorEnabled ? OverrideColor : skin->getColor(EGDC_BUTTON_TEXT),
					false, true, &AbsoluteClippingRect);

				s32 realmbgn = MarkBegin < MarkEnd ? MarkBegin : MarkEnd;
				s32 realmend = MarkBegin < MarkEnd ? MarkEnd : MarkBegin;

				s = tmpText.subString(0, realmbgn);
				s32 mbegin = font->getDimension(s.c_str()).Width;

				s = tmpText.subString(realmbgn, realmend - realmbgn);

				rct.UpperLeftCorner.X += mbegin;

				font->draw(s.c_str(), rct, 
					OverrideColorEnabled ? OverrideColor : skin->getColor(EGDC_HIGH_LIGHT_TEXT),
					false, true, &AbsoluteClippingRect);								
			}
			else
			{
				// normal Text
				font->draw(tmpText.c_str(), rct, 
					OverrideColorEnabled ? OverrideColor : skin->getColor(EGDC_BUTTON_TEXT),
					false, true, &AbsoluteClippingRect);
			}

			// Return the override color information to its previous settings.
			OverrideColorEnabled = prevOver;
			OverrideColor = prevColor;
		}
	}
}
now recompile irrlicht :?
pushpork
Post Reply