beniya 0.6.0 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/beniya/application.rb +4 -1
- data/lib/beniya/bookmark_manager.rb +173 -0
- data/lib/beniya/dialog_renderer.rb +127 -0
- data/lib/beniya/file_operations.rb +231 -0
- data/lib/beniya/file_preview.rb +11 -3
- data/lib/beniya/filter_manager.rb +114 -0
- data/lib/beniya/keybind_handler.rb +211 -671
- data/lib/beniya/logger.rb +103 -0
- data/lib/beniya/selection_manager.rb +79 -0
- data/lib/beniya/terminal_ui.rb +54 -25
- data/lib/beniya/text_utils.rb +92 -0
- data/lib/beniya/version.rb +1 -1
- data/lib/beniya/zoxide_integration.rb +188 -0
- data/lib/beniya.rb +9 -0
- metadata +10 -2
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Beniya
|
|
4
|
+
# Manages filtering of directory entries
|
|
5
|
+
class FilterManager
|
|
6
|
+
attr_reader :filter_query, :filter_mode
|
|
7
|
+
|
|
8
|
+
def initialize
|
|
9
|
+
@filter_mode = false
|
|
10
|
+
@filter_query = ''
|
|
11
|
+
@original_entries = []
|
|
12
|
+
@filtered_entries = []
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Start filter mode with the given entries
|
|
16
|
+
# @param entries [Array<Hash>] Directory entries to filter
|
|
17
|
+
def start_filter_mode(entries)
|
|
18
|
+
@filter_mode = true
|
|
19
|
+
@filter_query = ''
|
|
20
|
+
@original_entries = entries.dup
|
|
21
|
+
@filtered_entries = @original_entries.dup
|
|
22
|
+
true
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Handle filter input character
|
|
26
|
+
# @param key [String] Input key
|
|
27
|
+
# @return [Symbol] :exit_clear, :exit_keep, :continue, or :backspace_exit
|
|
28
|
+
def handle_filter_input(key)
|
|
29
|
+
case key
|
|
30
|
+
when "\e" # ESC - clear filter and exit
|
|
31
|
+
:exit_clear
|
|
32
|
+
when "\r", "\n" # Enter - keep filter and exit
|
|
33
|
+
:exit_keep
|
|
34
|
+
when "\u007f", "\b" # Backspace
|
|
35
|
+
if @filter_query.length > 0
|
|
36
|
+
@filter_query = @filter_query[0...-1]
|
|
37
|
+
apply_filter
|
|
38
|
+
:continue
|
|
39
|
+
else
|
|
40
|
+
:backspace_exit
|
|
41
|
+
end
|
|
42
|
+
else
|
|
43
|
+
# Printable characters (alphanumeric, symbols, Japanese, etc.)
|
|
44
|
+
if key.length == 1 && key.ord >= 32 && key.ord < 127 # ASCII printable
|
|
45
|
+
@filter_query += key
|
|
46
|
+
apply_filter
|
|
47
|
+
:continue
|
|
48
|
+
elsif key.bytesize > 1 # Multi-byte characters (Japanese, etc.)
|
|
49
|
+
@filter_query += key
|
|
50
|
+
apply_filter
|
|
51
|
+
:continue
|
|
52
|
+
else
|
|
53
|
+
# Ignore other keys (Ctrl+c, etc.)
|
|
54
|
+
:continue
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Apply filter to entries
|
|
60
|
+
# @return [Array<Hash>] Filtered entries
|
|
61
|
+
def apply_filter
|
|
62
|
+
if @filter_query.empty?
|
|
63
|
+
@filtered_entries = @original_entries.dup
|
|
64
|
+
else
|
|
65
|
+
query_downcase = @filter_query.downcase
|
|
66
|
+
@filtered_entries = @original_entries.select do |entry|
|
|
67
|
+
entry[:name].downcase.include?(query_downcase)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
@filtered_entries
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Clear filter mode
|
|
74
|
+
def clear_filter
|
|
75
|
+
@filter_mode = false
|
|
76
|
+
@filter_query = ''
|
|
77
|
+
@filtered_entries = []
|
|
78
|
+
@original_entries = []
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Exit filter mode while keeping the filter
|
|
82
|
+
def exit_filter_mode_keep_filter
|
|
83
|
+
@filter_mode = false
|
|
84
|
+
# Keep @filter_query and @filtered_entries
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Check if filter is active
|
|
88
|
+
# @return [Boolean]
|
|
89
|
+
def filter_active?
|
|
90
|
+
@filter_mode || !@filter_query.empty?
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# Get filtered entries
|
|
94
|
+
# @return [Array<Hash>]
|
|
95
|
+
def filtered_entries
|
|
96
|
+
@filtered_entries
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Update original entries (e.g., after directory refresh)
|
|
100
|
+
# @param entries [Array<Hash>] New entries
|
|
101
|
+
def update_entries(entries)
|
|
102
|
+
@original_entries = entries.dup
|
|
103
|
+
apply_filter if filter_active?
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Restart filter mode with existing query
|
|
107
|
+
# @param entries [Array<Hash>] Directory entries
|
|
108
|
+
def restart_filter_mode(entries)
|
|
109
|
+
@filter_mode = true
|
|
110
|
+
@original_entries = entries.dup if @original_entries.empty?
|
|
111
|
+
apply_filter
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|