Compare commits
3 Commits
master
...
46-open-fi
Author | SHA1 | Date | |
---|---|---|---|
ce50fb708a | |||
14b1e8e22f | |||
bc2fe92e07 |
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)
|
||||
{
|
||||
GList *cell;
|
||||
GtkTreeIter libiter;
|
||||
GtkTreeIter celliter;
|
||||
GList *lib;
|
||||
struct gds_library *gds_lib;
|
||||
struct gds_cell *gds_c;
|
||||
(void)button;
|
||||
GdsRenderGui *self;
|
||||
GtkWidget *open_dialog;
|
||||
GtkFileChooser *file_chooser;
|
||||
GtkFileFilter *filter;
|
||||
GtkStyleContext *button_style;
|
||||
gint dialog_result;
|
||||
int gds_result;
|
||||
char *filename;
|
||||
unsigned int cell_error_level;
|
||||
|
||||
const struct gds_library_parsing_opts gds_parsing_options = {
|
||||
.simplified_polygons = 1,
|
||||
};
|
||||
|
||||
self = RENDERER_GUI(user);
|
||||
if (!self)
|
||||
@ -319,59 +307,9 @@ static void on_load_gds(gpointer button, gpointer user)
|
||||
/* Get File name */
|
||||
filename = gtk_file_chooser_get_filename(file_chooser);
|
||||
|
||||
gtk_tree_store_clear(self->cell_tree_store);
|
||||
clear_lib_list(&self->gds_libraries);
|
||||
gds_render_gui_open_gds(self, filename);
|
||||
|
||||
/* Parse new GDSII file */
|
||||
gds_result = parse_gds_from_file(filename, &self->gds_libraries, &gds_parsing_options);
|
||||
|
||||
/* 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 = 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:
|
||||
/* Destroy dialog and filter */
|
||||
@ -758,6 +696,76 @@ GtkWindow *gds_render_gui_get_main_window(GdsRenderGui *gui)
|
||||
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)
|
||||
{
|
||||
GtkBuilder *main_builder;
|
||||
|
@ -54,6 +54,13 @@ GdsRenderGui *gds_render_gui_new();
|
||||
*/
|
||||
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
|
||||
|
||||
/** @} */
|
||||
|
36
main.c
36
main.c
@ -40,6 +40,8 @@
|
||||
struct application_data {
|
||||
GtkApplication *app;
|
||||
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;
|
||||
GdsRenderGui *gui;
|
||||
char *open_file_path;
|
||||
struct application_data * const appdata = (struct application_data *)user_data;
|
||||
|
||||
gui = gds_render_gui_new();
|
||||
@ -166,11 +169,32 @@ static void gapp_activate(GApplication *app, gpointer user_data)
|
||||
g_signal_connect(gui, "window-closed", G_CALLBACK(gui_window_closed_callback), &appdata->gui_list);
|
||||
|
||||
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_widget_show(GTK_WIDGET(main_window));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Activation of GUI when opening a file from commandline
|
||||
* @param app he GApplication reference
|
||||
* @param user_data Used to store the individual GUI instances.
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Start the graphical interface.
|
||||
*
|
||||
@ -188,7 +212,9 @@ static int start_gui(int argc, char **argv)
|
||||
GString *application_domain;
|
||||
int app_status;
|
||||
static struct application_data appdata = {
|
||||
.gui_list = NULL
|
||||
.gui_list = NULL,
|
||||
.num_files_to_open = 0,
|
||||
.files = NULL,
|
||||
};
|
||||
GMenu *menu;
|
||||
GMenu *m_quit;
|
||||
@ -201,10 +227,11 @@ static int start_gui(int argc, char **argv)
|
||||
application_domain = g_string_new(NULL);
|
||||
g_string_printf(application_domain, "de.shimatta.gds_render_%s", _app_git_commit);
|
||||
|
||||
gapp = gtk_application_new(application_domain->str, G_APPLICATION_FLAGS_NONE);
|
||||
gapp = gtk_application_new(application_domain->str, G_APPLICATION_HANDLES_OPEN);
|
||||
g_string_free(application_domain, TRUE);
|
||||
|
||||
g_application_register(G_APPLICATION(gapp), NULL, NULL);
|
||||
g_signal_connect(gapp, "open", G_CALLBACK(gapp_activate_open), &appdata);
|
||||
g_signal_connect(gapp, "activate", G_CALLBACK(gapp_activate), &appdata);
|
||||
|
||||
if (g_application_get_is_remote(G_APPLICATION(gapp)) == TRUE) {
|
||||
@ -311,7 +338,8 @@ int main(int argc, char **argv)
|
||||
goto ret_status;
|
||||
}
|
||||
|
||||
if (argc >= 2) {
|
||||
/* A minimum of a file name and a cell or analyze command are needed to use CLI */
|
||||
if (argc >= 2 && (analyze || cellname || output_paths)) {
|
||||
if (scale < 1) {
|
||||
printf(_("Scale < 1 not allowed. Setting to 1\n"));
|
||||
scale = 1;
|
||||
|
Loading…
Reference in New Issue
Block a user