side_panel: return more detailed side panel responses

We should be treating all ui widgets as pure functions that do not
mutate anything. This will make testing easier, as well as avoiding
shared mutable references.

Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
William Casarin 2024-05-28 15:00:57 -07:00
parent 31b2b5c950
commit 92ce718e8b
2 changed files with 26 additions and 7 deletions

View File

@ -867,16 +867,16 @@ fn timelines_view(ui: &mut egui::Ui, sizes: Size, app: &mut Damus, timelines: us
.clip(true)
.horizontal(|mut strip| {
strip.cell(|ui| {
if DesktopSidePanel::new(
let side_panel = DesktopSidePanel::new(
app.account_manager
.get_selected_account()
.map(|a| a.pubkey.bytes()),
SimpleProfilePreviewController::new(&app.ndb, &mut app.img_cache),
)
.show(ui)
.clicked()
{
// clicked pfp
.show(ui);
if side_panel.response.clicked() {
info!("clicked {:?}", side_panel.action);
}
});

View File

@ -9,9 +9,28 @@ pub struct DesktopSidePanel<'a> {
simple_preview_controller: SimpleProfilePreviewController<'a>,
}
#[derive(Debug, Eq, PartialEq, Clone, Copy)]
pub enum SidePanelAction {
Panel,
Account,
Settings,
Columns,
}
pub struct SidePanelResponse {
pub response: egui::Response,
pub action: SidePanelAction,
}
impl SidePanelResponse {
fn new(action: SidePanelAction, response: egui::Response) -> Self {
SidePanelResponse { action, response }
}
}
impl<'a> Widget for DesktopSidePanel<'a> {
fn ui(self, ui: &mut egui::Ui) -> egui::Response {
self.show(ui)
self.show(ui).response
}
}
@ -32,7 +51,7 @@ impl<'a> DesktopSidePanel<'a> {
.exact_width(40.0)
}
pub fn show(self, ui: &mut egui::Ui) -> egui::Response {
pub fn show(self, ui: &mut egui::Ui) -> SidePanelResponse {
let dark_mode = ui.ctx().style().visuals.dark_mode;
let spacing_amt = 16.0;