mirror of
https://github.com/ankitects/anki.git
synced 2025-11-06 04:37:22 -05:00
Merge branch 'main' into random-deck
This commit is contained in:
commit
5e87e097ae
10 changed files with 47 additions and 18 deletions
|
|
@ -247,6 +247,11 @@ jariji
|
|||
Hanna Nilsén <hanni614@student.liu.se>
|
||||
Elias Johansson Lara <elias.johanssonlara@gmail.com>
|
||||
Toby Penner <tobypenner01@gmail.com>
|
||||
Danilo Spillebeen <spillebeendanilo@gmail.com>
|
||||
Matbe766 <matildabergstrom01@gmail.com>
|
||||
Amanda Sternberg <mandis.sternberg@gmail.com>
|
||||
arold0 <arold0@icloud.com>
|
||||
|
||||
|
||||
********************
|
||||
|
||||
|
|
|
|||
|
|
@ -385,7 +385,7 @@ deck-config-which-deck = Which deck would you like to display options for?
|
|||
## Messages related to the FSRS scheduler
|
||||
|
||||
deck-config-updating-cards = Updating cards: { $current_cards_count }/{ $total_cards_count }...
|
||||
deck-config-invalid-parameters = The provided FSRS parameters are invalid. Leave them blank to use the default parameters.
|
||||
deck-config-invalid-parameters = The provided FSRS parameters are invalid. Leave them blank to use the default values.
|
||||
deck-config-not-enough-history = Insufficient review history to perform this operation.
|
||||
deck-config-must-have-400-reviews =
|
||||
{ $count ->
|
||||
|
|
|
|||
|
|
@ -1,9 +1,10 @@
|
|||
launcher-title = Anki Launcher
|
||||
launcher-press-enter-to-install = Press the Enter/Return key on your keyboard to install or update Anki.
|
||||
launcher-press-enter-to-start = Press enter to start Anki.
|
||||
launcher-anki-will-start-shortly = Anki will start shortly.
|
||||
launcher-you-can-close-this-window = You can close this window.
|
||||
launcher-updating-anki = Updating Anki...
|
||||
launcher-latest-anki = Latest Anki (just press Enter)
|
||||
launcher-latest-anki = Install Latest Anki (default)
|
||||
launcher-choose-a-version = Choose a version
|
||||
launcher-sync-project-changes = Sync project changes
|
||||
launcher-keep-existing-version = Keep existing version ({ $current })
|
||||
|
|
@ -13,7 +14,7 @@ launcher-on = on
|
|||
launcher-off = off
|
||||
launcher-cache-downloads = Cache downloads: { $state }
|
||||
launcher-download-mirror = Download mirror: { $state }
|
||||
launcher-uninstall = Uninstall
|
||||
launcher-uninstall = Uninstall Anki
|
||||
launcher-invalid-input = Invalid input. Please try again.
|
||||
launcher-latest-releases = Latest releases: { $releases }
|
||||
launcher-enter-the-version-you-want = Enter the version you want to install:
|
||||
|
|
|
|||
|
|
@ -289,6 +289,10 @@ class AddCards(QMainWindow):
|
|||
def _add_current_note(self) -> None:
|
||||
note = self.editor.note
|
||||
|
||||
# Prevent adding a note that has already been added (e.g., from double-clicking)
|
||||
if note.id != 0:
|
||||
return
|
||||
|
||||
if not self._note_can_be_added(note):
|
||||
return
|
||||
|
||||
|
|
|
|||
|
|
@ -209,11 +209,20 @@ def on_full_sync_timer(mw: aqt.main.AnkiQt, label: str) -> None:
|
|||
return
|
||||
sync_progress = progress.full_sync
|
||||
|
||||
# If we've reached total, show the "checking" label
|
||||
if sync_progress.transferred == sync_progress.total:
|
||||
label = tr.sync_checking()
|
||||
|
||||
total = sync_progress.total
|
||||
transferred = sync_progress.transferred
|
||||
|
||||
# Scale both to kilobytes with floor division
|
||||
max_for_bar = total // 1024
|
||||
value_for_bar = transferred // 1024
|
||||
|
||||
mw.progress.update(
|
||||
value=sync_progress.transferred,
|
||||
max=sync_progress.total,
|
||||
value=value_for_bar,
|
||||
max=max_for_bar,
|
||||
process=False,
|
||||
label=label,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -173,6 +173,8 @@ fn run() -> Result<()> {
|
|||
|
||||
ensure_os_supported()?;
|
||||
|
||||
println!("{}\n", state.tr.launcher_press_enter_to_install());
|
||||
|
||||
check_versions(&mut state);
|
||||
|
||||
main_menu_loop(&state)?;
|
||||
|
|
|
|||
|
|
@ -122,7 +122,7 @@ pub(crate) fn basic(tr: &I18n) -> Notetype {
|
|||
|
||||
pub(crate) fn basic_typing(tr: &I18n) -> Notetype {
|
||||
let mut nt = basic(tr);
|
||||
nt.config.original_stock_kind = StockKind::BasicTyping as i32;
|
||||
nt.config.original_stock_kind = OriginalStockKind::BasicTyping as i32;
|
||||
nt.name = tr.notetypes_basic_type_answer_name().into();
|
||||
let front = tr.notetypes_front_field();
|
||||
let back = tr.notetypes_back_field();
|
||||
|
|
@ -138,7 +138,7 @@ pub(crate) fn basic_typing(tr: &I18n) -> Notetype {
|
|||
|
||||
pub(crate) fn basic_forward_reverse(tr: &I18n) -> Notetype {
|
||||
let mut nt = basic(tr);
|
||||
nt.config.original_stock_kind = StockKind::BasicAndReversed as i32;
|
||||
nt.config.original_stock_kind = OriginalStockKind::BasicAndReversed as i32;
|
||||
nt.name = tr.notetypes_basic_reversed_name().into();
|
||||
let front = tr.notetypes_front_field();
|
||||
let back = tr.notetypes_back_field();
|
||||
|
|
@ -156,7 +156,7 @@ pub(crate) fn basic_forward_reverse(tr: &I18n) -> Notetype {
|
|||
|
||||
pub(crate) fn basic_optional_reverse(tr: &I18n) -> Notetype {
|
||||
let mut nt = basic_forward_reverse(tr);
|
||||
nt.config.original_stock_kind = StockKind::BasicOptionalReversed as i32;
|
||||
nt.config.original_stock_kind = OriginalStockKind::BasicOptionalReversed as i32;
|
||||
nt.name = tr.notetypes_basic_optional_reversed_name().into();
|
||||
let addrev = tr.notetypes_add_reverse_field();
|
||||
nt.add_field(addrev.as_ref());
|
||||
|
|
|
|||
|
|
@ -13,13 +13,7 @@ impl From<FSRSError> for AnkiError {
|
|||
FSRSError::OptimalNotFound => AnkiError::FsrsUnableToDetermineDesiredRetention,
|
||||
FSRSError::Interrupted => AnkiError::Interrupted,
|
||||
FSRSError::InvalidParameters => AnkiError::FsrsParamsInvalid,
|
||||
FSRSError::InvalidInput => AnkiError::InvalidInput {
|
||||
source: InvalidInputError {
|
||||
message: "invalid params provided".to_string(),
|
||||
source: None,
|
||||
backtrace: None,
|
||||
},
|
||||
},
|
||||
FSRSError::InvalidInput => AnkiError::FsrsParamsInvalid,
|
||||
FSRSError::InvalidDeckSize => AnkiError::InvalidInput {
|
||||
source: InvalidInputError {
|
||||
message: "no cards to simulate".to_string(),
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
|||
saveNeededStore,
|
||||
opacityStateStore,
|
||||
} from "./store";
|
||||
import { get } from "svelte/store";
|
||||
import { drawEllipse, drawPolygon, drawRectangle, drawText } from "./tools/index";
|
||||
import { makeMaskTransparent, SHAPE_MASK_COLOR } from "./tools/lib";
|
||||
import { enableSelectable, stopDraw } from "./tools/lib";
|
||||
|
|
@ -233,7 +234,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
|||
}
|
||||
|
||||
onMount(() => {
|
||||
opacityStateStore.set(maskOpacity);
|
||||
maskOpacity = get(opacityStateStore);
|
||||
removeHandlers = singleCallback(
|
||||
on(document, "click", onClick),
|
||||
on(window, "mousemove", onMousemove),
|
||||
|
|
|
|||
|
|
@ -8,10 +8,22 @@ import { fabric } from "fabric";
|
|||
import { get } from "svelte/store";
|
||||
|
||||
import { optimumCssSizeForCanvas } from "./canvas-scale";
|
||||
import { hideAllGuessOne, notesDataStore, saveNeededStore, tagsWritable, textEditingState } from "./store";
|
||||
import {
|
||||
hideAllGuessOne,
|
||||
notesDataStore,
|
||||
opacityStateStore,
|
||||
saveNeededStore,
|
||||
tagsWritable,
|
||||
textEditingState,
|
||||
} from "./store";
|
||||
import Toast from "./Toast.svelte";
|
||||
import { addShapesToCanvasFromCloze } from "./tools/add-from-cloze";
|
||||
import { enableSelectable, makeShapesRemainInCanvas, moveShapeToCanvasBoundaries } from "./tools/lib";
|
||||
import {
|
||||
enableSelectable,
|
||||
makeMaskTransparent,
|
||||
makeShapesRemainInCanvas,
|
||||
moveShapeToCanvasBoundaries,
|
||||
} from "./tools/lib";
|
||||
import { modifiedPolygon } from "./tools/tool-polygon";
|
||||
import { undoStack } from "./tools/tool-undo-redo";
|
||||
import { enablePinchZoom, onResize, setCanvasSize } from "./tools/tool-zoom";
|
||||
|
|
@ -83,6 +95,7 @@ export const setupMaskEditorForEdit = async (
|
|||
window.requestAnimationFrame(() => {
|
||||
onImageLoaded({ noteId: BigInt(noteId) });
|
||||
});
|
||||
if (get(opacityStateStore)) { makeMaskTransparent(canvas, true); }
|
||||
};
|
||||
|
||||
return canvas;
|
||||
|
|
|
|||
Loading…
Reference in a new issue