Skip to content

Commit c69a700

Browse files
Merge pull request #400 from FlyAndNotDown/master
Feat: WebUI Update
2 parents 1a71cfa + 462f580 commit c69a700

12 files changed

Lines changed: 557 additions & 31 deletions

File tree

Editor/Include/Editor/Widget/ProjectHub.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,25 @@
77
#include <Editor/Widget/WebWidget.h>
88

99
namespace Editor {
10+
class ProjectHub;
11+
12+
class ProjectHubBridge final : public QObject {
13+
Q_OBJECT
14+
15+
public:
16+
explicit ProjectHubBridge(ProjectHub* parent = nullptr);
17+
18+
public Q_SLOTS:
19+
void CreateProject() const;
20+
};
21+
1022
class ProjectHub final : public WebWidget {
1123
Q_OBJECT
1224

1325
public:
1426
explicit ProjectHub(QWidget* inParent = nullptr);
27+
28+
private:
29+
ProjectHubBridge* bridge;
1530
};
1631
}

Editor/Include/Editor/Widget/WebWidget.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#pragma once
66

7+
#include <QWebChannel>
78
#include <QWebEngineView>
89

910
namespace Editor {
@@ -15,5 +16,11 @@ namespace Editor {
1516
~WebWidget() override;
1617

1718
void Load(const std::string& inUrl);
19+
20+
protected:
21+
QWebChannel* GetWebChannel() const;
22+
23+
private:
24+
QWebChannel* webChannel;
1825
};
1926
}

Editor/Src/WebUIServer.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ namespace Editor {
2121
serverThread = std::make_unique<Common::NamedThread>("WebUIServerThread", [this]() -> void {
2222
server = Common::MakeUnique<httplib::Server>();
2323
server->set_mount_point("/", "./Web");
24+
server->Get("/(.+)", [](const httplib::Request&, httplib::Response& res) {
25+
res.set_file_content("./Web/index.html");
26+
});
2427
server->listen("localhost", caWebUIPort.GetValue());
2528
});
2629
}

Editor/Src/Widget/ProjectHub.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,31 @@
22
// Created by johnk on 2025/8/3.
33
//
44

5+
#include <QWebChannel>
6+
57
#include <Editor/Widget/ProjectHub.h>
68
#include <Editor/Widget/moc_ProjectHub.cpp>
9+
#include <Core/Log.h>
710

811
namespace Editor {
12+
ProjectHubBridge::ProjectHubBridge(ProjectHub* parent)
13+
: QObject(parent)
14+
{
15+
}
16+
17+
void ProjectHubBridge::CreateProject() const
18+
{
19+
// TODO
20+
LogInfo(ProjectHub, "ProjectHubBridge::CreateProject");
21+
}
22+
923
ProjectHub::ProjectHub(QWidget* inParent)
1024
: WebWidget(inParent)
1125
{
1226
setFixedSize(800, 600);
1327
Load("/project-hub");
28+
29+
bridge = new ProjectHubBridge(this);
30+
GetWebChannel()->registerObject("bridge", bridge);
1431
}
1532
} // namespace Editor

Editor/Src/Widget/WebWidget.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#include <Editor/Widget/moc_WebWidget.cpp>
88

99
static Core::CmdlineArgValue<bool> caWebUIDev(
10-
"wevUIDev", "-wevUIDev", false,
10+
"webUIDev", "-webUIDev", false,
1111
"Whether to enable hot reload for web UI");
1212

1313
static Core::CmdlineArgValue<uint32_t> caWebUIDevServerPort(
@@ -18,6 +18,8 @@ namespace Editor {
1818
WebWidget::WebWidget(QWidget* inParent)
1919
: QWebEngineView(inParent)
2020
{
21+
webChannel = new QWebChannel(this);
22+
page()->setWebChannel(webChannel);
2123
}
2224

2325
WebWidget::~WebWidget() = default;
@@ -31,4 +33,9 @@ namespace Editor {
3133
const std::string fullUrl = baseUrl + inUrl;
3234
load(QUrl(fullUrl.c_str()));
3335
}
36+
37+
QWebChannel* WebWidget::GetWebChannel() const
38+
{
39+
return webChannel;
40+
}
3441
} // namespace Editor

Editor/Web/package.json

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,24 +10,25 @@
1010
"preview": "vite preview"
1111
},
1212
"dependencies": {
13+
"@heroui/avatar": "^2.2.20",
14+
"@heroui/breadcrumbs": "^2.2.20",
1315
"@heroui/button": "^2.2.24",
16+
"@heroui/chip": "^2.2.20",
1417
"@heroui/code": "^2.2.18",
1518
"@heroui/dropdown": "^2.3.24",
19+
"@heroui/form": "^2.1.24",
1620
"@heroui/input": "^2.4.25",
17-
"@heroui/breadcrumbs": "^2.2.20",
18-
"@heroui/avatar": "^2.2.20",
1921
"@heroui/kbd": "^2.2.19",
2022
"@heroui/link": "^2.2.21",
21-
"@heroui/tabs": "^2.2.21",
2223
"@heroui/navbar": "^2.2.22",
24+
"@heroui/react": "^2.8.2",
2325
"@heroui/snippet": "^2.2.25",
24-
"@heroui/form": "^2.1.24",
2526
"@heroui/switch": "^2.2.22",
26-
"@heroui/chip": "^2.2.20",
27-
"@heroui/user": "^2.2.20",
2827
"@heroui/system": "^2.4.20",
28+
"@heroui/tabs": "^2.2.21",
2929
"@heroui/theme": "^2.4.20",
3030
"@heroui/use-theme": "2.1.10",
31+
"@heroui/user": "^2.2.20",
3132
"@react-aria/visually-hidden": "3.8.26",
3233
"@react-types/shared": "3.31.0",
3334
"@tailwindcss/postcss": "4.1.11",

Editor/Web/src/App.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { Route, Routes } from "react-router-dom";
2-
import ProjectHubPage from "@/pages/project-hub";
1+
import { Route, Routes } from 'react-router-dom';
2+
import ProjectHubPage from '@/pages/project-hub';
33

44
function App() {
55
return (
66
<Routes>
7-
<Route element={<ProjectHubPage/>} path="/project-hub"/>
7+
<Route element={<ProjectHubPage/>} path='/project-hub'/>
88
</Routes>
99
);
1010
}

Editor/Web/src/main.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
import React from "react";
2-
import ReactDOM from "react-dom/client";
3-
import { BrowserRouter } from "react-router-dom";
1+
import React from 'react';
2+
import ReactDOM from 'react-dom/client';
3+
import { BrowserRouter } from 'react-router-dom';
44

5-
import App from "./App.tsx";
6-
import { Provider } from "./provider.tsx";
7-
import "@/styles/globals.css";
5+
import App from './App.tsx';
6+
import { Provider } from './provider.tsx';
7+
import '@/styles/globals.css';
88

9-
ReactDOM.createRoot(document.getElementById("root")!).render(
9+
ReactDOM.createRoot(document.getElementById('root')!).render(
1010
<React.StrictMode>
1111
<BrowserRouter>
1212
<Provider>
13-
<main className="dark text-foreground bg-background">
13+
<main className='dark text-foreground bg-background'>
1414
<App />
1515
</main>
1616
</Provider>

Editor/Web/src/pages/project-hub.tsx

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,32 @@
1-
import { Tabs, Tab } from "@heroui/tabs";
2-
import { User } from "@heroui/user";
3-
import { Form } from "@heroui/form";
4-
import { Button } from "@heroui/button";
5-
import { Input } from "@heroui/input";
1+
import { useEffect } from "react";
2+
import { QWebChannel } from '@/qwebchannel'
3+
import { Tabs, Tab } from '@heroui/tabs';
4+
import { User } from '@heroui/user';
5+
import { Form } from '@heroui/form';
6+
import { Button } from '@heroui/button';
7+
import { Input } from '@heroui/input';
68

79
export default function ProjectHubPage() {
10+
useEffect(() => {
11+
new QWebChannel(window.qt.webChannelTransport, (channel: QWebChannel) : void => {
12+
window.bridge = channel.objects.bridge;
13+
})
14+
}, []);
15+
16+
function onCreateProject(): void
17+
{
18+
window.bridge.CreateProject();
19+
}
20+
821
return (
922
<div className='h-screen p-6'>
1023
<div className='mb-4'>
1124
<User
1225
avatarProps={{
13-
src: "/logo.png",
26+
src: '/logo.png',
1427
}}
15-
description="v0.0.1"
16-
name="Explosion Game Engine"
28+
description='v0.0.1'
29+
name='Explosion Game Engine'
1730
/>
1831
</div>
1932

@@ -23,7 +36,7 @@ export default function ProjectHubPage() {
2336
<Input fullWidth isRequired label='Project Name' labelPlacement='outside' placeholder='HelloExplosion'/>
2437
<Input fullWidth isRequired label='Project Description' labelPlacement='outside' placeholder='A simple explosion game project.'/>
2538
<Input fullWidth isRequired label='Project Path' labelPlacement='outside' placeholder='/path/to/your/project'/>
26-
<Button color='primary'>Create</Button>
39+
<Button color='primary' onPress={onCreateProject}>Create</Button>
2740
</Form>
2841
</Tab>
2942
<Tab title='Recently Projects'>

Editor/Web/src/provider.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import type { NavigateOptions } from "react-router-dom";
1+
import type { NavigateOptions } from 'react-router-dom';
22

3-
import { HeroUIProvider } from "@heroui/system";
4-
import { useHref, useNavigate } from "react-router-dom";
3+
import { HeroUIProvider } from '@heroui/system';
4+
import { useHref, useNavigate } from 'react-router-dom';
55

6-
declare module "@react-types/shared" {
6+
declare module '@react-types/shared' {
77
interface RouterConfig {
88
routerOptions: NavigateOptions;
99
}

0 commit comments

Comments
 (0)