| 192 | |
| 193 | |
| 194 | class ArrayItem: |
| 195 | |
| 196 | def __init__(self, array, index, value): |
| 197 | self.array = array |
| 198 | self.index = index |
| 199 | self.value = value |
| 200 | self.canvas = array.canvas |
| 201 | x1, y1, x2, y2 = self.position() |
| 202 | self.item_id = array.canvas.create_rectangle(x1, y1, x2, y2, |
| 203 | fill='red', outline='black', width=1) |
| 204 | self.canvas.tag_bind(self.item_id, '<Button-1>', self.mouse_down) |
| 205 | self.canvas.tag_bind(self.item_id, '<Button1-Motion>', self.mouse_move) |
| 206 | self.canvas.tag_bind(self.item_id, '<ButtonRelease-1>', self.mouse_up) |
| 207 | |
| 208 | def delete(self): |
| 209 | item_id = self.item_id |
| 210 | self.array = None |
| 211 | self.item_id = None |
| 212 | self.canvas.delete(item_id) |
| 213 | |
| 214 | def mouse_down(self, event): |
| 215 | self.lastx = event.x |
| 216 | self.lasty = event.y |
| 217 | self.origx = event.x |
| 218 | self.origy = event.y |
| 219 | self.canvas.tag_raise(self.item_id) |
| 220 | |
| 221 | def mouse_move(self, event): |
| 222 | self.canvas.move(self.item_id, |
| 223 | event.x - self.lastx, event.y - self.lasty) |
| 224 | self.lastx = event.x |
| 225 | self.lasty = event.y |
| 226 | |
| 227 | def mouse_up(self, event): |
| 228 | i = self.nearestindex(event.x) |
| 229 | if i >= self.array.getsize(): |
| 230 | i = self.array.getsize() - 1 |
| 231 | if i < 0: |
| 232 | i = 0 |
| 233 | other = self.array.items[i] |
| 234 | here = self.index |
| 235 | self.array.items[here], self.array.items[i] = other, self |
| 236 | self.index = i |
| 237 | x1, y1, x2, y2 = self.position() |
| 238 | self.canvas.coords(self.item_id, (x1, y1, x2, y2)) |
| 239 | other.setindex(here) |
| 240 | |
| 241 | def setindex(self, index): |
| 242 | nsteps = steps(self.index, index) |
| 243 | if not nsteps: return |
| 244 | if self.array.speed == "fastest": |
| 245 | nsteps = 0 |
| 246 | oldpts = self.position() |
| 247 | self.index = index |
| 248 | newpts = self.position() |
| 249 | trajectory = interpolate(oldpts, newpts, nsteps) |
| 250 | self.canvas.tag_raise(self.item_id) |
| 251 | for pts in trajectory: |