From d0e13838611e1539ceeacc67c5be580a90f4a0c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Mon, 23 Jul 2018 13:10:34 +0200 Subject: [PATCH] reconstructed code to use g_application --- CMakeLists.txt | 3 +- main-window.c | 297 ++++++++++++++++++++++++++++++++++++++++++++++++ main-window.h | 8 ++ main.c | 300 +++---------------------------------------------- 4 files changed, 319 insertions(+), 289 deletions(-) create mode 100644 main-window.c create mode 100644 main-window.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a487249..76f0d94 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,8 +18,7 @@ aux_source_directory("tree-renderer" RENDERER_SOURCES) aux_source_directory("gds-parser" PARSER_SOURCES) aux_source_directory("latex-output" LATEX_SOURCES) aux_source_directory("cairo-output" CAIRO_SOURCES) -set(SOURCE "main.c" "layer-selector.c") - +set(SOURCE "main.c" "layer-selector.c" "main-window.c") set(SOURCE ${SOURCE} diff --git a/main-window.c b/main-window.c new file mode 100644 index 0000000..e2d860d --- /dev/null +++ b/main-window.c @@ -0,0 +1,297 @@ +#include "main-window.h" +#include +#include "gds-parser/gds-parser.h" +#include +#include "layer-selector.h" +#include "tree-renderer/tree-store.h" +#include "latex-output/latex-output.h" +#include "widgets/conv-settings-dialog.h" +#include "cairo-output/cairo-output.h" + +struct open_button_data { + GtkWindow *main_window; + GList **list_ptr; + GtkTreeStore *cell_store; + GtkListBox *layer_box; +}; + +struct convert_button_data { + GtkTreeView *tree_view; + GtkWindow *main_window; +}; + +static gboolean on_window_close(gpointer window, gpointer user) +{ + gtk_widget_destroy(GTK_WIDGET(window)); + return TRUE; +} + +static GString *generate_string_from_date(struct gds_time_field *date) +{ + GString *str; + + str = g_string_new_len(NULL, 50); + g_string_printf(str, "%02u.%02u.%u - %02u:%02u", + (unsigned int)date->day, + (unsigned int)date->month, + (unsigned int)date->year, + (unsigned int)date->hour, + (unsigned int)date->minute); + return str; +} + + +static void on_load_gds(gpointer button, gpointer user) +{ + GList *cell; + GtkTreeIter libiter; + GtkTreeIter celliter; + GList *lib; + struct gds_library *gds_lib; + struct gds_cell *gds_c; + struct open_button_data *ptr = (struct open_button_data *)user; + GtkTreeStore *store = ptr->cell_store; + GtkWidget *open_dialog; + GtkFileChooser *file_chooser; + GtkFileFilter *filter; + GtkStyleContext *button_style; + gint dialog_result; + int gds_result; + char *filename; + GString *mod_date; + GString *acc_date; + + open_dialog = gtk_file_chooser_dialog_new("Open GDSII File", ptr->main_window, GTK_FILE_CHOOSER_ACTION_OPEN, + "Cancel", GTK_RESPONSE_CANCEL, "Open GDSII", GTK_RESPONSE_ACCEPT, NULL); + file_chooser = GTK_FILE_CHOOSER(open_dialog); + /* Add GDS II Filter */ + filter = gtk_file_filter_new(); + gtk_file_filter_add_pattern(filter, "*.gds"); + gtk_file_filter_set_name(filter, "GDSII-Files"); + gtk_file_chooser_add_filter(file_chooser, filter); + + dialog_result = gtk_dialog_run(GTK_DIALOG(open_dialog)); + + if (dialog_result == GTK_RESPONSE_ACCEPT) { + + /* Get File name */ + filename = gtk_file_chooser_get_filename(file_chooser); + + gtk_tree_store_clear(store); + clear_lib_list(ptr->list_ptr); + + /* Parse new GDSII file */ + gds_result = parse_gds_from_file(filename, ptr->list_ptr); + + /* Delete file name afterwards */ + g_free(filename); + if (gds_result) + goto end_destroy; + + /* remove suggested action from Open button */ + button_style = gtk_widget_get_style_context(GTK_WIDGET(button)); + gtk_style_context_remove_class(button_style, "suggested-action"); + + for (lib = *(ptr->list_ptr); lib != NULL; lib = lib->next) { + gds_lib = (struct gds_library *)lib->data; + /* Create top level iter */ + gtk_tree_store_append (store, &libiter, NULL); + + /* Convert dates to String */ + mod_date = generate_string_from_date(&gds_lib->mod_time); + acc_date = generate_string_from_date(&gds_lib->access_time); + + gtk_tree_store_set (store, &libiter, + CELL_SEL_LIBRARY, gds_lib, + CELL_SEL_MODDATE, mod_date->str, + CELL_SEL_ACCESSDATE, acc_date->str, + -1); + + /* Delete GStrings including string data. */ + /* Cell store copies String type data items */ + g_string_free(mod_date, TRUE); + g_string_free(acc_date, TRUE); + + for (cell = gds_lib->cells; cell != NULL; cell = cell->next) { + gds_c = (struct gds_cell *)cell->data; + gtk_tree_store_append (store, &celliter, &libiter); + + /* Convert dates to String */ + mod_date = generate_string_from_date(&gds_c->mod_time); + acc_date = generate_string_from_date(&gds_c->access_time); + + gtk_tree_store_set (store, &celliter, + CELL_SEL_CELL, gds_c, + CELL_SEL_MODDATE, mod_date->str, + CELL_SEL_ACCESSDATE, acc_date->str, + -1); + + /* Delete GStrings including string data. */ + /* Cell store copies String type data items */ + g_string_free(mod_date, TRUE); + g_string_free(acc_date, TRUE); + } + } + + /* Create Layers in Layer Box */ + generate_layer_widgets(ptr->layer_box, *(ptr->list_ptr)); + } + +end_destroy: + /* Destroy dialog and filter */ + gtk_widget_destroy(open_dialog); +} + +static void on_convert_clicked(gpointer button, gpointer user) +{ + static struct render_settings sett = { + .scale = 1000.0f, + .renderer = RENDERER_LATEX_TIKZ, + }; + struct convert_button_data *data = (struct convert_button_data *)user; + GtkTreeSelection *selection; + GtkTreeIter iter; + GtkTreeModel *model; + GList *layer_list; + struct gds_cell *cell_to_render; + FILE *output_file; + GtkWidget *dialog; + RendererSettingsDialog *settings; + GtkFileFilter *filter; + gint res; + char *file_name; + + /* Get selected cell */ + selection = gtk_tree_view_get_selection(data->tree_view); + if (gtk_tree_selection_get_selected(selection, &model, &iter) == FALSE) + return; + + gtk_tree_model_get(model, &iter, CELL_SEL_CELL, &cell_to_render, -1); + + if (!cell_to_render) + return; + + /* Get layers that are rendered */ + layer_list = export_rendered_layer_info(); + + settings = renderer_settings_dialog_new(GTK_WINDOW(data->main_window)); + renderer_settings_dialog_set_settings(settings, &sett); + res = gtk_dialog_run(GTK_DIALOG(settings)); + if (res == GTK_RESPONSE_OK) { + renderer_settings_dialog_get_settings(settings, &sett); + gtk_widget_destroy(GTK_WIDGET(settings)); + } else { + gtk_widget_destroy(GTK_WIDGET(settings)); + goto ret_layer_destroy; + } + + + + /* save file dialog */ + dialog = gtk_file_chooser_dialog_new((sett.renderer == RENDERER_LATEX_TIKZ + ? "Save LaTeX File" : "Save PDF"), + GTK_WINDOW(data->main_window), GTK_FILE_CHOOSER_ACTION_SAVE, + "Cancel", GTK_RESPONSE_CANCEL, "Save", GTK_RESPONSE_ACCEPT, NULL); + /* Set file filter according to settings */ + filter = gtk_file_filter_new(); + if (sett.renderer == RENDERER_LATEX_TIKZ) { + gtk_file_filter_add_pattern(filter, "*.tex"); + gtk_file_filter_set_name(filter, "LaTeX-Files"); + } else { + gtk_file_filter_add_pattern(filter, "*.pdf"); + gtk_file_filter_set_name(filter, "PDF-Files"); + } + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter); + + res = gtk_dialog_run(GTK_DIALOG(dialog)); + if (res == GTK_RESPONSE_ACCEPT) { + file_name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + gtk_widget_destroy(dialog); + + switch (sett.renderer) { + case RENDERER_LATEX_TIKZ: + output_file = fopen(file_name, "w"); + latex_render_cell_to_code(cell_to_render, layer_list, output_file, sett.scale, + sett.tex_pdf_layers, sett.tex_standalone); + fclose(output_file); + break; + case RENDERER_CAIROGRAPHICS: + cairo_render_cell_to_pdf(cell_to_render, layer_list, file_name, sett.scale); + break; + } + g_free(file_name); + + } else { + gtk_widget_destroy(dialog); + } +ret_layer_destroy: + g_list_free_full(layer_list, (GDestroyNotify)delete_layer_info_struct); +} + +/* This function activates/deactivates the convert button depending on whether + * a cell is selected for conversion or not */ +static void cell_selection_changed(GtkTreeSelection *sel, GtkWidget *convert_button) +{ + GtkTreeModel *model = NULL; + GtkTreeIter iter; + + if (gtk_tree_selection_get_selected(sel, &model, &iter)) { + /* Node selected. Show button */ + gtk_widget_set_sensitive(convert_button, TRUE); + } else { + gtk_widget_set_sensitive(convert_button, FALSE); + } +} + +GtkWindow *create_main_window() +{ + GtkBuilder *main_builder; + GtkTreeView *cell_tree; + GtkTreeStore *cell_store; + GtkWidget *listbox; + GtkWidget *conv_button; + static GList *gds_libs; + static struct open_button_data open_data; + static struct convert_button_data conv_data; + + main_builder = gtk_builder_new_from_resource("/main.glade"); + gtk_builder_connect_signals(main_builder, NULL); + + + + cell_tree = GTK_TREE_VIEW(gtk_builder_get_object(main_builder, "cell-tree")); + cell_store = setup_cell_selector(cell_tree); + + + open_data.cell_store = cell_store; + open_data.list_ptr = &gds_libs; + open_data.main_window = GTK_WINDOW(gtk_builder_get_object(main_builder, "main-window")); + g_signal_connect(GTK_WIDGET(gtk_builder_get_object(main_builder, "button-load-gds")), + "clicked", G_CALLBACK(on_load_gds), (gpointer)&open_data); + + /* Connect delete-event */ + g_signal_connect(GTK_WIDGET(open_data.main_window), "delete-event", + G_CALLBACK(on_window_close), NULL); + + /* Connect Convert button */ + conv_data.tree_view = cell_tree; + conv_data.main_window = open_data.main_window; + + conv_button = GTK_WIDGET(gtk_builder_get_object(main_builder, "convert-button")); + g_signal_connect(conv_button, "clicked", G_CALLBACK(on_convert_clicked), &conv_data); + + listbox = GTK_WIDGET(gtk_builder_get_object(main_builder, "layer-list")); + open_data.layer_box = GTK_LIST_BOX(listbox); + + /* Set buttons fpr layer mapping GUI */ + setup_load_mapping_callback(GTK_WIDGET(gtk_builder_get_object(main_builder, "button-load-mapping")), + open_data.main_window); + setup_save_mapping_callback(GTK_WIDGET(gtk_builder_get_object(main_builder, "button-save-mapping")), + open_data.main_window); + + /* Callback for selection change of cell selector */ + g_signal_connect(G_OBJECT(gtk_tree_view_get_selection(cell_tree)), "changed", + G_CALLBACK(cell_selection_changed), conv_button); + + return (conv_data.main_window); +} diff --git a/main-window.h b/main-window.h new file mode 100644 index 0000000..15b9b26 --- /dev/null +++ b/main-window.h @@ -0,0 +1,8 @@ +#ifndef _MAIN_WINDOW_H_ +#define _MAIN_WINDOW_H_ + +#include + +GtkWindow *create_main_window(); + +#endif /* _MAIN_WINDOW_H_ */ diff --git a/main.c b/main.c index ba51bb7..4ca6839 100644 --- a/main.c +++ b/main.c @@ -18,303 +18,29 @@ */ #include -#include "gds-parser/gds-parser.h" #include -#include "layer-selector.h" -#include "tree-renderer/tree-store.h" -#include "latex-output/latex-output.h" -#include "widgets/conv-settings-dialog.h" -#include "cairo-output/cairo-output.h" +#include "main-window.h" -struct open_button_data { + +static void gapp_activate(GApplication *app, gpointer user_data) +{ GtkWindow *main_window; - GList **list_ptr; - GtkTreeStore *cell_store; - GtkListBox *layer_box; -}; -struct convert_button_data { - GtkTreeView *tree_view; - GtkWindow *main_window; -}; - -gboolean on_window_close(gpointer window, gpointer user) -{ - gtk_widget_destroy(GTK_WIDGET(window)); - gtk_main_quit(); - return TRUE; -} - -static GString *generate_string_from_date(struct gds_time_field *date) -{ - GString *str; - - str = g_string_new_len(NULL, 50); - g_string_printf(str, "%02u.%02u.%u - %02u:%02u", - (unsigned int)date->day, - (unsigned int)date->month, - (unsigned int)date->year, - (unsigned int)date->hour, - (unsigned int)date->minute); - return str; -} - -void on_load_gds(gpointer button, gpointer user) -{ - GList *cell; - GtkTreeIter libiter; - GtkTreeIter celliter; - GList *lib; - struct gds_library *gds_lib; - struct gds_cell *gds_c; - struct open_button_data *ptr = (struct open_button_data *)user; - GtkTreeStore *store = ptr->cell_store; - GtkWidget *open_dialog; - GtkFileChooser *file_chooser; - GtkFileFilter *filter; - GtkStyleContext *button_style; - gint dialog_result; - int gds_result; - char *filename; - GString *mod_date; - GString *acc_date; - - open_dialog = gtk_file_chooser_dialog_new("Open GDSII File", ptr->main_window, GTK_FILE_CHOOSER_ACTION_OPEN, - "Cancel", GTK_RESPONSE_CANCEL, "Open GDSII", GTK_RESPONSE_ACCEPT, NULL); - file_chooser = GTK_FILE_CHOOSER(open_dialog); - /* Add GDS II Filter */ - filter = gtk_file_filter_new(); - gtk_file_filter_add_pattern(filter, "*.gds"); - gtk_file_filter_set_name(filter, "GDSII-Files"); - gtk_file_chooser_add_filter(file_chooser, filter); - - dialog_result = gtk_dialog_run(GTK_DIALOG(open_dialog)); - - if (dialog_result == GTK_RESPONSE_ACCEPT) { - - /* Get File name */ - filename = gtk_file_chooser_get_filename(file_chooser); - - gtk_tree_store_clear(store); - clear_lib_list(ptr->list_ptr); - - /* Parse new GDSII file */ - gds_result = parse_gds_from_file(filename, ptr->list_ptr); - - /* Delete file name afterwards */ - g_free(filename); - if (gds_result) - goto end_destroy; - - /* remove suggested action from Open button */ - button_style = gtk_widget_get_style_context(GTK_WIDGET(button)); - gtk_style_context_remove_class(button_style, "suggested-action"); - - for (lib = *(ptr->list_ptr); lib != NULL; lib = lib->next) { - gds_lib = (struct gds_library *)lib->data; - /* Create top level iter */ - gtk_tree_store_append (store, &libiter, NULL); - - /* Convert dates to String */ - mod_date = generate_string_from_date(&gds_lib->mod_time); - acc_date = generate_string_from_date(&gds_lib->access_time); - - gtk_tree_store_set (store, &libiter, - CELL_SEL_LIBRARY, gds_lib, - CELL_SEL_MODDATE, mod_date->str, - CELL_SEL_ACCESSDATE, acc_date->str, - -1); - - /* Delete GStrings including string data. */ - /* Cell store copies String type data items */ - g_string_free(mod_date, TRUE); - g_string_free(acc_date, TRUE); - - for (cell = gds_lib->cells; cell != NULL; cell = cell->next) { - gds_c = (struct gds_cell *)cell->data; - gtk_tree_store_append (store, &celliter, &libiter); - - /* Convert dates to String */ - mod_date = generate_string_from_date(&gds_c->mod_time); - acc_date = generate_string_from_date(&gds_c->access_time); - - gtk_tree_store_set (store, &celliter, - CELL_SEL_CELL, gds_c, - CELL_SEL_MODDATE, mod_date->str, - CELL_SEL_ACCESSDATE, acc_date->str, - -1); - - /* Delete GStrings including string data. */ - /* Cell store copies String type data items */ - g_string_free(mod_date, TRUE); - g_string_free(acc_date, TRUE); - } - } - - /* Create Layers in Layer Box */ - generate_layer_widgets(ptr->layer_box, *(ptr->list_ptr)); - } - -end_destroy: - /* Destroy dialog and filter */ - gtk_widget_destroy(open_dialog); -} - -static void on_convert_clicked(gpointer button, gpointer user) -{ - static struct render_settings sett = { - .scale = 1000.0f, - .renderer = RENDERER_LATEX_TIKZ, - }; - struct convert_button_data *data = (struct convert_button_data *)user; - GtkTreeSelection *selection; - GtkTreeIter iter; - GtkTreeModel *model; - GList *layer_list; - struct gds_cell *cell_to_render; - FILE *output_file; - GtkWidget *dialog; - RendererSettingsDialog *settings; - GtkFileFilter *filter; - gint res; - char *file_name; - - /* Get selected cell */ - selection = gtk_tree_view_get_selection(data->tree_view); - if (gtk_tree_selection_get_selected(selection, &model, &iter) == FALSE) - return; - - gtk_tree_model_get(model, &iter, CELL_SEL_CELL, &cell_to_render, -1); - - if (!cell_to_render) - return; - - /* Get layers that are rendered */ - layer_list = export_rendered_layer_info(); - - settings = renderer_settings_dialog_new(GTK_WINDOW(data->main_window)); - renderer_settings_dialog_set_settings(settings, &sett); - res = gtk_dialog_run(GTK_DIALOG(settings)); - if (res == GTK_RESPONSE_OK) { - renderer_settings_dialog_get_settings(settings, &sett); - gtk_widget_destroy(GTK_WIDGET(settings)); - } else { - gtk_widget_destroy(GTK_WIDGET(settings)); - goto ret_layer_destroy; - } - - - - /* save file dialog */ - dialog = gtk_file_chooser_dialog_new((sett.renderer == RENDERER_LATEX_TIKZ - ? "Save LaTeX File" : "Save PDF"), - GTK_WINDOW(data->main_window), GTK_FILE_CHOOSER_ACTION_SAVE, - "Cancel", GTK_RESPONSE_CANCEL, "Save", GTK_RESPONSE_ACCEPT, NULL); - /* Set file filter according to settings */ - filter = gtk_file_filter_new(); - if (sett.renderer == RENDERER_LATEX_TIKZ) { - gtk_file_filter_add_pattern(filter, "*.tex"); - gtk_file_filter_set_name(filter, "LaTeX-Files"); - } else { - gtk_file_filter_add_pattern(filter, "*.pdf"); - gtk_file_filter_set_name(filter, "PDF-Files"); - } - gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter); - - res = gtk_dialog_run(GTK_DIALOG(dialog)); - if (res == GTK_RESPONSE_ACCEPT) { - file_name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); - gtk_widget_destroy(dialog); - - switch (sett.renderer) { - case RENDERER_LATEX_TIKZ: - output_file = fopen(file_name, "w"); - latex_render_cell_to_code(cell_to_render, layer_list, output_file, sett.scale, - sett.tex_pdf_layers, sett.tex_standalone); - fclose(output_file); - break; - case RENDERER_CAIROGRAPHICS: - cairo_render_cell_to_pdf(cell_to_render, layer_list, file_name, sett.scale); - break; - } - g_free(file_name); - - } else { - gtk_widget_destroy(dialog); - } -ret_layer_destroy: - g_list_free_full(layer_list, (GDestroyNotify)delete_layer_info_struct); -} - -/* This function activates/deactivates the convert button depending on whether - * a cell is selected for conversion or not */ -static void cell_selection_changed(GtkTreeSelection *sel, GtkWidget *convert_button) -{ - GtkTreeModel *model = NULL; - GtkTreeIter iter; - - if (gtk_tree_selection_get_selected(sel, &model, &iter)) { - /* Node selected. Show button */ - gtk_widget_set_sensitive(convert_button, TRUE); - } else { - gtk_widget_set_sensitive(convert_button, FALSE); - } + main_window = create_main_window(); + gtk_application_add_window(GTK_APPLICATION(app), main_window); } int main(int argc, char **argv) { - GtkBuilder *main_builder; - GList *gds_libs = NULL; - GtkTreeView *cell_tree; - GtkTreeStore *cell_store; - GtkWidget *conv_button; - GtkWidget *listbox; + GtkApplication *gapp; + int app_status; - struct open_button_data open_data; - struct convert_button_data conv_data; - - gtk_init(&argc, &argv); - - main_builder = gtk_builder_new_from_resource("/main.glade"); - gtk_builder_connect_signals(main_builder, NULL); + gapp = gtk_application_new("de.shimatta.gds-render", G_APPLICATION_FLAGS_NONE); + g_signal_connect (gapp, "activate", G_CALLBACK(gapp_activate), NULL); + app_status = g_application_run (G_APPLICATION(gapp), argc, argv); + g_object_unref (gapp); - cell_tree = (GtkTreeView *)gtk_builder_get_object(main_builder, "cell-tree"); - cell_store = setup_cell_selector(cell_tree); - - - open_data.cell_store = cell_store; - open_data.list_ptr = &gds_libs; - open_data.main_window = GTK_WINDOW(gtk_builder_get_object(main_builder, "main-window")); - g_signal_connect(GTK_WIDGET(gtk_builder_get_object(main_builder, "button-load-gds")), - "clicked", G_CALLBACK(on_load_gds), (gpointer)&open_data); - - /* Connect delete-event */ - g_signal_connect(GTK_WIDGET(open_data.main_window), "delete-event", G_CALLBACK(on_window_close), NULL); - - - /* Connect Convert button */ - conv_data.tree_view = cell_tree; - conv_data.main_window = open_data.main_window; - - conv_button = GTK_WIDGET(gtk_builder_get_object(main_builder, "convert-button")); - g_signal_connect(conv_button, "clicked", G_CALLBACK(on_convert_clicked), &conv_data); - - listbox = GTK_WIDGET(gtk_builder_get_object(main_builder, "layer-list")); - open_data.layer_box = GTK_LIST_BOX(listbox); - - /* Set buttons fpr layer mapping GUI */ - setup_load_mapping_callback(GTK_WIDGET(gtk_builder_get_object(main_builder, "button-load-mapping")), - open_data.main_window); - setup_save_mapping_callback(GTK_WIDGET(gtk_builder_get_object(main_builder, "button-save-mapping")), - open_data.main_window); - - /* Callback for selection change of cell selector */ - g_signal_connect(G_OBJECT(gtk_tree_view_get_selection(cell_tree)), "changed", - G_CALLBACK(cell_selection_changed), conv_button); - - gtk_main(); - - return 0; + return app_status; }