New properties window (moved node parameters to this window)
|
|
@ -119,6 +119,9 @@ set(SRCS
|
|||
src/resources_window.cpp
|
||||
src/resources_window.h
|
||||
|
||||
src/node_properties_window.cpp
|
||||
src/node_properties_window.h
|
||||
|
||||
src/gui.h
|
||||
src/gui.cpp
|
||||
|
||||
|
|
|
|||
BIN
story-editor/assets/build.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
131
story-editor/assets/build.svg
Normal file
|
|
@ -0,0 +1,131 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="build.svg"
|
||||
inkscape:export-filename="/mnt/data/git/OpenStoryTeller/software/ost_editor/assets/build.png"
|
||||
inkscape:export-xdpi="599.172"
|
||||
inkscape:export-ydpi="599.172"
|
||||
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="27.125401"
|
||||
inkscape:cx="9.769441"
|
||||
inkscape:cy="9.5298132"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1136"
|
||||
inkscape:window-x="3840"
|
||||
inkscape:window-y="40"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4" />
|
||||
<g
|
||||
id="g1850"
|
||||
transform="translate(0.70835287,0.93011029)">
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 3.2156211,6.5613148 V 18.525394 H 19.075779 V 6.5677311"
|
||||
id="path954" />
|
||||
<path
|
||||
sodipodi:type="star"
|
||||
style="opacity:0.998;fill:#000000;stroke:none;stroke-width:1.88976;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:4, 4;paint-order:fill markers stroke"
|
||||
id="path1459"
|
||||
inkscape:flatsided="true"
|
||||
sodipodi:sides="3"
|
||||
sodipodi:cx="11.1457"
|
||||
sodipodi:cy="5.4293532"
|
||||
sodipodi:r1="4.4335914"
|
||||
sodipodi:r2="2.2167957"
|
||||
sodipodi:arg1="1.5707963"
|
||||
sodipodi:arg2="2.6179939"
|
||||
inkscape:rounded="0"
|
||||
inkscape:randomized="0"
|
||||
d="m 11.145701,9.8629446 -3.8396034,-6.6503869 7.6792054,-2e-7 z"
|
||||
inkscape:transform-center-y="1.108398" />
|
||||
<rect
|
||||
style="opacity:0.998;fill:#000000;stroke:none;stroke-width:0.781951;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1.65513, 1.65513;paint-order:fill markers stroke"
|
||||
id="rect1563"
|
||||
width="1.2475514"
|
||||
height="1.2941761"
|
||||
x="6.0001993"
|
||||
y="11.433697"
|
||||
rx="0"
|
||||
ry="0" />
|
||||
<rect
|
||||
style="opacity:0.998;fill:#000000;stroke:none;stroke-width:0.781951;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1.65513, 1.65513;paint-order:fill markers stroke"
|
||||
id="rect1563-3"
|
||||
width="1.2475514"
|
||||
height="1.2941761"
|
||||
x="10.620297"
|
||||
y="11.629229"
|
||||
rx="0"
|
||||
ry="0" />
|
||||
<rect
|
||||
style="opacity:0.998;fill:#000000;stroke:none;stroke-width:0.781951;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1.65513, 1.65513;paint-order:fill markers stroke"
|
||||
id="rect1563-6"
|
||||
width="1.2475514"
|
||||
height="1.2941761"
|
||||
x="9.0350676"
|
||||
y="14.689091"
|
||||
rx="0"
|
||||
ry="0" />
|
||||
<rect
|
||||
style="opacity:0.998;fill:#000000;stroke:none;stroke-width:0.781951;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1.65513, 1.65513;paint-order:fill markers stroke"
|
||||
id="rect1563-7"
|
||||
width="1.2475514"
|
||||
height="1.2941761"
|
||||
x="14.12255"
|
||||
y="15.278944"
|
||||
rx="0"
|
||||
ry="0" />
|
||||
<rect
|
||||
style="opacity:0.998;fill:#000000;stroke:none;stroke-width:0.781951;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1.65513, 1.65513;paint-order:fill markers stroke"
|
||||
id="rect1563-5"
|
||||
width="1.2475514"
|
||||
height="1.2941761"
|
||||
x="15.634048"
|
||||
y="11.481765"
|
||||
rx="0"
|
||||
ry="0" />
|
||||
<rect
|
||||
style="opacity:0.998;fill:#000000;stroke:none;stroke-width:0.781951;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1.65513, 1.65513;paint-order:fill markers stroke"
|
||||
id="rect1563-35"
|
||||
width="1.2475514"
|
||||
height="1.2941761"
|
||||
x="14.491208"
|
||||
y="8.9748898"
|
||||
rx="0"
|
||||
ry="0" />
|
||||
<rect
|
||||
style="opacity:0.998;fill:#000000;stroke:none;stroke-width:0.781951;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1.65513, 1.65513;paint-order:fill markers stroke"
|
||||
id="rect1563-62"
|
||||
width="1.2475514"
|
||||
height="1.2941761"
|
||||
x="6.5650582"
|
||||
y="14.504762"
|
||||
rx="0"
|
||||
ry="0" />
|
||||
<rect
|
||||
style="opacity:0.998;fill:#000000;stroke:none;stroke-width:0.781951;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1.65513, 1.65513;paint-order:fill markers stroke"
|
||||
id="rect1563-9"
|
||||
width="1.2475514"
|
||||
height="1.2941761"
|
||||
x="7.8922276"
|
||||
y="9.9702663"
|
||||
rx="0"
|
||||
ry="0" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.7 KiB |
BIN
story-editor/assets/check-mark.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
1
story-editor/assets/close-outline.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3,16.74L7.76,12L3,7.26L7.26,3L12,7.76L16.74,3L21,7.26L16.24,12L21,16.74L16.74,21L12,16.24L7.26,21L3,16.74M12,13.41L16.74,18.16L18.16,16.74L13.41,12L18.16,7.26L16.74,5.84L12,10.59L7.26,5.84L5.84,7.26L10.59,12L5.84,16.74L7.26,18.16L12,13.41Z" /></svg>
|
||||
|
After Width: | Height: | Size: 319 B |
BIN
story-editor/assets/file-document-plus-outline.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
39
story-editor/assets/file-document-plus-outline.svg
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="file-document-plus-outline.svg"
|
||||
inkscape:export-filename="file-document-plus-outline.png"
|
||||
inkscape:export-xdpi="599.172"
|
||||
inkscape:export-ydpi="599.172"
|
||||
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="35.06856"
|
||||
inkscape:cx="4.6908114"
|
||||
inkscape:cy="10.707597"
|
||||
inkscape:window-width="2112"
|
||||
inkscape:window-height="1436"
|
||||
inkscape:window-x="1352"
|
||||
inkscape:window-y="380"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg4" />
|
||||
<path
|
||||
d="M23 18H20V15H18V18H15V20H18V23H20V20H23M6 2C4.89 2 4 2.9 4 4V20C4 21.11 4.89 22 6 22H13.81C13.45 21.38 13.2 20.7 13.08 20H6V4H13V9H18V13.08C18.33 13.03 18.67 13 19 13C19.34 13 19.67 13.03 20 13.08V8L14 2M8 12V14H16V12M8 16V18H13V16Z"
|
||||
id="path2" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
1
story-editor/assets/floppy.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M5,3A2,2 0 0,0 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5.5L18.5,3H17V9A1,1 0 0,1 16,10H8A1,1 0 0,1 7,9V3H5M12,4V9H15V4H12M7,12H17A1,1 0 0,1 18,13V19H6V13A1,1 0 0,1 7,12Z" /></svg>
|
||||
|
After Width: | Height: | Size: 249 B |
1
story-editor/assets/folder-open-outline.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M6.1,10L4,18V8H21A2,2 0 0,0 19,6H12L10,4H4A2,2 0 0,0 2,6V18A2,2 0 0,0 4,20H19C19.9,20 20.7,19.4 20.9,18.5L23.2,10H6.1M19,18H6L7.6,12H20.6L19,18Z" /></svg>
|
||||
|
After Width: | Height: | Size: 223 B |
1
story-editor/assets/folder-open.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19,20H4C2.89,20 2,19.1 2,18V6C2,4.89 2.89,4 4,4H10L12,6H19A2,2 0 0,1 21,8H21L4,8V18L6.14,10H23.21L20.93,18.5C20.7,19.37 19.92,20 19,20Z" /></svg>
|
||||
|
After Width: | Height: | Size: 215 B |
BIN
story-editor/assets/home.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
story-editor/assets/left.png
Normal file
|
After Width: | Height: | Size: 7 KiB |
BIN
story-editor/assets/pause.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
41
story-editor/assets/play-circle-green.svg
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="play-circle-green.svg"
|
||||
inkscape:export-filename="play-circle-green.png"
|
||||
inkscape:export-xdpi="599.172"
|
||||
inkscape:export-ydpi="599.172"
|
||||
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="38.514415"
|
||||
inkscape:cx="8.0619166"
|
||||
inkscape:cy="14.708779"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1136"
|
||||
inkscape:window-x="3840"
|
||||
inkscape:window-y="40"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:deskcolor="#d1d1d1" />
|
||||
<path
|
||||
d="M10,16.5V7.5L16,12M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z"
|
||||
id="path2"
|
||||
style="fill:#4e9a06" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
BIN
story-editor/assets/play-circle.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
38
story-editor/assets/play-circle.svg
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="play-circle.svg"
|
||||
inkscape:export-filename="/mnt/data/git/OpenStoryTeller/software/ost_editor/assets/play-circle.png"
|
||||
inkscape:export-xdpi="599.172"
|
||||
inkscape:export-ydpi="599.172"
|
||||
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="15.153839"
|
||||
inkscape:cx="2.5406103"
|
||||
inkscape:cy="15.738586"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1136"
|
||||
inkscape:window-x="3840"
|
||||
inkscape:window-y="40"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4" />
|
||||
<path
|
||||
d="M10,16.5V7.5L16,12M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z"
|
||||
id="path2" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
BIN
story-editor/assets/play.png
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
BIN
story-editor/assets/right.png
Normal file
|
After Width: | Height: | Size: 7 KiB |
1
story-editor/assets/volume-high.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14,3.23V5.29C16.89,6.15 19,8.83 19,12C19,15.17 16.89,17.84 14,18.7V20.77C18,19.86 21,16.28 21,12C21,7.72 18,4.14 14,3.23M16.5,12C16.5,10.23 15.5,8.71 14,7.97V16C15.5,15.29 16.5,13.76 16.5,12M3,9V15H7L12,20V4L7,9H3Z" /></svg>
|
||||
|
After Width: | Height: | Size: 294 B |
BIN
story-editor/assets/volume-off.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
38
story-editor/assets/volume-off.svg
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="volume-off.svg"
|
||||
inkscape:export-filename="/mnt/data/git/open-story-teller/story-editor/assets/volume-off.png"
|
||||
inkscape:export-xdpi="599.172"
|
||||
inkscape:export-ydpi="599.172"
|
||||
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="36.375"
|
||||
inkscape:cx="10.62543"
|
||||
inkscape:cy="12"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1136"
|
||||
inkscape:window-x="3840"
|
||||
inkscape:window-y="40"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4" />
|
||||
<path
|
||||
d="M12,4L9.91,6.09L12,8.18M4.27,3L3,4.27L7.73,9H3V15H7L12,20V13.27L16.25,17.53C15.58,18.04 14.83,18.46 14,18.7V20.77C15.38,20.45 16.63,19.82 17.68,18.96L19.73,21L21,19.73L12,10.73M19,12C19,12.94 18.8,13.82 18.46,14.64L19.97,16.15C20.62,14.91 21,13.5 21,12C21,7.72 18,4.14 14,3.23V5.29C16.89,6.15 19,8.83 19,12M16.5,12C16.5,10.23 15.5,8.71 14,7.97V10.18L16.45,12.63C16.5,12.43 16.5,12.21 16.5,12Z"
|
||||
id="path2" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
BIN
story-editor/assets/welcome.png
Normal file
|
After Width: | Height: | Size: 290 KiB |
|
|
@ -106,6 +106,8 @@ public:
|
|||
|
||||
virtual void Draw() = 0;
|
||||
|
||||
virtual void DrawProperties() = 0;
|
||||
|
||||
void SetPosition(int x, int y);
|
||||
|
||||
void FrameStart();
|
||||
|
|
@ -115,9 +117,19 @@ public:
|
|||
|
||||
uint32_t Outputs() const { return m_node->Outputs.size(); }
|
||||
|
||||
void SetType(const std::string &type)
|
||||
{
|
||||
m_type = type;
|
||||
}
|
||||
|
||||
std::string GetType() const
|
||||
{
|
||||
return m_type;
|
||||
}
|
||||
|
||||
void SetId(const int id) { m_id = id; }
|
||||
int GetId() const { return m_id; }
|
||||
int GetInternalId() const { return m_node->ID.Get(); }
|
||||
unsigned long GetInternalId() const { return m_node->ID.Get(); }
|
||||
|
||||
void seTitle(const std::string &title) { m_title = title; }
|
||||
std::string getTitle() const { return m_title; }
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ EmulatorWindow::EmulatorWindow()
|
|||
: WindowBase("Emulator")
|
||||
{
|
||||
|
||||
Gui::LoadRawImage("assets/play.png", m_playImage);
|
||||
}
|
||||
|
||||
void EmulatorWindow::Initialize() {
|
||||
|
|
@ -21,16 +22,19 @@ void EmulatorWindow::Draw()
|
|||
// return;
|
||||
// }
|
||||
|
||||
|
||||
static ImVec2 size(320.0f, 240.0f);
|
||||
|
||||
WindowBase::BeginDraw();
|
||||
ImGui::SetWindowSize(ImVec2(626, 744), ImGuiCond_FirstUseEver);
|
||||
|
||||
// ImGui::Image((void*)(intptr_t)my_image_texture, ImVec2(313, 367));
|
||||
|
||||
float sz = ImGui::GetTextLineHeight();
|
||||
// float sz = ImGui::GetTextLineHeight();
|
||||
ImVec2 p = ImGui::GetCursorScreenPos();
|
||||
ImGui::GetWindowDrawList()->AddRectFilled(p, ImVec2(p.x + sz, p.y + sz), ImGui::GetColorU32(ImVec4(1.0, 1.0, 1.0, 1.0)));
|
||||
ImGui::GetWindowDrawList()->AddRectFilled(p, ImVec2(p.x + 320, p.y + 240), ImGui::GetColorU32(ImVec4(1.0, 1.0, 1.0, 1.0)));
|
||||
|
||||
ImGui::SetCursorScreenPos(ImVec2(p.x, p.y + 240));
|
||||
ImGui::ImageButton("play", m_playImage.texture, ImVec2(45, 45));
|
||||
|
||||
WindowBase::EndDraw();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "window_base.h"
|
||||
#include "gui.h"
|
||||
|
||||
class EmulatorWindow : public WindowBase
|
||||
{
|
||||
|
|
@ -11,6 +12,9 @@ public:
|
|||
virtual void Draw() override;
|
||||
|
||||
private:
|
||||
Gui::Image m_playImage;
|
||||
Gui::Image m_pauseImage;
|
||||
Gui::Image m_homeImage;
|
||||
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -165,6 +165,7 @@ void MainWindow::Initialize()
|
|||
editor.Initialize();
|
||||
m_emulatorWindow.Initialize();
|
||||
m_nodeEditorWindow.Initialize();
|
||||
m_nodePropertiesWindow.Initialize();
|
||||
|
||||
LoadParams();
|
||||
}
|
||||
|
|
@ -596,6 +597,8 @@ void MainWindow::Loop()
|
|||
m_resourcesWindow.Draw();
|
||||
m_nodeEditorWindow.Draw();
|
||||
|
||||
m_nodePropertiesWindow.SetSelectedNode(m_nodeEditorWindow.GetSelectedNode());
|
||||
m_nodePropertiesWindow.Draw();
|
||||
|
||||
ShowOptionsWindow();
|
||||
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
#include "emulator_window.h"
|
||||
#include "resources_window.h"
|
||||
#include "node_editor_window.h"
|
||||
#include "node_properties_window.h"
|
||||
|
||||
#include "chip32_assembler.h"
|
||||
#include "chip32_vm.h"
|
||||
|
|
@ -106,6 +107,9 @@ private:
|
|||
|
||||
NodeEditorWindow m_nodeEditorWindow;
|
||||
|
||||
NodePropertiesWindow m_nodePropertiesWindow;
|
||||
|
||||
|
||||
char mBufAddress[200];
|
||||
char mBufReceivePath[200];
|
||||
char mBufSendPath[200];
|
||||
|
|
|
|||
|
|
@ -57,40 +57,9 @@ void MediaNode::Draw()
|
|||
|
||||
|
||||
|
||||
ImGui::AlignTextToFramePadding();
|
||||
ImGui::Text("Image");
|
||||
ImGui::SameLine();
|
||||
|
||||
ImGui::Text("%s", m_image.name.c_str());
|
||||
|
||||
ImGui::SameLine();
|
||||
|
||||
bool do_popup = false;
|
||||
std::string type = "sound";
|
||||
if (ImGui::Button("Select...")) {
|
||||
do_popup = true; // Instead of saying OpenPopup() here, we set this bool, which is used later in the Deferred Pop-up Section
|
||||
type = "image";
|
||||
}
|
||||
|
||||
// Use AlignTextToFramePadding() to align text baseline to the baseline of framed elements
|
||||
// (otherwise a Text+SameLine+Button sequence will have the text a little too high by default)
|
||||
|
||||
ImGui::AlignTextToFramePadding();
|
||||
ImGui::Text("Sound");
|
||||
ImGui::SameLine();
|
||||
|
||||
ImGui::Text("%s", m_soundName.c_str());
|
||||
|
||||
ImGui::SameLine();
|
||||
|
||||
if (ImGui::Button(m_buttonUniqueName.c_str()))
|
||||
{
|
||||
m_project.PlaySoundFile(m_soundPath);
|
||||
}
|
||||
|
||||
if (ImGui::Button("Select...")) {
|
||||
do_popup = true; // Instead of saying OpenPopup() here, we set this bool, which is used later in the Deferred Pop-up Section
|
||||
}
|
||||
|
||||
ImGui::AlignTextToFramePadding();
|
||||
ImGui::Text("Outputs:");
|
||||
|
|
@ -119,47 +88,9 @@ void MediaNode::Draw()
|
|||
DrawPins();
|
||||
|
||||
|
||||
if (do_popup) {
|
||||
ImGui::OpenPopup("popup_button"); // Cause openpopup to stick open.
|
||||
do_popup = false; // disable bool so that if we click off the popup, it doesn't open the next frame.
|
||||
}
|
||||
|
||||
// This is the actual popup Gui drawing section.
|
||||
if (ImGui::BeginPopup("popup_button")) {
|
||||
// Note: if it weren't for the child window, we would have to PushItemWidth() here to avoid a crash!
|
||||
ImGui::TextDisabled("Choose media file:");
|
||||
|
||||
|
||||
static int item_current_idx = 0; // Here we store our selection data as an index.
|
||||
if (ImGui::BeginListBox("listbox media"))
|
||||
{
|
||||
auto [filtreDebut, filtreFin] = m_project.Sounds();
|
||||
int n = 0;
|
||||
for (auto it = filtreDebut; it != filtreFin; ++it, n++)
|
||||
{
|
||||
const bool is_selected = (item_current_idx == n);
|
||||
if (ImGui::Selectable((*it)->file.c_str(), is_selected))
|
||||
item_current_idx = n;
|
||||
|
||||
// Set the initial focus when opening the combo (scrolling + keyboard navigation focus)
|
||||
if (is_selected)
|
||||
ImGui::SetItemDefaultFocus();
|
||||
}
|
||||
ImGui::EndListBox();
|
||||
}
|
||||
|
||||
|
||||
if (ImGui::Button("Ok")) {
|
||||
|
||||
ImGui::CloseCurrentPopup(); // These calls revoke the popup open state, which was set by OpenPopup above.
|
||||
}
|
||||
|
||||
ImGui::EndChild();
|
||||
ImGui::EndPopup(); // Note this does not do anything to the popup open/close state. It just terminates the content declaration.
|
||||
}
|
||||
|
||||
|
||||
BaseNode::FrameEnd();
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -179,3 +110,57 @@ void MediaNode::FromJson(nlohmann::json &j)
|
|||
m_soundName = j["sound"].get<std::string>();
|
||||
m_soundPath = m_project.BuildFullAssetsPath(m_soundName);
|
||||
}
|
||||
|
||||
void MediaNode::DrawProperties()
|
||||
{
|
||||
ImGui::AlignTextToFramePadding();
|
||||
ImGui::Text("Image");
|
||||
ImGui::SameLine();
|
||||
|
||||
ImGui::Text("%s", m_image.name.c_str());
|
||||
|
||||
ImGui::SameLine();
|
||||
|
||||
std::string type = "sound";
|
||||
if (ImGui::Button("Select...##image")) {
|
||||
type = "image";
|
||||
ImGui::OpenPopup("popup_button");
|
||||
}
|
||||
|
||||
ImGui::AlignTextToFramePadding();
|
||||
ImGui::Text("Sound");
|
||||
ImGui::SameLine();
|
||||
|
||||
ImGui::Text("%s", m_soundName.c_str());
|
||||
|
||||
ImGui::SameLine();
|
||||
|
||||
if (ImGui::Button(m_buttonUniqueName.c_str()))
|
||||
{
|
||||
m_project.PlaySoundFile(m_soundPath);
|
||||
}
|
||||
|
||||
if (ImGui::Button("Select...##sound")) {
|
||||
ImGui::OpenPopup("popup_button");
|
||||
}
|
||||
|
||||
|
||||
// This is the actual popup Gui drawing section.
|
||||
if (ImGui::BeginPopup("popup_button")) {
|
||||
ImGui::SeparatorText("Sounds");
|
||||
|
||||
static int item_current_idx = 0; // Here we store our selection data as an index.
|
||||
|
||||
|
||||
auto [filtreDebut, filtreFin] = m_project.Sounds();
|
||||
int n = 0;
|
||||
for (auto it = filtreDebut; it != filtreFin; ++it, n++)
|
||||
{
|
||||
if (ImGui::Selectable((*it)->file.c_str()), n == item_current_idx)
|
||||
item_current_idx = n;
|
||||
}
|
||||
|
||||
ImGui::EndPopup(); // Note this does not do anything to the popup open/close state. It just terminates the content declaration.
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,11 +20,15 @@ public:
|
|||
|
||||
virtual void FromJson(nlohmann::json &j) override;
|
||||
|
||||
virtual void DrawProperties() override;
|
||||
|
||||
private:
|
||||
IStoryProject &m_project;
|
||||
Gui::Image m_image;
|
||||
std::string m_soundName;
|
||||
std::string m_soundPath;
|
||||
|
||||
std::string m_id;
|
||||
|
||||
std::string m_buttonUniqueName;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -50,13 +50,14 @@ void NodeEditorWindow::LoadNode(const nlohmann::json &nodeJson)
|
|||
auto n = createNode(type, "", m_project);
|
||||
if (n)
|
||||
{
|
||||
n->SetType(type); // FIXME: set type in createNode factory?
|
||||
n->SetId(restoredNodeId);
|
||||
nlohmann::json posJson = nodeJson["position"];
|
||||
n->SetOutputs(nodeJson["outPortCount"].get<int>());
|
||||
n->SetPosition(posJson["x"].get<int>(), posJson["y"].get<int>());
|
||||
n->FromJson(internalDataJson);
|
||||
|
||||
m_nodes[restoredNodeId] = n;
|
||||
m_nodes[n->GetInternalId()] = n;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -71,7 +72,7 @@ void NodeEditorWindow::LoadNode(const nlohmann::json &nodeJson)
|
|||
}
|
||||
|
||||
|
||||
ed::PinId NodeEditorWindow::GetInputPin(int modelNodeId, int pinIndex)
|
||||
ed::PinId NodeEditorWindow::GetInputPin(unsigned long modelNodeId, int pinIndex)
|
||||
{
|
||||
ed::PinId id = -1;
|
||||
|
||||
|
|
@ -86,7 +87,7 @@ ed::PinId NodeEditorWindow::GetInputPin(int modelNodeId, int pinIndex)
|
|||
return id;
|
||||
}
|
||||
|
||||
ed::PinId NodeEditorWindow::GetOutputPin(int modelNodeId, int pinIndex)
|
||||
ed::PinId NodeEditorWindow::GetOutputPin(unsigned long modelNodeId, int pinIndex)
|
||||
{
|
||||
ed::PinId id = -1;
|
||||
|
||||
|
|
@ -126,17 +127,39 @@ void NodeEditorWindow::Load(const nlohmann::json &model)
|
|||
|
||||
|
||||
// ImGui stuff for links
|
||||
conn->Id = 100000 + BaseNode::GetNextId();
|
||||
conn->Id = BaseNode::GetNextId();
|
||||
conn->InputId = GetInputPin(conn->model.inNodeId, conn->model.inPortIndex);
|
||||
conn->OutputId = GetOutputPin(conn->model.outNodeId, conn->model.outPortIndex);
|
||||
|
||||
// Since we accepted new link, lets add one to our list of links.
|
||||
m_links.push_back(conn);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
std::shared_ptr<BaseNode> NodeEditorWindow::GetSelectedNode()
|
||||
{
|
||||
std::shared_ptr<BaseNode> selected;
|
||||
|
||||
ed::SetCurrentEditor(m_context);
|
||||
if (ed::GetSelectedObjectCount() > 0)
|
||||
{
|
||||
ed::NodeId nId;
|
||||
int nodeCount = ed::GetSelectedNodes(&nId, 1);
|
||||
|
||||
if (nodeCount > 0)
|
||||
{
|
||||
if (m_nodes.contains(nId.Get()))
|
||||
{
|
||||
selected = m_nodes[nId.Get()];
|
||||
}
|
||||
}
|
||||
}
|
||||
ed::SetCurrentEditor(nullptr);
|
||||
|
||||
return selected;
|
||||
}
|
||||
|
||||
|
||||
void NodeEditorWindow::Draw()
|
||||
{
|
||||
if (WindowBase::BeginDraw())
|
||||
|
|
@ -148,7 +171,9 @@ void NodeEditorWindow::Draw()
|
|||
|
||||
for (const auto & n : m_nodes)
|
||||
{
|
||||
ImGui::PushID(n.first);
|
||||
n.second->Draw();
|
||||
ImGui::PopID();
|
||||
}
|
||||
|
||||
for (const auto& linkInfo : m_links)
|
||||
|
|
@ -180,10 +205,10 @@ void NodeEditorWindow::Draw()
|
|||
if (ed::AcceptNewItem())
|
||||
{
|
||||
// Since we accepted new link, lets add one to our list of links.
|
||||
// m_Links.push_back({ ed::LinkId(BaseNode::GetNextId()), inputPinId, outputPinId });
|
||||
// m_Links.push_back({ ed::LinkId(BaseNode::GetNextId()), inputPinId, outputPinId });
|
||||
|
||||
// Draw new link.
|
||||
// ed::Link(m_Links.back().Id, m_Links.back().InputId, m_Links.back().OutputId);
|
||||
// ed::Link(m_Links.back().Id, m_Links.back().InputId, m_Links.back().OutputId);
|
||||
}
|
||||
|
||||
// You may choose to reject connection between these nodes
|
||||
|
|
|
|||
|
|
@ -47,13 +47,14 @@ public:
|
|||
void Clear();
|
||||
void Load(const nlohmann::json &model);
|
||||
|
||||
std::shared_ptr<BaseNode> GetSelectedNode();
|
||||
private:
|
||||
IStoryProject &m_project;
|
||||
|
||||
ed::EditorContext* m_context = nullptr;
|
||||
|
||||
// key: Id
|
||||
std::map<int, std::shared_ptr<BaseNode>> m_nodes;
|
||||
std::map<unsigned long, std::shared_ptr<BaseNode>> m_nodes;
|
||||
std::vector<std::shared_ptr<LinkInfo>> m_links; // List of live links. It is dynamic unless you want to create read-only view over nodes.
|
||||
void ToolbarUI();
|
||||
|
||||
|
|
@ -99,7 +100,7 @@ private:
|
|||
}
|
||||
|
||||
void LoadNode(const nlohmann::json &nodeJson);
|
||||
ed::PinId GetInputPin(int modelNodeId, int pinIndex);
|
||||
ed::PinId GetOutputPin(int modelNodeId, int pinIndex);
|
||||
ed::PinId GetInputPin(unsigned long modelNodeId, int pinIndex);
|
||||
ed::PinId GetOutputPin(unsigned long modelNodeId, int pinIndex);
|
||||
};
|
||||
|
||||
|
|
|
|||
42
story-editor/src/node_properties_window.cpp
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
#include "node_properties_window.h"
|
||||
#include "gui.h"
|
||||
|
||||
NodePropertiesWindow::NodePropertiesWindow()
|
||||
: WindowBase("Properties")
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void NodePropertiesWindow::Initialize() {
|
||||
|
||||
int my_image_width = 0;
|
||||
int my_image_height = 0;
|
||||
|
||||
}
|
||||
|
||||
void NodePropertiesWindow::Draw()
|
||||
{
|
||||
// if (!IsVisible())
|
||||
// {
|
||||
// return;
|
||||
// }
|
||||
|
||||
|
||||
WindowBase::BeginDraw();
|
||||
ImGui::SetWindowSize(ImVec2(626, 744), ImGuiCond_FirstUseEver);
|
||||
|
||||
|
||||
static char buf1[32] = ""; ImGui::InputText("Title", buf1, 32);
|
||||
|
||||
if (m_selectedNode)
|
||||
{
|
||||
m_selectedNode->DrawProperties();
|
||||
}
|
||||
|
||||
WindowBase::EndDraw();
|
||||
}
|
||||
|
||||
void NodePropertiesWindow::SetSelectedNode(std::shared_ptr<BaseNode> node)
|
||||
{
|
||||
m_selectedNode = node;
|
||||
}
|
||||
22
story-editor/src/node_properties_window.h
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
#pragma once
|
||||
|
||||
#include "window_base.h"
|
||||
#include "gui.h"
|
||||
|
||||
#include "base_node.h"
|
||||
|
||||
class NodePropertiesWindow : public WindowBase
|
||||
{
|
||||
public:
|
||||
NodePropertiesWindow();
|
||||
|
||||
void Initialize();
|
||||
virtual void Draw() override;
|
||||
|
||||
void SetSelectedNode(std::shared_ptr<BaseNode> node);
|
||||
|
||||
private:
|
||||
std::shared_ptr<BaseNode> m_selectedNode;
|
||||
|
||||
};
|
||||
|
||||