Undo state tracking (no reverse yet)
This commit is contained in:
parent
07a4e47201
commit
1c622da928
|
@ -1,6 +1,14 @@
|
||||||
extends Node
|
extends Node
|
||||||
|
|
||||||
|
|
||||||
|
func num2alpha(num: int, uppercase:=false):
|
||||||
|
var c = ord('A' if uppercase else 'a')
|
||||||
|
if num >= 26:
|
||||||
|
return char(c+(num/26)-1) + char(c+(num%26))
|
||||||
|
else:
|
||||||
|
return char(c+num)
|
||||||
|
|
||||||
|
|
||||||
class PoolArray2D:
|
class PoolArray2D:
|
||||||
var _array
|
var _array
|
||||||
var _rows := 1
|
var _rows := 1
|
||||||
|
|
|
@ -14,6 +14,11 @@ onready var cell_numbers: ByteArray2D
|
||||||
const NUMBER_NONE := 255
|
const NUMBER_NONE := 255
|
||||||
onready var cell_colors: ByteArray2D
|
onready var cell_colors: ByteArray2D
|
||||||
onready var corner_marks: IntArray2D
|
onready var corner_marks: IntArray2D
|
||||||
|
enum UndoActions {
|
||||||
|
SET_L_RIGHT, SET_L_DOWN, SET_X_RIGHT, SET_X_DOWN,
|
||||||
|
CLEAR_L_RIGHT, CLEAR_L_DOWN, CLEAR_X_RIGHT, CLEAR_X_DOWN,
|
||||||
|
SET_COLOR
|
||||||
|
}
|
||||||
enum CornerMark {
|
enum CornerMark {
|
||||||
L_RIGHT=1, L_DOWN=2, X_RIGHT=4, X_DOWN=8,
|
L_RIGHT=1, L_DOWN=2, X_RIGHT=4, X_DOWN=8,
|
||||||
DARC_1=16, DARC_2=32, DARC_3=64, DARC_4=128,
|
DARC_1=16, DARC_2=32, DARC_3=64, DARC_4=128,
|
||||||
|
@ -112,14 +117,13 @@ func _draw() -> void:
|
||||||
for row in rows:
|
for row in rows:
|
||||||
draw_string_centered(font, Vector2(h0/2, v0+row*v_space), '%02d'%row, Color.black)
|
draw_string_centered(font, Vector2(h0/2, v0+row*v_space), '%02d'%row, Color.black)
|
||||||
for col in cols:
|
for col in cols:
|
||||||
draw_string_centered(font, Vector2(h0+(col+0.5)*h_space, v0/4), num2alpha(col), Color.black)
|
draw_string_centered(font, Vector2(h0+(col+0.5)*h_space, v0/4), Common.num2alpha(col), Color.black)
|
||||||
|
|
||||||
func num2alpha(num: int, uppercase:=false):
|
# Undo Stack
|
||||||
var c = ord('A' if uppercase else 'a')
|
var u = len(undo_stack)
|
||||||
if num >= 26:
|
for i in u:
|
||||||
return char(c+(num/26)-1) + char(c+(num%26))
|
draw_string(font, grid_corner(i, cols+1), str(undo_stack[u-i-1]), Color.black)
|
||||||
else:
|
# print(action)
|
||||||
return char(c+num)
|
|
||||||
|
|
||||||
func _process(delta: float) -> void:
|
func _process(delta: float) -> void:
|
||||||
update()
|
update()
|
||||||
|
@ -263,39 +267,100 @@ func _input(event: InputEvent) -> void:
|
||||||
DragAction.DRAW_COLOR:
|
DragAction.DRAW_COLOR:
|
||||||
sel_row = int(gridpos.y)
|
sel_row = int(gridpos.y)
|
||||||
sel_col = int(gridpos.x)
|
sel_col = int(gridpos.x)
|
||||||
cell_colors.set_cell(sel_row, sel_col, drag_color)
|
set_cell_color(sel_row, sel_col, drag_color)
|
||||||
|
|
||||||
var undo_stack = []
|
var undo_stack = []
|
||||||
|
|
||||||
|
class UndoAction:
|
||||||
|
var action_type
|
||||||
|
var cell_row
|
||||||
|
var cell_col
|
||||||
|
func _init(action, row, col) -> void:
|
||||||
|
action_type = action
|
||||||
|
cell_row = row
|
||||||
|
cell_col = col
|
||||||
|
|
||||||
|
class UndoActionCorner extends UndoAction:
|
||||||
|
func _init(action, row, col).(action, row, col) -> void:
|
||||||
|
pass
|
||||||
|
|
||||||
|
func _to_string() -> String:
|
||||||
|
match action_type:
|
||||||
|
UndoActions.SET_L_RIGHT:
|
||||||
|
return '+L %s%d:%d'%[Common.num2alpha(cell_col), cell_row-1, cell_row]
|
||||||
|
UndoActions.CLEAR_L_RIGHT:
|
||||||
|
return '-L %s%d:%d'%[Common.num2alpha(cell_col), cell_row-1, cell_row]
|
||||||
|
UndoActions.SET_X_RIGHT:
|
||||||
|
return '+X %s%d:%d'%[Common.num2alpha(cell_col), cell_row-1, cell_row]
|
||||||
|
UndoActions.CLEAR_X_RIGHT:
|
||||||
|
return '-X %s%d:%d'%[Common.num2alpha(cell_col), cell_row-1, cell_row]
|
||||||
|
UndoActions.SET_L_DOWN:
|
||||||
|
return '+L %s%d:%s'%[Common.num2alpha(cell_col-1), cell_row, Common.num2alpha(cell_col)]
|
||||||
|
UndoActions.CLEAR_L_DOWN:
|
||||||
|
return '-L %s%d:%s'%[Common.num2alpha(cell_col-1), cell_row, Common.num2alpha(cell_col)]
|
||||||
|
UndoActions.SET_X_DOWN:
|
||||||
|
return '+X %s%d:%s'%[Common.num2alpha(cell_col-1), cell_row, Common.num2alpha(cell_col)]
|
||||||
|
UndoActions.CLEAR_X_DOWN:
|
||||||
|
return '-X %s%d:%s'%[Common.num2alpha(cell_col-1), cell_row, Common.num2alpha(cell_col)]
|
||||||
|
_:
|
||||||
|
return 'unk %d %s%d'%[action_type, Common.num2alpha(cell_col), cell_row]
|
||||||
|
|
||||||
|
class UndoActionCell extends UndoAction:
|
||||||
|
var set_state
|
||||||
|
var prev_state
|
||||||
|
func _init(action, row, col, set_state, prev_state).(action, row, col) -> void:
|
||||||
|
self.set_state = set_state
|
||||||
|
self.prev_state = prev_state
|
||||||
|
|
||||||
|
func _to_string() -> String:
|
||||||
|
match action_type:
|
||||||
|
UndoActions.SET_COLOR:
|
||||||
|
return 'C%d->%d %s%d'%[set_state, prev_state, Common.num2alpha(cell_col), cell_row]
|
||||||
|
_:
|
||||||
|
return 'unk %d %s%d'%[action_type, Common.num2alpha(cell_col), cell_row]
|
||||||
|
|
||||||
|
func set_cell_color(row, col, new_color):
|
||||||
|
var old_color = cell_colors.get_cell(row, col)
|
||||||
|
if old_color != new_color:
|
||||||
|
cell_colors.set_cell(row, col, new_color)
|
||||||
|
undo_stack.append(UndoActionCell.new(UndoActions.SET_COLOR, row, col, new_color, old_color))
|
||||||
|
|
||||||
func set_line_right(row, col):
|
func set_line_right(row, col):
|
||||||
if !corner_marks.get_flag(row, col, CornerMark.L_RIGHT) and !corner_marks.get_flag(row, col, CornerMark.X_RIGHT):
|
if !corner_marks.get_flag(row, col, CornerMark.L_RIGHT) and !corner_marks.get_flag(row, col, CornerMark.X_RIGHT):
|
||||||
corner_marks.set_flag(row, col, CornerMark.L_RIGHT)
|
corner_marks.set_flag(row, col, CornerMark.L_RIGHT)
|
||||||
# TODO: Add undo stack entry
|
undo_stack.append(UndoActionCorner.new(UndoActions.SET_L_RIGHT, row, col))
|
||||||
|
|
||||||
func set_line_down(row, col):
|
func set_line_down(row, col):
|
||||||
if !corner_marks.get_flag(row, col, CornerMark.L_DOWN) and !corner_marks.get_flag(row, col, CornerMark.X_DOWN):
|
if !corner_marks.get_flag(row, col, CornerMark.L_DOWN) and !corner_marks.get_flag(row, col, CornerMark.X_DOWN):
|
||||||
corner_marks.set_flag(row, col, CornerMark.L_DOWN)
|
corner_marks.set_flag(row, col, CornerMark.L_DOWN)
|
||||||
|
undo_stack.append(UndoActionCorner.new(UndoActions.SET_L_DOWN, row, col))
|
||||||
|
|
||||||
func clear_line_right(row, col):
|
func clear_line_right(row, col):
|
||||||
if corner_marks.get_flag(row, col, CornerMark.L_RIGHT):
|
if corner_marks.get_flag(row, col, CornerMark.L_RIGHT):
|
||||||
corner_marks.clear_flag(row, col, CornerMark.L_RIGHT)
|
corner_marks.clear_flag(row, col, CornerMark.L_RIGHT)
|
||||||
|
undo_stack.append(UndoActionCorner.new(UndoActions.CLEAR_L_RIGHT, row, col))
|
||||||
|
|
||||||
func clear_line_down(row, col):
|
func clear_line_down(row, col):
|
||||||
if corner_marks.get_flag(row, col, CornerMark.L_DOWN):
|
if corner_marks.get_flag(row, col, CornerMark.L_DOWN):
|
||||||
corner_marks.clear_flag(row, col, CornerMark.L_DOWN)
|
corner_marks.clear_flag(row, col, CornerMark.L_DOWN)
|
||||||
|
undo_stack.append(UndoActionCorner.new(UndoActions.CLEAR_L_DOWN, row, col))
|
||||||
|
|
||||||
func set_x_right(row, col):
|
func set_x_right(row, col):
|
||||||
if !corner_marks.get_flag(row, col, CornerMark.L_RIGHT) and !corner_marks.get_flag(row, col, CornerMark.X_RIGHT):
|
if !corner_marks.get_flag(row, col, CornerMark.L_RIGHT) and !corner_marks.get_flag(row, col, CornerMark.X_RIGHT):
|
||||||
corner_marks.set_flag(row, col, CornerMark.X_RIGHT)
|
corner_marks.set_flag(row, col, CornerMark.X_RIGHT)
|
||||||
|
undo_stack.append(UndoActionCorner.new(UndoActions.SET_X_RIGHT, row, col))
|
||||||
|
|
||||||
func set_x_down(row, col):
|
func set_x_down(row, col):
|
||||||
if !corner_marks.get_flag(row, col, CornerMark.L_DOWN) and !corner_marks.get_flag(row, col, CornerMark.X_DOWN):
|
if !corner_marks.get_flag(row, col, CornerMark.L_DOWN) and !corner_marks.get_flag(row, col, CornerMark.X_DOWN):
|
||||||
corner_marks.set_flag(row, col, CornerMark.X_DOWN)
|
corner_marks.set_flag(row, col, CornerMark.X_DOWN)
|
||||||
|
undo_stack.append(UndoActionCorner.new(UndoActions.SET_X_DOWN, row, col))
|
||||||
|
|
||||||
func clear_x_right(row, col):
|
func clear_x_right(row, col):
|
||||||
if corner_marks.get_flag(row, col, CornerMark.X_RIGHT):
|
if corner_marks.get_flag(row, col, CornerMark.X_RIGHT):
|
||||||
corner_marks.clear_flag(row, col, CornerMark.X_RIGHT)
|
corner_marks.clear_flag(row, col, CornerMark.X_RIGHT)
|
||||||
|
undo_stack.append(UndoActionCorner.new(UndoActions.CLEAR_X_RIGHT, row, col))
|
||||||
|
|
||||||
func clear_x_down(row, col):
|
func clear_x_down(row, col):
|
||||||
if corner_marks.get_flag(row, col, CornerMark.X_DOWN):
|
if corner_marks.get_flag(row, col, CornerMark.X_DOWN):
|
||||||
corner_marks.clear_flag(row, col, CornerMark.X_DOWN)
|
corner_marks.clear_flag(row, col, CornerMark.X_DOWN)
|
||||||
|
undo_stack.append(UndoActionCorner.new(UndoActions.CLEAR_X_DOWN, row, col))
|
||||||
|
|
Loading…
Reference in New Issue