]> Shamusworld >> Repos - warehouse-man-deluxe/blobdiff - src/editorwidget.cpp
Finish adding functionality to editor.
[warehouse-man-deluxe] / src / editorwidget.cpp
index 0c6ab283239781c0c5f3966281a3326c179cdcae..1431edc243c3db38397d694558e28d24f0d4f356 100644 (file)
@@ -178,40 +178,60 @@ void EditorWidget::keyPressEvent(QKeyEvent * event)
 
        if (key == Qt::Key_Up)
        {
-               if (cursor.y > 0)
-                       cursor.y--;
+               if (event->modifiers() == Qt::ShiftModifier)
+                       ShiftLevel(0, -1);
+               else
+               {
+                       if (cursor.y > 0)
+                               cursor.y--;
 
-               if (((cursor.y - corner.y) == 0) && (corner.y > -1))
-                       corner.y--;
+                       if (((cursor.y - corner.y) == 0) && (corner.y > -1))
+                               corner.y--;
+               }
        }
        else if (key == Qt::Key_Down)
        {
-               if (cursor.y < (BOARDSIZE - 1))
-                       cursor.y++;
-
-               if (cursor.y >= (range.y + corner.y - 1))
+               if (event->modifiers() == Qt::ShiftModifier)
+                       ShiftLevel(0, +1);
+               else
                {
-                       if (corner.y < (BOARDSIZE - range.y))
-                               corner.y++;
+                       if (cursor.y < (BOARDSIZE - 1))
+                               cursor.y++;
+
+                       if (cursor.y >= (range.y + corner.y - 1))
+                       {
+                               if (corner.y < (BOARDSIZE - range.y))
+                                       corner.y++;
+                       }
                }
        }
        else if (key == Qt::Key_Left)
        {
-               if (cursor.x > 0)
-                       cursor.x--;
+               if (event->modifiers() == Qt::ShiftModifier)
+                       ShiftLevel(-1, 0);
+               else
+               {
+                       if (cursor.x > 0)
+                               cursor.x--;
 
-               if (((cursor.x - corner.x) == 0) && (corner.x > -1))
-                       corner.x--;
+                       if (((cursor.x - corner.x) == 0) && (corner.x > -1))
+                               corner.x--;
+               }
        }
        else if (key == Qt::Key_Right)
        {
-               if (cursor.x < (BOARDSIZE - 1))
-                       cursor.x++;
-
-               if (cursor.x >= (range.x + corner.x - 1))
+               if (event->modifiers() == Qt::ShiftModifier)
+                       ShiftLevel(+1, 0);
+               else
                {
-                       if (corner.x < (BOARDSIZE - range.x))
-                               corner.x++;
+                       if (cursor.x < (BOARDSIZE - 1))
+                               cursor.x++;
+
+                       if (cursor.x >= (range.x + corner.x - 1))
+                       {
+                               if (corner.x < (BOARDSIZE - range.x))
+                                       corner.x++;
+                       }
                }
        }
        else if (key == Qt::Key_Period)
@@ -421,6 +441,74 @@ void EditorWidget::SetNameOnCurrentLevel(const char * newName)
 }
 
 
+void EditorWidget::AddNewLevelAtCurrentPosition(void)
+{
+       Level l;
+       memset(&l, 0, sizeof(l));
+       l.corner.x = l.corner.y = -1;
+
+       levelStorage.insert(levelStorage.begin() + currentLevel, l);
+}
+
+
+// Note: Only one parameter can be non-zero if you want expected behavior!
+void EditorWidget::ShiftLevel(int dx, int dy)
+{
+       Level & level = levelStorage[currentLevel];
+
+       // Shift grid in the X direction
+       if (dy == 0)
+       {
+               for(int y=0; y<BOARDSIZE; y++)
+               {
+                       if (dx == 1)
+                       {
+                               uint8_t temp = level.board[BOARDSIZE - 1][y];
+
+                               for(int x=BOARDSIZE-1; x>0; x--)
+                                       level.board[x][y] = level.board[x - 1][y];
+
+                               level.board[0][y] = temp;
+                       }
+                       else
+                       {
+                               uint8_t temp = level.board[0][y];
+
+                               for(int x=0; x<BOARDSIZE; x++)
+                                       level.board[x][y] = level.board[x + 1][y];
+
+                               level.board[BOARDSIZE - 1][y] = temp;
+                       }
+               }
+       }
+       // Shift grid in the Y direction
+       else
+       {
+               for(int x=0; x<BOARDSIZE; x++)
+               {
+                       if (dy == 1)
+                       {
+                               uint8_t temp = level.board[x][BOARDSIZE - 1];
+
+                               for(int y=BOARDSIZE-1; y>0; y--)
+                                       level.board[x][y] = level.board[x][y - 1];
+
+                               level.board[x][0] = temp;
+                       }
+                       else
+                       {
+                               uint8_t temp = level.board[x][0];
+
+                               for(int y=0; y<BOARDSIZE; y++)
+                                       level.board[x][y] = level.board[x][y + 1];
+
+                               level.board[x][BOARDSIZE - 1] = temp;
+                       }
+               }
+       }
+}
+
+
 void EditorWidget::GetSizeAndCorner(Level * level, Point & size, Point & corner)
 {
        size.x = size.y = corner.x = corner.y = 0;