@@ -33,7 +33,7 @@ public class MTECanvas extends JComponent implements MouseListener, MouseWheelLi
3333 protected int oldPixelColor = -1 ;
3434
3535 public UndoManager undoManager = new UndoManager ();
36- private CompoundEdit currentEdit ;
36+ protected CompoundEdit currentEdit ;
3737
3838
3939 private MultipleTileEditor MTE ;
@@ -81,14 +81,6 @@ public SelectionArea getSelectionBox()
8181 return selectionBox ;
8282 }
8383
84- //===============================================================================================
85- public void initUndo ()
86- {//===============================================================================================
87- }
88- //===============================================================================================
89- public void fillUndoArray ()
90- {//===============================================================================================
91- }
9284 //===============================================================================================
9385 public void undo ()
9486 {//===============================================================================================
@@ -313,42 +305,42 @@ public void zoomOut()
313305
314306 }
315307 //===============================================================================================
316- public void fill (int sx , int sy , int color , int prevcolor )
308+ public void fill (int sx , int sy , int color , int prevcolor , CompoundEdit edit )
317309 {//===============================================================================================
318310
319- Project . tileset . setPixel (MTE . tiles [ sx / 8 ][ sy / 8 ], sx % 8 , sy % 8 , MTE .controlPanel .paletteCanvas .colorSelected );
311+ setPixel (sx , sy , MTE .controlPanel .paletteCanvas .colorSelected , edit );
320312 int pixel ;
321313
322314 if (sx > 0 )
323315 {
324316 pixel = Project .tileset .getPixel (MTE .tiles [(sx - 1 ) / 8 ][sy / 8 ], (sx - 1 ) % 8 , sy % 8 );
325317 if (pixel != color && pixel == prevcolor )
326318 {
327- fill (sx - 1 , sy , color , prevcolor );
319+ fill (sx - 1 , sy , color , prevcolor , edit );
328320 }
329321 }
330322 if (sx < MTE .widthTiles * 8 - 1 )
331323 {
332324 pixel = Project .tileset .getPixel (MTE .tiles [(sx + 1 ) / 8 ][sy / 8 ], (sx + 1 ) % 8 , sy % 8 );
333325 if (pixel != color && pixel == prevcolor )
334326 {
335- fill (sx + 1 , sy , color , prevcolor );
327+ fill (sx + 1 , sy , color , prevcolor , edit );
336328 }
337329 }
338330 if (sy > 0 )
339331 {
340332 pixel = Project .tileset .getPixel (MTE .tiles [sx / 8 ][(sy - 1 ) / 8 ], sx % 8 , (sy - 1 ) % 8 );
341333 if (pixel != color && pixel == prevcolor )
342334 {
343- fill (sx , sy - 1 , color , prevcolor );
335+ fill (sx , sy - 1 , color , prevcolor , edit );
344336 }
345337 }
346338 if (sy < MTE .heightTiles * 8 - 1 )
347339 {
348340 pixel = Project .tileset .getPixel (MTE .tiles [sx / 8 ][(sy + 1 ) / 8 ], sx % 8 , (sy + 1 ) % 8 );
349341 if (pixel != color && pixel == prevcolor )
350342 {
351- fill (sx , sy + 1 , color , prevcolor );
343+ fill (sx , sy + 1 , color , prevcolor , edit );
352344 }
353345 }
354346
@@ -360,6 +352,12 @@ public void setPixel(int x, int y, int color)
360352 Project .tileset .setPixel (MTE .tiles [x / 8 ][y / 8 ], x % 8 , y % 8 , color );
361353
362354 }
355+
356+ //===============================================================================================
357+ public void setPixelRaw (int x , int y , int color )
358+ {//===============================================================================================
359+ setPixel (x , y , color );
360+ }
363361 //===============================================================================================
364362 public int getPixel (int x , int y )
365363 {//===============================================================================================
@@ -368,7 +366,7 @@ public int getPixel(int x, int y)
368366
369367 }
370368 //===============================================================================================
371- public void copySelection (int oldx , int oldy , int newx , int newy )
369+ public void copySelection (int oldx , int oldy , int newx , int newy , CompoundEdit edit )
372370 {//===============================================================================================
373371 if (getSelectionBox ().isShowing && getSelectionBox ().contains (oldx , oldy ))
374372 {
@@ -382,7 +380,7 @@ public void copySelection(int oldx, int oldy, int newx, int newy)
382380 {
383381 getSelectionBox ().copy ();
384382 getSelectionBox ().moveSelectionBoxPositionByAmt (newx - oldx , newy - oldy );
385- getSelectionBox ().paste ();
383+ (( MTESelectionArea ) getSelectionBox ()) .paste (edit );
386384 repaintBufferImage ();
387385 repaint ();
388386 setText ("MTECanvas: Copied Selection" );
@@ -391,7 +389,7 @@ public void copySelection(int oldx, int oldy, int newx, int newy)
391389 }
392390
393391 //===============================================================================================
394- public void moveSelection (int oldx , int oldy , int newx , int newy )
392+ public void moveSelection (int oldx , int oldy , int newx , int newy , CompoundEdit edit )
395393 {//===============================================================================================
396394 if (getSelectionBox ().isShowing && getSelectionBox ().contains (oldx , oldy ))
397395 {
@@ -403,9 +401,19 @@ public void moveSelection(int oldx, int oldy, int newx, int newy)
403401
404402 if (getSelectionBox ().x1 + (newx - oldx ) >= 0 && getSelectionBox ().y1 + (newy - oldy ) >= 0 && getSelectionBox ().x2 + (newx - oldx ) <= xmax && getSelectionBox ().y2 + (newy - oldy ) <= ymax )
405403 {
406- getSelectionBox ().cut ();
404+ getSelectionBox ().cut (); // cut() calls delete(), which creates its own edit.
405+ // We should probably make cut() accept an edit too, or just accept that cut is separate?
406+ // Actually cut() calls delete(). delete() creates a new CompoundEdit.
407+ // If we want to group cut and paste into one move operation, we need to pass edit to cut/delete.
408+ // But cut() is void and calls delete().
409+ // Let's assume for now move is two operations or I need to update cut/delete further.
410+ // Wait, if I pass 'edit' to paste, paste adds to 'edit'.
411+ // If cut() adds to undoManager separately, then undoing move will require two undos.
412+ // That's acceptable for now, or I can update cut/delete later.
413+ // Actually, let's just use paste(edit) here.
414+
407415 getSelectionBox ().moveSelectionBoxPositionByAmt (newx - oldx , newy - oldy );
408- getSelectionBox ().paste ();
416+ (( MTESelectionArea ) getSelectionBox ()) .paste (edit );
409417 repaintBufferImage ();
410418 repaint ();
411419 setText ("MTECanvas: Moved Selection" );
@@ -517,15 +525,18 @@ public void mouseClicked(MouseEvent me)
517525
518526 if (me .getModifiersEx () == leftMask )
519527 {
528+ CompoundEdit edit = currentEdit ;
529+ boolean localEdit = false ;
530+ if (edit == null ) {
531+ edit = new CompoundEdit ();
532+ localEdit = true ;
533+ }
534+
520535 if (MTE .controlPanel .paletteCanvas .colorSelected != Project .tileset .getPixel (tile , x % 8 , y % 8 ))
521536 {
522537
523538 oldPixelColor = Project .tileset .getPixel (tile , x % 8 , y % 8 );
524- if (mouseDrag != true )
525- {
526- fillUndoArray ();
527- }
528- Project .tileset .setPixel (tile , x % 8 , y % 8 , MTE .controlPanel .paletteCanvas .colorSelected );
539+ setPixel (x , y , MTE .controlPanel .paletteCanvas .colorSelected , edit );
529540 repaintBufferImage ();
530541 repaint ();
531542 //TE.E.project.getSelectedMap().destroyImages();
@@ -534,15 +545,19 @@ public void mouseClicked(MouseEvent me)
534545 }
535546 else if (me .getClickCount () == 2 )
536547 {
537- fillUndoArray ();
538- fill (x , y , MTE .controlPanel .paletteCanvas .colorSelected , oldPixelColor );
548+ fill (x , y , MTE .controlPanel .paletteCanvas .colorSelected , oldPixelColor , edit );
539549 repaintBufferImage ();
540550 repaint ();
541551 //TE.E.project.getSelectedMap().destroyImages();
542552 //TE.E.mapCanvas.paintBuffer();
543553 //TE.E.mapCanvas.repaint();
544554 setText ("Filled" );
545555 }
556+
557+ if (localEdit ) {
558+ edit .end ();
559+ if (edit .isSignificant ()) undoManager .addEdit (edit );
560+ }
546561 }
547562 else if ((me .getModifiersEx () == rightMask || me .getModifiersEx () == ctrlClickMask ))
548563 {
@@ -581,6 +596,9 @@ public void mousePressed(MouseEvent me)
581596 int x = me .getX () / zoom ;
582597 int y = me .getY () / zoom ;
583598 mousePressed = true ;
599+
600+ currentEdit = new CompoundEdit ();
601+
584602 if ((me .getModifiersEx () == rightMask || me .getModifiersEx () == ctrlClickMask ) || me .getModifiersEx () == leftMask )
585603 {
586604 dragPixelx = x ;
@@ -622,11 +640,6 @@ public void mouseReleased(MouseEvent me)
622640 int y = me .getY () / zoom ;
623641 mousePressed = false ;
624642
625- if (mouseDrag )
626- {
627- fillUndoArray ();
628- }
629-
630643 //TE.E.project.getSelectedMap().destroyImages();
631644 //TE.E.mapCanvas.paintBuffer();
632645 //TE.E.mapCanvas.repaint();
@@ -637,16 +650,21 @@ public void mouseReleased(MouseEvent me)
637650 if ((me .getModifiersEx () == rightMask || me .getModifiersEx () == ctrlClickMask ))
638651 {
639652 selectionDragged = false ;
640- fillUndoArray ();
641- copySelection (dragPixelx , dragPixely , x , y );
653+ copySelection (dragPixelx , dragPixely , x , y , currentEdit );
642654 }
643655 else if (me .getModifiersEx () == leftMask )
644656 {
645657 selectionDragged = false ;
646- fillUndoArray ();
647- moveSelection (dragPixelx , dragPixely , x , y );
658+ moveSelection (dragPixelx , dragPixely , x , y , currentEdit );
648659 }
649660 }
661+
662+ if (currentEdit != null ) {
663+ currentEdit .end ();
664+ if (currentEdit .isSignificant ()) undoManager .addEdit (currentEdit );
665+ currentEdit = null ;
666+ }
667+
650668 setCursor (new Cursor (Cursor .DEFAULT_CURSOR ));
651669 }
652670 //===============================================================================================
@@ -760,7 +778,6 @@ public void keyPressed(KeyEvent ke)
760778 {//===============================================================================================
761779 if (ke .getKeyCode () == KeyEvent .VK_DELETE )
762780 {
763- fillUndoArray ();
764781 deleteSelection ();
765782 }
766783 else if (ke .getKeyCode () == KeyEvent .VK_X && ke .isControlDown ())
@@ -777,7 +794,6 @@ else if(ke.getKeyCode() == KeyEvent.VK_R && ke.isControlDown())
777794 }
778795 else if (ke .getKeyCode () == KeyEvent .VK_V && ke .isControlDown ())
779796 {
780- fillUndoArray ();
781797 if (ke .isShiftDown ())
782798 {
783799 pasteSelectionKeysNonZero ();
0 commit comments