nixpkgs mirror (for testing) github.com/NixOS/nixpkgs
nix
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge master into staging-next

+5098 -254
+21 -10
doc/using/overlays.xml
··· 140 140 <section xml:id="sec-overlays-alternatives"> 141 141 <title>Using overlays to configure alternatives</title> 142 142 <para> 143 - Certain software has different implementations of the same 144 - interface. Other distributions have functionality to switch 143 + Certain software packages have different implementations of the 144 + same interface. Other distributions have functionality to switch 145 145 between these. For example, Debian provides <link 146 146 xlink:href="https://wiki.debian.org/DebianAlternatives">DebianAlternatives</link>. 147 147 Nixpkgs has what we call <literal>alternatives</literal>, which ··· 160 160 </para> 161 161 <para> 162 162 The Nixpkgs attribute is <literal>openblas</literal> for 163 - ILP64 and <literal>openblasCompat</literal> for LP64. This 164 - is the default. 163 + ILP64 (integer width = 64 bits) and 164 + <literal>openblasCompat</literal> for LP64 (integer width = 165 + 32 bits). <literal>openblasCompat</literal> is the default. 165 166 </para> 166 167 </listitem> 167 168 <listitem> ··· 191 190 #83888</link>, we are able to override the ‘blas’ and ‘lapack’ 192 191 packages to use different implementations, through the 193 192 ‘blasProvider’ and ‘lapackProvider’ argument. This can be used 194 - to select a different provider. For example, an overlay can be 195 - created that looks like: 193 + to select a different provider. BLAS providers will have 194 + symlinks in <literal>$out/lib/libblas.so.3</literal> and 195 + <literal>$out/lib/libcblas.so.3</literal> to their respective 196 + BLAS libraries. Likewise, LAPACK providers will have symlinks 197 + in <literal>$out/lib/liblapack.so.3</literal> and 198 + <literal>$out/lib/liblapacke.so.3</literal> to their respective 199 + LAPCK libraries. For example, Intel MKL is both a BLAS and 200 + LAPACK provider. An overlay can be created to use Intel MKL 201 + that looks like: 196 202 </para> 197 203 <programlisting> 198 204 self: super: ··· 216 208 <para> 217 209 This overlay uses Intel’s MKL library for both BLAS and LAPACK 218 210 interfaces. Note that the same can be accomplished at runtime 219 - using <literal>LD_PRELOAD</literal> of libblas.so.3 and 220 - liblapack.so.3. 211 + using <literal>LD_LIBRARY_PATH</literal> of libblas.so.3 and 212 + liblapack.so.3. For instance: 221 213 </para> 214 + <programlisting> 215 + $ LD_LIBRARY_PATH=$(nix-build -A mkl)/lib:$LD_LIBRARY_PATH nix-shell -p octave --run octave 216 + </programlisting> 222 217 <para> 223 218 Intel MKL requires an <literal>openmp</literal> implementation 224 219 when running with multiple processors. By default, ··· 232 221 set it with <literal>LD_PRELOAD</literal>. Note that 233 222 <literal>mkl</literal> is only available on 234 223 <literal>x86_64-linux</literal> and 235 - <literal>x86_64-darwin</literal>. Moreover, Hydra is not build 236 - and distributing pre-compiled binaries using it. 224 + <literal>x86_64-darwin</literal>. Moreover, Hydra is not 225 + building and distributing pre-compiled binaries using it. 237 226 </para> 238 227 <para> 239 228 For BLAS/LAPACK switching to work correctly, all packages must
+6
maintainers/maintainer-list.nix
··· 6738 6738 githubId = 2347889; 6739 6739 name = "Sauyon Lee"; 6740 6740 }; 6741 + savannidgerinel = { 6742 + email = "savanni@luminescent-dreams.com"; 6743 + github = "savannidgerinel"; 6744 + githubId = 8534888; 6745 + name = "Savanni D'Gerinel"; 6746 + }; 6741 6747 sb0 = { 6742 6748 email = "sb@m-labs.hk"; 6743 6749 github = "sbourdeauducq";
+1 -1
nixos/modules/virtualisation/nixos-containers.nix
··· 442 442 Whether this NixOS machine is a lightweight container running 443 443 in another NixOS system. If set to true, support for nested 444 444 containers is disabled by default, but can be reenabled by 445 - setting <config>boot.enableContainers</config> to true. 445 + setting <option>boot.enableContainers</option> to true. 446 446 ''; 447 447 }; 448 448
+66 -73
nixos/tests/systemd-confinement.nix
··· 1 - import ./make-test.nix { 1 + import ./make-test-python.nix { 2 2 name = "systemd-confinement"; 3 3 4 4 machine = { pkgs, lib, ... }: let ··· 17 17 exit "''${ret:-1}" 18 18 ''; 19 19 20 - mkTestStep = num: { description, config ? {}, testScript }: { 20 + mkTestStep = num: { config ? {}, testScript }: { 21 21 systemd.sockets."test${toString num}" = { 22 22 description = "Socket for Test Service ${toString num}"; 23 23 wantedBy = [ "sockets.target" ]; ··· 34 34 }; 35 35 } // removeAttrs config [ "confinement" "serviceConfig" ]; 36 36 37 - __testSteps = lib.mkOrder num '' 38 - subtest '${lib.escape ["\\" "'"] description}', sub { 39 - $machine->succeed('echo ${toString num} > /teststep'); 40 - ${testScript} 41 - }; 42 - ''; 37 + __testSteps = lib.mkOrder num ('' 38 + machine.succeed("echo ${toString num} > /teststep") 39 + '' + testScript); 43 40 }; 44 41 45 42 in { 46 43 imports = lib.imap1 mkTestStep [ 47 - { description = "chroot-only confinement"; 48 - config.confinement.mode = "chroot-only"; 44 + { config.confinement.mode = "chroot-only"; 49 45 testScript = '' 50 - $machine->succeed( 51 - 'test "$(chroot-exec ls -1 / | paste -sd,)" = bin,nix', 52 - 'test "$(chroot-exec id -u)" = 0', 53 - 'chroot-exec chown 65534 /bin', 54 - ); 46 + with subtest("chroot-only confinement"): 47 + machine.succeed( 48 + 'test "$(chroot-exec ls -1 / | paste -sd,)" = bin,nix', 49 + 'test "$(chroot-exec id -u)" = 0', 50 + "chroot-exec chown 65534 /bin", 51 + ) 55 52 ''; 56 53 } 57 - { description = "full confinement with APIVFS"; 58 - testScript = '' 59 - $machine->fail( 60 - 'chroot-exec ls -l /etc', 61 - 'chroot-exec ls -l /run', 62 - 'chroot-exec chown 65534 /bin', 63 - ); 64 - $machine->succeed( 65 - 'test "$(chroot-exec id -u)" = 0', 66 - 'chroot-exec chown 0 /bin', 67 - ); 54 + { testScript = '' 55 + with subtest("full confinement with APIVFS"): 56 + machine.fail( 57 + "chroot-exec ls -l /etc", 58 + "chroot-exec ls -l /run", 59 + "chroot-exec chown 65534 /bin", 60 + ) 61 + machine.succeed( 62 + 'test "$(chroot-exec id -u)" = 0', "chroot-exec chown 0 /bin", 63 + ) 68 64 ''; 69 65 } 70 - { description = "check existence of bind-mounted /etc"; 71 - config.serviceConfig.BindReadOnlyPaths = [ "/etc" ]; 66 + { config.serviceConfig.BindReadOnlyPaths = [ "/etc" ]; 72 67 testScript = '' 73 - $machine->succeed('test -n "$(chroot-exec cat /etc/passwd)"'); 68 + with subtest("check existence of bind-mounted /etc"): 69 + machine.succeed('test -n "$(chroot-exec cat /etc/passwd)"') 74 70 ''; 75 71 } 76 - { description = "check if User/Group really runs as non-root"; 77 - config.serviceConfig.User = "chroot-testuser"; 72 + { config.serviceConfig.User = "chroot-testuser"; 78 73 config.serviceConfig.Group = "chroot-testgroup"; 79 74 testScript = '' 80 - $machine->succeed('chroot-exec ls -l /dev'); 81 - $machine->succeed('test "$(chroot-exec id -u)" != 0'); 82 - $machine->fail('chroot-exec touch /bin/test'); 75 + with subtest("check if User/Group really runs as non-root"): 76 + machine.succeed("chroot-exec ls -l /dev") 77 + machine.succeed('test "$(chroot-exec id -u)" != 0') 78 + machine.fail("chroot-exec touch /bin/test") 83 79 ''; 84 80 } 85 81 (let ··· 83 87 target = pkgs.writeText "symlink-target" "got me\n"; 84 88 } "ln -s \"$target\" \"$out\""; 85 89 in { 86 - description = "check if symlinks are properly bind-mounted"; 87 90 config.confinement.packages = lib.singleton symlink; 88 91 testScript = '' 89 - $machine->fail('chroot-exec test -e /etc'); 90 - $machine->succeed('chroot-exec cat ${symlink} >&2'); 91 - $machine->succeed('test "$(chroot-exec cat ${symlink})" = "got me"'); 92 + with subtest("check if symlinks are properly bind-mounted"): 93 + machine.fail("chroot-exec test -e /etc") 94 + machine.succeed( 95 + "chroot-exec cat ${symlink} >&2", 96 + 'test "$(chroot-exec cat ${symlink})" = "got me"', 97 + ) 92 98 ''; 93 99 }) 94 - { description = "check if StateDirectory works"; 95 - config.serviceConfig.User = "chroot-testuser"; 100 + { config.serviceConfig.User = "chroot-testuser"; 96 101 config.serviceConfig.Group = "chroot-testgroup"; 97 102 config.serviceConfig.StateDirectory = "testme"; 98 103 testScript = '' 99 - $machine->succeed('chroot-exec touch /tmp/canary'); 100 - $machine->succeed('chroot-exec "echo works > /var/lib/testme/foo"'); 101 - $machine->succeed('test "$(< /var/lib/testme/foo)" = works'); 102 - $machine->succeed('test ! -e /tmp/canary'); 104 + with subtest("check if StateDirectory works"): 105 + machine.succeed("chroot-exec touch /tmp/canary") 106 + machine.succeed('chroot-exec "echo works > /var/lib/testme/foo"') 107 + machine.succeed('test "$(< /var/lib/testme/foo)" = works') 108 + machine.succeed("test ! -e /tmp/canary") 103 109 ''; 104 110 } 105 - { description = "check if /bin/sh works"; 111 + { testScript = '' 112 + with subtest("check if /bin/sh works"): 113 + machine.succeed( 114 + "chroot-exec test -e /bin/sh", 115 + 'test "$(chroot-exec \'/bin/sh -c "echo bar"\')" = bar', 116 + ) 117 + ''; 118 + } 119 + { config.confinement.binSh = null; 106 120 testScript = '' 107 - $machine->succeed( 108 - 'chroot-exec test -e /bin/sh', 109 - 'test "$(chroot-exec \'/bin/sh -c "echo bar"\')" = bar', 110 - ); 121 + with subtest("check if suppressing /bin/sh works"): 122 + machine.succeed("chroot-exec test ! -e /bin/sh") 123 + machine.succeed('test "$(chroot-exec \'/bin/sh -c "echo foo"\')" != foo') 111 124 ''; 112 125 } 113 - { description = "check if suppressing /bin/sh works"; 114 - config.confinement.binSh = null; 126 + { config.confinement.binSh = "${pkgs.hello}/bin/hello"; 115 127 testScript = '' 116 - $machine->succeed( 117 - 'chroot-exec test ! -e /bin/sh', 118 - 'test "$(chroot-exec \'/bin/sh -c "echo foo"\')" != foo', 119 - ); 128 + with subtest("check if we can set /bin/sh to something different"): 129 + machine.succeed("chroot-exec test -e /bin/sh") 130 + machine.succeed('test "$(chroot-exec /bin/sh -g foo)" = foo') 120 131 ''; 121 132 } 122 - { description = "check if we can set /bin/sh to something different"; 123 - config.confinement.binSh = "${pkgs.hello}/bin/hello"; 133 + { config.environment.FOOBAR = pkgs.writeText "foobar" "eek\n"; 124 134 testScript = '' 125 - $machine->succeed( 126 - 'chroot-exec test -e /bin/sh', 127 - 'test "$(chroot-exec /bin/sh -g foo)" = foo', 128 - ); 135 + with subtest("check if only Exec* dependencies are included"): 136 + machine.succeed('test "$(chroot-exec \'cat "$FOOBAR"\')" != eek') 129 137 ''; 130 138 } 131 - { description = "check if only Exec* dependencies are included"; 132 - config.environment.FOOBAR = pkgs.writeText "foobar" "eek\n"; 133 - testScript = '' 134 - $machine->succeed('test "$(chroot-exec \'cat "$FOOBAR"\')" != eek'); 135 - ''; 136 - } 137 - { description = "check if all unit dependencies are included"; 138 - config.environment.FOOBAR = pkgs.writeText "foobar" "eek\n"; 139 + { config.environment.FOOBAR = pkgs.writeText "foobar" "eek\n"; 139 140 config.confinement.fullUnit = true; 140 141 testScript = '' 141 - $machine->succeed('test "$(chroot-exec \'cat "$FOOBAR"\')" = eek'); 142 + with subtest("check if all unit dependencies are included"): 143 + machine.succeed('test "$(chroot-exec \'cat "$FOOBAR"\')" = eek') 142 144 ''; 143 145 } 144 146 ]; ··· 156 162 }; 157 163 158 164 testScript = { nodes, ... }: '' 159 - $machine->waitForUnit('multi-user.target'); 160 - ${nodes.machine.config.__testSteps} 161 - ''; 165 + machine.wait_for_unit("multi-user.target") 166 + '' + nodes.machine.config.__testSteps; 162 167 }
+2 -2
pkgs/applications/audio/dfasma/default.nix
··· 1 - { stdenv, fetchFromGitHub, fftw, libsndfile, qtbase, qtmultimedia, qmake }: 1 + { mkDerivation, stdenv, fetchFromGitHub, fftw, libsndfile, qtbase, qtmultimedia, qmake }: 2 2 3 3 let 4 4 ··· 26 26 }; 27 27 }; 28 28 29 - in stdenv.mkDerivation rec { 29 + in mkDerivation rec { 30 30 pname = "dfasma"; 31 31 version = "1.4.5"; 32 32
+2 -2
pkgs/applications/audio/iannix/default.nix
··· 1 - { stdenv, fetchFromGitHub, alsaLib, pkgconfig, qtbase, qtscript, qmake 1 + { mkDerivation, stdenv, fetchFromGitHub, alsaLib, pkgconfig, qtbase, qtscript, qmake 2 2 }: 3 3 4 - stdenv.mkDerivation { 4 + mkDerivation { 5 5 pname = "iannix"; 6 6 version = "2016-01-31"; 7 7 src = fetchFromGitHub {
+2 -2
pkgs/applications/audio/traverso/default.nix
··· 1 - { stdenv, fetchurl, cmake, pkgconfig 1 + { mkDerivation, stdenv, fetchurl, cmake, pkgconfig 2 2 , alsaLib, fftw, flac, lame, libjack2, libmad, libpulseaudio 3 3 , libsamplerate, libsndfile, libvorbis, portaudio, qtbase, wavpack 4 4 }: 5 - stdenv.mkDerivation { 5 + mkDerivation { 6 6 pname = "traverso"; 7 7 version = "0.49.6"; 8 8
+2 -2
pkgs/applications/editors/mindforger/default.nix
··· 1 - { stdenv, fetchurl, qmake, qtbase, qtwebkit }: 1 + { mkDerivation, stdenv, fetchurl, qmake, qtbase, qtwebkit }: 2 2 3 - stdenv.mkDerivation rec { 3 + mkDerivation rec { 4 4 pname = "mindforger"; 5 5 version = "1.48.2"; 6 6
+2 -2
pkgs/applications/editors/okteta/default.nix
··· 1 - { stdenv, fetchurl, extra-cmake-modules, kdoctools, qtscript, kconfig 1 + { mkDerivation, stdenv, fetchurl, extra-cmake-modules, kdoctools, qtscript, kconfig 2 2 , kinit, karchive, kcrash, kcmutils, kconfigwidgets, knewstuff, kparts 3 3 , qca-qt5, shared-mime-info }: 4 4 5 - stdenv.mkDerivation rec { 5 + mkDerivation rec { 6 6 pname = "okteta"; 7 7 version = "0.26.3"; 8 8
+6 -5
pkgs/applications/graphics/awesomebump/default.nix
··· 1 - { lib, stdenv, fetchgit, qtbase, qmake, makeWrapper, qtscript, flex, bison, qtdeclarative }: 1 + { mkDerivation, lib, fetchgit, qtbase, qmake, qtscript, flex, bison, qtdeclarative }: 2 2 3 3 4 4 let ··· 11 11 fetchSubmodules = true; 12 12 }; 13 13 14 - qtnproperty = stdenv.mkDerivation { 14 + qtnproperty = mkDerivation { 15 15 name = "qtnproperty"; 16 16 inherit src; 17 17 sourceRoot = "AwesomeBump/Sources/utils/QtnProperty"; ··· 22 22 install -D bin-linux/QtnPEG $out/bin/QtnPEG 23 23 ''; 24 24 }; 25 - in stdenv.mkDerivation { 25 + in mkDerivation { 26 26 pname = "awesomebump"; 27 27 inherit version; 28 28 ··· 30 30 31 31 buildInputs = [ qtbase qtscript qtdeclarative ]; 32 32 33 - nativeBuildInputs = [ qmake makeWrapper ]; 33 + nativeBuildInputs = [ qmake ]; 34 34 35 35 preBuild = '' 36 36 ln -sf ${qtnproperty}/bin/QtnPEG Sources/utils/QtnProperty/bin-linux/QtnPEG 37 37 ''; 38 38 39 + dontWrapQtApps = true; 39 40 postInstall = '' 40 41 d=$out/libexec/AwesomeBump 41 42 ··· 45 44 cp -prd Bin/Configs Bin/Core $d/ 46 45 47 46 # AwesomeBump expects to find Core and Configs in its current directory. 48 - makeWrapper $d/AwesomeBump $out/bin/AwesomeBump \ 47 + makeQtWrapper $d/AwesomeBump $out/bin/AwesomeBump \ 49 48 --run "cd $d" 50 49 ''; 51 50
+2 -2
pkgs/applications/graphics/phototonic/default.nix
··· 1 - { stdenv, fetchFromGitHub, qtbase, qmake, exiv2 }: 1 + { mkDerivation, stdenv, fetchFromGitHub, qtbase, qmake, exiv2 }: 2 2 3 - stdenv.mkDerivation rec { 3 + mkDerivation rec { 4 4 pname = "phototonic"; 5 5 version = "2.1"; 6 6
+2 -2
pkgs/applications/graphics/qcomicbook/default.nix
··· 1 - { stdenv, fetchFromGitHub, pkgconfig, cmake, qtbase, qttools, qtx11extras, poppler }: 1 + { mkDerivation, stdenv, fetchFromGitHub, pkgconfig, cmake, qtbase, qttools, qtx11extras, poppler }: 2 2 3 - stdenv.mkDerivation rec { 3 + mkDerivation rec { 4 4 pname = "qcomicbook"; 5 5 version = "0.9.1"; 6 6
+2 -2
pkgs/applications/graphics/write_stylus/default.nix
··· 1 - { stdenv, lib, qtbase, qtsvg, libglvnd, fetchurl, makeDesktopItem }: 1 + { mkDerivation, stdenv, lib, qtbase, qtsvg, libglvnd, fetchurl, makeDesktopItem }: 2 2 let 3 3 # taken from: https://www.iconfinder.com/icons/50835/edit_pencil_write_icon 4 4 # license: Free for commercial use ··· 7 7 sha256 = "0abdya42yf9alxbsmc2nf8jwld50zfria6z3d4ncvp1zw2a9jhb8"; 8 8 }; 9 9 in 10 - stdenv.mkDerivation rec { 10 + mkDerivation rec { 11 11 pname = "write_stylus"; 12 12 version = "209"; 13 13
+2 -2
pkgs/applications/misc/bibletime/default.nix
··· 1 - { stdenv, fetchurl, cmake, pkgconfig, sword, boost, clucene_core 1 + { mkDerivation, stdenv, fetchurl, cmake, pkgconfig, sword, boost, clucene_core 2 2 , qtbase, qttools, qtsvg, qtwebkit 3 3 }: 4 4 5 - stdenv.mkDerivation rec { 5 + mkDerivation rec { 6 6 7 7 version = "2.11.2"; 8 8
+2 -2
pkgs/applications/misc/candle/default.nix
··· 1 - { stdenv, fetchFromGitHub, qtbase, qtserialport, qmake }: 1 + { mkDerivation, stdenv, fetchFromGitHub, qtbase, qtserialport, qmake }: 2 2 3 - stdenv.mkDerivation rec { 3 + mkDerivation rec { 4 4 pname = "candle"; 5 5 version = "1.1"; 6 6
+43
pkgs/applications/misc/fitnesstrax/default.nix
··· 1 + { fetchFromGitHub 2 + , glib 3 + , gtk3 4 + , lib 5 + , rustPlatform 6 + , wrapGAppsHook 7 + }: 8 + 9 + rustPlatform.buildRustPackage rec { 10 + pname = "fitnesstrax"; 11 + version = "0.1.0"; 12 + 13 + src = fetchFromGitHub { 14 + owner = "luminescent-dreams"; 15 + repo = "fitnesstrax"; 16 + rev = "${pname}-${version}"; 17 + sha256 = "1k6zhnbs0ggx7q0ig2abcnzprsgrychlpvsh6d36dw6mr8zpfkp7"; 18 + }; 19 + 20 + nativeBuildInputs = [ 21 + wrapGAppsHook 22 + ]; 23 + 24 + buildInputs = [ 25 + glib 26 + gtk3 27 + ]; 28 + 29 + cargoSha256 = "1xgyyxd2kz21xan0pk7rbxiym90s7m2qrzg2ddilcszva60bxdd9"; 30 + 31 + postInstall = '' 32 + mkdir -p $out/share/glib-2.0/schemas 33 + cp -r $src/share/* $out/share/ 34 + glib-compile-schemas $out/share/glib-2.0/schemas 35 + ''; 36 + 37 + meta = with lib; { 38 + description = "Privacy-first fitness tracking"; 39 + homepage = "https://github.com/luminescent-dreams/fitnesstrax"; 40 + license = licenses.bsd3; 41 + maintainers = with maintainers; [ savannidgerinel ]; 42 + }; 43 + }
+2 -2
pkgs/applications/misc/openbrf/default.nix
··· 1 - { stdenv, fetchFromGitHub, qtbase, vcg, glew, qmake, libGLU, libGL }: 1 + { mkDerivation, stdenv, fetchFromGitHub, qtbase, vcg, glew, qmake, libGLU, libGL }: 2 2 3 3 4 - stdenv.mkDerivation { 4 + mkDerivation { 5 5 name = "openbrf-unstable-2016-01-09"; 6 6 7 7 src = fetchFromGitHub {
+3 -2
pkgs/applications/misc/qt-box-editor/default.nix
··· 1 - { stdenv 1 + { mkDerivation 2 + , stdenv 2 3 , fetchFromGitHub 3 4 , qtbase 4 5 , qtsvg ··· 8 7 , tesseract 9 8 }: 10 9 11 - stdenv.mkDerivation { 10 + mkDerivation { 12 11 pname = "qt-box-editor"; 13 12 version = "unstable-2019-07-12"; 14 13
+2 -2
pkgs/applications/misc/valentina/default.nix
··· 1 - { stdenv, fetchhg 1 + { mkDerivation, stdenv, fetchhg 2 2 , qmake, qttools 3 3 , qtbase, qtsvg, qtxmlpatterns 4 4 , poppler_utils ··· 6 6 7 7 with stdenv.lib; 8 8 9 - stdenv.mkDerivation rec { 9 + mkDerivation rec { 10 10 pname = "valentina"; 11 11 version = "0.6.1"; 12 12
+2 -2
pkgs/applications/networking/instant-messengers/ricochet/default.nix
··· 1 - { stdenv, fetchurl, pkgconfig, makeDesktopItem 1 + { mkDerivation, stdenv, fetchurl, pkgconfig, makeDesktopItem 2 2 , qtbase, qttools, qtmultimedia, qtquick1, qtquickcontrols 3 3 , openssl, protobuf, qmake 4 4 }: 5 5 6 - stdenv.mkDerivation rec { 6 + mkDerivation rec { 7 7 pname = "ricochet"; 8 8 version = "1.1.4"; 9 9
+2 -2
pkgs/applications/networking/instant-messengers/swift-im/default.nix
··· 1 - { stdenv, fetchurl, pkgconfig, qttools, scons 1 + { mkDerivation, stdenv, fetchurl, pkgconfig, qttools, scons 2 2 , GConf, avahi, boost, hunspell, libXScrnSaver, libedit, libidn, libnatpmp, libxml2 3 3 , lua, miniupnpc, openssl, qtbase, qtmultimedia, qtsvg, qtwebkit, qtx11extras, zlib 4 4 }: 5 5 6 - stdenv.mkDerivation rec { 6 + mkDerivation rec { 7 7 pname = "swift-im"; 8 8 version = "4.0.2"; 9 9
+2 -2
pkgs/applications/networking/instant-messengers/tensor/default.nix
··· 1 - { stdenv, fetchgit, qtbase, qtquickcontrols, qmake, makeDesktopItem }: 1 + { mkDerivation, stdenv, fetchgit, qtbase, qtquickcontrols, qmake, makeDesktopItem }: 2 2 3 3 # we now have libqmatrixclient so a future version of tensor that supports it 4 4 # should use that 5 5 6 - stdenv.mkDerivation rec { 6 + mkDerivation rec { 7 7 pname = "tensor-git"; 8 8 version = "2017-02-21"; 9 9
+2 -2
pkgs/applications/networking/p2p/tixati/default.nix
··· 2 2 3 3 stdenv.mkDerivation rec { 4 4 pname = "tixati"; 5 - version = "2.67"; 5 + version = "2.72"; 6 6 7 7 src = fetchurl { 8 8 url = "https://download2.tixati.com/download/tixati-${version}-1.x86_64.manualinstall.tar.gz"; 9 - sha256 = "0510wkwmwrlv61958zd5nsc4lr0l0lka3jf4pq3dyiyfsf4k20rq"; 9 + sha256 = "04si7xwbpvljdbngmzlfvkn51wih3aqcb5g6r76wdh3pfpppskhr"; 10 10 }; 11 11 12 12 installPhase = ''
+17 -4
pkgs/applications/office/elementary-planner/default.nix
··· 1 - { stdenv, fetchFromGitHub, fetchpatch 2 - , meson, ninja, pkgconfig, desktop-file-utils 3 - , python3, vala, wrapGAppsHook 1 + { stdenv 2 + , fetchFromGitHub 3 + , meson 4 + , ninja 5 + , pkgconfig 6 + , desktop-file-utils 7 + , python3 8 + , vala 9 + , wrapGAppsHook 4 10 , evolution-data-server 5 11 , libical 6 12 , libgee ··· 69 63 patchShebangs build-aux/meson/post_install.py 70 64 ''; 71 65 66 + preFixup = '' 67 + gappsWrapperArgs+=( 68 + # the theme is hardcoded 69 + --prefix XDG_DATA_DIRS : "${pantheon.elementary-gtk-theme}/share" 70 + ) 71 + ''; 72 + 72 73 meta = with stdenv.lib; { 73 - description = "Task and project manager designed to elementary OS"; 74 + description = "Task manager with Todoist support designed for GNU/Linux 🚀️"; 74 75 homepage = "https://planner-todo.web.app"; 75 76 license = licenses.gpl3; 76 77 maintainers = with maintainers; [ dtzWill ] ++ pantheon.maintainers;
+2 -2
pkgs/applications/science/electronics/caneda/default.nix
··· 1 - {stdenv, fetchFromGitHub, cmake, qtbase, qttools, qtsvg, qwt }: 1 + { mkDerivation, stdenv, fetchFromGitHub, cmake, qtbase, qttools, qtsvg, qwt }: 2 2 3 - stdenv.mkDerivation rec { 3 + mkDerivation rec { 4 4 pname = "caneda"; 5 5 version = "0.3.1"; 6 6
+4 -4
pkgs/applications/version-management/git-and-tools/gh/default.nix
··· 2 2 3 3 buildGoModule rec { 4 4 pname = "gh"; 5 - version = "0.6.4"; 5 + version = "0.7.0"; 6 6 7 7 src = fetchFromGitHub { 8 8 owner = "cli"; 9 9 repo = "cli"; 10 10 rev = "v${version}"; 11 - sha256 = "0na8zfvcmdy968i47x6qd1jwfaphy5h18ff7ym5sxyia9a27yhf8"; 11 + sha256 = "054mag8jgxkvx2f95ha10n45v4xv5lms69w76g95z18m62qhjcyl"; 12 12 }; 13 13 14 - modSha256 = "102v30wr9wmd6n20qdvgs5mp2s639pwbqqd71r8q52f42p694bi1"; 14 + modSha256 = "0v33x9bnwjfg4425vralnsb4i22c0g1rcmaga9911v0i7d51k0fn"; 15 15 16 16 buildFlagsArray = [ 17 - "-ldflags=-X github.com/cli/cli/command.Version=${version}" 17 + "-ldflags=-s -w -X github.com/cli/cli/command.Version=${version}" 18 18 ]; 19 19 20 20 subPackages = [ "cmd/gh" ];
+9 -5
pkgs/applications/version-management/git-and-tools/git-gone/default.nix
··· 1 - { stdenv, fetchFromGitHub, rustPlatform, pkgconfig, makeWrapper, openssl, git, libiconv, Security }: 1 + { stdenv, fetchFromGitHub, rustPlatform, pkgconfig, makeWrapper, openssl, git, libiconv, Security, installShellFiles }: 2 2 3 3 rustPlatform.buildRustPackage rec { 4 4 pname = "git-gone"; 5 - version = "0.3.0"; 5 + version = "0.3.2"; 6 6 7 7 src = fetchFromGitHub { 8 8 owner = "lunaryorn"; 9 9 repo = pname; 10 10 rev = "v${version}"; 11 - sha256 = "05wlng563p9iy0ky3z23a4jakcix887fb45r7j2mk0fp5ykdjmzh"; 11 + sha256 = "0zc4cb1dg30np5yc4ymkr894qs2bk0r123i302md00niayk4njyd"; 12 12 }; 13 13 14 - cargoSha256 = "1scp9rzn59akxsf9p48j1zq6clbwdyasnyi4j28nj03ghvdv2i33"; 14 + cargoSha256 = "1d892889ml7sqyxzmjipq5fvizb4abqhmmn450qm7yam9fn5q5wf"; 15 15 16 - nativeBuildInputs = [ pkgconfig makeWrapper ]; 16 + nativeBuildInputs = [ pkgconfig makeWrapper installShellFiles ]; 17 17 18 18 buildInputs = [ openssl ] 19 19 ++ stdenv.lib.optionals stdenv.isDarwin [ libiconv Security ]; 20 + 21 + postInstall = '' 22 + installManPage git-gone.1 23 + ''; 20 24 21 25 postFixup = '' 22 26 wrapProgram $out/bin/git-gone --prefix PATH : "${stdenv.lib.makeBinPath [ git ]}"
+6 -5
pkgs/applications/video/bomi/default.nix
··· 1 - { config, stdenv, fetchFromGitHub 1 + { mkDerivation, config, stdenv, fetchFromGitHub 2 2 , fetchpatch, pkgconfig, perl, python, which 3 3 , libX11, libxcb, libGLU, libGL 4 - , qtbase, qtdeclarative, qtquickcontrols, qttools, qtx11extras, qmake, makeWrapper 4 + , qtbase, qtdeclarative, qtquickcontrols, qttools, qtx11extras, qmake 5 5 , libchardet 6 6 , ffmpeg 7 7 ··· 29 29 assert cddaSupport -> libcdda != null; 30 30 assert youtubeSupport -> youtube-dl != null; 31 31 32 - stdenv.mkDerivation rec { 32 + mkDerivation rec { 33 33 pname = "bomi"; 34 34 version = "0.9.11"; 35 35 ··· 90 90 patchShebangs build-mpv 91 91 ''; 92 92 93 + dontWrapQtApps = true; 93 94 postInstall = '' 94 - wrapProgram $out/bin/bomi \ 95 + wrapQtApp $out/bin/bomi \ 95 96 ${optionalString youtubeSupport "--prefix PATH ':' '${youtube-dl}/bin'"} 96 97 ''; 97 98 ··· 106 105 ++ optional cddaSupport "--enable-cdda" 107 106 ; 108 107 109 - nativeBuildInputs = [ makeWrapper pkgconfig perl python which qttools qmake ]; 108 + nativeBuildInputs = [ pkgconfig perl python which qttools qmake ]; 110 109 111 110 meta = with stdenv.lib; { 112 111 description = "Powerful and easy-to-use multimedia player";
+2 -2
pkgs/applications/video/qmediathekview/default.nix
··· 1 - { stdenv, fetchFromGitHub, qtbase, qttools, xz, boost, qmake, pkgconfig }: 1 + { mkDerivation, stdenv, fetchFromGitHub, qtbase, qttools, xz, boost, qmake, pkgconfig }: 2 2 3 - stdenv.mkDerivation rec { 3 + mkDerivation rec { 4 4 pname = "QMediathekView"; 5 5 version = "2019-01-06"; 6 6
+2 -2
pkgs/applications/video/qstopmotion/default.nix
··· 1 - { stdenv, fetchurl, qt5, ffmpeg, guvcview, cmake, ninja, libxml2 1 + { mkDerivation, stdenv, fetchurl, qt5, ffmpeg, guvcview, cmake, ninja, libxml2 2 2 , gettext, pkgconfig, libgphoto2, gphoto2, v4l-utils, libv4l, pcre 3 3 , qwt, extra-cmake-modules }: 4 4 5 - stdenv.mkDerivation rec { 5 + mkDerivation rec { 6 6 pname = "qstopmotion"; 7 7 version = "2.4.1"; 8 8
+2 -2
pkgs/applications/virtualization/aqemu/default.nix
··· 1 - { cmake, fetchFromGitHub, libvncserver, qemu, qtbase, stdenv 1 + { mkDerivation, cmake, fetchFromGitHub, libvncserver, qemu, qtbase, stdenv 2 2 }: 3 3 4 - stdenv.mkDerivation rec { 4 + mkDerivation rec { 5 5 pname = "aqemu"; 6 6 version = "0.9.2"; 7 7
+2 -2
pkgs/build-support/alternatives/blas/default.nix
··· 63 63 installPhase = ('' 64 64 mkdir -p $out/lib $dev/include $dev/lib/pkgconfig 65 65 66 - libblas="${lib.getLib blasProvider}/lib/libblas${stdenv.hostPlatform.extensions.sharedLibrary}" 66 + libblas="${lib.getLib blasProvider}/lib/libblas${canonicalExtension}" 67 67 68 68 if ! [ -e "$libblas" ]; then 69 69 echo "$libblas does not exist, ${blasProvider.name} does not provide libblas." ··· 100 100 Cflags: -I$dev/include 101 101 EOF 102 102 103 - libcblas="${lib.getLib blasProvider}/lib/libcblas${stdenv.hostPlatform.extensions.sharedLibrary}" 103 + libcblas="${lib.getLib blasProvider}/lib/libcblas${canonicalExtension}" 104 104 105 105 if ! [ -e "$libcblas" ]; then 106 106 echo "$libcblas does not exist, ${blasProvider.name} does not provide libcblas."
+2 -2
pkgs/build-support/alternatives/lapack/default.nix
··· 41 41 installPhase = ('' 42 42 mkdir -p $out/lib $dev/include $dev/lib/pkgconfig 43 43 44 - liblapack="${lib.getLib lapackProvider}/lib/liblapack${stdenv.hostPlatform.extensions.sharedLibrary}" 44 + liblapack="${lib.getLib lapackProvider}/lib/liblapack${canonicalExtension}" 45 45 46 46 if ! [ -e "$liblapack" ]; then 47 47 echo "$liblapack does not exist, ${lapackProvider.name} does not provide liblapack." ··· 74 74 Libs: -L$out/lib -llapack 75 75 EOF 76 76 77 - liblapacke="${lib.getLib lapackProvider}/lib/liblapacke${stdenv.hostPlatform.extensions.sharedLibrary}" 77 + liblapacke="${lib.getLib lapackProvider}/lib/liblapacke${canonicalExtension}" 78 78 79 79 if ! [ -e "$liblapacke" ]; then 80 80 echo "$liblapacke does not exist, ${lapackProvider.name} does not provide liblapacke."
+3
pkgs/desktops/pantheon/desktop/elementary-greeter/default.nix
··· 103 103 104 104 # for the compositor 105 105 --prefix PATH : "$out/bin" 106 + 107 + # the theme is hardcoded 108 + --prefix XDG_DATA_DIRS : "${elementary-gtk-theme}/share" 106 109 ) 107 110 ''; 108 111
+4726
pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/207.patch
··· 1 + From 20228e34bf97f67b1dd542a22e92cd90f0db5c72 Mon Sep 17 00:00:00 2001 2 + From: Dirli <litandrej85@gmail.com> 3 + Date: Thu, 9 Apr 2020 16:30:16 +0300 4 + Subject: [PATCH 1/8] added a single namespace 5 + 6 + --- 7 + meson.build | 14 +- 8 + src/DateIterator.vala | 82 ----- 9 + src/DateRange.vala | 66 ---- 10 + src/Indicator.vala | 341 +++++++++--------- 11 + .../calendar => Models}/CalendarModel.vala | 4 +- 12 + src/Services/TimeManager.vala | 230 ++++++------ 13 + src/Util/DateIterator.vala | 84 +++++ 14 + src/Util/DateRange.vala | 68 ++++ 15 + src/{Widgets/calendar => Util}/Util.vala | 8 +- 16 + src/Widgets/CalendarView.vala | 185 ++++++++++ 17 + src/Widgets/EventRow.vala | 184 +++++----- 18 + src/Widgets/{calendar => }/Grid.vala | 12 +- 19 + src/Widgets/GridDay.vala | 180 +++++++++ 20 + src/Widgets/PanelLabel.vala | 80 ++-- 21 + src/Widgets/calendar/CalendarView.vala | 183 ---------- 22 + src/Widgets/calendar/GridDay.vala | 178 --------- 23 + 16 files changed, 957 insertions(+), 942 deletions(-) 24 + delete mode 100644 src/DateIterator.vala 25 + delete mode 100644 src/DateRange.vala 26 + rename src/{Widgets/calendar => Models}/CalendarModel.vala (99%) 27 + create mode 100644 src/Util/DateIterator.vala 28 + create mode 100644 src/Util/DateRange.vala 29 + rename src/{Widgets/calendar => Util}/Util.vala (96%) 30 + create mode 100644 src/Widgets/CalendarView.vala 31 + rename src/Widgets/{calendar => }/Grid.vala (95%) 32 + create mode 100644 src/Widgets/GridDay.vala 33 + delete mode 100644 src/Widgets/calendar/CalendarView.vala 34 + delete mode 100644 src/Widgets/calendar/GridDay.vala 35 + 36 + diff --git a/meson.build b/meson.build 37 + index 2555723..b44c5bd 100644 38 + --- a/meson.build 39 + +++ b/meson.build 40 + @@ -39,16 +39,16 @@ endif 41 + shared_module( 42 + meson.project_name(), 43 + gresource, 44 + - 'src/DateIterator.vala', 45 + - 'src/DateRange.vala', 46 + 'src/Indicator.vala', 47 + + 'src/Util/DateIterator.vala', 48 + + 'src/Util/DateRange.vala', 49 + + 'src/Util/Util.vala', 50 + + 'src/Models/CalendarModel.vala', 51 + + 'src/Widgets/CalendarView.vala', 52 + 'src/Widgets/EventRow.vala', 53 + + 'src/Widgets/Grid.vala', 54 + + 'src/Widgets/GridDay.vala', 55 + 'src/Widgets/PanelLabel.vala', 56 + - 'src/Widgets/calendar/CalendarModel.vala', 57 + - 'src/Widgets/calendar/CalendarView.vala', 58 + - 'src/Widgets/calendar/Grid.vala', 59 + - 'src/Widgets/calendar/GridDay.vala', 60 + - 'src/Widgets/calendar/Util.vala', 61 + 'src/Services/TimeManager.vala', 62 + dependencies: [ 63 + dependency('glib-2.0'), 64 + diff --git a/src/DateIterator.vala b/src/DateIterator.vala 65 + deleted file mode 100644 66 + index 961895b..0000000 67 + --- a/src/DateIterator.vala 68 + +++ /dev/null 69 + @@ -1,82 +0,0 @@ 70 + -/* 71 + - * Copyright 2011-2018 elementary, Inc. (https://elementary.io) 72 + - * 73 + - * This program is free software; you can redistribute it and/or 74 + - * modify it under the terms of the GNU General Public 75 + - * License as published by the Free Software Foundation; either 76 + - * version 2 of the License, or (at your option) any later version. 77 + - * 78 + - * This program is distributed in the hope that it will be useful, 79 + - * but WITHOUT ANY WARRANTY; without even the implied warranty of 80 + - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 81 + - * General Public License for more details. 82 + - * 83 + - * You should have received a copy of the GNU General Public 84 + - * License along with this program; if not, write to the 85 + - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 86 + - * Boston, MA 02110-1301 USA. 87 + - * 88 + - * Authored by: Corentin Noël <corentin@elementaryos.org> 89 + - */ 90 + - 91 + -public class Util.DateIterator : Object, Gee.Traversable<GLib.DateTime>, Gee.Iterator<GLib.DateTime> { 92 + - public GLib.DateTime current { get; construct set; } 93 + - public Util.DateRange range { get; construct; } 94 + - 95 + - // Required by Gee.Iterator 96 + - public bool valid { 97 + - get { 98 + - return true; 99 + - } 100 + - } 101 + - 102 + - // Required by Gee.Iterator 103 + - public bool read_only { 104 + - get { 105 + - return false; 106 + - } 107 + - } 108 + - 109 + - public DateIterator (Util.DateRange range) { 110 + - Object ( 111 + - range: range, 112 + - current: range.first_dt.add_days (-1) 113 + - ); 114 + - } 115 + - 116 + - public bool @foreach (Gee.ForallFunc<GLib.DateTime> f) { 117 + - var element = range.first_dt; 118 + - 119 + - while (element.compare (range.last_dt) < 0) { 120 + - if (f (element) == false) { 121 + - return false; 122 + - } 123 + - 124 + - element = element.add_days (1); 125 + - } 126 + - 127 + - return true; 128 + - } 129 + - 130 + - public bool next () { 131 + - if (!has_next ()) { 132 + - return false; 133 + - } 134 + - 135 + - current = this.current.add_days (1); 136 + - 137 + - return true; 138 + - } 139 + - 140 + - public bool has_next () { 141 + - return current.compare (range.last_dt) < 0; 142 + - } 143 + - 144 + - public new GLib.DateTime get () { 145 + - return current; 146 + - } 147 + - 148 + - public void remove () { 149 + - assert_not_reached (); 150 + - } 151 + -} 152 + diff --git a/src/DateRange.vala b/src/DateRange.vala 153 + deleted file mode 100644 154 + index 08e4c00..0000000 155 + --- a/src/DateRange.vala 156 + +++ /dev/null 157 + @@ -1,66 +0,0 @@ 158 + -/* 159 + - * Copyright 2011-2019 elementary, Inc. (https://elementary.io) 160 + - * 161 + - * This program is free software; you can redistribute it and/or 162 + - * modify it under the terms of the GNU General Public 163 + - * License as published by the Free Software Foundation; either 164 + - * version 2 of the License, or (at your option) any later version. 165 + - * 166 + - * This program is distributed in the hope that it will be useful, 167 + - * but WITHOUT ANY WARRANTY; without even the implied warranty of 168 + - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 169 + - * General Public License for more details. 170 + - * 171 + - * You should have received a copy of the GNU General Public 172 + - * License along with this program; if not, write to the 173 + - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 174 + - * Boston, MA 02110-1301 USA. 175 + - * 176 + - * Authored by: Corentin Noël <corentin@elementaryos.org> 177 + - */ 178 + - 179 + -/* Represents date range from 'first' to 'last' inclusive */ 180 + -public class Util.DateRange : Object, Gee.Traversable<GLib.DateTime>, Gee.Iterable<GLib.DateTime> { 181 + - public GLib.DateTime first_dt { get; construct; } 182 + - public GLib.DateTime last_dt { get; construct; } 183 + - 184 + - public bool @foreach (Gee.ForallFunc<GLib.DateTime> f) { 185 + - foreach (var date in this) { 186 + - if (f (date) == false) { 187 + - return false; 188 + - } 189 + - } 190 + - 191 + - return true; 192 + - } 193 + - 194 + - public DateRange (GLib.DateTime first, GLib.DateTime last) { 195 + - Object ( 196 + - first_dt: first, 197 + - last_dt: last 198 + - ); 199 + - } 200 + - 201 + - public bool equals (DateRange other) { 202 + - return (first_dt == other.first_dt && last_dt == other.last_dt); 203 + - } 204 + - 205 + - public Gee.Iterator<GLib.DateTime> iterator () { 206 + - return new DateIterator (this); 207 + - } 208 + - 209 + - public Gee.List<GLib.DateTime> to_list () { 210 + - var list = new Gee.ArrayList<GLib.DateTime> ((Gee.EqualDataFunc<GLib.DateTime>? )datetime_equal_func); 211 + - 212 + - foreach (var date in this) { 213 + - list.add (date); 214 + - } 215 + - 216 + - return list; 217 + - } 218 + - 219 + - /* Returns true if 'a' and 'b' are the same GLib.DateTime */ 220 + - private bool datetime_equal_func (GLib.DateTime a, GLib.DateTime b) { 221 + - return a.equal (b); 222 + - } 223 + -} 224 + diff --git a/src/Indicator.vala b/src/Indicator.vala 225 + index 77aa35c..b712c12 100644 226 + --- a/src/Indicator.vala 227 + +++ b/src/Indicator.vala 228 + @@ -17,218 +17,219 @@ 229 + * Boston, MA 02110-1301 USA. 230 + */ 231 + 232 + -public class DateTime.Indicator : Wingpanel.Indicator { 233 + - public static GLib.Settings settings; 234 + - 235 + - private Widgets.PanelLabel panel_label; 236 + - private Gtk.Grid main_grid; 237 + - private Widgets.CalendarView calendar; 238 + - private Gtk.ListBox event_listbox; 239 + - private uint update_events_idle_source = 0; 240 + - 241 + - public Indicator () { 242 + - Object ( 243 + - code_name: Wingpanel.Indicator.DATETIME, 244 + - display_name: _("Date & Time"), 245 + - description: _("The date and time indicator") 246 + - ); 247 + - } 248 + - 249 + - static construct { 250 + - settings = new GLib.Settings ("io.elementary.desktop.wingpanel.datetime"); 251 + - } 252 + +namespace DateTimeIndicator { 253 + + public class Indicator : Wingpanel.Indicator { 254 + + public static GLib.Settings settings; 255 + + 256 + + private Widgets.PanelLabel panel_label; 257 + + private Gtk.Grid main_grid; 258 + + private Widgets.CalendarView calendar; 259 + + private Gtk.ListBox event_listbox; 260 + + private uint update_events_idle_source = 0; 261 + + 262 + + public Indicator () { 263 + + Object ( 264 + + code_name: Wingpanel.Indicator.DATETIME, 265 + + display_name: _("Date & Time"), 266 + + description: _("The date and time indicator") 267 + + ); 268 + + } 269 + 270 + - construct { 271 + - visible = true; 272 + - } 273 + + static construct { 274 + + settings = new GLib.Settings ("io.elementary.desktop.wingpanel.datetime"); 275 + + } 276 + 277 + - public override Gtk.Widget get_display_widget () { 278 + - if (panel_label == null) { 279 + - panel_label = new Widgets.PanelLabel (); 280 + + construct { 281 + + visible = true; 282 + } 283 + 284 + - return panel_label; 285 + - } 286 + + public override Gtk.Widget get_display_widget () { 287 + + if (panel_label == null) { 288 + + panel_label = new Widgets.PanelLabel (); 289 + + } 290 + 291 + - public override Gtk.Widget? get_widget () { 292 + - if (main_grid == null) { 293 + - calendar = new Widgets.CalendarView (); 294 + - calendar.margin_bottom = 6; 295 + - 296 + - var placeholder_label = new Gtk.Label (_("No Events on This Day")); 297 + - placeholder_label.wrap = true; 298 + - placeholder_label.wrap_mode = Pango.WrapMode.WORD; 299 + - placeholder_label.margin_start = 12; 300 + - placeholder_label.margin_end = 12; 301 + - placeholder_label.max_width_chars = 20; 302 + - placeholder_label.justify = Gtk.Justification.CENTER; 303 + - placeholder_label.show_all (); 304 + - 305 + - var placeholder_style_context = placeholder_label.get_style_context (); 306 + - placeholder_style_context.add_class (Gtk.STYLE_CLASS_DIM_LABEL); 307 + - placeholder_style_context.add_class (Granite.STYLE_CLASS_H3_LABEL); 308 + - 309 + - event_listbox = new Gtk.ListBox (); 310 + - event_listbox.selection_mode = Gtk.SelectionMode.NONE; 311 + - event_listbox.set_header_func (header_update_func); 312 + - event_listbox.set_placeholder (placeholder_label); 313 + - event_listbox.set_sort_func (sort_function); 314 + - 315 + - var scrolled_window = new Gtk.ScrolledWindow (null, null); 316 + - scrolled_window.hscrollbar_policy = Gtk.PolicyType.NEVER; 317 + - scrolled_window.add (event_listbox); 318 + - 319 + - var settings_button = new Gtk.ModelButton (); 320 + - settings_button.text = _("Date & Time Settings…"); 321 + - 322 + - main_grid = new Gtk.Grid (); 323 + - main_grid.margin_top = 12; 324 + - main_grid.attach (calendar, 0, 0); 325 + - main_grid.attach (new Gtk.Separator (Gtk.Orientation.VERTICAL), 1, 0); 326 + - main_grid.attach (scrolled_window, 2, 0); 327 + - main_grid.attach (new Wingpanel.Widgets.Separator (), 0, 2, 3); 328 + - main_grid.attach (settings_button, 0, 3, 3); 329 + - 330 + - var size_group = new Gtk.SizeGroup (Gtk.SizeGroupMode.HORIZONTAL); 331 + - size_group.add_widget (calendar); 332 + - size_group.add_widget (event_listbox); 333 + - 334 + - calendar.day_double_click.connect (() => { 335 + - close (); 336 + - }); 337 + + return panel_label; 338 + + } 339 + 340 + - calendar.selection_changed.connect ((date) => { 341 + - idle_update_events (); 342 + - }); 343 + + public override Gtk.Widget? get_widget () { 344 + + if (main_grid == null) { 345 + + calendar = new Widgets.CalendarView (); 346 + + calendar.margin_bottom = 6; 347 + + 348 + + var placeholder_label = new Gtk.Label (_("No Events on This Day")); 349 + + placeholder_label.wrap = true; 350 + + placeholder_label.wrap_mode = Pango.WrapMode.WORD; 351 + + placeholder_label.margin_start = 12; 352 + + placeholder_label.margin_end = 12; 353 + + placeholder_label.max_width_chars = 20; 354 + + placeholder_label.justify = Gtk.Justification.CENTER; 355 + + placeholder_label.show_all (); 356 + + 357 + + var placeholder_style_context = placeholder_label.get_style_context (); 358 + + placeholder_style_context.add_class (Gtk.STYLE_CLASS_DIM_LABEL); 359 + + placeholder_style_context.add_class (Granite.STYLE_CLASS_H3_LABEL); 360 + + 361 + + event_listbox = new Gtk.ListBox (); 362 + + event_listbox.selection_mode = Gtk.SelectionMode.NONE; 363 + + event_listbox.set_header_func (header_update_func); 364 + + event_listbox.set_placeholder (placeholder_label); 365 + + event_listbox.set_sort_func (sort_function); 366 + + 367 + + var scrolled_window = new Gtk.ScrolledWindow (null, null); 368 + + scrolled_window.hscrollbar_policy = Gtk.PolicyType.NEVER; 369 + + scrolled_window.add (event_listbox); 370 + + 371 + + var settings_button = new Gtk.ModelButton (); 372 + + settings_button.text = _("Date & Time Settings…"); 373 + + 374 + + main_grid = new Gtk.Grid (); 375 + + main_grid.margin_top = 12; 376 + + main_grid.attach (calendar, 0, 0); 377 + + main_grid.attach (new Gtk.Separator (Gtk.Orientation.VERTICAL), 1, 0); 378 + + main_grid.attach (scrolled_window, 2, 0); 379 + + main_grid.attach (new Wingpanel.Widgets.Separator (), 0, 2, 3); 380 + + main_grid.attach (settings_button, 0, 3, 3); 381 + + 382 + + var size_group = new Gtk.SizeGroup (Gtk.SizeGroupMode.HORIZONTAL); 383 + + size_group.add_widget (calendar); 384 + + size_group.add_widget (event_listbox); 385 + + 386 + + calendar.day_double_click.connect (() => { 387 + + close (); 388 + + }); 389 + + 390 + + calendar.selection_changed.connect ((date) => { 391 + + idle_update_events (); 392 + + }); 393 + + 394 + + event_listbox.row_activated.connect ((row) => { 395 + + calendar.show_date_in_maya (((EventRow) row).date); 396 + + close (); 397 + + }); 398 + + 399 + + settings_button.clicked.connect (() => { 400 + + try { 401 + + AppInfo.launch_default_for_uri ("settings://time", null); 402 + + } catch (Error e) { 403 + + warning ("Failed to open time and date settings: %s", e.message); 404 + + } 405 + + }); 406 + + } 407 + 408 + - event_listbox.row_activated.connect ((row) => { 409 + - calendar.show_date_in_maya (((DateTime.EventRow) row).date); 410 + - close (); 411 + - }); 412 + + return main_grid; 413 + + } 414 + 415 + - settings_button.clicked.connect (() => { 416 + - try { 417 + - AppInfo.launch_default_for_uri ("settings://time", null); 418 + - } catch (Error e) { 419 + - warning ("Failed to open time and date settings: %s", e.message); 420 + + private void header_update_func (Gtk.ListBoxRow lbrow, Gtk.ListBoxRow? lbbefore) { 421 + + var row = (EventRow) lbrow; 422 + + if (lbbefore != null) { 423 + + var before = (EventRow) lbbefore; 424 + + if (row.is_allday == before.is_allday) { 425 + + row.set_header (null); 426 + + return; 427 + } 428 + - }); 429 + - } 430 + 431 + - return main_grid; 432 + - } 433 + + if (row.is_allday != before.is_allday) { 434 + + var header_label = new Granite.HeaderLabel (_("During the Day")); 435 + + header_label.margin_start = header_label.margin_end = 6; 436 + 437 + - private void header_update_func (Gtk.ListBoxRow lbrow, Gtk.ListBoxRow? lbbefore) { 438 + - var row = (DateTime.EventRow) lbrow; 439 + - if (lbbefore != null) { 440 + - var before = (DateTime.EventRow) lbbefore; 441 + - if (row.is_allday == before.is_allday) { 442 + - row.set_header (null); 443 + + row.set_header (header_label); 444 + + return; 445 + + } 446 + + } else { 447 + + if (row.is_allday) { 448 + + var allday_header = new Granite.HeaderLabel (_("All Day")); 449 + + allday_header.margin_start = allday_header.margin_end = 6; 450 + + 451 + + row.set_header (allday_header); 452 + + } 453 + return; 454 + } 455 + + } 456 + 457 + - if (row.is_allday != before.is_allday) { 458 + - var header_label = new Granite.HeaderLabel (_("During the Day")); 459 + - header_label.margin_start = header_label.margin_end = 6; 460 + + [CCode (instance_pos = -1)] 461 + + private int sort_function (Gtk.ListBoxRow child1, Gtk.ListBoxRow child2) { 462 + + var e1 = (EventRow) child1; 463 + + var e2 = (EventRow) child2; 464 + 465 + - row.set_header (header_label); 466 + - return; 467 + + if (e1.start_time.compare (e2.start_time) != 0) { 468 + + return e1.start_time.compare (e2.start_time); 469 + } 470 + - } else { 471 + - if (row.is_allday) { 472 + - var allday_header = new Granite.HeaderLabel (_("All Day")); 473 + - allday_header.margin_start = allday_header.margin_end = 6; 474 + 475 + - row.set_header (allday_header); 476 + + // If they have the same date, sort them wholeday first 477 + + if (e1.is_allday) { 478 + + return -1; 479 + + } else if (e2.is_allday) { 480 + + return 1; 481 + } 482 + - return; 483 + - } 484 + - } 485 + - 486 + - [CCode (instance_pos = -1)] 487 + - private int sort_function (Gtk.ListBoxRow child1, Gtk.ListBoxRow child2) { 488 + - var e1 = (EventRow) child1; 489 + - var e2 = (EventRow) child2; 490 + 491 + - if (e1.start_time.compare (e2.start_time) != 0) { 492 + - return e1.start_time.compare (e2.start_time); 493 + + return 0; 494 + } 495 + 496 + - // If they have the same date, sort them wholeday first 497 + - if (e1.is_allday) { 498 + - return -1; 499 + - } else if (e2.is_allday) { 500 + - return 1; 501 + + private void update_events_model (E.Source source, Gee.Collection<ECal.Component> events) { 502 + + idle_update_events (); 503 + } 504 + 505 + - return 0; 506 + - } 507 + - 508 + - private void update_events_model (E.Source source, Gee.Collection<ECal.Component> events) { 509 + - idle_update_events (); 510 + - } 511 + + private void idle_update_events () { 512 + + if (update_events_idle_source > 0) { 513 + + GLib.Source.remove (update_events_idle_source); 514 + + } 515 + 516 + - private void idle_update_events () { 517 + - if (update_events_idle_source > 0) { 518 + - GLib.Source.remove (update_events_idle_source); 519 + + update_events_idle_source = GLib.Idle.add (update_events); 520 + } 521 + 522 + - update_events_idle_source = GLib.Idle.add (update_events); 523 + - } 524 + - 525 + - private bool update_events () { 526 + - foreach (unowned Gtk.Widget widget in event_listbox.get_children ()) { 527 + - widget.destroy (); 528 + - } 529 + + private bool update_events () { 530 + + foreach (unowned Gtk.Widget widget in event_listbox.get_children ()) { 531 + + widget.destroy (); 532 + + } 533 + 534 + - if (calendar.selected_date == null) { 535 + - update_events_idle_source = 0; 536 + - return GLib.Source.REMOVE; 537 + - } 538 + + if (calendar.selected_date == null) { 539 + + update_events_idle_source = 0; 540 + + return GLib.Source.REMOVE; 541 + + } 542 + 543 + - var date = calendar.selected_date; 544 + + var date = calendar.selected_date; 545 + 546 + - var model = Widgets.CalendarModel.get_default (); 547 + + var model = Models.CalendarModel.get_default (); 548 + 549 + - var events_on_day = new Gee.TreeMap<string, DateTime.EventRow> (); 550 + + var events_on_day = new Gee.TreeMap<string, EventRow> (); 551 + 552 + - model.source_events.@foreach ((source, component_map) => { 553 + - foreach (var comp in component_map.get_values ()) { 554 + - if (Util.calcomp_is_on_day (comp, date)) { 555 + - unowned ICal.Component ical = comp.get_icalcomponent (); 556 + - var event_uid = ical.get_uid (); 557 + - if (!events_on_day.has_key (event_uid)) { 558 + - events_on_day[event_uid] = new DateTime.EventRow (date, ical, source); 559 + + model.source_events.@foreach ((source, component_map) => { 560 + + foreach (var comp in component_map.get_values ()) { 561 + + if (Util.calcomp_is_on_day (comp, date)) { 562 + + unowned ICal.Component ical = comp.get_icalcomponent (); 563 + + var event_uid = ical.get_uid (); 564 + + if (!events_on_day.has_key (event_uid)) { 565 + + events_on_day[event_uid] = new EventRow (date, ical, source); 566 + 567 + - event_listbox.add (events_on_day[event_uid]); 568 + + event_listbox.add (events_on_day[event_uid]); 569 + + } 570 + } 571 + } 572 + - } 573 + - }); 574 + + }); 575 + 576 + - event_listbox.show_all (); 577 + - update_events_idle_source = 0; 578 + - return GLib.Source.REMOVE; 579 + - } 580 + + event_listbox.show_all (); 581 + + update_events_idle_source = 0; 582 + + return GLib.Source.REMOVE; 583 + + } 584 + 585 + - public override void opened () { 586 + - calendar.show_today (); 587 + + public override void opened () { 588 + + calendar.show_today (); 589 + 590 + - Widgets.CalendarModel.get_default ().events_added.connect (update_events_model); 591 + - Widgets.CalendarModel.get_default ().events_updated.connect (update_events_model); 592 + - Widgets.CalendarModel.get_default ().events_removed.connect (update_events_model); 593 + - } 594 + + Models.CalendarModel.get_default ().events_added.connect (update_events_model); 595 + + Models.CalendarModel.get_default ().events_updated.connect (update_events_model); 596 + + Models.CalendarModel.get_default ().events_removed.connect (update_events_model); 597 + + } 598 + 599 + - public override void closed () { 600 + - Widgets.CalendarModel.get_default ().events_added.disconnect (update_events_model); 601 + - Widgets.CalendarModel.get_default ().events_updated.disconnect (update_events_model); 602 + - Widgets.CalendarModel.get_default ().events_removed.disconnect (update_events_model); 603 + + public override void closed () { 604 + + Models.CalendarModel.get_default ().events_added.disconnect (update_events_model); 605 + + Models.CalendarModel.get_default ().events_updated.disconnect (update_events_model); 606 + + Models.CalendarModel.get_default ().events_removed.disconnect (update_events_model); 607 + + } 608 + } 609 + } 610 + - 611 + public Wingpanel.Indicator get_indicator (Module module) { 612 + debug ("Activating DateTime Indicator"); 613 + - var indicator = new DateTime.Indicator (); 614 + + var indicator = new DateTimeIndicator.Indicator (); 615 + 616 + return indicator; 617 + } 618 + diff --git a/src/Widgets/calendar/CalendarModel.vala b/src/Models/CalendarModel.vala 619 + similarity index 99% 620 + rename from src/Widgets/calendar/CalendarModel.vala 621 + rename to src/Models/CalendarModel.vala 622 + index 7602303..965b93e 100644 623 + --- a/src/Widgets/calendar/CalendarModel.vala 624 + +++ b/src/Models/CalendarModel.vala 625 + @@ -15,8 +15,8 @@ 626 + * along with this program. If not, see <http://www.gnu.org/licenses/>. 627 + */ 628 + 629 + -namespace DateTime.Widgets { 630 + - public class CalendarModel : Object { 631 + +namespace DateTimeIndicator { 632 + + public class Models.CalendarModel : Object { 633 + /* The data_range is the range of dates for which this model is storing 634 + * data. 635 + * 636 + diff --git a/src/Services/TimeManager.vala b/src/Services/TimeManager.vala 637 + index b68f158..5baa136 100644 638 + --- a/src/Services/TimeManager.vala 639 + +++ b/src/Services/TimeManager.vala 640 + @@ -32,153 +32,155 @@ interface FDO.Accounts : Object { 641 + public abstract string find_user_by_name (string username) throws GLib.Error; 642 + } 643 + 644 + -public class DateTime.Services.TimeManager : Gtk.Calendar { 645 + - private static TimeManager? instance = null; 646 + +namespace DateTimeIndicator { 647 + + public class Services.TimeManager : Gtk.Calendar { 648 + + private static TimeManager? instance = null; 649 + 650 + - public signal void minute_changed (); 651 + + public signal void minute_changed (); 652 + 653 + - private GLib.DateTime? current_time = null; 654 + - private uint timeout_id = 0; 655 + - private Manager? manager = null; 656 + + private GLib.DateTime? current_time = null; 657 + + private uint timeout_id = 0; 658 + + private Manager? manager = null; 659 + 660 + - public bool clock_show_seconds { get; set; } 661 + - public bool is_12h { get; set; } 662 + + public bool clock_show_seconds { get; set; } 663 + + public bool is_12h { get; set; } 664 + 665 + - public TimeManager () { 666 + - update_current_time (); 667 + - 668 + - if (current_time == null) { 669 + - return; 670 + - } 671 + + public TimeManager () { 672 + + update_current_time (); 673 + 674 + - add_timeout (); 675 + - try { 676 + - var clock_settings = new GLib.Settings ("io.elementary.desktop.wingpanel.datetime"); 677 + - clock_settings.bind ("clock-show-seconds", this, "clock-show-seconds", SettingsBindFlags.DEFAULT); 678 + + if (current_time == null) { 679 + + return; 680 + + } 681 + 682 + - notify["clock-show-seconds"].connect (() => { 683 + - add_timeout (); 684 + - }); 685 + + add_timeout (); 686 + + try { 687 + + var clock_settings = new GLib.Settings ("io.elementary.desktop.wingpanel.datetime"); 688 + + clock_settings.bind ("clock-show-seconds", this, "clock-show-seconds", SettingsBindFlags.DEFAULT); 689 + 690 + - // Listen for the D-BUS server that controls time settings 691 + - Bus.watch_name (BusType.SYSTEM, "org.freedesktop.timedate1", BusNameWatcherFlags.NONE, on_watch, on_unwatch); 692 + - // Listen for the signal that is fired when waking up from sleep, then update time 693 + - manager = Bus.get_proxy_sync (BusType.SYSTEM, "org.freedesktop.login1", "/org/freedesktop/login1"); 694 + - manager.prepare_for_sleep.connect ((sleeping) => { 695 + - if (!sleeping) { 696 + - update_current_time (); 697 + - minute_changed (); 698 + + notify["clock-show-seconds"].connect (() => { 699 + add_timeout (); 700 + - } 701 + - }); 702 + - } catch (Error e) { 703 + - warning (e.message); 704 + + }); 705 + + 706 + + // Listen for the D-BUS server that controls time settings 707 + + Bus.watch_name (BusType.SYSTEM, "org.freedesktop.timedate1", BusNameWatcherFlags.NONE, on_watch, on_unwatch); 708 + + // Listen for the signal that is fired when waking up from sleep, then update time 709 + + manager = Bus.get_proxy_sync (BusType.SYSTEM, "org.freedesktop.login1", "/org/freedesktop/login1"); 710 + + manager.prepare_for_sleep.connect ((sleeping) => { 711 + + if (!sleeping) { 712 + + update_current_time (); 713 + + minute_changed (); 714 + + add_timeout (); 715 + + } 716 + + }); 717 + + } catch (Error e) { 718 + + warning (e.message); 719 + + } 720 + } 721 + - } 722 + - 723 + - construct { 724 + - setup_time_format.begin (); 725 + - } 726 + 727 + - private async void setup_time_format () { 728 + - try { 729 + - var accounts_service = yield GLib.Bus.get_proxy<FDO.Accounts> (GLib.BusType.SYSTEM, 730 + - "org.freedesktop.Accounts", 731 + - "/org/freedesktop/Accounts"); 732 + - var user_path = accounts_service.find_user_by_name (GLib.Environment.get_user_name ()); 733 + - 734 + - var greeter_act = yield GLib.Bus.get_proxy<Pantheon.AccountsService> (GLib.BusType.SYSTEM, 735 + - "org.freedesktop.Accounts", 736 + - user_path, 737 + - GLib.DBusProxyFlags.GET_INVALIDATED_PROPERTIES); 738 + - is_12h = ("12h" in greeter_act.time_format); 739 + - ((GLib.DBusProxy) greeter_act).g_properties_changed.connect ((changed_properties, invalidated_properties) => { 740 + - if (changed_properties.lookup_value ("TimeFormat", GLib.VariantType.STRING) != null) { 741 + - is_12h = ("12h" in greeter_act.time_format); 742 + - } 743 + - }); 744 + - } catch (Error e) { 745 + - critical (e.message); 746 + - // Connect to the GSettings instead 747 + - var clock_settings = new GLib.Settings ("org.gnome.desktop.interface"); 748 + - clock_settings.changed["clock-format"].connect (() => { 749 + - is_12h = ("12h" in clock_settings.get_string ("clock-format")); 750 + - }); 751 + - 752 + - is_12h = ("12h" in clock_settings.get_string ("clock-format")); 753 + + construct { 754 + + setup_time_format.begin (); 755 + } 756 + - } 757 + 758 + - private void on_watch (DBusConnection conn) { 759 + - // Start updating the time display quicker because someone is changing settings 760 + - add_timeout (true); 761 + - } 762 + + private async void setup_time_format () { 763 + + try { 764 + + var accounts_service = yield GLib.Bus.get_proxy<FDO.Accounts> (GLib.BusType.SYSTEM, 765 + + "org.freedesktop.Accounts", 766 + + "/org/freedesktop/Accounts"); 767 + + var user_path = accounts_service.find_user_by_name (GLib.Environment.get_user_name ()); 768 + + 769 + + var greeter_act = yield GLib.Bus.get_proxy<Pantheon.AccountsService> (GLib.BusType.SYSTEM, 770 + + "org.freedesktop.Accounts", 771 + + user_path, 772 + + GLib.DBusProxyFlags.GET_INVALIDATED_PROPERTIES); 773 + + is_12h = ("12h" in greeter_act.time_format); 774 + + ((GLib.DBusProxy) greeter_act).g_properties_changed.connect ((changed_properties, invalidated_properties) => { 775 + + if (changed_properties.lookup_value ("TimeFormat", GLib.VariantType.STRING) != null) { 776 + + is_12h = ("12h" in greeter_act.time_format); 777 + + } 778 + + }); 779 + + } catch (Error e) { 780 + + critical (e.message); 781 + + // Connect to the GSettings instead 782 + + var clock_settings = new GLib.Settings ("org.gnome.desktop.interface"); 783 + + clock_settings.changed["clock-format"].connect (() => { 784 + + is_12h = ("12h" in clock_settings.get_string ("clock-format")); 785 + + }); 786 + 787 + - private void on_unwatch (DBusConnection conn) { 788 + - // Stop updating the time display quicker 789 + - add_timeout (false); 790 + - } 791 + + is_12h = ("12h" in clock_settings.get_string ("clock-format")); 792 + + } 793 + + } 794 + 795 + - private void add_timeout (bool update_fast = false) { 796 + - uint interval; 797 + - if (update_fast || clock_show_seconds) { 798 + - interval = 500; 799 + - } else { 800 + - interval = calculate_time_until_next_minute (); 801 + + private void on_watch (DBusConnection conn) { 802 + + // Start updating the time display quicker because someone is changing settings 803 + + add_timeout (true); 804 + } 805 + 806 + - if (timeout_id > 0) { 807 + - Source.remove (timeout_id); 808 + + private void on_unwatch (DBusConnection conn) { 809 + + // Stop updating the time display quicker 810 + + add_timeout (false); 811 + } 812 + 813 + - timeout_id = Timeout.add (interval, () => { 814 + - update_current_time (); 815 + - minute_changed (); 816 + - add_timeout (update_fast); 817 + + private void add_timeout (bool update_fast = false) { 818 + + uint interval; 819 + + if (update_fast || clock_show_seconds) { 820 + + interval = 500; 821 + + } else { 822 + + interval = calculate_time_until_next_minute (); 823 + + } 824 + 825 + - return false; 826 + - }); 827 + - } 828 + + if (timeout_id > 0) { 829 + + Source.remove (timeout_id); 830 + + } 831 + 832 + - public string format (string format) { 833 + - if (current_time == null) { 834 + - return "undef"; 835 + + timeout_id = Timeout.add (interval, () => { 836 + + update_current_time (); 837 + + minute_changed (); 838 + + add_timeout (update_fast); 839 + + 840 + + return false; 841 + + }); 842 + } 843 + 844 + - return current_time.format (format); 845 + - } 846 + + public string format (string format) { 847 + + if (current_time == null) { 848 + + return "undef"; 849 + + } 850 + 851 + - public GLib.DateTime get_current_time () { 852 + - return current_time; 853 + - } 854 + + return current_time.format (format); 855 + + } 856 + 857 + - private void update_current_time () { 858 + - var local_time = new GLib.DateTime.now_local (); 859 + + public GLib.DateTime get_current_time () { 860 + + return current_time; 861 + + } 862 + 863 + - if (local_time == null) { 864 + - critical ("Can't get the local time."); 865 + + private void update_current_time () { 866 + + var local_time = new GLib.DateTime.now_local (); 867 + 868 + - return; 869 + - } 870 + + if (local_time == null) { 871 + + critical ("Can't get the local time."); 872 + 873 + - current_time = local_time; 874 + - } 875 + + return; 876 + + } 877 + 878 + - private uint calculate_time_until_next_minute () { 879 + - if (current_time == null) { 880 + - return 60 * 1000; 881 + + current_time = local_time; 882 + } 883 + 884 + - var seconds_until_next_minute = 60 - (current_time.to_unix () % 60); 885 + + private uint calculate_time_until_next_minute () { 886 + + if (current_time == null) { 887 + + return 60 * 1000; 888 + + } 889 + 890 + - return (uint)seconds_until_next_minute * 1000; 891 + - } 892 + + var seconds_until_next_minute = 60 - (current_time.to_unix () % 60); 893 + 894 + - public static TimeManager get_default () { 895 + - if (instance == null) { 896 + - instance = new TimeManager (); 897 + + return (uint)seconds_until_next_minute * 1000; 898 + } 899 + 900 + - return instance; 901 + + public static TimeManager get_default () { 902 + + if (instance == null) { 903 + + instance = new TimeManager (); 904 + + } 905 + + 906 + + return instance; 907 + + } 908 + } 909 + } 910 + diff --git a/src/Util/DateIterator.vala b/src/Util/DateIterator.vala 911 + new file mode 100644 912 + index 0000000..c2c771e 913 + --- /dev/null 914 + +++ b/src/Util/DateIterator.vala 915 + @@ -0,0 +1,84 @@ 916 + +/* 917 + + * Copyright 2011-2018 elementary, Inc. (https://elementary.io) 918 + + * 919 + + * This program is free software; you can redistribute it and/or 920 + + * modify it under the terms of the GNU General Public 921 + + * License as published by the Free Software Foundation; either 922 + + * version 2 of the License, or (at your option) any later version. 923 + + * 924 + + * This program is distributed in the hope that it will be useful, 925 + + * but WITHOUT ANY WARRANTY; without even the implied warranty of 926 + + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 927 + + * General Public License for more details. 928 + + * 929 + + * You should have received a copy of the GNU General Public 930 + + * License along with this program; if not, write to the 931 + + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 932 + + * Boston, MA 02110-1301 USA. 933 + + * 934 + + * Authored by: Corentin Noël <corentin@elementaryos.org> 935 + + */ 936 + + 937 + +namespace DateTimeIndicator { 938 + + public class Util.DateIterator : Object, Gee.Traversable<GLib.DateTime>, Gee.Iterator<GLib.DateTime> { 939 + + public GLib.DateTime current { get; construct set; } 940 + + public Util.DateRange range { get; construct; } 941 + + 942 + + // Required by Gee.Iterator 943 + + public bool valid { 944 + + get { 945 + + return true; 946 + + } 947 + + } 948 + + 949 + + // Required by Gee.Iterator 950 + + public bool read_only { 951 + + get { 952 + + return false; 953 + + } 954 + + } 955 + + 956 + + public DateIterator (Util.DateRange range) { 957 + + Object ( 958 + + range: range, 959 + + current: range.first_dt.add_days (-1) 960 + + ); 961 + + } 962 + + 963 + + public bool @foreach (Gee.ForallFunc<GLib.DateTime> f) { 964 + + var element = range.first_dt; 965 + + 966 + + while (element.compare (range.last_dt) < 0) { 967 + + if (f (element) == false) { 968 + + return false; 969 + + } 970 + + 971 + + element = element.add_days (1); 972 + + } 973 + + 974 + + return true; 975 + + } 976 + + 977 + + public bool next () { 978 + + if (!has_next ()) { 979 + + return false; 980 + + } 981 + + 982 + + current = this.current.add_days (1); 983 + + 984 + + return true; 985 + + } 986 + + 987 + + public bool has_next () { 988 + + return current.compare (range.last_dt) < 0; 989 + + } 990 + + 991 + + public new GLib.DateTime get () { 992 + + return current; 993 + + } 994 + + 995 + + public void remove () { 996 + + assert_not_reached (); 997 + + } 998 + + } 999 + +} 1000 + diff --git a/src/Util/DateRange.vala b/src/Util/DateRange.vala 1001 + new file mode 100644 1002 + index 0000000..82da7c8 1003 + --- /dev/null 1004 + +++ b/src/Util/DateRange.vala 1005 + @@ -0,0 +1,68 @@ 1006 + +/* 1007 + + * Copyright 2011-2019 elementary, Inc. (https://elementary.io) 1008 + + * 1009 + + * This program is free software; you can redistribute it and/or 1010 + + * modify it under the terms of the GNU General Public 1011 + + * License as published by the Free Software Foundation; either 1012 + + * version 2 of the License, or (at your option) any later version. 1013 + + * 1014 + + * This program is distributed in the hope that it will be useful, 1015 + + * but WITHOUT ANY WARRANTY; without even the implied warranty of 1016 + + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1017 + + * General Public License for more details. 1018 + + * 1019 + + * You should have received a copy of the GNU General Public 1020 + + * License along with this program; if not, write to the 1021 + + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 1022 + + * Boston, MA 02110-1301 USA. 1023 + + * 1024 + + * Authored by: Corentin Noël <corentin@elementaryos.org> 1025 + + */ 1026 + + 1027 + +namespace DateTimeIndicator { 1028 + +/* Represents date range from 'first' to 'last' inclusive */ 1029 + + public class Util.DateRange : Object, Gee.Traversable<GLib.DateTime>, Gee.Iterable<GLib.DateTime> { 1030 + + public GLib.DateTime first_dt { get; construct; } 1031 + + public GLib.DateTime last_dt { get; construct; } 1032 + + 1033 + + public bool @foreach (Gee.ForallFunc<GLib.DateTime> f) { 1034 + + foreach (var date in this) { 1035 + + if (f (date) == false) { 1036 + + return false; 1037 + + } 1038 + + } 1039 + + 1040 + + return true; 1041 + + } 1042 + + 1043 + + public DateRange (GLib.DateTime first, GLib.DateTime last) { 1044 + + Object ( 1045 + + first_dt: first, 1046 + + last_dt: last 1047 + + ); 1048 + + } 1049 + + 1050 + + public bool equals (DateRange other) { 1051 + + return (first_dt == other.first_dt && last_dt == other.last_dt); 1052 + + } 1053 + + 1054 + + public Gee.Iterator<GLib.DateTime> iterator () { 1055 + + return new DateIterator (this); 1056 + + } 1057 + + 1058 + + public Gee.List<GLib.DateTime> to_list () { 1059 + + var list = new Gee.ArrayList<GLib.DateTime> ((Gee.EqualDataFunc<GLib.DateTime>? )datetime_equal_func); 1060 + + 1061 + + foreach (var date in this) { 1062 + + list.add (date); 1063 + + } 1064 + + 1065 + + return list; 1066 + + } 1067 + + 1068 + + /* Returns true if 'a' and 'b' are the same GLib.DateTime */ 1069 + + private bool datetime_equal_func (GLib.DateTime a, GLib.DateTime b) { 1070 + + return a.equal (b); 1071 + + } 1072 + + } 1073 + +} 1074 + diff --git a/src/Widgets/calendar/Util.vala b/src/Util/Util.vala 1075 + similarity index 96% 1076 + rename from src/Widgets/calendar/Util.vala 1077 + rename to src/Util/Util.vala 1078 + index e51f784..c261f4b 100644 1079 + --- a/src/Widgets/calendar/Util.vala 1080 + +++ b/src/Util/Util.vala 1081 + @@ -19,7 +19,7 @@ 1082 + * Authored by: Corentin Noël <corentin@elementaryos.org> 1083 + */ 1084 + 1085 + -namespace Util { 1086 + +namespace DateTimeIndicator.Util { 1087 + static bool has_scrolled = false; 1088 + 1089 + public bool on_scroll_event (Gdk.EventScroll event) { 1090 + @@ -35,7 +35,7 @@ namespace Util { 1091 + 1092 + /* It's mouse scroll ! */ 1093 + if (choice == 1 || choice == -1) { 1094 + - DateTime.Widgets.CalendarModel.get_default ().change_month ((int)choice); 1095 + + Models.CalendarModel.get_default ().change_month ((int)choice); 1096 + 1097 + return true; 1098 + } 1099 + @@ -46,14 +46,14 @@ namespace Util { 1100 + 1101 + if (choice > 0.3) { 1102 + reset_timer.begin (); 1103 + - DateTime.Widgets.CalendarModel.get_default ().change_month (1); 1104 + + Models.CalendarModel.get_default ().change_month (1); 1105 + 1106 + return true; 1107 + } 1108 + 1109 + if (choice < -0.3) { 1110 + reset_timer.begin (); 1111 + - DateTime.Widgets.CalendarModel.get_default ().change_month (-1); 1112 + + Models.CalendarModel.get_default ().change_month (-1); 1113 + 1114 + return true; 1115 + } 1116 + diff --git a/src/Widgets/CalendarView.vala b/src/Widgets/CalendarView.vala 1117 + new file mode 100644 1118 + index 0000000..65cee28 1119 + --- /dev/null 1120 + +++ b/src/Widgets/CalendarView.vala 1121 + @@ -0,0 +1,185 @@ 1122 + +/*- 1123 + + * Copyright (c) 2011–2018 elementary, Inc. (https://elementary.io) 1124 + + * 1125 + + * This program is free software: you can redistribute it and/or modify 1126 + + * it under the terms of the GNU General Public License as published by 1127 + + * the Free Software Foundation, either version 3 of the License, or 1128 + + * (at your option) any later version. 1129 + + * 1130 + + * This program is distributed in the hope that it will be useful, 1131 + + * but WITHOUT ANY WARRANTY; without even the implied warranty of 1132 + + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1133 + + * GNU General Public License for more details. 1134 + + * 1135 + + * You should have received a copy of the GNU General Public License 1136 + + * along with this program. If not, see <http://www.gnu.org/licenses/>. 1137 + + * 1138 + + * Authored by: Maxwell Barvian 1139 + + * Corentin Noël <corentin@elementaryos.org> 1140 + + */ 1141 + + 1142 + +namespace DateTimeIndicator { 1143 + + public class Widgets.CalendarView : Gtk.Grid { 1144 + + public signal void day_double_click (); 1145 + + public signal void event_updates (); 1146 + + public signal void selection_changed (GLib.DateTime? new_date); 1147 + + 1148 + + public GLib.DateTime? selected_date { get; private set; } 1149 + + 1150 + + private Widgets.Grid grid; 1151 + + private Gtk.Stack stack; 1152 + + private Gtk.Grid big_grid; 1153 + + 1154 + + construct { 1155 + + var label = new Gtk.Label (new GLib.DateTime.now_local ().format (_("%OB, %Y"))); 1156 + + label.hexpand = true; 1157 + + label.margin_start = 6; 1158 + + label.xalign = 0; 1159 + + label.width_chars = 13; 1160 + + 1161 + + var provider = new Gtk.CssProvider (); 1162 + + provider.load_from_resource ("/io/elementary/desktop/wingpanel/datetime/ControlHeader.css"); 1163 + + 1164 + + var label_style_context = label.get_style_context (); 1165 + + label_style_context.add_class ("header-label"); 1166 + + label_style_context.add_provider (provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); 1167 + + 1168 + + var left_button = new Gtk.Button.from_icon_name ("pan-start-symbolic"); 1169 + + var center_button = new Gtk.Button.from_icon_name ("office-calendar-symbolic"); 1170 + + center_button.tooltip_text = _("Go to today's date"); 1171 + + var right_button = new Gtk.Button.from_icon_name ("pan-end-symbolic"); 1172 + + 1173 + + var box_buttons = new Gtk.Grid (); 1174 + + box_buttons.margin_end = 6; 1175 + + box_buttons.valign = Gtk.Align.CENTER; 1176 + + box_buttons.get_style_context ().add_class (Gtk.STYLE_CLASS_LINKED); 1177 + + box_buttons.add (left_button); 1178 + + box_buttons.add (center_button); 1179 + + box_buttons.add (right_button); 1180 + + 1181 + + big_grid = create_big_grid (); 1182 + + 1183 + + stack = new Gtk.Stack (); 1184 + + stack.add (big_grid); 1185 + + stack.show_all (); 1186 + + stack.expand = true; 1187 + + 1188 + + stack.notify["transition-running"].connect (() => { 1189 + + if (stack.transition_running == false) { 1190 + + stack.get_children ().foreach ((child) => { 1191 + + if (child != stack.visible_child) { 1192 + + child.destroy (); 1193 + + } 1194 + + }); 1195 + + } 1196 + + }); 1197 + + 1198 + + column_spacing = 6; 1199 + + row_spacing = 6; 1200 + + margin_start = margin_end = 10; 1201 + + attach (label, 0, 0); 1202 + + attach (box_buttons, 1, 0); 1203 + + attach (stack, 0, 1, 2); 1204 + + 1205 + + var model = Models.CalendarModel.get_default (); 1206 + + model.notify["data-range"].connect (() => { 1207 + + label.label = model.month_start.format (_("%OB, %Y")); 1208 + + 1209 + + sync_with_model (); 1210 + + 1211 + + selected_date = null; 1212 + + selection_changed (selected_date); 1213 + + }); 1214 + + 1215 + + left_button.clicked.connect (() => { 1216 + + model.change_month (-1); 1217 + + }); 1218 + + 1219 + + right_button.clicked.connect (() => { 1220 + + model.change_month (1); 1221 + + }); 1222 + + 1223 + + center_button.clicked.connect (() => { 1224 + + show_today (); 1225 + + }); 1226 + + } 1227 + + 1228 + + private Gtk.Grid create_big_grid () { 1229 + + grid = new Widgets.Grid (); 1230 + + grid.show_all (); 1231 + + 1232 + + grid.on_event_add.connect ((date) => { 1233 + + show_date_in_maya (date); 1234 + + day_double_click (); 1235 + + }); 1236 + + 1237 + + grid.selection_changed.connect ((date) => { 1238 + + selected_date = date; 1239 + + selection_changed (date); 1240 + + }); 1241 + + 1242 + + return grid; 1243 + + } 1244 + + 1245 + + public void show_today () { 1246 + + var calmodel = Models.CalendarModel.get_default (); 1247 + + var today = Util.strip_time (new GLib.DateTime.now_local ()); 1248 + + var start = Util.get_start_of_month (today); 1249 + + selected_date = today; 1250 + + if (!start.equal (calmodel.month_start)) { 1251 + + calmodel.month_start = start; 1252 + + } 1253 + + sync_with_model (); 1254 + + 1255 + + grid.set_focus_to_today (); 1256 + + } 1257 + + 1258 + + // TODO: As far as maya supports it use the Dbus Activation feature to run the calendar-app. 1259 + + public void show_date_in_maya (GLib.DateTime date) { 1260 + + var command = "io.elementary.calendar --show-day %s".printf (date.format ("%F")); 1261 + + 1262 + + try { 1263 + + var appinfo = AppInfo.create_from_commandline (command, null, AppInfoCreateFlags.NONE); 1264 + + appinfo.launch_uris (null, null); 1265 + + } catch (GLib.Error e) { 1266 + + var dialog = new Granite.MessageDialog.with_image_from_icon_name ( 1267 + + _("Unable To Launch Calendar"), 1268 + + _("The program \"io.elementary.calendar\" may not be installed"), 1269 + + "dialog-error" 1270 + + ); 1271 + + dialog.show_error_details (e.message); 1272 + + dialog.run (); 1273 + + dialog.destroy (); 1274 + + } 1275 + + } 1276 + + 1277 + + /* Sets the calendar widgets to the date range of the model */ 1278 + + private void sync_with_model () { 1279 + + var model = Models.CalendarModel.get_default (); 1280 + + if (grid.grid_range != null && (model.data_range.equals (grid.grid_range) || grid.grid_range.first_dt.compare (model.data_range.first_dt) == 0)) { 1281 + + grid.update_today (); 1282 + + return; // nothing else to do 1283 + + } 1284 + + 1285 + + GLib.DateTime previous_first = null; 1286 + + if (grid.grid_range != null) 1287 + + previous_first = grid.grid_range.first_dt; 1288 + + 1289 + + big_grid = create_big_grid (); 1290 + + stack.add (big_grid); 1291 + + 1292 + + grid.set_range (model.data_range, model.month_start); 1293 + + grid.update_weeks (model.data_range.first_dt, model.num_weeks); 1294 + + 1295 + + if (previous_first != null) { 1296 + + if (previous_first.compare (grid.grid_range.first_dt) == -1) { 1297 + + stack.transition_type = Gtk.StackTransitionType.SLIDE_LEFT; 1298 + + } else { 1299 + + stack.transition_type = Gtk.StackTransitionType.SLIDE_RIGHT; 1300 + + } 1301 + + } 1302 + + 1303 + + stack.set_visible_child (big_grid); 1304 + + } 1305 + + } 1306 + +} 1307 + diff --git a/src/Widgets/EventRow.vala b/src/Widgets/EventRow.vala 1308 + index 8e0513e..1268311 100644 1309 + --- a/src/Widgets/EventRow.vala 1310 + +++ b/src/Widgets/EventRow.vala 1311 + @@ -17,104 +17,106 @@ 1312 + * Boston, MA 02110-1301 USA. 1313 + */ 1314 + 1315 + -public class DateTime.EventRow : Gtk.ListBoxRow { 1316 + - public GLib.DateTime date { get; construct; } 1317 + - public unowned ICal.Component component { get; construct; } 1318 + - public unowned E.SourceCalendar cal { get; construct; } 1319 + - 1320 + - public GLib.DateTime start_time { get; private set; } 1321 + - public GLib.DateTime? end_time { get; private set; } 1322 + - public bool is_allday { get; private set; default = false; } 1323 + - 1324 + - private static Services.TimeManager time_manager; 1325 + - private static Gtk.CssProvider css_provider; 1326 + - 1327 + - private Gtk.Grid grid; 1328 + - private Gtk.Image event_image; 1329 + - private Gtk.Label time_label; 1330 + - 1331 + - public EventRow (GLib.DateTime date, ICal.Component component, E.Source source) { 1332 + - Object ( 1333 + - component: component, 1334 + - date: date, 1335 + - cal: (E.SourceCalendar?) source.get_extension (E.SOURCE_EXTENSION_CALENDAR) 1336 + - ); 1337 + - } 1338 + - 1339 + - static construct { 1340 + - css_provider = new Gtk.CssProvider (); 1341 + - css_provider.load_from_resource ("/io/elementary/desktop/wingpanel/datetime/EventRow.css"); 1342 + - 1343 + - time_manager = Services.TimeManager.get_default (); 1344 + - } 1345 + +namespace DateTimeIndicator { 1346 + + public class EventRow : Gtk.ListBoxRow { 1347 + + public GLib.DateTime date { get; construct; } 1348 + + public unowned ICal.Component component { get; construct; } 1349 + + public unowned E.SourceCalendar cal { get; construct; } 1350 + + 1351 + + public GLib.DateTime start_time { get; private set; } 1352 + + public GLib.DateTime? end_time { get; private set; } 1353 + + public bool is_allday { get; private set; default = false; } 1354 + + 1355 + + private static Services.TimeManager time_manager; 1356 + + private static Gtk.CssProvider css_provider; 1357 + + 1358 + + private Gtk.Grid grid; 1359 + + private Gtk.Image event_image; 1360 + + private Gtk.Label time_label; 1361 + + 1362 + + public EventRow (GLib.DateTime date, ICal.Component component, E.Source source) { 1363 + + Object ( 1364 + + component: component, 1365 + + date: date, 1366 + + cal: (E.SourceCalendar?) source.get_extension (E.SOURCE_EXTENSION_CALENDAR) 1367 + + ); 1368 + + } 1369 + 1370 + - construct { 1371 + - start_time = Util.ical_to_date_time (component.get_dtstart ()); 1372 + - end_time = Util.ical_to_date_time (component.get_dtend ()); 1373 + + static construct { 1374 + + css_provider = new Gtk.CssProvider (); 1375 + + css_provider.load_from_resource ("/io/elementary/desktop/wingpanel/datetime/EventRow.css"); 1376 + 1377 + - if (end_time != null && Util.is_the_all_day (start_time, end_time)) { 1378 + - is_allday = true; 1379 + + time_manager = Services.TimeManager.get_default (); 1380 + } 1381 + 1382 + - unowned string icon_name = "office-calendar-symbolic"; 1383 + - if (end_time == null) { 1384 + - icon_name = "alarm-symbolic"; 1385 + + construct { 1386 + + start_time = Util.ical_to_date_time (component.get_dtstart ()); 1387 + + end_time = Util.ical_to_date_time (component.get_dtend ()); 1388 + + 1389 + + if (end_time != null && Util.is_the_all_day (start_time, end_time)) { 1390 + + is_allday = true; 1391 + + } 1392 + + 1393 + + unowned string icon_name = "office-calendar-symbolic"; 1394 + + if (end_time == null) { 1395 + + icon_name = "alarm-symbolic"; 1396 + + } 1397 + + 1398 + + event_image = new Gtk.Image.from_icon_name (icon_name, Gtk.IconSize.MENU); 1399 + + event_image.valign = Gtk.Align.START; 1400 + + 1401 + + unowned Gtk.StyleContext event_image_context = event_image.get_style_context (); 1402 + + event_image_context.add_provider (css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); 1403 + + 1404 + + var name_label = new Gtk.Label (component.get_summary ()); 1405 + + name_label.hexpand = true; 1406 + + name_label.ellipsize = Pango.EllipsizeMode.END; 1407 + + name_label.lines = 3; 1408 + + name_label.max_width_chars = 30; 1409 + + name_label.wrap = true; 1410 + + name_label.wrap_mode = Pango.WrapMode.WORD_CHAR; 1411 + + name_label.xalign = 0; 1412 + + 1413 + + unowned Gtk.StyleContext name_label_context = name_label.get_style_context (); 1414 + + name_label_context.add_class ("title"); 1415 + + name_label_context.add_provider (css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); 1416 + + 1417 + + time_label = new Gtk.Label (null); 1418 + + time_label.use_markup = true; 1419 + + time_label.xalign = 0; 1420 + + time_label.get_style_context ().add_class (Gtk.STYLE_CLASS_DIM_LABEL); 1421 + + 1422 + + grid = new Gtk.Grid (); 1423 + + grid.column_spacing = 6; 1424 + + grid.margin = 3; 1425 + + grid.margin_start = grid.margin_end = 6; 1426 + + grid.attach (event_image, 0, 0); 1427 + + grid.attach (name_label, 1, 0); 1428 + + if (!is_allday) { 1429 + + grid.attach (time_label, 1, 1); 1430 + + } 1431 + + 1432 + + unowned Gtk.StyleContext grid_context = grid.get_style_context (); 1433 + + grid_context.add_class ("event"); 1434 + + grid_context.add_provider (css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); 1435 + + 1436 + + add (grid); 1437 + + 1438 + + set_color (); 1439 + + cal.notify["color"].connect (set_color); 1440 + + 1441 + + update_timelabel (); 1442 + + time_manager.notify["is-12h"].connect (update_timelabel); 1443 + } 1444 + 1445 + - event_image = new Gtk.Image.from_icon_name (icon_name, Gtk.IconSize.MENU); 1446 + - event_image.valign = Gtk.Align.START; 1447 + - 1448 + - unowned Gtk.StyleContext event_image_context = event_image.get_style_context (); 1449 + - event_image_context.add_provider (css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); 1450 + - 1451 + - var name_label = new Gtk.Label (component.get_summary ()); 1452 + - name_label.hexpand = true; 1453 + - name_label.ellipsize = Pango.EllipsizeMode.END; 1454 + - name_label.lines = 3; 1455 + - name_label.max_width_chars = 30; 1456 + - name_label.wrap = true; 1457 + - name_label.wrap_mode = Pango.WrapMode.WORD_CHAR; 1458 + - name_label.xalign = 0; 1459 + - 1460 + - unowned Gtk.StyleContext name_label_context = name_label.get_style_context (); 1461 + - name_label_context.add_class ("title"); 1462 + - name_label_context.add_provider (css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); 1463 + - 1464 + - time_label = new Gtk.Label (null); 1465 + - time_label.use_markup = true; 1466 + - time_label.xalign = 0; 1467 + - time_label.get_style_context ().add_class (Gtk.STYLE_CLASS_DIM_LABEL); 1468 + - 1469 + - grid = new Gtk.Grid (); 1470 + - grid.column_spacing = 6; 1471 + - grid.margin = 3; 1472 + - grid.margin_start = grid.margin_end = 6; 1473 + - grid.attach (event_image, 0, 0); 1474 + - grid.attach (name_label, 1, 0); 1475 + - if (!is_allday) { 1476 + - grid.attach (time_label, 1, 1); 1477 + + private void update_timelabel () { 1478 + + var time_format = Granite.DateTime.get_default_time_format (time_manager.is_12h); 1479 + + time_label.label = "<small>%s – %s</small>".printf (start_time.format (time_format), end_time.format (time_format)); 1480 + } 1481 + 1482 + - unowned Gtk.StyleContext grid_context = grid.get_style_context (); 1483 + - grid_context.add_class ("event"); 1484 + - grid_context.add_provider (css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); 1485 + - 1486 + - add (grid); 1487 + - 1488 + - set_color (); 1489 + - cal.notify["color"].connect (set_color); 1490 + - 1491 + - update_timelabel (); 1492 + - time_manager.notify["is-12h"].connect (update_timelabel); 1493 + - } 1494 + - 1495 + - private void update_timelabel () { 1496 + - var time_format = Granite.DateTime.get_default_time_format (time_manager.is_12h); 1497 + - time_label.label = "<small>%s – %s</small>".printf (start_time.format (time_format), end_time.format (time_format)); 1498 + - } 1499 + - 1500 + - private void set_color () { 1501 + - Util.set_event_calendar_color (cal, grid); 1502 + - Util.set_event_calendar_color (cal, event_image); 1503 + + private void set_color () { 1504 + + Util.set_event_calendar_color (cal, grid); 1505 + + Util.set_event_calendar_color (cal, event_image); 1506 + + } 1507 + } 1508 + } 1509 + diff --git a/src/Widgets/calendar/Grid.vala b/src/Widgets/Grid.vala 1510 + similarity index 95% 1511 + rename from src/Widgets/calendar/Grid.vala 1512 + rename to src/Widgets/Grid.vala 1513 + index 2b48636..165d11d 100644 1514 + --- a/src/Widgets/calendar/Grid.vala 1515 + +++ b/src/Widgets/Grid.vala 1516 + @@ -20,11 +20,11 @@ 1517 + * Corentin Noël <corentin@elementaryos.org> 1518 + */ 1519 + 1520 + -namespace DateTime.Widgets { 1521 + +namespace DateTimeIndicator { 1522 + /** 1523 + * Represents the entire date grid as a table. 1524 + */ 1525 + - public class Grid : Gtk.Grid { 1526 + + public class Widgets.Grid : Gtk.Grid { 1527 + public Util.DateRange grid_range { get; private set; } 1528 + 1529 + /* 1530 + @@ -59,7 +59,7 @@ namespace DateTime.Widgets { 1531 + hexpand = true; 1532 + attach (week_sep_revealer, 1, 1, 1, 6); 1533 + 1534 + - DateTime.Indicator.settings.bind ("show-weeks", week_sep_revealer, "reveal-child", GLib.SettingsBindFlags.DEFAULT); 1535 + + Indicator.settings.bind ("show-weeks", week_sep_revealer, "reveal-child", GLib.SettingsBindFlags.DEFAULT); 1536 + 1537 + data = new Gee.HashMap<uint, GridDay> (); 1538 + events |= Gdk.EventMask.SCROLL_MASK; 1539 + @@ -77,7 +77,7 @@ namespace DateTime.Widgets { 1540 + day.set_selected (true); 1541 + day.set_state_flags (Gtk.StateFlags.FOCUSED, false); 1542 + selection_changed (selected_date); 1543 + - var calmodel = CalendarModel.get_default (); 1544 + + var calmodel = Models.CalendarModel.get_default (); 1545 + var date_month = selected_date.get_month () - calmodel.month_start.get_month (); 1546 + var date_year = selected_date.get_year () - calmodel.month_start.get_year (); 1547 + 1548 + @@ -127,7 +127,7 @@ namespace DateTime.Widgets { 1549 + /* Create new widgets for the new range */ 1550 + 1551 + var date = Util.strip_time (today); 1552 + - date = date.add_days (CalendarModel.get_default ().week_starts_on - date.get_day_of_week ()); 1553 + + date = date.add_days (Models.CalendarModel.get_default ().week_starts_on - date.get_day_of_week ()); 1554 + foreach (var label in header_labels) { 1555 + label.label = date.format ("%a"); 1556 + date = date.add_days (1); 1557 + @@ -221,7 +221,7 @@ namespace DateTime.Widgets { 1558 + week_labels[c].add (week_label); 1559 + week_labels[c].show_all (); 1560 + 1561 + - DateTime.Indicator.settings.bind ("show-weeks", week_labels[c], "reveal-child", GLib.SettingsBindFlags.DEFAULT); 1562 + + Indicator.settings.bind ("show-weeks", week_labels[c], "reveal-child", GLib.SettingsBindFlags.DEFAULT); 1563 + 1564 + attach (week_labels[c], 0, c + 1); 1565 + 1566 + diff --git a/src/Widgets/GridDay.vala b/src/Widgets/GridDay.vala 1567 + new file mode 100644 1568 + index 0000000..8c44443 1569 + --- /dev/null 1570 + +++ b/src/Widgets/GridDay.vala 1571 + @@ -0,0 +1,180 @@ 1572 + +// -*- Mode: vala; indent-tabs-mode: nil; tab-width: 4 -*- 1573 + +/*- 1574 + + * Copyright (c) 2011–2018 elementary, Inc. (https://elementary.io) 1575 + + * 1576 + + * This program is free software: you can redistribute it and/or modify 1577 + + * it under the terms of the GNU General Public License as published by 1578 + + * the Free Software Foundation, either version 3 of the License, or 1579 + + * (at your option) any later version. 1580 + + * 1581 + + * This program is distributed in the hope that it will be useful, 1582 + + * but WITHOUT ANY WARRANTY; without even the implied warranty of 1583 + + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1584 + + * GNU General Public License for more details. 1585 + + * 1586 + + * You should have received a copy of the GNU General Public License 1587 + + * along with this program. If not, see <http://www.gnu.org/licenses/>. 1588 + + * 1589 + + * Authored by: Maxwell Barvian 1590 + + * Corentin Noël <corentin@elementaryos.org> 1591 + + */ 1592 + + 1593 + +namespace DateTimeIndicator { 1594 + +/** 1595 + + * Represents a single day on the grid. 1596 + + */ 1597 + + public class Widgets.GridDay : Gtk.EventBox { 1598 + + /* 1599 + + * Event emitted when the day is double clicked or the ENTER key is pressed. 1600 + + */ 1601 + + public signal void on_event_add (GLib.DateTime date); 1602 + + 1603 + + public GLib.DateTime date { get; construct set; } 1604 + + 1605 + + private static Gtk.CssProvider provider; 1606 + + private static Models.CalendarModel model; 1607 + + 1608 + + private Gee.HashMap<string, Gtk.Widget> event_dots; 1609 + + private Gtk.Grid event_grid; 1610 + + private Gtk.Label label; 1611 + + private bool valid_grab = false; 1612 + + 1613 + + public GridDay (GLib.DateTime date) { 1614 + + Object (date: date); 1615 + + } 1616 + + 1617 + + static construct { 1618 + + model = Models.CalendarModel.get_default (); 1619 + + 1620 + + provider = new Gtk.CssProvider (); 1621 + + provider.load_from_resource ("/io/elementary/desktop/wingpanel/datetime/GridDay.css"); 1622 + + } 1623 + + 1624 + + construct { 1625 + + unowned Gtk.StyleContext style_context = get_style_context (); 1626 + + style_context.add_provider (provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); 1627 + + style_context.add_class ("circular"); 1628 + + 1629 + + label = new Gtk.Label (null); 1630 + + 1631 + + event_grid = new Gtk.Grid (); 1632 + + event_grid.halign = Gtk.Align.CENTER; 1633 + + event_grid.height_request = 6; 1634 + + 1635 + + var grid = new Gtk.Grid (); 1636 + + grid.halign = grid.valign = Gtk.Align.CENTER; 1637 + + grid.attach (label, 0, 0); 1638 + + grid.attach (event_grid, 0, 1); 1639 + + 1640 + + can_focus = true; 1641 + + events |= Gdk.EventMask.BUTTON_PRESS_MASK; 1642 + + events |= Gdk.EventMask.KEY_PRESS_MASK; 1643 + + events |= Gdk.EventMask.SMOOTH_SCROLL_MASK; 1644 + + set_size_request (35, 35); 1645 + + halign = Gtk.Align.CENTER; 1646 + + hexpand = true; 1647 + + add (grid); 1648 + + show_all (); 1649 + + 1650 + + // Signals and handlers 1651 + + button_press_event.connect (on_button_press); 1652 + + key_press_event.connect (on_key_press); 1653 + + scroll_event.connect ((event) => {return Util.on_scroll_event (event);}); 1654 + + 1655 + + notify["date"].connect (() => { 1656 + + label.label = date.get_day_of_month ().to_string (); 1657 + + }); 1658 + + 1659 + + event_dots = new Gee.HashMap<string, Gtk.Widget> (); 1660 + + 1661 + + model.events_added.connect (add_event_dots); 1662 + + model.events_removed.connect (remove_event_dots); 1663 + + } 1664 + + 1665 + + private void add_event_dots (E.Source source, Gee.Collection<ECal.Component> events) { 1666 + + foreach (var component in events) { 1667 + + if (event_dots.size >= 3) { 1668 + + return; 1669 + + } 1670 + + 1671 + + if (Util.calcomp_is_on_day (component, date)) { 1672 + + unowned ICal.Component ical = component.get_icalcomponent (); 1673 + + 1674 + + var event_uid = ical.get_uid (); 1675 + + if (!event_dots.has_key (event_uid)) { 1676 + + var event_dot = new Gtk.Image (); 1677 + + event_dot.gicon = new ThemedIcon ("pager-checked-symbolic"); 1678 + + event_dot.pixel_size = 6; 1679 + + 1680 + + unowned Gtk.StyleContext style_context = event_dot.get_style_context (); 1681 + + style_context.add_class (Granite.STYLE_CLASS_ACCENT); 1682 + + style_context.add_provider (provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); 1683 + + 1684 + + var source_calendar = (E.SourceCalendar?) source.get_extension (E.SOURCE_EXTENSION_CALENDAR); 1685 + + Util.set_event_calendar_color (source_calendar, event_dot); 1686 + + 1687 + + event_dots[event_uid] = event_dot; 1688 + + 1689 + + event_grid.add (event_dot); 1690 + + } 1691 + + } 1692 + + } 1693 + + 1694 + + event_grid.show_all (); 1695 + + } 1696 + + 1697 + + private void remove_event_dots (E.Source source, Gee.Collection<ECal.Component> events) { 1698 + + foreach (var component in events) { 1699 + + unowned ICal.Component ical = component.get_icalcomponent (); 1700 + + var event_uid = ical.get_uid (); 1701 + + var dot = event_dots[event_uid]; 1702 + + if (dot != null) { 1703 + + dot.destroy (); 1704 + + event_dots.remove (event_uid); 1705 + + } 1706 + + } 1707 + + } 1708 + + 1709 + + public void set_selected (bool selected) { 1710 + + if (selected) { 1711 + + set_state_flags (Gtk.StateFlags.SELECTED, true); 1712 + + } else { 1713 + + set_state_flags (Gtk.StateFlags.NORMAL, true); 1714 + + } 1715 + + } 1716 + + 1717 + + public void grab_focus_force () { 1718 + + valid_grab = true; 1719 + + grab_focus (); 1720 + + } 1721 + + 1722 + + public override void grab_focus () { 1723 + + if (valid_grab) { 1724 + + base.grab_focus (); 1725 + + valid_grab = false; 1726 + + } 1727 + + } 1728 + + 1729 + + public void sensitive_container (bool sens) { 1730 + + label.sensitive = sens; 1731 + + event_grid.sensitive = sens; 1732 + + } 1733 + + 1734 + + private bool on_button_press (Gdk.EventButton event) { 1735 + + if (event.type == Gdk.EventType.2BUTTON_PRESS && event.button == Gdk.BUTTON_PRIMARY) 1736 + + on_event_add (date); 1737 + + valid_grab = true; 1738 + + grab_focus (); 1739 + + return false; 1740 + + } 1741 + + 1742 + + private bool on_key_press (Gdk.EventKey event) { 1743 + + if (event.keyval == Gdk.keyval_from_name ("Return") ) { 1744 + + on_event_add (date); 1745 + + return true; 1746 + + } 1747 + + 1748 + + return false; 1749 + + } 1750 + + } 1751 + +} 1752 + diff --git a/src/Widgets/PanelLabel.vala b/src/Widgets/PanelLabel.vala 1753 + index f253f9b..dff9a21 100644 1754 + --- a/src/Widgets/PanelLabel.vala 1755 + +++ b/src/Widgets/PanelLabel.vala 1756 + @@ -17,55 +17,57 @@ 1757 + * Boston, MA 02110-1301 USA. 1758 + */ 1759 + 1760 + -public class DateTime.Widgets.PanelLabel : Gtk.Grid { 1761 + - private Gtk.Label date_label; 1762 + - private Gtk.Label time_label; 1763 + - private Services.TimeManager time_manager; 1764 + +namespace DateTimeIndicator { 1765 + + public class Widgets.PanelLabel : Gtk.Grid { 1766 + + private Gtk.Label date_label; 1767 + + private Gtk.Label time_label; 1768 + + private Services.TimeManager time_manager; 1769 + 1770 + - public string clock_format { get; set; } 1771 + - public bool clock_show_seconds { get; set; } 1772 + - public bool clock_show_weekday { get; set; } 1773 + + public string clock_format { get; set; } 1774 + + public bool clock_show_seconds { get; set; } 1775 + + public bool clock_show_weekday { get; set; } 1776 + 1777 + - construct { 1778 + - date_label = new Gtk.Label (null); 1779 + - date_label.margin_end = 12; 1780 + + construct { 1781 + + date_label = new Gtk.Label (null); 1782 + + date_label.margin_end = 12; 1783 + 1784 + - var date_revealer = new Gtk.Revealer (); 1785 + - date_revealer.transition_type = Gtk.RevealerTransitionType.SLIDE_LEFT; 1786 + - date_revealer.add (date_label); 1787 + + var date_revealer = new Gtk.Revealer (); 1788 + + date_revealer.transition_type = Gtk.RevealerTransitionType.SLIDE_LEFT; 1789 + + date_revealer.add (date_label); 1790 + 1791 + - time_label = new Gtk.Label (null); 1792 + + time_label = new Gtk.Label (null); 1793 + 1794 + - valign = Gtk.Align.CENTER; 1795 + - add (date_revealer); 1796 + - add (time_label); 1797 + + valign = Gtk.Align.CENTER; 1798 + + add (date_revealer); 1799 + + add (time_label); 1800 + 1801 + - var clock_settings = new GLib.Settings ("io.elementary.desktop.wingpanel.datetime"); 1802 + - clock_settings.bind ("clock-format", this, "clock-format", SettingsBindFlags.DEFAULT); 1803 + - clock_settings.bind ("clock-show-seconds", this, "clock-show-seconds", SettingsBindFlags.DEFAULT); 1804 + - clock_settings.bind ("clock-show-date", date_revealer, "reveal_child", SettingsBindFlags.DEFAULT); 1805 + - clock_settings.bind ("clock-show-weekday", this, "clock-show-weekday", SettingsBindFlags.DEFAULT); 1806 + + var clock_settings = new GLib.Settings ("io.elementary.desktop.wingpanel.datetime"); 1807 + + clock_settings.bind ("clock-format", this, "clock-format", SettingsBindFlags.DEFAULT); 1808 + + clock_settings.bind ("clock-show-seconds", this, "clock-show-seconds", SettingsBindFlags.DEFAULT); 1809 + + clock_settings.bind ("clock-show-date", date_revealer, "reveal_child", SettingsBindFlags.DEFAULT); 1810 + + clock_settings.bind ("clock-show-weekday", this, "clock-show-weekday", SettingsBindFlags.DEFAULT); 1811 + 1812 + - notify.connect (() => { 1813 + - update_labels (); 1814 + - }); 1815 + + notify.connect (() => { 1816 + + update_labels (); 1817 + + }); 1818 + 1819 + - time_manager = Services.TimeManager.get_default (); 1820 + - time_manager.minute_changed.connect (update_labels); 1821 + - time_manager.notify["is-12h"].connect (update_labels); 1822 + - } 1823 + - 1824 + - private void update_labels () { 1825 + - string date_format; 1826 + - if (clock_format == "ISO8601") { 1827 + - date_format = "%F"; 1828 + - } else { 1829 + - date_format = Granite.DateTime.get_default_date_format (clock_show_weekday, true, false); 1830 + + time_manager = Services.TimeManager.get_default (); 1831 + + time_manager.minute_changed.connect (update_labels); 1832 + + time_manager.notify["is-12h"].connect (update_labels); 1833 + } 1834 + 1835 + - date_label.label = time_manager.format (date_format); 1836 + + private void update_labels () { 1837 + + string date_format; 1838 + + if (clock_format == "ISO8601") { 1839 + + date_format = "%F"; 1840 + + } else { 1841 + + date_format = Granite.DateTime.get_default_date_format (clock_show_weekday, true, false); 1842 + + } 1843 + 1844 + - string time_format = Granite.DateTime.get_default_time_format (time_manager.is_12h, clock_show_seconds); 1845 + - time_label.label = time_manager.format (time_format); 1846 + + date_label.label = time_manager.format (date_format); 1847 + + 1848 + + string time_format = Granite.DateTime.get_default_time_format (time_manager.is_12h, clock_show_seconds); 1849 + + time_label.label = time_manager.format (time_format); 1850 + + } 1851 + } 1852 + } 1853 + diff --git a/src/Widgets/calendar/CalendarView.vala b/src/Widgets/calendar/CalendarView.vala 1854 + deleted file mode 100644 1855 + index ef3f8f9..0000000 1856 + --- a/src/Widgets/calendar/CalendarView.vala 1857 + +++ /dev/null 1858 + @@ -1,183 +0,0 @@ 1859 + -/*- 1860 + - * Copyright (c) 2011–2018 elementary, Inc. (https://elementary.io) 1861 + - * 1862 + - * This program is free software: you can redistribute it and/or modify 1863 + - * it under the terms of the GNU General Public License as published by 1864 + - * the Free Software Foundation, either version 3 of the License, or 1865 + - * (at your option) any later version. 1866 + - * 1867 + - * This program is distributed in the hope that it will be useful, 1868 + - * but WITHOUT ANY WARRANTY; without even the implied warranty of 1869 + - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1870 + - * GNU General Public License for more details. 1871 + - * 1872 + - * You should have received a copy of the GNU General Public License 1873 + - * along with this program. If not, see <http://www.gnu.org/licenses/>. 1874 + - * 1875 + - * Authored by: Maxwell Barvian 1876 + - * Corentin Noël <corentin@elementaryos.org> 1877 + - */ 1878 + - 1879 + -public class DateTime.Widgets.CalendarView : Gtk.Grid { 1880 + - public signal void day_double_click (); 1881 + - public signal void event_updates (); 1882 + - public signal void selection_changed (GLib.DateTime? new_date); 1883 + - 1884 + - public GLib.DateTime? selected_date { get; private set; } 1885 + - 1886 + - private Grid grid; 1887 + - private Gtk.Stack stack; 1888 + - private Gtk.Grid big_grid; 1889 + - 1890 + - construct { 1891 + - var label = new Gtk.Label (new GLib.DateTime.now_local ().format (_("%OB, %Y"))); 1892 + - label.hexpand = true; 1893 + - label.margin_start = 6; 1894 + - label.xalign = 0; 1895 + - label.width_chars = 13; 1896 + - 1897 + - var provider = new Gtk.CssProvider (); 1898 + - provider.load_from_resource ("/io/elementary/desktop/wingpanel/datetime/ControlHeader.css"); 1899 + - 1900 + - var label_style_context = label.get_style_context (); 1901 + - label_style_context.add_class ("header-label"); 1902 + - label_style_context.add_provider (provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); 1903 + - 1904 + - var left_button = new Gtk.Button.from_icon_name ("pan-start-symbolic"); 1905 + - var center_button = new Gtk.Button.from_icon_name ("office-calendar-symbolic"); 1906 + - center_button.tooltip_text = _("Go to today's date"); 1907 + - var right_button = new Gtk.Button.from_icon_name ("pan-end-symbolic"); 1908 + - 1909 + - var box_buttons = new Gtk.Grid (); 1910 + - box_buttons.margin_end = 6; 1911 + - box_buttons.valign = Gtk.Align.CENTER; 1912 + - box_buttons.get_style_context ().add_class (Gtk.STYLE_CLASS_LINKED); 1913 + - box_buttons.add (left_button); 1914 + - box_buttons.add (center_button); 1915 + - box_buttons.add (right_button); 1916 + - 1917 + - big_grid = create_big_grid (); 1918 + - 1919 + - stack = new Gtk.Stack (); 1920 + - stack.add (big_grid); 1921 + - stack.show_all (); 1922 + - stack.expand = true; 1923 + - 1924 + - stack.notify["transition-running"].connect (() => { 1925 + - if (stack.transition_running == false) { 1926 + - stack.get_children ().foreach ((child) => { 1927 + - if (child != stack.visible_child) { 1928 + - child.destroy (); 1929 + - } 1930 + - }); 1931 + - } 1932 + - }); 1933 + - 1934 + - column_spacing = 6; 1935 + - row_spacing = 6; 1936 + - margin_start = margin_end = 10; 1937 + - attach (label, 0, 0); 1938 + - attach (box_buttons, 1, 0); 1939 + - attach (stack, 0, 1, 2); 1940 + - 1941 + - var model = CalendarModel.get_default (); 1942 + - model.notify["data-range"].connect (() => { 1943 + - label.label = model.month_start.format (_("%OB, %Y")); 1944 + - 1945 + - sync_with_model (); 1946 + - 1947 + - selected_date = null; 1948 + - selection_changed (selected_date); 1949 + - }); 1950 + - 1951 + - left_button.clicked.connect (() => { 1952 + - model.change_month (-1); 1953 + - }); 1954 + - 1955 + - right_button.clicked.connect (() => { 1956 + - model.change_month (1); 1957 + - }); 1958 + - 1959 + - center_button.clicked.connect (() => { 1960 + - show_today (); 1961 + - }); 1962 + - } 1963 + - 1964 + - private Gtk.Grid create_big_grid () { 1965 + - grid = new DateTime.Widgets.Grid (); 1966 + - grid.show_all (); 1967 + - 1968 + - grid.on_event_add.connect ((date) => { 1969 + - show_date_in_maya (date); 1970 + - day_double_click (); 1971 + - }); 1972 + - 1973 + - grid.selection_changed.connect ((date) => { 1974 + - selected_date = date; 1975 + - selection_changed (date); 1976 + - }); 1977 + - 1978 + - return grid; 1979 + - } 1980 + - 1981 + - public void show_today () { 1982 + - var calmodel = CalendarModel.get_default (); 1983 + - var today = Util.strip_time (new GLib.DateTime.now_local ()); 1984 + - var start = Util.get_start_of_month (today); 1985 + - selected_date = today; 1986 + - if (!start.equal (calmodel.month_start)) { 1987 + - calmodel.month_start = start; 1988 + - } 1989 + - sync_with_model (); 1990 + - 1991 + - grid.set_focus_to_today (); 1992 + - } 1993 + - 1994 + - // TODO: As far as maya supports it use the Dbus Activation feature to run the calendar-app. 1995 + - public void show_date_in_maya (GLib.DateTime date) { 1996 + - var command = "io.elementary.calendar --show-day %s".printf (date.format ("%F")); 1997 + - 1998 + - try { 1999 + - var appinfo = AppInfo.create_from_commandline (command, null, AppInfoCreateFlags.NONE); 2000 + - appinfo.launch_uris (null, null); 2001 + - } catch (GLib.Error e) { 2002 + - var dialog = new Granite.MessageDialog.with_image_from_icon_name ( 2003 + - _("Unable To Launch Calendar"), 2004 + - _("The program \"io.elementary.calendar\" may not be installed"), 2005 + - "dialog-error" 2006 + - ); 2007 + - dialog.show_error_details (e.message); 2008 + - dialog.run (); 2009 + - dialog.destroy (); 2010 + - } 2011 + - } 2012 + - 2013 + - /* Sets the calendar widgets to the date range of the model */ 2014 + - private void sync_with_model () { 2015 + - var model = CalendarModel.get_default (); 2016 + - if (grid.grid_range != null && (model.data_range.equals (grid.grid_range) || grid.grid_range.first_dt.compare (model.data_range.first_dt) == 0)) { 2017 + - grid.update_today (); 2018 + - return; // nothing else to do 2019 + - } 2020 + - 2021 + - GLib.DateTime previous_first = null; 2022 + - if (grid.grid_range != null) 2023 + - previous_first = grid.grid_range.first_dt; 2024 + - 2025 + - big_grid = create_big_grid (); 2026 + - stack.add (big_grid); 2027 + - 2028 + - grid.set_range (model.data_range, model.month_start); 2029 + - grid.update_weeks (model.data_range.first_dt, model.num_weeks); 2030 + - 2031 + - if (previous_first != null) { 2032 + - if (previous_first.compare (grid.grid_range.first_dt) == -1) { 2033 + - stack.transition_type = Gtk.StackTransitionType.SLIDE_LEFT; 2034 + - } else { 2035 + - stack.transition_type = Gtk.StackTransitionType.SLIDE_RIGHT; 2036 + - } 2037 + - } 2038 + - 2039 + - stack.set_visible_child (big_grid); 2040 + - } 2041 + -} 2042 + diff --git a/src/Widgets/calendar/GridDay.vala b/src/Widgets/calendar/GridDay.vala 2043 + deleted file mode 100644 2044 + index a9b5a28..0000000 2045 + --- a/src/Widgets/calendar/GridDay.vala 2046 + +++ /dev/null 2047 + @@ -1,178 +0,0 @@ 2048 + -// -*- Mode: vala; indent-tabs-mode: nil; tab-width: 4 -*- 2049 + -/*- 2050 + - * Copyright (c) 2011–2018 elementary, Inc. (https://elementary.io) 2051 + - * 2052 + - * This program is free software: you can redistribute it and/or modify 2053 + - * it under the terms of the GNU General Public License as published by 2054 + - * the Free Software Foundation, either version 3 of the License, or 2055 + - * (at your option) any later version. 2056 + - * 2057 + - * This program is distributed in the hope that it will be useful, 2058 + - * but WITHOUT ANY WARRANTY; without even the implied warranty of 2059 + - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 2060 + - * GNU General Public License for more details. 2061 + - * 2062 + - * You should have received a copy of the GNU General Public License 2063 + - * along with this program. If not, see <http://www.gnu.org/licenses/>. 2064 + - * 2065 + - * Authored by: Maxwell Barvian 2066 + - * Corentin Noël <corentin@elementaryos.org> 2067 + - */ 2068 + - 2069 + -/** 2070 + - * Represents a single day on the grid. 2071 + - */ 2072 + -public class DateTime.Widgets.GridDay : Gtk.EventBox { 2073 + - /* 2074 + - * Event emitted when the day is double clicked or the ENTER key is pressed. 2075 + - */ 2076 + - public signal void on_event_add (GLib.DateTime date); 2077 + - 2078 + - public GLib.DateTime date { get; construct set; } 2079 + - 2080 + - private static Gtk.CssProvider provider; 2081 + - private static Widgets.CalendarModel model; 2082 + - 2083 + - private Gee.HashMap<string, Gtk.Widget> event_dots; 2084 + - private Gtk.Grid event_grid; 2085 + - private Gtk.Label label; 2086 + - private bool valid_grab = false; 2087 + - 2088 + - public GridDay (GLib.DateTime date) { 2089 + - Object (date: date); 2090 + - } 2091 + - 2092 + - static construct { 2093 + - model = Widgets.CalendarModel.get_default (); 2094 + - 2095 + - provider = new Gtk.CssProvider (); 2096 + - provider.load_from_resource ("/io/elementary/desktop/wingpanel/datetime/GridDay.css"); 2097 + - } 2098 + - 2099 + - construct { 2100 + - unowned Gtk.StyleContext style_context = get_style_context (); 2101 + - style_context.add_provider (provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); 2102 + - style_context.add_class ("circular"); 2103 + - 2104 + - label = new Gtk.Label (null); 2105 + - 2106 + - event_grid = new Gtk.Grid (); 2107 + - event_grid.halign = Gtk.Align.CENTER; 2108 + - event_grid.height_request = 6; 2109 + - 2110 + - var grid = new Gtk.Grid (); 2111 + - grid.halign = grid.valign = Gtk.Align.CENTER; 2112 + - grid.attach (label, 0, 0); 2113 + - grid.attach (event_grid, 0, 1); 2114 + - 2115 + - can_focus = true; 2116 + - events |= Gdk.EventMask.BUTTON_PRESS_MASK; 2117 + - events |= Gdk.EventMask.KEY_PRESS_MASK; 2118 + - events |= Gdk.EventMask.SMOOTH_SCROLL_MASK; 2119 + - set_size_request (35, 35); 2120 + - halign = Gtk.Align.CENTER; 2121 + - hexpand = true; 2122 + - add (grid); 2123 + - show_all (); 2124 + - 2125 + - // Signals and handlers 2126 + - button_press_event.connect (on_button_press); 2127 + - key_press_event.connect (on_key_press); 2128 + - scroll_event.connect ((event) => {return Util.on_scroll_event (event);}); 2129 + - 2130 + - notify["date"].connect (() => { 2131 + - label.label = date.get_day_of_month ().to_string (); 2132 + - }); 2133 + - 2134 + - event_dots = new Gee.HashMap<string, Gtk.Widget> (); 2135 + - 2136 + - model.events_added.connect (add_event_dots); 2137 + - model.events_removed.connect (remove_event_dots); 2138 + - } 2139 + - 2140 + - private void add_event_dots (E.Source source, Gee.Collection<ECal.Component> events) { 2141 + - foreach (var component in events) { 2142 + - if (event_dots.size >= 3) { 2143 + - return; 2144 + - } 2145 + - 2146 + - if (Util.calcomp_is_on_day (component, date)) { 2147 + - unowned ICal.Component ical = component.get_icalcomponent (); 2148 + - 2149 + - var event_uid = ical.get_uid (); 2150 + - if (!event_dots.has_key (event_uid)) { 2151 + - var event_dot = new Gtk.Image (); 2152 + - event_dot.gicon = new ThemedIcon ("pager-checked-symbolic"); 2153 + - event_dot.pixel_size = 6; 2154 + - 2155 + - unowned Gtk.StyleContext style_context = event_dot.get_style_context (); 2156 + - style_context.add_class (Granite.STYLE_CLASS_ACCENT); 2157 + - style_context.add_provider (provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); 2158 + - 2159 + - var source_calendar = (E.SourceCalendar?) source.get_extension (E.SOURCE_EXTENSION_CALENDAR); 2160 + - Util.set_event_calendar_color (source_calendar, event_dot); 2161 + - 2162 + - event_dots[event_uid] = event_dot; 2163 + - 2164 + - event_grid.add (event_dot); 2165 + - } 2166 + - } 2167 + - } 2168 + - 2169 + - event_grid.show_all (); 2170 + - } 2171 + - 2172 + - private void remove_event_dots (E.Source source, Gee.Collection<ECal.Component> events) { 2173 + - foreach (var component in events) { 2174 + - unowned ICal.Component ical = component.get_icalcomponent (); 2175 + - var event_uid = ical.get_uid (); 2176 + - var dot = event_dots[event_uid]; 2177 + - if (dot != null) { 2178 + - dot.destroy (); 2179 + - event_dots.remove (event_uid); 2180 + - } 2181 + - } 2182 + - } 2183 + - 2184 + - public void set_selected (bool selected) { 2185 + - if (selected) { 2186 + - set_state_flags (Gtk.StateFlags.SELECTED, true); 2187 + - } else { 2188 + - set_state_flags (Gtk.StateFlags.NORMAL, true); 2189 + - } 2190 + - } 2191 + - 2192 + - public void grab_focus_force () { 2193 + - valid_grab = true; 2194 + - grab_focus (); 2195 + - } 2196 + - 2197 + - public override void grab_focus () { 2198 + - if (valid_grab) { 2199 + - base.grab_focus (); 2200 + - valid_grab = false; 2201 + - } 2202 + - } 2203 + - 2204 + - public void sensitive_container (bool sens) { 2205 + - label.sensitive = sens; 2206 + - event_grid.sensitive = sens; 2207 + - } 2208 + - 2209 + - private bool on_button_press (Gdk.EventButton event) { 2210 + - if (event.type == Gdk.EventType.2BUTTON_PRESS && event.button == Gdk.BUTTON_PRIMARY) 2211 + - on_event_add (date); 2212 + - valid_grab = true; 2213 + - grab_focus (); 2214 + - return false; 2215 + - } 2216 + - 2217 + - private bool on_key_press (Gdk.EventKey event) { 2218 + - if (event.keyval == Gdk.keyval_from_name ("Return") ) { 2219 + - on_event_add (date); 2220 + - return true; 2221 + - } 2222 + - 2223 + - return false; 2224 + - } 2225 + -} 2226 + 2227 + From 11f11073d74dac1d831560c3a92687531aaf846e Mon Sep 17 00:00:00 2001 2228 + From: Dirli <litandrej85@gmail.com> 2229 + Date: Thu, 9 Apr 2020 20:46:31 +0300 2230 + Subject: [PATCH 2/8] Events list moved to a separate file 2231 + 2232 + --- 2233 + meson.build | 1 + 2234 + src/Indicator.vala | 113 +++------------------------------ 2235 + src/Widgets/EventsListBox.vala | 102 +++++++++++++++++++++++++++++ 2236 + 3 files changed, 113 insertions(+), 103 deletions(-) 2237 + create mode 100644 src/Widgets/EventsListBox.vala 2238 + 2239 + diff --git a/meson.build b/meson.build 2240 + index b44c5bd..1b52276 100644 2241 + --- a/meson.build 2242 + +++ b/meson.build 2243 + @@ -46,6 +46,7 @@ shared_module( 2244 + 'src/Models/CalendarModel.vala', 2245 + 'src/Widgets/CalendarView.vala', 2246 + 'src/Widgets/EventRow.vala', 2247 + + 'src/Widgets/EventsListBox.vala', 2248 + 'src/Widgets/Grid.vala', 2249 + 'src/Widgets/GridDay.vala', 2250 + 'src/Widgets/PanelLabel.vala', 2251 + diff --git a/src/Indicator.vala b/src/Indicator.vala 2252 + index b712c12..6a8d001 100644 2253 + --- a/src/Indicator.vala 2254 + +++ b/src/Indicator.vala 2255 + @@ -22,9 +22,9 @@ namespace DateTimeIndicator { 2256 + public static GLib.Settings settings; 2257 + 2258 + private Widgets.PanelLabel panel_label; 2259 + - private Gtk.Grid main_grid; 2260 + private Widgets.CalendarView calendar; 2261 + - private Gtk.ListBox event_listbox; 2262 + + private Widgets.EventsListBox event_listbox; 2263 + + private Gtk.Grid main_grid; 2264 + private uint update_events_idle_source = 0; 2265 + 2266 + public Indicator () { 2267 + @@ -56,24 +56,7 @@ namespace DateTimeIndicator { 2268 + calendar = new Widgets.CalendarView (); 2269 + calendar.margin_bottom = 6; 2270 + 2271 + - var placeholder_label = new Gtk.Label (_("No Events on This Day")); 2272 + - placeholder_label.wrap = true; 2273 + - placeholder_label.wrap_mode = Pango.WrapMode.WORD; 2274 + - placeholder_label.margin_start = 12; 2275 + - placeholder_label.margin_end = 12; 2276 + - placeholder_label.max_width_chars = 20; 2277 + - placeholder_label.justify = Gtk.Justification.CENTER; 2278 + - placeholder_label.show_all (); 2279 + - 2280 + - var placeholder_style_context = placeholder_label.get_style_context (); 2281 + - placeholder_style_context.add_class (Gtk.STYLE_CLASS_DIM_LABEL); 2282 + - placeholder_style_context.add_class (Granite.STYLE_CLASS_H3_LABEL); 2283 + - 2284 + - event_listbox = new Gtk.ListBox (); 2285 + - event_listbox.selection_mode = Gtk.SelectionMode.NONE; 2286 + - event_listbox.set_header_func (header_update_func); 2287 + - event_listbox.set_placeholder (placeholder_label); 2288 + - event_listbox.set_sort_func (sort_function); 2289 + + event_listbox = new Widgets.EventsListBox (); 2290 + 2291 + var scrolled_window = new Gtk.ScrolledWindow (null, null); 2292 + scrolled_window.hscrollbar_policy = Gtk.PolicyType.NEVER; 2293 + @@ -84,11 +67,11 @@ namespace DateTimeIndicator { 2294 + 2295 + main_grid = new Gtk.Grid (); 2296 + main_grid.margin_top = 12; 2297 + - main_grid.attach (calendar, 0, 0); 2298 + - main_grid.attach (new Gtk.Separator (Gtk.Orientation.VERTICAL), 1, 0); 2299 + - main_grid.attach (scrolled_window, 2, 0); 2300 + - main_grid.attach (new Wingpanel.Widgets.Separator (), 0, 2, 3); 2301 + - main_grid.attach (settings_button, 0, 3, 3); 2302 + + main_grid.attach (calendar, 0, 0); 2303 + + main_grid.attach (new Wingpanel.Widgets.Separator (), 0, 1); 2304 + + main_grid.attach (settings_button, 0, 2); 2305 + + main_grid.attach (new Gtk.Separator (Gtk.Orientation.VERTICAL), 1, 0, 1, 3); 2306 + + main_grid.attach (scrolled_window, 2, 0, 1, 3); 2307 + 2308 + var size_group = new Gtk.SizeGroup (Gtk.SizeGroupMode.HORIZONTAL); 2309 + size_group.add_widget (calendar); 2310 + @@ -119,52 +102,6 @@ namespace DateTimeIndicator { 2311 + return main_grid; 2312 + } 2313 + 2314 + - private void header_update_func (Gtk.ListBoxRow lbrow, Gtk.ListBoxRow? lbbefore) { 2315 + - var row = (EventRow) lbrow; 2316 + - if (lbbefore != null) { 2317 + - var before = (EventRow) lbbefore; 2318 + - if (row.is_allday == before.is_allday) { 2319 + - row.set_header (null); 2320 + - return; 2321 + - } 2322 + - 2323 + - if (row.is_allday != before.is_allday) { 2324 + - var header_label = new Granite.HeaderLabel (_("During the Day")); 2325 + - header_label.margin_start = header_label.margin_end = 6; 2326 + - 2327 + - row.set_header (header_label); 2328 + - return; 2329 + - } 2330 + - } else { 2331 + - if (row.is_allday) { 2332 + - var allday_header = new Granite.HeaderLabel (_("All Day")); 2333 + - allday_header.margin_start = allday_header.margin_end = 6; 2334 + - 2335 + - row.set_header (allday_header); 2336 + - } 2337 + - return; 2338 + - } 2339 + - } 2340 + - 2341 + - [CCode (instance_pos = -1)] 2342 + - private int sort_function (Gtk.ListBoxRow child1, Gtk.ListBoxRow child2) { 2343 + - var e1 = (EventRow) child1; 2344 + - var e2 = (EventRow) child2; 2345 + - 2346 + - if (e1.start_time.compare (e2.start_time) != 0) { 2347 + - return e1.start_time.compare (e2.start_time); 2348 + - } 2349 + - 2350 + - // If they have the same date, sort them wholeday first 2351 + - if (e1.is_allday) { 2352 + - return -1; 2353 + - } else if (e2.is_allday) { 2354 + - return 1; 2355 + - } 2356 + - 2357 + - return 0; 2358 + - } 2359 + - 2360 + private void update_events_model (E.Source source, Gee.Collection<ECal.Component> events) { 2361 + idle_update_events (); 2362 + } 2363 + @@ -174,42 +111,12 @@ namespace DateTimeIndicator { 2364 + GLib.Source.remove (update_events_idle_source); 2365 + } 2366 + 2367 + - update_events_idle_source = GLib.Idle.add (update_events); 2368 + - } 2369 + - 2370 + - private bool update_events () { 2371 + - foreach (unowned Gtk.Widget widget in event_listbox.get_children ()) { 2372 + - widget.destroy (); 2373 + - } 2374 + + update_events_idle_source = GLib.Idle.add (() => { 2375 + + event_listbox.update_events (calendar.selected_date); 2376 + 2377 + - if (calendar.selected_date == null) { 2378 + update_events_idle_source = 0; 2379 + return GLib.Source.REMOVE; 2380 + - } 2381 + - 2382 + - var date = calendar.selected_date; 2383 + - 2384 + - var model = Models.CalendarModel.get_default (); 2385 + - 2386 + - var events_on_day = new Gee.TreeMap<string, EventRow> (); 2387 + - 2388 + - model.source_events.@foreach ((source, component_map) => { 2389 + - foreach (var comp in component_map.get_values ()) { 2390 + - if (Util.calcomp_is_on_day (comp, date)) { 2391 + - unowned ICal.Component ical = comp.get_icalcomponent (); 2392 + - var event_uid = ical.get_uid (); 2393 + - if (!events_on_day.has_key (event_uid)) { 2394 + - events_on_day[event_uid] = new EventRow (date, ical, source); 2395 + - 2396 + - event_listbox.add (events_on_day[event_uid]); 2397 + - } 2398 + - } 2399 + - } 2400 + }); 2401 + - 2402 + - event_listbox.show_all (); 2403 + - update_events_idle_source = 0; 2404 + - return GLib.Source.REMOVE; 2405 + } 2406 + 2407 + public override void opened () { 2408 + diff --git a/src/Widgets/EventsListBox.vala b/src/Widgets/EventsListBox.vala 2409 + new file mode 100644 2410 + index 0000000..547e4c5 2411 + --- /dev/null 2412 + +++ b/src/Widgets/EventsListBox.vala 2413 + @@ -0,0 +1,102 @@ 2414 + +namespace DateTimeIndicator { 2415 + + public class Widgets.EventsListBox : Gtk.ListBox { 2416 + + 2417 + + public EventsListBox () { 2418 + + selection_mode = Gtk.SelectionMode.NONE; 2419 + + 2420 + + var placeholder_label = new Gtk.Label (_("No Events on This Day")); 2421 + + placeholder_label.wrap = true; 2422 + + placeholder_label.wrap_mode = Pango.WrapMode.WORD; 2423 + + placeholder_label.margin_start = 12; 2424 + + placeholder_label.margin_end = 12; 2425 + + placeholder_label.max_width_chars = 20; 2426 + + placeholder_label.justify = Gtk.Justification.CENTER; 2427 + + placeholder_label.show_all (); 2428 + + 2429 + + var placeholder_style_context = placeholder_label.get_style_context (); 2430 + + placeholder_style_context.add_class (Gtk.STYLE_CLASS_DIM_LABEL); 2431 + + placeholder_style_context.add_class (Granite.STYLE_CLASS_H3_LABEL); 2432 + + 2433 + + set_header_func (header_update_func); 2434 + + set_placeholder (placeholder_label); 2435 + + set_sort_func (sort_function); 2436 + + } 2437 + + 2438 + + public void update_events (GLib.DateTime? selected_date) { 2439 + + foreach (unowned Gtk.Widget widget in get_children ()) { 2440 + + widget.destroy (); 2441 + + } 2442 + + 2443 + + if (selected_date == null) { 2444 + + return; 2445 + + } 2446 + + 2447 + + var model = Models.CalendarModel.get_default (); 2448 + + 2449 + + var events_on_day = new Gee.TreeMap<string, EventRow> (); 2450 + + 2451 + + model.source_events.@foreach ((source, component_map) => { 2452 + + foreach (var comp in component_map.get_values ()) { 2453 + + if (Util.calcomp_is_on_day (comp, selected_date)) { 2454 + + unowned ICal.Component ical = comp.get_icalcomponent (); 2455 + + var event_uid = ical.get_uid (); 2456 + + if (!events_on_day.has_key (event_uid)) { 2457 + + events_on_day[event_uid] = new EventRow (selected_date, ical, source); 2458 + + 2459 + + add (events_on_day[event_uid]); 2460 + + } 2461 + + } 2462 + + } 2463 + + }); 2464 + + 2465 + + show_all (); 2466 + + return; 2467 + + } 2468 + + 2469 + + private void header_update_func (Gtk.ListBoxRow lbrow, Gtk.ListBoxRow? lbbefore) { 2470 + + var row = (EventRow) lbrow; 2471 + + if (lbbefore != null) { 2472 + + var before = (EventRow) lbbefore; 2473 + + if (row.is_allday == before.is_allday) { 2474 + + row.set_header (null); 2475 + + return; 2476 + + } 2477 + + 2478 + + if (row.is_allday != before.is_allday) { 2479 + + var header_label = new Granite.HeaderLabel (_("During the Day")); 2480 + + header_label.margin_start = header_label.margin_end = 6; 2481 + + 2482 + + row.set_header (header_label); 2483 + + return; 2484 + + } 2485 + + } else { 2486 + + if (row.is_allday) { 2487 + + var allday_header = new Granite.HeaderLabel (_("All Day")); 2488 + + allday_header.margin_start = allday_header.margin_end = 6; 2489 + + 2490 + + row.set_header (allday_header); 2491 + + } 2492 + + return; 2493 + + } 2494 + + } 2495 + + 2496 + + [CCode (instance_pos = -1)] 2497 + + private int sort_function (Gtk.ListBoxRow child1, Gtk.ListBoxRow child2) { 2498 + + var e1 = (EventRow) child1; 2499 + + var e2 = (EventRow) child2; 2500 + + 2501 + + if (e1.start_time.compare (e2.start_time) != 0) { 2502 + + return e1.start_time.compare (e2.start_time); 2503 + + } 2504 + + 2505 + + // If they have the same date, sort them wholeday first 2506 + + if (e1.is_allday) { 2507 + + return -1; 2508 + + } else if (e2.is_allday) { 2509 + + return 1; 2510 + + } 2511 + + 2512 + + return 0; 2513 + + } 2514 + + } 2515 + +} 2516 + 2517 + From 262d91676f78f031bcfbff637344e52c63ab89bd Mon Sep 17 00:00:00 2001 2518 + From: Dirli <litandrej85@gmail.com> 2519 + Date: Sat, 11 Apr 2020 21:56:33 +0300 2520 + Subject: [PATCH 3/8] added event manager 2521 + 2522 + --- 2523 + meson.build | 1 + 2524 + src/Indicator.vala | 38 ++++-- 2525 + src/Models/CalendarModel.vala | 224 +------------------------------ 2526 + src/Services/EventsManager.vala | 226 ++++++++++++++++++++++++++++++++ 2527 + src/Util/Util.vala | 57 ++------ 2528 + src/Widgets/CalendarView.vala | 9 ++ 2529 + src/Widgets/EventsListBox.vala | 7 +- 2530 + src/Widgets/Grid.vala | 31 +++++ 2531 + src/Widgets/GridDay.vala | 111 +++++++++++----- 2532 + 9 files changed, 385 insertions(+), 319 deletions(-) 2533 + create mode 100644 src/Services/EventsManager.vala 2534 + 2535 + diff --git a/meson.build b/meson.build 2536 + index 1b52276..e348e3d 100644 2537 + --- a/meson.build 2538 + +++ b/meson.build 2539 + @@ -50,6 +50,7 @@ shared_module( 2540 + 'src/Widgets/Grid.vala', 2541 + 'src/Widgets/GridDay.vala', 2542 + 'src/Widgets/PanelLabel.vala', 2543 + + 'src/Services/EventsManager.vala', 2544 + 'src/Services/TimeManager.vala', 2545 + dependencies: [ 2546 + dependency('glib-2.0'), 2547 + diff --git a/src/Indicator.vala b/src/Indicator.vala 2548 + index 6a8d001..bf4358f 100644 2549 + --- a/src/Indicator.vala 2550 + +++ b/src/Indicator.vala 2551 + @@ -24,9 +24,14 @@ namespace DateTimeIndicator { 2552 + private Widgets.PanelLabel panel_label; 2553 + private Widgets.CalendarView calendar; 2554 + private Widgets.EventsListBox event_listbox; 2555 + + 2556 + + private Services.EventsManager event_manager; 2557 + + 2558 + private Gtk.Grid main_grid; 2559 + private uint update_events_idle_source = 0; 2560 + 2561 + + private bool opened_widget = false; 2562 + + 2563 + public Indicator () { 2564 + Object ( 2565 + code_name: Wingpanel.Indicator.DATETIME, 2566 + @@ -56,10 +61,22 @@ namespace DateTimeIndicator { 2567 + calendar = new Widgets.CalendarView (); 2568 + calendar.margin_bottom = 6; 2569 + 2570 + + event_manager = new Services.EventsManager (); 2571 + + event_manager.events_updated.connect (update_events_model); 2572 + + event_manager.events_added.connect ((source, events) => { 2573 + + calendar.add_event_dots (source, events); 2574 + + update_events_model (source, events); 2575 + + }); 2576 + + event_manager.events_removed.connect ((source, events) => { 2577 + + calendar.remove_event_dots (source, events); 2578 + + update_events_model (source, events); 2579 + + }); 2580 + + 2581 + event_listbox = new Widgets.EventsListBox (); 2582 + 2583 + var scrolled_window = new Gtk.ScrolledWindow (null, null); 2584 + scrolled_window.hscrollbar_policy = Gtk.PolicyType.NEVER; 2585 + + scrolled_window.vscrollbar_policy = Gtk.PolicyType.AUTOMATIC; 2586 + scrolled_window.add (event_listbox); 2587 + 2588 + var settings_button = new Gtk.ModelButton (); 2589 + @@ -90,6 +107,12 @@ namespace DateTimeIndicator { 2590 + close (); 2591 + }); 2592 + 2593 + + var model = Models.CalendarModel.get_default (); 2594 + + model.notify["month-start"].connect (() => { 2595 + + model.compute_ranges (); 2596 + + event_manager.load_all_sources (); 2597 + + }); 2598 + + 2599 + settings_button.clicked.connect (() => { 2600 + try { 2601 + AppInfo.launch_default_for_uri ("settings://time", null); 2602 + @@ -103,7 +126,9 @@ namespace DateTimeIndicator { 2603 + } 2604 + 2605 + private void update_events_model (E.Source source, Gee.Collection<ECal.Component> events) { 2606 + - idle_update_events (); 2607 + + if (opened_widget) { 2608 + + idle_update_events (); 2609 + + } 2610 + } 2611 + 2612 + private void idle_update_events () { 2613 + @@ -112,7 +137,7 @@ namespace DateTimeIndicator { 2614 + } 2615 + 2616 + update_events_idle_source = GLib.Idle.add (() => { 2617 + - event_listbox.update_events (calendar.selected_date); 2618 + + event_listbox.update_events (calendar.selected_date, event_manager.source_events); 2619 + 2620 + update_events_idle_source = 0; 2621 + return GLib.Source.REMOVE; 2622 + @@ -122,18 +147,15 @@ namespace DateTimeIndicator { 2623 + public override void opened () { 2624 + calendar.show_today (); 2625 + 2626 + - Models.CalendarModel.get_default ().events_added.connect (update_events_model); 2627 + - Models.CalendarModel.get_default ().events_updated.connect (update_events_model); 2628 + - Models.CalendarModel.get_default ().events_removed.connect (update_events_model); 2629 + + opened_widget = true; 2630 + } 2631 + 2632 + public override void closed () { 2633 + - Models.CalendarModel.get_default ().events_added.disconnect (update_events_model); 2634 + - Models.CalendarModel.get_default ().events_updated.disconnect (update_events_model); 2635 + - Models.CalendarModel.get_default ().events_removed.disconnect (update_events_model); 2636 + + opened_widget = false; 2637 + } 2638 + } 2639 + } 2640 + + 2641 + public Wingpanel.Indicator get_indicator (Module module) { 2642 + debug ("Activating DateTime Indicator"); 2643 + var indicator = new DateTimeIndicator.Indicator (); 2644 + diff --git a/src/Models/CalendarModel.vala b/src/Models/CalendarModel.vala 2645 + index 965b93e..d60a9ac 100644 2646 + --- a/src/Models/CalendarModel.vala 2647 + +++ b/src/Models/CalendarModel.vala 2648 + @@ -35,17 +35,6 @@ namespace DateTimeIndicator { 2649 + /* The start of week, ie. Monday=1 or Sunday=7 */ 2650 + public GLib.DateWeekday week_starts_on { get; set; } 2651 + 2652 + - public HashTable<E.Source, Gee.TreeMultiMap<string, ECal.Component>> source_events { get; private set; } 2653 + - 2654 + - /* Notifies when events are added, updated, or removed */ 2655 + - public signal void events_added (E.Source source, Gee.Collection<ECal.Component> events); 2656 + - public signal void events_updated (E.Source source, Gee.Collection<ECal.Component> events); 2657 + - public signal void events_removed (E.Source source, Gee.Collection<ECal.Component> events); 2658 + - 2659 + - private E.SourceRegistry registry { get; private set; } 2660 + - private HashTable<string, ECal.Client> source_client; 2661 + - private HashTable<string, ECal.ClientView> source_view; 2662 + - 2663 + private static CalendarModel? calendar_model = null; 2664 + 2665 + public static CalendarModel get_default () { 2666 + @@ -59,12 +48,6 @@ namespace DateTimeIndicator { 2667 + } 2668 + 2669 + construct { 2670 + - open.begin (); 2671 + - 2672 + - source_client = new HashTable<string, ECal.Client> (str_hash, str_equal); 2673 + - source_events = new HashTable<E.Source, Gee.TreeMultiMap<string, ECal.Component> > (Util.source_hash_func, Util.source_equal_func); 2674 + - source_view = new HashTable<string, ECal.ClientView> (str_hash, str_equal); 2675 + - 2676 + int week_start = Posix.NLTime.FIRST_WEEKDAY.to_string ().data[0]; 2677 + if (week_start >= 1 && week_start <= 7) { 2678 + week_starts_on = (GLib.DateWeekday) (week_start - 1); 2679 + @@ -72,66 +55,6 @@ namespace DateTimeIndicator { 2680 + 2681 + month_start = Util.get_start_of_month (); 2682 + compute_ranges (); 2683 + - notify["month-start"].connect (on_parameter_changed); 2684 + - } 2685 + - 2686 + - private async void open () { 2687 + - try { 2688 + - registry = yield new E.SourceRegistry (null); 2689 + - registry.source_removed.connect (remove_source); 2690 + - registry.source_added.connect ((source) => add_source_async.begin (source)); 2691 + - 2692 + - // Add sources 2693 + - registry.list_sources (E.SOURCE_EXTENSION_CALENDAR).foreach ((source) => { 2694 + - E.SourceCalendar cal = (E.SourceCalendar)source.get_extension (E.SOURCE_EXTENSION_CALENDAR); 2695 + - if (cal.selected == true && source.enabled == true) { 2696 + - add_source_async.begin (source); 2697 + - } 2698 + - }); 2699 + - 2700 + - load_all_sources (); 2701 + - } catch (GLib.Error error) { 2702 + - critical (error.message); 2703 + - } 2704 + - } 2705 + - 2706 + - private void load_all_sources () { 2707 + - lock (source_client) { 2708 + - foreach (var id in source_client.get_keys ()) { 2709 + - var source = registry.ref_source (id); 2710 + - E.SourceCalendar cal = (E.SourceCalendar)source.get_extension (E.SOURCE_EXTENSION_CALENDAR); 2711 + - 2712 + - if (cal.selected == true && source.enabled == true) { 2713 + - load_source (source); 2714 + - } 2715 + - } 2716 + - } 2717 + - } 2718 + - 2719 + - private void remove_source (E.Source source) { 2720 + - debug ("Removing source '%s'", source.dup_display_name ()); 2721 + - /* Already out of the model, so do nothing */ 2722 + - unowned string uid = source.get_uid (); 2723 + - 2724 + - if (!source_view.contains (uid)) { 2725 + - return; 2726 + - } 2727 + - 2728 + - var current_view = source_view.get (uid); 2729 + - try { 2730 + - current_view.stop (); 2731 + - } catch (Error e) { 2732 + - warning (e.message); 2733 + - } 2734 + - 2735 + - source_view.remove (uid); 2736 + - lock (source_client) { 2737 + - source_client.remove (uid); 2738 + - } 2739 + - 2740 + - var events = source_events.get (source).get_values ().read_only_view; 2741 + - events_removed (source, events); 2742 + - source_events.remove (source); 2743 + } 2744 + 2745 + public void change_month (int relative) { 2746 + @@ -144,7 +67,7 @@ namespace DateTimeIndicator { 2747 + 2748 + /* --- Helper Methods ---// */ 2749 + 2750 + - private void compute_ranges () { 2751 + + public void compute_ranges () { 2752 + var month_end = month_start.add_full (0, 1, -1); 2753 + 2754 + int dow = month_start.get_day_of_week (); 2755 + @@ -182,150 +105,5 @@ namespace DateTimeIndicator { 2756 + 2757 + debug (@"Date ranges: ($data_range_first <= $month_start < $month_end <= $data_range_last)"); 2758 + } 2759 + - 2760 + - private void load_source (E.Source source) { 2761 + - /* create empty source-event map */ 2762 + - var events = new Gee.TreeMultiMap<string, ECal.Component> ( 2763 + - (GLib.CompareDataFunc<ECal.Component>?) GLib.strcmp, 2764 + - (GLib.CompareDataFunc<ECal.Component>?) Util.calcomponent_compare_func 2765 + - ); 2766 + - source_events.set (source, events); 2767 + - /* query client view */ 2768 + - var iso_first = ECal.isodate_from_time_t ((time_t)data_range.first_dt.to_unix ()); 2769 + - var iso_last = ECal.isodate_from_time_t ((time_t)data_range.last_dt.add_days (1).to_unix ()); 2770 + - var query = @"(occur-in-time-range? (make-time \"$iso_first\") (make-time \"$iso_last\"))"; 2771 + - 2772 + - ECal.Client client; 2773 + - lock (source_client) { 2774 + - client = source_client.get (source.dup_uid ()); 2775 + - } 2776 + - 2777 + - if (client == null) { 2778 + - return; 2779 + - } 2780 + - 2781 + - debug ("Getting client-view for source '%s'", source.dup_display_name ()); 2782 + - client.get_view.begin (query, null, (obj, results) => { 2783 + - var view = on_client_view_received (results, source, client); 2784 + - view.objects_added.connect ((objects) => on_objects_added (source, client, objects)); 2785 + - view.objects_removed.connect ((objects) => on_objects_removed (source, client, objects)); 2786 + - view.objects_modified.connect ((objects) => on_objects_modified (source, client, objects)); 2787 + - try { 2788 + - view.start (); 2789 + - } catch (Error e) { 2790 + - critical (e.message); 2791 + - } 2792 + - 2793 + - source_view.set (source.dup_uid (), view); 2794 + - }); 2795 + - } 2796 + - 2797 + - private async void add_source_async (E.Source source) { 2798 + - debug ("Adding source '%s'", source.dup_display_name ()); 2799 + - try { 2800 + - var client = (ECal.Client) ECal.Client.connect_sync (source, ECal.ClientSourceType.EVENTS, -1, null); 2801 + - source_client.insert (source.dup_uid (), client); 2802 + - } catch (Error e) { 2803 + - critical (e.message); 2804 + - } 2805 + - 2806 + - Idle.add (() => { 2807 + - load_source (source); 2808 + - 2809 + - return false; 2810 + - }); 2811 + - } 2812 + - 2813 + - private void debug_event (E.Source source, ECal.Component event) { 2814 + - unowned ICal.Component comp = event.get_icalcomponent (); 2815 + - debug (@"Event ['$(comp.get_summary())', $(source.dup_display_name()), $(comp.get_uid()))]"); 2816 + - } 2817 + - 2818 + - /* --- Signal Handlers ---// */ 2819 + - private void on_parameter_changed () { 2820 + - compute_ranges (); 2821 + - load_all_sources (); 2822 + - } 2823 + - 2824 + - private ECal.ClientView on_client_view_received (AsyncResult results, E.Source source, ECal.Client client) { 2825 + - ECal.ClientView view; 2826 + - try { 2827 + - debug ("Received client-view for source '%s'", source.dup_display_name ()); 2828 + - bool status = client.get_view.end (results, out view); 2829 + - assert (status == true); 2830 + - } catch (Error e) { 2831 + - critical ("Error loading client-view from source '%s': %s", source.dup_display_name (), e.message); 2832 + - } 2833 + - 2834 + - return view; 2835 + - } 2836 + - 2837 + -#if E_CAL_2_0 2838 + - private void on_objects_added (E.Source source, ECal.Client client, SList<ICal.Component> objects) { 2839 + -#else 2840 + - private void on_objects_added (E.Source source, ECal.Client client, SList<weak ICal.Component> objects) { 2841 + -#endif 2842 + - debug (@"Received $(objects.length()) added event(s) for source '%s'", source.dup_display_name ()); 2843 + - var events = source_events.get (source); 2844 + - var added_events = new Gee.ArrayList<ECal.Component> ((Gee.EqualDataFunc<ECal.Component>?) Util.calcomponent_equal_func); 2845 + - objects.foreach ((comp) => { 2846 + - unowned string uid = comp.get_uid (); 2847 + -#if E_CAL_2_0 2848 + - client.generate_instances_for_object_sync (comp, (time_t) data_range.first_dt.to_unix (), (time_t) data_range.last_dt.to_unix (), null, (comp, start, end) => { 2849 + - var event = new ECal.Component.from_icalcomponent (comp); 2850 + -#else 2851 + - client.generate_instances_for_object_sync (comp, (time_t) data_range.first_dt.to_unix (), (time_t) data_range.last_dt.to_unix (), (event, start, end) => { 2852 + -#endif 2853 + - debug_event (source, event); 2854 + - events.set (uid, event); 2855 + - added_events.add (event); 2856 + - return true; 2857 + - }); 2858 + - }); 2859 + - } 2860 + - 2861 + -#if E_CAL_2_0 2862 + - private void on_objects_modified (E.Source source, ECal.Client client, SList<ICal.Component> objects) { 2863 + -#else 2864 + - private void on_objects_modified (E.Source source, ECal.Client client, SList<weak ICal.Component> objects) { 2865 + -#endif 2866 + - debug (@"Received $(objects.length()) modified event(s) for source '%s'", source.dup_display_name ()); 2867 + - var updated_events = new Gee.ArrayList<ECal.Component> ((Gee.EqualDataFunc<ECal.Component>?) Util.calcomponent_equal_func); 2868 + - 2869 + - objects.foreach ((comp) => { 2870 + - unowned string uid = comp.get_uid (); 2871 + - var events = source_events.get (source).get (uid); 2872 + - updated_events.add_all (events); 2873 + - foreach (var event in events) { 2874 + - debug_event (source, event); 2875 + - } 2876 + - }); 2877 + - 2878 + - events_updated (source, updated_events.read_only_view); 2879 + - } 2880 + - 2881 + -#if E_CAL_2_0 2882 + - private void on_objects_removed (E.Source source, ECal.Client client, SList<ECal.ComponentId?> cids) { 2883 + -#else 2884 + - private void on_objects_removed (E.Source source, ECal.Client client, SList<weak ECal.ComponentId?> cids) { 2885 + -#endif 2886 + - debug (@"Received $(cids.length()) removed event(s) for source '%s'", source.dup_display_name ()); 2887 + - var events = source_events.get (source); 2888 + - var removed_events = new Gee.ArrayList<ECal.Component> ((Gee.EqualDataFunc<ECal.Component>?) Util.calcomponent_equal_func); 2889 + - 2890 + - cids.foreach ((cid) => { 2891 + - if (cid == null) { 2892 + - return; 2893 + - } 2894 + - 2895 + - var comps = events.get (cid.get_uid ()); 2896 + - foreach (ECal.Component event in comps) { 2897 + - removed_events.add (event); 2898 + - debug_event (source, event); 2899 + - } 2900 + - }); 2901 + - 2902 + - events_removed (source, removed_events.read_only_view); 2903 + - } 2904 + } 2905 + } 2906 + diff --git a/src/Services/EventsManager.vala b/src/Services/EventsManager.vala 2907 + new file mode 100644 2908 + index 0000000..d939777 2909 + --- /dev/null 2910 + +++ b/src/Services/EventsManager.vala 2911 + @@ -0,0 +1,226 @@ 2912 + +namespace DateTimeIndicator { 2913 + + public class Services.EventsManager : GLib.Object { 2914 + + public signal void events_added (E.Source source, Gee.Collection<ECal.Component> events); 2915 + + public signal void events_updated (E.Source source, Gee.Collection<ECal.Component> events); 2916 + + public signal void events_removed (E.Source source, Gee.Collection<ECal.Component> events); 2917 + + 2918 + + public HashTable<E.Source, Gee.TreeMultiMap<string, ECal.Component>> source_events { get; private set; } 2919 + + 2920 + + private E.SourceRegistry registry { get; private set; } 2921 + + private HashTable<string, ECal.Client> source_client; 2922 + + private HashTable<string, ECal.ClientView> source_view; 2923 + + 2924 + + public EventsManager () { 2925 + + 2926 + + } 2927 + + 2928 + + construct { 2929 + + source_client = new HashTable<string, ECal.Client> (str_hash, str_equal); 2930 + + source_events = new HashTable<E.Source, Gee.TreeMultiMap<string, ECal.Component> > (Util.source_hash_func, Util.source_equal_func); 2931 + + source_view = new HashTable<string, ECal.ClientView> (str_hash, str_equal); 2932 + + 2933 + + open.begin (); 2934 + + } 2935 + + 2936 + + private async void open () { 2937 + + try { 2938 + + registry = yield new E.SourceRegistry (null); 2939 + + registry.source_removed.connect (remove_source); 2940 + + registry.source_added.connect ((source) => add_source_async.begin (source)); 2941 + + 2942 + + // Add sources 2943 + + registry.list_sources (E.SOURCE_EXTENSION_CALENDAR).foreach ((source) => { 2944 + + E.SourceCalendar cal = (E.SourceCalendar)source.get_extension (E.SOURCE_EXTENSION_CALENDAR); 2945 + + if (cal.selected == true && source.enabled == true) { 2946 + + add_source_async.begin (source); 2947 + + } 2948 + + }); 2949 + + 2950 + + load_all_sources (); 2951 + + } catch (GLib.Error error) { 2952 + + critical (error.message); 2953 + + } 2954 + + } 2955 + + 2956 + + public void load_all_sources () { 2957 + + lock (source_client) { 2958 + + foreach (var id in source_client.get_keys ()) { 2959 + + var source = registry.ref_source (id); 2960 + + E.SourceCalendar cal = (E.SourceCalendar)source.get_extension (E.SOURCE_EXTENSION_CALENDAR); 2961 + + 2962 + + if (cal.selected == true && source.enabled == true) { 2963 + + load_source (source); 2964 + + } 2965 + + } 2966 + + } 2967 + + } 2968 + + 2969 + + private void remove_source (E.Source source) { 2970 + + debug ("Removing source '%s'", source.dup_display_name ()); 2971 + + /* Already out of the model, so do nothing */ 2972 + + unowned string uid = source.get_uid (); 2973 + + 2974 + + if (!source_view.contains (uid)) { 2975 + + return; 2976 + + } 2977 + + 2978 + + var current_view = source_view.get (uid); 2979 + + try { 2980 + + current_view.stop (); 2981 + + } catch (Error e) { 2982 + + warning (e.message); 2983 + + } 2984 + + 2985 + + source_view.remove (uid); 2986 + + lock (source_client) { 2987 + + source_client.remove (uid); 2988 + + } 2989 + + 2990 + + var events = source_events.get (source).get_values ().read_only_view; 2991 + + events_removed (source, events); 2992 + + source_events.remove (source); 2993 + + } 2994 + + 2995 + + private void load_source (E.Source source) { 2996 + + var model = Models.CalendarModel.get_default (); 2997 + + 2998 + + /* create empty source-event map */ 2999 + + var events = new Gee.TreeMultiMap<string, ECal.Component> ( 3000 + + (GLib.CompareDataFunc<ECal.Component>?) GLib.strcmp, 3001 + + (GLib.CompareDataFunc<ECal.Component>?) Util.calcomponent_compare_func 3002 + + ); 3003 + + source_events.set (source, events); 3004 + + /* query client view */ 3005 + + var iso_first = ECal.isodate_from_time_t ((time_t) model.data_range.first_dt.to_unix ()); 3006 + + var iso_last = ECal.isodate_from_time_t ((time_t) model.data_range.last_dt.add_days (1).to_unix ()); 3007 + + var query = @"(occur-in-time-range? (make-time \"$iso_first\") (make-time \"$iso_last\"))"; 3008 + + 3009 + + ECal.Client client; 3010 + + lock (source_client) { 3011 + + client = source_client.get (source.dup_uid ()); 3012 + + } 3013 + + 3014 + + if (client == null) { 3015 + + return; 3016 + + } 3017 + + 3018 + + debug ("Getting client-view for source '%s'", source.dup_display_name ()); 3019 + + client.get_view.begin (query, null, (obj, results) => { 3020 + + var view = on_client_view_received (results, source, client); 3021 + + view.objects_added.connect ((objects) => on_objects_added (source, client, objects)); 3022 + + view.objects_removed.connect ((objects) => on_objects_removed (source, client, objects)); 3023 + + view.objects_modified.connect ((objects) => on_objects_modified (source, client, objects)); 3024 + + try { 3025 + + view.start (); 3026 + + } catch (Error e) { 3027 + + critical (e.message); 3028 + + } 3029 + + 3030 + + source_view.set (source.dup_uid (), view); 3031 + + }); 3032 + + } 3033 + + 3034 + + private async void add_source_async (E.Source source) { 3035 + + debug ("Adding source '%s'", source.dup_display_name ()); 3036 + + try { 3037 + + var client = (ECal.Client) ECal.Client.connect_sync (source, ECal.ClientSourceType.EVENTS, -1, null); 3038 + + source_client.insert (source.dup_uid (), client); 3039 + + } catch (Error e) { 3040 + + critical (e.message); 3041 + + } 3042 + + 3043 + + Idle.add (() => { 3044 + + load_source (source); 3045 + + 3046 + + return false; 3047 + + }); 3048 + + } 3049 + + 3050 + + private void debug_event (E.Source source, ECal.Component event) { 3051 + + unowned ICal.Component comp = event.get_icalcomponent (); 3052 + + debug (@"Event ['$(comp.get_summary())', $(source.dup_display_name()), $(comp.get_uid()))]"); 3053 + + } 3054 + + 3055 + + private ECal.ClientView on_client_view_received (AsyncResult results, E.Source source, ECal.Client client) { 3056 + + ECal.ClientView view; 3057 + + try { 3058 + + debug ("Received client-view for source '%s'", source.dup_display_name ()); 3059 + + bool status = client.get_view.end (results, out view); 3060 + + assert (status == true); 3061 + + } catch (Error e) { 3062 + + critical ("Error loading client-view from source '%s': %s", source.dup_display_name (), e.message); 3063 + + } 3064 + + 3065 + + return view; 3066 + + } 3067 + + 3068 + +#if E_CAL_2_0 3069 + + private void on_objects_added (E.Source source, ECal.Client client, SList<ICal.Component> objects) { 3070 + +#else 3071 + + private void on_objects_added (E.Source source, ECal.Client client, SList<weak ICal.Component> objects) { 3072 + +#endif 3073 + + debug (@"Received $(objects.length()) added event(s) for source '%s'", source.dup_display_name ()); 3074 + + var events = source_events.get (source); 3075 + + var added_events = new Gee.ArrayList<ECal.Component> ((Gee.EqualDataFunc<ECal.Component>?) Util.calcomponent_equal_func); 3076 + + var model = Models.CalendarModel.get_default (); 3077 + + objects.foreach ((comp) => { 3078 + + unowned string uid = comp.get_uid (); 3079 + +#if E_CAL_2_0 3080 + + client.generate_instances_for_object_sync (comp, (time_t) model.data_range.first_dt.to_unix (), (time_t) model.data_range.last_dt.to_unix (), null, (comp, start, end) => { 3081 + + var event = new ECal.Component.from_icalcomponent (comp); 3082 + +#else 3083 + + client.generate_instances_for_object_sync (comp, (time_t) model.data_range.first_dt.to_unix (), (time_t) model.data_range.last_dt.to_unix (), (event, start, end) => { 3084 + +#endif 3085 + + debug_event (source, event); 3086 + + events.set (uid, event); 3087 + + added_events.add (event); 3088 + + return true; 3089 + + }); 3090 + + }); 3091 + + } 3092 + + 3093 + +#if E_CAL_2_0 3094 + + private void on_objects_modified (E.Source source, ECal.Client client, SList<ICal.Component> objects) { 3095 + +#else 3096 + + private void on_objects_modified (E.Source source, ECal.Client client, SList<weak ICal.Component> objects) { 3097 + +#endif 3098 + + debug (@"Received $(objects.length()) modified event(s) for source '%s'", source.dup_display_name ()); 3099 + + var updated_events = new Gee.ArrayList<ECal.Component> ((Gee.EqualDataFunc<ECal.Component>?) Util.calcomponent_equal_func); 3100 + + 3101 + + objects.foreach ((comp) => { 3102 + + unowned string uid = comp.get_uid (); 3103 + + var events = source_events.get (source).get (uid); 3104 + + updated_events.add_all (events); 3105 + + foreach (var event in events) { 3106 + + debug_event (source, event); 3107 + + } 3108 + + }); 3109 + + 3110 + + events_updated (source, updated_events.read_only_view); 3111 + + } 3112 + + 3113 + +#if E_CAL_2_0 3114 + + private void on_objects_removed (E.Source source, ECal.Client client, SList<ECal.ComponentId?> cids) { 3115 + +#else 3116 + + private void on_objects_removed (E.Source source, ECal.Client client, SList<weak ECal.ComponentId?> cids) { 3117 + +#endif 3118 + + debug (@"Received $(cids.length()) removed event(s) for source '%s'", source.dup_display_name ()); 3119 + + var events = source_events.get (source); 3120 + + var removed_events = new Gee.ArrayList<ECal.Component> ((Gee.EqualDataFunc<ECal.Component>?) Util.calcomponent_equal_func); 3121 + + 3122 + + cids.foreach ((cid) => { 3123 + + if (cid == null) { 3124 + + return; 3125 + + } 3126 + + 3127 + + var comps = events.get (cid.get_uid ()); 3128 + + foreach (ECal.Component event in comps) { 3129 + + removed_events.add (event); 3130 + + debug_event (source, event); 3131 + + } 3132 + + }); 3133 + + 3134 + + events_removed (source, removed_events.read_only_view); 3135 + + } 3136 + + } 3137 + +} 3138 + diff --git a/src/Util/Util.vala b/src/Util/Util.vala 3139 + index c261f4b..b0bdf98 100644 3140 + --- a/src/Util/Util.vala 3141 + +++ b/src/Util/Util.vala 3142 + @@ -20,47 +20,6 @@ 3143 + */ 3144 + 3145 + namespace DateTimeIndicator.Util { 3146 + - static bool has_scrolled = false; 3147 + - 3148 + - public bool on_scroll_event (Gdk.EventScroll event) { 3149 + - double delta_x; 3150 + - double delta_y; 3151 + - event.get_scroll_deltas (out delta_x, out delta_y); 3152 + - 3153 + - double choice = delta_x; 3154 + - 3155 + - if (((int)delta_x).abs () < ((int)delta_y).abs ()) { 3156 + - choice = delta_y; 3157 + - } 3158 + - 3159 + - /* It's mouse scroll ! */ 3160 + - if (choice == 1 || choice == -1) { 3161 + - Models.CalendarModel.get_default ().change_month ((int)choice); 3162 + - 3163 + - return true; 3164 + - } 3165 + - 3166 + - if (has_scrolled == true) { 3167 + - return true; 3168 + - } 3169 + - 3170 + - if (choice > 0.3) { 3171 + - reset_timer.begin (); 3172 + - Models.CalendarModel.get_default ().change_month (1); 3173 + - 3174 + - return true; 3175 + - } 3176 + - 3177 + - if (choice < -0.3) { 3178 + - reset_timer.begin (); 3179 + - Models.CalendarModel.get_default ().change_month (-1); 3180 + - 3181 + - return true; 3182 + - } 3183 + - 3184 + - return false; 3185 + - } 3186 + - 3187 + public GLib.DateTime get_start_of_month (owned GLib.DateTime? date = null) { 3188 + if (date == null) { 3189 + date = new GLib.DateTime.now_local (); 3190 + @@ -225,12 +184,12 @@ namespace DateTimeIndicator.Util { 3191 + return a.dup_uid () == b.dup_uid (); 3192 + } 3193 + 3194 + - public async void reset_timer () { 3195 + - has_scrolled = true; 3196 + - Timeout.add (500, () => { 3197 + - has_scrolled = false; 3198 + - 3199 + - return false; 3200 + - }); 3201 + - } 3202 + + // public async void reset_timer () { 3203 + + // has_scrolled = true; 3204 + + // Timeout.add (500, () => { 3205 + + // has_scrolled = false; 3206 + + // 3207 + + // return false; 3208 + + // }); 3209 + + // } 3210 + } 3211 + diff --git a/src/Widgets/CalendarView.vala b/src/Widgets/CalendarView.vala 3212 + index 65cee28..070580f 100644 3213 + --- a/src/Widgets/CalendarView.vala 3214 + +++ b/src/Widgets/CalendarView.vala 3215 + @@ -181,5 +181,14 @@ namespace DateTimeIndicator { 3216 + 3217 + stack.set_visible_child (big_grid); 3218 + } 3219 + + 3220 + + public void add_event_dots (E.Source source, Gee.Collection<ECal.Component> events) { 3221 + + grid.add_event_dots (source, events); 3222 + + } 3223 + + 3224 + + 3225 + + public void remove_event_dots (E.Source source, Gee.Collection<ECal.Component> events) { 3226 + + grid.remove_event_dots (source, events); 3227 + + } 3228 + } 3229 + } 3230 + diff --git a/src/Widgets/EventsListBox.vala b/src/Widgets/EventsListBox.vala 3231 + index 547e4c5..c25af2e 100644 3232 + --- a/src/Widgets/EventsListBox.vala 3233 + +++ b/src/Widgets/EventsListBox.vala 3234 + @@ -1,6 +1,5 @@ 3235 + namespace DateTimeIndicator { 3236 + public class Widgets.EventsListBox : Gtk.ListBox { 3237 + - 3238 + public EventsListBox () { 3239 + selection_mode = Gtk.SelectionMode.NONE; 3240 + 3241 + @@ -22,7 +21,7 @@ namespace DateTimeIndicator { 3242 + set_sort_func (sort_function); 3243 + } 3244 + 3245 + - public void update_events (GLib.DateTime? selected_date) { 3246 + + public void update_events (GLib.DateTime? selected_date, HashTable<E.Source, Gee.TreeMultiMap<string, ECal.Component>> source_events) { 3247 + foreach (unowned Gtk.Widget widget in get_children ()) { 3248 + widget.destroy (); 3249 + } 3250 + @@ -31,11 +30,9 @@ namespace DateTimeIndicator { 3251 + return; 3252 + } 3253 + 3254 + - var model = Models.CalendarModel.get_default (); 3255 + - 3256 + var events_on_day = new Gee.TreeMap<string, EventRow> (); 3257 + 3258 + - model.source_events.@foreach ((source, component_map) => { 3259 + + source_events.@foreach ((source, component_map) => { 3260 + foreach (var comp in component_map.get_values ()) { 3261 + if (Util.calcomp_is_on_day (comp, selected_date)) { 3262 + unowned ICal.Component ical = comp.get_icalcomponent (); 3263 + diff --git a/src/Widgets/Grid.vala b/src/Widgets/Grid.vala 3264 + index 165d11d..660f212 100644 3265 + --- a/src/Widgets/Grid.vala 3266 + +++ b/src/Widgets/Grid.vala 3267 + @@ -261,5 +261,36 @@ namespace DateTimeIndicator { 3268 + return date.get_year () * 10000 + date.get_month () * 100 + date.get_day_of_month (); 3269 + } 3270 + 3271 + + public void add_event_dots (E.Source source, Gee.Collection<ECal.Component> events) { 3272 + + data.foreach ((entry) => { 3273 + + 3274 + + foreach (var component in events) { 3275 + + if (entry.value.skip_day ()) { 3276 + + return true; 3277 + + } 3278 + + 3279 + + if (Util.calcomp_is_on_day (component, entry.value.date)) { 3280 + + entry.value.add_dots (source, component.get_icalcomponent ()); 3281 + + } 3282 + + } 3283 + + 3284 + + entry.value.show_event_grid (); 3285 + + 3286 + + return true; 3287 + + }); 3288 + + } 3289 + + 3290 + + public void remove_event_dots (E.Source source, Gee.Collection<ECal.Component> events) { 3291 + + foreach (var component in events) { 3292 + + unowned ICal.Component ical = component.get_icalcomponent (); 3293 + + var event_uid = ical.get_uid (); 3294 + + data.foreach ((entry) => { 3295 + + if (entry.value.exist_event (event_uid)) { 3296 + + entry.value.remove_dots (event_uid); 3297 + + } 3298 + + return true; 3299 + + }); 3300 + + } 3301 + + } 3302 + } 3303 + } 3304 + diff --git a/src/Widgets/GridDay.vala b/src/Widgets/GridDay.vala 3305 + index 8c44443..00f82ea 100644 3306 + --- a/src/Widgets/GridDay.vala 3307 + +++ b/src/Widgets/GridDay.vala 3308 + @@ -31,6 +31,8 @@ namespace DateTimeIndicator { 3309 + 3310 + public GLib.DateTime date { get; construct set; } 3311 + 3312 + + private bool has_scrolled = false; 3313 + + 3314 + private static Gtk.CssProvider provider; 3315 + private static Models.CalendarModel model; 3316 + 3317 + @@ -79,59 +81,100 @@ namespace DateTimeIndicator { 3318 + // Signals and handlers 3319 + button_press_event.connect (on_button_press); 3320 + key_press_event.connect (on_key_press); 3321 + - scroll_event.connect ((event) => {return Util.on_scroll_event (event);}); 3322 + + scroll_event.connect (on_scroll_event); 3323 + 3324 + notify["date"].connect (() => { 3325 + label.label = date.get_day_of_month ().to_string (); 3326 + }); 3327 + 3328 + event_dots = new Gee.HashMap<string, Gtk.Widget> (); 3329 + - 3330 + - model.events_added.connect (add_event_dots); 3331 + - model.events_removed.connect (remove_event_dots); 3332 + } 3333 + 3334 + - private void add_event_dots (E.Source source, Gee.Collection<ECal.Component> events) { 3335 + - foreach (var component in events) { 3336 + - if (event_dots.size >= 3) { 3337 + - return; 3338 + - } 3339 + + public bool on_scroll_event (Gdk.EventScroll event) { 3340 + + double delta_x; 3341 + + double delta_y; 3342 + + event.get_scroll_deltas (out delta_x, out delta_y); 3343 + + 3344 + + double choice = delta_x; 3345 + + 3346 + + if (((int)delta_x).abs () < ((int)delta_y).abs ()) { 3347 + + choice = delta_y; 3348 + + } 3349 + + 3350 + + /* It's mouse scroll ! */ 3351 + + if (choice == 1 || choice == -1) { 3352 + + Models.CalendarModel.get_default ().change_month ((int)choice); 3353 + 3354 + - if (Util.calcomp_is_on_day (component, date)) { 3355 + - unowned ICal.Component ical = component.get_icalcomponent (); 3356 + + return true; 3357 + + } 3358 + 3359 + - var event_uid = ical.get_uid (); 3360 + - if (!event_dots.has_key (event_uid)) { 3361 + - var event_dot = new Gtk.Image (); 3362 + - event_dot.gicon = new ThemedIcon ("pager-checked-symbolic"); 3363 + - event_dot.pixel_size = 6; 3364 + + if (has_scrolled == true) { 3365 + + return true; 3366 + + } 3367 + 3368 + - unowned Gtk.StyleContext style_context = event_dot.get_style_context (); 3369 + - style_context.add_class (Granite.STYLE_CLASS_ACCENT); 3370 + - style_context.add_provider (provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); 3371 + + if (choice > 0.3) { 3372 + + reset_timer.begin (); 3373 + + Models.CalendarModel.get_default ().change_month (1); 3374 + 3375 + - var source_calendar = (E.SourceCalendar?) source.get_extension (E.SOURCE_EXTENSION_CALENDAR); 3376 + - Util.set_event_calendar_color (source_calendar, event_dot); 3377 + + return true; 3378 + + } 3379 + 3380 + - event_dots[event_uid] = event_dot; 3381 + + if (choice < -0.3) { 3382 + + reset_timer.begin (); 3383 + + Models.CalendarModel.get_default ().change_month (-1); 3384 + 3385 + - event_grid.add (event_dot); 3386 + - } 3387 + - } 3388 + + return true; 3389 + } 3390 + 3391 + + return false; 3392 + + } 3393 + + 3394 + + public async void reset_timer () { 3395 + + has_scrolled = true; 3396 + + Timeout.add (500, () => { 3397 + + has_scrolled = false; 3398 + + 3399 + + return false; 3400 + + }); 3401 + + } 3402 + + 3403 + + public bool skip_day () { 3404 + + return event_dots.size >= 3 ? true : false; 3405 + + } 3406 + + 3407 + + public void show_event_grid () { 3408 + event_grid.show_all (); 3409 + } 3410 + 3411 + - private void remove_event_dots (E.Source source, Gee.Collection<ECal.Component> events) { 3412 + - foreach (var component in events) { 3413 + - unowned ICal.Component ical = component.get_icalcomponent (); 3414 + - var event_uid = ical.get_uid (); 3415 + - var dot = event_dots[event_uid]; 3416 + - if (dot != null) { 3417 + - dot.destroy (); 3418 + - event_dots.remove (event_uid); 3419 + - } 3420 + + public void add_dots (E.Source source, ICal.Component ical) { 3421 + + var event_uid = ical.get_uid (); 3422 + + if (!event_dots.has_key (event_uid)) { 3423 + + var event_dot = new Gtk. Image (); 3424 + + event_dot.gicon = new ThemedIcon ("pager-checked-symbolic"); 3425 + + event_dot.pixel_size = 6; 3426 + + 3427 + + unowned Gtk.StyleContext style_context = event_dot.get_style_context (); 3428 + + style_context.add_class (Granite.STYLE_CLASS_ACCENT); 3429 + + style_context.add_provider (provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); 3430 + + 3431 + + var source_calendar = (E.SourceCalendar?) source.get_extension (E.SOURCE_EXTENSION_CALENDAR); 3432 + + Util.set_event_calendar_color (source_calendar, event_dot); 3433 + + 3434 + + event_dots[event_uid] = event_dot; 3435 + + 3436 + + event_grid.add (event_dot); 3437 + + } 3438 + + } 3439 + + 3440 + + public bool exist_event (string ical_uid) { 3441 + + return event_dots.has_key (ical_uid); 3442 + + } 3443 + + 3444 + + public void remove_dots (string event_uid) { 3445 + + var dot = event_dots[event_uid]; 3446 + + if (dot != null) { 3447 + + dot.destroy (); 3448 + + event_dots.unset (event_uid); 3449 + } 3450 + } 3451 + 3452 + 3453 + From c99db5e63b9c48aa1d069b97b98b0c07481de27d Mon Sep 17 00:00:00 2001 3454 + From: Dirli <litandrej85@gmail.com> 3455 + Date: Sat, 11 Apr 2020 23:44:14 +0300 3456 + Subject: [PATCH 4/8] rename calendar elements 3457 + 3458 + --- 3459 + meson.build | 4 +-- 3460 + .../{GridDay.vala => CalendarDay.vala} | 4 +-- 3461 + src/Widgets/{Grid.vala => CalendarGrid.vala} | 26 +++++++-------- 3462 + src/Widgets/CalendarView.vala | 33 +++++++++---------- 3463 + 4 files changed, 33 insertions(+), 34 deletions(-) 3464 + rename src/Widgets/{GridDay.vala => CalendarDay.vala} (98%) 3465 + rename src/Widgets/{Grid.vala => CalendarGrid.vala} (91%) 3466 + 3467 + diff --git a/meson.build b/meson.build 3468 + index e348e3d..dcdd9b2 100644 3469 + --- a/meson.build 3470 + +++ b/meson.build 3471 + @@ -44,11 +44,11 @@ shared_module( 3472 + 'src/Util/DateRange.vala', 3473 + 'src/Util/Util.vala', 3474 + 'src/Models/CalendarModel.vala', 3475 + + 'src/Widgets/CalendarDay.vala', 3476 + + 'src/Widgets/CalendarGrid.vala', 3477 + 'src/Widgets/CalendarView.vala', 3478 + 'src/Widgets/EventRow.vala', 3479 + 'src/Widgets/EventsListBox.vala', 3480 + - 'src/Widgets/Grid.vala', 3481 + - 'src/Widgets/GridDay.vala', 3482 + 'src/Widgets/PanelLabel.vala', 3483 + 'src/Services/EventsManager.vala', 3484 + 'src/Services/TimeManager.vala', 3485 + diff --git a/src/Widgets/GridDay.vala b/src/Widgets/CalendarDay.vala 3486 + similarity index 98% 3487 + rename from src/Widgets/GridDay.vala 3488 + rename to src/Widgets/CalendarDay.vala 3489 + index 00f82ea..a5ca920 100644 3490 + --- a/src/Widgets/GridDay.vala 3491 + +++ b/src/Widgets/CalendarDay.vala 3492 + @@ -23,7 +23,7 @@ namespace DateTimeIndicator { 3493 + /** 3494 + * Represents a single day on the grid. 3495 + */ 3496 + - public class Widgets.GridDay : Gtk.EventBox { 3497 + + public class Widgets.CalendarDay : Gtk.EventBox { 3498 + /* 3499 + * Event emitted when the day is double clicked or the ENTER key is pressed. 3500 + */ 3501 + @@ -41,7 +41,7 @@ namespace DateTimeIndicator { 3502 + private Gtk.Label label; 3503 + private bool valid_grab = false; 3504 + 3505 + - public GridDay (GLib.DateTime date) { 3506 + + public CalendarDay (GLib.DateTime date) { 3507 + Object (date: date); 3508 + } 3509 + 3510 + diff --git a/src/Widgets/Grid.vala b/src/Widgets/CalendarGrid.vala 3511 + similarity index 91% 3512 + rename from src/Widgets/Grid.vala 3513 + rename to src/Widgets/CalendarGrid.vala 3514 + index 660f212..66e2757 100644 3515 + --- a/src/Widgets/Grid.vala 3516 + +++ b/src/Widgets/CalendarGrid.vala 3517 + @@ -24,7 +24,7 @@ namespace DateTimeIndicator { 3518 + /** 3519 + * Represents the entire date grid as a table. 3520 + */ 3521 + - public class Widgets.Grid : Gtk.Grid { 3522 + + public class Widgets.CalendarGrid : Gtk.Grid { 3523 + public Util.DateRange grid_range { get; private set; } 3524 + 3525 + /* 3526 + @@ -34,8 +34,8 @@ namespace DateTimeIndicator { 3527 + 3528 + public signal void selection_changed (GLib.DateTime new_date); 3529 + 3530 + - private Gee.HashMap<uint, GridDay> data; 3531 + - private GridDay selected_gridday; 3532 + + private Gee.HashMap<uint, Widgets.CalendarDay> data; 3533 + + private Widgets.CalendarDay selected_gridday; 3534 + private Gtk.Label[] header_labels; 3535 + private Gtk.Revealer[] week_labels; 3536 + 3537 + @@ -61,12 +61,12 @@ namespace DateTimeIndicator { 3538 + 3539 + Indicator.settings.bind ("show-weeks", week_sep_revealer, "reveal-child", GLib.SettingsBindFlags.DEFAULT); 3540 + 3541 + - data = new Gee.HashMap<uint, GridDay> (); 3542 + + data = new Gee.HashMap<uint, Widgets.CalendarDay> (); 3543 + events |= Gdk.EventMask.SCROLL_MASK; 3544 + events |= Gdk.EventMask.SMOOTH_SCROLL_MASK; 3545 + } 3546 + 3547 + - private void on_day_focus_in (GridDay day) { 3548 + + private void on_day_focus_in (Widgets.CalendarDay day) { 3549 + debug ("on_day_focus_in %s", day.date.to_string ()); 3550 + if (selected_gridday != null) { 3551 + selected_gridday.set_selected (false); 3552 + @@ -94,7 +94,7 @@ namespace DateTimeIndicator { 3553 + Gee.List<GLib.DateTime> dates = grid_range.to_list (); 3554 + for (int i = 0; i < dates.size; i++) { 3555 + var date = dates[i]; 3556 + - GridDay? day = data[day_hash (date)]; 3557 + + Widgets.CalendarDay? day = data[day_hash (date)]; 3558 + if (day != null && day.name == "today") { 3559 + day.grab_focus_force (); 3560 + return; 3561 + @@ -119,7 +119,7 @@ namespace DateTimeIndicator { 3562 + 3563 + var new_dates = new_range.to_list (); 3564 + 3565 + - var data_new = new Gee.HashMap<uint, GridDay> (); 3566 + + var data_new = new Gee.HashMap<uint, Widgets.CalendarDay> (); 3567 + 3568 + /* Assert that a valid number of weeks should be displayed */ 3569 + assert (new_dates.size % 7 == 0); 3570 + @@ -138,7 +138,7 @@ namespace DateTimeIndicator { 3571 + 3572 + for (i = 0; i < new_dates.size; i++) { 3573 + var new_date = new_dates[i]; 3574 + - GridDay day; 3575 + + Widgets.CalendarDay day; 3576 + 3577 + if (i < old_dates.size) { 3578 + /* A widget already exists for this date, just change it */ 3579 + @@ -147,7 +147,7 @@ namespace DateTimeIndicator { 3580 + day = update_day (data[day_hash (old_date)], new_date, today, month_start); 3581 + } else { 3582 + /* Still update_day to get the color of etc. right */ 3583 + - day = update_day (new GridDay (new_date), new_date, today, month_start); 3584 + + day = update_day (new Widgets.CalendarDay (new_date), new_date, today, month_start); 3585 + day.on_event_add.connect ((date) => on_event_add (date)); 3586 + day.scroll_event.connect ((event) => { scroll_event (event); return false; }); 3587 + day.focus_in_event.connect ((event) => { 3588 + @@ -182,9 +182,9 @@ namespace DateTimeIndicator { 3589 + } 3590 + 3591 + /** 3592 + - * Updates the given GridDay so that it shows the given date. Changes to its style etc. 3593 + + * Updates the given CalendarDay so that it shows the given date. Changes to its style etc. 3594 + */ 3595 + - private GridDay update_day (GridDay day, GLib.DateTime new_date, GLib.DateTime today, GLib.DateTime month_start) { 3596 + + private Widgets.CalendarDay update_day (Widgets.CalendarDay day, GLib.DateTime new_date, GLib.DateTime today, GLib.DateTime month_start) { 3597 + update_today_style (day, new_date, today); 3598 + if (new_date.get_month () == month_start.get_month ()) { 3599 + day.sensitive_container (true); 3600 + @@ -237,13 +237,13 @@ namespace DateTimeIndicator { 3601 + int i = 0; 3602 + for (i = 0; i < dates.size; i++) { 3603 + var date = dates[i]; 3604 + - GridDay? day = data[day_hash (date)]; 3605 + + Widgets.CalendarDay? day = data[day_hash (date)]; 3606 + if (day == null) return; 3607 + update_today_style (day, date, today); 3608 + } 3609 + } 3610 + 3611 + - private void update_today_style (GridDay day, GLib.DateTime date, GLib.DateTime today) { 3612 + + private void update_today_style (Widgets.CalendarDay day, GLib.DateTime date, GLib.DateTime today) { 3613 + if (date.get_day_of_year () == today.get_day_of_year () && date.get_year () == today.get_year ()) { 3614 + day.name = "today"; 3615 + day.get_style_context ().add_class (Granite.STYLE_CLASS_ACCENT); 3616 + diff --git a/src/Widgets/CalendarView.vala b/src/Widgets/CalendarView.vala 3617 + index 070580f..db2139c 100644 3618 + --- a/src/Widgets/CalendarView.vala 3619 + +++ b/src/Widgets/CalendarView.vala 3620 + @@ -26,7 +26,7 @@ namespace DateTimeIndicator { 3621 + 3622 + public GLib.DateTime? selected_date { get; private set; } 3623 + 3624 + - private Widgets.Grid grid; 3625 + + private Widgets.CalendarGrid calendar_grid; 3626 + private Gtk.Stack stack; 3627 + private Gtk.Grid big_grid; 3628 + 3629 + @@ -105,20 +105,20 @@ namespace DateTimeIndicator { 3630 + } 3631 + 3632 + private Gtk.Grid create_big_grid () { 3633 + - grid = new Widgets.Grid (); 3634 + - grid.show_all (); 3635 + + calendar_grid = new Widgets.CalendarGrid (); 3636 + + calendar_grid.show_all (); 3637 + 3638 + - grid.on_event_add.connect ((date) => { 3639 + + calendar_grid.on_event_add.connect ((date) => { 3640 + show_date_in_maya (date); 3641 + day_double_click (); 3642 + }); 3643 + 3644 + - grid.selection_changed.connect ((date) => { 3645 + + calendar_grid.selection_changed.connect ((date) => { 3646 + selected_date = date; 3647 + selection_changed (date); 3648 + }); 3649 + 3650 + - return grid; 3651 + + return calendar_grid; 3652 + } 3653 + 3654 + public void show_today () { 3655 + @@ -131,7 +131,7 @@ namespace DateTimeIndicator { 3656 + } 3657 + sync_with_model (); 3658 + 3659 + - grid.set_focus_to_today (); 3660 + + calendar_grid.set_focus_to_today (); 3661 + } 3662 + 3663 + // TODO: As far as maya supports it use the Dbus Activation feature to run the calendar-app. 3664 + @@ -156,23 +156,23 @@ namespace DateTimeIndicator { 3665 + /* Sets the calendar widgets to the date range of the model */ 3666 + private void sync_with_model () { 3667 + var model = Models.CalendarModel.get_default (); 3668 + - if (grid.grid_range != null && (model.data_range.equals (grid.grid_range) || grid.grid_range.first_dt.compare (model.data_range.first_dt) == 0)) { 3669 + - grid.update_today (); 3670 + + if (calendar_grid.grid_range != null && (model.data_range.equals (calendar_grid.grid_range) || calendar_grid.grid_range.first_dt.compare (model.data_range.first_dt) == 0)) { 3671 + + calendar_grid.update_today (); 3672 + return; // nothing else to do 3673 + } 3674 + 3675 + GLib.DateTime previous_first = null; 3676 + - if (grid.grid_range != null) 3677 + - previous_first = grid.grid_range.first_dt; 3678 + + if (calendar_grid.grid_range != null) 3679 + + previous_first = calendar_grid.grid_range.first_dt; 3680 + 3681 + big_grid = create_big_grid (); 3682 + stack.add (big_grid); 3683 + 3684 + - grid.set_range (model.data_range, model.month_start); 3685 + - grid.update_weeks (model.data_range.first_dt, model.num_weeks); 3686 + + calendar_grid.set_range (model.data_range, model.month_start); 3687 + + calendar_grid.update_weeks (model.data_range.first_dt, model.num_weeks); 3688 + 3689 + if (previous_first != null) { 3690 + - if (previous_first.compare (grid.grid_range.first_dt) == -1) { 3691 + + if (previous_first.compare (calendar_grid.grid_range.first_dt) == -1) { 3692 + stack.transition_type = Gtk.StackTransitionType.SLIDE_LEFT; 3693 + } else { 3694 + stack.transition_type = Gtk.StackTransitionType.SLIDE_RIGHT; 3695 + @@ -183,12 +183,11 @@ namespace DateTimeIndicator { 3696 + } 3697 + 3698 + public void add_event_dots (E.Source source, Gee.Collection<ECal.Component> events) { 3699 + - grid.add_event_dots (source, events); 3700 + + calendar_grid.add_event_dots (source, events); 3701 + } 3702 + 3703 + - 3704 + public void remove_event_dots (E.Source source, Gee.Collection<ECal.Component> events) { 3705 + - grid.remove_event_dots (source, events); 3706 + + calendar_grid.remove_event_dots (source, events); 3707 + } 3708 + } 3709 + } 3710 + 3711 + From 6b1b15305a9c90ff8b7e7244727a225984d34a14 Mon Sep 17 00:00:00 2001 3712 + From: Dirli <litandrej85@gmail.com> 3713 + Date: Sun, 12 Apr 2020 03:10:24 +0300 3714 + Subject: [PATCH 5/8] evolution data server now optional 3715 + 3716 + --- 3717 + meson.build | 55 ++++++++++++++--------- 3718 + meson_options.txt | 1 + 3719 + src/Indicator.vala | 43 ++++++++++-------- 3720 + src/Util/Util.vala | 85 ++++++++++++++++------------------- 3721 + src/Widgets/CalendarDay.vala | 2 + 3722 + src/Widgets/CalendarGrid.vala | 2 + 3723 + src/Widgets/CalendarView.vala | 2 + 3724 + 7 files changed, 104 insertions(+), 86 deletions(-) 3725 + create mode 100644 meson_options.txt 3726 + 3727 + diff --git a/meson.build b/meson.build 3728 + index dcdd9b2..5fee9ab 100644 3729 + --- a/meson.build 3730 + +++ b/meson.build 3731 + @@ -24,18 +24,40 @@ gresource = gnome.compile_resources( 3732 + wingpanel_dep = dependency('wingpanel-2.0') 3733 + wingpanel_indicatorsdir = wingpanel_dep.get_pkgconfig_variable('indicatorsdir', define_variable: ['libdir', libdir]) 3734 + 3735 + +deps = [ 3736 + + dependency('glib-2.0'), 3737 + + dependency('gobject-2.0'), 3738 + + dependency('granite'), 3739 + + dependency('gtk+-3.0'), 3740 + + wingpanel_dep, 3741 + + meson.get_compiler('vala').find_library('posix') 3742 + +] 3743 + 3744 + -libecal_dep = dependency('libecal-2.0', required: false) 3745 + -if libecal_dep.found() 3746 + - libical_dep = dependency('libical-glib') 3747 + - add_project_arguments('--define=E_CAL_2_0', language: 'vala') 3748 + - add_project_arguments('-DLIBICAL_GLIB_UNSTABLE_API=1', language: 'c') 3749 + -else 3750 + - libecal_dep = dependency('libecal-1.2', version: '>=3.8.0') 3751 + - libical_dep = dependency('libical') 3752 + - add_project_arguments('--vapidir', join_paths(meson.current_source_dir(), 'vapi'), language: 'vala') 3753 + +opt_files = [] 3754 + + 3755 + +if get_option('evo') 3756 + + libecal_dep = dependency ('libecal-2.0', required: false) 3757 + + if libecal_dep.found() 3758 + + deps += dependency('libical-glib') 3759 + + deps += libecal_dep 3760 + + add_project_arguments('--define=E_CAL_2_0', language: 'vala') 3761 + + add_project_arguments('-DLIBICAL_GLIB_UNSTABLE_API=1', language: 'c') 3762 + + else 3763 + + deps += dependency('libecal-1.2', version: '>=3.8.0') 3764 + + deps += dependency('libical') 3765 + + add_project_arguments('--vapidir', join_paths(meson.current_source_dir(), 'vapi'), language: 'vala') 3766 + + endif 3767 + + 3768 + + deps += dependency ('libedataserver-1.2') 3769 + + opt_files += files ( 3770 + + 'src/Widgets/EventRow.vala', 3771 + + 'src/Widgets/EventsListBox.vala', 3772 + + 'src/Services/EventsManager.vala', 3773 + + ) 3774 + + add_project_arguments('--define=USE_EVO', language: 'vala') 3775 + endif 3776 + 3777 + + 3778 + shared_module( 3779 + meson.project_name(), 3780 + gresource, 3781 + @@ -47,21 +69,10 @@ shared_module( 3782 + 'src/Widgets/CalendarDay.vala', 3783 + 'src/Widgets/CalendarGrid.vala', 3784 + 'src/Widgets/CalendarView.vala', 3785 + - 'src/Widgets/EventRow.vala', 3786 + - 'src/Widgets/EventsListBox.vala', 3787 + 'src/Widgets/PanelLabel.vala', 3788 + - 'src/Services/EventsManager.vala', 3789 + 'src/Services/TimeManager.vala', 3790 + - dependencies: [ 3791 + - dependency('glib-2.0'), 3792 + - dependency('gobject-2.0'), 3793 + - dependency('granite'), 3794 + - dependency('gtk+-3.0'), 3795 + - libecal_dep, 3796 + - dependency('libedataserver-1.2'), 3797 + - libical_dep, 3798 + - wingpanel_dep, 3799 + - ], 3800 + + opt_files, 3801 + + dependencies: deps, 3802 + install: true, 3803 + install_dir : wingpanel_indicatorsdir, 3804 + ) 3805 + diff --git a/meson_options.txt b/meson_options.txt 3806 + new file mode 100644 3807 + index 0000000..a1c9f0e 3808 + --- /dev/null 3809 + +++ b/meson_options.txt 3810 + @@ -0,0 +1 @@ 3811 + +option ('evo', type : 'boolean', value : true) 3812 + diff --git a/src/Indicator.vala b/src/Indicator.vala 3813 + index bf4358f..31c7af5 100644 3814 + --- a/src/Indicator.vala 3815 + +++ b/src/Indicator.vala 3816 + @@ -23,9 +23,11 @@ namespace DateTimeIndicator { 3817 + 3818 + private Widgets.PanelLabel panel_label; 3819 + private Widgets.CalendarView calendar; 3820 + - private Widgets.EventsListBox event_listbox; 3821 + 3822 + +#if USE_EVO 3823 + + private Widgets.EventsListBox event_listbox; 3824 + private Services.EventsManager event_manager; 3825 + +#endif 3826 + 3827 + private Gtk.Grid main_grid; 3828 + private uint update_events_idle_source = 0; 3829 + @@ -60,7 +62,20 @@ namespace DateTimeIndicator { 3830 + if (main_grid == null) { 3831 + calendar = new Widgets.CalendarView (); 3832 + calendar.margin_bottom = 6; 3833 + + calendar.day_double_click.connect (() => { 3834 + + close (); 3835 + + }); 3836 + + 3837 + + var settings_button = new Gtk.ModelButton (); 3838 + + settings_button.text = _("Date & Time Settings…"); 3839 + 3840 + + main_grid = new Gtk.Grid (); 3841 + + main_grid.margin_top = 12; 3842 + + main_grid.attach (calendar, 0, 0); 3843 + + main_grid.attach (new Wingpanel.Widgets.Separator (), 0, 1); 3844 + + main_grid.attach (settings_button, 0, 2); 3845 + + 3846 + +#if USE_EVO 3847 + event_manager = new Services.EventsManager (); 3848 + event_manager.events_updated.connect (update_events_model); 3849 + event_manager.events_added.connect ((source, events) => { 3850 + @@ -73,20 +88,16 @@ namespace DateTimeIndicator { 3851 + }); 3852 + 3853 + event_listbox = new Widgets.EventsListBox (); 3854 + + event_listbox.row_activated.connect ((row) => { 3855 + + calendar.show_date_in_maya (((EventRow) row).date); 3856 + + close (); 3857 + + }); 3858 + 3859 + var scrolled_window = new Gtk.ScrolledWindow (null, null); 3860 + scrolled_window.hscrollbar_policy = Gtk.PolicyType.NEVER; 3861 + scrolled_window.vscrollbar_policy = Gtk.PolicyType.AUTOMATIC; 3862 + scrolled_window.add (event_listbox); 3863 + 3864 + - var settings_button = new Gtk.ModelButton (); 3865 + - settings_button.text = _("Date & Time Settings…"); 3866 + - 3867 + - main_grid = new Gtk.Grid (); 3868 + - main_grid.margin_top = 12; 3869 + - main_grid.attach (calendar, 0, 0); 3870 + - main_grid.attach (new Wingpanel.Widgets.Separator (), 0, 1); 3871 + - main_grid.attach (settings_button, 0, 2); 3872 + main_grid.attach (new Gtk.Separator (Gtk.Orientation.VERTICAL), 1, 0, 1, 3); 3873 + main_grid.attach (scrolled_window, 2, 0, 1, 3); 3874 + 3875 + @@ -94,23 +105,17 @@ namespace DateTimeIndicator { 3876 + size_group.add_widget (calendar); 3877 + size_group.add_widget (event_listbox); 3878 + 3879 + - calendar.day_double_click.connect (() => { 3880 + - close (); 3881 + - }); 3882 + - 3883 + calendar.selection_changed.connect ((date) => { 3884 + idle_update_events (); 3885 + }); 3886 + - 3887 + - event_listbox.row_activated.connect ((row) => { 3888 + - calendar.show_date_in_maya (((EventRow) row).date); 3889 + - close (); 3890 + - }); 3891 + +#endif 3892 + 3893 + var model = Models.CalendarModel.get_default (); 3894 + model.notify["month-start"].connect (() => { 3895 + model.compute_ranges (); 3896 + +#if USE_EVO 3897 + event_manager.load_all_sources (); 3898 + +#endif 3899 + }); 3900 + 3901 + settings_button.clicked.connect (() => { 3902 + @@ -125,6 +130,7 @@ namespace DateTimeIndicator { 3903 + return main_grid; 3904 + } 3905 + 3906 + +#if USE_EVO 3907 + private void update_events_model (E.Source source, Gee.Collection<ECal.Component> events) { 3908 + if (opened_widget) { 3909 + idle_update_events (); 3910 + @@ -143,6 +149,7 @@ namespace DateTimeIndicator { 3911 + return GLib.Source.REMOVE; 3912 + }); 3913 + } 3914 + +#endif 3915 + 3916 + public override void opened () { 3917 + calendar.show_today (); 3918 + diff --git a/src/Util/Util.vala b/src/Util/Util.vala 3919 + index b0bdf98..26b343a 100644 3920 + --- a/src/Util/Util.vala 3921 + +++ b/src/Util/Util.vala 3922 + @@ -32,38 +32,6 @@ namespace DateTimeIndicator.Util { 3923 + return datetime.add_full (0, 0, 0, -datetime.get_hour (), -datetime.get_minute (), -datetime.get_second ()); 3924 + } 3925 + 3926 + - /** 3927 + - * Converts the given ICal.Time to a DateTime. 3928 + - */ 3929 + - public TimeZone timezone_from_ical (ICal.Time date) { 3930 + - int is_daylight; 3931 + - var interval = date.get_timezone ().get_utc_offset (null, out is_daylight); 3932 + - bool is_positive = interval >= 0; 3933 + - interval = interval.abs (); 3934 + - var hours = (interval / 3600); 3935 + - var minutes = (interval % 3600) / 60; 3936 + - var hour_string = "%s%02d:%02d".printf (is_positive ? "+" : "-", hours, minutes); 3937 + - 3938 + - return new TimeZone (hour_string); 3939 + - } 3940 + - 3941 + - /** 3942 + - * Converts the given ICal.Time to a DateTime. 3943 + - * XXX : Track next versions of evolution in order to convert ICal.Timezone to GLib.TimeZone with a dedicated function… 3944 + - */ 3945 + - public GLib.DateTime ical_to_date_time (ICal.Time date) { 3946 + -#if E_CAL_2_0 3947 + - int year, month, day, hour, minute, second; 3948 + - date.get_date (out year, out month, out day); 3949 + - date.get_time (out hour, out minute, out second); 3950 + - return new GLib.DateTime (timezone_from_ical (date), year, month, 3951 + - day, hour, minute, second); 3952 + -#else 3953 + - return new GLib.DateTime (timezone_from_ical (date), date.year, date.month, 3954 + - date.day, date.hour, date.minute, date.second); 3955 + -#endif 3956 + - } 3957 + - 3958 + /** 3959 + * Say if an event lasts all day. 3960 + */ 3961 + @@ -78,6 +46,7 @@ namespace DateTimeIndicator.Util { 3962 + } 3963 + } 3964 + 3965 + +#if USE_EVO 3966 + private Gee.HashMap<string, Gtk.CssProvider>? providers; 3967 + public void set_event_calendar_color (E.SourceCalendar cal, Gtk.Widget widget) { 3968 + if (providers == null) { 3969 + @@ -104,6 +73,38 @@ namespace DateTimeIndicator.Util { 3970 + style_context.add_provider (providers[color], Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); 3971 + } 3972 + 3973 + + /** 3974 + + * Converts the given ICal.Time to a DateTime. 3975 + + */ 3976 + + public TimeZone timezone_from_ical (ICal.Time date) { 3977 + + int is_daylight; 3978 + + var interval = date.get_timezone ().get_utc_offset (null, out is_daylight); 3979 + + bool is_positive = interval >= 0; 3980 + + interval = interval.abs (); 3981 + + var hours = (interval / 3600); 3982 + + var minutes = (interval % 3600) / 60; 3983 + + var hour_string = "%s%02d:%02d".printf (is_positive ? "+" : "-", hours, minutes); 3984 + + 3985 + + return new TimeZone (hour_string); 3986 + + } 3987 + + 3988 + + /** 3989 + + * Converts the given ICal.Time to a DateTime. 3990 + + * XXX : Track next versions of evolution in order to convert ICal.Timezone to GLib.TimeZone with a dedicated function… 3991 + + */ 3992 + + public GLib.DateTime ical_to_date_time (ICal.Time date) { 3993 + +#if E_CAL_2_0 3994 + + int year, month, day, hour, minute, second; 3995 + + date.get_date (out year, out month, out day); 3996 + + date.get_time (out hour, out minute, out second); 3997 + + return new GLib.DateTime (timezone_from_ical (date), year, month, 3998 + + day, hour, minute, second); 3999 + +#else 4000 + + return new GLib.DateTime (timezone_from_ical (date), date.year, date.month, 4001 + + date.day, date.hour, date.minute, date.second); 4002 + +#endif 4003 + + } 4004 + + 4005 + /* 4006 + * Gee Utility Functions 4007 + */ 4008 + @@ -113,6 +114,11 @@ namespace DateTimeIndicator.Util { 4009 + return key.dup_uid (). hash (); 4010 + } 4011 + 4012 + + /* Returns true if 'a' and 'b' are the same E.Source */ 4013 + + public bool source_equal_func (E.Source a, E.Source b) { 4014 + + return a.dup_uid () == b.dup_uid (); 4015 + + } 4016 + + 4017 + /* Returns true if 'a' and 'b' are the same ECal.Component */ 4018 + public bool calcomponent_equal_func (ECal.Component a, ECal.Component b) { 4019 + return a.get_id ().equal (b.get_id ()); 4020 + @@ -178,18 +184,5 @@ namespace DateTimeIndicator.Util { 4021 + 4022 + return false; 4023 + } 4024 + - 4025 + - /* Returns true if 'a' and 'b' are the same E.Source */ 4026 + - public bool source_equal_func (E.Source a, E.Source b) { 4027 + - return a.dup_uid () == b.dup_uid (); 4028 + - } 4029 + - 4030 + - // public async void reset_timer () { 4031 + - // has_scrolled = true; 4032 + - // Timeout.add (500, () => { 4033 + - // has_scrolled = false; 4034 + - // 4035 + - // return false; 4036 + - // }); 4037 + - // } 4038 + +#endif 4039 + } 4040 + diff --git a/src/Widgets/CalendarDay.vala b/src/Widgets/CalendarDay.vala 4041 + index a5ca920..f9c742a 100644 4042 + --- a/src/Widgets/CalendarDay.vala 4043 + +++ b/src/Widgets/CalendarDay.vala 4044 + @@ -146,6 +146,7 @@ namespace DateTimeIndicator { 4045 + event_grid.show_all (); 4046 + } 4047 + 4048 + +#if USE_EVO 4049 + public void add_dots (E.Source source, ICal.Component ical) { 4050 + var event_uid = ical.get_uid (); 4051 + if (!event_dots.has_key (event_uid)) { 4052 + @@ -177,6 +178,7 @@ namespace DateTimeIndicator { 4053 + event_dots.unset (event_uid); 4054 + } 4055 + } 4056 + +#endif 4057 + 4058 + public void set_selected (bool selected) { 4059 + if (selected) { 4060 + diff --git a/src/Widgets/CalendarGrid.vala b/src/Widgets/CalendarGrid.vala 4061 + index 66e2757..1d1e06c 100644 4062 + --- a/src/Widgets/CalendarGrid.vala 4063 + +++ b/src/Widgets/CalendarGrid.vala 4064 + @@ -261,6 +261,7 @@ namespace DateTimeIndicator { 4065 + return date.get_year () * 10000 + date.get_month () * 100 + date.get_day_of_month (); 4066 + } 4067 + 4068 + +#if USE_EVO 4069 + public void add_event_dots (E.Source source, Gee.Collection<ECal.Component> events) { 4070 + data.foreach ((entry) => { 4071 + 4072 + @@ -292,5 +293,6 @@ namespace DateTimeIndicator { 4073 + }); 4074 + } 4075 + } 4076 + +#endif 4077 + } 4078 + } 4079 + diff --git a/src/Widgets/CalendarView.vala b/src/Widgets/CalendarView.vala 4080 + index db2139c..77c233c 100644 4081 + --- a/src/Widgets/CalendarView.vala 4082 + +++ b/src/Widgets/CalendarView.vala 4083 + @@ -182,6 +182,7 @@ namespace DateTimeIndicator { 4084 + stack.set_visible_child (big_grid); 4085 + } 4086 + 4087 + +#if USE_EVO 4088 + public void add_event_dots (E.Source source, Gee.Collection<ECal.Component> events) { 4089 + calendar_grid.add_event_dots (source, events); 4090 + } 4091 + @@ -189,5 +190,6 @@ namespace DateTimeIndicator { 4092 + public void remove_event_dots (E.Source source, Gee.Collection<ECal.Component> events) { 4093 + calendar_grid.remove_event_dots (source, events); 4094 + } 4095 + +#endif 4096 + } 4097 + } 4098 + 4099 + From 16715f5114c0597d6961880bf877f04414400334 Mon Sep 17 00:00:00 2001 4100 + From: Dirli <litandrej85@gmail.com> 4101 + Date: Mon, 13 Apr 2020 22:21:07 +0300 4102 + Subject: [PATCH 6/8] returned dots in the calendar 4103 + 4104 + --- 4105 + src/Indicator.vala | 6 ++-- 4106 + src/Services/EventsManager.vala | 28 +++++---------- 4107 + src/Widgets/CalendarDay.vala | 62 ++++++++++++++++++--------------- 4108 + src/Widgets/CalendarGrid.vala | 29 ++++++--------- 4109 + 4 files changed, 57 insertions(+), 68 deletions(-) 4110 + 4111 + diff --git a/src/Indicator.vala b/src/Indicator.vala 4112 + index 31c7af5..c7550aa 100644 4113 + --- a/src/Indicator.vala 4114 + +++ b/src/Indicator.vala 4115 + @@ -105,8 +105,10 @@ namespace DateTimeIndicator { 4116 + size_group.add_widget (calendar); 4117 + size_group.add_widget (event_listbox); 4118 + 4119 + - calendar.selection_changed.connect ((date) => { 4120 + - idle_update_events (); 4121 + + event_manager.open.begin ((obj, res) => { 4122 + + calendar.selection_changed.connect ((date) => { 4123 + + idle_update_events (); 4124 + + }); 4125 + }); 4126 + #endif 4127 + 4128 + diff --git a/src/Services/EventsManager.vala b/src/Services/EventsManager.vala 4129 + index d939777..ad0397d 100644 4130 + --- a/src/Services/EventsManager.vala 4131 + +++ b/src/Services/EventsManager.vala 4132 + @@ -10,33 +10,25 @@ namespace DateTimeIndicator { 4133 + private HashTable<string, ECal.Client> source_client; 4134 + private HashTable<string, ECal.ClientView> source_view; 4135 + 4136 + - public EventsManager () { 4137 + - 4138 + - } 4139 + - 4140 + construct { 4141 + source_client = new HashTable<string, ECal.Client> (str_hash, str_equal); 4142 + source_events = new HashTable<E.Source, Gee.TreeMultiMap<string, ECal.Component> > (Util.source_hash_func, Util.source_equal_func); 4143 + source_view = new HashTable<string, ECal.ClientView> (str_hash, str_equal); 4144 + - 4145 + - open.begin (); 4146 + } 4147 + 4148 + - private async void open () { 4149 + + public async void open () { 4150 + try { 4151 + registry = yield new E.SourceRegistry (null); 4152 + registry.source_removed.connect (remove_source); 4153 + - registry.source_added.connect ((source) => add_source_async.begin (source)); 4154 + + registry.source_added.connect (add_source); 4155 + 4156 + // Add sources 4157 + registry.list_sources (E.SOURCE_EXTENSION_CALENDAR).foreach ((source) => { 4158 + - E.SourceCalendar cal = (E.SourceCalendar)source.get_extension (E.SOURCE_EXTENSION_CALENDAR); 4159 + + E.SourceCalendar cal = (E.SourceCalendar) source.get_extension (E.SOURCE_EXTENSION_CALENDAR); 4160 + if (cal.selected == true && source.enabled == true) { 4161 + - add_source_async.begin (source); 4162 + + add_source (source); 4163 + } 4164 + }); 4165 + - 4166 + - load_all_sources (); 4167 + } catch (GLib.Error error) { 4168 + critical (error.message); 4169 + } 4170 + @@ -46,7 +38,7 @@ namespace DateTimeIndicator { 4171 + lock (source_client) { 4172 + foreach (var id in source_client.get_keys ()) { 4173 + var source = registry.ref_source (id); 4174 + - E.SourceCalendar cal = (E.SourceCalendar)source.get_extension (E.SOURCE_EXTENSION_CALENDAR); 4175 + + E.SourceCalendar cal = (E.SourceCalendar) source.get_extension (E.SOURCE_EXTENSION_CALENDAR); 4176 + 4177 + if (cal.selected == true && source.enabled == true) { 4178 + load_source (source); 4179 + @@ -120,7 +112,7 @@ namespace DateTimeIndicator { 4180 + }); 4181 + } 4182 + 4183 + - private async void add_source_async (E.Source source) { 4184 + + private void add_source (E.Source source) { 4185 + debug ("Adding source '%s'", source.dup_display_name ()); 4186 + try { 4187 + var client = (ECal.Client) ECal.Client.connect_sync (source, ECal.ClientSourceType.EVENTS, -1, null); 4188 + @@ -129,11 +121,7 @@ namespace DateTimeIndicator { 4189 + critical (e.message); 4190 + } 4191 + 4192 + - Idle.add (() => { 4193 + - load_source (source); 4194 + - 4195 + - return false; 4196 + - }); 4197 + + load_source (source); 4198 + } 4199 + 4200 + private void debug_event (E.Source source, ECal.Component event) { 4201 + @@ -177,6 +165,8 @@ namespace DateTimeIndicator { 4202 + return true; 4203 + }); 4204 + }); 4205 + + 4206 + + events_added (source, added_events.read_only_view); 4207 + } 4208 + 4209 + #if E_CAL_2_0 4210 + diff --git a/src/Widgets/CalendarDay.vala b/src/Widgets/CalendarDay.vala 4211 + index f9c742a..a2c4922 100644 4212 + --- a/src/Widgets/CalendarDay.vala 4213 + +++ b/src/Widgets/CalendarDay.vala 4214 + @@ -36,7 +36,8 @@ namespace DateTimeIndicator { 4215 + private static Gtk.CssProvider provider; 4216 + private static Models.CalendarModel model; 4217 + 4218 + - private Gee.HashMap<string, Gtk.Widget> event_dots; 4219 + + // private Gee.HashMap<string, Gtk.Widget> event_dots; 4220 + + private Gee.ArrayList<string> event_dots; 4221 + private Gtk.Grid event_grid; 4222 + private Gtk.Label label; 4223 + private bool valid_grab = false; 4224 + @@ -87,7 +88,8 @@ namespace DateTimeIndicator { 4225 + label.label = date.get_day_of_month ().to_string (); 4226 + }); 4227 + 4228 + - event_dots = new Gee.HashMap<string, Gtk.Widget> (); 4229 + + // event_dots = new Gee.HashMap<string, Gtk.Widget> (); 4230 + + event_dots = new Gee.ArrayList<string> (); 4231 + } 4232 + 4233 + public bool on_scroll_event (Gdk.EventScroll event) { 4234 + @@ -138,44 +140,46 @@ namespace DateTimeIndicator { 4235 + }); 4236 + } 4237 + 4238 + - public bool skip_day () { 4239 + - return event_dots.size >= 3 ? true : false; 4240 + - } 4241 + - 4242 + - public void show_event_grid () { 4243 + - event_grid.show_all (); 4244 + - } 4245 + - 4246 + #if USE_EVO 4247 + public void add_dots (E.Source source, ICal.Component ical) { 4248 + var event_uid = ical.get_uid (); 4249 + - if (!event_dots.has_key (event_uid)) { 4250 + - var event_dot = new Gtk. Image (); 4251 + - event_dot.gicon = new ThemedIcon ("pager-checked-symbolic"); 4252 + - event_dot.pixel_size = 6; 4253 + + if (event_dots.contains (event_uid)) { 4254 + + return; 4255 + + } 4256 + 4257 + - unowned Gtk.StyleContext style_context = event_dot.get_style_context (); 4258 + - style_context.add_class (Granite.STYLE_CLASS_ACCENT); 4259 + - style_context.add_provider (provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); 4260 + + event_dots.add (event_uid); 4261 + + if (event_dots.size > 3) { 4262 + + return; 4263 + + } 4264 + 4265 + - var source_calendar = (E.SourceCalendar?) source.get_extension (E.SOURCE_EXTENSION_CALENDAR); 4266 + - Util.set_event_calendar_color (source_calendar, event_dot); 4267 + + var event_dot = new Gtk.Image (); 4268 + + event_dot.gicon = new ThemedIcon ("pager-checked-symbolic"); 4269 + + event_dot.pixel_size = 6; 4270 + 4271 + - event_dots[event_uid] = event_dot; 4272 + + unowned Gtk.StyleContext style_context = event_dot.get_style_context (); 4273 + + style_context.add_class (Granite.STYLE_CLASS_ACCENT); 4274 + + style_context.add_provider (provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); 4275 + 4276 + - event_grid.add (event_dot); 4277 + - } 4278 + - } 4279 + + var source_calendar = (E.SourceCalendar?) source.get_extension (E.SOURCE_EXTENSION_CALENDAR); 4280 + + Util.set_event_calendar_color (source_calendar, event_dot); 4281 + 4282 + - public bool exist_event (string ical_uid) { 4283 + - return event_dots.has_key (ical_uid); 4284 + + event_grid.add (event_dot); 4285 + + event_dot.show (); 4286 + } 4287 + 4288 + public void remove_dots (string event_uid) { 4289 + - var dot = event_dots[event_uid]; 4290 + - if (dot != null) { 4291 + - dot.destroy (); 4292 + - event_dots.unset (event_uid); 4293 + + if (event_dots.contains (event_uid)) { 4294 + + return; 4295 + + } 4296 + + 4297 + + event_dots.remove (event_uid); 4298 + + if (event_dots.size >= 3) { 4299 + + return; 4300 + + } 4301 + + 4302 + + var w = event_grid.get_children (); 4303 + + if (w.length () > 0) { 4304 + + w.nth_data (0).destroy (); 4305 + } 4306 + } 4307 + #endif 4308 + diff --git a/src/Widgets/CalendarGrid.vala b/src/Widgets/CalendarGrid.vala 4309 + index 1d1e06c..c544404 100644 4310 + --- a/src/Widgets/CalendarGrid.vala 4311 + +++ b/src/Widgets/CalendarGrid.vala 4312 + @@ -263,22 +263,16 @@ namespace DateTimeIndicator { 4313 + 4314 + #if USE_EVO 4315 + public void add_event_dots (E.Source source, Gee.Collection<ECal.Component> events) { 4316 + - data.foreach ((entry) => { 4317 + - 4318 + - foreach (var component in events) { 4319 + - if (entry.value.skip_day ()) { 4320 + - return true; 4321 + - } 4322 + - 4323 + - if (Util.calcomp_is_on_day (component, entry.value.date)) { 4324 + - entry.value.add_dots (source, component.get_icalcomponent ()); 4325 + - } 4326 + + foreach (var component in events) { 4327 + + unowned ICal.Component? icomp = component.get_icalcomponent (); 4328 + + ICal.Time? start_time = icomp.get_dtstart (); 4329 + + time_t start_unix = start_time.as_timet (); 4330 + + var t = new DateTime.from_unix_utc (start_unix); 4331 + + var d_hash = day_hash (t); 4332 + + if (data.has_key (d_hash)) { 4333 + + data[d_hash].add_dots (source, component.get_icalcomponent ()); 4334 + } 4335 + - 4336 + - entry.value.show_event_grid (); 4337 + - 4338 + - return true; 4339 + - }); 4340 + + } 4341 + } 4342 + 4343 + public void remove_event_dots (E.Source source, Gee.Collection<ECal.Component> events) { 4344 + @@ -286,9 +280,8 @@ namespace DateTimeIndicator { 4345 + unowned ICal.Component ical = component.get_icalcomponent (); 4346 + var event_uid = ical.get_uid (); 4347 + data.foreach ((entry) => { 4348 + - if (entry.value.exist_event (event_uid)) { 4349 + - entry.value.remove_dots (event_uid); 4350 + - } 4351 + + entry.value.remove_dots (event_uid); 4352 + + 4353 + return true; 4354 + }); 4355 + } 4356 + 4357 + From 149da28659883b01ceb0773b35c018d31aa1d912 Mon Sep 17 00:00:00 2001 4358 + From: Dirli <litandrej85@gmail.com> 4359 + Date: Tue, 14 Apr 2020 00:16:01 +0300 4360 + Subject: [PATCH 7/8] issue #55 4361 + 4362 + --- 4363 + src/Services/EventsManager.vala | 2 ++ 4364 + src/Widgets/CalendarDay.vala | 2 +- 4365 + src/Widgets/CalendarGrid.vala | 11 +++++++---- 4366 + 3 files changed, 10 insertions(+), 5 deletions(-) 4367 + 4368 + diff --git a/src/Services/EventsManager.vala b/src/Services/EventsManager.vala 4369 + index ad0397d..959762f 100644 4370 + --- a/src/Services/EventsManager.vala 4371 + +++ b/src/Services/EventsManager.vala 4372 + @@ -208,6 +208,8 @@ namespace DateTimeIndicator { 4373 + removed_events.add (event); 4374 + debug_event (source, event); 4375 + } 4376 + + 4377 + + events.remove_all (cid.get_uid ()); 4378 + }); 4379 + 4380 + events_removed (source, removed_events.read_only_view); 4381 + diff --git a/src/Widgets/CalendarDay.vala b/src/Widgets/CalendarDay.vala 4382 + index a2c4922..10d088c 100644 4383 + --- a/src/Widgets/CalendarDay.vala 4384 + +++ b/src/Widgets/CalendarDay.vala 4385 + @@ -168,7 +168,7 @@ namespace DateTimeIndicator { 4386 + } 4387 + 4388 + public void remove_dots (string event_uid) { 4389 + - if (event_dots.contains (event_uid)) { 4390 + + if (!event_dots.contains (event_uid)) { 4391 + return; 4392 + } 4393 + 4394 + diff --git a/src/Widgets/CalendarGrid.vala b/src/Widgets/CalendarGrid.vala 4395 + index c544404..6e6cbdb 100644 4396 + --- a/src/Widgets/CalendarGrid.vala 4397 + +++ b/src/Widgets/CalendarGrid.vala 4398 + @@ -279,11 +279,14 @@ namespace DateTimeIndicator { 4399 + foreach (var component in events) { 4400 + unowned ICal.Component ical = component.get_icalcomponent (); 4401 + var event_uid = ical.get_uid (); 4402 + - data.foreach ((entry) => { 4403 + - entry.value.remove_dots (event_uid); 4404 + 4405 + - return true; 4406 + - }); 4407 + + ICal.Time? start_time = ical.get_dtstart (); 4408 + + time_t start_unix = start_time.as_timet (); 4409 + + var t = new DateTime.from_unix_utc (start_unix); 4410 + + var d_hash = day_hash (t); 4411 + + if (data.has_key (d_hash)) { 4412 + + data[d_hash].remove_dots (event_uid); 4413 + + } 4414 + } 4415 + } 4416 + #endif 4417 + 4418 + From a3910e2b8242b8c4837cc764da7f268a02d05d6e Mon Sep 17 00:00:00 2001 4419 + From: Dirli <litandrej85@gmail.com> 4420 + Date: Fri, 17 Apr 2020 00:52:53 +0300 4421 + Subject: [PATCH 8/8] issue #127 4422 + 4423 + --- 4424 + src/Indicator.vala | 1 + 4425 + src/Models/CalendarModel.vala | 17 ++++++--- 4426 + src/Services/EventsManager.vala | 17 +++++++++ 4427 + src/Widgets/CalendarDay.vala | 3 +- 4428 + src/Widgets/CalendarGrid.vala | 66 ++++++++++++++++++++++----------- 4429 + src/Widgets/CalendarView.vala | 17 ++++----- 4430 + src/Widgets/EventsListBox.vala | 6 ++- 4431 + 7 files changed, 87 insertions(+), 40 deletions(-) 4432 + 4433 + diff --git a/src/Indicator.vala b/src/Indicator.vala 4434 + index c7550aa..63614e0 100644 4435 + --- a/src/Indicator.vala 4436 + +++ b/src/Indicator.vala 4437 + @@ -116,6 +116,7 @@ namespace DateTimeIndicator { 4438 + model.notify["month-start"].connect (() => { 4439 + model.compute_ranges (); 4440 + #if USE_EVO 4441 + + event_listbox.clear_list (); 4442 + event_manager.load_all_sources (); 4443 + #endif 4444 + }); 4445 + diff --git a/src/Models/CalendarModel.vala b/src/Models/CalendarModel.vala 4446 + index d60a9ac..48b6e78 100644 4447 + --- a/src/Models/CalendarModel.vala 4448 + +++ b/src/Models/CalendarModel.vala 4449 + @@ -57,12 +57,17 @@ namespace DateTimeIndicator { 4450 + compute_ranges (); 4451 + } 4452 + 4453 + - public void change_month (int relative) { 4454 + - month_start = month_start.add_months (relative); 4455 + - } 4456 + - 4457 + - public void change_year (int relative) { 4458 + - month_start = month_start.add_years (relative); 4459 + + public void change_month (int m_relative, int y_relative = 0) { 4460 + + if (y_relative == 0) { 4461 + + month_start = month_start.add_months (m_relative); 4462 + + } else { 4463 + + if (m_relative == 0) { 4464 + + month_start = month_start.add_years (y_relative); 4465 + + } else { 4466 + + GLib.DateTime tmp_date = month_start.add_months (m_relative); 4467 + + month_start = tmp_date.add_years (y_relative); 4468 + + } 4469 + + } 4470 + } 4471 + 4472 + /* --- Helper Methods ---// */ 4473 + diff --git a/src/Services/EventsManager.vala b/src/Services/EventsManager.vala 4474 + index 959762f..6ece557 100644 4475 + --- a/src/Services/EventsManager.vala 4476 + +++ b/src/Services/EventsManager.vala 4477 + @@ -1,3 +1,20 @@ 4478 + +/* 4479 + + * Copyright (c) 2011-2020 elementary, Inc. (https://elementary.io) 4480 + + * 4481 + + * This program is free software; you can redistribute it and/or 4482 + + * modify it under the terms of the GNU General Public 4483 + + * License as published by the Free Software Foundation; either 4484 + + * version 3 of the License, or (at your option) any later version. 4485 + + * 4486 + + * This program is distributed in the hope that it will be useful, 4487 + + * but WITHOUT ANY WARRANTY; without even the implied warranty of 4488 + + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 4489 + + * General Public License for more details. 4490 + + * 4491 + + * You should have received a copy of the GNU General Public License 4492 + + * along with this program. If not, see <http://www.gnu.org/licenses/>. 4493 + + */ 4494 + + 4495 + namespace DateTimeIndicator { 4496 + public class Services.EventsManager : GLib.Object { 4497 + public signal void events_added (E.Source source, Gee.Collection<ECal.Component> events); 4498 + diff --git a/src/Widgets/CalendarDay.vala b/src/Widgets/CalendarDay.vala 4499 + index 10d088c..735fdc1 100644 4500 + --- a/src/Widgets/CalendarDay.vala 4501 + +++ b/src/Widgets/CalendarDay.vala 4502 + @@ -36,7 +36,6 @@ namespace DateTimeIndicator { 4503 + private static Gtk.CssProvider provider; 4504 + private static Models.CalendarModel model; 4505 + 4506 + - // private Gee.HashMap<string, Gtk.Widget> event_dots; 4507 + private Gee.ArrayList<string> event_dots; 4508 + private Gtk.Grid event_grid; 4509 + private Gtk.Label label; 4510 + @@ -105,7 +104,7 @@ namespace DateTimeIndicator { 4511 + 4512 + /* It's mouse scroll ! */ 4513 + if (choice == 1 || choice == -1) { 4514 + - Models.CalendarModel.get_default ().change_month ((int)choice); 4515 + + Models.CalendarModel.get_default ().change_month ((int) choice); 4516 + 4517 + return true; 4518 + } 4519 + diff --git a/src/Widgets/CalendarGrid.vala b/src/Widgets/CalendarGrid.vala 4520 + index 6e6cbdb..ef8edb6 100644 4521 + --- a/src/Widgets/CalendarGrid.vala 4522 + +++ b/src/Widgets/CalendarGrid.vala 4523 + @@ -32,7 +32,7 @@ namespace DateTimeIndicator { 4524 + */ 4525 + public signal void on_event_add (GLib.DateTime date); 4526 + 4527 + - public signal void selection_changed (GLib.DateTime new_date); 4528 + + public signal void selection_changed (GLib.DateTime new_date, bool up); 4529 + 4530 + private Gee.HashMap<uint, Widgets.CalendarDay> data; 4531 + private Widgets.CalendarDay selected_gridday; 4532 + @@ -66,25 +66,32 @@ namespace DateTimeIndicator { 4533 + events |= Gdk.EventMask.SMOOTH_SCROLL_MASK; 4534 + } 4535 + 4536 + - private void on_day_focus_in (Widgets.CalendarDay day) { 4537 + - debug ("on_day_focus_in %s", day.date.to_string ()); 4538 + + private bool on_day_focus_in (Gdk.EventFocus event) { 4539 + + var day = get_focus_child (); 4540 + + if (day == null) { 4541 + + return false; 4542 + + } 4543 + + 4544 + if (selected_gridday != null) { 4545 + selected_gridday.set_selected (false); 4546 + } 4547 + 4548 + - var selected_date = day.date; 4549 + - selected_gridday = day; 4550 + - day.set_selected (true); 4551 + + var selected_date = (day as Widgets.CalendarDay).date; 4552 + + selected_gridday = day as Widgets.CalendarDay; 4553 + + (day as Widgets.CalendarDay).set_selected (true); 4554 + day.set_state_flags (Gtk.StateFlags.FOCUSED, false); 4555 + - selection_changed (selected_date); 4556 + var calmodel = Models.CalendarModel.get_default (); 4557 + var date_month = selected_date.get_month () - calmodel.month_start.get_month (); 4558 + var date_year = selected_date.get_year () - calmodel.month_start.get_year (); 4559 + 4560 + if (date_month != 0 || date_year != 0) { 4561 + - calmodel.change_month (date_month); 4562 + - calmodel.change_year (date_year); 4563 + + selection_changed (selected_date, false); 4564 + + calmodel.change_month (date_month, date_year); 4565 + + } else { 4566 + + selection_changed (selected_date, true); 4567 + } 4568 + + 4569 + + return false; 4570 + } 4571 + 4572 + public void set_focus_to_today () { 4573 + @@ -106,7 +113,7 @@ namespace DateTimeIndicator { 4574 + * Sets the given range to be displayed in the grid. Note that the number of days 4575 + * must remain the same. 4576 + */ 4577 + - public void set_range (Util.DateRange new_range, GLib.DateTime month_start) { 4578 + + public void set_range (Util.DateRange new_range, GLib.DateTime month_start, GLib.DateTime? selected_date) { 4579 + var today = new GLib.DateTime.now_local (); 4580 + 4581 + Gee.List<GLib.DateTime> old_dates; 4582 + @@ -138,28 +145,46 @@ namespace DateTimeIndicator { 4583 + 4584 + for (i = 0; i < new_dates.size; i++) { 4585 + var new_date = new_dates[i]; 4586 + - Widgets.CalendarDay day; 4587 + + Widgets.CalendarDay? day = null; 4588 + 4589 + if (i < old_dates.size) { 4590 + /* A widget already exists for this date, just change it */ 4591 + 4592 + var old_date = old_dates[i]; 4593 + - day = update_day (data[day_hash (old_date)], new_date, today, month_start); 4594 + - } else { 4595 + + var d_hash = day_hash (old_date); 4596 + + if (data.has_key (d_hash)) { 4597 + + day = data[d_hash]; 4598 + + } 4599 + + } 4600 + + 4601 + + if (day == null) { 4602 + /* Still update_day to get the color of etc. right */ 4603 + - day = update_day (new Widgets.CalendarDay (new_date), new_date, today, month_start); 4604 + + day = new Widgets.CalendarDay (new_date); 4605 + day.on_event_add.connect ((date) => on_event_add (date)); 4606 + - day.scroll_event.connect ((event) => { scroll_event (event); return false; }); 4607 + - day.focus_in_event.connect ((event) => { 4608 + - on_day_focus_in (day); 4609 + - 4610 + + day.scroll_event.connect ((event) => { 4611 + + scroll_event (event); 4612 + return false; 4613 + }); 4614 + + day.focus_in_event.connect (on_day_focus_in); 4615 + 4616 + attach (day, col + 2, row); 4617 + day.show_all (); 4618 + } 4619 + 4620 + + update_day (day, new_date, month_start); 4621 + + update_today_style (day, new_date, today); 4622 + + if (selected_date != null && day.date.equal (selected_date)) { 4623 + + /* disabled the signal to avoid unnecessary signals and selected 4624 + + * the specified day from the new period */ 4625 + + debug (@"focus selected day $selected_date"); 4626 + + day.focus_in_event.disconnect (on_day_focus_in); 4627 + + day.grab_focus_force (); 4628 + + day.set_selected (true); 4629 + + day.set_state_flags (Gtk.StateFlags.FOCUSED, false); 4630 + + selected_gridday = day; 4631 + + day.focus_in_event.connect (on_day_focus_in); 4632 + + } 4633 + + 4634 + col = (col + 1) % 7; 4635 + row = (col == 0) ? row + 1 : row; 4636 + data_new.set (day_hash (new_date), day); 4637 + @@ -184,8 +209,7 @@ namespace DateTimeIndicator { 4638 + /** 4639 + * Updates the given CalendarDay so that it shows the given date. Changes to its style etc. 4640 + */ 4641 + - private Widgets.CalendarDay update_day (Widgets.CalendarDay day, GLib.DateTime new_date, GLib.DateTime today, GLib.DateTime month_start) { 4642 + - update_today_style (day, new_date, today); 4643 + + private void update_day (Widgets.CalendarDay day, GLib.DateTime new_date, GLib.DateTime month_start) { 4644 + if (new_date.get_month () == month_start.get_month ()) { 4645 + day.sensitive_container (true); 4646 + } else { 4647 + @@ -193,8 +217,6 @@ namespace DateTimeIndicator { 4648 + } 4649 + 4650 + day.date = new_date; 4651 + - 4652 + - return day; 4653 + } 4654 + 4655 + public void update_weeks (GLib.DateTime date, int nr_of_weeks) { 4656 + diff --git a/src/Widgets/CalendarView.vala b/src/Widgets/CalendarView.vala 4657 + index 77c233c..fe957ab 100644 4658 + --- a/src/Widgets/CalendarView.vala 4659 + +++ b/src/Widgets/CalendarView.vala 4660 + @@ -85,10 +85,7 @@ namespace DateTimeIndicator { 4661 + model.notify["data-range"].connect (() => { 4662 + label.label = model.month_start.format (_("%OB, %Y")); 4663 + 4664 + - sync_with_model (); 4665 + - 4666 + - selected_date = null; 4667 + - selection_changed (selected_date); 4668 + + sync_with_model (selected_date != null); 4669 + }); 4670 + 4671 + left_button.clicked.connect (() => { 4672 + @@ -113,9 +110,11 @@ namespace DateTimeIndicator { 4673 + day_double_click (); 4674 + }); 4675 + 4676 + - calendar_grid.selection_changed.connect ((date) => { 4677 + + calendar_grid.selection_changed.connect ((date, up) => { 4678 + selected_date = date; 4679 + - selection_changed (date); 4680 + + if (up) { 4681 + + selection_changed (date); 4682 + + } 4683 + }); 4684 + 4685 + return calendar_grid; 4686 + @@ -154,9 +153,9 @@ namespace DateTimeIndicator { 4687 + } 4688 + 4689 + /* Sets the calendar widgets to the date range of the model */ 4690 + - private void sync_with_model () { 4691 + + private void sync_with_model (bool show_selected = false) { 4692 + var model = Models.CalendarModel.get_default (); 4693 + - if (calendar_grid.grid_range != null && (model.data_range.equals (calendar_grid.grid_range) || calendar_grid.grid_range.first_dt.compare (model.data_range.first_dt) == 0)) { 4694 + + if (!show_selected && calendar_grid.grid_range != null && (model.data_range.equals (calendar_grid.grid_range) || calendar_grid.grid_range.first_dt.compare (model.data_range.first_dt) == 0)) { 4695 + calendar_grid.update_today (); 4696 + return; // nothing else to do 4697 + } 4698 + @@ -168,7 +167,7 @@ namespace DateTimeIndicator { 4699 + big_grid = create_big_grid (); 4700 + stack.add (big_grid); 4701 + 4702 + - calendar_grid.set_range (model.data_range, model.month_start); 4703 + + calendar_grid.set_range (model.data_range, model.month_start, show_selected ? selected_date : null); 4704 + calendar_grid.update_weeks (model.data_range.first_dt, model.num_weeks); 4705 + 4706 + if (previous_first != null) { 4707 + diff --git a/src/Widgets/EventsListBox.vala b/src/Widgets/EventsListBox.vala 4708 + index c25af2e..9022072 100644 4709 + --- a/src/Widgets/EventsListBox.vala 4710 + +++ b/src/Widgets/EventsListBox.vala 4711 + @@ -21,10 +21,14 @@ namespace DateTimeIndicator { 4712 + set_sort_func (sort_function); 4713 + } 4714 + 4715 + - public void update_events (GLib.DateTime? selected_date, HashTable<E.Source, Gee.TreeMultiMap<string, ECal.Component>> source_events) { 4716 + + public void clear_list () { 4717 + foreach (unowned Gtk.Widget widget in get_children ()) { 4718 + widget.destroy (); 4719 + } 4720 + + } 4721 + + 4722 + + public void update_events (GLib.DateTime? selected_date, HashTable<E.Source, Gee.TreeMultiMap<string, ECal.Component>> source_events) { 4723 + + clear_list (); 4724 + 4725 + if (selected_date == null) { 4726 + return;
+10 -1
pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/default.nix
··· 1 1 { stdenv 2 - , fetchFromGitHub 2 + , fetchFromGitHub 3 3 , pantheon 4 4 , pkgconfig 5 5 , meson ··· 27 27 rev = version; 28 28 sha256 = "0a0pqrpmrdd5pch30lizr9righlc7165z7krmnaxrzd0fvfkbr2h"; 29 29 }; 30 + 31 + patches = [ 32 + # https://github.com/elementary/wingpanel-indicator-datetime/pull/207 33 + # Fixes lots of issues despite being rejected upstream 34 + # https://github.com/elementary/wingpanel-indicator-datetime/issues/206 35 + # https://github.com/elementary/wingpanel-indicator-datetime/issues/55 36 + # https://github.com/elementary/wingpanel-indicator-datetime/issues/127 37 + ./207.patch 38 + ]; 30 39 31 40 passthru = { 32 41 updateScript = pantheon.updateScript {
+7
pkgs/desktops/pantheon/desktop/wingpanel/default.nix
··· 65 65 patchShebangs meson/post_install.py 66 66 ''; 67 67 68 + preFixup = '' 69 + gappsWrapperArgs+=( 70 + # this theme is required 71 + --prefix XDG_DATA_DIRS : "${elementary-gtk-theme}/share" 72 + ) 73 + ''; 74 + 68 75 meta = with stdenv.lib; { 69 76 description = "The extensible top panel for Pantheon"; 70 77 longDescription = ''
+7 -2
pkgs/development/libraries/gegl/4.0.nix
··· 46 46 }; 47 47 48 48 patches = [ 49 - # Remove gegl:simple / backend-file test that times out frequently 50 - ./patches/no-simple-backend-file-test.patch 49 + # Prevent deadlock making tests time-out 50 + # https://gitlab.gnome.org/GNOME/gegl/issues/226 51 + # https://gitlab.gnome.org/GNOME/glib/issues/1941 52 + (fetchpatch { 53 + url = "https://gitlab.gnome.org/GNOME/gegl/commit/1d530816266b52c8788bbe1504c5b2d6eceba036.patch"; 54 + sha256 = "8PlUcLQkuskjDGCA2obUPDW3jE++A6B5YWVgvn+GFrU="; 55 + }) 51 56 ]; 52 57 53 58 nativeBuildInputs = [
-10
pkgs/development/libraries/gegl/patches/no-simple-backend-file-test.patch
··· 1 - diff --git a/tests/simple/meson.build b/tests/simple/meson.build 2 - index 2c735d80a..ae4d50f2a 100644 3 - --- a/tests/simple/meson.build 4 - +++ b/tests/simple/meson.build 5 - @@ -1,5 +1,4 @@ 6 - testnames = [ 7 - - 'backend-file', 8 - 'buffer-cast', 9 - 'buffer-changes', 10 - 'buffer-extract',
+4 -4
pkgs/development/libraries/science/math/mkl/default.nix
··· 114 114 '') + '' 115 115 116 116 # Setup symlinks for blas / lapack 117 - ln -s $out/lib/libmkl_rt${stdenvNoCC.hostPlatform.extensions.sharedLibrary} $out/lib/libblas${stdenvNoCC.hostPlatform.extensions.sharedLibrary} 118 - ln -s $out/lib/libmkl_rt${stdenvNoCC.hostPlatform.extensions.sharedLibrary} $out/lib/libcblas${stdenvNoCC.hostPlatform.extensions.sharedLibrary} 119 - ln -s $out/lib/libmkl_rt${stdenvNoCC.hostPlatform.extensions.sharedLibrary} $out/lib/liblapack${stdenvNoCC.hostPlatform.extensions.sharedLibrary} 120 - ln -s $out/lib/libmkl_rt${stdenvNoCC.hostPlatform.extensions.sharedLibrary} $out/lib/liblapacke${stdenvNoCC.hostPlatform.extensions.sharedLibrary} 117 + ln -s $out/lib/libmkl_rt${stdenvNoCC.hostPlatform.extensions.sharedLibrary} $out/lib/libblas${stdenvNoCC.hostPlatform.extensions.sharedLibrary}${stdenvNoCC.lib.optionalString stdenvNoCC.hostPlatform.isLinux ".3"} 118 + ln -s $out/lib/libmkl_rt${stdenvNoCC.hostPlatform.extensions.sharedLibrary} $out/lib/libcblas${stdenvNoCC.hostPlatform.extensions.sharedLibrary}${stdenvNoCC.lib.optionalString stdenvNoCC.hostPlatform.isLinux ".3"} 119 + ln -s $out/lib/libmkl_rt${stdenvNoCC.hostPlatform.extensions.sharedLibrary} $out/lib/liblapack${stdenvNoCC.hostPlatform.extensions.sharedLibrary}${stdenvNoCC.lib.optionalString stdenvNoCC.hostPlatform.isLinux ".3"} 120 + ln -s $out/lib/libmkl_rt${stdenvNoCC.hostPlatform.extensions.sharedLibrary} $out/lib/liblapacke${stdenvNoCC.hostPlatform.extensions.sharedLibrary}${stdenvNoCC.lib.optionalString stdenvNoCC.hostPlatform.isLinux ".3"} 121 121 ''; 122 122 123 123 # fixDarwinDylibName fails for libmkl_cdft_core.dylib because the
+4 -4
pkgs/development/libraries/science/math/openblas/default.nix
··· 178 178 done 179 179 180 180 # Setup symlinks for blas / lapack 181 - ln -s $out/lib/libopenblas${stdenv.hostPlatform.extensions.sharedLibrary} $out/lib/libblas${stdenv.hostPlatform.extensions.sharedLibrary} 182 - ln -s $out/lib/libopenblas${stdenv.hostPlatform.extensions.sharedLibrary} $out/lib/libcblas${stdenv.hostPlatform.extensions.sharedLibrary} 183 - ln -s $out/lib/libopenblas${stdenv.hostPlatform.extensions.sharedLibrary} $out/lib/liblapack${stdenv.hostPlatform.extensions.sharedLibrary} 184 - ln -s $out/lib/libopenblas${stdenv.hostPlatform.extensions.sharedLibrary} $out/lib/liblapacke${stdenv.hostPlatform.extensions.sharedLibrary} 181 + ln -s $out/lib/libopenblas${stdenv.hostPlatform.extensions.sharedLibrary} $out/lib/libblas${stdenv.hostPlatform.extensions.sharedLibrary}${stdenv.lib.optionalString stdenv.hostPlatform.isLinux ".3"} 182 + ln -s $out/lib/libopenblas${stdenv.hostPlatform.extensions.sharedLibrary} $out/lib/libcblas${stdenv.hostPlatform.extensions.sharedLibrary}${stdenv.lib.optionalString stdenv.hostPlatform.isLinux ".3"} 183 + ln -s $out/lib/libopenblas${stdenv.hostPlatform.extensions.sharedLibrary} $out/lib/liblapack${stdenv.hostPlatform.extensions.sharedLibrary}${stdenv.lib.optionalString stdenv.hostPlatform.isLinux ".3"} 184 + ln -s $out/lib/libopenblas${stdenv.hostPlatform.extensions.sharedLibrary} $out/lib/liblapacke${stdenv.hostPlatform.extensions.sharedLibrary}${stdenv.lib.optionalString stdenv.hostPlatform.isLinux ".3"} 185 185 ''; 186 186 187 187 meta = with stdenv.lib; {
+1 -1
pkgs/development/python-modules/arrow/default.nix
··· 25 25 26 26 meta = with stdenv.lib; { 27 27 description = "Python library for date manipulation"; 28 - license = "apache"; 28 + license = licenses.asl20; 29 29 maintainers = with maintainers; [ thoughtpolice ]; 30 30 }; 31 31 }
+15 -3
pkgs/development/python-modules/caldav/default.nix
··· 1 - { lib, buildPythonPackage, fetchPypi 2 - , tzlocal, requests, vobject, lxml, nose }: 1 + { lib 2 + , buildPythonPackage 3 + , fetchPypi 4 + , tzlocal 5 + , requests 6 + , vobject 7 + , lxml 8 + , nose 9 + }: 3 10 4 11 buildPythonPackage rec { 5 12 pname = "caldav"; ··· 19 12 sha256 = "80c33b143539da3a471148ac89512f67d9df3a5286fae5a023e2ad3923246c0d"; 20 13 }; 21 14 15 + # xandikos is only a optional test dependency, not available for python3 16 + postPatch = '' 17 + substituteInPlace setup.py \ 18 + --replace ", 'xandikos'" "" 19 + ''; 20 + 22 21 meta = with lib; { 23 22 description = "This project is a CalDAV (RFC4791) client library for Python."; 24 23 homepage = "https://pythonhosted.org/caldav/"; 25 24 license = licenses.asl20; 26 25 maintainers = with maintainers; [ marenz ]; 27 - broken = true; # missing xandikos package 28 26 }; 29 27 }
+2
pkgs/development/python-modules/scipy/default.nix
··· 53 53 54 54 setupPyBuildFlags = [ "--fcompiler='gnu95'" ]; 55 55 56 + SCIPY_USE_G77_ABI_WRAPPER = 1; 57 + 56 58 meta = { 57 59 description = "SciPy (pronounced 'Sigh Pie') is open-source software for mathematics, science, and engineering. "; 58 60 homepage = "https://www.scipy.org/";
+3 -3
pkgs/development/tools/misc/texlab/default.nix
··· 6 6 7 7 rustPlatform.buildRustPackage rec { 8 8 pname = "texlab"; 9 - version = "1.10.0"; 9 + version = "2.0.0"; 10 10 11 11 src = fetchFromGitHub { 12 12 owner = "latex-lsp"; 13 13 repo = pname; 14 14 rev = "v${version}"; 15 - sha256 = "12zfcvbihirh38xxzc8fbx293m4vsrhq6kh0qnhnhlrx75m09l9i"; 15 + sha256 = "0y8cv8y92a4nqwrvqk2cxgs6nspqjk8jm4spr8rgkwlpfbrg74xn"; 16 16 }; 17 17 18 - cargoSha256 = "08fi0c4s0d1p2rqxvj1y82zg6xl3n0ikgyhgrjwh6xay8f0121f0"; 18 + cargoSha256 = "1qi1c4v5d5a4xcf1bjbdicrv35w6chl5swlm96c1h3pr9s09lqy7"; 19 19 20 20 buildInputs = stdenv.lib.optionals stdenv.isDarwin [ Security ]; 21 21
+2 -2
pkgs/games/enyo-doom/default.nix
··· 1 - { stdenv, fetchFromGitLab, cmake, qtbase }: 1 + { mkDerivation, stdenv, fetchFromGitLab, cmake, qtbase }: 2 2 3 - stdenv.mkDerivation rec { 3 + mkDerivation rec { 4 4 pname = "enyo-doom"; 5 5 version = "1.06.9"; 6 6
+2 -2
pkgs/games/pro-office-calculator/default.nix
··· 1 - { stdenv, fetchFromGitHub, tinyxml-2, cmake, qtbase, qtmultimedia }: 2 - stdenv.mkDerivation rec { 1 + { mkDerivation, stdenv, fetchFromGitHub, tinyxml-2, cmake, qtbase, qtmultimedia }: 2 + mkDerivation rec { 3 3 version = "1.0.13"; 4 4 pname = "pro-office-calculator"; 5 5
+2 -2
pkgs/misc/calaos/installer/default.nix
··· 1 - { stdenv, fetchFromGitHub, qmake, qttools, qtbase }: 1 + { mkDerivation, stdenv, fetchFromGitHub, qmake, qttools, qtbase }: 2 2 3 - stdenv.mkDerivation rec { 3 + mkDerivation rec { 4 4 name = "calaos_installer-3.1"; 5 5 version = "3.1"; 6 6
+2 -2
pkgs/misc/emulators/firebird-emu/default.nix
··· 1 - { stdenv, fetchFromGitHub, qmake, qtbase, qtdeclarative }: 1 + { mkDerivation, stdenv, fetchFromGitHub, qmake, qtbase, qtdeclarative }: 2 2 3 - stdenv.mkDerivation rec { 3 + mkDerivation rec { 4 4 pname = "firebird-emu"; 5 5 version = "1.4"; 6 6
+2 -2
pkgs/misc/emulators/yabause/default.nix
··· 1 - { stdenv, fetchurl, cmake, pkgconfig, qtbase, qt5, libGLU, libGL 1 + { mkDerivation, stdenv, fetchurl, cmake, pkgconfig, qtbase, qt5, libGLU, libGL 2 2 , freeglut ? null, openal ? null, SDL2 ? null }: 3 3 4 - stdenv.mkDerivation rec { 4 + mkDerivation rec { 5 5 pname = "yabause"; 6 6 version = "0.9.15"; 7 7
+3 -3
pkgs/misc/vim-plugins/overrides.nix
··· 57 57 }; 58 58 59 59 LanguageClient-neovim = let 60 - version = "0.1.156"; 60 + version = "0.1.157"; 61 61 LanguageClient-neovim-src = fetchurl { 62 62 url = "https://github.com/autozimu/LanguageClient-neovim/archive/${version}.tar.gz"; 63 - sha256 = "0bf2va6lpgw7wqpwpfidijbzphhvw48hyc2b529qv12vwgnd1shq"; 63 + sha256 = "1ccq5akkm8n612ni5g7w7v5gv73g7p1d9i92k0bnsy33fvi3pmnh"; 64 64 }; 65 65 LanguageClient-neovim-bin = rustPlatform.buildRustPackage { 66 66 name = "LanguageClient-neovim-bin"; 67 67 src = LanguageClient-neovim-src; 68 68 69 - cargoSha256 = "0w66fcrlaxf6zgkrfpgfybfbm759fzimnr3pjq6sm14frar7lhr6"; 69 + cargoSha256 = "0r3f7sixkvgfrw0j81bxj1jpam5si9dnivrw63s29cvjxrdbnmqz"; 70 70 buildInputs = stdenv.lib.optionals stdenv.isDarwin [ CoreServices ]; 71 71 72 72 # FIXME: Use impure version of CoreFoundation because of missing symbols.
+12 -12
pkgs/os-specific/linux/kernel/hardened-patches.json
··· 4 4 "url": "https://github.com/anthraxx/linux-hardened/releases/download/4.14.176.a/linux-hardened-4.14.176.a.patch", 5 5 "version_suffix": "a" 6 6 }, 7 - "4.19.116": { 8 - "sha256": "00y4i905gzs9w9kckrn1frh2vw32fsndz03g2psl1gk17snc3q7c", 9 - "url": "https://github.com/anthraxx/linux-hardened/releases/download/4.19.116.a/linux-hardened-4.19.116.a.patch", 7 + "4.19.117": { 8 + "sha256": "0c8dvh49nzypxwvsls10i896smvpdrk40x8ybljb3qk3r8j7niaw", 9 + "url": "https://github.com/anthraxx/linux-hardened/releases/download/4.19.117.a/linux-hardened-4.19.117.a.patch", 10 10 "version_suffix": "a" 11 11 }, 12 - "5.4.33": { 13 - "sha256": "1hjfvhyvz5kyvx25809brhsvfv9mjv9q1mw6ydb71gfwhw6q8d8b", 14 - "url": "https://github.com/anthraxx/linux-hardened/releases/download/5.4.33.a/linux-hardened-5.4.33.a.patch", 12 + "5.4.34": { 13 + "sha256": "1xwpqr9nzpjg837b3wnzb8fmrl2g9rz8gz5yb55vnnllbzbz36v6", 14 + "url": "https://github.com/anthraxx/linux-hardened/releases/download/5.4.34.a/linux-hardened-5.4.34.a.patch", 15 15 "version_suffix": "a" 16 16 }, 17 - "5.5.18": { 18 - "sha256": "0v7vla784sf1fk6d8qa5x8hkyhjb1jkw4lxxcgvvlqbmxl8md8ld", 19 - "url": "https://github.com/anthraxx/linux-hardened/releases/download/5.5.18.a/linux-hardened-5.5.18.a.patch", 17 + "5.5.19": { 18 + "sha256": "1ya5nsfhr3nwz6qiz4pdhvm6k9mx1kr0prhdvhx3p40f1vk281sc", 19 + "url": "https://github.com/anthraxx/linux-hardened/releases/download/5.5.19.a/linux-hardened-5.5.19.a.patch", 20 20 "version_suffix": "a" 21 21 }, 22 - "5.6.5": { 23 - "sha256": "19cdpygm5zx3szxl456lfjg5sffqcmn18470wv7prm8rf6liqdj3", 24 - "url": "https://github.com/anthraxx/linux-hardened/releases/download/5.6.5.a/linux-hardened-5.6.5.a.patch", 22 + "5.6.6": { 23 + "sha256": "0jiqh0frxirjbccgfdk007fca6r6n36n0pkqq4jszkckn59ayl7r", 24 + "url": "https://github.com/anthraxx/linux-hardened/releases/download/5.6.6.a/linux-hardened-5.6.6.a.patch", 25 25 "version_suffix": "a" 26 26 } 27 27 }
+2 -2
pkgs/os-specific/linux/kernel/linux-4.19.nix
··· 3 3 with stdenv.lib; 4 4 5 5 buildLinux (args // rec { 6 - version = "4.19.116"; 6 + version = "4.19.117"; 7 7 8 8 # modDirVersion needs to be x.y.z, will automatically add .0 if needed 9 9 modDirVersion = if (modDirVersionArg == null) then concatStringsSep "." (take 3 (splitVersion "${version}.0")) else modDirVersionArg; ··· 13 13 14 14 src = fetchurl { 15 15 url = "mirror://kernel/linux/kernel/v4.x/linux-${version}.tar.xz"; 16 - sha256 = "0r3vdc3npl1bn06w9v6wsq7d5mm7bnhm9wsz36pb9ar3xhimvrlf"; 16 + sha256 = "12xc1pwhwq4vp67hmn7hdynl4ik76cni79356hpzf1lbiqlrya6n"; 17 17 }; 18 18 } // (args.argsOverride or {}))
+2 -2
pkgs/os-specific/linux/kernel/linux-5.4.nix
··· 3 3 with stdenv.lib; 4 4 5 5 buildLinux (args // rec { 6 - version = "5.4.33"; 6 + version = "5.4.34"; 7 7 8 8 # modDirVersion needs to be x.y.z, will automatically add .0 if needed 9 9 modDirVersion = if (modDirVersionArg == null) then concatStringsSep "." (take 3 (splitVersion "${version}.0")) else modDirVersionArg; ··· 13 13 14 14 src = fetchurl { 15 15 url = "mirror://kernel/linux/kernel/v5.x/linux-${version}.tar.xz"; 16 - sha256 = "0q9q48ij6vppfcrdf7fr24pvpwsd13pxjkdni6rnjq9a60hrcmxm"; 16 + sha256 = "1ljcsrw9jknw2d9hb0yfr1pwy85l8z4rqycgd0kad9mb9lrw2glh"; 17 17 }; 18 18 } // (args.argsOverride or {}))
+2 -2
pkgs/os-specific/linux/kernel/linux-5.5.nix
··· 3 3 with stdenv.lib; 4 4 5 5 buildLinux (args // rec { 6 - version = "5.5.18"; 6 + version = "5.5.19"; 7 7 8 8 # modDirVersion needs to be x.y.z, will automatically add .0 if needed 9 9 modDirVersion = if (modDirVersionArg == null) then concatStringsSep "." (take 3 (splitVersion "${version}.0")) else modDirVersionArg; ··· 13 13 14 14 src = fetchurl { 15 15 url = "mirror://kernel/linux/kernel/v5.x/linux-${version}.tar.xz"; 16 - sha256 = "01iiiq4dsyyc5y6b52wax9as6dzhdi172vd1423sc1yp4rrk8178"; 16 + sha256 = "1sqiw9d25sqqzdh04dd722i7ff6kchj869jp4l8zalpvf51k6j0l"; 17 17 }; 18 18 } // (args.argsOverride or {}))
+2 -2
pkgs/os-specific/linux/kernel/linux-5.6.nix
··· 3 3 with stdenv.lib; 4 4 5 5 buildLinux (args // rec { 6 - version = "5.6.5"; 6 + version = "5.6.6"; 7 7 8 8 # modDirVersion needs to be x.y.z, will automatically add .0 if needed 9 9 modDirVersion = if (modDirVersionArg == null) then concatStringsSep "." (take 3 (splitVersion "${version}.0")) else modDirVersionArg; ··· 13 13 14 14 src = fetchurl { 15 15 url = "mirror://kernel/linux/kernel/v5.x/linux-${version}.tar.xz"; 16 - sha256 = "1rjjkcmzsj9azggh960qnk2x44ns475b8nbd4nxazrz1rgdx76zp"; 16 + sha256 = "1m3blvkma08v5y11jh0vhf4sr7jbcylkh15bssb5dgp40p8cx134"; 17 17 }; 18 18 } // (args.argsOverride or {}))
+2 -2
pkgs/os-specific/linux/kernel/linux-libre.nix
··· 1 1 { stdenv, lib, fetchsvn, linux 2 2 , scripts ? fetchsvn { 3 3 url = "https://www.fsfla.org/svn/fsfla/software/linux-libre/releases/branches/"; 4 - rev = "17402"; 5 - sha256 = "1g151h6hdiwpvpip1r2rhbma8j13xghcyxddh0ppg9h548wwwack"; 4 + rev = "17445"; 5 + sha256 = "0d2gd2w4pbb728a7mw9dnq3aicwpjzg8zahg80ismvc9l1sym50a"; 6 6 } 7 7 , ... 8 8 }:
+2 -2
pkgs/tools/admin/lxd/default.nix
··· 9 9 10 10 buildGoPackage rec { 11 11 pname = "lxd"; 12 - version = "4.0.0"; 12 + version = "4.0.1"; 13 13 14 14 goPackagePath = "github.com/lxc/lxd"; 15 15 16 16 src = fetchurl { 17 17 url = "https://github.com/lxc/lxd/releases/download/${pname}-${version}/${pname}-${version}.tar.gz"; 18 - sha256 = "00kydp6aysggng9a7m0q3zj3591yk6jgcibbqxx4ki20pd4vmqnb"; 18 + sha256 = "0sxkyjayn7yyiy9kvbdlpkl58lwsl2rhlxnncg628f2kad2zgkdx"; 19 19 }; 20 20 21 21 preBuild = ''
+2 -1
pkgs/tools/admin/pulumi/default.nix
··· 17 17 installPhase = '' 18 18 mkdir -p $out/bin 19 19 cp * $out/bin/ 20 + '' + optionalString stdenv.isLinux '' 20 21 wrapProgram $out/bin/pulumi --set LD_LIBRARY_PATH "${stdenv.cc.cc.lib}/lib" 21 22 ''; 22 23 23 - buildInputs = optionals stdenv.isLinux [ autoPatchelfHook makeWrapper ]; 24 + nativeBuildInputs = optionals stdenv.isLinux [ autoPatchelfHook makeWrapper ]; 24 25 25 26 meta = { 26 27 homepage = "https://pulumi.io/";
+3 -3
pkgs/tools/archivers/p7zip/default.nix
··· 1 - { stdenv, fetchurl }: 1 + { stdenv, fetchurl, lib, enableUnfree ? false }: 2 2 3 3 stdenv.mkDerivation rec { 4 4 pname = "p7zip"; ··· 24 24 substituteInPlace makefile.machine \ 25 25 --replace 'CC=gcc' 'CC=${stdenv.cc.targetPrefix}gcc' \ 26 26 --replace 'CXX=g++' 'CXX=${stdenv.cc.targetPrefix}g++' 27 - '' + '' 27 + '' + lib.optionalString (!enableUnfree) '' 28 28 # Remove non-free RAR source code 29 29 # (see DOC/License.txt, https://fedoraproject.org/wiki/Licensing:Unrar) 30 30 rm -r CPP/7zip/Compress/Rar* ··· 50 50 platforms = stdenv.lib.platforms.unix; 51 51 maintainers = [ stdenv.lib.maintainers.raskin ]; 52 52 # RAR code is under non-free UnRAR license, but we remove it 53 - license = stdenv.lib.licenses.lgpl2Plus; 53 + license = if enableUnfree then lib.licenses.unfree else lib.licenses.lgpl2Plus; 54 54 }; 55 55 }
+2 -2
pkgs/tools/backup/httrack/qt.nix
··· 1 - { stdenv, fetchurl, cmake, pkgconfig, makeWrapper 1 + { mkDerivation, stdenv, fetchurl, cmake, pkgconfig, makeWrapper 2 2 , httrack, qtbase, qtmultimedia }: 3 3 4 - stdenv.mkDerivation rec { 4 + mkDerivation rec { 5 5 pname = "httraqt"; 6 6 version = "1.4.9"; 7 7
+2 -2
pkgs/tools/backup/luckybackup/default.nix
··· 1 - { stdenv, fetchurl 1 + { mkDerivation, stdenv, fetchurl 2 2 , pkgconfig, libtool, qmake 3 3 , rsync, ssh 4 4 }: 5 5 6 6 with stdenv.lib; 7 - stdenv.mkDerivation rec { 7 + mkDerivation rec { 8 8 pname = "luckybackup"; 9 9 version = "0.5.0"; 10 10
+2 -2
pkgs/tools/graphics/rocket/default.nix
··· 1 - { stdenv, fetchFromGitHub, qmake, qtbase }: 1 + { mkDerivation, stdenv, fetchFromGitHub, qmake, qtbase }: 2 2 3 - stdenv.mkDerivation { 3 + mkDerivation { 4 4 pname = "rocket"; 5 5 version = "2018-06-09"; 6 6
+3 -3
pkgs/tools/misc/bat/default.nix
··· 4 4 5 5 rustPlatform.buildRustPackage rec { 6 6 pname = "bat"; 7 - version = "0.13.0"; 7 + version = "0.14.0"; 8 8 9 9 src = fetchFromGitHub { 10 10 owner = "sharkdp"; 11 11 repo = pname; 12 12 rev = "v${version}"; 13 - sha256 = "1kaa6ps6v1wk9qs63h116k4pbz7y9mfbfxfbq7g89yjhzkjmh6xc"; 13 + sha256 = "0wxmn3ifrgpfq44xs747qqik2p2vazdw5zi4imxqap2krha4k2ms"; 14 14 fetchSubmodules = true; 15 15 }; 16 16 17 - cargoSha256 = "01l1y124gjh6gf9z1jkbpfzh0w92hrgwvsmqkqdw3a9pa4w5f6yg"; 17 + cargoSha256 = "0bs6pqrg0vdam2h2ddikmgmksqlfjljqacc52rh6p546is6jcp2s"; 18 18 19 19 nativeBuildInputs = [ pkgconfig llvmPackages.libclang installShellFiles makeWrapper ]; 20 20
+2 -2
pkgs/tools/misc/colord-kde/default.nix
··· 1 - { stdenv, lib, fetchurl 1 + { mkDerivation, lib, fetchurl 2 2 , extra-cmake-modules, ki18n 3 3 , kconfig, kconfigwidgets, kcoreaddons, kdbusaddons, kiconthemes, kcmutils 4 4 , kio, knotifications, plasma-framework, kwidgetsaddons, kwindowsystem 5 5 , kitemviews, lcms2, libXrandr, qtx11extras 6 6 }: 7 7 8 - stdenv.mkDerivation rec { 8 + mkDerivation rec { 9 9 pname = "colord-kde"; 10 10 version = "0.5.0"; 11 11
+3
pkgs/tools/misc/vdirsyncer/default.nix
··· 53 53 echo 'Version: ${version}' >PKG-INFO 54 54 55 55 sed -i 's/spec.add_external_build(cmd=cmd/spec.add_external_build(cmd="true"/g' setup.py 56 + 57 + # fixing test 58 + sed -i "s/invalid value for \"--verbosity\"/invalid value for \\\'--verbosity\\\'/" tests/system/cli/test_sync.py 56 59 ''; 57 60 58 61 preBuild = ''
+2 -2
pkgs/tools/networking/babeld/default.nix
··· 2 2 3 3 stdenv.mkDerivation rec { 4 4 pname = "babeld"; 5 - version = "1.9.1"; 5 + version = "1.9.2"; 6 6 7 7 src = fetchurl { 8 8 url = "http://www.pps.univ-paris-diderot.fr/~jch/software/files/${pname}-${version}.tar.gz"; 9 - sha256 = "1d503igqv9s5pgrhvxp1czjy2xfsjhagyyh2iny7g4cjvl0kq6qy"; 9 + sha256 = "01vzhrspnm4sy9ggaz9n3bfl5hy3qlynr218j3mdcddzm3h00kqm"; 10 10 }; 11 11 12 12 preBuild = ''
+2 -2
pkgs/tools/package-management/nixpkgs-review/default.nix
··· 8 8 9 9 python3.pkgs.buildPythonApplication rec { 10 10 pname = "nixpkgs-review"; 11 - version = "2.2.0"; 11 + version = "2.3.0"; 12 12 13 13 src = fetchFromGitHub { 14 14 owner = "Mic92"; 15 15 repo = "nixpkgs-review"; 16 16 rev = version; 17 - sha256 = "0qsvrcxl97nih1yprydzlqc6n1ppg726664d6harx5kjzp5776mr"; 17 + sha256 = "0qkvjl4f8a1905yj3ml32rfdr5q76igz21gn3dcya0pfqhrnb28i"; 18 18 }; 19 19 20 20 makeWrapperArgs = [
+3 -3
pkgs/tools/security/jwt-cli/default.nix
··· 2 2 3 3 rustPlatform.buildRustPackage rec { 4 4 pname = "jwt-cli"; 5 - version = "3.0.1"; 5 + version = "3.1.0"; 6 6 7 7 src = fetchFromGitHub { 8 8 owner = "mike-engel"; 9 9 repo = pname; 10 10 rev = version; 11 - sha256 = "108pwk0h6zcbfmp0k8rhjxaa9yk8rhb78aaql22x48n11fnjl27i"; 11 + sha256 = "0pmxis3m3madwnmswz9hn0i8fz6a9bg11slgrrwql7mx23ijqf6y"; 12 12 }; 13 13 14 - cargoSha256 = "1xh2ylx5fqblhlrs8yhl3zf8kvgrqnwdwmix6yzch9bi5mv5c11w"; 14 + cargoSha256 = "165g1v0c8jxs8ddm8ld0hh7k8mvk3566ig43pf99hnw009fg1yc2"; 15 15 16 16 buildInputs = stdenv.lib.optional stdenv.isDarwin Security; 17 17
+15 -12
pkgs/tools/security/pcsc-cyberjack/default.nix
··· 1 1 { stdenv, fetchurl, autoreconfHook, pkgconfig, libusb1, pcsclite }: 2 2 3 - stdenv.mkDerivation rec { 4 - pname = "pcsc-cyberjack"; 5 - version = "3.99.5_SP13"; 3 + let 4 + version = "3.99.5"; 5 + suffix = "SP13"; 6 + tarBall = "${version}final.${suffix}"; 6 7 7 - src = with stdenv.lib; let 8 - splittedVer = splitString "_" version; 9 - mainVer = if length splittedVer >= 1 then head splittedVer else version; 10 - spVer = optionalString (length splittedVer >= 1) ("." + last splittedVer); 11 - tarballVersion = "${mainVer}final${spVer}"; 12 - in fetchurl { 13 - url = "http://support.reiner-sct.de/downloads/LINUX/V${version}" 14 - + "/pcsc-cyberjack_${tarballVersion}.tar.gz"; 8 + in stdenv.mkDerivation rec { 9 + pname = "pcsc-cyberjack"; 10 + inherit version; 11 + 12 + src = fetchurl { 13 + url = 14 + "http://support.reiner-sct.de/downloads/LINUX/V${version}_${suffix}/${pname}_${tarBall}.tar.gz"; 15 15 sha256 = "1lx4bfz4riz7j77sl65akyxzww0ygm63w0c1b75knr1pijlv8d3b"; 16 16 }; 17 17 18 18 outputs = [ "out" "tools" ]; 19 19 20 20 nativeBuildInputs = [ autoreconfHook pkgconfig ]; 21 + 21 22 buildInputs = [ libusb1 pcsclite ]; 23 + 24 + enableParallelBuilding = true; 22 25 23 26 configureFlags = [ 24 27 "--with-usbdropdir=${placeholder "out"}/pcsc/drivers" ··· 34 31 description = "REINER SCT cyberJack USB chipcard reader user space driver"; 35 32 homepage = "https://www.reiner-sct.com/"; 36 33 license = licenses.gpl2Plus; 37 - platforms = platforms.linux; 38 34 maintainers = with maintainers; [ aszlig ]; 35 + platforms = platforms.linux; 39 36 }; 40 37 }
+2 -2
pkgs/tools/text/glogg/default.nix
··· 1 - { stdenv, fetchurl, qmake, boost }: 1 + { mkDerivation, stdenv, fetchurl, qmake, boost }: 2 2 3 - stdenv.mkDerivation rec { 3 + mkDerivation rec { 4 4 5 5 pname = "glogg"; 6 6 version = "1.1.4";
+8
pkgs/tools/typesetting/tex/texlive/bin.nix
··· 76 76 url = "https://git.archlinux.org/svntogit/packages.git/plain/trunk/texlive-poppler-0.86.patch?h=packages/texlive-bin&id=60244e41bb6f1501e8ed1fc9e6b7ba8d3f283398"; 77 77 sha256 = "0pdvhaqc3zgz7hp0x3a4qs0nh26fkvgmr6w1cjljqhp1nyiw2f1l"; 78 78 }) 79 + 80 + # Needed for ghostscript>=9.50 81 + (fetchpatch { 82 + name = "xdvipdfm-fix.patch"; 83 + url = "https://www.tug.org/svn/texlive/trunk/Build/source/texk/dvipdfm-x/spc_dvips.c?view=patch&r1=52765&r2=52764&pathrev=52765"; 84 + sha256 = "0qvrc7yxhbl5f4g340z8aql388bwib0m2gxd473skbmviy5bjr3f"; 85 + stripLen = 2; 86 + }) 79 87 ]; 80 88 81 89 # remove when removing synctex-missing-header.patch
+2
pkgs/top-level/all-packages.nix
··· 920 920 921 921 libfx2 = with python3Packages; toPythonApplication fx2; 922 922 923 + fitnesstrax = callPackage ../applications/misc/fitnesstrax/default.nix { }; 924 + 923 925 fxlinuxprintutil = callPackage ../tools/misc/fxlinuxprintutil { }; 924 926 925 927 genymotion = callPackage ../development/mobile/genymotion { };