anki/ts/graphs/RangeBox.svelte
Matthias Metelka 9f8667fb47
Auto-hide toolbar in Reviewer (#2262)
* Give webviews a slide-in animation

if reduced motion isn't set.

* Auto-hide toolbar in review mode

moving the mouse above the main webview expands the toolbar. When the mouse leaves the toolbar, it will collapse after a delay of 2s.

* Save some space on bottom toolbars

* Use props for all hard-coded transition durations

and decrease most commonly used duration (200ms) to 150ms.

* Move auto-hide logic into ToolbarWebView

and handle auto-hide specific events in the respective webview subclasses.

* Fix typing issues

* Fix flickering issue

* Add auto_hide_toolbar opt-in to preferences

* Rename hide_toolbar to collapse_toolbar

to better describe the dock-like behaviour.

* Rename setting to minimize_distractions

* Reduce calls to pm in eventFilter

* Run formatter

* Revert setting title to something more specific

* Increase default animation time to 180ms

* Inset toolbar in review mode

when auto-hide is not enabled.

* Use card background on toolbar and add glass effect

* Use flatten/elevate over inset/outset

* Use flatten/elevate over inset/outset

* Update toolbar.py

* Fix toolbar background delay

* Tweak styles

* Use "collapse" instead of "auto-hide"

* Fix background misalignment in collapse mode

* Do not collapse toolbar when pointer is outside MainWebView

* Reduce hide_timer interval to 1000ms

* Use CSS to hide toolbar instead of setting webview height

* Add guard to prevent backdrop-filter: blur on Qt 5.14

* Apply transition to body instead of toolbar

to not complicate things for #2301.

* Fix Qt 5.14 and apply guard globally

* Fix background image scaling difference

* Tweak preference wording (dae)
2023-01-09 14:39:31 +10:00

159 lines
3.7 KiB
Svelte

<!--
Copyright: Ankitects Pty Ltd and contributors
License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
-->
<script lang="ts">
import * as tr from "@tslib/ftl";
import type { Writable } from "svelte/store";
import { daysToRevlogRange, RevlogRange } from "./graph-helpers";
import InputBox from "./InputBox.svelte";
enum SearchRange {
Deck = 1,
Collection = 2,
Custom = 3,
}
export let loading: boolean;
export let days: Writable<number>;
export let search: Writable<string>;
let revlogRange = daysToRevlogRange($days);
let searchRange: SearchRange;
if ($search === "deck:current") {
searchRange = SearchRange.Deck;
} else if ($search === "") {
searchRange = SearchRange.Collection;
} else {
searchRange = SearchRange.Custom;
}
let displayedSearch = $search;
$: {
switch (searchRange as SearchRange) {
case SearchRange.Deck:
$search = displayedSearch = "deck:current";
break;
case SearchRange.Collection:
$search = displayedSearch = "";
break;
}
}
$: {
switch (revlogRange as RevlogRange) {
case RevlogRange.Year:
$days = 365;
break;
case RevlogRange.All:
$days = 0;
break;
}
}
function searchKeyUp(event: KeyboardEvent): void {
// fetch data on enter
if (event.code === "Enter") {
$search = displayedSearch;
}
}
const year = tr.statisticsRange_1YearHistory();
const deck = tr.statisticsRangeDeck();
const collection = tr.statisticsRangeCollection();
const searchLabel = tr.statisticsRangeSearch();
const all = tr.statisticsRangeAllHistory();
</script>
<div class="range-box">
<div class="spin" class:loading></div>
<InputBox>
<label>
<input type="radio" bind:group={searchRange} value={SearchRange.Deck} />
{deck}
</label>
<label>
<input
type="radio"
bind:group={searchRange}
value={SearchRange.Collection}
/>
{collection}
</label>
<input
type="text"
bind:value={displayedSearch}
on:keyup={searchKeyUp}
on:focus={() => {
searchRange = SearchRange.Custom;
}}
placeholder={searchLabel}
/>
</InputBox>
<InputBox>
<label>
<input type="radio" bind:group={revlogRange} value={RevlogRange.Year} />
{year}
</label>
<label>
<input type="radio" bind:group={revlogRange} value={RevlogRange.All} />
{all}
</label>
</InputBox>
</div>
<div class="range-box-pad" />
<style lang="scss">
.range-box {
position: sticky;
z-index: 1;
top: 0;
width: 100vw;
color: var(--fg);
background: var(--canvas);
padding: 0.5em;
border-bottom: 1px solid var(--border);
@media print {
position: absolute;
}
}
@keyframes spin {
0% {
-webkit-transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
}
}
.spin {
display: inline-block;
position: absolute;
font-size: 2em;
animation: spin;
animation-duration: 1s;
animation-iteration-count: infinite;
opacity: 0;
&.loading {
opacity: 0.5;
transition: opacity var(--transition-slow);
}
}
.range-box-pad {
height: 1.5em;
}
</style>