gui: fix navigation
This commit is contained in:
parent
a8a24281fd
commit
d0246a7c44
5 changed files with 38 additions and 42 deletions
|
@ -12,7 +12,6 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
use crate::gui::App;
|
|
||||||
use crate::gui::platform::PlatformCallbacks;
|
use crate::gui::platform::PlatformCallbacks;
|
||||||
use crate::gui::screens::{Navigator, ScreenId};
|
use crate::gui::screens::{Navigator, ScreenId};
|
||||||
|
|
||||||
|
@ -35,8 +34,8 @@ impl super::Screen for Account {
|
||||||
|
|
||||||
fn show(&mut self,
|
fn show(&mut self,
|
||||||
ui: &mut egui::Ui,
|
ui: &mut egui::Ui,
|
||||||
nav: Option<&mut Navigator>,
|
nav: &mut Navigator,
|
||||||
cb: &dyn PlatformCallbacks) {
|
cb: &dyn PlatformCallbacks) {
|
||||||
todo!()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -12,9 +12,8 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
use crate::gui::app::App;
|
|
||||||
use crate::gui::platform::PlatformCallbacks;
|
use crate::gui::platform::PlatformCallbacks;
|
||||||
use crate::gui::screens::{Account, Navigator, Screen, ScreenId};
|
use crate::gui::screens::{Navigator, Screen, ScreenId};
|
||||||
use crate::gui::views::title_panel::TitlePanel;
|
use crate::gui::views::title_panel::TitlePanel;
|
||||||
use crate::gui::views::View;
|
use crate::gui::views::View;
|
||||||
|
|
||||||
|
@ -38,17 +37,14 @@ impl Screen for Accounts {
|
||||||
|
|
||||||
fn show(&mut self,
|
fn show(&mut self,
|
||||||
ui: &mut egui::Ui,
|
ui: &mut egui::Ui,
|
||||||
nav: Option<&mut Navigator>,
|
nav: &mut Navigator,
|
||||||
cb: &dyn PlatformCallbacks) {
|
cb: &dyn PlatformCallbacks) {
|
||||||
TitlePanel::default()
|
TitlePanel::default()
|
||||||
.title(self.title.to_owned())
|
.title(self.title.to_owned())
|
||||||
.ui(ui);
|
.ui(ui);
|
||||||
if ui.button("test").clicked() {
|
if ui.button("test").clicked() {
|
||||||
nav.unwrap().to(ScreenId::Account)
|
nav.to(ScreenId::Account)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
//TODO: content
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -42,7 +42,7 @@ pub trait Screen {
|
||||||
fn show(
|
fn show(
|
||||||
&mut self,
|
&mut self,
|
||||||
ui: &mut egui::Ui,
|
ui: &mut egui::Ui,
|
||||||
navigator: Option<&mut Navigator>,
|
navigator: &mut Navigator,
|
||||||
cb: &dyn PlatformCallbacks
|
cb: &dyn PlatformCallbacks
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,25 +12,25 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
use std::collections::BTreeSet;
|
use std::collections::BTreeSet;
|
||||||
use crate::gui::platform::PlatformCallbacks;
|
|
||||||
use crate::gui::screens::{Accounts, Screen, ScreenId};
|
use crate::gui::screens::ScreenId;
|
||||||
|
|
||||||
pub struct Navigator {
|
pub struct Navigator {
|
||||||
stack: BTreeSet<ScreenId>,
|
pub(crate) stack: BTreeSet<ScreenId>,
|
||||||
screens: Vec<Box<dyn Screen>>,
|
}
|
||||||
|
|
||||||
|
impl Default for Navigator {
|
||||||
|
fn default() -> Self {
|
||||||
|
let mut stack = BTreeSet::new();
|
||||||
|
stack.insert(ScreenId::Accounts);
|
||||||
|
Self {
|
||||||
|
stack
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Navigator {
|
impl Navigator {
|
||||||
pub fn new(screens: Vec<Box<dyn Screen>>) -> Self {
|
|
||||||
let mut stack = BTreeSet::new();
|
|
||||||
stack.insert(ScreenId::Accounts);
|
|
||||||
Self { stack, screens }
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn to(&mut self, id: ScreenId) {
|
pub fn to(&mut self, id: ScreenId) {
|
||||||
self.stack.insert(id);
|
self.stack.insert(id);
|
||||||
}
|
}
|
||||||
|
@ -38,17 +38,4 @@ impl Navigator {
|
||||||
pub fn back(&mut self) {
|
pub fn back(&mut self) {
|
||||||
self.stack.pop_last();
|
self.stack.pop_last();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_current_screen(&mut self) -> Option<&Box<dyn Screen>> {
|
|
||||||
let Self { stack, screens } = self;
|
|
||||||
let current = stack.last().unwrap();
|
|
||||||
let mut result = screens.get(0);
|
|
||||||
for screen in screens.iter() {
|
|
||||||
if screen.id() == *current {
|
|
||||||
result = Some(screen);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -18,13 +18,14 @@ use crate::gui::screens::{Account, Accounts, Navigator, Screen, ScreenId};
|
||||||
|
|
||||||
pub struct Root {
|
pub struct Root {
|
||||||
navigator: Navigator,
|
navigator: Navigator,
|
||||||
// screens: Vec<Box<dyn Screen>>,
|
screens: Vec<Box<dyn Screen>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Root {
|
impl Default for Root {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self {
|
Self {
|
||||||
navigator: Navigator::new(vec![
|
navigator: Navigator::new(),
|
||||||
|
screens: (vec![
|
||||||
Box::new(Accounts::default()),
|
Box::new(Accounts::default()),
|
||||||
Box::new(Account::default())
|
Box::new(Account::default())
|
||||||
])
|
])
|
||||||
|
@ -32,12 +33,25 @@ impl Default for Root {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Screen for Root {
|
impl Root {
|
||||||
fn id(&self) -> ScreenId {
|
fn id(&self) -> ScreenId {
|
||||||
ScreenId::Root
|
ScreenId::Root
|
||||||
}
|
}
|
||||||
|
|
||||||
fn show(&mut self, ui: &mut Ui, navigator: Option<&mut Navigator>, cb: &dyn PlatformCallbacks) {
|
pub fn ui(&mut self, ui: &mut Ui, cb: &dyn PlatformCallbacks) {
|
||||||
let screen = self.navigator.get_current_screen();
|
self.show_current_screen(ui, cb);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn show_current_screen(&mut self,
|
||||||
|
ui: &mut Ui,
|
||||||
|
cb: &dyn PlatformCallbacks) {
|
||||||
|
let Self { navigator, screens } = self;
|
||||||
|
let current = navigator.stack.last().unwrap();
|
||||||
|
for screen in screens.iter_mut() {
|
||||||
|
if screen.id() == *current {
|
||||||
|
screen.show(ui, navigator, cb);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue