1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
#include "navigator_box.h"
#include "image_cache.h"
#include <gtkmm/image.h>
#include "model/wb_model_diagram_form.h"
#include "base/string_utilities.h"
using base::strfmt;
static int zoom_levels[]= {
200,
150,
100,
95,
90,
85,
80,
75,
70,
60,
50,
40,
30,
20,
10
};
NavigatorBox::NavigatorBox()
: Gtk::VBox(false, 2), _model(0), _canvas(mdc::GtkCanvas::XlibCanvasType), _changing_zoom(false)
{
Gtk::HBox *hbox= Gtk::manage(new Gtk::HBox(false, 0));
_canvas.signal_size_allocate().connect(sigc::mem_fun(this, &NavigatorBox::size_change));
pack_start(_canvas, true, true);
pack_start(*hbox, false, false);
Gtk::Image *image1= Gtk::manage(new Gtk::Image(ImageCache::get_instance()->image_from_filename("navigator_zoom_in.png")));
Gtk::Image *image2= Gtk::manage(new Gtk::Image(ImageCache::get_instance()->image_from_filename("navigator_zoom_out.png")));
_combo.set_name("zoom_combo");
_combo.set_size_request(60, -1);
_slider.set_draw_value(false);
_slider.set_range(10, 200);
_slider.signal_value_changed().connect(sigc::mem_fun(this, &NavigatorBox::slider_changed));
_combo.signal_changed().connect(sigc::bind(sigc::mem_fun(this, &NavigatorBox::combo_changed), false));
_combo.get_entry()->signal_activate().connect(sigc::bind(sigc::mem_fun(this, &NavigatorBox::combo_changed), true));
_combo.get_entry()->signal_focus_out_event().connect(sigc::bind_return(sigc::hide(sigc::bind(sigc::mem_fun(this, &NavigatorBox::combo_changed), true)), false));
for (unsigned int i= 0; i < sizeof(zoom_levels)/sizeof(int); i++)
_combo.append_text(strfmt("%i", zoom_levels[i]));
_combo.set_active_text("100");
_zoom_in.add(*image1);
_zoom_out.add(*image2);
_zoom_in.set_relief(Gtk::RELIEF_NONE);
_zoom_in.set_focus_on_click(false);
_zoom_out.set_relief(Gtk::RELIEF_NONE);
_zoom_out.set_focus_on_click(false);
hbox->pack_start(_zoom_out, false, false);
hbox->pack_start(_slider, true, true);
hbox->pack_start(_zoom_in, false, false);
hbox->pack_start(_combo, false, false);
show_all();
}
void NavigatorBox::set_model(wb::ModelDiagramForm *model)
{
_model = model;
_zoom_in.signal_clicked().connect(sigc::mem_fun(_model, &wb::ModelDiagramForm::zoom_in));
_zoom_out.signal_clicked().connect(sigc::mem_fun(_model, &wb::ModelDiagramForm::zoom_out));
// g_assert(_model->get_view());
_model->setup_mini_view(_canvas.get_canvas());
_model->update_mini_view_size(_canvas.get_width(), _canvas.get_height());
}
void NavigatorBox::size_change(Gtk::Allocation &alloc)
{
if (_model)
_model->update_mini_view_size(_canvas.get_width(), _canvas.get_height());
}
void NavigatorBox::refresh()
{
int value= 100;
// if (is_realized())
// realized();
if (_changing_zoom || !_model) return;
_changing_zoom = true;
value= (int)(_model->get_zoom()*100);
_slider.set_value(value);
_combo.get_entry()->set_text(strfmt("%i", value));
_slider.set_sensitive(_model != 0);
_combo.set_sensitive(_model != 0);
_changing_zoom = false;
}
void NavigatorBox::slider_changed()
{
if (_model && !_changing_zoom)
{
_changing_zoom = true;
int value= (int)_slider.get_value();
_model->set_zoom(value/100.0);
refresh();
_changing_zoom = false;
}
}
void NavigatorBox::combo_changed(bool force_update)
{
if (_model && !_changing_zoom)
{
_changing_zoom = true;
if (force_update || !_combo.get_entry()->has_focus())
{
_model->set_zoom(base::atoi<int>(_combo.get_entry()->get_text(), 0) / 100.0);
refresh();
}
_changing_zoom = false;
}
}
|