about summary refs log tree commit diff
path: root/nixpkgs/nixos/modules/config/qt.nix
blob: f82b7ab85a8c3b30c45b21c034464257a777723e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
{ config, lib, pkgs, ... }:

let
  cfg = config.qt;

  platformPackages = with pkgs; {
    gnome = [ qgnomeplatform qgnomeplatform-qt6 ];
    gtk2 = [ libsForQt5.qtstyleplugins qt6Packages.qt6gtk2 ];
    kde = [ libsForQt5.plasma-integration libsForQt5.systemsettings ];
    lxqt = [ lxqt.lxqt-qtplugin lxqt.lxqt-config ];
    qt5ct = [ libsForQt5.qt5ct qt6Packages.qt6ct ];
  };

  stylePackages = with pkgs; {
    bb10bright = [ libsForQt5.qtstyleplugins ];
    bb10dark = [ libsForQt5.qtstyleplugins ];
    cde = [ libsForQt5.qtstyleplugins ];
    cleanlooks = [ libsForQt5.qtstyleplugins ];
    gtk2 = [ libsForQt5.qtstyleplugins qt6Packages.qt6gtk2 ];
    motif = [ libsForQt5.qtstyleplugins ];
    plastique = [ libsForQt5.qtstyleplugins ];

    adwaita = [ adwaita-qt adwaita-qt6 ];
    adwaita-dark = [ adwaita-qt adwaita-qt6 ];
    adwaita-highcontrast = [ adwaita-qt adwaita-qt6 ];
    adwaita-highcontrastinverse = [ adwaita-qt adwaita-qt6 ];

    breeze = [ libsForQt5.breeze-qt5 ];

    kvantum = [ libsForQt5.qtstyleplugin-kvantum qt6Packages.qtstyleplugin-kvantum ];
  };
in
{
  meta.maintainers = with lib.maintainers; [ romildo thiagokokada ];

  imports = [
    (lib.mkRenamedOptionModule [ "qt5" "enable" ] [ "qt" "enable" ])
    (lib.mkRenamedOptionModule [ "qt5" "platformTheme" ] [ "qt" "platformTheme" ])
    (lib.mkRenamedOptionModule [ "qt5" "style" ] [ "qt" "style" ])
  ];

  options = {
    qt = {
      enable = lib.mkEnableOption "" // {
        description = lib.mdDoc ''
          Whether to enable Qt configuration, including theming.

          Enabling this option is necessary for Qt plugins to work in the
          installed profiles (e.g.: `nix-env -i` or `environment.systemPackages`).
        '';
      };

      platformTheme = lib.mkOption {
        type = with lib.types; nullOr (enum (lib.attrNames platformPackages));
        default = null;
        example = "gnome";
        relatedPackages = [
          "qgnomeplatform"
          "qgnomeplatform-qt6"
          [ "libsForQt5" "plasma-integration" ]
          [ "libsForQt5" "qt5ct" ]
          [ "libsForQt5" "qtstyleplugins" ]
          [ "libsForQt5" "systemsettings" ]
          [ "lxqt" "lxqt-config" ]
          [ "lxqt" "lxqt-qtplugin" ]
          [ "qt6Packages" "qt6ct" ]
          [ "qt6Packages" "qt6gtk2" ]
        ];
        description = lib.mdDoc ''
          Selects the platform theme to use for Qt applications.

          The options are
          - `gnome`: Use GNOME theme with [qgnomeplatform](https://github.com/FedoraQt/QGnomePlatform)
          - `gtk2`: Use GTK theme with [qtstyleplugins](https://github.com/qt/qtstyleplugins)
          - `kde`: Use Qt settings from Plasma.
          - `lxqt`: Use LXQt style set using the [lxqt-config-appearance](https://github.com/lxqt/lxqt-config)
             application.
          - `qt5ct`: Use Qt style set using the [qt5ct](https://sourceforge.net/projects/qt5ct/)
             and [qt6ct](https://github.com/trialuser02/qt6ct) applications.
        '';
      };

      style = lib.mkOption {
        type = with lib.types; nullOr (enum (lib.attrNames stylePackages));
        default = null;
        example = "adwaita";
        relatedPackages = [
          "adwaita-qt"
          "adwaita-qt6"
          [ "libsForQt5" "breeze-qt5" ]
          [ "libsForQt5" "qtstyleplugin-kvantum" ]
          [ "libsForQt5" "qtstyleplugins" ]
          [ "qt6Packages" "qt6gtk2" ]
          [ "qt6Packages" "qtstyleplugin-kvantum" ]
        ];
        description = lib.mdDoc ''
          Selects the style to use for Qt applications.

          The options are
          - `adwaita`, `adwaita-dark`, `adwaita-highcontrast`, `adawaita-highcontrastinverse`:
            Use Adwaita Qt style with
            [adwaita](https://github.com/FedoraQt/adwaita-qt)
          - `breeze`: Use the Breeze style from
            [breeze](https://github.com/KDE/breeze)
          - `bb10bright`, `bb10dark`, `cleanlooks`, `gtk2`, `motif`, `plastique`:
            Use styles from
            [qtstyleplugins](https://github.com/qt/qtstyleplugins)
          - `kvantum`: Use styles from
            [kvantum](https://github.com/tsujan/Kvantum)
        '';
      };
    };
  };

  config = lib.mkIf cfg.enable {
    assertions =
      let
        gnomeStyles = [
          "adwaita"
          "adwaita-dark"
          "adwaita-highcontrast"
          "adwaita-highcontrastinverse"
          "breeze"
        ];
      in
      [
        {
          assertion = cfg.platformTheme == "gnome" -> (builtins.elem cfg.style gnomeStyles);
          message = ''
            `qt.platformTheme` "gnome" must have `qt.style` set to a theme that supports both Qt and Gtk,
            for example: ${lib.concatStringsSep ", " gnomeStyles}.
          '';
        }
      ];

    environment.variables = {
      QT_QPA_PLATFORMTHEME = lib.mkIf (cfg.platformTheme != null) cfg.platformTheme;
      QT_STYLE_OVERRIDE = lib.mkIf (cfg.style != null) cfg.style;
    };

    environment.profileRelativeSessionVariables =
      let
        qtVersions = with pkgs; [ qt5 qt6 ];
      in
      {
        QT_PLUGIN_PATH = map (qt: "/${qt.qtbase.qtPluginPrefix}") qtVersions;
        QML2_IMPORT_PATH = map (qt: "/${qt.qtbase.qtQmlPrefix}") qtVersions;
      };

    environment.systemPackages =
      lib.optionals (cfg.platformTheme != null) (platformPackages.${cfg.platformTheme})
      ++ lib.optionals (cfg.style != null) (stylePackages.${cfg.style});
  };
}