gui/map_win.cc
changeset 1496 c60369a1c987
parent 1442 1e3c69aa035b
child 1512 e54392395480
equal deleted inserted replaced
2:e766abbdecf6 3:49c479dd8c9f
     1 #include <map_win.h>
     1 #include <map_win.h>
     2 #include <set>
     2 #include <set>
     3 
     3 
     4 MapWin::MapWin(const std::string& title, MapStorage & mapst, GraphDisplayerCanvas & grdispc):gdc(grdispc),ms(mapst)
     4 bool MapWin::close_if_escape_is_pressed(GdkEventKey* e)
     5 {
     5 {
       
     6   if(e->keyval==GDK_Escape)
       
     7   {
       
     8     hide();
       
     9   }
       
    10   return true;
       
    11 }
     6 
    12 
     7   //most nem kommentezem fel, mert ugyis valtozik
    13 MapWin::MapWin(const std::string& title, MapStorage & mapst, GraphDisplayerCanvas & grdispc):gdc(grdispc),ms(mapst),table(PROPERTY_NUM, 2, false)
       
    14 {
       
    15   set_title(title);
       
    16   set_default_size(200, 50);
     8 
    17 
     9   set_title(title);
    18   signal_key_press_event().connect(sigc::mem_fun(*this, &MapWin::close_if_escape_is_pressed));
    10   set_default_size(400, 200);
       
    11 
    19 
    12   rb_array=new Gtk::RadioButton * [PROPERTY_NUM];
    20   combo_array=new Gtk::Combo [PROPERTY_NUM];
    13   vbox_r1=new Gtk::VBox[PROPERTY_NUM];
    21 
    14   vbox_r2=new Gtk::VBox[PROPERTY_NUM];
       
    15   radios=new Gtk::HBox[PROPERTY_NUM];
       
    16   for(int i=0;i<PROPERTY_NUM;i++)
    22   for(int i=0;i<PROPERTY_NUM;i++)
    17   {
    23   {
    18     rb_array[i]=new Gtk::RadioButton[ms.numOfEdgeMaps()+1];
       
    19 
       
    20     Gtk::RadioButton::Group group;
       
    21 
    24 
    22     std::map< std::string,Graph::EdgeMap<double> * >::iterator emsi=ms.beginOfEdgeMaps();
    25     std::map< std::string,Graph::EdgeMap<double> * >::iterator emsi=ms.beginOfEdgeMaps();
    23     std::set<int> props;
    26     std::set<int> props;
    24 
    27 
    25     int actprop;
    28     int actprop;
       
    29 
       
    30     //here we find out, which map is the default in MapStorage for this property, which are not
    26     for(int j=0;j<ms.numOfEdgeMaps();j++)
    31     for(int j=0;j<ms.numOfEdgeMaps();j++)
    27     {
    32     {
    28 
    33       //this is the default value for this property
    29       if(emsi->second==&(ms.default_edgemaps[i]))
    34       if(emsi->second==&(ms.default_edgemaps[i]))
    30       {
    35       {
    31 	actprop=j;
    36 	actprop=j;
    32       }
    37       }
       
    38       //this is the other maps to show for this property
    33       for(int k=0;k<PROPERTY_NUM;k++)
    39       for(int k=0;k<PROPERTY_NUM;k++)
    34       {
    40       {
    35 	if(emsi->second==&(ms.default_edgemaps[k]))
    41 	if(emsi->second==&(ms.default_edgemaps[k]))
    36 	{
    42 	{
    37 	  props.insert(j);
    43 	  props.insert(j);
    38 	}
    44 	}
    39       }
    45       }
    40       emsi++;
    46       emsi++;
    41     }
    47     }
    42 
    48 
    43     rb_array[i][0].set_group(group);
    49     //combo_array[i].set_group(group);
    44     rb_array[i][0].set_label("Default");
       
    45     rb_array[i][0].signal_clicked().connect( sigc::bind( sigc::bind( sigc::mem_fun(*this, &MapWin::radio_click), 0), i) );
       
    46     vbox_r1[i].pack_start(rb_array[i][0]);
       
    47 
    50 
       
    51     //filling in combo box with choices
       
    52     std::list<Glib::ustring> listStrings;
       
    53 
       
    54     listStrings.push_back("Default");
    48 
    55 
    49     emsi=ms.beginOfEdgeMaps();
    56     emsi=ms.beginOfEdgeMaps();
    50     int actpos=1;
    57 
    51     for(int j=0;j<ms.numOfEdgeMaps();j++)
    58     for(int j=0;j<ms.numOfEdgeMaps();j++)
    52     {
    59     {
    53       if( ( props.find(j) )==( props.end() ) )
    60       if( ( props.find(j) )==( props.end() ) )
    54       {
    61       {
    55 	rb_array[i][actpos].set_group(group);
    62 	listStrings.push_back(emsi->first);
    56 	rb_array[i][actpos].set_label(emsi->first);
       
    57 	rb_array[i][actpos].signal_clicked().connect
       
    58 	  (
       
    59 	   sigc::bind( 
       
    60 	    sigc::bind(
       
    61 	     sigc::mem_fun(*this, &MapWin::radio_click),
       
    62 	     actpos
       
    63 	    ),
       
    64 	    i
       
    65 	   ) 
       
    66 	  );
       
    67 
       
    68     	if(actpos<(ms.numOfEdgeMaps()-PROPERTY_NUM+1)/2)
       
    69         {
       
    70           vbox_r1[i].pack_start(rb_array[i][actpos]);
       
    71 	}
       
    72 	else
       
    73         {
       
    74 	  vbox_r2[i].pack_start(rb_array[i][actpos]);
       
    75 	}
       
    76 	actpos++;
       
    77       }
    63       }
    78       emsi++;
    64       emsi++;
    79     }
    65     }
    80     radios[i].pack_start(vbox_r1[i]);
    66 
    81     radios[i].pack_start(vbox_r2[i]);
    67     combo_array[i].set_popdown_strings(listStrings);
    82     notebook.append_page(radios[i], property_strings[i]);
    68 
       
    69     //Restrict it to these choices only:
       
    70     combo_array[i].set_value_in_list();
       
    71 
       
    72     //binding signal to thew actual entry
       
    73     combo_array[i].get_entry()->signal_changed().connect
       
    74     (
       
    75      sigc::bind
       
    76      (
       
    77       sigc::mem_fun(*this, &MapWin::combo_changed),
       
    78       i
       
    79      )
       
    80     );
       
    81 
       
    82     //placing actual entry in the right place
       
    83 
       
    84     label=new Gtk::Label;
       
    85     label->set_text(property_strings[i]);
       
    86 
       
    87     //    labelpluscombo=new Gtk::HBox;
       
    88     //    labelpluscombo->pack_start(*label);
       
    89     //    labelpluscombo->pack_start(combo_array[i]);
       
    90         
       
    91     table.attach(*label,0,1,i,i+1,Gtk::SHRINK,Gtk::SHRINK,10,3);
       
    92     table.attach(combo_array[i],1,2,i,i+1,Gtk::SHRINK,Gtk::SHRINK,10,3);
       
    93 
       
    94     /*
       
    95     if(actpos<(ms.numOfEdgeMaps()-PROPERTY_NUM+1)/2)
       
    96     {
       
    97       vbox_r1.pack_start(*labelpluscombo);
       
    98     }
       
    99     else
       
   100     {
       
   101       vbox_r2.pack_start(*labelpluscombo);
       
   102     }
       
   103     actpos++;
       
   104     //*/
       
   105 
    83   }
   106   }
    84 
   107 
    85   add(vbox_b);
   108   combos.pack_start(vbox_r1);
    86   vbox_b.pack_start(notebook);
   109   combos.pack_start(vbox_r2);
       
   110 
       
   111   //add(combos);
       
   112   add(table);
    87 
   113 
    88   show_all_children();
   114   show_all_children();
    89 
   115 
    90 }
   116 }
    91 
   117 
    92 void MapWin::radio_click(int prop, int actpos)
   118 void MapWin::combo_changed(int prop)
    93 {
   119 {
    94 
   120 
    95   //most nem kommentezem fel, mert ugyis valtozik
   121   //most nem kommentezem fel, mert ugyis valtozik
       
   122   Gtk::Entry* entry = combo_array[prop].get_entry();
    96 
   123 
    97   if(rb_array[prop][actpos].get_active())
   124   if(entry)
    98   {
   125   {
       
   126     Glib::ustring mapname = entry->get_text();
       
   127     if(!(mapname.empty())) //We seem to get 2 signals, one when the text is empty.
       
   128     {
       
   129       if(mapname=="Default")
       
   130       {
       
   131 	mapname=property_strings[prop];
       
   132       }
    99 
   133 
   100     std::string mapname=rb_array[prop][actpos].get_label();
   134       if( (ms.edgemap_storage).find(mapname) != (ms.edgemap_storage).end() )
   101 
   135       {
   102     if(mapname=="Default")
   136 	switch(prop)
   103     {
   137 	{
   104       mapname=property_strings[prop];
   138           case WIDTH:
   105     }
   139 	    gdc.changeLineWidth(mapname);
   106 
   140 	    break;
   107     switch(prop)
   141           case COLOR:
   108     {
   142 	    gdc.changeColor(mapname);
   109       case WIDTH:
   143 	    break;
   110         gdc.changeLineWidth(mapname);
   144           case TEXT:
   111         break;
   145 	    gdc.changeText(mapname);
   112       case COLOR:
   146 	    break;
   113         gdc.changeColor(mapname);
   147           default:
   114         break;
   148 	    std::cout<<"Error\n";
   115       case TEXT:
   149 	}
   116         gdc.changeText(mapname);
   150       }
   117         break;
       
   118       default:
       
   119         std::cout<<"Error\n";
       
   120     }
   151     }
   121   }
   152   }
   122 };
   153 };