algobox.cc
changeset 3 2cc5ed6e6255
equal deleted inserted replaced
-1:000000000000 0:aefb993678a3
       
     1 /* -*- C++ -*-
       
     2  *
       
     3  * This file is a part of LEMON, a generic C++ optimization library
       
     4  *
       
     5  * Copyright (C) 2003-2006
       
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
       
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
       
     8  *
       
     9  * Permission to use, modify and distribute this software is granted
       
    10  * provided that this copyright notice appears in all copies. For
       
    11  * precise terms see the accompanying LICENSE file.
       
    12  *
       
    13  * This software is provided "AS IS" with no warranty of any kind,
       
    14  * express or implied, and with no claim as to its suitability for any
       
    15  * purpose.
       
    16  *
       
    17  */
       
    18 
       
    19 #include <algobox.h>
       
    20 #include <mapstorage.h>
       
    21 #include <mapselector.h>
       
    22 
       
    23 enum {N_DEMO1, N_DEMO2, NODE_INPUT_NUM}; // input IDs for nodes;
       
    24 enum {E_DEMO1, EDGE_INPUT_NUM}; // input IDs for arcs;
       
    25 
       
    26 AlgoBox::AlgoBox(std::vector<std::string> tabnames)
       
    27 {
       
    28   init(tabnames);
       
    29 }
       
    30 
       
    31 void AlgoBox::init(std::vector<std::string> tabnames)
       
    32 {
       
    33   set_spacing(5);
       
    34 
       
    35   update_tablist(tabnames);
       
    36 
       
    37   //if active tab is changed, the map names in cbt/s have to be updated
       
    38   tabcbt.signal_changed().connect(sigc::mem_fun(*this, &AlgoBox::emit_tab_change));
       
    39 
       
    40   pack_start(tabcbt);
       
    41   build_box();
       
    42 
       
    43   show_all_children();
       
    44 };
       
    45 
       
    46 void AlgoBox::update_cbt(std::vector< std::string > stringlist, Gtk::ComboBoxText & cbt)
       
    47 {
       
    48   std::string actname=cbt.get_active_text();
       
    49   int prev_act=-1;
       
    50 
       
    51   cbt.clear();
       
    52   int actptr=0;
       
    53 
       
    54   std::vector< std::string >::iterator emsi=stringlist.begin();
       
    55   for(;emsi!=stringlist.end();emsi++)
       
    56     {
       
    57       if(actname==*emsi)
       
    58 	{
       
    59 	  prev_act=actptr;
       
    60 	}
       
    61 
       
    62       cbt.append_text(*emsi);
       
    63       actptr++;
       
    64     }
       
    65 
       
    66   if(prev_act!=-1)
       
    67     {
       
    68       cbt.set_active(prev_act);
       
    69     }
       
    70   else if(actptr>0) //so there is item in the list
       
    71     {
       
    72       //cbt.set_active(0);
       
    73     }
       
    74 }
       
    75 
       
    76 void AlgoBox::update_tablist( std::vector< std::string > tl )
       
    77 {
       
    78   update_cbt(tl, tabcbt);
       
    79   emit_tab_change();
       
    80 }
       
    81 
       
    82 void AlgoBox::update_maplist(MapStorage * ms)
       
    83 {
       
    84   mapstorage=ms;
       
    85   std::vector<std::string> n_nml;
       
    86   std::vector<std::string> s_nml;
       
    87   std::vector<std::string> n_eml;
       
    88   std::vector<std::string> s_eml;
       
    89   if(mapstorage!=NULL)
       
    90     {
       
    91       mapstorage->signal_node_map_ch().connect(sigc::mem_fun(*this, &AlgoBox::nodemaplist_changed));
       
    92       mapstorage->signal_arc_map_ch().connect(sigc::mem_fun(*this, &AlgoBox::arcmaplist_changed));
       
    93       n_nml=mapstorage->getNodeMapList(NUM);
       
    94       s_nml=mapstorage->getNodeMapList(STR);
       
    95       n_eml=mapstorage->getArcMapList(NUM);
       
    96       s_eml=mapstorage->getArcMapList(STR);
       
    97     }
       
    98   for(int i=0;i<(int)nodemapcbts.size();i++)
       
    99     {
       
   100       (nodemapcbts[i])->update_list(n_nml, s_nml);
       
   101       //update_cbt(nml, *(nodemapcbts[i]));
       
   102     }
       
   103   for(int i=0;i<(int)arcmapcbts.size();i++)
       
   104     {
       
   105       (arcmapcbts[i])->update_list(n_eml, s_eml);
       
   106       //update_cbt(eml, *(arcmapcbts[i]));
       
   107     }
       
   108   signal_maplist_updated.emit();
       
   109 }
       
   110 
       
   111 void AlgoBox::nodemaplist_changed(std::string newmap, MapValue::Type type)
       
   112 {
       
   113   for(int i=0;i<(int)nodemapcbts.size();i++)
       
   114     {
       
   115       (nodemapcbts[i])->append_text(newmap, type);
       
   116     }
       
   117 }
       
   118 
       
   119 void AlgoBox::arcmaplist_changed(std::string newmap, MapValue::Type type)
       
   120 {
       
   121   for(int i=0;i<(int)arcmapcbts.size();i++)
       
   122     {
       
   123       (arcmapcbts[i])->append_text(newmap, type);
       
   124     }
       
   125 }
       
   126 
       
   127 void AlgoBox::run()
       
   128 {
       
   129   std::cout << "Start algorithm." << std::endl;
       
   130 }
       
   131 
       
   132 void AlgoBox::build_box()
       
   133 {
       
   134   pack_start(*(new Gtk::HSeparator()));
       
   135 
       
   136   Gtk::Label * label=new Gtk::Label("Specific part for each algorithm.");
       
   137       
       
   138   pack_start(*label);
       
   139   pack_start(*(new Gtk::HSeparator()));
       
   140 
       
   141   label=new Gtk::Label("Maps in chosen tab:");
       
   142       
       
   143   pack_start(*label);
       
   144 
       
   145   for(int i=0;i<NODE_INPUT_NUM;i++)
       
   146     {
       
   147       std::ostringstream o;
       
   148       o << "NodeInput " << i+1 << ":";
       
   149 
       
   150       addMapSelector(o.str(), false);
       
   151     }
       
   152 
       
   153   pack_start(*(new Gtk::HSeparator()));
       
   154 
       
   155   for(int i=0;i<EDGE_INPUT_NUM;i++)
       
   156     {
       
   157 
       
   158       std::ostringstream o;
       
   159       o << "ArcInput " << i+1 << ":";
       
   160 
       
   161       addMapSelector(o.str(), true);
       
   162     }
       
   163 
       
   164   pack_start(*(new Gtk::HSeparator()));
       
   165 }
       
   166 
       
   167 void AlgoBox::addMapSelector(std::string inputname, bool itisarc, MapType type)
       
   168 {
       
   169   std::vector<std::string> empty_vector;
       
   170 
       
   171   MapSelector * msp=new MapSelector(empty_vector,empty_vector,"",inputname,itisarc, false, type);
       
   172 
       
   173   if(itisarc)
       
   174     {
       
   175       arcmapcbts.resize(arcmapcbts.size()+1);
       
   176       arcmapcbts[arcmapcbts.size()-1]=msp;
       
   177     }
       
   178   else
       
   179     {
       
   180       nodemapcbts.resize(nodemapcbts.size()+1);
       
   181       nodemapcbts[nodemapcbts.size()-1]=msp;
       
   182     }
       
   183 
       
   184   msp->signal_newmapwin_needed().connect(sigc::mem_fun(*this, &AlgoBox::emit_new_map_signal));
       
   185 
       
   186   pack_start(*msp);
       
   187 }
       
   188 
       
   189 sigc::signal<void, std::string> AlgoBox::signal_maplist_needed()
       
   190 {
       
   191   return signal_maplist_need;
       
   192 }
       
   193 
       
   194 void AlgoBox::emit_tab_change()
       
   195 {
       
   196   std::string active_tab=tabcbt.get_active_text();
       
   197   if(active_tab!="")
       
   198     {
       
   199       signal_maplist_need.emit(active_tab);
       
   200     }
       
   201   else
       
   202     {
       
   203       std::vector<std::string> empty_vector;
       
   204       update_maplist(NULL);
       
   205     }
       
   206 }
       
   207 
       
   208 void AlgoBox::emit_new_map_signal(bool itisarc)
       
   209 {
       
   210   signal_newmapwin_need.emit(tabcbt.get_active_text(), itisarc);
       
   211 }