WIP: feat: add pop up completion list to file browser
This commit is contained in:
		
							parent
							
								
									c88e2dd975
								
							
						
					
					
						commit
						8f86718d0f
					
				
					 1 changed files with 31 additions and 0 deletions
				
			
		|  | @ -13,6 +13,10 @@ const Buffer = @import("Buffer"); | ||||||
| 
 | 
 | ||||||
| const tui = @import("../../tui.zig"); | const tui = @import("../../tui.zig"); | ||||||
| const MessageFilter = @import("../../MessageFilter.zig"); | const MessageFilter = @import("../../MessageFilter.zig"); | ||||||
|  | const Button = @import("../../Button.zig"); | ||||||
|  | const Menu = @import("../../Menu.zig"); | ||||||
|  | const ModalBackground = @import("../../ModalBackground.zig"); | ||||||
|  | const Widget = @import("../../Widget.zig"); | ||||||
| 
 | 
 | ||||||
| const max_complete_paths = 1024; | const max_complete_paths = 1024; | ||||||
| 
 | 
 | ||||||
|  | @ -27,6 +31,8 @@ pub fn Create(options: type) type { | ||||||
|         total_matches: usize = 0, |         total_matches: usize = 0, | ||||||
|         matched_entry: usize = 0, |         matched_entry: usize = 0, | ||||||
|         commands: Commands = undefined, |         commands: Commands = undefined, | ||||||
|  |         modal: *ModalBackground.State(*Self), | ||||||
|  |         menu: *Menu.State(*Self), | ||||||
| 
 | 
 | ||||||
|         const Commands = command.Collection(cmds); |         const Commands = command.Collection(cmds); | ||||||
|         const Self = @This(); |         const Self = @This(); | ||||||
|  | @ -37,6 +43,7 @@ pub fn Create(options: type) type { | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|         pub fn create(allocator: std.mem.Allocator, _: command.Context) !struct { tui.Mode, tui.MiniMode } { |         pub fn create(allocator: std.mem.Allocator, _: command.Context) !struct { tui.Mode, tui.MiniMode } { | ||||||
|  |             const mv = tui.mainview() orelse return error.NotFound; | ||||||
|             const self = try allocator.create(Self); |             const self = try allocator.create(Self); | ||||||
|             errdefer allocator.destroy(self); |             errdefer allocator.destroy(self); | ||||||
|             self.* = .{ |             self.* = .{ | ||||||
|  | @ -45,6 +52,11 @@ pub fn Create(options: type) type { | ||||||
|                 .query = std.ArrayList(u8).init(allocator), |                 .query = std.ArrayList(u8).init(allocator), | ||||||
|                 .match = std.ArrayList(u8).init(allocator), |                 .match = std.ArrayList(u8).init(allocator), | ||||||
|                 .entries = std.ArrayList(Entry).init(allocator), |                 .entries = std.ArrayList(Entry).init(allocator), | ||||||
|  |                 .modal = try ModalBackground.create(*Self, allocator, tui.mainview_widget(), .{ .ctx = self }), | ||||||
|  |                 .menu = try Menu.create(*Self, allocator, tui.plane(), .{ | ||||||
|  |                     .ctx = self, | ||||||
|  |                     .on_render = on_render_menu, | ||||||
|  |                 }), | ||||||
|             }; |             }; | ||||||
|             try self.commands.init(self); |             try self.commands.init(self); | ||||||
|             try tui.message_filters().add(MessageFilter.bind(self, receive_path_entry)); |             try tui.message_filters().add(MessageFilter.bind(self, receive_path_entry)); | ||||||
|  | @ -55,6 +67,9 @@ pub fn Create(options: type) type { | ||||||
|                 .insert_command = "mini_mode_insert_bytes", |                 .insert_command = "mini_mode_insert_bytes", | ||||||
|             }); |             }); | ||||||
|             mode.event_handler = EventHandler.to_owned(self); |             mode.event_handler = EventHandler.to_owned(self); | ||||||
|  |             try mv.floating_views.add(self.modal.widget()); | ||||||
|  |             try mv.floating_views.add(self.menu.container_widget); | ||||||
|  | 
 | ||||||
|             return .{ mode, .{ .name = options.name(self) } }; |             return .{ mode, .{ .name = options.name(self) } }; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | @ -353,5 +368,21 @@ pub fn Create(options: type) type { | ||||||
|             } |             } | ||||||
|             pub const mini_mode_paste_meta: Meta = .{ .arguments = &.{.string} }; |             pub const mini_mode_paste_meta: Meta = .{ .arguments = &.{.string} }; | ||||||
|         }; |         }; | ||||||
|  | 
 | ||||||
|  |         fn on_render_menu(self: *Self, button: *Button.State(*Menu.State(*Self)), theme: *const Widget.Theme, selected: bool) bool { | ||||||
|  |             const style_base = theme.editor_widget; | ||||||
|  |             const style_label = if (button.active) theme.editor_cursor else if (button.hover or selected) theme.editor_selection else theme.editor_widget; | ||||||
|  |             button.plane.set_base_style(style_base); | ||||||
|  |             button.plane.erase(); | ||||||
|  |             button.plane.home(); | ||||||
|  |             button.plane.set_style(style_label); | ||||||
|  |             message("{d}/{d}", .{ self.matched_entry + 1, self.entries.items.len }); | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         inline fn max_menu_width() usize { | ||||||
|  |             const width = tui.screen().w; | ||||||
|  |             return @max(15, width - (width / 5)); | ||||||
|  |         } | ||||||
|     }; |     }; | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue