From 4d035c645584451925ee533e7bd9e1158b5cf7da Mon Sep 17 00:00:00 2001 From: neoraider Date: Wed, 29 Aug 2007 19:54:05 +0000 Subject: zoomedit: Einige Rauminformationen werden jetzt angezeigt & Name kann ge?ndert werden. --- window.c | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 91 insertions(+), 12 deletions(-) (limited to 'window.c') diff --git a/window.c b/window.c index c2e1c55..d0cb531 100644 --- a/window.c +++ b/window.c @@ -5,11 +5,14 @@ #include "geometry.h" #include "level.h" #include +#include -static GtkWidget *drawingArea = NULL; +static GtkWidget *drawingArea = NULL, *sidebar = NULL; static GtkAdjustment *hAdjustment = NULL, *vAdjustment = NULL; +static GtkWidget *entryName, *labelArea = NULL, *labelPerimeter = NULL; + static gboolean deleteEvent(GtkWidget *widget, GdkEvent *event, gpointer data) { return FALSE; @@ -40,13 +43,15 @@ static gboolean buttonEvent(GtkWidget *widget, GdkEventButton *event, gpointer u setActiveRoom(NULL); for(i = 0; i < getLevel()->nRooms; i++) { - if(vertexInPolygon(&v, &getLevel()->rooms[i])) { + if(vertexInPolygon(&v, &getLevel()->rooms[i].polygon)) { setActiveRoom(&getLevel()->rooms[i]); break; } } + updateSidebar(); + redraw(); gtk_widget_queue_draw(drawingArea); } @@ -70,7 +75,7 @@ gboolean crossingNotifyEvent(GtkWidget *widget, GdkEventCrossing *event, gpointe for(i = 0; i < getLevel()->nRooms; i++) { - if(vertexInPolygon(&v, &getLevel()->rooms[i])) { + if(vertexInPolygon(&v, &getLevel()->rooms[i].polygon)) { setHoveredRoom(&getLevel()->rooms[i]); break; @@ -96,8 +101,8 @@ gboolean motionNotifyEvent(GtkWidget *widget, GdkEventMotion *event, gpointer us line.v2 = v; for(i = 0; i < getLevel()->nRooms; i++) { - if(linePolygonIntersection(&line, &getLevel()->rooms[i])) { - if(vertexInPolygon(&v, &getLevel()->rooms[i])) { + if(linePolygonIntersection(&line, &getLevel()->rooms[i].polygon)) { + if(vertexInPolygon(&v, &getLevel()->rooms[i].polygon)) { setHoveredRoom(&getLevel()->rooms[i]); changed = TRUE; @@ -170,8 +175,60 @@ static void updateScrollbarsCentered() { updateScrollbars(0.5, 0.5); } +static void sidebarNameChanged(GtkEditable *editable, gpointer user_data) { + if(getActiveRoom() == NULL) return; + + free(getActiveRoom()->name); + getActiveRoom()->name = strdup(gtk_entry_get_text(GTK_ENTRY(entryName))); +} + +static GtkWidget* createSidebar() { + GtkWidget *widget, *labelRoomInfo, *labelName, *tableRoomData, *labelAreaLabel, *labelPerimeterLabel; + + widget = gtk_vbox_new(FALSE, 0); + + labelRoomInfo = gtk_label_new(NULL); + gtk_label_set_markup(GTK_LABEL(labelRoomInfo), "Room info:"); + gtk_misc_set_alignment(GTK_MISC(labelRoomInfo), 0.0, 0.5); + gtk_box_pack_start(GTK_BOX(widget), labelRoomInfo, FALSE, FALSE, 5); + + gtk_box_pack_start(GTK_BOX(widget), gtk_hseparator_new(), FALSE, FALSE, 5); + + labelName = gtk_label_new("Name:"); + gtk_misc_set_alignment(GTK_MISC(labelName), 0.0, 0.5); + gtk_box_pack_start(GTK_BOX(widget), labelName, FALSE, FALSE, 0); + + entryName = gtk_entry_new(); + gtk_widget_set_sensitive(entryName, FALSE); + g_signal_connect(G_OBJECT(entryName), "changed", G_CALLBACK(sidebarNameChanged), NULL); + gtk_box_pack_start(GTK_BOX(widget), entryName, FALSE, FALSE, 0); + + tableRoomData = gtk_table_new(2, 2, FALSE); + gtk_table_set_row_spacings(GTK_TABLE(tableRoomData), 5); + gtk_table_set_col_spacings(GTK_TABLE(tableRoomData), 10); + gtk_box_pack_start(GTK_BOX(widget), tableRoomData, FALSE, FALSE, 5); + + labelAreaLabel = gtk_label_new("Room area:"); + gtk_misc_set_alignment(GTK_MISC(labelAreaLabel), 0.0, 0.5); + gtk_table_attach_defaults(GTK_TABLE(tableRoomData), labelAreaLabel, 0, 1, 0, 1); + + labelArea = gtk_label_new(NULL); + gtk_misc_set_alignment(GTK_MISC(labelArea), 1.0, 0.5); + gtk_table_attach_defaults(GTK_TABLE(tableRoomData), labelArea, 1, 2, 0, 1); + + labelPerimeterLabel = gtk_label_new("Room perimeter:"); + gtk_misc_set_alignment(GTK_MISC(labelPerimeterLabel), 0.0, 0.5); + gtk_table_attach_defaults(GTK_TABLE(tableRoomData), labelPerimeterLabel, 0, 1, 1, 2); + + labelPerimeter = gtk_label_new(NULL); + gtk_misc_set_alignment(GTK_MISC(labelPerimeter), 1.0, 0.5); + gtk_table_attach_defaults(GTK_TABLE(tableRoomData), labelPerimeter, 1, 2, 1, 2); + + return widget; +} + GtkWidget* createMainWindow() { - GtkWidget *window, *vbox, *menubar, *toolbar, *hPaned, *table, *vScroll, *hScroll, *sidebar; + GtkWidget *window, *vbox, *hPaned, *table, *vScroll, *hScroll; GdkColor color = {0, 0, 0, 0}; @@ -183,11 +240,8 @@ GtkWidget* createMainWindow() { vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(window), vbox); - menubar = getMenu(); - gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0); - - toolbar = getToolbar(); - gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), getMenu(), FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), getToolbar(), FALSE, FALSE, 0); gtk_window_add_accel_group(GTK_WINDOW(window), getAccels()); @@ -221,7 +275,7 @@ GtkWidget* createMainWindow() { g_signal_connect(G_OBJECT(vScroll), "value-changed", G_CALLBACK(refreshScrolling), NULL); gtk_table_attach(GTK_TABLE(table), vScroll, 1, 2, 0, 1, 0, GTK_FILL|GTK_EXPAND|GTK_SHRINK, 0, 0); - sidebar = gtk_vbox_new(FALSE, 0); + sidebar = createSidebar(); gtk_paned_pack2(GTK_PANED(hPaned), sidebar, FALSE, TRUE); gtk_widget_show_all(vbox); @@ -229,6 +283,31 @@ GtkWidget* createMainWindow() { return window; } +void updateSidebar() { + gchar *string; + + + if(getActiveRoom()) { + gtk_entry_set_text(GTK_ENTRY(entryName), getActiveRoom()->name); + gtk_widget_set_sensitive(entryName, TRUE); + + string = g_strdup_printf("%.2f", polygonArea(&getActiveRoom()->polygon)); + gtk_label_set_text(GTK_LABEL(labelArea), string); + g_free(string); + + string = g_strdup_printf("%.2f", polygonPerimeter(&getActiveRoom()->polygon)); + gtk_label_set_text(GTK_LABEL(labelPerimeter), string); + g_free(string); + } + else { + gtk_entry_set_text(GTK_ENTRY(entryName), ""); + gtk_widget_set_sensitive(entryName, FALSE); + + gtk_label_set_text(GTK_LABEL(labelArea), NULL); + gtk_label_set_text(GTK_LABEL(labelPerimeter), NULL); + } +} + void zoomIn(double factor, double x, double y) { setScale(getScale()*factor); updateScrollbars(x, y); -- cgit v1.2.3