1{
2 lib,
3 symlinkJoin,
4 makeWrapper,
5 anki,
6 anki-utils,
7 writeTextDir,
8 ankiAddons ? [ ],
9}:
10/*
11 `ankiAddons`
12 : A set of Anki add-ons to be installed. Here's a an example:
13
14 ~~~
15 pkgs.anki.withAddons [
16 # When the add-on is already available in nixpkgs
17 pkgs.ankiAddons.anki-connect
18
19 # When the add-on is not available in nixpkgs
20 (pkgs.anki-utils.buildAnkiAddon (finalAttrs: {
21 pname = "recolor";
22 version = "3.1";
23 src = pkgs.fetchFromGitHub {
24 owner = "AnKing-VIP";
25 repo = "AnkiRecolor";
26 rev = finalAttrs.version;
27 sparseCheckout = [ "src/addon" ];
28 hash = "sha256-28DJq2l9DP8O6OsbNQCZ0pm4S6CQ3Yz0Vfvlj+iQw8Y=";
29 };
30 sourceRoot = "source/src/addon";
31 }))
32
33 # When the add-on needs to be configured
34 pkgs.ankiAddons.passfail2.withConfig {
35 config = {
36 again_button_name = "not quite";
37 good_button_name = "excellent";
38 };
39
40 user_files = ./dir-to-be-merged-into-addon-user-files-dir;
41 };
42 ]
43 ~~~
44
45 The original `anki` executable will be wrapped so that it uses the addons from
46 `ankiAddons`.
47
48 This only works with Anki versions patched to support the `ANKI_ADDONS` environment
49 variable. `pkgs.anki` has this, but `pkgs.anki-bin` does not.
50*/
51let
52 defaultAddons = [
53 (anki-utils.buildAnkiAddon {
54 pname = "nixos";
55 version = "1.0";
56 src = writeTextDir "__init__.py" ''
57 import aqt
58 from aqt.qt import QMessageBox
59 import json
60
61 def addons_dialog_will_show(dialog: aqt.addons.AddonsDialog) -> None:
62 dialog.setEnabled(False)
63 QMessageBox.information(
64 dialog,
65 "NixOS Info",
66 ("These add-ons are managed by NixOS.<br>"
67 "See <a href='https://github.com/NixOS/nixpkgs/tree/master/pkgs/games/anki/with-addons.nix'>"
68 "github.com/NixOS/nixpkgs/tree/master/pkgs/games/anki/with-addons.nix</a>")
69 )
70
71 def addon_tried_to_write_config(module: str, conf: dict) -> None:
72 message_box = QMessageBox(
73 QMessageBox.Icon.Warning,
74 "NixOS Info",
75 (f"The add-on module: \"{module}\" tried to update its config.<br>"
76 "See <a href='https://github.com/NixOS/nixpkgs/tree/master/pkgs/games/anki/with-addons.nix'>"
77 "github.com/NixOS/nixpkgs/tree/master/pkgs/games/anki/with-addons.nix</a>"
78 " for how to configure add-ons managed by NixOS.")
79 )
80 message_box.setDetailedText(json.dumps(conf))
81 message_box.exec()
82
83 aqt.gui_hooks.addons_dialog_will_show.append(addons_dialog_will_show)
84 aqt.mw.addonManager.writeConfig = addon_tried_to_write_config
85 '';
86 meta.maintainers = with lib.maintainers; [ junestepp ];
87 })
88 ];
89in
90symlinkJoin {
91 inherit (anki) version;
92 pname = "${anki.pname}-with-addons";
93
94 paths = [ anki ];
95
96 nativeBuildInputs = [ makeWrapper ];
97 postBuild = ''
98 wrapProgram $out/bin/anki \
99 --set ANKI_ADDONS "${anki-utils.buildAnkiAddonsDir (ankiAddons ++ defaultAddons)}"
100 '';
101
102 meta = builtins.removeAttrs anki.meta [
103 "name"
104 "outputsToInstall"
105 "position"
106 ];
107}