main_win.cc
author hegyi
Mon, 21 Nov 2005 18:03:20 +0000
branchgui
changeset 90 e9f8f44f12a3
parent 87 b44281e4cca7
child 94 adfdc2f70548
permissions -rw-r--r--
NewMapWin has become Dialog instead of Window. Therefore it is created dynamically, when there is need for it, instead of keeping one instance in memory. This solution is slower, but more correct than before.
     1 #include "main_win.h"
     2 #include "icons/guipixbufs.h"
     3 
     4 MainWin::MainWin() :
     5   mapwin("Map Setup", mapstorage, gd_canvas),
     6   gd_canvas(mapstorage, mapwin, (Gtk::Window *)this)
     7 {
     8   set_title ("unsaved file - " + prog_name);
     9   set_default_size(WIN_WIDTH,WIN_HEIGHT);
    10   add(vbox);
    11 
    12 
    13   // custom icons for the toolbar
    14 
    15   Glib::RefPtr<Gtk::IconFactory> p_icon_factory = Gtk::IconFactory::create();
    16  
    17   Glib::RefPtr<Gdk::Pixbuf> p_move_pixbuf = Gdk::Pixbuf::create_from_inline(
    18       2328, gui_icons_move);
    19   Glib::RefPtr<Gdk::Pixbuf> p_addnode_pixbuf = Gdk::Pixbuf::create_from_inline(
    20       2328, gui_icons_addnode);
    21   Glib::RefPtr<Gdk::Pixbuf> p_addlink_pixbuf = Gdk::Pixbuf::create_from_inline(
    22       2328, gui_icons_addlink);
    23   Glib::RefPtr<Gdk::Pixbuf> p_delete_pixbuf = Gdk::Pixbuf::create_from_inline(
    24       2328, gui_icons_delete);
    25   Glib::RefPtr<Gdk::Pixbuf> p_editlink_pixbuf = Gdk::Pixbuf::create_from_inline(
    26       2328, gui_icons_editlink);
    27   Glib::RefPtr<Gdk::Pixbuf> p_editnode_pixbuf = Gdk::Pixbuf::create_from_inline(
    28       2328, gui_icons_editnode);
    29   Glib::RefPtr<Gdk::Pixbuf> p_newmap_pixbuf = Gdk::Pixbuf::create_from_inline(
    30       2328, gui_icons_newmap);
    31 
    32   Gtk::IconSource move_icon_source;
    33   move_icon_source.set_pixbuf(p_move_pixbuf);
    34   Gtk::IconSet move_icon_set;
    35   move_icon_set.add_source(move_icon_source);
    36   p_icon_factory->add(Gtk::StockID("gd-move"), move_icon_set);
    37 
    38   Gtk::IconSource addnode_icon_source;
    39   addnode_icon_source.set_pixbuf(p_addnode_pixbuf);
    40   Gtk::IconSet addnode_icon_set;
    41   addnode_icon_set.add_source(addnode_icon_source);
    42   p_icon_factory->add(Gtk::StockID("gd-addnode"), addnode_icon_set);
    43 
    44   Gtk::IconSource addlink_icon_source;
    45   addlink_icon_source.set_pixbuf(p_addlink_pixbuf);
    46   Gtk::IconSet addlink_icon_set;
    47   addlink_icon_set.add_source(addlink_icon_source);
    48   p_icon_factory->add(Gtk::StockID("gd-addlink"), addlink_icon_set);
    49 
    50   Gtk::IconSource delete_icon_source;
    51   delete_icon_source.set_pixbuf(p_delete_pixbuf);
    52   Gtk::IconSet delete_icon_set;
    53   delete_icon_set.add_source(delete_icon_source);
    54   p_icon_factory->add(Gtk::StockID("gd-delete"), delete_icon_set);
    55 
    56   Gtk::IconSource editlink_icon_source;
    57   editlink_icon_source.set_pixbuf(p_editlink_pixbuf);
    58   Gtk::IconSet editlink_icon_set;
    59   editlink_icon_set.add_source(editlink_icon_source);
    60   p_icon_factory->add(Gtk::StockID("gd-editlink"), editlink_icon_set);
    61 
    62   Gtk::IconSource editnode_icon_source;
    63   editnode_icon_source.set_pixbuf(p_editnode_pixbuf);
    64   Gtk::IconSet editnode_icon_set;
    65   editnode_icon_set.add_source(editnode_icon_source);
    66   p_icon_factory->add(Gtk::StockID("gd-editnode"), editnode_icon_set);
    67 
    68   Gtk::IconSource newmap_icon_source;
    69   newmap_icon_source.set_pixbuf(p_newmap_pixbuf);
    70   Gtk::IconSet newmap_icon_set;
    71   newmap_icon_set.add_source(newmap_icon_source);
    72   p_icon_factory->add(Gtk::StockID("gd-newmap"), newmap_icon_set);
    73 
    74   p_icon_factory->add_default();
    75   
    76 
    77   ag=Gtk::ActionGroup::create();
    78 
    79   ag->add( Gtk::Action::create("FileMenu", "_File") );
    80   ag->add( Gtk::Action::create("FileNew", Gtk::Stock::NEW),
    81       sigc::mem_fun(*this, &MainWin::newFile));
    82   ag->add( Gtk::Action::create("FileOpen", Gtk::Stock::OPEN),
    83       sigc::mem_fun(*this, &MainWin::openFile));
    84   ag->add( Gtk::Action::create("FileSave", Gtk::Stock::SAVE),
    85       sigc::mem_fun(*this, &MainWin::saveFile));
    86   ag->add( Gtk::Action::create("FileSaveAs", Gtk::Stock::SAVE_AS),
    87       sigc::mem_fun(*this, &MainWin::saveFileAs));
    88   ag->add( Gtk::Action::create("Close", Gtk::Stock::CLOSE),
    89       sigc::mem_fun(*this, &MainWin::close));
    90   ag->add( Gtk::Action::create("Quit", Gtk::Stock::QUIT),
    91       sigc::mem_fun(*this, &MainWin::hide));
    92 
    93   ag->add( Gtk::Action::create("ViewMenu", "_View") );
    94   ag->add( Gtk::Action::create("ViewZoomIn", Gtk::Stock::ZOOM_IN),
    95       sigc::mem_fun(this->gd_canvas, &GraphDisplayerCanvas::zoomIn));
    96   ag->add( Gtk::Action::create("ViewZoomOut", Gtk::Stock::ZOOM_OUT),
    97       sigc::mem_fun(this->gd_canvas, &GraphDisplayerCanvas::zoomOut));
    98   ag->add( Gtk::Action::create("ViewZoomFit", Gtk::Stock::ZOOM_FIT),
    99       sigc::mem_fun(this->gd_canvas, &GraphDisplayerCanvas::zoomFit));
   100   ag->add( Gtk::Action::create("ViewZoom100", Gtk::Stock::ZOOM_100),
   101       sigc::mem_fun(this->gd_canvas, &GraphDisplayerCanvas::zoom100));
   102   
   103   ag->add( Gtk::Action::create("ShowMenu", "_Show") );
   104   ag->add( Gtk::Action::create("ShowMaps", "_Maps"),
   105       sigc::mem_fun(this->mapwin, &MapWin::show));
   106 
   107   Gtk::RadioAction::Group tool_group;
   108   ag->add( Gtk::RadioAction::create(tool_group, "MoveItem", Gtk::StockID("gd-move"), "Move"),
   109       sigc::bind( sigc::mem_fun ( this->gd_canvas, &GraphDisplayerCanvas::changeEditorialTool ), 0) );
   110   ag->add( Gtk::RadioAction::create(tool_group, "CreateNode", Gtk::StockID("gd-addnode"), "Create node"),
   111       sigc::bind( sigc::mem_fun ( this->gd_canvas, &GraphDisplayerCanvas::changeEditorialTool ), 1) );
   112   ag->add( Gtk::RadioAction::create(tool_group, "CreateEdge", Gtk::StockID("gd-addlink"), "Create edge"),
   113       sigc::bind( sigc::mem_fun ( this->gd_canvas, &GraphDisplayerCanvas::changeEditorialTool ), 2) );
   114   ag->add( Gtk::RadioAction::create(tool_group, "EraseItem", Gtk::StockID("gd-delete"), "Delete"),
   115       sigc::bind( sigc::mem_fun ( this->gd_canvas, &GraphDisplayerCanvas::changeEditorialTool ), 3) );
   116 
   117   ag->add( Gtk::RadioAction::create(tool_group, "EditEdgeMap", Gtk::StockID("gd-editlink"), "Edit edge map"),
   118       sigc::bind( sigc::mem_fun ( this->gd_canvas, &GraphDisplayerCanvas::changeEditorialTool ), 4) );
   119   ag->add( Gtk::RadioAction::create(tool_group, "EditNodeMap", Gtk::StockID("gd-editnode"), "Edit node map"),
   120       sigc::bind( sigc::mem_fun ( this->gd_canvas, &GraphDisplayerCanvas::changeEditorialTool ), 5) );
   121 
   122   ag->add( Gtk::Action::create("AddMap", Gtk::StockID("gd-newmap")),
   123       sigc::mem_fun (new NewMapWin("NewMapWin", gd_canvas), &NewMapWin::show ) );
   124 
   125   uim=Gtk::UIManager::create();
   126   uim->insert_action_group(ag);
   127   add_accel_group(uim->get_accel_group());
   128 
   129   try
   130   {
   131 
   132     Glib::ustring ui_info =
   133       "<ui>"
   134       "  <menubar name='MenuBar'>"
   135       "    <menu action='FileMenu'>"
   136       "      <menuitem action='FileNew'/>"
   137       "      <menuitem action='FileOpen'/>"
   138       "      <menuitem action='FileSave'/>"
   139       "      <menuitem action='FileSaveAs'/>"
   140       "      <menuitem action='Close'/>"
   141       "      <menuitem action='Quit'/>"
   142       "    </menu>"
   143       "    <menu action='ViewMenu'>"
   144       "      <menuitem action='ViewZoomIn' />"
   145       "      <menuitem action='ViewZoomOut' />"
   146       "      <menuitem action='ViewZoom100' />"
   147       "      <menuitem action='ViewZoomFit' />"
   148       "    </menu>"
   149       "    <menu action='ShowMenu'>"
   150       "      <menuitem action='ShowMaps'/>"
   151       "    </menu>"
   152       "  </menubar>"
   153       "  <toolbar name='ToolBar'>"
   154       "    <toolitem action='FileNew' />"
   155       "    <toolitem action='FileOpen' />"
   156       "    <toolitem action='FileSave' />"
   157       "    <toolitem action='Close' />"
   158       "    <separator />"
   159       "    <toolitem action='ViewZoomIn' />"
   160       "    <toolitem action='ViewZoomOut' />"
   161       "    <toolitem action='ViewZoom100' />"
   162       "    <toolitem action='ViewZoomFit' />"
   163       "    <separator />"
   164       "    <toolitem action='MoveItem' />"
   165       "    <toolitem action='CreateNode' />"
   166       "    <toolitem action='CreateEdge' />"
   167       "    <toolitem action='EraseItem' />"
   168       "    <toolitem action='EditEdgeMap' />"
   169       "    <toolitem action='EditNodeMap' />"
   170       "    <separator />"
   171       "    <toolitem action='AddMap' />"
   172       "  </toolbar>"
   173       "</ui>";
   174 
   175     uim->add_ui_from_string(ui_info);
   176 
   177   }
   178   catch(const Glib::Error& ex)
   179   {
   180     std::cerr << "building menus failed: " <<  ex.what();
   181   }
   182 
   183   Gtk::Widget* menubar = uim->get_widget("/MenuBar");
   184   if (menubar){
   185     vbox.pack_start(*menubar, Gtk::PACK_SHRINK);
   186   }
   187 
   188   Gtk::Widget* toolbar = uim->get_widget("/ToolBar");
   189   if (toolbar)
   190   {
   191     static_cast<Gtk::Toolbar*>(toolbar)->set_toolbar_style(Gtk::TOOLBAR_ICONS);
   192     vbox.pack_start(*toolbar, Gtk::PACK_SHRINK);
   193   }
   194 
   195   Gtk::ScrolledWindow* pScrolledWindow = manage(new Gtk::ScrolledWindow());
   196   pScrolledWindow->set_shadow_type(Gtk::SHADOW_IN);
   197   pScrolledWindow->add(gd_canvas);
   198   vbox.pack_start(*pScrolledWindow);
   199 
   200   tooltips.set_tip(*(uim->get_widget("/ToolBar/CreateNode")),"Create Node");
   201   tooltips.enable();
   202 
   203   show_all_children();
   204 }
   205 
   206 void MainWin::readFile(const std::string &file)
   207 {
   208   mapstorage.readFromFile(file);
   209   mapstorage.file_name = file;
   210   mapstorage.modified = false;
   211   gd_canvas.drawGraph();
   212   mapwin.update();
   213   set_title(Glib::filename_display_basename(file) + " - " + prog_name);
   214 }
   215 
   216 void MainWin::newFile()
   217 {
   218   if (mapstorage.modified)
   219   {
   220     Gtk::MessageDialog mdialog("<b>Save changes before closing?</b>", true,
   221         Gtk::MESSAGE_WARNING, Gtk::BUTTONS_NONE);
   222     mdialog.add_button("Close _without Saving", Gtk::RESPONSE_REJECT);
   223     mdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
   224     mdialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
   225     switch (mdialog.run())
   226     {
   227       case Gtk::RESPONSE_CANCEL:
   228         return;
   229       case Gtk::RESPONSE_REJECT:
   230         break;
   231       case Gtk::RESPONSE_ACCEPT:
   232         saveFile();
   233         break;
   234     }
   235   }
   236   gd_canvas.clear();
   237   mapstorage.clear();
   238   mapwin.update();
   239   set_title("unsaved file - " + prog_name);
   240 }
   241 
   242 void MainWin::openFile()
   243 {
   244   if (mapstorage.modified)
   245   {
   246     Gtk::MessageDialog mdialog("<b>Save changes before closing?</b>", true, 
   247         Gtk::MESSAGE_WARNING, Gtk::BUTTONS_NONE);
   248     mdialog.add_button("Close _without Saving", Gtk::RESPONSE_REJECT);
   249     mdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
   250     mdialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
   251     switch (mdialog.run())
   252     {
   253       case Gtk::RESPONSE_CANCEL:
   254         return;
   255       case Gtk::RESPONSE_REJECT:
   256         break;
   257       case Gtk::RESPONSE_ACCEPT:
   258         saveFile();
   259         break;
   260     }
   261   }
   262   Gtk::FileChooserDialog fcdialog("Open File");
   263   fcdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
   264   fcdialog.add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
   265   if (fcdialog.run() == Gtk::RESPONSE_ACCEPT)
   266   {
   267     gd_canvas.clear();
   268     mapstorage.clear();
   269     Glib::ustring filename = fcdialog.get_filename();
   270     if (!mapstorage.readFromFile(filename))
   271     {
   272       mapstorage.file_name = filename;
   273       mapstorage.modified = false;
   274       gd_canvas.drawGraph();
   275       mapwin.update();
   276       set_title(Glib::filename_display_basename(filename) + " - " + prog_name);
   277     }
   278   }
   279 }
   280 
   281 void MainWin::saveFile()
   282 {
   283   if (mapstorage.file_name == "") {
   284     saveFileAs();
   285   }
   286   else
   287   {
   288     mapstorage.writeToFile(mapstorage.file_name);
   289     mapstorage.modified = false;
   290     set_title(Glib::filename_display_basename(mapstorage.file_name) + " - " +
   291         prog_name);
   292   }
   293 }
   294 
   295 void MainWin::saveFileAs()
   296 {
   297   Gtk::FileChooserDialog fcdialog("Save File", Gtk::FILE_CHOOSER_ACTION_SAVE);
   298   fcdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
   299   fcdialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
   300   if (fcdialog.run() == Gtk::RESPONSE_ACCEPT)
   301   {
   302     Glib::ustring filename = fcdialog.get_filename();
   303     mapstorage.file_name = filename;
   304     mapstorage.writeToFile(filename);
   305     mapstorage.modified = false;
   306     set_title(Glib::filename_display_basename(filename) + " - " + prog_name);
   307   }
   308 }
   309 
   310 void MainWin::close()
   311 {
   312   if (mapstorage.modified)
   313   {
   314     Gtk::MessageDialog mdialog("<b>Save changes before closing?</b>", true,
   315         Gtk::MESSAGE_WARNING, Gtk::BUTTONS_NONE);
   316     mdialog.add_button("Close _without Saving", Gtk::RESPONSE_REJECT);
   317     mdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
   318     mdialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
   319     switch (mdialog.run())
   320     {
   321       case Gtk::RESPONSE_CANCEL:
   322         return;
   323       case Gtk::RESPONSE_REJECT:
   324         break;
   325       case Gtk::RESPONSE_ACCEPT:
   326         saveFile();
   327         break;
   328     }
   329   }
   330   gd_canvas.clear();
   331   mapstorage.clear();
   332   mapwin.update();
   333   set_title("unsaved file - " + prog_name);
   334 }