ui: dark theme support, setup by default from system, settings

This commit is contained in:
ardocrat 2024-05-29 22:47:17 +03:00
parent 3a91ba6923
commit 32f8bd11de
41 changed files with 1131 additions and 704 deletions

97
Cargo.lock generated
View file

@ -173,6 +173,17 @@ dependencies = [
"sha2 0.9.9",
]
[[package]]
name = "ahash"
version = "0.7.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9"
dependencies = [
"getrandom 0.2.15",
"once_cell",
"version_check",
]
[[package]]
name = "ahash"
version = "0.8.11"
@ -2030,6 +2041,22 @@ dependencies = [
"winapi 0.3.9",
]
[[package]]
name = "dark-light"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a76fa97167fa740dcdbfe18e8895601e1bc36525f09b044e00916e717c03a3c"
dependencies = [
"dconf_rs",
"detect-desktop-environment",
"dirs 4.0.0",
"objc",
"rust-ini",
"web-sys",
"winreg 0.10.1",
"zbus 4.2.2",
]
[[package]]
name = "darling"
version = "0.14.4"
@ -2125,6 +2152,12 @@ version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a"
[[package]]
name = "dconf_rs"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7046468a81e6a002061c01e6a7c83139daf91b11c30e66795b13217c2d885c8b"
[[package]]
name = "der"
version = "0.7.9"
@ -2256,6 +2289,12 @@ dependencies = [
"syn 1.0.109",
]
[[package]]
name = "detect-desktop-environment"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "21d8ad60dd5b13a4ee6bd8fa2d5d88965c597c67bce32b5fc49c94f55cb50810"
[[package]]
name = "digest"
version = "0.8.1"
@ -2305,6 +2344,15 @@ dependencies = [
"dirs-sys 0.3.7",
]
[[package]]
name = "dirs"
version = "4.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059"
dependencies = [
"dirs-sys 0.3.7",
]
[[package]]
name = "dirs"
version = "5.0.1"
@ -2384,6 +2432,12 @@ dependencies = [
"libloading 0.8.3",
]
[[package]]
name = "dlv-list"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257"
[[package]]
name = "document-features"
version = "0.2.8"
@ -2564,7 +2618,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "584c5d1bf9a67b25778a3323af222dbe1a1feb532190e103901187f92c7fe29a"
dependencies = [
"accesskit",
"ahash",
"ahash 0.8.11",
"epaint",
"log",
"nohash-hasher",
@ -2830,7 +2884,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b381f8b149657a4acf837095351839f32cd5c4aec1817fc4df84e18d76334176"
dependencies = [
"ab_glyph",
"ahash",
"ahash 0.8.11",
"bytemuck",
"ecolor",
"emath",
@ -3687,6 +3741,7 @@ dependencies = [
"built",
"chrono",
"curve25519-dalek 4.1.2",
"dark-light",
"dirs 5.0.1",
"ed25519-dalek 2.1.1",
"eframe",
@ -4251,6 +4306,9 @@ name = "hashbrown"
version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
dependencies = [
"ahash 0.7.8",
]
[[package]]
name = "hashbrown"
@ -4258,7 +4316,7 @@ version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
dependencies = [
"ahash",
"ahash 0.8.11",
"allocator-api2",
]
@ -6356,6 +6414,16 @@ dependencies = [
"num-traits 0.2.19",
]
[[package]]
name = "ordered-multimap"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a"
dependencies = [
"dlv-list",
"hashbrown 0.12.3",
]
[[package]]
name = "ordered-stream"
version = "0.2.0"
@ -7407,7 +7475,7 @@ dependencies = [
"wasm-bindgen-futures",
"web-sys",
"webpki-roots",
"winreg",
"winreg 0.7.0",
]
[[package]]
@ -7648,6 +7716,16 @@ dependencies = [
"toml 0.7.8",
]
[[package]]
name = "rust-ini"
version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6d5f2436026b4f6e79dc829837d467cc7e9a55ee40e750d716713540715a2df"
dependencies = [
"cfg-if 1.0.0",
"ordered-multimap",
]
[[package]]
name = "rustc-demangle"
version = "0.1.24"
@ -11192,7 +11270,7 @@ version = "0.29.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d59ad965a635657faf09c8f062badd885748428933dad8e8bdd64064d92e5ca"
dependencies = [
"ahash",
"ahash 0.8.11",
"android-activity 0.5.2",
"atomic-waker",
"bitflags 2.5.0",
@ -11262,6 +11340,15 @@ dependencies = [
"winapi 0.3.9",
]
[[package]]
name = "winreg"
version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d"
dependencies = [
"winapi 0.3.9",
]
[[package]]
name = "ws2_32-sys"
version = "0.2.1"

View file

@ -61,6 +61,7 @@ rqrr = "0.7.1"
qrcodegen = "1.8.0"
ur = "0.4.1"
gif = "0.13.1"
dark-light = "1.1.1"
## tor
arti-client = { version = "0.18.0", features = ["pt-client", "static", "onion-service-service", "onion-service-client"] }

View file

@ -353,4 +353,10 @@ public class MainActivity extends GameActivity {
intent.setType("image/*");
startActivity(Intent.createChooser(intent, "Share image"));
}
// Check if device is using dark theme.
public boolean useDarkTheme() {
int currentNightMode = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
return currentNightMode == Configuration.UI_MODE_NIGHT_YES;
}
}

BIN
img/logo_light.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View file

@ -22,6 +22,9 @@ repeat: Repeat
scan_result: Scan result
back: Back
share: Share
theme: Theme
dark: Dark
light: Light
wallets:
await_conf_amount: Awaiting confirmation
await_fin_amount: Awaiting finalization

View file

@ -22,6 +22,9 @@ repeat: Повторить
scan_result: Результат сканирования
back: Назад
share: Поделиться
theme: Тема
dark: Тёмная
light: Светлая
wallets:
await_conf_amount: Ожидает подтверждения
await_fin_amount: Ожидает завершения

View file

@ -22,6 +22,9 @@ repeat: Tekrar
scan_result: Tarama sonucu
back: Geri
share: Paylasmak
theme: Tema
dark: Karanlik
light: Isik
wallets:
await_conf_amount: Onay bekleniyor
await_fin_amount: Tamamlanma bekleniyor
@ -32,10 +35,10 @@ wallets:
add: Cuzdan ekle
name: 'Ad:'
pass: 'Sifre:'
pass_empty: CUzdan Sifresini girin
pass_empty: Cuzdan Sifresini girin
current_pass: Su anki sifre:'
new_pass: 'Yeni sifre:'
min_tx_conf_count: 'Tx islem icin Minimum onay:'
min_tx_conf_count: 'Tx islem için Minimum onay:'
recover: Restore et
recovery_phrase: Kurtarma kelimeleri
words_count: 'Kelime sayisi:'
@ -55,7 +58,7 @@ wallets:
wrong_pass: Girilen sifre yanlis
locked: Kilitli
unlocked: Kilitsiz
enable_node: 'Cuzdani kullanmak icin Tumlesik node etkinlestirin veya ekranin altindaki %{settings} ogesini secerek baska baglanti metodu secin.'
enable_node: 'Cuzdani kullanmak için Tumlesik node etkinlestirin veya ekranin altindaki %{settings} ogesini secerek baska baglanti metodu secin.'
node_loading: 'Cuzdan tumlesik node senkronize olunca yuklenecektir, ekranin altindan baglanma metod %{settings} degistirebilirsiniz.'
loading: Yukleniyor
closing: Kapaniyor
@ -81,35 +84,35 @@ wallets:
tx: Islem
messages: Mesajlar
transport: Transferler
input_slatepack_desc: 'Islemi Tamamlamak veya cevap slatepack oluşturmak icin mesaji girin:'
parse_slatepack_err: 'Girilen mesaji okurken hata oluştu,girilien mesaji tekrar kontrol et:'
input_slatepack_desc: 'Islemi Tamamlamak veya cevap Slatepack olusturmak için mesaji girin:'
parse_slatepack_err: 'Girilen mesaji okurken hata olustu,girilien mesaji tekrar kontrol et:'
pay_balance_error: 'Hesap bakiyesi girilen %{amount} ツ ve ağ ücretini ödemek için yetersiz.'
parse_i1_slatepack_desc: '%{amount} ツ ödemek için bu mesaji aliciya gönderin:'
parse_i2_slatepack_desc: '%{amount} ツ Almak için bu işlemi tamamlayin'
parse_i3_slatepack_desc: '%{amount} almak için mesaji tamamlama işlemi postalayin'
parse_s1_slatepack_desc: '%{amount} ツ almak için mesaji ödeyecek kişiye gönderin'
parse_s2_slatepack_desc: 'Göndereciğiniz %{amount} ツ işlemini tamamlayin.'
parse_s3_slatepack_desc: '%{amount} ツ gönderim tamamlamak için işlemi postalayin.'
resp_slatepack_err: 'Cevap slateapack oluşturulurken bir hata oluştu, girişi kontrol edin:'
resp_exists_err: Bu işlem zaten mevcut.
resp_canceled_err: Bu işlem zaten iptal edildi.
create_request_desc: 'Para Almak veya göndermek için talep oluştur:'
send_request_desc: '%{amount} ツ göndermek için bir istek oluşturdunuz. Bu mesaji aliciya gönder:'
send_slatepack_err: Para gönderme isteği oluşturulurken bir hata oluştu, girişi kontrol edin.
parse_i2_slatepack_desc: '%{amount} ツ Almak için bu islemi tamamlayin:'
parse_i3_slatepack_desc: '%{amount} almak için mesaji tamamlama islemi postalayin:'
parse_s1_slatepack_desc: '%{amount} ツ almak için mesaji ödeyecek kisiye gönderin:'
parse_s2_slatepack_desc: 'Göndereciğiniz %{amount} ツ islemini tamamlayin:'
parse_s3_slatepack_desc: '%{amount} ツ gönderim tamamlamak için islemi postalayin:'
resp_slatepack_err: 'Cevap slateapack olusturulurken bir hata olustu, girisi kontrol edin:'
resp_exists_err: Bu islem zaten mevcut.
resp_canceled_err: Bu islem zaten iptal edildi.
create_request_desc: 'Para Almak veya göndermek için talep olustur:'
send_request_desc: '%{amount} ツ göndermek için bir istek olusturdunuz. Bu mesaji aliciya gönder:'
send_slatepack_err: Para gönderme isteği olusturulurken bir hata olustu, girisi kontrol edin.
invoice_desc: 'Almak istediginiz tutar %{amount} ツ talebiniz. Slatepack mesajini gondericiye ilet:'
invoice_slatepack_err: Fatura duzenlenirken bir hata olustu, girilen bilgiyi kontrol edin.
finalize_slatepack_err: 'TX islemi tamamlanirken hata olustu, girilen bilgiyi kontrol edin:'
finalize: Tamamla
use_dandelion: Dandelion kullan
enter_amount_send: GONDERIM miktari gir
enter_amount_receive: ALIM miktari gir
enter_amount_send: '%{amount} ツ var. GONDERIM miktari gir:'
enter_amount_receive: 'ALIM miktari gir:'
recovery: Kurtarma
repair_wallet: Cuzdani Onar
repair_desc: Cuzdani check et,yapilmis, gorunmeyen islemler icin resynch biraz zaman alir.
repair_unavailable: Cuzdani yeniden tam senkronize etmek icin Node baglantisi aktif olmali.
repair_desc: Cuzdani check et,yapilmis, gorunmeyen islemler için resynch biraz zaman alir.
repair_unavailable: Cuzdani yeniden tam senkronize etmek için Node baglantisi aktif olmali.
delete: Cuzdani Sil
delete_conf: Cuzdan silinecektir, emin misiniz?
delete_desc: Gelecekte, bakiyeli cuzdaninizi restore etmek icin kurtarma kelimelerinizi mutlaka saklayin.
delete_desc: Gelecekte, bakiyeli cuzdaninizi restore etmek için kurtarma kelimelerinizi mutlaka saklayin.
wallet_loading_err: 'Cuzdan senkronize edilirken hata olustu, tekrar deneyin veya ekranin altinda bulunan ayarlar %{settings} ogesinden baglanti metodunu degistirin.'
wallet: Cuzdan
send: Gonder
@ -130,7 +133,7 @@ transport:
receiver_address: 'Alicinin adresi:'
incorrect_addr_err: 'Girilen adres hatali:'
tor_send_error: Tor adresi uzerinden gonderimde aksaklik olustu, alici online olmasi gerek, islem iptal edildi.
tor_autorun_desc: Islemleri Tor adresi olarak AL,bunun icin cuzdan acilisinda Tor hizmetinin baslatilip baslatilmayacagi.
tor_autorun_desc: Islemleri Tor adresi olarak AL,bunun için cuzdan acilisinda Tor hizmetinin baslatilip baslatilmayacagi.
tor_sending: 'Tor adrese %{amount} ツ gonderiliyor.'
tor_settings: Tor Ayarlar
bridges: Bridges
@ -156,7 +159,7 @@ network:
available: Mevcut
not_available: Mevcut degil
availability_check: Mevcut kontrol
android_warning: Android kullanicilarinin dikkatine. Tümleşik NODE başarili bir şekilde senkronize etmek için telefonunuzun sistem ayarlarinda Grim uygulamasi için bildirimlere erişime izin vermeniz ve pil kullanim kisitlamalarini kaldirmaniz gerekir. Bu, arka planda uygulamanin doğru çalismasi için gerekli bir işlemdir.
android_warning: Android kullanicilarinin dikkatine. Tümlesik NODE basarili bir sekilde senkronize etmek için telefonunuzun sistem ayarlarinda Grim uygulamasi için bildirimlere erisime izin vermeniz ve pil kullanim kisitlamalarini kaldirmaniz gerekir. Bu, arka planda uygulamanin doğru çalismasi için gerekli bir islemdir.
sync_status:
node_restarting: Node yeniden baslatiliyor
node_down: Node calismiyor
@ -193,8 +196,8 @@ network_node:
error_clean: Node verileri bozuldu, Resync yapmaniz gerekli.
resync: Resync
error_p2p_api: '%{p2p_api} sunucusu baslatilirken bir hata olustu, ekranin altindaki %{settings} ögesini secerek %{p2p_api} ayarlarini kontrol edin.'
error_config: 'Yapilandirmann başlatilmasi sirasinda bir hata oluştu; ekranin alt kismindaki %{settings} öğesini seçerek ayarlari kontrol edin.'
error_unknown: 'Başlatma sirasinda bir hata oluştu. Ekranin altindaki %{settings} öğesini seçerek Tümlesik NODE ayarlariNi kontrol edin veya yeniden Resync edin.'
error_config: 'Yapilandirmann baslatilmasi sirasinda bir hata olustu; ekranin alt kismindaki %{settings} öğesini seçerek ayarlari kontrol edin.'
error_unknown: 'Baslatma sirasinda bir hata olustu. Ekranin altindaki %{settings} öğesini seçerek Tümlesik NODE ayarlariNi kontrol edin veya yeniden Resync edin.'
network_metrics:
loading: Metrikler senkronizasyondan sonra mevcut olur.
emission: Emission
@ -206,7 +209,7 @@ network_metrics:
network_mining:
loading: Madencilik senkronizasyondan sonra mevcut olacak.
info: 'Madencilik server etkinlesti, ayarlar %{settings} ekranin alt koseden degistirilir. Cihaz bagliyken veriler guncelleniyor.'
restart_server_required: Degisiklikleri uygulamak icin Server yeniden BASLAT.
restart_server_required: Degisiklikleri uygulamak için Server yeniden BASLAT.
rewards_wallet: Odul Cuzdani
server: Stratum server
address: Addres
@ -221,7 +224,7 @@ network_settings:
stratum_ip: 'Stratum IP address:'
stratum_port: 'Stratum port:'
port_unavailable: Belirlenen port mevcut degil
restart_node_required: Degisiklikler icin yeniden Node BASLAT
restart_node_required: Degisiklikler için yeniden Node BASLAT
enable: Etkinlestir
disable: Devredisi birak
restart: Restart
@ -233,12 +236,12 @@ network_settings:
disabled: Mevcut degil
enabled: Mevcut
ftl: 'The Future Time Limit (FTL):'
ftl_description: Blok kabul edilebilmesi icin yeni bir bloktaki zaman damgasinin, NODE (saniye cinsinden) yerel saatine gore gelecege ne kadar uzak olabilecegine iliskin sinirlama.
ftl_description: Blok kabul edilebilmesi için yeni bir bloktaki zaman damgasinin, NODE (saniye cinsinden) yerel saatine gore gelecege ne kadar uzak olabilecegine iliskin sinirlama.
not_valid_value: Girilen deger gecersiz
full_validation: Tam gecerli
full_validation_description: Her blogu islerken tam zincir dogrulamasinin calistirilip calistirilmayacagi (senkronizasyon haric).
archive_mode: Arsiv mode
archive_mode_desc: Tam arsiv NODE calistir (daha fazla disk yeri ve senkronizasyon icin zaman gerektirir).
archive_mode_desc: Tam arsiv NODE calistir (daha fazla disk yeri ve senkronizasyon için zaman gerektirir).
attempt_time: 'Mining attempt time (in seconds):'
attempt_time_desc: The amount of time to attempt to mine on a particular header before stopping and re-collecting transactions from the pool
min_share_diff: 'The minimum acceptable share difficulty:'
@ -249,13 +252,13 @@ network_settings:
pool_fee: 'Poolakabul edilen taban ücret:'
reorg_period: 'Reorg cache retention period (in minutes):'
max_tx_pool: 'Pool icindeki maximum islem sayisi:'
max_tx_stempool: 'Maksimum işlem sayisi stem-pool içindeki:'
max_tx_stempool: 'Maksimum islem sayisi stem-pool icindeki:'
max_tx_weight: 'Maximum total weight of transactions that can get selected to build a block:'
epoch_duration: 'Epoch duration (in seconds):'
embargo_timer: 'Embargo timer (in seconds):'
aggregation_period: 'Aggregation period (in seconds):'
stem_probability: 'Stem phase probability:'
stem_txs: Stem işlemler
stem_txs: Stem islemler
p2p_server: P2P server
p2p_port: 'P2P port:'
add_seed: DNS Seed Ekle
@ -269,7 +272,7 @@ network_settings:
deny_list: Red listesi
deny_list_desc: Bu listedeki Peer asla baglanma.
favourites: Favoriler
favourites_desc: Baglanti icin terchi edilen Peer listesi.
favourites_desc: Baglanti için terchi edilen Peer listesi.
ban_window: 'Banlanan bir Peer (saniye cinsinden) yasakli kalma suresi:'
ban_window_desc: Banlama karari, peerden alinan verilerin dogruluguna bagli olarak Node tarafindan verilir.
max_inbound_count: 'Maksimum gelen Peer baglanti sayisi:'
@ -282,5 +285,5 @@ modal:
confirmation: Onay
add: Ekle
modal_exit:
description: Uygulamadan cikmak icin exit, emin misiniz?
description: Uygulamadan cikmak için exit, emin misiniz?
exit: Exit

View file

@ -18,7 +18,6 @@ use egui::{Context, Modifiers};
use lazy_static::lazy_static;
use crate::AppConfig;
use crate::gui::Colors;
use crate::gui::platform::PlatformCallbacks;
use crate::gui::views::Root;
@ -75,7 +74,6 @@ impl<Platform: PlatformCallbacks> eframe::App for PlatformApp<Platform> {
// Show main content.
egui::CentralPanel::default()
.frame(egui::Frame {
fill: Colors::YELLOW,
..Default::default()
})
.show(ctx, |ui| {

View file

@ -14,29 +14,236 @@
use egui::Color32;
use crate::AppConfig;
/// Provides colors values based on current theme.
pub struct Colors;
impl Colors {
pub const WHITE: Color32 = Color32::from_gray(253);
pub const BLACK: Color32 = Color32::from_gray(12);
pub const TRANSPARENT: Color32 = Color32::from_rgba_premultiplied(0, 0, 0, 0);
pub const SEMI_TRANSPARENT: Color32 = Color32::from_black_alpha(100);
pub const YELLOW: Color32 = Color32::from_rgb(254, 241, 2);
pub const GOLD: Color32 = Color32::from_rgb(255, 215, 0);
pub const GREEN: Color32 = Color32::from_rgb(0, 0x64, 0);
pub const RED: Color32 = Color32::from_rgb(0x8B, 0, 0);
pub const FILL: Color32 = Color32::from_gray(244);
pub const FILL_DARK: Color32 = Color32::from_gray(238);
pub const CHECKBOX: Color32 = Color32::from_gray(100);
pub const TEXT: Color32 = Color32::from_gray(80);
pub const TEXT_BUTTON: Color32 = Color32::from_gray(70);
pub const TITLE: Color32 = Color32::from_gray(60);
pub const BUTTON: Color32 = Color32::from_gray(249);
pub const GRAY: Color32 = Color32::from_gray(120);
pub const STROKE: Color32 = Color32::from_gray(200);
pub const INACTIVE_TEXT: Color32 = Color32::from_gray(150);
pub const ITEM_BUTTON: Color32 = Color32::from_gray(90);
pub const ITEM_STROKE: Color32 = Color32::from_gray(220);
pub const ITEM_HOVER: Color32 = Color32::from_gray(205);
pub const ITEM_CURRENT: Color32 = Color32::from_gray(227);
const WHITE: Color32 = Color32::from_gray(253);
const BLACK: Color32 = Color32::from_gray(12);
const SEMI_TRANSPARENT: Color32 = Color32::from_black_alpha(100);
const DARK_SEMI_TRANSPARENT: Color32 = Color32::from_black_alpha(170);
const GOLD: Color32 = Color32::from_rgb(255, 215, 0);
const YELLOW: Color32 = Color32::from_rgb(254, 241, 2);
const GREEN: Color32 = Color32::from_rgb(0, 0x64, 0);
const RED: Color32 = Color32::from_rgb(0x8B, 0, 0);
const FILL: Color32 = Color32::from_gray(244);
const FILL_DEEP: Color32 = Color32::from_gray(238);
const FILL_DARK: Color32 = Color32::from_gray(24);
const FILL_DEEP_DARK: Color32 = Color32::from_gray(18);
const TEXT: Color32 = Color32::from_gray(80);
const TEXT_DARK: Color32 = Color32::from_gray(185);
const CHECKBOX: Color32 = Color32::from_gray(100);
const CHECKBOX_DARK: Color32 = Color32::from_gray(175);
const TEXT_BUTTON: Color32 = Color32::from_gray(70);
const TEXT_BUTTON_DARK: Color32 = Color32::from_gray(195);
const TITLE: Color32 = Color32::from_gray(60);
const TITLE_DARK: Color32 = Color32::from_gray(205);
const BUTTON: Color32 = Color32::from_gray(249);
const BUTTON_DARK: Color32 = Color32::from_gray(16);
const GRAY: Color32 = Color32::from_gray(120);
const GRAY_DARK: Color32 = Color32::from_gray(145);
const STROKE: Color32 = Color32::from_gray(200);
const STROKE_DARK: Color32 = Color32::from_gray(65);
const INACTIVE_TEXT: Color32 = Color32::from_gray(150);
const INACTIVE_TEXT_DARK: Color32 = Color32::from_gray(115);
const ITEM_BUTTON: Color32 = Color32::from_gray(90);
const ITEM_BUTTON_DARK: Color32 = Color32::from_gray(175);
const ITEM_STROKE: Color32 = Color32::from_gray(220);
const ITEM_STROKE_DARK: Color32 = Color32::from_gray(45);
const ITEM_HOVER: Color32 = Color32::from_gray(205);
const ITEM_HOVER_DARK: Color32 = Color32::from_gray(60);
const ITEM_CURRENT: Color32 = Color32::from_gray(227);
const ITEM_CURRENT_DARK: Color32 = Color32::from_gray(38);
/// Check if dark theme should be used.
fn use_dark() -> bool {
AppConfig::dark_theme().unwrap_or(false)
}
impl Colors {
pub const TRANSPARENT: Color32 = Color32::from_rgba_premultiplied(0, 0, 0, 0);
pub fn white_or_black(black_in_white: bool) -> Color32 {
if use_dark() {
if black_in_white {
WHITE
} else {
BLACK
}
} else {
if black_in_white {
BLACK
} else {
WHITE
}
}
}
pub fn semi_transparent() -> Color32 {
if use_dark() {
DARK_SEMI_TRANSPARENT
} else {
SEMI_TRANSPARENT
}
}
pub fn gold() -> Color32 {
if use_dark() {
GOLD.linear_multiply(0.85)
} else {
GOLD
}
}
pub fn yellow() -> Color32 {
YELLOW
}
pub fn green() -> Color32 {
if use_dark() {
GREEN.linear_multiply(1.3)
} else {
GREEN
}
}
pub fn red() -> Color32 {
if use_dark() {
RED.linear_multiply(1.3)
} else {
RED
}
}
pub fn fill() -> Color32 {
if use_dark() {
FILL_DARK
} else {
FILL
}
}
pub fn fill_deep() -> Color32 {
if use_dark() {
FILL_DEEP_DARK
} else {
FILL_DEEP
}
}
pub fn checkbox() -> Color32 {
if use_dark() {
CHECKBOX_DARK
} else {
CHECKBOX
}
}
pub fn text(always_light: bool) -> Color32 {
if use_dark() && !always_light {
TEXT_DARK
} else {
TEXT
}
}
pub fn text_button() -> Color32 {
if use_dark() {
TEXT_BUTTON_DARK
} else {
TEXT_BUTTON
}
}
pub fn title(always_light: bool) -> Color32 {
if use_dark() && !always_light {
TITLE_DARK
} else {
TITLE
}
}
pub fn button() -> Color32 {
if use_dark() {
BUTTON_DARK
} else {
BUTTON
}
}
pub fn gray() -> Color32 {
if use_dark() {
GRAY_DARK
} else {
GRAY
}
}
pub fn stroke() -> Color32 {
if use_dark() {
STROKE_DARK
} else {
STROKE
}
}
pub fn inactive_text() -> Color32 {
if use_dark() {
INACTIVE_TEXT_DARK
} else {
INACTIVE_TEXT
}
}
pub fn item_button() -> Color32 {
if use_dark() {
ITEM_BUTTON_DARK
} else {
ITEM_BUTTON
}
}
pub fn item_stroke() -> Color32 {
if use_dark() {
ITEM_STROKE_DARK
} else {
ITEM_STROKE
}
}
pub fn item_hover() -> Color32 {
if use_dark() {
ITEM_HOVER_DARK
} else {
ITEM_HOVER
}
}
pub fn item_current() -> Color32 {
if use_dark() {
ITEM_CURRENT_DARK
} else {
ITEM_CURRENT
}
}
}

View file

@ -27,25 +27,29 @@ use winit::platform::android::activity::AndroidApp;
use crate::gui::platform::PlatformCallbacks;
/// Android platform implementation.
#[derive(Clone)]
pub struct Android {
android_app: AndroidApp,
}
impl Android {
/// Create new Android platform instance from provided [`AndroidApp`].
pub fn new(app: AndroidApp) -> Self {
Self {
android_app: app,
}
}
fn call_java_method(&self, name: &str, sig: &str, args: &[JValue]) -> Option<jni::sys::jvalue> {
/// Call Android Activity method with JNI.
pub fn call_java_method(&self, name: &str, sig: &str, args: &[JValue]) -> Option<jni::sys::jvalue> {
let vm = unsafe { jni::JavaVM::from_raw(self.android_app.vm_as_ptr() as _) }.unwrap();
let mut env = vm.attach_current_thread().unwrap();
let activity = unsafe {
JObject::from_raw(self.android_app.activity_as_ptr() as jni::sys::jobject)
};
if let Ok(result) = env.call_method(activity, name, sig, args) {
return Some(result.as_jni().clone());
return Some(result.as_jni().clone());
}
None
}
@ -142,6 +146,7 @@ impl PlatformCallbacks for Android {
}
lazy_static! {
/// Last image data from camera.
static ref LAST_CAMERA_IMAGE: Arc<RwLock<Option<(Vec<u8>, u32)>>> = Arc::new(RwLock::new(None));
}

View file

@ -114,7 +114,7 @@ impl CameraContent {
ui.vertical_centered(|ui| {
ui.label(RichText::new(format!("{}%", ur_progress))
.size(16.0)
.color(Colors::YELLOW));
.color(Colors::yellow()));
});
}
@ -125,7 +125,7 @@ impl CameraContent {
size.y = 48.0;
ui.allocate_ui_with_layout(size, Layout::right_to_left(Align::Max), |ui| {
ui.add_space(4.0);
View::button(ui, CAMERA_ROTATE.to_string(), Colors::WHITE, || {
View::button(ui, CAMERA_ROTATE.to_string(), Colors::white_or_black(false), || {
cb.switch_camera();
});
});

View file

@ -43,7 +43,7 @@ pub struct Modal {
impl Modal {
/// Margin from [`Modal`] window at top/left/right.
const DEFAULT_MARGIN: f32 = 10.0;
const DEFAULT_MARGIN: f32 = 6.0;
/// Maximum width of the content.
const DEFAULT_WIDTH: f32 = Root::SIDE_PANEL_WIDTH - (2.0 * Self::DEFAULT_MARGIN);
@ -167,7 +167,7 @@ impl Modal {
.collapsible(false)
.fixed_rect(rect)
.frame(egui::Frame {
fill: Colors::SEMI_TRANSPARENT,
fill: Colors::semi_transparent(),
..Default::default()
})
.show(ctx, |ui| {
@ -196,7 +196,7 @@ impl Modal {
color: egui::Color32::from_black_alpha(32),
},
rounding: Rounding::same(8.0),
fill: Colors::YELLOW,
fill: Colors::fill(),
..Default::default()
})
.show(ctx, |ui| {
@ -246,7 +246,7 @@ impl Modal {
let mut bg_shape = RectShape {
rect,
rounding,
fill: Colors::FILL,
fill: Colors::fill(),
stroke: Stroke::NONE,
fill_texture_id: Default::default(),
uv: Rect::ZERO
@ -278,7 +278,7 @@ impl Modal {
sw: 0.0,
se: 0.0,
},
fill: Colors::YELLOW,
fill: Colors::yellow(),
stroke: Stroke::NONE,
fill_texture_id: Default::default(),
uv: Rect::ZERO
@ -288,12 +288,12 @@ impl Modal {
// Draw title content.
let title_resp = ui.allocate_ui_at_rect(rect, |ui| {
ui.vertical_centered_justified(|ui| {
ui.add_space(8.0);
ui.add_space(10.0);
ui.label(RichText::new(self.title.as_ref().unwrap())
.size(19.0)
.color(Colors::TITLE)
.color(Colors::title(true))
);
ui.add_space(8.0);
ui.add_space(10.0);
});
}).response;
@ -302,6 +302,6 @@ impl Modal {
ui.painter().set(bg_idx, bg_shape);
// Draw line below title.
View::horizontal_line(ui, Colors::STROKE);
View::horizontal_line(ui, Colors::stroke());
}
}

View file

@ -101,12 +101,12 @@ impl ConnectionsContent {
// Show external connections.
ui.add_space(8.0);
ui.label(RichText::new(t!("wallets.ext_conn")).size(16.0).color(Colors::GRAY));
ui.label(RichText::new(t!("wallets.ext_conn")).size(16.0).color(Colors::gray()));
ui.add_space(6.0);
// Show button to add new external node connection.
let add_node_text = format!("{} {}", PLUS_CIRCLE, t!("wallets.add_node"));
View::button(ui, add_node_text, Colors::WHITE, || {
View::button(ui, add_node_text, Colors::white_or_black(false), || {
self.show_add_ext_conn_modal(None, cb);
});
@ -130,7 +130,7 @@ impl ConnectionsContent {
let mut rect = ui.available_rect_before_wrap();
rect.set_height(78.0);
let rounding = View::item_rounding(0, 1, false);
ui.painter().rect(rect, rounding, Colors::FILL, View::ITEM_STROKE);
ui.painter().rect(rect, rounding, Colors::fill(), View::item_stroke());
ui.allocate_ui_with_layout(rect.size(), Layout::right_to_left(Align::Center), |ui| {
// Draw button to show integrated node info.
@ -140,12 +140,12 @@ impl ConnectionsContent {
if !Node::is_running() {
// Draw button to start integrated node.
View::item_button(ui, Rounding::default(), POWER, Some(Colors::GREEN), || {
View::item_button(ui, Rounding::default(), POWER, Some(Colors::green()), || {
Node::start();
});
} else if !Node::is_starting() && !Node::is_stopping() && !Node::is_restarting() {
// Draw button to stop integrated node.
View::item_button(ui, Rounding::default(), POWER, Some(Colors::RED), || {
View::item_button(ui, Rounding::default(), POWER, Some(Colors::red()), || {
Node::stop(false);
});
}
@ -157,12 +157,12 @@ impl ConnectionsContent {
ui.add_space(3.0);
ui.label(RichText::new(t!("network.node"))
.size(18.0)
.color(Colors::TITLE));
.color(Colors::title(false)));
// Setup node API address text.
let api_address = NodeConfig::get_api_address();
let address_text = format!("{} http://{}", COMPUTER_TOWER, api_address);
ui.label(RichText::new(address_text).size(15.0).color(Colors::TEXT));
ui.label(RichText::new(address_text).size(15.0).color(Colors::text(false)));
ui.add_space(1.0);
// Setup node status text.
@ -174,7 +174,7 @@ impl ConnectionsContent {
DOTS_THREE_CIRCLE
};
let status_text = format!("{} {}", status_icon, Node::get_sync_status_text());
ui.label(RichText::new(status_text).size(15.0).color(Colors::GRAY));
ui.label(RichText::new(status_text).size(15.0).color(Colors::gray()));
})
});
});
@ -194,7 +194,7 @@ impl ConnectionsContent {
// Draw round background.
let bg_rect = rect.clone();
let item_rounding = View::item_rounding(index, len, false);
ui.painter().rect(bg_rect, item_rounding, Colors::FILL, View::ITEM_STROKE);
ui.painter().rect(bg_rect, item_rounding, Colors::fill(), View::item_stroke());
ui.vertical(|ui| {
ui.allocate_ui_with_layout(rect.size(), Layout::right_to_left(Align::Center), |ui| {
@ -216,7 +216,7 @@ impl ConnectionsContent {
// Draw connections URL.
ui.add_space(4.0);
let conn_text = format!("{} {}", GLOBE_SIMPLE, conn.url);
View::ellipsize_text(ui, conn_text, 15.0, Colors::TITLE);
View::ellipsize_text(ui, conn_text, 15.0, Colors::title(false));
ui.add_space(1.0);
// Setup connection status text.
@ -229,7 +229,7 @@ impl ConnectionsContent {
} else {
format!("{} {}", DOTS_THREE_CIRCLE, t!("network.availability_check"))
};
ui.label(RichText::new(status_text).size(15.0).color(Colors::GRAY));
ui.label(RichText::new(status_text).size(15.0).color(Colors::gray()));
ui.add_space(3.0);
});
});
@ -270,7 +270,7 @@ impl ConnectionsContent {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("wallets.node_url"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw node URL text edit.
@ -285,7 +285,7 @@ impl ConnectionsContent {
ui.label(RichText::new(t!("wallets.node_secret"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw node API secret text edit.
@ -298,7 +298,7 @@ impl ConnectionsContent {
ui.add_space(12.0);
ui.label(RichText::new(t!("wallets.invalid_url"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
}
ui.add_space(12.0);
});
@ -310,7 +310,7 @@ impl ConnectionsContent {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
@ -352,7 +352,7 @@ impl ConnectionsContent {
(on_add)();
});
View::button(ui, t!("modal.save"), Colors::WHITE, on_add);
View::button(ui, t!("modal.save"), Colors::white_or_black(false), on_add);
});
});
ui.add_space(6.0);

View file

@ -54,8 +54,8 @@ impl NetworkContent {
egui::TopBottomPanel::bottom("node_tabs_panel")
.resizable(false)
.frame(egui::Frame {
fill: Colors::FILL,
stroke: View::ITEM_STROKE,
fill: Colors::fill(),
stroke: View::item_stroke(),
inner_margin: Margin {
left: View::get_left_inset() + 4.0,
right: View::far_right_inset_margin(ui) + 4.0,
@ -78,14 +78,14 @@ impl NetworkContent {
.resizable(false)
.exact_width(ui.available_width())
.frame(egui::Frame {
stroke: View::DEFAULT_STROKE,
stroke: View::default_stroke(),
..Default::default()
})
.show_animated_inside(ui, !show_connections, |ui| {
egui::CentralPanel::default()
.frame(egui::Frame {
fill: Colors::WHITE,
stroke: View::DEFAULT_STROKE,
fill: Colors::white_or_black(false),
stroke: View::default_stroke(),
inner_margin: Margin {
left: View::get_left_inset() + 4.0,
right: View::far_right_inset_margin(ui) + 4.0,
@ -104,7 +104,7 @@ impl NetworkContent {
egui::CentralPanel::default()
.frame(egui::Frame {
stroke: if show_connections{
View::DEFAULT_STROKE
View::default_stroke()
} else {
Stroke::NONE
},
@ -122,7 +122,7 @@ impl NetworkContent {
top: 3.0,
bottom: View::get_bottom_inset() + 4.0,
},
fill: Colors::BUTTON,
fill: Colors::button(),
..Default::default()
})
.show_inside(ui, |ui| {
@ -230,10 +230,10 @@ impl NetworkContent {
let text = t!("network.disabled_server", "dots" => DOTS_THREE_OUTLINE_VERTICAL);
ui.label(RichText::new(text)
.size(16.0)
.color(Colors::INACTIVE_TEXT)
.color(Colors::inactive_text())
);
ui.add_space(8.0);
View::button(ui, format!("{} {}", POWER, t!("network.enable_node")), Colors::GOLD, || {
View::action_button(ui, format!("{} {}", POWER, t!("network.enable_node")), || {
Node::start();
});
ui.add_space(2.0);
@ -255,7 +255,7 @@ impl NetworkContent {
ui.add_space(18.0);
ui.label(RichText::new(t)
.size(16.0)
.color(Colors::INACTIVE_TEXT)
.color(Colors::inactive_text())
);
});
}
@ -277,13 +277,13 @@ impl NetworkContent {
View::center_content(ui, 156.0, |ui| {
ui.label(RichText::new(t!("network_node.error_clean"))
.size(16.0)
.color(Colors::RED)
.color(Colors::red())
);
ui.add_space(8.0);
let btn_txt = format!("{} {}",
ARROWS_COUNTER_CLOCKWISE,
t!("network_node.resync"));
View::button(ui, btn_txt, Colors::GOLD, || {
View::action_button(ui, btn_txt, || {
Node::clean_up_data();
Node::start();
});
@ -304,7 +304,7 @@ impl NetworkContent {
);
ui.label(RichText::new(text)
.size(16.0)
.color(Colors::RED)
.color(Colors::red())
);
ui.add_space(2.0);
});
@ -314,7 +314,7 @@ impl NetworkContent {
View::center_content(ui, 106.0, |ui| {
ui.label(RichText::new(t!("network_node.error_config", "settings" => FADERS))
.size(16.0)
.color(Colors::RED)
.color(Colors::red())
);
ui.add_space(2.0);
});
@ -323,13 +323,13 @@ impl NetworkContent {
View::center_content(ui, 156.0, |ui| {
ui.label(RichText::new(t!("network_node.error_unknown", "settings" => FADERS))
.size(16.0)
.color(Colors::RED)
.color(Colors::red())
);
ui.add_space(8.0);
let btn_txt = format!("{} {}",
ARROWS_COUNTER_CLOCKWISE,
t!("network_node.resync"));
View::button(ui, btn_txt, Colors::GOLD, || {
View::action_button(ui, btn_txt, || {
Node::clean_up_data();
Node::start();
});

View file

@ -173,7 +173,7 @@ fn block_item_ui(ui: &mut egui::Ui, db: &DiffBlock, rounding: Rounding) {
// Draw round background.
rect.min += vec2(8.0, 0.0);
rect.max -= vec2(8.0, 0.0);
ui.painter().rect(rect, rounding, Colors::WHITE, View::ITEM_STROKE);
ui.painter().rect(rect, rounding, Colors::white_or_black(false), View::item_stroke());
ui.add_space(2.0);
@ -181,7 +181,7 @@ fn block_item_ui(ui: &mut egui::Ui, db: &DiffBlock, rounding: Rounding) {
ui.horizontal(|ui| {
ui.add_space(5.0);
ui.label(RichText::new(format!("{} {}", HASH, db.block_hash))
.color(Colors::BLACK)
.color(Colors::white_or_black(true))
.size(17.0));
});
// Draw block difficulty and height.
@ -192,7 +192,7 @@ fn block_item_ui(ui: &mut egui::Ui, db: &DiffBlock, rounding: Rounding) {
db.difficulty,
AT,
db.block_height);
ui.label(RichText::new(diff_text).color(Colors::TITLE).size(16.0));
ui.label(RichText::new(diff_text).color(Colors::title(false)).size(16.0));
});
// Draw block date.
ui.horizontal(|ui| {
@ -203,7 +203,7 @@ fn block_item_ui(ui: &mut egui::Ui, db: &DiffBlock, rounding: Rounding) {
db.duration,
HOURGLASS_LOW,
block_time))
.color(Colors::GRAY)
.color(Colors::gray())
.size(16.0));
});

View file

@ -175,7 +175,7 @@ impl NetworkTab for NetworkMining {
let workers_size = stratum_stats.worker_stats.len();
if workers_size != 0 && stratum_stats.num_workers > 0 {
ui.add_space(4.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(4.0);
ScrollArea::vertical()
.id_source("stratum_workers_scroll")
@ -201,7 +201,7 @@ impl NetworkTab for NetworkMining {
View::center_content(ui, 142.0, |ui| {
ui.label(RichText::new(t!("network_mining.info", "settings" => FADERS))
.size(16.0)
.color(Colors::INACTIVE_TEXT)
.color(Colors::inactive_text())
);
});
}
@ -218,7 +218,7 @@ fn worker_item_ui(ui: &mut egui::Ui, ws: &WorkerStats, rounding: Rounding) {
// Draw round background.
let mut rect = ui.available_rect_before_wrap();
rect.set_height(WORKER_ITEM_HEIGHT);
ui.painter().rect(rect, rounding, Colors::WHITE, View::ITEM_STROKE);
ui.painter().rect(rect, rounding, Colors::white_or_black(false), View::item_stroke());
ui.add_space(2.0);
ui.horizontal(|ui| {
@ -226,8 +226,12 @@ fn worker_item_ui(ui: &mut egui::Ui, ws: &WorkerStats, rounding: Rounding) {
// Draw worker connection status.
let (status_text, status_icon, status_color) = match ws.is_connected {
true => (t!("network_mining.connected"), PLUGS_CONNECTED, Colors::BLACK),
false => (t!("network_mining.disconnected"), PLUGS, Colors::INACTIVE_TEXT)
true => (
t!("network_mining.connected"),
PLUGS_CONNECTED,
Colors::white_or_black(true)
),
false => (t!("network_mining.disconnected"), PLUGS, Colors::inactive_text())
};
let status_line_text = format!("{} {} {}", status_icon, ws.id, status_text);
ui.heading(RichText::new(status_line_text)
@ -241,35 +245,35 @@ fn worker_item_ui(ui: &mut egui::Ui, ws: &WorkerStats, rounding: Rounding) {
// Draw difficulty.
let diff_text = format!("{} {}", BARBELL, ws.pow_difficulty);
ui.heading(RichText::new(diff_text)
.color(Colors::TITLE)
.color(Colors::title(false))
.size(16.0));
ui.add_space(6.0);
// Draw accepted shares.
let accepted_text = format!("{} {}", FOLDER_SIMPLE_PLUS, ws.num_accepted);
ui.heading(RichText::new(accepted_text)
.color(Colors::GREEN)
.color(Colors::green())
.size(16.0));
ui.add_space(6.0);
// Draw rejected shares.
let rejected_text = format!("{} {}", FOLDER_SIMPLE_MINUS, ws.num_rejected);
ui.heading(RichText::new(rejected_text)
.color(Colors::RED)
.color(Colors::red())
.size(16.0));
ui.add_space(6.0);
// Draw stale shares.
let stale_text = format!("{} {}", FOLDER_DASHED, ws.num_stale);
ui.heading(RichText::new(stale_text)
.color(Colors::GRAY)
.color(Colors::gray())
.size(16.0));
ui.add_space(6.0);
// Draw blocks found.
let blocks_found_text = format!("{} {}", CUBE, ws.num_blocks_found);
ui.heading(RichText::new(blocks_found_text)
.color(Colors::TITLE)
.color(Colors::title(false))
.size(16.0));
});
ui.horizontal(|ui| {
@ -280,7 +284,7 @@ fn worker_item_ui(ui: &mut egui::Ui, ws: &WorkerStats, rounding: Rounding) {
let seen_time = View::format_time(seen_ts as i64);
let seen_text = format!("{} {}", CLOCK_AFTERNOON, seen_time);
ui.heading(RichText::new(seen_text)
.color(Colors::GRAY)
.color(Colors::gray())
.size(16.0));
});
});

View file

@ -205,7 +205,7 @@ fn peer_item_ui(ui: &mut egui::Ui, peer: &PeerStats, rounding: Rounding) {
ui.allocate_ui_at_rect(rect, |ui| {
ui.vertical(|ui| {
// Draw round background.
ui.painter().rect(rect, rounding, Colors::WHITE, View::ITEM_STROKE);
ui.painter().rect(rect, rounding, Colors::white_or_black(false), View::item_stroke());
ui.add_space(2.0);
@ -213,7 +213,7 @@ fn peer_item_ui(ui: &mut egui::Ui, peer: &PeerStats, rounding: Rounding) {
ui.horizontal(|ui| {
ui.add_space(5.0);
let addr_text = format!("{} {}", PLUGS_CONNECTED, &peer.addr);
ui.label(RichText::new(addr_text).color(Colors::BLACK).size(17.0));
ui.label(RichText::new(addr_text).color(Colors::white_or_black(true)).size(17.0));
});
// Draw peer difficulty and height
ui.horizontal(|ui| {
@ -223,13 +223,13 @@ fn peer_item_ui(ui: &mut egui::Ui, peer: &PeerStats, rounding: Rounding) {
peer.total_difficulty,
AT,
peer.height);
ui.label(RichText::new(diff_text).color(Colors::TITLE).size(16.0));
ui.label(RichText::new(diff_text).color(Colors::title(false)).size(16.0));
});
// Draw peer user-agent
ui.horizontal(|ui| {
ui.add_space(6.0);
let agent_text = format!("{} {}", DEVICES, &peer.user_agent);
ui.label(RichText::new(agent_text).color(Colors::GRAY).size(16.0));
ui.label(RichText::new(agent_text).color(Colors::gray()).size(16.0));
});
ui.add_space(2.0);

View file

@ -97,35 +97,35 @@ impl NetworkTab for NetworkSettings {
self.node.ui(ui, frame, cb);
ui.add_space(6.0);
View::horizontal_line(ui, Colors::STROKE);
View::horizontal_line(ui, Colors::stroke());
ui.add_space(4.0);
// Draw P2P server setup section.
self.p2p.ui(ui, frame, cb);
ui.add_space(6.0);
View::horizontal_line(ui, Colors::STROKE);
View::horizontal_line(ui, Colors::stroke());
ui.add_space(4.0);
// Draw Stratum server setup section.
self.stratum.ui(ui, frame, cb);
ui.add_space(6.0);
View::horizontal_line(ui, Colors::STROKE);
View::horizontal_line(ui, Colors::stroke());
ui.add_space(4.0);
// Draw pool setup section.
self.pool.ui(ui, frame, cb);
ui.add_space(6.0);
View::horizontal_line(ui, Colors::STROKE);
View::horizontal_line(ui, Colors::stroke());
ui.add_space(4.0);
// Draw Dandelion server setup section.
self.dandelion.ui(ui, frame, cb);
ui.add_space(6.0);
View::horizontal_line(ui, Colors::STROKE);
View::horizontal_line(ui, Colors::stroke());
ui.add_space(6.0);
// Draw reset settings content.
@ -143,7 +143,7 @@ impl NetworkSettings {
ui.add_space(12.0);
ui.label(RichText::new(t!("network_settings.restart_node_required"))
.size(16.0)
.color(Colors::GREEN)
.color(Colors::green())
);
}
}
@ -192,7 +192,7 @@ impl NetworkSettings {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("network.no_ips"))
.size(16.0)
.color(Colors::INACTIVE_TEXT)
.color(Colors::inactive_text())
);
ui.add_space(6.0);
});
@ -204,12 +204,12 @@ fn reset_settings_ui(ui: &mut egui::Ui) {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("network_settings.reset_settings_desc"))
.size(16.0)
.color(Colors::TEXT));
.color(Colors::text(false)));
ui.add_space(8.0);
let button_text = format!("{} {}",
ARROW_COUNTER_CLOCKWISE,
t!("network_settings.reset_settings"));
View::button(ui, button_text, Colors::GOLD, || {
View::action_button(ui, button_text, || {
// Show modal to confirm settings reset.
Modal::new(RESET_SETTINGS_MODAL)
.position(ModalPosition::Center)
@ -222,7 +222,7 @@ fn reset_settings_ui(ui: &mut egui::Ui) {
ui.add_space(12.0);
ui.label(RichText::new(t!("network_settings.restart_node_required"))
.size(16.0)
.color(Colors::GRAY)
.color(Colors::gray())
);
}
ui.add_space(12.0);
@ -237,24 +237,24 @@ fn reset_settings_confirmation_modal(ui: &mut egui::Ui, modal: &Modal) {
let reset_text = format!("{}?", t!("network_settings.reset_settings_desc"));
ui.label(RichText::new(reset_text)
.size(17.0)
.color(Colors::TEXT));
.color(Colors::text(false)));
ui.add_space(8.0);
});
// Show modal buttons.
ui.scope(|ui| {
// Setup spacing between buttons.
ui.spacing_mut().item_spacing = egui::Vec2::new(6.0, 0.0);
ui.spacing_mut().item_spacing = egui::Vec2::new(8.0, 0.0);
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("network_settings.reset"), Colors::WHITE, || {
View::button(ui, t!("network_settings.reset"), Colors::white_or_black(false), || {
NodeConfig::reset_to_default();
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
modal.close();
});
});

View file

@ -92,7 +92,7 @@ impl DandelionSetup {
self.current_modal_ui(ui, frame, cb);
View::sub_title(ui, format!("{} {}", GRAPH, "Dandelion"));
View::horizontal_line(ui, Colors::STROKE);
View::horizontal_line(ui, Colors::stroke());
ui.add_space(6.0);
ui.vertical_centered(|ui| {
@ -100,28 +100,28 @@ impl DandelionSetup {
self.epoch_ui(ui, cb);
ui.add_space(6.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
// Show embargo expiration time setup.
self.embargo_ui(ui, cb);
ui.add_space(6.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
// Show aggregation period setup.
self.aggregation_ui(ui, cb);
ui.add_space(6.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
// Show Stem phase probability setup.
self.stem_prob_ui(ui, cb);
ui.add_space(6.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(8.0);
// Show setup to always stem our txs.
@ -137,12 +137,12 @@ impl DandelionSetup {
fn epoch_ui(&mut self, ui: &mut egui::Ui, cb: &dyn PlatformCallbacks) {
ui.label(RichText::new(t!("network_settings.epoch_duration"))
.size(16.0)
.color(Colors::GRAY)
.color(Colors::gray())
);
ui.add_space(6.0);
let epoch = NodeConfig::get_dandelion_epoch();
View::button(ui, format!("{} {}", WATCH, epoch.clone()), Colors::BUTTON, || {
View::button(ui, format!("{} {}", WATCH, epoch.clone()), Colors::button(), || {
// Setup values for modal.
self.epoch_edit = epoch;
// Show epoch setup modal.
@ -161,7 +161,7 @@ impl DandelionSetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("network_settings.epoch_duration"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw epoch text edit.
@ -173,7 +173,7 @@ impl DandelionSetup {
ui.add_space(12.0);
ui.label(RichText::new(t!("network_settings.not_valid_value"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
} else {
NetworkSettings::node_restart_required_ui(ui);
}
@ -196,14 +196,14 @@ impl DandelionSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.save"), Colors::WHITE, on_save);
View::button(ui, t!("modal.save"), Colors::white_or_black(false), on_save);
});
});
ui.add_space(6.0);
@ -214,12 +214,12 @@ impl DandelionSetup {
fn embargo_ui(&mut self, ui: &mut egui::Ui, cb: &dyn PlatformCallbacks) {
ui.label(RichText::new(t!("network_settings.embargo_timer"))
.size(16.0)
.color(Colors::GRAY)
.color(Colors::gray())
);
ui.add_space(6.0);
let embargo = NodeConfig::get_dandelion_embargo();
View::button(ui, format!("{} {}", TIMER, embargo.clone()), Colors::BUTTON, || {
View::button(ui, format!("{} {}", TIMER, embargo.clone()), Colors::button(), || {
// Setup values for modal.
self.embargo_edit = embargo;
// Show embargo setup modal.
@ -238,7 +238,7 @@ impl DandelionSetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("network_settings.embargo_timer"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw embargo text edit.
@ -250,7 +250,7 @@ impl DandelionSetup {
ui.add_space(12.0);
ui.label(RichText::new(t!("network_settings.not_valid_value"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
} else {
NetworkSettings::node_restart_required_ui(ui);
}
@ -273,14 +273,14 @@ impl DandelionSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.save"), Colors::WHITE, on_save);
View::button(ui, t!("modal.save"), Colors::white_or_black(false), on_save);
});
});
ui.add_space(6.0);
@ -291,12 +291,12 @@ impl DandelionSetup {
fn aggregation_ui(&mut self, ui: &mut egui::Ui, cb: &dyn PlatformCallbacks) {
ui.label(RichText::new(t!("network_settings.aggregation_period"))
.size(16.0)
.color(Colors::GRAY)
.color(Colors::gray())
);
ui.add_space(6.0);
let agg = NodeConfig::get_dandelion_aggregation();
View::button(ui, format!("{} {}", CLOCK_COUNTDOWN, agg.clone()), Colors::BUTTON, || {
View::button(ui, format!("{} {}", CLOCK_COUNTDOWN, agg.clone()), Colors::button(), || {
// Setup values for modal.
self.aggregation_edit = agg;
// Show aggregation setup modal.
@ -315,7 +315,7 @@ impl DandelionSetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("network_settings.aggregation_period"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw aggregation period text edit.
@ -327,7 +327,7 @@ impl DandelionSetup {
ui.add_space(12.0);
ui.label(RichText::new(t!("network_settings.not_valid_value"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
} else {
NetworkSettings::node_restart_required_ui(ui);
}
@ -350,14 +350,14 @@ impl DandelionSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.save"), Colors::WHITE, on_save);
View::button(ui, t!("modal.save"), Colors::white_or_black(false), on_save);
});
});
ui.add_space(6.0);
@ -368,12 +368,12 @@ impl DandelionSetup {
fn stem_prob_ui(&mut self, ui: &mut egui::Ui, cb: &dyn PlatformCallbacks) {
ui.label(RichText::new(t!("network_settings.stem_probability"))
.size(16.0)
.color(Colors::GRAY)
.color(Colors::gray())
);
ui.add_space(6.0);
let stem_prob = NodeConfig::get_stem_probability();
View::button(ui, format!("{}%", stem_prob.clone()), Colors::BUTTON, || {
View::button(ui, format!("{}%", stem_prob.clone()), Colors::button(), || {
// Setup values for modal.
self.stem_prob_edit = stem_prob;
// Show stem probability setup modal.
@ -392,7 +392,7 @@ impl DandelionSetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("network_settings.stem_probability"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw stem phase probability text edit.
@ -404,7 +404,7 @@ impl DandelionSetup {
ui.add_space(12.0);
ui.label(RichText::new(t!("network_settings.not_valid_value"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
} else {
NetworkSettings::node_restart_required_ui(ui);
}
@ -427,14 +427,14 @@ impl DandelionSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.save"), Colors::WHITE, on_save);
View::button(ui, t!("modal.save"), Colors::white_or_black(false), on_save);
});
});
ui.add_space(6.0);

View file

@ -103,7 +103,7 @@ impl NodeSetup {
self.current_modal_ui(ui, frame, cb);
View::sub_title(ui, format!("{} {}", COMPUTER_TOWER, t!("network_settings.server")));
View::horizontal_line(ui, Colors::STROKE);
View::horizontal_line(ui, Colors::stroke());
ui.add_space(6.0);
// Show chain type setup.
@ -126,12 +126,12 @@ impl NodeSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("network_settings.disable"), Colors::GOLD, || {
View::action_button(ui, t!("network_settings.disable"), || {
Node::stop(false);
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("network_settings.restart"), Colors::GOLD, || {
View::action_button(ui, t!("network_settings.restart"), || {
Node::restart();
});
});
@ -141,7 +141,7 @@ impl NodeSetup {
ui.add_space(6.0);
ui.vertical_centered(|ui| {
let enable_text = format!("{} {}", POWER, t!("network_settings.enable"));
View::button(ui, enable_text, Colors::GOLD, || {
View::action_button(ui, enable_text, || {
Node::start();
});
});
@ -156,7 +156,7 @@ impl NodeSetup {
ui.add_space(2.0);
ui.label(RichText::new(t!("network_settings.restart_node_required"))
.size(16.0)
.color(Colors::INACTIVE_TEXT)
.color(Colors::inactive_text())
);
ui.add_space(4.0);
}
@ -167,13 +167,13 @@ impl NodeSetup {
// Show message when IP addresses are not available on the system.
NetworkSettings::no_ip_address_ui(ui);
} else {
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("network_settings.api_ip"))
.size(16.0)
.color(Colors::GRAY)
.color(Colors::gray())
);
ui.add_space(6.0);
@ -196,7 +196,7 @@ impl NodeSetup {
}
ui.add_space(6.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
ui.vertical_centered(|ui| {
@ -204,14 +204,14 @@ impl NodeSetup {
self.ftl_ui(ui, cb);
ui.add_space(6.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
// Validation setup.
self.validation_mode_ui(ui);
ui.add_space(6.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
// Archive mode setup.
@ -222,7 +222,7 @@ impl NodeSetup {
/// Draw [`ChainTypes`] setup content.
pub fn chain_type_ui(ui: &mut egui::Ui) {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("network.type")).size(16.0).color(Colors::GRAY));
ui.label(RichText::new(t!("network.type")).size(16.0).color(Colors::gray()));
});
let saved_chain_type = AppConfig::chain_type();
@ -251,11 +251,11 @@ impl NodeSetup {
/// Draw API port setup content.
fn api_port_setup_ui(&mut self, ui: &mut egui::Ui, cb: &dyn PlatformCallbacks) {
ui.label(RichText::new(t!("network_settings.api_port")).size(16.0).color(Colors::GRAY));
ui.label(RichText::new(t!("network_settings.api_port")).size(16.0).color(Colors::gray()));
ui.add_space(6.0);
let (_, port) = NodeConfig::get_api_ip_port();
View::button(ui, format!("{} {}", PLUG, port.clone()), Colors::BUTTON, || {
View::button(ui, format!("{} {}", PLUG, port.clone()), Colors::button(), || {
// Setup values for modal.
self.api_port_edit = port;
self.api_port_available_edit = self.is_api_port_available;
@ -273,7 +273,7 @@ impl NodeSetup {
// Show error when API server port is unavailable.
ui.label(RichText::new(t!("network_settings.port_unavailable"))
.size(16.0)
.color(Colors::RED));
.color(Colors::red()));
ui.add_space(6.0);
}
ui.add_space(6.0);
@ -283,7 +283,7 @@ impl NodeSetup {
fn api_port_modal(&mut self, ui: &mut egui::Ui, modal: &Modal, cb: &dyn PlatformCallbacks) {
ui.add_space(6.0);
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("network_settings.api_port")).size(17.0).color(Colors::GRAY));
ui.label(RichText::new(t!("network_settings.api_port")).size(17.0).color(Colors::gray()));
ui.add_space(6.0);
// Draw API port text edit.
@ -295,7 +295,7 @@ impl NodeSetup {
ui.add_space(12.0);
ui.label(RichText::new(t!("network_settings.port_unavailable"))
.size(16.0)
.color(Colors::RED));
.color(Colors::red()));
} else {
NetworkSettings::node_restart_required_ui(ui);
}
@ -330,13 +330,13 @@ impl NodeSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
cb.hide_keyboard();
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.save"), Colors::WHITE, on_save);
View::button(ui, t!("modal.save"), Colors::white_or_black(false), on_save);
});
});
ui.add_space(6.0);
@ -351,7 +351,7 @@ impl NodeSetup {
};
ui.label(RichText::new(secret_title)
.size(16.0)
.color(Colors::GRAY)
.color(Colors::gray())
);
ui.add_space(6.0);
@ -366,7 +366,7 @@ impl NodeSetup {
format!("{} {}", SHIELD_SLASH, t!("network_settings.disabled"))
};
View::button(ui, secret_text, Colors::BUTTON, || {
View::button(ui, secret_text, Colors::button(), || {
// Setup values for modal.
self.secret_edit = secret_value.unwrap_or("".to_string());
// Show secret edit modal.
@ -386,7 +386,7 @@ impl NodeSetup {
API_SECRET_MODAL => t!("network_settings.api_secret"),
_ => t!("network_settings.foreign_api_secret")
};
ui.label(RichText::new(description).size(17.0).color(Colors::GRAY));
ui.label(RichText::new(description).size(17.0).color(Colors::gray()));
ui.add_space(8.0);
// Draw API secret token value text edit.
@ -398,7 +398,7 @@ impl NodeSetup {
if Node::is_running() {
ui.label(RichText::new(t!("network_settings.restart_node_required"))
.size(16.0)
.color(Colors::GREEN)
.color(Colors::green())
);
ui.add_space(6.0);
}
@ -427,13 +427,13 @@ impl NodeSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
cb.hide_keyboard();
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.save"), Colors::WHITE, on_save);
View::button(ui, t!("modal.save"), Colors::white_or_black(false), on_save);
});
});
ui.add_space(6.0);
@ -444,12 +444,12 @@ impl NodeSetup {
fn ftl_ui(&mut self, ui: &mut egui::Ui, cb: &dyn PlatformCallbacks) {
ui.label(RichText::new(t!("network_settings.ftl"))
.size(16.0)
.color(Colors::GRAY)
.color(Colors::gray())
);
ui.add_space(6.0);
let ftl = NodeConfig::get_ftl();
View::button(ui, format!("{} {}", CLOCK_CLOCKWISE, ftl.clone()), Colors::BUTTON, || {
View::button(ui, format!("{} {}", CLOCK_CLOCKWISE, ftl.clone()), Colors::button(), || {
// Setup values for modal.
self.ftl_edit = ftl;
// Show ftl value setup modal.
@ -462,7 +462,7 @@ impl NodeSetup {
ui.add_space(6.0);
ui.label(RichText::new(t!("network_settings.ftl_description"))
.size(16.0)
.color(Colors::INACTIVE_TEXT)
.color(Colors::inactive_text())
);
}
@ -472,7 +472,7 @@ impl NodeSetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("network_settings.ftl"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw ftl value text edit.
@ -484,7 +484,7 @@ impl NodeSetup {
ui.add_space(12.0);
ui.label(RichText::new(t!("network_settings.not_valid_value"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
} else {
NetworkSettings::node_restart_required_ui(ui);
}
@ -507,14 +507,14 @@ impl NodeSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.save"), Colors::WHITE, on_save);
View::button(ui, t!("modal.save"), Colors::white_or_black(false), on_save);
});
});
ui.add_space(6.0);
@ -530,7 +530,7 @@ impl NodeSetup {
ui.add_space(4.0);
ui.label(RichText::new(t!("network_settings.full_validation_description"))
.size(16.0)
.color(Colors::INACTIVE_TEXT)
.color(Colors::inactive_text())
);
}
@ -543,7 +543,7 @@ impl NodeSetup {
ui.add_space(4.0);
ui.label(RichText::new(t!("network_settings.archive_mode_desc"))
.size(16.0)
.color(Colors::INACTIVE_TEXT)
.color(Colors::inactive_text())
);
}
}

View file

@ -158,7 +158,7 @@ impl P2PSetup {
self.current_modal_ui(ui, frame, cb);
View::sub_title(ui, format!("{} {}", HANDSHAKE, t!("network_settings.p2p_server")));
View::horizontal_line(ui, Colors::STROKE);
View::horizontal_line(ui, Colors::stroke());
ui.add_space(6.0);
ui.vertical_centered(|ui| {
@ -166,62 +166,62 @@ impl P2PSetup {
self.port_ui(ui, cb);
ui.add_space(6.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
// Show seeding type setup.
self.seeding_type_ui(ui, cb);
ui.add_space(6.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
ui.label(RichText::new(t!("network_settings.allow_list"))
.size(16.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(6.0);
// Show allowed peers setup.
self.peer_list_ui(ui, &PeerType::Allowed, cb);
ui.add_space(6.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
ui.label(RichText::new(t!("network_settings.deny_list"))
.size(16.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(6.0);
// Show denied peers setup.
self.peer_list_ui(ui, &PeerType::Denied, cb);
ui.add_space(6.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
ui.label(RichText::new(t!("network_settings.favourites"))
.size(16.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(6.0);
// Show preferred peers setup.
self.peer_list_ui(ui, &PeerType::Preferred, cb);
ui.add_space(6.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
// Show ban window setup.
self.ban_window_ui(ui, cb);
ui.add_space(6.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
// Show maximum inbound peers value setup.
self.max_inbound_ui(ui, cb);
ui.add_space(6.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
// Show maximum outbound peers value setup.
@ -229,7 +229,7 @@ impl P2PSetup {
if !Node::is_restarting() && !self.peers_reset {
ui.add_space(6.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
// Show peers data reset content.
@ -242,12 +242,12 @@ impl P2PSetup {
fn port_ui(&mut self, ui: &mut egui::Ui, cb: &dyn PlatformCallbacks) {
ui.label(RichText::new(t!("network_settings.p2p_port"))
.size(16.0)
.color(Colors::GRAY)
.color(Colors::gray())
);
ui.add_space(6.0);
let port = NodeConfig::get_p2p_port();
View::button(ui, format!("{} {}", PLUG, port.clone()), Colors::BUTTON, || {
View::button(ui, format!("{} {}", PLUG, port.clone()), Colors::button(), || {
// Setup values for modal.
self.port_edit = port;
self.port_available_edit = self.is_port_available;
@ -265,7 +265,7 @@ impl P2PSetup {
ui.add_space(6.0);
ui.label(RichText::new(t!("network_settings.port_unavailable"))
.size(16.0)
.color(Colors::RED));
.color(Colors::red()));
ui.add_space(12.0);
}
}
@ -276,7 +276,7 @@ impl P2PSetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("network_settings.p2p_port"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw p2p port text edit.
@ -288,7 +288,7 @@ impl P2PSetup {
ui.add_space(12.0);
ui.label(RichText::new(t!("network_settings.port_unavailable"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
}
ui.add_space(12.0);
@ -320,14 +320,14 @@ impl P2PSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.save"), Colors::WHITE, on_save);
View::button(ui, t!("modal.save"), Colors::white_or_black(false), on_save);
});
});
ui.add_space(6.0);
@ -370,7 +370,7 @@ impl P2PSetup {
};
ui.label(RichText::new(desc)
.size(16.0)
.color(Colors::INACTIVE_TEXT));
.color(Colors::inactive_text()));
ui.add_space(12.0);
}
@ -380,7 +380,7 @@ impl P2PSetup {
format!("{} {}", PLUS_CIRCLE, t!("network_settings.add_peer"))
};
View::button(ui, add_text, Colors::BUTTON, || {
View::button(ui, add_text, Colors::button(), || {
// Setup values for modal.
self.is_correct_address_edit = true;
self.peer_edit = "".to_string();
@ -417,7 +417,7 @@ impl P2PSetup {
CUSTOM_SEED_MODAL => t!("network_settings.seed_address"),
&_ => t!("network_settings.peer_address")
};
ui.label(RichText::new(label_text).size(17.0).color(Colors::GRAY));
ui.label(RichText::new(label_text).size(17.0).color(Colors::gray()));
ui.add_space(8.0);
// Draw peer address text edit.
@ -429,7 +429,7 @@ impl P2PSetup {
ui.add_space(10.0);
ui.label(RichText::new(t!("network_settings.peer_address_error"))
.size(16.0)
.color(Colors::RED));
.color(Colors::red()));
}
ui.add_space(12.0);
@ -463,14 +463,14 @@ impl P2PSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.save"), Colors::WHITE, on_save);
View::button(ui, t!("modal.save"), Colors::white_or_black(false), on_save);
});
});
ui.add_space(6.0);
@ -481,7 +481,7 @@ impl P2PSetup {
/// Draw seeding type setup content.
fn seeding_type_ui(&mut self, ui: &mut egui::Ui, cb: &dyn PlatformCallbacks) {
let title = Self::DNS_SEEDS_TITLE;
ui.label(RichText::new(title).size(16.0).color(Colors::GRAY));
ui.label(RichText::new(title).size(16.0).color(Colors::gray()));
ui.add_space(2.0);
let default_seeding = NodeConfig::is_default_seeding_type();
@ -502,12 +502,12 @@ impl P2PSetup {
fn ban_window_ui(&mut self, ui: &mut egui::Ui, cb: &dyn PlatformCallbacks) {
ui.label(RichText::new(t!("network_settings.ban_window"))
.size(16.0)
.color(Colors::GRAY)
.color(Colors::gray())
);
ui.add_space(6.0);
let ban_window = NodeConfig::get_p2p_ban_window();
View::button(ui, format!("{} {}", PROHIBIT_INSET, ban_window.clone()), Colors::BUTTON, || {
View::button(ui, format!("{} {}", PROHIBIT_INSET, ban_window.clone()), Colors::button(), || {
// Setup values for modal.
self.ban_window_edit = ban_window;
// Show ban window period setup modal.
@ -520,7 +520,7 @@ impl P2PSetup {
ui.add_space(6.0);
ui.label(RichText::new(t!("network_settings.ban_window_desc"))
.size(16.0)
.color(Colors::INACTIVE_TEXT)
.color(Colors::inactive_text())
);
ui.add_space(2.0);
}
@ -531,7 +531,7 @@ impl P2PSetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("network_settings.ban_window"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw ban window text edit.
@ -543,7 +543,7 @@ impl P2PSetup {
ui.add_space(12.0);
ui.label(RichText::new(t!("network_settings.not_valid_value"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
} else {
NetworkSettings::node_restart_required_ui(ui);
}
@ -566,14 +566,14 @@ impl P2PSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.save"), Colors::WHITE, on_save);
View::button(ui, t!("modal.save"), Colors::white_or_black(false), on_save);
});
});
ui.add_space(6.0);
@ -584,13 +584,13 @@ impl P2PSetup {
fn max_inbound_ui(&mut self, ui: &mut egui::Ui, cb: &dyn PlatformCallbacks) {
ui.label(RichText::new(t!("network_settings.max_inbound_count"))
.size(16.0)
.color(Colors::GRAY)
.color(Colors::gray())
);
ui.add_space(6.0);
let max_inbound = NodeConfig::get_max_inbound_peers();
let button_text = format!("{} {}", ARROW_FAT_LINES_DOWN, max_inbound.clone());
View::button(ui, button_text, Colors::BUTTON, || {
View::button(ui, button_text, Colors::button(), || {
// Setup values for modal.
self.max_inbound_count = max_inbound;
// Show maximum number of inbound peers setup modal.
@ -609,7 +609,7 @@ impl P2PSetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("network_settings.max_inbound_count"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw maximum number of inbound peers text edit.
@ -621,7 +621,7 @@ impl P2PSetup {
ui.add_space(12.0);
ui.label(RichText::new(t!("network_settings.not_valid_value"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
} else {
NetworkSettings::node_restart_required_ui(ui);
}
@ -644,14 +644,14 @@ impl P2PSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.save"), Colors::WHITE, on_save);
View::button(ui, t!("modal.save"), Colors::white_or_black(false), on_save);
});
});
ui.add_space(6.0);
@ -662,13 +662,13 @@ impl P2PSetup {
fn max_outbound_ui(&mut self, ui: &mut egui::Ui, cb: &dyn PlatformCallbacks) {
ui.label(RichText::new(t!("network_settings.max_outbound_count"))
.size(16.0)
.color(Colors::GRAY)
.color(Colors::gray())
);
ui.add_space(6.0);
let max_outbound = NodeConfig::get_max_outbound_peers();
let button_text = format!("{} {}", ARROW_FAT_LINES_UP, max_outbound.clone());
View::button(ui, button_text, Colors::BUTTON, || {
View::button(ui, button_text, Colors::button(), || {
// Setup values for modal.
self.max_outbound_count = max_outbound;
// Show maximum number of outbound peers setup modal.
@ -687,7 +687,7 @@ impl P2PSetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("network_settings.max_outbound_count"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw maximum number of outbound peers text edit.
@ -699,7 +699,7 @@ impl P2PSetup {
ui.add_space(12.0);
ui.label(RichText::new(t!("network_settings.not_valid_value"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
} else {
NetworkSettings::node_restart_required_ui(ui);
}
@ -722,14 +722,14 @@ impl P2PSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.save"), Colors::WHITE, on_save);
View::button(ui, t!("modal.save"), Colors::white_or_black(false), on_save);
});
});
ui.add_space(6.0);
@ -741,14 +741,14 @@ impl P2PSetup {
ui.add_space(4.0);
let button_text = format!("{} {}", TRASH, t!("network_settings.reset_peers"));
View::colored_text_button(ui, button_text, Colors::RED, Colors::BUTTON, || {
View::colored_text_button(ui, button_text, Colors::red(), Colors::button(), || {
Node::reset_peers(false);
self.peers_reset = true;
});
ui.add_space(6.0);
ui.label(RichText::new(t!("network_settings.reset_peers_desc"))
.size(16.0)
.color(Colors::INACTIVE_TEXT)
.color(Colors::inactive_text())
);
}
}
@ -767,7 +767,7 @@ fn peer_item_ui(ui: &mut egui::Ui,
let mut bg_rect = rect.clone();
bg_rect.min += egui::emath::vec2(6.0, 0.0);
let item_rounding = View::item_rounding(index, len, false);
ui.painter().rect(bg_rect, item_rounding, Colors::WHITE, View::ITEM_STROKE);
ui.painter().rect(bg_rect, item_rounding, Colors::white_or_black(false), View::item_stroke());
ui.vertical(|ui| {
ui.allocate_ui_with_layout(rect.size(), Layout::right_to_left(Align::Center), |ui| {
@ -798,7 +798,7 @@ fn peer_item_ui(ui: &mut egui::Ui,
// Draw peer address.
let peer_text = format!("{} {}", GLOBE_SIMPLE, &peer_addr);
ui.label(RichText::new(peer_text)
.color(Colors::TEXT_BUTTON)
.color(Colors::text_button())
.size(16.0));
});
});

View file

@ -100,7 +100,7 @@ impl PoolSetup {
self.current_modal_ui(ui, frame, cb);
View::sub_title(ui, format!("{} {}", CHART_SCATTER, t!("network_settings.tx_pool")));
View::horizontal_line(ui, Colors::STROKE);
View::horizontal_line(ui, Colors::stroke());
ui.add_space(6.0);
ui.vertical_centered(|ui| {
@ -108,28 +108,28 @@ impl PoolSetup {
self.fee_base_ui(ui, cb);
ui.add_space(6.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
// Show reorg cache retention period setup.
self.reorg_period_ui(ui, cb);
ui.add_space(6.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
// Show pool size setup.
self.pool_size_ui(ui, cb);
ui.add_space(6.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
// Show stem pool size setup.
self.stem_size_ui(ui, cb);
ui.add_space(6.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
// Show max weight of transactions setup.
@ -141,12 +141,12 @@ impl PoolSetup {
fn fee_base_ui(&mut self, ui: &mut egui::Ui, cb: &dyn PlatformCallbacks) {
ui.label(RichText::new(t!("network_settings.pool_fee"))
.size(16.0)
.color(Colors::GRAY)
.color(Colors::gray())
);
ui.add_space(6.0);
let fee = NodeConfig::get_base_fee();
View::button(ui, format!("{} {}", HAND_COINS, fee.clone()), Colors::BUTTON, || {
View::button(ui, format!("{} {}", HAND_COINS, fee.clone()), Colors::button(), || {
// Setup values for modal.
self.fee_base_edit = fee;
// Show fee setup modal.
@ -165,7 +165,7 @@ impl PoolSetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("network_settings.pool_fee"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw fee base text edit.
@ -177,7 +177,7 @@ impl PoolSetup {
ui.add_space(12.0);
ui.label(RichText::new(t!("network_settings.not_valid_value"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
} else {
NetworkSettings::node_restart_required_ui(ui);
}
@ -199,14 +199,14 @@ impl PoolSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.save"), Colors::WHITE, on_save);
View::button(ui, t!("modal.save"), Colors::white_or_black(false), on_save);
});
});
ui.add_space(6.0);
@ -218,12 +218,12 @@ impl PoolSetup {
fn reorg_period_ui(&mut self, ui: &mut egui::Ui, cb: &dyn PlatformCallbacks) {
ui.label(RichText::new(t!("network_settings.reorg_period"))
.size(16.0)
.color(Colors::GRAY)
.color(Colors::gray())
);
ui.add_space(6.0);
let period = NodeConfig::get_reorg_cache_period();
View::button(ui, format!("{} {}", CLOCK_COUNTDOWN, period.clone()), Colors::BUTTON, || {
View::button(ui, format!("{} {}", CLOCK_COUNTDOWN, period.clone()), Colors::button(), || {
// Setup values for modal.
self.reorg_period_edit = period;
// Show reorg period setup modal.
@ -242,7 +242,7 @@ impl PoolSetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("network_settings.reorg_period"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw reorg period text edit.
@ -254,7 +254,7 @@ impl PoolSetup {
ui.add_space(12.0);
ui.label(RichText::new(t!("network_settings.not_valid_value"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
} else {
NetworkSettings::node_restart_required_ui(ui);
}
@ -276,14 +276,14 @@ impl PoolSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.save"), Colors::WHITE, on_save);
View::button(ui, t!("modal.save"), Colors::white_or_black(false), on_save);
});
});
ui.add_space(6.0);
@ -295,12 +295,12 @@ impl PoolSetup {
fn pool_size_ui(&mut self, ui: &mut egui::Ui, cb: &dyn PlatformCallbacks) {
ui.label(RichText::new(t!("network_settings.max_tx_pool"))
.size(16.0)
.color(Colors::GRAY)
.color(Colors::gray())
);
ui.add_space(6.0);
let size = NodeConfig::get_max_pool_size();
View::button(ui, format!("{} {}", CIRCLES_THREE, size.clone()), Colors::BUTTON, || {
View::button(ui, format!("{} {}", CIRCLES_THREE, size.clone()), Colors::button(), || {
// Setup values for modal.
self.pool_size_edit = size;
// Show pool size setup modal.
@ -319,7 +319,7 @@ impl PoolSetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("network_settings.max_tx_pool"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw pool size text edit.
@ -331,7 +331,7 @@ impl PoolSetup {
ui.add_space(12.0);
ui.label(RichText::new(t!("network_settings.not_valid_value"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
} else {
NetworkSettings::node_restart_required_ui(ui);
}
@ -353,14 +353,14 @@ impl PoolSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.save"), Colors::WHITE, on_save);
View::button(ui, t!("modal.save"), Colors::white_or_black(false), on_save);
});
});
ui.add_space(6.0);
@ -372,12 +372,12 @@ impl PoolSetup {
fn stem_size_ui(&mut self, ui: &mut egui::Ui, cb: &dyn PlatformCallbacks) {
ui.label(RichText::new(t!("network_settings.max_tx_stempool"))
.size(16.0)
.color(Colors::GRAY)
.color(Colors::gray())
);
ui.add_space(6.0);
let size = NodeConfig::get_max_stempool_size();
View::button(ui, format!("{} {}", BEZIER_CURVE, size.clone()), Colors::BUTTON, || {
View::button(ui, format!("{} {}", BEZIER_CURVE, size.clone()), Colors::button(), || {
// Setup values for modal.
self.stempool_size_edit = size;
// Show stempool size setup modal.
@ -396,7 +396,7 @@ impl PoolSetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("network_settings.max_tx_stempool"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw stempool size text edit.
@ -408,7 +408,7 @@ impl PoolSetup {
ui.add_space(12.0);
ui.label(RichText::new(t!("network_settings.not_valid_value"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
} else {
NetworkSettings::node_restart_required_ui(ui);
}
@ -430,14 +430,14 @@ impl PoolSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.save"), Colors::WHITE, on_save);
View::button(ui, t!("modal.save"), Colors::white_or_black(false), on_save);
});
});
ui.add_space(6.0);
@ -449,12 +449,12 @@ impl PoolSetup {
fn max_weight_ui(&mut self, ui: &mut egui::Ui, cb: &dyn PlatformCallbacks) {
ui.label(RichText::new(t!("network_settings.max_tx_weight"))
.size(16.0)
.color(Colors::GRAY)
.color(Colors::gray())
);
ui.add_space(6.0);
let weight = NodeConfig::get_mineable_max_weight();
View::button(ui, format!("{} {}", BOUNDING_BOX, weight.clone()), Colors::BUTTON, || {
View::button(ui, format!("{} {}", BOUNDING_BOX, weight.clone()), Colors::button(), || {
// Setup values for modal.
self.max_weight_edit = weight;
// Show total tx weight setup modal.
@ -473,7 +473,7 @@ impl PoolSetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("network_settings.max_tx_weight"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw tx weight text edit.
@ -485,7 +485,7 @@ impl PoolSetup {
ui.add_space(12.0);
ui.label(RichText::new(t!("network_settings.not_valid_value"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
} else {
NetworkSettings::node_restart_required_ui(ui);
}
@ -507,14 +507,14 @@ impl PoolSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.save"), Colors::WHITE, on_save);
View::button(ui, t!("modal.save"), Colors::white_or_black(false), on_save);
});
});
ui.add_space(6.0);

View file

@ -97,7 +97,7 @@ impl StratumSetup {
self.current_modal_ui(ui, frame, cb);
View::sub_title(ui, format!("{} {}", HARD_DRIVES, t!("network_mining.server")));
View::horizontal_line(ui, Colors::STROKE);
View::horizontal_line(ui, Colors::stroke());
ui.add_space(6.0);
ui.vertical_centered(|ui| {
@ -112,14 +112,14 @@ impl StratumSetup {
} else if Node::get_stratum_stats().is_running {
ui.add_space(6.0);
let disable_text = format!("{} {}", POWER, t!("network_settings.disable"));
View::button(ui, disable_text, Colors::GOLD, || {
View::action_button(ui, disable_text, || {
Node::stop_stratum();
});
ui.add_space(6.0);
} else {
ui.add_space(6.0);
let enable_text = format!("{} {}", POWER, t!("network_settings.enable"));
View::button(ui, enable_text, Colors::GOLD, || {
View::action_button(ui, enable_text, || {
Node::start_stratum();
});
ui.add_space(6.0);
@ -137,13 +137,13 @@ impl StratumSetup {
ui.add_space(2.0);
ui.label(RichText::new(t!("network_mining.restart_server_required"))
.size(16.0)
.color(Colors::INACTIVE_TEXT)
.color(Colors::inactive_text())
);
}
ui.add_space(8.0);
});
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
// Show message when IP addresses are not available on the system.
@ -155,7 +155,7 @@ impl StratumSetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("network_settings.stratum_ip"))
.size(16.0)
.color(Colors::GRAY)
.color(Colors::gray())
);
ui.add_space(6.0);
// Show stratum IP addresses to select.
@ -168,13 +168,13 @@ impl StratumSetup {
// Show stratum port setup.
self.port_setup_ui(ui, cb);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
// Show attempt time setup.
self.attempt_time_ui(ui, cb);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
// Show minimum acceptable share difficulty setup.
@ -186,12 +186,12 @@ impl StratumSetup {
fn port_setup_ui(&mut self, ui: &mut egui::Ui, cb: &dyn PlatformCallbacks) {
ui.label(RichText::new(t!("network_settings.stratum_port"))
.size(16.0)
.color(Colors::GRAY)
.color(Colors::gray())
);
ui.add_space(6.0);
let (_, port) = NodeConfig::get_stratum_address();
View::button(ui, format!("{} {}", PLUG, port.clone()), Colors::BUTTON, || {
View::button(ui, format!("{} {}", PLUG, port.clone()), Colors::button(), || {
// Setup values for modal.
self.stratum_port_edit = port;
self.stratum_port_available_edit = self.is_port_available;
@ -209,7 +209,7 @@ impl StratumSetup {
ui.add_space(6.0);
ui.label(RichText::new(t!("network_settings.port_unavailable"))
.size(16.0)
.color(Colors::RED));
.color(Colors::red()));
ui.add_space(12.0);
}
}
@ -220,7 +220,7 @@ impl StratumSetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("network_settings.stratum_port"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw stratum port text edit.
@ -232,7 +232,7 @@ impl StratumSetup {
ui.add_space(12.0);
ui.label(RichText::new(t!("network_settings.port_unavailable"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
} else {
server_restart_required_ui(ui);
}
@ -266,14 +266,14 @@ impl StratumSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.save"), Colors::WHITE, on_save);
View::button(ui, t!("modal.save"), Colors::white_or_black(false), on_save);
});
});
ui.add_space(6.0);
@ -285,12 +285,12 @@ impl StratumSetup {
fn attempt_time_ui(&mut self, ui: &mut egui::Ui, cb: &dyn PlatformCallbacks) {
ui.label(RichText::new(t!("network_settings.attempt_time"))
.size(16.0)
.color(Colors::GRAY)
.color(Colors::gray())
);
ui.add_space(6.0);
let time = NodeConfig::get_stratum_attempt_time();
View::button(ui, format!("{} {}", TIMER, time.clone()), Colors::BUTTON, || {
View::button(ui, format!("{} {}", TIMER, time.clone()), Colors::button(), || {
// Setup values for modal.
self.attempt_time_edit = time;
@ -304,7 +304,7 @@ impl StratumSetup {
ui.add_space(6.0);
ui.label(RichText::new(t!("network_settings.attempt_time_desc"))
.size(16.0)
.color(Colors::INACTIVE_TEXT)
.color(Colors::inactive_text())
);
ui.add_space(6.0);
}
@ -315,7 +315,7 @@ impl StratumSetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("network_settings.attempt_time"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw attempt time text edit.
@ -327,7 +327,7 @@ impl StratumSetup {
ui.add_space(12.0);
ui.label(RichText::new(t!("network_settings.not_valid_value"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
} else {
server_restart_required_ui(ui);
}
@ -350,14 +350,14 @@ impl StratumSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.save"), Colors::WHITE, on_save);
View::button(ui, t!("modal.save"), Colors::white_or_black(false), on_save);
});
});
ui.add_space(6.0);
@ -368,12 +368,12 @@ impl StratumSetup {
fn min_diff_ui(&mut self, ui: &mut egui::Ui, cb: &dyn PlatformCallbacks) {
ui.label(RichText::new(t!("network_settings.min_share_diff"))
.size(16.0)
.color(Colors::GRAY)
.color(Colors::gray())
);
ui.add_space(6.0);
let diff = NodeConfig::get_stratum_min_share_diff();
View::button(ui, format!("{} {}", BARBELL, diff.clone()), Colors::BUTTON, || {
View::button(ui, format!("{} {}", BARBELL, diff.clone()), Colors::button(), || {
// Setup values for modal.
self.min_share_diff_edit = diff;
@ -393,7 +393,7 @@ impl StratumSetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("network_settings.min_share_diff"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw share difficulty text edit.
@ -405,7 +405,7 @@ impl StratumSetup {
ui.add_space(12.0);
ui.label(RichText::new(t!("network_settings.not_valid_value"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
} else {
server_restart_required_ui(ui);
}
@ -428,14 +428,14 @@ impl StratumSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.save"), Colors::WHITE, on_save);
View::button(ui, t!("modal.save"), Colors::white_or_black(false), on_save);
});
});
ui.add_space(6.0);
@ -449,7 +449,7 @@ pub fn server_restart_required_ui(ui: &mut egui::Ui) {
ui.add_space(12.0);
ui.label(RichText::new(t!("network_mining.restart_server_required"))
.size(16.0)
.color(Colors::GREEN)
.color(Colors::green())
);
}
}

View file

@ -131,8 +131,8 @@ impl QrCodeContent {
};
if !sharing {
// Show button to share QR.
let share_text = format!("{} {}", IMAGES_SQUARE, t!("share"));
View::button(ui, share_text, Colors::GOLD, || {
let share_txt = format!("{} {}", IMAGES_SQUARE, t!("share"));
View::action_button(ui, share_txt, || {
{
let mut w_state = self.qr_image_state.write();
w_state.exporting = true;
@ -211,13 +211,13 @@ impl QrCodeContent {
ui.add_space(6.0);
// Show QR code text.
View::ellipsize_text(ui, text.clone(), 16.0, Colors::INACTIVE_TEXT);
View::ellipsize_text(ui, text.clone(), 16.0, Colors::inactive_text());
ui.add_space(6.0);
// Show button to share QR.
ui.vertical_centered(|ui| {
let share_text = format!("{} {}", IMAGES_SQUARE, t!("share"));
View::button(ui, share_text, Colors::GOLD, || {
View::action_button(ui, share_text, || {
if let Ok(qr) = QrCode::encode_text(text.as_str(), qrcodegen::QrCodeEcc::Low) {
if let Some(data) = Self::qr_to_image_data(qr, DEFAULT_QR_SIZE as usize) {
let mut png = vec![];

View file

@ -110,7 +110,7 @@ impl Root {
.resizable(false)
.exact_width(panel_width)
.frame(egui::Frame {
fill: Colors::WHITE,
fill: Colors::white_or_black(false),
..Default::default()
})
.show_animated_inside(ui, is_panel_open, |ui| {
@ -126,7 +126,7 @@ impl Root {
// Show wallets content.
egui::CentralPanel::default()
.frame(egui::Frame {
fill: Colors::FILL_DARK,
fill: Colors::fill_deep(),
..Default::default()
})
.show_inside(ui, |ui| {
@ -208,7 +208,7 @@ impl Root {
ui.add_space(12.0);
ui.label(RichText::new(t!("sync_status.shutdown"))
.size(17.0)
.color(Colors::TEXT));
.color(Colors::text(false)));
});
ui.add_space(10.0);
} else {
@ -216,38 +216,35 @@ impl Root {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("modal_exit.description"))
.size(17.0)
.color(Colors::TEXT));
.color(Colors::text(false)));
});
ui.add_space(10.0);
// Show modal buttons.
ui.scope(|ui| {
// Setup spacing between buttons.
ui.spacing_mut().item_spacing = egui::Vec2::new(6.0, 0.0);
// Setup spacing between buttons.
ui.spacing_mut().item_spacing = egui::Vec2::new(6.0, 0.0);
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button_ui(ui, t!("modal_exit.exit"), Colors::WHITE, |ui| {
if !Node::is_running() {
self.exit_allowed = true;
ui.ctx().send_viewport_cmd(egui::ViewportCommand::Close);
modal.close();
} else {
Node::stop(true);
modal.disable_closing();
Modal::set_title(t!("modal_exit.exit"));
self.show_exit_progress = true;
}
});
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button_ui(ui, t!("modal_exit.exit"), Colors::white_or_black(false), |ui| {
if !Node::is_running() {
self.exit_allowed = true;
ui.ctx().send_viewport_cmd(egui::ViewportCommand::Close);
modal.close();
} else {
Node::stop(true);
modal.disable_closing();
Modal::set_title(t!("modal_exit.exit"));
self.show_exit_progress = true;
}
});
});
ui.add_space(6.0);
});
ui.add_space(6.0);
}
}
@ -268,16 +265,23 @@ impl Root {
NodeSetup::chain_type_ui(ui);
ui.add_space(8.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(8.0);
// Draw theme selection.
Self::theme_selection_ui(ui);
ui.add_space(8.0);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
ui.vertical_centered(|ui| {
ui.label(RichText::new(format!("{}:", t!("language")))
.size(16.0)
.color(Colors::GRAY)
.color(Colors::gray())
);
});
ui.add_space(6.0);
ui.add_space(8.0);
// Draw available list of languages to select.
let locales = rust_i18n::available_locales!();
@ -289,13 +293,39 @@ impl Root {
// Show button to close modal.
ui.vertical_centered_justified(|ui| {
View::button(ui, t!("close"), Colors::WHITE, || {
View::button(ui, t!("close"), Colors::white_or_black(false), || {
modal.close();
});
});
ui.add_space(6.0);
}
/// Draw theme selection content.
fn theme_selection_ui(ui: &mut egui::Ui) {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("theme")).size(16.0).color(Colors::gray()));
});
let saved_use_dark = AppConfig::dark_theme().unwrap_or(false);
let mut selected_use_dark = saved_use_dark;
ui.add_space(8.0);
ui.columns(2, |columns| {
columns[0].vertical_centered(|ui| {
View::radio_value(ui, &mut selected_use_dark, false, t!("light"));
});
columns[1].vertical_centered(|ui| {
View::radio_value(ui, &mut selected_use_dark, true, t!("dark"));
})
});
ui.add_space(8.0);
if saved_use_dark != selected_use_dark {
AppConfig::set_dark_theme(selected_use_dark);
crate::setup_visuals(ui.ctx());
}
}
/// Draw language selection item content.
fn language_item_ui(locale: &str, ui: &mut egui::Ui, index: usize, len: usize, modal: &Modal) {
// Setup layout size.
@ -305,7 +335,7 @@ impl Root {
// Draw round background.
let bg_rect = rect.clone();
let item_rounding = View::item_rounding(index, len, false);
ui.painter().rect(bg_rect, item_rounding, Colors::FILL, View::ITEM_STROKE);
ui.painter().rect(bg_rect, item_rounding, Colors::fill(), View::item_stroke());
ui.vertical(|ui| {
ui.allocate_ui_with_layout(rect.size(), Layout::right_to_left(Align::Center), |ui| {
@ -323,7 +353,7 @@ impl Root {
});
} else {
ui.add_space(14.0);
ui.label(RichText::new(CHECK_FAT).size(20.0).color(Colors::GREEN));
ui.label(RichText::new(CHECK_FAT).size(20.0).color(Colors::green()));
ui.add_space(14.0);
}
@ -333,9 +363,14 @@ impl Root {
ui.vertical(|ui| {
// Draw language name.
ui.add_space(12.0);
let color = if is_current {
Colors::title(false)
} else {
Colors::gray()
};
ui.label(RichText::new(t!("lang_name", locale = locale))
.size(17.0)
.color(Colors::TEXT));
.color(color));
ui.add_space(3.0);
});
});
@ -349,11 +384,11 @@ impl Root {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("network.android_warning"))
.size(15.0)
.color(Colors::TEXT));
.color(Colors::text(false)));
});
ui.add_space(8.0);
ui.vertical_centered_justified(|ui| {
View::button(ui, t!("continue"), Colors::WHITE, || {
View::button(ui, t!("continue"), Colors::white_or_black(false), || {
AppConfig::show_android_integrated_node_warning();
modal.close();
});

View file

@ -59,7 +59,7 @@ impl TitlePanel {
.exact_height(Self::DEFAULT_HEIGHT)
.frame(egui::Frame {
inner_margin: Self::inner_margin(ui),
fill: Colors::YELLOW,
fill: Colors::yellow(),
..Default::default()
})
.show_inside(ui, |ui| {
@ -118,7 +118,7 @@ impl TitlePanel {
strip.cell(|ui| {
ui.add_space(2.0);
ui.centered_and_justified(|ui| {
View::ellipsize_text(ui, text, 19.0, Colors::TITLE);
View::ellipsize_text(ui, text, 19.0, Colors::title(true));
});
});
}
@ -149,12 +149,12 @@ impl TitlePanel {
strip.cell(|ui| {
ui.add_space(4.0);
ui.centered_and_justified(|ui| {
View::ellipsize_text(ui, title, 18.0, Colors::TITLE);
View::ellipsize_text(ui, title, 18.0, Colors::title(true));
});
});
strip.cell(|ui| {
ui.centered_and_justified(|ui| {
View::animate_text(ui, subtitle, 15.0, Colors::TEXT, animate_sub);
View::animate_text(ui, subtitle, 15.0, Colors::text(true), animate_sub);
});
});
});

View file

@ -33,12 +33,20 @@ use crate::gui::views::types::TextEditOptions;
pub struct View;
impl View {
/// Default stroke around views.
pub const DEFAULT_STROKE: Stroke = Stroke { width: 1.0, color: Colors::STROKE };
/// Stroke for items.
pub const ITEM_STROKE: Stroke = Stroke { width: 1.0, color: Colors::ITEM_STROKE };
/// Stroke for hovered items and buttons.
pub const HOVER_STROKE: Stroke = Stroke { width: 1.0, color: Colors::ITEM_HOVER };
/// Get default stroke around views.
pub fn default_stroke() -> Stroke {
Stroke { width: 1.0, color: Colors::stroke() }
}
/// Get default stroke around item buttons.
pub fn item_stroke() -> Stroke {
Stroke { width: 1.0, color: Colors::item_stroke() }
}
/// Get stroke for hovered items and buttons.
pub fn hover_stroke() -> Stroke {
Stroke { width: 1.0, color: Colors::item_hover() }
}
/// Draw content with maximum width value.
pub fn max_width_ui(ui: &mut egui::Ui,
@ -149,7 +157,7 @@ impl View {
/// Draw horizontally centered sub-title with space below.
pub fn sub_title(ui: &mut egui::Ui, text: String) {
ui.vertical_centered_justified(|ui| {
ui.label(RichText::new(text.to_uppercase()).size(16.0).color(Colors::TEXT));
ui.label(RichText::new(text.to_uppercase()).size(16.0).color(Colors::text(false)));
});
ui.add_space(4.0);
}
@ -170,20 +178,15 @@ impl View {
/// Title button with transparent background fill color, contains only icon.
pub fn title_button(ui: &mut egui::Ui, icon: &str, action: impl FnOnce()) {
ui.scope(|ui| {
// Disable stroke when inactive.
// Disable strokes.
ui.style_mut().visuals.widgets.inactive.bg_stroke = Stroke::NONE;
// Setup stroke around title buttons on click.
ui.style_mut().visuals.widgets.hovered.bg_stroke = Self::HOVER_STROKE;
ui.style_mut().visuals.widgets.active.bg_stroke = Self::DEFAULT_STROKE;
// Disable rounding.
ui.style_mut().visuals.widgets.hovered.rounding = Rounding::default();
ui.style_mut().visuals.widgets.hovered.bg_stroke = Stroke::NONE;
ui.style_mut().visuals.widgets.active.bg_stroke = Stroke::NONE;
ui.style_mut().visuals.widgets.active.rounding = Rounding::default();
// Disable expansion.
ui.style_mut().visuals.widgets.hovered.expansion = 0.0;
ui.style_mut().visuals.widgets.active.expansion = 0.0;
// Setup text.
let wt = RichText::new(icon.to_string()).size(22.0).color(Colors::TITLE);
let wt = RichText::new(icon.to_string()).size(22.0).color(Colors::title(true));
// Draw button.
let br = Button::new(wt)
.fill(Colors::TRANSPARENT)
@ -200,8 +203,8 @@ impl View {
pub fn tab_button(ui: &mut egui::Ui, icon: &str, active: bool, action: impl FnOnce()) {
ui.scope(|ui| {
let text_color = match active {
true => Colors::TITLE,
false => Colors::TEXT
true => Colors::title(false),
false => Colors::text(false)
};
let mut button = Button::new(RichText::new(icon).size(22.0).color(text_color));
@ -211,15 +214,15 @@ impl View {
ui.style_mut().visuals.widgets.hovered.expansion = 0.0;
ui.style_mut().visuals.widgets.active.expansion = 0.0;
// Setup fill colors.
ui.visuals_mut().widgets.inactive.weak_bg_fill = Colors::WHITE;
ui.visuals_mut().widgets.hovered.weak_bg_fill = Colors::BUTTON;
ui.visuals_mut().widgets.active.weak_bg_fill = Colors::FILL;
ui.visuals_mut().widgets.inactive.weak_bg_fill = Colors::white_or_black(false);
ui.visuals_mut().widgets.hovered.weak_bg_fill = Colors::button();
ui.visuals_mut().widgets.active.weak_bg_fill = Colors::fill();
// Setup stroke colors.
ui.visuals_mut().widgets.inactive.bg_stroke = Self::DEFAULT_STROKE;
ui.visuals_mut().widgets.hovered.bg_stroke = Self::HOVER_STROKE;
ui.visuals_mut().widgets.active.bg_stroke = Self::ITEM_STROKE;
ui.visuals_mut().widgets.inactive.bg_stroke = Self::default_stroke();
ui.visuals_mut().widgets.hovered.bg_stroke = Self::hover_stroke();
ui.visuals_mut().widgets.active.bg_stroke = Self::item_stroke();
} else {
button = button.fill(Colors::FILL).stroke(Stroke::NONE);
button = button.fill(Colors::fill()).stroke(Stroke::NONE);
}
let br = button.ui(ui).on_hover_cursor(CursorIcon::PointingHand);
@ -234,7 +237,7 @@ impl View {
fn button_resp(ui: &mut egui::Ui, text: String, text_color: Color32, bg: Color32) -> Response {
let button_text = Self::ellipsize(text.to_uppercase(), 17.0, text_color);
Button::new(button_text)
.stroke(Self::DEFAULT_STROKE)
.stroke(Self::default_stroke())
.fill(bg)
.ui(ui)
.on_hover_cursor(CursorIcon::PointingHand)
@ -242,7 +245,7 @@ impl View {
/// Draw [`Button`] with specified background fill color and default text color.
pub fn button(ui: &mut egui::Ui, text: String, fill: Color32, action: impl FnOnce()) {
let br = Self::button_resp(ui, text, Colors::TEXT_BUTTON, fill);
let br = Self::button_resp(ui, text, Colors::text_button(), fill);
if Self::touched(ui, br) {
(action)();
}
@ -260,14 +263,20 @@ impl View {
}
}
/// Draw gold action [`Button`].
pub fn action_button(ui: &mut egui::Ui,
text: String, action: impl FnOnce()) {
Self::colored_text_button(ui, text, Colors::title(true), Colors::gold(), action);
}
/// Draw [`Button`] with specified background fill color and ui at callback.
pub fn button_ui(ui: &mut egui::Ui,
text: String,
fill: Color32,
action: impl FnOnce(&mut egui::Ui)) {
let button_text = Self::ellipsize(text.to_uppercase(), 17.0, Colors::TEXT_BUTTON);
let button_text = Self::ellipsize(text.to_uppercase(), 17.0, Colors::text_button());
let br = Button::new(button_text)
.stroke(Self::DEFAULT_STROKE)
.stroke(Self::default_stroke())
.fill(fill)
.ui(ui)
.on_hover_cursor(CursorIcon::PointingHand);
@ -294,16 +303,16 @@ impl View {
ui.style_mut().visuals.widgets.hovered.expansion = 0.0;
ui.style_mut().visuals.widgets.active.expansion = 0.0;
// Setup fill colors.
ui.visuals_mut().widgets.inactive.weak_bg_fill = Colors::WHITE;
ui.visuals_mut().widgets.hovered.weak_bg_fill = Colors::BUTTON;
ui.visuals_mut().widgets.active.weak_bg_fill = Colors::FILL;
ui.visuals_mut().widgets.inactive.weak_bg_fill = Colors::white_or_black(false);
ui.visuals_mut().widgets.hovered.weak_bg_fill = Colors::button();
ui.visuals_mut().widgets.active.weak_bg_fill = Colors::fill();
// Setup stroke colors.
ui.visuals_mut().widgets.inactive.bg_stroke = Self::DEFAULT_STROKE;
ui.visuals_mut().widgets.hovered.bg_stroke = Self::HOVER_STROKE;
ui.visuals_mut().widgets.active.bg_stroke = Self::ITEM_STROKE;
ui.visuals_mut().widgets.inactive.bg_stroke = Self::default_stroke();
ui.visuals_mut().widgets.hovered.bg_stroke = Self::hover_stroke();
ui.visuals_mut().widgets.active.bg_stroke = Self::item_stroke();
// Setup button text color.
let text_color = if let Some(c) = color { c } else { Colors::ITEM_BUTTON };
let text_color = if let Some(c) = color { c } else { Colors::item_button() };
// Show button.
let br = Button::new(RichText::new(text).size(20.0).color(text_color))
@ -340,7 +349,7 @@ impl View {
// Draw button to show/hide current password.
let eye_icon = if show_pass { EYE } else { EYE_SLASH };
let mut changed = false;
View::button(ui, eye_icon.to_string(), Colors::WHITE, || {
View::button(ui, eye_icon.to_string(), Colors::white_or_black(false), || {
show_pass = !show_pass;
changed = true;
});
@ -356,7 +365,7 @@ impl View {
// Setup copy button.
if options.copy {
let copy_icon = COPY.to_string();
View::button(ui, copy_icon, Colors::WHITE, || {
View::button(ui, copy_icon, Colors::white_or_black(false), || {
cb.copy_string_to_buffer(value.clone());
});
ui.add_space(8.0);
@ -365,7 +374,7 @@ impl View {
// Setup paste button.
if options.paste {
let paste_icon = CLIPBOARD_TEXT.to_string();
View::button(ui, paste_icon, Colors::WHITE, || {
View::button(ui, paste_icon, Colors::white_or_black(false), || {
*value = cb.get_string_from_buffer();
});
ui.add_space(8.0);
@ -374,7 +383,7 @@ impl View {
// Setup scan QR code button.
if options.scan_qr {
let scan_icon = SCAN.to_string();
View::button(ui, scan_icon, Colors::WHITE, || {
View::button(ui, scan_icon, Colors::white_or_black(false), || {
cb.start_camera();
options.scan_pressed = true;
});
@ -500,7 +509,7 @@ impl View {
se: if r[3] { 8.0 } else { 0.0 },
},
fill: Colors::TRANSPARENT,
stroke: Self::ITEM_STROKE,
stroke: Self::item_stroke(),
fill_texture_id: Default::default(),
uv: Rect::ZERO
};
@ -518,7 +527,7 @@ impl View {
// Draw box value.
let mut job = LayoutJob::single_section(value, TextFormat {
font_id: FontId::proportional(17.0),
color: Colors::BLACK,
color: Colors::white_or_black(true),
..Default::default()
});
job.wrap = TextWrapping {
@ -530,7 +539,7 @@ impl View {
ui.label(job);
// Draw box label.
ui.label(RichText::new(label).color(Colors::GRAY).size(15.0));
ui.label(RichText::new(label).color(Colors::gray()).size(15.0));
});
ui.add_space(2.0);
@ -560,19 +569,19 @@ impl View {
/// Draw big gold loading spinner.
pub fn big_loading_spinner(ui: &mut egui::Ui) {
Spinner::new().size(Self::BIG_SPINNER_SIZE).color(Colors::GOLD).ui(ui);
Spinner::new().size(Self::BIG_SPINNER_SIZE).color(Colors::gold()).ui(ui);
}
/// Draw small gold loading spinner.
pub fn small_loading_spinner(ui: &mut egui::Ui) {
Spinner::new().size(38.0).color(Colors::GOLD).ui(ui);
Spinner::new().size(38.0).color(Colors::gold()).ui(ui);
}
/// Draw the button that looks like checkbox with callback on check.
pub fn checkbox(ui: &mut egui::Ui, checked: bool, text: String, callback: impl FnOnce()) {
let (text_value, color) = match checked {
true => (format!("{} {}", CHECK_SQUARE, text), Colors::TEXT_BUTTON),
false => (format!("{} {}", SQUARE, text), Colors::CHECKBOX)
true => (format!("{} {}", CHECK_SQUARE, text), Colors::text_button()),
false => (format!("{} {}", SQUARE, text), Colors::checkbox())
};
let br = Button::new(RichText::new(text_value).size(17.0).color(color))
@ -591,7 +600,7 @@ impl View {
pub fn radio_value<T: PartialEq>(ui: &mut egui::Ui, current: &mut T, value: T, text: String) {
ui.scope(|ui| {
// Setup background color.
ui.visuals_mut().widgets.inactive.bg_fill = Colors::FILL_DARK;
ui.visuals_mut().widgets.inactive.bg_fill = Colors::fill_deep();
// Draw radio button.
let mut response = ui.radio(*current == value, text)
.on_hover_cursor(CursorIcon::PointingHand);

View file

@ -115,12 +115,12 @@ impl WalletsContent {
.frame(egui::Frame {
fill: if empty_list && !create_wallet
|| (dual_panel && show_wallet && !self.show_wallets_at_dual_panel) {
Colors::FILL_DARK
Colors::fill_deep()
} else {
if create_wallet {
Colors::WHITE
Colors::white_or_black(true)
} else {
Colors::BUTTON
Colors::button()
}
},
..Default::default()
@ -175,8 +175,8 @@ impl WalletsContent {
// Show wallets bottom panel.
egui::TopBottomPanel::bottom("wallets_bottom_panel")
.frame(egui::Frame {
stroke: View::ITEM_STROKE,
fill: Colors::FILL,
stroke: View::item_stroke(),
fill: Colors::fill(),
inner_margin: Margin {
left: View::get_left_inset() + 4.0,
right: View::far_right_inset_margin(ui) + 4.0,
@ -202,8 +202,8 @@ impl WalletsContent {
// Show wallet list panel.
egui::CentralPanel::default()
.frame(egui::Frame {
stroke: View::DEFAULT_STROKE,
fill: Colors::FILL_DARK,
stroke: View::default_stroke(),
fill: Colors::fill_deep(),
inner_margin: Margin {
left: if list_hidden {
0.0
@ -337,11 +337,6 @@ impl WalletsContent {
dual_panel: bool,
cb: &dyn PlatformCallbacks) {
ui.scope(|ui| {
// Setup scroll bar color.
ui.style_mut().visuals.widgets.inactive.bg_fill = Colors::ITEM_HOVER;
ui.style_mut().visuals.widgets.hovered.bg_fill = Colors::STROKE;
// Draw list of wallets.
ScrollArea::vertical()
.id_source("wallet_list")
.scroll_bar_visibility(ScrollBarVisibility::AlwaysHidden)
@ -389,11 +384,15 @@ impl WalletsContent {
rect.set_height(78.0);
let rounding = View::item_rounding(0, 1, false);
let bg = if current {
egui::Color32::from_gray(234)
if AppConfig::dark_theme().unwrap_or(false) {
egui::Color32::from_gray(32)
} else {
egui::Color32::from_gray(233)
}
} else {
Colors::FILL
Colors::fill()
};
ui.painter().rect(rect, rounding, bg, View::HOVER_STROKE);
ui.painter().rect(rect, rounding, bg, View::hover_stroke());
ui.allocate_ui_with_layout(rect.size(), Layout::right_to_left(Align::Center), |ui| {
// Setup padding for item buttons.
@ -434,7 +433,11 @@ impl WalletsContent {
ui.vertical(|ui| {
ui.add_space(3.0);
// Setup wallet name text.
let name_color = if is_selected { Colors::BLACK } else { Colors::TITLE };
let name_color = if is_selected {
Colors::white_or_black(true)
} else {
Colors::title(false)
};
View::ellipsize_text(ui, config.name, 18.0, name_color);
// Setup wallet connection text.
@ -443,7 +446,7 @@ impl WalletsContent {
} else {
format!("{} {}", COMPUTER_TOWER, t!("network.node"))
};
View::ellipsize_text(ui, conn_text, 15.0, Colors::TEXT);
View::ellipsize_text(ui, conn_text, 15.0, Colors::text(false));
ui.add_space(1.0);
// Setup wallet status text.
@ -490,7 +493,7 @@ impl WalletsContent {
} else {
format!("{} {}", FOLDER_LOCK, t!("wallets.locked"))
};
ui.label(RichText::new(status_text).size(15.0).color(Colors::GRAY));
ui.label(RichText::new(status_text).size(15.0).color(Colors::gray()));
ui.add_space(4.0);
})
});
@ -519,7 +522,7 @@ impl WalletsContent {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("wallets.pass"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Show password input.
@ -532,12 +535,12 @@ impl WalletsContent {
ui.add_space(10.0);
ui.label(RichText::new(t!("wallets.pass_empty"))
.size(17.0)
.color(Colors::INACTIVE_TEXT));
.color(Colors::inactive_text()));
} else if self.wrong_pass {
ui.add_space(10.0);
ui.label(RichText::new(t!("wallets.wrong_pass"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
}
ui.add_space(12.0);
});
@ -549,7 +552,7 @@ impl WalletsContent {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
@ -581,7 +584,7 @@ impl WalletsContent {
(on_continue)();
});
View::button(ui, t!("continue"), Colors::WHITE, on_continue);
View::button(ui, t!("continue"), Colors::white_or_black(false), on_continue);
});
});
ui.add_space(6.0);

View file

@ -12,11 +12,11 @@
// See the License for the specific language governing permissions and
// limitations under the License.
use egui::{Id, Margin, RichText, ScrollArea, vec2};
use egui::{Id, Margin, RichText, ScrollArea, vec2, Widget};
use egui::scroll_area::ScrollBarVisibility;
use grin_util::ZeroingString;
use crate::built_info;
use crate::{AppConfig, built_info};
use crate::gui::Colors;
use crate::gui::icons::{CHECK, CLIPBOARD_TEXT, COPY, FOLDER_PLUS, SCAN, SHARE_FAT};
use crate::gui::platform::PlatformCallbacks;
@ -74,8 +74,8 @@ impl WalletCreation {
if self.step.is_some() {
egui::TopBottomPanel::bottom("wallet_creation_step_panel")
.frame(egui::Frame {
stroke: View::DEFAULT_STROKE,
fill: Colors::FILL,
fill: Colors::fill(),
stroke: View::default_stroke(),
inner_margin: Margin {
left: View::far_left_inset_margin(ui) + 8.0,
right: View::get_right_inset() + 8.0,
@ -99,7 +99,8 @@ impl WalletCreation {
// Show wallet creation step content panel.
egui::CentralPanel::default()
.frame(egui::Frame {
stroke: View::DEFAULT_STROKE,
fill: Colors::fill(),
stroke: View::default_stroke(),
inner_margin: Margin {
left: View::far_left_inset_margin(ui) + 4.0,
right: View::get_right_inset() + 4.0,
@ -168,14 +169,14 @@ impl WalletCreation {
};
// Show step description.
ui.add_space(2.0);
ui.label(RichText::new(step_text).size(16.0).color(Colors::GRAY));
ui.label(RichText::new(step_text).size(16.0).color(Colors::gray()));
ui.add_space(2.0);
// Show error if entered phrase is not valid.
if !self.mnemonic_setup.valid_phrase {
step_available = false;
ui.label(RichText::new(t!("wallets.not_valid_phrase"))
.size(16.0)
.color(Colors::RED));
.color(Colors::red()));
ui.add_space(2.0);
}
if step == Step::EnterMnemonic {
@ -197,7 +198,7 @@ impl WalletCreation {
} else {
// Show QR code scan button.
let scan_text = format!("{} {}", SCAN, t!("scan").to_uppercase());
View::button(ui, scan_text, Colors::WHITE, || {
View::button(ui, scan_text, Colors::white_or_black(false), || {
self.mnemonic_setup.show_qr_scan_modal(cb);
});
}
@ -221,14 +222,14 @@ impl WalletCreation {
PhraseMode::Generate => {
// Show copy button.
let c_t = format!("{} {}", COPY, t!("copy").to_uppercase());
View::button(ui, c_t.to_uppercase(), Colors::WHITE, || {
View::button(ui, c_t.to_uppercase(), Colors::white_or_black(false), || {
cb.copy_string_to_buffer(self.mnemonic_setup.mnemonic.get_phrase());
});
}
PhraseMode::Import => {
// Show paste button.
let p_t = format!("{} {}", CLIPBOARD_TEXT, t!("paste").to_uppercase());
View::button(ui, p_t, Colors::WHITE, || {
View::button(ui, p_t, Colors::white_or_black(false), || {
let data = ZeroingString::from(cb.get_string_from_buffer().trim());
self.mnemonic_setup.mnemonic.import_text(&data);
});
@ -242,15 +243,15 @@ impl WalletCreation {
step: Step,
on_create: impl FnOnce(Wallet)) {
// Setup button text.
let (next_text, color) = if step == Step::SetupConnection {
(format!("{} {}", CHECK, t!("complete")), Colors::GOLD)
let (next_text, text_color, bg_color) = if step == Step::SetupConnection {
(format!("{} {}", CHECK, t!("complete")), Colors::title(true), Colors::gold())
} else {
let text = format!("{} {}", SHARE_FAT, t!("continue"));
(text, Colors::WHITE)
(text, Colors::text_button(), Colors::white_or_black(false))
};
// Show next step button.
View::button(ui, next_text.to_uppercase(), color, || {
View::colored_text_button(ui, next_text.to_uppercase(), text_color, bg_color, || {
self.step = if let Some(step) = &self.step {
match step {
Step::EnterMnemonic => {
@ -310,28 +311,31 @@ impl WalletCreation {
None => {
// Show wallet creation message if step is empty.
View::center_content(ui, 350.0 + View::get_bottom_inset(), |ui| {
ui.add(
egui::Image::new(egui::include_image!("../../../../../img/logo.png"))
.fit_to_exact_size(vec2(180.0, 180.0))
);
let logo = if AppConfig::dark_theme().unwrap_or(false) {
egui::include_image!("../../../../../img/logo_light.png")
} else {
egui::include_image!("../../../../../img/logo.png")
};
// Show app logo.
egui::Image::new(logo).fit_to_exact_size(vec2(180.0, 180.0)).ui(ui);
ui.add_space(-15.0);
ui.label(RichText::new("GRIM")
.size(24.0)
.color(Colors::BLACK)
.color(Colors::white_or_black(true))
);
ui.label(RichText::new(built_info::PKG_VERSION)
.size(16.0)
.color(Colors::BLACK)
.color(Colors::white_or_black(true))
);
ui.add_space(4.0);
let text = t!("wallets.create_desc");
ui.label(RichText::new(text)
.size(16.0)
.color(Colors::GRAY)
.color(Colors::gray())
);
ui.add_space(8.0);
let add_text = format!("{} {}", FOLDER_PLUS, t!("wallets.add"));
View::button(ui, add_text, Colors::WHITE, || {
View::button(ui, add_text, Colors::white_or_black(false), || {
self.show_name_pass_modal(cb);
});
});
@ -399,7 +403,7 @@ impl WalletCreation {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("wallets.name"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Show wallet name text edit.
@ -414,7 +418,7 @@ impl WalletCreation {
ui.label(RichText::new(t!("wallets.pass"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw wallet password text edit.
@ -432,7 +436,7 @@ impl WalletCreation {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
@ -454,7 +458,7 @@ impl WalletCreation {
(on_next)();
});
View::button(ui, t!("continue"), Colors::WHITE, on_next);
View::button(ui, t!("continue"), Colors::white_or_black(false), on_next);
});
});
ui.add_space(6.0);

View file

@ -100,7 +100,7 @@ impl MnemonicSetup {
self.mode_type_ui(ui);
ui.add_space(12.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
// Show words setup.
@ -118,7 +118,7 @@ impl MnemonicSetup {
ui.add_space(4.0);
ui.vertical_centered(|ui| {
let text = format!("{}:", t!("wallets.recovery_phrase"));
ui.label(RichText::new(text).size(16.0).color(Colors::GRAY));
ui.label(RichText::new(text).size(16.0).color(Colors::gray()));
});
ui.add_space(4.0);
self.word_list_ui(ui, true, cb);
@ -148,7 +148,7 @@ impl MnemonicSetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("wallets.words_count"))
.size(16.0)
.color(Colors::GRAY)
.color(Colors::gray())
);
});
ui.add_space(6.0);
@ -240,7 +240,7 @@ impl MnemonicSetup {
cb: &dyn PlatformCallbacks) {
if edit {
ui.add_space(6.0);
View::button(ui, PENCIL.to_string(), Colors::BUTTON, || {
View::button(ui, PENCIL.to_string(), Colors::button(), || {
// Setup modal values.
self.word_num_edit = num;
self.word_edit = word.clone();
@ -254,11 +254,11 @@ impl MnemonicSetup {
});
ui.label(RichText::new(format!("#{} {}", num, word))
.size(17.0)
.color(Colors::BLACK));
.color(Colors::white_or_black(true)));
} else {
ui.add_space(12.0);
let text = format!("#{} {}", num, word);
ui.label(RichText::new(text).size(17.0).color(Colors::BLACK));
ui.label(RichText::new(text).size(17.0).color(Colors::white_or_black(true)));
}
}
@ -273,7 +273,7 @@ impl MnemonicSetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("wallets.enter_word", "number" => self.word_num_edit))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw word value text edit.
@ -287,7 +287,7 @@ impl MnemonicSetup {
ui.add_space(12.0);
ui.label(RichText::new(t!("wallets.not_valid_word"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
}
ui.add_space(12.0);
});
@ -299,7 +299,7 @@ impl MnemonicSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
@ -346,7 +346,7 @@ impl MnemonicSetup {
(save)();
});
// Show save button.
View::button(ui, t!("continue"), Colors::WHITE, save);
View::button(ui, t!("continue"), Colors::white_or_black(false), save);
});
});
ui.add_space(6.0);
@ -376,7 +376,7 @@ impl MnemonicSetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("wallets.rec_phrase_not_found"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
});
ui.add_space(6.0);
} else if let Some(result) = self.camera_content.qr_scan_result() {
@ -408,13 +408,13 @@ impl MnemonicSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("close"), Colors::WHITE, || {
View::button(ui, t!("close"), Colors::white_or_black(false), || {
self.scan_phrase_not_found = None;
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("repeat"), Colors::WHITE, || {
View::button(ui, t!("repeat"), Colors::white_or_black(false), || {
Modal::set_title(t!("scan_qr"));
self.scan_phrase_not_found = None;
cb.start_camera();
@ -423,7 +423,7 @@ impl MnemonicSetup {
});
} else {
ui.vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
cb.stop_camera();
modal.close();
});

View file

@ -72,14 +72,18 @@ impl CommonSetup {
let wallet_name = wallet.get_config().name;
// Show wallet name.
ui.add_space(2.0);
ui.label(RichText::new(t!("wallets.name")).size(16.0).color(Colors::GRAY));
ui.label(RichText::new(t!("wallets.name"))
.size(16.0)
.color(Colors::gray()));
ui.add_space(2.0);
ui.label(RichText::new(wallet_name.clone()).size(16.0).color(Colors::BLACK));
ui.label(RichText::new(wallet_name.clone())
.size(16.0)
.color(Colors::white_or_black(true)));
ui.add_space(8.0);
// Show wallet name setup.
let name_text = format!("{} {}", PENCIL, t!("change"));
View::button(ui, name_text, Colors::BUTTON, || {
View::button(ui, name_text, Colors::button(), || {
self.name_edit = wallet_name;
// Show wallet name modal.
Modal::new(NAME_EDIT_MODAL)
@ -90,14 +94,14 @@ impl CommonSetup {
});
ui.add_space(12.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
ui.label(RichText::new(t!("wallets.pass")).size(16.0).color(Colors::GRAY));
ui.label(RichText::new(t!("wallets.pass")).size(16.0).color(Colors::gray()));
ui.add_space(6.0);
// Show wallet password setup.
let pass_text = format!("{} {}", PASSWORD, t!("change"));
View::button(ui, pass_text, Colors::BUTTON, || {
View::button(ui, pass_text, Colors::button(), || {
// Setup modal values.
self.first_edit_pass_opening = true;
self.old_pass_edit = "".to_string();
@ -112,15 +116,15 @@ impl CommonSetup {
});
ui.add_space(12.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
ui.label(RichText::new(t!("wallets.min_tx_conf_count")).size(16.0).color(Colors::GRAY));
ui.label(RichText::new(t!("wallets.min_tx_conf_count")).size(16.0).color(Colors::gray()));
ui.add_space(6.0);
// Show minimum amount of confirmations value setup.
let min_confirmations = wallet.get_config().min_confirmations;
let min_conf_text = format!("{} {}", CLOCK_COUNTDOWN, min_confirmations);
View::button(ui, min_conf_text, Colors::BUTTON, || {
View::button(ui, min_conf_text, Colors::button(), || {
self.min_confirmations_edit = min_confirmations.to_string();
// Show minimum amount of confirmations value modal.
Modal::new(MIN_CONFIRMATIONS_EDIT_MODAL)
@ -131,7 +135,7 @@ impl CommonSetup {
});
ui.add_space(12.0);
View::horizontal_line(ui, Colors::STROKE);
View::horizontal_line(ui, Colors::stroke());
ui.add_space(4.0);
});
}
@ -176,7 +180,7 @@ impl CommonSetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("wallets.name"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Show wallet name text edit.
@ -193,7 +197,7 @@ impl CommonSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
@ -213,7 +217,7 @@ impl CommonSetup {
(on_save)();
});
View::button(ui, t!("modal.save"), Colors::WHITE, on_save);
View::button(ui, t!("modal.save"), Colors::white_or_black(false), on_save);
});
});
ui.add_space(6.0);
@ -232,7 +236,7 @@ impl CommonSetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("wallets.current_pass"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw old password text edit.
@ -247,7 +251,7 @@ impl CommonSetup {
ui.label(RichText::new(t!("wallets.new_pass"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw new password text edit.
@ -262,12 +266,12 @@ impl CommonSetup {
ui.add_space(10.0);
ui.label(RichText::new(t!("wallets.pass_empty"))
.size(17.0)
.color(Colors::INACTIVE_TEXT));
.color(Colors::inactive_text()));
} else if self.wrong_pass {
ui.add_space(10.0);
ui.label(RichText::new(t!("wallets.wrong_pass"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
}
ui.add_space(12.0);
});
@ -279,7 +283,7 @@ impl CommonSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
@ -311,7 +315,7 @@ impl CommonSetup {
(on_continue)();
});
View::button(ui, t!("change"), Colors::WHITE, on_continue);
View::button(ui, t!("change"), Colors::white_or_black(false), on_continue);
});
});
ui.add_space(6.0);
@ -328,7 +332,7 @@ impl CommonSetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("wallets.min_tx_conf_count"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Minimum amount of confirmations text edit.
@ -340,7 +344,7 @@ impl CommonSetup {
ui.add_space(12.0);
ui.label(RichText::new(t!("network_settings.not_valid_value"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
}
ui.add_space(12.0);
});
@ -352,7 +356,7 @@ impl CommonSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
@ -372,7 +376,7 @@ impl CommonSetup {
(on_save)();
});
View::button(ui, t!("modal.save"), Colors::WHITE, on_save);
View::button(ui, t!("modal.save"), Colors::white_or_black(false), on_save);
});
});
ui.add_space(6.0);

View file

@ -143,7 +143,7 @@ impl ConnectionSetup {
ui.add_space(2.0);
View::sub_title(ui, format!("{} {}", GLOBE, t!("wallets.conn_method")));
View::horizontal_line(ui, Colors::STROKE);
View::horizontal_line(ui, Colors::stroke());
ui.add_space(6.0);
ui.vertical_centered(|ui| {
@ -153,12 +153,12 @@ impl ConnectionSetup {
// Show external connections.
ui.add_space(8.0);
ui.label(RichText::new(t!("wallets.ext_conn")).size(16.0).color(Colors::GRAY));
ui.label(RichText::new(t!("wallets.ext_conn")).size(16.0).color(Colors::gray()));
ui.add_space(6.0);
// Show button to add new external node connection.
let add_node_text = format!("{} {}", PLUS_CIRCLE, t!("wallets.add_node"));
View::button(ui, add_node_text, Colors::WHITE, || {
View::button(ui, add_node_text, Colors::white_or_black(false), || {
self.show_add_ext_conn_modal(cb);
});
ui.add_space(4.0);
@ -196,7 +196,7 @@ impl ConnectionSetup {
let mut rect = ui.available_rect_before_wrap();
rect.set_height(78.0);
let rounding = View::item_rounding(0, 1, false);
ui.painter().rect(rect, rounding, Colors::FILL, View::ITEM_STROKE);
ui.painter().rect(rect, rounding, Colors::fill(), View::item_stroke());
ui.allocate_ui_with_layout(rect.size(), Layout::right_to_left(Align::Center), |ui| {
// Setup padding for item buttons.
@ -210,13 +210,13 @@ impl ConnectionSetup {
});
} else {
ui.add_space(14.0);
ui.label(RichText::new(CHECK_FAT).size(20.0).color(Colors::GREEN));
ui.label(RichText::new(CHECK_FAT).size(20.0).color(Colors::green()));
ui.add_space(14.0);
}
if !Node::is_running() {
// Draw button to start integrated node.
View::item_button(ui, Rounding::default(), POWER, Some(Colors::GREEN), || {
View::item_button(ui, Rounding::default(), POWER, Some(Colors::green()), || {
Node::start();
});
}
@ -228,12 +228,12 @@ impl ConnectionSetup {
ui.add_space(3.0);
ui.label(RichText::new(t!("network.node"))
.size(18.0)
.color(Colors::TITLE));
.color(Colors::title(false)));
// Setup node API address text.
let api_address = NodeConfig::get_api_address();
let address_text = format!("{} http://{}", COMPUTER_TOWER, api_address);
ui.label(RichText::new(address_text).size(15.0).color(Colors::TEXT));
ui.label(RichText::new(address_text).size(15.0).color(Colors::text(false)));
ui.add_space(1.0);
// Setup node status text.
@ -245,7 +245,7 @@ impl ConnectionSetup {
DOTS_THREE_CIRCLE
};
let status_text = format!("{} {}", status_icon, Node::get_sync_status_text());
ui.label(RichText::new(status_text).size(15.0).color(Colors::GRAY));
ui.label(RichText::new(status_text).size(15.0).color(Colors::gray()));
})
});
});
@ -265,7 +265,7 @@ impl ConnectionSetup {
// Draw round background.
let bg_rect = rect.clone();
let item_rounding = View::item_rounding(index, len, false);
ui.painter().rect(bg_rect, item_rounding, Colors::FILL, View::ITEM_STROKE);
ui.painter().rect(bg_rect, item_rounding, Colors::fill(), View::item_stroke());
ui.vertical(|ui| {
ui.allocate_ui_with_layout(rect.size(), Layout::right_to_left(Align::Center), |ui| {
@ -286,7 +286,7 @@ impl ConnectionSetup {
});
} else {
ui.add_space(12.0);
ui.label(RichText::new(CHECK_FAT).size(20.0).color(Colors::GREEN));
ui.label(RichText::new(CHECK_FAT).size(20.0).color(Colors::green()));
}
let layout_size = ui.available_size();
@ -296,7 +296,7 @@ impl ConnectionSetup {
// Draw connections URL.
ui.add_space(4.0);
let conn_text = format!("{} {}", GLOBE_SIMPLE, conn.url);
View::ellipsize_text(ui, conn_text, 15.0, Colors::TITLE);
View::ellipsize_text(ui, conn_text, 15.0, Colors::title(false));
ui.add_space(1.0);
// Setup connection status text.
let status_text = if let Some(available) = conn.available {
@ -308,7 +308,7 @@ impl ConnectionSetup {
} else {
format!("{} {}", DOTS_THREE_CIRCLE, t!("network.availability_check"))
};
ui.label(RichText::new(status_text).size(15.0).color(Colors::GRAY));
ui.label(RichText::new(status_text).size(15.0).color(Colors::gray()));
ui.add_space(3.0);
});
});
@ -340,7 +340,7 @@ impl ConnectionSetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("wallets.node_url"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw node URL text edit.
@ -355,7 +355,7 @@ impl ConnectionSetup {
ui.label(RichText::new(t!("wallets.node_secret"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw node API secret text edit.
@ -368,7 +368,7 @@ impl ConnectionSetup {
ui.add_space(10.0);
ui.label(RichText::new(t!("wallets.invalid_url"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
}
ui.add_space(10.0);
});
@ -380,7 +380,7 @@ impl ConnectionSetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
@ -418,7 +418,7 @@ impl ConnectionSetup {
(on_add)();
});
View::button(ui, t!("modal.add"), Colors::WHITE, on_add);
View::button(ui, t!("modal.add"), Colors::white_or_black(false), on_add);
});
});
ui.add_space(6.0);

View file

@ -60,10 +60,10 @@ impl RecoverySetup {
self.modal_content_ui(ui, wallet, cb);
ui.add_space(10.0);
View::horizontal_line(ui, Colors::STROKE);
View::horizontal_line(ui, Colors::stroke());
ui.add_space(6.0);
View::sub_title(ui, format!("{} {}", WRENCH, t!("wallets.recovery")));
View::horizontal_line(ui, Colors::STROKE);
View::horizontal_line(ui, Colors::stroke());
ui.add_space(4.0);
ui.vertical_centered(|ui| {
@ -73,60 +73,60 @@ impl RecoverySetup {
ui.add_space(6.0);
ui.label(RichText::new(t!("wallets.repair_unavailable"))
.size(16.0)
.color(Colors::RED));
.color(Colors::red()));
} else if !wallet.is_repairing() {
ui.add_space(6.0);
// Draw button to repair the wallet.
let repair_text = format!("{} {}", STETHOSCOPE, t!("wallets.repair_wallet"));
View::button(ui, repair_text, Colors::GOLD, || {
View::action_button(ui, repair_text, || {
wallet.repair();
});
ui.add_space(6.0);
ui.label(RichText::new(t!("wallets.repair_desc"))
.size(16.0)
.color(Colors::INACTIVE_TEXT));
.color(Colors::inactive_text()));
}
ui.add_space(6.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
// Draw button to restore the wallet.
let recover_text = format!("{} {}", LIFEBUOY, t!("wallets.recover"));
ui.add_space(4.0);
View::colored_text_button(ui, recover_text, Colors::GREEN, Colors::BUTTON, || {
View::colored_text_button(ui, recover_text, Colors::green(), Colors::button(), || {
wallet.delete_db(true);
});
ui.add_space(6.0);
ui.label(RichText::new(t!("wallets.restore_wallet_desc"))
.size(16.0)
.color(Colors::INACTIVE_TEXT));
.color(Colors::inactive_text()));
ui.add_space(6.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
let recovery_text = format!("{}:", t!("wallets.recovery_phrase"));
ui.label(RichText::new(recovery_text).size(16.0).color(Colors::GRAY));
ui.label(RichText::new(recovery_text).size(16.0).color(Colors::gray()));
ui.add_space(6.0);
// Draw button to show recovery phrase.
let show_text = format!("{} {}", EYE, t!("show"));
View::button(ui, show_text, Colors::BUTTON, || {
View::button(ui, show_text, Colors::button(), || {
self.show_recovery_phrase_modal(cb);
});
ui.add_space(12.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
ui.label(RichText::new(t!("wallets.delete_desc")).size(16.0).color(Colors::RED));
ui.label(RichText::new(t!("wallets.delete_desc")).size(16.0).color(Colors::red()));
ui.add_space(6.0);
// Draw button to delete the wallet.
let delete_text = format!("{} {}", TRASH, t!("wallets.delete"));
View::colored_text_button(ui, delete_text, Colors::RED, Colors::BUTTON, || {
View::colored_text_button(ui, delete_text, Colors::red(), Colors::button(), || {
Modal::new(DELETE_CONFIRMATION_MODAL)
.position(ModalPosition::Center)
.title(t!("modal.confirmation"))
@ -186,11 +186,11 @@ impl RecoverySetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(self.recovery_phrase.clone().unwrap().to_string())
.size(17.0)
.color(Colors::BLACK));
.color(Colors::white_or_black(true)));
});
ui.add_space(10.0);
ui.vertical_centered_justified(|ui| {
View::button(ui, t!("close"), Colors::WHITE, || {
View::button(ui, t!("close"), Colors::white_or_black(false), || {
self.recovery_phrase = None;
modal.close();
});
@ -199,7 +199,7 @@ impl RecoverySetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("wallets.pass"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw current wallet password text edit.
@ -212,12 +212,12 @@ impl RecoverySetup {
ui.add_space(12.0);
ui.label(RichText::new(t!("wallets.pass_empty"))
.size(17.0)
.color(Colors::INACTIVE_TEXT));
.color(Colors::inactive_text()));
} else if self.wrong_pass {
ui.add_space(12.0);
ui.label(RichText::new(t!("wallets.wrong_pass"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
}
});
ui.add_space(12.0);
@ -229,13 +229,13 @@ impl RecoverySetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
self.recovery_phrase = None;
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, "OK".to_owned(), Colors::WHITE, || {
View::button(ui, "OK".to_owned(), Colors::white_or_black(false), || {
match wallet.get_recovery(self.pass_edit.clone()) {
Ok(phrase) => {
self.wrong_pass = false;
@ -263,7 +263,7 @@ impl RecoverySetup {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("wallets.delete_conf"))
.size(17.0)
.color(Colors::TEXT));
.color(Colors::text(false)));
});
ui.add_space(12.0);
@ -274,12 +274,12 @@ impl RecoverySetup {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("delete"), Colors::WHITE, || {
View::button(ui, t!("delete"), Colors::white_or_black(false), || {
wallet.delete_wallet();
modal.close();
});

View file

@ -90,8 +90,8 @@ impl WalletContent {
&& !wallet.sync_error() && !wallet.is_repairing();
egui::TopBottomPanel::top(Id::from("wallet_balance").with(wallet.identifier()))
.frame(egui::Frame {
fill: Colors::FILL,
stroke: View::DEFAULT_STROKE,
fill: Colors::fill(),
stroke: View::default_stroke(),
inner_margin: Margin {
left: View::far_left_inset_margin(ui) + 4.0,
right: View::get_right_inset() + 4.0,
@ -118,8 +118,8 @@ impl WalletContent {
// Show wallet tabs panel.
egui::TopBottomPanel::bottom("wallet_tabs")
.frame(egui::Frame {
stroke: View::ITEM_STROKE,
fill: Colors::FILL,
stroke: View::item_stroke(),
fill: Colors::fill(),
inner_margin: Margin {
left: View::far_left_inset_margin(ui) + 4.0,
right: View::get_right_inset() + 4.0,
@ -140,8 +140,8 @@ impl WalletContent {
// Show tab content panel.
egui::CentralPanel::default()
.frame(egui::Frame {
fill: Colors::WHITE,
stroke: View::DEFAULT_STROKE,
fill: Colors::white_or_black(false),
stroke: View::default_stroke(),
..Default::default()
})
.show_inside(ui, |ui| {
@ -191,7 +191,7 @@ impl WalletContent {
rect.set_height(75.0);
// Draw round background.
let rounding = View::item_rounding(0, 2, false);
ui.painter().rect(rect, rounding, Colors::BUTTON, View::HOVER_STROKE);
ui.painter().rect(rect, rounding, Colors::button(), View::hover_stroke());
ui.allocate_ui_with_layout(rect.size(), Layout::right_to_left(Align::Center), |ui| {
// Draw button to scan QR code.
@ -228,7 +228,9 @@ impl WalletContent {
// Show spendable amount.
let amount = amount_to_hr_string(data.info.amount_currently_spendable, true);
let amount_text = format!("{} {}", amount, GRIN);
ui.label(RichText::new(amount_text).size(18.0).color(Colors::BLACK));
ui.label(RichText::new(amount_text)
.size(18.0)
.color(Colors::white_or_black(true)));
ui.add_space(-2.0);
// Show account label.
@ -240,11 +242,11 @@ impl WalletContent {
account.to_owned()
};
let acc_text = format!("{} {}", FOLDER_USER, acc_label);
View::ellipsize_text(ui, acc_text, 15.0, Colors::TEXT);
View::ellipsize_text(ui, acc_text, 15.0, Colors::text(false));
// Show confirmed height.
let height_text = format!("{} {}", PACKAGE, data.info.last_confirmed_height);
View::animate_text(ui, height_text, 15.0, Colors::GRAY, wallet.syncing());
View::animate_text(ui, height_text, 15.0, Colors::gray(), wallet.syncing());
})
});
});
@ -261,7 +263,7 @@ impl WalletContent {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("wallets.new_account_desc"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
ui.add_space(8.0);
// Draw account name edit.
@ -274,7 +276,7 @@ impl WalletContent {
ui.add_space(12.0);
ui.label(RichText::new(t!("error"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
}
ui.add_space(12.0);
});
@ -285,7 +287,7 @@ impl WalletContent {
// Show modal buttons.
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
// Close modal.
cb.hide_keyboard();
modal.close();
@ -311,7 +313,7 @@ impl WalletContent {
(on_create)();
});
View::button(ui, t!("create"), Colors::WHITE, on_create);
View::button(ui, t!("create"), Colors::white_or_black(false), on_create);
});
});
ui.add_space(6.0);
@ -340,7 +342,7 @@ impl WalletContent {
});
ui.add_space(2.0);
View::horizontal_line(ui, Colors::STROKE);
View::horizontal_line(ui, Colors::stroke());
ui.add_space(6.0);
// Setup spacing between buttons.
@ -349,12 +351,12 @@ impl WalletContent {
// Show modal buttons.
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("create"), Colors::WHITE, || {
View::button(ui, t!("create"), Colors::white_or_black(false), || {
self.account_creating = true;
cb.show_keyboard();
});
@ -373,7 +375,7 @@ impl WalletContent {
// Show scan result if exists or show camera content while scanning.
if let Some(result) = &self.qr_scan_result {
let mut result_text = result.text();
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(3.0);
ScrollArea::vertical()
.id_source(Id::from("qr_scan_result_input").with(wallet.get_config().id))
@ -391,20 +393,20 @@ impl WalletContent {
ui.add_space(6.0);
});
ui.add_space(2.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
// Show copy button.
ui.vertical_centered(|ui| {
let copy_text = format!("{} {}", COPY, t!("copy"));
View::button(ui, copy_text, Colors::BUTTON, || {
View::button(ui, copy_text, Colors::button(), || {
cb.copy_string_to_buffer(result_text.to_string());
self.qr_scan_result = None;
modal.close();
});
});
ui.add_space(6.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
} else if let Some(result) = self.camera_content.qr_scan_result() {
cb.stop_camera();
@ -448,13 +450,13 @@ impl WalletContent {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("close"), Colors::WHITE, || {
View::button(ui, t!("close"), Colors::white_or_black(false), || {
self.qr_scan_result = None;
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("repeat"), Colors::WHITE, || {
View::button(ui, t!("repeat"), Colors::white_or_black(false), || {
Modal::set_title(t!("scan_qr"));
self.qr_scan_result = None;
cb.start_camera();
@ -463,7 +465,7 @@ impl WalletContent {
});
} else {
ui.vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
cb.stop_camera();
modal.close();
});
@ -524,7 +526,7 @@ impl WalletContent {
View::center_content(ui, 108.0, |ui| {
View::max_width_ui(ui, Root::SIDE_PANEL_WIDTH * 1.5, |ui| {
let text = t!("wallets.enable_node", "settings" => GEAR_FINE);
ui.label(RichText::new(text).size(16.0).color(Colors::INACTIVE_TEXT));
ui.label(RichText::new(text).size(16.0).color(Colors::inactive_text()));
ui.add_space(8.0);
// Show button to enable integrated node at non-dual root panel mode
// or when network connections are not showing and node is not stopping
@ -532,7 +534,7 @@ impl WalletContent {
if (!dual_panel_root || AppConfig::show_connections_network_panel())
&& !Node::is_stopping() {
let enable_text = format!("{} {}", POWER, t!("network.enable_node"));
View::button(ui, enable_text, Colors::GOLD, || {
View::action_button(ui, enable_text, || {
Node::start();
});
}
@ -561,10 +563,10 @@ impl WalletContent {
fn sync_error_ui(ui: &mut egui::Ui, wallet: &Wallet) {
View::center_content(ui, 108.0, |ui| {
let text = t!("wallets.wallet_loading_err", "settings" => GEAR_FINE);
ui.label(RichText::new(text).size(16.0).color(Colors::INACTIVE_TEXT));
ui.label(RichText::new(text).size(16.0).color(Colors::inactive_text()));
ui.add_space(8.0);
let retry_text = format!("{} {}", ARROWS_CLOCKWISE, t!("retry"));
View::button(ui, retry_text, Colors::GOLD, || {
View::action_button(ui, retry_text, || {
wallet.set_sync_error(false);
});
});
@ -620,7 +622,7 @@ impl WalletContent {
}
}
};
ui.label(RichText::new(text).size(16.0).color(Colors::INACTIVE_TEXT));
ui.label(RichText::new(text).size(16.0).color(Colors::inactive_text()));
});
});
}
@ -642,7 +644,7 @@ fn account_item_ui(ui: &mut egui::Ui,
// Draw round background.
let bg_rect = rect.clone();
let item_rounding = View::item_rounding(index, size, false);
ui.painter().rect(bg_rect, item_rounding, Colors::FILL, View::ITEM_STROKE);
ui.painter().rect(bg_rect, item_rounding, Colors::fill(), View::item_stroke());
ui.vertical(|ui| {
ui.allocate_ui_with_layout(rect.size(), Layout::right_to_left(Align::Center), |ui| {
@ -656,7 +658,7 @@ fn account_item_ui(ui: &mut egui::Ui,
});
} else {
ui.add_space(12.0);
ui.label(RichText::new(CHECK_FAT).size(20.0).color(Colors::GREEN));
ui.label(RichText::new(CHECK_FAT).size(20.0).color(Colors::green()));
}
let layout_size = ui.available_size();
@ -667,7 +669,7 @@ fn account_item_ui(ui: &mut egui::Ui,
// Show spendable amount.
let amount = amount_to_hr_string(acc.spendable_amount, true);
let amount_text = format!("{} {}", amount, GRIN);
ui.label(RichText::new(amount_text).size(18.0).color(Colors::BLACK));
ui.label(RichText::new(amount_text).size(18.0).color(Colors::white_or_black(true)));
ui.add_space(-2.0);
// Show account name.
@ -678,11 +680,11 @@ fn account_item_ui(ui: &mut egui::Ui,
acc.label.to_owned()
};
let acc_name = format!("{} {}", FOLDER_USER, acc_label);
View::ellipsize_text(ui, acc_name, 15.0, Colors::TEXT);
View::ellipsize_text(ui, acc_name, 15.0, Colors::text(false));
// Show account BIP32 derivation path.
let acc_path = format!("{} {}", PATH, acc.path);
ui.label(RichText::new(acc_path).size(15.0).color(Colors::GRAY));
ui.label(RichText::new(acc_path).size(15.0).color(Colors::gray()));
ui.add_space(3.0);
});
});

View file

@ -127,11 +127,10 @@ impl WalletTab for WalletMessages {
// Show modal content for this ui container.
self.modal_content_ui(ui, wallet, cb);
// Show manual wallet content panel.
egui::CentralPanel::default()
.frame(egui::Frame {
stroke: View::ITEM_STROKE,
fill: Colors::WHITE,
stroke: View::item_stroke(),
fill: Colors::white_or_black(false),
inner_margin: Margin {
left: View::far_left_inset_margin(ui) + 4.0,
right: View::get_right_inset() + 4.0,
@ -194,7 +193,7 @@ impl WalletMessages {
self.request_ui(ui, wallet, cb);
ui.add_space(12.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
// Show Slatepack message input field.
@ -240,7 +239,7 @@ impl WalletMessages {
cb: &dyn PlatformCallbacks) {
ui.label(RichText::new(t!("wallets.create_request_desc"))
.size(16.0)
.color(Colors::INACTIVE_TEXT));
.color(Colors::inactive_text()));
ui.add_space(7.0);
// Show send button only if balance is not empty.
@ -253,7 +252,7 @@ impl WalletMessages {
columns[0].vertical_centered_justified(|ui| {
// Draw sending request creation button.
let send_text = format!("{} {}", UPLOAD_SIMPLE, t!("wallets.send"));
View::colored_text_button(ui, send_text, Colors::RED, Colors::BUTTON, || {
View::colored_text_button(ui, send_text, Colors::red(), Colors::button(), || {
self.show_request_modal(false, cb);
});
});
@ -271,7 +270,7 @@ impl WalletMessages {
/// Draw invoice request creation button.
fn receive_button_ui(&mut self, ui: &mut egui::Ui, cb: &dyn PlatformCallbacks) {
let receive_text = format!("{} {}", DOWNLOAD_SIMPLE, t!("wallets.receive"));
View::colored_text_button(ui, receive_text, Colors::GREEN, Colors::BUTTON, || {
View::colored_text_button(ui, receive_text, Colors::green(), Colors::button(), || {
self.show_request_modal(true, cb);
});
}
@ -358,7 +357,7 @@ impl WalletMessages {
};
ui.label(RichText::new(enter_text)
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
});
ui.add_space(8.0);
@ -412,7 +411,7 @@ impl WalletMessages {
ui.vertical_centered(|ui| {
ui.label(RichText::new(self.request_error.clone().unwrap().text())
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
});
}
@ -423,7 +422,7 @@ impl WalletMessages {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
self.request_amount_edit = "".to_string();
self.request_error = None;
cb.hide_keyboard();
@ -432,7 +431,7 @@ impl WalletMessages {
});
columns[1].vertical_centered_justified(|ui| {
// Button to create Slatepack message request.
View::button(ui, t!("continue"), Colors::WHITE, || {
View::button(ui, t!("continue"), Colors::white_or_black(false), || {
if self.request_amount_edit.is_empty() {
return;
}
@ -472,7 +471,7 @@ impl WalletMessages {
} else {
t!("wallets.send_request_desc","amount" => amount_format)
};
ui.label(RichText::new(desc_text).size(16.0).color(Colors::GRAY));
ui.label(RichText::new(desc_text).size(16.0).color(Colors::gray()));
});
ui.add_space(6.0);
@ -488,7 +487,7 @@ impl WalletMessages {
// Show button to close modal.
ui.vertical_centered_justified(|ui| {
View::button(ui, t!("close"), Colors::WHITE, || {
View::button(ui, t!("close"), Colors::white_or_black(false), || {
self.request_qr_content.clear_state();
self.request_qr = false;
modal.close();
@ -498,7 +497,7 @@ impl WalletMessages {
return;
}
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(3.0);
// Draw request Slatepack message text.
@ -526,7 +525,7 @@ impl WalletMessages {
ui.add_space(6.0);
});
ui.add_space(2.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(10.0);
@ -538,14 +537,14 @@ impl WalletMessages {
columns[0].vertical_centered_justified(|ui| {
// Draw button to show request as QR code.
let qr_text = format!("{} {}", QR_CODE, t!("qr_code"));
View::button(ui, qr_text, Colors::BUTTON, || {
View::button(ui, qr_text, Colors::button(), || {
self.request_qr = true;
});
});
columns[1].vertical_centered_justified(|ui| {
// Draw button to copy request to clipboard.
let copy_text = format!("{} {}", COPY, t!("copy"));
View::button(ui, copy_text, Colors::BUTTON, || {
View::button(ui, copy_text, Colors::button(), || {
cb.copy_string_to_buffer(self.request_edit.clone());
self.request_amount_edit = "".to_string();
self.request_edit = "".to_string();
@ -560,7 +559,7 @@ impl WalletMessages {
columns[0].vertical_centered_justified(|ui| {
// Draw button to cancel transaction.
let cancel = t!("modal.cancel");
View::colored_text_button(ui, cancel, Colors::RED, Colors::BUTTON, || {
View::colored_text_button(ui, cancel, Colors::red(), Colors::button(), || {
if let Ok(slate) = wallet.parse_slatepack(&self.request_edit) {
if let Some(tx) = wallet.tx_by_slate(&slate) {
wallet.cancel(tx.data.id);
@ -574,7 +573,7 @@ impl WalletMessages {
});
columns[1].vertical_centered_justified(|ui| {
// Draw button to close modal.
View::button(ui, t!("close"), Colors::WHITE, || {
View::button(ui, t!("close"), Colors::white_or_black(false), || {
self.request_amount_edit = "".to_string();
self.request_edit = "".to_string();
modal.close();
@ -595,7 +594,7 @@ impl WalletMessages {
let empty_fields = self.message_edit.is_empty() && self.request_edit.is_empty();
let response_empty = self.response_edit.is_empty();
if let Some(err) = &self.message_error {
ui.label(RichText::new(err.text()).size(16.0).color(Colors::RED));
ui.label(RichText::new(err.text()).size(16.0).color(Colors::red()));
} else {
let desc_text = if self.message_slate.is_none() || empty_fields {
t!("wallets.input_slatepack_desc")
@ -626,7 +625,7 @@ impl WalletMessages {
}
}
};
ui.label(RichText::new(desc_text).size(16.0).color(Colors::INACTIVE_TEXT));
ui.label(RichText::new(desc_text).size(16.0).color(Colors::inactive_text()));
}
ui.add_space(6.0);
@ -640,7 +639,7 @@ impl WalletMessages {
// Save message to check for changes.
let message_before = message.clone();
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(3.0);
let scroll_id = Id::from(
if response_empty {
@ -676,7 +675,7 @@ impl WalletMessages {
ui.add_space(6.0);
});
ui.add_space(2.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(10.0);
// Parse Slatepack message if input field was changed, resetting message error.
@ -697,7 +696,7 @@ impl WalletMessages {
if self.response_edit.is_empty() {
// Draw button to clear message input.
let clear_text = format!("{} {}", BROOM, t!("clear"));
View::button(ui, clear_text, Colors::BUTTON, || {
View::button(ui, clear_text, Colors::button(), || {
self.message_edit.clear();
self.response_edit.clear();
self.message_error = None;
@ -706,7 +705,7 @@ impl WalletMessages {
} else {
// Draw button to show Slatepack message as QR code.
let qr_text = format!("{} {}", QR_CODE, t!("qr_code"));
View::button(ui, qr_text, Colors::BUTTON, || {
View::button(ui, qr_text, Colors::button(), || {
let text = self.response_edit.clone();
self.message_edit.clear();
self.response_edit.clear();
@ -721,7 +720,7 @@ impl WalletMessages {
} else {
// Draw button to scan Slatepack message QR code.
let scan_text = format!("{} {}", SCAN, t!("scan"));
View::button(ui, scan_text, Colors::BUTTON, || {
View::button(ui, scan_text, Colors::button(), || {
self.message_edit.clear();
self.message_error = None;
self.show_qr_message_scan_modal(cb);
@ -738,7 +737,7 @@ impl WalletMessages {
if !self.response_edit.is_empty() {
// Draw button to copy response to clipboard.
let copy_text = format!("{} {}", COPY, t!("copy"));
View::button(ui, copy_text, Colors::BUTTON, || {
View::button(ui, copy_text, Colors::button(), || {
cb.copy_string_to_buffer(self.response_edit.clone());
self.message_edit.clear();
self.response_edit.clear();
@ -747,7 +746,7 @@ impl WalletMessages {
} else {
show_dandelion = true;
// Draw button to finalize or repost transaction.
View::button(ui, t!("wallets.finalize"), Colors::GOLD, || {
View::action_button(ui, t!("wallets.finalize"), || {
let slate = self.message_slate.clone().unwrap();
self.message_slate = None;
let dandelion = self.dandelion;
@ -779,7 +778,7 @@ impl WalletMessages {
} else {
// Draw button to paste text from clipboard.
let paste = format!("{} {}", CLIPBOARD_TEXT, t!("paste"));
View::button(ui, paste, Colors::BUTTON, || {
View::button(ui, paste, Colors::button(), || {
let buf = cb.get_string_from_buffer();
let previous = self.message_edit.clone();
self.message_edit = buf.clone().trim().to_string();
@ -800,7 +799,7 @@ impl WalletMessages {
if self.message_slate.is_none() && !self.message_edit.is_empty() {
// Draw button to clear message input.
let clear_text = format!("{} {}", BROOM, t!("clear"));
View::button(ui, clear_text, Colors::BUTTON, || {
View::button(ui, clear_text, Colors::button(), || {
self.message_edit.clear();
self.response_edit.clear();
self.message_error = None;
@ -809,7 +808,7 @@ impl WalletMessages {
} else if !self.response_edit.is_empty() && self.message_slate.is_some() {
// Draw cancel button.
let cancel = format!("{} {}", PROHIBIT, t!("modal.cancel"));
View::colored_text_button(ui, cancel, Colors::RED, Colors::BUTTON, || {
View::colored_text_button(ui, cancel, Colors::red(), Colors::button(), || {
let slate = self.message_slate.clone().unwrap();
if let Some(tx) = wallet.tx_by_slate(&slate) {
wallet.cancel(tx.data.id);
@ -861,7 +860,7 @@ impl WalletMessages {
} else {
t!("wallets.parse_i1_slatepack_desc","amount" => amount)
};
ui.label(RichText::new(title).size(16.0).color(Colors::INACTIVE_TEXT));
ui.label(RichText::new(title).size(16.0).color(Colors::inactive_text()));
});
ui.add_space(6.0);
@ -871,7 +870,7 @@ impl WalletMessages {
ui.add_space(6.0);
ui.vertical_centered_justified(|ui| {
View::button(ui, t!("close"), Colors::WHITE, || {
View::button(ui, t!("close"), Colors::white_or_black(false), || {
self.qr_message_text = None;
self.qr_message_content.clear_state();
self.response_edit.clear();
@ -906,7 +905,7 @@ impl WalletMessages {
let err_text = format!("{}", t!("wallets.parse_slatepack_err")).replace(":", ".");
ui.label(RichText::new(err_text)
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
});
ui.add_space(12.0);
@ -915,13 +914,13 @@ impl WalletMessages {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("close"), Colors::WHITE, || {
View::button(ui, t!("close"), Colors::white_or_black(false), || {
self.message_scan_error = false;
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("repeat"), Colors::WHITE, || {
View::button(ui, t!("repeat"), Colors::white_or_black(false), || {
Modal::set_title(t!("scan_qr"));
self.message_scan_error = false;
cb.start_camera();
@ -950,7 +949,7 @@ impl WalletMessages {
}
ui.vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
cb.stop_camera();
modal.close();
});

View file

@ -64,8 +64,8 @@ impl WalletTab for WalletSettings {
// Show settings content panel.
egui::CentralPanel::default()
.frame(egui::Frame {
stroke: View::DEFAULT_STROKE,
fill: Colors::WHITE,
stroke: View::default_stroke(),
fill: Colors::white_or_black(false),
inner_margin: Margin {
left: View::far_left_inset_margin(ui) + 4.0,
right: View::get_right_inset() + 4.0,

View file

@ -90,8 +90,8 @@ impl WalletTab for WalletTransport {
// Show transport content panel.
egui::CentralPanel::default()
.frame(egui::Frame {
stroke: View::ITEM_STROKE,
fill: Colors::WHITE,
stroke: View::item_stroke(),
fill: Colors::white_or_black(false),
inner_margin: Margin {
left: View::far_left_inset_margin(ui) + 4.0,
right: View::get_right_inset() + 4.0,
@ -159,7 +159,7 @@ impl WalletTransport {
ui.add_space(3.0);
ui.label(RichText::new(t!("transport.desc"))
.size(16.0)
.color(Colors::INACTIVE_TEXT));
.color(Colors::inactive_text()));
ui.add_space(7.0);
// Draw Tor content.
@ -223,7 +223,7 @@ impl WalletTransport {
// Draw round background.
let bg_rect = rect.clone();
let item_rounding = View::item_rounding(0, 2, false);
ui.painter().rect(bg_rect, item_rounding, Colors::BUTTON, View::ITEM_STROKE);
ui.painter().rect(bg_rect, item_rounding, Colors::button(), View::item_stroke());
ui.vertical(|ui| {
ui.allocate_ui_with_layout(rect.size(), Layout::right_to_left(Align::Center), |ui| {
@ -237,14 +237,14 @@ impl WalletTransport {
let service_id = &wallet.identifier();
if !Tor::is_service_starting(service_id) && wallet.foreign_api_port().is_some() {
if !Tor::is_service_running(service_id) {
View::item_button(ui, Rounding::default(), POWER, Some(Colors::GREEN), || {
View::item_button(ui, Rounding::default(), POWER, Some(Colors::green()), || {
if let Ok(key) = wallet.secret_key() {
let api_port = wallet.foreign_api_port().unwrap();
Tor::start_service(api_port, key, service_id);
}
});
} else {
View::item_button(ui, Rounding::default(), POWER, Some(Colors::RED), || {
View::item_button(ui, Rounding::default(), POWER, Some(Colors::red()), || {
Tor::stop_service(service_id);
});
}
@ -257,7 +257,7 @@ impl WalletTransport {
ui.add_space(3.0);
ui.label(RichText::new(t!("transport.tor_network"))
.size(18.0)
.color(Colors::TITLE));
.color(Colors::title(false)));
// Setup bridges status text.
let bridge = TorConfig::get_bridge();
@ -272,7 +272,7 @@ impl WalletTransport {
t!("transport.bridge_name", "b" = name))
}
};
ui.label(RichText::new(bridges_text).size(15.0).color(Colors::TEXT));
ui.label(RichText::new(bridges_text).size(15.0).color(Colors::text(false)));
ui.add_space(1.0);
// Setup Tor status text.
@ -291,7 +291,7 @@ impl WalletTransport {
(X_CIRCLE, t!("transport.disconnected"))
};
let status_text = format!("{} {}", icon, text);
ui.label(RichText::new(status_text).size(15.0).color(Colors::GRAY));
ui.label(RichText::new(status_text).size(15.0).color(Colors::gray()));
});
});
});
@ -340,13 +340,13 @@ impl WalletTransport {
// Show buttons to close modal or come back to sending input.
ui.columns(2, |cols| {
cols[0].vertical_centered_justified(|ui| {
View::button(ui, t!("close"), Colors::WHITE, || {
View::button(ui, t!("close"), Colors::white_or_black(false), || {
on_stop(&mut self.bridge_qr_scan_content);
modal.close();
});
});
cols[1].vertical_centered_justified(|ui| {
View::button(ui, t!("back"), Colors::WHITE, || {
View::button(ui, t!("back"), Colors::white_or_black(false), || {
on_stop(&mut self.bridge_qr_scan_content);
});
});
@ -364,7 +364,7 @@ impl WalletTransport {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("transport.bridges_desc"))
.size(17.0)
.color(Colors::INACTIVE_TEXT));
.color(Colors::inactive_text()));
// Draw checkbox to enable/disable bridges.
View::checkbox(ui, bridge.is_some(), t!("transport.bridges"), || {
@ -423,7 +423,7 @@ impl WalletTransport {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("transport.bin_file"))
.size(17.0)
.color(Colors::INACTIVE_TEXT));
.color(Colors::inactive_text()));
ui.add_space(6.0);
View::text_edit(ui, cb, &mut self.bridge_bin_path_edit, &mut bin_edit_opts);
ui.add_space(6.0);
@ -441,7 +441,7 @@ impl WalletTransport {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("transport.conn_line"))
.size(17.0)
.color(Colors::INACTIVE_TEXT));
.color(Colors::inactive_text()));
ui.add_space(6.0);
View::text_edit(ui, cb, &mut self.bridge_conn_line_edit, &mut conn_edit_opts);
// Check if scan button was pressed.
@ -474,14 +474,14 @@ impl WalletTransport {
}
ui.add_space(6.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(6.0);
}
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("transport.tor_autorun_desc"))
.size(17.0)
.color(Colors::INACTIVE_TEXT));
.color(Colors::inactive_text()));
// Show Tor service autorun checkbox.
let autorun = wallet.auto_start_tor_listener();
@ -491,7 +491,7 @@ impl WalletTransport {
});
ui.add_space(6.0);
ui.vertical_centered_justified(|ui| {
View::button(ui, t!("close"), Colors::WHITE, || {
View::button(ui, t!("close"), Colors::white_or_black(false), || {
if self.tor_settings_changed {
self.tor_settings_changed = false;
// Restart running service or rebuild client.
@ -532,7 +532,7 @@ impl WalletTransport {
} else {
View::item_rounding(1, 2, false)
};
ui.painter().rect(bg_rect, item_rounding, Colors::BUTTON, View::ITEM_STROKE);
ui.painter().rect(bg_rect, item_rounding, Colors::button(), View::item_stroke());
ui.vertical(|ui| {
ui.allocate_ui_with_layout(rect.size(), Layout::right_to_left(Align::Center), |ui| {
@ -565,18 +565,18 @@ impl WalletTransport {
// Show wallet Slatepack address.
let address_color = if Tor::is_service_starting(service_id) ||
wallet.foreign_api_port().is_none() {
Colors::INACTIVE_TEXT
Colors::inactive_text()
} else if Tor::is_service_running(service_id) {
Colors::GREEN
Colors::green()
} else {
Colors::RED
Colors::red()
};
View::ellipsize_text(ui, slatepack_addr, 15.0, address_color);
let address_label = format!("{} {}",
GLOBE_SIMPLE,
t!("network_mining.address"));
ui.label(RichText::new(address_label).size(15.0).color(Colors::GRAY));
ui.label(RichText::new(address_label).size(15.0).color(Colors::gray()));
});
});
});
@ -593,7 +593,7 @@ impl WalletTransport {
ui.add_space(10.0);
ui.vertical_centered_justified(|ui| {
View::button(ui, t!("close"), Colors::WHITE, || {
View::button(ui, t!("close"), Colors::white_or_black(false), || {
self.qr_address_content.clear_state();
m.close();
});
@ -610,14 +610,14 @@ impl WalletTransport {
// Draw round background.
let bg_rect = rect.clone();
let item_rounding = View::item_rounding(1, 2, false);
ui.painter().rect(bg_rect, item_rounding, Colors::FILL, View::ITEM_STROKE);
ui.painter().rect(bg_rect, item_rounding, Colors::fill(), View::item_stroke());
ui.vertical(|ui| {
ui.allocate_ui_with_layout(rect.size(), Layout::top_down(Align::Center), |ui| {
ui.add_space(7.0);
// Draw button to open sending modal.
let send_text = format!("{} {}", EXPORT, t!("wallets.send"));
View::button(ui, send_text, Colors::WHITE, || {
View::button(ui, send_text, Colors::white_or_black(false), || {
self.show_send_tor_modal(cb, None);
});
});
@ -699,13 +699,13 @@ impl WalletTransport {
// Show buttons to close modal or come back to sending input.
ui.columns(2, |cols| {
cols[0].vertical_centered_justified(|ui| {
View::button(ui, t!("close"), Colors::WHITE, || {
View::button(ui, t!("close"), Colors::white_or_black(false), || {
on_stop(&mut self.address_scan_content);
modal.close();
});
});
cols[1].vertical_centered_justified(|ui| {
View::button(ui, t!("back"), Colors::WHITE, || {
View::button(ui, t!("back"), Colors::white_or_black(false), || {
self.modal_just_opened = true;
on_stop(&mut self.address_scan_content);
cb.show_keyboard();
@ -723,7 +723,7 @@ impl WalletTransport {
let enter_text = t!("wallets.enter_amount_send","amount" => amount);
ui.label(RichText::new(enter_text)
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
});
ui.add_space(8.0);
@ -778,11 +778,11 @@ impl WalletTransport {
if self.address_error {
ui.label(RichText::new(t!("transport.incorrect_addr_err"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
} else {
ui.label(RichText::new(t!("transport.receiver_address"))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
}
});
ui.add_space(6.0);
@ -814,7 +814,7 @@ impl WalletTransport {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
self.amount_edit = "".to_string();
self.address_edit = "".to_string();
cb.hide_keyboard();
@ -822,7 +822,7 @@ impl WalletTransport {
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("continue"), Colors::WHITE, || {
View::button(ui, t!("continue"), Colors::white_or_black(false), || {
if self.amount_edit.is_empty() {
return;
}
@ -869,7 +869,7 @@ impl WalletTransport {
ui.vertical_centered(|ui| {
ui.label(RichText::new(t!("transport.tor_send_error"))
.size(17.0)
.color(Colors::RED));
.color(Colors::red()));
});
ui.add_space(12.0);
@ -878,7 +878,7 @@ impl WalletTransport {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
self.amount_edit = "".to_string();
self.address_edit = "".to_string();
cb.hide_keyboard();
@ -886,7 +886,7 @@ impl WalletTransport {
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, t!("repeat"), Colors::WHITE, || {
View::button(ui, t!("repeat"), Colors::white_or_black(false), || {
// Parse amount and send over Tor.
if let Ok(a) = amount_from_hr_string(self.amount_edit.as_str()) {
let mut w_send_error = self.tor_send_error.write();
@ -929,7 +929,7 @@ impl WalletTransport {
ui.add_space(12.0);
ui.label(RichText::new(t!("transport.tor_sending", "amount" => self.amount_edit))
.size(17.0)
.color(Colors::GRAY));
.color(Colors::gray()));
});
ui.add_space(10.0);

View file

@ -109,8 +109,8 @@ impl WalletTab for WalletTransactions {
// Show wallet transactions panel.
egui::CentralPanel::default()
.frame(egui::Frame {
stroke: View::ITEM_STROKE,
fill: Colors::BUTTON,
stroke: View::item_stroke(),
fill: Colors::button(),
inner_margin: Margin {
left: View::far_left_inset_margin(ui) + 4.0,
right: View::get_right_inset() + 4.0,
@ -196,7 +196,7 @@ impl WalletTransactions {
"transport" => BRIDGE,
"settings" => GEAR_FINE
);
ui.label(RichText::new(empty_text).size(16.0).color(Colors::INACTIVE_TEXT));
ui.label(RichText::new(empty_text).size(16.0).color(Colors::inactive_text()));
});
return;
}
@ -302,11 +302,11 @@ impl WalletTransactions {
// Draw round background.
let bg_rect = rect.clone();
let color = if can_show_info {
Colors::BUTTON
Colors::button()
} else {
Colors::FILL
Colors::fill()
};
ui.painter().rect(bg_rect, rounding, color, View::ITEM_STROKE);
ui.painter().rect(bg_rect, rounding, color, View::item_stroke());
ui.allocate_ui_with_layout(rect.size(), Layout::right_to_left(Align::Center), |ui| {
// Draw button to show transaction info.
@ -326,7 +326,7 @@ impl WalletTransactions {
let (icon, color) = if !can_show_info && self.tx_info_finalize {
(FILE_TEXT, None)
} else {
(CHECK, Some(Colors::GREEN))
(CHECK, Some(Colors::green()))
};
let final_rounding = if can_show_info {
Rounding::default()
@ -352,7 +352,7 @@ impl WalletTransactions {
let wallet_loaded = wallet.foreign_api_port().is_some();
if ((!can_show_info && !self.tx_info_finalizing) || can_show_info) &&
(tx.can_repost(data) || tx.can_cancel()) && wallet_loaded {
View::item_button(ui, Rounding::default(), PROHIBIT, Some(Colors::RED), || {
View::item_button(ui, Rounding::default(), PROHIBIT, Some(Colors::red()), || {
if can_show_info {
self.confirm_cancel_tx_id = Some(tx.data.id);
// Show transaction cancellation confirmation modal.
@ -376,7 +376,7 @@ impl WalletTransactions {
rounding.sw = 0.0;
rounding
};
View::item_button(ui, repost_rounding, ARROW_CLOCKWISE, Some(Colors::GREEN), || {
View::item_button(ui, repost_rounding, ARROW_CLOCKWISE, Some(Colors::green()), || {
// Post tx after getting slate from slatepack file.
if let Some((s, _)) = wallet.read_slate_by_tx(tx) {
let _ = wallet.post(&s, wallet.can_use_dandelion());
@ -407,12 +407,12 @@ impl WalletTransactions {
// Setup amount color.
let amount_color = match tx.data.tx_type {
TxLogEntryType::ConfirmedCoinbase => Colors::BLACK,
TxLogEntryType::TxReceived => Colors::BLACK,
TxLogEntryType::TxSent => Colors::BLACK,
TxLogEntryType::TxReceivedCancelled => Colors::TEXT,
TxLogEntryType::TxSentCancelled => Colors::TEXT,
TxLogEntryType::TxReverted => Colors::TEXT
TxLogEntryType::ConfirmedCoinbase => Colors::white_or_black(true),
TxLogEntryType::TxReceived => Colors::white_or_black(true),
TxLogEntryType::TxSent => Colors::white_or_black(true),
TxLogEntryType::TxReceivedCancelled => Colors::text(false),
TxLogEntryType::TxSentCancelled => Colors::text(false),
TxLogEntryType::TxReverted => Colors::text(false)
};
View::ellipsize_text(ui, amount_text, 18.0, amount_color);
ui.add_space(-2.0);
@ -484,27 +484,27 @@ impl WalletTransactions {
// Setup status text color.
let status_color = match tx.data.tx_type {
TxLogEntryType::ConfirmedCoinbase => Colors::TEXT,
TxLogEntryType::ConfirmedCoinbase => Colors::text(false),
TxLogEntryType::TxReceived => if tx.data.confirmed {
Colors::GREEN
Colors::green()
} else {
Colors::TEXT
Colors::text(false)
},
TxLogEntryType::TxSent => if tx.data.confirmed {
Colors::RED
Colors::red()
} else {
Colors::TEXT
Colors::text(false)
},
TxLogEntryType::TxReceivedCancelled => Colors::INACTIVE_TEXT,
TxLogEntryType::TxSentCancelled => Colors::INACTIVE_TEXT,
TxLogEntryType::TxReverted => Colors::INACTIVE_TEXT,
TxLogEntryType::TxReceivedCancelled => Colors::inactive_text(),
TxLogEntryType::TxSentCancelled => Colors::inactive_text(),
TxLogEntryType::TxReverted => Colors::inactive_text(),
};
ui.label(RichText::new(status_text).size(15.0).color(status_color));
// Setup transaction time.
let tx_time = View::format_time(tx.data.creation_ts.timestamp());
let tx_time_text = format!("{} {}", CALENDAR_CHECK, tx_time);
ui.label(RichText::new(tx_time_text).size(15.0).color(Colors::GRAY));
ui.label(RichText::new(tx_time_text).size(15.0).color(Colors::gray()));
ui.add_space(3.0);
});
});
@ -570,14 +570,14 @@ impl WalletTransactions {
// Show buttons to close modal or come back to text request content.
ui.columns(2, |cols| {
cols[0].vertical_centered_justified(|ui| {
View::button(ui, t!("close"), Colors::WHITE, || {
View::button(ui, t!("close"), Colors::white_or_black(false), || {
self.tx_info_qr_code_content.clear_state();
self.tx_info_show_qr = false;
modal.close();
});
});
cols[1].vertical_centered_justified(|ui| {
View::button(ui, t!("back"), Colors::WHITE, || {
View::button(ui, t!("back"), Colors::white_or_black(false), || {
self.tx_info_qr_code_content.clear_state();
self.tx_info_show_qr = false;
});
@ -587,14 +587,14 @@ impl WalletTransactions {
// Show buttons to close modal or scanner.
ui.columns(2, |cols| {
cols[0].vertical_centered_justified(|ui| {
View::button(ui, t!("close"), Colors::WHITE, || {
View::button(ui, t!("close"), Colors::white_or_black(false), || {
cb.stop_camera();
self.tx_info_show_scanner = false;
modal.close();
});
});
cols[1].vertical_centered_justified(|ui| {
View::button(ui, t!("back"), Colors::WHITE, || {
View::button(ui, t!("back"), Colors::white_or_black(false), || {
cb.stop_camera();
self.tx_info_show_scanner = false;
modal.enable_closing();
@ -604,7 +604,7 @@ impl WalletTransactions {
} else {
// Show button to close modal.
ui.vertical_centered_justified(|ui| {
View::button(ui, t!("close"), Colors::WHITE, || {
View::button(ui, t!("close"), Colors::white_or_black(false), || {
self.tx_info_id = None;
self.tx_info_finalize = false;
cb.hide_keyboard();
@ -660,7 +660,7 @@ impl WalletTransactions {
let bg_rect = rect.clone();
let mut rounding = View::item_rounding(1, 3, false);
ui.painter().rect(bg_rect, rounding, Colors::FILL, View::ITEM_STROKE);
ui.painter().rect(bg_rect, rounding, Colors::fill(), View::item_stroke());
ui.allocate_ui_with_layout(rect.size(), Layout::right_to_left(Align::Center), |ui| {
// Draw button to copy transaction info value.
@ -678,8 +678,8 @@ impl WalletTransactions {
ui.add_space(6.0);
ui.vertical(|ui| {
ui.add_space(3.0);
View::ellipsize_text(ui, value, 15.0, Colors::TITLE);
ui.label(RichText::new(label).size(15.0).color(Colors::GRAY));
View::ellipsize_text(ui, value, 15.0, Colors::title(false));
ui.label(RichText::new(label).size(15.0).color(Colors::gray()));
ui.add_space(3.0);
});
});
@ -734,9 +734,9 @@ impl WalletTransactions {
}
};
let desc_color = if self.tx_info_finalize_error {
Colors::RED
Colors::red()
} else {
Colors::GRAY
Colors::gray()
};
ui.label(RichText::new(desc_text).size(16.0).color(desc_color));
} else {
@ -753,7 +753,7 @@ impl WalletTransactions {
t!("wallets.parse_s1_slatepack_desc", "amount" => amount)
}
};
ui.label(RichText::new(desc_text).size(16.0).color(Colors::GRAY));
ui.label(RichText::new(desc_text).size(16.0).color(Colors::gray()));
}
});
ui.add_space(6.0);
@ -785,7 +785,7 @@ impl WalletTransactions {
} else {
Id::from("tx_info_message_request")
}.with(slate.id).with(tx.data.id);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(3.0);
ScrollArea::vertical()
.id_source(input_id)
@ -806,7 +806,7 @@ impl WalletTransactions {
});
ui.add_space(2.0);
View::horizontal_line(ui, Colors::ITEM_STROKE);
View::horizontal_line(ui, Colors::item_stroke());
ui.add_space(8.0);
// Do not show buttons on finalization.
@ -822,7 +822,7 @@ impl WalletTransactions {
columns[0].vertical_centered_justified(|ui| {
// Draw button to scan Slatepack message QR code.
let qr_text = format!("{} {}", SCAN, t!("scan"));
View::button(ui, qr_text, Colors::BUTTON, || {
View::button(ui, qr_text, Colors::button(), || {
cb.hide_keyboard();
modal.disable_closing();
cb.start_camera();
@ -832,7 +832,7 @@ impl WalletTransactions {
columns[1].vertical_centered_justified(|ui| {
// Draw button to paste data from clipboard.
let paste_text = format!("{} {}", CLIPBOARD_TEXT, t!("paste"));
View::button(ui, paste_text, Colors::BUTTON, || {
View::button(ui, paste_text, Colors::button(), || {
self.tx_info_finalize_edit = cb.get_string_from_buffer();
});
// Callback on finalization message input change.
@ -846,7 +846,7 @@ impl WalletTransactions {
columns[0].vertical_centered_justified(|ui| {
// Draw button to show Slatepack message as QR code.
let qr_text = format!("{} {}", QR_CODE, t!("qr_code"));
View::button(ui, qr_text, Colors::BUTTON, || {
View::button(ui, qr_text, Colors::button(), || {
cb.hide_keyboard();
self.tx_info_show_qr = true;
});
@ -854,7 +854,7 @@ impl WalletTransactions {
columns[1].vertical_centered_justified(|ui| {
// Draw copy button.
let copy_text = format!("{} {}", COPY, t!("copy"));
View::button(ui, copy_text, Colors::BUTTON, || {
View::button(ui, copy_text, Colors::button(), || {
cb.copy_string_to_buffer(self.tx_info_response_edit.clone());
self.tx_info_finalize_edit = "".to_string();
if tx.can_finalize {
@ -932,7 +932,7 @@ impl WalletTransactions {
};
ui.label(RichText::new(text)
.size(17.0)
.color(Colors::TEXT));
.color(Colors::text(false)));
ui.add_space(8.0);
});
@ -943,13 +943,13 @@ impl WalletTransactions {
ui.columns(2, |columns| {
columns[0].vertical_centered_justified(|ui| {
View::button(ui, t!("modal.cancel"), Colors::WHITE, || {
View::button(ui, t!("modal.cancel"), Colors::white_or_black(false), || {
self.confirm_cancel_tx_id = None;
modal.close();
});
});
columns[1].vertical_centered_justified(|ui| {
View::button(ui, "OK".to_string(), Colors::WHITE, || {
View::button(ui, "OK".to_string(), Colors::white_or_black(false), || {
wallet.cancel(self.confirm_cancel_tx_id.unwrap());
self.confirm_cancel_tx_id = None;
modal.close();

View file

@ -41,10 +41,10 @@ pub mod built_info {
include!(concat!(env!("OUT_DIR"), "/built.rs"));
}
/// Android platform entry point.
#[allow(dead_code)]
#[cfg(target_os = "android")]
#[no_mangle]
/// Android platform entry point.
fn android_main(app: AndroidApp) {
#[cfg(debug_assertions)]
{
@ -59,6 +59,12 @@ fn android_main(app: AndroidApp) {
let platform = Android::new(app.clone());
use winit::platform::android::EventLoopBuilderExtAndroid;
// Setup system theme if not set.
if let None = AppConfig::dark_theme() {
let use_dark = system_dark_theme(&platform);
AppConfig::set_dark_theme(use_dark);
}
let width = app.config().screen_width_dp().unwrap() as f32;
let height = app.config().screen_height_dp().unwrap() as f32;
let size = egui::emath::vec2(width, height);
@ -82,7 +88,16 @@ fn android_main(app: AndroidApp) {
builder.with_android_app(app);
}));
start(options, app_creator(PlatformApp::new(platform)));
let app = PlatformApp::new(platform);
start(options, app_creator(app));
}
/// Check if system is using dark theme.
#[allow(dead_code)]
#[cfg(target_os = "android")]
fn system_dark_theme(platform: &gui::platform::Android) -> bool {
let res = platform.call_java_method("useDarkTheme", "()Z", &[]).unwrap();
unsafe { res.z != 0 }
}
/// [`PlatformApp`] setup for [`eframe`].
@ -132,17 +147,27 @@ pub fn setup_visuals(ctx: &Context) {
// Setup style
ctx.set_style(style);
let mut visuals = egui::Visuals::light();
// Setup visuals based on app color theme.
let use_dark = AppConfig::dark_theme().unwrap_or(false);
let mut visuals = if use_dark {
egui::Visuals::dark()
} else {
egui::Visuals::light()
};
// Setup selection color.
visuals.selection.stroke = Stroke { width: 1.0, color: Colors::TEXT };
visuals.selection.bg_fill = Colors::GOLD;
visuals.selection.stroke = Stroke { width: 1.0, color: Colors::text(false) };
visuals.selection.bg_fill = Colors::gold();
// Disable stroke around panels by default.
visuals.widgets.noninteractive.bg_stroke = Stroke::NONE;
// Setup stroke around inactive widgets.
visuals.widgets.inactive.bg_stroke = View::DEFAULT_STROKE;
visuals.widgets.inactive.bg_stroke = View::default_stroke();
// Setup background and foreground stroke color for widgets like pull-to-refresher.
visuals.widgets.inactive.bg_fill = Colors::YELLOW;
visuals.widgets.inactive.fg_stroke.color = Colors::ITEM_BUTTON;
visuals.widgets.inactive.bg_fill = if use_dark {
Colors::white_or_black(false)
} else {
Colors::yellow()
};
visuals.widgets.inactive.fg_stroke.color = Colors::item_button();
// Setup visuals
ctx.set_visuals(visuals);
}

View file

@ -12,6 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
use dark_light::Mode;
pub fn main() {
#[allow(dead_code)]
#[cfg(not(target_os = "android"))]
@ -36,7 +38,17 @@ fn real_main() {
let platform = Desktop::default();
// Desktop window size.
// Setup system theme if not set.
if let None = AppConfig::dark_theme() {
let dark = match dark_light::detect() {
Mode::Dark => true,
Mode::Light => false,
Mode::Default => false
};
AppConfig::set_dark_theme(dark);
}
// Setup window size.
let (width, height) = AppConfig::window_size();
let mut viewport = egui::ViewportBuilder::default()
@ -53,7 +65,7 @@ fn real_main() {
}));
}
// Desktop window position.
// Setup window position.
if let Some((x, y)) = AppConfig::window_pos() {
viewport = viewport.with_position(pos2(x, y));
}

View file

@ -44,7 +44,10 @@ pub struct AppConfig {
x: Option<f32>, y: Option<f32>,
/// Locale code for i18n.
lang: Option<String>
lang: Option<String>,
/// Flag to check if dark theme should be used, use system settings if not set.
use_dark_theme: Option<bool>,
}
impl Default for AppConfig {
@ -60,6 +63,7 @@ impl Default for AppConfig {
x: None,
y: None,
lang: None,
use_dark_theme: None,
}
}
}
@ -213,8 +217,21 @@ impl AppConfig {
/// Mark integrated node warning for Android as shown.
pub fn show_android_integrated_node_warning() {
let mut w_app_config = Settings::app_config_to_update();
w_app_config.android_integrated_node_warning = Some(false);
w_app_config.save();
let mut w_config = Settings::app_config_to_update();
w_config.android_integrated_node_warning = Some(false);
w_config.save();
}
/// Check if dark theme should be used.
pub fn dark_theme() -> Option<bool> {
let r_config = Settings::app_config_to_read();
r_config.use_dark_theme.clone()
}
/// Setup flag to use dark theme.
pub fn set_dark_theme(use_dark: bool) {
let mut w_config = Settings::app_config_to_update();
w_config.use_dark_theme = Some(use_dark);
w_config.save();
}
}