Skip to content

Commit b55a6a4

Browse files
committed
wip
1 parent 1a80a70 commit b55a6a4

File tree

3 files changed

+101
-11
lines changed

3 files changed

+101
-11
lines changed

demos/note_app.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
from pywebio import start_server
2+
3+
from pywebio.output import *
4+
from pywebio.input import *
5+
from pywebio.pin import *
6+
from pywebio.session import set_env, download, hold
7+
import os
8+
import os.path as op
9+
from functools import partial
10+
11+
NOTE_HOME = op.join(op.expanduser("~"), 'pywebio-notes-app')
12+
13+
14+
@page(silent_quit=True)
15+
def note_editor(file):
16+
set_env(title=file)
17+
if not op.exists(op.join(NOTE_HOME, file)):
18+
open(op.join(NOTE_HOME, file), 'w')
19+
20+
with open(op.join(NOTE_HOME, file), 'r+') as f:
21+
md = f.read()
22+
put_textarea('md_text', rows=18, code={'mode': 'markdown'}, value=md)
23+
24+
put_markdown('## Preview')
25+
with use_scope('md', clear=True):
26+
put_markdown(md)
27+
28+
while True:
29+
change_detail = pin_wait_change('md_text')
30+
with use_scope('md', clear=True):
31+
f.truncate(0) # empty the file
32+
f.write(change_detail['value'])
33+
put_markdown(change_detail['value'], sanitize=False)
34+
35+
36+
@page()
37+
def note_viewer(file):
38+
set_env(title=file)
39+
40+
md = open(op.join(NOTE_HOME, file)).read()
41+
put_markdown(md)
42+
43+
put_button("Edit", lambda: note_editor(file))
44+
hold()
45+
46+
47+
def main():
48+
"""PyWebIO Markdown Notes Application"""
49+
set_env(output_animation=False)
50+
files = [
51+
f
52+
for f in os.listdir(NOTE_HOME)
53+
if op.isfile(op.join(NOTE_HOME, f)) and f.endswith('.md')
54+
]
55+
56+
put_button("New Note", lambda: note_editor(input("Note name")))
57+
58+
if not files:
59+
put_info("No existing notes found")
60+
else:
61+
put_table([
62+
(
63+
idx,
64+
put_button(name, partial(note_viewer, name), link_style=True),
65+
put_buttons(['Edit', 'Delete'], [partial(note_editor, name), None])
66+
)
67+
for idx, name in enumerate(files, start=1)
68+
])
69+
70+
71+
if __name__ == '__main__':
72+
if not op.exists(NOTE_HOME):
73+
os.makedirs(NOTE_HOME, exist_ok=True)
74+
75+
start_server(main, port=8080, debug=True, cdn=False)

webiojs/src/models/page.ts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,28 @@ function on_page_lost(page_id: string) {
4040
let clean_up_task_id: number = null;
4141

4242
export function OpenPage(page_id: string, task_id: string) {
43+
let page = window.open(window.location.href);
44+
if(!SubPageSession.is_sub_page(window))
45+
AddPage(page, page_id, task_id)
46+
else
47+
// @ts-ignore
48+
window._pywebio_add_page(page, page_id, task_id)
49+
}
50+
51+
export function AddPage(page: Window, page_id: string, task_id: string) {
4352
if (page_id in subpages)
4453
throw `Can't open page, the page id "${page_id}" is duplicated`;
4554

46-
if (!clean_up_task_id)
47-
clean_up_task_id = start_clean_up_task()
48-
49-
let page = window.open(window.location.href);
5055
subpages[page_id] = {page: page, task_id: task_id}
5156

5257
// the `_pywebio_page` will be resolved in new opened page in `SubPageSession.start_session()`
5358
// @ts-ignore
54-
page._pywebio_page = new LazyPromise()
59+
page._pywebio_page = new LazyPromise();
60+
// @ts-ignore
61+
page._pywebio_master_session = state.CurrentSession;
62+
// @ts-ignore
63+
page._pywebio_add_page = AddPage;
64+
5565

5666
// this event is not reliably fired by browsers
5767
// https://developer.mozilla.org/en-US/docs/Web/API/Window/pagehide_event#usage_notes
@@ -62,6 +72,9 @@ export function OpenPage(page_id: string, task_id: string) {
6272
on_page_lost(page_id)
6373
}, 100)
6474
});
75+
76+
if (!clean_up_task_id)
77+
clean_up_task_id = start_clean_up_task()
6578
}
6679

6780
export function ClosePage(page_id: string) {

webiojs/src/session.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,13 @@ export class SubPageSession implements Session {
6767

6868
// check if the window is a pywebio subpage
6969
static is_sub_page(window_obj: Window = window): boolean {
70-
// - `window._pywebio_page` lazy promise is not undefined
71-
// - window.opener is not null and window.opener.WebIO is not undefined
70+
// - `window._pywebio_page` lazy promise is defined
71+
// - window._pywebio_master_session is defined
7272

7373
try {
7474
// @ts-ignore
75-
return window_obj._pywebio_page !== undefined && window_obj.opener !== null && window_obj.opener.WebIO !== undefined;
76-
}catch (e) {
75+
return window_obj._pywebio_page !== undefined && window_obj._pywebio_master_session !== undefined;
76+
} catch (e) {
7777
return false;
7878
}
7979
}
@@ -107,12 +107,14 @@ export class SubPageSession implements Session {
107107

108108
// send text message to opener
109109
send_message(msg: ClientEvent, onprogress?: (loaded: number, total: number) => void): void {
110-
window.opener.WebIO._state.CurrentSession.send_message(msg, onprogress);
110+
// @ts-ignore
111+
window._pywebio_master_session.send_message(msg, onprogress);
111112
}
112113

113114
// send binary message to opener
114115
send_buffer(data: Blob, onprogress?: (loaded: number, total: number) => void): void {
115-
window.opener.WebIO._state.CurrentSession.send_buffer(data, onprogress);
116+
// @ts-ignore
117+
window._pywebio_master_session.send_buffer(data, onprogress);
116118
}
117119

118120
close_session(): void {

0 commit comments

Comments
 (0)