policycheck: wip: view and state handling updates

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
This commit is contained in:
2020-06-22 14:27:30 +02:00
parent 0c69ca176a
commit d6b5552122
2 changed files with 346 additions and 167 deletions

View File

@@ -9,6 +9,7 @@ use crate::{
/// Actions that can execute on the task view.
#[derive(Debug, Clone, Copy)]
pub enum Action {
ClearEntry(Entity),
InputTextChanged(Entity),
ParseEntry(Entity),
RemoveFocus(Entity),
@@ -23,7 +24,7 @@ pub struct PolicyCheckState {
last_focused: Option<Entity>,
pub text_box: Entity,
menu_button: Entity,
policy_code_valid: bool,
policy_number_valid: bool,
}
impl BaseState for PolicyCheckState {}
@@ -34,29 +35,59 @@ impl PolicyCheckState {
self.action = action.into();
}
/// Clear text in text box.
pub fn clear_entry(&mut self, text_box: Entity, ctx: &mut Context) {
let mut text_box = TextBox::get(ctx.get_widget(text_box));
let text = text_box.text_mut();
println!("reset {}", text);
}
/// Parse and verify given policy code to match a valid policy data element.
//fn parse_entry(&self, text_box: Entity, ctx: &mut Context) -> Result<(), Box<dyn std::error::Error>> {
fn parse_entry(&self, text_box: Entity, ctx: &mut Context) {
// Old style
//let length = ctx.get_widget(text_box).get::<String>("policy_code").len();
//let length = ctx.get_widget(text_box).get::<String>("policy_number").len();
// New style
let text_box = TextBox::get(ctx.widget());
println!("parsing policy code: {}", text_box.text());
let mut text_box = TextBox::get(ctx.get_widget(text_box));
let policy_number = text_box.text_mut();
println!("parsing policy Number: {}", policy_number);
// Parse policy code: "AS-123456789"
if let policy_code = text_box.text() {
match policy_code {
_ => {
println!("policycode: {} is valid!", policy_code);
}
// DION VERS POLLFNR
// 1 AS 1515735810
let policy_number_length = policy_number.len();
if policy_number_length == 10 {
println!("Verify {} ...", policy_number);
// check against hash-table
//ctx.get_widget(text_box).set("policy_number_valid", true);
//TextBox::get(ctx.child("text_box")).set_foreground(colors::LINK_WATER_COLOR);
}
if policy_number_length < 10 {
println!("Policy number is to short!");
//TextBox::get(ctx.child("text_box")).set_foreground("#ffffff");
//TextBox::get(ctx.child("text_box")).set_background("#5b0f22");
}
if policy_number_length > 10 {
println!("Policy number is to big!");
//TextBox::get(ctx.child("text_box")).set_foreground("#ffffff");
//TextBox::get(ctx.child("text_box")).set_background("#5b0f22");
}
/// If TextBox 'policy_code' is empty, disable button "check"
// if let policy_number = text_box.text() {
// match policy_number {
// _ => {
// println!("policynumber: {} is valid!", policy_number);
// }
// }
// }
}
/// If TextBox 'policy_number' is empty, disable button "check"
/// otherwise enabled it.
fn set_check_button(&self, text_box: Entity, ctx: &mut Context) {
if ctx.get_widget(text_box).get::<String>("policy_code_check").is_empty() {
if ctx.get_widget(text_box).get::<String>("policy_number_check").is_empty() {
ctx.get_widget(self.text_box).set("enabled", false);
} else {
ctx.get_widget(self.text_box).set("enabled", true);
@@ -85,7 +116,7 @@ impl PolicyCheckState {
.start_index = 0;
ctx.get_widget(text_box)
.get_mut::<TextSelection>("text_selection")
.length = ctx.get_widget(text_box).get::<String>("policy_code").len();
.length = ctx.get_widget(text_box).get::<String>("policy_number").len();
ctx.push_event_by_window(FocusEvent::RequestFocus(text_box));
}
}
@@ -96,11 +127,11 @@ impl State for PolicyCheckState {
.entity_of_child(ID_POLICY_CHECK_MENU_BUTTON)
.expect("PolicyState.init: Can't find child 'Menu button'.");
self.text_box = ctx
.entity_of_child(ID_POLICY_CHECK_TEXT_BOX)
.entity_of_child(ID_POLICY_CHECK_POLICY_NUMBER)
.expect("PolicyState.init: Can't find child 'Text Box'.");
}
fn update(&mut self, registry: &mut Registry, ctx: &mut Context) {
fn update(&mut self, _registry: &mut Registry, ctx: &mut Context) {
// clear focus on focus moved
if self.last_focused != ctx.window().get::<Global>("global").focused_widget {
if let Some(last_focused) = self.last_focused {
@@ -112,6 +143,9 @@ impl State for PolicyCheckState {
if let Some(action) = self.action {
match action {
Action::ClearEntry(text_box) => {
self.clear_entry(text_box, ctx);
}
Action::InputTextChanged(text_box) => {
self.set_check_button(text_box, ctx);
}
@@ -126,7 +160,7 @@ impl State for PolicyCheckState {
self.last_focused = Some(text_box);
self.set_entry(text_box, ctx);
}
Action::TextChanged(entity, index) => {
Action::TextChanged(entity, _index) => {
self.set_entry(entity, ctx);
}
}

View File

@@ -1,85 +1,139 @@
use orbtk::prelude::*;
use orbtk::theme::vector_graphics::material_icons_font;
use crate::{
//data::PolicyList,
keys::*,
policycheck_state::{Action, PolicyCheckState},
//policycheck_state::{Action, PolicyCheckState},
};
type ListIndex = Option<usize>;
widget!(PolicyCheckView);
// widget!(
// /// Starter page that offers the dialog to enter an identifier of a policy.
// /// This identifier is checked agains a map of valid policy codes.
// PolicyCheckView<PolicyCheckState> {
// //is_valid: bool,
// title: String,
// policy_check_text_box: String
// }
// );
widget!(
/// Starter page that offers the dialog to enter an identifier of a policy.
/// This identifier is checked agains a map of valid policy codes.
PolicyCheckView<PolicyCheckState> {
//is_valid: bool,
title: String,
policy_check_text_box: String
}
);
impl Template for PolicyCheckView {
fn template(self, id: Entity, ctx: &mut BuildContext)-> Self {
let policy_code_text_box = TextBox::new()
.id(ID_POLICY_CHECK_TEXT_BOX)
.attach(Grid::row(4))
// let policy_check_text_box = TextBox::new()
// .id(ID_POLICY_CHECK_TEXT_BOX)
// .attach(Grid::row(4))
// .attach(Grid::row(0))
// .attach(Grid::column(0))
// .v_align("top")
// .margin((4.0, 0.0, 0.0, 0.0))
// .lost_focus_on_activation(false)
// //.text(("policy_number", id))
// // .on_activate(move |ctx, entity| {
// // ctx.get_mut::<PolicyCheckState>(id)
// // .action(Action::ParseEntry(entity));
// // })
// // .on_changed(move |ctx, entity| {
// // ctx.get_mut::<PolicyCheckState>(id)
// // .action(Action::InputTextChanged(entity));
// // })
// .build(ctx);
// let policy_check_menu_container = Container::new()
// .id(ID_POLICY_CHECK_MENU_CONTAINER)
// .class(CLASS_MENU)
// .attach(Grid::row(3))
// .attach(Grid::column(8))
// .margin((0.0, 0.0, 4.0, 0.0))
// .enabled(false)
// .min_size(120.0, 180.0)
// .v_align("center")
// .on_click(move |ctx, _| {
// ctx.get_mut::<PolicyCheckState>(id)
// .action(Action::NewEntry(quit));
// true
// })
// .build(ctx);
let policy_check_menu_button = Button::new()
.id(ID_POLICY_CHECK_MENU_BUTTON)
//.class(CLASS_ICON_ONLY)
//.attach(Grid::row(0))
.attach(Grid::column(2))
//.margin((0.0, 0.0, 12.0, 12.0))
//.min_size(8.0, 8.0)
.min_size(16.0, 16.0)
.h_align("end")
.v_align("center")
.margin((4.0, 0.0, 0.0, 0.0))
.lost_focus_on_activation(false)
.on_activate(move |ctx, entity| {
ctx.get_mut::<PolicyCheckState>(id)
.action(Action::ParseEntry(entity));
})
.on_changed(move |ctx, entity| {
ctx.get_mut::<PolicyCheckState>(id)
.action(Action::InputTextChanged(entity));
})
.enabled(true)
//.icon(material_icons_font::MENU_FONT_ICON)
//.icon(material_icons_font_ttf::EDIT_FONT_ICON)
//.icon("")
//.icon("")
.on_mouse_down(|_, _| true)
//.child(policycheck_menu)
// .on_click(move |ctx, _| {
// //ctx.get_mut::<PolicyCheckState>(id)
// // .action(Action::NewEntry(policy_check_menu_container));
// true
//})
.build(ctx);
// The menu implemented as an overlay
//ctx.append_child_to_overlay(policy_check_menu_button).unwrap();
// Check policy identifier page
self.name("Policy check")
.child(
self.name("Policy check").child(
Grid::new()
.id(ID_POLICY_CHECK_WIDGET)
.v_align("start")
//.v_align("start")
//.h_align("center")
.background("#fafafa")
.columns(
Columns::new()
.add(150.0)
.add(64.0)
.add("*")
.add(150.0)
.add(50.0)
.build(),
)
.rows(
Rows::new()
.add("auto")
.add(1.0)
.add("*")
.add(1.0)
.add(52.0)
.add(1.0)
.add("*")
.add(1.0)
.add("*")
/* .add("auto") */
.build(),
)
// Top Bar
// Header Bar
.child(
//.border_color("transparent")
Container::new()
.class(CLASS_TOP_BAR)
//.class(CLASS_TOP_BAR)
.attach(Grid::row(0))
.attach(Grid::column(0))
.attach(Grid::column_span(3))
.child(
Grid::new()
.margin((4.0, 24.0, 24.0, 4.0))
.child(
TextBlock::new()
.class(CLASS_HEADER)
//.class(CLASS_HEADER)
.class("h1")
//.class(".myheader")
.id(ID_POLICY_CHECK_HEADER)
//.font_size(24)
//.font("Roboto Medium")
.v_align("center")
.h_align("center")
//.text("Validation number policyholder"))
.margin((32.0, 32.0, 32.0, 32.0))
.text("Validierung Versicherungsnummer")
.build(ctx),
)
.build(ctx),
)
.child(policy_check_menu_button)
.build(ctx),
)
.child(
@@ -89,25 +143,113 @@ impl Template for PolicyCheckView {
.attach(Grid::column_span(3))
.build(ctx),
)
// Policy Check Form
.child(
Container::new()
//.class(CLASS_POLICY_CHECK_FORM)
.attach(Grid::row(2))
.attach(Grid::column(0))
.attach(Grid::column_span(3))
.child(
Grid::new()
.id(ID_POLICY_CHECK_FORM)
.columns(
Columns::new()
.add("5.0")
.add("220.0")
.add("5.0")
.add("100.0")
.build(),
)
.rows(
Rows::new()
.add("45.0")
.add("45.0")
.build(),
)
.child(
Stack::new()
.spacing(8.0)
.attach(Grid::column(1))
.attach(Grid::row(0))
.margin((16.0, 16.0, 16.0, 16.0))
.orientation("vertical")
.h_align("center")
.child(policy_code_text_box)
//.v_align("center")
.child(
TextBlock::new()
.class("text_box")
.element("text-block")
.id("result")
.min_width(80.0)
.max_width(180.0)
//.text("Result:")
.text("Ergebnis:")
.id(ID_POLICY_CHECK_LABEL_POLICY_NUMBER)
//.class(CLASS_TEXT_BLOCK)
.h_align("end")
//.min_width(250.0)
.min_height(45.0)
//.size(250.0, 45.0)
.text("Versicherungsnummer:")
.build(ctx),
)
.child(
TextBlock::new()
.id(ID_POLICY_CHECK_LABEL_RESULT)
//.class(CLASS_TEXT_BLOCK)
.attach(Grid::column(1))
.attach(Grid::row(1))
.h_align("end")
//.min_width(250.0)
//.min_size(120.0, 180.0)
.text("Ergebnis:")
.text("Result:")
.build(ctx),
)
.build(ctx)
)
.child(
Stack::new()
.attach(Grid::column(2))
.attach(Grid::row(0))
//.attach(Grid::column_span(3))
.orientation("vertical")
.margin((16.0, 16.0, 16.0, 16.0))
//.child(policy_check_text_box)
.child(
TextBox::new()
.id(ID_POLICY_CHECK_POLICY_NUMBER)
.h_align("start")
.margin((4.0, 0.0, 0.0, 0.0))
.lost_focus_on_activation(false)
.water_mark("10-stellige Nummer (ohne 'AS')")
.text("")
// .on_activate(move |ctx, entity| {
// ctx.get_mut::<PolicyCheckState>(id)
// .action(Action::ParseEntry(entity));
// })
// .on_changed(move |ctx, entity| {
// ctx.get_mut::<PolicyCheckState>(id)
// .action(Action::InputTextChanged(entity));
// })
.build(ctx),
)
.child(
TextBlock::new()
.id(ID_POLICY_CHECK_RESULT)
.h_align("start")
.attach(Grid::column(3))
.attach(Grid::row(1))
//.margin((4.0, 0.0, 0.0, 0.0))
//.lost_focus_on_activation(false)
// .on_activate(move |ctx, entity| {
// ctx.get_mut::<PolicyCheckState>(id)
// .action(Action::ParseEntry(entity));
// })
// .on_changed(move |ctx, entity| {
// ctx.get_mut::<PolicyCheckState>(id)
// .action(Action::InputTextChanged(entity));
// })
.build(ctx),
)
.build(ctx)
)
.build(ctx)
)
.build(ctx)
)
.child(
Container::new()
.class("separator")
@@ -122,16 +264,18 @@ impl Template for PolicyCheckView {
.attach(Grid::row(4))
.attach(Grid::column(0))
.attach(Grid::column_span(3))
.v_align("end")
.child(
Grid::new()
.element("logo_customer")
.margin((9.0, 16.0, 16.0, 9.0))
.attach(Grid::column(0))
.attach(Grid::row(1))
.v_align("end")
.h_align("start")
.v_align("center")
.child(
ImageWidget::new()
.image("../resources/images/hiedemann_logo.png")
.image("resources/images/hiedemann_logo.png")
.build(ctx),
)
.build(ctx),
@@ -140,12 +284,13 @@ impl Template for PolicyCheckView {
Grid::new()
.element("logo_vendor")
.margin((9.0, 16.0, 16.0, 9.0))
.attach(Grid::column(2))
.attach(Grid::row(1))
.v_align("end")
.attach(Grid::column(0))
.attach(Grid::row(4))
.h_align("end")
.v_align("center")
.child(
ImageWidget::new()
.image("../resources/images/networkx_logo.png")
.image("resources/images/networkx_logo.png")
.build(ctx),
)
.build(ctx),