diff options
Diffstat (limited to 'window.c')
-rw-r--r-- | window.c | 205 |
1 files changed, 122 insertions, 83 deletions
@@ -8,10 +8,10 @@ #include <string.h> -static GtkWidget *drawingArea = NULL, *sidebar = NULL; +static GtkWidget *drawingArea = NULL, *sidebarView = NULL, *sidebarAdd = NULL; static GtkAdjustment *hAdjustment = NULL, *vAdjustment = NULL; -static GtkWidget *entryName, *labelArea = NULL, *labelPerimeter = NULL; +static GtkWidget *entryName, *labelArea = NULL, *labelPerimeter = NULL, *buttonAdd = NULL, *buttonAddDo = NULL; static gboolean deleteEvent(GtkWidget *widget, GdkEvent *event, gpointer data) { @@ -32,27 +32,30 @@ static gboolean scrollEvent(GtkWidget *widget, GdkEventScroll *event, gpointer u static gboolean buttonEvent(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { VERTEX v = {event->x, event->y}; - int i; switch(event->type) { case GDK_BUTTON_PRESS: switch(event->button) { case 1: - viewToImage(&v); - - setActiveRoom(NULL); - - for(i = 0; i < getLevel()->nRooms; i++) { - if(vertexInPolygon(&v, &getLevel()->rooms[i].polygon)) { - setActiveRoom(&getLevel()->rooms[i]); + switch(getEditMode()) { + case EDIT_MODE_VIEW: + case EDIT_MODE_SELECTED: + setActiveRoom(getHoveredRoom()); + + updateSidebar(); + + redraw(); break; - } + case EDIT_MODE_ADD: + viewToImage(&v); + + if(isVertexOk(&v)) { + addVertex(&getActiveRoom()->polygon, &v); + updateSidebar(); + } } - updateSidebar(); - - redraw(); gtk_widget_queue_draw(drawingArea); } } @@ -61,64 +64,40 @@ static gboolean buttonEvent(GtkWidget *widget, GdkEventButton *event, gpointer u } gboolean crossingNotifyEvent(GtkWidget *widget, GdkEventCrossing *event, gpointer user_data) { - int i; VERTEX v; - setHoveredRoom(NULL); - - if(event->type == GDK_ENTER_NOTIFY) { - v.x = event->x; - v.y = event->y; - - viewToImage(&v); - + switch(event->type) { + case GDK_ENTER_NOTIFY: + v.x = event->x; + v.y = event->y; + + viewToImage(&v); - for(i = 0; i < getLevel()->nRooms; i++) { - if(vertexInPolygon(&v, &getLevel()->rooms[i].polygon)) { - setHoveredRoom(&getLevel()->rooms[i]); - - break; - } - } + setHoveredVertex(&v); + + break; + case GDK_LEAVE_NOTIFY: + setHoveredVertex(NULL); } + gtk_widget_queue_draw(drawingArea); } gboolean motionNotifyEvent(GtkWidget *widget, GdkEventMotion *event, gpointer user_data) { - int i; - static VERTEX v, v_last = {0, 0}; - LINE line; - gboolean changed = FALSE; + VERTEX v; + ROOM *last = getHoveredRoom(); v.x = event->x; v.y = event->y; viewToImage(&v); - line.v1 = v_last; - line.v2 = v; + setHoveredVertex(&v); - for(i = 0; i < getLevel()->nRooms; i++) { - if(linePolygonIntersection(&line, &getLevel()->rooms[i].polygon)) { - if(vertexInPolygon(&v, &getLevel()->rooms[i].polygon)) { - setHoveredRoom(&getLevel()->rooms[i]); - changed = TRUE; - - break; - } - else { - setHoveredRoom(NULL); - changed = TRUE; - } - } - } - - if(changed) + if(getHoveredRoom() != last || getEditMode() == EDIT_MODE_ADD) gtk_widget_queue_draw(drawingArea); - - v_last = v; } static void destroy(GtkWidget *widget, gpointer data) { @@ -182,31 +161,56 @@ static void sidebarNameChanged(GtkEditable *editable, gpointer user_data) { getActiveRoom()->name = strdup(gtk_entry_get_text(GTK_ENTRY(entryName))); } +static void sidebarButtonClicked(GtkButton *button, gpointer user_data) { + if(button == GTK_BUTTON(buttonAdd)) { + startAddMode(); + updateSidebar(); + + gtk_widget_queue_draw(drawingArea); + } + else if(button == GTK_BUTTON(buttonAddDo)) { + if(getActiveRoom() &&getActiveRoom()->polygon.nVertices > 2 && isPolygonOk(&getActiveRoom()->polygon)) { + addRoom(getLevel(), getActiveRoom()); + setActiveRoom(&getLevel()->rooms[getLevel()->nRooms-1]); + } + + endAddMode(); + updateSidebar(); + + gtk_widget_queue_draw(drawingArea); + } +} + static GtkWidget* createSidebar() { - GtkWidget *widget, *labelRoomInfo, *labelName, *tableRoomData, *labelAreaLabel, *labelPerimeterLabel; + GtkWidget *sidebar, *labelRoomInfo, *labelName; + GtkWidget *tableRoomData, *labelAreaLabel, *labelPerimeterLabel; - widget = gtk_vbox_new(FALSE, 0); + sidebar = gtk_hbox_new(FALSE, 0); + + // View sidebar + sidebarView = gtk_vbox_new(FALSE, 0); + gtk_box_pack_start(GTK_BOX(sidebar), sidebarView, FALSE, FALSE, 5); labelRoomInfo = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(labelRoomInfo), "<b>Room info:</b>"); 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(sidebarView), labelRoomInfo, FALSE, FALSE, 5); - gtk_box_pack_start(GTK_BOX(widget), gtk_hseparator_new(), FALSE, FALSE, 5); + gtk_box_pack_start(GTK_BOX(sidebarView), 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); + gtk_box_pack_start(GTK_BOX(sidebarView), 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); + gtk_box_pack_start(GTK_BOX(sidebarView), 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); + gtk_box_pack_start(GTK_BOX(sidebarView), tableRoomData, FALSE, FALSE, 5); labelAreaLabel = gtk_label_new("Room area:"); gtk_misc_set_alignment(GTK_MISC(labelAreaLabel), 0.0, 0.5); @@ -224,11 +228,28 @@ static GtkWidget* createSidebar() { 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; + buttonAdd = gtk_button_new_with_label("Add room"); + g_signal_connect(G_OBJECT(buttonAdd), "clicked", G_CALLBACK(sidebarButtonClicked), NULL); + gtk_box_pack_end(GTK_BOX(sidebarView), buttonAdd, FALSE, FALSE, 0); + + // Add sidebar + sidebarAdd = gtk_vbox_new(FALSE, 0); + gtk_box_pack_start(GTK_BOX(sidebar), sidebarAdd, FALSE, FALSE, 5); + + labelRoomInfo = gtk_label_new(NULL); + gtk_label_set_markup(GTK_LABEL(labelRoomInfo), "<b>Add room</b>"); + gtk_misc_set_alignment(GTK_MISC(labelRoomInfo), 0.0, 0.5); + gtk_box_pack_start(GTK_BOX(sidebarAdd), labelRoomInfo, FALSE, FALSE, 5); + + buttonAddDo = gtk_button_new_with_label("Add room"); + g_signal_connect(G_OBJECT(buttonAddDo), "clicked", G_CALLBACK(sidebarButtonClicked), NULL); + gtk_box_pack_end(GTK_BOX(sidebarAdd), buttonAddDo, FALSE, FALSE, 0); + + return sidebar; } GtkWidget* createMainWindow() { - GtkWidget *window, *vbox, *hPaned, *table, *vScroll, *hScroll; + GtkWidget *window, *hPaned, *vbox, *table, *vScroll, *hScroll, *sidebar; GdkColor color = {0, 0, 0, 0}; @@ -262,7 +283,6 @@ GtkWidget* createMainWindow() { g_signal_connect(G_OBJECT(drawingArea), "motion-notify-event", G_CALLBACK(motionNotifyEvent), NULL); g_signal_connect(G_OBJECT(drawingArea), "scroll-event", G_CALLBACK(scrollEvent), NULL); gtk_widget_add_events(drawingArea, GDK_SCROLL_MASK | GDK_POINTER_MOTION_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); - gtk_widget_set_double_buffered(drawingArea, FALSE); gtk_table_attach(GTK_TABLE(table), drawingArea, 0, 1, 0, 1, GTK_FILL|GTK_EXPAND|GTK_SHRINK, GTK_FILL|GTK_EXPAND|GTK_SHRINK, 0, 0); hAdjustment = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 0, 10, 100, 100)); @@ -279,6 +299,7 @@ GtkWidget* createMainWindow() { gtk_paned_pack2(GTK_PANED(hPaned), sidebar, FALSE, TRUE); gtk_widget_show_all(vbox); + gtk_widget_hide(sidebarAdd); return window; } @@ -286,25 +307,43 @@ GtkWidget* createMainWindow() { 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); + switch(getEditMode()) { + case EDIT_MODE_VIEW: + case EDIT_MODE_SELECTED: + gtk_widget_hide(sidebarAdd); + gtk_widget_show(sidebarView); + + 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); + } + + break; + case EDIT_MODE_ADD: + gtk_widget_hide(sidebarView); + gtk_widget_show(sidebarAdd); + + if(getActiveRoom()) { + if(getActiveRoom()->polygon.nVertices > 2 && isPolygonOk(&getActiveRoom()->polygon)) + gtk_widget_set_sensitive(buttonAddDo, TRUE); + else + gtk_widget_set_sensitive(buttonAddDo, FALSE); + } } } |