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