mw-mapselector.cc
author hegyi
Mon, 21 Nov 2005 18:03:20 +0000
branchgui
changeset 90 e9f8f44f12a3
parent 89 4042761b21e3
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.
hegyi@89
     1
#include "map_win.h"
hegyi@81
     2
hegyi@90
     3
MapWin::MapSelector::MapSelector(GraphDisplayerCanvas & grdispc, MapStorage & mapst, int identifier, bool edge):gdc(grdispc),ms(mapst),id(identifier),itisedge(edge),default_state(true),set_new_map(false),node_to_update(INVALID),edge_to_update(INVALID)
hegyi@81
     4
{
hegyi@81
     5
  update_list();
hegyi@81
     6
hegyi@81
     7
  cbt.set_active(0);
hegyi@81
     8
hegyi@81
     9
  //binding signal to the actual entry
hegyi@81
    10
  cbt.signal_changed().connect
hegyi@81
    11
    (
hegyi@89
    12
     sigc::mem_fun((*this), &MapWin::MapSelector::comboChanged),
hegyi@81
    13
     false
hegyi@81
    14
     );
hegyi@81
    15
  
hegyi@81
    16
  if(itisedge)
hegyi@81
    17
    {
hegyi@81
    18
      label=new Gtk::Label(edge_property_strings[id]);
hegyi@81
    19
    }
hegyi@81
    20
  else
hegyi@81
    21
    {
hegyi@81
    22
      label=new Gtk::Label(node_property_strings[id]);
hegyi@81
    23
    }
hegyi@81
    24
hegyi@81
    25
  label->set_width_chars(longest_property_string_length);
hegyi@81
    26
hegyi@81
    27
  defbut=new Gtk::Button();
hegyi@81
    28
  defbut->set_label("Reset");
hegyi@81
    29
hegyi@81
    30
  defbut->signal_pressed().connect
hegyi@81
    31
    (
hegyi@89
    32
     sigc::mem_fun(*this, &MapWin::MapSelector::reset)
hegyi@81
    33
     );
hegyi@81
    34
hegyi@81
    35
  newbut=new Gtk::Button(Gtk::Stock::NEW);
hegyi@81
    36
hegyi@82
    37
  newbut->signal_pressed().connect
hegyi@82
    38
    (
hegyi@89
    39
     sigc::mem_fun(*this, &MapWin::MapSelector::new_but_pressed)
hegyi@82
    40
     );
hegyi@82
    41
hegyi@81
    42
  add(*label);
hegyi@81
    43
hegyi@81
    44
  add(cbt);
hegyi@81
    45
hegyi@81
    46
  add(*defbut);
hegyi@81
    47
  add(*newbut);
hegyi@81
    48
}
hegyi@81
    49
hegyi@89
    50
void MapWin::MapSelector::new_but_pressed()
hegyi@85
    51
{
hegyi@85
    52
  set_new_map=true;
hegyi@90
    53
  (new NewMapWin("NewMapWin", gdc, itisedge, false))->run();
hegyi@85
    54
}
hegyi@85
    55
hegyi@89
    56
void MapWin::MapSelector::update_list()
hegyi@81
    57
{
hegyi@81
    58
  cbt.clear();
hegyi@81
    59
  if(itisedge)
hegyi@81
    60
    {
hegyi@81
    61
      std::map< std::string,Graph::EdgeMap<double> * >::iterator emsi=ms.beginOfEdgeMaps();
hegyi@81
    62
      for(;emsi!=ms.endOfEdgeMaps();emsi++)
hegyi@81
    63
	{
hegyi@81
    64
	  cbt.append_text(emsi->first);
hegyi@81
    65
	}
hegyi@81
    66
    }
hegyi@81
    67
  else
hegyi@81
    68
    {
hegyi@81
    69
      std::map< std::string,Graph::NodeMap<double> * >::iterator emsi=ms.beginOfNodeMaps();
hegyi@81
    70
      for(;emsi!=ms.endOfNodeMaps();emsi++)
hegyi@81
    71
	{
hegyi@81
    72
	  cbt.append_text(emsi->first);
hegyi@81
    73
	}
hegyi@81
    74
    }
hegyi@81
    75
  cbt.prepend_text("Default values");
hegyi@81
    76
}
hegyi@81
    77
hegyi@89
    78
void MapWin::MapSelector::comboChanged()
hegyi@81
    79
{
hegyi@81
    80
  if(cbt.get_active_row_number()!=0)
hegyi@81
    81
    {
hegyi@81
    82
      default_state=false;
hegyi@81
    83
      Glib::ustring mapname = cbt.get_active_text();
hegyi@81
    84
      if(!(mapname.empty())) //We seem to get 2 signals, one when the text is empty.
hegyi@81
    85
	{
hegyi@81
    86
	  if(itisedge)
hegyi@81
    87
	    {
hegyi@81
    88
	      if( ( (ms.edgemap_storage).find(mapname) != (ms.edgemap_storage).end() ) )
hegyi@81
    89
		{
hegyi@81
    90
		  Edge edge=edge_to_update;
hegyi@81
    91
		  switch(id)
hegyi@81
    92
		    {
hegyi@81
    93
		    case E_WIDTH:
hegyi@81
    94
		      gdc.changeEdgeWidth(mapname, edge);
hegyi@81
    95
		      break;
hegyi@81
    96
		    case E_COLOR:
hegyi@81
    97
		      gdc.changeEdgeColor(mapname, edge);
hegyi@81
    98
		      break;
hegyi@81
    99
		    case E_TEXT:
hegyi@81
   100
		      gdc.changeEdgeText(mapname, edge);
hegyi@81
   101
		      break;
hegyi@81
   102
		    default:
hegyi@81
   103
		      std::cerr<<"Error\n";
hegyi@81
   104
		    }
hegyi@81
   105
		}
hegyi@81
   106
	    }
hegyi@81
   107
	  else
hegyi@81
   108
	    {
hegyi@81
   109
	      if( ( (ms.nodemap_storage).find(mapname) != (ms.nodemap_storage).end() ) )
hegyi@81
   110
		{
hegyi@81
   111
		  Node node=node_to_update;
hegyi@81
   112
		  switch(id)
hegyi@81
   113
		    {
hegyi@81
   114
		    case N_RADIUS:
hegyi@81
   115
		      gdc.changeNodeRadius(mapname, node);
hegyi@81
   116
		      break;
hegyi@81
   117
		    case N_COLOR:
hegyi@81
   118
		      gdc.changeNodeColor(mapname, node);
hegyi@81
   119
		      break;
hegyi@81
   120
		    case N_TEXT:
hegyi@81
   121
		      gdc.changeNodeText(mapname, node);
hegyi@81
   122
		      break;
hegyi@81
   123
		    default:
hegyi@81
   124
		      std::cerr<<"Error\n";
hegyi@81
   125
		    }
hegyi@81
   126
		}
hegyi@81
   127
	    }
hegyi@81
   128
	}
hegyi@81
   129
    }
hegyi@81
   130
  else if((!default_state)&&(cbt.get_active_row_number()==0))
hegyi@81
   131
    {
hegyi@81
   132
      reset();
hegyi@81
   133
    }
hegyi@81
   134
}
hegyi@81
   135
hegyi@89
   136
void MapWin::MapSelector::reset()
hegyi@81
   137
{
hegyi@81
   138
  default_state=true;
hegyi@81
   139
  cbt.set_active(0);
hegyi@81
   140
hegyi@81
   141
  if(itisedge)
hegyi@81
   142
    {
hegyi@81
   143
      Edge edge=edge_to_update;
hegyi@81
   144
      switch(id)
hegyi@81
   145
	{
hegyi@81
   146
	case E_WIDTH:
hegyi@81
   147
	  gdc.resetEdgeWidth(edge);
hegyi@81
   148
	  break;
hegyi@81
   149
	case E_COLOR:
hegyi@81
   150
	  gdc.resetEdgeColor(edge);
hegyi@81
   151
	  break;
hegyi@81
   152
	case E_TEXT:
hegyi@81
   153
	  gdc.resetEdgeText(edge);
hegyi@81
   154
	  break;
hegyi@81
   155
	default:
hegyi@81
   156
	  std::cerr<<"Error\n";
hegyi@81
   157
	}
hegyi@81
   158
    }
hegyi@81
   159
  else
hegyi@81
   160
    {
hegyi@81
   161
      Node node=node_to_update;	
hegyi@81
   162
      switch(id)
hegyi@81
   163
	{
hegyi@81
   164
	case N_RADIUS:
hegyi@81
   165
	  gdc.resetNodeRadius(node);
hegyi@81
   166
	  break;
hegyi@81
   167
	case N_COLOR:
hegyi@81
   168
	  gdc.resetNodeColor(node);
hegyi@81
   169
	  break;
hegyi@81
   170
	case N_TEXT:
hegyi@81
   171
	  gdc.resetNodeText(node);
hegyi@81
   172
	  break;
hegyi@81
   173
	default:
hegyi@81
   174
	  std::cerr<<"Error\n";
hegyi@81
   175
	}
hegyi@81
   176
    }
hegyi@81
   177
}
hegyi@81
   178
hegyi@89
   179
void MapWin::MapSelector::update(Node node)
hegyi@81
   180
{
hegyi@81
   181
  node_to_update=node;
hegyi@81
   182
  if(default_state)
hegyi@81
   183
    {
hegyi@81
   184
      reset();
hegyi@81
   185
    }
hegyi@81
   186
  else
hegyi@81
   187
    {
hegyi@81
   188
      comboChanged();
hegyi@81
   189
    }
hegyi@81
   190
  node_to_update=INVALID;
hegyi@81
   191
}
hegyi@81
   192
hegyi@89
   193
void MapWin::MapSelector::update(Edge edge)
hegyi@81
   194
{
hegyi@81
   195
  edge_to_update=edge;
hegyi@81
   196
  if(default_state)
hegyi@81
   197
    {
hegyi@81
   198
      reset();
hegyi@81
   199
    }
hegyi@81
   200
  else
hegyi@81
   201
    {
hegyi@81
   202
      comboChanged();
hegyi@81
   203
    }
hegyi@81
   204
  edge_to_update=INVALID;
hegyi@81
   205
}
hegyi@81
   206
hegyi@89
   207
Glib::ustring MapWin::MapSelector::get_active_text()
hegyi@81
   208
{
hegyi@81
   209
  return cbt.get_active_text();
hegyi@81
   210
}
hegyi@81
   211
hegyi@89
   212
void MapWin::MapSelector::set_active_text(Glib::ustring text)
hegyi@81
   213
{
hegyi@81
   214
  cbt.set_active_text(text);
hegyi@81
   215
}
hegyi@81
   216
hegyi@89
   217
void MapWin::MapSelector::append_text(Glib::ustring text)
hegyi@81
   218
{
hegyi@81
   219
  cbt.append_text(text);
hegyi@85
   220
  if(set_new_map)
hegyi@85
   221
    {
hegyi@85
   222
      set_active_text(text);
hegyi@85
   223
      set_new_map=false;
hegyi@85
   224
    }
hegyi@81
   225
}