Skip to content

Commit 24dce10

Browse files
committed
Introduce FindObjectDialog and Attribute.
1 parent 7465032 commit 24dce10

11 files changed

Lines changed: 344 additions & 13 deletions

File tree

3DRadSpace/3DRadSpace_Editor_WindowsDX11/Frontend/Controls/EventControl.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
#include <Engine3DRadSpace/Objects/IObject.hpp>
55
#include <Engine3DRadSpace/Reflection/Event.hpp>
66
#include <Engine3DRadSpace/Projects/EventRepresentation.hpp>
7-
#include <Engine3DRadSpace/Objects/Impl/Objects.hpp>
87
#include <Engine3DRadSpace/Reflection/IReflectedFunction.hpp>
98

109
EventControl::EventControl(
@@ -106,7 +105,7 @@ void EventControl::HandleClick(HWND clickedWindow)
106105
if (dynamic_cast<Engine3DRadSpace::Reflection::IReflectedFunction*>(fnMember) != nullptr)
107106
{
108107
auto fn = fnMember->Clone().release();
109-
this->_event->Bind(std::unique_ptr<Engine3DRadSpace::Reflection::IReflectedFunction>(dynamic_cast<Engine3DRadSpace::Reflection::IReflectedFunction*>(fn)),0,0);
108+
this->_event->Bind(std::unique_ptr<Engine3DRadSpace::Reflection::IReflectedFunction>(dynamic_cast<Engine3DRadSpace::Reflection::IReflectedFunction*>(fn)), event->OwnerObject, event->FunctionID);
110109
}
111110
}
112111
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#include "ObjectIDControl.hpp"
2+
3+
ObjectIDControl::ObjectIDControl(
4+
HWND owner,
5+
HINSTANCE hInstance,
6+
int x,
7+
int y,
8+
int cx,
9+
int cy,
10+
const char* value,
11+
Engine3DRadSpace::Objects::ObjectList* list
12+
) :
13+
NumericTextbox(owner, hInstance, x, y, cx, cy, value),
14+
_openedFindWindow(false),
15+
_objectList(list)
16+
{
17+
SIZE size{};
18+
GetTextExtentPointA(GetDC(owner), "...", 3, &size);
19+
20+
sx = size.cx + 5;
21+
sy = size.cy + 7;
22+
23+
_browseBtn = CreateWindowExA(
24+
0,
25+
"Button",
26+
"...",
27+
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
28+
x + cx + 5,
29+
y,
30+
size.cx + 10,
31+
size.cy + 7,
32+
owner,
33+
nullptr,
34+
hInstance,
35+
nullptr
36+
);
37+
}
38+
39+
void ObjectIDControl::HandleClick(HWND clickedWindow)
40+
{
41+
if (clickedWindow == _browseBtn && !_openedFindWindow)
42+
{
43+
std::thread openFndWindow(
44+
[this](){
45+
_openedFindWindow = true;
46+
47+
FindObjectDialog fod(owner, instance, _objectList);
48+
auto obj = fod.ShowDialog();
49+
if (obj.has_value())
50+
{
51+
SetWindowTextA(window, std::to_string(obj.value()).c_str());
52+
}
53+
_openedFindWindow = false;
54+
}
55+
);
56+
openFndWindow.detach();
57+
}
58+
}
59+
60+
int ObjectIDControl::AccX() const noexcept
61+
{
62+
return sx;
63+
}
64+
65+
int ObjectIDControl::AccY() const noexcept
66+
{
67+
return sy;
68+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#pragma once
2+
#include "NumericTextbox.hpp"
3+
#include "../Windows/FindObjectDialog.hpp"
4+
#include <atomic>
5+
6+
class ObjectIDControl : public NumericTextbox
7+
{
8+
HWND _browseBtn;
9+
std::atomic<bool> _openedFindWindow;
10+
Engine3DRadSpace::Objects::ObjectList* _objectList;
11+
int sx;
12+
int sy;
13+
public:
14+
ObjectIDControl(
15+
HWND owner,
16+
HINSTANCE hInstance,
17+
int x,
18+
int y,
19+
int cx,
20+
int cy,
21+
const char* value,
22+
Engine3DRadSpace::Objects::ObjectList* list
23+
);
24+
25+
virtual void HandleClick(HWND clickedWindow) override;
26+
27+
int AccX() const noexcept;
28+
int AccY() const noexcept;
29+
};

3DRadSpace/3DRadSpace_Editor_WindowsDX11/Frontend/Windows/EditObjectDialog.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <Engine3DRadSpace/Projects/EventInvocationRepresentation.hpp>
1414
#include "../Controls/EventControl.hpp"
1515
#include <Engine3DRadSpace/Objects/ObjectList.hpp>
16+
#include "../Controls/ObjectIDControl.hpp"
1617

1718
using namespace Engine3DRadSpace;
1819
using namespace Engine3DRadSpace::Audio;
@@ -106,6 +107,8 @@ void EditObjectDialog::createForms()
106107
HDC hdc = GetDC(window);
107108
int windowWidth = x;
108109

110+
auto objList = _content->GetOwner()->RequireService<Objects::ObjectList>({});
111+
109112
for (auto field : (*objRefl))
110113
{
111114
if (field == nullptr) continue;
@@ -511,8 +514,6 @@ void EditObjectDialog::createForms()
511514
{
512515
const Event* value = reinterpret_cast<const Event*>(reinterpret_cast<const char*>(valuePtr) + fOffset);
513516

514-
auto objList = _content->GetOwner()->RequireService<Objects::ObjectList>({});
515-
516517
EventControl* ctrl = new EventControl(window, hInstance, x, y, const_cast<Event*>(value), objList);
517518
windows.push_back(ctrl);
518519

@@ -529,9 +530,9 @@ void EditObjectDialog::createForms()
529530
auto value = *reinterpret_cast<const size_t*>(reinterpret_cast<const char*>(valuePtr) + fOffset);
530531
fOffset += sizeof(size_t);
531532

532-
NumericTextbox* ctrl = new NumericTextbox(window, hInstance, px, y, 75, textboxHeight, std::to_string(value).c_str());
533+
ObjectIDControl* ctrl = new ObjectIDControl(window, hInstance, px, y, 75, textboxHeight, std::to_string(value).c_str(), objList);
533534
windows.push_back(ctrl);
534-
px += 80;
535+
px += 80 + ctrl->AccX() - px;
535536

536537
setMax(inc_y, textboxHeight + 5);
537538
break;

3DRadSpace/3DRadSpace_Editor_WindowsDX11/Frontend/Windows/EditorWindow.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,9 @@ EditorWindow::EditorWindow(HINSTANCE hInstance,const std::string &cmdArgs) :
449449
AppendMenuA(mainMenu, MF_POPUP, reinterpret_cast<UINT_PTR>(optionsMenu), "Options");
450450
AppendMenuA(mainMenu, MF_POPUP, reinterpret_cast<UINT_PTR>(helpMenu), "Help");
451451

452+
int screenX = GetSystemMetrics(SM_CXSCREEN);
453+
int screenY = GetSystemMetrics(SM_CYSCREEN);
454+
452455
//Create window
453456
_mainWindow = CreateWindowExA(
454457
WS_EX_ACCEPTFILES,
@@ -457,8 +460,8 @@ EditorWindow::EditorWindow(HINSTANCE hInstance,const std::string &cmdArgs) :
457460
WS_OVERLAPPEDWINDOW,
458461
CW_USEDEFAULT,
459462
CW_USEDEFAULT,
460-
800,
461-
600,
463+
screenX,
464+
screenY,
462465
nullptr,
463466
mainMenu,
464467
hInstance,
@@ -534,7 +537,10 @@ EditorWindow::EditorWindow(HINSTANCE hInstance,const std::string &cmdArgs) :
534537
nullptr
535538
);
536539

537-
this->editor = std::make_unique<EditorGame>(_mainWindow,_hInstance);
540+
int screenWidth = GetSystemMetrics(SM_CXSCREEN);
541+
int screenHeight = GetSystemMetrics(SM_CYSCREEN);
542+
543+
this->editor = std::make_unique<EditorGame>(_mainWindow, _hInstance);
538544

539545
_handleRenderWindow = static_cast<HWND>(this->editor->Window->NativeHandle());
540546

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
#include "FindObjectDialog.hpp"
2+
#include "EditorWindow.hpp"
3+
#undef max
4+
5+
INT_PTR WINAPI FindObjectDialog_DlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
6+
{
7+
static FindObjectDialog* fod = nullptr;
8+
switch (msg)
9+
{
10+
case WM_INITDIALOG:
11+
{
12+
fod = reinterpret_cast<FindObjectDialog*>(lParam);
13+
fod->window = hwnd;
14+
fod->_createForms();
15+
return 1;
16+
}
17+
case WM_PAINT:
18+
{
19+
PAINTSTRUCT ps;
20+
BeginPaint(hwnd, &ps);
21+
FillRect(ps.hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
22+
EndPaint(hwnd, &ps);
23+
return 1;
24+
}
25+
case WM_CLOSE:
26+
{
27+
EndDialog(hwnd, IDCANCEL);
28+
return 1;
29+
}
30+
case WM_COMMAND:
31+
{
32+
switch (HIWORD(wParam))
33+
{
34+
case BN_CLICKED:
35+
{
36+
if (lParam == reinterpret_cast<LPARAM>(fod->_cancelButton))
37+
{
38+
EndDialog(hwnd, IDCANCEL);
39+
return 1;
40+
}
41+
if (lParam == reinterpret_cast<LPARAM>(fod->_okButton))
42+
{
43+
EndDialog(hwnd, IDOK);
44+
return 1;
45+
}
46+
break;
47+
}
48+
default:
49+
break;
50+
}
51+
return 1;
52+
}
53+
case WM_NOTIFY:
54+
{
55+
switch ((reinterpret_cast<LPNMHDR>(lParam))->code)
56+
{
57+
case NM_DBLCLK:
58+
{
59+
LPNMHDR lpnmh = (LPNMHDR)lParam;
60+
61+
if (lpnmh->code == NM_DBLCLK)
62+
{
63+
HTREEITEM hItem = TreeView_GetSelection(lpnmh->hwndFrom);
64+
65+
if (hItem != NULL)
66+
{
67+
TVITEM tvi{};
68+
tvi.hItem = hItem;
69+
tvi.mask = TVIF_PARAM;
70+
TreeView_GetItem(lpnmh->hwndFrom, &tvi);
71+
72+
fod->_selectedObjectID = tvi.lParam;
73+
}
74+
break;
75+
}
76+
break;
77+
}
78+
default:
79+
break;
80+
}
81+
return 1;
82+
}
83+
default:
84+
return 0;
85+
}
86+
}
87+
88+
FindObjectDialog::FindObjectDialog(HWND owner, HINSTANCE hInstance, Engine3DRadSpace::Objects::ObjectList* list) :
89+
Dialog(owner, hInstance, FindObjectDialog_DlgProc, "Find object", 210, 180),
90+
_listBox(nullptr),
91+
_okButton(nullptr),
92+
_cancelButton(nullptr),
93+
_list(list),
94+
_selectedObjectID(std::numeric_limits<size_t>::max())
95+
{
96+
}
97+
98+
std::optional<size_t> FindObjectDialog::ShowDialog()
99+
{
100+
INT_PTR r = Dialog::ShowDialog(this);
101+
if (r == IDOK) return _selectedObjectID;
102+
else return std::nullopt;
103+
}
104+
105+
void FindObjectDialog::_createForms()
106+
{
107+
_listBox = CreateWindowExA(
108+
0,
109+
WC_TREEVIEWA,
110+
"",
111+
WS_CHILD | WS_VISIBLE | WS_BORDER | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS,
112+
5, 5, 390, 295,
113+
window,
114+
nullptr,
115+
hInstance,
116+
nullptr
117+
);
118+
119+
_okButton = CreateWindowExA(
120+
0,
121+
"Button",
122+
"OK",
123+
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
124+
225, 305, 80, 30,
125+
window,
126+
nullptr,
127+
hInstance,
128+
nullptr
129+
);
130+
131+
_cancelButton = CreateWindowExA(
132+
0,
133+
"Button",
134+
"Cancel",
135+
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
136+
310, 305, 80, 30,
137+
window,
138+
nullptr,
139+
hInstance,
140+
nullptr
141+
);
142+
143+
EditorWindow::PopulateObjectList(_list, _listBox);
144+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#pragma once
2+
#include "../Controls/Dialog.hpp"
3+
#include <Engine3DRadSpace/Objects/ObjectList.hpp>
4+
5+
class FindObjectDialog : public Dialog
6+
{
7+
HWND _listBox;
8+
HWND _okButton;
9+
HWND _cancelButton;
10+
11+
Engine3DRadSpace::Objects::ObjectList* _list;
12+
size_t _selectedObjectID;
13+
14+
void _createForms();
15+
public:
16+
FindObjectDialog(HWND owner, HINSTANCE hInstance, Engine3DRadSpace::Objects::ObjectList* list);
17+
18+
std::optional<size_t> ShowDialog();
19+
20+
friend INT_PTR WINAPI FindObjectDialog_DlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
21+
};

3DRadSpace/Engine3DRadSpace/Projects/EventRepresentation.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ std::optional<Event> EventRepresentation::Reconstruct(const Reflection::UUID& uu
1919
std::unique_ptr<IReflectedFunction> boundFn;
2020
boundFn.reset(clonedFn);
2121

22-
e.Bind(std::move(boundFn), 0, 0); //todo
22+
e.Bind(std::move(boundFn), fn.OwnerObject, fn.FunctionID);
2323
}
2424

2525
return e;
@@ -29,8 +29,12 @@ EventRepresentation::EventRepresentation(const Reflection::Event& event, const R
2929
{
3030
for (size_t i = 0; i < event.Count(); i++)
3131
{
32-
EventInvocationRepresentation fnRepr;
33-
fnRepr.FunctionID = i;
34-
32+
auto& e = event.At(i);
33+
34+
EventInvocationRepresentation fnRep;
35+
fnRep.OwnerObject = e.ObjectID;
36+
fnRep.FunctionID = e.FunctionID;
37+
38+
BoundFunctions.emplace_back(std::move(fnRep));
3539
}
3640
}

0 commit comments

Comments
 (0)