diff --git a/src/gtk/editor.cpp b/src/gtk/editor.cpp index 1bfc91cf..fd28a94e 100644 --- a/src/gtk/editor.cpp +++ b/src/gtk/editor.cpp @@ -22,6 +22,10 @@ static volatile int quit = 0; static int ticking = 0; static float const FPS = 30.0f; +static MapViewer *mv; +static GtkWidget *glarea; +static GtkAdjustment *hadj, *vadj; + static gint main_quit(GtkWidget *widget, GdkEventExpose *event) { (void)widget; @@ -42,6 +46,8 @@ static gboolean tick(void *widget) ticking = 1; + mv->SetPOV(gtk_adjustment_get_value(hadj), gtk_adjustment_get_value(vadj)); + /* Tick the game */ Ticker::TickGame(); @@ -52,13 +58,40 @@ static gboolean tick(void *widget) static gint init(GtkWidget *widget) { + struct + { + GtkAdjustment *adj; + float map_size, sw_size; + } + s[2] = + { + { hadj, mv->GetWidth(), widget->allocation.width }, + { vadj, mv->GetHeight(), widget->allocation.height }, + }; + + for (int i = 0; i < 2; i++) + { + gtk_adjustment_set_lower(s[i].adj, 0); + gtk_adjustment_set_upper(s[i].adj, s[i].map_size); + gtk_adjustment_set_step_increment(s[i].adj, 1); + gtk_adjustment_set_page_increment(s[i].adj, s[i].sw_size); + gtk_adjustment_set_page_size(s[i].adj, s[i].sw_size); + + float hval = gtk_adjustment_get_value(s[i].adj); + if (hval + s[i].sw_size > s[i].map_size) + { + gtk_adjustment_set_value(s[i].adj, s[i].map_size - s[i].sw_size); + gtk_adjustment_value_changed(s[i].adj); + } + } + if (gtk_gl_area_make_current(GTK_GL_AREA(widget))) Video::Setup(widget->allocation.width, widget->allocation.height); return TRUE; } -static gint reshape(GtkWidget *widget, GdkEventConfigure *event) +static gint reshape_gl(GtkWidget *widget, GdkEventConfigure *event) { (void)event; @@ -100,7 +133,7 @@ int main(int argc, char **argv) return EXIT_FAILURE; } - /* Build the rest of the application */ + /* Build the application interface and keep a few member pointers */ GtkBuilder *builder = gtk_builder_new(); if (!gtk_builder_add_from_file(builder, "src/gtk/editor.xml", NULL)) { @@ -109,7 +142,12 @@ int main(int argc, char **argv) } GtkWidget *window = GTK_WIDGET(gtk_builder_get_object(builder, "window1")); - GtkWidget *sw = GTK_WIDGET(gtk_builder_get_object(builder, "sw1")); + GtkWidget *viewport = GTK_WIDGET( + gtk_builder_get_object(builder, "viewport1")); + hadj = gtk_range_get_adjustment(GTK_RANGE( + gtk_builder_get_object(builder, "hscrollbar1"))); + vadj = gtk_range_get_adjustment(GTK_RANGE( + gtk_builder_get_object(builder, "vscrollbar1"))); g_object_unref(G_OBJECT(builder)); /* Create new OpenGL widget */ @@ -123,29 +161,30 @@ int main(int argc, char **argv) GDK_GL_NONE }; - GtkWidget *glarea = gtk_gl_area_new(attrlist); + glarea = gtk_gl_area_new(attrlist); + gtk_widget_set_usize(glarea, 400, 300); gtk_widget_set_events(glarea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK); - gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw), glarea); + gtk_container_add(GTK_CONTAINER(viewport), glarea); /* Connect signals and show window */ gtk_signal_connect(GTK_OBJECT(window), "delete_event", GTK_SIGNAL_FUNC(main_quit), NULL); + gtk_signal_connect(GTK_OBJECT(glarea), "expose_event", GTK_SIGNAL_FUNC(draw), NULL); gtk_signal_connect(GTK_OBJECT(glarea), "configure_event", - GTK_SIGNAL_FUNC(reshape), NULL); + GTK_SIGNAL_FUNC(reshape_gl), NULL); gtk_signal_connect(GTK_OBJECT(glarea), "realize", GTK_SIGNAL_FUNC(init), NULL); - gtk_widget_show_all(window); - // FIXME: detect when the map viewer is killed - new MapViewer("maps/testmap.tmx"); + mv = new MapViewer("maps/testmap.tmx"); new DebugFps(); /* We tick from the idle function instead of a timeout to avoid * stealing time from the GTK loop when the callback time exceeds * the timeout value. */ + gtk_widget_show_all(window); gtk_idle_add(tick, glarea); gtk_main(); diff --git a/src/gtk/editor.xml b/src/gtk/editor.xml index 70c3b6ef..56e19b4c 100644 --- a/src/gtk/editor.xml +++ b/src/gtk/editor.xml @@ -153,11 +153,47 @@ True True - - 640 - 480 + True - True + 2 + 2 + + + True + + + 1 + 2 + GTK_SHRINK + + + + + True + vertical + + + 1 + 2 + GTK_SHRINK + + + + + True + queue + + + + + + GTK_EXPAND | GTK_SHRINK | GTK_FILL + GTK_EXPAND | GTK_SHRINK | GTK_FILL + + + + + False @@ -166,12 +202,13 @@ + 150 True Palette will be here - True - True + False + False diff --git a/src/mapviewer.cpp b/src/mapviewer.cpp index 144c669a..6e8d0bb4 100644 --- a/src/mapviewer.cpp +++ b/src/mapviewer.cpp @@ -22,7 +22,7 @@ class MapViewerData private: Map *map; int x, y; - int mousex, mousey; + int povx, povy; int done; Scene *scene; @@ -63,7 +63,7 @@ void MapViewer::TickDraw(float deltams) GetScene(); - data->map->Render(data->scene, -data->mousex, -data->mousey, 0); + data->map->Render(data->scene, -data->povx, -data->povy, 0); data->scene->Render(); delete data->scene; @@ -77,9 +77,19 @@ Scene *MapViewer::GetScene() return data->scene; } -void MapViewer::SetMouse(int x, int y) +int MapViewer::GetWidth() { - data->mousex = x; - data->mousey = y; + return data->map->GetWidth(); +} + +int MapViewer::GetHeight() +{ + return data->map->GetHeight(); +} + +void MapViewer::SetPOV(int x, int y) +{ + data->povx = x; + data->povy = y; } diff --git a/src/mapviewer.h b/src/mapviewer.h index 61abfd38..45887336 100644 --- a/src/mapviewer.h +++ b/src/mapviewer.h @@ -31,7 +31,9 @@ protected: public: /* New methods */ Scene *GetScene(); - void SetMouse(int x, int y); + int GetWidth(); + int GetHeight(); + void SetPOV(int x, int y); private: MapViewerData *data;