23 #include "graph_viewport.h" 24 #include "gvplugin_skillgui_papyrus.h" 36 Cairo::RefPtr<Cairo::SolidPattern> bp = Cairo::SolidPattern::create_rgb(1, 1, 1);
37 Papyrus::Paint::pointer pp = Papyrus::Paint::create(bp);
39 Papyrus::Canvas::pointer c = canvas();
40 c->set_scroll_anchor(Papyrus::SCROLL_ANCHOR_TOP_LEFT);
41 c->set_background(pp);
43 __affine = Papyrus::AffineController::create();
45 __translator = Papyrus::Translator::create();
46 add_controller(__translator);
54 __bbw = __bbh = __pad_x = __pad_y = 0.0;
55 __translation_x = __translation_y = 0.0;
57 __update_graph =
true;
59 Gtk::Window *w =
dynamic_cast<Gtk::Window *
>(get_toplevel());
61 __fcd =
new Gtk::FileChooserDialog(*w,
"Save Graph",
62 Gtk::FILE_CHOOSER_ACTION_SAVE);
63 __fcd->set_transient_for(*w);
65 __fcd =
new Gtk::FileChooserDialog(
"Save Graph",
66 Gtk::FILE_CHOOSER_ACTION_SAVE);
70 __fcd->add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
71 __fcd->add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK);
73 Gtk::FileFilter *filter_pdf = Gtk::manage(
new Gtk::FileFilter());
74 filter_pdf->set_name(
"Portable Document Format (PDF)");
75 filter_pdf->add_pattern(
"*.pdf");
76 Gtk::FileFilter *filter_svg = Gtk::manage(
new Gtk::FileFilter());;
77 filter_svg->set_name(
"Scalable Vector Graphic (SVG)");
78 filter_svg->add_pattern(
"*.svg");
79 Gtk::FileFilter *filter_png = Gtk::manage(
new Gtk::FileFilter());;
80 filter_png->set_name(
"Portable Network Graphic (PNG)");
81 filter_png->add_pattern(
"*.png");
82 __fcd->add_filter(*filter_pdf);
83 __fcd->add_filter(*filter_svg);
84 __fcd->add_filter(*filter_png);
85 __fcd->set_filter(*filter_pdf);
87 gvplugin_skillgui_setup(__gvc,
this);
118 if ( __graph_fsm != fsm_name ) {
119 __translator->set_translate(0, 0);
121 __graph_fsm = fsm_name;
143 __translator->insert(d);
153 Papyrus::Gtk::Viewport::clear();
154 __translator->clear();
192 __translation_x = tx;
193 __translation_y = ty;
213 return __update_graph;
223 __update_graph = update;
234 Gtk::Allocation alloc = get_allocation();
236 __affine->get_scale(sx, sy);
237 sx += 0.1; sy += 0.1;
238 __affine->set_scale(sx, sy);
239 __affine->set_translate((alloc.get_width() - __bbw * sx) / 2.0,
240 (alloc.get_height() - __bbh * sy) / 2.0);
242 __scale_override =
true;
253 __affine->get_scale(sx, sy);
254 if ( (sx > 0.1) && (sy > 0.1) ) {
255 Gtk::Allocation alloc = get_allocation();
256 sx -= 0.1; sy -= 0.1;
257 __affine->set_scale(sx, sy);
258 __affine->set_translate((alloc.get_width() - __bbw * sx) / 2.0,
259 (alloc.get_height() - __bbh * sy) / 2.0);
261 __scale_override =
true;
271 __affine->set_scale(__scale);
272 __affine->set_translate(__pad_x + __translation_x, __pad_y + __translation_y);
273 __translator->set_translate(0, 0);
274 __scale_override =
false;
284 __affine->set_scale(1.0);
285 if ( __scale == 1.0 ) {
286 __affine->set_translate(__pad_x + __translation_x, __pad_y + __translation_y);
288 __affine->set_translate(__pad_x, __pad_y);
290 __scale_override =
true;
300 return __scale_override;
307 Papyrus::AffineController::pointer
317 Gtk::Window *w =
dynamic_cast<Gtk::Window *
>(get_toplevel());
319 int result = __fcd->run();
320 if (result == Gtk::RESPONSE_OK) {
322 double old_scale_x, old_scale_y, old_translate_x, old_translate_y;
323 __affine->get_scale(old_scale_x, old_scale_y);
324 __affine->get_translate(old_translate_x, old_translate_y);
325 __affine->set_scale(1);
326 __affine->set_translate(__pad_x, __pad_y);
328 Papyrus::Canvas::pointer c = canvas();
330 Cairo::RefPtr<Cairo::Surface> surface;
332 std::string filename = __fcd->get_filename();
333 bool write_to_png =
false;
334 if (filename !=
"") {
335 Gtk::FileFilter *f = __fcd->get_filter();
336 if (f->get_name().find(
"PDF") != Glib::ustring::npos) {
337 surface = Cairo::PdfSurface::create(filename, __bbw, __bbh);
338 }
else if (f->get_name().find(
"SVG") != Glib::ustring::npos) {
339 surface = Cairo::SvgSurface::create(filename, __bbw, __bbh);
340 }
else if (f->get_name().find(
"PNG") != Glib::ustring::npos) {
341 surface = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, __bbw, __bbh);
346 Cairo::RefPtr<Cairo::Context> context = Cairo::Context::create(surface);
349 surface->write_to_png(filename);
354 Gtk::MessageDialog md(*w,
"Invalid filename",
355 false, Gtk::MESSAGE_ERROR,
356 Gtk::BUTTONS_OK,
true);
357 md.set_title(
"Invalid File Name");
361 __affine->set_scale(old_scale_x, old_scale_y);
362 __affine->set_translate(old_translate_x, old_translate_y);
373 if (! __update_graph)
return;
375 Papyrus::Canvas::pointer c = canvas();
376 #ifdef HAVE_TIMS_PAPYRUS_PATCHES 377 c->set_redraw_enabled(
false);
379 Agraph_t *g = agmemread((
char *)__graph.c_str());
381 gvLayout(__gvc, g, (
char *)
"dot");
382 gvRender(__gvc, g, (
char *)
"skillgui", NULL);
383 gvFreeLayout(__gvc, g);
388 #ifdef HAVE_TIMS_PAPYRUS_PATCHES 389 c->set_redraw_enabled(
true);
400 if (__scale_override) {
401 Gtk::Allocation alloc = get_allocation();
404 __affine->get_scale(sx, sy);
405 __affine->set_translate(((alloc.get_width() - __bbw * sx) / 2.0) + __pad_x,
406 ((alloc.get_height() - __bbh * sy) / 2.0) + __pad_y);
void on_expose(GdkEventExpose *event)
Called on explose.
SkillGuiGraphViewport()
Constructor.
void set_graph_fsm(std::string fsm_name)
Set graph's FSM name.
void set_pad(double pad_x, double pad_y)
Set padding.
void set_scale(double scale)
Set scale.
bool scale_override()
Check if scale override is enabled.
void save()
Render current graph.
void add_drawable(Papyrus::Drawable::pointer d)
Add a drawable.
void set_bb(double bbw, double bbh)
Set bounding box.
void set_update_graph(bool update)
Set if the graph should be updated on new data.
virtual void clear()
Clear all drawables.
void set_gvjob(GVJ_t *job)
Set current Graphviz job.
Papyrus::AffineController::pointer get_affine()
Get scaler.
void set_graph(std::string graph)
Set graph.
void set_translation(double tx, double ty)
Set translation.
~SkillGuiGraphViewport()
Destructor.
void zoom_fit()
Zoom to fit.
void zoom_reset()
Zoom reset.
void render()
Render current graph.
bool get_update_graph()
Check if graph is being updated.