Compare commits
20 Commits
f96a642cf0
...
6ee7887bd2
Author | SHA1 | Date |
---|---|---|
Savanni D'Gerinel | 6ee7887bd2 | |
Savanni D'Gerinel | a584329d78 | |
Savanni D'Gerinel | 902b690d1a | |
Savanni D'Gerinel | c030b2d941 | |
Savanni D'Gerinel | 130b9f6c32 | |
Savanni D'Gerinel | 3f6f8c453b | |
Savanni D'Gerinel | f0ead7d422 | |
Savanni D'Gerinel | 4f01e1306e | |
Savanni D'Gerinel | ae22d2191c | |
Savanni D'Gerinel | 522f7eb65b | |
Savanni D'Gerinel | d601c8feeb | |
Savanni D'Gerinel | dfd755ed0a | |
Savanni D'Gerinel | 1f8a0215dc | |
Savanni D'Gerinel | 2857982b82 | |
Savanni D'Gerinel | d7108d0355 | |
Savanni D'Gerinel | cca1b9c3ba | |
Savanni D'Gerinel | a8d8210252 | |
Savanni D'Gerinel | 214463f6b4 | |
Savanni D'Gerinel | 411e0261fc | |
Savanni D'Gerinel | 12e9067c14 |
|
@ -2,6 +2,8 @@
|
||||||
name = "changeset"
|
name = "changeset"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
license = "GPL-3.0-only"
|
||||||
|
license-file = "../COPYING"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,15 @@
|
||||||
|
/*
|
||||||
|
Copyright 2023, Savanni D'Gerinel <savanni@luminescent-dreams.com>
|
||||||
|
|
||||||
|
This file is part of the Luminescent Dreams Tools.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with Lumeto. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
collections::{HashMap, HashSet},
|
collections::{HashMap, HashSet},
|
||||||
hash::Hash,
|
hash::Hash,
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
name = "coordinates"
|
name = "coordinates"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
license = "GPL-3.0-only"
|
||||||
|
license-file = "../COPYING"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,15 @@
|
||||||
|
/*
|
||||||
|
Copyright 2023, Savanni D'Gerinel <savanni@luminescent-dreams.com>
|
||||||
|
|
||||||
|
This file is part of the Luminescent Dreams Tools.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with Lumeto. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
use coordinates::hex_map;
|
use coordinates::hex_map;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,15 @@
|
||||||
|
/*
|
||||||
|
Copyright 2022-2023, Savanni D'Gerinel <savanni@luminescent-dreams.com>
|
||||||
|
|
||||||
|
This file is part of the Luminescent Dreams Tools.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with Lumeto. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
/// Ĉi-tiu modulo enhavas la elementojn por kub-koordinato.
|
/// Ĉi-tiu modulo enhavas la elementojn por kub-koordinato.
|
||||||
///
|
///
|
||||||
/// This code is based on https://www.redblobgames.com/grids/hexagons/
|
/// This code is based on https://www.redblobgames.com/grids/hexagons/
|
||||||
|
|
|
@ -3,7 +3,8 @@ name = "emseries"
|
||||||
version = "0.5.1"
|
version = "0.5.1"
|
||||||
authors = ["Savanni D'Gerinel <savanni@luminescent-dreams.com>"]
|
authors = ["Savanni D'Gerinel <savanni@luminescent-dreams.com>"]
|
||||||
description = "an Embedded Time Series database"
|
description = "an Embedded Time Series database"
|
||||||
license = "BSD-3-Clause"
|
license = "GPL-3.0-only"
|
||||||
|
license-file = "../COPYING"
|
||||||
documentation = "https://docs.rs/emseries"
|
documentation = "https://docs.rs/emseries"
|
||||||
homepage = "https://github.com/luminescent-dreams/emseries"
|
homepage = "https://github.com/luminescent-dreams/emseries"
|
||||||
repository = "https://github.com/luminescent-dreams/emseries"
|
repository = "https://github.com/luminescent-dreams/emseries"
|
||||||
|
|
|
@ -1,3 +1,15 @@
|
||||||
|
/*
|
||||||
|
Copyright 2020-2023, Savanni D'Gerinel <savanni@luminescent-dreams.com>
|
||||||
|
|
||||||
|
This file is part of the Luminescent Dreams Tools.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with Lumeto. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
use date_time_tz::DateTimeTz;
|
use date_time_tz::DateTimeTz;
|
||||||
use types::Recordable;
|
use types::Recordable;
|
||||||
|
|
||||||
|
@ -8,14 +20,12 @@ pub trait Criteria {
|
||||||
fn apply<T: Recordable>(&self, record: &T) -> bool;
|
fn apply<T: Recordable>(&self, record: &T) -> bool;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Specify two criteria that must both be matched.
|
/// Specify two criteria that must both be matched.
|
||||||
pub struct And<A: Criteria, B: Criteria> {
|
pub struct And<A: Criteria, B: Criteria> {
|
||||||
pub lside: A,
|
pub lside: A,
|
||||||
pub rside: B,
|
pub rside: B,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
impl<A, B> Criteria for And<A, B>
|
impl<A, B> Criteria for And<A, B>
|
||||||
where
|
where
|
||||||
A: Criteria,
|
A: Criteria,
|
||||||
|
@ -26,14 +36,12 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Specify two criteria, either of which may be matched.
|
/// Specify two criteria, either of which may be matched.
|
||||||
pub struct Or<A: Criteria, B: Criteria> {
|
pub struct Or<A: Criteria, B: Criteria> {
|
||||||
pub lside: A,
|
pub lside: A,
|
||||||
pub rside: B,
|
pub rside: B,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Specify the starting time for a search. This consists of a UTC timestamp and a specifier as to
|
/// Specify the starting time for a search. This consists of a UTC timestamp and a specifier as to
|
||||||
/// whether the exact time is included in the search criteria.
|
/// whether the exact time is included in the search criteria.
|
||||||
pub struct StartTime {
|
pub struct StartTime {
|
||||||
|
@ -41,7 +49,6 @@ pub struct StartTime {
|
||||||
pub incl: bool,
|
pub incl: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
impl Criteria for StartTime {
|
impl Criteria for StartTime {
|
||||||
fn apply<T: Recordable>(&self, record: &T) -> bool {
|
fn apply<T: Recordable>(&self, record: &T) -> bool {
|
||||||
if self.incl {
|
if self.incl {
|
||||||
|
@ -52,7 +59,6 @@ impl Criteria for StartTime {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Specify the ending time for a search. This consists of a UTC timestamp and a specifier as to
|
/// Specify the ending time for a search. This consists of a UTC timestamp and a specifier as to
|
||||||
/// whether the exact time is included in the search criteria.
|
/// whether the exact time is included in the search criteria.
|
||||||
pub struct EndTime {
|
pub struct EndTime {
|
||||||
|
@ -60,7 +66,6 @@ pub struct EndTime {
|
||||||
pub incl: bool,
|
pub incl: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
impl Criteria for EndTime {
|
impl Criteria for EndTime {
|
||||||
fn apply<T: Recordable>(&self, record: &T) -> bool {
|
fn apply<T: Recordable>(&self, record: &T) -> bool {
|
||||||
if self.incl {
|
if self.incl {
|
||||||
|
@ -71,7 +76,6 @@ impl Criteria for EndTime {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Specify a list of tags that must exist on the record.
|
/// Specify a list of tags that must exist on the record.
|
||||||
pub struct Tags {
|
pub struct Tags {
|
||||||
pub tags: Vec<String>,
|
pub tags: Vec<String>,
|
||||||
|
@ -80,13 +84,10 @@ pub struct Tags {
|
||||||
impl Criteria for Tags {
|
impl Criteria for Tags {
|
||||||
fn apply<T: Recordable>(&self, record: &T) -> bool {
|
fn apply<T: Recordable>(&self, record: &T) -> bool {
|
||||||
let record_tags = record.tags();
|
let record_tags = record.tags();
|
||||||
self.tags
|
self.tags.iter().all(|v| record_tags.contains(v))
|
||||||
.iter()
|
|
||||||
.all(|v| record_tags.contains(v))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Specify a criteria that searches for records matching an exact time.
|
/// Specify a criteria that searches for records matching an exact time.
|
||||||
pub fn exact_time(time: DateTimeTz) -> And<StartTime, EndTime> {
|
pub fn exact_time(time: DateTimeTz) -> And<StartTime, EndTime> {
|
||||||
And {
|
And {
|
||||||
|
@ -98,7 +99,6 @@ pub fn exact_time(time: DateTimeTz) -> And<StartTime, EndTime> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Specify a criteria that searches for all records within a time range.
|
/// Specify a criteria that searches for all records within a time range.
|
||||||
pub fn time_range(
|
pub fn time_range(
|
||||||
start: DateTimeTz,
|
start: DateTimeTz,
|
||||||
|
|
|
@ -1,3 +1,15 @@
|
||||||
|
/*
|
||||||
|
Copyright 2020-2023, Savanni D'Gerinel <savanni@luminescent-dreams.com>
|
||||||
|
|
||||||
|
This file is part of the Luminescent Dreams Tools.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with Lumeto. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
extern crate chrono;
|
extern crate chrono;
|
||||||
extern crate chrono_tz;
|
extern crate chrono_tz;
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,15 @@
|
||||||
|
/*
|
||||||
|
Copyright 2020-2023, Savanni D'Gerinel <savanni@luminescent-dreams.com>
|
||||||
|
|
||||||
|
This file is part of the Luminescent Dreams Tools.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with Lumeto. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
// NOTE: this module is a candidate for extraction into its own crate, or should be replaced with
|
// NOTE: this module is a candidate for extraction into its own crate, or should be replaced with
|
||||||
// an existing crate.
|
// an existing crate.
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,15 @@
|
||||||
|
/*
|
||||||
|
Copyright 2020-2023, Savanni D'Gerinel <savanni@luminescent-dreams.com>
|
||||||
|
|
||||||
|
This file is part of the Luminescent Dreams Tools.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with Lumeto. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
/*! An Embedded Time Series Database
|
/*! An Embedded Time Series Database
|
||||||
|
|
||||||
This library provides a low-intensity time series database meant to be embedded inside of an
|
This library provides a low-intensity time series database meant to be embedded inside of an
|
||||||
|
|
|
@ -1,3 +1,15 @@
|
||||||
|
/*
|
||||||
|
Copyright 2020-2023, Savanni D'Gerinel <savanni@luminescent-dreams.com>
|
||||||
|
|
||||||
|
This file is part of the Luminescent Dreams Tools.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with Lumeto. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
extern crate serde;
|
extern crate serde;
|
||||||
extern crate serde_json;
|
extern crate serde_json;
|
||||||
extern crate uuid;
|
extern crate uuid;
|
||||||
|
|
|
@ -1,3 +1,15 @@
|
||||||
|
/*
|
||||||
|
Copyright 2020-2023, Savanni D'Gerinel <savanni@luminescent-dreams.com>
|
||||||
|
|
||||||
|
This file is part of the Luminescent Dreams Tools.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with Lumeto. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
use date_time_tz::DateTimeTz;
|
use date_time_tz::DateTimeTz;
|
||||||
use serde::de::DeserializeOwned;
|
use serde::de::DeserializeOwned;
|
||||||
use serde::ser::Serialize;
|
use serde::ser::Serialize;
|
||||||
|
|
|
@ -1,3 +1,15 @@
|
||||||
|
/*
|
||||||
|
Copyright 2020-2023, Savanni D'Gerinel <savanni@luminescent-dreams.com>
|
||||||
|
|
||||||
|
This file is part of the Luminescent Dreams Tools.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with Lumeto. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
|
|
14
flake.lock
14
flake.lock
|
@ -17,11 +17,11 @@
|
||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1675237434,
|
"lastModified": 1675918889,
|
||||||
"narHash": "sha256-YoFR0vyEa1HXufLNIFgOGhIFMRnY6aZ0IepZF5cYemo=",
|
"narHash": "sha256-hy7re4F9AEQqwZxubct7jBRos6md26bmxnCjxf5utJA=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "285b3ff0660640575186a4086e1f8dc0df2874b5",
|
"rev": "49efda9011e8cdcd6c1aad30384cb1dc230c82fe",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -52,7 +52,7 @@
|
||||||
"nixpkgs": "nixpkgs_2"
|
"nixpkgs": "nixpkgs_2"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"narHash": "sha256-SQNtt71uT++7F3+kHOZ9PEThswk0MnEt6zO2xJdUo/o=",
|
"narHash": "sha256-0eO3S+2gLODqDoloufeC99PfQ5mthuN9JADzqFXid1Y=",
|
||||||
"type": "tarball",
|
"type": "tarball",
|
||||||
"url": "https://github.com/oxalica/rust-overlay/archive/master.tar.gz"
|
"url": "https://github.com/oxalica/rust-overlay/archive/master.tar.gz"
|
||||||
},
|
},
|
||||||
|
@ -70,11 +70,11 @@
|
||||||
},
|
},
|
||||||
"unstable": {
|
"unstable": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1675183161,
|
"lastModified": 1675942811,
|
||||||
"narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
|
"narHash": "sha256-/v4Z9mJmADTpXrdIlAjFa1e+gkpIIROR670UVDQFwIw=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
|
"rev": "724bfc0892363087709bd3a5a1666296759154b1",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
|
@ -26,14 +26,15 @@
|
||||||
name = "ld-tools-devshell";
|
name = "ld-tools-devshell";
|
||||||
buildInputs = [
|
buildInputs = [
|
||||||
pkgs.clang
|
pkgs.clang
|
||||||
pkgs.dbus
|
|
||||||
pkgs.entr
|
pkgs.entr
|
||||||
|
pkgs.glade
|
||||||
pkgs.glib
|
pkgs.glib
|
||||||
pkgs.gst_all_1.gst-plugins-bad
|
pkgs.gst_all_1.gst-plugins-bad
|
||||||
pkgs.gst_all_1.gst-plugins-base
|
pkgs.gst_all_1.gst-plugins-base
|
||||||
pkgs.gst_all_1.gst-plugins-good
|
pkgs.gst_all_1.gst-plugins-good
|
||||||
pkgs.gst_all_1.gst-plugins-ugly
|
pkgs.gst_all_1.gst-plugins-ugly
|
||||||
pkgs.gst_all_1.gstreamer
|
pkgs.gst_all_1.gstreamer
|
||||||
|
pkgs.gtk4
|
||||||
pkgs.nodejs
|
pkgs.nodejs
|
||||||
pkgs.openssl
|
pkgs.openssl
|
||||||
pkgs.pipewire
|
pkgs.pipewire
|
||||||
|
|
|
@ -4,7 +4,8 @@ authors = ["Savanni D'Gerinel <savanni@luminescent-dreams.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
version = "0.2.0"
|
version = "0.2.0"
|
||||||
description = "An ergonomics wrapper around Fluent-RS"
|
description = "An ergonomics wrapper around Fluent-RS"
|
||||||
license = "AGPL-3.0-or-later"
|
license = "GPL-3.0-only"
|
||||||
|
license-file = "../COPYING"
|
||||||
homepage = "https://github.com/luminescent-dreams/fluent-ergonomics"
|
homepage = "https://github.com/luminescent-dreams/fluent-ergonomics"
|
||||||
repository = "https://github.com/luminescent-dreams/fluent-ergonomics"
|
repository = "https://github.com/luminescent-dreams/fluent-ergonomics"
|
||||||
categories = ["internationalization"]
|
categories = ["internationalization"]
|
||||||
|
|
|
@ -1,3 +1,15 @@
|
||||||
|
/*
|
||||||
|
Copyright 2020-2023, Savanni D'Gerinel <savanni@luminescent-dreams.com>
|
||||||
|
|
||||||
|
This file is part of the Luminescent Dreams Tools.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with Lumeto. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
//! Provide a more ergonomic interface to the base Fluent library
|
//! Provide a more ergonomic interface to the base Fluent library
|
||||||
//!
|
//!
|
||||||
//! The Fluent class makes it easier to load translation bundles with language fallbacks and to go
|
//! The Fluent class makes it easier to load translation bundles with language fallbacks and to go
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,19 @@
|
||||||
|
[package]
|
||||||
|
name = "hex-grid"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
license = "GPL-3.0-only"
|
||||||
|
license-file = "../COPYING"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
cairo-rs = "0.16"
|
||||||
|
gio = "0.16"
|
||||||
|
glib = "0.16"
|
||||||
|
gtk = { version = "0.5", package = "gtk4" }
|
||||||
|
coordinates = { path = "../coordinates" }
|
||||||
|
image = { version = "0.24" }
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
glib-build-tools = "0.16"
|
|
@ -0,0 +1,7 @@
|
||||||
|
fn main() {
|
||||||
|
glib_build_tools::compile_resources(
|
||||||
|
"resources",
|
||||||
|
"resources/resources.gresources.xml",
|
||||||
|
"com.luminescent-dreams.hex-grid.gresource",
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,99 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<interface>
|
||||||
|
<template class="HexGridWindow" parent="GtkApplicationWindow">
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="spacing">8</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkDrawingArea" id="drawing_area">
|
||||||
|
<property name="width-request">1024</property>
|
||||||
|
<property name="height-request">768</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="margin-start">8</property>
|
||||||
|
<property name="margin-end">8</property>
|
||||||
|
<property name="margin-top">8</property>
|
||||||
|
<property name="margin-bottom">8</property>
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="width-request">100</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="margin-start">4</property>
|
||||||
|
<property name="margin-end">4</property>
|
||||||
|
<property name="margin-top">4</property>
|
||||||
|
<property name="margin-bottom">4</property>
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
<property name="spacing">8</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
<property name="spacing">8</property>
|
||||||
|
<property name="homogeneous">True</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="label" translatable="yes">Canvas Address</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="canvas_address">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="margin-start">4</property>
|
||||||
|
<property name="margin-end">4</property>
|
||||||
|
<property name="margin-top">4</property>
|
||||||
|
<property name="margin-bottom">4</property>
|
||||||
|
<property name="label" translatable="yes">-----</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
<property name="spacing">8</property>
|
||||||
|
<property name="homogeneous">True</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="label" translatable="yes">Hexagon Address</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="hex_address">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="margin-start">4</property>
|
||||||
|
<property name="margin-end">4</property>
|
||||||
|
<property name="margin-top">4</property>
|
||||||
|
<property name="margin-bottom">4</property>
|
||||||
|
<property name="label" translatable="yes">-----</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<placeholder/>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<placeholder/>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</template>
|
||||||
|
</interface>
|
|
@ -0,0 +1,37 @@
|
||||||
|
[0, 0] m
|
||||||
|
[-3, 2] sw
|
||||||
|
[1, -2] g
|
||||||
|
[0, 3] g
|
||||||
|
[2, 1] g
|
||||||
|
[0, -2] g
|
||||||
|
[-1, 0] g
|
||||||
|
[-2, 2] g
|
||||||
|
[3, -3] sw
|
||||||
|
[1, 2] g
|
||||||
|
[1, 1] d
|
||||||
|
[2, -2] b
|
||||||
|
[-3, 0] sw
|
||||||
|
[-2, 0] g
|
||||||
|
[2, -3] sw
|
||||||
|
[-1, -1] g
|
||||||
|
[-2, 3] sw
|
||||||
|
[1, -3] sw
|
||||||
|
[-3, 3] sw
|
||||||
|
[-1, 1] g
|
||||||
|
[1, 0] g
|
||||||
|
[0, 1] g
|
||||||
|
[-1, 2] s
|
||||||
|
[1, -1] g
|
||||||
|
[2, -1] g
|
||||||
|
[0, -3] sw
|
||||||
|
[0, 2] g
|
||||||
|
[3, 0] sw
|
||||||
|
[-1, 3] sw
|
||||||
|
[0, -1] g
|
||||||
|
[3, -1] sw
|
||||||
|
[-3, 1] sw
|
||||||
|
[2, 0] g
|
||||||
|
[-2, 1] g
|
||||||
|
[3, -2] sw
|
||||||
|
[-1, -2] sw
|
||||||
|
[-2, -1] dw
|
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<gresources>
|
||||||
|
<gresource prefix="/com/luminescent-dreams/hex-grid/">
|
||||||
|
<file>main.glade</file>
|
||||||
|
<file>terrain.ppm</file>
|
||||||
|
<file>map.txt</file>
|
||||||
|
</gresource>
|
||||||
|
</gresources>
|
Binary file not shown.
|
@ -0,0 +1,345 @@
|
||||||
|
/*
|
||||||
|
Copyright 2023, Savanni D'Gerinel <savanni@luminescent-dreams.com>
|
||||||
|
|
||||||
|
This file is part of the Luminescent Dreams Tools.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with Lumeto. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
use cairo::{Context, Path};
|
||||||
|
use coordinates::{hex_map::parse_data, AxialAddr};
|
||||||
|
use gio::resources_lookup_data;
|
||||||
|
use glib::{subclass::InitializingObject, Object};
|
||||||
|
use gtk::{
|
||||||
|
gdk_pixbuf::Pixbuf, gio, prelude::*, subclass::prelude::*, Application, CompositeTemplate,
|
||||||
|
DrawingArea, Label,
|
||||||
|
};
|
||||||
|
use image::io::Reader as ImageReader;
|
||||||
|
use std::{cell::RefCell, io::Cursor, rc::Rc};
|
||||||
|
|
||||||
|
const APP_ID: &'static str = "com.luminescent-dreams.hex-grid";
|
||||||
|
const HEX_RADIUS: f64 = 50.;
|
||||||
|
const MAP_RADIUS: usize = 3;
|
||||||
|
const DRAWING_ORIGIN: (f64, f64) = (1024. / 2., 768. / 2.);
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
enum Tile {
|
||||||
|
Empty,
|
||||||
|
Mountain,
|
||||||
|
Grasslands,
|
||||||
|
ShallowWater,
|
||||||
|
DeepWater,
|
||||||
|
Badlands,
|
||||||
|
Desert,
|
||||||
|
Swamp,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Tile {
|
||||||
|
fn color(&self) -> (f64, f64, f64) {
|
||||||
|
match self {
|
||||||
|
Self::Empty => (0., 0., 0.),
|
||||||
|
Self::Mountain => (0.5, 0.5, 0.5),
|
||||||
|
Self::Grasslands => (0., 1., 0.),
|
||||||
|
Self::ShallowWater => (0.5, 0.5, 1.),
|
||||||
|
Self::DeepWater => (0., 0., 1.),
|
||||||
|
Self::Badlands => (0.5, 0.25, 0.),
|
||||||
|
Self::Desert => (1., 1., 0.),
|
||||||
|
Self::Swamp => (0., 0.25, 0.),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for Tile {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::Empty
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<&str> for Tile {
|
||||||
|
fn from(s: &str) -> Self {
|
||||||
|
match s {
|
||||||
|
"m" => Self::Mountain,
|
||||||
|
"g" => Self::Grasslands,
|
||||||
|
"sw" => Self::ShallowWater,
|
||||||
|
"dw" => Self::DeepWater,
|
||||||
|
"b" => Self::Badlands,
|
||||||
|
"d" => Self::Desert,
|
||||||
|
"s" => Self::Swamp,
|
||||||
|
_ => Self::Empty,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<String> for Tile {
|
||||||
|
fn from(s: String) -> Self {
|
||||||
|
Self::from(s.as_ref())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
gio::resources_register_include!("com.luminescent-dreams.hex-grid.gresource")
|
||||||
|
.expect("Failed to register resources");
|
||||||
|
|
||||||
|
let app = Application::builder().application_id(APP_ID).build();
|
||||||
|
|
||||||
|
app.connect_activate(|app| {
|
||||||
|
let window = HexGridWindow::new(app);
|
||||||
|
window.present();
|
||||||
|
});
|
||||||
|
|
||||||
|
app.run();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(CompositeTemplate, Default)]
|
||||||
|
#[template(resource = "/com/luminescent-dreams/hex-grid/main.glade")]
|
||||||
|
pub struct HexGridWindowPrivate {
|
||||||
|
#[template_child]
|
||||||
|
pub drawing_area: TemplateChild<DrawingArea>,
|
||||||
|
#[template_child]
|
||||||
|
pub hex_address: TemplateChild<Label>,
|
||||||
|
#[template_child]
|
||||||
|
pub canvas_address: TemplateChild<Label>,
|
||||||
|
|
||||||
|
current_coordinate: Rc<RefCell<Option<AxialAddr>>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[glib::object_subclass]
|
||||||
|
impl ObjectSubclass for HexGridWindowPrivate {
|
||||||
|
const NAME: &'static str = "HexGridWindow";
|
||||||
|
type Type = HexGridWindow;
|
||||||
|
type ParentType = gtk::ApplicationWindow;
|
||||||
|
|
||||||
|
fn class_init(c: &mut Self::Class) {
|
||||||
|
c.bind_template();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn instance_init(obj: &InitializingObject<Self>) {
|
||||||
|
obj.init_template();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ObjectImpl for HexGridWindowPrivate {
|
||||||
|
fn constructed(&self) {
|
||||||
|
self.parent_constructed();
|
||||||
|
|
||||||
|
let map_text_resource = resources_lookup_data(
|
||||||
|
"/com/luminescent-dreams/hex-grid/map.txt",
|
||||||
|
gio::ResourceLookupFlags::NONE,
|
||||||
|
)
|
||||||
|
.expect("map should be in the bundle")
|
||||||
|
.to_vec();
|
||||||
|
|
||||||
|
let hex_map = parse_data::<Tile>(String::from_utf8(map_text_resource).unwrap().lines());
|
||||||
|
|
||||||
|
let terrain_data = resources_lookup_data(
|
||||||
|
"/com/luminescent-dreams/hex-grid/terrain.ppm",
|
||||||
|
gio::ResourceLookupFlags::NONE,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
let reader = ImageReader::new(Cursor::new(terrain_data))
|
||||||
|
.with_guessed_format()
|
||||||
|
.unwrap();
|
||||||
|
let image = reader.decode().unwrap();
|
||||||
|
|
||||||
|
let image_deep_water = pixbuf_from_image_tile(image.clone().crop(0, 0, 100, 88));
|
||||||
|
let image_shallow_water = pixbuf_from_image_tile(image.clone().crop(100, 0, 100, 88));
|
||||||
|
let image_grasslands = pixbuf_from_image_tile(image.clone().crop(200, 0, 100, 88));
|
||||||
|
let image_desert = pixbuf_from_image_tile(image.clone().crop(300, 0, 100, 88));
|
||||||
|
let image_mountain = pixbuf_from_image_tile(image.clone().crop(0, 88, 100, 88));
|
||||||
|
let image_badlands = pixbuf_from_image_tile(image.clone().crop(100, 88, 100, 88));
|
||||||
|
let image_swamp = pixbuf_from_image_tile(image.clone().crop(0, 176, 100, 88));
|
||||||
|
|
||||||
|
/*
|
||||||
|
let image_pb = Pixbuf::from_bytes(
|
||||||
|
&glib::Bytes::from(image.as_bytes()),
|
||||||
|
gtk::gdk_pixbuf::Colorspace::Rgb,
|
||||||
|
false,
|
||||||
|
8,
|
||||||
|
image.width() as i32,
|
||||||
|
image.height() as i32,
|
||||||
|
image.to_rgb8().sample_layout().height_stride as i32,
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
|
||||||
|
let motion_controller = gtk::EventControllerMotion::new();
|
||||||
|
{
|
||||||
|
let canvas_address = self.canvas_address.clone();
|
||||||
|
let hex_address = self.hex_address.clone();
|
||||||
|
let c = self.current_coordinate.clone();
|
||||||
|
motion_controller.connect_motion(move |_, x, y| {
|
||||||
|
let norm_x = x - DRAWING_ORIGIN.0;
|
||||||
|
let norm_y = y - DRAWING_ORIGIN.1;
|
||||||
|
let q = (2. / 3. * norm_x) / HEX_RADIUS;
|
||||||
|
let r = (-1. / 3. * norm_x + (3. as f64).sqrt() / 3. * norm_y) / HEX_RADIUS;
|
||||||
|
|
||||||
|
let (q, r) = axial_round(q, r);
|
||||||
|
let coordinate = AxialAddr::new(q, r);
|
||||||
|
canvas_address.set_label(&format!("{:.0} {:.0}", x, y));
|
||||||
|
|
||||||
|
if coordinate.distance(&AxialAddr::origin()) > MAP_RADIUS {
|
||||||
|
hex_address.set_label(&format!("-----"));
|
||||||
|
*c.borrow_mut() = None;
|
||||||
|
} else {
|
||||||
|
hex_address.set_label(&format!("{:.0} {:.0}", coordinate.q(), coordinate.r()));
|
||||||
|
*c.borrow_mut() = Some(coordinate);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
self.drawing_area.set_draw_func(move |_, context, _, _| {
|
||||||
|
context.set_source_rgb(0., 0., 0.);
|
||||||
|
let _ = context.paint();
|
||||||
|
|
||||||
|
context.set_line_width(2.);
|
||||||
|
|
||||||
|
let clip_path = hexagon_path(context, 100., 88.);
|
||||||
|
context.set_source_pixbuf(&image_deep_water, 0., 0.);
|
||||||
|
context.append_path(&clip_path);
|
||||||
|
context.clip();
|
||||||
|
context.paint().expect("paint should succeed");
|
||||||
|
|
||||||
|
context.set_source_pixbuf(&image_shallow_water, 150., 0.);
|
||||||
|
context.paint().expect("paint should succeed");
|
||||||
|
|
||||||
|
context.set_source_pixbuf(&image_grasslands, 300., 0.);
|
||||||
|
context.paint().expect("paint should succeed");
|
||||||
|
|
||||||
|
context.set_source_pixbuf(&image_desert, 450., 0.);
|
||||||
|
context.paint().expect("paint should succeed");
|
||||||
|
|
||||||
|
context.set_source_pixbuf(&image_mountain, 0., 100.);
|
||||||
|
context.paint().expect("paint should succeed");
|
||||||
|
|
||||||
|
context.set_source_pixbuf(&image_badlands, 150., 100.);
|
||||||
|
context.paint().expect("paint should succeed");
|
||||||
|
|
||||||
|
context.set_source_pixbuf(&image_swamp, 0., 200.);
|
||||||
|
context.paint().expect("paint should succeed");
|
||||||
|
/*
|
||||||
|
for coordinate in vec![AxialAddr::origin()]
|
||||||
|
.into_iter()
|
||||||
|
.chain(AxialAddr::origin().addresses(MAP_RADIUS))
|
||||||
|
{
|
||||||
|
let center_x =
|
||||||
|
DRAWING_ORIGIN.0 + HEX_RADIUS * (3. / 2. * (coordinate.q() as f64));
|
||||||
|
let center_y = DRAWING_ORIGIN.1
|
||||||
|
+ HEX_RADIUS
|
||||||
|
* ((3. as f64).sqrt() / 2. * (coordinate.q() as f64)
|
||||||
|
+ (3. as f64).sqrt() * (coordinate.r() as f64));
|
||||||
|
|
||||||
|
let tile = hex_map.get(&coordinate).unwrap();
|
||||||
|
let color = tile.color();
|
||||||
|
context.set_source_rgb(color.0, color.1, color.2);
|
||||||
|
|
||||||
|
draw_hexagon(context, center_x, center_y, HEX_RADIUS);
|
||||||
|
let _ = context.fill();
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
});
|
||||||
|
}
|
||||||
|
self.drawing_area.add_controller(&motion_controller);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl WidgetImpl for HexGridWindowPrivate {}
|
||||||
|
impl WindowImpl for HexGridWindowPrivate {}
|
||||||
|
impl ApplicationWindowImpl for HexGridWindowPrivate {}
|
||||||
|
|
||||||
|
glib::wrapper! {
|
||||||
|
pub struct HexGridWindow(ObjectSubclass<HexGridWindowPrivate>) @extends gtk::ApplicationWindow, gtk::Window, gtk::Widget,
|
||||||
|
@implements gtk::Accessible, gtk::Actionable, gtk::Buildable, gtk::ConstraintTarget;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl HexGridWindow {
|
||||||
|
pub fn new(app: &Application) -> Self {
|
||||||
|
Object::builder().property("application", app).build()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn draw_hexagon(context: &Context, center_x: f64, center_y: f64, radius: f64) {
|
||||||
|
let ul_x = center_x - radius;
|
||||||
|
let ul_y = center_y - (3. as f64).sqrt() * radius / 2.;
|
||||||
|
let points: Vec<(f64, f64)> = hexagon(radius * 2., (3. as f64).sqrt() * radius);
|
||||||
|
context.new_path();
|
||||||
|
context.move_to(ul_x + points[0].0, ul_y + points[0].1);
|
||||||
|
context.line_to(ul_x + points[1].0, ul_y + points[1].1);
|
||||||
|
context.line_to(ul_x + points[2].0, ul_y + points[2].1);
|
||||||
|
context.line_to(ul_x + points[3].0, ul_y + points[3].1);
|
||||||
|
context.line_to(ul_x + points[4].0, ul_y + points[4].1);
|
||||||
|
context.line_to(ul_x + points[5].0, ul_y + points[5].1);
|
||||||
|
context.close_path();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn hexagon_path(context: &Context, width: f64, height: f64) -> Path {
|
||||||
|
context.new_path();
|
||||||
|
let points = hexagon(width, height);
|
||||||
|
context.move_to(points[0].0, points[0].1);
|
||||||
|
context.line_to(points[1].0, points[1].1);
|
||||||
|
context.line_to(points[2].0, points[2].1);
|
||||||
|
context.line_to(points[3].0, points[3].1);
|
||||||
|
context.line_to(points[4].0, points[4].1);
|
||||||
|
context.line_to(points[5].0, points[5].1);
|
||||||
|
context.copy_path().expect("to successfully copy a path")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn hexagon(width: f64, height: f64) -> Vec<(f64, f64)> {
|
||||||
|
let center_x = width / 2.;
|
||||||
|
let center_y = height / 2.;
|
||||||
|
let radius = width / 2.;
|
||||||
|
|
||||||
|
vec![
|
||||||
|
(center_x + radius, center_y),
|
||||||
|
(
|
||||||
|
center_x + radius / 2.,
|
||||||
|
center_y + (3. as f64).sqrt() * radius / 2.,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
center_x - radius / 2.,
|
||||||
|
center_y + (3. as f64).sqrt() * radius / 2.,
|
||||||
|
),
|
||||||
|
(center_x - radius, center_y),
|
||||||
|
(
|
||||||
|
center_x - radius / 2.,
|
||||||
|
center_y - (3. as f64).sqrt() * radius / 2.,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
center_x + radius / 2.,
|
||||||
|
center_y - (3. as f64).sqrt() * radius / 2.,
|
||||||
|
),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn axial_round(q_f64: f64, r_f64: f64) -> (i32, i32) {
|
||||||
|
let s_f64 = -q_f64 - r_f64;
|
||||||
|
let mut q = q_f64.round();
|
||||||
|
let mut r = r_f64.round();
|
||||||
|
let s = s_f64.round();
|
||||||
|
|
||||||
|
let q_diff = (q - q_f64).abs();
|
||||||
|
let r_diff = (r - r_f64).abs();
|
||||||
|
let s_diff = (s - s_f64).abs();
|
||||||
|
|
||||||
|
if q_diff > r_diff && q_diff > s_diff {
|
||||||
|
q = -r - s;
|
||||||
|
} else if r_diff > s_diff {
|
||||||
|
r = -q - s;
|
||||||
|
}
|
||||||
|
unsafe { (q.to_int_unchecked::<i32>(), r.to_int_unchecked::<i32>()) }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn pixbuf_from_image_tile(image: image::DynamicImage) -> Pixbuf {
|
||||||
|
Pixbuf::from_bytes(
|
||||||
|
&glib::Bytes::from(image.as_bytes()),
|
||||||
|
gtk::gdk_pixbuf::Colorspace::Rgb,
|
||||||
|
false,
|
||||||
|
8,
|
||||||
|
image.width() as i32,
|
||||||
|
image.height() as i32,
|
||||||
|
image.to_rgb8().sample_layout().height_stride as i32,
|
||||||
|
)
|
||||||
|
}
|
|
@ -6,6 +6,8 @@ authors = ["Savanni D'Gerinel <savanni@luminescent-dreams.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
keywords = ["date", "time", "calendar"]
|
keywords = ["date", "time", "calendar"]
|
||||||
categories = ["date-and-time"]
|
categories = ["date-and-time"]
|
||||||
|
license = "GPL-3.0-only"
|
||||||
|
license-file = "../COPYING"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
chrono = "0.4"
|
chrono = "0.4"
|
||||||
|
|
|
@ -1,3 +1,15 @@
|
||||||
|
/*
|
||||||
|
Copyright 2020-2023, Savanni D'Gerinel <savanni@luminescent-dreams.com>
|
||||||
|
|
||||||
|
This file is part of the Luminescent Dreams Tools.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with Lumeto. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
extern crate chrono;
|
extern crate chrono;
|
||||||
extern crate chrono_tz;
|
extern crate chrono_tz;
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,15 @@
|
||||||
|
/*
|
||||||
|
Copyright 2020-2023, Savanni D'Gerinel <savanni@luminescent-dreams.com>
|
||||||
|
|
||||||
|
This file is part of the Luminescent Dreams Tools.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with Lumeto. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
extern crate chrono;
|
extern crate chrono;
|
||||||
extern crate chrono_tz;
|
extern crate chrono_tz;
|
||||||
extern crate international_fixed_calendar as IFC;
|
extern crate international_fixed_calendar as IFC;
|
||||||
|
|
|
@ -1,3 +1,15 @@
|
||||||
|
/*
|
||||||
|
Copyright 2020-2023, Savanni D'Gerinel <savanni@luminescent-dreams.com>
|
||||||
|
|
||||||
|
This file is part of the Luminescent Dreams Tools.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with Lumeto. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
use chrono::{Datelike, Utc};
|
use chrono::{Datelike, Utc};
|
||||||
use international_fixed_calendar as IFC;
|
use international_fixed_calendar as IFC;
|
||||||
use iron::headers;
|
use iron::headers;
|
||||||
|
|
18
readme.md
18
readme.md
|
@ -1 +1,19 @@
|
||||||
# Luminescent Dreams Tools Monorepo
|
# Luminescent Dreams Tools Monorepo
|
||||||
|
|
||||||
|
Add files in this repo are Copyright Savanni D'Gerinel, whether the copyright
|
||||||
|
notice is present or not. All of the work in this repository, except where
|
||||||
|
explicitely noted otherwise, is the sole work of Savanni D'Gerinel.
|
||||||
|
|
||||||
|
Future contributors will be noted in the CONTRIBUTORS file.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Copyright 2023, Savanni D'Gerinel <savanni@luminescent-dreams.com>
|
||||||
|
|
||||||
|
This file is part of the Luminescent Dreams Tools.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
Luminescent Dreams Tools is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with Lumeto. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
Loading…
Reference in New Issue