Skip to content

Commit f431afb

Browse files
committed
Start adding tree component.
1 parent 07a19da commit f431afb

File tree

14 files changed

+180
-7
lines changed

14 files changed

+180
-7
lines changed

src/pg/inputPixelEditor/__examples__/basic/basic.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export default class XPgInputPixelEditorBasic extends HTMLElement {
3838
@Part() $saveSvg: HTMLInputElement;
3939
@Part() $savePng: HTMLInputElement;
4040

41+
// MAKE A LIST COMPONENT!!!! [text | delete]
4142
@Part() $colors: HTMLPreElement;
4243
@Part() $layers: HTMLPreElement;
4344

@@ -89,6 +90,21 @@ export default class XPgInputPixelEditorBasic extends HTMLElement {
8990
});
9091
this.$file.addEventListener('change', this.handleFile.bind(this));
9192
this.$saveSvg.addEventListener('click', async () => {
93+
// @ts-ignore
94+
const handle = await window.showSaveFilePicker({
95+
suggestedName: 'Canvas',
96+
types: [{
97+
description: 'SVG Document',
98+
accept: {'image/svg+xml': ['.svg']},
99+
}],
100+
});
101+
const writable = await handle.createWritable();
102+
await writable.write(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${this.$width.value} ${this.$height.value}">`);
103+
await writable.write(`<path d="${'test'}" />`);
104+
await writable.write('</svg>');
105+
await writable.close();
106+
});
107+
this.$savePng.addEventListener('click', async () => {
92108
// @ts-ignore
93109
const handle = await window.showSaveFilePicker({
94110
suggestedName: 'CanvasName',
@@ -99,11 +115,9 @@ export default class XPgInputPixelEditorBasic extends HTMLElement {
99115
});
100116
const writable = await handle.createWritable();
101117
await writable.write('something');
118+
await writable.write
102119
await writable.close();
103120
});
104-
this.$savePng.addEventListener('click', () => {
105-
106-
});
107121
}
108122

109123
handleFile(e) {
@@ -138,7 +152,7 @@ export default class XPgInputPixelEditorBasic extends HTMLElement {
138152

139153
handleChange(e: CustomEvent) {
140154
const { value } = e.detail;
141-
this.$value1.innerText = value;
155+
this.$value1.innerText = value.join('--');
142156
}
143157

144158
handleInput(e: CustomEvent) {
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
function showOpenFilePickerPolyfill(options: any) {
2+
return new Promise((resolve) => {
3+
const input = document.createElement("input");
4+
input.type = "file";
5+
input.multiple = options.multiple;
6+
input.accept = options.types
7+
.map((type) => type.accept)
8+
.flatMap((inst) => Object.keys(inst).flatMap((key) => inst[key]))
9+
.join(",");
10+
11+
input.addEventListener("change", () => {
12+
resolve(
13+
[...(input.files as any)].map((file) => {
14+
return {
15+
getFile: async () =>
16+
new Promise((resolve) => {
17+
resolve(file);
18+
}),
19+
};
20+
})
21+
);
22+
});
23+
24+
input.click();
25+
});
26+
}
27+
28+
/**
29+
* Open file with polyfill for legacy browsers.
30+
*
31+
* @param options
32+
* @returns
33+
*/
34+
export function openFile(options) {
35+
// @ts-ignore
36+
if (window.showOpenFilePicker) {
37+
// @ts-ignore
38+
return window.showOpenFilePicker(options);
39+
}
40+
return showOpenFilePickerPolyfill(options);
41+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
2+
/**
3+
* Save file with polyfill for legacy browsers.
4+
*
5+
* @param blob File blob
6+
* @returns Promise
7+
*/
8+
export async function saveFile(blob) {
9+
// @ts-ignore
10+
if (window.showSaveFilePicker) {
11+
const opts = {
12+
types: [
13+
{
14+
description: "Text file",
15+
accept: { "text/plain": [".txt"] },
16+
},
17+
],
18+
};
19+
// @ts-ignore
20+
return await window.showSaveFilePicker(opts);
21+
}
22+
const downloadelem = document.createElement("a");
23+
const url = URL.createObjectURL(blob);
24+
document.body.appendChild(downloadelem);
25+
downloadelem.href = url;
26+
downloadelem.download = 'filename.txt';
27+
downloadelem.click();
28+
downloadelem.remove();
29+
window.URL.revokeObjectURL(url);
30+
return Promise.resolve();
31+
}

src/pg/inputPixelEditor/inputPixelEditor.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -249,10 +249,10 @@ export default class PgInputPixelEditor extends HTMLElement {
249249
}
250250

251251
#handleChange() {
252-
const path = bitmaskToPath(this.#data[this.#layer], { scale: 1 });
253-
console.log('change:', path);
252+
const paths = this.#data.map(layer => bitmaskToPath(layer, { scale: 1 }));
253+
console.log('change:', paths);
254254
this.dispatchEvent(new CustomEvent('change', {
255-
detail: { value: path }
255+
detail: { value: paths }
256256
}));
257257
/*this.dispatchEvent(new CustomEvent('change', {
258258
detail: data

src/pg/tree/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Tree
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<div>
2+
<pg-tree part="tree"></pg-tree>
3+
</div>
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { Component, Part, Prop } from '@pictogrammers/element';
2+
import PgTree from '../../tree';
3+
4+
import template from './basic.html';
5+
6+
@Component({
7+
selector: 'x-pg-tree-basic',
8+
template
9+
})
10+
export default class XPgTreeBasic extends HTMLElement {
11+
@Part() $tree: PgTree;
12+
13+
connectedCallback() {
14+
this.$tree.items = [{
15+
key: 1,
16+
label: 'Item 1',
17+
},
18+
{
19+
key: 2,
20+
label: 'Item 2'
21+
}]
22+
}
23+
}

src/pg/tree/tree.css

Whitespace-only changes.

src/pg/tree/tree.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<div part="items"></div>

src/pg/tree/tree.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { Component, Prop, Part, forEach } from '@pictogrammers/element';
2+
3+
import template from './tree.html';
4+
import style from './tree.css';
5+
import PgTreeItem from '../treeItem/treeItem';
6+
7+
@Component({
8+
selector: 'pg-tree',
9+
style,
10+
template
11+
})
12+
export default class PgTree extends HTMLElement {
13+
@Prop() items: any[] = [];
14+
15+
@Part() $items: HTMLDivElement;
16+
17+
render(changes) {
18+
if (changes.items) {
19+
forEach({
20+
container: this.$items,
21+
items: this.items,
22+
type: (item) => {
23+
return PgTreeItem;
24+
},
25+
create: ($item, item) => {
26+
// after creation of $item element
27+
},
28+
update: ($item, item) => {
29+
// after every $item update
30+
},
31+
});
32+
}
33+
}
34+
}

0 commit comments

Comments
 (0)