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.
2 #include "icons/guipixbufs.h"
5 mapwin("Map Setup", mapstorage, gd_canvas),
6 gd_canvas(mapstorage, mapwin, (Gtk::Window *)this)
8 set_title ("unsaved file - " + prog_name);
9 set_default_size(WIN_WIDTH,WIN_HEIGHT);
13 // custom icons for the toolbar
15 Glib::RefPtr<Gtk::IconFactory> p_icon_factory = Gtk::IconFactory::create();
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);
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);
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);
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);
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);
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);
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);
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);
74 p_icon_factory->add_default();
77 ag=Gtk::ActionGroup::create();
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));
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));
103 ag->add( Gtk::Action::create("ShowMenu", "_Show") );
104 ag->add( Gtk::Action::create("ShowMaps", "_Maps"),
105 sigc::mem_fun(this->mapwin, &MapWin::show));
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) );
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) );
122 ag->add( Gtk::Action::create("AddMap", Gtk::StockID("gd-newmap")),
123 sigc::mem_fun (new NewMapWin("NewMapWin", gd_canvas), &NewMapWin::show ) );
125 uim=Gtk::UIManager::create();
126 uim->insert_action_group(ag);
127 add_accel_group(uim->get_accel_group());
132 Glib::ustring ui_info =
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'/>"
143 " <menu action='ViewMenu'>"
144 " <menuitem action='ViewZoomIn' />"
145 " <menuitem action='ViewZoomOut' />"
146 " <menuitem action='ViewZoom100' />"
147 " <menuitem action='ViewZoomFit' />"
149 " <menu action='ShowMenu'>"
150 " <menuitem action='ShowMaps'/>"
153 " <toolbar name='ToolBar'>"
154 " <toolitem action='FileNew' />"
155 " <toolitem action='FileOpen' />"
156 " <toolitem action='FileSave' />"
157 " <toolitem action='Close' />"
159 " <toolitem action='ViewZoomIn' />"
160 " <toolitem action='ViewZoomOut' />"
161 " <toolitem action='ViewZoom100' />"
162 " <toolitem action='ViewZoomFit' />"
164 " <toolitem action='MoveItem' />"
165 " <toolitem action='CreateNode' />"
166 " <toolitem action='CreateEdge' />"
167 " <toolitem action='EraseItem' />"
168 " <toolitem action='EditEdgeMap' />"
169 " <toolitem action='EditNodeMap' />"
171 " <toolitem action='AddMap' />"
175 uim->add_ui_from_string(ui_info);
178 catch(const Glib::Error& ex)
180 std::cerr << "building menus failed: " << ex.what();
183 Gtk::Widget* menubar = uim->get_widget("/MenuBar");
185 vbox.pack_start(*menubar, Gtk::PACK_SHRINK);
188 Gtk::Widget* toolbar = uim->get_widget("/ToolBar");
191 static_cast<Gtk::Toolbar*>(toolbar)->set_toolbar_style(Gtk::TOOLBAR_ICONS);
192 vbox.pack_start(*toolbar, Gtk::PACK_SHRINK);
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);
200 tooltips.set_tip(*(uim->get_widget("/ToolBar/CreateNode")),"Create Node");
206 void MainWin::readFile(const std::string &file)
208 mapstorage.readFromFile(file);
209 mapstorage.file_name = file;
210 mapstorage.modified = false;
211 gd_canvas.drawGraph();
213 set_title(Glib::filename_display_basename(file) + " - " + prog_name);
216 void MainWin::newFile()
218 if (mapstorage.modified)
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())
227 case Gtk::RESPONSE_CANCEL:
229 case Gtk::RESPONSE_REJECT:
231 case Gtk::RESPONSE_ACCEPT:
239 set_title("unsaved file - " + prog_name);
242 void MainWin::openFile()
244 if (mapstorage.modified)
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())
253 case Gtk::RESPONSE_CANCEL:
255 case Gtk::RESPONSE_REJECT:
257 case Gtk::RESPONSE_ACCEPT:
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)
269 Glib::ustring filename = fcdialog.get_filename();
270 if (!mapstorage.readFromFile(filename))
272 mapstorage.file_name = filename;
273 mapstorage.modified = false;
274 gd_canvas.drawGraph();
276 set_title(Glib::filename_display_basename(filename) + " - " + prog_name);
281 void MainWin::saveFile()
283 if (mapstorage.file_name == "") {
288 mapstorage.writeToFile(mapstorage.file_name);
289 mapstorage.modified = false;
290 set_title(Glib::filename_display_basename(mapstorage.file_name) + " - " +
295 void MainWin::saveFileAs()
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)
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);
310 void MainWin::close()
312 if (mapstorage.modified)
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())
321 case Gtk::RESPONSE_CANCEL:
323 case Gtk::RESPONSE_REJECT:
325 case Gtk::RESPONSE_ACCEPT:
333 set_title("unsaved file - " + prog_name);