The graph adadptors can be alteration observed.
In most cases it uses the adapted graph alteration notifiers.
Only special case is now the UndirGraphAdaptor, where
we have to proxy the signals from the graph.
The SubBidirGraphAdaptor is removed, because it doest not
gives more feature than the EdgeSubGraphAdaptor<UndirGraphAdaptor<Graph>>.
The ResGraphAdaptor is based on this composition.
2 #include "guipixbufs.h"
7 set_default_size(WIN_WIDTH,WIN_HEIGHT);
10 // custom icons for the toolbar
11 Glib::RefPtr<Gtk::IconFactory> p_icon_factory = Gtk::IconFactory::create();
13 Glib::RefPtr<Gdk::Pixbuf> p_move_pixbuf = Gdk::Pixbuf::create_from_inline(
14 2328, gui_icons_move);
15 Glib::RefPtr<Gdk::Pixbuf> p_addnode_pixbuf = Gdk::Pixbuf::create_from_inline(
16 2328, gui_icons_addnode);
17 Glib::RefPtr<Gdk::Pixbuf> p_addlink_pixbuf = Gdk::Pixbuf::create_from_inline(
18 2328, gui_icons_addlink);
19 Glib::RefPtr<Gdk::Pixbuf> p_delete_pixbuf = Gdk::Pixbuf::create_from_inline(
20 2328, gui_icons_delete);
21 Glib::RefPtr<Gdk::Pixbuf> p_editlink_pixbuf = Gdk::Pixbuf::create_from_inline(
22 2328, gui_icons_editlink);
23 Glib::RefPtr<Gdk::Pixbuf> p_editnode_pixbuf = Gdk::Pixbuf::create_from_inline(
24 2328, gui_icons_editnode);
25 Glib::RefPtr<Gdk::Pixbuf> p_newmap_pixbuf = Gdk::Pixbuf::create_from_inline(
26 2328, gui_icons_newmap);
28 Gtk::IconSource move_icon_source;
29 move_icon_source.set_pixbuf(p_move_pixbuf);
30 Gtk::IconSet move_icon_set;
31 move_icon_set.add_source(move_icon_source);
32 p_icon_factory->add(Gtk::StockID("gd-move"), move_icon_set);
34 Gtk::IconSource addnode_icon_source;
35 addnode_icon_source.set_pixbuf(p_addnode_pixbuf);
36 Gtk::IconSet addnode_icon_set;
37 addnode_icon_set.add_source(addnode_icon_source);
38 p_icon_factory->add(Gtk::StockID("gd-addnode"), addnode_icon_set);
40 Gtk::IconSource addlink_icon_source;
41 addlink_icon_source.set_pixbuf(p_addlink_pixbuf);
42 Gtk::IconSet addlink_icon_set;
43 addlink_icon_set.add_source(addlink_icon_source);
44 p_icon_factory->add(Gtk::StockID("gd-addlink"), addlink_icon_set);
46 Gtk::IconSource delete_icon_source;
47 delete_icon_source.set_pixbuf(p_delete_pixbuf);
48 Gtk::IconSet delete_icon_set;
49 delete_icon_set.add_source(delete_icon_source);
50 p_icon_factory->add(Gtk::StockID("gd-delete"), delete_icon_set);
52 Gtk::IconSource editlink_icon_source;
53 editlink_icon_source.set_pixbuf(p_editlink_pixbuf);
54 Gtk::IconSet editlink_icon_set;
55 editlink_icon_set.add_source(editlink_icon_source);
56 p_icon_factory->add(Gtk::StockID("gd-editlink"), editlink_icon_set);
58 Gtk::IconSource editnode_icon_source;
59 editnode_icon_source.set_pixbuf(p_editnode_pixbuf);
60 Gtk::IconSet editnode_icon_set;
61 editnode_icon_set.add_source(editnode_icon_source);
62 p_icon_factory->add(Gtk::StockID("gd-editnode"), editnode_icon_set);
64 Gtk::IconSource newmap_icon_source;
65 newmap_icon_source.set_pixbuf(p_newmap_pixbuf);
66 Gtk::IconSet newmap_icon_set;
67 newmap_icon_set.add_source(newmap_icon_source);
68 p_icon_factory->add(Gtk::StockID("gd-newmap"), newmap_icon_set);
70 p_icon_factory->add_default();
72 ag=Gtk::ActionGroup::create();
74 ag->add( Gtk::Action::create("FileMenu", "_File") );
75 ag->add( Gtk::Action::create("FileNew", Gtk::Stock::NEW),
76 sigc::mem_fun(*this, &MainWin::newTab));
77 ag->add( Gtk::Action::create("FileOpen", Gtk::Stock::OPEN),
78 sigc::mem_fun(*this, &MainWin::openFile));
79 ag->add( Gtk::Action::create("FileClearTab", "Clear Tab"),
80 sigc::mem_fun(*this, &MainWin::newFile));
81 ag->add( Gtk::Action::create("FileSave", Gtk::Stock::SAVE),
82 sigc::mem_fun(*this, &MainWin::saveFile));
83 ag->add( Gtk::Action::create("FileSaveAs", Gtk::Stock::SAVE_AS),
84 sigc::mem_fun(*this, &MainWin::saveFileAs));
85 ag->add( Gtk::Action::create("Close", Gtk::Stock::CLOSE),
86 sigc::mem_fun(*this, &MainWin::closeTab));
87 ag->add( Gtk::Action::create("Quit", Gtk::Stock::QUIT),
88 sigc::mem_fun(*this, &MainWin::hide));
90 ag->add( Gtk::Action::create("ViewMenu", "_View") );
91 ag->add( Gtk::Action::create("ViewZoomIn", Gtk::Stock::ZOOM_IN),
92 sigc::mem_fun(*this, &MainWin::zoomIn));
93 ag->add( Gtk::Action::create("ViewZoomOut", Gtk::Stock::ZOOM_OUT),
94 sigc::mem_fun(*this, &MainWin::zoomOut));
95 ag->add( Gtk::Action::create("ViewZoomFit", Gtk::Stock::ZOOM_FIT),
96 sigc::mem_fun(*this, &MainWin::zoomFit));
97 ag->add( Gtk::Action::create("ViewZoom100", Gtk::Stock::ZOOM_100),
98 sigc::mem_fun(*this, &MainWin::zoom100));
100 ag->add( Gtk::Action::create("ShowMenu", "_Show") );
101 ag->add( Gtk::Action::create("ShowMaps", "_Maps"),
102 sigc::mem_fun(*this, &MainWin::createMapWin));
104 ag->add( Gtk::Action::create("AlgoMenu", "_Algorithms") );
105 ag->add( Gtk::Action::create("AlgoGeneral", "_General"),
106 sigc::bind( sigc::mem_fun ( *this, &MainWin::createAlgoWin ), 0) );
107 ag->add( Gtk::Action::create("AlgoKruskal", "_Kruskal"),
108 sigc::bind( sigc::mem_fun ( *this, &MainWin::createAlgoWin ), 1) );
110 Gtk::RadioAction::Group tool_group;
111 ag->add( Gtk::RadioAction::create(tool_group, "MoveItem", Gtk::StockID("gd-move"), "Move"),
112 sigc::bind( sigc::mem_fun ( *this, &MainWin::changeEditorialTool ), 0) );
113 ag->add( Gtk::RadioAction::create(tool_group, "CreateNode", Gtk::StockID("gd-addnode"), "Create node"),
114 sigc::bind( sigc::mem_fun ( *this, &MainWin::changeEditorialTool ), 1) );
115 ag->add( Gtk::RadioAction::create(tool_group, "CreateEdge", Gtk::StockID("gd-addlink"), "Create edge"),
116 sigc::bind( sigc::mem_fun ( *this, &MainWin::changeEditorialTool ), 2) );
117 ag->add( Gtk::RadioAction::create(tool_group, "EraseItem", Gtk::StockID("gd-delete"), "Delete"),
118 sigc::bind( sigc::mem_fun ( *this, &MainWin::changeEditorialTool ), 3) );
120 ag->add( Gtk::RadioAction::create(tool_group, "EditEdgeMap", Gtk::StockID("gd-editlink"), "Edit edge map"),
121 sigc::bind( sigc::mem_fun ( *this, &MainWin::changeEditorialTool ), 4) );
122 ag->add( Gtk::RadioAction::create(tool_group, "EditNodeMap", Gtk::StockID("gd-editnode"), "Edit node map"),
123 sigc::bind( sigc::mem_fun ( *this, &MainWin::changeEditorialTool ), 5) );
125 ag->add( Gtk::Action::create("AddMap", Gtk::StockID("gd-newmap")),
126 sigc::mem_fun ( *this , &MainWin::createNewMapWin ) );
128 uim=Gtk::UIManager::create();
129 uim->insert_action_group(ag);
130 add_accel_group(uim->get_accel_group());
135 Glib::ustring ui_info =
137 " <menubar name='MenuBar'>"
138 " <menu action='FileMenu'>"
139 " <menuitem action='FileNew'/>"
140 " <menuitem action='FileOpen'/>"
141 " <menuitem action='FileClearTab'/>"
142 " <menuitem action='FileSave'/>"
143 " <menuitem action='FileSaveAs'/>"
144 " <menuitem action='Close'/>"
145 " <menuitem action='Quit'/>"
147 " <menu action='ViewMenu'>"
148 " <menuitem action='ViewZoomIn' />"
149 " <menuitem action='ViewZoomOut' />"
150 " <menuitem action='ViewZoom100' />"
151 " <menuitem action='ViewZoomFit' />"
153 " <menu action='ShowMenu'>"
154 " <menuitem action='ShowMaps'/>"
156 " <menu action='AlgoMenu'>"
157 " <menuitem action='AlgoGeneral'/>"
158 " <menuitem action='AlgoKruskal'/>"
161 " <toolbar name='ToolBar'>"
162 " <toolitem action='FileNew' />"
163 " <toolitem action='FileOpen' />"
164 " <toolitem action='FileSave' />"
165 " <toolitem action='Close' />"
167 " <toolitem action='ViewZoomIn' />"
168 " <toolitem action='ViewZoomOut' />"
169 " <toolitem action='ViewZoom100' />"
170 " <toolitem action='ViewZoomFit' />"
172 " <toolitem action='MoveItem' />"
173 " <toolitem action='CreateNode' />"
174 " <toolitem action='CreateEdge' />"
175 " <toolitem action='EraseItem' />"
176 " <toolitem action='EditEdgeMap' />"
177 " <toolitem action='EditNodeMap' />"
179 " <toolitem action='AddMap' />"
183 uim->add_ui_from_string(ui_info);
186 catch(const Glib::Error& ex)
188 std::cerr << "building menus failed: " << ex.what();
191 Gtk::Widget* menubar = uim->get_widget("/MenuBar");
193 vbox.pack_start(*menubar, Gtk::PACK_SHRINK);
196 Gtk::Widget* toolbar = uim->get_widget("/ToolBar");
199 static_cast<Gtk::Toolbar*>(toolbar)->set_toolbar_style(Gtk::TOOLBAR_ICONS);
200 vbox.pack_start(*toolbar, Gtk::PACK_SHRINK);
203 tooltips.set_tip(*(uim->get_widget("/ToolBar/CreateNode")),"Create Node");
207 notebook.signal_switch_page().connect(sigc::mem_fun(*this, &MainWin::onChangeTab));
211 vbox.pack_start(notebook);
216 void MainWin::set_tabtitle(std::string name)
218 if(strinst.find(name)==strinst.end())
220 tabnames[active_tab]=name;
226 std::ostringstream o;
228 tabnames[active_tab]=name+" - "+o.str();
230 set_title(tabnames[active_tab] + " - " + prog_name);
231 notebook.set_tab_label_text((Widget&)*(tabs[active_tab]), tabnames[active_tab]);
235 void MainWin::readFile(const std::string & filename)
238 tabs[active_tab]->readFile(filename);
241 void MainWin::newTab()
243 int size=tabs.size();
245 tabnames.resize(size+1);
247 tabs[active_tab]=new NoteBookTab();
248 tabs[active_tab]->signal_title_ch().connect(sigc::mem_fun(*this, &MainWin::set_tabtitle));
249 tabs[active_tab]->signal_newmap_needed().connect(sigc::mem_fun(*this, &MainWin::createNewMapWinAfterSignal));
250 tabs[active_tab]->gd_canvas->changeEditorialTool(active_tool);
251 notebook.append_page((Gtk::Widget&)(*(tabs[active_tab])));
252 notebook.set_current_page(size);
253 set_tabtitle("unsaved file");
257 void MainWin::closeTab()
261 if (tabs[active_tab]->mapstorage.modified)
263 Gtk::MessageDialog mdialog("<b>Save changes before closing?</b>", true,
264 Gtk::MESSAGE_WARNING, Gtk::BUTTONS_NONE);
265 mdialog.add_button("Close file _without Saving", Gtk::RESPONSE_REJECT);
266 mdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
267 mdialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
268 switch (mdialog.run())
270 case Gtk::RESPONSE_CANCEL:
272 case Gtk::RESPONSE_REJECT:
274 case Gtk::RESPONSE_ACCEPT:
275 tabs[active_tab]->saveFile();
279 //tabs vector will be decreased with the deleted value
280 int size=tabs.size();
283 for(int i=active_tab+1;i<size;i++)
285 tabnames[i-1]=tabnames[i];
289 //if size==1 resize will delete the only element
291 tabnames.resize(size-1);
293 int old_active_tab=active_tab;
294 notebook.remove_page(active_tab);
296 //If the first tab was active, upon delete notebook
297 //will first switch one tab upper and not lower like
298 //in the case, when not the first tab was active.
299 //But after deletion it will become the first tab,
300 //and this should be registrated in tabs vector,
302 if((old_active_tab==0)&&(size!=1))
307 //if this was the last page in notebook, there is
318 void MainWin::onChangeTab(GtkNotebookPage* page, guint page_num)
322 tabs[active_tab]->gd_canvas->changeEditorialTool(active_tool);
323 set_title(tabnames[active_tab]);
326 void MainWin::newFile()
330 tabs[active_tab]->newFile();
334 void MainWin::openFile()
338 tabs[active_tab]->openFile();
342 void MainWin::saveFile()
346 tabs[active_tab]->saveFile();
350 void MainWin::saveFileAs()
354 tabs[active_tab]->saveFileAs();
358 void MainWin::close()
362 tabs[active_tab]->close();
366 void MainWin::zoomIn()
370 tabs[active_tab]->gd_canvas->zoomIn();
374 void MainWin::zoomOut()
378 tabs[active_tab]->gd_canvas->zoomOut();
382 void MainWin::zoomFit()
386 tabs[active_tab]->gd_canvas->zoomFit();
390 void MainWin::zoom100()
394 tabs[active_tab]->gd_canvas->zoom100();
398 void MainWin::createMapWin()
402 tabs[active_tab]->createMapWin(tabnames[active_tab]);
406 void MainWin::createAlgoWin(int algoid)
408 AlgoWin * aw=new AlgoWin(algoid, tabnames);
409 aw->signal_closing().connect(sigc::mem_fun(*this, &MainWin::deRegisterAlgoWin));
410 aw->signal_maplist_needed().connect(sigc::mem_fun(*this, &MainWin::updateAlgoWinMaps));
411 aw->signal_newmapwin_needed().connect(sigc::mem_fun(*this, &MainWin::createNewMapWinTabString));
416 void MainWin::updateAlgoWinTabs()
418 std::set< AlgoWin* >::iterator awsi=aws.begin();
419 for(;awsi!=aws.end();awsi++)
421 (*awsi)->update_tablist(tabnames);
425 void MainWin::updateAlgoWinMaps(AlgoWin * awp, std::string tabname)
428 for(;(i<(int)tabnames.size())&&(tabnames[i]!=tabname);i++)
431 awp->update_maplist(&(tabs[i]->mapstorage));
434 void MainWin::deRegisterAlgoWin(AlgoWin * awp)
439 void MainWin::changeEditorialTool(int tool)
444 tabs[active_tab]->gd_canvas->changeEditorialTool(tool);
448 void MainWin::createNewMapWin()
452 NewMapWin * nmw=new NewMapWin("Create New Map - "+tabnames[active_tab], *(tabs[active_tab]));
457 void MainWin::createNewMapWinTabString(std::string tabname, bool itisedge)
460 for(;((i<(int)tabnames.size())&&(tabnames[i]!=tabname));i++)
463 createNewMapWinAfterSignal(tabs[i], itisedge);
466 void MainWin::createNewMapWinAfterSignal(NoteBookTab * nbt, bool itisedge)
468 std::vector<NoteBookTab*>::iterator nbti=tabs.begin();
470 for(;nbti!=tabs.end();nbti++)
481 NewMapWin * nmw=new NewMapWin("Create New Map - "+tabnames[i], *nbt, itisedge, false);