use popup sheet for CustomZapView
Signed-off-by: kernelkind <kernelkind@gmail.com>
This commit is contained in:
@@ -524,7 +524,7 @@ fn chrome_handle_app_action(
|
||||
if let Some(action) = m_action {
|
||||
let col = cols.column_mut(0);
|
||||
|
||||
action.process(col.router_mut());
|
||||
action.process(&mut col.router, &mut col.sheet_router);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,6 +40,7 @@ fn execute_note_action(
|
||||
global_wallet: &mut GlobalWallet,
|
||||
zaps: &mut Zaps,
|
||||
images: &mut Images,
|
||||
router_type: RouterType,
|
||||
ui: &mut egui::Ui,
|
||||
) -> NoteActionResponse {
|
||||
let mut timeline_res = None;
|
||||
@@ -94,6 +95,10 @@ fn execute_note_action(
|
||||
break 'a;
|
||||
};
|
||||
|
||||
if let RouterType::Sheet = router_type {
|
||||
router_action = Some(RouterAction::GoBack);
|
||||
}
|
||||
|
||||
send_zap(
|
||||
&sender,
|
||||
zaps,
|
||||
@@ -105,7 +110,7 @@ fn execute_note_action(
|
||||
ZapAction::ClearError(target) => clear_zap_error(&sender, zaps, target),
|
||||
ZapAction::CustomizeAmount(target) => {
|
||||
let route = Route::CustomizeZapAmount(target.to_owned());
|
||||
router_action = Some(RouterAction::route_to(route));
|
||||
router_action = Some(RouterAction::route_to_sheet(route));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -131,8 +136,8 @@ fn execute_note_action(
|
||||
pub fn execute_and_process_note_action(
|
||||
action: NoteAction,
|
||||
ndb: &Ndb,
|
||||
_columns: &mut Columns,
|
||||
_col: usize,
|
||||
columns: &mut Columns,
|
||||
col: usize,
|
||||
timeline_cache: &mut TimelineCache,
|
||||
note_cache: &mut NoteCache,
|
||||
pool: &mut RelayPool,
|
||||
@@ -144,6 +149,16 @@ pub fn execute_and_process_note_action(
|
||||
images: &mut Images,
|
||||
ui: &mut egui::Ui,
|
||||
) -> Option<RouterAction> {
|
||||
let router_type = {
|
||||
let sheet_router = &mut columns.column_mut(col).sheet_router;
|
||||
|
||||
if sheet_router.route().is_some() {
|
||||
RouterType::Sheet
|
||||
} else {
|
||||
RouterType::Stack
|
||||
}
|
||||
};
|
||||
|
||||
let resp = execute_note_action(
|
||||
action,
|
||||
ndb,
|
||||
@@ -155,6 +170,7 @@ pub fn execute_and_process_note_action(
|
||||
global_wallet,
|
||||
zaps,
|
||||
images,
|
||||
router_type,
|
||||
ui,
|
||||
);
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
use crate::{
|
||||
actionbar::TimelineOpenResult,
|
||||
route::{Route, Router},
|
||||
route::{Route, Router, SingletonRouter},
|
||||
timeline::{Timeline, TimelineCache, TimelineKind},
|
||||
};
|
||||
use enostr::RelayPool;
|
||||
@@ -11,13 +11,17 @@ use tracing::warn;
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Column {
|
||||
router: Router<Route>,
|
||||
pub router: Router<Route>,
|
||||
pub sheet_router: SingletonRouter<Route>,
|
||||
}
|
||||
|
||||
impl Column {
|
||||
pub fn new(routes: Vec<Route>) -> Self {
|
||||
let router = Router::new(routes);
|
||||
Column { router }
|
||||
Column {
|
||||
router,
|
||||
sheet_router: SingletonRouter::default(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn router(&self) -> &Router<Route> {
|
||||
|
||||
@@ -7,7 +7,7 @@ use crate::{
|
||||
profile::{ProfileAction, SaveProfileChanges},
|
||||
profile_state::ProfileState,
|
||||
relay_pool_manager::RelayPoolManager,
|
||||
route::{Route, Router},
|
||||
route::{Route, Router, SingletonRouter},
|
||||
timeline::{route::render_timeline_route, TimelineCache},
|
||||
ui::{
|
||||
self,
|
||||
@@ -25,7 +25,7 @@ use crate::{
|
||||
Damus,
|
||||
};
|
||||
|
||||
use egui_nav::{Nav, NavAction, NavResponse, NavUiType};
|
||||
use egui_nav::{Nav, NavAction, NavResponse, NavUiType, Percent, PopupResponse, PopupSheet};
|
||||
use nostrdb::Transaction;
|
||||
use notedeck::{
|
||||
get_current_default_msats, get_current_wallet, AccountsAction, AppContext, NoteAction,
|
||||
@@ -122,7 +122,10 @@ impl From<NoteAction> for RenderNavAction {
|
||||
}
|
||||
}
|
||||
|
||||
pub type NotedeckNavResponse = NavResponse<Option<RenderNavAction>>;
|
||||
enum NotedeckNavResponse {
|
||||
Popup(PopupResponse<Option<RenderNavAction>>),
|
||||
Nav(NavResponse<Option<RenderNavAction>>),
|
||||
}
|
||||
|
||||
pub struct RenderNavResponse {
|
||||
column: usize,
|
||||
@@ -142,10 +145,41 @@ impl RenderNavResponse {
|
||||
ctx: &mut AppContext<'_>,
|
||||
ui: &mut egui::Ui,
|
||||
) -> bool {
|
||||
process_nav_resp(app, ctx, ui, self.response, self.column)
|
||||
match self.response {
|
||||
NotedeckNavResponse::Popup(nav_action) => {
|
||||
process_popup_resp(nav_action, app, ctx, ui, self.column);
|
||||
false
|
||||
}
|
||||
NotedeckNavResponse::Nav(nav_response) => {
|
||||
process_nav_resp(app, ctx, ui, nav_response, self.column)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn process_popup_resp(
|
||||
action: PopupResponse<Option<RenderNavAction>>,
|
||||
app: &mut Damus,
|
||||
ctx: &mut AppContext<'_>,
|
||||
ui: &mut egui::Ui,
|
||||
col: usize,
|
||||
) -> bool {
|
||||
let mut switching_occured = false;
|
||||
if let Some(nav_action) = action.response {
|
||||
switching_occured = process_render_nav_action(app, ctx, ui, col, nav_action);
|
||||
}
|
||||
|
||||
if let Some(NavAction::Returned) = action.action {
|
||||
let column = app.columns_mut(ctx.accounts).column_mut(col);
|
||||
column.sheet_router.clear();
|
||||
} else if let Some(NavAction::Navigating) = action.action {
|
||||
let column = app.columns_mut(ctx.accounts).column_mut(col);
|
||||
column.sheet_router.navigating = false;
|
||||
}
|
||||
|
||||
switching_occured
|
||||
}
|
||||
|
||||
fn process_nav_resp(
|
||||
app: &mut Damus,
|
||||
ctx: &mut AppContext<'_>,
|
||||
@@ -204,23 +238,38 @@ pub enum RouterAction {
|
||||
}
|
||||
|
||||
pub enum RouterType {
|
||||
Sheet,
|
||||
Stack,
|
||||
}
|
||||
|
||||
impl RouterAction {
|
||||
pub fn process(self, stack_router: &mut Router<Route>) {
|
||||
pub fn process(
|
||||
self,
|
||||
stack_router: &mut Router<Route>,
|
||||
sheet_router: &mut SingletonRouter<Route>,
|
||||
) {
|
||||
match self {
|
||||
RouterAction::GoBack => {
|
||||
stack_router.go_back();
|
||||
if sheet_router.route().is_some() {
|
||||
sheet_router.go_back();
|
||||
} else {
|
||||
stack_router.go_back();
|
||||
}
|
||||
}
|
||||
RouterAction::RouteTo(route, router_type) => match router_type {
|
||||
RouterType::Sheet => sheet_router.route_to(route),
|
||||
RouterType::Stack => stack_router.route_to(route),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
pub fn route_to(route: Route) -> Self {
|
||||
RouterAction::RouteTo(route, RouterType::Stack)
|
||||
}
|
||||
|
||||
pub fn route_to_sheet(route: Route) -> Self {
|
||||
RouterAction::RouteTo(route, RouterType::Sheet)
|
||||
}
|
||||
}
|
||||
|
||||
fn process_render_nav_action(
|
||||
@@ -291,8 +340,9 @@ fn process_render_nav_action(
|
||||
|
||||
if let Some(action) = router_action {
|
||||
let cols = get_active_columns_mut(ctx.accounts, &mut app.decks_cache).column_mut(col);
|
||||
let router = cols.router_mut();
|
||||
action.process(router);
|
||||
let router = &mut cols.router;
|
||||
let sheet_router = &mut cols.sheet_router;
|
||||
action.process(router, sheet_router);
|
||||
}
|
||||
|
||||
false
|
||||
@@ -660,6 +710,48 @@ pub fn render_nav(
|
||||
ctx: &mut AppContext<'_>,
|
||||
ui: &mut egui::Ui,
|
||||
) -> RenderNavResponse {
|
||||
if let Some(sheet_route) = app
|
||||
.columns(ctx.accounts)
|
||||
.column(col)
|
||||
.sheet_router
|
||||
.route()
|
||||
.clone()
|
||||
{
|
||||
let navigating = app
|
||||
.columns(ctx.accounts)
|
||||
.column(col)
|
||||
.sheet_router
|
||||
.navigating;
|
||||
let returning = app.columns(ctx.accounts).column(col).sheet_router.returning;
|
||||
let bg_route = app
|
||||
.columns(ctx.accounts)
|
||||
.column(col)
|
||||
.router()
|
||||
.routes()
|
||||
.last()
|
||||
.cloned();
|
||||
if let Some(bg_route) = bg_route {
|
||||
let resp = PopupSheet::new(&bg_route, &sheet_route)
|
||||
.id_source(egui::Id::new(("nav", col)))
|
||||
.navigating(navigating)
|
||||
.returning(returning)
|
||||
.with_split_percent_from_top(Percent::new(35).expect("35 <= 100"))
|
||||
.show_mut(ui, |ui, typ, route| match typ {
|
||||
NavUiType::Title => NavTitle::new(
|
||||
ctx.ndb,
|
||||
ctx.img_cache,
|
||||
get_active_columns_mut(ctx.accounts, &mut app.decks_cache),
|
||||
&[route.clone()],
|
||||
col,
|
||||
)
|
||||
.show(ui),
|
||||
NavUiType::Body => render_nav_body(ui, app, ctx, route, 1, col, inner_rect),
|
||||
});
|
||||
|
||||
return RenderNavResponse::new(col, NotedeckNavResponse::Popup(resp));
|
||||
}
|
||||
};
|
||||
|
||||
let nav_response = Nav::new(
|
||||
&app.columns(ctx.accounts)
|
||||
.column(col)
|
||||
@@ -698,5 +790,5 @@ pub fn render_nav(
|
||||
}
|
||||
});
|
||||
|
||||
RenderNavResponse::new(col, nav_response)
|
||||
RenderNavResponse::new(col, NotedeckNavResponse::Nav(nav_response))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user