Skip to content

Commit 2a8ee8f

Browse files
committed
Slidy slider
1 parent e357ffd commit 2a8ee8f

2 files changed

Lines changed: 89 additions & 13 deletions

File tree

examples/simple-yjs-widget/notebooks/simple.ipynb

Lines changed: 66 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"outputs": [],
99
"source": [
1010
"from ypywidgets.comm import CommWidget\n",
11-
"from pycrdt import Text"
11+
"from pycrdt import Map"
1212
]
1313
},
1414
{
@@ -18,16 +18,48 @@
1818
"metadata": {},
1919
"outputs": [],
2020
"source": [
21-
"class MyWidget(CommWidget):\n",
21+
"class MySlider(CommWidget):\n",
2222
" def __init__(self):\n",
2323
" super().__init__(\n",
2424
" comm_metadata={\n",
25-
" \"ymodel_name\": \"MyWidget\",\n",
25+
" \"ymodel_name\": \"MySlider\",\n",
2626
" \"create_ydoc\": True,\n",
2727
" }\n",
2828
" )\n",
2929
"\n",
30-
" self.ydoc[\"foo\"] = self._foo = Text()"
30+
" self.ydoc[\"state\"] = self._state = Map()\n",
31+
"\n",
32+
" @property\n",
33+
" def value(self):\n",
34+
" return self._state.get('value')\n",
35+
"\n",
36+
" @value.setter\n",
37+
" def value(self, v):\n",
38+
" self._state['value'] = v\n",
39+
"\n",
40+
" @property\n",
41+
" def min(self):\n",
42+
" return self._state.get('min')\n",
43+
"\n",
44+
" @min.setter\n",
45+
" def min(self, v):\n",
46+
" self._state['min'] = v\n",
47+
"\n",
48+
" @property\n",
49+
" def max(self):\n",
50+
" return self._state.get('max')\n",
51+
"\n",
52+
" @max.setter\n",
53+
" def max(self, v):\n",
54+
" self._state['max'] = v\n",
55+
"\n",
56+
" @property\n",
57+
" def step(self):\n",
58+
" return self._state.get('step')\n",
59+
"\n",
60+
" @step.setter\n",
61+
" def step(self, v):\n",
62+
" self._state['step'] = v"
3163
]
3264
},
3365
{
@@ -37,7 +69,7 @@
3769
"metadata": {},
3870
"outputs": [],
3971
"source": [
40-
"w = MyWidget()\n",
72+
"w = MySlider()\n",
4173
"w"
4274
]
4375
},
@@ -48,8 +80,36 @@
4880
"metadata": {},
4981
"outputs": [],
5082
"source": [
51-
"w.ydoc[\"foo\"].insert(0, 'coucou ici')"
83+
"w.value"
84+
]
85+
},
86+
{
87+
"cell_type": "code",
88+
"execution_count": null,
89+
"id": "8ac7ea5c-8315-44eb-aa62-f223f86d267d",
90+
"metadata": {},
91+
"outputs": [],
92+
"source": [
93+
"w.value = 98"
5294
]
95+
},
96+
{
97+
"cell_type": "code",
98+
"execution_count": null,
99+
"id": "bd2c92fb-9653-4de5-8a20-d463205f3a9e",
100+
"metadata": {},
101+
"outputs": [],
102+
"source": [
103+
"w.value = 36"
104+
]
105+
},
106+
{
107+
"cell_type": "code",
108+
"execution_count": null,
109+
"id": "3a5680c6-77ae-4f71-a982-b3447dcb4fd0",
110+
"metadata": {},
111+
"outputs": [],
112+
"source": []
53113
}
54114
],
55115
"metadata": {

examples/simple-yjs-widget/src/index.ts

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,31 +11,47 @@ import {
1111
JupyterFrontEndPlugin
1212
} from '@jupyterlab/application';
1313

14-
class MyWidget {
14+
class MySlider {
1515
constructor(yModel: IJupyterYModel, node: HTMLElement) {
1616
this.yModel = yModel;
1717
this.node = node;
1818

19-
this.foo = this.yModel.sharedModel.ydoc.getText('foo');
19+
this.state = this.yModel.sharedModel.ydoc.getMap('state');
2020

21-
this.foo.observe(this._attrsChanged.bind(this));
21+
this.state.observe(this._stateChanged.bind(this));
22+
23+
this.slider = document.createElement('input');
24+
this.slider.setAttribute('type', 'range');
25+
26+
this.state.set('min', 0);
27+
this.state.set('max', 100);
28+
this.state.set('value', 50);
29+
this.state.set('step', 1);
30+
31+
this._stateChanged();
32+
33+
node.appendChild(this.slider);
2234
}
2335

24-
_attrsChanged(): void {
25-
this.node.innerHTML = `foo=${this.foo.toJSON()}`;
36+
_stateChanged(): void {
37+
this.slider.setAttribute('min', this.state.get('min'));
38+
this.slider.setAttribute('max', this.state.get('max'));
39+
this.slider.setAttribute('value', this.state.get('value'));
40+
this.slider.setAttribute('step', this.state.get('step'));
2641
}
2742

28-
foo: Y.Text;
43+
state: Y.Map<any>;
2944
yModel: IJupyterYModel;
3045
node: HTMLElement;
46+
slider: HTMLElement;
3147
}
3248

3349
const simple: JupyterFrontEndPlugin<void> = {
3450
id: 'example:simple',
3551
autoStart: true,
3652
requires: [IJupyterYWidgetManager],
3753
activate: (_: JupyterFrontEnd, wm: IJupyterYWidgetManager): void => {
38-
wm.registerWidget('MyWidget', JupyterYModel, MyWidget);
54+
wm.registerWidget('MySlider', JupyterYModel, MySlider);
3955
}
4056
};
4157

0 commit comments

Comments
 (0)