From 571cc96523cc5dce0151677e6da1f317ac846866 Mon Sep 17 00:00:00 2001 From: Piotr Dziwinski Date: Tue, 11 Aug 2015 22:47:07 +0200 Subject: [PATCH] Add proper initializers and remove manual memory management in ui classes --- src/object/robotmain.cpp | 2 +- src/object/robotmain.h | 2 +- src/ui/controls/control.cpp | 3 +- src/ui/controls/edit.cpp | 58 ++-- src/ui/controls/edit.h | 21 +- src/ui/controls/editvalue.cpp | 70 ++-- src/ui/controls/editvalue.h | 7 +- src/ui/controls/image.cpp | 18 +- src/ui/controls/image.h | 7 +- src/ui/controls/interface.cpp | 102 +++--- src/ui/controls/interface.h | 14 +- src/ui/controls/list.cpp | 171 +++++----- src/ui/controls/list.h | 121 +++---- src/ui/controls/map.cpp | 31 +- src/ui/controls/map.h | 16 +- src/ui/controls/scroll.cpp | 71 ++-- src/ui/controls/scroll.h | 11 +- src/ui/controls/slider.cpp | 57 ++-- src/ui/controls/slider.h | 9 +- src/ui/controls/window.cpp | 553 ++++++++----------------------- src/ui/controls/window.h | 15 +- src/ui/displayinfo.cpp | 9 +- src/ui/displayinfo.h | 2 +- src/ui/displaytext.cpp | 123 +++---- src/ui/displaytext.h | 21 +- src/ui/maindialog.cpp | 4 + src/ui/maindialog.h | 3 +- src/ui/mainshort.cpp | 2 + src/ui/mainui.cpp | 79 +++-- src/ui/mainui.h | 10 +- src/ui/screen/screen_loading.cpp | 3 +- src/ui/studio.cpp | 14 +- src/ui/studio.h | 2 +- 33 files changed, 635 insertions(+), 996 deletions(-) diff --git a/src/object/robotmain.cpp b/src/object/robotmain.cpp index d1a2dea7..bd84d3ed 100644 --- a/src/object/robotmain.cpp +++ b/src/object/robotmain.cpp @@ -1440,7 +1440,7 @@ void CRobotMain::StartDisplayInfo(int index, bool movie) } //! Beginning of the displaying of instructions -void CRobotMain::StartDisplayInfo(const char *filename, int index) +void CRobotMain::StartDisplayInfo(const std::string& filename, int index) { if (m_cmdEdit) return; diff --git a/src/object/robotmain.h b/src/object/robotmain.h index d5cb0e66..2d9ac052 100644 --- a/src/object/robotmain.h +++ b/src/object/robotmain.h @@ -213,7 +213,7 @@ public: void FlushDisplayInfo(); void StartDisplayInfo(int index, bool movie); - void StartDisplayInfo(const char *filename, int index); + void StartDisplayInfo(const std::string& filename, int index); void StopDisplayInfo(); char* GetDisplayInfoName(int index); int GetDisplayInfoPosition(int index); diff --git a/src/ui/controls/control.cpp b/src/ui/controls/control.cpp index 8703d2ca..7cb187a6 100644 --- a/src/ui/controls/control.cpp +++ b/src/ui/controls/control.cpp @@ -45,7 +45,8 @@ CControl::CControl() m_textAlign = Gfx::TEXT_ALIGN_CENTER; //instead m_justify m_bFocus = false; m_bCapture = false; - + m_icon = 0; + m_fontStretch = false; m_bGlint = false; m_glintCorner1 = Math::Point(0.0f, 0.0f); m_glintCorner2 = Math::Point(0.0f, 0.0f); diff --git a/src/ui/controls/edit.cpp b/src/ui/controls/edit.cpp index e600792d..1b572e1e 100644 --- a/src/ui/controls/edit.cpp +++ b/src/ui/controls/edit.cpp @@ -26,6 +26,7 @@ #include "app/input.h" #include "common/logger.h" +#include "common/make_unique.h" #include "common/misc.h" #include "common/resources/inputstream.h" @@ -93,18 +94,16 @@ bool IsSep(int character) //! Object's constructor. -CEdit::CEdit () : CControl () +CEdit::CEdit() + : CControl(), + m_lineOffset(), + m_lineIndent() { - Math::Point pos; - m_maxChar = 100; m_text = std::vector(m_maxChar+1, '\0'); m_len = 0; - std::fill_n(m_lineOffset, EDITLINEMAX, 0); - m_fontType = Gfx::FONT_COURIER; - m_scroll = 0; m_bEdit = true; m_bHilite = true; m_bInsideScroll = true; @@ -118,6 +117,22 @@ CEdit::CEdit () : CControl () m_column = 0; m_imageTotal = 0; + m_timeLastScroll = 0.0f; + m_timeBlink = 0.0f; + m_time = 0.0f; + m_historyCurrent = 0; + m_markerTotal = 0; + m_bMulti = false; + m_lineDescent = 0.0f; + m_timeLastClick = 0.0f; + m_bMultiFont = false; + m_lineAscent = 0.0f; + m_historyTotal = 0; + m_lineTotal = 0; + m_lineHeight = 0.0f; + m_lineVisible = 0; + m_lineFirst = 0; + HyperFlush(); m_bUndoForce = true; @@ -129,9 +144,6 @@ CEdit::CEdit () : CControl () CEdit::~CEdit() { FreeImage(); - - delete m_scroll; - m_scroll = nullptr; } @@ -139,9 +151,6 @@ CEdit::~CEdit() bool CEdit::Create(Math::Point pos, Math::Point dim, int icon, EventType eventType) { - CScroll* pc; - Math::Point start, end; - if ( eventType == EVENT_NULL ) eventType = GetUniqueEventType(); CControl::Create(pos, dim, icon, eventType); @@ -162,9 +171,8 @@ bool CEdit::Create(Math::Point pos, Math::Point dim, int icon, EventType eventTy { m_bMulti = true; MoveAdjust(); // readjusts multi-line mode - m_scroll = new Ui::CScroll(); - pc = static_cast(m_scroll); - pc->Create(pos, dim, -1, EVENT_NULL); + m_scroll = MakeUnique(); + m_scroll->Create(pos, dim, -1, EVENT_NULL); MoveAdjust(); } @@ -196,7 +204,7 @@ void CEdit::MoveAdjust() height = m_dim.y-(m_bMulti?MARGY*2.0f:MARGY1); m_lineVisible = static_cast((height/m_lineHeight)); - if ( m_scroll != 0 ) + if (m_scroll != nullptr) { if ( m_bInsideScroll ) { @@ -284,11 +292,11 @@ bool CEdit::EventProcess(const Event &event) } } - if ( m_scroll != nullptr && !m_bGeneric ) + if (m_scroll != nullptr && !m_bGeneric) { m_scroll->EventProcess(event); - if ( event.type == m_scroll->GetEventType() ) + if (event.type == m_scroll->GetEventType()) { Scroll(); return true; @@ -1127,7 +1135,7 @@ void CEdit::Draw() DrawPart(pos, dim, 0); // red } - if ( m_scroll != 0 && !m_bGeneric ) + if (m_scroll != nullptr && !m_bGeneric) { m_scroll->Draw(); } @@ -2139,11 +2147,9 @@ void CEdit::SetFontSize(float size) void CEdit::Scroll() { - float value; - - if ( m_scroll != nullptr ) + if (m_scroll != nullptr) { - value = m_scroll->GetVisibleValue(); + float value = m_scroll->GetVisibleValue(); value *= m_lineTotal - m_lineVisible; Scroll(static_cast(value + 0.5f), true); } @@ -3195,9 +3201,7 @@ bool CEdit::SetFormat(int cursor1, int cursor2, int format) void CEdit::UpdateScroll() { - float value; - - if ( m_scroll != nullptr ) + if (m_scroll != nullptr) { if ( m_lineTotal <= m_lineVisible ) { @@ -3207,7 +3211,7 @@ void CEdit::UpdateScroll() } else { - value = static_cast(m_lineVisible) / m_lineTotal; + float value = static_cast(m_lineVisible) / m_lineTotal; m_scroll->SetVisibleRatio(value); value = static_cast(m_lineFirst) / (m_lineTotal - m_lineVisible); diff --git a/src/ui/controls/edit.h b/src/ui/controls/edit.h index 44e34383..a3b48351 100644 --- a/src/ui/controls/edit.h +++ b/src/ui/controls/edit.h @@ -27,6 +27,7 @@ #include "ui/controls/control.h" +#include namespace Ui { @@ -53,13 +54,13 @@ struct EditUndo //! original text std::vector text; //! length of the text - int len; + int len = 0; //! offset cursor - int cursor1; + int cursor1 = 0; //! offset cursor - int cursor2; + int cursor2 = 0; //! the first line displayed. - int lineFirst; + int lineFirst = 0; }; @@ -78,11 +79,11 @@ struct ImageLine //! name of the image (without icons/) std::string name; //! vertical offset (v texture) - float offset; + float offset = 0.0f; //! height of the part (dv texture) - float height; + float height = 0.0f; //! width - float width; + float width = 0.0f; }; struct HyperLink @@ -98,7 +99,7 @@ struct HyperMarker //! name of the marker std::string name; //! position in the text - int pos; + int pos = 0; }; struct HyperHistory @@ -106,7 +107,7 @@ struct HyperHistory //! full file name text std::string filename; //! rank of the first displayed line - int firstLine; + int firstLine = 0; }; @@ -229,7 +230,7 @@ protected: void UpdateScroll(); protected: - CScroll* m_scroll; // vertical scrollbar on the right + std::unique_ptr m_scroll; // vertical scrollbar on the right int m_maxChar; // max length of the buffer m_text std::vector m_text; // text (without zero terminator) diff --git a/src/ui/controls/editvalue.cpp b/src/ui/controls/editvalue.cpp index 674001d1..7983ab38 100644 --- a/src/ui/controls/editvalue.cpp +++ b/src/ui/controls/editvalue.cpp @@ -21,6 +21,7 @@ #include "ui/controls/editvalue.h" #include "common/event.h" +#include "common/make_unique.h" #include "common/misc.h" #include "object/robotmain.h" @@ -39,10 +40,6 @@ namespace Ui CEditValue::CEditValue() : CControl () { - m_edit = 0; - m_buttonUp = 0; - m_buttonDown = 0; - m_type = EVT_100; // % m_stepValue = 0.1f; // 10% m_minValue = 0.0f; // 0% @@ -55,9 +52,6 @@ CEditValue::CEditValue() : CControl () CEditValue::~CEditValue() { - delete m_edit; - delete m_buttonUp; - delete m_buttonDown; } @@ -65,28 +59,22 @@ CEditValue::~CEditValue() bool CEditValue::Create(Math::Point pos, Math::Point dim, int icon, EventType eventType) { - Ui::CEdit* pe; - Ui::CButton* pc; - if ( eventType == EVENT_NULL ) eventType = GetUniqueEventType(); CControl::Create(pos, dim, icon, eventType); GlintDelete(); - m_edit = new Ui::CEdit(); - pe = static_cast(m_edit); - pe->Create(pos, dim, 0, EVENT_NULL); - pe->SetMaxChar(4); + m_edit = MakeUnique(); + m_edit->Create(pos, dim, 0, EVENT_NULL); + m_edit->SetMaxChar(4); - m_buttonUp = new Ui::CButton(); - pc = static_cast(m_buttonUp); - pc->Create(pos, dim, 49, EVENT_NULL); // ^ - pc->SetRepeat(true); + m_buttonUp = MakeUnique(); + m_buttonUp->Create(pos, dim, 49, EVENT_NULL); // ^ + m_buttonUp->SetRepeat(true); - m_buttonDown = new Ui::CButton(); - pc = static_cast(m_buttonDown); - pc->Create(pos, dim, 50, EVENT_NULL); // v - pc->SetRepeat(true); + m_buttonDown = MakeUnique(); + m_buttonDown->Create(pos, dim, 50, EVENT_NULL); // v + m_buttonDown->SetRepeat(true); MoveAdjust(); return true; @@ -109,7 +97,7 @@ void CEditValue::MoveAdjust() { Math::Point pos, dim; - if ( m_edit != 0 ) + if (m_edit != nullptr) { pos.x = m_pos.x; pos.y = m_pos.y; @@ -119,7 +107,7 @@ void CEditValue::MoveAdjust() m_edit->SetDim(dim); } - if ( m_buttonUp != 0 ) + if (m_buttonUp != nullptr) { pos.x = m_pos.x+m_dim.x-m_dim.y*0.6f; pos.y = m_pos.y+m_dim.y*0.5f; @@ -129,7 +117,7 @@ void CEditValue::MoveAdjust() m_buttonUp->SetDim(dim); } - if ( m_buttonDown != 0 ) + if (m_buttonDown != nullptr) { pos.x = m_pos.x+m_dim.x-m_dim.y*0.6f; pos.y = m_pos.y; @@ -145,21 +133,19 @@ void CEditValue::MoveAdjust() bool CEditValue::EventProcess(const Event &event) { - float value; - CControl::EventProcess(event); if ( (m_state & STATE_VISIBLE) == 0 ) return true; if ( (m_state & STATE_ENABLE) == 0 ) return true; if ( m_state & STATE_DEAD ) return true; - if ( m_edit != 0 ) + if (m_edit != nullptr) { if ( m_edit->GetFocus() && event.type == EVENT_KEY_DOWN && event.GetData()->key == KEY(RETURN) ) { - value = GetValue(); + float value = GetValue(); if ( value > m_maxValue ) value = m_maxValue; if ( value < m_minValue ) value = m_minValue; SetValue(value, true); @@ -173,11 +159,11 @@ bool CEditValue::EventProcess(const Event &event) } } - if ( m_buttonUp != 0 ) + if (m_buttonUp != nullptr) { if ( event.type == m_buttonUp->GetEventType() ) { - value = GetValue()+m_stepValue; + float value = GetValue()+m_stepValue; if ( value > m_maxValue ) value = m_maxValue; SetValue(value, true); HiliteValue(event); @@ -185,11 +171,11 @@ bool CEditValue::EventProcess(const Event &event) if ( !m_buttonUp->EventProcess(event) ) return false; } - if ( m_buttonDown != 0 ) + if (m_buttonDown != nullptr) { if ( event.type == m_buttonDown->GetEventType() ) { - value = GetValue()-m_stepValue; + float value = GetValue()-m_stepValue; if ( value < m_minValue ) value = m_minValue; SetValue(value, true); HiliteValue(event); @@ -201,7 +187,7 @@ bool CEditValue::EventProcess(const Event &event) event.GetData()->dir == WHEEL_UP && Detect(event.mousePos)) { - value = GetValue()+m_stepValue; + float value = GetValue()+m_stepValue; if ( value > m_maxValue ) value = m_maxValue; SetValue(value, true); HiliteValue(event); @@ -210,7 +196,7 @@ bool CEditValue::EventProcess(const Event &event) event.GetData()->dir == WHEEL_DOWN && Detect(event.mousePos)) { - value = GetValue()-m_stepValue; + float value = GetValue()-m_stepValue; if ( value < m_minValue ) value = m_minValue; SetValue(value, true); HiliteValue(event); @@ -224,18 +210,16 @@ bool CEditValue::EventProcess(const Event &event) void CEditValue::HiliteValue(const Event &event) { - int pos; + if (m_edit == nullptr) return; - if ( m_edit == 0 ) return; - - pos = m_edit->GetTextLength(); + int pos = m_edit->GetTextLength(); if ( m_type == EVT_100 && pos > 0 ) { pos --; // not only selects the "%" } m_edit->SetCursor(pos, 0); - m_interface->SetFocus(m_edit); + m_interface->SetFocus(m_edit.get()); Event newEvent = event.Clone(); newEvent.type = EVENT_FOCUS; @@ -255,16 +239,16 @@ void CEditValue::Draw() DrawShadow(m_pos, m_dim); } - if ( m_edit != 0 ) + if (m_edit != nullptr) { m_edit->Draw(); } - if ( m_buttonUp != 0 ) + if (m_buttonUp != nullptr) { m_buttonUp->SetState(STATE_DEAD, TestState(STATE_DEAD)); m_buttonUp->Draw(); } - if ( m_buttonDown != 0 ) + if (m_buttonDown != nullptr) { m_buttonDown->SetState(STATE_DEAD, TestState(STATE_DEAD)); m_buttonDown->Draw(); diff --git a/src/ui/controls/editvalue.h b/src/ui/controls/editvalue.h index 2e81b914..8a16b3b8 100644 --- a/src/ui/controls/editvalue.h +++ b/src/ui/controls/editvalue.h @@ -24,6 +24,7 @@ #include "ui/controls/control.h" +#include namespace Gfx { @@ -82,9 +83,9 @@ protected: void HiliteValue(const Event &event); Ui::CInterface* m_interface; - Ui::CEdit* m_edit; - Ui::CButton* m_buttonUp; - Ui::CButton* m_buttonDown; + std::unique_ptr m_edit; + std::unique_ptr m_buttonUp; + std::unique_ptr m_buttonDown; EditValueType m_type; float m_stepValue; float m_minValue; diff --git a/src/ui/controls/image.cpp b/src/ui/controls/image.cpp index 53d93e0e..3489c80b 100644 --- a/src/ui/controls/image.cpp +++ b/src/ui/controls/image.cpp @@ -27,24 +27,19 @@ #include "graphics/engine/engine.h" -#include -#include - - namespace Ui { // Object's constructor. CImage::CImage() : CControl() { - m_filename[0] = 0; } // Object's destructor. CImage::~CImage() { - if ( m_filename[0] != 0 ) + if (!m_filename.empty()) { m_engine->DeleteTexture(m_filename); } @@ -71,19 +66,14 @@ bool CImage::Create(Math::Point pos, Math::Point dim, int icon, EventType eventT // Specifies the name of the image display. -void CImage::SetFilenameImage(const char *name) +void CImage::SetFilenameImage(const std::string& name) { - if ( m_filename[0] != 0 ) + if (!m_filename.empty()) { m_engine->DeleteTexture(m_filename); } - strcpy(m_filename, name); -} - -char* CImage::GetFilenameImage() -{ - return m_filename; + m_filename = name; } diff --git a/src/ui/controls/image.h b/src/ui/controls/image.h index abc2e1a0..c87282da 100644 --- a/src/ui/controls/image.h +++ b/src/ui/controls/image.h @@ -45,13 +45,10 @@ public: void Draw(); - void SetFilenameImage(const char *name); - char* GetFilenameImage(); + void SetFilenameImage(const std::string& name); protected: - -protected: - char m_filename[100]; + std::string m_filename; }; diff --git a/src/ui/controls/interface.cpp b/src/ui/controls/interface.cpp index 07651806..6510873a 100644 --- a/src/ui/controls/interface.cpp +++ b/src/ui/controls/interface.cpp @@ -22,6 +22,9 @@ #include "app/app.h" +#include + + namespace Ui { @@ -31,18 +34,12 @@ CInterface::CInterface() m_event = CApplication::GetInstancePointer()->GetEventQueue(); m_engine = Gfx::CEngine::GetInstancePointer(); m_camera = nullptr; - - for (int i = 0; i < MAXCONTROL; i++) - { - m_table[i] = nullptr; - } } // Object's destructor. CInterface::~CInterface() { - Flush(); } @@ -50,26 +47,24 @@ CInterface::~CInterface() void CInterface::Flush() { - for (int i = 0; i < MAXCONTROL; i++) + for (auto& control : m_controls) { - delete m_table[i]; - m_table[i] = nullptr; + control.reset(); } } - int CInterface::GetNextFreeControl() { - for (int i = 10; i < MAXCONTROL-1; i++) + for (int i = 10; i < static_cast(m_controls.size()) - 1; i++) { - if (m_table[i] == nullptr) + if (m_controls[i] == nullptr) return i; } return -1; } - -template inline T* CInterface::CreateControl(Math::Point pos, Math::Point dim, int icon, EventType eventMsg) +template +ControlClass* CInterface::CreateControl(Math::Point pos, Math::Point dim, int icon, EventType eventMsg) { if (eventMsg == EVENT_NULL) eventMsg = GetUniqueEventType(); @@ -78,10 +73,11 @@ template inline T* CInterface::CreateControl(Math::Point pos, Math: if (index < 0) return nullptr; - m_table[index] = new T(); - T* pc = static_cast(m_table[index]); - pc->Create(pos, dim, icon, eventMsg); - return pc; + auto control = MakeUnique(); + control->Create(pos, dim, icon, eventMsg); + auto* controlPtr = control.get(); + m_controls[index] = std::move(control); + return controlPtr; } @@ -105,18 +101,18 @@ CWindow* CInterface::CreateWindows(Math::Point pos, Math::Point dim, int icon, E case EVENT_WINDOW7: index = 7; break; case EVENT_WINDOW8: index = 8; break; case EVENT_WINDOW9: index = 9; break; - case EVENT_TOOLTIP: index = MAXCONTROL-1; break; + case EVENT_TOOLTIP: index = m_controls.size() - 1; break; default: index = GetNextFreeControl(); break; } if (index < 0) return nullptr; - delete m_table[index]; - m_table[index] = new CWindow(); - CWindow* pc = static_cast(m_table[index]); - pc->Create(pos, dim, icon, eventMsg); - return pc; + auto window = MakeUnique(); + window->Create(pos, dim, icon, eventMsg); + auto* windowPtr = window.get(); + m_controls[index] = std::move(window); + return windowPtr; } // Creates a new button. @@ -220,10 +216,11 @@ CList* CInterface::CreateList(Math::Point pos, Math::Point dim, int icon, EventT if (index < 0) return nullptr; - m_table[index] = new CList(); - CList* pc = static_cast(m_table[index]); - pc->Create(pos, dim, icon, eventMsg, expand); - return pc; + auto list = MakeUnique(); + list->Create(pos, dim, icon, eventMsg, expand); + auto* listPtr = list.get(); + m_controls[index] = std::move(list); + return listPtr; } // Creates a new shortcut. @@ -258,16 +255,13 @@ CMap* CInterface::CreateMap(Math::Point pos, Math::Point dim, int icon, EventTyp bool CInterface::DeleteControl(EventType eventMsg) { - for (int i = 0; i < MAXCONTROL; i++) + for (auto& control : m_controls) { - if ( m_table[i] != nullptr ) + if (control != nullptr && + eventMsg == control->GetEventType()) { - if (eventMsg == m_table[i]->GetEventType()) - { - delete m_table[i]; - m_table[i] = nullptr; - return true; - } + control.reset(); + return true; } } return false; @@ -277,12 +271,12 @@ bool CInterface::DeleteControl(EventType eventMsg) CControl* CInterface::SearchControl(EventType eventMsg) { - for (int i = 0; i < MAXCONTROL; i++) + for (auto& control : m_controls) { - if (m_table[i] != nullptr) + if (control != nullptr && + eventMsg == control->GetEventType()) { - if (eventMsg == m_table[i]->GetEventType()) - return m_table[i]; + return control.get(); } } return nullptr; @@ -300,11 +294,11 @@ bool CInterface::EventProcess(const Event &event) m_engine->SetMouseType(m_camera->GetMouseDef(event.mousePos)); } - for (int i = MAXCONTROL-1; i >= 0; i--) + for (auto& control : boost::adaptors::reverse(m_controls)) { - if (m_table[i] != nullptr && m_table[i]->TestState(STATE_ENABLE)) + if (control != nullptr && control->TestState(STATE_ENABLE)) { - if ( !m_table[i]->EventProcess(event) ) + if (! control->EventProcess(event)) return false; } } @@ -317,11 +311,11 @@ bool CInterface::EventProcess(const Event &event) bool CInterface::GetTooltip(Math::Point pos, std::string &name) { - for (int i = MAXCONTROL-1; i >= 0; i--) + for (auto& control : boost::adaptors::reverse(m_controls)) { - if (m_table[i] != nullptr) + if (control != nullptr) { - if (m_table[i]->GetTooltip(pos, name)) + if (control->GetTooltip(pos, name)) return true; } } @@ -333,21 +327,21 @@ bool CInterface::GetTooltip(Math::Point pos, std::string &name) void CInterface::Draw() { - for (int i = 0; i < MAXCONTROL; i++) + for (auto& control : m_controls) { - if ( m_table[i] != nullptr ) - m_table[i]->Draw(); + if (control != nullptr) + control->Draw(); } } -void CInterface::SetFocus(CControl* control) +void CInterface::SetFocus(CControl* focusControl) { - for (int i = 0; i < MAXCONTROL; i++) + for (auto& control : m_controls) { - if (m_table[i] != nullptr) + if (control != nullptr) { - bool focus = m_table[i] == control; - m_table[i]->SetFocus(focus); + bool focus = control.get() == focusControl; + control->SetFocus(focus); } } } diff --git a/src/ui/controls/interface.h b/src/ui/controls/interface.h index dd3179bd..b24d9768 100644 --- a/src/ui/controls/interface.h +++ b/src/ui/controls/interface.h @@ -49,14 +49,15 @@ #include "ui/controls/target.h" #include "ui/controls/window.h" +#include #include +#include namespace Ui { const int MAXCONTROL = 100; - class CInterface { public: @@ -92,18 +93,19 @@ public: void Draw(); - void SetFocus(CControl* control); + void SetFocus(CControl* focusControl); protected: int GetNextFreeControl(); - template inline T* CreateControl(Math::Point pos, Math::Point dim, int icon, EventType eventMsg); + + template + ControlClass* CreateControl(Math::Point pos, Math::Point dim, int icon, EventType eventMsg); CEventQueue* m_event; Gfx::CEngine* m_engine; Gfx::CCamera* m_camera; - - CControl* m_table[MAXCONTROL]; + std::array, MAXCONTROL> m_controls; }; -} +} // namespace Ui diff --git a/src/ui/controls/list.cpp b/src/ui/controls/list.cpp index 0be6d857..92787324 100644 --- a/src/ui/controls/list.cpp +++ b/src/ui/controls/list.cpp @@ -20,6 +20,8 @@ #include "ui/controls/list.h" +#include "common/make_unique.h" + #include "graphics/engine/engine.h" #include @@ -33,25 +35,18 @@ const float MARGING = 4.0f; // Object's constructor. -CList::CList() : CControl() +CList::CList() + : CControl(), + m_tabs(), + m_justifs() { - for (int i = 0; i < LISTMAXDISPLAY; i++) - m_button[i] = nullptr; - - m_scroll = nullptr; - for (int i = 0; i < LISTMAXTOTAL; i++) - { - m_text[i][0] = 0; - m_check[i] = false; - m_enable[i] = true; - } - for (int i = 0; i < 10; i++) { m_tabs[i] = 0.0f; m_justifs[i] = Gfx::TEXT_ALIGN_LEFT; } + m_expand = 0.0f; m_totalLine = 0; m_displayLine = 0; m_selectLine = -1; @@ -65,12 +60,6 @@ CList::CList() : CControl() CList::~CList() { - for (int i = 0; i < LISTMAXDISPLAY; i++) - { - delete m_button[i]; - } - - delete m_scroll; } @@ -88,9 +77,8 @@ bool CList::Create(Math::Point pos, Math::Point dim, int icon, EventType eventMs CControl::Create(pos, dim, icon, eventMsg); - m_scroll = new CScroll(); + m_scroll = MakeUnique(); m_scroll->Create(pos, dim, 0, EVENT_NULL); - m_eventScroll = m_scroll->GetEventType(); return MoveAdjust(); } @@ -110,14 +98,8 @@ bool CList::MoveAdjust() Math::Point ipos, idim, ppos, ddim; float marging, h; - for (int i = 0; i < LISTMAXDISPLAY; i++) - { - if (m_button[i] != nullptr) - { - delete m_button[i]; - m_button[i] = nullptr; - } - } + for (auto& button : m_buttons) + button.reset(); if (m_icon == 0) marging = MARGING; @@ -153,18 +135,18 @@ bool CList::MoveAdjust() ddim.y = h; for (int i = 0; i < m_displayLine; i++) { - m_button[i] = new CButton(); - m_button[i]->Create(ppos, ddim, -1, EVENT_NULL); - m_button[i]->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - m_button[i]->SetState(STATE_SIMPLY); - m_button[i]->SetFontType(m_fontType); - m_button[i]->SetFontSize(m_fontSize); + auto button = MakeUnique(); + button->Create(ppos, ddim, -1, EVENT_NULL); + button->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); + button->SetState(STATE_SIMPLY); + button->SetFontType(m_fontType); + button->SetFontSize(m_fontSize); ppos.y -= h; - m_eventButton[i] = m_button[i]->GetEventType(); + m_buttons[i] = std::move(button); } - if ( m_scroll != nullptr ) + if (m_scroll != nullptr) { ppos.x = ipos.x + idim.x - SCROLL_WIDTH; ppos.y = ipos.y; @@ -186,9 +168,9 @@ EventType CList::GetEventMsgButton(int i) { if (i < 0 || i >= m_displayLine) return EVENT_NULL; - if (m_button[i] == nullptr) + if (m_buttons[i] == nullptr) return EVENT_NULL; - return m_button[i]->GetEventType(); + return m_buttons[i]->GetEventType(); } // Returns the message from the elevator. @@ -221,8 +203,8 @@ bool CList::SetState(int state, bool bState) { for (int i = 0; i < m_displayLine; i++) { - if (m_button[i] != nullptr) - m_button[i]->SetState(state, bState); + if (m_buttons[i] != nullptr) + m_buttons[i]->SetState(state, bState); } if (m_scroll != nullptr) m_scroll->SetState(state, bState); @@ -238,8 +220,8 @@ bool CList::SetState(int state) { for (int i = 0; i < m_displayLine; i++) { - if (m_button[i] != nullptr) - m_button[i]->SetState(state); + if (m_buttons[i] != nullptr) + m_buttons[i]->SetState(state); } if (m_scroll != nullptr) m_scroll->SetState(state); @@ -255,8 +237,8 @@ bool CList::ClearState(int state) { for (int i = 0; i < m_displayLine; i++) { - if (m_button[i] != nullptr) - m_button[i]->ClearState(state); + if (m_buttons[i] != nullptr) + m_buttons[i]->ClearState(state); } if (m_scroll != nullptr) m_scroll->ClearState(state); @@ -274,18 +256,18 @@ bool CList::EventProcess(const Event &event) { int i = m_selectLine-m_firstLine; - if (i >= 0 && i < 4 && m_button[i] != nullptr) + if (i >= 0 && i < 4 && m_buttons[i] != nullptr) { m_blinkTime += event.rTime; if (Math::Mod(m_blinkTime, 0.7f) < 0.3f) { - m_button[i]->ClearState(STATE_ENABLE); - m_button[i]->ClearState(STATE_CHECK); + m_buttons[i]->ClearState(STATE_ENABLE); + m_buttons[i]->ClearState(STATE_CHECK); } else { - m_button[i]->SetState(STATE_ENABLE); - m_button[i]->SetState(STATE_CHECK); + m_buttons[i]->SetState(STATE_ENABLE); + m_buttons[i]->SetState(STATE_CHECK); } } } @@ -323,8 +305,8 @@ bool CList::EventProcess(const Event &event) { if (i + m_firstLine >= m_totalLine) break; - if (m_button[i] != nullptr) - m_button[i]->EventProcess(event); + if (m_buttons[i] != nullptr) + m_buttons[i]->EventProcess(event); } } @@ -335,12 +317,12 @@ bool CList::EventProcess(const Event &event) if (i + m_firstLine >= m_totalLine) break; - if (m_button[i] != nullptr) + if (m_buttons[i] != nullptr) { - if (!m_button[i]->EventProcess(event)) + if (!m_buttons[i]->EventProcess(event)) return false; - if (event.type == m_eventButton[i]) + if (event.type == m_buttons[i]->GetEventType()) { SetSelect(m_firstLine + i); @@ -355,7 +337,7 @@ bool CList::EventProcess(const Event &event) if (!m_scroll->EventProcess(event)) return false; - if (event.type == m_eventScroll) + if (event.type == m_scroll->GetEventType()) { MoveScroll(); UpdateButton(); @@ -408,9 +390,9 @@ void CList::Draw() uv2.x = 156.0f / 256.0f; uv2.y = 92.0f / 256.0f; - if (m_button[0] != nullptr) + if (m_buttons[0] != nullptr) { - dim = m_button[0]->GetDim(); + dim = m_buttons[0]->GetDim(); dim.y *= m_displayLine; // background sounds spot behind } } @@ -428,10 +410,10 @@ void CList::Draw() if ( m_totalLine < m_displayLine ) // no buttons to the bottom? { i = m_totalLine; - if ( m_button[i] != 0 ) + if (m_buttons[i] != nullptr) { - pos = m_button[i]->GetPos(); - dim = m_button[i]->GetDim(); + pos = m_buttons[i]->GetPos(); + dim = m_buttons[i]->GetDim(); pos.y += dim.y * 1.1f; dim.y *= 0.4f; pos.y -= dim.y; @@ -455,30 +437,30 @@ void CList::Draw() if ( i + m_firstLine >= m_totalLine ) break; - if ( m_button[i] != nullptr ) + if ( m_buttons[i] != nullptr ) { if ( !m_bBlink && i + m_firstLine < m_totalLine ) - m_button[i]->SetState(STATE_ENABLE, m_enable[i+m_firstLine] && (m_state & STATE_ENABLE) ); + m_buttons[i]->SetState(STATE_ENABLE, m_items[i+m_firstLine].enable && (m_state & STATE_ENABLE) ); - m_button[i]->Draw(); // draws a box without text + m_buttons[i]->Draw(); // draws a box without text // draws text in the box - pos = m_button[i]->GetPos(); - dim = m_button[i]->GetDim(); + pos = m_buttons[i]->GetPos(); + dim = m_buttons[i]->GetDim(); if ( m_tabs[0] == 0.0f ) { ppos.x = pos.x + dim.y * 0.5f; ppos.y = pos.y + dim.y * 0.5f; ppos.y -= m_engine->GetText()->GetHeight(m_fontType, m_fontSize) / 2.0f; ddim.x = dim.x-dim.y; - DrawCase(m_text[i + m_firstLine], ppos, ddim.x, Gfx::TEXT_ALIGN_LEFT); + DrawCase(m_items[i + m_firstLine].text, ppos, ddim.x, Gfx::TEXT_ALIGN_LEFT); } else { ppos.x = pos.x + dim.y * 0.5f; ppos.y = pos.y + dim.y * 0.5f; ppos.y -= m_engine->GetText()->GetHeight(m_fontType, m_fontSize) / 2.0f; - pb = m_text[i + m_firstLine]; + pb = m_items[i + m_firstLine].text; for (int j = 0; j < 10; j++) { pe = strchr(pb, '\t'); @@ -500,8 +482,8 @@ void CList::Draw() if ( (m_state & STATE_EXTEND) && i < m_totalLine) { - pos = m_button[i]->GetPos(); - dim = m_button[i]->GetDim(); + pos = m_buttons[i]->GetPos(); + dim = m_buttons[i]->GetDim(); pos.x += dim.x - dim.y * 0.75f; dim.x = dim.y * 0.75f; pos.x += 2.0f / 640.0f; @@ -509,7 +491,7 @@ void CList::Draw() dim.x -= 4.0f / 640.0f; dim.y -= 4.0f / 480.0f; - if ( m_check[i + m_firstLine] ) + if (m_items[i + m_firstLine].check) { m_engine->SetTexture("textures/interface/button1.png"); m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); @@ -562,7 +544,7 @@ void CList::Draw() } } - if ( m_scroll != 0 ) + if (m_scroll != nullptr) m_scroll->Draw(); // draws the lift } @@ -648,19 +630,17 @@ bool CList::GetSelectCap() void CList::SetBlink(bool bEnable) { - int i; - m_bBlink = bEnable; m_blinkTime = 0.0f; - i = m_selectLine-m_firstLine; + int i = m_selectLine - m_firstLine; - if (i >= 0 && i < 4 && m_button[i] != nullptr) + if (i >= 0 && i < 4 && m_buttons[i] != nullptr) { if ( !bEnable ) { - m_button[i]->SetState(STATE_CHECK); - m_button[i]->ClearState(STATE_ENABLE); + m_buttons[i]->SetState(STATE_CHECK); + m_buttons[i]->ClearState(STATE_ENABLE); } } } @@ -682,9 +662,9 @@ void CList::SetItemName(int i, const char* name) m_totalLine = i+1; // expands the list if ( name[0] == 0 ) - strcpy(m_text[i], " "); + strcpy(m_items[i].text, " "); else - strcpy(m_text[i], name); + strcpy(m_items[i].text, name); UpdateButton(); UpdateScroll(); @@ -697,7 +677,7 @@ char* CList::GetItemName(int i) if ( i < 0 || i >= m_totalLine ) return 0; - return m_text[i]; + return m_items[i].text; } @@ -708,7 +688,7 @@ void CList::SetCheck(int i, bool bMode) if ( i < 0 || i >= m_totalLine ) return; - m_check[i] = bMode; + m_items[i].check = bMode; } // Returns the bit "check" for a box. @@ -718,7 +698,7 @@ bool CList::GetCheck(int i) if ( i < 0 || i >= m_totalLine ) return false; - return m_check[i]; + return m_items[i].check; } @@ -729,7 +709,7 @@ void CList::SetEnable(int i, bool bMode) if ( i < 0 || i >= m_totalLine ) return; - m_enable[i] = bMode; + m_items[i].enable = bMode; } // Returns the bit "enable" for a box. @@ -739,7 +719,7 @@ bool CList::GetEnable(int i) if ( i < 0 || i >= m_totalLine ) return false; - return m_enable[i]; + return m_items[i].enable; } @@ -800,21 +780,21 @@ void CList::UpdateButton() j = m_firstLine; for (i = 0; i < m_displayLine; i++) { - if (m_button[i] == nullptr) + if (m_buttons[i] == nullptr) continue; - m_button[i]->SetState(STATE_CHECK, (j == m_selectLine)); + m_buttons[i]->SetState(STATE_CHECK, (j == m_selectLine)); if ( j < m_totalLine ) { -//? m_button[i]->SetName(m_text[j]); - m_button[i]->SetName(" "); // blank button - m_button[i]->SetState(STATE_ENABLE, (state & STATE_ENABLE)); +//? m_buttons[i]->SetName(m_text[j]); + m_buttons[i]->SetName(" "); // blank button + m_buttons[i]->SetState(STATE_ENABLE, (state & STATE_ENABLE)); } else { - m_button[i]->SetName(" "); // blank button - m_button[i]->ClearState(STATE_ENABLE); + m_buttons[i]->SetName(" "); // blank button + m_buttons[i]->ClearState(STATE_ENABLE); } j ++; } @@ -860,14 +840,11 @@ void CList::UpdateScroll() void CList::MoveScroll() { - float pos; - int n; - - if ( m_scroll == 0 ) + if (m_scroll == nullptr) return; - n = m_totalLine - m_displayLine; - pos = m_scroll->GetVisibleValue(); + int n = m_totalLine - m_displayLine; + float pos = m_scroll->GetVisibleValue(); pos += m_scroll->GetArrowStep() / 2.0f; // it's magic! m_firstLine = static_cast(pos * n); if ( m_firstLine < 0 ) diff --git a/src/ui/controls/list.h b/src/ui/controls/list.h index 17e52705..9ed53fb8 100644 --- a/src/ui/controls/list.h +++ b/src/ui/controls/list.h @@ -32,6 +32,8 @@ #include "ui/controls/button.h" #include "ui/controls/scroll.h" +#include +#include namespace Ui { @@ -43,85 +45,86 @@ const int LISTMAXTOTAL = 100; // maximum total number of lines class CList : public CControl { - public: - CList(); - ~CList(); +public: + CList(); + ~CList(); - bool Create(Math::Point pos, Math::Point dim, int icon, EventType eventMsg, float expand); + bool Create(Math::Point pos, Math::Point dim, int icon, EventType eventMsg, float expand); - void SetPos(Math::Point pos) override; - void SetDim(Math::Point dim) override; + void SetPos(Math::Point pos) override; + void SetDim(Math::Point dim) override; - bool SetState(int state, bool bState) override; - bool SetState(int state) override; - bool ClearState(int state) override; + bool SetState(int state, bool bState) override; + bool SetState(int state) override; + bool ClearState(int state) override; - bool EventProcess(const Event &event) override; - void Draw() override; + bool EventProcess(const Event &event) override; + void Draw() override; - void Flush(); + void Flush(); - void SetTotal(int i); - int GetTotal(); + void SetTotal(int i); + int GetTotal(); - void SetSelect(int i); - int GetSelect(); + void SetSelect(int i); + int GetSelect(); - void SetSelectCap(bool bEnable); - bool GetSelectCap(); + void SetSelectCap(bool bEnable); + bool GetSelectCap(); - void SetBlink(bool bEnable); - bool GetBlink(); + void SetBlink(bool bEnable); + bool GetBlink(); - void SetItemName(int i, const char* name); - char* GetItemName(int i); + void SetItemName(int i, const char* name); + char* GetItemName(int i); - void SetCheck(int i, bool bMode); - bool GetCheck(int i); + void SetCheck(int i, bool bMode); + bool GetCheck(int i); - void SetEnable(int i, bool bEnable); - bool GetEnable(int i); + void SetEnable(int i, bool bEnable); + bool GetEnable(int i); - void SetTabs(int i, float pos, Gfx::TextAlign justif=Gfx::TEXT_ALIGN_LEFT); - float GetTabs(int i); + void SetTabs(int i, float pos, Gfx::TextAlign justif=Gfx::TEXT_ALIGN_LEFT); + float GetTabs(int i); - void ShowSelect(bool bFixed); + void ShowSelect(bool bFixed); - EventType GetEventMsgButton(int i); - EventType GetEventMsgScroll(); + EventType GetEventMsgButton(int i); + EventType GetEventMsgScroll(); - protected: - bool MoveAdjust(); - void UpdateButton(); - void UpdateScroll(); - void MoveScroll(); - void DrawCase(char *text, Math::Point pos, float width, Gfx::TextAlign justif); +protected: + bool MoveAdjust(); + void UpdateButton(); + void UpdateScroll(); + void MoveScroll(); + void DrawCase(char *text, Math::Point pos, float width, Gfx::TextAlign justif); - private: - // Overridden to avoid warning about hiding the virtual function - virtual bool Create(Math::Point pos, Math::Point dim, int icon, EventType eventType) override; +private: + // Overridden to avoid warning about hiding the virtual function + virtual bool Create(Math::Point pos, Math::Point dim, int icon, EventType eventType) override; - protected: - CButton* m_button[LISTMAXDISPLAY]; - CScroll* m_scroll; +protected: + std::array, LISTMAXDISPLAY> m_buttons; + std::unique_ptr m_scroll; - EventType m_eventButton[LISTMAXDISPLAY]; - EventType m_eventScroll; + float m_expand; + int m_totalLine; // total number of lines + int m_displayLine; // number of visible lines + int m_selectLine; // selected line + int m_firstLine; // first visible line + bool m_bBlink; + bool m_bSelectCap; + float m_blinkTime; + float m_tabs[10]; + Gfx::TextAlign m_justifs[10]; - float m_expand; - int m_totalLine; // total number of lines - int m_displayLine; // number of visible lines - int m_selectLine; // selected line - int m_firstLine; // first visible line - bool m_bBlink; - bool m_bSelectCap; - float m_blinkTime; - float m_tabs[10]; - Gfx::TextAlign m_justifs[10]; - - char m_text[LISTMAXTOTAL][100]; - char m_check[LISTMAXTOTAL]; - char m_enable[LISTMAXTOTAL]; + struct Item + { + char text[100] = {0}; + bool check = false; + bool enable = true; + }; + std::array m_items; }; diff --git a/src/ui/controls/map.cpp b/src/ui/controls/map.cpp index eabdd4fd..389f2e2f 100644 --- a/src/ui/controls/map.cpp +++ b/src/ui/controls/map.cpp @@ -66,9 +66,12 @@ CMap::CMap() : CControl() m_half = m_terrain->GetMosaicCount() * m_terrain->GetBrickCount() * m_terrain->GetBrickSize() / 2.0f; m_highlightRank = -1; + m_totalFix = 0; + m_totalMove = 0; + m_bRadar = false; + FlushObject(); - m_fixImage[0] = 0; m_mode = 0; m_bToy = false; m_bDebug = false; @@ -175,16 +178,16 @@ void CMap::SetWaterColor(Gfx::Color color) // Specifies a fixed image in place of the drawing of the relief. -void CMap::SetFixImage(const char *filename) +void CMap::SetFixImage(const std::string& filename) { - strcpy(m_fixImage, filename); + m_fixImage = filename; } // Whether to use a still image. bool CMap::GetFixImage() { - return (m_fixImage[0] != 0); + return ! m_fixImage.empty(); } @@ -241,7 +244,7 @@ Math::Point CMap::AdjustOffset(Math::Point offset) void CMap::SetHighlight(CObject* pObj) { m_highlightRank = -1; - if ( m_bToy || m_fixImage[0] != 0 ) + if ( m_bToy || !m_fixImage.empty()) return; // card with still image? if ( pObj == nullptr ) return; @@ -333,10 +336,10 @@ void CMap::Draw() if ( !m_bEnable ) return; - if ( m_fixImage[0] == 0 && m_map[MAPMAXOBJECT - 1].bUsed ) + if (m_fixImage.empty() && m_map[MAPMAXOBJECT - 1].bUsed) m_offset = AdjustOffset(m_map[MAPMAXOBJECT - 1].pos); - if ( m_fixImage[0] == 0 ) // drawing of the relief? + if (m_fixImage.empty()) // drawing of the relief? { m_engine->SetTexture("textures/interface/map.png"); m_engine->SetState(Gfx::ENG_RSTATE_NORMAL); @@ -443,7 +446,7 @@ void CMap::DrawFocus(Math::Point pos, float dir, ObjectType type, MapColor color bool bEnding; int quart; - if ( m_bToy || m_fixImage[0] != 0 ) return; // map with still image? + if (m_bToy || !m_fixImage.empty()) return; // map with still image? if ( color != MAPCOLOR_MOVE ) return; pos.x = (pos.x-m_offset.x)*(m_zoom*0.5f)/m_half+0.5f; @@ -886,7 +889,7 @@ void CMap::DrawHighlight(Math::Point pos) { Math::Point dim, uv1, uv2; - if ( m_bToy || m_fixImage[0] != 0 ) return; // map with still image? + if (m_bToy || !m_fixImage.empty()) return; // map with still image? pos.x = (pos.x-m_offset.x)*(m_zoom*0.5f)/m_half+0.5f; pos.y = (pos.y-m_offset.y)*(m_zoom*0.5f)/m_half+0.5f; @@ -1004,7 +1007,7 @@ void CMap::DrawVertex(Math::Point uv1, Math::Point uv2, float zoom) void CMap::UpdateTerrain() { - if (m_fixImage[0] != 0) return; // still image? + if (! m_fixImage.empty()) return; // still image? CImage img(Math::IntPoint(256, 256)); @@ -1069,7 +1072,7 @@ void CMap::UpdateTerrain(int bx, int by, int ex, int ey) float scale, water, level, intensity; int x, y; - if ( m_fixImage[0] != 0 ) return; // still image? + if (! m_fixImage.empty()) return; // still image? // TODO: map texture manipulation return; @@ -1129,13 +1132,11 @@ void CMap::UpdateTerrain(int bx, int by, int ex, int ey) void CMap::FlushObject() { - int i; - m_totalFix = 0; // object index fixed m_totalMove = MAPMAXOBJECT-2; // moving vehicles index m_bRadar = m_main->GetRadar(); - for ( i=0 ; iCreate(Math::Point(0.0f, 0.0f), Math::Point(0.0f, 0.0f), 49, EVENT_NULL); - pc->SetRepeat(true); - m_eventUp = pc->GetEventType(); + m_buttonUp = MakeUnique(); + m_buttonUp->Create(Math::Point(0.0f, 0.0f), Math::Point(0.0f, 0.0f), 49, EVENT_NULL); + m_buttonUp->SetRepeat(true); } - if ( m_buttonDown == 0 ) + if (m_buttonDown == nullptr) { - m_buttonDown = new CButton(); - pc = m_buttonDown; - pc->Create(Math::Point(0.0f, 0.0f), Math::Point(0.0f, 0.0f), 50, EVENT_NULL); - pc->SetRepeat(true); - m_eventDown = pc->GetEventType(); + m_buttonDown = MakeUnique(); + m_buttonDown->Create(Math::Point(0.0f, 0.0f), Math::Point(0.0f, 0.0f), 50, EVENT_NULL); + m_buttonDown->SetRepeat(true); } } - if ( m_buttonUp != 0 ) + if (m_buttonUp != nullptr) { pos.x = m_pos.x; pos.y = m_pos.y+m_dim.y-m_dim.x/0.75f; @@ -128,7 +114,7 @@ void CScroll::MoveAdjust() m_buttonUp->SetDim(dim); } - if ( m_buttonDown != 0 ) + if (m_buttonDown != nullptr) { pos.x = m_pos.x; pos.y = m_pos.y; @@ -198,21 +184,18 @@ bool CScroll::ClearState(int state) bool CScroll::EventProcess(const Event &event) { - Math::Point pos, dim; - float hButton, h, value; - CControl::EventProcess(event); - if ( m_buttonUp != 0 && !m_bCapture ) + if (m_buttonUp != nullptr && !m_bCapture) { if ( !m_buttonUp->EventProcess(event) ) return false; } - if ( m_buttonDown != 0 && !m_bCapture ) + if (m_buttonDown != nullptr && !m_bCapture) { if ( !m_buttonDown->EventProcess(event) ) return false; } - if ( event.type == m_eventUp && m_step > 0.0f ) + if (m_buttonUp != nullptr && event.type == m_buttonUp->GetEventType() && m_step > 0.0f ) { m_visibleValue -= m_step; if ( m_visibleValue < 0.0f ) m_visibleValue = 0.0f; @@ -221,7 +204,7 @@ bool CScroll::EventProcess(const Event &event) m_event->AddEvent(Event(m_eventType)); } - if ( event.type == m_eventDown && m_step > 0.0f ) + if (m_buttonDown != nullptr && event.type == m_buttonDown->GetEventType() && m_step > 0.0f ) { m_visibleValue += m_step; if ( m_visibleValue > 1.0f ) m_visibleValue = 1.0f; @@ -230,7 +213,7 @@ bool CScroll::EventProcess(const Event &event) m_event->AddEvent(Event(m_eventType)); } - hButton = m_buttonUp?m_dim.x/0.75f:0.0f; + float hButton = (m_buttonUp != nullptr) ? (m_dim.x/0.75f) : 0.0f; if (event.type == EVENT_MOUSE_BUTTON_DOWN && event.GetData()->button == MOUSE_BUTTON_LEFT && @@ -239,6 +222,8 @@ bool CScroll::EventProcess(const Event &event) { if ( CControl::Detect(event.mousePos) ) { + Math::Point pos, dim; + pos.y = m_pos.y+hButton; dim.y = m_dim.y-hButton*2.0f; pos.y += dim.y*(1.0f-m_visibleRatio)*(1.0f-m_visibleValue); @@ -246,8 +231,8 @@ bool CScroll::EventProcess(const Event &event) if ( event.mousePos.y < pos.y || event.mousePos.y > pos.y+dim.y ) // click outside cabin? { - h = (m_dim.y-hButton*2.0f)*(1.0f-m_visibleRatio); - value = 1.0f-(event.mousePos.y-(m_pos.y+hButton+dim.y*0.5f))/h; + float h = (m_dim.y-hButton*2.0f)*(1.0f-m_visibleRatio); + float value = 1.0f-(event.mousePos.y-(m_pos.y+hButton+dim.y*0.5f))/h; if ( value < 0.0f ) value = 0.0f; if ( value > 1.0f ) value = 1.0f; m_visibleValue = value; @@ -263,10 +248,10 @@ bool CScroll::EventProcess(const Event &event) if ( event.type == EVENT_MOUSE_MOVE && m_bCapture ) { - h = (m_dim.y-hButton*2.0f)*(1.0f-m_visibleRatio); + float h = (m_dim.y-hButton*2.0f)*(1.0f-m_visibleRatio); if ( h != 0 ) { - value = m_pressValue - (event.mousePos.y-m_pressPos.y)/h; + float value = m_pressValue - (event.mousePos.y-m_pressPos.y)/h; if ( value < 0.0f ) value = 0.0f; if ( value > 1.0f ) value = 1.0f; @@ -351,11 +336,11 @@ void CScroll::Draw() } } - if ( m_buttonUp != 0 ) + if (m_buttonUp != nullptr) { m_buttonUp->Draw(); } - if ( m_buttonDown != 0 ) + if (m_buttonDown != nullptr) { m_buttonDown->Draw(); } @@ -457,5 +442,5 @@ float CScroll::GetArrowStep() return m_step; } -} +} // namespace Ui diff --git a/src/ui/controls/scroll.h b/src/ui/controls/scroll.h index ccb02d24..ac0ed59b 100644 --- a/src/ui/controls/scroll.h +++ b/src/ui/controls/scroll.h @@ -26,6 +26,8 @@ #include "ui/controls/control.h" +#include + namespace Ui { @@ -68,8 +70,8 @@ protected: void DrawVertex(Math::Point pos, Math::Point dim, int icon); protected: - CButton* m_buttonUp; - CButton* m_buttonDown; + std::unique_ptr m_buttonUp; + std::unique_ptr m_buttonDown; float m_visibleValue; float m_visibleRatio; @@ -78,11 +80,8 @@ protected: bool m_bCapture; Math::Point m_pressPos; float m_pressValue; - - EventType m_eventUp; - EventType m_eventDown; }; -} +} // namespace Ui diff --git a/src/ui/controls/slider.cpp b/src/ui/controls/slider.cpp index 8a46b537..b713bf26 100644 --- a/src/ui/controls/slider.cpp +++ b/src/ui/controls/slider.cpp @@ -45,9 +45,6 @@ const float HOLE_WIDTH = (5.0f/480.0f); CSlider::CSlider() : CControl() { - m_buttonLeft = 0; - m_buttonRight = 0; - m_min = 0.0f; m_max = 1.0f; m_visibleValue = 0.0f; @@ -56,18 +53,14 @@ CSlider::CSlider() : CControl() m_marginButton = 0.0f; m_bHoriz = false; - m_eventUp = EVENT_NULL; - m_eventDown = EVENT_NULL; - m_bCapture = false; + m_pressValue = 0.0f; } // Object's destructor. CSlider::~CSlider() { - delete m_buttonLeft; - delete m_buttonRight; } @@ -104,40 +97,32 @@ void CSlider::MoveAdjust() if ( ( m_bHoriz && m_dim.x < m_dim.y*4.0f) || (!m_bHoriz && m_dim.y < m_dim.x*4.0f) ) // very short slider? { - delete m_buttonLeft; - m_buttonLeft = 0; - - delete m_buttonRight; - m_buttonRight = 0; - + m_buttonLeft.reset(); + m_buttonRight.reset(); m_marginButton = 0.0f; } else { -#if 1 - if ( m_buttonLeft == 0 ) + if (m_buttonLeft == nullptr) { - m_buttonLeft = new CButton(); + m_buttonLeft = MakeUnique(); m_buttonLeft->Create(Math::Point(0.0f, 0.0f), Math::Point(0.0f, 0.0f), m_bHoriz?55:49, EVENT_NULL); // SetRepeat(true); if ( m_state & STATE_SHADOW ) m_buttonLeft->SetState(STATE_SHADOW); - m_eventUp = m_buttonLeft->GetEventType(); } - if ( m_buttonRight == 0 ) + if (m_buttonRight == nullptr) { - m_buttonRight = new CButton(); + m_buttonRight = MakeUnique(); m_buttonRight->Create(Math::Point(0.0f, 0.0f), Math::Point(0.0f, 0.0f), m_bHoriz?48:50, EVENT_NULL); // >/v m_buttonRight->SetRepeat(true); if ( m_state & STATE_SHADOW ) m_buttonRight->SetState(STATE_SHADOW); - m_eventDown = m_buttonRight->GetEventType(); } m_marginButton = m_bHoriz?(m_dim.y*0.75f):(m_dim.x/0.75f); -#endif } - if ( m_buttonLeft != 0 ) + if (m_buttonLeft != nullptr) { if ( m_bHoriz ) { @@ -157,7 +142,7 @@ void CSlider::MoveAdjust() m_buttonLeft->SetDim(dim); } - if ( m_buttonRight != 0 ) + if (m_buttonRight != nullptr) { if ( m_bHoriz ) { @@ -211,8 +196,8 @@ bool CSlider::SetState(int state, bool bState) if ( (state & STATE_ENABLE) || (state & STATE_SHADOW) ) { - if ( m_buttonLeft != 0 ) m_buttonLeft->SetState(state, bState); - if ( m_buttonRight != 0 ) m_buttonRight->SetState(state, bState); + if (m_buttonLeft != nullptr) m_buttonLeft->SetState(state, bState); + if (m_buttonRight != nullptr) m_buttonRight->SetState(state, bState); } return CControl::SetState(state, bState); @@ -223,8 +208,8 @@ bool CSlider::SetState(int state) if ( (state & STATE_ENABLE) || (state & STATE_SHADOW) ) { - if ( m_buttonLeft != 0 ) m_buttonLeft->SetState(state); - if ( m_buttonRight != 0 ) m_buttonRight->SetState(state); + if (m_buttonLeft != nullptr) m_buttonLeft->SetState(state); + if (m_buttonRight != nullptr) m_buttonRight->SetState(state); } return CControl::SetState(state); @@ -235,8 +220,8 @@ bool CSlider::ClearState(int state) if ( (state & STATE_ENABLE) || (state & STATE_SHADOW) ) { - if ( m_buttonLeft != 0 ) m_buttonLeft->ClearState(state); - if ( m_buttonRight != 0 ) m_buttonRight->ClearState(state); + if (m_buttonLeft != nullptr) m_buttonLeft->ClearState(state); + if (m_buttonRight != nullptr) m_buttonRight->ClearState(state); } return CControl::ClearState(state); @@ -254,16 +239,16 @@ bool CSlider::EventProcess(const Event &event) CControl::EventProcess(event); - if ( m_buttonLeft != 0 && !m_bCapture ) + if (m_buttonLeft != nullptr && !m_bCapture) { if ( !m_buttonLeft->EventProcess(event) ) return false; } - if ( m_buttonRight != 0 && !m_bCapture ) + if (m_buttonRight != nullptr && !m_bCapture) { if ( !m_buttonRight->EventProcess(event) ) return false; } - if ( event.type == m_eventUp && m_step > 0.0f ) + if (m_buttonLeft != nullptr && event.type == m_buttonLeft->GetEventType() && m_step > 0.0f ) { m_visibleValue -= m_bHoriz?m_step:-m_step; if ( m_visibleValue < 0.0f ) m_visibleValue = 0.0f; @@ -273,7 +258,7 @@ bool CSlider::EventProcess(const Event &event) m_event->AddEvent(Event(m_eventType)); } - if ( event.type == m_eventDown && m_step > 0.0f ) + if (m_buttonRight != nullptr && event.type == m_buttonRight->GetEventType() && m_step > 0.0f ) { m_visibleValue += m_bHoriz?m_step:-m_step; if ( m_visibleValue < 0.0f ) m_visibleValue = 0.0f; @@ -382,7 +367,7 @@ void CSlider::Draw() if ( (m_state & STATE_VISIBLE) == 0 ) return; - if ( m_buttonLeft != 0 ) + if (m_buttonLeft != nullptr) { m_buttonLeft->Draw(); } @@ -451,7 +436,7 @@ void CSlider::Draw() DrawVertex(ppos, ddim, 2); } - if ( m_buttonRight != 0 ) + if (m_buttonRight != nullptr) { m_buttonRight->Draw(); } diff --git a/src/ui/controls/slider.h b/src/ui/controls/slider.h index c168190f..c64254fa 100644 --- a/src/ui/controls/slider.h +++ b/src/ui/controls/slider.h @@ -23,6 +23,8 @@ #include "ui/controls/control.h" +#include + namespace Ui { @@ -61,8 +63,8 @@ protected: virtual std::string GetLabel(); protected: - CButton* m_buttonLeft; - CButton* m_buttonRight; + std::unique_ptr m_buttonLeft; + std::unique_ptr m_buttonRight; float m_min; float m_max; @@ -75,9 +77,6 @@ protected: bool m_bCapture; Math::Point m_pressPos; float m_pressValue; - - EventType m_eventUp; - EventType m_eventDown; }; diff --git a/src/ui/controls/window.cpp b/src/ui/controls/window.cpp index 010fca9b..699519ef 100644 --- a/src/ui/controls/window.cpp +++ b/src/ui/controls/window.cpp @@ -20,6 +20,7 @@ #include "ui/controls/window.h" +#include namespace Ui @@ -28,13 +29,6 @@ namespace Ui CWindow::CWindow() : CControl() { - int i; - - for ( i=0 ; i +ControlClass* CWindow::CreateControl(Math::Point pos, Math::Point dim, int icon, EventType eventMsg) +{ + auto control = MakeUnique(); + control->Create(pos, dim, icon, eventMsg); + auto* controlPtr = control.get(); + m_controls.push_back(std::move(control)); + return controlPtr; +} + // Creates a new button. CButton* CWindow::CreateButton(Math::Point pos, Math::Point dim, int icon, EventType eventMsg) { - CButton* pc; - int i; - - if ( eventMsg == EVENT_NULL ) eventMsg = GetUniqueEventType(); - - for ( i=0 ; i(m_table[i]); - pc->Create(pos, dim, icon, eventMsg); - return pc; - } - } - return 0; + return CreateControl(pos, dim, icon, eventMsg); } // Creates a new button. CColor* CWindow::CreateColor(Math::Point pos, Math::Point dim, int icon, EventType eventMsg) { - CColor* pc; - int i; - - if ( eventMsg == EVENT_NULL ) eventMsg = GetUniqueEventType(); - - for ( i=0 ; i(m_table[i]); - pc->Create(pos, dim, icon, eventMsg); - return pc; - } - } - return 0; + return CreateControl(pos, dim, icon, eventMsg); } // Creates a new button. CCheck* CWindow::CreateCheck(Math::Point pos, Math::Point dim, int icon, EventType eventMsg) { - CCheck* pc; - int i; - - if ( eventMsg == EVENT_NULL ) eventMsg = GetUniqueEventType(); - - for ( i=0 ; i(m_table[i]); - pc->Create(pos, dim, icon, eventMsg); - return pc; - } - } - return 0; + return CreateControl(pos, dim, icon, eventMsg); } // Creates a new button. CKey* CWindow::CreateKey(Math::Point pos, Math::Point dim, int icon, EventType eventMsg) { - CKey* pc; - int i; - - if ( eventMsg == EVENT_NULL ) eventMsg = GetUniqueEventType(); - - for ( i=0 ; i(m_table[i]); - pc->Create(pos, dim, icon, eventMsg); - return pc; - } - } - return 0; + return CreateControl(pos, dim, icon, eventMsg); } // Creates a new button. CGroup* CWindow::CreateGroup(Math::Point pos, Math::Point dim, int icon, EventType eventMsg) { - CGroup* pc; - int i; - - if ( eventMsg == EVENT_NULL ) eventMsg = GetUniqueEventType(); - - for ( i=0 ; i(m_table[i]); - pc->Create(pos, dim, icon, eventMsg); - return pc; - } - } - return 0; + return CreateControl(pos, dim, icon, eventMsg); } // Creates a new button. CImage* CWindow::CreateImage(Math::Point pos, Math::Point dim, int icon, EventType eventMsg) { - CImage* pc; - int i; - - if ( eventMsg == EVENT_NULL ) eventMsg = GetUniqueEventType(); - - for ( i=0 ; i(m_table[i]); - pc->Create(pos, dim, icon, eventMsg); - return pc; - } - } - return 0; + return CreateControl(pos, dim, icon, eventMsg); } // Creates a new label. CLabel* CWindow::CreateLabel(Math::Point pos, Math::Point dim, int icon, EventType eventMsg, std::string name) { - CLabel* pc; - int i; + CLabel* label = CreateControl(pos, dim, icon, eventMsg); - if ( eventMsg == EVENT_NULL ) eventMsg = GetUniqueEventType(); + auto p = name.find("\\"); + if (p == std::string::npos) + label->SetName(name); + else + label->SetName(name.substr(0, p)); - for ( i=0 ; i(m_table[i]); - pc->Create(pos, dim, icon, eventMsg); - - auto p = name.find("\\"); - if ( p == std::string::npos ) - pc->SetName(name); - else - pc->SetName(name.substr(0, p)); - return pc; - } - } - return 0; + return label; } // Creates a new editable pave. CEdit* CWindow::CreateEdit(Math::Point pos, Math::Point dim, int icon, EventType eventMsg) { - CEdit* pc; - int i; - - if ( eventMsg == EVENT_NULL ) eventMsg = GetUniqueEventType(); - - for ( i=0 ; i(m_table[i]); - pc->Create(pos, dim, icon, eventMsg); - return pc; - } - } - return 0; + return CreateControl(pos, dim, icon, eventMsg); } // Creates a new editable pave. CEditValue* CWindow::CreateEditValue(Math::Point pos, Math::Point dim, int icon, EventType eventMsg) { - CEditValue* pc; - int i; - - if ( eventMsg == EVENT_NULL ) eventMsg = GetUniqueEventType(); - - for ( i=0 ; i(m_table[i]); - pc->Create(pos, dim, icon, eventMsg); - return pc; - } - } - return 0; + return CreateControl(pos, dim, icon, eventMsg); } // Creates a new elevator. CScroll* CWindow::CreateScroll(Math::Point pos, Math::Point dim, int icon, EventType eventMsg) { - CScroll* pc; - int i; + if (eventMsg == EVENT_NULL) + eventMsg = GetUniqueEventType(); - if ( eventMsg == EVENT_NULL ) eventMsg = GetUniqueEventType(); - - for ( i=0 ; i(m_table[i]); - pc->Create(pos, dim, icon, eventMsg); - return pc; - } - } - return 0; + return CreateControl(pos, dim, icon, eventMsg); } // Creates a new cursor. CSlider* CWindow::CreateSlider(Math::Point pos, Math::Point dim, int icon, EventType eventMsg) { - CSlider* pc; - int i; + if (eventMsg == EVENT_NULL) + eventMsg = GetUniqueEventType(); - if ( eventMsg == EVENT_NULL ) eventMsg = GetUniqueEventType(); - - for ( i=0 ; i(m_table[i]); - pc->Create(pos, dim, icon, eventMsg); - return pc; - } - } - return 0; + return CreateControl(pos, dim, icon, eventMsg); } CEnumSlider* CWindow::CreateEnumSlider(Math::Point pos, Math::Point dim, int icon, EventType eventMsg) { - CEnumSlider* pc; - int i; + if (eventMsg == EVENT_NULL) + eventMsg = GetUniqueEventType(); - if ( eventMsg == EVENT_NULL ) eventMsg = GetUniqueEventType(); - - for ( i=0 ; i(m_table[i]); - pc->Create(pos, dim, icon, eventMsg); - return pc; - } - } - return 0; + return CreateControl(pos, dim, icon, eventMsg); } // Creates a new list. @@ -368,175 +191,99 @@ CEnumSlider* CWindow::CreateEnumSlider(Math::Point pos, Math::Point dim, int ico // and try to scale items to some size, so that dim of the list would not change after // adjusting -CList* CWindow::CreateList(Math::Point pos, Math::Point dim, int icon, EventType eventMsg, - float expand) +CList* CWindow::CreateList(Math::Point pos, Math::Point dim, int icon, EventType eventMsg, float expand) { - CList* pc; - int i; + if (eventMsg == EVENT_NULL) + eventMsg = GetUniqueEventType(); - if ( eventMsg == EVENT_NULL ) eventMsg = GetUniqueEventType(); - - for ( i=0 ; i(m_table[i]); - pc->Create(pos, dim, icon, eventMsg, expand); - return pc; - } - } - return 0; + auto list = MakeUnique(); + list->Create(pos, dim, icon, eventMsg, expand); + auto* listPtr = list.get(); + m_controls.push_back(std::move(list)); + return listPtr; } // Creates a new shortcut. CShortcut* CWindow::CreateShortcut(Math::Point pos, Math::Point dim, int icon, EventType eventMsg) { - CShortcut* ps; - int i; + if (eventMsg == EVENT_NULL) + eventMsg = GetUniqueEventType(); - if ( eventMsg == EVENT_NULL ) eventMsg = GetUniqueEventType(); - - for ( i=0 ; i(m_table[i]); - ps->Create(pos, dim, icon, eventMsg); - return ps; - } - } - return 0; + return CreateControl(pos, dim, icon, eventMsg); } // Creates a new card. CMap* CWindow::CreateMap(Math::Point pos, Math::Point dim, int icon, EventType eventMsg) { - CMap* pm; - int i; + if (eventMsg == EVENT_NULL) + eventMsg = GetUniqueEventType(); - if ( eventMsg == EVENT_NULL ) eventMsg = GetUniqueEventType(); - - for ( i=0 ; i(m_table[i]); - pm->Create(pos, dim, icon, eventMsg); - return pm; - } - } - return 0; + return CreateControl(pos, dim, icon, eventMsg); } // Creates a new gauge. CGauge* CWindow::CreateGauge(Math::Point pos, Math::Point dim, int icon, EventType eventMsg) { - CGauge* pc; - int i; + if (eventMsg == EVENT_NULL) + eventMsg = GetUniqueEventType(); - if ( eventMsg == EVENT_NULL ) eventMsg = GetUniqueEventType(); - - for ( i=0 ; i(m_table[i]); - pc->Create(pos, dim, icon, eventMsg); - return pc; - } - } - return 0; + return CreateControl(pos, dim, icon, eventMsg); } // Creates a new compass. CCompass* CWindow::CreateCompass(Math::Point pos, Math::Point dim, int icon, EventType eventMsg) { - CCompass* pc; - int i; + if (eventMsg == EVENT_NULL) + eventMsg = GetUniqueEventType(); - if ( eventMsg == EVENT_NULL ) eventMsg = GetUniqueEventType(); - - for ( i=0 ; i(m_table[i]); - pc->Create(pos, dim, icon, eventMsg); - return pc; - } - } - return 0; + return CreateControl(pos, dim, icon, eventMsg); } // Creates a new target. CTarget* CWindow::CreateTarget(Math::Point pos, Math::Point dim, int icon, EventType eventMsg) { - CTarget* pc; - int i; + if (eventMsg == EVENT_NULL) + eventMsg = GetUniqueEventType(); - if ( eventMsg == EVENT_NULL ) eventMsg = GetUniqueEventType(); - - for ( i=0 ; i(m_table[i]); - pc->Create(pos, dim, icon, eventMsg); - return pc; - } - } - return 0; + return CreateControl(pos, dim, icon, eventMsg); } // Removes a control. bool CWindow::DeleteControl(EventType eventMsg) { - int i; + auto controlIt = std::find_if(m_controls.begin(), m_controls.end(), + [eventMsg](const std::unique_ptr& control) + { + return control->GetEventType() == eventMsg; + }); - for ( i=0 ; iGetEventType() ) - { - delete m_table[i]; - m_table[i] = 0; - return true; - } - } - } - return false; + if (controlIt == m_controls.end()) + return false; + + m_controls.erase(controlIt); + return true; } // Gives a control. CControl* CWindow::SearchControl(EventType eventMsg) { - int i; + auto controlIt = std::find_if(m_controls.begin(), m_controls.end(), + [eventMsg](const std::unique_ptr& control) + { + return control->GetEventType() == eventMsg; + }); - for ( i=0 ; iGetEventType() ) - { - return m_table[i]; - } - } - } - return 0; + if (controlIt == m_controls.end()) + return nullptr; + + return controlIt->get(); } @@ -544,31 +291,24 @@ CControl* CWindow::SearchControl(EventType eventMsg) bool CWindow::GetTooltip(Math::Point pos, std::string &name) { - int i; - - for ( i=MAXWINDOW-1 ; i>=0 ; i-- ) + for (auto& control : m_controls) { - if ( m_table[i] != 0 ) - { - if ( m_table[i]->GetTooltip(pos, name) ) - { - return true; - } - } + if (control->GetTooltip(pos, name)) + return true; } - if ( m_buttonClose != 0 && - m_buttonClose->GetTooltip(pos, name) ) + if (m_buttonClose != nullptr && + m_buttonClose->GetTooltip(pos, name)) { return true; } - if ( m_buttonFull != 0 && - m_buttonFull->GetTooltip(pos, name) ) + if (m_buttonFull != nullptr && + m_buttonFull->GetTooltip(pos, name)) { return true; } - if ( m_buttonReduce != 0 && - m_buttonReduce->GetTooltip(pos, name) ) + if (m_buttonReduce != nullptr && + m_buttonReduce->GetTooltip(pos, name)) { return true; } @@ -587,40 +327,29 @@ bool CWindow::GetTooltip(Math::Point pos, std::string &name) void CWindow::SetName(std::string name, bool tooltip) { - CButton* pc; - bool bAdjust; - CControl::SetName(name, tooltip); - delete m_buttonReduce; - m_buttonReduce = nullptr; + m_buttonReduce.reset(); + m_buttonFull.reset(); + m_buttonClose.reset(); - delete m_buttonFull; - m_buttonFull = nullptr; - - delete m_buttonClose; - m_buttonClose = nullptr; - - bAdjust = false; + bool bAdjust = false; if ( m_name.length() > 0 && m_bRedim ) // title bar exists? { - m_buttonReduce = new CButton(); - pc = m_buttonReduce; - pc->Create(m_pos, m_dim, 0, EVENT_NULL); + m_buttonReduce = MakeUnique(); + m_buttonReduce->Create(m_pos, m_dim, 0, EVENT_NULL); - m_buttonFull = new CButton(); - pc = m_buttonFull; - pc->Create(m_pos, m_dim, 0, EVENT_NULL); + m_buttonFull = MakeUnique(); + m_buttonFull->Create(m_pos, m_dim, 0, EVENT_NULL); bAdjust = true; } if ( m_name.length() > 0 && m_bClosable ) // title bar exists? { - m_buttonClose = new CButton(); - pc = m_buttonClose; - pc->Create(m_pos, m_dim, 0, EVENT_NULL); + m_buttonClose = MakeUnique(); + m_buttonClose->Create(m_pos, m_dim, 0, EVENT_NULL); bAdjust = true; } @@ -653,15 +382,15 @@ void CWindow::SetDim(Math::Point dim) void CWindow::MoveAdjust() { - Math::Point pos, dim; - float h, offset; - - h = m_engine->GetText()->GetHeight(m_fontType, m_fontSize); + float h = m_engine->GetText()->GetHeight(m_fontType, m_fontSize); + Math::Point dim; dim.y = h*1.2f; dim.x = dim.y*0.75f; - if ( m_buttonClose != 0 ) + float offset = 0.0f; + if (m_buttonClose != nullptr) { + Math::Point pos; pos.x = m_pos.x+m_dim.x-0.01f-dim.x; pos.y = m_pos.y+m_dim.y-0.01f-h*1.2f; m_buttonClose->SetPos(pos); @@ -673,16 +402,18 @@ void CWindow::MoveAdjust() offset = 0.0f; } - if ( m_buttonFull != 0 ) + if (m_buttonFull != nullptr) { + Math::Point pos; pos.x = m_pos.x+m_dim.x-0.01f-dim.x-offset; pos.y = m_pos.y+m_dim.y-0.01f-h*1.2f; m_buttonFull->SetPos(pos); m_buttonFull->SetDim(dim); } - if ( m_buttonReduce != 0 ) + if (m_buttonReduce != nullptr) { + Math::Point pos; pos.x = m_pos.x+m_dim.x-0.01f-dim.x*2.0f-offset; pos.y = m_pos.y+m_dim.y-0.01f-h*1.2f; m_buttonReduce->SetPos(pos); @@ -790,7 +521,7 @@ void CWindow::AdjustButtons() { std::string res; - if ( m_buttonFull != 0 ) + if (m_buttonFull != nullptr) { if ( m_bMaximized ) { @@ -806,7 +537,7 @@ void CWindow::AdjustButtons() } } - if ( m_buttonReduce != 0 ) + if (m_buttonReduce != nullptr) { if ( m_bMinimized ) { @@ -822,7 +553,7 @@ void CWindow::AdjustButtons() } } - if ( m_buttonClose != 0 ) + if (m_buttonClose != nullptr) { m_buttonClose->SetIcon(11); // x GetResource(RES_TEXT, RT_WINDOW_CLOSE, res); @@ -846,7 +577,7 @@ bool CWindow::GetTrashEvent() EventType CWindow::GetEventTypeReduce() { - if ( m_buttonReduce == 0 ) return EVENT_NULL; + if (m_buttonReduce == nullptr) return EVENT_NULL; return m_buttonReduce->GetEventType(); } @@ -854,7 +585,7 @@ EventType CWindow::GetEventTypeReduce() EventType CWindow::GetEventTypeFull() { - if ( m_buttonFull == 0 ) return EVENT_NULL; + if (m_buttonFull == nullptr) return EVENT_NULL; return m_buttonFull->GetEventType(); } @@ -862,7 +593,7 @@ EventType CWindow::GetEventTypeFull() EventType CWindow::GetEventTypeClose() { - if ( m_buttonClose == 0 ) return EVENT_NULL; + if (m_buttonClose == nullptr) return EVENT_NULL; return m_buttonClose->GetEventType(); } @@ -923,9 +654,6 @@ int CWindow::BorderDetect(Math::Point pos) bool CWindow::EventProcess(const Event &event) { - Math::Point pos; - int i, flags; - if ( event.type == EVENT_MOUSE_MOVE ) { if ( m_bCapture ) @@ -939,7 +667,7 @@ bool CWindow::EventProcess(const Event &event) if ( m_name.length() > 0 && m_bMovable && // title bar? Detect(event.mousePos) ) { - flags = BorderDetect(event.mousePos); + int flags = BorderDetect(event.mousePos); if ( flags == -1 ) { m_pressMouse = Gfx::ENG_MOUSE_MOVE; // + @@ -973,26 +701,21 @@ bool CWindow::EventProcess(const Event &event) if ( !m_bCapture ) { - for ( i=MAXWINDOW-1 ; i>=0 ; i-- ) + for (auto& control : m_controls) { - if ( m_table[i] != 0 ) - { - if ( !m_table[i]->EventProcess(event) ) - { - return false; - } - } + if (! control->EventProcess(event)) + return false; } - if ( m_buttonReduce != 0 ) + if (m_buttonReduce != nullptr) { m_buttonReduce->EventProcess(event); } - if ( m_buttonFull != 0 ) + if (m_buttonFull != nullptr) { m_buttonFull->EventProcess(event); } - if ( m_buttonClose != 0 ) + if (m_buttonClose != nullptr) { m_buttonClose->EventProcess(event); } @@ -1019,7 +742,7 @@ bool CWindow::EventProcess(const Event &event) if ( event.type == EVENT_MOUSE_MOVE && m_bCapture ) { - pos = event.mousePos; + Math::Point pos = event.mousePos; if ( m_pressFlags == -1 ) // all moves? { m_pos.x += pos.x-m_pressPos.x; @@ -1070,7 +793,7 @@ bool CWindow::EventProcess(const Event &event) if (event.type == EVENT_MOUSE_BUTTON_UP && event.GetData()->button == MOUSE_BUTTON_LEFT && - m_bCapture ) + m_bCapture) { m_bCapture = false; } @@ -1083,10 +806,6 @@ bool CWindow::EventProcess(const Event &event) void CWindow::Draw() { - Math::Point pos, dim; - float width, h, sw; - int i; - if ( (m_state & STATE_VISIBLE) == 0 ) return; if ( m_state & STATE_SHADOW ) @@ -1098,8 +817,9 @@ void CWindow::Draw() if ( m_name.length() > 0 ) // title bar? { - h = m_engine->GetText()->GetHeight(m_fontType, m_fontSize); + float h = m_engine->GetText()->GetHeight(m_fontType, m_fontSize); + Math::Point pos, dim; // Draws the shadow under the title bar. { Math::Point sPos, sDim; @@ -1111,7 +831,7 @@ void CWindow::Draw() DrawShadow(pos, dim); } - width = m_dim.x; + float width = m_dim.x; if ( m_bRedim ) width -= h*1.2f*0.75f*2.0f; if ( m_bClosable ) width -= h*1.2f*0.75f; @@ -1121,7 +841,7 @@ void CWindow::Draw() dim.y = h*1.2f; DrawVertex(pos, dim, (m_state&STATE_ENABLE)?2:9); - sw = m_engine->GetText()->GetStringWidth(m_name, m_fontType, m_fontSize); + float sw = m_engine->GetText()->GetStringWidth(m_name, m_fontType, m_fontSize); if ( m_state&STATE_ENABLE ) { @@ -1138,28 +858,25 @@ void CWindow::Draw() pos.y = m_pos.y+m_dim.y-0.01f-h*1.10f; m_engine->GetText()->DrawText(m_name, m_fontType, m_fontSize, pos, width, Gfx::TEXT_ALIGN_CENTER, 0); - if ( m_buttonReduce != 0 ) + if (m_buttonReduce != nullptr) { m_buttonReduce->Draw(); } - if ( m_buttonFull != 0 ) + if (m_buttonFull != nullptr) { m_buttonFull->Draw(); } - if ( m_buttonClose != 0 ) + if (m_buttonClose != nullptr) { m_buttonClose->Draw(); } } - for ( i=0 ; iDraw(); - } + control->Draw(); } } diff --git a/src/ui/controls/window.h b/src/ui/controls/window.h index 9327c67f..937ee891 100644 --- a/src/ui/controls/window.h +++ b/src/ui/controls/window.h @@ -43,14 +43,13 @@ #include "ui/controls/slider.h" #include "ui/controls/target.h" +#include #include +#include namespace Ui { -const int MAXWINDOW = 100; - - class CWindow : public CControl { public: @@ -125,9 +124,11 @@ protected: void MoveAdjust(); void DrawVertex(Math::Point pos, Math::Point dim, int icon); void DrawHach(Math::Point pos, Math::Point dim); + template + ControlClass* CreateControl(Math::Point pos, Math::Point dim, int icon, EventType eventMsg); protected: - CControl* m_table[MAXWINDOW]; + std::vector> m_controls; bool m_bTrashEvent; bool m_bMaximized; @@ -137,9 +138,9 @@ protected: Math::Point m_minDim; Math::Point m_maxDim; - CButton* m_buttonReduce; - CButton* m_buttonFull; - CButton* m_buttonClose; + std::unique_ptr m_buttonReduce; + std::unique_ptr m_buttonFull; + std::unique_ptr m_buttonClose; bool m_bMovable; bool m_bRedim; diff --git a/src/ui/displayinfo.cpp b/src/ui/displayinfo.cpp index 9ca98619..bf33ea63 100644 --- a/src/ui/displayinfo.cpp +++ b/src/ui/displayinfo.cpp @@ -75,6 +75,11 @@ CDisplayInfo::CDisplayInfo() m_lightSuppl = -1; m_toto = 0; + m_bSoluce = false; + m_initPause = PAUSE_NONE; + m_bEditLock = false; + m_infoCamera = Gfx::CAM_TYPE_NULL; + m_index = -1; } // Object's destructor. @@ -358,7 +363,7 @@ void CDisplayInfo::StartDisplayInfo(std::string filename, int index, bool bSoluc m_main->SetEditLock(true, false); m_main->SetEditFull(false); - m_bInitPause = m_pause->GetPauseType(); + m_initPause = m_pause->GetPauseType(); m_pause->SetPause(PAUSE_SATCOM); m_infoCamera = m_camera->GetType(); m_camera->SetType(Gfx::CAM_TYPE_INFO); @@ -834,7 +839,7 @@ void CDisplayInfo::StopDisplayInfo() } else { - m_pause->SetPause(m_bInitPause); + m_pause->SetPause(m_initPause); m_main->SetEditLock(false, false); } m_camera->SetType(m_infoCamera); diff --git a/src/ui/displayinfo.h b/src/ui/displayinfo.h index d24cbb2c..7712640b 100644 --- a/src/ui/displayinfo.h +++ b/src/ui/displayinfo.h @@ -94,7 +94,7 @@ protected: Math::Point m_infoFinalDim; int m_lightSuppl; bool m_bEditLock; - PauseType m_bInitPause; + PauseType m_initPause; bool m_bSoluce; CObject* m_toto; }; diff --git a/src/ui/displaytext.cpp b/src/ui/displaytext.cpp index 54d38923..03fd9ab3 100644 --- a/src/ui/displaytext.cpp +++ b/src/ui/displaytext.cpp @@ -43,7 +43,11 @@ namespace Ui { + +namespace +{ const float FONTSIZE = 12.0f; +} // anonymous namespace @@ -55,15 +59,6 @@ CDisplayText::CDisplayText() m_interface = CRobotMain::GetInstancePointer()->GetInterface(); m_sound = CApplication::GetInstancePointer()->GetSound(); - for (int i=0 ; iGetPause()) return true; - if ( m_engine->GetPause() ) return true; - - if ( event.type == EVENT_FRAME ) + if (event.type == EVENT_FRAME) { - for ( i=0 ; i 0.0f ) break; - if ( !ClearLastText() ) break; + if (!m_textLines.front().exist || + m_textLines.front().time > 0.0f) + { + break; + } + + if (!ClearLastText()) + break; } } @@ -115,14 +114,12 @@ bool CDisplayText::EventProcess(const Event &event) void CDisplayText::DisplayError(Error err, CObject* pObj, float time) { - Math::Vector pos; - float h, d; + if (pObj == nullptr) + return; - if ( pObj == 0 ) return; - - pos = pObj->GetPosition(); - h = GetIdealHeight(pObj); - d = GetIdealDist(pObj); + Math::Vector pos = pObj->GetPosition(); + float h = GetIdealHeight(pObj); + float d = GetIdealDist(pObj); DisplayError(err, pos, h, d, time); } @@ -175,14 +172,11 @@ void CDisplayText::DisplayError(Error err, Math::Vector goal, float height, void CDisplayText::DisplayText(const char *text, CObject* pObj, float time, TextType type) { - Math::Vector pos; - float h, d; + if (pObj == nullptr) return; - if ( pObj == 0 ) return; - - pos = pObj->GetPosition(); - h = GetIdealHeight(pObj); - d = GetIdealDist(pObj); + Math::Vector pos = pObj->GetPosition(); + float h = GetIdealHeight(pObj); + float d = GetIdealDist(pObj); DisplayText(text, pos, h, d, time, type); } @@ -264,11 +258,13 @@ void CDisplayText::DisplayText(const char *text, Math::Vector goal, float height button->ClearState(STATE_ENABLE); } - m_bExist[nLine] = true; - m_visitGoal[nLine] = goal; - m_visitDist[nLine] = dist; - m_visitHeight[nLine] = height; - m_time[nLine] = time*m_delayFactor; + TextLine line; + line.exist = true; + line.visitGoal = goal; + line.visitDist = dist; + line.visitHeight = height; + line.time = time*m_delayFactor; + m_textLines[nLine] = line; toto = SearchToto(); if ( toto != 0 ) @@ -318,24 +314,18 @@ void CDisplayText::DisplayText(const char *text, Math::Vector goal, float height void CDisplayText::ClearText() { - Ui::CWindow* pw; - int i; + Ui::CWindow* pw = static_cast(m_interface->SearchControl(EVENT_WINDOW2)); - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW2)); - - for ( i=0 ; iDeleteControl(EventType(EVENT_DT_GROUP0+i)); pw->DeleteControl(EventType(EVENT_DT_LABEL0+i)); pw->DeleteControl(EventType(EVENT_DT_VISIT0+i)); } - m_bExist[i] = false; - m_visitGoal[i] = Math::Vector(0.0f, 0.0f, 0.0f); - m_visitDist[i] = 0.0f; - m_visitHeight[i] = 0.0f; - m_time[i] = 0.0f; + + m_textLines[i] = TextLine(); } } @@ -415,16 +405,13 @@ bool CDisplayText::ClearLastText() pg1->SetIcon(pg2->GetIcon()); pl1->SetName(pl2->GetName()); - m_time[i] = m_time[i+1]; - m_visitGoal[i] = m_visitGoal[i+1]; - m_visitDist[i] = m_visitDist[i+1]; - m_visitHeight[i] = m_visitHeight[i+1]; // shift + m_textLines[i] = m_textLines[i+1]; } pw->DeleteControl(EventType(EVENT_DT_VISIT0+i)); pw->DeleteControl(EventType(EVENT_DT_GROUP0+i)); pw->DeleteControl(EventType(EVENT_DT_LABEL0+i)); - m_bExist[i] = false; + m_textLines[i].exist = false; return true; } @@ -449,33 +436,27 @@ void CDisplayText::SetEnable(bool bEnable) Math::Vector CDisplayText::GetVisitGoal(EventType event) { - int i; - - i = event-EVENT_DT_VISIT0; - if ( i < 0 || i >= MAXDTLINE ) return Math::Vector(0.0f, 0.0f, 0.0f); - return m_visitGoal[i]; + int i = event - EVENT_DT_VISIT0; + if (i < 0 || i >= MAXDTLINE) return Math::Vector(0.0f, 0.0f, 0.0f); + return m_textLines[i].visitGoal; } // Returns the distance during a visit. float CDisplayText::GetVisitDist(EventType event) { - int i; - - i = event-EVENT_DT_VISIT0; - if ( i < 0 || i >= MAXDTLINE ) return 0.0f; - return m_visitDist[i]; + int i = event-EVENT_DT_VISIT0; + if (i < 0 || i >= MAXDTLINE) return 0.0f; + return m_textLines[i].visitDist; } // Returns the height on a visit. float CDisplayText::GetVisitHeight(EventType event) { - int i; - - i = event-EVENT_DT_VISIT0; - if ( i < 0 || i >= MAXDTLINE ) return 0.0f; - return m_visitHeight[i]; + int i = event-EVENT_DT_VISIT0; + if (i < 0 || i >= MAXDTLINE) return 0.0f; + return m_textLines[i].visitHeight; } @@ -590,5 +571,5 @@ CObject* CDisplayText::SearchToto() return CObjectManager::GetInstancePointer()->FindNearest(nullptr, OBJECT_TOTO); } -} +} // namespace Ui diff --git a/src/ui/displaytext.h b/src/ui/displaytext.h index bfb1be07..eba49b94 100644 --- a/src/ui/displaytext.h +++ b/src/ui/displaytext.h @@ -21,16 +21,13 @@ #pragma once - #include "common/event.h" #include "common/global.h" -#include "sound/sound.h" - - +#include class CObject; -class CSound; +class CSoundInterface; namespace Gfx { @@ -92,11 +89,15 @@ protected: Ui::CInterface* m_interface; CSoundInterface* m_sound; - bool m_bExist[MAXDTLINE]; - float m_time[MAXDTLINE]; - Math::Vector m_visitGoal[MAXDTLINE]; - float m_visitDist[MAXDTLINE]; - float m_visitHeight[MAXDTLINE]; + struct TextLine + { + bool exist = false; + float time = 0.0f; + Math::Vector visitGoal; + float visitDist = 0.0f; + float visitHeight = 0.0f; + }; + std::array m_textLines; bool m_bHide; bool m_bEnable; diff --git a/src/ui/maindialog.cpp b/src/ui/maindialog.cpp index c94faebe..938328b6 100644 --- a/src/ui/maindialog.cpp +++ b/src/ui/maindialog.cpp @@ -55,6 +55,10 @@ CMainDialog::CMainDialog() m_settings = CSettings::GetInstancePointer(); m_dialogOpen = false; + m_dialogType = {}; + m_dialogFireParticles = false; + m_dialogTime = 0.0f; + m_dialogParti = 0.0f; } // Destructor of robot application. diff --git a/src/ui/maindialog.h b/src/ui/maindialog.h index f48adcb2..d679c360 100644 --- a/src/ui/maindialog.h +++ b/src/ui/maindialog.h @@ -80,7 +80,8 @@ protected: CSoundInterface* m_sound; CSettings* m_settings; - enum class DialogType { + enum class DialogType + { Question, PauseMenu }; diff --git a/src/ui/mainshort.cpp b/src/ui/mainshort.cpp index 09e16fdd..46ea9e22 100644 --- a/src/ui/mainshort.cpp +++ b/src/ui/mainshort.cpp @@ -44,6 +44,8 @@ CMainShort::CMainShort() m_interface = m_main->GetInterface(); m_shortcuts.clear(); + + m_bBuilding = false; } // Destructor of the application card. diff --git a/src/ui/mainui.cpp b/src/ui/mainui.cpp index 4248822b..84dfa3c4 100644 --- a/src/ui/mainui.cpp +++ b/src/ui/mainui.cpp @@ -93,12 +93,7 @@ CMainUserInterface::CMainUserInterface() m_glintMouse = Math::Point(0.0f, 0.0f); m_glintTime = 1000.0f; - - for (int i = 0; i < 10; i++) - { - m_partiPhase[i] = 0; - m_partiTime[i] = 0.0f; - } + m_shotDelay = 0; } // Destructor of robot application. @@ -552,27 +547,27 @@ void CMainUserInterface::FrameParticle(float rTime) for ( i=0 ; i<10 ; i++ ) { - if ( m_partiPhase[i] == 0 ) // waiting? + if ( m_particles[i].phase == 0 ) // waiting? { - m_partiTime[i] -= rTime; - if ( m_partiTime[i] <= 0.0f ) + m_particles[i].time -= rTime; + if ( m_particles[i].time <= 0.0f ) { r = rand()%3; if ( r == 0 ) { ii = rand()%nParti; - m_partiPos[i].x = pParti[ii*5+0]/640.0f; - m_partiPos[i].y = (480.0f-pParti[ii*5+1])/480.0f; - m_partiTime[i] = pParti[ii*5+2]+Math::Rand()*pParti[ii*5+3]; - m_partiPhase[i] = static_cast(pParti[ii*5+4]); - if ( m_partiPhase[i] == 3 ) + m_particles[i].pos.x = pParti[ii*5+0]/640.0f; + m_particles[i].pos.y = (480.0f-pParti[ii*5+1])/480.0f; + m_particles[i].time = pParti[ii*5+2]+Math::Rand()*pParti[ii*5+3]; + m_particles[i].phase = static_cast(pParti[ii*5+4]); + if ( m_particles[i].phase == 3 ) { - m_sound->Play(SOUND_PSHHH, SoundPos(m_partiPos[i]), 0.3f+Math::Rand()*0.3f); + m_sound->Play(SOUND_PSHHH, SoundPos(m_particles[i].pos), 0.3f+Math::Rand()*0.3f); } else { - m_sound->Play(SOUND_GGG, SoundPos(m_partiPos[i]), 0.1f+Math::Rand()*0.4f); + m_sound->Play(SOUND_GGG, SoundPos(m_particles[i].pos), 0.1f+Math::Rand()*0.4f); } } @@ -591,7 +586,7 @@ void CMainUserInterface::FrameParticle(float rTime) rand()%2?Gfx::PARTIGLINT:Gfx::PARTICONTROL, Math::Rand()*0.4f+0.4f, 0.0f, 0.0f, Gfx::SH_INTERFACE); - m_partiTime[i] = 0.5f+Math::Rand()*0.5f; + m_particles[i].time = 0.5f+Math::Rand()*0.5f; } if ( r == 2 ) @@ -600,51 +595,51 @@ void CMainUserInterface::FrameParticle(float rTime) if ( ii == 0 ) { m_sound->Play(SOUND_ENERGY, SoundRand(), 0.2f+Math::Rand()*0.2f); - m_partiTime[i] = 1.0f+Math::Rand()*1.0f; + m_particles[i].time = 1.0f+Math::Rand()*1.0f; } if ( ii == 1 ) { m_sound->Play(SOUND_STATION, SoundRand(), 0.2f+Math::Rand()*0.2f); - m_partiTime[i] = 1.0f+Math::Rand()*2.0f; + m_particles[i].time = 1.0f+Math::Rand()*2.0f; } if ( ii == 2 ) { m_sound->Play(SOUND_ALARM, SoundRand(), 0.1f+Math::Rand()*0.1f); - m_partiTime[i] = 2.0f+Math::Rand()*4.0f; + m_particles[i].time = 2.0f+Math::Rand()*4.0f; } if ( ii == 3 ) { m_sound->Play(SOUND_INFO, SoundRand(), 0.1f+Math::Rand()*0.1f); - m_partiTime[i] = 2.0f+Math::Rand()*4.0f; + m_particles[i].time = 2.0f+Math::Rand()*4.0f; } if ( ii == 4 ) { m_sound->Play(SOUND_RADAR, SoundRand(), 0.2f+Math::Rand()*0.2f); - m_partiTime[i] = 0.5f+Math::Rand()*1.0f; + m_particles[i].time = 0.5f+Math::Rand()*1.0f; } if ( ii == 5 ) { m_sound->Play(SOUND_GFLAT, SoundRand(), 0.3f+Math::Rand()*0.3f); - m_partiTime[i] = 2.0f+Math::Rand()*4.0f; + m_particles[i].time = 2.0f+Math::Rand()*4.0f; } if ( ii == 6 ) { m_sound->Play(SOUND_ALARMt, SoundRand(), 0.1f+Math::Rand()*0.1f); - m_partiTime[i] = 2.0f+Math::Rand()*4.0f; + m_particles[i].time = 2.0f+Math::Rand()*4.0f; } } } } - if ( m_partiPhase[i] != 0 ) // generates? + if ( m_particles[i].phase != 0 ) // generates? { - m_partiTime[i] -= rTime; - if ( m_partiTime[i] > 0.0f ) + m_particles[i].time -= rTime; + if ( m_particles[i].time > 0.0f ) { - if ( m_partiPhase[i] == 1 ) // sparks? + if ( m_particles[i].phase == 1 ) // sparks? { - pos.x = m_partiPos[i].x; - pos.y = m_partiPos[i].y; + pos.x = m_particles[i].pos.x; + pos.y = m_particles[i].pos.y; pos.z = 0.0f; pos.x += (Math::Rand()-0.5f)*0.01f; pos.y += (Math::Rand()-0.5f)*0.01f; @@ -656,8 +651,8 @@ void CMainUserInterface::FrameParticle(float rTime) m_particle->CreateParticle(pos, speed, dim, Gfx::PARTIBLITZ, Math::Rand()*0.2f+0.2f, 0.0f, 0.0f, Gfx::SH_INTERFACE); - pos.x = m_partiPos[i].x; - pos.y = m_partiPos[i].y; + pos.x = m_particles[i].pos.x; + pos.y = m_particles[i].pos.y; pos.z = 0.0f; speed.x = (Math::Rand()-0.5f)*0.5f; speed.y = (0.3f+Math::Rand()*0.3f); @@ -669,10 +664,10 @@ void CMainUserInterface::FrameParticle(float rTime) Math::Rand()*0.5f+0.5f, 2.0f, 0.0f, Gfx::SH_INTERFACE); } - if ( m_partiPhase[i] == 2 ) // sparks? + if ( m_particles[i].phase == 2 ) // sparks? { - pos.x = m_partiPos[i].x; - pos.y = m_partiPos[i].y; + pos.x = m_particles[i].pos.x; + pos.y = m_particles[i].pos.y; pos.z = 0.0f; pos.x += (Math::Rand()-0.5f)*0.01f; pos.y += (Math::Rand()-0.5f)*0.01f; @@ -684,8 +679,8 @@ void CMainUserInterface::FrameParticle(float rTime) m_particle->CreateParticle(pos, speed, dim, Gfx::PARTIBLITZ, Math::Rand()*0.2f+0.2f, 0.0f, 0.0f, Gfx::SH_INTERFACE); - pos.x = m_partiPos[i].x; - pos.y = m_partiPos[i].y; + pos.x = m_particles[i].pos.x; + pos.y = m_particles[i].pos.y; pos.z = 0.0f; speed.x = (Math::Rand()-0.5f)*0.5f; speed.y = (0.3f+Math::Rand()*0.3f); @@ -696,10 +691,10 @@ void CMainUserInterface::FrameParticle(float rTime) Math::Rand()*0.5f+0.5f, 2.0f, 0.0f, Gfx::SH_INTERFACE); } - if ( m_partiPhase[i] == 3 ) // smoke? + if ( m_particles[i].phase == 3 ) // smoke? { - pos.x = m_partiPos[i].x; - pos.y = m_partiPos[i].y; + pos.x = m_particles[i].pos.x; + pos.y = m_particles[i].pos.y; pos.z = 0.0f; pos.x += (Math::Rand()-0.5f)*0.03f; pos.y += (Math::Rand()-0.5f)*0.03f; @@ -715,8 +710,8 @@ void CMainUserInterface::FrameParticle(float rTime) } else { - m_partiPhase[i] = 0; - m_partiTime[i] = 2.0f+Math::Rand()*4.0f; + m_particles[i].phase = 0; + m_particles[i].time = 2.0f+Math::Rand()*4.0f; } } } diff --git a/src/ui/mainui.h b/src/ui/mainui.h index 56a97e8c..ac1b88ba 100644 --- a/src/ui/mainui.h +++ b/src/ui/mainui.h @@ -128,9 +128,13 @@ protected: Math::Point m_glintMouse; float m_glintTime; - int m_partiPhase[10]; - float m_partiTime[10]; - Math::Point m_partiPos[10]; + struct Particle + { + int phase = 0; + float time = 0.0f; + Math::Point pos; + }; + std::array m_particles; }; } // namespace Ui diff --git a/src/ui/screen/screen_loading.cpp b/src/ui/screen/screen_loading.cpp index 18ee7a35..f1a303d5 100644 --- a/src/ui/screen/screen_loading.cpp +++ b/src/ui/screen/screen_loading.cpp @@ -34,7 +34,8 @@ namespace Ui { CScreenLoading::CScreenLoading() -: m_visible(false) + : m_visible(false), + m_lastProgress(0.0f) { } diff --git a/src/ui/studio.cpp b/src/ui/studio.cpp index e3f3c107..6474e16f 100644 --- a/src/ui/studio.cpp +++ b/src/ui/studio.cpp @@ -81,6 +81,9 @@ CStudio::CStudio() m_pause = CPauseManager::GetInstancePointer(); m_settings = CSettings::GetInstancePointer(); + m_program = nullptr; + m_script = nullptr; + m_bEditMaximized = false; m_bEditMinimized = false; @@ -88,8 +91,9 @@ CStudio::CStudio() m_bRealTime = true; m_bRunning = false; m_fixInfoTextTime = 0.0f; - m_helpFilename[0] = 0; + m_initPause = PAUSE_NONE; m_dialog = SD_NULL; + m_editCamera = Gfx::CAM_TYPE_NULL; } // Object's destructor. @@ -135,7 +139,7 @@ bool CStudio::EventProcess(const Event &event) if ( event.type == EVENT_STUDIO_LIST ) // list clicked? { - m_main->StartDisplayInfo(const_cast(m_helpFilename.c_str()), -1); // TODO change to std::string when RobotMain changes + m_main->StartDisplayInfo(m_helpFilename, -1); } if ( event.type == EVENT_STUDIO_NEW ) // new? @@ -451,7 +455,7 @@ void CStudio::SearchToken(CEdit* edit) } if ( level > 0 ) { - m_helpFilename[0] = 0; + m_helpFilename = ""; SetInfoText("", true); return; } @@ -552,7 +556,7 @@ void CStudio::StartEditScript(CScript *script, std::string name, Program* progra m_main->SetEditLock(true, true); m_main->SetEditFull(false); - m_bInitPause = m_pause->GetPauseType(); + m_initPause = m_pause->GetPauseType(); m_main->SetSpeed(1.0f); m_editCamera = m_camera->GetType(); m_camera->SetType(Gfx::CAM_TYPE_EDIT); @@ -884,7 +888,7 @@ bool CStudio::StopEditScript(bool bCancel) m_interface->DeleteControl(EVENT_WINDOW3); - m_pause->SetPause(m_bInitPause); + m_pause->SetPause(m_initPause); m_sound->MuteAll(false); m_main->SetEditLock(false, true); m_camera->SetType(m_editCamera); diff --git a/src/ui/studio.h b/src/ui/studio.h index 781e4b5a..6d148cbc 100644 --- a/src/ui/studio.h +++ b/src/ui/studio.h @@ -116,7 +116,7 @@ protected: float m_fixInfoTextTime; bool m_bRunning; bool m_bRealTime; - PauseType m_bInitPause; + PauseType m_initPause; std::string m_helpFilename; StudioDialog m_dialog;