diff --git a/Cargo.lock b/Cargo.lock index b066c4c..eed8f28 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "ab_glyph" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe21446ad43aa56417a767f3e2f3d7c4ca522904de1dd640529a76e9c5c3b33c" +checksum = "5110f1c78cf582855d895ecd0746b653db010cec6d9f5575293f27934d980a39" dependencies = [ "ab_glyph_rasterizer", "owned_ttf_parser", @@ -125,6 +125,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "aho-corasick" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" +dependencies = [ + "memchr", +] + [[package]] name = "android-activity" version = "0.4.1" @@ -187,9 +196,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.70" +version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" +checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" [[package]] name = "arboard" @@ -263,9 +272,9 @@ dependencies = [ [[package]] name = "atomic_refcell" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "857253367827bd9d0fd973f0ef15506a96e79e41b0ad7aa691203a4e3214f6c8" +checksum = "79d6dc922a2792b006573f60b2648076355daeae5ce9cb59507e5908c9625d31" [[package]] name = "atty" @@ -341,8 +350,8 @@ dependencies = [ "lazycell", "log", "peeking_take_while", - "proc-macro2 1.0.56", - "quote 1.0.26", + "proc-macro2 1.0.57", + "quote 1.0.27", "regex", "rustc-hash", "shlex", @@ -442,9 +451,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.12.0" +version = "3.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" +checksum = "3c6ed94e98ecff0c12dd1b04c15ec0d7d9458ca8fe806cea6f12954efe74c63b" [[package]] name = "bytemuck" @@ -461,9 +470,9 @@ version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdde5c9cd29ebd706ce1b35600920a33550e402fc998a2e53ad3b42c3c47a192" dependencies = [ - "proc-macro2 1.0.56", - "quote 1.0.26", - "syn 2.0.14", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", ] [[package]] @@ -530,7 +539,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4aedb84272dbe89af497cf81375129abda4fc0a9e7c5d317498c15cc30c0d27" dependencies = [ - "nom 5.1.2", + "nom 5.1.3", ] [[package]] @@ -759,9 +768,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "280a9f2d8b3a38871a3c8a46fb80db65e5e5ed97da80c4d08bf27fb63e35e181" +checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" dependencies = [ "libc", ] @@ -845,50 +854,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" -[[package]] -name = "cxx" -version = "1.0.94" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f61f1b6389c3fe1c316bf8a4dccc90a38208354b330925bce1f74a6c4756eb93" -dependencies = [ - "cc", - "cxxbridge-flags", - "cxxbridge-macro", - "link-cplusplus", -] - -[[package]] -name = "cxx-build" -version = "1.0.94" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12cee708e8962df2aeb38f594aae5d827c022b6460ac71a7a3e2c3c2aae5a07b" -dependencies = [ - "cc", - "codespan-reporting", - "once_cell", - "proc-macro2 1.0.56", - "quote 1.0.26", - "scratch", - "syn 2.0.14", -] - -[[package]] -name = "cxxbridge-flags" -version = "1.0.94" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7944172ae7e4068c533afbb984114a56c46e9ccddda550499caa222902c7f7bb" - -[[package]] -name = "cxxbridge-macro" -version = "1.0.94" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2345488264226bf682893e25de0769f3360aac9957980ec49361b083ddaa5bc5" -dependencies = [ - "proc-macro2 1.0.56", - "quote 1.0.26", - "syn 2.0.14", -] - [[package]] name = "d3d12" version = "0.5.0" @@ -902,9 +867,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.14.4" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" +checksum = "0558d22a7b463ed0241e993f76f09f30b126687447751a8638587b864e4b3944" dependencies = [ "darling_core", "darling_macro", @@ -912,26 +877,26 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.14.4" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" +checksum = "ab8bfa2e259f8ee1ce5e97824a3c55ec4404a0d772ca7fa96bf19f0752a046eb" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.56", - "quote 1.0.26", - "syn 1.0.109", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", ] [[package]] name = "darling_macro" -version = "0.14.4" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" +checksum = "29a358ff9f12ec09c3e61fef9b5a9902623a695a46a917b07f269bff1445611a" dependencies = [ "darling_core", - "quote 1.0.26", - "syn 1.0.109", + "quote 1.0.27", + "syn 2.0.16", ] [[package]] @@ -1179,8 +1144,8 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a4da76b3b6116d758c7ba93f7ec6a35d2e2cf24feda76c6e38a375f4d5c59f2" dependencies = [ - "proc-macro2 1.0.56", - "quote 1.0.26", + "proc-macro2 1.0.57", + "quote 1.0.27", "syn 1.0.109", ] @@ -1195,23 +1160,23 @@ dependencies = [ [[package]] name = "enumset" -version = "1.0.12" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19be8061a06ab6f3a6cf21106c873578bf01bd42ad15e0311a9c76161cb1c753" +checksum = "e875f1719c16de097dee81ed675e2d9bb63096823ed3f0ca827b7dea3028bbbb" dependencies = [ "enumset_derive", ] [[package]] name = "enumset_derive" -version = "0.6.1" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03e7b551eba279bf0fa88b83a46330168c1560a52a94f5126f892f0b364ab3e0" +checksum = "e08b6c6ab82d70f08844964ba10c7babb716de2ecaeab9be5717918a5177d3af" dependencies = [ "darling", - "proc-macro2 1.0.56", - "quote 1.0.26", - "syn 1.0.109", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", ] [[package]] @@ -1313,8 +1278,8 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" dependencies = [ - "proc-macro2 1.0.56", - "quote 1.0.26", + "proc-macro2 1.0.57", + "quote 1.0.27", "syn 1.0.109", "synstructure", ] @@ -1339,12 +1304,12 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" dependencies = [ "crc32fast", - "miniz_oxide 0.6.2", + "miniz_oxide 0.7.1", ] [[package]] @@ -1378,9 +1343,9 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ - "proc-macro2 1.0.56", - "quote 1.0.26", - "syn 2.0.14", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", ] [[package]] @@ -1518,9 +1483,9 @@ version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ - "proc-macro2 1.0.56", - "quote 1.0.26", - "syn 2.0.14", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", ] [[package]] @@ -1641,7 +1606,7 @@ version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc" dependencies = [ - "aho-corasick", + "aho-corasick 0.7.20", "bstr", "fnv", "log", @@ -1662,9 +1627,9 @@ dependencies = [ [[package]] name = "glutin" -version = "0.30.7" +version = "0.30.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f89bab9ec7715de13d5d5402238e66f48e3a5ae636ebb45aba4013c962e2ff15" +checksum = "62f9b771a65f0a1e3ddb6aa16f867d87dc73c922411c255e6c4ab7f6d45c7327" dependencies = [ "bitflags 1.3.2", "cfg_aliases", @@ -1685,9 +1650,9 @@ dependencies = [ [[package]] name = "glutin_egl_sys" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5aaf0abb5c4148685b33101ae326a207946b4d3764d6cdc79f8316cdaa8367d" +checksum = "1b3bcbddc51573b977fc6dca5d93867e4f29682cdbaf5d13e48f4fa4346d4d87" dependencies = [ "gl_generator", "windows-sys 0.45.0", @@ -1714,9 +1679,9 @@ dependencies = [ [[package]] name = "gpu-alloc" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc59e5f710e310e76e6707f86c561dd646f69a8876da9131703b2f717de818d" +checksum = "22beaafc29b38204457ea030f6fb7a84c9e4dd1b86e311ba0542533453d87f62" dependencies = [ "bitflags 1.3.2", "gpu-alloc-types", @@ -1752,7 +1717,7 @@ dependencies = [ ] [[package]] -name = "grin-android" +name = "grim" version = "0.1.0" dependencies = [ "android_logger", @@ -2236,12 +2201,11 @@ dependencies = [ [[package]] name = "iana-time-zone-haiku" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ - "cxx", - "cxx-build", + "cc", ] [[package]] @@ -2385,9 +2349,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.61" +version = "0.3.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +checksum = "68c16e1bfd491478ab155fd8b4896b86f9ede344949b641e61501e07c2b8b4d5" dependencies = [ "wasm-bindgen", ] @@ -2455,9 +2419,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.141" +version = "0.2.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5" +checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" [[package]] name = "libgit2-sys" @@ -2493,9 +2457,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9702761c3935f8cc2f101793272e202c72b99da8f4224a19ddcf1279a6450bbf" +checksum = "56ee889ecc9568871456d42f603d6a0ce59ff328d291063a45cbdf0036baf6db" dependencies = [ "cc", "libc", @@ -2503,15 +2467,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "link-cplusplus" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" -dependencies = [ - "cc", -] - [[package]] name = "linked-hash-map" version = "0.5.6" @@ -2520,9 +2475,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.3.1" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f" +checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f" [[package]] name = "lmdb-zero" @@ -2861,9 +2816,9 @@ checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" [[package]] name = "nom" -version = "5.1.2" +version = "5.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" +checksum = "08959a387a676302eebf4ddbcbc611da04285579f76f88ee0506c63b1a61dd4b" dependencies = [ "memchr", "version_check", @@ -2991,8 +2946,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" dependencies = [ "proc-macro-crate", - "proc-macro2 1.0.56", - "quote 1.0.26", + "proc-macro2 1.0.57", + "quote 1.0.27", "syn 1.0.109", ] @@ -3096,18 +3051,18 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-src" -version = "111.25.2+1.1.1t" +version = "111.25.3+1.1.1t" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320708a054ad9b3bf314688b5db87cf4d6683d64cfc835e2337924ae62bf4431" +checksum = "924757a6a226bf60da5f7dd0311a34d2b52283dd82ddeb103208ddc66362f80c" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.85" +version = "0.9.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d3d193fb1488ad46ffe3aaabc912cc931d02ee8518fe2959aea8ef52718b0c0" +checksum = "8e17f59264b2809d77ae94f0e1ebabc434773f370d6ca667bd223ea10e06cc7e" dependencies = [ "cc", "libc", @@ -3127,9 +3082,9 @@ dependencies = [ [[package]] name = "owned_ttf_parser" -version = "0.18.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e25e9fb15717794fae58ab55c26e044103aad13186fbb625893f9a3bbcc24228" +checksum = "706de7e2214113d63a8238d1910463cfce781129a6f263d13fdb09ff64355ba4" dependencies = [ "ttf-parser", ] @@ -3225,22 +3180,22 @@ checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" [[package]] name = "pin-project" -version = "1.0.12" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" +checksum = "c95a7476719eab1e366eaf73d0260af3021184f18177925b07f54b30089ceead" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.0.12" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" +checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07" dependencies = [ - "proc-macro2 1.0.56", - "quote 1.0.26", - "syn 1.0.109", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", ] [[package]] @@ -3263,9 +3218,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "png" @@ -3313,18 +3268,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "c4ec6d5fe0b140acb27c9a0444118cf55bfbb4e0b259739429abb4521dd67c16" dependencies = [ "unicode-ident", ] [[package]] name = "profiling" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74605f360ce573babfe43964cbe520294dcb081afbf8c108fc6e23036b4da2df" +checksum = "332cd62e95873ea4f41f3dfd6bbbfc5b52aec892d7e8d534197c4720a0bbbab2" [[package]] name = "quick-error" @@ -3343,11 +3298,11 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" dependencies = [ - "proc-macro2 1.0.56", + "proc-macro2 1.0.57", ] [[package]] @@ -3542,20 +3497,20 @@ dependencies = [ [[package]] name = "regex" -version = "1.7.3" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d" +checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" dependencies = [ - "aho-corasick", + "aho-corasick 1.0.1", "memchr", "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.6.29" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" [[package]] name = "renderdoc-sys" @@ -3591,16 +3546,16 @@ dependencies = [ [[package]] name = "rust-i18n" -version = "1.1.4" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3dcb86b090a450cb642b6a465f0e9a3d4be26bdb9d8795a2a49fb02601b370f" +checksum = "169fbf8f663e7bef4cddc3e0af0c350c4f8e8c1c40a1d92cdaa266865d2a749a" dependencies = [ "anyhow", "clap", "glob", "itertools", "once_cell", - "quote 1.0.26", + "quote 1.0.27", "regex", "rust-i18n-extract", "rust-i18n-macro", @@ -3617,8 +3572,8 @@ checksum = "ec44568e2cdf4bfb7a62381bbc6fcdf0a27c60cd503dfa12c59e6c17cf3177fa" dependencies = [ "anyhow", "ignore", - "proc-macro2 1.0.56", - "quote 1.0.26", + "proc-macro2 1.0.57", + "quote 1.0.27", "regex", "rust-i18n-support", "serde", @@ -3629,14 +3584,14 @@ dependencies = [ [[package]] name = "rust-i18n-macro" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e7e3e8f27d472822c5cf092a22631ebc667d9f8dc89dfc50ef4e87f4ebdf92f" +checksum = "17107229a36fc4d21a868b4d5dce9f85ea7cffacb5d210a15e57c85ab7935703" dependencies = [ "glob", "once_cell", - "proc-macro2 1.0.56", - "quote 1.0.26", + "proc-macro2 1.0.57", + "quote 1.0.27", "rust-i18n-support", "serde", "serde_json", @@ -3652,7 +3607,7 @@ checksum = "9e6bbf2d058c3558bef952564ceb9afcb19631cde22b47dc44f436e62ecfb916" dependencies = [ "glob", "once_cell", - "proc-macro2 1.0.56", + "proc-macro2 1.0.57", "serde", "serde_json", "serde_yaml", @@ -3660,9 +3615,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a36c42d1873f9a77c53bde094f9664d9891bc604a45b4798fd2c389ed12e5b" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustc-hash" @@ -3678,9 +3633,9 @@ checksum = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" [[package]] name = "rustix" -version = "0.37.11" +version = "0.37.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85597d61f83914ddeba6a47b3b8ffe7365107221c2e557ed94426489fefb5f77" +checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d" dependencies = [ "bitflags 1.3.2", "errno", @@ -3760,12 +3715,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" -[[package]] -name = "scratch" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1792db035ce95be60c3f8853017b3999209281c24e2ba5bc8e59bf97a0c590c1" - [[package]] name = "sct" version = "0.6.1" @@ -3822,9 +3771,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.160" +version = "1.0.163" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" dependencies = [ "serde_derive", ] @@ -3841,20 +3790,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.160" +version = "1.0.163" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" dependencies = [ - "proc-macro2 1.0.56", - "quote 1.0.26", - "syn 2.0.14", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", ] [[package]] name = "serde_json" -version = "1.0.95" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d721eca97ac802aa7777b701877c8004d950fc142651367300d21c1cc0194744" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" dependencies = [ "itoa 1.0.6", "ryu", @@ -4061,19 +4010,19 @@ version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ - "proc-macro2 1.0.56", - "quote 1.0.26", + "proc-macro2 1.0.57", + "quote 1.0.27", "unicode-ident", ] [[package]] name = "syn" -version = "2.0.14" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf316d5356ed6847742d036f8a39c3b8435cac10bd528a4bd461928a6ab34d5" +checksum = "a6f671d4b5ffdb8eadec19c0ae67fe2639df8684bd7bc4b83d986b8db549cf01" dependencies = [ - "proc-macro2 1.0.56", - "quote 1.0.26", + "proc-macro2 1.0.57", + "quote 1.0.27", "unicode-ident", ] @@ -4083,8 +4032,8 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ - "proc-macro2 1.0.56", - "quote 1.0.26", + "proc-macro2 1.0.57", + "quote 1.0.27", "syn 1.0.109", "unicode-xid 0.2.4", ] @@ -4145,9 +4094,9 @@ version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ - "proc-macro2 1.0.56", - "quote 1.0.26", - "syn 2.0.14", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", ] [[package]] @@ -4262,8 +4211,8 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e44da00bfc73a25f814cd8d7e57a68a5c31b74b3152a0a1d1f590c97ed06265a" dependencies = [ - "proc-macro2 1.0.56", - "quote 1.0.26", + "proc-macro2 1.0.57", + "quote 1.0.27", "syn 1.0.109", ] @@ -4353,9 +4302,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", ] @@ -4384,9 +4333,9 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "ttf-parser" -version = "0.18.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0609f771ad9c6155384897e1df4d948e692667cc0588548b68eb44d052b27633" +checksum = "44dcf002ae3b32cd25400d6df128c5babec3927cd1eb7ce813cfff20eb6c3746" [[package]] name = "type-map" @@ -4541,9 +4490,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.84" +version = "0.2.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +checksum = "5b6cb788c4e39112fbe1822277ef6fb3c55cd86b95cb3d3c4c1c9597e4ac74b4" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -4551,24 +4500,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.84" +version = "0.2.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +checksum = "35e522ed4105a9d626d885b35d62501b30d9666283a5c8be12c14a8bdafe7822" dependencies = [ "bumpalo", "log", "once_cell", - "proc-macro2 1.0.56", - "quote 1.0.26", - "syn 1.0.109", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.34" +version = "0.4.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +checksum = "083abe15c5d88556b77bdf7aef403625be9e327ad37c62c4e4129af740168163" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -4578,32 +4527,32 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.84" +version = "0.2.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +checksum = "358a79a0cb89d21db8120cbfb91392335913e4890665b1a7981d9e956903b434" dependencies = [ - "quote 1.0.26", + "quote 1.0.27", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.84" +version = "0.2.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +checksum = "4783ce29f09b9d93134d41297aded3a712b7b979e9c6f28c32cb88c973a94869" dependencies = [ - "proc-macro2 1.0.56", - "quote 1.0.26", - "syn 1.0.109", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.84" +version = "0.2.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +checksum = "a901d592cafaa4d711bc324edfaff879ac700b19c3dfd60058d2b445be2691eb" [[package]] name = "wayland-client" @@ -4662,8 +4611,8 @@ version = "0.29.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" dependencies = [ - "proc-macro2 1.0.56", - "quote 1.0.26", + "proc-macro2 1.0.57", + "quote 1.0.27", "xml-rs", ] @@ -4692,9 +4641,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.61" +version = "0.3.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +checksum = "16b5f940c7edfdc6d12126d98c9ef4d1b3d470011c47c76a6581df47ad9ba721" dependencies = [ "js-sys", "wasm-bindgen", @@ -4702,9 +4651,9 @@ dependencies = [ [[package]] name = "webbrowser" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579cc485bd5ce5bfa0d738e4921dd0b956eca9800be1fd2e5257ebe95bc4617e" +checksum = "b692165700260bbd40fbc5ff23766c03e339fbaca907aeea5cb77bf0a553ca83" dependencies = [ "core-foundation 0.9.3", "dirs 4.0.0", @@ -4913,8 +4862,8 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9539b6bd3eadbd9de66c9666b22d802b833da7e996bc06896142e09854a61767" dependencies = [ - "proc-macro2 1.0.56", - "quote 1.0.26", + "proc-macro2 1.0.57", + "quote 1.0.27", "syn 1.0.109", ] @@ -5142,9 +5091,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.4.1" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8970b36c66498d8ff1d66685dc86b91b29db0c7739899012f63a63814b4b28" +checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699" dependencies = [ "memchr", ] @@ -5212,9 +5161,9 @@ dependencies = [ [[package]] name = "xml-rs" -version = "0.8.4" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" +checksum = "dc95a04ea24f543cd9be5aab44f963fa35589c99e18415c38fb2b17e133bf8d2" [[package]] name = "yaml-rust" @@ -5240,9 +5189,9 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ - "proc-macro2 1.0.56", - "quote 1.0.26", - "syn 2.0.14", + "proc-macro2 1.0.57", + "quote 1.0.27", + "syn 2.0.16", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 7bd9b4b..0c2c2d9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ #members = ["wallet", "config"] [package] -name = "grin-android" +name = "grim" version = "0.1.0" edition = "2021" build = "src/build/build.rs" @@ -32,7 +32,7 @@ openssl-sys = { version = "0.9.82", features = ["vendored"] } ## ui pollster = "0.3.0" wgpu = "0.14.0" -egui = "0.20.1" +egui = { version = "0.20.1", default-features = false } egui_extras = { version = "0.20.0" } eframe = { version = "0.20.1", features = [ "wgpu" ] } egui_demo_lib = "0.20.0" @@ -45,7 +45,7 @@ dirs = "2.0" once_cell = "1.10.0" rust-i18n = "1.1.4" sys-locale = "0.3.0" -chrono = "0.4.11" +chrono = "0.4.23" [patch.crates-io] winit = { git = "https://github.com/rib/winit", branch = "android-activity" } diff --git a/fonts/material.otf b/fonts/material.otf deleted file mode 100644 index dacf094..0000000 Binary files a/fonts/material.otf and /dev/null differ diff --git a/fonts/phosphor.ttf b/fonts/phosphor.ttf new file mode 100644 index 0000000..1f9fa7f Binary files /dev/null and b/fonts/phosphor.ttf differ diff --git a/locales/en.yml b/locales/en.yml index 78d86b9..bca038d 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -1,4 +1,33 @@ accounts: Accounts -node: Node +integrated_node: Integrated Node metrics: Metrics -settings: Settings \ No newline at end of file +settings: Settings +server_restarting: Server is restarting +server_down: Server is down +header: Header +block: Block +hash: Hash +height: Height +difficulty: Difficulty +time_utc: Time (UTC) +transactions: Transactions +main_pool: Main pool +stem_pool: Stem pool +data: Data +size: Size (GB) +peers: Peers +sync_status: + initial: Server is starting + no_sync: Server is running + awaiting_peers: Waiting for peers + header_sync: Downloading headers + header_sync_percent: 'Downloading headers: %{percent}%' + tx_hashset_download: Downloading chain state + tx_hashset_download_percent: 'Downloading chain state: %{percent}%' + tx_hashset_setup: Preparing state for validation + tx_hashset_range_proofs_validation: 'Validating state - range proofs: %{percent}%' + tx_hashset_kernels_validation: 'Validating state - kernels: %{percent}%' + tx_hashset_save: Finalizing chain state + body_sync: Downloading blocks + body_sync_percent: 'Downloading blocks: %{percent}%' + shutdown: Shutting down \ No newline at end of file diff --git a/locales/ru.yml b/locales/ru.yml index a2661a2..619f60c 100644 --- a/locales/ru.yml +++ b/locales/ru.yml @@ -1 +1,33 @@ -accounts: Аккаунты \ No newline at end of file +accounts: Аккаунты +integrated_node: Встроенный узел +metrics: Метрики +settings: Настройки +server_restarting: Сервер перезапускается +server_down: Сервер выключен +header: Заголовок +block: Блок +hash: Хэш +height: Высота +difficulty: Сложность +time_utc: Время (UTC) +transactions: Транзакции +main_pool: Основной пул +stem_pool: Stem пул +data: Данные +size: Размер (ГБ) +peers: Пиры +sync_status: + initial: Запуск сервера + no_sync: Сервер запущен + awaiting_peers: Ожидание пиров + header_sync: Загрузка заголовков + header_sync_percent: 'Загрузка заголовков: %{percent}%' + tx_hashset_download: Загрузка состояния цепи + tx_hashset_download_percent: 'Загрузка состояния цепи: %{percent}%' + tx_hashset_setup: Подготовка состояния для проверки + tx_hashset_range_proofs_validation: 'Проверка доказательств: %{percent}%' + tx_hashset_kernels_validation: 'Проверка ядер: %{percent}%' + tx_hashset_save: Сохранение состояния цепи + body_sync: Загрузка блоков + body_sync_percent: 'Загрузка блоков: %{percent}%' + shutdown: Выключение \ No newline at end of file diff --git a/src/build/build.rs b/src/build/build.rs index 70d86d8..d3fba34 100644 --- a/src/build/build.rs +++ b/src/build/build.rs @@ -13,8 +13,7 @@ // limitations under the License. use std::env; -use std::path::{Path, PathBuf}; -use std::process::Command; +use std::path::Path; fn main() { // build and versioning information diff --git a/src/grim.rs b/src/grim.rs index 53b9460..2e60c23 100644 --- a/src/grim.rs +++ b/src/grim.rs @@ -13,7 +13,7 @@ // limitations under the License. use eframe::{AppCreator, NativeOptions, Renderer, Theme}; -use log::LevelFilter::{Debug, Info, Trace, Warn}; +use log::LevelFilter::Info; #[cfg(target_os = "android")] use winit::platform::android::activity::AndroidApp; diff --git a/src/gui/app.rs b/src/gui/app.rs index c038601..e01bc44 100644 --- a/src/gui/app.rs +++ b/src/gui/app.rs @@ -12,15 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::cmp::min; - -use eframe::Frame; -use egui::{Color32, Context, Stroke}; +use eframe::epaint::Stroke; +use egui::{Context, Frame}; use egui::style::Margin; -use crate::gui::{COLOR_LIGHT, COLOR_YELLOW}; +use crate::gui::colors::COLOR_LIGHT; use crate::gui::platform::PlatformCallbacks; -use crate::gui::screens::{Root, Screen}; +use crate::gui::screens::Root; pub struct PlatformApp { pub(crate) app: App, @@ -40,10 +38,10 @@ impl Default for App { } impl App { - pub fn ui(&mut self, ctx: &Context, frame: &mut Frame, cb: &dyn PlatformCallbacks) { + pub fn ui(&mut self, ctx: &Context, frame: &mut eframe::Frame, cb: &dyn PlatformCallbacks) { let Self { root } = self; egui::CentralPanel::default() - .frame(egui::Frame { + .frame(Frame { inner_margin: Margin::same(0.0), outer_margin: Margin::same(0.0), stroke: Stroke::NONE, @@ -56,11 +54,11 @@ impl App { } } -pub fn is_dual_panel_mode(frame: &mut Frame) -> bool { +pub fn is_dual_panel_mode(frame: &mut eframe::Frame) -> bool { is_landscape(frame) && frame.info().window_info.size.x > 400.0 } -pub fn is_landscape(frame: &mut Frame) -> bool { +pub fn is_landscape(frame: &mut eframe::Frame) -> bool { return frame.info().window_info.size.x > frame.info().window_info.size.y } diff --git a/src/gui/views/buttons.rs b/src/gui/colors.rs similarity index 67% rename from src/gui/views/buttons.rs rename to src/gui/colors.rs index 6ddbed9..050a39e 100644 --- a/src/gui/views/buttons.rs +++ b/src/gui/colors.rs @@ -12,3 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +pub const COLOR_YELLOW: egui::Color32 = egui::Color32::from_rgb(254, 241, 2); +pub const COLOR_LIGHT: egui::Color32 = egui::Color32::from_gray(240); +pub const COLOR_DARK: egui::Color32 = egui::Color32::from_gray(60); +pub const COLOR_GRAY: egui::Color32 = egui::Color32::from_gray(120); \ No newline at end of file diff --git a/src/gui/icons.rs b/src/gui/icons.rs new file mode 100644 index 0000000..0714d5d --- /dev/null +++ b/src/gui/icons.rs @@ -0,0 +1,1273 @@ +// Copyright 2023 The Grim Developers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![allow(unused)] +pub const ADDRESS_BOOK: &'static str = "\u{E900}"; +pub const AIRPLANE: &'static str = "\u{E901}"; +pub const AIRPLANE_IN_FLIGHT: &'static str = "\u{E902}"; +pub const AIRPLANE_LANDING: &'static str = "\u{E903}"; +pub const AIRPLANE_TAKEOFF: &'static str = "\u{E904}"; +pub const AIRPLANE_TILT: &'static str = "\u{E905}"; +pub const AIRPLAY: &'static str = "\u{E906}"; +pub const AIR_TRAFFIC_CONTROL: &'static str = "\u{E907}"; +pub const ALARM: &'static str = "\u{E908}"; +pub const ALIEN: &'static str = "\u{E909}"; +pub const ALIGN_BOTTOM: &'static str = "\u{E90A}"; +pub const ALIGN_BOTTOM_SIMPLE: &'static str = "\u{E90B}"; +pub const ALIGN_CENTER_HORIZONTAL: &'static str = "\u{E90C}"; +pub const ALIGN_CENTER_HORIZONTAL_SIMPLE: &'static str = "\u{E90D}"; +pub const ALIGN_CENTER_VERTICAL: &'static str = "\u{E90E}"; +pub const ALIGN_CENTER_VERTICAL_SIMPLE: &'static str = "\u{E90F}"; +pub const ALIGN_LEFT: &'static str = "\u{E910}"; +pub const ALIGN_LEFT_SIMPLE: &'static str = "\u{E911}"; +pub const ALIGN_RIGHT: &'static str = "\u{E912}"; +pub const ALIGN_RIGHT_SIMPLE: &'static str = "\u{E913}"; +pub const ALIGN_TOP: &'static str = "\u{E914}"; +pub const ALIGN_TOP_SIMPLE: &'static str = "\u{E915}"; +pub const AMAZON_LOGO: &'static str = "\u{E916}"; +pub const ANCHOR: &'static str = "\u{E917}"; +pub const ANCHOR_SIMPLE: &'static str = "\u{E918}"; +pub const ANDROID_LOGO: &'static str = "\u{E919}"; +pub const ANGULAR_LOGO: &'static str = "\u{E91A}"; +pub const APERTURE: &'static str = "\u{E91B}"; +pub const APPLE_LOGO: &'static str = "\u{E91C}"; +pub const APPLE_PODCASTS_LOGO: &'static str = "\u{E91D}"; +pub const APP_STORE_LOGO: &'static str = "\u{E91E}"; +pub const APP_WINDOW: &'static str = "\u{E91F}"; +pub const ARCHIVE: &'static str = "\u{E920}"; +pub const ARCHIVE_BOX: &'static str = "\u{E921}"; +pub const ARCHIVE_TRAY: &'static str = "\u{E922}"; +pub const ARMCHAIR: &'static str = "\u{E923}"; +pub const ARROW_ARC_LEFT: &'static str = "\u{E924}"; +pub const ARROW_ARC_RIGHT: &'static str = "\u{E925}"; +pub const ARROW_BEND_DOUBLE_UP_LEFT: &'static str = "\u{E926}"; +pub const ARROW_BEND_DOUBLE_UP_RIGHT: &'static str = "\u{E927}"; +pub const ARROW_BEND_DOWN_LEFT: &'static str = "\u{E928}"; +pub const ARROW_BEND_DOWN_RIGHT: &'static str = "\u{E929}"; +pub const ARROW_BEND_LEFT_DOWN: &'static str = "\u{E92A}"; +pub const ARROW_BEND_LEFT_UP: &'static str = "\u{E92B}"; +pub const ARROW_BEND_RIGHT_DOWN: &'static str = "\u{E92C}"; +pub const ARROW_BEND_RIGHT_UP: &'static str = "\u{E92D}"; +pub const ARROW_BEND_UP_LEFT: &'static str = "\u{E92E}"; +pub const ARROW_BEND_UP_RIGHT: &'static str = "\u{E92F}"; +pub const ARROW_CIRCLE_DOWN: &'static str = "\u{E930}"; +pub const ARROW_CIRCLE_DOWN_LEFT: &'static str = "\u{E931}"; +pub const ARROW_CIRCLE_DOWN_RIGHT: &'static str = "\u{E932}"; +pub const ARROW_CIRCLE_LEFT: &'static str = "\u{E933}"; +pub const ARROW_CIRCLE_RIGHT: &'static str = "\u{E934}"; +pub const ARROW_CIRCLE_UP: &'static str = "\u{E935}"; +pub const ARROW_CIRCLE_UP_LEFT: &'static str = "\u{E936}"; +pub const ARROW_CIRCLE_UP_RIGHT: &'static str = "\u{E937}"; +pub const ARROW_CLOCKWISE: &'static str = "\u{E938}"; +pub const ARROW_COUNTER_CLOCKWISE: &'static str = "\u{E939}"; +pub const ARROW_DOWN: &'static str = "\u{E93A}"; +pub const ARROW_DOWN_LEFT: &'static str = "\u{E93B}"; +pub const ARROW_DOWN_RIGHT: &'static str = "\u{E93C}"; +pub const ARROW_ELBOW_DOWN_LEFT: &'static str = "\u{E93D}"; +pub const ARROW_ELBOW_DOWN_RIGHT: &'static str = "\u{E93E}"; +pub const ARROW_ELBOW_LEFT: &'static str = "\u{E93F}"; +pub const ARROW_ELBOW_LEFT_DOWN: &'static str = "\u{E940}"; +pub const ARROW_ELBOW_LEFT_UP: &'static str = "\u{E941}"; +pub const ARROW_ELBOW_RIGHT: &'static str = "\u{E942}"; +pub const ARROW_ELBOW_RIGHT_DOWN: &'static str = "\u{E943}"; +pub const ARROW_ELBOW_RIGHT_UP: &'static str = "\u{E944}"; +pub const ARROW_ELBOW_UP_LEFT: &'static str = "\u{E945}"; +pub const ARROW_ELBOW_UP_RIGHT: &'static str = "\u{E946}"; +pub const ARROW_FAT_DOWN: &'static str = "\u{E947}"; +pub const ARROW_FAT_LEFT: &'static str = "\u{E948}"; +pub const ARROW_FAT_LINE_DOWN: &'static str = "\u{E949}"; +pub const ARROW_FAT_LINE_LEFT: &'static str = "\u{E94A}"; +pub const ARROW_FAT_LINE_RIGHT: &'static str = "\u{E94B}"; +pub const ARROW_FAT_LINES_DOWN: &'static str = "\u{E94C}"; +pub const ARROW_FAT_LINES_LEFT: &'static str = "\u{E94D}"; +pub const ARROW_FAT_LINES_RIGHT: &'static str = "\u{E94E}"; +pub const ARROW_FAT_LINES_UP: &'static str = "\u{E94F}"; +pub const ARROW_FAT_LINE_UP: &'static str = "\u{E950}"; +pub const ARROW_FAT_RIGHT: &'static str = "\u{E951}"; +pub const ARROW_FAT_UP: &'static str = "\u{E952}"; +pub const ARROW_LEFT: &'static str = "\u{E953}"; +pub const ARROW_LINE_DOWN: &'static str = "\u{E954}"; +pub const ARROW_LINE_DOWN_LEFT: &'static str = "\u{E955}"; +pub const ARROW_LINE_DOWN_RIGHT: &'static str = "\u{E956}"; +pub const ARROW_LINE_LEFT: &'static str = "\u{E957}"; +pub const ARROW_LINE_RIGHT: &'static str = "\u{E958}"; +pub const ARROW_LINE_UP: &'static str = "\u{E959}"; +pub const ARROW_LINE_UP_LEFT: &'static str = "\u{E95A}"; +pub const ARROW_LINE_UP_RIGHT: &'static str = "\u{E95B}"; +pub const ARROW_RIGHT: &'static str = "\u{E95C}"; +pub const ARROWS_CLOCKWISE: &'static str = "\u{E95D}"; +pub const ARROWS_COUNTER_CLOCKWISE: &'static str = "\u{E95E}"; +pub const ARROWS_DOWN_UP: &'static str = "\u{E95F}"; +pub const ARROWS_HORIZONTAL: &'static str = "\u{E960}"; +pub const ARROWS_IN: &'static str = "\u{E961}"; +pub const ARROWS_IN_CARDINAL: &'static str = "\u{E962}"; +pub const ARROWS_IN_LINE_HORIZONTAL: &'static str = "\u{E963}"; +pub const ARROWS_IN_LINE_VERTICAL: &'static str = "\u{E964}"; +pub const ARROWS_IN_SIMPLE: &'static str = "\u{E965}"; +pub const ARROWS_LEFT_RIGHT: &'static str = "\u{E966}"; +pub const ARROWS_MERGE: &'static str = "\u{E967}"; +pub const ARROWS_OUT: &'static str = "\u{E968}"; +pub const ARROWS_OUT_CARDINAL: &'static str = "\u{E969}"; +pub const ARROWS_OUT_LINE_HORIZONTAL: &'static str = "\u{E96A}"; +pub const ARROWS_OUT_LINE_VERTICAL: &'static str = "\u{E96B}"; +pub const ARROWS_OUT_SIMPLE: &'static str = "\u{E96C}"; +pub const ARROW_SQUARE_DOWN: &'static str = "\u{E96D}"; +pub const ARROW_SQUARE_DOWN_LEFT: &'static str = "\u{E96E}"; +pub const ARROW_SQUARE_DOWN_RIGHT: &'static str = "\u{E96F}"; +pub const ARROW_SQUARE_IN: &'static str = "\u{E970}"; +pub const ARROW_SQUARE_LEFT: &'static str = "\u{E971}"; +pub const ARROW_SQUARE_OUT: &'static str = "\u{E972}"; +pub const ARROW_SQUARE_RIGHT: &'static str = "\u{E973}"; +pub const ARROW_SQUARE_UP: &'static str = "\u{E974}"; +pub const ARROW_SQUARE_UP_LEFT: &'static str = "\u{E975}"; +pub const ARROW_SQUARE_UP_RIGHT: &'static str = "\u{E976}"; +pub const ARROWS_SPLIT: &'static str = "\u{E977}"; +pub const ARROWS_VERTICAL: &'static str = "\u{E978}"; +pub const ARROW_U_DOWN_LEFT: &'static str = "\u{E979}"; +pub const ARROW_U_DOWN_RIGHT: &'static str = "\u{E97A}"; +pub const ARROW_U_LEFT_DOWN: &'static str = "\u{E97B}"; +pub const ARROW_U_LEFT_UP: &'static str = "\u{E97C}"; +pub const ARROW_UP: &'static str = "\u{E97D}"; +pub const ARROW_UP_LEFT: &'static str = "\u{E97E}"; +pub const ARROW_UP_RIGHT: &'static str = "\u{E97F}"; +pub const ARROW_U_RIGHT_DOWN: &'static str = "\u{E980}"; +pub const ARROW_U_RIGHT_UP: &'static str = "\u{E981}"; +pub const ARROW_U_UP_LEFT: &'static str = "\u{E982}"; +pub const ARROW_U_UP_RIGHT: &'static str = "\u{E983}"; +pub const ARTICLE: &'static str = "\u{E984}"; +pub const ARTICLE_MEDIUM: &'static str = "\u{E985}"; +pub const ARTICLE_NY_TIMES: &'static str = "\u{E986}"; +pub const ASTERISK: &'static str = "\u{E987}"; +pub const ASTERISK_SIMPLE: &'static str = "\u{E988}"; +pub const AT: &'static str = "\u{E989}"; +pub const ATOM: &'static str = "\u{E98A}"; +pub const BABY: &'static str = "\u{E98B}"; +pub const BACKPACK: &'static str = "\u{E98C}"; +pub const BACKSPACE: &'static str = "\u{E98D}"; +pub const BAG: &'static str = "\u{E98E}"; +pub const BAG_SIMPLE: &'static str = "\u{E98F}"; +pub const BALLOON: &'static str = "\u{E990}"; +pub const BANDAIDS: &'static str = "\u{E991}"; +pub const BANK: &'static str = "\u{E992}"; +pub const BARBELL: &'static str = "\u{E993}"; +pub const BARCODE: &'static str = "\u{E994}"; +pub const BARRICADE: &'static str = "\u{E995}"; +pub const BASEBALL: &'static str = "\u{E996}"; +pub const BASEBALL_CAP: &'static str = "\u{E997}"; +pub const BASKET: &'static str = "\u{E998}"; +pub const BASKETBALL: &'static str = "\u{E999}"; +pub const BATHTUB: &'static str = "\u{E99A}"; +pub const BATTERY_CHARGING: &'static str = "\u{E99B}"; +pub const BATTERY_CHARGING_VERTICAL: &'static str = "\u{E99C}"; +pub const BATTERY_EMPTY: &'static str = "\u{E99D}"; +pub const BATTERY_FULL: &'static str = "\u{E99E}"; +pub const BATTERY_HIGH: &'static str = "\u{E99F}"; +pub const BATTERY_LOW: &'static str = "\u{E9A0}"; +pub const BATTERY_MEDIUM: &'static str = "\u{E9A1}"; +pub const BATTERY_PLUS: &'static str = "\u{E9A2}"; +pub const BATTERY_PLUS_VERTICAL: &'static str = "\u{E9A3}"; +pub const BATTERY_VERTICAL_EMPTY: &'static str = "\u{E9A4}"; +pub const BATTERY_VERTICAL_FULL: &'static str = "\u{E9A5}"; +pub const BATTERY_VERTICAL_HIGH: &'static str = "\u{E9A6}"; +pub const BATTERY_VERTICAL_LOW: &'static str = "\u{E9A7}"; +pub const BATTERY_VERTICAL_MEDIUM: &'static str = "\u{E9A8}"; +pub const BATTERY_WARNING: &'static str = "\u{E9A9}"; +pub const BATTERY_WARNING_VERTICAL: &'static str = "\u{E9AA}"; +pub const BED: &'static str = "\u{E9AB}"; +pub const BEER_BOTTLE: &'static str = "\u{E9AC}"; +pub const BEER_STEIN: &'static str = "\u{E9AD}"; +pub const BEHANCE_LOGO: &'static str = "\u{E9AE}"; +pub const BELL: &'static str = "\u{E9AF}"; +pub const BELL_RINGING: &'static str = "\u{E9B0}"; +pub const BELL_SIMPLE: &'static str = "\u{E9B1}"; +pub const BELL_SIMPLE_RINGING: &'static str = "\u{E9B2}"; +pub const BELL_SIMPLE_SLASH: &'static str = "\u{E9B3}"; +pub const BELL_SIMPLE_Z: &'static str = "\u{E9B4}"; +pub const BELL_SLASH: &'static str = "\u{E9B5}"; +pub const BELL_Z: &'static str = "\u{E9B6}"; +pub const BEZIER_CURVE: &'static str = "\u{E9B7}"; +pub const BICYCLE: &'static str = "\u{E9B8}"; +pub const BINOCULARS: &'static str = "\u{E9B9}"; +pub const BIRD: &'static str = "\u{E9BA}"; +pub const BLUETOOTH: &'static str = "\u{E9BB}"; +pub const BLUETOOTH_CONNECTED: &'static str = "\u{E9BC}"; +pub const BLUETOOTH_SLASH: &'static str = "\u{E9BD}"; +pub const BLUETOOTH_X: &'static str = "\u{E9BE}"; +pub const BOAT: &'static str = "\u{E9BF}"; +pub const BONE: &'static str = "\u{E9C0}"; +pub const BOOK: &'static str = "\u{E9C1}"; +pub const BOOK_BOOKMARK: &'static str = "\u{E9C2}"; +pub const BOOKMARK: &'static str = "\u{E9C3}"; +pub const BOOKMARKS: &'static str = "\u{E9C4}"; +pub const BOOKMARK_SIMPLE: &'static str = "\u{E9C5}"; +pub const BOOKMARKS_SIMPLE: &'static str = "\u{E9C6}"; +pub const BOOK_OPEN: &'static str = "\u{E9C7}"; +pub const BOOK_OPEN_TEXT: &'static str = "\u{E9C8}"; +pub const BOOKS: &'static str = "\u{E9C9}"; +pub const BOOT: &'static str = "\u{E9CA}"; +pub const BOUNDING_BOX: &'static str = "\u{E9CB}"; +pub const BOWL_FOOD: &'static str = "\u{E9CC}"; +pub const BRACKETS_ANGLE: &'static str = "\u{E9CD}"; +pub const BRACKETS_CURLY: &'static str = "\u{E9CE}"; +pub const BRACKETS_ROUND: &'static str = "\u{E9CF}"; +pub const BRACKETS_SQUARE: &'static str = "\u{E9D0}"; +pub const BRAIN: &'static str = "\u{E9D1}"; +pub const BRANDY: &'static str = "\u{E9D2}"; +pub const BRIDGE: &'static str = "\u{E9D3}"; +pub const BRIEFCASE: &'static str = "\u{E9D4}"; +pub const BRIEFCASE_METAL: &'static str = "\u{E9D5}"; +pub const BROADCAST: &'static str = "\u{E9D6}"; +pub const BROOM: &'static str = "\u{E9D7}"; +pub const BROWSER: &'static str = "\u{E9D8}"; +pub const BROWSERS: &'static str = "\u{E9D9}"; +pub const BUG: &'static str = "\u{E9DA}"; +pub const BUG_BEETLE: &'static str = "\u{E9DB}"; +pub const BUG_DROID: &'static str = "\u{E9DC}"; +pub const BUILDINGS: &'static str = "\u{E9DD}"; +pub const BUS: &'static str = "\u{E9DE}"; +pub const BUTTERFLY: &'static str = "\u{E9DF}"; +pub const CACTUS: &'static str = "\u{E9E0}"; +pub const CAKE: &'static str = "\u{E9E1}"; +pub const CALCULATOR: &'static str = "\u{E9E2}"; +pub const CALENDAR: &'static str = "\u{E9E3}"; +pub const CALENDAR_BLANK: &'static str = "\u{E9E4}"; +pub const CALENDAR_CHECK: &'static str = "\u{E9E5}"; +pub const CALENDAR_PLUS: &'static str = "\u{E9E6}"; +pub const CALENDAR_X: &'static str = "\u{E9E7}"; +pub const CALL_BELL: &'static str = "\u{E9E8}"; +pub const CAMERA: &'static str = "\u{E9E9}"; +pub const CAMERA_PLUS: &'static str = "\u{E9EA}"; +pub const CAMERA_ROTATE: &'static str = "\u{E9EB}"; +pub const CAMERA_SLASH: &'static str = "\u{E9EC}"; +pub const CAMPFIRE: &'static str = "\u{E9ED}"; +pub const CAR: &'static str = "\u{E9EE}"; +pub const CARDHOLDER: &'static str = "\u{E9EF}"; +pub const CARDS: &'static str = "\u{E9F0}"; +pub const CARET_CIRCLE_DOUBLE_DOWN: &'static str = "\u{E9F1}"; +pub const CARET_CIRCLE_DOUBLE_LEFT: &'static str = "\u{E9F2}"; +pub const CARET_CIRCLE_DOUBLE_RIGHT: &'static str = "\u{E9F3}"; +pub const CARET_CIRCLE_DOUBLE_UP: &'static str = "\u{E9F4}"; +pub const CARET_CIRCLE_DOWN: &'static str = "\u{E9F5}"; +pub const CARET_CIRCLE_LEFT: &'static str = "\u{E9F6}"; +pub const CARET_CIRCLE_RIGHT: &'static str = "\u{E9F7}"; +pub const CARET_CIRCLE_UP: &'static str = "\u{E9F8}"; +pub const CARET_CIRCLE_UP_DOWN: &'static str = "\u{E9F9}"; +pub const CARET_DOUBLE_DOWN: &'static str = "\u{E9FA}"; +pub const CARET_DOUBLE_LEFT: &'static str = "\u{E9FB}"; +pub const CARET_DOUBLE_RIGHT: &'static str = "\u{E9FC}"; +pub const CARET_DOUBLE_UP: &'static str = "\u{E9FD}"; +pub const CARET_DOWN: &'static str = "\u{E9FE}"; +pub const CARET_LEFT: &'static str = "\u{E9FF}"; +pub const CARET_RIGHT: &'static str = "\u{EA00}"; +pub const CARET_UP: &'static str = "\u{EA01}"; +pub const CARET_UP_DOWN: &'static str = "\u{EA02}"; +pub const CAR_PROFILE: &'static str = "\u{EA03}"; +pub const CARROT: &'static str = "\u{EA04}"; +pub const CAR_SIMPLE: &'static str = "\u{EA05}"; +pub const CASSETTE_TAPE: &'static str = "\u{EA06}"; +pub const CASTLE_TURRET: &'static str = "\u{EA07}"; +pub const CAT: &'static str = "\u{EA08}"; +pub const CELL_SIGNAL_FULL: &'static str = "\u{EA09}"; +pub const CELL_SIGNAL_HIGH: &'static str = "\u{EA0A}"; +pub const CELL_SIGNAL_LOW: &'static str = "\u{EA0B}"; +pub const CELL_SIGNAL_MEDIUM: &'static str = "\u{EA0C}"; +pub const CELL_SIGNAL_NONE: &'static str = "\u{EA0D}"; +pub const CELL_SIGNAL_SLASH: &'static str = "\u{EA0E}"; +pub const CELL_SIGNAL_X: &'static str = "\u{EA0F}"; +pub const CERTIFICATE: &'static str = "\u{EA10}"; +pub const CHAIR: &'static str = "\u{EA11}"; +pub const CHALKBOARD: &'static str = "\u{EA12}"; +pub const CHALKBOARD_SIMPLE: &'static str = "\u{EA13}"; +pub const CHALKBOARD_TEACHER: &'static str = "\u{EA14}"; +pub const CHAMPAGNE: &'static str = "\u{EA15}"; +pub const CHARGING_STATION: &'static str = "\u{EA16}"; +pub const CHART_BAR: &'static str = "\u{EA17}"; +pub const CHART_BAR_HORIZONTAL: &'static str = "\u{EA18}"; +pub const CHART_DONUT: &'static str = "\u{EA19}"; +pub const CHART_LINE: &'static str = "\u{EA1A}"; +pub const CHART_LINE_DOWN: &'static str = "\u{EA1B}"; +pub const CHART_LINE_UP: &'static str = "\u{EA1C}"; +pub const CHART_PIE: &'static str = "\u{EA1D}"; +pub const CHART_PIE_SLICE: &'static str = "\u{EA1E}"; +pub const CHART_POLAR: &'static str = "\u{EA1F}"; +pub const CHART_SCATTER: &'static str = "\u{EA20}"; +pub const CHAT: &'static str = "\u{EA21}"; +pub const CHAT_CENTERED: &'static str = "\u{EA22}"; +pub const CHAT_CENTERED_DOTS: &'static str = "\u{EA23}"; +pub const CHAT_CENTERED_TEXT: &'static str = "\u{EA24}"; +pub const CHAT_CIRCLE: &'static str = "\u{EA25}"; +pub const CHAT_CIRCLE_DOTS: &'static str = "\u{EA26}"; +pub const CHAT_CIRCLE_TEXT: &'static str = "\u{EA27}"; +pub const CHAT_DOTS: &'static str = "\u{EA28}"; +pub const CHATS: &'static str = "\u{EA29}"; +pub const CHATS_CIRCLE: &'static str = "\u{EA2A}"; +pub const CHATS_TEARDROP: &'static str = "\u{EA2B}"; +pub const CHAT_TEARDROP: &'static str = "\u{EA2C}"; +pub const CHAT_TEARDROP_DOTS: &'static str = "\u{EA2D}"; +pub const CHAT_TEARDROP_TEXT: &'static str = "\u{EA2E}"; +pub const CHAT_TEXT: &'static str = "\u{EA2F}"; +pub const CHECK: &'static str = "\u{EA30}"; +pub const CHECK_CIRCLE: &'static str = "\u{EA31}"; +pub const CHECK_FAT: &'static str = "\u{EA32}"; +pub const CHECKS: &'static str = "\u{EA33}"; +pub const CHECK_SQUARE: &'static str = "\u{EA34}"; +pub const CHECK_SQUARE_OFFSET: &'static str = "\u{EA35}"; +pub const CHURCH: &'static str = "\u{EA36}"; +pub const CIRCLE: &'static str = "\u{EA37}"; +pub const CIRCLE_DASHED: &'static str = "\u{EA38}"; +pub const CIRCLE_HALF: &'static str = "\u{EA39}"; +pub const CIRCLE_HALF_TILT: &'static str = "\u{EA3A}"; +pub const CIRCLE_NOTCH: &'static str = "\u{EA3B}"; +pub const CIRCLES_FOUR: &'static str = "\u{EA3C}"; +pub const CIRCLES_THREE: &'static str = "\u{EA3D}"; +pub const CIRCLES_THREE_PLUS: &'static str = "\u{EA3E}"; +pub const CIRCUITRY: &'static str = "\u{EA3F}"; +pub const CLIPBOARD: &'static str = "\u{EA40}"; +pub const CLIPBOARD_TEXT: &'static str = "\u{EA41}"; +pub const CLOCK: &'static str = "\u{EA42}"; +pub const CLOCK_AFTERNOON: &'static str = "\u{EA43}"; +pub const CLOCK_CLOCKWISE: &'static str = "\u{EA44}"; +pub const CLOCK_COUNTDOWN: &'static str = "\u{EA45}"; +pub const CLOCK_COUNTER_CLOCKWISE: &'static str = "\u{EA46}"; +pub const CLOSED_CAPTIONING: &'static str = "\u{EA47}"; +pub const CLOUD: &'static str = "\u{EA48}"; +pub const CLOUD_ARROW_DOWN: &'static str = "\u{EA49}"; +pub const CLOUD_ARROW_UP: &'static str = "\u{EA4A}"; +pub const CLOUD_CHECK: &'static str = "\u{EA4B}"; +pub const CLOUD_FOG: &'static str = "\u{EA4C}"; +pub const CLOUD_LIGHTNING: &'static str = "\u{EA4D}"; +pub const CLOUD_MOON: &'static str = "\u{EA4E}"; +pub const CLOUD_RAIN: &'static str = "\u{EA4F}"; +pub const CLOUD_SLASH: &'static str = "\u{EA50}"; +pub const CLOUD_SNOW: &'static str = "\u{EA51}"; +pub const CLOUD_SUN: &'static str = "\u{EA52}"; +pub const CLOUD_WARNING: &'static str = "\u{EA53}"; +pub const CLOUD_X: &'static str = "\u{EA54}"; +pub const CLUB: &'static str = "\u{EA55}"; +pub const COAT_HANGER: &'static str = "\u{EA56}"; +pub const CODA_LOGO: &'static str = "\u{EA57}"; +pub const CODE: &'static str = "\u{EA58}"; +pub const CODE_BLOCK: &'static str = "\u{EA59}"; +pub const CODEPEN_LOGO: &'static str = "\u{EA5A}"; +pub const CODESANDBOX_LOGO: &'static str = "\u{EA5B}"; +pub const CODE_SIMPLE: &'static str = "\u{EA5C}"; +pub const COFFEE: &'static str = "\u{EA5D}"; +pub const COIN: &'static str = "\u{EA5E}"; +pub const COINS: &'static str = "\u{EA5F}"; +pub const COIN_VERTICAL: &'static str = "\u{EA60}"; +pub const COLUMNS: &'static str = "\u{EA61}"; +pub const COMMAND: &'static str = "\u{EA62}"; +pub const COMPASS: &'static str = "\u{EA63}"; +pub const COMPASS_TOOL: &'static str = "\u{EA64}"; +pub const COMPUTER_TOWER: &'static str = "\u{EA65}"; +pub const CONFETTI: &'static str = "\u{EA66}"; +pub const CONTACTLESS_PAYMENT: &'static str = "\u{EA67}"; +pub const CONTROL: &'static str = "\u{EA68}"; +pub const COOKIE: &'static str = "\u{EA69}"; +pub const COOKING_POT: &'static str = "\u{EA6A}"; +pub const COPY: &'static str = "\u{EA6B}"; +pub const COPYLEFT: &'static str = "\u{EA6C}"; +pub const COPYRIGHT: &'static str = "\u{EA6D}"; +pub const COPY_SIMPLE: &'static str = "\u{EA6E}"; +pub const CORNERS_IN: &'static str = "\u{EA6F}"; +pub const CORNERS_OUT: &'static str = "\u{EA70}"; +pub const COUCH: &'static str = "\u{EA71}"; +pub const CPU: &'static str = "\u{EA72}"; +pub const CREDIT_CARD: &'static str = "\u{EA73}"; +pub const CROP: &'static str = "\u{EA74}"; +pub const CROSS: &'static str = "\u{EA75}"; +pub const CROSSHAIR: &'static str = "\u{EA76}"; +pub const CROSSHAIR_SIMPLE: &'static str = "\u{EA77}"; +pub const CROWN: &'static str = "\u{EA78}"; +pub const CROWN_SIMPLE: &'static str = "\u{EA79}"; +pub const CUBE: &'static str = "\u{EA7A}"; +pub const CUBE_FOCUS: &'static str = "\u{EA7B}"; +pub const CUBE_TRANSPARENT: &'static str = "\u{EA7C}"; +pub const CURRENCY_BTC: &'static str = "\u{EA7D}"; +pub const CURRENCY_CIRCLE_DOLLAR: &'static str = "\u{EA7E}"; +pub const CURRENCY_CNY: &'static str = "\u{EA7F}"; +pub const CURRENCY_DOLLAR: &'static str = "\u{EA80}"; +pub const CURRENCY_DOLLAR_SIMPLE: &'static str = "\u{EA81}"; +pub const CURRENCY_ETH: &'static str = "\u{EA82}"; +pub const CURRENCY_EUR: &'static str = "\u{EA83}"; +pub const CURRENCY_GBP: &'static str = "\u{EA84}"; +pub const CURRENCY_INR: &'static str = "\u{EA85}"; +pub const CURRENCY_JPY: &'static str = "\u{EA86}"; +pub const CURRENCY_KRW: &'static str = "\u{EA87}"; +pub const CURRENCY_KZT: &'static str = "\u{EA88}"; +pub const CURRENCY_NGN: &'static str = "\u{EA89}"; +pub const CURRENCY_RUB: &'static str = "\u{EA8A}"; +pub const CURSOR: &'static str = "\u{EA8B}"; +pub const CURSOR_CLICK: &'static str = "\u{EA8C}"; +pub const CURSOR_TEXT: &'static str = "\u{EA8D}"; +pub const CYLINDER: &'static str = "\u{EA8E}"; +pub const DATABASE: &'static str = "\u{EA8F}"; +pub const DESKTOP: &'static str = "\u{EA90}"; +pub const DESKTOP_TOWER: &'static str = "\u{EA91}"; +pub const DETECTIVE: &'static str = "\u{EA92}"; +pub const DEVICE_MOBILE: &'static str = "\u{EA93}"; +pub const DEVICE_MOBILE_CAMERA: &'static str = "\u{EA94}"; +pub const DEVICE_MOBILE_SPEAKER: &'static str = "\u{EA95}"; +pub const DEVICES: &'static str = "\u{EA96}"; +pub const DEVICE_TABLET: &'static str = "\u{EA97}"; +pub const DEVICE_TABLET_CAMERA: &'static str = "\u{EA98}"; +pub const DEVICE_TABLET_SPEAKER: &'static str = "\u{EA99}"; +pub const DEV_TO_LOGO: &'static str = "\u{EA9A}"; +pub const DIAMOND: &'static str = "\u{EA9B}"; +pub const DIAMONDS_FOUR: &'static str = "\u{EA9C}"; +pub const DICE_FIVE: &'static str = "\u{EA9D}"; +pub const DICE_FOUR: &'static str = "\u{EA9E}"; +pub const DICE_ONE: &'static str = "\u{EA9F}"; +pub const DICE_SIX: &'static str = "\u{EAA0}"; +pub const DICE_THREE: &'static str = "\u{EAA1}"; +pub const DICE_TWO: &'static str = "\u{EAA2}"; +pub const DISC: &'static str = "\u{EAA3}"; +pub const DISCORD_LOGO: &'static str = "\u{EAA4}"; +pub const DIVIDE: &'static str = "\u{EAA5}"; +pub const DNA: &'static str = "\u{EAA6}"; +pub const DOG: &'static str = "\u{EAA7}"; +pub const DOOR: &'static str = "\u{EAA8}"; +pub const DOOR_OPEN: &'static str = "\u{EAA9}"; +pub const DOT: &'static str = "\u{EAAA}"; +pub const DOT_OUTLINE: &'static str = "\u{EAAB}"; +pub const DOTS_NINE: &'static str = "\u{EAAC}"; +pub const DOTS_SIX: &'static str = "\u{EAAD}"; +pub const DOTS_SIX_VERTICAL: &'static str = "\u{EAAE}"; +pub const DOTS_THREE: &'static str = "\u{EAAF}"; +pub const DOTS_THREE_CIRCLE: &'static str = "\u{EAB0}"; +pub const DOTS_THREE_CIRCLE_VERTICAL: &'static str = "\u{EAB1}"; +pub const DOTS_THREE_OUTLINE: &'static str = "\u{EAB2}"; +pub const DOTS_THREE_OUTLINE_VERTICAL: &'static str = "\u{EAB3}"; +pub const DOTS_THREE_VERTICAL: &'static str = "\u{EAB4}"; +pub const DOWNLOAD: &'static str = "\u{EAB5}"; +pub const DOWNLOAD_SIMPLE: &'static str = "\u{EAB6}"; +pub const DRESS: &'static str = "\u{EAB7}"; +pub const DRIBBBLE_LOGO: &'static str = "\u{EAB8}"; +pub const DROP: &'static str = "\u{EAB9}"; +pub const DROPBOX_LOGO: &'static str = "\u{EABA}"; +pub const DROP_HALF: &'static str = "\u{EABB}"; +pub const DROP_HALF_BOTTOM: &'static str = "\u{EABC}"; +pub const EAR: &'static str = "\u{EABD}"; +pub const EAR_SLASH: &'static str = "\u{EABE}"; +pub const EGG: &'static str = "\u{EABF}"; +pub const EGG_CRACK: &'static str = "\u{EAC0}"; +pub const EJECT: &'static str = "\u{EAC1}"; +pub const EJECT_SIMPLE: &'static str = "\u{EAC2}"; +pub const ELEVATOR: &'static str = "\u{EAC3}"; +pub const ENGINE: &'static str = "\u{EAC4}"; +pub const ENVELOPE: &'static str = "\u{EAC5}"; +pub const ENVELOPE_OPEN: &'static str = "\u{EAC6}"; +pub const ENVELOPE_SIMPLE: &'static str = "\u{EAC7}"; +pub const ENVELOPE_SIMPLE_OPEN: &'static str = "\u{EAC8}"; +pub const EQUALIZER: &'static str = "\u{EAC9}"; +pub const EQUALS: &'static str = "\u{EACA}"; +pub const ERASER: &'static str = "\u{EACB}"; +pub const ESCALATOR_DOWN: &'static str = "\u{EACC}"; +pub const ESCALATOR_UP: &'static str = "\u{EACD}"; +pub const EXAM: &'static str = "\u{EACE}"; +pub const EXCLUDE: &'static str = "\u{EACF}"; +pub const EXCLUDE_SQUARE: &'static str = "\u{EAD0}"; +pub const EXPORT: &'static str = "\u{EAD1}"; +pub const EYE: &'static str = "\u{EAD2}"; +pub const EYE_CLOSED: &'static str = "\u{EAD3}"; +pub const EYEDROPPER: &'static str = "\u{EAD4}"; +pub const EYEDROPPER_SAMPLE: &'static str = "\u{EAD5}"; +pub const EYEGLASSES: &'static str = "\u{EAD6}"; +pub const EYE_SLASH: &'static str = "\u{EAD7}"; +pub const FACEBOOK_LOGO: &'static str = "\u{EAD8}"; +pub const FACE_MASK: &'static str = "\u{EAD9}"; +pub const FACTORY: &'static str = "\u{EADA}"; +pub const FADERS: &'static str = "\u{EADB}"; +pub const FADERS_HORIZONTAL: &'static str = "\u{EADC}"; +pub const FAN: &'static str = "\u{EADD}"; +pub const FAST_FORWARD: &'static str = "\u{EADE}"; +pub const FAST_FORWARD_CIRCLE: &'static str = "\u{EADF}"; +pub const FEATHER: &'static str = "\u{EAE0}"; +pub const FIGMA_LOGO: &'static str = "\u{EAE1}"; +pub const FILE: &'static str = "\u{EAE2}"; +pub const FILE_ARCHIVE: &'static str = "\u{EAE3}"; +pub const FILE_ARROW_DOWN: &'static str = "\u{EAE4}"; +pub const FILE_ARROW_UP: &'static str = "\u{EAE5}"; +pub const FILE_AUDIO: &'static str = "\u{EAE6}"; +pub const FILE_CLOUD: &'static str = "\u{EAE7}"; +pub const FILE_CODE: &'static str = "\u{EAE8}"; +pub const FILE_CSS: &'static str = "\u{EAE9}"; +pub const FILE_CSV: &'static str = "\u{EAEA}"; +pub const FILE_DASHED: &'static str = "\u{EAEB}"; +pub const FILE_DOTTED: &'static str = "\u{EAEB}"; +pub const FILE_DOC: &'static str = "\u{EAEC}"; +pub const FILE_HTML: &'static str = "\u{EAED}"; +pub const FILE_IMAGE: &'static str = "\u{EAEE}"; +pub const FILE_JPG: &'static str = "\u{EAEF}"; +pub const FILE_JS: &'static str = "\u{EAF0}"; +pub const FILE_JSX: &'static str = "\u{EAF1}"; +pub const FILE_LOCK: &'static str = "\u{EAF2}"; +pub const FILE_MAGNIFYING_GLASS: &'static str = "\u{EAF3}"; +pub const FILE_SEARCH: &'static str = "\u{EAF3}"; +pub const FILE_MINUS: &'static str = "\u{EAF4}"; +pub const FILE_PDF: &'static str = "\u{EAF5}"; +pub const FILE_PLUS: &'static str = "\u{EAF6}"; +pub const FILE_PNG: &'static str = "\u{EAF7}"; +pub const FILE_PPT: &'static str = "\u{EAF8}"; +pub const FILE_RS: &'static str = "\u{EAF9}"; +pub const FILES: &'static str = "\u{EAFA}"; +pub const FILE_SQL: &'static str = "\u{EAFB}"; +pub const FILE_SVG: &'static str = "\u{EAFC}"; +pub const FILE_TEXT: &'static str = "\u{EAFD}"; +pub const FILE_TS: &'static str = "\u{EAFE}"; +pub const FILE_TSX: &'static str = "\u{EAFF}"; +pub const FILE_VIDEO: &'static str = "\u{EB00}"; +pub const FILE_VUE: &'static str = "\u{EB01}"; +pub const FILE_X: &'static str = "\u{EB02}"; +pub const FILE_XLS: &'static str = "\u{EB03}"; +pub const FILE_ZIP: &'static str = "\u{EB04}"; +pub const FILM_REEL: &'static str = "\u{EB05}"; +pub const FILM_SCRIPT: &'static str = "\u{EB06}"; +pub const FILM_SLATE: &'static str = "\u{EB07}"; +pub const FILM_STRIP: &'static str = "\u{EB08}"; +pub const FINGERPRINT: &'static str = "\u{EB09}"; +pub const FINGERPRINT_SIMPLE: &'static str = "\u{EB0A}"; +pub const FINN_THE_HUMAN: &'static str = "\u{EB0B}"; +pub const FIRE: &'static str = "\u{EB0C}"; +pub const FIRE_EXTINGUISHER: &'static str = "\u{EB0D}"; +pub const FIRE_SIMPLE: &'static str = "\u{EB0E}"; +pub const FIRST_AID: &'static str = "\u{EB0F}"; +pub const FIRST_AID_KIT: &'static str = "\u{EB10}"; +pub const FISH: &'static str = "\u{EB11}"; +pub const FISH_SIMPLE: &'static str = "\u{EB12}"; +pub const FLAG: &'static str = "\u{EB13}"; +pub const FLAG_BANNER: &'static str = "\u{EB14}"; +pub const FLAG_CHECKERED: &'static str = "\u{EB15}"; +pub const FLAG_PENNANT: &'static str = "\u{EB16}"; +pub const FLAME: &'static str = "\u{EB17}"; +pub const FLASHLIGHT: &'static str = "\u{EB18}"; +pub const FLASK: &'static str = "\u{EB19}"; +pub const FLOPPY_DISK: &'static str = "\u{EB1A}"; +pub const FLOPPY_DISK_BACK: &'static str = "\u{EB1B}"; +pub const FLOW_ARROW: &'static str = "\u{EB1C}"; +pub const FLOWER: &'static str = "\u{EB1D}"; +pub const FLOWER_LOTUS: &'static str = "\u{EB1E}"; +pub const FLOWER_TULIP: &'static str = "\u{EB1F}"; +pub const FLYING_SAUCER: &'static str = "\u{EB20}"; +pub const FOLDER: &'static str = "\u{EB21}"; +pub const FOLDER_DASHED: &'static str = "\u{EB22}"; +pub const FOLDER_DOTTED: &'static str = "\u{EB22}"; +pub const FOLDER_LOCK: &'static str = "\u{EB23}"; +pub const FOLDER_MINUS: &'static str = "\u{EB24}"; +pub const FOLDER_NOTCH: &'static str = "\u{EB25}"; +pub const FOLDER_NOTCH_MINUS: &'static str = "\u{EB26}"; +pub const FOLDER_NOTCH_OPEN: &'static str = "\u{EB27}"; +pub const FOLDER_NOTCH_PLUS: &'static str = "\u{EB28}"; +pub const FOLDER_OPEN: &'static str = "\u{EB29}"; +pub const FOLDER_PLUS: &'static str = "\u{EB2A}"; +pub const FOLDERS: &'static str = "\u{EB2B}"; +pub const FOLDER_SIMPLE: &'static str = "\u{EB2C}"; +pub const FOLDER_SIMPLE_DASHED: &'static str = "\u{EB2D}"; +pub const FOLDER_SIMPLE_DOTTED: &'static str = "\u{EB2D}"; +pub const FOLDER_SIMPLE_LOCK: &'static str = "\u{EB2E}"; +pub const FOLDER_SIMPLE_MINUS: &'static str = "\u{EB2F}"; +pub const FOLDER_SIMPLE_PLUS: &'static str = "\u{EB30}"; +pub const FOLDER_SIMPLE_STAR: &'static str = "\u{EB31}"; +pub const FOLDER_SIMPLE_USER: &'static str = "\u{EB32}"; +pub const FOLDER_STAR: &'static str = "\u{EB33}"; +pub const FOLDER_USER: &'static str = "\u{EB34}"; +pub const FOOTBALL: &'static str = "\u{EB35}"; +pub const FOOTPRINTS: &'static str = "\u{EB36}"; +pub const FORK_KNIFE: &'static str = "\u{EB37}"; +pub const FRAME_CORNERS: &'static str = "\u{EB38}"; +pub const FRAMER_LOGO: &'static str = "\u{EB39}"; +pub const FUNCTION: &'static str = "\u{EB3A}"; +pub const FUNNEL: &'static str = "\u{EB3B}"; +pub const FUNNEL_SIMPLE: &'static str = "\u{EB3C}"; +pub const GAME_CONTROLLER: &'static str = "\u{EB3D}"; +pub const GARAGE: &'static str = "\u{EB3E}"; +pub const GAS_CAN: &'static str = "\u{EB3F}"; +pub const GAS_PUMP: &'static str = "\u{EB40}"; +pub const GAUGE: &'static str = "\u{EB41}"; +pub const GAVEL: &'static str = "\u{EB42}"; +pub const GEAR: &'static str = "\u{EB43}"; +pub const GEAR_FINE: &'static str = "\u{EB44}"; +pub const GEAR_SIX: &'static str = "\u{EB45}"; +pub const GENDER_FEMALE: &'static str = "\u{EB46}"; +pub const GENDER_INTERSEX: &'static str = "\u{EB47}"; +pub const GENDER_MALE: &'static str = "\u{EB48}"; +pub const GENDER_NEUTER: &'static str = "\u{EB49}"; +pub const GENDER_NONBINARY: &'static str = "\u{EB4A}"; +pub const GENDER_TRANSGENDER: &'static str = "\u{EB4B}"; +pub const GHOST: &'static str = "\u{EB4C}"; +pub const GIF: &'static str = "\u{EB4D}"; +pub const GIFT: &'static str = "\u{EB4E}"; +pub const GIT_BRANCH: &'static str = "\u{EB4F}"; +pub const GIT_COMMIT: &'static str = "\u{EB50}"; +pub const GIT_DIFF: &'static str = "\u{EB51}"; +pub const GIT_FORK: &'static str = "\u{EB52}"; +pub const GITHUB_LOGO: &'static str = "\u{EB53}"; +pub const GITLAB_LOGO: &'static str = "\u{EB54}"; +pub const GITLAB_LOGO_SIMPLE: &'static str = "\u{EB55}"; +pub const GIT_MERGE: &'static str = "\u{EB56}"; +pub const GIT_PULL_REQUEST: &'static str = "\u{EB57}"; +pub const GLOBE: &'static str = "\u{EB58}"; +pub const GLOBE_HEMISPHERE_EAST: &'static str = "\u{EB59}"; +pub const GLOBE_HEMISPHERE_WEST: &'static str = "\u{EB5A}"; +pub const GLOBE_SIMPLE: &'static str = "\u{EB5B}"; +pub const GLOBE_STAND: &'static str = "\u{EB5C}"; +pub const GOGGLES: &'static str = "\u{EB5D}"; +pub const GOODREADS_LOGO: &'static str = "\u{EB5E}"; +pub const GOOGLE_CARDBOARD_LOGO: &'static str = "\u{EB5F}"; +pub const GOOGLE_CHROME_LOGO: &'static str = "\u{EB60}"; +pub const GOOGLE_DRIVE_LOGO: &'static str = "\u{EB61}"; +pub const GOOGLE_LOGO: &'static str = "\u{EB62}"; +pub const GOOGLE_PHOTOS_LOGO: &'static str = "\u{EB63}"; +pub const GOOGLE_PLAY_LOGO: &'static str = "\u{EB64}"; +pub const GOOGLE_PODCASTS_LOGO: &'static str = "\u{EB65}"; +pub const GRADIENT: &'static str = "\u{EB66}"; +pub const GRADUATION_CAP: &'static str = "\u{EB67}"; +pub const GRAINS: &'static str = "\u{EB68}"; +pub const GRAINS_SLASH: &'static str = "\u{EB69}"; +pub const GRAPH: &'static str = "\u{EB6A}"; +pub const GRID_FOUR: &'static str = "\u{EB6B}"; +pub const GRID_NINE: &'static str = "\u{EB6C}"; +pub const GUITAR: &'static str = "\u{EB6D}"; +pub const HAMBURGER: &'static str = "\u{EB6E}"; +pub const HAMMER: &'static str = "\u{EB6F}"; +pub const HAND: &'static str = "\u{EB70}"; +pub const HANDBAG: &'static str = "\u{EB71}"; +pub const HANDBAG_SIMPLE: &'static str = "\u{EB72}"; +pub const HAND_COINS: &'static str = "\u{EB73}"; +pub const HAND_EYE: &'static str = "\u{EB74}"; +pub const HAND_FIST: &'static str = "\u{EB75}"; +pub const HAND_GRABBING: &'static str = "\u{EB76}"; +pub const HAND_HEART: &'static str = "\u{EB77}"; +pub const HAND_PALM: &'static str = "\u{EB78}"; +pub const HAND_POINTING: &'static str = "\u{EB79}"; +pub const HANDS_CLAPPING: &'static str = "\u{EB7A}"; +pub const HANDSHAKE: &'static str = "\u{EB7B}"; +pub const HAND_SOAP: &'static str = "\u{EB7C}"; +pub const HANDS_PRAYING: &'static str = "\u{EB7D}"; +pub const HAND_SWIPE_LEFT: &'static str = "\u{EB7E}"; +pub const HAND_SWIPE_RIGHT: &'static str = "\u{EB7F}"; +pub const HAND_TAP: &'static str = "\u{EB80}"; +pub const HAND_WAVING: &'static str = "\u{EB81}"; +pub const HARD_DRIVE: &'static str = "\u{EB82}"; +pub const HARD_DRIVES: &'static str = "\u{EB83}"; +pub const HASH: &'static str = "\u{EB84}"; +pub const HASH_STRAIGHT: &'static str = "\u{EB85}"; +pub const HEADLIGHTS: &'static str = "\u{EB86}"; +pub const HEADPHONES: &'static str = "\u{EB87}"; +pub const HEADSET: &'static str = "\u{EB88}"; +pub const HEART: &'static str = "\u{EB89}"; +pub const HEARTBEAT: &'static str = "\u{EB8A}"; +pub const HEART_BREAK: &'static str = "\u{EB8B}"; +pub const HEART_HALF: &'static str = "\u{EB8C}"; +pub const HEART_STRAIGHT: &'static str = "\u{EB8D}"; +pub const HEART_STRAIGHT_BREAK: &'static str = "\u{EB8E}"; +pub const HEXAGON: &'static str = "\u{EB8F}"; +pub const HIGH_HEEL: &'static str = "\u{EB90}"; +pub const HIGHLIGHTER_CIRCLE: &'static str = "\u{EB91}"; +pub const HOODIE: &'static str = "\u{EB92}"; +pub const HORSE: &'static str = "\u{EB93}"; +pub const HOURGLASS: &'static str = "\u{EB94}"; +pub const HOURGLASS_HIGH: &'static str = "\u{EB95}"; +pub const HOURGLASS_LOW: &'static str = "\u{EB96}"; +pub const HOURGLASS_MEDIUM: &'static str = "\u{EB97}"; +pub const HOURGLASS_SIMPLE: &'static str = "\u{EB98}"; +pub const HOURGLASS_SIMPLE_HIGH: &'static str = "\u{EB99}"; +pub const HOURGLASS_SIMPLE_LOW: &'static str = "\u{EB9A}"; +pub const HOURGLASS_SIMPLE_MEDIUM: &'static str = "\u{EB9B}"; +pub const HOUSE: &'static str = "\u{EB9C}"; +pub const HOUSE_LINE: &'static str = "\u{EB9D}"; +pub const HOUSE_SIMPLE: &'static str = "\u{EB9E}"; +pub const ICE_CREAM: &'static str = "\u{EB9F}"; +pub const IDENTIFICATION_BADGE: &'static str = "\u{EBA0}"; +pub const IDENTIFICATION_CARD: &'static str = "\u{EBA1}"; +pub const IMAGE: &'static str = "\u{EBA2}"; +pub const IMAGES: &'static str = "\u{EBA3}"; +pub const IMAGE_SQUARE: &'static str = "\u{EBA4}"; +pub const IMAGES_SQUARE: &'static str = "\u{EBA5}"; +pub const INFINITY: &'static str = "\u{EBA6}"; +pub const INFO: &'static str = "\u{EBA7}"; +pub const INSTAGRAM_LOGO: &'static str = "\u{EBA8}"; +pub const INTERSECT: &'static str = "\u{EBA9}"; +pub const INTERSECT_SQUARE: &'static str = "\u{EBAA}"; +pub const INTERSECT_THREE: &'static str = "\u{EBAB}"; +pub const JEEP: &'static str = "\u{EBAC}"; +pub const KANBAN: &'static str = "\u{EBAD}"; +pub const KEY: &'static str = "\u{EBAE}"; +pub const KEYBOARD: &'static str = "\u{EBAF}"; +pub const KEYHOLE: &'static str = "\u{EBB0}"; +pub const KEY_RETURN: &'static str = "\u{EBB1}"; +pub const KNIFE: &'static str = "\u{EBB2}"; +pub const LADDER: &'static str = "\u{EBB3}"; +pub const LADDER_SIMPLE: &'static str = "\u{EBB4}"; +pub const LAMP: &'static str = "\u{EBB5}"; +pub const LAPTOP: &'static str = "\u{EBB6}"; +pub const LAYOUT: &'static str = "\u{EBB7}"; +pub const LEAF: &'static str = "\u{EBB8}"; +pub const LIFEBUOY: &'static str = "\u{EBB9}"; +pub const LIGHTBULB: &'static str = "\u{EBBA}"; +pub const LIGHTBULB_FILAMENT: &'static str = "\u{EBBB}"; +pub const LIGHTHOUSE: &'static str = "\u{EBBC}"; +pub const LIGHTNING: &'static str = "\u{EBBD}"; +pub const LIGHTNING_A: &'static str = "\u{EBBE}"; +pub const LIGHTNING_SLASH: &'static str = "\u{EBBF}"; +pub const LINE_SEGMENT: &'static str = "\u{EBC0}"; +pub const LINE_SEGMENTS: &'static str = "\u{EBC1}"; +pub const LINK: &'static str = "\u{EBC2}"; +pub const LINK_BREAK: &'static str = "\u{EBC3}"; +pub const LINKEDIN_LOGO: &'static str = "\u{EBC4}"; +pub const LINK_SIMPLE: &'static str = "\u{EBC5}"; +pub const LINK_SIMPLE_BREAK: &'static str = "\u{EBC6}"; +pub const LINK_SIMPLE_HORIZONTAL: &'static str = "\u{EBC7}"; +pub const LINK_SIMPLE_HORIZONTAL_BREAK: &'static str = "\u{EBC8}"; +pub const LINUX_LOGO: &'static str = "\u{EBC9}"; +pub const LIST: &'static str = "\u{EBCA}"; +pub const LIST_BULLETS: &'static str = "\u{EBCB}"; +pub const LIST_CHECKS: &'static str = "\u{EBCC}"; +pub const LIST_DASHES: &'static str = "\u{EBCD}"; +pub const LIST_MAGNIFYING_GLASS: &'static str = "\u{EBCE}"; +pub const LIST_NUMBERS: &'static str = "\u{EBCF}"; +pub const LIST_PLUS: &'static str = "\u{EBD0}"; +pub const LOCK: &'static str = "\u{EBD1}"; +pub const LOCKERS: &'static str = "\u{EBD2}"; +pub const LOCK_KEY: &'static str = "\u{EBD3}"; +pub const LOCK_KEY_OPEN: &'static str = "\u{EBD4}"; +pub const LOCK_LAMINATED: &'static str = "\u{EBD5}"; +pub const LOCK_LAMINATED_OPEN: &'static str = "\u{EBD6}"; +pub const LOCK_OPEN: &'static str = "\u{EBD7}"; +pub const LOCK_SIMPLE: &'static str = "\u{EBD8}"; +pub const LOCK_SIMPLE_OPEN: &'static str = "\u{EBD9}"; +pub const MAGIC_WAND: &'static str = "\u{EBDA}"; +pub const MAGNET: &'static str = "\u{EBDB}"; +pub const MAGNET_STRAIGHT: &'static str = "\u{EBDC}"; +pub const MAGNIFYING_GLASS: &'static str = "\u{EBDD}"; +pub const MAGNIFYING_GLASS_MINUS: &'static str = "\u{EBDE}"; +pub const MAGNIFYING_GLASS_PLUS: &'static str = "\u{EBDF}"; +pub const MAP_PIN: &'static str = "\u{EBE0}"; +pub const MAP_PIN_LINE: &'static str = "\u{EBE1}"; +pub const MAP_TRIFOLD: &'static str = "\u{EBE2}"; +pub const MARKER_CIRCLE: &'static str = "\u{EBE3}"; +pub const MARTINI: &'static str = "\u{EBE4}"; +pub const MASK_HAPPY: &'static str = "\u{EBE5}"; +pub const MASK_SAD: &'static str = "\u{EBE6}"; +pub const MATH_OPERATIONS: &'static str = "\u{EBE7}"; +pub const MEDAL: &'static str = "\u{EBE8}"; +pub const MEDAL_MILITARY: &'static str = "\u{EBE9}"; +pub const MEDIUM_LOGO: &'static str = "\u{EBEA}"; +pub const MEGAPHONE: &'static str = "\u{EBEB}"; +pub const MEGAPHONE_SIMPLE: &'static str = "\u{EBEC}"; +pub const MESSENGER_LOGO: &'static str = "\u{EBED}"; +pub const META_LOGO: &'static str = "\u{EBEE}"; +pub const METRONOME: &'static str = "\u{EBEF}"; +pub const MICROPHONE: &'static str = "\u{EBF0}"; +pub const MICROPHONE_SLASH: &'static str = "\u{EBF1}"; +pub const MICROPHONE_STAGE: &'static str = "\u{EBF2}"; +pub const MICROSOFT_EXCEL_LOGO: &'static str = "\u{EBF3}"; +pub const MICROSOFT_OUTLOOK_LOGO: &'static str = "\u{EBF4}"; +pub const MICROSOFT_POWERPOINT_LOGO: &'static str = "\u{EBF5}"; +pub const MICROSOFT_TEAMS_LOGO: &'static str = "\u{EBF6}"; +pub const MICROSOFT_WORD_LOGO: &'static str = "\u{EBF7}"; +pub const MINUS: &'static str = "\u{EBF8}"; +pub const MINUS_CIRCLE: &'static str = "\u{EBF9}"; +pub const MINUS_SQUARE: &'static str = "\u{EBFA}"; +pub const MONEY: &'static str = "\u{EBFB}"; +pub const MONITOR: &'static str = "\u{EBFC}"; +pub const MONITOR_PLAY: &'static str = "\u{EBFD}"; +pub const MOON: &'static str = "\u{EBFE}"; +pub const MOON_STARS: &'static str = "\u{EBFF}"; +pub const MOPED: &'static str = "\u{EC00}"; +pub const MOPED_FRONT: &'static str = "\u{EC01}"; +pub const MOSQUE: &'static str = "\u{EC02}"; +pub const MOTORCYCLE: &'static str = "\u{EC03}"; +pub const MOUNTAINS: &'static str = "\u{EC04}"; +pub const MOUSE: &'static str = "\u{EC05}"; +pub const MOUSE_SIMPLE: &'static str = "\u{EC06}"; +pub const MUSIC_NOTE: &'static str = "\u{EC07}"; +pub const MUSIC_NOTES: &'static str = "\u{EC08}"; +pub const MUSIC_NOTE_SIMPLE: &'static str = "\u{EC09}"; +pub const MUSIC_NOTES_PLUS: &'static str = "\u{EC0A}"; +pub const MUSIC_NOTES_SIMPLE: &'static str = "\u{EC0B}"; +pub const NAVIGATION_ARROW: &'static str = "\u{EC0C}"; +pub const NEEDLE: &'static str = "\u{EC0D}"; +pub const NEWSPAPER: &'static str = "\u{EC0E}"; +pub const NEWSPAPER_CLIPPING: &'static str = "\u{EC0F}"; +pub const NOTCHES: &'static str = "\u{EC10}"; +pub const NOTE: &'static str = "\u{EC11}"; +pub const NOTE_BLANK: &'static str = "\u{EC12}"; +pub const NOTEBOOK: &'static str = "\u{EC13}"; +pub const NOTEPAD: &'static str = "\u{EC14}"; +pub const NOTE_PENCIL: &'static str = "\u{EC15}"; +pub const NOTIFICATION: &'static str = "\u{EC16}"; +pub const NOTION_LOGO: &'static str = "\u{EC17}"; +pub const NUMBER_CIRCLE_EIGHT: &'static str = "\u{EC18}"; +pub const NUMBER_CIRCLE_FIVE: &'static str = "\u{EC19}"; +pub const NUMBER_CIRCLE_FOUR: &'static str = "\u{EC1A}"; +pub const NUMBER_CIRCLE_NINE: &'static str = "\u{EC1B}"; +pub const NUMBER_CIRCLE_ONE: &'static str = "\u{EC1C}"; +pub const NUMBER_CIRCLE_SEVEN: &'static str = "\u{EC1D}"; +pub const NUMBER_CIRCLE_SIX: &'static str = "\u{EC1E}"; +pub const NUMBER_CIRCLE_THREE: &'static str = "\u{EC1F}"; +pub const NUMBER_CIRCLE_TWO: &'static str = "\u{EC20}"; +pub const NUMBER_CIRCLE_ZERO: &'static str = "\u{EC21}"; +pub const NUMBER_EIGHT: &'static str = "\u{EC22}"; +pub const NUMBER_FIVE: &'static str = "\u{EC23}"; +pub const NUMBER_FOUR: &'static str = "\u{EC24}"; +pub const NUMBER_NINE: &'static str = "\u{EC25}"; +pub const NUMBER_ONE: &'static str = "\u{EC26}"; +pub const NUMBER_SEVEN: &'static str = "\u{EC27}"; +pub const NUMBER_SIX: &'static str = "\u{EC28}"; +pub const NUMBER_SQUARE_EIGHT: &'static str = "\u{EC29}"; +pub const NUMBER_SQUARE_FIVE: &'static str = "\u{EC2A}"; +pub const NUMBER_SQUARE_FOUR: &'static str = "\u{EC2B}"; +pub const NUMBER_SQUARE_NINE: &'static str = "\u{EC2C}"; +pub const NUMBER_SQUARE_ONE: &'static str = "\u{EC2D}"; +pub const NUMBER_SQUARE_SEVEN: &'static str = "\u{EC2E}"; +pub const NUMBER_SQUARE_SIX: &'static str = "\u{EC2F}"; +pub const NUMBER_SQUARE_THREE: &'static str = "\u{EC30}"; +pub const NUMBER_SQUARE_TWO: &'static str = "\u{EC31}"; +pub const NUMBER_SQUARE_ZERO: &'static str = "\u{EC32}"; +pub const NUMBER_THREE: &'static str = "\u{EC33}"; +pub const NUMBER_TWO: &'static str = "\u{EC34}"; +pub const NUMBER_ZERO: &'static str = "\u{EC35}"; +pub const NUT: &'static str = "\u{EC36}"; +pub const NY_TIMES_LOGO: &'static str = "\u{EC37}"; +pub const OCTAGON: &'static str = "\u{EC38}"; +pub const OFFICE_CHAIR: &'static str = "\u{EC39}"; +pub const OPTION: &'static str = "\u{EC3A}"; +pub const ORANGE_SLICE: &'static str = "\u{EC3B}"; +pub const PACKAGE: &'static str = "\u{EC3C}"; +pub const PAINT_BRUSH: &'static str = "\u{EC3D}"; +pub const PAINT_BRUSH_BROAD: &'static str = "\u{EC3E}"; +pub const PAINT_BRUSH_HOUSEHOLD: &'static str = "\u{EC3F}"; +pub const PAINT_BUCKET: &'static str = "\u{EC40}"; +pub const PAINT_ROLLER: &'static str = "\u{EC41}"; +pub const PALETTE: &'static str = "\u{EC42}"; +pub const PANTS: &'static str = "\u{EC43}"; +pub const PAPERCLIP: &'static str = "\u{EC44}"; +pub const PAPERCLIP_HORIZONTAL: &'static str = "\u{EC45}"; +pub const PAPER_PLANE: &'static str = "\u{EC46}"; +pub const PAPER_PLANE_RIGHT: &'static str = "\u{EC47}"; +pub const PAPER_PLANE_TILT: &'static str = "\u{EC48}"; +pub const PARACHUTE: &'static str = "\u{EC49}"; +pub const PARAGRAPH: &'static str = "\u{EC4A}"; +pub const PARALLELOGRAM: &'static str = "\u{EC4B}"; +pub const PARK: &'static str = "\u{EC4C}"; +pub const PASSWORD: &'static str = "\u{EC4D}"; +pub const PATH: &'static str = "\u{EC4E}"; +pub const PATREON_LOGO: &'static str = "\u{EC4F}"; +pub const PAUSE: &'static str = "\u{EC50}"; +pub const PAUSE_CIRCLE: &'static str = "\u{EC51}"; +pub const PAW_PRINT: &'static str = "\u{EC52}"; +pub const PAYPAL_LOGO: &'static str = "\u{EC53}"; +pub const PEACE: &'static str = "\u{EC54}"; +pub const PEN: &'static str = "\u{EC55}"; +pub const PENCIL: &'static str = "\u{EC56}"; +pub const PENCIL_CIRCLE: &'static str = "\u{EC57}"; +pub const PENCIL_LINE: &'static str = "\u{EC58}"; +pub const PENCIL_SIMPLE: &'static str = "\u{EC59}"; +pub const PENCIL_SIMPLE_LINE: &'static str = "\u{EC5A}"; +pub const PENCIL_SIMPLE_SLASH: &'static str = "\u{EC5B}"; +pub const PENCIL_SLASH: &'static str = "\u{EC5C}"; +pub const PEN_NIB: &'static str = "\u{EC5D}"; +pub const PEN_NIB_STRAIGHT: &'static str = "\u{EC5E}"; +pub const PENTAGRAM: &'static str = "\u{EC5F}"; +pub const PEPPER: &'static str = "\u{EC60}"; +pub const PERCENT: &'static str = "\u{EC61}"; +pub const PERSON: &'static str = "\u{EC62}"; +pub const PERSON_ARMS_SPREAD: &'static str = "\u{EC63}"; +pub const PERSON_SIMPLE: &'static str = "\u{EC64}"; +pub const PERSON_SIMPLE_BIKE: &'static str = "\u{EC65}"; +pub const PERSON_SIMPLE_RUN: &'static str = "\u{EC66}"; +pub const PERSON_SIMPLE_THROW: &'static str = "\u{EC67}"; +pub const PERSON_SIMPLE_WALK: &'static str = "\u{EC68}"; +pub const PERSPECTIVE: &'static str = "\u{EC69}"; +pub const PHONE: &'static str = "\u{EC6A}"; +pub const PHONE_CALL: &'static str = "\u{EC6B}"; +pub const PHONE_DISCONNECT: &'static str = "\u{EC6C}"; +pub const PHONE_INCOMING: &'static str = "\u{EC6D}"; +pub const PHONE_OUTGOING: &'static str = "\u{EC6E}"; +pub const PHONE_PLUS: &'static str = "\u{EC6F}"; +pub const PHONE_SLASH: &'static str = "\u{EC70}"; +pub const PHONE_X: &'static str = "\u{EC71}"; +pub const PHOSPHOR_LOGO: &'static str = "\u{EC72}"; +pub const PI: &'static str = "\u{EC73}"; +pub const PIANO_KEYS: &'static str = "\u{EC74}"; +pub const PICTURE_IN_PICTURE: &'static str = "\u{EC75}"; +pub const PIGGY_BANK: &'static str = "\u{EC76}"; +pub const PILL: &'static str = "\u{EC77}"; +pub const PINTEREST_LOGO: &'static str = "\u{EC78}"; +pub const PINWHEEL: &'static str = "\u{EC79}"; +pub const PIZZA: &'static str = "\u{EC7A}"; +pub const PLACEHOLDER: &'static str = "\u{EC7B}"; +pub const PLANET: &'static str = "\u{EC7C}"; +pub const PLANT: &'static str = "\u{EC7D}"; +pub const PLAY: &'static str = "\u{EC7E}"; +pub const PLAY_CIRCLE: &'static str = "\u{EC7F}"; +pub const PLAYLIST: &'static str = "\u{EC80}"; +pub const PLAY_PAUSE: &'static str = "\u{EC81}"; +pub const PLUG: &'static str = "\u{EC82}"; +pub const PLUG_CHARGING: &'static str = "\u{EC83}"; +pub const PLUGS: &'static str = "\u{EC84}"; +pub const PLUGS_CONNECTED: &'static str = "\u{EC85}"; +pub const PLUS: &'static str = "\u{EC86}"; +pub const PLUS_CIRCLE: &'static str = "\u{EC87}"; +pub const PLUS_MINUS: &'static str = "\u{EC88}"; +pub const PLUS_SQUARE: &'static str = "\u{EC89}"; +pub const POKER_CHIP: &'static str = "\u{EC8A}"; +pub const POLICE_CAR: &'static str = "\u{EC8B}"; +pub const POLYGON: &'static str = "\u{EC8C}"; +pub const POPCORN: &'static str = "\u{EC8D}"; +pub const POTTED_PLANT: &'static str = "\u{EC8E}"; +pub const POWER: &'static str = "\u{EC8F}"; +pub const PRESCRIPTION: &'static str = "\u{EC90}"; +pub const PRESENTATION: &'static str = "\u{EC91}"; +pub const PRESENTATION_CHART: &'static str = "\u{EC92}"; +pub const PRINTER: &'static str = "\u{EC93}"; +pub const PROHIBIT: &'static str = "\u{EC94}"; +pub const PROHIBIT_INSET: &'static str = "\u{EC95}"; +pub const PROJECTOR_SCREEN: &'static str = "\u{EC96}"; +pub const PROJECTOR_SCREEN_CHART: &'static str = "\u{EC97}"; +pub const PULSE: &'static str = "\u{EC98}"; +pub const ACTIVITY: &'static str = "\u{EC98}"; +pub const PUSH_PIN: &'static str = "\u{EC99}"; +pub const PUSH_PIN_SIMPLE: &'static str = "\u{EC9A}"; +pub const PUSH_PIN_SIMPLE_SLASH: &'static str = "\u{EC9B}"; +pub const PUSH_PIN_SLASH: &'static str = "\u{EC9C}"; +pub const PUZZLE_PIECE: &'static str = "\u{EC9D}"; +pub const QR_CODE: &'static str = "\u{EC9E}"; +pub const QUESTION: &'static str = "\u{EC9F}"; +pub const QUEUE: &'static str = "\u{ECA0}"; +pub const QUOTES: &'static str = "\u{ECA1}"; +pub const RADICAL: &'static str = "\u{ECA2}"; +pub const RADIO: &'static str = "\u{ECA3}"; +pub const RADIOACTIVE: &'static str = "\u{ECA4}"; +pub const RADIO_BUTTON: &'static str = "\u{ECA5}"; +pub const RAINBOW: &'static str = "\u{ECA6}"; +pub const RAINBOW_CLOUD: &'static str = "\u{ECA7}"; +pub const READ_CV_LOGO: &'static str = "\u{ECA8}"; +pub const RECEIPT: &'static str = "\u{ECA9}"; +pub const RECEIPT_X: &'static str = "\u{ECAA}"; +pub const RECORD: &'static str = "\u{ECAB}"; +pub const RECTANGLE: &'static str = "\u{ECAC}"; +pub const RECYCLE: &'static str = "\u{ECAD}"; +pub const REDDIT_LOGO: &'static str = "\u{ECAE}"; +pub const REPEAT: &'static str = "\u{ECAF}"; +pub const REPEAT_ONCE: &'static str = "\u{ECB0}"; +pub const REWIND: &'static str = "\u{ECB1}"; +pub const REWIND_CIRCLE: &'static str = "\u{ECB2}"; +pub const ROAD_HORIZON: &'static str = "\u{ECB3}"; +pub const ROBOT: &'static str = "\u{ECB4}"; +pub const ROCKET: &'static str = "\u{ECB5}"; +pub const ROCKET_LAUNCH: &'static str = "\u{ECB6}"; +pub const ROWS: &'static str = "\u{ECB7}"; +pub const RSS: &'static str = "\u{ECB8}"; +pub const RSS_SIMPLE: &'static str = "\u{ECB9}"; +pub const RUG: &'static str = "\u{ECBA}"; +pub const RULER: &'static str = "\u{ECBB}"; +pub const SCALES: &'static str = "\u{ECBC}"; +pub const SCAN: &'static str = "\u{ECBD}"; +pub const SCISSORS: &'static str = "\u{ECBE}"; +pub const SCOOTER: &'static str = "\u{ECBF}"; +pub const SCREENCAST: &'static str = "\u{ECC0}"; +pub const SCRIBBLE_LOOP: &'static str = "\u{ECC1}"; +pub const SCROLL: &'static str = "\u{ECC2}"; +pub const SEAL: &'static str = "\u{ECC3}"; +pub const CIRCLE_WAVY: &'static str = "\u{ECC3}"; +pub const SEAL_CHECK: &'static str = "\u{ECC4}"; +pub const CIRCLE_WAVY_CHECK: &'static str = "\u{ECC4}"; +pub const SEAL_QUESTION: &'static str = "\u{ECC5}"; +pub const CIRCLE_WAVY_QUESTION: &'static str = "\u{ECC5}"; +pub const SEAL_WARNING: &'static str = "\u{ECC6}"; +pub const CIRCLE_WAVY_WARNING: &'static str = "\u{ECC6}"; +pub const SELECTION: &'static str = "\u{ECC7}"; +pub const SELECTION_ALL: &'static str = "\u{ECC8}"; +pub const SELECTION_BACKGROUND: &'static str = "\u{ECC9}"; +pub const SELECTION_FOREGROUND: &'static str = "\u{ECCA}"; +pub const SELECTION_INVERSE: &'static str = "\u{ECCB}"; +pub const SELECTION_PLUS: &'static str = "\u{ECCC}"; +pub const SELECTION_SLASH: &'static str = "\u{ECCD}"; +pub const SHAPES: &'static str = "\u{ECCE}"; +pub const SHARE: &'static str = "\u{ECCF}"; +pub const SHARE_FAT: &'static str = "\u{ECD0}"; +pub const SHARE_NETWORK: &'static str = "\u{ECD1}"; +pub const SHIELD: &'static str = "\u{ECD2}"; +pub const SHIELD_CHECK: &'static str = "\u{ECD3}"; +pub const SHIELD_CHECKERED: &'static str = "\u{ECD4}"; +pub const SHIELD_CHEVRON: &'static str = "\u{ECD5}"; +pub const SHIELD_PLUS: &'static str = "\u{ECD6}"; +pub const SHIELD_SLASH: &'static str = "\u{ECD7}"; +pub const SHIELD_STAR: &'static str = "\u{ECD8}"; +pub const SHIELD_WARNING: &'static str = "\u{ECD9}"; +pub const SHIRT_FOLDED: &'static str = "\u{ECDA}"; +pub const SHOOTING_STAR: &'static str = "\u{ECDB}"; +pub const SHOPPING_BAG: &'static str = "\u{ECDC}"; +pub const SHOPPING_BAG_OPEN: &'static str = "\u{ECDD}"; +pub const SHOPPING_CART: &'static str = "\u{ECDE}"; +pub const SHOPPING_CART_SIMPLE: &'static str = "\u{ECDF}"; +pub const SHOWER: &'static str = "\u{ECE0}"; +pub const SHRIMP: &'static str = "\u{ECE1}"; +pub const SHUFFLE: &'static str = "\u{ECE2}"; +pub const SHUFFLE_ANGULAR: &'static str = "\u{ECE3}"; +pub const SHUFFLE_SIMPLE: &'static str = "\u{ECE4}"; +pub const SIDEBAR: &'static str = "\u{ECE5}"; +pub const SIDEBAR_SIMPLE: &'static str = "\u{ECE6}"; +pub const SIGMA: &'static str = "\u{ECE7}"; +pub const SIGNATURE: &'static str = "\u{ECE8}"; +pub const SIGN_IN: &'static str = "\u{ECE9}"; +pub const SIGN_OUT: &'static str = "\u{ECEA}"; +pub const SIGNPOST: &'static str = "\u{ECEB}"; +pub const SIM_CARD: &'static str = "\u{ECEC}"; +pub const SIREN: &'static str = "\u{ECED}"; +pub const SKETCH_LOGO: &'static str = "\u{ECEE}"; +pub const SKIP_BACK: &'static str = "\u{ECEF}"; +pub const SKIP_BACK_CIRCLE: &'static str = "\u{ECF0}"; +pub const SKIP_FORWARD: &'static str = "\u{ECF1}"; +pub const SKIP_FORWARD_CIRCLE: &'static str = "\u{ECF2}"; +pub const SKULL: &'static str = "\u{ECF3}"; +pub const SLACK_LOGO: &'static str = "\u{ECF4}"; +pub const SLIDERS: &'static str = "\u{ECF5}"; +pub const SLIDERS_HORIZONTAL: &'static str = "\u{ECF6}"; +pub const SLIDESHOW: &'static str = "\u{ECF7}"; +pub const SMILEY: &'static str = "\u{ECF8}"; +pub const SMILEY_ANGRY: &'static str = "\u{ECF9}"; +pub const SMILEY_BLANK: &'static str = "\u{ECFA}"; +pub const SMILEY_MEH: &'static str = "\u{ECFB}"; +pub const SMILEY_NERVOUS: &'static str = "\u{ECFC}"; +pub const SMILEY_SAD: &'static str = "\u{ECFD}"; +pub const SMILEY_STICKER: &'static str = "\u{ECFE}"; +pub const SMILEY_WINK: &'static str = "\u{ECFF}"; +pub const SMILEY_X_EYES: &'static str = "\u{ED00}"; +pub const SNAPCHAT_LOGO: &'static str = "\u{ED01}"; +pub const SNEAKER: &'static str = "\u{ED02}"; +pub const SNEAKER_MOVE: &'static str = "\u{ED03}"; +pub const SNOWFLAKE: &'static str = "\u{ED04}"; +pub const SOCCER_BALL: &'static str = "\u{ED05}"; +pub const SORT_ASCENDING: &'static str = "\u{ED06}"; +pub const SORT_DESCENDING: &'static str = "\u{ED07}"; +pub const SOUNDCLOUD_LOGO: &'static str = "\u{ED08}"; +pub const SPADE: &'static str = "\u{ED09}"; +pub const SPARKLE: &'static str = "\u{ED0A}"; +pub const SPEAKER_HIFI: &'static str = "\u{ED0B}"; +pub const SPEAKER_HIGH: &'static str = "\u{ED0C}"; +pub const SPEAKER_LOW: &'static str = "\u{ED0D}"; +pub const SPEAKER_NONE: &'static str = "\u{ED0E}"; +pub const SPEAKER_SIMPLE_HIGH: &'static str = "\u{ED0F}"; +pub const SPEAKER_SIMPLE_LOW: &'static str = "\u{ED10}"; +pub const SPEAKER_SIMPLE_NONE: &'static str = "\u{ED11}"; +pub const SPEAKER_SIMPLE_SLASH: &'static str = "\u{ED12}"; +pub const SPEAKER_SIMPLE_X: &'static str = "\u{ED13}"; +pub const SPEAKER_SLASH: &'static str = "\u{ED14}"; +pub const SPEAKER_X: &'static str = "\u{ED15}"; +pub const SPINNER: &'static str = "\u{ED16}"; +pub const SPINNER_GAP: &'static str = "\u{ED17}"; +pub const SPIRAL: &'static str = "\u{ED18}"; +pub const SPLIT_HORIZONTAL: &'static str = "\u{ED19}"; +pub const SPLIT_VERTICAL: &'static str = "\u{ED1A}"; +pub const SPOTIFY_LOGO: &'static str = "\u{ED1B}"; +pub const SQUARE: &'static str = "\u{ED1C}"; +pub const SQUARE_HALF: &'static str = "\u{ED1D}"; +pub const SQUARE_HALF_BOTTOM: &'static str = "\u{ED1E}"; +pub const SQUARE_LOGO: &'static str = "\u{ED1F}"; +pub const SQUARES_FOUR: &'static str = "\u{ED20}"; +pub const SQUARE_SPLIT_HORIZONTAL: &'static str = "\u{ED21}"; +pub const SQUARE_SPLIT_VERTICAL: &'static str = "\u{ED22}"; +pub const STACK: &'static str = "\u{ED23}"; +pub const STACK_OVERFLOW_LOGO: &'static str = "\u{ED24}"; +pub const STACK_SIMPLE: &'static str = "\u{ED25}"; +pub const STAIRS: &'static str = "\u{ED26}"; +pub const STAMP: &'static str = "\u{ED27}"; +pub const STAR: &'static str = "\u{ED28}"; +pub const STAR_AND_CRESCENT: &'static str = "\u{ED29}"; +pub const STAR_FOUR: &'static str = "\u{ED2A}"; +pub const STAR_HALF: &'static str = "\u{ED2B}"; +pub const STAR_OF_DAVID: &'static str = "\u{ED2C}"; +pub const STEERING_WHEEL: &'static str = "\u{ED2D}"; +pub const STEPS: &'static str = "\u{ED2E}"; +pub const STETHOSCOPE: &'static str = "\u{ED2F}"; +pub const STICKER: &'static str = "\u{ED30}"; +pub const STOOL: &'static str = "\u{ED31}"; +pub const STOP: &'static str = "\u{ED32}"; +pub const STOP_CIRCLE: &'static str = "\u{ED33}"; +pub const STOREFRONT: &'static str = "\u{ED34}"; +pub const STRATEGY: &'static str = "\u{ED35}"; +pub const STRIPE_LOGO: &'static str = "\u{ED36}"; +pub const STUDENT: &'static str = "\u{ED37}"; +pub const SUBTITLES: &'static str = "\u{ED38}"; +pub const SUBTRACT: &'static str = "\u{ED39}"; +pub const SUBTRACT_SQUARE: &'static str = "\u{ED3A}"; +pub const SUITCASE: &'static str = "\u{ED3B}"; +pub const SUITCASE_ROLLING: &'static str = "\u{ED3C}"; +pub const SUITCASE_SIMPLE: &'static str = "\u{ED3D}"; +pub const SUN: &'static str = "\u{ED3E}"; +pub const SUN_DIM: &'static str = "\u{ED3F}"; +pub const SUNGLASSES: &'static str = "\u{ED40}"; +pub const SUN_HORIZON: &'static str = "\u{ED41}"; +pub const SWAP: &'static str = "\u{ED42}"; +pub const SWATCHES: &'static str = "\u{ED43}"; +pub const SWIMMING_POOL: &'static str = "\u{ED44}"; +pub const SWORD: &'static str = "\u{ED45}"; +pub const SYNAGOGUE: &'static str = "\u{ED46}"; +pub const SYRINGE: &'static str = "\u{ED47}"; +pub const TABLE: &'static str = "\u{ED48}"; +pub const TABS: &'static str = "\u{ED49}"; +pub const TAG: &'static str = "\u{ED4A}"; +pub const TAG_CHEVRON: &'static str = "\u{ED4B}"; +pub const TAG_SIMPLE: &'static str = "\u{ED4C}"; +pub const TARGET: &'static str = "\u{ED4D}"; +pub const TAXI: &'static str = "\u{ED4E}"; +pub const TELEGRAM_LOGO: &'static str = "\u{ED4F}"; +pub const TELEVISION: &'static str = "\u{ED50}"; +pub const TELEVISION_SIMPLE: &'static str = "\u{ED51}"; +pub const TENNIS_BALL: &'static str = "\u{ED52}"; +pub const TENT: &'static str = "\u{ED53}"; +pub const TERMINAL: &'static str = "\u{ED54}"; +pub const TERMINAL_WINDOW: &'static str = "\u{ED55}"; +pub const TEST_TUBE: &'static str = "\u{ED56}"; +pub const TEXT_AA: &'static str = "\u{ED57}"; +pub const TEXT_ALIGN_CENTER: &'static str = "\u{ED58}"; +pub const TEXT_ALIGN_JUSTIFY: &'static str = "\u{ED59}"; +pub const TEXT_ALIGN_LEFT: &'static str = "\u{ED5A}"; +pub const TEXT_ALIGN_RIGHT: &'static str = "\u{ED5B}"; +pub const TEXT_A_UNDERLINE: &'static str = "\u{ED5C}"; +pub const TEXT_B: &'static str = "\u{ED5D}"; +pub const TEXT_BOLDER: &'static str = "\u{ED5D}"; +pub const TEXTBOX: &'static str = "\u{ED5E}"; +pub const TEXT_COLUMNS: &'static str = "\u{ED5F}"; +pub const TEXT_H: &'static str = "\u{ED60}"; +pub const TEXT_H_FIVE: &'static str = "\u{ED61}"; +pub const TEXT_H_FOUR: &'static str = "\u{ED62}"; +pub const TEXT_H_ONE: &'static str = "\u{ED63}"; +pub const TEXT_H_SIX: &'static str = "\u{ED64}"; +pub const TEXT_H_THREE: &'static str = "\u{ED65}"; +pub const TEXT_H_TWO: &'static str = "\u{ED66}"; +pub const TEXT_INDENT: &'static str = "\u{ED67}"; +pub const TEXT_ITALIC: &'static str = "\u{ED68}"; +pub const TEXT_OUTDENT: &'static str = "\u{ED69}"; +pub const TEXT_STRIKETHROUGH: &'static str = "\u{ED6A}"; +pub const TEXT_T: &'static str = "\u{ED6B}"; +pub const TEXT_UNDERLINE: &'static str = "\u{ED6C}"; +pub const THERMOMETER: &'static str = "\u{ED6D}"; +pub const THERMOMETER_COLD: &'static str = "\u{ED6E}"; +pub const THERMOMETER_HOT: &'static str = "\u{ED6F}"; +pub const THERMOMETER_SIMPLE: &'static str = "\u{ED70}"; +pub const THUMBS_DOWN: &'static str = "\u{ED71}"; +pub const THUMBS_UP: &'static str = "\u{ED72}"; +pub const TICKET: &'static str = "\u{ED73}"; +pub const TIDAL_LOGO: &'static str = "\u{ED74}"; +pub const TIKTOK_LOGO: &'static str = "\u{ED75}"; +pub const TIMER: &'static str = "\u{ED76}"; +pub const TIPI: &'static str = "\u{ED77}"; +pub const TOGGLE_LEFT: &'static str = "\u{ED78}"; +pub const TOGGLE_RIGHT: &'static str = "\u{ED79}"; +pub const TOILET: &'static str = "\u{ED7A}"; +pub const TOILET_PAPER: &'static str = "\u{ED7B}"; +pub const TOOLBOX: &'static str = "\u{ED7C}"; +pub const TOOTH: &'static str = "\u{ED7D}"; +pub const TOTE: &'static str = "\u{ED7E}"; +pub const TOTE_SIMPLE: &'static str = "\u{ED7F}"; +pub const TRADEMARK: &'static str = "\u{ED80}"; +pub const TRADEMARK_REGISTERED: &'static str = "\u{ED81}"; +pub const TRAFFIC_CONE: &'static str = "\u{ED82}"; +pub const TRAFFIC_SIGN: &'static str = "\u{ED83}"; +pub const TRAFFIC_SIGNAL: &'static str = "\u{ED84}"; +pub const TRAIN: &'static str = "\u{ED85}"; +pub const TRAIN_REGIONAL: &'static str = "\u{ED86}"; +pub const TRAIN_SIMPLE: &'static str = "\u{ED87}"; +pub const TRAM: &'static str = "\u{ED88}"; +pub const TRANSLATE: &'static str = "\u{ED89}"; +pub const TRASH: &'static str = "\u{ED8A}"; +pub const TRASH_SIMPLE: &'static str = "\u{ED8B}"; +pub const TRAY: &'static str = "\u{ED8C}"; +pub const TREE: &'static str = "\u{ED8D}"; +pub const TREE_EVERGREEN: &'static str = "\u{ED8E}"; +pub const TREE_PALM: &'static str = "\u{ED8F}"; +pub const TREE_STRUCTURE: &'static str = "\u{ED90}"; +pub const TREND_DOWN: &'static str = "\u{ED91}"; +pub const TREND_UP: &'static str = "\u{ED92}"; +pub const TRIANGLE: &'static str = "\u{ED93}"; +pub const TROPHY: &'static str = "\u{ED94}"; +pub const TRUCK: &'static str = "\u{ED95}"; +pub const T_SHIRT: &'static str = "\u{ED96}"; +pub const TWITCH_LOGO: &'static str = "\u{ED97}"; +pub const TWITTER_LOGO: &'static str = "\u{ED98}"; +pub const UMBRELLA: &'static str = "\u{ED99}"; +pub const UMBRELLA_SIMPLE: &'static str = "\u{ED9A}"; +pub const UNITE: &'static str = "\u{ED9B}"; +pub const UNITE_SQUARE: &'static str = "\u{ED9C}"; +pub const UPLOAD: &'static str = "\u{ED9D}"; +pub const UPLOAD_SIMPLE: &'static str = "\u{ED9E}"; +pub const USB: &'static str = "\u{ED9F}"; +pub const USER: &'static str = "\u{EDA0}"; +pub const USER_CIRCLE: &'static str = "\u{EDA1}"; +pub const USER_CIRCLE_GEAR: &'static str = "\u{EDA2}"; +pub const USER_CIRCLE_MINUS: &'static str = "\u{EDA3}"; +pub const USER_CIRCLE_PLUS: &'static str = "\u{EDA4}"; +pub const USER_FOCUS: &'static str = "\u{EDA5}"; +pub const USER_GEAR: &'static str = "\u{EDA6}"; +pub const USER_LIST: &'static str = "\u{EDA7}"; +pub const USER_MINUS: &'static str = "\u{EDA8}"; +pub const USER_PLUS: &'static str = "\u{EDA9}"; +pub const USER_RECTANGLE: &'static str = "\u{EDAA}"; +pub const USERS: &'static str = "\u{EDAB}"; +pub const USERS_FOUR: &'static str = "\u{EDAC}"; +pub const USER_SQUARE: &'static str = "\u{EDAD}"; +pub const USERS_THREE: &'static str = "\u{EDAE}"; +pub const USER_SWITCH: &'static str = "\u{EDAF}"; +pub const VAN: &'static str = "\u{EDB0}"; +pub const VAULT: &'static str = "\u{EDB1}"; +pub const VIBRATE: &'static str = "\u{EDB2}"; +pub const VIDEO: &'static str = "\u{EDB3}"; +pub const VIDEO_CAMERA: &'static str = "\u{EDB4}"; +pub const VIDEO_CAMERA_SLASH: &'static str = "\u{EDB5}"; +pub const VIGNETTE: &'static str = "\u{EDB6}"; +pub const VINYL_RECORD: &'static str = "\u{EDB7}"; +pub const VIRTUAL_REALITY: &'static str = "\u{EDB8}"; +pub const VIRUS: &'static str = "\u{EDB9}"; +pub const VOICEMAIL: &'static str = "\u{EDBA}"; +pub const VOLLEYBALL: &'static str = "\u{EDBB}"; +pub const WALL: &'static str = "\u{EDBC}"; +pub const WALLET: &'static str = "\u{EDBD}"; +pub const WAREHOUSE: &'static str = "\u{EDBE}"; +pub const WARNING: &'static str = "\u{EDBF}"; +pub const WARNING_CIRCLE: &'static str = "\u{EDC0}"; +pub const WARNING_DIAMOND: &'static str = "\u{EDC1}"; +pub const WARNING_OCTAGON: &'static str = "\u{EDC2}"; +pub const WATCH: &'static str = "\u{EDC3}"; +pub const WAVEFORM: &'static str = "\u{EDC4}"; +pub const WAVES: &'static str = "\u{EDC5}"; +pub const WAVE_SAWTOOTH: &'static str = "\u{EDC6}"; +pub const WAVE_SINE: &'static str = "\u{EDC7}"; +pub const WAVE_SQUARE: &'static str = "\u{EDC8}"; +pub const WAVE_TRIANGLE: &'static str = "\u{EDC9}"; +pub const WEBCAM: &'static str = "\u{EDCA}"; +pub const WEBCAM_SLASH: &'static str = "\u{EDCB}"; +pub const WEBHOOKS_LOGO: &'static str = "\u{EDCC}"; +pub const WECHAT_LOGO: &'static str = "\u{EDCD}"; +pub const WHATSAPP_LOGO: &'static str = "\u{EDCE}"; +pub const WHEELCHAIR: &'static str = "\u{EDCF}"; +pub const WHEELCHAIR_MOTION: &'static str = "\u{EDD0}"; +pub const WIFI_HIGH: &'static str = "\u{EDD1}"; +pub const WIFI_LOW: &'static str = "\u{EDD2}"; +pub const WIFI_MEDIUM: &'static str = "\u{EDD3}"; +pub const WIFI_NONE: &'static str = "\u{EDD4}"; +pub const WIFI_SLASH: &'static str = "\u{EDD5}"; +pub const WIFI_X: &'static str = "\u{EDD6}"; +pub const WIND: &'static str = "\u{EDD7}"; +pub const WINDOWS_LOGO: &'static str = "\u{EDD8}"; +pub const WINE: &'static str = "\u{EDD9}"; +pub const WRENCH: &'static str = "\u{EDDA}"; +pub const X: &'static str = "\u{EDDB}"; +pub const X_CIRCLE: &'static str = "\u{EDDC}"; +pub const X_SQUARE: &'static str = "\u{EDDD}"; +pub const YIN_YANG: &'static str = "\u{EDDE}"; +pub const YOUTUBE_LOGO: &'static str = "\u{EDDF}"; diff --git a/src/gui/mod.rs b/src/gui/mod.rs index b25625e..1b3fd8b 100644 --- a/src/gui/mod.rs +++ b/src/gui/mod.rs @@ -19,18 +19,8 @@ pub use app::PlatformApp; pub mod platform; pub mod screens; pub mod views; +pub mod icons; +pub mod colors; mod app; -pub const COLOR_YELLOW: egui::Color32 = egui::Color32::from_rgb(254, 241, 2); -pub const COLOR_LIGHT: egui::Color32 = egui::Color32::from_gray(240); -pub const COLOR_DARK: egui::Color32 = egui::Color32::from_gray(60); - -// Material icons chars -pub const SYM_ARROW_BACK: &str = ""; -pub const SYM_ACCOUNTS: &str = ""; -pub const SYM_NETWORK: &str = ""; -pub const SYM_SETTINGS: &str = ""; -pub const SYM_TUNING: &str = ""; -pub const SYM_METRICS: &str = ""; - diff --git a/src/gui/platform/android/mod.rs b/src/gui/platform/android/mod.rs index ad25b36..3e443db 100644 --- a/src/gui/platform/android/mod.rs +++ b/src/gui/platform/android/mod.rs @@ -96,26 +96,13 @@ impl PlatformApp { let mut fonts = egui::FontDefinitions::default(); - // Tweak emoji icons to look nice against main font y-offset - // fonts.font_data.insert( - // "emoji-icon-font".to_owned(), - // egui::FontData { - // font: fonts.font_data.get("emoji-icon-font").unwrap().clone().font, - // index: 0, - // tweak: egui::FontTweak { - // scale: 0.88, - // y_offset_factor: 0.26, - // y_offset: 0.0, - // }, - // }); - fonts.font_data.insert( - "material".to_owned(), + "phosphor".to_owned(), egui::FontData::from_static(include_bytes!( - "../../../../fonts/material.otf" + "../../../../fonts/phosphor.ttf" )).tweak(egui::FontTweak { scale: 1.0, - y_offset_factor: 0.16, + y_offset_factor: 0.14, y_offset: 0.0 }), ); @@ -123,7 +110,7 @@ impl PlatformApp { .families .entry(Proportional) .or_default() - .insert(0, "material".to_owned()); + .insert(0, "phosphor".to_owned()); fonts.font_data.insert( "noto".to_owned(), @@ -141,8 +128,6 @@ impl PlatformApp { .or_default() .insert(0, "noto".to_owned()); - - ctx.set_fonts(fonts); use egui::FontId; @@ -151,7 +136,6 @@ impl PlatformApp { let mut style = (*ctx.style()).clone(); style.text_styles = [ (Heading, FontId::new(20.0, Proportional)), - (Name("icon".into()), FontId::new(24.0, Proportional)), (Body, FontId::new(16.0, Proportional)), (Button, FontId::new(18.0, Proportional)), (Small, FontId::new(12.0, Proportional)), diff --git a/src/gui/screens/accounts.rs b/src/gui/screens/accounts.rs index 2081feb..d1e5e90 100644 --- a/src/gui/screens/accounts.rs +++ b/src/gui/screens/accounts.rs @@ -12,28 +12,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::ops::{Deref, DerefMut}; -use eframe::epaint::{Color32, Stroke}; +use egui::Frame; -use egui::{Frame, Widget}; - -use crate::gui::{SYM_ARROW_BACK, SYM_NETWORK, SYM_SETTINGS}; use crate::gui::app::is_dual_panel_mode; +use crate::gui::icons::{ARROW_CIRCLE_LEFT, GEAR_SIX, GLOBE}; use crate::gui::platform::PlatformCallbacks; use crate::gui::screens::{Navigator, Screen, ScreenId}; -use crate::gui::views::{TitlePanel, TitlePanelAction}; +use crate::gui::views::{DEFAULT_STROKE, TitlePanel, TitlePanelAction}; -pub struct Accounts { - title: String, -} - -impl Default for Accounts { - fn default() -> Self { - Self { - title: t!("accounts"), - } - } -} +#[derive(Default)] +pub struct Accounts {} impl Screen for Accounts { fn id(&self) -> ScreenId { @@ -45,36 +33,33 @@ impl Screen for Accounts { frame: &mut eframe::Frame, nav: &mut Navigator, cb: &dyn PlatformCallbacks) { - let Self { title } = self; - - let mut panel: TitlePanel = TitlePanel::default() - .title(title) + let mut panel: TitlePanel = TitlePanel::new(nav) + .title(t!("accounts")) .right_action(TitlePanelAction { - icon: SYM_SETTINGS.into(), + icon: GEAR_SIX.into(), on_click: Box::new(|nav| { //TODO: open settings }), - }) - .with_navigator(nav); + }); if !is_dual_panel_mode(frame) { panel = panel.left_action(TitlePanelAction { - icon: SYM_NETWORK.into(), + icon: GLOBE.into(), on_click: Box::new(|nav|{ - nav.as_mut().unwrap().toggle_left_panel(); + nav.toggle_left_panel(); }), }); } panel.ui(ui); egui::CentralPanel::default().frame(Frame { - stroke: Stroke::new(1.0, Color32::from_gray(190)), + stroke: DEFAULT_STROKE, .. Default::default() }).show_inside(ui, |ui| { - ui.label(format!("{}Here we go 10000 ツ", SYM_ARROW_BACK)); + ui.label(format!("{}Here we go 10000 ツ", ARROW_CIRCLE_LEFT)); if ui.button("TEST").clicked() { nav.to(ScreenId::Account) }; - if ui.button(format!("{}BACK ", SYM_ARROW_BACK)).clicked() { + if ui.button(format!("{}BACK ", ARROW_CIRCLE_LEFT)).clicked() { nav.to(ScreenId::Account) }; }); diff --git a/src/gui/screens/mod.rs b/src/gui/screens/mod.rs index f48d44b..7287aa7 100644 --- a/src/gui/screens/mod.rs +++ b/src/gui/screens/mod.rs @@ -17,9 +17,7 @@ pub use accounts::Accounts; pub use navigator::Navigator; pub use root::Root; -use crate::gui::App; use crate::gui::platform::PlatformCallbacks; -use crate::gui::views::TitlePanelAction; mod navigator; mod root; @@ -28,7 +26,6 @@ mod account; #[derive(Ord, Eq, PartialOrd, PartialEq)] pub enum ScreenId { - Root, Accounts, Account, } diff --git a/src/gui/screens/root.rs b/src/gui/screens/root.rs index 5ad1a5e..91ddd54 100644 --- a/src/gui/screens/root.rs +++ b/src/gui/screens/root.rs @@ -14,10 +14,6 @@ use std::cmp::min; -use eframe::epaint::{Color32, Shadow, Stroke}; -use egui::style::Margin; - -use crate::gui::{App, COLOR_YELLOW}; use crate::gui::app::is_dual_panel_mode; use crate::gui::platform::PlatformCallbacks; use crate::gui::screens::{Account, Accounts, Navigator, Screen, ScreenId}; @@ -43,10 +39,6 @@ impl Default for Root { } impl Root { - fn id(&self) -> ScreenId { - ScreenId::Root - } - pub fn ui(&mut self, ui: &mut egui::Ui, frame: &mut eframe::Frame, cb: &dyn PlatformCallbacks) { let is_network_panel_open = self.navigator.left_panel_open || is_dual_panel_mode(frame); diff --git a/src/gui/views/common.rs b/src/gui/views/common.rs new file mode 100644 index 0000000..159fae1 --- /dev/null +++ b/src/gui/views/common.rs @@ -0,0 +1,59 @@ +// Copyright 2023 The Grim Developers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use eframe::epaint::{Color32, Stroke}; +use egui::{RichText, Sense, Widget}; + +use crate::gui::colors::{COLOR_DARK, COLOR_LIGHT}; +use crate::gui::views::DEFAULT_STROKE; + +pub fn title_button(ui: &mut egui::Ui, icon: &str, action: impl FnOnce()) { + let b = egui::widgets::Button::new( + RichText::new(icon.to_string()).size(24.0).color(COLOR_DARK) + ).fill(Color32::TRANSPARENT) + .ui(ui).interact(Sense::click_and_drag()); + + // Click optimization for touch screens + if b.drag_released() || b.clicked() { + (action)(); + }; +} + +pub fn tab_button(ui: &mut egui::Ui, icon: &str, active: bool, mut action: impl FnMut()) { + let stroke = match active { + true => { Stroke::NONE } + false => { DEFAULT_STROKE } + }; + + let color = match active { + true => { COLOR_LIGHT } + false => { Color32::WHITE } + }; + + let b = egui::widgets::Button::new( + RichText::new(icon.to_string()).size(24.0).color(COLOR_DARK) + ).min_size(ui.available_size_before_wrap()) + .stroke(stroke) + .fill(color) + .ui(ui).interact(Sense::click_and_drag()); + + // Click optimization for touch screens + if b.drag_released() || b.clicked() { + (action)(); + }; +} + +pub fn sub_title(ui: &mut egui::Ui, text: String, color: Color32) { + ui.label(RichText::new(text).size(17.0).color(color)); +} \ No newline at end of file diff --git a/src/gui/views/mod.rs b/src/gui/views/mod.rs index c19e1ba..84ca1be 100644 --- a/src/gui/views/mod.rs +++ b/src/gui/views/mod.rs @@ -12,14 +12,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -pub mod buttons; +use eframe::epaint::{Color32, Stroke}; -mod title_panel; +pub use crate::gui::views::network::Network; pub use crate::gui::views::title_panel::{TitlePanel, TitlePanelAction, TitlePanelActions}; -mod network; -pub use crate::gui::views::network::Network; +pub mod common; +mod title_panel; + +mod network; mod network_node; mod network_tuning; mod network_metrics; @@ -28,3 +30,6 @@ pub trait NetworkTab { fn ui(&mut self, ui: &mut egui::Ui, node: &mut crate::node::Node); fn name(&self) -> &String; } + +pub const DEFAULT_STROKE: Stroke = Stroke { width: 1.0, color: Color32::from_gray(190) }; + diff --git a/src/gui/views/network.rs b/src/gui/views/network.rs index d283eff..f378e8d 100644 --- a/src/gui/views/network.rs +++ b/src/gui/views/network.rs @@ -12,40 +12,39 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::borrow::Cow; -use std::collections::hash_map::DefaultHasher; -use std::sync::atomic::Ordering; use std::time::Duration; -use chrono::Utc; -use eframe::epaint::{Color32, FontId, Stroke}; + +use eframe::emath::lerp; +use eframe::epaint::{Color32, FontId, Rgba, Stroke}; use eframe::epaint::text::{LayoutJob, TextFormat, TextWrapping}; -use egui::{Response, RichText, Sense, Spinner, Widget}; +use egui::RichText; use egui::style::Margin; use egui_extras::{Size, StripBuilder}; use grin_chain::SyncStatus; - use grin_core::global::ChainTypes; -use grin_servers::ServerStats; + use crate::gui::app::is_dual_panel_mode; +use crate::gui::colors::{COLOR_DARK, COLOR_YELLOW}; +use crate::gui::icons::{CARDHOLDER, DATABASE, DOTS_THREE_OUTLINE_VERTICAL, FACTORY, FADERS, GAUGE}; use crate::gui::platform::PlatformCallbacks; use crate::gui::screens::Navigator; -use crate::gui::{COLOR_DARK, COLOR_LIGHT, COLOR_YELLOW, SYM_ACCOUNTS, SYM_METRICS, SYM_NETWORK}; - -use crate::gui::views::{NetworkTab, TitlePanel, TitlePanelAction}; +use crate::gui::views::{DEFAULT_STROKE, NetworkTab}; +use crate::gui::views::common::{tab_button, title_button}; use crate::gui::views::network_node::NetworkNode; -use crate::node; use crate::node::Node; +#[derive(PartialEq)] enum Mode { Node, - // Miner, Metrics, + Miner, Tuning } pub struct Network { - current_mode: Mode, node: Node, + + current_mode: Mode, node_view: NetworkNode, } @@ -80,17 +79,9 @@ impl Network { self.draw_title(ui, frame, nav); }); - egui::CentralPanel::default().frame(egui::Frame { - stroke: Stroke::new(1.0, Color32::from_gray(190)), - fill: Color32::WHITE, - .. Default::default() - }).show_inside(ui, |ui| { - self.draw_tab_content(ui); - }); - egui::TopBottomPanel::bottom("network_tabs") .frame(egui::Frame { - stroke: Stroke::new(1.0, Color32::from_gray(190)), + outer_margin: Margin::same(6.0), .. Default::default() }) .resizable(false) @@ -98,19 +89,41 @@ impl Network { self.draw_tabs(ui); }); - ui.ctx().request_repaint_after(Duration::from_millis(1000)); + egui::CentralPanel::default().frame(egui::Frame { + stroke: DEFAULT_STROKE, + inner_margin: Margin::same(4.0), + fill: Color32::WHITE, + .. Default::default() + }).show_inside(ui, |ui| { + self.draw_tab_content(ui); + }); + + } - fn draw_tabs(&self, ui: &mut egui::Ui) { - ui.vertical_centered(|ui| { - ui.columns(3, |columns| { - columns[0].horizontal_wrapped(|ui| { - }); - columns[1].vertical_centered(|ui| { - }); - columns[2].horizontal_wrapped(|ui| { + fn draw_tabs(&mut self, ui: &mut egui::Ui) { + ui.columns(4, |columns| { + columns[0].vertical_centered(|ui| { + tab_button(ui, DATABASE, self.current_mode == Mode::Node, || { + self.current_mode = Mode::Node; }); }); + columns[1].vertical_centered(|ui| { + tab_button(ui, GAUGE, self.current_mode == Mode::Metrics, || { + self.current_mode = Mode::Metrics; + }); + }); + columns[2].vertical_centered(|ui| { + tab_button(ui, FACTORY, self.current_mode == Mode::Miner, || { + self.current_mode = Mode::Miner; + }); + }); + columns[3].vertical_centered(|ui| { + tab_button(ui, FADERS, self.current_mode == Mode::Tuning, || { + self.current_mode = Mode::Tuning; + }); + }); + }); } @@ -121,6 +134,7 @@ impl Network { } Mode::Metrics => {} Mode::Tuning => {} + Mode::Miner => {} } } @@ -137,22 +151,22 @@ impl Network { .size(Size::remainder()) .size(Size::exact(52.0)) .horizontal(|mut strip| { - strip.empty(); + strip.cell(|ui| { + ui.centered_and_justified(|ui| { + title_button(ui, DOTS_THREE_OUTLINE_VERTICAL, || { + //TODO: Actions for node + }); + }); + }); strip.strip(|builder| { self.draw_title_text(builder); }); strip.cell(|ui| { if !is_dual_panel_mode(frame) { ui.centered_and_justified(|ui| { - let b = egui::widgets::Button::new( - RichText::new(SYM_ACCOUNTS) - .size(24.0) - .color(COLOR_DARK) - ).fill(Color32::TRANSPARENT) - .ui(ui).interact(Sense::click_and_drag()); - if b.drag_released() || b.clicked() { + title_button(ui, CARDHOLDER, || { nav.toggle_left_panel(); - }; + }); }); } }); @@ -161,9 +175,7 @@ impl Network { }); } - fn draw_title_text(&self, mut builder: StripBuilder) { - let Self { node, ..} = self; - + fn draw_title_text(&self, builder: StripBuilder) { let title_text = match &self.current_mode { Mode::Node => { self.node_view.name() @@ -171,78 +183,107 @@ impl Network { Mode::Metrics => { self.node_view.name() } + Mode::Miner => { + self.node_view.name() + } Mode::Tuning => { self.node_view.name() } }; - let syncing = node.state.is_syncing(); - - let mut b = builder.size(Size::remainder()); - if syncing { - b = b.size(Size::remainder()); - } - b.vertical(|mut strip| { - strip.cell(|ui| { - ui.centered_and_justified(|ui| { - ui.heading(title_text.to_uppercase()); - }); - }); - if syncing { + builder + .size(Size::exact(19.0)) + .size(Size::remainder()) + .vertical(|mut strip| { strip.cell(|ui| { ui.centered_and_justified(|ui| { - let status_text = if node.state.is_restarting() { - "Restarting".to_string() + ui.label(RichText::new(title_text.to_uppercase()) + .size(19.0) + .color(COLOR_DARK)); + }); + }); + strip.cell(|ui| { + ui.centered_and_justified(|ui| { + // Select sync status text + let sync_status = self.node.state.get_sync_status(); + let status_text = if self.node.state.is_restarting() { + t!("server_restarting") } else { - let sync_status = node.state.get_sync_status(); - get_sync_status_text(sync_status.unwrap()).to_string() + match sync_status { + None => { + t!("server_down") + } + Some(ss) => { + get_sync_status_text(ss).to_string() + } + } }; + + // Setup text color animation based on sync status + let idle = match sync_status { + None => { !self.node.state.is_starting() } + Some(ss) => { ss == SyncStatus::NoSync } + }; + let (dark, bright) = (0.3, 1.0); + let color_factor = if !idle { + lerp(dark..=bright, ui.input().time.cos().abs()) + } else { + bright + }; + + // Repaint based on sync status + if idle { + ui.ctx().request_repaint_after(Duration::from_millis(600)); + } else { + ui.ctx().request_repaint(); + } + + // Draw sync text let mut job = LayoutJob::single_section(status_text, TextFormat { font_id: FontId::proportional(15.0), - color: COLOR_DARK, + color: Color32::from(Rgba::from(COLOR_DARK) * color_factor as f32), .. Default::default() }); job.wrap = TextWrapping { max_rows: 1, break_anywhere: false, - overflow_character: Option::from('…'), + overflow_character: Option::from('﹍'), ..Default::default() }; ui.label(job); }); }); - } - }); + }); } } -fn get_sync_status_text(sync_status: SyncStatus) -> Cow<'static, str> { +fn get_sync_status_text(sync_status: SyncStatus) -> String { match sync_status { - SyncStatus::Initial => Cow::Borrowed("Initializing"), - SyncStatus::NoSync => Cow::Borrowed("Running"), - SyncStatus::AwaitingPeers(_) => Cow::Borrowed("Waiting for peers"), + SyncStatus::Initial => t!("sync_status.initial"), + SyncStatus::NoSync => t!("sync_status.no_sync"), + SyncStatus::AwaitingPeers(_) => t!("sync_status.awaiting_peers"), SyncStatus::HeaderSync { sync_head, highest_height, .. } => { if highest_height == 0 { - Cow::Borrowed("Downloading headers") + t!("sync_status.header_sync") } else { let percent = sync_head.height * 100 / highest_height; - Cow::Owned(format!("Downloading headers: {}%", percent)) + t!("sync_status.header_sync_percent", "percent" => percent) } } SyncStatus::TxHashsetDownload(stat) => { if stat.total_size > 0 { let percent = stat.downloaded_size * 100 / stat.total_size; - Cow::Owned(format!("Downloading chain state: {}%", percent)) + t!("sync_status.tx_hashset_download_percent", "percent" => percent) } else { - Cow::Borrowed("Downloading chain state") + t!("sync_status.tx_hashset_download") } } SyncStatus::TxHashsetSetup => { - Cow::Borrowed("Preparing state for validation") + t!("sync_status.tx_hashset_setup") } SyncStatus::TxHashsetRangeProofsValidation { rproofs, @@ -253,7 +294,7 @@ fn get_sync_status_text(sync_status: SyncStatus) -> Cow<'static, str> { } else { 0 }; - Cow::Owned(format!("Validating state - range proofs: {}%", r_percent)) + t!("sync_status.tx_hashset_range_proofs_validation", "percent" => r_percent) } SyncStatus::TxHashsetKernelsValidation { kernels, @@ -264,28 +305,23 @@ fn get_sync_status_text(sync_status: SyncStatus) -> Cow<'static, str> { } else { 0 }; - Cow::Owned(format!("Validating state - kernels: {}%", k_percent)) + t!("sync_status.tx_hashset_kernels_validation", "percent" => k_percent) } - SyncStatus::TxHashsetSave => { - Cow::Borrowed("Finalizing chain state") - } - SyncStatus::TxHashsetDone => { - Cow::Borrowed("Finalized chain state") + SyncStatus::TxHashsetSave | SyncStatus::TxHashsetDone => { + t!("sync_status.tx_hashset_save") } SyncStatus::BodySync { current_height, highest_height, } => { if highest_height == 0 { - Cow::Borrowed("Downloading blocks data") + t!("sync_status.body_sync") } else { - Cow::Owned(format!( - "Downloading blocks: {}%", - current_height * 100 / highest_height - )) + let percent = current_height * 100 / highest_height; + t!("sync_status.body_sync_percent", "percent" => percent) } } - SyncStatus::Shutdown => Cow::Borrowed("Shutting down"), + SyncStatus::Shutdown => t!("sync_status.shutdown"), } } diff --git a/src/gui/views/network_metrics.rs b/src/gui/views/network_metrics.rs index 2035f55..df6ed27 100644 --- a/src/gui/views/network_metrics.rs +++ b/src/gui/views/network_metrics.rs @@ -11,3 +11,29 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + +use egui::Ui; +use crate::gui::views::NetworkTab; +use crate::node::Node; + +pub struct NetworkMetrics { + title: String +} + +impl Default for NetworkMetrics { + fn default() -> Self { + Self { + title: t!("metrics"), + } + } +} + +impl NetworkTab for NetworkMetrics { + fn ui(&mut self, ui: &mut Ui, node: &mut Node) { + + } + + fn name(&self) -> &String { + &self.title + } +} \ No newline at end of file diff --git a/src/gui/views/network_node.rs b/src/gui/views/network_node.rs index 8c0a859..273bfe8 100644 --- a/src/gui/views/network_node.rs +++ b/src/gui/views/network_node.rs @@ -12,20 +12,24 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::borrow::Cow; -use std::ptr::null; -use std::sync::mpsc; +use std::time::SystemTime; -use chrono::Utc; -use egui::{Ui, Widget}; -use grin_chain::SyncStatus; -use grin_core::global::ChainTypes; -use grin_servers::ServerStats; +use chrono::{DateTime, Local, Offset, TimeZone, Utc}; +use chrono::format::DelayedFormat; +use eframe::emath::Vec2; +use eframe::epaint::{FontId, Stroke}; +use eframe::epaint::text::{LayoutJob, TextFormat, TextWrapping}; +use egui::{Color32, RichText, Rounding, ScrollArea, Spinner, Widget}; +use egui_extras::{Size, StripBuilder}; +use grin_servers::common::stats::TxStats; +use grin_servers::PeerStats; -use crate::gui::views::NetworkTab; +use crate::gui::colors::{COLOR_DARK, COLOR_GRAY, COLOR_LIGHT, COLOR_YELLOW}; +use crate::gui::icons::{AT, CUBE, DEVICES, DOWNLOAD_SIMPLE, FLOW_ARROW, HANDSHAKE, PACKAGE, PLUGS_CONNECTED, SHARE_NETWORK}; +use crate::gui::views::{DEFAULT_STROKE, NetworkTab}; +use crate::gui::views::common::sub_title; use crate::node::Node; - pub struct NetworkNode { title: String } @@ -33,44 +37,294 @@ pub struct NetworkNode { impl Default for NetworkNode { fn default() -> Self { Self { - title: t!("node"), + title: t!("integrated_node"), } } } impl NetworkTab for NetworkNode { - fn ui(&mut self, ui: &mut Ui, node: &mut Node) { - // ui.vertical_centered_justified(|ui| { - // let node_state = node.acquire_state(); - // let stats = &node_state.stats; - // if stats.is_some() { - // ui.horizontal_wrapped(|ui| { - // let sync_status = stats.as_ref().unwrap().sync_status; - // ui.label(get_sync_progress_status(sync_status)); - // ui.spinner(); - // }); - // } else { - // if node.stop_state.is_stopped() { - // ui.label("Stopped"); - // } else { - // ui.label(get_sync_progress_status(SyncStatus::Initial)); - // } - // } - // }); - if ui.button("stop").clicked() { - node.stop(); + fn ui(&mut self, ui: &mut egui::Ui, node: &mut Node) { + let server_stats = node.state.get_stats(); + if !server_stats.is_some() { + ui.centered_and_justified(|ui| { + Spinner::new().size(42.0).color(COLOR_GRAY).ui(ui); + }); + return; } - if ui.button("re-start").clicked() { - node.restart(); - } + let stats = server_stats.as_ref().unwrap(); - if ui.button("start").clicked() { - node.start(ChainTypes::Mainnet); - } + // Make scroll bar thinner + ui.style_mut().spacing.scroll_bar_width = 4.0; + + ScrollArea::vertical() + .auto_shrink([false; 2]) + .show(ui, |ui| { + // Disable item spacing + ui.style_mut().spacing.item_spacing = Vec2::new(0.0, 0.0); + + // Show header stats + ui.vertical_centered_justified(|ui| { + sub_title(ui, format!("{} {}", FLOW_ARROW, t!("header")), COLOR_DARK); + }); + ui.add_space(4.0); + + ui.columns(2, |columns| { + columns[0].vertical_centered(|ui| { + draw_stat_box(ui, + stats.header_stats.last_block_h.to_string(), + t!("hash"), + StatBoxRounding::TopLeft); + }); + columns[1].vertical_centered(|ui| { + draw_stat_box(ui, + stats.header_stats.height.to_string(), + t!("height"), + StatBoxRounding::TopRight); + }); + }); + + ui.columns(2, |columns| { + columns[0].vertical_centered(|ui| { + draw_stat_box(ui, + stats.header_stats.total_difficulty.to_string(), + t!("difficulty"), + StatBoxRounding::BottomLeft); + }); + columns[1].vertical_centered(|ui| { + let ts = stats.header_stats.latest_timestamp; + draw_stat_box(ui, + format!("{}", ts.format("%d/%m/%Y %H:%M")), + t!("time_utc"), + StatBoxRounding::BottomRight); + }); + }); + + // Show block stats + ui.add_space(5.0); + ui.vertical_centered_justified(|ui| { + sub_title(ui, format!("{} {}", CUBE, t!("block")), COLOR_DARK); + }); + ui.add_space(4.0); + + ui.columns(2, |columns| { + columns[0].vertical_centered(|ui| { + draw_stat_box(ui, + stats.chain_stats.last_block_h.to_string(), + t!("hash"), + StatBoxRounding::TopLeft); + }); + columns[1].vertical_centered(|ui| { + draw_stat_box(ui, + stats.chain_stats.height.to_string(), + t!("height"), + StatBoxRounding::TopRight); + }); + }); + + ui.columns(2, |columns| { + columns[0].vertical_centered(|ui| { + draw_stat_box(ui, + stats.chain_stats.total_difficulty.to_string(), + t!("difficulty"), + StatBoxRounding::BottomLeft); + }); + columns[1].vertical_centered(|ui| { + let ts = stats.chain_stats.latest_timestamp; + draw_stat_box(ui, + format!("{}", ts.format("%d/%m/%Y %H:%M")), + t!("time_utc"), + StatBoxRounding::BottomRight); + }); + }); + + // Show data stats + ui.add_space(5.0); + ui.vertical_centered_justified(|ui| { + sub_title(ui, format!("{} {}", SHARE_NETWORK, t!("data")), COLOR_DARK); + }); + ui.add_space(4.0); + + ui.columns(2, |columns| { + columns[0].vertical_centered(|ui| { + let tx_stat = match &stats.tx_stats { + None => { "0 (0)".to_string() } + Some(tx) => { + format!("{} ({})", tx.tx_pool_size, tx.tx_pool_kernels) + } + }; + draw_stat_box(ui, tx_stat, t!("main_pool"), StatBoxRounding::TopLeft); + }); + columns[1].vertical_centered(|ui| { + let stem_tx_stat = match &stats.tx_stats { + None => { "0 (0)".to_string() } + Some(stx) => { + format!("{} ({})", stx.stem_pool_size, stx.stem_pool_kernels) + } + }; + draw_stat_box(ui, stem_tx_stat, t!("stem_pool"), StatBoxRounding::TopRight); + }); + }); + + ui.columns(2, |columns| { + columns[0].vertical_centered(|ui| { + draw_stat_box(ui, + stats.disk_usage_gb.to_string(), + t!("size"), + StatBoxRounding::BottomLeft); + }); + columns[1].vertical_centered(|ui| { + let ts = stats.chain_stats.latest_timestamp; + draw_stat_box(ui, + stats.peer_count.to_string(), + t!("peers"), + StatBoxRounding::BottomRight); + }); + }); + + // Show peers stats when available + if stats.peer_count > 0 { + ui.add_space(5.0); + ui.vertical_centered_justified(|ui| { + sub_title(ui, format!("{} {}", HANDSHAKE, t!("peers")), COLOR_DARK); + }); + ui.add_space(4.0); + + for (index, ps) in stats.peer_stats.iter().enumerate() { + let rounding = if index == 0 { + if stats.peer_count == 1 { + [true, true]; + } + [true, false] + } else if index == &stats.peer_stats.len() - 1 { + [false, true] + } else { + [false, false] + }; + ui.vertical_centered(|ui| { + draw_peer_stats(ui, ps, rounding); + }); + } + } + }); } fn name(&self) -> &String { &self.title } +} + +fn draw_peer_stats(ui: &mut egui::Ui, peer: &PeerStats, rounding: [bool; 2]) { + let mut rect = ui.available_rect_before_wrap(); + rect.set_height(77.0); + + ui.painter().rect( + rect, + Rounding { + nw: if rounding[0] { 8.0 } else { 0.0 }, + ne: if rounding[0] { 8.0 } else { 0.0 }, + sw: if rounding[1] { 8.0 } else { 0.0 }, + se: if rounding[1] { 8.0 } else { 0.0 }, + }, + Color32::WHITE, + Stroke { width: 1.0, color: Color32::from_gray(230) } + ); + + ui.add_space(2.0); + + ui.horizontal_top(|ui| { + ui.add_space(6.0); + + ui.heading(RichText::new(PLUGS_CONNECTED) + .color(Color32::BLACK) + .size(18.0)); + + ui.add_space(6.0); + + // Draw peer address + ui.heading(RichText::new(&peer.addr) + .color(Color32::BLACK) + .size(18.0)); + }); + + ui.horizontal_top(|ui| { + ui.add_space(6.0); + + ui.heading(RichText::new(PACKAGE) + .color(COLOR_DARK) + .size(16.0)); + + ui.add_space(6.0); + + // Draw peer difficulty and height + ui.heading(RichText::new(peer.total_difficulty.to_string()) + .color(COLOR_DARK) + .size(16.0)); + ui.heading(RichText::new(AT).color(COLOR_DARK).size(16.0)); + ui.heading(RichText::new(peer.height.to_string()) + .color(COLOR_DARK) + .size(16.0)); + }); + + ui.horizontal_top(|ui| { + ui.add_space(6.0); + + ui.heading(RichText::new(DEVICES) + .color(COLOR_GRAY) + .size(16.0)); + + ui.add_space(6.0); + + // Draw peer user-agent + ui.heading(RichText::new(&peer.user_agent) + .color(COLOR_GRAY) + .size(16.0)); + }); + + ui.add_space(2.0); +} + +#[derive(PartialEq)] +enum StatBoxRounding { + TopLeft, TopRight, BottomRight, BottomLeft +} + +fn draw_stat_box(ui: &mut egui::Ui, value: String, label: String, rounding: StatBoxRounding) { + let mut rect = ui.available_rect_before_wrap(); + rect.set_height(46.0); + + // Draw box background + ui.painter().rect( + rect, + Rounding { + nw: if rounding == StatBoxRounding::TopLeft { 8.0 } else { 0.0 }, + ne: if rounding == StatBoxRounding::TopRight { 8.0 } else { 0.0 }, + sw: if rounding == StatBoxRounding::BottomLeft { 8.0 } else { 0.0 }, + se: if rounding == StatBoxRounding::BottomRight { 8.0 } else { 0.0 }, + }, + Color32::WHITE, + Stroke { width: 1.0, color: Color32::from_gray(230) }, + ); + + ui.vertical_centered_justified(|ui| { + // Correct vertical spacing between items + ui.style_mut().spacing.item_spacing.y = -4.0; + + // Draw box value + let mut job = LayoutJob::single_section(value, TextFormat { + font_id: FontId::proportional(18.0), + color: Color32::BLACK, + .. Default::default() + }); + job.wrap = TextWrapping { + max_rows: 1, + break_anywhere: false, + overflow_character: Option::from('﹍'), + ..Default::default() + }; + ui.label(job); + + // Draw box label + ui.label(RichText::new(label).color(COLOR_GRAY).size(15.0)); + }); } \ No newline at end of file diff --git a/src/gui/views/title_panel.rs b/src/gui/views/title_panel.rs index 0d7fa1b..262fb1f 100644 --- a/src/gui/views/title_panel.rs +++ b/src/gui/views/title_panel.rs @@ -12,17 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. +use eframe::epaint::{FontId, Stroke}; use eframe::epaint::text::{LayoutJob, TextFormat, TextWrapping}; -use egui::{Color32, FontId, RichText, Sense, Stroke, Widget}; use egui::style::Margin; use egui_extras::{Size, StripBuilder}; +use crate::gui::colors::{COLOR_DARK, COLOR_YELLOW}; -use crate::gui::{COLOR_DARK, COLOR_YELLOW}; use crate::gui::screens::Navigator; +use crate::gui::views::common::title_button; pub struct TitlePanelAction { pub(crate) icon: Box, - pub(crate) on_click: Box)>, + pub(crate) on_click: Box, } #[derive(Default)] @@ -31,15 +32,22 @@ pub struct TitlePanelActions { right: Option } -#[derive(Default)] pub struct TitlePanel<'nav> { - title: Option<&'nav str>, + title: Option, actions: TitlePanelActions, - navigator: Option<&'nav mut Navigator> + nav: &'nav mut Navigator } impl<'nav> TitlePanel<'nav> { - pub fn title(mut self, title: &'nav str) -> Self { + pub fn new(nav: &'nav mut Navigator) -> TitlePanel<'nav> { + Self { + title: None, + actions: Default::default(), + nav, + } + } + + pub fn title(mut self, title: String) -> Self { self.title = Some(title); self } @@ -54,16 +62,11 @@ impl<'nav> TitlePanel<'nav> { self } - pub fn with_navigator(mut self, nav: &'nav mut Navigator) -> Self { - self.navigator = Some(nav); - self - } - pub fn ui(&mut self, ui: &mut egui::Ui) { // Disable stroke around panel buttons on hover ui.style_mut().visuals.widgets.active.bg_stroke = Stroke::NONE; - let Self { actions, title, navigator } = self; + let Self { actions, title, nav } = self; egui::TopBottomPanel::top("title_panel") .resizable(false) @@ -85,50 +88,19 @@ impl<'nav> TitlePanel<'nav> { .size(Size::exact(52.0)) .horizontal(|mut strip| { strip.cell(|ui| { - if actions.left.is_some() { - let action = actions.left.as_ref().unwrap(); - ui.centered_and_justified(|ui| { - let b = egui::widgets::Button::new( - RichText::new(&action.icon.to_string()) - .size(24.0) - .color(COLOR_DARK) - ).fill(Color32::TRANSPARENT) - .ui(ui) - .interact(Sense::click_and_drag()); - if b.drag_released() || b.clicked() { - (action.on_click)(navigator); - }; - }); - } + Self::show_action(ui, actions.left.as_ref(), nav); }); strip.strip(|builder| { builder .size(Size::remainder()) .vertical(|mut strip| { strip.cell(|ui| { - if title.is_some() { - ui.centered_and_justified(|ui| { - Self::show_title(title.unwrap(), ui); - }); - } + Self::show_title(&*title, ui); }); }); }); strip.cell(|ui| { - if actions.right.is_some() { - let action = actions.right.as_ref().unwrap(); - ui.centered_and_justified(|ui| { - let b = egui::widgets::Button::new( - RichText::new(action.icon.to_string()) - .size(24.0) - .color(COLOR_DARK) - ).fill(Color32::TRANSPARENT) - .ui(ui).interact(Sense::click_and_drag()); - if b.drag_released() || b.clicked() { - (action.on_click)(navigator); - }; - }); - } + Self::show_action(ui, actions.right.as_ref(), nav); }); }); }); @@ -136,19 +108,38 @@ impl<'nav> TitlePanel<'nav> { }); } - fn show_title(title: &str, ui: &mut egui::Ui) { - let mut job = LayoutJob::single_section(title.to_uppercase(), TextFormat { - font_id: FontId::proportional(20.0), - color: COLOR_DARK, - .. Default::default() - }); - job.wrap = TextWrapping { - max_rows: 1, - break_anywhere: false, - overflow_character: Option::from('…'), - ..Default::default() - }; - ui.label(job); + fn show_action(ui: &mut egui::Ui, + action: Option<&TitlePanelAction>, + navigator: &mut Navigator) { + if action.is_some() { + let action = action.unwrap(); + ui.centered_and_justified(|ui| { + title_button(ui, &action.icon, || { + (action.on_click)(navigator); + }); + }); + } + } + + fn show_title(title: &Option, ui: &mut egui::Ui) { + if title.is_some() { + ui.centered_and_justified(|ui| { + let title_text = title.as_ref().unwrap().to_uppercase(); + let mut job = LayoutJob::single_section(title_text, TextFormat { + font_id: FontId::proportional(20.0), + color: COLOR_DARK, + .. Default::default() + }); + job.wrap = TextWrapping { + max_rows: 1, + break_anywhere: false, + overflow_character: Option::from('﹍'), + ..Default::default() + }; + ui.label(job); + + }); + } } }