| @@ -46,6 +46,7 @@ int main(int argc, char **argv) | |||||
| new DebugFps(); | new DebugFps(); | ||||
| glmapview->LoadMap("maps/testmap.tmx"); | glmapview->LoadMap("maps/testmap.tmx"); | ||||
| glmapview->SetFocus(); | |||||
| gtk_main(); | gtk_main(); | ||||
| @@ -23,8 +23,8 @@ | |||||
| <child> | <child> | ||||
| <object class="GtkImageMenuItem" id="imagemenuitem1"> | <object class="GtkImageMenuItem" id="imagemenuitem1"> | ||||
| <property name="visible">True</property> | <property name="visible">True</property> | ||||
| <property name="use_action_appearance">True</property> | |||||
| <property name="related_action">action_new</property> | <property name="related_action">action_new</property> | ||||
| <property name="use_action_appearance">True</property> | |||||
| <property name="use_underline">True</property> | <property name="use_underline">True</property> | ||||
| <property name="use_stock">True</property> | <property name="use_stock">True</property> | ||||
| </object> | </object> | ||||
| @@ -32,8 +32,8 @@ | |||||
| <child> | <child> | ||||
| <object class="GtkImageMenuItem" id="imagemenuitem2"> | <object class="GtkImageMenuItem" id="imagemenuitem2"> | ||||
| <property name="visible">True</property> | <property name="visible">True</property> | ||||
| <property name="use_action_appearance">True</property> | |||||
| <property name="related_action">action_open</property> | <property name="related_action">action_open</property> | ||||
| <property name="use_action_appearance">True</property> | |||||
| <property name="use_underline">True</property> | <property name="use_underline">True</property> | ||||
| <property name="use_stock">True</property> | <property name="use_stock">True</property> | ||||
| </object> | </object> | ||||
| @@ -158,8 +158,8 @@ | |||||
| <child> | <child> | ||||
| <object class="GtkToolButton" id="toolbutton2"> | <object class="GtkToolButton" id="toolbutton2"> | ||||
| <property name="visible">True</property> | <property name="visible">True</property> | ||||
| <property name="use_action_appearance">True</property> | |||||
| <property name="related_action">action_new</property> | <property name="related_action">action_new</property> | ||||
| <property name="use_action_appearance">True</property> | |||||
| <property name="label" translatable="yes">toolbutton</property> | <property name="label" translatable="yes">toolbutton</property> | ||||
| <property name="use_underline">True</property> | <property name="use_underline">True</property> | ||||
| </object> | </object> | ||||
| @@ -171,8 +171,8 @@ | |||||
| <child> | <child> | ||||
| <object class="GtkToolButton" id="toolbutton1"> | <object class="GtkToolButton" id="toolbutton1"> | ||||
| <property name="visible">True</property> | <property name="visible">True</property> | ||||
| <property name="use_action_appearance">True</property> | |||||
| <property name="related_action">action_open</property> | <property name="related_action">action_open</property> | ||||
| <property name="use_action_appearance">True</property> | |||||
| <property name="label" translatable="yes">Open...</property> | <property name="label" translatable="yes">Open...</property> | ||||
| <property name="use_underline">True</property> | <property name="use_underline">True</property> | ||||
| </object> | </object> | ||||
| @@ -184,8 +184,8 @@ | |||||
| <child> | <child> | ||||
| <object class="GtkToolButton" id="toolbutton4"> | <object class="GtkToolButton" id="toolbutton4"> | ||||
| <property name="visible">True</property> | <property name="visible">True</property> | ||||
| <property name="use_action_appearance">True</property> | |||||
| <property name="related_action">action_save</property> | <property name="related_action">action_save</property> | ||||
| <property name="use_action_appearance">True</property> | |||||
| <property name="label" translatable="yes">Save</property> | <property name="label" translatable="yes">Save</property> | ||||
| <property name="use_underline">True</property> | <property name="use_underline">True</property> | ||||
| </object> | </object> | ||||
| @@ -345,9 +345,11 @@ | |||||
| </object> | </object> | ||||
| <object class="GtkAction" id="action_new"> | <object class="GtkAction" id="action_new"> | ||||
| <property name="stock_id">gtk-new</property> | <property name="stock_id">gtk-new</property> | ||||
| <property name="always_show_image">True</property> | |||||
| </object> | </object> | ||||
| <object class="GtkAction" id="action_save"> | <object class="GtkAction" id="action_save"> | ||||
| <property name="label">Save</property> | <property name="label">Save</property> | ||||
| <property name="stock_id">gtk-save</property> | <property name="stock_id">gtk-save</property> | ||||
| <property name="always_show_image">True</property> | |||||
| </object> | </object> | ||||
| </interface> | </interface> | ||||
| @@ -9,6 +9,7 @@ | |||||
| #include <gtk/gtk.h> | #include <gtk/gtk.h> | ||||
| #include <gtkgl/gtkglarea.h> | #include <gtkgl/gtkglarea.h> | ||||
| #include <gdk/gdkkeysyms.h> | |||||
| #include "core.h" | #include "core.h" | ||||
| #include "glmapview.h" | #include "glmapview.h" | ||||
| @@ -39,6 +40,8 @@ GlMapView::GlMapView(GtkBuilder *builder) | |||||
| GDK_POINTER_MOTION_MASK | | GDK_POINTER_MOTION_MASK | | ||||
| GDK_BUTTON_PRESS_MASK | | GDK_BUTTON_PRESS_MASK | | ||||
| GDK_BUTTON_RELEASE_MASK); | GDK_BUTTON_RELEASE_MASK); | ||||
| gtk_widget_set_can_focus(glarea, TRUE); | |||||
| GtkContainer *cont = GTK_CONTAINER(gtk_builder_get_object(builder, | GtkContainer *cont = GTK_CONTAINER(gtk_builder_get_object(builder, | ||||
| "gl_container")); | "gl_container")); | ||||
| gtk_container_add(cont, glarea); | gtk_container_add(cont, glarea); | ||||
| @@ -63,6 +66,9 @@ GlMapView::GlMapView(GtkBuilder *builder) | |||||
| GTK_SIGNAL_FUNC(MouseButtonSignal), this); | GTK_SIGNAL_FUNC(MouseButtonSignal), this); | ||||
| gtk_signal_connect(GTK_OBJECT(glarea), "motion_notify_event", | gtk_signal_connect(GTK_OBJECT(glarea), "motion_notify_event", | ||||
| GTK_SIGNAL_FUNC(MouseMotionSignal), this); | GTK_SIGNAL_FUNC(MouseMotionSignal), this); | ||||
| gtk_signal_connect(GTK_OBJECT(glarea), "key_press_event", | |||||
| GTK_SIGNAL_FUNC(KeyPressSignal), this); | |||||
| } | } | ||||
| void GlMapView::LoadMap(char const *path) | void GlMapView::LoadMap(char const *path) | ||||
| @@ -73,6 +79,11 @@ void GlMapView::LoadMap(char const *path) | |||||
| UpdateAdjustments(); | UpdateAdjustments(); | ||||
| } | } | ||||
| void GlMapView::SetFocus() | |||||
| { | |||||
| gtk_widget_grab_focus(glarea); | |||||
| } | |||||
| gboolean GlMapView::IdleTick() | gboolean GlMapView::IdleTick() | ||||
| { | { | ||||
| // FIXME: do not do anything if the previous tick was too recent? | // FIXME: do not do anything if the previous tick was too recent? | ||||
| @@ -162,6 +173,19 @@ gboolean GlMapView::UpdateAdjustments() | |||||
| return TRUE; | return TRUE; | ||||
| } | } | ||||
| gboolean GlMapView::MoveAdjustments(double dx, double dy) | |||||
| { | |||||
| if (dx) | |||||
| gtk_adjustment_set_value(hadj, gtk_adjustment_get_value(hadj) + dx); | |||||
| if (dy) | |||||
| gtk_adjustment_set_value(vadj, gtk_adjustment_get_value(vadj) + dy); | |||||
| UpdateAdjustments(); | |||||
| return TRUE; | |||||
| } | |||||
| gboolean GlMapView::MouseButton(GdkEventButton *event) | gboolean GlMapView::MouseButton(GdkEventButton *event) | ||||
| { | { | ||||
| if (event->type == GDK_BUTTON_PRESS && event->button == 2) | if (event->type == GDK_BUTTON_PRESS && event->button == 2) | ||||
| @@ -216,6 +240,20 @@ gboolean GlMapView::MouseMotion(GdkEventMotion *event) | |||||
| return TRUE; | return TRUE; | ||||
| } | } | ||||
| gboolean GlMapView::KeyPress(GdkEventKey *event) | |||||
| { | |||||
| switch (event->keyval) | |||||
| { | |||||
| case GDK_Up: MoveAdjustments( 0.0, -10.0); break; | |||||
| case GDK_Down: MoveAdjustments( 0.0, 10.0); break; | |||||
| case GDK_Left: MoveAdjustments(-10.0, 0.0); break; | |||||
| case GDK_Right: MoveAdjustments( 10.0, 0.0); break; | |||||
| default: return FALSE; | |||||
| } | |||||
| return TRUE; | |||||
| } | |||||
| /* Private signal slots */ | /* Private signal slots */ | ||||
| gboolean GlMapView::IdleTickSignal(GlMapView *that) | gboolean GlMapView::IdleTickSignal(GlMapView *that) | ||||
| { | { | ||||
| @@ -263,3 +301,10 @@ gboolean GlMapView::MouseMotionSignal(GtkWidget *w, GdkEventMotion *event, | |||||
| return that->MouseMotion(event); | return that->MouseMotion(event); | ||||
| } | } | ||||
| gboolean GlMapView::KeyPressSignal(GtkWidget *w, GdkEventKey *event, | |||||
| GlMapView *that) | |||||
| { | |||||
| (void)w; | |||||
| return that->KeyPress(event); | |||||
| } | |||||
| @@ -13,6 +13,7 @@ class GlMapView | |||||
| public: | public: | ||||
| GlMapView(GtkBuilder *builder); | GlMapView(GtkBuilder *builder); | ||||
| void LoadMap(char const *path); | void LoadMap(char const *path); | ||||
| void SetFocus(); | |||||
| private: | private: | ||||
| /* Private methods */ | /* Private methods */ | ||||
| @@ -21,8 +22,10 @@ private: | |||||
| gboolean Destroy(); | gboolean Destroy(); | ||||
| gboolean Draw(GdkEventExpose *event); | gboolean Draw(GdkEventExpose *event); | ||||
| gboolean UpdateAdjustments(); | gboolean UpdateAdjustments(); | ||||
| gboolean MoveAdjustments(double dx, double dy); | |||||
| gboolean MouseButton(GdkEventButton *event); | gboolean MouseButton(GdkEventButton *event); | ||||
| gboolean MouseMotion(GdkEventMotion *event); | gboolean MouseMotion(GdkEventMotion *event); | ||||
| gboolean KeyPress(GdkEventKey *event); | |||||
| /* Private signal slots */ | /* Private signal slots */ | ||||
| static gboolean IdleTickSignal(GlMapView *that); | static gboolean IdleTickSignal(GlMapView *that); | ||||
| @@ -36,6 +39,8 @@ private: | |||||
| GlMapView *that); | GlMapView *that); | ||||
| static gboolean MouseMotionSignal(GtkWidget *w, GdkEventMotion *event, | static gboolean MouseMotionSignal(GtkWidget *w, GdkEventMotion *event, | ||||
| GlMapView *that); | GlMapView *that); | ||||
| static gboolean KeyPressSignal(GtkWidget *w, GdkEventKey *event, | |||||
| GlMapView *that); | |||||
| private: | private: | ||||
| GtkAdjustment *hadj, *vadj; | GtkAdjustment *hadj, *vadj; | ||||