#46: First draft for file open handle. Still buggy when multiple windows are opened
This commit is contained in:
parent
14b1e8e22f
commit
ce50fb708a
136
gds-render-gui.c
136
gds-render-gui.c
@ -274,25 +274,13 @@ const struct gds_cell_statistics cc = {
|
|||||||
*/
|
*/
|
||||||
static void on_load_gds(gpointer button, gpointer user)
|
static void on_load_gds(gpointer button, gpointer user)
|
||||||
{
|
{
|
||||||
GList *cell;
|
(void)button;
|
||||||
GtkTreeIter libiter;
|
|
||||||
GtkTreeIter celliter;
|
|
||||||
GList *lib;
|
|
||||||
struct gds_library *gds_lib;
|
|
||||||
struct gds_cell *gds_c;
|
|
||||||
GdsRenderGui *self;
|
GdsRenderGui *self;
|
||||||
GtkWidget *open_dialog;
|
GtkWidget *open_dialog;
|
||||||
GtkFileChooser *file_chooser;
|
GtkFileChooser *file_chooser;
|
||||||
GtkFileFilter *filter;
|
GtkFileFilter *filter;
|
||||||
GtkStyleContext *button_style;
|
|
||||||
gint dialog_result;
|
gint dialog_result;
|
||||||
int gds_result;
|
|
||||||
char *filename;
|
char *filename;
|
||||||
unsigned int cell_error_level;
|
|
||||||
|
|
||||||
const struct gds_library_parsing_opts gds_parsing_options = {
|
|
||||||
.simplified_polygons = 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
self = RENDERER_GUI(user);
|
self = RENDERER_GUI(user);
|
||||||
if (!self)
|
if (!self)
|
||||||
@ -319,59 +307,9 @@ static void on_load_gds(gpointer button, gpointer user)
|
|||||||
/* Get File name */
|
/* Get File name */
|
||||||
filename = gtk_file_chooser_get_filename(file_chooser);
|
filename = gtk_file_chooser_get_filename(file_chooser);
|
||||||
|
|
||||||
gtk_tree_store_clear(self->cell_tree_store);
|
gds_render_gui_open_gds(self, filename);
|
||||||
clear_lib_list(&self->gds_libraries);
|
|
||||||
|
|
||||||
/* Parse new GDSII file */
|
|
||||||
gds_result = parse_gds_from_file(filename, &self->gds_libraries, &gds_parsing_options);
|
|
||||||
|
|
||||||
/* Delete file name afterwards */
|
|
||||||
g_free(filename);
|
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 = self->gds_libraries; lib != NULL; lib = lib->next) {
|
|
||||||
gds_lib = (struct gds_library *)lib->data;
|
|
||||||
/* Create top level iter */
|
|
||||||
gtk_tree_store_append(self->cell_tree_store, &libiter, NULL);
|
|
||||||
|
|
||||||
gtk_tree_store_set(self->cell_tree_store, &libiter,
|
|
||||||
CELL_SEL_LIBRARY, gds_lib,
|
|
||||||
-1);
|
|
||||||
|
|
||||||
/* Check this library. This might take a while */
|
|
||||||
(void)gds_tree_check_cell_references(gds_lib);
|
|
||||||
(void)gds_tree_check_reference_loops(gds_lib);
|
|
||||||
|
|
||||||
for (cell = gds_lib->cells; cell != NULL; cell = cell->next) {
|
|
||||||
gds_c = (struct gds_cell *)cell->data;
|
|
||||||
gtk_tree_store_append(self->cell_tree_store, &celliter, &libiter);
|
|
||||||
|
|
||||||
/* Get the checking results for this cell */
|
|
||||||
cell_error_level = 0;
|
|
||||||
if (gds_c->checks.unresolved_child_count)
|
|
||||||
cell_error_level |= LIB_CELL_RENDERER_ERROR_WARN;
|
|
||||||
|
|
||||||
/* Check if it is completely b0rken */
|
|
||||||
if (gds_c->checks.affected_by_reference_loop)
|
|
||||||
cell_error_level |= LIB_CELL_RENDERER_ERROR_ERR;
|
|
||||||
|
|
||||||
/* Add cell to tree store model */
|
|
||||||
gtk_tree_store_set(self->cell_tree_store, &celliter,
|
|
||||||
CELL_SEL_CELL, gds_c,
|
|
||||||
CELL_SEL_CELL_ERROR_STATE, cell_error_level,
|
|
||||||
CELL_SEL_LIBRARY, gds_c->parent_library,
|
|
||||||
CELL_SEL_STAT, &gds_c->stats,
|
|
||||||
-1);
|
|
||||||
} /* for cells */
|
|
||||||
} /* for libraries */
|
|
||||||
|
|
||||||
/* Create Layers in Layer Box */
|
|
||||||
layer_selector_generate_layer_widgets(self->layer_selector, self->gds_libraries);
|
|
||||||
|
|
||||||
end_destroy:
|
end_destroy:
|
||||||
/* Destroy dialog and filter */
|
/* Destroy dialog and filter */
|
||||||
@ -758,6 +696,76 @@ GtkWindow *gds_render_gui_get_main_window(GdsRenderGui *gui)
|
|||||||
return gui->main_window;
|
return gui->main_window;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void gds_render_gui_open_gds(GdsRenderGui *self, const char *path)
|
||||||
|
{
|
||||||
|
GList *cell;
|
||||||
|
GtkTreeIter libiter;
|
||||||
|
GtkTreeIter celliter;
|
||||||
|
GList *lib;
|
||||||
|
struct gds_library *gds_lib;
|
||||||
|
struct gds_cell *gds_c;
|
||||||
|
GtkStyleContext *button_style;
|
||||||
|
int gds_result;
|
||||||
|
unsigned int cell_error_level;
|
||||||
|
|
||||||
|
const struct gds_library_parsing_opts gds_parsing_options = {
|
||||||
|
.simplified_polygons = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
gtk_tree_store_clear(self->cell_tree_store);
|
||||||
|
clear_lib_list(&self->gds_libraries);
|
||||||
|
|
||||||
|
/* Parse new GDSII file */
|
||||||
|
gds_result = parse_gds_from_file(path, &self->gds_libraries, &gds_parsing_options);
|
||||||
|
|
||||||
|
/* Delete file name afterwards */
|
||||||
|
if (gds_result)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* remove suggested action from Open button */
|
||||||
|
button_style = gtk_widget_get_style_context(self->open_button);
|
||||||
|
gtk_style_context_remove_class(button_style, "suggested-action");
|
||||||
|
|
||||||
|
for (lib = self->gds_libraries; lib != NULL; lib = lib->next) {
|
||||||
|
gds_lib = (struct gds_library *)lib->data;
|
||||||
|
/* Create top level iter */
|
||||||
|
gtk_tree_store_append(self->cell_tree_store, &libiter, NULL);
|
||||||
|
|
||||||
|
gtk_tree_store_set(self->cell_tree_store, &libiter,
|
||||||
|
CELL_SEL_LIBRARY, gds_lib,
|
||||||
|
-1);
|
||||||
|
|
||||||
|
/* Check this library. This might take a while */
|
||||||
|
(void)gds_tree_check_cell_references(gds_lib);
|
||||||
|
(void)gds_tree_check_reference_loops(gds_lib);
|
||||||
|
|
||||||
|
for (cell = gds_lib->cells; cell != NULL; cell = cell->next) {
|
||||||
|
gds_c = (struct gds_cell *)cell->data;
|
||||||
|
gtk_tree_store_append(self->cell_tree_store, &celliter, &libiter);
|
||||||
|
|
||||||
|
/* Get the checking results for this cell */
|
||||||
|
cell_error_level = 0;
|
||||||
|
if (gds_c->checks.unresolved_child_count)
|
||||||
|
cell_error_level |= LIB_CELL_RENDERER_ERROR_WARN;
|
||||||
|
|
||||||
|
/* Check if it is completely b0rken */
|
||||||
|
if (gds_c->checks.affected_by_reference_loop)
|
||||||
|
cell_error_level |= LIB_CELL_RENDERER_ERROR_ERR;
|
||||||
|
|
||||||
|
/* Add cell to tree store model */
|
||||||
|
gtk_tree_store_set(self->cell_tree_store, &celliter,
|
||||||
|
CELL_SEL_CELL, gds_c,
|
||||||
|
CELL_SEL_CELL_ERROR_STATE, cell_error_level,
|
||||||
|
CELL_SEL_LIBRARY, gds_c->parent_library,
|
||||||
|
CELL_SEL_STAT, &gds_c->stats,
|
||||||
|
-1);
|
||||||
|
} /* for cells */
|
||||||
|
} /* for libraries */
|
||||||
|
|
||||||
|
/* Create Layers in Layer Box */
|
||||||
|
layer_selector_generate_layer_widgets(self->layer_selector, self->gds_libraries);
|
||||||
|
}
|
||||||
|
|
||||||
static void gds_render_gui_init(GdsRenderGui *self)
|
static void gds_render_gui_init(GdsRenderGui *self)
|
||||||
{
|
{
|
||||||
GtkBuilder *main_builder;
|
GtkBuilder *main_builder;
|
||||||
|
@ -54,6 +54,13 @@ GdsRenderGui *gds_render_gui_new();
|
|||||||
*/
|
*/
|
||||||
GtkWindow *gds_render_gui_get_main_window(GdsRenderGui *gui);
|
GtkWindow *gds_render_gui_get_main_window(GdsRenderGui *gui);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief gds_render_gui_open_gds Open a GDS file. Emulates the manual load via GUI open button
|
||||||
|
* @param self GUI instance
|
||||||
|
* @param path file path
|
||||||
|
*/
|
||||||
|
void gds_render_gui_open_gds(GdsRenderGui *self, const char *path);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
20
main.c
20
main.c
@ -40,6 +40,8 @@
|
|||||||
struct application_data {
|
struct application_data {
|
||||||
GtkApplication *app;
|
GtkApplication *app;
|
||||||
GList *gui_list;
|
GList *gui_list;
|
||||||
|
gint num_files_to_open;
|
||||||
|
GFile **files;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -158,6 +160,7 @@ static void gapp_activate(GApplication *app, gpointer user_data)
|
|||||||
{
|
{
|
||||||
GtkWindow *main_window;
|
GtkWindow *main_window;
|
||||||
GdsRenderGui *gui;
|
GdsRenderGui *gui;
|
||||||
|
char *open_file_path;
|
||||||
struct application_data * const appdata = (struct application_data *)user_data;
|
struct application_data * const appdata = (struct application_data *)user_data;
|
||||||
|
|
||||||
gui = gds_render_gui_new();
|
gui = gds_render_gui_new();
|
||||||
@ -166,7 +169,12 @@ static void gapp_activate(GApplication *app, gpointer user_data)
|
|||||||
g_signal_connect(gui, "window-closed", G_CALLBACK(gui_window_closed_callback), &appdata->gui_list);
|
g_signal_connect(gui, "window-closed", G_CALLBACK(gui_window_closed_callback), &appdata->gui_list);
|
||||||
|
|
||||||
main_window = gds_render_gui_get_main_window(gui);
|
main_window = gds_render_gui_get_main_window(gui);
|
||||||
|
if (appdata->num_files_to_open >= 1) {
|
||||||
|
/* Open first file. Multiple files are not supported and ignored */
|
||||||
|
open_file_path = g_file_get_path(appdata->files[0]);
|
||||||
|
gds_render_gui_open_gds(gui, open_file_path);
|
||||||
|
g_free(open_file_path);
|
||||||
|
}
|
||||||
gtk_application_add_window(GTK_APPLICATION(app), main_window);
|
gtk_application_add_window(GTK_APPLICATION(app), main_window);
|
||||||
gtk_widget_show(GTK_WIDGET(main_window));
|
gtk_widget_show(GTK_WIDGET(main_window));
|
||||||
}
|
}
|
||||||
@ -178,6 +186,12 @@ static void gapp_activate(GApplication *app, gpointer user_data)
|
|||||||
*/
|
*/
|
||||||
static void gapp_activate_open(GApplication *app, GFile** files, gint n_files, const gchar* hint, gpointer user_data)
|
static void gapp_activate_open(GApplication *app, GFile** files, gint n_files, const gchar* hint, gpointer user_data)
|
||||||
{
|
{
|
||||||
|
(void)hint;
|
||||||
|
struct application_data *appdata = (struct application_data *)user_data;
|
||||||
|
|
||||||
|
appdata->files = files;
|
||||||
|
appdata->num_files_to_open = n_files;
|
||||||
|
|
||||||
gapp_activate(app, user_data);
|
gapp_activate(app, user_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -198,7 +212,9 @@ static int start_gui(int argc, char **argv)
|
|||||||
GString *application_domain;
|
GString *application_domain;
|
||||||
int app_status;
|
int app_status;
|
||||||
static struct application_data appdata = {
|
static struct application_data appdata = {
|
||||||
.gui_list = NULL
|
.gui_list = NULL,
|
||||||
|
.num_files_to_open = 0,
|
||||||
|
.files = NULL,
|
||||||
};
|
};
|
||||||
GMenu *menu;
|
GMenu *menu;
|
||||||
GMenu *m_quit;
|
GMenu *m_quit;
|
||||||
|
Loading…
Reference in New Issue
Block a user