24 #include <glib/gi18n.h> 27 #include <dialog-options.hpp> 33 #include "swig-runtime.h" 35 #include "dialog-utils.h" 36 #include "window-report.h" 37 #include "guile-mappings.h" 38 #include "gnc-guile-utils.h" 41 #include "dialog-report-column-view.hpp" 42 #include <gnc-report.h> 46 AVAILABLE_COL_NAME = 0,
53 CONTENTS_COL_NAME = 0,
55 CONTENTS_COL_REPORT_ROWS,
56 CONTENTS_COL_REPORT_COLS,
60 using StrVec = std::vector<std::string>;
64 std::unique_ptr<GncOptionsDialog> optwin;
65 GtkTreeView * available;
66 GtkTreeView * contents;
71 StrVec available_list;
72 GncOptionReportPlacementVec contents_list;
73 int contents_selected;
75 GtkWidget *add_button;
76 GtkWidget *remove_button;
78 GtkWidget *down_button;
79 GtkWidget *size_button;
89 void gnc_column_view_edit_add_cb(GtkButton * button, gpointer user_data);
90 void gnc_column_view_edit_remove_cb(GtkButton * button, gpointer user_data);
91 void gnc_edit_column_view_move_up_cb(GtkButton * button, gpointer user_data);
92 void gnc_edit_column_view_move_down_cb(GtkButton * button, gpointer user_data);
93 void gnc_column_view_edit_size_cb(GtkButton * button, gpointer user_data);
97 gnc_column_view_set_option(
GncOptionDB* odb,
const char* section,
98 const char* name,
const GncOptionReportPlacementVec& new_value)
100 odb->find_option(section, name)->set_value(new_value);
104 gnc_column_view_edit_destroy(gnc_column_view_edit * view)
106 scm_gc_unprotect_object(view->view);
112 get_available_reports ()
115 auto scm_list{scm_call_0(scm_c_eval_string(
"gnc:all-report-template-guids"))};
116 for (
auto next{scm_list}; !scm_is_null(next); next = scm_cdr(next))
118 auto guid{scm_to_utf8_string(scm_car(next))};
119 sv.emplace_back(guid);
126 update_available_lists(gnc_column_view_edit * view)
128 SCM template_menu_name = scm_c_eval_string(
"gnc:report-template-menu-name/report-guid");
129 std::string selection;
135 auto tree_selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(view->available));
136 auto model = gtk_tree_view_get_model (GTK_TREE_VIEW(view->available));
138 if (gtk_tree_selection_get_selected(tree_selection, &model, &iter))
141 gtk_tree_model_get(model, &iter,
142 AVAILABLE_COL_GUID, &guid_str,
144 selection = std::string(guid_str);
147 view->available_list = get_available_reports();
149 auto store = GTK_LIST_STORE(model);
150 gtk_list_store_clear(store);
152 for (
const auto& guid : view->available_list)
154 auto rpt_guid{scm_from_utf8_string(guid.c_str())};
156 gnc_scm_to_utf8_string (scm_call_2(template_menu_name, rpt_guid, SCM_BOOL_F));
158 gtk_list_store_append(store, &iter);
159 gtk_list_store_set(store, &iter,
160 AVAILABLE_COL_NAME, _(name),
161 AVAILABLE_COL_GUID, guid.c_str(),
164 if (guid == selection)
165 gtk_tree_selection_select_iter (tree_selection, &iter);
172 update_contents_lists(gnc_column_view_edit * view)
174 SCM report_menu_name = scm_c_eval_string(
"gnc:report-menu-name");
175 auto contents{view->odb->find_option(
"__general",
"report-list")->get_value<GncOptionReportPlacementVec>()};
177 GncOptionReportPlacement selection{0, 0, 0};
180 auto tree_selection = gtk_tree_view_get_selection(view->contents);
182 view->contents_list = contents;
184 if (!contents.empty() &&
static_cast<size_t>(view->contents_selected) < contents.size())
185 selection = contents[view->contents_selected];
187 auto store = GTK_LIST_STORE(gtk_tree_view_get_model(view->contents));
188 gtk_list_store_clear(store);
190 for (
size_t i = 0; i < contents.size(); ++i)
192 auto [id, wide, high] = contents[i];
193 auto this_report = gnc_report_find(
id);
194 auto name = gnc_scm_to_utf8_string (scm_call_1(report_menu_name, this_report));
196 gtk_list_store_append(store, &iter);
199 CONTENTS_COL_NAME, _(name),
201 CONTENTS_COL_REPORT_COLS, wide,
202 CONTENTS_COL_REPORT_ROWS, high,
205 if (
id == std::get<0>(selection))
206 gtk_tree_selection_select_iter (tree_selection, &iter);
213 gnc_column_view_update_buttons_cb (GtkTreeSelection *selection,
214 gnc_column_view_edit *r)
218 gboolean is_selected;
221 if (gtk_tree_selection_get_tree_view (selection) == r->available)
224 is_selected = gtk_tree_selection_get_selected (selection, &model, &iter);
225 gtk_widget_set_sensitive (r->add_button, is_selected);
230 is_selected = gtk_tree_selection_get_selected (selection, &model, &iter);
231 gtk_widget_set_sensitive (r->size_button, is_selected);
232 gtk_widget_set_sensitive (r->remove_button, is_selected);
236 int len = r->contents_list.size();
238 gtk_tree_model_get (model, &iter,
239 CONTENTS_COL_ROW, &r->contents_selected, -1);
243 gtk_widget_set_sensitive (r->up_button, TRUE);
244 gtk_widget_set_sensitive (r->down_button, TRUE);
246 if (r->contents_selected == len -1)
247 gtk_widget_set_sensitive (r->down_button, FALSE);
249 if (r->contents_selected == 0)
250 gtk_widget_set_sensitive (r->up_button, FALSE);
255 gtk_widget_set_sensitive (r->up_button, FALSE);
256 gtk_widget_set_sensitive (r->down_button, FALSE);
263 SCM dirty_report = scm_c_eval_string(
"gnc:report-set-dirty?!");
264 auto win{
static_cast<gnc_column_view_edit*
>(user_data)};
268 for (
auto iter = results; iter; iter = iter->next)
271 gtk_message_dialog_new(GTK_WINDOW(dlg->get_widget()),
277 gtk_dialog_run(GTK_DIALOG(dialog));
278 gtk_widget_destroy(dialog);
281 g_list_free (results);
283 scm_call_2(dirty_report, win->view, SCM_BOOL_T);
289 auto r{
static_cast<gnc_column_view_edit*
>(user_data)};
290 SCM set_editor = scm_c_eval_string(
"gnc:report-set-editor-widget!");
292 scm_call_2(set_editor, r->view, SCM_BOOL_F);
293 gnc_column_view_edit_destroy(r);
303 gnc_column_view_edit_options(
GncOptionDB* odb, SCM view)
305 SCM get_editor = scm_c_eval_string(
"gnc:report-editor-widget");
309 GtkCellRenderer *renderer;
310 GtkTreeViewColumn *column;
311 GtkTreeSelection *selection;
313 ptr = scm_call_1(get_editor, view);
314 if (ptr != SCM_BOOL_F)
316 #define FUNC_NAME "gtk_window_present" 317 auto w{
static_cast<GtkWindow*
>(SWIG_MustGetPtr(ptr, SWIG_TypeQuery(
"_p_GtkWidget"), 1, 0))};
318 gtk_window_present(w);
324 auto r =
new gnc_column_view_edit;
330 gtk_widget_hide(r->optwin->get_page_list());
332 builder = gtk_builder_new();
333 gnc_builder_add_from_file (builder,
"dialog-report.glade",
"view_contents_table");
335 editor = GTK_WIDGET(gtk_builder_get_object (builder,
"view_contents_table"));
336 r->available = GTK_TREE_VIEW (gtk_builder_get_object (builder,
"available_view"));
337 r->contents = GTK_TREE_VIEW (gtk_builder_get_object (builder,
"contents_view"));
339 r->add_button = GTK_WIDGET(gtk_builder_get_object (builder,
"add_button1"));
340 r->remove_button = GTK_WIDGET(gtk_builder_get_object (builder,
"remove_button1"));
341 r->up_button = GTK_WIDGET(gtk_builder_get_object (builder,
"up_button1"));
342 r->down_button = GTK_WIDGET(gtk_builder_get_object (builder,
"down_button1"));
343 r->size_button = GTK_WIDGET(gtk_builder_get_object (builder,
"size_button1"));
346 r->available_list.clear();
347 r->contents_selected = 0;
348 r->contents_list.clear();
351 r->optwin->build_contents(r->odb);
353 gtk_notebook_append_page(GTK_NOTEBOOK(r->optwin->get_notebook()),
355 gtk_label_new(_(
"Contents")));
357 scm_gc_protect_object(r->view);
360 store = gtk_list_store_new (NUM_AVAILABLE_COLS, G_TYPE_STRING, G_TYPE_STRING);
361 gtk_tree_view_set_model(r->available, GTK_TREE_MODEL(store));
362 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), AVAILABLE_COL_NAME, GTK_SORT_ASCENDING);
363 g_object_unref(store);
365 renderer = gtk_cell_renderer_text_new();
366 column = gtk_tree_view_column_new_with_attributes(
"", renderer,
367 "text", AVAILABLE_COL_NAME,
369 gtk_tree_view_append_column(r->available, column);
372 selection = gtk_tree_view_get_selection(r->available);
373 g_signal_connect(selection,
"changed",
374 G_CALLBACK(gnc_column_view_update_buttons_cb), r);
377 store = gtk_list_store_new (NUM_CONTENTS_COLS, G_TYPE_STRING, G_TYPE_INT,
378 G_TYPE_INT, G_TYPE_INT);
379 gtk_tree_view_set_model(r->contents, GTK_TREE_MODEL(store));
380 g_object_unref(store);
382 renderer = gtk_cell_renderer_text_new();
383 column = gtk_tree_view_column_new_with_attributes(_(
"Report"), renderer,
384 "text", CONTENTS_COL_NAME,
386 gtk_tree_view_append_column(r->contents, column);
388 renderer = gtk_cell_renderer_text_new();
389 column = gtk_tree_view_column_new_with_attributes(_(
"Rows"), renderer,
390 "text", CONTENTS_COL_REPORT_ROWS,
392 gtk_tree_view_append_column(r->contents, column);
394 renderer = gtk_cell_renderer_text_new();
395 column = gtk_tree_view_column_new_with_attributes(_(
"Cols"), renderer,
396 "text", CONTENTS_COL_REPORT_COLS,
398 gtk_tree_view_append_column(r->contents, column);
401 selection = gtk_tree_view_get_selection(r->contents);
402 g_signal_connect(selection,
"changed",
403 G_CALLBACK(gnc_column_view_update_buttons_cb), r);
405 update_available_lists(r);
406 update_contents_lists(r);
408 r->optwin->set_apply_cb(gnc_column_view_edit_apply_cb, r);
409 r->optwin->set_close_cb(gnc_column_view_edit_close_cb, r);
411 gtk_widget_show(r->optwin->get_widget());
413 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, r);
415 g_object_unref(G_OBJECT(builder));
417 return r->optwin->get_widget();
422 gnc_column_view_edit_add_cb(GtkButton * button, gpointer user_data)
424 auto r =
static_cast<gnc_column_view_edit *
>(user_data);
425 SCM make_report = scm_c_eval_string(
"gnc:make-report");
426 SCM mark_report = scm_c_eval_string(
"gnc:report-set-needs-save?!");
428 GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(r->available));
433 if (gtk_tree_selection_get_selected(selection, &model, &iter))
434 gtk_tree_model_get(model, &iter,
435 AVAILABLE_COL_GUID, &guid_str, -1);
439 auto template_name = scm_from_utf8_string(guid_str);
441 auto new_report = scm_call_1(make_report, template_name);
442 auto id = scm_to_int(new_report);
443 scm_call_2(mark_report, gnc_report_find(
id), SCM_BOOL_T);
444 auto oldlength = r->contents_list.size();
445 GncOptionReportPlacement new_rpt_placement{id, 1, 1};
447 if (oldlength > static_cast<size_t>(r->contents_selected))
448 r->contents_list.emplace(r->contents_list.begin() + r->contents_selected + 1, id, 1, 1);
451 r->contents_list.emplace_back(
id, 1, 1);
452 r->contents_selected = oldlength;
455 gnc_column_view_set_option(r->odb,
"__general",
"report-list",
458 r->optwin->changed();
459 update_contents_lists(r);
463 gnc_column_view_edit_remove_cb(GtkButton * button, gpointer user_data)
465 auto r =
static_cast<gnc_column_view_edit *
>(user_data);
467 r->contents_list.erase(r->contents_list.begin() + r->contents_selected);
468 if (r->contents_selected)
469 --r->contents_selected;
470 gnc_column_view_set_option(r->odb,
"__general",
"report-list",
473 r->optwin->changed();
474 update_contents_lists(r);
478 move_selected_item(gnc_column_view_edit* r,
int increment)
480 if (!r || !increment)
483 auto cur_sel{r->contents_list.begin() + r->contents_selected};
484 auto move_to{cur_sel + increment};
486 std::reverse(cur_sel, move_to + 1);
488 std::reverse(move_to, cur_sel + 1);
489 r->contents_selected += increment;
491 gnc_column_view_set_option(r->odb,
"__general",
"report-list",
493 r->optwin->changed();
494 update_contents_lists(r);
498 gnc_edit_column_view_move_up_cb(GtkButton * button, gpointer user_data)
500 auto r =
static_cast<gnc_column_view_edit *
>(user_data);
501 move_selected_item(r, -1);
505 gnc_edit_column_view_move_down_cb(GtkButton * button, gpointer user_data)
507 auto r =
static_cast<gnc_column_view_edit *
>(user_data);
508 move_selected_item(r, 1);
512 gnc_column_view_edit_size_cb(GtkButton * button, gpointer user_data)
514 auto r =
static_cast<gnc_column_view_edit *
>(user_data);
521 builder = gtk_builder_new();
522 gnc_builder_add_from_file (builder,
"dialog-report.glade",
"col_adjustment");
523 gnc_builder_add_from_file (builder,
"dialog-report.glade",
"row_adjustment");
524 gnc_builder_add_from_file (builder,
"dialog-report.glade",
"edit_report_size");
525 dlg = GTK_WIDGET(gtk_builder_get_object (builder,
"edit_report_size"));
527 gtk_window_set_transient_for (GTK_WINDOW(dlg),
528 GTK_WINDOW(gtk_widget_get_toplevel (GTK_WIDGET(button))));
531 rowspin = GTK_WIDGET(gtk_builder_get_object (builder,
"row_spin"));
532 colspin = GTK_WIDGET(gtk_builder_get_object (builder,
"col_spin"));
534 if (r->contents_list.size() >
static_cast<size_t>(r->contents_selected))
536 auto [id, wide, high] = r->contents_list[r->contents_selected];
538 gtk_spin_button_set_value(GTK_SPIN_BUTTON(colspin),
539 static_cast<float>(wide));
540 gtk_spin_button_set_value(GTK_SPIN_BUTTON(rowspin),
541 static_cast<float>(high));
543 dlg_ret = gtk_dialog_run(GTK_DIALOG(dlg));
544 gtk_widget_hide(dlg);
546 if (dlg_ret == GTK_RESPONSE_OK)
548 std::get<1>(r->contents_list[r->contents_selected]) =
549 gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(colspin));
550 std::get<2>(r->contents_list[r->contents_selected]) =
551 gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(rowspin));
553 gnc_column_view_set_option(r->odb,
"__general",
"report-list",
555 r->optwin->changed();
556 update_contents_lists(r);
559 g_object_unref(G_OBJECT(builder));
561 gtk_widget_destroy(dlg);
Holds all of the options for a book, report, or stylesheet, organized by GncOptionSections.
GtkWindow * gnc_ui_get_main_window(GtkWidget *widget)
Get a pointer to the final GncMainWindow widget is rooted in.
void gnc_option_db_destroy(GncOptionDB *odb)
Destruct and release a GncOptionDB.
GList * gnc_option_db_commit(GncOptionDB *odb)
Write all changed ui_item values to their options.
Implementation details for GncOptionDB.