vimamsa 0.1.10 → 0.1.11
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/README.md +20 -3
- data/custom_example.rb +11 -1
- data/demo.txt +2 -2
- data/exe/vimamsa +1 -1
- data/lib/vimamsa/ack.rb +57 -9
- data/lib/vimamsa/actions.rb +1 -1
- data/lib/vimamsa/buffer.rb +272 -44
- data/lib/vimamsa/buffer_list.rb +57 -16
- data/lib/vimamsa/buffer_manager.rb +19 -3
- data/lib/vimamsa/conf.rb +10 -1
- data/lib/vimamsa/debug.rb +7 -3
- data/lib/vimamsa/easy_jump.rb +9 -5
- data/lib/vimamsa/editor.rb +55 -41
- data/lib/vimamsa/file_finder.rb +70 -72
- data/lib/vimamsa/file_history.rb +2 -3
- data/lib/vimamsa/file_manager.rb +1 -1
- data/lib/vimamsa/form_generator.rb +122 -0
- data/lib/vimamsa/gui.rb +467 -120
- data/lib/vimamsa/gui_image.rb +12 -6
- data/lib/vimamsa/gui_menu.rb +26 -21
- data/lib/vimamsa/gui_select_window.rb +40 -21
- data/lib/vimamsa/gui_sourceview.rb +171 -78
- data/lib/vimamsa/hyper_plain_text.rb +34 -1
- data/lib/vimamsa/key_actions.rb +13 -1
- data/lib/vimamsa/key_binding_tree.rb +26 -14
- data/lib/vimamsa/key_bindings_vimlike.rb +54 -25
- data/lib/vimamsa/langservp.rb +172 -0
- data/lib/vimamsa/macro.rb +9 -8
- data/lib/vimamsa/main.rb +0 -1
- data/lib/vimamsa/rbvma.rb +7 -4
- data/lib/vimamsa/search.rb +2 -1
- data/lib/vimamsa/search_replace.rb +36 -106
- data/lib/vimamsa/util.rb +47 -1
- data/lib/vimamsa/version.rb +1 -1
- data/lib/vimamsa.rb +1 -6
- data/styles/molokai_edit.xml +3 -0
- data/vimamsa.gemspec +10 -10
- metadata +24 -22
data/lib/vimamsa/gui.rb
CHANGED
@@ -3,40 +3,42 @@ $idle_scroll_to_mark = false
|
|
3
3
|
def gui_open_file_dialog(dirpath)
|
4
4
|
dialog = Gtk::FileChooserDialog.new(:title => "Open file",
|
5
5
|
:action => :open,
|
6
|
-
:buttons => [[
|
7
|
-
[
|
8
|
-
dialog.set_current_folder(dirpath)
|
6
|
+
:buttons => [["Open", :accept],
|
7
|
+
["Cancel", :cancel]])
|
8
|
+
dialog.set_current_folder(Gio::File.new_for_path(dirpath))
|
9
|
+
# dialog.set_current_folder(Gio::File.new_for_path("/tmp"))
|
9
10
|
|
10
11
|
dialog.signal_connect("response") do |dialog, response_id|
|
11
12
|
if response_id == Gtk::ResponseType::ACCEPT
|
12
|
-
open_new_file(dialog.
|
13
|
-
# debug "uri = #{dialog.uri}"
|
13
|
+
open_new_file(dialog.file.parse_name)
|
14
14
|
end
|
15
15
|
dialog.destroy
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
|
+
dialog.modal = true
|
19
|
+
dialog.show
|
18
20
|
end
|
19
21
|
|
20
22
|
def gui_file_saveas(dirpath)
|
21
23
|
dialog = Gtk::FileChooserDialog.new(:title => "Save as",
|
22
24
|
:action => :save,
|
23
|
-
:buttons => [[
|
24
|
-
[
|
25
|
-
dialog.set_current_folder(dirpath)
|
25
|
+
:buttons => [["Save", :accept],
|
26
|
+
["Cancel", :cancel]])
|
27
|
+
# dialog.set_current_folder(dirpath) #TODO:gtk4
|
26
28
|
dialog.signal_connect("response") do |dialog, response_id|
|
27
29
|
if response_id == Gtk::ResponseType::ACCEPT
|
28
|
-
file_saveas(dialog.
|
30
|
+
file_saveas(dialog.file.parse_name)
|
29
31
|
end
|
30
32
|
dialog.destroy
|
31
33
|
end
|
32
34
|
|
33
|
-
dialog.
|
35
|
+
dialog.modal = true
|
36
|
+
dialog.show
|
34
37
|
end
|
35
38
|
|
36
39
|
def idle_func
|
37
40
|
# debug "IDLEFUNC"
|
38
41
|
if $idle_scroll_to_mark
|
39
|
-
# Ripl.start :binding => binding
|
40
42
|
# $view.get_visible_rect
|
41
43
|
vr = $view.visible_rect
|
42
44
|
|
@@ -46,7 +48,6 @@ def idle_func
|
|
46
48
|
iter = b.get_iter_at(:offset => b.cursor_position)
|
47
49
|
iterxy = $view.get_iter_location(iter)
|
48
50
|
# debug "ITERXY" + iterxy.inspect
|
49
|
-
# Ripl.start :binding => binding
|
50
51
|
|
51
52
|
intr = iterxy.intersect(vr)
|
52
53
|
if intr.nil?
|
@@ -90,21 +91,16 @@ def page_down
|
|
90
91
|
end
|
91
92
|
|
92
93
|
def paste_system_clipboard()
|
93
|
-
|
94
|
+
|
95
|
+
#TODO: Check if something useful in this old GTK3 code.
|
94
96
|
utf8_string = Gdk::Atom.intern("UTF8_STRING")
|
95
|
-
# x = clipboard.request_contents(utf8_string)
|
96
97
|
|
97
|
-
widget = Gtk::Invisible.new
|
98
98
|
clipboard = Gtk::Clipboard.get_default($vmag.window.display)
|
99
99
|
received_text = ""
|
100
100
|
|
101
101
|
target_string = Gdk::Selection::TARGET_STRING
|
102
102
|
ti = clipboard.request_contents(target_string)
|
103
103
|
|
104
|
-
# clipboard.request_contents(target_string) do |_clipboard, selection_data|
|
105
|
-
# received_text = selection_data.text
|
106
|
-
# debug "received_text=#{received_text}"
|
107
|
-
# end
|
108
104
|
if clipboard.wait_is_text_available?
|
109
105
|
received_text = clipboard.wait_for_text
|
110
106
|
end
|
@@ -123,12 +119,7 @@ def paste_system_clipboard()
|
|
123
119
|
end
|
124
120
|
|
125
121
|
def set_system_clipboard(arg)
|
126
|
-
|
127
|
-
# return if s.size < 1
|
128
|
-
# utf8_string = Gdk::Atom.intern("UTF8_STRING")
|
129
|
-
widget = Gtk::Invisible.new
|
130
|
-
clipboard = Gtk::Clipboard.get_default($vmag.window.display)
|
131
|
-
clipboard.text = arg
|
122
|
+
vma.gui.window.display.clipboard.set(arg)
|
132
123
|
end
|
133
124
|
|
134
125
|
def gui_create_buffer(id, bufo)
|
@@ -136,6 +127,9 @@ def gui_create_buffer(id, bufo)
|
|
136
127
|
buf1 = GtkSource::Buffer.new()
|
137
128
|
view = VSourceView.new(nil, bufo)
|
138
129
|
|
130
|
+
view.register_signals()
|
131
|
+
$debug = true
|
132
|
+
|
139
133
|
ssm = GtkSource::StyleSchemeManager.new
|
140
134
|
ssm.set_search_path(ssm.search_path << ppath("styles/"))
|
141
135
|
sty = ssm.get_scheme("molokai_edit")
|
@@ -179,73 +173,101 @@ def gui_set_buffer_contents(id, txt)
|
|
179
173
|
vma.gui.buffers[id].buffer.set_text(txt)
|
180
174
|
end
|
181
175
|
|
176
|
+
#TODO: remove
|
182
177
|
def gui_set_cursor_pos(id, pos)
|
183
178
|
vma.buf.view.set_cursor_pos(pos)
|
184
179
|
end
|
185
180
|
|
186
|
-
def
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
181
|
+
def gui_set_active_window(winid)
|
182
|
+
sw = vma.gui.sw
|
183
|
+
if winid == 2
|
184
|
+
sw = vma.gui.sw2
|
185
|
+
end
|
186
|
+
|
187
|
+
sw.set_child(view)
|
188
|
+
view.grab_focus
|
189
|
+
|
190
|
+
vma.gui.view = view
|
191
|
+
vma.gui.buf1 = view.buffer
|
192
192
|
$view = view
|
193
|
-
$vbuf =
|
193
|
+
$vbuf = view.buffer
|
194
|
+
end
|
194
195
|
|
195
|
-
|
196
|
-
|
196
|
+
#TODO:delete?
|
197
|
+
def gui_attach_buf_to_window(id, winid)
|
198
|
+
view = vma.gui.buffers[id]
|
199
|
+
sw = vma.gui.sw
|
200
|
+
if winid == 2
|
201
|
+
sw = vma.gui.sw2
|
202
|
+
end
|
197
203
|
|
204
|
+
sw.set_child(view)
|
198
205
|
view.grab_focus
|
199
|
-
view.set_cursor_visible(true)
|
200
|
-
view.place_cursor_onscreen
|
201
206
|
|
202
|
-
|
207
|
+
vma.gui.view = view
|
208
|
+
vma.gui.buf1 = view.buffer
|
209
|
+
$view = view
|
210
|
+
$vbuf = view.buffer
|
211
|
+
end
|
212
|
+
|
213
|
+
def gui_set_current_buffer(id)
|
214
|
+
vma.gui.set_current_buffer(id)
|
215
|
+
return
|
203
216
|
end
|
204
217
|
|
205
218
|
def gui_set_window_title(wtitle, subtitle = "")
|
206
219
|
$vmag.window.title = wtitle
|
207
|
-
$vmag.
|
220
|
+
# $vmag.subtitle.markup = "<span weight='ultrabold'>#{subtitle}</span>"
|
221
|
+
$vmag.subtitle.markup = "<span weight='light' size='small'>#{subtitle}</span>"
|
222
|
+
# $vmag.window.titlebar.subtitle = subtitle #TODO:gtk4
|
208
223
|
end
|
209
224
|
|
210
225
|
class VMAgui
|
211
|
-
attr_accessor :buffers, :sw, :view, :buf1, :window, :delex, :statnfo
|
212
|
-
|
213
|
-
VERSION = "1.0"
|
214
|
-
|
215
|
-
HEART = "♥"
|
216
|
-
RADIUS = 150
|
217
|
-
N_WORDS = 5
|
218
|
-
FONT = "Serif 18"
|
219
|
-
TEXT = "I ♥ GTK+"
|
226
|
+
attr_accessor :buffers, :sw, :sw1, :sw2, :view, :buf1, :window, :delex, :statnfo, :overlay, :overlay1, :overlay2, :sws, :two_c
|
227
|
+
attr_reader :two_column, :windows, :subtitle, :app
|
220
228
|
|
221
229
|
def initialize()
|
230
|
+
@two_column = false
|
231
|
+
@active_column = 1
|
222
232
|
@show_overlay = true
|
223
233
|
@da = nil
|
234
|
+
@sws = []
|
224
235
|
@buffers = {}
|
225
236
|
@view = nil
|
226
237
|
@buf1 = nil
|
227
238
|
@img_resizer_active = false
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
239
|
+
@windows = {}
|
240
|
+
@app = nil
|
241
|
+
# imgproc = proc {
|
242
|
+
# GLib::Idle.add(proc {
|
243
|
+
# if !buf.images.empty?
|
244
|
+
# vma.gui.scale_all_images
|
245
|
+
|
246
|
+
# w = Gtk::Window.new(:toplevel)
|
247
|
+
# w.set_default_size(1, 1)
|
248
|
+
# w.show_all
|
249
|
+
# Thread.new { sleep 0.1; w.destroy }
|
250
|
+
# end
|
251
|
+
|
252
|
+
# false
|
253
|
+
# })
|
254
|
+
# }
|
255
|
+
# @delex = DelayExecutioner.new(1, imgproc)
|
243
256
|
end
|
244
257
|
|
245
258
|
def run
|
246
259
|
init_window
|
247
260
|
# init_rtext
|
248
|
-
|
261
|
+
end
|
262
|
+
|
263
|
+
def quit
|
264
|
+
@window.destroy
|
265
|
+
@shutdown = true
|
266
|
+
for t in Thread.list
|
267
|
+
if t != Thread.current
|
268
|
+
t.exit
|
269
|
+
end
|
270
|
+
end
|
249
271
|
end
|
250
272
|
|
251
273
|
def delay_scale()
|
@@ -254,22 +276,21 @@ class VMAgui
|
|
254
276
|
end
|
255
277
|
|
256
278
|
def scale_all_images
|
257
|
-
|
279
|
+
debug "scale all", 2
|
258
280
|
for img in buf.images
|
259
281
|
if !img[:obj].destroyed?
|
260
282
|
img[:obj].scale_image
|
261
283
|
end
|
262
284
|
end
|
285
|
+
false
|
263
286
|
end
|
264
287
|
|
265
|
-
def handle_image_resize
|
288
|
+
def handle_image_resize #TODO:gtk4
|
266
289
|
return if @img_resizer_active == true
|
267
290
|
@dtime = Time.now
|
268
291
|
|
269
292
|
$gcrw = 0
|
270
293
|
vma.gui.window.signal_connect "configure-event" do |widget, cr|
|
271
|
-
# Ripl.start :binding => binding
|
272
|
-
|
273
294
|
if $gcrw != cr.width
|
274
295
|
@delex.run
|
275
296
|
end
|
@@ -283,12 +304,14 @@ class VMAgui
|
|
283
304
|
def start_overlay_draw()
|
284
305
|
@da = Gtk::Fixed.new
|
285
306
|
@overlay.add_overlay(@da)
|
286
|
-
|
307
|
+
|
308
|
+
# @overlay.set_overlay_pass_through(@da, true) #TODO:gtk4
|
287
309
|
end
|
288
310
|
|
289
311
|
def clear_overlay()
|
290
312
|
if @da != nil
|
291
|
-
@overlay.remove(@da)
|
313
|
+
# @overlay.remove(@da)
|
314
|
+
@overlay.remove_overlay(@da)
|
292
315
|
end
|
293
316
|
end
|
294
317
|
|
@@ -302,7 +325,7 @@ class VMAgui
|
|
302
325
|
end
|
303
326
|
|
304
327
|
def end_overlay_draw()
|
305
|
-
@da.
|
328
|
+
@da.show
|
306
329
|
end
|
307
330
|
|
308
331
|
def toggle_overlay
|
@@ -367,7 +390,7 @@ class VMAgui
|
|
367
390
|
|
368
391
|
# debug @view.pos_to_coord(300).inspect
|
369
392
|
|
370
|
-
@da.
|
393
|
+
@da.show
|
371
394
|
end
|
372
395
|
|
373
396
|
def handle_deltas()
|
@@ -388,6 +411,7 @@ class VMAgui
|
|
388
411
|
end
|
389
412
|
|
390
413
|
def add_to_minibuf(msg)
|
414
|
+
# return #TODO:gtk4
|
391
415
|
startiter = @minibuf.buffer.get_iter_at(:offset => 0)
|
392
416
|
@minibuf.buffer.insert(startiter, "#{msg}\n")
|
393
417
|
@minibuf.signal_emit("move-cursor", Gtk::MovementStep.new(:PAGES), -1, false)
|
@@ -398,12 +422,8 @@ class VMAgui
|
|
398
422
|
sw = Gtk::ScrolledWindow.new
|
399
423
|
sw.set_policy(:automatic, :automatic)
|
400
424
|
overlay = Gtk::Overlay.new
|
401
|
-
overlay.
|
402
|
-
|
403
|
-
@vbox.attach(overlay, 0, 2, 2, 1)
|
404
|
-
# overlay.set_size_request(-1, 50)
|
405
|
-
# $ovrl = overlay
|
406
|
-
# $ovrl.set_size_request(-1, 30)
|
425
|
+
overlay.set_child(sw)
|
426
|
+
@vbox.attach(overlay, 0, 3, 2, 1)
|
407
427
|
$sw2 = sw
|
408
428
|
sw.set_size_request(-1, 12)
|
409
429
|
|
@@ -418,22 +438,21 @@ class VMAgui
|
|
418
438
|
view.buffer.style_scheme = sty
|
419
439
|
provider = Gtk::CssProvider.new
|
420
440
|
# provider.load(data: "textview { font-family: Monospace; font-size: 11pt; }")
|
421
|
-
provider.load(data: "textview { font-family: Arial; font-size: 10pt; color:#
|
441
|
+
provider.load(data: "textview { font-family: Arial; font-size: 10pt; color:#eeeeee}")
|
422
442
|
view.style_context.add_provider(provider)
|
423
443
|
view.wrap_mode = :char
|
424
444
|
@minibuf = view
|
425
|
-
# Ripl.start :binding => binding
|
426
445
|
# startiter = view.buffer.get_iter_at(:offset => 0)
|
427
446
|
message("STARTUP")
|
428
|
-
sw.
|
447
|
+
sw.set_child(view)
|
429
448
|
end
|
430
449
|
|
431
450
|
def init_header_bar()
|
432
451
|
header = Gtk::HeaderBar.new
|
433
452
|
@header = header
|
434
453
|
header.show_close_button = true
|
435
|
-
header.title = ""
|
436
|
-
header.has_subtitle = true
|
454
|
+
# header.title = ""#TODO:gtk4
|
455
|
+
# header.has_subtitle = true#TODO:gtk4
|
437
456
|
header.subtitle = ""
|
438
457
|
|
439
458
|
# icon = Gio::ThemedIcon.new("mail-send-receive-symbolic")
|
@@ -513,55 +532,383 @@ class VMAgui
|
|
513
532
|
# @window.add(Gtk::TextView.new)
|
514
533
|
end
|
515
534
|
|
535
|
+
def debug_idle_func
|
536
|
+
return false if @shutdown == true
|
537
|
+
if Time.now - @last_debug_idle > 1
|
538
|
+
@last_debug_idle = Time.now
|
539
|
+
# puts "DEBUG IDLE #{Time.now}"
|
540
|
+
# @view.check_controllers
|
541
|
+
end
|
542
|
+
|
543
|
+
ctrl_fn = File.expand_path("~/.vimamsa/ripl_ctrl")
|
544
|
+
# Allows to debug in case keyboard handling is lost
|
545
|
+
if File.exist?(ctrl_fn)
|
546
|
+
File.delete(ctrl_fn)
|
547
|
+
start_ripl
|
548
|
+
end
|
549
|
+
|
550
|
+
sleep 0.02
|
551
|
+
return true
|
552
|
+
end
|
553
|
+
|
554
|
+
def reset_controllers
|
555
|
+
clist = @window.observe_controllers
|
556
|
+
to_remove = []
|
557
|
+
(0..(clist.n_items - 1)).each { |x|
|
558
|
+
ctr = clist.get_item(x)
|
559
|
+
if ctr.class == Gtk::EventControllerKey
|
560
|
+
to_remove << ctr
|
561
|
+
end
|
562
|
+
}
|
563
|
+
if to_remove.size > 0
|
564
|
+
puts "Removing controllers:"
|
565
|
+
pp to_remove
|
566
|
+
to_remove.each { |x| @window.remove_controller(x) }
|
567
|
+
end
|
568
|
+
|
569
|
+
press = Gtk::EventControllerKey.new
|
570
|
+
@press = press
|
571
|
+
# to prevent SourceView key handler capturing any keypresses
|
572
|
+
press.set_propagation_phase(Gtk::PropagationPhase::CAPTURE)
|
573
|
+
@window.add_controller(press)
|
574
|
+
|
575
|
+
press.signal_connect "key-pressed" do |gesture, keyval, keycode, y|
|
576
|
+
name = Gdk::Keyval.to_name(keyval)
|
577
|
+
uki = Gdk::Keyval.to_unicode(keyval)
|
578
|
+
keystr = uki.chr("UTF-8")
|
579
|
+
puts "key-pressed #{keyval} #{keycode} name:#{name} str:#{keystr} unicode:#{uki}"
|
580
|
+
buf.view.handle_key_event(keyval, keystr, :key_press)
|
581
|
+
true
|
582
|
+
end
|
583
|
+
|
584
|
+
press.signal_connect "modifiers" do |eventctr, modtype|
|
585
|
+
# eventctr: Gtk::EventControllerKey
|
586
|
+
# modtype: Gdk::ModifierType
|
587
|
+
debug "modifier change"
|
588
|
+
vma.kbd.modifiers[:ctrl] = modtype.control_mask?
|
589
|
+
vma.kbd.modifiers[:alt] = modtype.alt_mask?
|
590
|
+
vma.kbd.modifiers[:hyper] = modtype.hyper_mask?
|
591
|
+
vma.kbd.modifiers[:lock] = modtype.lock_mask?
|
592
|
+
vma.kbd.modifiers[:meta] = modtype.meta_mask?
|
593
|
+
vma.kbd.modifiers[:shift] = modtype.shift_mask?
|
594
|
+
vma.kbd.modifiers[:super] = modtype.super_mask?
|
595
|
+
|
596
|
+
#TODO:?
|
597
|
+
# button1_mask?
|
598
|
+
# ...
|
599
|
+
# button5_mask?
|
600
|
+
true
|
601
|
+
end
|
602
|
+
|
603
|
+
press.signal_connect "key-released" do |gesture, keyval, keycode, y|
|
604
|
+
name = Gdk::Keyval.to_name(keyval)
|
605
|
+
uki = Gdk::Keyval.to_unicode(keyval)
|
606
|
+
keystr = uki.chr("UTF-8")
|
607
|
+
puts "key released #{keyval} #{keycode} name:#{name} str:#{keystr} unicode:#{uki}"
|
608
|
+
buf.view.handle_key_event(keyval, keystr, :key_release)
|
609
|
+
# vma.kbd.match_key_conf(keystr, nil, :key_press)
|
610
|
+
# buf.view.handle_deltas
|
611
|
+
# buf.view.handle_key_event(keyval, keystr, :key_press)
|
612
|
+
true
|
613
|
+
end
|
614
|
+
end
|
615
|
+
|
616
|
+
def remove_extra_controllers
|
617
|
+
clist = vma.gui.window.observe_controllers
|
618
|
+
to_remove = []
|
619
|
+
(0..(clist.n_items - 1)).each { |x|
|
620
|
+
ctr = clist.get_item(x)
|
621
|
+
if ctr.class == Gtk::EventControllerKey and ctr != @press
|
622
|
+
to_remove << ctr
|
623
|
+
end
|
624
|
+
}
|
625
|
+
if to_remove.size > 0
|
626
|
+
puts "Removing controllers:"
|
627
|
+
pp to_remove
|
628
|
+
to_remove.each { |x| vma.gui.window.remove_controller(x) }
|
629
|
+
end
|
630
|
+
end
|
631
|
+
|
516
632
|
def init_window
|
517
|
-
@
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
633
|
+
@last_debug_idle = Time.now
|
634
|
+
app = Gtk::Application.new("net.samiddhi.vimamsa.r#{rand(1000)}", :flags_none)
|
635
|
+
@app = app
|
636
|
+
|
637
|
+
app.signal_connect "activate" do
|
638
|
+
|
639
|
+
# @window = Gtk::Window.new(:toplevel)
|
640
|
+
# @window = Gtk::Window.new()
|
641
|
+
@window = Gtk::ApplicationWindow.new(app)
|
642
|
+
@window.set_application(app)
|
643
|
+
|
644
|
+
# sh = @window.screen.height #TODO:gtk4
|
645
|
+
# sw = @window.screen.width #TODO:gtk4
|
646
|
+
# TODO:Maximise vertically
|
647
|
+
# @window.set_default_size((sw * 0.45).to_i, sh - 20) #TODO:gtk4
|
648
|
+
@window.set_default_size(800, 600)
|
649
|
+
|
650
|
+
@window.title = "Multiple Views"
|
651
|
+
@vpaned = Gtk::Paned.new(:vertical)
|
652
|
+
|
653
|
+
@vbox = Gtk::Grid.new()
|
654
|
+
@window.add(@vbox)
|
655
|
+
|
656
|
+
Thread.new {
|
657
|
+
GLib::Idle.add(proc { debug_idle_func })
|
658
|
+
}
|
659
|
+
|
660
|
+
reset_controllers
|
661
|
+
|
662
|
+
# @window.signal_connect("key-pressed") { puts "Hello World!" }
|
663
|
+
# @window.signal_connect("clicked") { puts "Hello World!" }
|
664
|
+
|
665
|
+
# @menubar = Gtk::PopoverMenuBar.new #TODO:gtk4
|
666
|
+
# @menubar.expand = false #TODO:gtk4
|
667
|
+
|
668
|
+
@sw = Gtk::ScrolledWindow.new
|
669
|
+
@sw.set_policy(:automatic, :automatic)
|
670
|
+
|
671
|
+
# @sw.signal_connect("clicked") { puts "Hello World!" }
|
672
|
+
# @sw.signal_connect("key-pressed") { puts "Hello World!" }
|
673
|
+
@overlay = Gtk::Overlay.new
|
674
|
+
# @overlay.add(@sw) #TODO:gtk4
|
675
|
+
@overlay.add_overlay(@sw) #TODO:gtk4
|
676
|
+
@overlay1 = @overlay
|
677
|
+
|
678
|
+
# init_header_bar #TODO:gtk4
|
679
|
+
|
680
|
+
@statnfo = Gtk::Label.new
|
681
|
+
@subtitle = Gtk::Label.new("")
|
682
|
+
@statbox = Gtk::Box.new(:horizontal, 2)
|
683
|
+
@statnfo.set_size_request(150, 10)
|
684
|
+
@statbox.pack_end(@subtitle, :expand => true, :fill => true, :padding => 0)
|
685
|
+
@statbox.pack_end(@statnfo, :expand => false, :fill => false, :padding => 0)
|
686
|
+
provider = Gtk::CssProvider.new
|
687
|
+
@statnfo.add_css_class("statnfo")
|
688
|
+
provider.load(data: "label.statnfo { background-color:#353535; font-size: 10pt; margin-top:2px; margin-bottom:2px; align:right;}")
|
689
|
+
|
690
|
+
provider = Gtk::CssProvider.new
|
691
|
+
@statnfo.style_context.add_provider(provider)
|
692
|
+
|
693
|
+
# numbers: left, top, width, height
|
694
|
+
@vbox.attach(@overlay, 0, 2, 2, 1)
|
695
|
+
@sw.vexpand = true
|
696
|
+
@sw.hexpand = true
|
697
|
+
|
698
|
+
# column, row, width height
|
699
|
+
@vbox.attach(@statbox, 1, 1, 1, 1)
|
700
|
+
|
701
|
+
@overlay.vexpand = true
|
702
|
+
@overlay.hexpand = true
|
703
|
+
|
704
|
+
init_minibuffer
|
705
|
+
|
706
|
+
# p = Gtk::Popover.new
|
707
|
+
|
708
|
+
name = "save"
|
709
|
+
window = @window
|
710
|
+
action = Gio::SimpleAction.new(name)
|
711
|
+
action.signal_connect "activate" do |_simple_action, _parameter|
|
712
|
+
dialog = Gtk::MessageDialog.new(:parent => window,
|
713
|
+
:flags => :destroy_with_parent,
|
714
|
+
:buttons => :close,
|
715
|
+
:message => "Action FOOBAR activated.")
|
716
|
+
dialog.signal_connect(:response) do
|
717
|
+
dialog.destroy
|
718
|
+
end
|
719
|
+
dialog.show
|
720
|
+
end
|
721
|
+
|
722
|
+
@window.add_action(action)
|
723
|
+
doc_actions = Gio::SimpleActionGroup.new
|
724
|
+
doc_actions.add_action(action)
|
522
725
|
|
523
|
-
|
524
|
-
|
525
|
-
|
726
|
+
act_quit = Gio::SimpleAction.new("quit")
|
727
|
+
app.add_action(act_quit)
|
728
|
+
act_quit.signal_connect "activate" do |_simple_action, _parameter|
|
729
|
+
window.destroy
|
730
|
+
exit!
|
731
|
+
end
|
526
732
|
|
527
|
-
|
528
|
-
|
733
|
+
menubar = Gio::Menu.new
|
734
|
+
app.menubar = menubar
|
735
|
+
@window.show_menubar = true
|
529
736
|
|
530
|
-
|
531
|
-
@menubar.expand = false
|
737
|
+
@menubar = menubar
|
532
738
|
|
533
|
-
|
534
|
-
|
535
|
-
@overlay = Gtk::Overlay.new
|
536
|
-
@overlay.add(@sw)
|
739
|
+
@windows[1] = { :sw => @sw, :overlay => @overlay, :id => 1 }
|
740
|
+
@active_window = @windows[1]
|
537
741
|
|
538
|
-
|
742
|
+
@window.show
|
539
743
|
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
744
|
+
press = Gtk::GestureClick.new
|
745
|
+
press.button = Gdk::BUTTON_SECONDARY
|
746
|
+
@window.add_controller(press)
|
747
|
+
press.signal_connect "pressed" do |gesture, n_press, x, y|
|
748
|
+
puts "FOOBARpressed"
|
749
|
+
# clear_surface(surface)
|
750
|
+
# drawing_area.queue_draw
|
751
|
+
end
|
752
|
+
@sw1 = @sw
|
753
|
+
|
754
|
+
prov = Gtk::CssProvider.new
|
755
|
+
# See gtk-4.9.4/gtk/theme/Default/_common.scss on how to theme
|
756
|
+
# gtksourceview/gtksourcestyleschemepreview.c
|
757
|
+
# gtksourceview/gtksourcestylescheme.c
|
758
|
+
prov.load(data: " headerbar { padding: 0 0px; min-height: 16px; border-width: 0 0 0px; border-style: solid; }
|
759
|
+
|
760
|
+
textview border.left gutter { color: #8aa; font-size:8pt; }
|
761
|
+
|
762
|
+
textview border.left gutter { padding: 0px 0px 0px 0px; margin: 0px 0px 0px 0px; color: #8aa; font-size:9pt; }
|
763
|
+
|
764
|
+
headerbar .title {
|
765
|
+
font-weight: bold;
|
766
|
+
font-size: 11pt;
|
767
|
+
color: #cdffee;
|
768
|
+
}
|
769
|
+
|
770
|
+
headerbar > windowhandle > box .start {
|
771
|
+
border-spacing: 6px;
|
772
|
+
}
|
773
|
+
|
774
|
+
headerbar windowcontrols button {
|
775
|
+
min-height: 15px;
|
776
|
+
min-width: 15px;
|
777
|
+
}
|
778
|
+
|
779
|
+
")
|
780
|
+
@window.style_context.add_provider(prov)
|
781
|
+
|
782
|
+
sc = Gtk::StyleContext.add_provider_for_display(Gdk::Display.default, prov)
|
783
|
+
|
784
|
+
vma.start
|
785
|
+
end
|
786
|
+
|
787
|
+
# Vimamsa::Menu.new(@menubar) #TODO:gtk4
|
788
|
+
app.run
|
789
|
+
|
790
|
+
# @window.show_all
|
791
|
+
# @window.show
|
792
|
+
end
|
793
|
+
|
794
|
+
def init_menu
|
795
|
+
Vimamsa::Menu.new(@menubar, @app)
|
796
|
+
end
|
797
|
+
|
798
|
+
def set_two_column
|
799
|
+
return if @two_column
|
800
|
+
# @window.set_default_size(800, 600) #TODO:gtk4
|
801
|
+
# @vpaned = Gtk::Paned.new(:vertical)
|
802
|
+
# @vbox = Gtk::Grid.new()
|
803
|
+
# @window.add(@vbox)
|
804
|
+
|
805
|
+
@sw2 = Gtk::ScrolledWindow.new
|
806
|
+
@sw2.set_policy(:automatic, :automatic)
|
807
|
+
@overlay2 = Gtk::Overlay.new
|
808
|
+
@overlay2.add_overlay(@sw2)
|
809
|
+
@pane = Gtk::Paned.new(:horizontal)
|
810
|
+
|
811
|
+
@windows[2] = { :sw => @sw2, :overlay => @overlay2, :id => 2 }
|
812
|
+
|
813
|
+
@vbox.remove(@overlay)
|
814
|
+
|
815
|
+
# numbers: left, top, width, height
|
816
|
+
@pane.set_start_child(@overlay)
|
817
|
+
@pane.set_end_child(@overlay2)
|
818
|
+
|
819
|
+
@vbox.attach(@pane, 0, 1, 2, 1)
|
820
|
+
|
821
|
+
@sw2.vexpand = true
|
822
|
+
@sw2.hexpand = true
|
823
|
+
|
824
|
+
@overlay2.vexpand = true
|
825
|
+
@overlay2.hexpand = true
|
544
826
|
|
545
|
-
|
546
|
-
|
547
|
-
@statnfo.override_background_color(Gtk::StateFlags::NORMAL, "#353535")
|
827
|
+
@sw2.show
|
828
|
+
@two_column = true
|
548
829
|
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
830
|
+
if vma.buffers.size > 1
|
831
|
+
last = vma.buffers.get_last_visited_id
|
832
|
+
set_buffer_to_window(last, 2)
|
833
|
+
else
|
834
|
+
bf = create_new_buffer "\n\n"
|
835
|
+
set_buffer_to_window(bf.id, 2)
|
836
|
+
end
|
837
|
+
end
|
838
|
+
|
839
|
+
def is_buffer_open(bufid)
|
840
|
+
openbufids = @windows.keys.collect { |x| @windows[x][:sw].child.bufo.id }
|
841
|
+
return openbufids.include?(bufid)
|
842
|
+
end
|
843
|
+
|
844
|
+
def toggle_active_window()
|
845
|
+
return if !@two_column
|
846
|
+
if @active_column == 1
|
847
|
+
set_active_window(2)
|
848
|
+
else
|
849
|
+
set_active_window(1)
|
850
|
+
end
|
851
|
+
|
852
|
+
vma.buffers.set_current_buffer_by_id(@sw.child.bufo.id)
|
853
|
+
end
|
555
854
|
|
556
|
-
|
557
|
-
|
855
|
+
def set_active_window(id)
|
856
|
+
return if !@two_column
|
857
|
+
return if id == @active_column
|
858
|
+
return if id == @active_window[:id]
|
558
859
|
|
559
|
-
|
860
|
+
if @windows[id].nil?
|
861
|
+
debug "No such window #{id}", 2
|
862
|
+
return
|
863
|
+
end
|
560
864
|
|
561
|
-
@
|
562
|
-
|
563
|
-
Vimamsa::Menu.new(@menubar)
|
865
|
+
@active_window = @windows[id]
|
866
|
+
@active_column = id #TODO: remove
|
564
867
|
|
565
|
-
@
|
868
|
+
@sw = @windows[id][:sw]
|
869
|
+
@overlay = @windows[id][:overlay]
|
870
|
+
|
871
|
+
#TODO: set buf & view of active window??
|
872
|
+
|
873
|
+
end
|
874
|
+
|
875
|
+
def set_buffer_to_window(bufid, winid)
|
876
|
+
view = @buffers[bufid]
|
877
|
+
debug "vma.gui.set_buffer_to_window(#{bufid}), winid=#{winid}"
|
878
|
+
buf1 = view.buffer
|
879
|
+
|
880
|
+
@windows[winid][:sw].set_child(view)
|
881
|
+
|
882
|
+
#TODO:???
|
883
|
+
# @view = view
|
884
|
+
# @buf1 = buf1
|
885
|
+
# $view = view ???
|
886
|
+
# $vbuf = buf1
|
887
|
+
|
888
|
+
end
|
889
|
+
|
890
|
+
def set_current_buffer(id)
|
891
|
+
view = @buffers[id]
|
892
|
+
debug "vma.gui.set_current_buffer(#{id}), view=#{view}"
|
893
|
+
buf1 = view.buffer
|
894
|
+
@view = view
|
895
|
+
@buf1 = buf1
|
896
|
+
$view = view
|
897
|
+
$vbuf = buf1
|
898
|
+
|
899
|
+
# If already open in another column
|
900
|
+
|
901
|
+
if @two_column and @active_column == 2 and id == @sw1.child.bufo.id
|
902
|
+
toggle_active_window
|
903
|
+
elsif @two_column and @active_column == 1 and id == @sw2.child.bufo.id
|
904
|
+
toggle_active_window
|
905
|
+
else
|
906
|
+
@sw.set_child(view)
|
907
|
+
end
|
908
|
+
view.grab_focus
|
909
|
+
# TODO:needed?
|
910
|
+
# view.set_cursor_visible(true)
|
911
|
+
# view.place_cursor_onscreen
|
912
|
+
# @sw.show
|
566
913
|
end
|
567
914
|
end
|