AccountSelectionWidget
Will be useful for selecting an account for the 'Add Column' view Signed-off-by: kernelkind <kernelkind@gmail.com> Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
committed by
William Casarin
parent
e9c3596067
commit
bb25fd4ae1
@@ -53,6 +53,35 @@ impl<'a> SimpleProfilePreviewController<'a> {
|
|||||||
|
|
||||||
to_remove
|
to_remove
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn view_profile_previews(
|
||||||
|
&mut self,
|
||||||
|
account_manager: &'a AccountManager<'a>,
|
||||||
|
ui: &mut egui::Ui,
|
||||||
|
add_preview_ui: fn(ui: &mut egui::Ui, preview: SimpleProfilePreview, index: usize) -> bool,
|
||||||
|
) -> Option<usize> {
|
||||||
|
let mut clicked_at: Option<usize> = None;
|
||||||
|
|
||||||
|
for i in 0..account_manager.num_accounts() {
|
||||||
|
if let Some(account) = account_manager.get_account(i) {
|
||||||
|
if let Ok(txn) = Transaction::new(self.ndb) {
|
||||||
|
let profile = self
|
||||||
|
.ndb
|
||||||
|
.get_profile_by_pubkey(&txn, &account.key.public_key().to_bytes());
|
||||||
|
|
||||||
|
if let Ok(profile) = profile {
|
||||||
|
let preview = SimpleProfilePreview::new(&profile, self.img_cache);
|
||||||
|
|
||||||
|
if add_preview_ui(ui, preview, i) {
|
||||||
|
clicked_at = Some(i)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
clicked_at
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The interface for managing the user's accounts.
|
/// The interface for managing the user's accounts.
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
use egui::{Align, Align2, Button, Frame, Layout, Margin, RichText, ScrollArea, Vec2, Window};
|
use egui::{
|
||||||
|
Align, Align2, Button, Frame, Id, Layout, Margin, RichText, ScrollArea, Sense, Vec2, Window,
|
||||||
|
};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
account_manager::{AccountManager, SimpleProfilePreviewController},
|
account_manager::{AccountManager, SimpleProfilePreviewController, UserAccount},
|
||||||
app_style::NotedeckTextStyle,
|
app_style::NotedeckTextStyle,
|
||||||
ui::{self, Preview, View},
|
ui::{self, Preview, View},
|
||||||
};
|
};
|
||||||
@@ -237,6 +239,56 @@ fn delete_button(_dark_mode: bool) -> egui::Button<'static> {
|
|||||||
egui::Button::image(egui::Image::new(img_data).max_width(30.0)).frame(true)
|
egui::Button::image(egui::Image::new(img_data).max_width(30.0)).frame(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct AccountSelectionWidget<'a> {
|
||||||
|
account_manager: AccountManager<'a>,
|
||||||
|
simple_preview_controller: SimpleProfilePreviewController<'a>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> AccountSelectionWidget<'a> {
|
||||||
|
fn ui(&'a mut self, ui: &mut egui::Ui) -> Option<&'a UserAccount> {
|
||||||
|
let mut result: Option<&'a UserAccount> = None;
|
||||||
|
scroll_area().show(ui, |ui| {
|
||||||
|
ui.horizontal_wrapped(|ui| {
|
||||||
|
let clicked_at = self.simple_preview_controller.view_profile_previews(
|
||||||
|
&self.account_manager,
|
||||||
|
ui,
|
||||||
|
|ui, preview, index| {
|
||||||
|
let resp = ui.add_sized(preview.dimensions(), |ui: &mut egui::Ui| {
|
||||||
|
simple_preview_frame(ui)
|
||||||
|
.show(ui, |ui| {
|
||||||
|
ui.vertical_centered(|ui| {
|
||||||
|
ui.add(preview);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.response
|
||||||
|
});
|
||||||
|
|
||||||
|
ui.interact(resp.rect, Id::new(index), Sense::click())
|
||||||
|
.clicked()
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
if let Some(index) = clicked_at {
|
||||||
|
result = self.account_manager.get_account(index);
|
||||||
|
};
|
||||||
|
});
|
||||||
|
});
|
||||||
|
result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> AccountSelectionWidget<'a> {
|
||||||
|
pub fn new(
|
||||||
|
account_manager: AccountManager<'a>,
|
||||||
|
simple_preview_controller: SimpleProfilePreviewController<'a>,
|
||||||
|
) -> Self {
|
||||||
|
AccountSelectionWidget {
|
||||||
|
account_manager,
|
||||||
|
simple_preview_controller,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// PREVIEWS
|
// PREVIEWS
|
||||||
|
|
||||||
mod preview {
|
mod preview {
|
||||||
@@ -246,9 +298,22 @@ mod preview {
|
|||||||
use super::*;
|
use super::*;
|
||||||
use crate::key_storage::KeyStorage;
|
use crate::key_storage::KeyStorage;
|
||||||
use crate::relay_generation::RelayGenerator;
|
use crate::relay_generation::RelayGenerator;
|
||||||
use crate::{account_manager::UserAccount, imgcache::ImageCache, test_data};
|
use crate::{imgcache::ImageCache, test_data};
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
|
const ACCOUNT_HEXES: [&str; 10] = [
|
||||||
|
"3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681",
|
||||||
|
"32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245",
|
||||||
|
"bd1e19980e2c91e6dc657e92c25762ca882eb9272d2579e221f037f93788de91",
|
||||||
|
"5c10ed0678805156d39ef1ef6d46110fe1e7e590ae04986ccf48ba1299cb53e2",
|
||||||
|
"4c96d763eb2fe01910f7e7220b7c7ecdbe1a70057f344b9f79c28af080c3ee30",
|
||||||
|
"edf16b1dd61eab353a83af470cc13557029bff6827b4cb9b7fc9bdb632a2b8e6",
|
||||||
|
"3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681",
|
||||||
|
"32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245",
|
||||||
|
"32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245",
|
||||||
|
"32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245",
|
||||||
|
];
|
||||||
|
|
||||||
pub struct AccountManagementPreview {
|
pub struct AccountManagementPreview {
|
||||||
accounts: Vec<UserAccount>,
|
accounts: Vec<UserAccount>,
|
||||||
ndb: Ndb,
|
ndb: Ndb,
|
||||||
@@ -256,41 +321,36 @@ mod preview {
|
|||||||
edit_mode: bool,
|
edit_mode: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_accounts() -> Vec<UserAccount> {
|
||||||
|
ACCOUNT_HEXES
|
||||||
|
.iter()
|
||||||
|
.map(|account_hex| {
|
||||||
|
let key = Keys::from_public_key(PublicKey::from_hex(account_hex).unwrap());
|
||||||
|
|
||||||
|
UserAccount {
|
||||||
|
key,
|
||||||
|
relays: test_data::sample_pool(),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_ndb_and_img_cache() -> (Ndb, ImageCache) {
|
||||||
|
let mut config = Config::new();
|
||||||
|
config.set_ingester_threads(2);
|
||||||
|
|
||||||
|
let db_dir = Path::new(".");
|
||||||
|
let path = db_dir.to_str().unwrap();
|
||||||
|
let ndb = Ndb::new(path, &config).expect("ndb");
|
||||||
|
let imgcache_dir = db_dir.join("cache/img");
|
||||||
|
let img_cache = ImageCache::new(imgcache_dir);
|
||||||
|
(ndb, img_cache)
|
||||||
|
}
|
||||||
|
|
||||||
impl AccountManagementPreview {
|
impl AccountManagementPreview {
|
||||||
fn new() -> Self {
|
fn new() -> Self {
|
||||||
let account_hexes = [
|
let accounts = get_accounts();
|
||||||
"3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681",
|
let (ndb, img_cache) = get_ndb_and_img_cache();
|
||||||
"32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245",
|
|
||||||
"bd1e19980e2c91e6dc657e92c25762ca882eb9272d2579e221f037f93788de91",
|
|
||||||
"5c10ed0678805156d39ef1ef6d46110fe1e7e590ae04986ccf48ba1299cb53e2",
|
|
||||||
"4c96d763eb2fe01910f7e7220b7c7ecdbe1a70057f344b9f79c28af080c3ee30",
|
|
||||||
"edf16b1dd61eab353a83af470cc13557029bff6827b4cb9b7fc9bdb632a2b8e6",
|
|
||||||
"3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681",
|
|
||||||
"32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245",
|
|
||||||
"32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245",
|
|
||||||
"32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245",
|
|
||||||
];
|
|
||||||
|
|
||||||
let accounts: Vec<UserAccount> = account_hexes
|
|
||||||
.iter()
|
|
||||||
.map(|account_hex| {
|
|
||||||
let key = Keys::from_public_key(PublicKey::from_hex(account_hex).unwrap());
|
|
||||||
|
|
||||||
UserAccount {
|
|
||||||
key,
|
|
||||||
relays: test_data::sample_pool(),
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
let mut config = Config::new();
|
|
||||||
config.set_ingester_threads(2);
|
|
||||||
|
|
||||||
let db_dir = Path::new(".");
|
|
||||||
let path = db_dir.to_str().unwrap();
|
|
||||||
let ndb = Ndb::new(path, &config).expect("ndb");
|
|
||||||
let imgcache_dir = db_dir.join("cache/img");
|
|
||||||
let img_cache = ImageCache::new(imgcache_dir);
|
|
||||||
|
|
||||||
AccountManagementPreview {
|
AccountManagementPreview {
|
||||||
accounts,
|
accounts,
|
||||||
@@ -325,4 +385,49 @@ mod preview {
|
|||||||
AccountManagementPreview::new()
|
AccountManagementPreview::new()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct AccountSelectionPreview {
|
||||||
|
accounts: Vec<UserAccount>,
|
||||||
|
ndb: Ndb,
|
||||||
|
img_cache: ImageCache,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AccountSelectionPreview {
|
||||||
|
fn new() -> Self {
|
||||||
|
let accounts = get_accounts();
|
||||||
|
let (ndb, img_cache) = get_ndb_and_img_cache();
|
||||||
|
AccountSelectionPreview {
|
||||||
|
accounts,
|
||||||
|
ndb,
|
||||||
|
img_cache,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl View for AccountSelectionPreview {
|
||||||
|
fn ui(&mut self, ui: &mut egui::Ui) {
|
||||||
|
let account_manager = AccountManager::new(
|
||||||
|
&mut self.accounts,
|
||||||
|
KeyStorage::None,
|
||||||
|
RelayGenerator::Constant,
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut widget = AccountSelectionWidget::new(
|
||||||
|
account_manager,
|
||||||
|
SimpleProfilePreviewController::new(&self.ndb, &mut self.img_cache),
|
||||||
|
);
|
||||||
|
|
||||||
|
if let Some(account) = widget.ui(ui) {
|
||||||
|
println!("User made selection: {:?}", account.key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Preview for AccountSelectionWidget<'a> {
|
||||||
|
type Prev = AccountSelectionPreview;
|
||||||
|
|
||||||
|
fn preview() -> Self::Prev {
|
||||||
|
AccountSelectionPreview::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ pub mod profile;
|
|||||||
pub mod relay;
|
pub mod relay;
|
||||||
pub mod username;
|
pub mod username;
|
||||||
|
|
||||||
pub use account_management::AccountManagementView;
|
pub use account_management::{AccountManagementView, AccountSelectionWidget};
|
||||||
pub use mention::Mention;
|
pub use mention::Mention;
|
||||||
pub use note::Note;
|
pub use note::Note;
|
||||||
pub use preview::{Preview, PreviewApp};
|
pub use preview::{Preview, PreviewApp};
|
||||||
|
|||||||
@@ -3,7 +3,8 @@ use notedeck::app_creation::{
|
|||||||
};
|
};
|
||||||
use notedeck::ui::account_login_view::AccountLoginView;
|
use notedeck::ui::account_login_view::AccountLoginView;
|
||||||
use notedeck::ui::{
|
use notedeck::ui::{
|
||||||
AccountManagementView, Preview, PreviewApp, ProfilePic, ProfilePreview, RelayView,
|
AccountManagementView, AccountSelectionWidget, Preview, PreviewApp, ProfilePic, ProfilePreview,
|
||||||
|
RelayView,
|
||||||
};
|
};
|
||||||
use std::env;
|
use std::env;
|
||||||
|
|
||||||
@@ -86,5 +87,6 @@ async fn main() {
|
|||||||
ProfilePreview,
|
ProfilePreview,
|
||||||
ProfilePic,
|
ProfilePic,
|
||||||
AccountManagementView,
|
AccountManagementView,
|
||||||
|
AccountSelectionWidget,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user