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.
@@ -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