Skip to content

Commit c8c3191

Browse files
authored
feat(window): add setEffects API (#392)
1 parent 2fc420b commit c8c3191

File tree

7 files changed

+349
-4
lines changed

7 files changed

+349
-4
lines changed

.changes/window-set-effects.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"window": "patch"
3+
"window-js": "patch"
4+
---
5+
6+
Added the `setEffects` and `clearEffects` API.

examples/api/src-tauri/src/lib.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ pub fn run() {
5656
#[cfg(desktop)]
5757
{
5858
window_builder = window_builder
59-
.user_agent("Tauri API")
59+
.user_agent(&format!("Tauri API - {}", std::env::consts::OS))
6060
.title("Tauri API Validation")
6161
.inner_size(1000., 800.)
6262
.min_inner_size(600., 400.)
@@ -71,6 +71,11 @@ pub fn run() {
7171
.decorations(false);
7272
}
7373

74+
#[cfg(target_os = "macos")]
75+
{
76+
window_builder = window_builder.transparent(true);
77+
}
78+
7479
let window = window_builder.build().unwrap();
7580

7681
#[cfg(debug_assertions)]

examples/api/src/views/Window.svelte

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
UserAttentionType,
77
PhysicalSize,
88
PhysicalPosition,
9+
Effect,
10+
EffectState,
911
} from "@tauri-apps/plugin-window";
1012
import { open as openDialog } from "@tauri-apps/plugin-dialog";
1113
import { open } from "@tauri-apps/plugin-shell";
@@ -57,7 +59,20 @@
5759
"rowResize",
5860
];
5961
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+
6074
export let onMessage;
75+
const mainEl = document.querySelector("main");
6176
6277
let newWindowLabel;
6378
@@ -91,6 +106,12 @@
91106
let cursorIgnoreEvents = false;
92107
let windowTitle = "Awesome Tauri Example!";
93108
109+
let effects = [];
110+
let selectedEffect;
111+
let effectState;
112+
let effectRadius;
113+
let effectR, effectG, effectB, effectA;
114+
94115
function openUrl() {
95116
open(urlValue);
96117
}
@@ -172,6 +193,38 @@
172193
await windowMap[selectedWindow].requestUserAttention(null);
173194
}
174195
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+
175228
$: {
176229
windowMap[selectedWindow];
177230
loadWindowPosition();
@@ -455,5 +508,88 @@
455508
<button class="btn" id="open-url"> Open URL </button>
456509
</form>
457510
</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}
458594
{/if}
459595
</div>

0 commit comments

Comments
 (0)