vimamsa 0.1.8 → 0.1.9
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/custom_example.rb +47 -0
- data/demo.txt +25 -0
- data/lang/hyperplaintext.lang +9 -25
- data/lib/vimamsa/ack.rb +90 -7
- data/lib/vimamsa/actions.rb +21 -2
- data/lib/vimamsa/buffer.rb +53 -49
- data/lib/vimamsa/debug.rb +1 -1
- data/lib/vimamsa/easy_jump.rb +13 -18
- data/lib/vimamsa/editor.rb +57 -54
- data/lib/vimamsa/encrypt.rb +1 -1
- data/lib/vimamsa/file_finder.rb +1 -3
- data/lib/vimamsa/gui.rb +76 -73
- data/lib/vimamsa/gui_image.rb +43 -0
- data/lib/vimamsa/gui_menu.rb +0 -1
- data/lib/vimamsa/gui_select_window.rb +3 -0
- data/lib/vimamsa/gui_sourceview.rb +41 -14
- data/lib/vimamsa/hyper_plain_text.rb +31 -10
- data/lib/vimamsa/key_actions.rb +37 -16
- data/lib/vimamsa/key_binding_tree.rb +37 -113
- data/lib/vimamsa/key_bindings_vimlike.rb +25 -23
- data/lib/vimamsa/rbvma.rb +12 -9
- data/lib/vimamsa/search_replace.rb +8 -4
- data/lib/vimamsa/text_transforms.rb +2 -0
- data/lib/vimamsa/util.rb +34 -0
- data/lib/vimamsa/version.rb +1 -1
- data/lib/vimamsa.rb +5 -0
- data/sheep.jpg +0 -0
- data/styles/dark.xml +1 -0
- data/styles/molokai_edit.xml +1 -1
- metadata +9 -5
data/lib/vimamsa/editor.rb
CHANGED
@@ -70,13 +70,6 @@ class Editor
|
|
70
70
|
end
|
71
71
|
|
72
72
|
def start
|
73
|
-
# $highlight = {}
|
74
|
-
|
75
|
-
# GLib::Idle.add
|
76
|
-
# Ripl.start :binding => binding
|
77
|
-
# GLib::Idle.add(proc{ debug "IDLEFUNC"})
|
78
|
-
# GLib::Idle.add(proc { idle_func })
|
79
|
-
|
80
73
|
@gui = $vmag #TODO
|
81
74
|
|
82
75
|
$hook = Hook.new
|
@@ -95,13 +88,15 @@ class Editor
|
|
95
88
|
# build_key_bindings_tree
|
96
89
|
@kbd = KeyBindingTree.new()
|
97
90
|
$kbd = @kbd
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
91
|
+
@kbd.add_mode("C", :command)
|
92
|
+
@kbd.add_mode("I", :insert)
|
93
|
+
@kbd.add_mode("V", :visual)
|
94
|
+
@kbd.add_mode("M", :minibuffer)
|
95
|
+
@kbd.add_mode("R", :readchar)
|
96
|
+
@kbd.add_mode("B", :browse)
|
97
|
+
@kbd.set_default_mode(:command)
|
98
|
+
@kbd.set_mode(:command)
|
99
|
+
@kbd.show_state_trail
|
105
100
|
require "vimamsa/key_bindings_vimlike"
|
106
101
|
sleep(0.03)
|
107
102
|
|
@@ -118,6 +113,14 @@ class Editor
|
|
118
113
|
end
|
119
114
|
listener.start
|
120
115
|
|
116
|
+
custom_fn = File.expand_path("~/.vimamsa/custom.rb")
|
117
|
+
if !File.exist?(custom_fn)
|
118
|
+
example_custom = IO.read(ppath("custom_example.rb"))
|
119
|
+
IO.write(custom_fn, example_custom)
|
120
|
+
end
|
121
|
+
|
122
|
+
mkdir_if_not_exists("~/.vimamsa/custom.rb")
|
123
|
+
|
121
124
|
$cnf[:theme] = "Twilight_edit"
|
122
125
|
$cnf[:syntax_highlight] = true
|
123
126
|
settings_path = get_dot_path("settings.rb")
|
@@ -132,6 +135,9 @@ class Editor
|
|
132
135
|
|
133
136
|
dotfile = read_file("", "~/.vimamsarc")
|
134
137
|
eval(dotfile) if dotfile
|
138
|
+
|
139
|
+
custom_script = read_file("", custom_fn)
|
140
|
+
eval(custom_script) if custom_script
|
135
141
|
|
136
142
|
# build_options
|
137
143
|
|
@@ -141,6 +147,8 @@ class Editor
|
|
141
147
|
if File.exist?(fname_)
|
142
148
|
fname = fname_
|
143
149
|
end
|
150
|
+
else
|
151
|
+
fname = ppath("demo.txt")
|
144
152
|
end
|
145
153
|
fname = ARGV[0] if ARGV.size >= 1 and File.file?(File.expand_path(ARGV[0]))
|
146
154
|
# vma.add_content_search_path(Dir.pwd)
|
@@ -189,11 +197,10 @@ class Editor
|
|
189
197
|
def buf()
|
190
198
|
return $buffer
|
191
199
|
end
|
192
|
-
|
200
|
+
|
193
201
|
def buffers()
|
194
202
|
return $buffers
|
195
203
|
end
|
196
|
-
|
197
204
|
|
198
205
|
def marshal_save(varname, vardata)
|
199
206
|
save_var_to_file(varname, Marshal.dump(vardata))
|
@@ -256,13 +263,18 @@ class Editor
|
|
256
263
|
@converters[converter_id].apply(txt)
|
257
264
|
end
|
258
265
|
|
266
|
+
# Used only by ack module at the moment
|
259
267
|
def get_content_search_paths()
|
260
268
|
r = @file_content_search_paths.clone
|
261
269
|
p = find_project_dir_of_cur_buffer()
|
270
|
+
if p.nil?
|
271
|
+
p = buf.dirname # Search dir of current file by default
|
272
|
+
end
|
262
273
|
|
263
274
|
if p and !@file_content_search_paths.include?(p)
|
264
275
|
r.insert(0, p)
|
265
276
|
end
|
277
|
+
|
266
278
|
return r
|
267
279
|
end
|
268
280
|
|
@@ -315,7 +327,7 @@ def set_clipboard(s)
|
|
315
327
|
debug s.inspect
|
316
328
|
debug [s, s.class, s.size]
|
317
329
|
log_error("s.class != String or s.size == 0")
|
318
|
-
Ripl.start :binding => binding
|
330
|
+
# Ripl.start :binding => binding
|
319
331
|
return
|
320
332
|
end
|
321
333
|
$clipboard << s
|
@@ -370,10 +382,17 @@ end
|
|
370
382
|
|
371
383
|
def show_key_bindings()
|
372
384
|
kbd_s = "❙Key bindings❙\n"
|
373
|
-
kbd_s << "
|
385
|
+
kbd_s << "\n⦁[Mode] keys : action⦁\n"
|
386
|
+
|
387
|
+
kbd_s << "[B]=Browse, [C]=Command, [I]=Insert, [V]=Visual\n"
|
388
|
+
kbd_s << "key!: Press key once, release before pressing any other keys\n"
|
389
|
+
|
390
|
+
kbd_s << "===============================================\n"
|
374
391
|
kbd_s << $kbd.to_s
|
375
|
-
kbd_s << "
|
376
|
-
create_new_file(nil, kbd_s)
|
392
|
+
kbd_s << "===============================================\n"
|
393
|
+
b = create_new_file(nil, kbd_s)
|
394
|
+
gui_set_file_lang(b.id, "hyperplaintext")
|
395
|
+
#
|
377
396
|
end
|
378
397
|
|
379
398
|
def diff_buffer()
|
@@ -451,6 +470,7 @@ end
|
|
451
470
|
GUESS_ENCODING_ORDER = [
|
452
471
|
Encoding::US_ASCII,
|
453
472
|
Encoding::UTF_8,
|
473
|
+
Encoding::ISO_8859_1,
|
454
474
|
Encoding::Shift_JIS,
|
455
475
|
Encoding::EUC_JP,
|
456
476
|
Encoding::EucJP_ms,
|
@@ -513,11 +533,23 @@ def load_buffer(fname)
|
|
513
533
|
#$buffer_history << $buffers.size - 1
|
514
534
|
end
|
515
535
|
|
516
|
-
def jump_to_file(filename, linenum =
|
536
|
+
def jump_to_file(filename, linenum = nil, charn = nil)
|
517
537
|
open_new_file(filename)
|
518
|
-
|
519
|
-
|
538
|
+
|
539
|
+
# Link to character position
|
540
|
+
if !charn.nil?
|
541
|
+
if charn == "c"
|
542
|
+
buf.jump_to_pos(linenum)
|
543
|
+
center_on_current_line
|
544
|
+
return
|
545
|
+
end
|
546
|
+
end
|
547
|
+
|
548
|
+
# Link to line
|
549
|
+
if !linenum.nil?
|
550
|
+
buf.jump_to_line(linenum)
|
520
551
|
center_on_current_line
|
552
|
+
return
|
521
553
|
end
|
522
554
|
end
|
523
555
|
|
@@ -547,40 +579,11 @@ def scan_word_start_marks(search_str)
|
|
547
579
|
return wsmarks
|
548
580
|
end
|
549
581
|
|
550
|
-
def draw_text(str, x, y)
|
551
|
-
vma.paint_stack << [4, x, y, str]
|
552
|
-
end
|
553
|
-
|
554
582
|
def hook_draw()
|
555
583
|
# TODO: as hook.register
|
556
584
|
# easy_jump_draw()
|
557
585
|
end
|
558
586
|
|
559
|
-
#TODO: delete this
|
560
|
-
def render_buffer(buffer = 0, reset = 0)
|
561
|
-
tmpbuf = $buffer.to_s
|
562
|
-
debug "pos:#{$buffer.pos} L:#{$buffer.lpos} C:#{$buffer.cpos}"
|
563
|
-
pos = $buffer.pos
|
564
|
-
selection_start = $buffer.selection_start
|
565
|
-
|
566
|
-
if $buffer.need_redraw?
|
567
|
-
reset = 1
|
568
|
-
end
|
569
|
-
t1 = Time.now
|
570
|
-
hook_draw()
|
571
|
-
|
572
|
-
if $buffer.need_redraw?
|
573
|
-
hpt_scan_images() if $debug #experimental
|
574
|
-
end
|
575
|
-
|
576
|
-
$buffer.highlight
|
577
|
-
if Time.now - t1 > 1 / 100.0
|
578
|
-
debug "SLOW render"
|
579
|
-
debug "Render time: #{Time.now - t1}"
|
580
|
-
end
|
581
|
-
$buffer.set_redrawed if reset == 1
|
582
|
-
end
|
583
|
-
|
584
587
|
def get_dot_path(sfx)
|
585
588
|
dot_dir = File.expand_path("~/.vimamsa")
|
586
589
|
Dir.mkdir(dot_dir) unless File.exist?(dot_dir)
|
@@ -591,10 +594,10 @@ end
|
|
591
594
|
def get_file_line_pointer(s)
|
592
595
|
#"/code/vimamsa/lib/vimamsa/buffer_select.rb:31:def"
|
593
596
|
# m = s.match(/(~[a-z]*)?\/.*\//)
|
594
|
-
m = s.match(/((~[a-z]*)?\/.*\/\S+):(\d+)/)
|
597
|
+
m = s.match(/((~[a-z]*)?\/.*\/\S+):(c?)(\d+)/)
|
595
598
|
if m != nil
|
596
599
|
if File.exist?(File.expand_path(m[1]))
|
597
|
-
return [m[1], m[
|
600
|
+
return [m[1], m[4].to_i, m[3]]
|
598
601
|
end
|
599
602
|
end
|
600
603
|
return nil
|
data/lib/vimamsa/encrypt.rb
CHANGED
@@ -38,7 +38,7 @@ end
|
|
38
38
|
|
39
39
|
def encrypt_cur_buffer()
|
40
40
|
callback = proc{|x|encrypt_cur_buffer_callback(x)}
|
41
|
-
gui_one_input_action("Encrypt", "Password:", "Encrypt", callback)
|
41
|
+
gui_one_input_action("Encrypt", "Password:", "Encrypt", callback,{:hide=>true})
|
42
42
|
end
|
43
43
|
|
44
44
|
def encrypt_cur_buffer_callback(password,b=nil)
|
data/lib/vimamsa/file_finder.rb
CHANGED
@@ -41,9 +41,7 @@ def recursively_find_files()
|
|
41
41
|
for d in $search_dirs
|
42
42
|
debug("FIND FILEs IN #{d}")
|
43
43
|
dlist = dlist + Dir.glob("#{d}/**/*").select { |e| File.file?(e) and $find_extensions.include?(File.extname(e)) }
|
44
|
-
|
45
|
-
end
|
46
|
-
#$dir_list = Dir.glob('./**/*').select { |e| File.file? e }
|
44
|
+
debug("FIND FILEs IN #{d} END") end #$dir_list = Dir.glob('./**/*').select { |e| File.file? e }
|
47
45
|
debug("END find files2")
|
48
46
|
$dir_list = dlist
|
49
47
|
debug("END find files")
|
data/lib/vimamsa/gui.rb
CHANGED
@@ -131,32 +131,28 @@ def set_system_clipboard(arg)
|
|
131
131
|
clipboard.text = arg
|
132
132
|
end
|
133
133
|
|
134
|
-
def gui_create_buffer(id)
|
134
|
+
def gui_create_buffer(id, bufo)
|
135
135
|
debug "gui_create_buffer(#{id})"
|
136
136
|
buf1 = GtkSource::Buffer.new()
|
137
|
-
view = VSourceView.new()
|
138
|
-
|
139
|
-
view.set_highlight_current_line(true)
|
140
|
-
view.set_show_line_numbers(true)
|
141
|
-
view.set_buffer(buf1)
|
137
|
+
view = VSourceView.new(nil, bufo)
|
142
138
|
|
143
139
|
ssm = GtkSource::StyleSchemeManager.new
|
144
140
|
ssm.set_search_path(ssm.search_path << ppath("styles/"))
|
145
|
-
# sty = ssm.get_scheme("dark")
|
146
141
|
sty = ssm.get_scheme("molokai_edit")
|
147
|
-
# debug ssm.scheme_ids
|
148
142
|
|
149
|
-
|
150
|
-
|
143
|
+
buf1.highlight_matching_brackets = true
|
144
|
+
buf1.style_scheme = sty
|
145
|
+
|
146
|
+
view.set_highlight_current_line(true)
|
147
|
+
view.set_show_line_numbers(true)
|
148
|
+
view.set_buffer(buf1)
|
151
149
|
|
152
150
|
provider = Gtk::CssProvider.new
|
153
151
|
provider.load(data: "textview { font-family: Monospace; font-size: 11pt; }")
|
154
|
-
# provider.load(data: "textview { font-family: Arial; font-size: 12pt; }")
|
155
152
|
view.style_context.add_provider(provider)
|
156
153
|
view.wrap_mode = :char
|
157
154
|
view.set_tab_width(conf(:tab_width))
|
158
155
|
|
159
|
-
|
160
156
|
$vmag.buffers[id] = view
|
161
157
|
end
|
162
158
|
|
@@ -178,20 +174,13 @@ end
|
|
178
174
|
def gui_select_window_close(arg = nil)
|
179
175
|
end
|
180
176
|
|
181
|
-
# def set_window_title(str)
|
182
|
-
# unimplemented
|
183
|
-
# end
|
184
|
-
|
185
177
|
def gui_set_buffer_contents(id, txt)
|
186
|
-
# $vbuf.set_text(txt)
|
187
178
|
debug "gui_set_buffer_contents(#{id}, txt)"
|
188
|
-
|
189
|
-
$vmag.buffers[id].buffer.set_text(txt)
|
179
|
+
vma.gui.buffers[id].buffer.set_text(txt)
|
190
180
|
end
|
191
181
|
|
192
182
|
def gui_set_cursor_pos(id, pos)
|
193
|
-
|
194
|
-
# Ripl.start :binding => binding
|
183
|
+
vma.buf.view.set_cursor_pos(pos)
|
195
184
|
end
|
196
185
|
|
197
186
|
def gui_set_current_buffer(id)
|
@@ -207,17 +196,9 @@ def gui_set_current_buffer(id)
|
|
207
196
|
$vmag.sw.add(view)
|
208
197
|
|
209
198
|
view.grab_focus
|
210
|
-
#view.set_focus(10)
|
211
199
|
view.set_cursor_visible(true)
|
212
|
-
#view.move_cursor(1, 1, false)
|
213
200
|
view.place_cursor_onscreen
|
214
201
|
|
215
|
-
#TODO:
|
216
|
-
# itr = view.buffer.get_iter_at(:offset => 0)
|
217
|
-
# view.buffer.place_cursor(itr)
|
218
|
-
|
219
|
-
# wtitle = ""
|
220
|
-
# wtitle = buf.fname if !buf.fname.nil?
|
221
202
|
$vmag.sw.show_all
|
222
203
|
end
|
223
204
|
|
@@ -227,7 +208,7 @@ def gui_set_window_title(wtitle, subtitle = "")
|
|
227
208
|
end
|
228
209
|
|
229
210
|
class VMAgui
|
230
|
-
attr_accessor :buffers, :sw, :view, :buf1, :window
|
211
|
+
attr_accessor :buffers, :sw, :view, :buf1, :window, :delex, :statnfo
|
231
212
|
|
232
213
|
VERSION = "1.0"
|
233
214
|
|
@@ -243,6 +224,22 @@ class VMAgui
|
|
243
224
|
@buffers = {}
|
244
225
|
@view = nil
|
245
226
|
@buf1 = nil
|
227
|
+
@img_resizer_active = false
|
228
|
+
imgproc = proc {
|
229
|
+
GLib::Idle.add(proc {
|
230
|
+
if !buf.images.empty?
|
231
|
+
vma.gui.scale_all_images
|
232
|
+
|
233
|
+
w = Gtk::Window.new(:toplevel)
|
234
|
+
w.set_default_size(1, 1)
|
235
|
+
w.show_all
|
236
|
+
Thread.new { sleep 0.1; w.destroy }
|
237
|
+
end
|
238
|
+
|
239
|
+
false
|
240
|
+
})
|
241
|
+
}
|
242
|
+
@delex = DelayExecutioner.new(1, imgproc)
|
246
243
|
end
|
247
244
|
|
248
245
|
def run
|
@@ -251,6 +248,38 @@ class VMAgui
|
|
251
248
|
Gtk.main
|
252
249
|
end
|
253
250
|
|
251
|
+
def delay_scale()
|
252
|
+
if Time.now - @dtime > 2.0
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
def scale_all_images
|
257
|
+
# puts "scale all"
|
258
|
+
for img in buf.images
|
259
|
+
if !img[:obj].destroyed?
|
260
|
+
img[:obj].scale_image
|
261
|
+
end
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
def handle_image_resize
|
266
|
+
return if @img_resizer_active == true
|
267
|
+
@dtime = Time.now
|
268
|
+
|
269
|
+
$gcrw = 0
|
270
|
+
vma.gui.window.signal_connect "configure-event" do |widget, cr|
|
271
|
+
# Ripl.start :binding => binding
|
272
|
+
|
273
|
+
if $gcrw != cr.width
|
274
|
+
@delex.run
|
275
|
+
end
|
276
|
+
$gcrw = cr.width
|
277
|
+
false
|
278
|
+
end
|
279
|
+
|
280
|
+
@img_resizer_active = true
|
281
|
+
end
|
282
|
+
|
254
283
|
def start_overlay_draw()
|
255
284
|
@da = Gtk::Fixed.new
|
256
285
|
@overlay.add_overlay(@da)
|
@@ -267,7 +296,7 @@ class VMAgui
|
|
267
296
|
# debug "overlay_draw_text #{[x,y]}"
|
268
297
|
(x, y) = @view.pos_to_coord(textpos)
|
269
298
|
# debug "overlay_draw_text #{[x,y]}"
|
270
|
-
label = Gtk::Label.new("<span background='#
|
299
|
+
label = Gtk::Label.new("<span background='#000000ff' foreground='#ff0000' weight='ultrabold'>#{text}</span>")
|
271
300
|
label.use_markup = true
|
272
301
|
@da.put(label, x, y)
|
273
302
|
end
|
@@ -371,7 +400,7 @@ class VMAgui
|
|
371
400
|
overlay = Gtk::Overlay.new
|
372
401
|
overlay.add(sw)
|
373
402
|
# @vpaned.pack2(overlay, :resize => false)
|
374
|
-
@vbox.attach(overlay, 0, 2,
|
403
|
+
@vbox.attach(overlay, 0, 2, 2, 1)
|
375
404
|
# overlay.set_size_request(-1, 50)
|
376
405
|
# $ovrl = overlay
|
377
406
|
# $ovrl.set_size_request(-1, 30)
|
@@ -385,7 +414,7 @@ class VMAgui
|
|
385
414
|
ssm = GtkSource::StyleSchemeManager.new
|
386
415
|
ssm.set_search_path(ssm.search_path << ppath("styles/"))
|
387
416
|
sty = ssm.get_scheme("molokai_edit")
|
388
|
-
view.buffer.highlight_matching_brackets = false
|
417
|
+
view.buffer.highlight_matching_brackets = false #TODO
|
389
418
|
view.buffer.style_scheme = sty
|
390
419
|
provider = Gtk::CssProvider.new
|
391
420
|
# provider.load(data: "textview { font-family: Monospace; font-size: 11pt; }")
|
@@ -406,7 +435,6 @@ class VMAgui
|
|
406
435
|
header.title = ""
|
407
436
|
header.has_subtitle = true
|
408
437
|
header.subtitle = ""
|
409
|
-
# Ripl.start :binding => binding
|
410
438
|
|
411
439
|
# icon = Gio::ThemedIcon.new("mail-send-receive-symbolic")
|
412
440
|
# icon = Gio::ThemedIcon.new("document-open-symbolic")
|
@@ -482,32 +510,7 @@ class VMAgui
|
|
482
510
|
|
483
511
|
header.pack_start(box)
|
484
512
|
@window.titlebar = header
|
485
|
-
@window.add(Gtk::TextView.new)
|
486
|
-
end
|
487
|
-
|
488
|
-
def create_menu_item(label, depth)
|
489
|
-
menuitem = Gtk::MenuItem.new(:label => label)
|
490
|
-
menuitem.submenu = create_menu(depth)
|
491
|
-
@menubar.append(menuitem)
|
492
|
-
end
|
493
|
-
|
494
|
-
def create_menu(depth)
|
495
|
-
return nil if depth < 1
|
496
|
-
|
497
|
-
menu = Gtk::Menu.new
|
498
|
-
last_item = nil
|
499
|
-
(0..5).each do |i|
|
500
|
-
j = i + 1
|
501
|
-
label = "item #{depth} - #{j}"
|
502
|
-
menu_item = Gtk::RadioMenuItem.new(nil, label)
|
503
|
-
menu_item.join_group(last_item) if last_item
|
504
|
-
last_item = menu_item
|
505
|
-
menu.append(menu_item)
|
506
|
-
menu_item.sensitive = false if i == 3
|
507
|
-
menu_item.submenu = create_menu(depth - 1)
|
508
|
-
end
|
509
|
-
|
510
|
-
menu
|
513
|
+
# @window.add(Gtk::TextView.new)
|
511
514
|
end
|
512
515
|
|
513
516
|
def init_window
|
@@ -515,10 +518,8 @@ class VMAgui
|
|
515
518
|
@window.set_default_size(650, 850)
|
516
519
|
@window.title = "Multiple Views"
|
517
520
|
@window.show_all
|
518
|
-
# vpaned = Gtk::Paned.new(:horizontal)
|
519
521
|
@vpaned = Gtk::Paned.new(:vertical)
|
520
|
-
|
521
|
-
# @vbox = Gtk::Box.new(:vertical, 0)
|
522
|
+
|
522
523
|
@vbox = Gtk::Grid.new()
|
523
524
|
@window.add(@vbox)
|
524
525
|
|
@@ -530,20 +531,21 @@ class VMAgui
|
|
530
531
|
@overlay = Gtk::Overlay.new
|
531
532
|
@overlay.add(@sw)
|
532
533
|
|
533
|
-
# @vpaned.pack1(@overlay, :resize => true)
|
534
|
-
# @vpaned.pack2(@menubar, :resize => false)
|
535
|
-
# @vbox.add(@menubar, :resize => false)
|
536
|
-
|
537
534
|
init_header_bar
|
538
535
|
|
539
|
-
|
536
|
+
@statnfo = Gtk::Label.new
|
537
|
+
provider = Gtk::CssProvider.new
|
538
|
+
provider.load(data: "textview { background-color:#353535; font-family: Monospace; font-size: 10pt; margin-top:4px;}")
|
539
|
+
@statnfo.style_context.add_provider(provider)
|
540
540
|
|
541
|
-
#
|
542
|
-
#
|
543
|
-
|
544
|
-
|
541
|
+
# Deprecated, but found no other way to do it. css doesn't work.
|
542
|
+
# TODO: should select color automatically from theme
|
543
|
+
@statnfo.override_background_color(Gtk::StateFlags::NORMAL, "#353535")
|
544
|
+
|
545
|
+
# column, row, width height
|
545
546
|
@vbox.attach(@menubar, 0, 0, 1, 1)
|
546
|
-
@vbox.attach(@
|
547
|
+
@vbox.attach(@statnfo, 1, 0, 1, 1)
|
548
|
+
@vbox.attach(@overlay, 0, 1, 2, 1)
|
547
549
|
@overlay.vexpand = true
|
548
550
|
@overlay.hexpand = true
|
549
551
|
|
@@ -555,6 +557,7 @@ class VMAgui
|
|
555
557
|
@window.show_all
|
556
558
|
vma.start
|
557
559
|
Vimamsa::Menu.new(@menubar)
|
560
|
+
|
558
561
|
@window.show_all
|
559
562
|
end
|
560
563
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
|
2
|
+
# Following this example:
|
3
|
+
# https://gabmus.org/posts/create_an_auto-resizing_image_widget_with_gtk3_and_python/
|
4
|
+
class ResizableImage < Gtk::DrawingArea
|
5
|
+
attr_accessor :fpath, :pixbuf, :oldimg, :draw_image, :view
|
6
|
+
|
7
|
+
def initialize(fpath, view)
|
8
|
+
@fpath = fpath
|
9
|
+
@pixbuf = GdkPixbuf::Pixbuf.new(:file => fpath)
|
10
|
+
@oldimg = @pixbuf
|
11
|
+
@draw_image = @pixbuf
|
12
|
+
@view = view
|
13
|
+
|
14
|
+
super()
|
15
|
+
end
|
16
|
+
|
17
|
+
# Scale to fit window width
|
18
|
+
def scale_image()
|
19
|
+
pb = @pixbuf
|
20
|
+
view = @view
|
21
|
+
imglimit = view.visible_rect.width - 10
|
22
|
+
|
23
|
+
if @oldimg.width > imglimit or @oldimg.width < imglimit - 10
|
24
|
+
nwidth = imglimit
|
25
|
+
nwidth = pb.width if pb.width < imglimit
|
26
|
+
nheight = (pb.height * (nwidth.to_f / pb.width)).to_i
|
27
|
+
pb = pb.scale_simple(nwidth, nheight, GdkPixbuf::InterpType::HYPER)
|
28
|
+
else
|
29
|
+
pb = @oldimg
|
30
|
+
end
|
31
|
+
@draw_image = pb
|
32
|
+
@oldimg = pb
|
33
|
+
self.set_size_request(pb.width, pb.height)
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
def do_draw(da, cr)
|
38
|
+
# puts @fpath
|
39
|
+
cr.set_source_pixbuf(@draw_image, 0, 0)
|
40
|
+
cr.paint
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
data/lib/vimamsa/gui_menu.rb
CHANGED
@@ -45,7 +45,6 @@ module Vimamsa
|
|
45
45
|
add_to_menu "Actions.experimental.DisableDebug", { :label => "Disable debug", :action => :disable_debug }
|
46
46
|
add_to_menu "Actions.experimental.ShowImages", { :label => "Show images ⟦img:path⟧", :action => :show_images }
|
47
47
|
|
48
|
-
|
49
48
|
add_to_menu "Actions.EncryptFile", { :label => "Encrypt file", :action => :encrypt_file }
|
50
49
|
add_to_menu "Help.KeyBindings", { :label => "Show key bindings", :action => :show_key_bindings }
|
51
50
|
|
@@ -1,6 +1,9 @@
|
|
1
1
|
def gui_select_update_window(item_list, jump_keys, select_callback, update_callback, opt={})
|
2
2
|
$selup = SelectUpdateWindow.new(nil, item_list, jump_keys, select_callback, update_callback, opt)
|
3
3
|
$selup.run
|
4
|
+
# opt fields:
|
5
|
+
# :title
|
6
|
+
# :desc
|
4
7
|
end
|
5
8
|
|
6
9
|
class SelectUpdateWindow
|
@@ -1,11 +1,30 @@
|
|
1
1
|
|
2
|
+
|
3
|
+
# class VSourceView < Gtk::TextView
|
2
4
|
class VSourceView < GtkSource::View
|
3
|
-
|
5
|
+
attr_accessor :bufo
|
6
|
+
# :highlight_matching_brackets
|
7
|
+
|
8
|
+
# def set_highlight_current_line(vbool)
|
9
|
+
# end
|
10
|
+
|
11
|
+
# def set_show_line_numbers(vbool)
|
12
|
+
# end
|
13
|
+
|
14
|
+
# def highlight_matching_brackets=(vbool)
|
15
|
+
# end
|
16
|
+
|
17
|
+
|
18
|
+
def initialize(title = nil,bufo=nil)
|
4
19
|
# super(:toplevel)
|
20
|
+
@highlight_matching_brackets = true
|
5
21
|
super()
|
22
|
+
@bufo = bufo #object of Buffer class buffer.rb
|
6
23
|
debug "vsource init"
|
7
24
|
@last_keyval = nil
|
8
25
|
@last_event = [nil, nil]
|
26
|
+
self.drag_dest_add_image_targets
|
27
|
+
self.drag_dest_add_uri_targets
|
9
28
|
|
10
29
|
signal_connect "button-press-event" do |_widget, event|
|
11
30
|
if event.button == Gdk::BUTTON_PRIMARY
|
@@ -19,6 +38,20 @@ class VSourceView < GtkSource::View
|
|
19
38
|
end
|
20
39
|
end
|
21
40
|
|
41
|
+
signal_connect("drag-data-received") do |widget, event, x, y, data, info, time|
|
42
|
+
puts "drag-data-received"
|
43
|
+
puts
|
44
|
+
if data.uris.size >= 1
|
45
|
+
imgpath = CGI.unescape(data.uris[0])
|
46
|
+
m = imgpath.match(/^file:\/\/(.*)/)
|
47
|
+
if m
|
48
|
+
fp = m[1]
|
49
|
+
handle_drag_and_drop(fp)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
true
|
53
|
+
end
|
54
|
+
|
22
55
|
signal_connect("key_press_event") do |widget, event|
|
23
56
|
handle_key_event(event, :key_press_event)
|
24
57
|
true
|
@@ -141,7 +174,7 @@ class VSourceView < GtkSource::View
|
|
141
174
|
|
142
175
|
def handle_deltas()
|
143
176
|
any_change = false
|
144
|
-
while d =
|
177
|
+
while d = @bufo.deltas.shift
|
145
178
|
any_change = true
|
146
179
|
pos = d[0]
|
147
180
|
op = d[1]
|
@@ -157,7 +190,7 @@ class VSourceView < GtkSource::View
|
|
157
190
|
end
|
158
191
|
end
|
159
192
|
if any_change
|
160
|
-
gui_set_cursor_pos(
|
193
|
+
gui_set_cursor_pos(@bufo.id, @bufo.pos) #TODO: only when necessary
|
161
194
|
end
|
162
195
|
|
163
196
|
# sanity_check #TODO
|
@@ -269,26 +302,20 @@ class VSourceView < GtkSource::View
|
|
269
302
|
|
270
303
|
def draw_cursor
|
271
304
|
if is_command_mode
|
272
|
-
itr = buffer.get_iter_at(:offset =>
|
273
|
-
itr2 = buffer.get_iter_at(:offset =>
|
305
|
+
itr = buffer.get_iter_at(:offset => @bufo.pos)
|
306
|
+
itr2 = buffer.get_iter_at(:offset => @bufo.pos + 1)
|
274
307
|
$view.buffer.select_range(itr, itr2)
|
275
|
-
elsif
|
308
|
+
elsif @bufo.visual_mode?
|
276
309
|
debug "VISUAL MODE"
|
277
|
-
(_start, _end) =
|
310
|
+
(_start, _end) = @bufo.get_visual_mode_range2
|
278
311
|
debug "#{_start}, #{_end}"
|
279
312
|
itr = buffer.get_iter_at(:offset => _start)
|
280
313
|
itr2 = buffer.get_iter_at(:offset => _end + 1)
|
281
314
|
$view.buffer.select_range(itr, itr2)
|
282
315
|
else # Insert mode
|
283
|
-
itr = buffer.get_iter_at(:offset =>
|
316
|
+
itr = buffer.get_iter_at(:offset => @bufo.pos)
|
284
317
|
$view.buffer.select_range(itr, itr)
|
285
318
|
debug "INSERT MODE"
|
286
319
|
end
|
287
320
|
end
|
288
|
-
|
289
|
-
# def quit
|
290
|
-
# destroy
|
291
|
-
# true
|
292
|
-
# end
|
293
321
|
end
|
294
|
-
|