diagonal flipping

This commit is contained in:
Titus Tscharntke 2011-05-24 00:58:21 +00:00
parent adb7ec4a6a
commit d28b47ffb1
6 changed files with 53 additions and 0 deletions

View File

@ -125,6 +125,7 @@ void MainWindow::init(string fname) {
// menuEdit->Append(miEditReset, wxT("Rese&t..."));
menuEdit->Append(miEditResetPlayers, wxT("Reset &Players..."));
menuEdit->Append(miEditResize, wxT("Re&size..."));
menuEdit->Append(miEditFlipDiagonal, wxT("Flip &Diagonal"));
menuEdit->Append(miEditFlipX, wxT("Flip &X"));
menuEdit->Append(miEditFlipY, wxT("Flip &Y"));
@ -747,6 +748,16 @@ void MainWindow::onMenuEditResetPlayers(wxCommandEvent &event) {
setExtension();
}
void MainWindow::onMenuEditFlipDiagonal(wxCommandEvent &event) {
if(program == NULL) {
return;
}
program->setUndoPoint(ctAll);
program->flipDiagonal();
setDirty();
}
void MainWindow::onMenuEditResize(wxCommandEvent &event) {
if(program == NULL) {
return;
@ -1255,6 +1266,7 @@ BEGIN_EVENT_TABLE(MainWindow, wxFrame)
EVT_MENU(miEditRedo, MainWindow::onMenuEditRedo)
EVT_MENU(miEditResetPlayers, MainWindow::onMenuEditResetPlayers)
EVT_MENU(miEditResize, MainWindow::onMenuEditResize)
EVT_MENU(miEditFlipDiagonal, MainWindow::onMenuEditFlipDiagonal)
EVT_MENU(miEditFlipX, MainWindow::onMenuEditFlipX)
EVT_MENU(miEditFlipY, MainWindow::onMenuEditFlipY)

View File

@ -104,6 +104,7 @@ private:
miEditReset,
miEditResetPlayers,
miEditResize,
miEditFlipDiagonal,
miEditFlipX,
miEditFlipY,
@ -212,6 +213,7 @@ public:
void onMenuEditReset(wxCommandEvent &event);
void onMenuEditResetPlayers(wxCommandEvent &event);
void onMenuEditResize(wxCommandEvent &event);
void onMenuEditFlipDiagonal(wxCommandEvent &event);
void onMenuEditFlipX(wxCommandEvent &event);
void onMenuEditFlipY(wxCommandEvent &event);

View File

@ -483,6 +483,22 @@ void Program::shiftLeft() {
map->changeStartLocation(map->getStartLocationX(i)-1, map->getStartLocationY(i), i); // it allready check limits
}
}
void Program::flipDiagonal() {
if(map) {
int w=map->getW();
int h=map->getH();
for (int i=0; i<w; i++)
for (int j=i; j<h; j++){
map->swapXY(i,j , j,i);
}
for (int i = 0; i < map->getMaxFactions(); ++i) // move players
if (map->getStartLocationX(i) != 0 || map->getStartLocationY(i) != 0) // don't move the unset ones
map->changeStartLocation(map->getStartLocationY(i), map->getStartLocationX(i), i); // it allready check limits
}
}
void Program::shiftRight() {
if(map) {
int w=map->getW()-1;

View File

@ -133,6 +133,7 @@ public:
void rotatecopyY();
void rotatecopyXY();
void rotatecopyCorner();
void flipDiagonal();
void shiftLeft();
void shiftRight();
void shiftUp();

View File

@ -171,6 +171,7 @@ public:
void flipX();
void flipY();
void copyXY(int x, int y, int sx, int sy); // destination x,y = source sx,sy
void swapXY(int x, int y, int sx, int sy);
void reset(int w, int h, float alt, MapSurfaceType surf);
void resize(int w, int h, float alt, MapSurfaceType surf);
void resetFactions(int maxFactions);

View File

@ -401,6 +401,27 @@ void MapPreview::copyXY(int x, int y, int sx, int sy) {
cells[x][y].surface = cells[sx][sy].surface;
}
// swap a cell in the map with another, used by rotate etc
void MapPreview::swapXY(int x, int y, int sx, int sy) {
if(inside(x, y) and inside(sx, sy)){
float tmpHeight= cells[x][y].height;
cells[x][y].height= cells[sx][sy].height;
cells[sx][sy].height= tmpHeight;
int tmpObject= cells[x][y].object;
cells[x][y].object= cells[sx][sy].object;
cells[sx][sy].object= tmpObject;
int tmpResource= cells[x][y].resource;
cells[x][y].resource= cells[sx][sy].resource;
cells[sx][sy].resource= tmpResource;
int tmpSurface= cells[x][y].surface;
cells[x][y].surface= cells[sx][sy].surface;
cells[sx][sy].surface= tmpSurface;
}
}
void MapPreview::changeSurface(int x, int y, MapSurfaceType surface, int radius) {
int i, j;
int dist;