summaryrefslogtreecommitdiffstats
path: root/window.c
diff options
context:
space:
mode:
authorneoraider <devnull@localhost>2007-06-26 21:30:01 +0200
committerneoraider <devnull@localhost>2007-06-26 21:30:01 +0200
commitf10436d8168840417c000e08038350dd5de4fc15 (patch)
tree1149581315fae39c27c741b81c6e130ff5cd666c /window.c
parentb8549034bef0de090547f32af07df248e68c7064 (diff)
downloadzoomedit-f10436d8168840417c000e08038350dd5de4fc15.tar
zoomedit-f10436d8168840417c000e08038350dd5de4fc15.zip
zoomedit: Added room selection and hover effect.
Diffstat (limited to 'window.c')
-rw-r--r--window.c77
1 files changed, 74 insertions, 3 deletions
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;