vimamsa 0.1.9 → 0.1.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +29 -7
- data/custom_example.rb +12 -2
- data/demo.txt +2 -2
- data/exe/vimamsa +1 -1
- data/lib/vimamsa/ack.rb +57 -46
- data/lib/vimamsa/actions.rb +1 -1
- data/lib/vimamsa/buffer.rb +287 -55
- data/lib/vimamsa/buffer_list.rb +83 -48
- data/lib/vimamsa/buffer_manager.rb +19 -3
- data/lib/vimamsa/conf.rb +10 -1
- data/lib/vimamsa/debug.rb +15 -11
- data/lib/vimamsa/easy_jump.rb +9 -5
- data/lib/vimamsa/editor.rb +73 -54
- data/lib/vimamsa/encrypt.rb +2 -2
- data/lib/vimamsa/file_finder.rb +70 -72
- data/lib/vimamsa/file_history.rb +2 -3
- data/lib/vimamsa/file_manager.rb +10 -8
- data/lib/vimamsa/form_generator.rb +122 -0
- data/lib/vimamsa/gui.rb +469 -118
- 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 +173 -79
- data/lib/vimamsa/hyper_plain_text.rb +36 -3
- data/lib/vimamsa/key_actions.rb +13 -1
- data/lib/vimamsa/key_binding_tree.rb +32 -20
- 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 +3 -4
- data/lib/vimamsa/rbvma.rb +7 -4
- data/lib/vimamsa/search.rb +3 -2
- data/lib/vimamsa/search_replace.rb +50 -120
- data/lib/vimamsa/text_transforms.rb +1 -1
- 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 +22 -20
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,16 +422,12 @@ 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
|
|
410
|
-
view = VSourceView.new()
|
430
|
+
view = VSourceView.new(nil, nil)
|
411
431
|
view.set_highlight_current_line(false)
|
412
432
|
view.set_show_line_numbers(false)
|
413
433
|
# view.set_buffer(buf1)
|
@@ -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,51 +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
|
522
721
|
|
523
|
-
|
524
|
-
|
722
|
+
@window.add_action(action)
|
723
|
+
doc_actions = Gio::SimpleActionGroup.new
|
724
|
+
doc_actions.add_action(action)
|
525
725
|
|
526
|
-
|
527
|
-
|
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
|
528
732
|
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
@overlay.add(@sw)
|
733
|
+
menubar = Gio::Menu.new
|
734
|
+
app.menubar = menubar
|
735
|
+
@window.show_menubar = true
|
533
736
|
|
534
|
-
|
737
|
+
@menubar = menubar
|
535
738
|
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
739
|
+
@windows[1] = { :sw => @sw, :overlay => @overlay, :id => 1 }
|
740
|
+
@active_window = @windows[1]
|
741
|
+
|
742
|
+
@window.show
|
743
|
+
|
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
|
540
826
|
|
541
|
-
|
542
|
-
|
543
|
-
@statnfo.override_background_color(Gtk::StateFlags::NORMAL, "#353535")
|
827
|
+
@sw2.show
|
828
|
+
@two_column = true
|
544
829
|
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
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
|
551
854
|
|
552
|
-
|
553
|
-
|
855
|
+
def set_active_window(id)
|
856
|
+
return if !@two_column
|
857
|
+
return if id == @active_column
|
858
|
+
return if id == @active_window[:id]
|
554
859
|
|
555
|
-
|
860
|
+
if @windows[id].nil?
|
861
|
+
debug "No such window #{id}", 2
|
862
|
+
return
|
863
|
+
end
|
556
864
|
|
557
|
-
@
|
558
|
-
|
559
|
-
Vimamsa::Menu.new(@menubar)
|
865
|
+
@active_window = @windows[id]
|
866
|
+
@active_column = id #TODO: remove
|
560
867
|
|
561
|
-
@
|
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
|
562
913
|
end
|
563
914
|
end
|