No AStar here, or else user path will became shortest path. I only check your project just to play around, not read your code.
Here is section of your map that I badly draw:
Well, each (hallway) tile of your map is actually a (hidden) node. 2 nodes that able to connect together become edge.
Since you know Data Structure, I assume you already know linked list
. In this case will store in linked list like format (store data in graph node itself). You can do this with dictionary, but I recommend to do with (internal class)
class MapNode:
var position: Vector2
#var connected_nodes: Array # I know that you will use TileMap.get_cell() to check for connected node, so I comment out
var next: MapNode
You may now notice that I put node dot in center of each tile, that is actually the position of the node itself.
You can now track node path like this
var current_node: MapNode = start_node
while current_node != null:
line_points.append(current_node.position)
current_node = current_node.next
Snap problem solve. (Yes, yes, if you use as is, it will be same as first one but it will be line instant of sprite.)
Here is your trackback problem:

var new_input: MapNode = get_map_node_from_position(mouse_position)
if new_input.next == current_last_node:
# User do trackback event
current_last_node = new_input
current_last_node.next = null # Clear connection of user path
else:
current_last_node.next = new_input
current_last_node = new_input
The code above can do trackback and draw path. But with a bit of modify, you can also check for path collision. Trackback problem solve.
And lastly, with creative, you can make non tile based map, one way path or (this is what you want) grow and shrink line to cursor. Like add corner_points
and last_position
properties to MapNode
and when you build line you might use last_position
instant of position
or draw path the same size as hallway with help of corner_points