COIN-OR::LEMON - Graph Library

source: lemon-0.x/gui/main_win.cc @ 1823:cb082cdf3667

Last change on this file since 1823:cb082cdf3667 was 1823:cb082cdf3667, checked in by Hegyi Péter, 14 years ago

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.

File size: 11.7 KB
Line 
1#include "main_win.h"
2#include "icons/guipixbufs.h"
3
4MainWin::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
206void 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
216void 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
242void 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
281void 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
295void 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
310void 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}
Note: See TracBrowser for help on using the repository browser.