Compare commits

..

13 Commits

Author SHA1 Message Date
Savanni D'Gerinel f96a642cf0 Add a lot of documentation to the Flow library 2023-02-11 12:48:14 -05:00
Savanni D'Gerinel c76fccb42e Set up the app structure and the file scanner 2023-02-11 12:30:31 -05:00
Savanni D'Gerinel 6b7b830b12 Rename and rework the error tools to Flow 2023-02-11 12:30:16 -05:00
Savanni D'Gerinel eb95fa7d4a Start setting up the scanning loop 2023-02-08 17:45:34 -05:00
Savanni D'Gerinel 8de85afa15 Remove a lot of the mpris test applications 2023-02-08 17:37:01 -05:00
Savanni D'Gerinel 66d692c4c4 add gstreamer dependencies to the environment 2023-02-07 09:32:29 -05:00
Savanni D'Gerinel 477530c8d1 Add a bunch of example dbus programs 2023-02-07 09:32:02 -05:00
Savanni D'Gerinel 4632e59dec Add an example gstreamer control 2023-02-07 09:31:28 -05:00
Savanni D'Gerinel e3e55bafed Add a license, build a tester for the media player 2023-02-02 21:43:50 -05:00
Savanni D'Gerinel 9b4e0a43ed Add a tool to monitor and re-run the client build process
The Javascript ecosystem is rubbish.
2023-01-28 12:29:28 -05:00
Savanni D'Gerinel 3a3cf84c83 Rework the build.
Switches to using NPM entirely for dependencies. That allows me to delete lodash from the repository while leaving the dependency in place. I lose the automatic rebuilds.
2023-01-28 11:09:11 -05:00
Savanni D'Gerinel 7453e2d8cf Set up a prototype UI 2023-01-28 01:54:35 -05:00
Savanni D'Gerinel d5e8f24cc7 Bare minimum test app with one library 2023-01-27 11:03:40 -05:00
30 changed files with 23 additions and 2103 deletions

View File

@ -2,8 +2,6 @@
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

View File

@ -1,15 +1,3 @@
/*
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,

View File

@ -2,8 +2,6 @@
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

View File

@ -1,15 +1,3 @@
/*
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;

View File

@ -1,15 +1,3 @@
/*
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/

View File

@ -3,8 +3,7 @@ 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 = "GPL-3.0-only" license = "BSD-3-Clause"
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"

View File

@ -1,15 +1,3 @@
/*
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;
@ -20,12 +8,14 @@ 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,
@ -36,12 +26,14 @@ 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 {
@ -49,6 +41,7 @@ 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 {
@ -59,6 +52,7 @@ 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 {
@ -66,6 +60,7 @@ 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 {
@ -76,6 +71,7 @@ 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>,
@ -84,10 +80,13 @@ 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.iter().all(|v| record_tags.contains(v)) self.tags
.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 {
@ -99,6 +98,7 @@ 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,

View File

@ -1,15 +1,3 @@
/*
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;

View File

@ -1,15 +1,3 @@
/*
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.

View File

@ -1,15 +1,3 @@
/*
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

View File

@ -1,15 +1,3 @@
/*
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;

View File

@ -1,15 +1,3 @@
/*
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;

View File

@ -1,15 +1,3 @@
/*
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;

View File

@ -17,11 +17,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1675918889, "lastModified": 1675237434,
"narHash": "sha256-hy7re4F9AEQqwZxubct7jBRos6md26bmxnCjxf5utJA=", "narHash": "sha256-YoFR0vyEa1HXufLNIFgOGhIFMRnY6aZ0IepZF5cYemo=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "49efda9011e8cdcd6c1aad30384cb1dc230c82fe", "rev": "285b3ff0660640575186a4086e1f8dc0df2874b5",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -52,7 +52,7 @@
"nixpkgs": "nixpkgs_2" "nixpkgs": "nixpkgs_2"
}, },
"locked": { "locked": {
"narHash": "sha256-0eO3S+2gLODqDoloufeC99PfQ5mthuN9JADzqFXid1Y=", "narHash": "sha256-SQNtt71uT++7F3+kHOZ9PEThswk0MnEt6zO2xJdUo/o=",
"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": 1675942811, "lastModified": 1675183161,
"narHash": "sha256-/v4Z9mJmADTpXrdIlAjFa1e+gkpIIROR670UVDQFwIw=", "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "724bfc0892363087709bd3a5a1666296759154b1", "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
"type": "github" "type": "github"
}, },
"original": { "original": {

View File

@ -26,15 +26,14 @@
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

View File

@ -4,8 +4,7 @@ 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 = "GPL-3.0-only" license = "AGPL-3.0-or-later"
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"]

View File

@ -1,15 +1,3 @@
/*
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

1382
hex-grid/Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -1,19 +0,0 @@
[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"

View File

@ -1,7 +0,0 @@
fn main() {
glib_build_tools::compile_resources(
"resources",
"resources/resources.gresources.xml",
"com.luminescent-dreams.hex-grid.gresource",
);
}

View File

@ -1,99 +0,0 @@
<?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>

View File

@ -1,37 +0,0 @@
[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

View File

@ -1,8 +0,0 @@
<?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.

View File

@ -1,345 +0,0 @@
/*
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,
)
}

View File

@ -6,8 +6,6 @@ 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"

View File

@ -1,15 +1,3 @@
/*
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;

View File

@ -1,15 +1,3 @@
/*
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;

View File

@ -1,15 +1,3 @@
/*
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;

View File

@ -1,19 +1 @@
# 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/>.