00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "edittechadapter.h"
00023
00024 #include "../player.h"
00025 #include "../gamemap.h"
00026
00027 #include "../paradialog.h"
00028 #include "../itemrepository.h"
00029 #include "../iconrepository.h"
00030 #include "../vehicletype.h"
00031 #include "unitinfodialog.h"
00032
00033 #include "selectionwindow.h"
00034
00035 #include "pgmultilineedit.h"
00036 #include "../widgets/textrenderer.h"
00037
00038 class TechAdapterWidget: public SelectionWidget
00039 {
00040 ASCString name;
00041 public:
00042 TechAdapterWidget( PG_Widget* parent, const PG_Point& pos, int width, const ASCString& adapterName ) : SelectionWidget( parent, PG_Rect( pos.x, pos.y, width, 18 )), name(adapterName)
00043 {
00044 PG_Label* lbl1 = new PG_Label( this, PG_Rect( 5, 0, width - 10, Height() ), name );
00045 lbl1->SetFontSize( lbl1->GetFontSize() -1 );
00046
00047 SetTransparency( 255 );
00048 };
00049
00050 ASCString getName() const
00051 {
00052 return name;
00053 };
00054
00055 protected:
00056
00057 void display( SDL_Surface * surface, const PG_Rect & src, const PG_Rect & dst )
00058 {
00059 }
00060 ;
00061 };
00062
00063
00064
00065
00066 class TechAdapterSelectionItemFactory: public SelectionItemFactory, public SigC::Object {
00067
00068 ASCString selected;
00069
00070 void add( set<ASCString>& list, const TechAdapterDependency& adapter );
00071
00072 public:
00073 typedef set<ASCString> Container;
00074
00075 protected:
00076 Container::iterator it;
00077 Container items;
00078 Container* adapterForPlayer;
00079
00080 public:
00081 TechAdapterSelectionItemFactory( );
00082 TechAdapterSelectionItemFactory( set<ASCString>& adapter );
00083
00084
00085
00086 void restart();
00087 SigC::Signal1<void,const ASCString&> techSelected;
00088
00089 SelectionWidget* spawnNextItem( PG_Widget* parent, const PG_Point& pos );
00090
00091 void itemSelected( const SelectionWidget* widget, bool mouse );
00092 void itemMarked( const SelectionWidget* widget, bool mouse );
00093
00094 ASCString getSelected() { return selected; };
00095 };
00096
00097
00098
00099 TechAdapterSelectionItemFactory :: TechAdapterSelectionItemFactory( ) : adapterForPlayer(NULL)
00100 {
00101 restart();
00102 };
00103
00104 TechAdapterSelectionItemFactory :: TechAdapterSelectionItemFactory( set<ASCString>& adapter ) : adapterForPlayer( &adapter )
00105 {
00106 restart();
00107 };
00108
00109
00110 void TechAdapterSelectionItemFactory::add( set<ASCString>& list, const TechAdapterDependency& adapter )
00111 {
00112 const TechAdapterDependency::RequiredTechAdapter& deps = adapter.listAdapters();
00113 for ( TechAdapterDependency::RequiredTechAdapter::const_iterator i = deps.begin(); i != deps.end(); ++i ) {
00114 list.insert( *i );
00115 }
00116 }
00117
00118
00119 void TechAdapterSelectionItemFactory::restart()
00120 {
00121 items.clear();
00122
00123 if ( !adapterForPlayer ) {
00124
00125 for ( int i = 0; i < vehicleTypeRepository.getNum(); ++i )
00126 add( items, vehicleTypeRepository.getObject_byPos(i)->techDependency );
00127
00128 for ( int i = 0; i < buildingTypeRepository.getNum(); ++i )
00129 add( items, buildingTypeRepository.getObject_byPos(i)->techDependency );
00130
00131 for ( int i = 0; i < objectTypeRepository.getNum(); ++i )
00132 add( items, objectTypeRepository.getObject_byPos(i)->techDependency );
00133
00134 } else {
00135 items = *adapterForPlayer;
00136 }
00137
00138 it = items.begin();
00139 };
00140
00141
00142 SelectionWidget* TechAdapterSelectionItemFactory::spawnNextItem( PG_Widget* parent, const PG_Point& pos )
00143 {
00144 if ( it != items.end() ) {
00145 ASCString v = *(it++);
00146
00147 return new TechAdapterWidget( parent, pos, parent->Width() - 15, v );
00148 } else
00149 return NULL;
00150 };
00151
00152
00153 void TechAdapterSelectionItemFactory::itemMarked( const SelectionWidget* widget, bool mouse )
00154 {
00155 itemSelected(widget, mouse );
00156 }
00157
00158 void TechAdapterSelectionItemFactory::itemSelected( const SelectionWidget* widget, bool mouse )
00159 {
00160 if ( !widget )
00161 return;
00162
00163 const TechAdapterWidget* tw = dynamic_cast<const TechAdapterWidget*>(widget);
00164 assert( tw );
00165
00166 selected = tw->getName();
00167 techSelected(tw->getName());
00168 }
00169
00170
00171
00172 class EditTechAdapter : public ASC_PG_Dialog
00173 {
00174 ItemSelectorWidget* allItemSelector;
00175 ItemSelectorWidget* playerItemSelector;
00176 TechAdapterSelectionItemFactory* allAdapterfactory;
00177 TechAdapterSelectionItemFactory* playerFactory;
00178
00179 set<ASCString> playerAdapter;
00180
00181 TextRenderer* objectList;
00182 Player& player;
00183
00184 bool containsAdapter( const ASCString& adapter, const TechAdapterDependency& dependency )
00185 {
00186 return find( dependency.listAdapters().begin(), dependency.listAdapters().end(), adapter ) != dependency.listAdapters().end();
00187 }
00188
00189 void techAdapterSelected( const ASCString& adapter )
00190 {
00191 const ASCString big = "#fontsize=14#";
00192 const ASCString medium = "#fontsize=12#";
00193 const ASCString small = "#fontsize=10#";
00194
00195 ASCString complete = big + "TechAdapter " + adapter + " is used by:" + small + "\n";
00196 ASCString local;
00197
00198 for ( int i = 0; i < vehicleTypeRepository.getNum(); ++i )
00199 if ( containsAdapter( adapter, vehicleTypeRepository.getObject_byPos(i)->techDependency ))
00200 local += "#vehicletype=" + ASCString::toString(vehicleTypeRepository.getObject_byPos(i)->id) + "# " + vehicleTypeRepository.getObject_byPos(i)->getName() + " \n";
00201
00202 if ( !local.empty() )
00203 complete += medium + "VehicleTypes" + small + "\n" + local;
00204 local.clear();
00205
00206 for ( int i = 0; i < buildingTypeRepository.getNum(); ++i )
00207 if ( containsAdapter( adapter, buildingTypeRepository.getObject_byPos(i)->techDependency ))
00208 local += " " + buildingTypeRepository.getObject_byPos(i)->getName() + "\n";
00209
00210 if ( !local.empty() )
00211 complete += medium + "BuildingTypes" + small + "\n" + local;
00212 local.clear();
00213
00214 for ( int i = 0; i < objectTypeRepository.getNum(); ++i )
00215 if ( containsAdapter( adapter, objectTypeRepository.getObject_byPos(i)->techDependency ))
00216 local += " " + objectTypeRepository.getObject_byPos(i)->getName() + "\n";
00217
00218 if ( !local.empty() )
00219 complete += medium + "ObjectTypes" + small + "\n" + local;
00220
00221 objectList->SetText( complete );
00222 };
00223
00224 protected:
00225 bool handleButtonClick(PG_Button* button)
00226 {
00227 return false;
00228 };
00229
00230 bool ok()
00231 {
00232 player.research.setPredefinedTechAdapter( playerAdapter );
00233 QuitModal();
00234 return true;
00235 }
00236
00237 bool cancel()
00238 {
00239 QuitModal();
00240 return true;
00241 }
00242
00243 bool add()
00244 {
00245 playerAdapter.insert( allAdapterfactory->getSelected() );
00246 playerItemSelector->reLoad( true );
00247 return true;
00248 }
00249
00250 bool remove()
00251 {
00252 set<ASCString>::iterator i = playerAdapter.find( playerFactory->getSelected());
00253 if ( i != playerAdapter.end() )
00254 playerAdapter.erase( playerFactory->getSelected() );
00255 playerItemSelector->reLoad( true );
00256
00257 return true;
00258 }
00259
00260 bool eventKeyDown(const SDL_KeyboardEvent* key)
00261 {
00262 int mod = SDL_GetModState() & ~(KMOD_NUM | KMOD_CAPS | KMOD_MODE);
00263
00264 if ( !mod )
00265 if ( key->keysym.sym == SDLK_RETURN )
00266 return ok();
00267
00268 return false;
00269 };
00270
00271
00272 public:
00273 EditTechAdapter( Player& my_player ) : ASC_PG_Dialog( NULL, PG_Rect( -1, -1, 770, 600), "Edit Tech Adapter" ) , allAdapterfactory(NULL), playerFactory(NULL), player( my_player )
00274 {
00275 playerAdapter.insert( player.research.getPredefinedTechAdapter().begin(), player.research.getPredefinedTechAdapter().end() );
00276
00277 new PG_Label(this, PG_Rect( 10, 30, 300, 20), "All TechAdapter");
00278 PG_Rect left ( 10, 55, 300, Height() - 220 );
00279
00280 new PG_Label(this, PG_Rect( 420, 30, 300, 20), "TechAdapter for " + player.getName() );
00281 PG_Rect right( 420, 55, 300, Height() - 220 );
00282
00283 Emboss* eleft = new Emboss( this, left, true );
00284 Emboss* eright = new Emboss( this, right, true );
00285
00286
00287 allAdapterfactory = new TechAdapterSelectionItemFactory();
00288 allAdapterfactory->techSelected.connect( SigC::slot( *this, &EditTechAdapter::techAdapterSelected ));
00289 allItemSelector = new ItemSelectorWidget( eleft, PG_Rect( 10, 10, eleft->Width() - 20, eleft->Height()-20 ), allAdapterfactory );
00290
00291 playerFactory = new TechAdapterSelectionItemFactory( playerAdapter );
00292 playerFactory->techSelected.connect( SigC::slot( *this, &EditTechAdapter::techAdapterSelected ));
00293 playerItemSelector = new ItemSelectorWidget( eright, PG_Rect( 10, 10, eright->Width() - 20, eright->Height()-20 ), playerFactory );
00294
00295
00296 (new PG_Button(this, PG_Rect( left.x + left.Width() + 10, left.y, right.x - left.x - left.Width() - 20, 30), "Add >>" ))->sigClick.connect( SigC::slot( *this, &EditTechAdapter::add));
00297 (new PG_Button(this, PG_Rect( left.x + left.Width() + 10, left.y + 40, right.x - left.x - left.Width() - 20, 30), "Remove <<" ))->sigClick.connect( SigC::slot( *this, &EditTechAdapter::remove));
00298
00299 Emboss* deps = new Emboss(this, PG_Rect ( 10, Height() - 160, 330, 120 ), true);
00300 objectList = new TextRenderer( deps, PG_Rect(1,1,deps->Width() - 2, deps->Height() - 2) );
00301
00302 AddStandardButton("~O~K")->sigClick.connect( SigC::slot( *this, &EditTechAdapter::ok ));
00303 AddStandardButton("~C~ancel")->sigClick.connect( SigC::slot( *this, &EditTechAdapter::cancel ));
00304 };
00305 };
00306
00307
00308
00309
00310 void editTechAdapter( Player& player )
00311 {
00312 EditTechAdapter eta( player);
00313 eta.Show();
00314 eta.RunModal();
00315 }
00316
00317
00318