From f10436d8168840417c000e08038350dd5de4fc15 Mon Sep 17 00:00:00 2001 From: neoraider Date: Tue, 26 Jun 2007 19:30:01 +0000 Subject: zoomedit: Added room selection and hover effect. --- window.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 74 insertions(+), 3 deletions(-) (limited to 'window.c') diff --git a/window.c b/window.c index d6f0bfa..c2e1c55 100644 --- a/window.c +++ b/window.c @@ -55,6 +55,67 @@ static gboolean buttonEvent(GtkWidget *widget, GdkEventButton *event, gpointer u return FALSE; } +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); + + + for(i = 0; i < getLevel()->nRooms; i++) { + if(vertexInPolygon(&v, &getLevel()->rooms[i])) { + setHoveredRoom(&getLevel()->rooms[i]); + + break; + } + } + } + + 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; + + v.x = event->x; + v.y = event->y; + + viewToImage(&v); + + line.v1 = v_last; + line.v2 = v; + + for(i = 0; i < getLevel()->nRooms; i++) { + if(linePolygonIntersection(&line, &getLevel()->rooms[i])) { + if(vertexInPolygon(&v, &getLevel()->rooms[i])) { + setHoveredRoom(&getLevel()->rooms[i]); + changed = TRUE; + + break; + } + else { + setHoveredRoom(NULL); + changed = TRUE; + } + } + } + + if(changed) + gtk_widget_queue_draw(drawingArea); + + v_last = v; +} + static void destroy(GtkWidget *widget, gpointer data) { gtk_main_quit(); } @@ -110,7 +171,7 @@ static void updateScrollbarsCentered() { } GtkWidget* createMainWindow() { - GtkWidget *window, *vbox, *menubar, *toolbar, *table, *vScroll, *hScroll; + GtkWidget *window, *vbox, *menubar, *toolbar, *hPaned, *table, *vScroll, *hScroll, *sidebar; GdkColor color = {0, 0, 0, 0}; @@ -130,8 +191,11 @@ GtkWidget* createMainWindow() { gtk_window_add_accel_group(GTK_WINDOW(window), getAccels()); + hPaned = gtk_hpaned_new(); + gtk_box_pack_end(GTK_BOX(vbox), hPaned, TRUE, TRUE, 0); + table = gtk_table_new(2, 2, FALSE); - gtk_box_pack_end(GTK_BOX(vbox), table, TRUE, TRUE, 0); + gtk_paned_pack1(GTK_PANED(hPaned), table, TRUE, TRUE); drawingArea = gtk_drawing_area_new(); gtk_widget_modify_bg(drawingArea, GTK_WIDGET_STATE(drawingArea), &color); @@ -139,8 +203,12 @@ GtkWidget* createMainWindow() { g_signal_connect(G_OBJECT(drawingArea), "expose-event", G_CALLBACK(drawTopView), NULL); g_signal_connect(G_OBJECT(drawingArea), "button-press-event", G_CALLBACK(buttonEvent), NULL); g_signal_connect(G_OBJECT(drawingArea), "button-release-event", G_CALLBACK(buttonEvent), NULL); + g_signal_connect(G_OBJECT(drawingArea), "enter-notify-event", G_CALLBACK(crossingNotifyEvent), NULL); + g_signal_connect(G_OBJECT(drawingArea), "leave-notify-event", G_CALLBACK(crossingNotifyEvent), NULL); + 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); + 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)); @@ -153,6 +221,9 @@ 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); + gtk_paned_pack2(GTK_PANED(hPaned), sidebar, FALSE, TRUE); + gtk_widget_show_all(vbox); return window; -- cgit v1.2.3