diff --git a/Source/UI/Buttons/UISlotBmpButton.h b/Source/UI/Buttons/UISlotBmpButton.h index 58dc69a0..81b6d507 100644 --- a/Source/UI/Buttons/UISlotBmpButton.h +++ b/Source/UI/Buttons/UISlotBmpButton.h @@ -3,15 +3,19 @@ #include "UI/Buttons/UIBitmapButton.h" +class UIStaticBitmap; + class UISlotBmpButton : public UIBitmapButton { public: + void Slot15(int width, int height) override; void Slot19() override; void Slot25(int x, int y) override; void Slot26(int x, int y) override; void Slot32(int x, int y) override; protected: - /* 0120 */ unsigned char unknown_0120[0x14]; + /* 0120 */ unsigned char unknown_0120[0x10]; + /* 0130 */ UIStaticBitmap* icon; /* 0134 */ short unknown_0134; /* 0136 */ short unknown_0136; }; diff --git a/Source/UI/Buttons/UITextButton.cpp b/Source/UI/Buttons/UITextButton.cpp index 371fde36..676b083f 100644 --- a/Source/UI/Buttons/UITextButton.cpp +++ b/Source/UI/Buttons/UITextButton.cpp @@ -21,6 +21,7 @@ #include "Client/Mode/ModeCursor.h" #include "UI/Buttons/UIBitmapButton2.h" #include "UI/Buttons/UISlotBmpButton.h" +#include "UI/UIStaticBitmap.h" #include "UI/Buttons/UITVBitmapButton.h" #include "UI/Buttons/UITVTextButton.h" #include "UI/Lists/UIComboBox.h" @@ -51,7 +52,6 @@ #include #include #include - // GLOBAL: gl_24606 int g_screenHeight; @@ -2196,3 +2196,81 @@ void UIPackageBoxNameList::Slot25(int x, int y) { this->Invalidate(); } + +// OFFSET: 0x00886AE0 +// FUNCTION: fn_11328 +void UIListBoxID::Slot15(int width, int height) { + auto* vertical = new UIScrollBar(*this->m_context); + this->verticalBar = vertical; + const int verticalWidth = vertical->thickness; + vertical->vertical = 1; + vertical->UIWindow::Resize(verticalWidth, height); + vertical->Move((width - 13), 0); + vertical->Slot15(verticalWidth, height); + vertical->Slot22(verticalWidth, height); + this->AddChild(this->verticalBar); + + auto* horizontal = new UIScrollBar(*this->m_context); + this->horizontalBar = horizontal; + const int horizontalHeight = horizontal->thickness; + horizontal->vertical = 0; + horizontal->UIWindow::Resize((width - 13), horizontalHeight); + horizontal->Move(0, (height - 13)); + horizontal->Slot15((width - 13), horizontalHeight); + horizontal->Slot22((width - 13), horizontalHeight); + this->AddChild(this->horizontalBar); +} + +// OFFSET: 0x00887280 +// FUNCTION: fn_11332 +void UITableBox::Slot15(int, int) { +} + +// OFFSET: 0x008872B0 +// FUNCTION: fn_11335 +void UITreeView::Slot15(int width, int height) { + auto* vertical = new UIScrollBar3(*this->m_context); + this->verticalBar = vertical; + const int verticalWidth = vertical->thickness; + vertical->vertical = 1; + vertical->UIWindow::Resize(verticalWidth, height); + vertical->Move((width - 10), 0); + vertical->Slot15(verticalWidth, height); + vertical->Slot22(verticalWidth, height); + this->AddChild(this->verticalBar); + + this->edit = new UIEditCtrl2(*this->m_context, *this->m_edit); + this->edit->SetSize(100, 19); + this->edit->Move(-100, -100); + this->AddChild(this->edit); +} + +// OFFSET: 0x008873F0 +// FUNCTION: fn_11336 +void TableBox::Paint() { + RECT rectangle; + rectangle.left = 1; + rectangle.top = 1; + rectangle.right = this->geometry.width - 1; + rectangle.bottom = this->geometry.height - 1; + this->FillSurface(this->borderColor, &rectangle); +} + +// OFFSET: 0x008870B0 +// FUNCTION: fn_11331 +void UISlotBmpButton::Slot15(int, int) { + const std::string path = "유저인터페이스\\renewalparty\\"; + char name[256]; + std::sprintf(name, "%sicon_jobs_%d.bmp", path.c_str(), 0); + this->icon = new UIStaticBitmap(*this->m_context, *this->m_buttonContext); + this->icon->SetBitmap(name); + this->icon->SetSize(this->icon->geometry.width, this->icon->geometry.height); + this->icon->Move(118, 14); + this->AddChild(this->icon); +} + +// OFFSET: 0x00899BE0 +// FUNCTION: fn_11560 +int UITableBox::SendMsg(UIWindow* sender, int message, std::intptr_t argument1, std::intptr_t argument2, std::intptr_t argument3, std::intptr_t argument4) { + return UIWindow::SendMsg(sender, message, argument1, argument2, argument3, argument4); +} diff --git a/Source/UI/Edit/UIEditCtrl.cpp b/Source/UI/Edit/UIEditCtrl.cpp index d7673e01..aaf1d6eb 100644 --- a/Source/UI/Edit/UIEditCtrl.cpp +++ b/Source/UI/Edit/UIEditCtrl.cpp @@ -585,6 +585,14 @@ void UIEditCtrl::Background(int red, int green, int blue) { this->Invalidate(); } +// OFFSET: 0x00865E00 +// FUNCTION: fn_10938 +void UIEditCtrl::Border(int red, int green, int blue) { + this->borderRed = red; + this->borderGreen = green; + this->borderBlue = blue; +} + // OFFSET: 0x00868570 // FUNCTION: fn_10960 void UIEditCtrl::TextColor(std::uint32_t primary, std::uint32_t secondary) { diff --git a/Source/UI/Edit/UIEditCtrl.h b/Source/UI/Edit/UIEditCtrl.h index 3a82004b..5e892cd3 100644 --- a/Source/UI/Edit/UIEditCtrl.h +++ b/Source/UI/Edit/UIEditCtrl.h @@ -61,6 +61,7 @@ public: const char* Text(); std::string LinkedText(); void Background(int red, int green, int blue); + void Border(int red, int green, int blue); void TextColor(std::uint32_t primary, std::uint32_t secondary); void UpdateLinks(); void SetCursor(std::size_t position); @@ -224,6 +225,8 @@ public: class UIEditCtrlVarId : public UIEditCtrl { public: + // INLINED + UIEditCtrlVarId(UIWindowContext& windows, UIEditContext& edit) : UIEditCtrl(windows, edit) {} void Slot24(int retained) override; void Slot35(int value) override; int SendMsg(UIWindow* sender, int message, std::intptr_t argument1, std::intptr_t argument2, std::intptr_t argument3, std::intptr_t argument4) override; @@ -233,6 +236,17 @@ public: bool HasItemLinkTag(const std::string& text); bool HasNaviLinkTag(const std::string& text); +class UIShowAndEditTimeCtrl : public UIWindow { +public: + void Slot15(int width, int height) override; + int SendMsg(UIWindow* sender, int message, std::intptr_t argument1, std::intptr_t argument2, std::intptr_t argument3, std::intptr_t argument4) override; + + /* 007C */ UIEditCtrlVarId* fields[2]; + +protected: + UIEditContext* m_edit; +}; + #if defined(_WIN32) && !defined(_WIN64) static_assert(sizeof(UIEditCtrl) == 292); static_assert(sizeof(UIEditCtrlWheel) == 292); diff --git a/Source/UI/Edit/UIEditVariants.cpp b/Source/UI/Edit/UIEditVariants.cpp index 0dd1f764..7c0de27d 100644 --- a/Source/UI/Edit/UIEditVariants.cpp +++ b/Source/UI/Edit/UIEditVariants.cpp @@ -7,7 +7,7 @@ #include "UI/Window/InputFocus.h" #include "UI/Edit/UIEditCtrl.h" #include "Network/TextEncoding.h" - +#include "Utility/Text/FormatString.h" #include #include @@ -335,3 +335,39 @@ int UIEditCtrl_OldList::SendMsg(UIWindow* sender, int message, std::intptr_t arg return UIEditCtrl::SendMsg(sender, message, argument1, argument2, argument3, argument4); } } + +// OFFSET: 0x00886F90 +// FUNCTION: fn_11330 +void UIShowAndEditTimeCtrl::Slot15(int, int) { + for (int i = 0; i < 2; ++i) { + UIEditCtrlVarId*& field = this->fields[i]; + field = new UIEditCtrlVarId(*this->m_context, *this->m_edit); + field->SetSize(20, 18); + field->Background(232, 232, 232); + field->Border(192, 192, 192); + field->flat = 0; + field->maximum = 2; + field->Move(i * 38, 0); + field->SetText("0"); + field->SetId(184); + this->AddChild(field); + } +} + +// OFFSET: 0x008996B0 +// FUNCTION: fn_11556 +int UIShowAndEditTimeCtrl::SendMsg(UIWindow* sender, int message, std::intptr_t argument1, std::intptr_t argument2, std::intptr_t argument3, std::intptr_t argument4) { + if (message == 6 && argument1 == 184) { + for (UIEditCtrlVarId* field : this->fields) { + if (sender == field) { + int value = std::atoi(field->Text()); + if (value > 60) { + value = 60; + } + const std::string text = FormatOwnedString("%d", value); + field->SetText(text.c_str()); + } + } + } + return 0; +} diff --git a/Source/UI/Lists/TableBox.h b/Source/UI/Lists/TableBox.h index 4ef8ace6..fb37fda0 100644 --- a/Source/UI/Lists/TableBox.h +++ b/Source/UI/Lists/TableBox.h @@ -6,12 +6,18 @@ class TableBox : public UIWindow { public: void Slot15(int width, int height) override; + void Paint() override; int SendMsg(UIWindow* sender, int message, std::intptr_t argument1, std::intptr_t argument2, std::intptr_t argument3, std::intptr_t argument4) override; + + /* 007C */ unsigned char unknown_007C[0x4]; + /* 0080 */ std::uint32_t borderColor; }; class UITableBox : public UIWindow { public: + void Slot15(int width, int height) override; void Paint() override; + int SendMsg(UIWindow* sender, int message, std::intptr_t argument1, std::intptr_t argument2, std::intptr_t argument3, std::intptr_t argument4) override; }; #endif diff --git a/Source/UI/Lists/UIComboBoxDefWnd.cpp b/Source/UI/Lists/UIComboBoxDefWnd.cpp index 98021d91..0d3a3c48 100644 --- a/Source/UI/Lists/UIComboBoxDefWnd.cpp +++ b/Source/UI/Lists/UIComboBoxDefWnd.cpp @@ -5,7 +5,8 @@ #include "UI/Lists/UIListBox.h" #include "UI/Text/UIStaticText.h" #include "UI/Window/WindowPolicy.h" - +#include "UI/Window/UIWindowMgr.h" +#include "UI/Lists/UIComboBoxWnd.h" #include namespace { @@ -308,3 +309,76 @@ void UIComboBoxDef2Wnd::Paint() { this->label->Invalidate(); } } + +// OFFSET: 0x00886C30 +// FUNCTION: fn_11329 +void UINewComboBoxCtrl::Slot15(int, int) { + const std::string base = "유저인터페이스\\basic_interface\\txtbox_btn_"; + this->button = new UIBitmapButton(*this->m_context, *this->m_buttons); + this->button->SetBitmap((base + "a.bmp").c_str(), 0, 0); + this->button->SetBitmap((base + "b.bmp").c_str(), 1, 0); + this->button->SetBitmap((base + "c.bmp").c_str(), 2, 0); + this->button->SetSize(this->button->BitmapWidth(), this->button->BitmapHeight()); + this->button->Move((this->geometry.width - this->button->BitmapWidth()), 0); + this->button->SetId(273); + this->AddChild(this->button); + + this->label = new UIStaticText(*this->m_context, *this->m_buttons); + this->label->SetSize((this->geometry.width - this->button->BitmapWidth()), this->button->BitmapHeight()); + this->label->SetText("(No Select)", 0); + this->label->Move(2, 3); + this->label->shadow = 1; + this->AddChild(this->label); +} + +// OFFSET: 0x008994B0 +// FUNCTION: fn_11555 +int UINewComboBoxCtrl::SendMsg(UIWindow* sender, int message, std::intptr_t argument1, std::intptr_t argument2, std::intptr_t argument3, std::intptr_t argument4) { + if (message == 6) { + if (argument1 == 273) { + this->dropped = !this->dropped; + if (g_windowMgr.unknown_0214) { + g_windowMgr.CloseWindow(26); + } + + if (this->dropped) { + UIWindow* window = g_windowMgr.EnsureWindow(26); + const int count = static_cast(this->items.size()); + for (int index = 0; index < count; ++index) { + window->SendMsg(nullptr, 31, reinterpret_cast(this->items[index].c_str()), 0, 0, 0); + } + window->SendMsg(nullptr, 40, this->selected, 0, 0, 0); + window->Resize(this->geometry.width, count * 16); + static_cast(window)->SetOwner(this); + int x = 0; + int y = this->geometry.height; + this->ToScreen(x, y); + window->Move(x, y); + } + } + return 0; + } + + if (message != 39) { + return UIWindow::SendMsg(sender, message, argument1, argument2, argument3, argument4); + } + + this->dropped = false; + const int index = static_cast(argument1); + if (index < 0) { + return 0; + } + + if (static_cast(index) <= this->items.size()) { + this->label->SetText(this->items[index].c_str(), 0); + } + + this->selected = index; + this->parent->SendMsg(this, 39, index, 0, 0, 0); + this->Invalidate(); + this->parent->Invalidate(); + if (this->Root()) { + this->Root()->Invalidate(); + } + return 0; +} diff --git a/Source/UI/Lists/UIComboBoxDefWnd.h b/Source/UI/Lists/UIComboBoxDefWnd.h index a3b0fd60..3ac9d6ee 100644 --- a/Source/UI/Lists/UIComboBoxDefWnd.h +++ b/Source/UI/Lists/UIComboBoxDefWnd.h @@ -44,6 +44,25 @@ protected: UIComboBoxHeaderContext* m_controls; }; +class UINewComboBoxCtrl : public UIWindow { +public: + void Slot15(int width, int height) override; + int SendMsg(UIWindow* sender, int message, std::intptr_t argument1, std::intptr_t argument2, std::intptr_t argument3, std::intptr_t argument4) override; + + /* 007C */ UIBitmapButton* button; + /* 0080 */ UIStaticText* label; + +protected: + UIButtonContext* m_buttons; + +public: + /* 0084 */ unsigned char unknown_0084; + /* 0085 */ bool dropped; + /* 0088 */ unsigned char unknown_0088[0x18]; + /* 00A0 */ int selected; + /* 00A4 */ std::vector items; +}; + class UIComboBoxDef2Wnd : public UIComboBoxDefWnd { public: UIComboBoxDef2Wnd(UIWindowContext& windows, UIComboBoxHeaderContext& controls); diff --git a/Source/UI/Lists/UIListBoxID.h b/Source/UI/Lists/UIListBoxID.h index 4130059d..a33992f7 100644 --- a/Source/UI/Lists/UIListBoxID.h +++ b/Source/UI/Lists/UIListBoxID.h @@ -15,6 +15,7 @@ struct IdListLine { class UIListBoxID : public UIWindow { public: + void Slot15(int width, int height) override; void Slot25(int x, int y) override; void Slot35(int value) override; virtual void Clear(); @@ -28,7 +29,8 @@ public: /* 00A0 */ int verticalOverflow; /* 00A4 */ int bottomMargin; /* 00A8 */ UIScrollBar* verticalBar; - /* 00AC */ unsigned char unknown_00AC[0x8]; + /* 00AC */ UIScrollBar* horizontalBar; + /* 00B0 */ unsigned char unknown_00B0[0x4]; /* 00B4 */ int lineHeight; }; diff --git a/Source/UI/Lists/UITreeView.h b/Source/UI/Lists/UITreeView.h index ae746b11..f2129849 100644 --- a/Source/UI/Lists/UITreeView.h +++ b/Source/UI/Lists/UITreeView.h @@ -4,10 +4,13 @@ #include "UI/Window/UIWindow.h" class UIScrollBar; +class UIEditCtrl2; +struct UIEditContext; class UITreeView : public UIWindow { public: void Resize(int width, int height) override; + void Slot15(int width, int height) override; void Slot25(int x, int y) override; void Slot27(int x, int y) override; void Slot31(int x, int y) override; @@ -21,11 +24,15 @@ protected: /* 0088 */ int unknown_0088; /* 008C */ int unknown_008C; /* 0090 */ int unknown_0090; - /* 0094 */ unsigned char unknown_0094[0xC]; + /* 0094 */ unsigned char unknown_0094[0x4]; + /* 0098 */ UIEditCtrl2* edit; + /* 009C */ unsigned char unknown_009C[0x4]; /* 00A0 */ int itemHeight; /* 00A4 */ int itemCount; /* 00A8 */ int unknown_00A8; /* 00AC */ unsigned char unknown_00AC; + + UIEditContext* m_edit; }; #endif diff --git a/Source/UI/Text/UITextViewer.cpp b/Source/UI/Text/UITextViewer.cpp index 88379e3c..c781024e 100644 --- a/Source/UI/Text/UITextViewer.cpp +++ b/Source/UI/Text/UITextViewer.cpp @@ -244,3 +244,9 @@ void UITextViewer::Paint() { } } } + +// OFFSET: 0x00887290 +// FUNCTION: fn_11333 +void UITextViewEX::Slot15(int width, int height) { + UIListBox::Slot15(width, height); +} diff --git a/Source/UI/Text/UITextViewer.h b/Source/UI/Text/UITextViewer.h index 5e0e12e4..fed69340 100644 --- a/Source/UI/Text/UITextViewer.h +++ b/Source/UI/Text/UITextViewer.h @@ -74,6 +74,7 @@ private: class UITextViewEX : public UITextViewer { public: void Configure(int x, int y, int width, int height, unsigned char transparent) override; + void Slot15(int width, int height) override; void Clear() override; std::vector extraLinks;