summaryrefslogtreecommitdiffstats
path: root/window.c
diff options
context:
space:
mode:
Diffstat (limited to 'window.c')
-rw-r--r--window.c205
1 files changed, 122 insertions, 83 deletions
diff --git a/window.c b/window.c
index d0cb531..38cf0cc 100644
--- a/window.c
+++ b/window.c
@@ -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);
+ }
}
}