/* Simple interface for expenses. */ #include #include #include #include #include #include #include "expenses_widget.h" static void app_main (ml_session session); struct data { vector expenses; /* The data model. */ }; /*----- The following standard boilerplate code must appear -----*/ /* Main entry point to the app. */ static void app_main (ml_session); int handle_request (rws_request rq) { return ml_entry_point (rq, app_main); } /*----- End of standard boilerplate code -----*/ static void app_main (ml_session session) { pool pool = ml_session_pool (session); struct data *data = pmalloc (pool, sizeof *data); ml_window win; expenses_widget ew; ml_flow_layout buttons; ml_vertical_layout tbl; ml_button print, email; /* Create the window. */ win = new_ml_window (session, pool); ml_session_set_main_window (session, win); /* Create the expenses data model - just a vector of expense row * structures. */ data->expenses = new_vector (pool, struct expense_row); /* Create the expenses widget. */ ew = new_expenses_widget (pool, session, data->expenses); /* Pack it. */ tbl = new_ml_vertical_layout (pool); ml_vertical_layout_pack (tbl, ew); /* Create the action button bar. */ buttons = new_ml_flow_layout (pool); print = new_ml_button (pool, "Print"); ml_flow_layout_pack (buttons, print); email = new_ml_button (pool, "Email"); ml_flow_layout_pack (buttons, email); ml_vertical_layout_pack (tbl, buttons); /* Pack into window. */ ml_window_pack (win, tbl); }