summaryrefslogtreecommitdiffstats
path: root/window.c
diff options
context:
space:
mode:
authorneoraider <devnull@localhost>2007-08-29 21:54:05 +0200
committerneoraider <devnull@localhost>2007-08-29 21:54:05 +0200
commit4d035c645584451925ee533e7bd9e1158b5cf7da (patch)
tree14492f3f2501771dca28a4b0cba9376a1bfead85 /window.c
parent22da7179ace053f399d43bce061d81aac98f3c4c (diff)
downloadzoomedit-4d035c645584451925ee533e7bd9e1158b5cf7da.tar
zoomedit-4d035c645584451925ee533e7bd9e1158b5cf7da.zip
zoomedit: Einige Rauminformationen werden jetzt angezeigt & Name kann ge?ndert werden.
Diffstat (limited to 'window.c')
-rw-r--r--window.c103
1 files changed, 91 insertions, 12 deletions
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 <gtk/gtk.h>
+#include <string.h>
-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), "<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(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);