egami
C++ Image Processing program
|
00001 #include <memory> 00002 #include <string> 00003 00004 #include <gtkmm/enums.h> 00005 #include <gtkmm/image.h> 00006 #include <gtkmm/messagedialog.h> 00007 00008 #include "catalogue.hpp" 00009 #include "display_unit.hpp" 00010 #include "image.hpp" 00011 #include "processing_unit.hpp" 00012 00013 Processing_unit::Processing_unit(const Processing &p, const std::string &t, const Gtk::Image &i, bool new_tab): 00014 Processing(p), title(t), label(t), icon(i.get_pixbuf()->copy()), new_tab(new_tab) { 00015 00016 set_image(container); 00017 container.pack_start(icon); 00018 container.pack_end(label); 00019 container.show_all_children(); 00020 } 00021 00022 void Processing_unit::on_clicked(){ 00024 std::shared_ptr<Display_page> dp(Display_catalogue::current_page()); 00025 if(!dp){ 00026 Gtk::MessageDialog dialog("No image loaded", false, Gtk::MESSAGE_ERROR); 00027 dialog.run(); 00028 return; 00029 } 00030 00031 std::shared_ptr<Display_unit> du(dp->display_unit); 00032 if(!(du->modifiable())){ 00033 Gtk::MessageDialog dialog("No image to process", false, Gtk::MESSAGE_ERROR); 00034 dialog.run(); 00035 return; 00036 } 00037 00038 Display_unit *r(nullptr); 00039 try{ 00040 r=(*this)(dynamic_cast<Image_unit*>(du.get())); 00041 } catch(std::exception &e){ 00042 Gtk::MessageDialog dialog(e.what(), false, Gtk::MESSAGE_ERROR); 00043 dialog.run(); 00044 return; 00045 } 00046 00047 if(!r) 00048 return; 00049 00050 if(new_tab){ 00051 Display_catalogue::add_page(title, r); 00052 if(Image_unit *iu=dynamic_cast<Image_unit*>(r)) 00053 iu->redraw(); 00054 }else{ 00055 r->father=du; 00056 std::unique_ptr<Display_page> n_dp; 00057 00058 dp->detach_child(); 00059 00060 if(Image_unit *iu=dynamic_cast<Image_unit*>(r)) 00061 n_dp=std::unique_ptr<Display_page>(new Display_page(std::shared_ptr<Image_unit>(iu))); 00062 else if(Info_unit *iu=dynamic_cast<Info_unit*>(r)) 00063 n_dp=std::unique_ptr<Display_page>(new Display_page(std::shared_ptr<Info_unit>(iu))); 00064 00065 du->child=n_dp->display_unit; 00066 00067 n_dp->detach_child(); 00068 00069 swap(*n_dp, *dp); 00070 00071 dp->attach_child(); 00072 00073 dynamic_cast<Image_unit*>(du.get())->redraw(); 00074 if(Image_unit *iu=dynamic_cast<Image_unit*>(r)) 00075 iu->redraw(); 00076 } 00077 }