From 781c2a603a0791b15a5f3a770632f8b66a9b1b2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Wed, 16 May 2018 16:20:09 +0200 Subject: [PATCH] Implemente layer box * Layers can be added dynamically * Layers are sorted TODO: - implement load and save functions --- CMakeLists.txt | 4 +- glade/layer-widget.glade | 83 ++++++++++++++++++++++++++ glade/main.glade | 61 ++++++++++++++++---- layer-element.c | 91 +++++++++++++++++++++++++++-- layer-element.h | 22 ++++++- layer-selector.c | 122 +++++++++++++++++++++++++++++++++++++++ layer-selector.h | 23 ++++++++ main.c | 13 ++++- 8 files changed, 400 insertions(+), 19 deletions(-) create mode 100644 glade/layer-widget.glade create mode 100644 layer-selector.c create mode 100644 layer-selector.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a9fc953..47a38d5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,9 +7,9 @@ pkg_check_modules(GTK3 REQUIRED gtk+-3.0) include_directories(${GLIB_INCLUDE_DIRS} ${GTK3_INCLUDE_DIRS}) link_directories(${GLIB_LINK_DIRS} ${GTK3_LINK_DIRS}) configure_file(glade/main.glade glade/main.glade COPYONLY) +configure_file(glade/layer-widget.glade glade/layer-widget.glade COPYONLY) project(gds-render) -add_executable(${PROJECT_NAME} "main.c" "gdsparse.c" "layer-element.c") - +add_executable(${PROJECT_NAME} "main.c" "gdsparse.c" "layer-element.c" "layer-selector.c") target_link_libraries(${PROJECT_NAME} ${GLIB_LDFLAGS} ${GTK3_LDFLAGS} m) diff --git a/glade/layer-widget.glade b/glade/layer-widget.glade new file mode 100644 index 0000000..7f60d00 --- /dev/null +++ b/glade/layer-widget.glade @@ -0,0 +1,83 @@ + + + + + + 100 + 100 + 1 + 10 + + + True + False + 3 + + + True + False + label + + + True + True + 0 + + + + + True + True + True + + + True + True + 1 + + + + + 100 + True + True + adjustment1 + False + 100 + 0 + 0 + right + + + True + True + 2 + + + + + Export Layer + True + True + False + True + + + True + True + 3 + + + + + True + True + + + True + True + 4 + + + + diff --git a/glade/main.glade b/glade/main.glade index 2334dd6..3157b97 100644 --- a/glade/main.glade +++ b/glade/main.glade @@ -15,16 +15,55 @@ GDSII to PDF Converter True - - gtk-open + True - True - True - True - True - + False + + + gtk-open + True + True + True + True + True + + + + False + True + 0 + + + + + Load Mapping + True + False + True + True + + + False + True + 1 + + + + + Save Mapping + True + False + True + True + + + False + True + 2 + + @@ -48,10 +87,10 @@ - - layer-list + True False + none True diff --git a/layer-element.c b/layer-element.c index 1e8185d..45d7aea 100644 --- a/layer-element.c +++ b/layer-element.c @@ -19,21 +19,104 @@ #include "layer-element.h" -G_DEFINE_TYPE (LayerElement, layer_element, GTK_TYPE_BOX) +G_DEFINE_TYPE(LayerElement, layer_element, GTK_TYPE_BOX) + + +static void layer_element_dispose(GObject *obj) +{ + /* destroy parent container. This destroys all widgets inside */ + G_OBJECT_CLASS(layer_element_parent_class)->dispose(obj); +} static void layer_element_class_init(LayerElementClass *klass) { + GObjectClass *oclass = G_OBJECT_CLASS(klass); + oclass->dispose = layer_element_dispose; return; } static void layer_element_init(LayerElement *self) { - self->button = gtk_button_new(); - gtk_box_pack_start(GTK_BOX(self), self->button, TRUE, TRUE, 0); - gtk_widget_show(self->button); + GtkBuilder *builder; + GtkWidget *glade_box; + builder = gtk_builder_new_from_file("glade/layer-widget.glade"); + glade_box = GTK_WIDGET(gtk_builder_get_object(builder, "box")); + gtk_box_pack_start(GTK_BOX(self), glade_box, TRUE, TRUE, 0); + + /* Get Elements */ + self->priv.color = GTK_COLOR_BUTTON(gtk_builder_get_object(builder, "color")); + self->priv.export = GTK_CHECK_BUTTON(gtk_builder_get_object(builder, "export")); + self->priv.layer = GTK_LABEL(gtk_builder_get_object(builder, "layer")); + self->priv.name = GTK_ENTRY(gtk_builder_get_object(builder, "entry")); + self->priv.opacity = GTK_SCALE(gtk_builder_get_object(builder, "opacity")); + + /* Connect signals */ + /* None */ + + g_object_unref(builder); } GtkWidget *layer_element_new(void) { return GTK_WIDGET(g_object_new(layer_element_get_type(), NULL)); } + +const char *layer_element_get_name(LayerElement *elem) +{ + return gtk_entry_get_text(elem->priv.name); +} + +void layer_element_set_name(LayerElement *elem, const char* name) +{ + gtk_entry_set_text(elem->priv.name, name); +} + +void layer_element_set_layer(LayerElement *elem, int layer) +{ + GString *string; + + string = g_string_new_len(NULL, 100); + g_string_printf(string, "Layer: %d", layer); + gtk_label_set_text(elem->priv.layer, (const gchar *)string->str); + elem->priv.layer_num = layer; + g_string_free(string, TRUE); +} + +int layer_element_get_layer(LayerElement *elem) +{ + return elem->priv.layer_num; +} + +void layer_element_set_opacity(LayerElement *elem, int opacity) +{ + if (opacity > 100 || opacity < 0) + return; + gtk_range_set_value(GTK_RANGE(elem->priv.opacity), (gdouble)opacity); +} + +int layer_element_get_opacity(LayerElement *elem) +{ + return (int)gtk_range_get_value(GTK_RANGE(elem->priv.opacity)); +} + +void layer_element_set_export(LayerElement *elem, gboolean export) +{ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(elem->priv.export), export); +} + +gboolean layer_element_get_export(LayerElement *elem) +{ + return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(elem->priv.export)); +} + +void layer_element_get_color(LayerElement *elem, GdkRGBA *rgba) +{ + if (!rgba) + return; + gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(elem->priv.color), rgba); +} + +void layer_element_set_color(LayerElement *elem, GdkRGBA *rgba) +{ + gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(elem->priv.color), rgba); +} diff --git a/layer-element.h b/layer-element.h index 55e9a28..ef13108 100644 --- a/layer-element.h +++ b/layer-element.h @@ -27,11 +27,20 @@ #define LAYER_ELEMENT_CLASS(klass) G_TYPE_CHECK_CLASS_CAST(klass, layer_element_get_type(), LayerElementClass) #define IS_LAYE_RELEMENT(obj) G_TYPE_CHECK_INSTANCE_TYPE(obj, layer_element_get_type()) +typedef struct _LayerElementPriv { + GtkEntry *name; + GtkLabel *layer; + int layer_num; + GtkColorButton *color; + GtkScale *opacity; + GtkCheckButton *export; +} LayerElementPriv; + typedef struct _LayerElement { /* Inheritance */ GtkBox hbox; /* Custom Elements */ - GtkWidget *button; + LayerElementPriv priv; } LayerElement; typedef struct _LayerElementClass { @@ -42,4 +51,15 @@ typedef struct _LayerElementClass { GType layer_element_get_type(void); GtkWidget *layer_element_new(void); +const char *layer_element_get_name(LayerElement *elem); +void layer_element_set_name(LayerElement *elem, const char* name); +void layer_element_set_layer(LayerElement *elem, int layer); +int layer_element_get_layer(LayerElement *elem); +void layer_element_set_opacity(LayerElement *elem, int opacity); +int layer_element_get_opacity(LayerElement *elem); +void layer_element_set_export(LayerElement *elem, gboolean export); +gboolean layer_element_get_export(LayerElement *elem); +void layer_element_get_color(LayerElement *elem, GdkRGBA *rgba); +void layer_element_set_color(LayerElement *elem, GdkRGBA *rgba); + #endif /* __LAYER_ELEMENT_H__ */ diff --git a/layer-selector.c b/layer-selector.c new file mode 100644 index 0000000..ed5f256 --- /dev/null +++ b/layer-selector.c @@ -0,0 +1,122 @@ +#include "layer-selector.h" +#include "gdsparse.h" + + +static void layer_list_remove_element(struct layer_info *inf) +{ + if (inf) + free(inf); +} + +void get_layer_info(GList **info_list, GtkListBox *box) +{ + GList *local_list = NULL; + + /* Clear info Glist */ + if (*info_list != NULL) { + g_list_free_full(*info_list, (GDestroyNotify)layer_list_remove_element); + *info_list = NULL; + } + + + + *info_list = local_list; +} + +static GList *layer_widgets = NULL; + +static void delete_layer_widget(GtkWidget *widget) +{ + + gtk_widget_destroy(widget); +} + +void clear_list_box_widgets(GtkListBox *box) +{ + GList *list; + + list = gtk_container_get_children(GTK_CONTAINER(box)); + for (;list != NULL; list = list->next) { + gtk_container_remove(GTK_CONTAINER(box), GTK_WIDGET(list->data)); + } + /* Widgets are already destroyed when removed from box */ + g_list_free(layer_widgets); + layer_widgets = NULL; +} + +static gboolean check_if_layer_widget_exists(int layer) { + GList *list; + LayerElement *widget; + gboolean ret = FALSE; + + for (list = layer_widgets; list != NULL; list = list->next) { + widget = (LayerElement *)list->data; + if (layer_element_get_layer(widget) == layer) { + ret = TRUE; + break; + } + } + return ret; +} + +static void analyze_cell_layers(GtkListBox *listbox, struct gds_cell *cell) +{ + GList *graphics; + struct gds_graphics *gfx; + int layer; + GtkWidget *le; + + for (graphics = cell->graphic_objs; graphics != NULL; graphics = graphics->next) { + gfx = (struct gds_graphics *)graphics->data; + layer = (int)gfx->layer; + if (check_if_layer_widget_exists(layer) == FALSE) { + le = layer_element_new(); + layer_element_set_layer(LAYER_ELEMENT(le), layer); + gtk_list_box_insert(listbox, le, -1); + gtk_widget_show(le); + layer_widgets = g_list_append(layer_widgets, le); + printf("added new layer\n"); + } + } +} + + +gint sort_func(GtkListBoxRow *row1, GtkListBoxRow *row2, gpointer unused) +{ + GList *children1, *children2; + LayerElement *le1, *le2; + gint ret; + + children1 = gtk_container_get_children(GTK_CONTAINER(row1)); + children2 = gtk_container_get_children(GTK_CONTAINER(row2)); + le1 = LAYER_ELEMENT(children1->data); + le2 = LAYER_ELEMENT(children2->data); + + ret = layer_element_get_layer(le1) - layer_element_get_layer(le2); + + g_list_free(children1); + g_list_free(children2); + + return ret; +} + +void generate_layer_widgets(GtkListBox *listbox, GList *libs) +{ + GList *cell_list = NULL; + struct gds_library *lib; + printf("foo?\n"); + clear_list_box_widgets(listbox); + + gtk_list_box_set_sort_func(listbox, sort_func, NULL, NULL); + printf("layers deleted\n"); + + for (; libs != NULL; libs = libs->next) { + lib = (struct gds_library *)libs->data; + for (cell_list = lib->cells; cell_list != NULL; cell_list = cell_list->next) { + analyze_cell_layers(listbox, (struct gds_cell *)cell_list->data); + } /* For Cell List */ + } /* For libs */ + + /* Force sort */ + gtk_list_box_invalidate_sort(listbox); +} diff --git a/layer-selector.h b/layer-selector.h new file mode 100644 index 0000000..4dc9482 --- /dev/null +++ b/layer-selector.h @@ -0,0 +1,23 @@ +#ifndef __LAYER_SELECTOR_H__ +#define __LAYER_SELECTOR_H__ + +#include +#include +#include "layer-element.h" + +struct layer_info { + int id; + /* This contains both: opacity and Color */ + GdkRGBA color; +}; + +void generate_layer_widgets(GtkListBox *listbox, GList *libs); +void clear_list_box_widgets(); + +void setup_load_mapping_callback(GtkWidget *button); +void setup_save_mapping_callback(GtkWidget *button); + +void get_layer_info(GList **info_list, GtkListBox *box); + + +#endif /* __LAYER_SELECTOR_H__ */ diff --git a/main.c b/main.c index eaeed2e..1950cab 100644 --- a/main.c +++ b/main.c @@ -21,6 +21,7 @@ #include "gdsparse.h" #include #include "layer-element.h" +#include "layer-selector.h" enum cell_store_columns { @@ -34,6 +35,7 @@ struct open_button_data { GtkWindow *main_window; GList **list_ptr; GtkTreeStore *cell_store; + GtkListBox *layer_box; }; @@ -108,6 +110,9 @@ void on_load_gds(gpointer button, gpointer user) gtk_tree_store_set (store, &celliter, CELL, gds_c->name, -1); } } + + /* Create Layers in Layer Box */ + generate_layer_widgets(ptr->layer_box, *(ptr->list_ptr)); } end_destroy: @@ -146,6 +151,8 @@ int main(int argc, char **argv) GtkTreeView *cell_tree; GtkTreeStore *cell_store; GtkWidget *widget_generic; + GtkWidget *layer; + GtkWidget *listbox; struct open_button_data open_data; @@ -166,10 +173,14 @@ int main(int argc, char **argv) g_signal_connect(GTK_WIDGET(gtk_builder_get_object(main_builder, "button-load-gds")), "clicked", G_CALLBACK(on_load_gds), (gpointer)&open_data); + /* Connect Convert button */ widget_generic = GTK_WIDGET(gtk_builder_get_object(main_builder, "convert-button")); - g_signal_connect(widget_generic, "clicked", G_CALLBACK(on_convert_clicked), NULL); + g_signal_connect(widget_generic, "clicked", G_CALLBACK(on_convert_clicked), layer); + /* test widget list */ + listbox = GTK_WIDGET(gtk_builder_get_object(main_builder, "layer-list")); + open_data.layer_box = GTK_LIST_BOX(listbox); gtk_main();