Skip to content

Commit

Permalink
refacto: factorize multiple code parts from guiEditbox childs (#10782)
Browse files Browse the repository at this point in the history
  • Loading branch information
nerzhul committed Jan 4, 2021
1 parent e663aec commit 58a7090
Show file tree
Hide file tree
Showing 7 changed files with 266 additions and 391 deletions.
1 change: 1 addition & 0 deletions src/gui/CMakeLists.txt
Expand Up @@ -7,6 +7,7 @@ set(gui_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/guiButtonItemImage.cpp
${CMAKE_CURRENT_SOURCE_DIR}/guiChatConsole.cpp
${CMAKE_CURRENT_SOURCE_DIR}/guiConfirmRegistration.cpp
${CMAKE_CURRENT_SOURCE_DIR}/guiEditBox.cpp
${CMAKE_CURRENT_SOURCE_DIR}/guiEditBoxWithScrollbar.cpp
${CMAKE_CURRENT_SOURCE_DIR}/guiEngine.cpp
${CMAKE_CURRENT_SOURCE_DIR}/guiFormSpecMenu.cpp
Expand Down
95 changes: 95 additions & 0 deletions src/gui/guiEditBox.cpp
@@ -0,0 +1,95 @@
/*
Minetest
Copyright (C) 2021 Minetest
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/

#include "guiEditBox.h"

#include "IGUISkin.h"
#include "IGUIEnvironment.h"
#include "IGUIFont.h"

GUIEditBox::~GUIEditBox()
{
if (m_override_font)
m_override_font->drop();
}

void GUIEditBox::setOverrideFont(IGUIFont *font)
{
if (m_override_font == font)
return;

if (m_override_font)
m_override_font->drop();

m_override_font = font;

if (m_override_font)
m_override_font->grab();

breakText();
}

//! Get the font which is used right now for drawing
IGUIFont *GUIEditBox::getActiveFont() const
{
if (m_override_font)
return m_override_font;
IGUISkin *skin = Environment->getSkin();
if (skin)
return skin->getFont();
return 0;
}

//! Sets another color for the text.
void GUIEditBox::setOverrideColor(video::SColor color)
{
m_override_color = color;
m_override_color_enabled = true;
}

video::SColor GUIEditBox::getOverrideColor() const
{
return m_override_color;
}

//! Sets if the text should use the overide color or the color in the gui skin.
void GUIEditBox::enableOverrideColor(bool enable)
{
m_override_color_enabled = enable;
}

//! Enables or disables word wrap
void GUIEditBox::setWordWrap(bool enable)
{
m_word_wrap = enable;
breakText();
}

//! Enables or disables newlines.
void GUIEditBox::setMultiLine(bool enable)
{
m_multiline = enable;
}

//! Enables or disables automatic scrolling with cursor position
//! \param enable: If set to true, the text will move around with the cursor position
void GUIEditBox::setAutoScroll(bool enable)
{
m_autoscroll = enable;
}
103 changes: 103 additions & 0 deletions src/gui/guiEditBox.h
@@ -0,0 +1,103 @@
/*
Minetest
Copyright (C) 2021 Minetest
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/

#pragma once

#include "IGUIEditBox.h"
#include "IOSOperator.h"
#include "guiScrollBar.h"

using namespace irr;
using namespace irr::gui;

class GUIEditBox : public IGUIEditBox
{
public:
GUIEditBox(IGUIEnvironment *environment, IGUIElement *parent, s32 id,
core::rect<s32> rectangle) :
IGUIEditBox(environment, parent, id, rectangle)
{
}

virtual ~GUIEditBox();

//! Sets another skin independent font.
virtual void setOverrideFont(IGUIFont *font = 0);

virtual IGUIFont *getOverrideFont() const { return m_override_font; }

//! Get the font which is used right now for drawing
/** Currently this is the override font when one is set and the
font of the active skin otherwise */
virtual IGUIFont *getActiveFont() const;

//! Sets another color for the text.
virtual void setOverrideColor(video::SColor color);

//! Gets the override color
virtual video::SColor getOverrideColor() const;

//! Sets if the text should use the overide color or the
//! color in the gui skin.
virtual void enableOverrideColor(bool enable);

//! Checks if an override color is enabled
/** \return true if the override color is enabled, false otherwise */
virtual bool isOverrideColorEnabled(void) const
{
return m_override_color_enabled;
}

//! Enables or disables word wrap for using the edit box as multiline text editor.
virtual void setWordWrap(bool enable);

//! Checks if word wrap is enabled
//! \return true if word wrap is enabled, false otherwise
virtual bool isWordWrapEnabled() const { return m_word_wrap; }

//! Enables or disables newlines.
/** \param enable: If set to true, the EGET_EDITBOX_ENTER event will not be fired,
instead a newline character will be inserted. */
virtual void setMultiLine(bool enable);

//! Checks if multi line editing is enabled
//! \return true if mult-line is enabled, false otherwise
virtual bool isMultiLineEnabled() const { return m_multiline; }

//! Enables or disables automatic scrolling with cursor position
//! \param enable: If set to true, the text will move around with the cursor
//! position
virtual void setAutoScroll(bool enable);

//! Checks to see if automatic scrolling is enabled
//! \return true if automatic scrolling is enabled, false if not
virtual bool isAutoScrollEnabled() const { return m_autoscroll; }

protected:
virtual void breakText() = 0;

gui::IGUIFont *m_override_font = nullptr;

bool m_override_color_enabled = false;
bool m_word_wrap = false;
bool m_multiline = false;
bool m_autoscroll = true;

video::SColor m_override_color = video::SColor(101, 255, 255, 255);
};
113 changes: 3 additions & 110 deletions src/gui/guiEditBoxWithScrollbar.cpp
Expand Up @@ -22,16 +22,14 @@ optional? dragging selected text
numerical
*/


//! constructor
GUIEditBoxWithScrollBar::GUIEditBoxWithScrollBar(const wchar_t* text, bool border,
IGUIEnvironment* environment, IGUIElement* parent, s32 id,
const core::rect<s32>& rectangle, bool writable, bool has_vscrollbar)
: IGUIEditBox(environment, parent, id, rectangle), m_mouse_marking(false),
m_border(border), m_background(true), m_override_color_enabled(false), m_mark_begin(0), m_mark_end(0),
m_override_color(video::SColor(101, 255, 255, 255)), m_override_font(0), m_last_break_font(0),
: GUIEditBox(environment, parent, id, rectangle), m_mouse_marking(false),
m_border(border), m_background(true), m_mark_begin(0), m_mark_end(0), m_last_break_font(0),
m_operator(0), m_blink_start_time(0), m_cursor_pos(0), m_hscroll_pos(0), m_vscroll_pos(0), m_max(0),
m_word_wrap(false), m_multiline(false), m_autoscroll(true), m_passwordbox(false),
m_passwordbox(false),
m_passwordchar(L'*'), m_halign(EGUIA_UPPERLEFT), m_valign(EGUIA_CENTER),
m_current_text_rect(0, 0, 1, 1), m_frame_rect(rectangle),
m_scrollbar_width(0), m_vscrollbar(NULL), m_writable(writable),
Expand Down Expand Up @@ -69,9 +67,6 @@ GUIEditBoxWithScrollBar::GUIEditBoxWithScrollBar(const wchar_t* text, bool borde
//! destructor
GUIEditBoxWithScrollBar::~GUIEditBoxWithScrollBar()
{
if (m_override_font)
m_override_font->drop();

if (m_operator)
m_operator->drop();

Expand All @@ -80,54 +75,6 @@ GUIEditBoxWithScrollBar::~GUIEditBoxWithScrollBar()
}


//! Sets another skin independent font.
void GUIEditBoxWithScrollBar::setOverrideFont(IGUIFont* font)
{
if (m_override_font == font)
return;

if (m_override_font)
m_override_font->drop();

m_override_font = font;

if (m_override_font)
m_override_font->grab();

breakText();
}

//! Gets the override font (if any)
IGUIFont * GUIEditBoxWithScrollBar::getOverrideFont() const
{
return m_override_font;
}

//! Get the font which is used right now for drawing
IGUIFont* GUIEditBoxWithScrollBar::getActiveFont() const
{
if (m_override_font)
return m_override_font;
IGUISkin* skin = Environment->getSkin();
if (skin)
return skin->getFont();
return 0;
}

//! Sets another color for the text.
void GUIEditBoxWithScrollBar::setOverrideColor(video::SColor color)
{
m_override_color = color;
m_override_color_enabled = true;
}


video::SColor GUIEditBoxWithScrollBar::getOverrideColor() const
{
return m_override_color;
}


//! Turns the border on or off
void GUIEditBoxWithScrollBar::setDrawBorder(bool border)
{
Expand All @@ -140,24 +87,6 @@ void GUIEditBoxWithScrollBar::setDrawBackground(bool draw)
m_background = draw;
}

//! Sets if the text should use the overide color or the color in the gui skin.
void GUIEditBoxWithScrollBar::enableOverrideColor(bool enable)
{
m_override_color_enabled = enable;
}

bool GUIEditBoxWithScrollBar::isOverrideColorEnabled() const
{
return m_override_color_enabled;
}

//! Enables or disables word wrap
void GUIEditBoxWithScrollBar::setWordWrap(bool enable)
{
m_word_wrap = enable;
breakText();
}


void GUIEditBoxWithScrollBar::updateAbsolutePosition()
{
Expand All @@ -170,26 +99,6 @@ void GUIEditBoxWithScrollBar::updateAbsolutePosition()
}
}

//! Checks if word wrap is enabled
bool GUIEditBoxWithScrollBar::isWordWrapEnabled() const
{
return m_word_wrap;
}


//! Enables or disables newlines.
void GUIEditBoxWithScrollBar::setMultiLine(bool enable)
{
m_multiline = enable;
}


//! Checks if multi line editing is enabled
bool GUIEditBoxWithScrollBar::isMultiLineEnabled() const
{
return m_multiline;
}


void GUIEditBoxWithScrollBar::setPasswordBox(bool password_box, wchar_t password_char)
{
Expand Down Expand Up @@ -850,22 +759,6 @@ void GUIEditBoxWithScrollBar::setText(const wchar_t* text)
}


//! Enables or disables automatic scrolling with cursor position
//! \param enable: If set to true, the text will move around with the cursor position
void GUIEditBoxWithScrollBar::setAutoScroll(bool enable)
{
m_autoscroll = enable;
}


//! Checks to see if automatic scrolling is enabled
//! \return true if automatic scrolling is enabled, false if not
bool GUIEditBoxWithScrollBar::isAutoScrollEnabled() const
{
return m_autoscroll;
}


//! Gets the area of the text in the edit box
//! \return Returns the size in pixels of the text
core::dimension2du GUIEditBoxWithScrollBar::getTextDimension()
Expand Down

0 comments on commit 58a7090

Please sign in to comment.