馃悕馃悕馃悕
1<script lang="ts">
2 import Workspace from "./workspace.svelte";
3 import PaneRow from "./pane_row.svelte";
4 import PaneColumn from "./pane_column.svelte";
5 import feather from "feather-icons";
6 import { onMount } from "svelte";
7 import { tick } from "svelte";
8 import RadialMenu from "../general/radial_menu.svelte";
9 import FicsuitSession from "../ficsuit_session.svelte";
10 import SimpleMenu from "../general/simple_menu.svelte";
11
12 export let fillable = true;
13
14 function onMenuOpen(event: MouseEvent) {
15 if (event.button !== 2) return;
16 if (!fillable) return;
17
18 showLayoutMenu = false;
19 showCreateMenu = false;
20
21 if (event.ctrlKey) {
22 showLayoutMenu = true;
23 }
24 else {
25 showCreateMenu = true;
26 }
27 menuX = event.offsetX;
28 menuY = event.offsetY;
29 event.stopPropagation();
30 event.preventDefault();
31 }
32
33 function addWorkspace() {
34 let workspace = new Workspace({
35 target: emptiness.parentElement!,
36 props: {
37 }
38 });
39
40 emptiness.parentNode?.removeChild(emptiness);
41 showLayoutMenu = false;
42 }
43
44 function addSession() {
45 let session = new FicsuitSession({
46 target: emptiness.parentElement!,
47 props: {
48
49 }
50 });
51
52 emptiness.parentNode?.removeChild(emptiness);
53 showCreateMenu = false;
54 }
55
56 function addRow2() {
57 let row = new PaneRow({
58 target: emptiness.parentElement!,
59 props: {
60 leftPercent: 50,
61 rightPercent: 50
62 }
63 });
64
65 emptiness.parentNode?.removeChild(emptiness);
66 showLayoutMenu = false;
67 }
68
69 function addRow3() {
70 let row = new PaneRow({
71 target: emptiness.parentElement!,
72 props: {
73 leftPercent: 33.3,
74 centerPercent: 33.2,
75 rightPercent: 33.3
76 }
77 });
78
79 emptiness.parentNode?.removeChild(emptiness);
80 showLayoutMenu = false;
81 }
82
83 function addColumn2() {
84 let row = new PaneColumn({
85 target: emptiness.parentElement!,
86 props: {
87 topPercent: 50,
88 bottomPercent: 50
89 }
90 });
91
92 emptiness.parentNode?.removeChild(emptiness);
93 showLayoutMenu = false;
94 }
95
96 function addColumn3() {
97 let row = new PaneColumn({
98 target: emptiness.parentElement!,
99 props: {
100 topPercent: 33.3,
101 middlePercent: 33.2,
102 bottomPercent: 33.3
103 }
104 });
105
106 emptiness.parentNode?.removeChild(emptiness);
107 showLayoutMenu = false;
108 }
109
110 let createMenuOptions = [
111 {label: "FictionSuit Session", action: addSession},
112 {label: "Workspace", action: addWorkspace}
113 ]
114
115 let emptiness: HTMLDivElement;
116
117 let showLayoutMenu = false;
118 let showCreateMenu = false;
119
120 let menuX = 0, menuY = 0;
121
122 $: {
123 if (showLayoutMenu) {
124 tick().then(() => {
125 feather.replace();
126 });
127 }
128 }
129</script>
130
131<div class=emptiness
132 bind:this={emptiness}>
133 <div class=backdrop
134 on:contextmenu={onMenuOpen}
135 on:mousedown={() => {showLayoutMenu = false; showCreateMenu = false;}} />
136 <div class=nothing>
137 nothing
138 </div>
139 {#if showLayoutMenu}
140 <RadialMenu xPosition={menuX} yPosition={menuY}
141 center={addWorkspace}
142 right={addRow2}
143 left={addRow3}
144 top={addColumn2}
145 bottom={addColumn3}>
146 <div data-feather=maximize class="icon center" slot=center />
147 <div data-feather=columns class="icon right" slot=right />
148 <svelte:fragment slot=left>
149 <div data-feather=sidebar class="icon left" />
150 <div data-feather=sidebar class="icon left-b" />
151 </svelte:fragment>
152 <div data-feather=columns class="icon top" slot=top />
153 <svelte:fragment slot=bottom>
154 <div data-feather=sidebar class="icon bottom" />
155 <div data-feather=sidebar class="icon bottom-b" />
156 </svelte:fragment>
157 </RadialMenu>
158 {/if}
159 {#if showCreateMenu}
160 <SimpleMenu x={menuX} y={menuY}
161 title="New"
162 options={createMenuOptions} />
163 {/if}
164</div>
165
166<style>
167 .emptiness {
168 position: relative;
169 width: 100%;
170 height: 100%;
171 z-index: 0;
172 }
173
174 .backdrop {
175 position: absolute;
176 width: 100%;
177 height: 100%;
178 z-index: 0;
179 user-select: none;
180 /* background: radial-gradient(var(--pane-background), var(--pane-background) 30%, #FF00FF00 100%); */
181 }
182
183 .nothing {
184 position: absolute;
185 top: calc(50% - 0.35em);
186 left: 50%;
187 transform: translate(-50%, -50%);
188 white-space: pre;
189
190 user-select: none;
191 pointer-events: none;
192
193 color: #446666;
194 font-size: 1em;
195 }
196
197 .icon {
198 position: absolute;
199 top: 50%;
200 left: 50%;
201 --center: translate(-50%, -50%);
202 }
203
204 .icon.center {
205 transform: var(--center) scale(200%);
206 }
207
208 .icon.left {
209 transform: var(--center) rotate(-45deg) translate(15%, 0%);
210 }
211
212 .icon.left-b {
213 transform: var(--center) rotate(135deg) translate(-15%, 0%);
214 }
215
216 .icon.right {
217 transform: var(--center) rotate(-45deg) translate(15%, 0%);
218 }
219
220 .icon.bottom {
221 transform: var(--center) rotate(-45deg) translate(15%, 0%);
222 }
223
224 .icon.bottom-b {
225 transform: var(--center) rotate(135deg) translate(-15%, 0%);
226 }
227
228 .icon.top {
229 transform: var(--center) rotate(-45deg) translate(15%, 0%);
230 }
231</style>