feat: remove existing cursor if clicked again in add cursor mode
closes #146
This commit is contained in:
		
							parent
							
								
									0791a82ca0
								
							
						
					
					
						commit
						e09df735a5
					
				
					 1 changed files with 34 additions and 6 deletions
				
			
		|  | @ -1527,6 +1527,29 @@ pub const Editor = struct { | |||
|         self.cursels.clearRetainingCapacity(); | ||||
|     } | ||||
| 
 | ||||
|     fn cursor_count(self: *const Self) usize { | ||||
|         var count: usize = 0; | ||||
|         for (self.cursels.items[0..]) |*cursel| if (cursel.*) |_| { | ||||
|             count += 1; | ||||
|         }; | ||||
|         return count; | ||||
|     } | ||||
| 
 | ||||
|     fn cursor_at(self: *const Self, cursor: Cursor) ?usize { | ||||
|         for (self.cursels.items[0..], 0..) |*cursel, i| if (cursel.*) |*result| | ||||
|             if (cursor.eql(result.cursor)) | ||||
|                 return i; | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     fn remove_cursor_at(self: *const Self, cursor: Cursor) bool { | ||||
|         if (self.cursor_at(cursor)) |i| { | ||||
|             if (self.cursor_count() > 1) // refuse to remove the last cursor | ||||
|                 self.cursels.items[i] = null; | ||||
|             return true; // but return true anyway to indicate a cursor was found | ||||
|         } else return false; | ||||
|     } | ||||
| 
 | ||||
|     fn collapse_cursors(self: *Self) void { | ||||
|         const frame = tracy.initZone(@src(), .{ .name = "collapse cursors" }); | ||||
|         defer frame.deinit(); | ||||
|  | @ -1964,15 +1987,20 @@ pub const Editor = struct { | |||
|     } | ||||
| 
 | ||||
|     pub fn primary_click(self: *Self, y: c_int, x: c_int) !void { | ||||
|         if (self.fast_scroll) | ||||
|             try self.push_cursor() | ||||
|         else | ||||
|         const root = self.buf_root() catch return; | ||||
|         if (self.fast_scroll) { | ||||
|             var at: Cursor = .{}; | ||||
|             at.move_abs(root, &self.view, @intCast(y), @intCast(x), self.metrics) catch return; | ||||
|             if (self.remove_cursor_at(at)) | ||||
|                 return; | ||||
|             try self.push_cursor(); | ||||
|         } else { | ||||
|             self.cancel_all_selections(); | ||||
|         } | ||||
|         const primary = self.get_primary(); | ||||
|         primary.selection = null; | ||||
|         self.selection_mode = .char; | ||||
|         try self.send_editor_jump_source(); | ||||
|         const root = self.buf_root() catch return; | ||||
|         primary.cursor.move_abs(root, &self.view, @intCast(y), @intCast(x), self.metrics) catch return; | ||||
|         self.clamp_mouse(); | ||||
|         try self.send_editor_jump_destination(); | ||||
|  | @ -2839,9 +2867,9 @@ pub const Editor = struct { | |||
|     pub fn unindent(self: *Self, _: Context) Result { | ||||
|         const b = try self.buf_for_update(); | ||||
|         errdefer self.restore_cursels(); | ||||
|         const cursor_count = self.cursels.items.len; | ||||
|         const previous_len = self.cursels.items.len; | ||||
|         const root = try self.with_cursels_mut(b.root, unindent_cursel, b.allocator); | ||||
|         if (self.cursels.items.len != cursor_count) | ||||
|         if (self.cursels.items.len != previous_len) | ||||
|             self.restore_cursels(); | ||||
|         try self.update_buf(root); | ||||
|     } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue