egami
C++ Image Processing program
/homes/esi30/DCS339/coursework/src/processing_unit.cpp
Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends