-
Notifications
You must be signed in to change notification settings - Fork 0
/
many_file_editor.rb
280 lines (248 loc) · 9 KB
/
many_file_editor.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
#!/usr/bin/env ruby
# 2013-07
# Jesse Cummins
# https://github.com/jessc
# With inspiration from ashbb:
# https://github.com/shoes/shoes/issues/236#issuecomment-18843728
=begin
# bug list:
# At the bottom are methods in a class that should
# make it easier to DRY code, because very similar code
# can be abstracted into a method.
# Shoes doesn't seem to be powerful enough to do it, however.
# Since it's not, the code is here for reference of what
# doesn't seem to work. Hopefully some use for future
# people attempting to solve this Shoes issue.
# todo:
- make sure README is up to date
- work on file extension Apply button,
- so it applies, then if applied again,
- removes last extension
=end
class ManyFileEditor
def initialize(foobar)
main_window(foobar)
end
def main_window(foobar)
s = self
foobar.app do
@main_window =
# adding ":height => '95%'" on flow and stack causes
# an infinite scrolling window, which is a bug in Shoes
flow :margin => 10, :width => '98%' do
stack :width => '49%' do
para "Near-Filenames:"
@near_filenames = edit_box :width => '90%', :height => 150
flow do
button "Copy" do
self.clipboard = @near_filenames.text
end
button "Paste" do
@near_filenames.text = self.clipboard
end
button "Open File" do
filename = ask_open_file
@near_filenames.text = File.read(filename)
end
end
para "Regex:"
@regex = edit_line
@regex.text = '(bk_\w+)'
flow do
button "Copy" do
self.clipboard = @regex.text
end
button "Paste" do
@regex.text = self.clipboard
end
button "Apply" do
if @near_filenames.text
regex_to_use = Regexp.new @regex.text
applied_regex = @near_filenames.text.scan(regex_to_use).flatten
caught_filenames = ""
applied_regex.each { |file| caught_filenames += file + "\n" }
@fixed_files_box.text = caught_filenames
end
end
end
# bug:
# if Apply button is clicked, remove last .extension
# replace it with the new one in @file_extension
para "Add File Extension:"
@file_extension = edit_line
flow do
button "Copy" do
self.clipboard = @file_extension.text
end
button "Paste" do
@file_extension.text = self.clipboard
end
applied_already = false
button "Apply" do
# placeholder code:
# extension = @file_extension.text
# box_text = @fixed_files_box.text
# unless extension == ""
# box_text.map! do |line|
# # how do you validate that a line
# # ends with an extension (like .txt),
# # and if it does, replace the
# # extension with another?
# if line.ends_with? /(\.[^.]*$)/
# end
# end
# @fixed_files_box.text = box_text
# end
unless @file_extension.text == "" || applied_already
extension = @file_extension.text
old_text = @fixed_files_box.text
# bug:
# use .map! here to edit lines inplace
replacement_text = ""
old_text.each_line { |line| replacement_text += line.chomp + extension + "\n" }
@fixed_files_box.text = replacement_text
# bug:
# when switching back to the main window from the edit window,
# turn applied_already back to false
applied_already = true
end
end
end
end
stack :width => '49%' do
button "Choose Location of Files" do
@folder_location = ask_open_folder + "/"
@para_folder_loc.text = @folder_location
end
@para_folder_loc = para "No folder chosen yet.\n", :size => 8
stack do
para "Fixed Names:"
@fixed_files_box = edit_box :width => '90%', :height => 275
end
flow do
button "Copy" do
self.clipboard = @fixed_files_box.text
end
button "Paste" do
@fixed_files_box.text = self.clipboard
end
button "Open Files" do
if @fixed_files_box.text != ""
f_l = @folder_location
fixed = @fixed_files_box.text.split("\n")
@names_files = {}
@names_files[:short] = fixed
@names_files[:long] = fixed.map { |line| line = f_l + line }
# bug:
# Figure out why when the @main_window is hidden,
# the @names_files variable becomes nil or "".
# One way to get around this is to pass in
# the variables to the window, but this seems hackish
# bug:
# DRY this switch_window code into a method
@main_window.hide
@editing_window = s.editing_window(foobar, @names_files)
@editing_window.show
end
end
end
button "Clear Program" do
@near_filenames.text = ""
@regex.text = '(bk_\w+)'
# bug:
# when @names_files is cleared and Open Files button is pressed,
# the Editing Window is blank
@names_files = {}
@fixed_files_box.text = ""
@file_extension.text = ""
end
button "Quit App", {:right => 0, :bottom => 0} do
quit
end
end
end
end
end
def editing_window(foobar, names_files)
# bug:
# Why is @names_files not being sent across methods?
# file_list = @names_files
long_file_list = names_files[:long]
file_list = names_files[:short]
f = nil
foobar.app do
f = flow do
cur_file_num = 0
current_file_name = para "Editing: " + file_list[cur_file_num]
file_saved = para "", :size => 8
# bug:
# check that this edit_box will load/save
# correctly with UTF-8 characters
file_text = edit_box :margin => 10, :width => '98%', :height => 400 do
end
current_file_long_name = long_file_list[cur_file_num]
cur_file = File.open(current_file_long_name, mode="r+")
file_text.text = cur_file.read
button "Quit App" do
quit
end
button "Main Window" do
@editing_window.hide()
@main_window.show()
end
# bug:
# DRY this code
button "Save File" do
cur_file = File.open(current_file_long_name, mode="w")
cur_file.write(file_text.text)
cur_file.close
cur_file = File.open(current_file_long_name, mode="r+")
file_saved.text = " File Saved"
end
button "Previous File" do
file_saved.text = ""
cur_file_num -= 1 unless cur_file_num == 0
current_file_name.text = "Editing: " + file_list[cur_file_num]
current_file_long_name = long_file_list[cur_file_num]
cur_file = File.open(current_file_long_name, mode="r+")
file_text.text = cur_file.read
end
button "Next File" do
file_saved.text = ""
cur_file_num += 1 unless cur_file_num == file_list.length - 1
current_file_name.text = "Editing: " + file_list[cur_file_num]
current_file_long_name = long_file_list[cur_file_num]
cur_file = File.open(current_file_long_name, mode="r+")
file_text.text = cur_file.read
end
end
end
f
end
def switch_window(switch_to)
# See note at top about this not working.
# bug:
# When DRYing, put switching code here
if switch_to == "main_window"
elsif switch_to == "editing_window"
end
end
def get_file_list(long_path = false, folder_location)
# See note at top about this not working.
# bug:
# For some reason @folder_location is not being sent across methods?
# So instead have to pass in variable and set f_l to that.
# f_l = @folder_location
f_l = folder_location
@file_list = Dir.entries(f_l).select { |f| File.file?(f_l + "#{f}") }
if long_path
@file_list.map! { |f| f = f_l + "#{f}" }
end
@file_list
end
end
Shoes.app :title => "Many File Editor", :width => 700, :height => 525 do
@many_file_editor = ManyFileEditor.new(self)
end
=begin
=end