map_win.cc
author hegyi
Sun, 07 Aug 2005 14:17:11 +0000
branchgui
changeset 55 e4ee805ca5fc
parent 48 b8ec84524fa2
child 62 80eefca04b1e
permissions -rw-r--r--
Alpar had the key, focus can be set in the window class. But it is not enough, the focused widget has to be activated, as well! Was a hard task to find out... By the way, two compilation warnings are removed.
ladanyi@53
     1
#include "map_win.h"
ladanyi@6
     2
#include <set>
ladanyi@6
     3
hegyi@30
     4
bool MapWin::closeIfEscapeIsPressed(GdkEventKey* e)
ladanyi@6
     5
{
hegyi@8
     6
  if(e->keyval==GDK_Escape)
hegyi@8
     7
  {
hegyi@8
     8
    hide();
hegyi@8
     9
  }
hegyi@8
    10
  return true;
hegyi@8
    11
}
ladanyi@6
    12
hegyi@28
    13
MapWin::MapWin(const std::string& title, MapStorage & mapst, GraphDisplayerCanvas & grdispc):gdc(grdispc),ms(mapst)
hegyi@8
    14
{
hegyi@8
    15
  set_title(title);
hegyi@8
    16
  set_default_size(200, 50);
ladanyi@6
    17
hegyi@30
    18
  signal_key_press_event().connect(sigc::mem_fun(*this, &MapWin::closeIfEscapeIsPressed));
ladanyi@6
    19
hegyi@28
    20
  e_combo_array=new Gtk::Combo [EDGE_PROPERTY_NUM];
hegyi@8
    21
hegyi@28
    22
  table=new Gtk::Table(EDGE_PROPERTY_NUM, 2, false);
hegyi@28
    23
hegyi@28
    24
  for(int i=0;i<EDGE_PROPERTY_NUM;i++)
ladanyi@6
    25
  {
hegyi@8
    26
    //filling in combo box with choices
hegyi@8
    27
    std::list<Glib::ustring> listStrings;
hegyi@8
    28
hegyi@8
    29
    listStrings.push_back("Default");
ladanyi@6
    30
hegyi@31
    31
    std::map< std::string,Graph::EdgeMap<double> * >::iterator emsi=ms.beginOfEdgeMaps();
hegyi@31
    32
    for(;emsi!=ms.endOfEdgeMaps();emsi++)
ladanyi@6
    33
    {
hegyi@8
    34
	listStrings.push_back(emsi->first);
ladanyi@6
    35
    }
hegyi@8
    36
hegyi@28
    37
    e_combo_array[i].set_popdown_strings(listStrings);
hegyi@8
    38
hegyi@8
    39
    //Restrict it to these choices only:
hegyi@28
    40
    e_combo_array[i].set_value_in_list();
hegyi@8
    41
hegyi@28
    42
    //binding signal to the actual entry
hegyi@28
    43
    e_combo_array[i].get_entry()->signal_changed().connect
hegyi@8
    44
    (
hegyi@8
    45
     sigc::bind
hegyi@8
    46
     (
hegyi@30
    47
      sigc::mem_fun(*this, &MapWin::eComboChanged),
hegyi@8
    48
      i
hegyi@8
    49
     )
hegyi@8
    50
    );
hegyi@8
    51
hegyi@8
    52
    //placing actual entry in the right place
hegyi@8
    53
hegyi@8
    54
    label=new Gtk::Label;
hegyi@28
    55
    label->set_text(edge_property_strings[i]);
hegyi@28
    56
        
hegyi@28
    57
    (*table).attach(*label,0,1,i,i+1,Gtk::SHRINK,Gtk::SHRINK,10,3);
hegyi@28
    58
    (*table).attach(e_combo_array[i],1,2,i,i+1,Gtk::SHRINK,Gtk::SHRINK,10,3);
hegyi@8
    59
hegyi@8
    60
ladanyi@6
    61
  }
ladanyi@6
    62
hegyi@28
    63
  vbox.pack_start(*(new Gtk::Label("Edge properties")));
hegyi@8
    64
hegyi@28
    65
  vbox.pack_start(*table);
hegyi@28
    66
hegyi@28
    67
  vbox.pack_start(*(new Gtk::HSeparator));
hegyi@28
    68
hegyi@28
    69
  n_combo_array=new Gtk::Combo [NODE_PROPERTY_NUM];
hegyi@28
    70
hegyi@28
    71
  table=new Gtk::Table(NODE_PROPERTY_NUM, 2, false);
hegyi@28
    72
hegyi@28
    73
  for(int i=0;i<NODE_PROPERTY_NUM;i++)
hegyi@28
    74
  {
hegyi@28
    75
    //filling in combo box with choices
hegyi@28
    76
    std::list<Glib::ustring> listStrings;
hegyi@28
    77
hegyi@28
    78
    listStrings.push_back("Default");
hegyi@28
    79
hegyi@31
    80
    std::map< std::string,Graph::NodeMap<double> * >::iterator emsi=ms.beginOfNodeMaps();
hegyi@28
    81
hegyi@31
    82
    for(;emsi!=ms.endOfNodeMaps();emsi++)
hegyi@28
    83
    {
hegyi@31
    84
      listStrings.push_back(emsi->first);
hegyi@28
    85
    }
hegyi@28
    86
hegyi@28
    87
    n_combo_array[i].set_popdown_strings(listStrings);
hegyi@28
    88
hegyi@28
    89
    //Restrict it to these choices only:
hegyi@28
    90
    n_combo_array[i].set_value_in_list();
hegyi@28
    91
hegyi@28
    92
    //binding signal to thew actual entry
hegyi@28
    93
    n_combo_array[i].get_entry()->signal_changed().connect
hegyi@28
    94
    (
hegyi@28
    95
     sigc::bind
hegyi@28
    96
     (
hegyi@30
    97
      sigc::mem_fun(*this, &MapWin::nComboChanged),
hegyi@28
    98
      i
hegyi@28
    99
     )
hegyi@28
   100
    );
hegyi@28
   101
hegyi@28
   102
    //placing actual entry in the right place
hegyi@28
   103
hegyi@28
   104
    label=new Gtk::Label;
hegyi@28
   105
    label->set_text(node_property_strings[i]);
hegyi@28
   106
        
hegyi@28
   107
    (*table).attach(*label,0,1,i,i+1,Gtk::SHRINK,Gtk::SHRINK,10,3);
hegyi@28
   108
    (*table).attach(n_combo_array[i],1,2,i,i+1,Gtk::SHRINK,Gtk::SHRINK,10,3);
hegyi@28
   109
hegyi@28
   110
hegyi@28
   111
  }
hegyi@28
   112
hegyi@28
   113
  add(vbox);
hegyi@28
   114
hegyi@28
   115
  vbox.pack_start(*(new Gtk::Label("Node properties")));
hegyi@28
   116
hegyi@28
   117
  vbox.pack_start(*table);
ladanyi@6
   118
ladanyi@6
   119
  show_all_children();
ladanyi@6
   120
ladanyi@6
   121
}
ladanyi@6
   122
ladanyi@53
   123
void MapWin::update()
ladanyi@53
   124
{
ladanyi@53
   125
  for(int i=0;i<EDGE_PROPERTY_NUM;i++)
ladanyi@53
   126
  {
ladanyi@53
   127
    //filling in combo box with choices
ladanyi@53
   128
    std::list<Glib::ustring> listStrings;
ladanyi@53
   129
ladanyi@53
   130
    listStrings.push_back("Default");
ladanyi@53
   131
ladanyi@53
   132
    std::map< std::string,Graph::EdgeMap<double> * >::iterator emsi=ms.beginOfEdgeMaps();
ladanyi@53
   133
    for(;emsi!=ms.endOfEdgeMaps();emsi++)
ladanyi@53
   134
    {
ladanyi@53
   135
      listStrings.push_back(emsi->first);
ladanyi@53
   136
    }
ladanyi@53
   137
ladanyi@53
   138
    e_combo_array[i].set_popdown_strings(listStrings);
ladanyi@53
   139
  }
ladanyi@53
   140
  for(int i=0;i<NODE_PROPERTY_NUM;i++)
ladanyi@53
   141
  {
ladanyi@53
   142
    //filling in combo box with choices
ladanyi@53
   143
    std::list<Glib::ustring> listStrings;
ladanyi@53
   144
ladanyi@53
   145
    listStrings.push_back("Default");
ladanyi@53
   146
ladanyi@53
   147
    std::map< std::string,Graph::NodeMap<double> * >::iterator emsi=ms.beginOfNodeMaps();
ladanyi@53
   148
ladanyi@53
   149
    for(;emsi!=ms.endOfNodeMaps();emsi++)
ladanyi@53
   150
    {
ladanyi@53
   151
      listStrings.push_back(emsi->first);
ladanyi@53
   152
    }
ladanyi@53
   153
ladanyi@53
   154
    n_combo_array[i].set_popdown_strings(listStrings);
ladanyi@53
   155
  }
ladanyi@53
   156
}
ladanyi@53
   157
hegyi@30
   158
void MapWin::eComboChanged(int prop)
ladanyi@6
   159
{
hegyi@40
   160
hegyi@28
   161
  Gtk::Entry* entry = e_combo_array[prop].get_entry();
ladanyi@6
   162
hegyi@8
   163
  if(entry)
ladanyi@6
   164
  {
hegyi@8
   165
    Glib::ustring mapname = entry->get_text();
hegyi@8
   166
    if(!(mapname.empty())) //We seem to get 2 signals, one when the text is empty.
hegyi@8
   167
    {
hegyi@31
   168
      if( ( (ms.edgemap_storage).find(mapname) != (ms.edgemap_storage).end() ) || (mapname=="Default") )
hegyi@8
   169
      {
hegyi@8
   170
	switch(prop)
hegyi@8
   171
	{
hegyi@28
   172
          case E_WIDTH:
hegyi@28
   173
	    gdc.changeEdgeWidth(mapname);
hegyi@8
   174
	    break;
hegyi@28
   175
          case E_COLOR:
hegyi@28
   176
	    gdc.changeEdgeColor(mapname);
hegyi@8
   177
	    break;
hegyi@28
   178
          case E_TEXT:
hegyi@28
   179
	    gdc.changeEdgeText(mapname);
hegyi@8
   180
	    break;
hegyi@8
   181
          default:
hegyi@48
   182
	    std::cerr<<"Error\n";
hegyi@8
   183
	}
hegyi@8
   184
      }
ladanyi@6
   185
    }
ladanyi@6
   186
  }
ladanyi@6
   187
};
hegyi@28
   188
hegyi@30
   189
void MapWin::nComboChanged(int prop)
hegyi@28
   190
{
hegyi@28
   191
hegyi@28
   192
  Gtk::Entry* entry = n_combo_array[prop].get_entry();
hegyi@28
   193
hegyi@28
   194
  if(entry)
hegyi@28
   195
  {
hegyi@28
   196
    Glib::ustring mapname = entry->get_text();
hegyi@28
   197
    if(!(mapname.empty())) //We seem to get 2 signals, one when the text is empty.
hegyi@28
   198
    {
hegyi@31
   199
      if( ( (ms.nodemap_storage).find(mapname) != (ms.nodemap_storage).end() ) || (mapname=="Default") )
hegyi@28
   200
      {
hegyi@28
   201
	switch(prop)
hegyi@28
   202
	{
hegyi@28
   203
          case N_RADIUS:
hegyi@28
   204
	    gdc.changeNodeRadius(mapname);
hegyi@28
   205
	    break;
hegyi@28
   206
          case N_COLOR:
hegyi@28
   207
	    gdc.changeNodeColor(mapname);
hegyi@28
   208
	    break;
hegyi@28
   209
          case N_TEXT:
hegyi@28
   210
	    gdc.changeNodeText(mapname);
hegyi@28
   211
	    break;
hegyi@28
   212
          default:
hegyi@48
   213
	    std::cerr<<"Error\n";
hegyi@28
   214
	}
hegyi@28
   215
      }
hegyi@28
   216
    }
hegyi@28
   217
  }
hegyi@28
   218
};
hegyi@28
   219
hegyi@30
   220
void MapWin::updateNode(Graph::Node node)
hegyi@28
   221
{
hegyi@28
   222
  for(int i=0;i<NODE_PROPERTY_NUM;i++)
hegyi@28
   223
    {
hegyi@28
   224
      Gtk::Entry* entry = n_combo_array[i].get_entry();
hegyi@28
   225
hegyi@28
   226
      if(entry)
hegyi@28
   227
	{
hegyi@28
   228
	  Glib::ustring mapname = entry->get_text();
hegyi@28
   229
	  if(!(mapname.empty())) //We seem to get 2 signals, one when the text is empty.
hegyi@28
   230
	    {
hegyi@31
   231
	      if( ( (ms.nodemap_storage).find(mapname) != (ms.nodemap_storage).end() ) || (mapname=="Default") )
hegyi@28
   232
		{
hegyi@28
   233
		  switch(i)
hegyi@28
   234
		    {
hegyi@28
   235
		    case N_RADIUS:
hegyi@31
   236
		      gdc.changeNodeRadius(mapname, node);
hegyi@28
   237
		      break;
hegyi@28
   238
		    case N_COLOR:
hegyi@28
   239
		      gdc.changeNodeColor(mapname, node);
hegyi@28
   240
		      break;
hegyi@28
   241
		    case N_TEXT:
hegyi@28
   242
		      gdc.changeNodeText(mapname, node);
hegyi@28
   243
		      break;
hegyi@28
   244
		    default:
hegyi@48
   245
		      std::cerr<<"Error\n";
hegyi@28
   246
		    }
hegyi@28
   247
		}
hegyi@28
   248
	    }
hegyi@28
   249
	}
hegyi@28
   250
    }
hegyi@28
   251
}
hegyi@28
   252
hegyi@30
   253
void MapWin::updateEdge(Graph::Edge edge)
hegyi@28
   254
{
hegyi@28
   255
  for(int i=0;i<EDGE_PROPERTY_NUM;i++)
hegyi@28
   256
    {
hegyi@28
   257
hegyi@28
   258
      Gtk::Entry* entry = e_combo_array[i].get_entry();
hegyi@28
   259
hegyi@28
   260
      if(entry)
hegyi@28
   261
	{
hegyi@28
   262
	  Glib::ustring mapname = entry->get_text();
hegyi@28
   263
	  if(!(mapname.empty())) //We seem to get 2 signals, one when the text is empty.
hegyi@28
   264
	    {
hegyi@28
   265
hegyi@31
   266
	      if( ( (ms.edgemap_storage).find(mapname) != (ms.edgemap_storage).end() ) || (mapname=="Default") )
hegyi@28
   267
		{
hegyi@28
   268
		  switch(i)
hegyi@28
   269
		    {
hegyi@28
   270
		    case E_WIDTH:
hegyi@31
   271
		      gdc.changeEdgeWidth(mapname, edge);
hegyi@28
   272
		      break;
hegyi@28
   273
		    case E_COLOR:
hegyi@28
   274
		      gdc.changeEdgeColor(mapname, edge);
hegyi@28
   275
		      break;
hegyi@28
   276
		    case E_TEXT:
hegyi@28
   277
		      gdc.changeEdgeText(mapname, edge);
hegyi@28
   278
		      break;
hegyi@28
   279
		    default:
hegyi@48
   280
		      std::cerr<<"Error\n";
hegyi@28
   281
		    }
hegyi@28
   282
		}
hegyi@28
   283
	    }
hegyi@28
   284
	}
hegyi@28
   285
    }
hegyi@28
   286
}
hegyi@38
   287
hegyi@40
   288
void MapWin::registerNewEdgeMap(std::string newmapname)
hegyi@38
   289
{
hegyi@40
   290
  for(int i=0;i<EDGE_PROPERTY_NUM;i++)
hegyi@40
   291
  {
hegyi@40
   292
    //filling in combo box with choices
hegyi@40
   293
    std::list<Glib::ustring> listStrings=e_combo_array[i].get_popdown_strings();
hegyi@40
   294
    listStrings.push_back(newmapname);
hegyi@40
   295
    e_combo_array[i].set_popdown_strings(listStrings);
hegyi@40
   296
  }
hegyi@43
   297
  //setting text property for the new map
hegyi@40
   298
  Gtk::Entry* entry = e_combo_array[E_TEXT].get_entry();
hegyi@40
   299
  entry->set_text((Glib::ustring)newmapname);
hegyi@38
   300
}
hegyi@38
   301
hegyi@40
   302
void MapWin::registerNewNodeMap(std::string newmapname)
hegyi@38
   303
{
hegyi@41
   304
  for(int i=0;i<NODE_PROPERTY_NUM;i++)
hegyi@40
   305
  {
hegyi@40
   306
    //filling in combo box with choices
hegyi@40
   307
    std::list<Glib::ustring> listStrings=n_combo_array[i].get_popdown_strings();
hegyi@40
   308
    listStrings.push_back(newmapname);
hegyi@40
   309
    n_combo_array[i].set_popdown_strings(listStrings);
hegyi@40
   310
  }
hegyi@43
   311
  //setting text property for the new map
hegyi@41
   312
  Gtk::Entry* entry = n_combo_array[N_TEXT].get_entry();
hegyi@41
   313
  entry->set_text((Glib::ustring)newmapname);
hegyi@38
   314
}