133 lines
5.2 KiB
C++
133 lines
5.2 KiB
C++
|
#ifndef NO_GRAPHICS
|
||
|
|
||
|
# include <cstdio>
|
||
|
# include <sstream>
|
||
|
|
||
|
# include "globals.h"
|
||
|
# include "draw.h"
|
||
|
# include "draw_global.h"
|
||
|
# include "save_graphics.h"
|
||
|
# include "vtr_path.h"
|
||
|
# include "search_bar.h"
|
||
|
|
||
|
extern ezgl::rectangle initial_world;
|
||
|
|
||
|
void save_graphics_from_button(GtkWidget* /*widget*/, gint response_id, gpointer data) {
|
||
|
auto dialog = static_cast<GtkWidget*>(data);
|
||
|
|
||
|
if (response_id == GTK_RESPONSE_ACCEPT) {
|
||
|
//user clicked on the save button
|
||
|
|
||
|
GtkWidget* content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
|
||
|
GList* list_of_widgets = gtk_container_get_children(GTK_CONTAINER(content_area));
|
||
|
GtkWidget* combo_box = NULL;
|
||
|
GtkWidget* text_entry = NULL;
|
||
|
gchar* combo_box_content = NULL;
|
||
|
std::string file_name;
|
||
|
std::string extension;
|
||
|
|
||
|
// loop through the list to find the combo box and the text entry
|
||
|
GList* current = list_of_widgets;
|
||
|
while (current != NULL) {
|
||
|
GList* next = current->next;
|
||
|
if (strcmp(gtk_widget_get_name(static_cast<GtkWidget*>(current->data)), "file_name_text_entry") == 0) {
|
||
|
// found text entry
|
||
|
text_entry = static_cast<GtkWidget*>(current->data);
|
||
|
} else if (strcmp(gtk_widget_get_name(static_cast<GtkWidget*>(current->data)), "file_name_combo_box") == 0) {
|
||
|
// found combo box
|
||
|
combo_box = static_cast<GtkWidget*>(current->data);
|
||
|
}
|
||
|
current = next;
|
||
|
}
|
||
|
|
||
|
// get the data from the text entry and combo box
|
||
|
file_name = gtk_entry_get_text(GTK_ENTRY(text_entry));
|
||
|
combo_box_content = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(combo_box));
|
||
|
extension = combo_box_content;
|
||
|
|
||
|
//save the graphics
|
||
|
save_graphics(extension, file_name);
|
||
|
|
||
|
// free dynamically allocated variables
|
||
|
g_list_free(list_of_widgets);
|
||
|
g_free(combo_box_content);
|
||
|
}
|
||
|
// free widget
|
||
|
gtk_widget_destroy(dialog);
|
||
|
}
|
||
|
|
||
|
void save_graphics(std::string& extension, std::string& file_name) {
|
||
|
file_name = file_name + "." + extension;
|
||
|
if (extension == "pdf") {
|
||
|
application.get_canvas(application.get_main_canvas_id())->print_pdf(file_name.c_str(), initial_world.width(), initial_world.height());
|
||
|
return;
|
||
|
} else if (extension == "png") {
|
||
|
application.get_canvas(application.get_main_canvas_id())->print_png(file_name.c_str(), initial_world.width(), initial_world.height());
|
||
|
return;
|
||
|
} else if (extension == "svg") {
|
||
|
application.get_canvas(application.get_main_canvas_id())->print_svg(file_name.c_str(), initial_world.width(), initial_world.height());
|
||
|
return;
|
||
|
} else {
|
||
|
warning_dialog_box("Invalid file type");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void save_graphics_dialog_box(GtkWidget* /*widget*/, ezgl::application* /*app*/) {
|
||
|
GObject* main_window;
|
||
|
GtkWidget* content_area;
|
||
|
GtkWidget* text_entry;
|
||
|
GtkWidget* name_label;
|
||
|
GtkWidget* type_label;
|
||
|
GtkWidget* dialog;
|
||
|
GtkWidget* combo_box;
|
||
|
|
||
|
// get a pointer to the main window
|
||
|
main_window = application.get_object(application.get_main_window_id().c_str());
|
||
|
|
||
|
// create a dialog window modal
|
||
|
dialog = gtk_dialog_new_with_buttons("Save Graphics Contents",
|
||
|
GTK_WINDOW(main_window),
|
||
|
GTK_DIALOG_DESTROY_WITH_PARENT,
|
||
|
("_Save"),
|
||
|
GTK_RESPONSE_ACCEPT,
|
||
|
("_Cancel"),
|
||
|
GTK_RESPONSE_REJECT,
|
||
|
NULL);
|
||
|
|
||
|
// create elements
|
||
|
name_label = gtk_label_new("File name:");
|
||
|
text_entry = gtk_entry_new();
|
||
|
type_label = gtk_label_new("File format:");
|
||
|
combo_box = gtk_combo_box_text_new();
|
||
|
|
||
|
// set name for text entry and combo box for later data extraction
|
||
|
gtk_widget_set_name(text_entry, "file_name_text_entry");
|
||
|
gtk_widget_set_name(combo_box, "file_name_combo_box");
|
||
|
|
||
|
gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo_box), "pdf"); // index 0
|
||
|
gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo_box), "png"); // index 1
|
||
|
gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo_box), "svg"); // index 2
|
||
|
|
||
|
// set default values
|
||
|
gtk_combo_box_set_active((GtkComboBox*)combo_box, 0); // default set to pdf which has an index 0
|
||
|
gtk_entry_set_text((GtkEntry*)text_entry, "vpr_graphics"); // defualt text set to vpr_graphics
|
||
|
|
||
|
// attach elements to the content area of the dialog
|
||
|
content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
|
||
|
gtk_container_add(GTK_CONTAINER(content_area), name_label);
|
||
|
gtk_container_add(GTK_CONTAINER(content_area), text_entry);
|
||
|
gtk_container_add(GTK_CONTAINER(content_area), type_label);
|
||
|
gtk_container_add(GTK_CONTAINER(content_area), combo_box);
|
||
|
|
||
|
// show the label & child widget of the dialog
|
||
|
gtk_widget_show_all(dialog);
|
||
|
|
||
|
g_signal_connect_swapped(GTK_DIALOG(dialog),
|
||
|
"response",
|
||
|
G_CALLBACK(save_graphics_from_button),
|
||
|
GTK_DIALOG(dialog));
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
#endif /* NO_GRAPHICS */
|