Skip to content

Commit cadc848

Browse files
Merge pull request #411 from FlyAndNotDown/master
Feat: Misc Update
2 parents 6a43b29 + e2248ac commit cadc848

File tree

14 files changed

+140
-88
lines changed

14 files changed

+140
-88
lines changed

Editor/Include/Editor/Widget/WebWidget.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,20 @@
66

77
#include <QWebChannel>
88
#include <QWebEngineView>
9+
#include <QWebEnginePage>
910

1011
namespace Editor {
12+
class WebPage : public QWebEnginePage {
13+
Q_OBJECT
14+
15+
public:
16+
explicit WebPage(QWidget* inParent = nullptr);
17+
~WebPage() override;
18+
19+
protected:
20+
void javaScriptConsoleMessage(JavaScriptConsoleMessageLevel level, const QString& message, int lineNumber, const QString& sourceID) override;
21+
};
22+
1123
class WebWidget : public QWebEngineView {
1224
Q_OBJECT
1325

Editor/Resource/ProjectTemplates/3D/CMakeLists.txt

Lines changed: 0 additions & 5 deletions
This file was deleted.
File renamed without changes.

Editor/Src/WebUIServer.cpp

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

5+
#include <QtEnvironmentVariables>
6+
#include <QByteArrayView>
7+
58
#include <Core/Cmdline.h>
69
#include <Core/Log.h>
710
#include <Core/Paths.h>
@@ -19,6 +22,14 @@ static Core::CmdlineArgValue<uint32_t> caWebUIDevServerPort(
1922
"webUIDevServerPort", "-webUIDevServerPort", 5173,
2023
"Port of web ui dev server, which works only when dev mode enabled");
2124

25+
static Core::CmdlineArgValue<bool> caWebUIDebug(
26+
"webUIDebug", "-webUIDebug", false,
27+
"Whether to enable web ui debug (you can attach debugger to qt web engine process).");
28+
29+
static Core::CmdlineArgValue<uint32_t> caWebUIRemoteDebugPort(
30+
"webUIRemoveDebugPort", "-webUIRemoveDebugPort", 5174,
31+
"Port of web ui debug port, you can attach to the url printed in log to create debug process.");
32+
2233
namespace Editor {
2334
WebUIServer& WebUIServer::Get()
2435
{
@@ -60,6 +71,11 @@ namespace Editor {
6071

6172
baseUrl = std::format("http://localhost:{}", serverPort);
6273
LogInfo(WebUI, "{} web ui server listening on {}", serverMode, baseUrl);
74+
75+
if (caWebUIDebug.GetValue()) {
76+
const auto flags = std::format("--remote-debugging-port={}", caWebUIRemoteDebugPort.GetValue());
77+
qputenv("QTWEBENGINE_CHROMIUM_FLAGS", QByteArrayView(flags.c_str(), static_cast<qsizetype>(flags.length())));
78+
}
6379
}
6480

6581
void WebUIServer::Stop()

Editor/Src/Widget/WebWidget.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,38 @@
55
#include <Editor/Widget/WebWidget.h>
66
#include <Editor/Widget/moc_WebWidget.cpp>
77
#include <Core/Cmdline.h>
8+
#include <Core/Log.h>
89
#include <Editor/WebUIServer.h>
910

1011
namespace Editor {
12+
WebPage::WebPage(QWidget* inParent)
13+
: QWebEnginePage(inParent)
14+
{
15+
}
16+
17+
WebPage::~WebPage() = default;
18+
19+
void WebPage::javaScriptConsoleMessage(JavaScriptConsoleMessageLevel level, const QString& message, int lineNumber, const QString& sourceID)
20+
{
21+
if (level == InfoMessageLevel)
22+
{
23+
LogInfo(WebUIJavaScript, "{}", message.toStdString());
24+
}
25+
else if (level == WarningMessageLevel)
26+
{
27+
LogWarning(WebUIJavaScript, "{}", message.toStdString());
28+
}
29+
else if (level == ErrorMessageLevel)
30+
{
31+
LogError(WebUIJavaScript, "{}", message.toStdString());
32+
}
33+
}
34+
1135
WebWidget::WebWidget(QWidget* inParent)
1236
: QWebEngineView(inParent)
1337
{
1438
webChannel = new QWebChannel(this);
39+
setPage(new WebPage(this));
1540
page()->setWebChannel(webChannel);
1641
}
1742

Editor/Web/eslint.config.mjs

Lines changed: 18 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,25 @@ export default defineConfig([
100100
"react-hooks/exhaustive-deps": "off",
101101
"jsx-a11y/click-events-have-key-events": "warn",
102102
"jsx-a11y/interactive-supports-focus": "warn",
103-
"prettier/prettier": "warn",
103+
"prettier/prettier": [
104+
"warn",
105+
{
106+
"endOfLine": "auto",
107+
"singleQuote": true,
108+
"jsxSingleQuote": true,
109+
"semi": true,
110+
"printWidth": 200,
111+
"tabWidth": 2,
112+
"useTabs": false,
113+
"objectWrap": "collapse",
114+
"bracketSameLine": true,
115+
"arrowParens": "always",
116+
"singleAttributePerLine": false,
117+
}
118+
],
104119
"no-unused-vars": "off",
105120
"unused-imports/no-unused-vars": "off",
106121
"unused-imports/no-unused-imports": "warn",
107-
108122
"@typescript-eslint/no-unused-vars": [
109123
"warn",
110124
{
@@ -113,7 +127,6 @@ export default defineConfig([
113127
argsIgnorePattern: "^_.*?$",
114128
},
115129
],
116-
117130
"import/order": [
118131
"warn",
119132
{
@@ -136,12 +149,10 @@ export default defineConfig([
136149
},
137150
],
138151

139-
"newlines-between": "always",
152+
"newlines-between": "never",
140153
},
141154
],
142-
143155
"react/self-closing-comp": "warn",
144-
145156
"react/jsx-sort-props": [
146157
"warn",
147158
{
@@ -150,26 +161,7 @@ export default defineConfig([
150161
noSortAlphabetically: false,
151162
reservedFirst: true,
152163
},
153-
],
154-
155-
"padding-line-between-statements": [
156-
"warn",
157-
{
158-
blankLine: "always",
159-
prev: "*",
160-
next: "return",
161-
},
162-
{
163-
blankLine: "always",
164-
prev: ["const", "let", "var"],
165-
next: "*",
166-
},
167-
{
168-
blankLine: "any",
169-
prev: ["const", "let", "var"],
170-
next: ["const", "let", "var"],
171-
},
172-
],
164+
]
173165
},
174166
},
175167
]);

Editor/Web/src/App.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import ProjectHubPage from '@/pages/project-hub';
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: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import React from 'react';
22
import ReactDOM from 'react-dom/client';
33
import { BrowserRouter } from 'react-router-dom';
4-
5-
import App from './App.tsx';
64
import { Provider } from './provider.tsx';
5+
import App from './App.tsx';
76
import '@/styles/globals.css';
87

98
ReactDOM.createRoot(document.getElementById('root')!).render(
Lines changed: 45 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import { useEffect, useState } from 'react';
2-
import { QWebChannel } from '@/qwebchannel'
32
import { Tabs, Tab } from '@heroui/tabs';
43
import { User } from '@heroui/user';
54
import { Form } from '@heroui/form';
6-
import {Button, PressEvent} from '@heroui/button';
5+
import { Button, PressEvent } from '@heroui/button';
76
import { Input } from '@heroui/input';
87
import { Chip } from '@heroui/chip';
98
import { Listbox, ListboxItem } from '@heroui/listbox';
109
import { Avatar } from '@heroui/avatar';
11-
import { ScrollShadow } from "@heroui/scroll-shadow";
10+
import { ScrollShadow } from '@heroui/scroll-shadow';
1211
import { Select, SelectItem } from '@heroui/react';
12+
import { QWebChannel } from '@/qwebchannel';
1313

1414
interface RecentProjectInfo {
1515
name: string;
@@ -27,78 +27,86 @@ export default function ProjectHubPage() {
2727
const [projectTemplates, setProjectTemplates] = useState(Array<ProjectTemplateInfo>);
2828

2929
useEffect(() => {
30-
new QWebChannel(window.qt.webChannelTransport, (channel: QWebChannel) : void => {
30+
new QWebChannel(window.qt.webChannelTransport, (channel: QWebChannel): void => {
3131
window.backend = channel.objects.backend;
3232
setEngineVersion(window.backend.engineVersion);
3333
setRecentProjects(window.backend.recentProjects);
3434
setProjectTemplates(window.backend.projectTemplates);
35-
})
35+
});
3636
}, []);
3737

38-
function onCreateProject() : void
39-
{
38+
function onCreateProject(): void {
39+
// TODO
40+
console.error("onCreateProject()");
4041
window.backend.CreateProject();
4142
}
4243

43-
function onOpenProject(e: PressEvent) : void
44-
{
44+
function onOpenProject(e: PressEvent): void {
4545
// TODO
4646
const index = parseInt(e.target.getAttribute('data-key') as string);
4747
console.error('onOpenProject:', index);
4848
}
4949

50+
async function onBrowseProjectPath(): Promise<void> {
51+
// TODO
52+
const dirHandle = await window.showDirectoryPicker({ startIn: 'desktop' });
53+
console.error(dirHandle);
54+
}
55+
5056
return (
5157
<div className='h-screen p-6'>
5258
<div className='mb-4'>
5359
<User
54-
avatarProps={{
55-
src: '/logo.png'
56-
}}
60+
avatarProps={{ src: '/logo.png' }}
5761
description={
5862
<div className='mt-1'>
59-
<Chip className='ml-1' size='sm' color='secondary' variant='flat'>{engineVersion}</Chip>
63+
<Chip className='ml-1' color='secondary' size='sm' variant='flat'>
64+
{engineVersion}
65+
</Chip>
6066
</div>
6167
}
62-
name='Explosion Game Engine'/>
68+
name='Explosion Game Engine'
69+
/>
6370
</div>
6471

6572
<Tabs isVertical={true}>
66-
<Tab title='Recently Projects' className='w-full pr-6'>
67-
<ScrollShadow
68-
hideScrollBar
69-
className='h-[450px]'
70-
size={60}>
71-
<Listbox
72-
items={recentProjects}
73-
variant='flat'>
73+
<Tab className='w-full pr-6' title='Recently Projects'>
74+
<ScrollShadow hideScrollBar className='h-[450px]' size={60}>
75+
<Listbox items={recentProjects} variant='flat'>
7476
{recentProjects.map((item, i) => (
75-
<ListboxItem key={i} onPress={onOpenProject} textValue={item.name}>
76-
<div className='flex gap-2 items-center'>
77-
<Avatar alt={item.name} className='shrink-0' size='sm' name={item.name} />
78-
<div className='flex flex-col'>
79-
<span className='text-small'>{item.name}</span>
80-
<span className='text-tiny text-default-400'>{item.path}</span>
81-
</div>
77+
<ListboxItem key={i} textValue={item.name} onPress={onOpenProject}>
78+
<div className='flex gap-2 items-center'>
79+
<Avatar alt={item.name} className='shrink-0' name={item.name} size='sm' />
80+
<div className='flex flex-col'>
81+
<span className='text-small'>{item.name}</span>
82+
<span className='text-tiny text-default-400'>{item.path}</span>
8283
</div>
83-
</ListboxItem>
84+
</div>
85+
</ListboxItem>
8486
))}
8587
</Listbox>
8688
</ScrollShadow>
8789
</Tab>
88-
<Tab title='New Project' className='w-full pr-6'>
90+
<Tab className='w-full pr-6' title='New Project'>
8991
<Form className='w-full ml-4'>
90-
<Input fullWidth isRequired label='Project Name' labelPlacement='outside' placeholder='HelloExplosion'/>
91-
<Input fullWidth isRequired label='Project Description' labelPlacement='outside' placeholder='A simple explosion game project.'/>
92-
<Input fullWidth isRequired label='Project Path' labelPlacement='outside' placeholder='/path/to/your/project'/>
93-
<Select fullWidth isRequired label='Project Template' labelPlacement='outside' defaultSelectedKeys={['0']}>
92+
<Input fullWidth isRequired label='Project Name' labelPlacement='outside' placeholder='HelloExplosion' />
93+
<div className='flex w-full'>
94+
<Input isRequired label='Project Path' labelPlacement='outside' placeholder='/path/to/your/project' />
95+
<Button className='ml-2 mt-6' onPress={() => onBrowseProjectPath()}>
96+
Browse
97+
</Button>
98+
</div>
99+
<Select fullWidth isRequired defaultSelectedKeys={['0']} label='Project Template' labelPlacement='outside'>
94100
{projectTemplates.map((item, i) => (
95101
<SelectItem key={i}>{item.name}</SelectItem>
96102
))}
97103
</Select>
98-
<Button color='primary' onPress={onCreateProject}>Create</Button>
104+
<Button color='primary' onPress={onCreateProject}>
105+
Create
106+
</Button>
99107
</Form>
100108
</Tab>
101109
</Tabs>
102110
</div>
103111
);
104-
};
112+
}

Editor/Web/src/provider.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import type { NavigateOptions } from 'react-router-dom';
2-
32
import { HeroUIProvider } from '@heroui/system';
43
import { useHref, useNavigate } from 'react-router-dom';
54

0 commit comments

Comments
 (0)