|
6 | 6 | UserAttentionType,
|
7 | 7 | PhysicalSize,
|
8 | 8 | PhysicalPosition,
|
| 9 | + Effect, |
| 10 | + EffectState, |
9 | 11 | } from "@tauri-apps/plugin-window";
|
10 | 12 | import { open as openDialog } from "@tauri-apps/plugin-dialog";
|
11 | 13 | import { open } from "@tauri-apps/plugin-shell";
|
|
57 | 59 | "rowResize",
|
58 | 60 | ];
|
59 | 61 |
|
| 62 | + const windowsEffects = ["mica", "blur", "acrylic"]; |
| 63 | + const isWindows = navigator.appVersion.includes("windows"); |
| 64 | + const isMacOS = navigator.appVersion.includes("macos"); |
| 65 | + let effectOptions = isWindows |
| 66 | + ? windowsEffects |
| 67 | + : Object.keys(Effect) |
| 68 | + .map((effect) => Effect[effect]) |
| 69 | + .filter((e) => !windowsEffects.includes(e)); |
| 70 | + const effectStateOptions = Object.keys(EffectState).map( |
| 71 | + (state) => EffectState[state] |
| 72 | + ); |
| 73 | +
|
60 | 74 | export let onMessage;
|
| 75 | + const mainEl = document.querySelector("main"); |
61 | 76 |
|
62 | 77 | let newWindowLabel;
|
63 | 78 |
|
|
91 | 106 | let cursorIgnoreEvents = false;
|
92 | 107 | let windowTitle = "Awesome Tauri Example!";
|
93 | 108 |
|
| 109 | + let effects = []; |
| 110 | + let selectedEffect; |
| 111 | + let effectState; |
| 112 | + let effectRadius; |
| 113 | + let effectR, effectG, effectB, effectA; |
| 114 | +
|
94 | 115 | function openUrl() {
|
95 | 116 | open(urlValue);
|
96 | 117 | }
|
|
172 | 193 | await windowMap[selectedWindow].requestUserAttention(null);
|
173 | 194 | }
|
174 | 195 |
|
| 196 | + async function addEffect() { |
| 197 | + if (!effects.includes(selectedEffect)) { |
| 198 | + effects = [...effects, selectedEffect]; |
| 199 | + } |
| 200 | +
|
| 201 | + const payload = { |
| 202 | + effects, |
| 203 | + state: effectState, |
| 204 | + radius: effectRadius, |
| 205 | + }; |
| 206 | + if ( |
| 207 | + Number.isInteger(effectR) && |
| 208 | + Number.isInteger(effectG) && |
| 209 | + Number.isInteger(effectB) && |
| 210 | + Number.isInteger(effectA) |
| 211 | + ) { |
| 212 | + payload.color = [effectR, effectG, effectB, effectA]; |
| 213 | + } |
| 214 | +
|
| 215 | + mainEl.classList.remove("bg-primary"); |
| 216 | + mainEl.classList.remove("dark:bg-darkPrimary"); |
| 217 | + await windowMap[selectedWindow].clearEffects(); |
| 218 | + await windowMap[selectedWindow].setEffects(payload); |
| 219 | + } |
| 220 | +
|
| 221 | + async function clearEffects() { |
| 222 | + effects = []; |
| 223 | + await windowMap[selectedWindow].clearEffects(); |
| 224 | + mainEl.classList.add("bg-primary"); |
| 225 | + mainEl.classList.add("dark:bg-darkPrimary"); |
| 226 | + } |
| 227 | +
|
175 | 228 | $: {
|
176 | 229 | windowMap[selectedWindow];
|
177 | 230 | loadWindowPosition();
|
|
455 | 508 | <button class="btn" id="open-url"> Open URL </button>
|
456 | 509 | </form>
|
457 | 510 | </div>
|
| 511 | +
|
| 512 | + <br /> |
| 513 | +
|
| 514 | + {#if isWindows || isMacOS} |
| 515 | + <div class="flex flex-col gap-1"> |
| 516 | + <div class="flex"> |
| 517 | + <label> |
| 518 | + Effect |
| 519 | + <select class="input" bind:value={selectedEffect}> |
| 520 | + {#each effectOptions as effect} |
| 521 | + <option value={effect}>{effect}</option> |
| 522 | + {/each} |
| 523 | + </select> |
| 524 | + </label> |
| 525 | +
|
| 526 | + <label> |
| 527 | + State |
| 528 | + <select class="input" bind:value={effectState}> |
| 529 | + {#each effectStateOptions as state} |
| 530 | + <option value={state}>{state}</option> |
| 531 | + {/each} |
| 532 | + </select> |
| 533 | + </label> |
| 534 | +
|
| 535 | + <label> |
| 536 | + Radius |
| 537 | + <input class="input" type="number" bind:value={effectRadius} /> |
| 538 | + </label> |
| 539 | + </div> |
| 540 | +
|
| 541 | + <div class="flex"> |
| 542 | + <label> |
| 543 | + Color |
| 544 | + <div class="flex"> |
| 545 | + <input |
| 546 | + style="max-width: 120px;" |
| 547 | + class="input" |
| 548 | + type="number" |
| 549 | + placeholder="R" |
| 550 | + bind:value={effectR} |
| 551 | + /> |
| 552 | + <input |
| 553 | + style="max-width: 120px;" |
| 554 | + class="input" |
| 555 | + type="number" |
| 556 | + placeholder="G" |
| 557 | + bind:value={effectG} |
| 558 | + /> |
| 559 | + <input |
| 560 | + style="max-width: 120px;" |
| 561 | + class="input" |
| 562 | + type="number" |
| 563 | + placeholder="B" |
| 564 | + bind:value={effectB} |
| 565 | + /> |
| 566 | + <input |
| 567 | + style="max-width: 120px;" |
| 568 | + class="input" |
| 569 | + type="number" |
| 570 | + placeholder="A" |
| 571 | + bind:value={effectA} |
| 572 | + /> |
| 573 | + </div> |
| 574 | + </label> |
| 575 | + </div> |
| 576 | +
|
| 577 | + <div class="flex"> |
| 578 | + <button class="btn" style="width: 80px;" on:click={addEffect} |
| 579 | + >Add</button |
| 580 | + > |
| 581 | + </div> |
| 582 | +
|
| 583 | + <div class="flex"> |
| 584 | + <div> |
| 585 | + Applied effects: {effects.length ? effects.join(",") : "None"} |
| 586 | + </div> |
| 587 | +
|
| 588 | + <button class="btn" style="width: 80px;" on:click={clearEffects} |
| 589 | + >Clear</button |
| 590 | + > |
| 591 | + </div> |
| 592 | + </div> |
| 593 | + {/if} |
458 | 594 | {/if}
|
459 | 595 | </div>
|
0 commit comments