notedeck

One damus client to rule them all
git clone git://jb55.com/notedeck
Log | Files | Refs | README | LICENSE

commit 32c7f83bd7a807155de6a13b66a7d43f48c25e13
parent dfa4b24b7d76fdab387abd35a844712b38325e06
Author: William Casarin <jb55@jb55.com>
Date:   Fri, 21 Feb 2025 12:12:35 -0800

Merge hide nsec in account panel

jglad (2):
      fix compilation
      hide nsec in account panel

Diffstat:
Aassets/icons/eye-dark.png | 0
Aassets/icons/eye-light.png | 0
Aassets/icons/eye-slash-dark.png | 0
Aassets/icons/eye-slash-light.png | 0
Mcrates/notedeck_columns/src/login_manager.rs | 9+++++++++
Mcrates/notedeck_columns/src/ui/account_login_view.rs | 40++++++++++++++++++++++++++++++++++++----
Mcrates/notedeck_columns/src/ui/search_results.rs | 2+-
7 files changed, 46 insertions(+), 5 deletions(-)

diff --git a/assets/icons/eye-dark.png b/assets/icons/eye-dark.png Binary files differ. diff --git a/assets/icons/eye-light.png b/assets/icons/eye-light.png Binary files differ. diff --git a/assets/icons/eye-slash-dark.png b/assets/icons/eye-slash-dark.png Binary files differ. diff --git a/assets/icons/eye-slash-light.png b/assets/icons/eye-slash-light.png Binary files differ. diff --git a/crates/notedeck_columns/src/login_manager.rs b/crates/notedeck_columns/src/login_manager.rs @@ -12,6 +12,7 @@ pub struct AcquireKeyState { error: Option<AcquireKeyError>, key_on_error: Option<String>, should_create_new: bool, + show_password: bool, } impl<'a> AcquireKeyState { @@ -115,6 +116,14 @@ impl<'a> AcquireKeyState { ui.add_space(8.0); } + + pub fn toggle_password_visibility(&mut self) { + self.show_password = !self.show_password; + } + + pub fn password_visible(&self) -> bool { + self.show_password + } } fn show_error(ui: &mut egui::Ui, err: &AcquireKeyError) { diff --git a/crates/notedeck_columns/src/ui/account_login_view.rs b/crates/notedeck_columns/src/ui/account_login_view.rs @@ -1,6 +1,8 @@ use crate::login_manager::AcquireKeyState; use crate::ui::{Preview, PreviewConfig}; -use egui::{Align, Button, Color32, Frame, InnerResponse, Margin, RichText, Vec2}; +use egui::{ + Align, Button, Color32, Frame, Image, InnerResponse, Margin, RichText, TextBuffer, Vec2, +}; use egui::{Layout, TextEdit}; use enostr::Keypair; use notedeck::fonts::get_font_size; @@ -38,7 +40,16 @@ impl<'a> AccountLoginView<'a> { }); ui.vertical_centered_justified(|ui| { - ui.add(login_textedit(self.manager)); + ui.horizontal(|ui| { + let available_width = ui.available_width(); + let button_width = 32.0; + let text_edit_width = available_width - button_width; + + ui.add_sized([text_edit_width, 40.0], login_textedit(self.manager)); + if eye_button(ui, self.manager.password_visible()).clicked() { + self.manager.toggle_password_visibility(); + } + }); ui.with_layout(Layout::left_to_right(Align::TOP), |ui| { let help_text_style = NotedeckTextStyle::Small; ui.add(egui::Label::new( @@ -105,7 +116,7 @@ fn login_button() -> Button<'static> { } fn login_textedit(manager: &mut AcquireKeyState) -> TextEdit { - manager.get_acquire_textedit(|text| { + let create_textedit: fn(&mut dyn TextBuffer) -> TextEdit = |text| { egui::TextEdit::singleline(text) .hint_text( RichText::new("Your key here...").text_style(NotedeckTextStyle::Body.text_style()), @@ -113,7 +124,28 @@ fn login_textedit(manager: &mut AcquireKeyState) -> TextEdit { .vertical_align(Align::Center) .min_size(Vec2::new(0.0, 40.0)) .margin(Margin::same(12.0)) - }) + }; + + let is_visible = manager.password_visible(); + let mut text_edit = manager.get_acquire_textedit(create_textedit); + if !is_visible { + text_edit = text_edit.password(true); + } + text_edit +} + +fn eye_button(ui: &mut egui::Ui, is_visible: bool) -> egui::Response { + let is_dark_mode = ui.visuals().dark_mode; + let icon = Image::new(if is_visible && is_dark_mode { + egui::include_image!("../../../../assets/icons/eye-dark.png") + } else if is_visible { + egui::include_image!("../../../../assets/icons/eye-light.png") + } else if is_dark_mode { + egui::include_image!("../../../../assets/icons/eye-slash-dark.png") + } else { + egui::include_image!("../../../../assets/icons/eye-slash-light.png") + }); + ui.add(Button::image(icon).frame(false)) } mod preview { diff --git a/crates/notedeck_columns/src/ui/search_results.rs b/crates/notedeck_columns/src/ui/search_results.rs @@ -87,7 +87,7 @@ fn user_result<'a>( cache: &'a mut ImageCache, index: usize, width: f32, -) -> impl egui::Widget + use<'a> { +) -> impl egui::Widget + 'a { move |ui: &mut egui::Ui| -> egui::Response { let min_img_size = 48.0; let max_image = min_img_size * ICON_EXPANSION_MULTIPLE;