diff --git a/src/app.rs b/src/app.rs index 9c8b55d56..0608c3fb0 100644 --- a/src/app.rs +++ b/src/app.rs @@ -11,6 +11,7 @@ use crate::database::Database; use crate::logging::initialize_logger; use crate::model::settings::Settings; use crate::ui::contracts_documents::contracts_documents_screen::DocumentQueryScreen; +use crate::ui::contracts_documents::dashpay_coming_soon_screen::DashPayComingSoonScreen; use crate::ui::dpns::dpns_contested_names_screen::{ DPNSScreen, DPNSSubscreen, ScheduledVoteCastingStatus, }; @@ -226,6 +227,7 @@ impl AppState { TokensScreen::new(&mainnet_app_context, TokensSubscreen::SearchTokens); let mut token_creator_screen = TokensScreen::new(&mainnet_app_context, TokensSubscreen::TokenCreator); + let mut contracts_dashpay_screen = DashPayComingSoonScreen::new(&mainnet_app_context); let mut network_chooser_screen = NetworkChooserScreen::new( &mainnet_app_context, @@ -263,6 +265,7 @@ impl AppState { proof_log_screen = ProofLogScreen::new(testnet_app_context); platform_info_screen = PlatformInfoScreen::new(testnet_app_context); masternode_list_diff_screen = MasternodeListDiffScreen::new(testnet_app_context); + contracts_dashpay_screen = DashPayComingSoonScreen::new(testnet_app_context); tokens_balances_screen = TokensScreen::new(testnet_app_context, TokensSubscreen::MyTokens); token_search_screen = @@ -312,6 +315,7 @@ impl AppState { masternode_list_diff_screen = MasternodeListDiffScreen::new(local_app_context); proof_log_screen = ProofLogScreen::new(local_app_context); platform_info_screen = PlatformInfoScreen::new(local_app_context); + contracts_dashpay_screen = DashPayComingSoonScreen::new(local_app_context); tokens_balances_screen = TokensScreen::new(local_app_context, TokensSubscreen::MyTokens); token_search_screen = @@ -445,6 +449,10 @@ impl AppState { RootScreenType::RootScreenDocumentQuery, Screen::DocumentQueryScreen(document_query_screen), ), + ( + RootScreenType::RootScreenContractsDashPay, + Screen::DashPayComingSoonScreen(contracts_dashpay_screen), + ), ( RootScreenType::RootScreenNetworkChooser, Screen::NetworkChooserScreen(network_chooser_screen), diff --git a/src/components/core_p2p_handler.rs b/src/components/core_p2p_handler.rs index c7bee96e1..6b354598b 100644 --- a/src/components/core_p2p_handler.rs +++ b/src/components/core_p2p_handler.rs @@ -176,8 +176,7 @@ impl CoreP2PHandler { .stream .read_timeout() .map_err(|e| format!("get_read_timeout failed: {}", e))?; - self - .stream + self.stream .set_read_timeout(Some(socket_timeout)) .map_err(|e| format!("set_read_timeout failed: {}", e))?; let start_time = std::time::Instant::now(); @@ -185,8 +184,7 @@ impl CoreP2PHandler { loop { if start_time.elapsed() > timeout { // Restore previous socket timeout before returning - self - .stream + self.stream .set_read_timeout(previous_socket_timeout) .map_err(|e| format!("restore set_read_timeout failed: {}", e))?; return Err("Timeout waiting for qrinfo message".to_string()); @@ -205,8 +203,7 @@ impl CoreP2PHandler { if command == "qrinfo" { println!("Got qrinfo message"); // Restore previous socket timeout - self - .stream + self.stream .set_read_timeout(previous_socket_timeout) .map_err(|e| format!("restore set_read_timeout failed: {}", e))?; break; diff --git a/src/ui/components/contract_chooser_panel.rs b/src/ui/components/contract_chooser_panel.rs index 1738f67aa..ac465fd3c 100644 --- a/src/ui/components/contract_chooser_panel.rs +++ b/src/ui/components/contract_chooser_panel.rs @@ -181,7 +181,7 @@ pub fn add_contract_chooser_panel( SidePanel::left("contract_chooser_panel") // Let the user resize this panel horizontally - .resizable(true) + .resizable(false) .default_width(270.0) // Increased to account for margins .frame( Frame::new() diff --git a/src/ui/components/contracts_subscreen_chooser_panel.rs b/src/ui/components/contracts_subscreen_chooser_panel.rs new file mode 100644 index 000000000..9921bc191 --- /dev/null +++ b/src/ui/components/contracts_subscreen_chooser_panel.rs @@ -0,0 +1,128 @@ +use crate::app::AppAction; +use crate::context::AppContext; +use crate::ui::theme::{DashColors, Shadow, Shape, Spacing, Typography}; +use crate::ui::{self, RootScreenType}; +use egui::{Context, Frame, Margin, RichText, SidePanel}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ContractsSubscreen { + Contracts, + DPNS, + DashPay, +} + +impl ContractsSubscreen { + pub fn display_name(&self) -> &'static str { + match self { + ContractsSubscreen::Contracts => "All Contracts", + ContractsSubscreen::DPNS => "DPNS", + ContractsSubscreen::DashPay => "DashPay", + } + } +} + +pub fn add_contracts_subscreen_chooser_panel(ctx: &Context, app_context: &AppContext) -> AppAction { + let mut action = AppAction::None; + + let subscreens = vec![ + ContractsSubscreen::Contracts, + ContractsSubscreen::DPNS, + ContractsSubscreen::DashPay, + ]; + + // Determine active selection from settings; default to Contracts + let active_screen = match app_context.get_settings() { + Ok(Some(settings)) => match settings.root_screen_type { + ui::RootScreenType::RootScreenDocumentQuery => ContractsSubscreen::Contracts, + ui::RootScreenType::RootScreenDPNSActiveContests + | ui::RootScreenType::RootScreenDPNSPastContests + | ui::RootScreenType::RootScreenDPNSOwnedNames + | ui::RootScreenType::RootScreenDPNSScheduledVotes => ContractsSubscreen::DPNS, + ui::RootScreenType::RootScreenContractsDashPay => ContractsSubscreen::DashPay, + _ => ContractsSubscreen::Contracts, + }, + _ => ContractsSubscreen::Contracts, + }; + + let dark_mode = ctx.style().visuals.dark_mode; + + SidePanel::left("contracts_subscreen_chooser_panel") + .resizable(false) + .default_width(270.0) + .frame( + Frame::new() + .fill(DashColors::background(dark_mode)) + .inner_margin(Margin::symmetric(10, 10)), + ) + .show(ctx, |ui| { + let available_height = ui.available_height(); + + Frame::new() + .fill(DashColors::surface(dark_mode)) + .stroke(egui::Stroke::new(1.0, DashColors::border_light(dark_mode))) + .inner_margin(Margin::same(Spacing::XL as i8)) + .corner_radius(egui::CornerRadius::same(Shape::RADIUS_LG)) + .shadow(Shadow::elevated()) + .show(ui, |ui| { + ui.set_min_height(available_height - 2.0 - (Spacing::XL * 2.0)); + ui.vertical(|ui| { + ui.label( + RichText::new("Contracts") + .font(Typography::heading_small()) + .color(DashColors::text_primary(dark_mode)), + ); + ui.add_space(Spacing::MD); + + for subscreen in subscreens { + let is_active = active_screen == subscreen; + + let button = if is_active { + egui::Button::new( + RichText::new(subscreen.display_name()) + .color(DashColors::WHITE) + .size(Typography::SCALE_SM), + ) + .fill(DashColors::DASH_BLUE) + .stroke(egui::Stroke::NONE) + .corner_radius(egui::CornerRadius::same(Shape::RADIUS_MD)) + .min_size(egui::Vec2::new(150.0, 28.0)) + } else { + egui::Button::new( + RichText::new(subscreen.display_name()) + .color(DashColors::text_primary(dark_mode)) + .size(Typography::SCALE_SM), + ) + .fill(DashColors::glass_white(dark_mode)) + .stroke(egui::Stroke::new(1.0, DashColors::border(dark_mode))) + .corner_radius(egui::CornerRadius::same(Shape::RADIUS_MD)) + .min_size(egui::Vec2::new(150.0, 28.0)) + }; + + if ui.add(button).clicked() { + action = match subscreen { + ContractsSubscreen::Contracts => { + AppAction::SetMainScreenThenGoToMainScreen( + RootScreenType::RootScreenDocumentQuery, + ) + } + ContractsSubscreen::DPNS => { + AppAction::SetMainScreenThenGoToMainScreen( + RootScreenType::RootScreenDPNSActiveContests, + ) + } + ContractsSubscreen::DashPay => { + AppAction::SetMainScreenThenGoToMainScreen( + RootScreenType::RootScreenContractsDashPay, + ) + } + }; + } + + ui.add_space(Spacing::SM); + } + }); + }); + }); + + action +} diff --git a/src/ui/components/dpns_subscreen_chooser_panel.rs b/src/ui/components/dpns_subscreen_chooser_panel.rs index 42bd73020..34210c79d 100644 --- a/src/ui/components/dpns_subscreen_chooser_panel.rs +++ b/src/ui/components/dpns_subscreen_chooser_panel.rs @@ -24,31 +24,28 @@ pub fn add_dpns_subscreen_chooser_panel(ctx: &Context, app_context: &AppContext) ui::RootScreenType::RootScreenDPNSScheduledVotes => DPNSSubscreen::ScheduledVotes, _ => DPNSSubscreen::Active, }, - _ => DPNSSubscreen::Active, // Fallback to Active screen if settings unavailable + _ => DPNSSubscreen::Active, }; SidePanel::left("dpns_subscreen_chooser_panel") - .default_width(270.0) // Increased to account for margins + .resizable(true) + .default_width(270.0) .frame( Frame::new() - .fill(DashColors::background(dark_mode)) // Light background instead of transparent - .inner_margin(Margin::symmetric(10, 10)), // Add margins for island effect + .fill(DashColors::background(dark_mode)) + .inner_margin(Margin::symmetric(10, 10)), ) .show(ctx, |ui| { - // Fill the entire available height let available_height = ui.available_height(); - // Create an island panel with rounded edges that fills the height Frame::new() .fill(DashColors::surface(dark_mode)) .stroke(egui::Stroke::new(1.0, DashColors::border_light(dark_mode))) - .inner_margin(Margin::same(Spacing::MD_I8)) + .inner_margin(Margin::same(Spacing::XL as i8)) .corner_radius(egui::CornerRadius::same(Shape::RADIUS_LG)) .shadow(Shadow::elevated()) .show(ui, |ui| { - // Account for both outer margin (10px * 2) and inner margin - ui.set_min_height(available_height - 2.0 - (Spacing::MD_I8 as f32 * 2.0)); - // Display subscreen names + ui.set_min_height(available_height - 2.0 - (Spacing::XL * 2.0)); ui.vertical(|ui| { ui.label( RichText::new("DPNS Subscreens") diff --git a/src/ui/components/left_panel.rs b/src/ui/components/left_panel.rs index 6b34a0f2c..4f5a4be2b 100644 --- a/src/ui/components/left_panel.rs +++ b/src/ui/components/left_panel.rs @@ -56,21 +56,36 @@ pub fn add_left_panel( // Define the button details directly in this function let buttons = [ - ("I", RootScreenType::RootScreenIdentities, "identity.png"), - ("Q", RootScreenType::RootScreenDocumentQuery, "doc.png"), - ("O", RootScreenType::RootScreenMyTokenBalances, "tokens.png"), ( - "C", - RootScreenType::RootScreenDPNSActiveContests, - "voting.png", + "Identities", + RootScreenType::RootScreenIdentities, + "identity.png", ), - ("W", RootScreenType::RootScreenWalletsBalances, "wallet.png"), ( - "T", - RootScreenType::RootScreenToolsProofLogScreen, + "Contracts", + RootScreenType::RootScreenDocumentQuery, + "doc.png", + ), + ( + "Tokens", + RootScreenType::RootScreenMyTokenBalances, + "tokens.png", + ), + ( + "Wallets", + RootScreenType::RootScreenWalletsBalances, + "wallet.png", + ), + ( + "Tools", + RootScreenType::RootScreenToolsPlatformInfoScreen, "tools.png", ), - ("N", RootScreenType::RootScreenNetworkChooser, "config.png"), + ( + "Settings", + RootScreenType::RootScreenNetworkChooser, + "config.png", + ), ]; let panel_width = 60.0 + (Spacing::MD * 2.0); // Button width + margins @@ -79,6 +94,7 @@ pub fn add_left_panel( SidePanel::left("left_panel") .default_width(panel_width + 20.0) // Add extra width for margins + .resizable(false) .frame( Frame::new() .fill(DashColors::background(dark_mode)) @@ -118,6 +134,14 @@ pub fn add_left_panel( } else if added.hovered() { ui.ctx().set_cursor_icon(egui::CursorIcon::PointingHand); } + // Put the label beneath the icon + let color = if is_selected { + DashColors::DASH_BLUE + } else { + DashColors::DEEP_BLUE + }; + let label_text = RichText::new(*label).color(color).size(13.0); + ui.label(label_text); } else { // Fallback to a modern gradient button if texture loading fails if is_selected { diff --git a/src/ui/components/mod.rs b/src/ui/components/mod.rs index e728d66a6..ac63e7f56 100644 --- a/src/ui/components/mod.rs +++ b/src/ui/components/mod.rs @@ -2,6 +2,7 @@ pub mod amount_input; pub mod component_trait; pub mod confirmation_dialog; pub mod contract_chooser_panel; +pub mod contracts_subscreen_chooser_panel; pub mod dpns_subscreen_chooser_panel; pub mod entropy_grid; pub mod identity_selector; diff --git a/src/ui/components/tokens_subscreen_chooser_panel.rs b/src/ui/components/tokens_subscreen_chooser_panel.rs index e5ef2d119..add77bd30 100644 --- a/src/ui/components/tokens_subscreen_chooser_panel.rs +++ b/src/ui/components/tokens_subscreen_chooser_panel.rs @@ -27,18 +27,15 @@ pub fn add_tokens_subscreen_chooser_panel(ctx: &Context, app_context: &AppContex let dark_mode = ctx.style().visuals.dark_mode; SidePanel::left("tokens_subscreen_chooser_panel") - .resizable(true) - .default_width(270.0) // Increased to account for margins + .resizable(false) + .default_width(270.0) .frame( Frame::new() .fill(DashColors::background(dark_mode)) - .inner_margin(Margin::symmetric(10, 10)), // Add margins for island effect + .inner_margin(Margin::symmetric(10, 10)), ) .show(ctx, |ui| { - // Fill the entire available height let available_height = ui.available_height(); - - // Create an island panel with rounded edges that fills the height Frame::new() .fill(DashColors::surface(dark_mode)) .stroke(egui::Stroke::new(1.0, DashColors::border_light(dark_mode))) @@ -46,7 +43,6 @@ pub fn add_tokens_subscreen_chooser_panel(ctx: &Context, app_context: &AppContex .corner_radius(egui::CornerRadius::same(Shape::RADIUS_LG)) .shadow(Shadow::elevated()) .show(ui, |ui| { - // Account for both outer margin (10px * 2) and inner margin ui.set_min_height(available_height - 2.0 - (Spacing::XL * 2.0)); // Display subscreen names ui.vertical(|ui| { diff --git a/src/ui/components/tools_subscreen_chooser_panel.rs b/src/ui/components/tools_subscreen_chooser_panel.rs index 739e41b5a..79aa2f9f5 100644 --- a/src/ui/components/tools_subscreen_chooser_panel.rs +++ b/src/ui/components/tools_subscreen_chooser_panel.rs @@ -6,24 +6,24 @@ use egui::{Context, Frame, Margin, RichText, SidePanel}; #[derive(PartialEq)] pub enum ToolsSubscreen { + PlatformInfo, ProofLog, TransactionViewer, DocumentViewer, ProofViewer, ContractViewer, - PlatformInfo, MasternodeListDiff, } impl ToolsSubscreen { pub fn display_name(&self) -> &'static str { match self { + Self::PlatformInfo => "Platform info", Self::ProofLog => "Proof logs", Self::TransactionViewer => "Transaction deserializer", Self::ProofViewer => "Proof deserializer", Self::DocumentViewer => "Document deserializer", Self::ContractViewer => "Contract deserializer", - Self::PlatformInfo => "Platform info", Self::MasternodeListDiff => "Masternode list diff inspector", } } @@ -34,17 +34,18 @@ pub fn add_tools_subscreen_chooser_panel(ctx: &Context, app_context: &AppContext let dark_mode = ctx.style().visuals.dark_mode; let subscreens = vec![ + ToolsSubscreen::PlatformInfo, ToolsSubscreen::ProofLog, ToolsSubscreen::ProofViewer, ToolsSubscreen::TransactionViewer, ToolsSubscreen::DocumentViewer, ToolsSubscreen::ContractViewer, - ToolsSubscreen::PlatformInfo, ToolsSubscreen::MasternodeListDiff, ]; let active_screen = match app_context.get_settings() { Ok(Some(settings)) => match settings.root_screen_type { + ui::RootScreenType::RootScreenToolsPlatformInfoScreen => ToolsSubscreen::PlatformInfo, ui::RootScreenType::RootScreenToolsProofLogScreen => ToolsSubscreen::ProofLog, ui::RootScreenType::RootScreenToolsTransitionVisualizerScreen => { ToolsSubscreen::TransactionViewer @@ -56,37 +57,32 @@ pub fn add_tools_subscreen_chooser_panel(ctx: &Context, app_context: &AppContext ui::RootScreenType::RootScreenToolsContractVisualizerScreen => { ToolsSubscreen::ContractViewer } - ui::RootScreenType::RootScreenToolsPlatformInfoScreen => ToolsSubscreen::PlatformInfo, ui::RootScreenType::RootScreenToolsMasternodeListDiffScreen => { ToolsSubscreen::MasternodeListDiff } - _ => ToolsSubscreen::ProofLog, + _ => ToolsSubscreen::PlatformInfo, }, - _ => ToolsSubscreen::ProofLog, // Fallback to Active screen if settings unavailable + _ => ToolsSubscreen::PlatformInfo, // Fallback to Active screen if settings unavailable }; SidePanel::left("tools_subscreen_chooser_panel") - .default_width(270.0) // Increased to account for margins + .resizable(false) + .default_width(270.0) .frame( Frame::new() - .fill(DashColors::background(dark_mode)) // Light background instead of transparent - .inner_margin(Margin::symmetric(10, 10)), // Add margins for island effect + .fill(DashColors::background(dark_mode)) + .inner_margin(Margin::symmetric(10, 10)), ) .show(ctx, |ui| { - // Fill the entire available height let available_height = ui.available_height(); - - // Create an island panel with rounded edges that fills the height Frame::new() .fill(DashColors::surface(dark_mode)) .stroke(egui::Stroke::new(1.0, DashColors::border_light(dark_mode))) - .inner_margin(Margin::same(Spacing::MD_I8)) + .inner_margin(Margin::same(Spacing::XL as i8)) .corner_radius(egui::CornerRadius::same(Shape::RADIUS_LG)) .shadow(Shadow::elevated()) .show(ui, |ui| { - // Account for both outer margin (10px * 2) and inner margin - ui.set_min_height(available_height - 2.0 - (Spacing::MD_I8 as f32 * 2.0)); - // Display subscreen names + ui.set_min_height(available_height - 2.0 - (Spacing::XL * 2.0)); ui.vertical(|ui| { ui.label( RichText::new("Tools") @@ -124,6 +120,11 @@ pub fn add_tools_subscreen_chooser_panel(ctx: &Context, app_context: &AppContext if ui.add(button).clicked() { // Handle navigation based on which subscreen is selected match subscreen { + ToolsSubscreen::PlatformInfo => { + action = AppAction::SetMainScreen( + RootScreenType::RootScreenToolsPlatformInfoScreen, + ) + } ToolsSubscreen::ProofLog => { action = AppAction::SetMainScreen( RootScreenType::RootScreenToolsProofLogScreen, @@ -149,11 +150,6 @@ pub fn add_tools_subscreen_chooser_panel(ctx: &Context, app_context: &AppContext RootScreenType::RootScreenToolsContractVisualizerScreen, ) } - ToolsSubscreen::PlatformInfo => { - action = AppAction::SetMainScreen( - RootScreenType::RootScreenToolsPlatformInfoScreen, - ) - } ToolsSubscreen::MasternodeListDiff => { action = AppAction::SetMainScreen( RootScreenType::RootScreenToolsMasternodeListDiffScreen) diff --git a/src/ui/contracts_documents/add_contracts_screen.rs b/src/ui/contracts_documents/add_contracts_screen.rs index f8de7ab88..af2879347 100644 --- a/src/ui/contracts_documents/add_contracts_screen.rs +++ b/src/ui/contracts_documents/add_contracts_screen.rs @@ -323,6 +323,12 @@ impl ScreenLike for AddContractsScreen { crate::ui::RootScreenType::RootScreenDocumentQuery, ); + // Contracts sub-left panel + action |= crate::ui::components::contracts_subscreen_chooser_panel::add_contracts_subscreen_chooser_panel( + ctx, + &self.app_context, + ); + action |= island_central_panel(ctx, |ui| { ui.heading("Add Contracts"); ui.add_space(10.0); diff --git a/src/ui/contracts_documents/contracts_documents_screen.rs b/src/ui/contracts_documents/contracts_documents_screen.rs index ec9f32388..14cfcd51e 100644 --- a/src/ui/contracts_documents/contracts_documents_screen.rs +++ b/src/ui/contracts_documents/contracts_documents_screen.rs @@ -685,6 +685,12 @@ impl ScreenLike for DocumentQueryScreen { RootScreenType::RootScreenDocumentQuery, ); + // Contracts sub-left panel: DPNS / DashPay / Contracts (default) + action |= crate::ui::components::contracts_subscreen_chooser_panel::add_contracts_subscreen_chooser_panel( + ctx, + &self.app_context, + ); + action |= add_contract_chooser_panel( ctx, &mut self.contract_search_term, diff --git a/src/ui/contracts_documents/dashpay_coming_soon_screen.rs b/src/ui/contracts_documents/dashpay_coming_soon_screen.rs new file mode 100644 index 000000000..80b786b82 --- /dev/null +++ b/src/ui/contracts_documents/dashpay_coming_soon_screen.rs @@ -0,0 +1,60 @@ +use std::sync::Arc; + +use eframe::egui::Context; + +use crate::app::AppAction; +use crate::context::AppContext; +use crate::ui::components::left_panel::add_left_panel; +use crate::ui::components::styled::island_central_panel; +use crate::ui::components::top_panel::add_top_panel; +use crate::ui::{RootScreenType, ScreenLike}; + +pub struct DashPayComingSoonScreen { + pub app_context: Arc, +} + +impl DashPayComingSoonScreen { + pub fn new(app_context: &Arc) -> Self { + Self { + app_context: app_context.clone(), + } + } +} + +impl ScreenLike for DashPayComingSoonScreen { + fn ui(&mut self, ctx: &Context) -> AppAction { + let mut action = add_top_panel( + ctx, + &self.app_context, + vec![ + ("Contracts", AppAction::GoToMainScreen), + ("DashPay", AppAction::None), + ], + vec![], + ); + + // Keep Contracts highlighted in the main left panel + action |= add_left_panel( + ctx, + &self.app_context, + RootScreenType::RootScreenDocumentQuery, + ); + + // Contracts sub-left panel + action |= crate::ui::components::contracts_subscreen_chooser_panel::add_contracts_subscreen_chooser_panel( + ctx, + &self.app_context, + ); + + action |= island_central_panel(ctx, |ui| { + ui.vertical_centered(|ui| { + ui.add_space(40.0); + ui.heading("Coming Soon"); + ui.add_space(20.0); + }); + AppAction::None + }); + + action + } +} diff --git a/src/ui/contracts_documents/document_action_screen.rs b/src/ui/contracts_documents/document_action_screen.rs index ae35c0826..c43c300b2 100644 --- a/src/ui/contracts_documents/document_action_screen.rs +++ b/src/ui/contracts_documents/document_action_screen.rs @@ -1470,6 +1470,12 @@ impl ScreenLike for DocumentActionScreen { crate::ui::RootScreenType::RootScreenDocumentQuery, ); + // Contracts sub-left panel + action |= crate::ui::components::contracts_subscreen_chooser_panel::add_contracts_subscreen_chooser_panel( + ctx, + &self.app_context, + ); + action |= island_central_panel(ctx, |ui| match &self.broadcast_status { BroadcastStatus::Broadcasted => { let success_message = format!("{} successful!", self.action_type.display_name()); diff --git a/src/ui/contracts_documents/group_actions_screen.rs b/src/ui/contracts_documents/group_actions_screen.rs index a7b24b695..5e40ce43c 100644 --- a/src/ui/contracts_documents/group_actions_screen.rs +++ b/src/ui/contracts_documents/group_actions_screen.rs @@ -489,6 +489,12 @@ impl ScreenLike for GroupActionsScreen { RootScreenType::RootScreenDocumentQuery, ); + // Contracts sub-left panel + action |= crate::ui::components::contracts_subscreen_chooser_panel::add_contracts_subscreen_chooser_panel( + ctx, + &self.app_context, + ); + let central_panel_action = island_central_panel(ctx, |ui| { ui.heading("Active Group Actions"); diff --git a/src/ui/contracts_documents/mod.rs b/src/ui/contracts_documents/mod.rs index 47ce18225..07011f768 100644 --- a/src/ui/contracts_documents/mod.rs +++ b/src/ui/contracts_documents/mod.rs @@ -1,5 +1,6 @@ pub mod add_contracts_screen; pub mod contracts_documents_screen; +pub mod dashpay_coming_soon_screen; pub mod document_action_screen; pub mod group_actions_screen; pub mod register_contract_screen; diff --git a/src/ui/contracts_documents/register_contract_screen.rs b/src/ui/contracts_documents/register_contract_screen.rs index 71a8b7048..b8386ffb6 100644 --- a/src/ui/contracts_documents/register_contract_screen.rs +++ b/src/ui/contracts_documents/register_contract_screen.rs @@ -322,6 +322,12 @@ impl ScreenLike for RegisterDataContractScreen { crate::ui::RootScreenType::RootScreenDocumentQuery, ); + // Contracts sub-left panel + action |= crate::ui::components::contracts_subscreen_chooser_panel::add_contracts_subscreen_chooser_panel( + ctx, + &self.app_context, + ); + action |= island_central_panel(ctx, |ui| { if self.broadcast_status == BroadcastStatus::Done { return self.show_success(ui); diff --git a/src/ui/contracts_documents/update_contract_screen.rs b/src/ui/contracts_documents/update_contract_screen.rs index 5c52dc131..6e9bc0c33 100644 --- a/src/ui/contracts_documents/update_contract_screen.rs +++ b/src/ui/contracts_documents/update_contract_screen.rs @@ -364,6 +364,12 @@ impl ScreenLike for UpdateDataContractScreen { crate::ui::RootScreenType::RootScreenDocumentQuery, ); + // Contracts sub-left panel + action |= crate::ui::components::contracts_subscreen_chooser_panel::add_contracts_subscreen_chooser_panel( + ctx, + &self.app_context, + ); + action |= island_central_panel(ctx, |ui| { if self.broadcast_status == BroadcastStatus::Done { return self.show_success(ui); diff --git a/src/ui/dpns/dpns_contested_names_screen.rs b/src/ui/dpns/dpns_contested_names_screen.rs index 43195990c..8d57232c3 100644 --- a/src/ui/dpns/dpns_contested_names_screen.rs +++ b/src/ui/dpns/dpns_contested_names_screen.rs @@ -17,6 +17,7 @@ use crate::backend_task::identity::IdentityTask; use crate::context::AppContext; use crate::model::contested_name::{ContestState, ContestedName}; use crate::model::qualified_identity::{DPNSNameInfo, QualifiedIdentity}; +use crate::ui::components::contracts_subscreen_chooser_panel::add_contracts_subscreen_chooser_panel; use crate::ui::components::dpns_subscreen_chooser_panel::add_dpns_subscreen_chooser_panel; use crate::ui::components::left_panel::add_left_panel; use crate::ui::components::styled::{StyledButton, island_central_panel}; @@ -383,15 +384,15 @@ impl DPNSScreen { .striped(false) .resizable(true) .cell_layout(egui::Layout::left_to_right(egui::Align::Center)) - .column(Column::initial(200.0).resizable(true)) // Contested Name - .column(Column::initial(100.0).resizable(true)) // Locked - .column(Column::initial(100.0).resizable(true)) // Abstain - .column(Column::initial(200.0).resizable(true)) // Ending Time - .column(Column::initial(200.0).resizable(true)) // Last Updated - .column(Column::remainder()) // Contestants + .column(Column::auto().resizable(true)) // Contested Name + .column(Column::auto().resizable(true)) // Locked + .column(Column::auto().resizable(true)) // Abstain + .column(Column::auto().resizable(true)) // Ending Time + .column(Column::auto().resizable(true)) // Last Updated + .column(Column::auto().resizable(true)) // Contestants .header(30.0, |mut header| { header.col(|ui| { - if ui.button("Contested Name").clicked() { + if ui.button("Name").clicked() { self.toggle_sort(SortColumn::ContestedName); } }); @@ -491,10 +492,13 @@ impl DPNSScreen { // LOCK button row.col(|ui| { let label_text = format!("{}", locked_votes); + let dark_green = Color32::from_rgb(0, 100, 0); + let dark_mode = ui.ctx().style().visuals.dark_mode; + let normal_color = DashColors::text_primary(dark_mode); let text_widget = if is_locked_votes_bold { - RichText::new(label_text).strong() + RichText::new(label_text).strong().color(dark_green) } else { - RichText::new(label_text) + RichText::new(label_text).color(normal_color) }; // See if this (LOCK) is selected @@ -708,13 +712,13 @@ impl DPNSScreen { .striped(false) .resizable(true) .cell_layout(egui::Layout::left_to_right(egui::Align::Center)) - .column(Column::initial(200.0).resizable(true)) // Name - .column(Column::initial(200.0).resizable(true)) // Ended Time - .column(Column::initial(200.0).resizable(true)) // Last Updated - .column(Column::initial(200.0).resizable(true)) // Awarded To + .column(Column::auto().resizable(true)) // Name + .column(Column::auto().resizable(true)) // Ended Time + .column(Column::auto().resizable(true)) // Last Updated + .column(Column::auto().resizable(true)) // Awarded To .header(30.0, |mut header| { header.col(|ui| { - if ui.button("Contested Name").clicked() { + if ui.button("Name").clicked() { self.toggle_sort(SortColumn::ContestedName); } }); @@ -895,9 +899,9 @@ impl DPNSScreen { .striped(false) .resizable(true) .cell_layout(egui::Layout::left_to_right(egui::Align::Center)) - .column(Column::initial(200.0).resizable(true)) // DPNS Name - .column(Column::initial(400.0).resizable(true)) // Owner ID - .column(Column::initial(300.0).resizable(true)) // Acquired At + .column(Column::auto().resizable(true)) // DPNS Name + .column(Column::auto().resizable(true)) // Owner ID + .column(Column::auto().resizable(true)) // Acquired At .header(30.0, |mut header| { header.col(|ui| { if ui.button("Name").clicked() { @@ -972,15 +976,15 @@ impl DPNSScreen { .striped(false) .resizable(true) .cell_layout(egui::Layout::left_to_right(egui::Align::Center)) - .column(Column::initial(100.0).resizable(true)) // ContestedName - .column(Column::initial(200.0).resizable(true)) // Voter - .column(Column::initial(200.0).resizable(true)) // Choice - .column(Column::initial(200.0).resizable(true)) // Time - .column(Column::initial(100.0).resizable(true)) // Status - .column(Column::initial(100.0).resizable(true)) // Actions + .column(Column::auto().resizable(true)) // ContestedName + .column(Column::auto().resizable(true)) // Voter + .column(Column::auto().resizable(true)) // Choice + .column(Column::auto().resizable(true)) // Time + .column(Column::auto().resizable(true)) // Status + .column(Column::auto().resizable(true)) // Actions .header(30.0, |mut header| { header.col(|ui| { - if ui.button("Contested Name").clicked() { + if ui.button("Name").clicked() { self.toggle_sort(SortColumn::ContestedName); } }); @@ -2014,7 +2018,10 @@ impl ScreenLike for DPNSScreen { } } - // Subscreen chooser + // Contracts area chooser (DPNS / DashPay / Contracts) + action |= add_contracts_subscreen_chooser_panel(ctx, self.app_context.as_ref()); + + // DPNS subscreen chooser action |= add_dpns_subscreen_chooser_panel(ctx, self.app_context.as_ref()); // Main panel diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 415ca385f..3a5ee7903 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -30,6 +30,7 @@ use crate::ui::tools::proof_visualizer_screen::ProofVisualizerScreen; use crate::ui::wallets::import_wallet_screen::ImportWalletScreen; use crate::ui::wallets::wallets_screen::WalletsBalancesScreen; use contracts_documents::add_contracts_screen::AddContractsScreen; +use contracts_documents::dashpay_coming_soon_screen::DashPayComingSoonScreen; use contracts_documents::group_actions_screen::GroupActionsScreen; use contracts_documents::register_contract_screen::RegisterDataContractScreen; use contracts_documents::update_contract_screen::UpdateDataContractScreen; @@ -91,6 +92,7 @@ pub enum RootScreenType { RootScreenToolsMasternodeListDiffScreen, RootScreenToolsContractVisualizerScreen, RootScreenToolsPlatformInfoScreen, + RootScreenContractsDashPay, } impl RootScreenType { @@ -116,6 +118,7 @@ impl RootScreenType { RootScreenType::RootScreenToolsContractVisualizerScreen => 16, RootScreenType::RootScreenToolsPlatformInfoScreen => 17, RootScreenType::RootScreenToolsMasternodeListDiffScreen => 18, + RootScreenType::RootScreenContractsDashPay => 19, } } @@ -141,6 +144,7 @@ impl RootScreenType { 16 => Some(RootScreenType::RootScreenToolsContractVisualizerScreen), 17 => Some(RootScreenType::RootScreenToolsPlatformInfoScreen), 18 => Some(RootScreenType::RootScreenToolsMasternodeListDiffScreen), + 19 => Some(RootScreenType::RootScreenContractsDashPay), _ => None, } } @@ -175,6 +179,7 @@ impl From for ScreenType { ScreenType::ContractsVisualizer } RootScreenType::RootScreenToolsPlatformInfoScreen => ScreenType::PlatformInfo, + RootScreenType::RootScreenContractsDashPay => ScreenType::ContractsDashPayComingSoon, } } } @@ -215,6 +220,7 @@ pub enum ScreenType { DocumentsVisualizer, ContractsVisualizer, PlatformInfo, + ContractsDashPayComingSoon, CreateDocument, DeleteDocument, ReplaceDocument, @@ -331,6 +337,9 @@ impl ScreenType { ScreenType::PlatformInfo => { Screen::PlatformInfoScreen(PlatformInfoScreen::new(app_context)) } + ScreenType::ContractsDashPayComingSoon => { + Screen::DashPayComingSoonScreen(DashPayComingSoonScreen::new(app_context)) + } ScreenType::CreateDocument => Screen::DocumentActionScreen(DocumentActionScreen::new( app_context.clone(), None, @@ -432,6 +441,7 @@ pub enum Screen { IdentitiesScreen(IdentitiesScreen), DPNSScreen(DPNSScreen), DocumentQueryScreen(DocumentQueryScreen), + DashPayComingSoonScreen(DashPayComingSoonScreen), AddNewWalletScreen(AddNewWalletScreen), ImportWalletScreen(ImportWalletScreen), AddNewIdentityScreen(AddNewIdentityScreen), @@ -481,6 +491,7 @@ impl Screen { match self { Screen::IdentitiesScreen(screen) => screen.app_context = app_context, Screen::DPNSScreen(screen) => screen.app_context = app_context, + Screen::DashPayComingSoonScreen(screen) => screen.app_context = app_context, Screen::AddExistingIdentityScreen(screen) => screen.app_context = app_context, Screen::KeyInfoScreen(screen) => screen.app_context = app_context, Screen::KeysScreen(screen) => screen.app_context = app_context, @@ -599,6 +610,7 @@ impl Screen { dpns_subscreen: DPNSSubscreen::ScheduledVotes, .. }) => ScreenType::ScheduledVotes, + Screen::DashPayComingSoonScreen(_) => ScreenType::ContractsDashPayComingSoon, Screen::TransitionVisualizerScreen(_) => ScreenType::TransitionVisualizer, Screen::ContractVisualizerScreen(_) => ScreenType::ContractsVisualizer, Screen::WithdrawalScreen(screen) => { @@ -704,6 +716,7 @@ impl ScreenLike for Screen { Screen::IdentitiesScreen(screen) => screen.refresh(), Screen::DPNSScreen(screen) => screen.refresh(), Screen::DocumentQueryScreen(screen) => screen.refresh(), + Screen::DashPayComingSoonScreen(screen) => screen.refresh(), Screen::AddNewWalletScreen(screen) => screen.refresh(), Screen::ImportWalletScreen(screen) => screen.refresh(), Screen::AddNewIdentityScreen(screen) => screen.refresh(), @@ -754,6 +767,7 @@ impl ScreenLike for Screen { Screen::IdentitiesScreen(screen) => screen.refresh_on_arrival(), Screen::DPNSScreen(screen) => screen.refresh_on_arrival(), Screen::DocumentQueryScreen(screen) => screen.refresh_on_arrival(), + Screen::DashPayComingSoonScreen(screen) => screen.refresh_on_arrival(), Screen::AddNewWalletScreen(screen) => screen.refresh_on_arrival(), Screen::ImportWalletScreen(screen) => screen.refresh_on_arrival(), Screen::AddNewIdentityScreen(screen) => screen.refresh_on_arrival(), @@ -804,6 +818,7 @@ impl ScreenLike for Screen { Screen::IdentitiesScreen(screen) => screen.ui(ctx), Screen::DPNSScreen(screen) => screen.ui(ctx), Screen::DocumentQueryScreen(screen) => screen.ui(ctx), + Screen::DashPayComingSoonScreen(screen) => screen.ui(ctx), Screen::AddNewWalletScreen(screen) => screen.ui(ctx), Screen::ImportWalletScreen(screen) => screen.ui(ctx), Screen::AddNewIdentityScreen(screen) => screen.ui(ctx), @@ -854,6 +869,9 @@ impl ScreenLike for Screen { Screen::IdentitiesScreen(screen) => screen.display_message(message, message_type), Screen::DPNSScreen(screen) => screen.display_message(message, message_type), Screen::DocumentQueryScreen(screen) => screen.display_message(message, message_type), + Screen::DashPayComingSoonScreen(screen) => { + screen.display_message(message, message_type) + } Screen::AddNewWalletScreen(screen) => screen.display_message(message, message_type), Screen::ImportWalletScreen(screen) => screen.display_message(message, message_type), Screen::AddNewIdentityScreen(screen) => screen.display_message(message, message_type), @@ -926,6 +944,9 @@ impl ScreenLike for Screen { Screen::DocumentQueryScreen(screen) => { screen.display_task_result(backend_task_success_result) } + Screen::DashPayComingSoonScreen(screen) => { + screen.display_task_result(backend_task_success_result) + } Screen::AddNewWalletScreen(screen) => { screen.display_task_result(backend_task_success_result) } @@ -1048,6 +1069,7 @@ impl ScreenLike for Screen { Screen::IdentitiesScreen(screen) => screen.pop_on_success(), Screen::DPNSScreen(screen) => screen.pop_on_success(), Screen::DocumentQueryScreen(screen) => screen.pop_on_success(), + Screen::DashPayComingSoonScreen(screen) => screen.pop_on_success(), Screen::AddNewWalletScreen(screen) => screen.pop_on_success(), Screen::ImportWalletScreen(screen) => screen.pop_on_success(), Screen::AddNewIdentityScreen(screen) => screen.pop_on_success(), diff --git a/src/ui/network_chooser_screen.rs b/src/ui/network_chooser_screen.rs index 6365f9554..309a72abf 100644 --- a/src/ui/network_chooser_screen.rs +++ b/src/ui/network_chooser_screen.rs @@ -731,7 +731,7 @@ impl ScreenLike for NetworkChooserScreen { action |= island_central_panel(ctx, |ui| { egui::ScrollArea::vertical() - .auto_shrink([false; 2]) + .auto_shrink([true; 2]) .show(ui, |ui| self.render_network_table(ui)) .inner }); diff --git a/src/ui/wallets/wallets_screen/mod.rs b/src/ui/wallets/wallets_screen/mod.rs index b9ef9b18f..30db7e648 100644 --- a/src/ui/wallets/wallets_screen/mod.rs +++ b/src/ui/wallets/wallets_screen/mod.rs @@ -848,7 +848,7 @@ impl ScreenLike for WalletsBalancesScreen { } egui::ScrollArea::vertical() - .auto_shrink([false; 2]) + .auto_shrink([true; 2]) .show(ui, |ui| { if self.app_context.wallets.read().unwrap().is_empty() { self.render_no_wallets_view(ui);