From 09064d6e2291a216f6a1fed41033dd972240eebf Mon Sep 17 00:00:00 2001 From: Kai Sterker Date: Fri, 8 Apr 2011 23:45:24 +0200 Subject: [PATCH] ADDED initial zoom support. Not working very well yet. --- src/modeller/gui_modeller.cc | 45 +++++++++++++++++++++ src/modeller/gui_modeller.h | 5 +++ src/modeller/gui_preview.cc | 19 ++++++--- src/modeller/mdl_renderer.cc | 4 ++ src/modeller/modeller.glade | 77 +++++++++++++++++++++++++++--------- 5 files changed, 127 insertions(+), 23 deletions(-) diff --git a/src/modeller/gui_modeller.cc b/src/modeller/gui_modeller.cc index c4898fa..d19a311 100644 --- a/src/modeller/gui_modeller.cc +++ b/src/modeller/gui_modeller.cc @@ -148,6 +148,36 @@ static void on_file_save_activate (GtkMenuItem * menuitem, gpointer user_data) } } +// Model Menu: Zoom In +static void on_model_zoom_in (GtkMenuItem * menuitem, gpointer user_data) +{ + base::Scale++; + + GuiModeller *modeller = (GuiModeller *) user_data; + modeller->setActive("item_zoom_out", true); + modeller->zoom(); +} + +// Model Menu: Zoom Out +static void on_model_zoom_out (GtkMenuItem * menuitem, gpointer user_data) +{ + base::Scale--; + + GuiModeller *modeller = (GuiModeller *) user_data; + modeller->setActive("item_zoom_out", base::Scale > 1); + modeller->zoom(); +} + +// Model Menu: Zoom Normal +static void on_model_reset_zoom (GtkMenuItem * menuitem, gpointer user_data) +{ + base::Scale = 1; + + GuiModeller *modeller = (GuiModeller *) user_data; + modeller->setActive("item_zoom_out", false); + modeller->zoom(); +} + // callback for selection changes in sprite list static void anim_selected_event (GtkTreeSelection *selection, gpointer user_data) { @@ -361,6 +391,12 @@ GuiModeller::GuiModeller () g_signal_connect (widget, "activate", G_CALLBACK (on_file_save_as_activate), (gpointer) this); widget = gtk_builder_get_object (Ui, "item_quit"); g_signal_connect (widget, "activate", G_CALLBACK (on_widget_destroy), (gpointer) NULL); + widget = gtk_builder_get_object (Ui, "item_zoom_in"); + g_signal_connect (widget, "activate", G_CALLBACK (on_model_zoom_in), (gpointer) this); + widget = gtk_builder_get_object (Ui, "item_zoom_out"); + g_signal_connect (widget, "activate", G_CALLBACK (on_model_zoom_out), (gpointer) this); + widget = gtk_builder_get_object (Ui, "item_zoom_normal"); + g_signal_connect (widget, "activate", G_CALLBACK (on_model_reset_zoom), (gpointer) this); // connect button signals widget = gtk_builder_get_object (Ui, "add_sprite"); @@ -392,6 +428,9 @@ GuiModeller::GuiModeller () selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(widget)); g_signal_connect (G_OBJECT(selection), "changed", G_CALLBACK(shape_selected_event), this); + // can't zoom less than 1 + setActive("item_zoom_out", false); + // update title setTitle(false); } @@ -891,6 +930,12 @@ void GuiModeller::updateShapeList (world::placeable_model *model) gtk_toggle_button_set_active (is_solid, shape->is_solid ()); } +// zoom displayed model +void GuiModeller::zoom() +{ + Preview->draw(0, 0, 800, 600); +} + // enable or disable a widget void GuiModeller::setActive (const std::string & id, const bool & sensitive) { diff --git a/src/modeller/gui_modeller.h b/src/modeller/gui_modeller.h index 3af3ce9..2482f46 100644 --- a/src/modeller/gui_modeller.h +++ b/src/modeller/gui_modeller.h @@ -167,6 +167,11 @@ class GuiModeller */ void setActive (const std::string & id, const bool & sensitive); + /** + * Update zoom level of displayed model. + */ + void zoom (); + protected: /** * Update main window title. diff --git a/src/modeller/gui_preview.cc b/src/modeller/gui_preview.cc index b29fcb1..c6b87e2 100644 --- a/src/modeller/gui_preview.cc +++ b/src/modeller/gui_preview.cc @@ -145,16 +145,25 @@ void GuiPreview::draw (const int & sx, const int & sy, const int & l, const int // set clipping rectangle gfx::drawing_area da (sx, sy, l, h); - // draw target - Target->draw (0, 0, &da, s); + // zoom stuff (testing) + if (base::Scale != 1) + { + gfx::surface *tmp = gfx::create_surface(); + tmp->resize(Target->length(), Target->height()); + Target->scale(tmp, base::Scale); + tmp->draw (0, 0, &da, s); + delete tmp; + } + else + { + // draw target + Target->draw (0, 0, &da, s); + } } // update size of the view void GuiPreview::resizeSurface (GtkWidget *widget) { - // set the size of the drawing area - gtk_widget_set_size_request (GTK_WIDGET (DrawingArea), widget->allocation.width, widget->allocation.height); - // set size of the render target Target->resize (widget->allocation.width, widget->allocation.height); diff --git a/src/modeller/mdl_renderer.cc b/src/modeller/mdl_renderer.cc index 429666e..f02f589 100644 --- a/src/modeller/mdl_renderer.cc +++ b/src/modeller/mdl_renderer.cc @@ -85,12 +85,16 @@ void ModelRenderer::draw (const s_int16 & x, const s_int16 & y, const world::ren { if (ActiveModel != NULL && obj.Shape == ActiveModel->current_shape()) { + // draw everything behind the currently selected sprite Overlay->draw (0, 0, &da, target); + // clear overlay Overlay->fillrect (0, 0, Overlay->length(), Overlay->height(), 0); + // draw currently selected sprite renderer_base::draw (x, y, obj, da, target); } else { + // render unselected sprites onto translucent overlay renderer_base::draw (x, y, obj, da, Overlay); } } diff --git a/src/modeller/modeller.glade b/src/modeller/modeller.glade index cd24ffd..a14bff2 100644 --- a/src/modeller/modeller.glade +++ b/src/modeller/modeller.glade @@ -1,4 +1,4 @@ - + @@ -25,14 +25,13 @@ True - vertical True True - _Datei + _File True @@ -91,6 +90,51 @@ + + + True + _Model + True + + + True + True + + + gtk-zoom-in + True + True + True + menu_accelerators + + + + + gtk-zoom-out + True + True + True + menu_accelerators + + + + + True + + + + + gtk-zoom-100 + True + True + True + menu_accelerators + + + + + + False @@ -112,7 +156,6 @@ 300 True - vertical True @@ -230,12 +273,10 @@ True - vertical 2 - + True - horizontal 4 @@ -269,8 +310,8 @@ False True True - img_add2 Add new shape + img_add2 False @@ -284,8 +325,8 @@ False True True - img_remove2 Remove selected shape + img_remove2 False @@ -299,8 +340,8 @@ False True True - img_copy Copy current shape(s) to clipboard + img_copy False @@ -438,7 +479,7 @@ True True - + 3 @@ -453,7 +494,7 @@ True True - + 3 @@ -468,7 +509,7 @@ True True - + 3 @@ -483,7 +524,7 @@ True True - + 3 @@ -498,7 +539,7 @@ True True - + 3 @@ -513,7 +554,7 @@ True True - + 3 @@ -528,7 +569,7 @@ True True - + 3 @@ -543,7 +584,7 @@ True True - + 3