vimamsa 0.1.19 → 0.1.20
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 +1 -1
- data/ext/vmaext/extconf.rb +5 -0
- data/lib/vimamsa/ack.rb +7 -16
- data/lib/vimamsa/buffer.rb +10 -5
- data/lib/vimamsa/buffer_changetext.rb +1 -1
- data/lib/vimamsa/buffer_list.rb +44 -10
- data/lib/vimamsa/conf.rb +28 -60
- data/lib/vimamsa/debug.rb +1 -1
- data/lib/vimamsa/editor.rb +21 -25
- data/lib/vimamsa/file_finder.rb +78 -10
- data/lib/vimamsa/gui.rb +115 -154
- data/lib/vimamsa/gui_dialog.rb +11 -8
- data/lib/vimamsa/gui_form_generator.rb +6 -8
- data/lib/vimamsa/gui_menu.rb +12 -10
- data/lib/vimamsa/gui_select_window.rb +3 -1
- data/lib/vimamsa/gui_sourceview.rb +41 -24
- data/lib/vimamsa/key_actions.rb +16 -13
- data/lib/vimamsa/key_binding_tree.rb +0 -2
- data/lib/vimamsa/key_bindings_vimlike.rb +1 -2
- data/lib/vimamsa/langservp.rb +1 -2
- data/lib/vimamsa/text_transforms.rb +4 -1
- data/lib/vimamsa/version.rb +1 -1
- data/lib/vimamsa.rb +3 -0
- data/vimamsa.gemspec +3 -2
- metadata +16 -3
- data/.vma_project +0 -0
data/lib/vimamsa/gui.rb
CHANGED
@@ -142,7 +142,8 @@ def gui_create_buffer(id, bufo)
|
|
142
142
|
provider.load(data: "textview { font-family: #{cnf.font.family!}; font-size: #{cnf.font.size!}pt; }")
|
143
143
|
view.style_context.add_provider(provider)
|
144
144
|
view.wrap_mode = :char
|
145
|
-
|
145
|
+
|
146
|
+
view.set_tab_width(cnf.tab.width!)
|
146
147
|
|
147
148
|
$vmag.buffers[id] = view
|
148
149
|
end
|
@@ -189,8 +190,8 @@ def gui_set_window_title(wtitle, subtitle = "")
|
|
189
190
|
end
|
190
191
|
|
191
192
|
class VMAgui
|
192
|
-
attr_accessor :buffers, :
|
193
|
-
attr_reader :two_column, :windows, :subtitle, :app
|
193
|
+
attr_accessor :buffers, :sw1, :sw2, :view, :buf1, :window, :delex, :statnfo, :overlay, :sws, :two_c
|
194
|
+
attr_reader :two_column, :windows, :subtitle, :app, :active_window
|
194
195
|
|
195
196
|
def initialize()
|
196
197
|
@two_column = false
|
@@ -252,7 +253,7 @@ class VMAgui
|
|
252
253
|
|
253
254
|
def start_overlay_draw()
|
254
255
|
@da = Gtk::Fixed.new
|
255
|
-
@overlay.add_overlay(@da)
|
256
|
+
@active_window[:overlay].add_overlay(@da)
|
256
257
|
|
257
258
|
# @overlay.set_overlay_pass_through(@da, true) #TODO:gtk4
|
258
259
|
end
|
@@ -260,7 +261,7 @@ class VMAgui
|
|
260
261
|
def clear_overlay()
|
261
262
|
if @da != nil
|
262
263
|
# @overlay.remove(@da)
|
263
|
-
@overlay.remove_overlay(@da)
|
264
|
+
@active_window[:overlay].remove_overlay(@da)
|
264
265
|
end
|
265
266
|
end
|
266
267
|
|
@@ -277,20 +278,6 @@ class VMAgui
|
|
277
278
|
@da.show
|
278
279
|
end
|
279
280
|
|
280
|
-
def remove_overlay_cursor()
|
281
|
-
if !@cursorov.nil?
|
282
|
-
@overlay.remove_overlay(@cursorov)
|
283
|
-
@cursorov = nil
|
284
|
-
end
|
285
|
-
end
|
286
|
-
|
287
|
-
def overlay_draw_cursor(textpos)
|
288
|
-
# return
|
289
|
-
remove_overlay_cursor
|
290
|
-
GLib::Idle.add(proc { self.overlay_draw_cursor_(textpos) })
|
291
|
-
# overlay_draw_cursor_(textpos)
|
292
|
-
end
|
293
|
-
|
294
281
|
# Run proc after animated scrolling has stopped (e.g. after page down)
|
295
282
|
def run_after_scrolling(p)
|
296
283
|
Thread.new {
|
@@ -307,31 +294,6 @@ class VMAgui
|
|
307
294
|
}
|
308
295
|
end
|
309
296
|
|
310
|
-
# To draw on empty lines and line-ends (where select_range doesn't work)
|
311
|
-
def overlay_draw_cursor_(textpos)
|
312
|
-
# Thread.new {
|
313
|
-
# GLib::Idle.add(proc { p.call; false })
|
314
|
-
# }
|
315
|
-
|
316
|
-
# while Time.now - @last_adj_time < 0.3
|
317
|
-
# return true
|
318
|
-
# end
|
319
|
-
|
320
|
-
remove_overlay_cursor
|
321
|
-
@cursorov = Gtk::Fixed.new
|
322
|
-
@overlay.add_overlay(@cursorov)
|
323
|
-
|
324
|
-
(x, y) = @view.pos_to_coord(textpos)
|
325
|
-
pp [x, y]
|
326
|
-
|
327
|
-
# Trying to draw only background of character "I"
|
328
|
-
label = Gtk::Label.new("<span background='#00ffaaff' foreground='#00ffaaff' weight='ultrabold'>I</span>")
|
329
|
-
label.use_markup = true
|
330
|
-
@cursorov.put(label, x, y)
|
331
|
-
@cursorov.show
|
332
|
-
return false
|
333
|
-
end
|
334
|
-
|
335
297
|
def handle_deltas()
|
336
298
|
view.delete_cursor_char
|
337
299
|
while d = buf.deltas.shift
|
@@ -386,6 +348,7 @@ class VMAgui
|
|
386
348
|
sw.set_child(view)
|
387
349
|
end
|
388
350
|
|
351
|
+
#TODO: implement in gtk4
|
389
352
|
def init_header_bar()
|
390
353
|
header = Gtk::HeaderBar.new
|
391
354
|
@header = header
|
@@ -408,13 +371,13 @@ class VMAgui
|
|
408
371
|
# icon = Gio::ThemedIcon.new("open-menu-symbolic")
|
409
372
|
# image = Gtk::Image.new(:icon => icon, :size => :button)
|
410
373
|
# button.add(image)
|
411
|
-
# header.
|
374
|
+
# header.append(button)
|
412
375
|
|
413
376
|
button = Gtk::Button.new
|
414
377
|
icon = Gio::ThemedIcon.new("document-open-symbolic")
|
415
378
|
image = Gtk::Image.new(:icon => icon, :size => :button)
|
416
379
|
button.add(image)
|
417
|
-
header.
|
380
|
+
header.append(button)
|
418
381
|
|
419
382
|
button.signal_connect "clicked" do |_widget|
|
420
383
|
open_file_dialog
|
@@ -424,7 +387,7 @@ class VMAgui
|
|
424
387
|
icon = Gio::ThemedIcon.new("document-save-symbolic")
|
425
388
|
image = Gtk::Image.new(:icon => icon, :size => :button)
|
426
389
|
button.add(image)
|
427
|
-
header.
|
390
|
+
header.append(button)
|
428
391
|
button.signal_connect "clicked" do |_widget|
|
429
392
|
buf.save
|
430
393
|
end
|
@@ -433,7 +396,7 @@ class VMAgui
|
|
433
396
|
icon = Gio::ThemedIcon.new("document-new-symbolic")
|
434
397
|
image = Gtk::Image.new(:icon => icon, :size => :button)
|
435
398
|
button.add(image)
|
436
|
-
header.
|
399
|
+
header.append(button)
|
437
400
|
button.signal_connect "clicked" do |_widget|
|
438
401
|
create_new_file
|
439
402
|
end
|
@@ -468,7 +431,6 @@ class VMAgui
|
|
468
431
|
|
469
432
|
header.pack_start(box)
|
470
433
|
@window.titlebar = header
|
471
|
-
# @window.add(Gtk::TextView.new)
|
472
434
|
end
|
473
435
|
|
474
436
|
def debug_idle_func
|
@@ -479,7 +441,7 @@ class VMAgui
|
|
479
441
|
# @view.check_controllers
|
480
442
|
end
|
481
443
|
|
482
|
-
ctrl_fn = File.expand_path("
|
444
|
+
ctrl_fn = File.expand_path(get_dot_path("ripl_ctrl"))
|
483
445
|
# Allows to debug in case keyboard handling is lost
|
484
446
|
if File.exist?(ctrl_fn)
|
485
447
|
File.delete(ctrl_fn)
|
@@ -596,6 +558,8 @@ class VMAgui
|
|
596
558
|
|
597
559
|
Gtk::Settings.default.gtk_application_prefer_dark_theme = true
|
598
560
|
Gtk::Settings.default.gtk_theme_name = "Adwaita"
|
561
|
+
Gtk::Settings.default.gtk_cursor_blink = false
|
562
|
+
Gtk::Settings.default.gtk_cursor_blink_time = 4000
|
599
563
|
|
600
564
|
app.signal_connect "activate" do
|
601
565
|
@window = Gtk::ApplicationWindow.new(app)
|
@@ -613,29 +577,22 @@ class VMAgui
|
|
613
577
|
|
614
578
|
reset_controllers
|
615
579
|
|
616
|
-
@
|
617
|
-
@sw.set_policy(:automatic, :automatic)
|
580
|
+
@windows[1] = new_window(1)
|
618
581
|
|
619
582
|
@last_adj_time = Time.now
|
620
|
-
@sw.vadjustment.signal_connect("value-changed") { |x|
|
621
|
-
# pp x.page_increment
|
622
|
-
# pp x.page_size
|
623
|
-
# pp x.step_increment
|
624
|
-
# pp x.upper
|
625
|
-
# pp x.value
|
626
|
-
# pp x
|
627
|
-
@last_adj_time = Time.now
|
628
|
-
}
|
629
583
|
|
630
|
-
@overlay = Gtk::Overlay.new
|
631
|
-
@overlay.add_overlay(@sw)
|
632
584
|
|
585
|
+
# To show keyboard key binding state
|
633
586
|
@statnfo = Gtk::Label.new
|
587
|
+
|
588
|
+
# To show e.g. current folder
|
634
589
|
@subtitle = Gtk::Label.new("")
|
590
|
+
|
635
591
|
@statbox = Gtk::Box.new(:horizontal, 2)
|
636
592
|
@statnfo.set_size_request(150, 10)
|
637
|
-
@statbox.
|
638
|
-
@
|
593
|
+
@statbox.append(@subtitle)
|
594
|
+
@subtitle.hexpand = true
|
595
|
+
@statbox.append(@statnfo)
|
639
596
|
provider = Gtk::CssProvider.new
|
640
597
|
@statnfo.add_css_class("statnfo")
|
641
598
|
provider.load(data: "label.statnfo { background-color:#353535; font-size: 10pt; margin-top:2px; margin-bottom:2px; align:right;}")
|
@@ -644,50 +601,19 @@ class VMAgui
|
|
644
601
|
@statnfo.style_context.add_provider(provider)
|
645
602
|
|
646
603
|
# numbers: left, top, width, height
|
647
|
-
@vbox.attach(@overlay, 0, 2, 2, 1)
|
648
|
-
@sw.vexpand = true
|
649
|
-
@sw.hexpand = true
|
604
|
+
@vbox.attach(@windows[1][:overlay], 0, 2, 2, 1)
|
650
605
|
|
651
606
|
# column, row, width height
|
652
607
|
@vbox.attach(@statbox, 1, 1, 1, 1)
|
653
608
|
|
654
|
-
@overlay.vexpand = true
|
655
|
-
@overlay.hexpand = true
|
656
|
-
|
657
609
|
init_minibuffer
|
658
610
|
|
659
|
-
name = "save"
|
660
|
-
window = @window
|
661
|
-
action = Gio::SimpleAction.new(name)
|
662
|
-
action.signal_connect "activate" do |_simple_action, _parameter|
|
663
|
-
dialog = Gtk::MessageDialog.new(:parent => window,
|
664
|
-
:flags => :destroy_with_parent,
|
665
|
-
:buttons => :close,
|
666
|
-
:message => "Action FOOBAR activated.")
|
667
|
-
dialog.signal_connect(:response) do
|
668
|
-
dialog.destroy
|
669
|
-
end
|
670
|
-
dialog.show
|
671
|
-
end
|
672
|
-
|
673
|
-
@window.add_action(action)
|
674
|
-
doc_actions = Gio::SimpleActionGroup.new
|
675
|
-
doc_actions.add_action(action)
|
676
|
-
|
677
|
-
act_quit = Gio::SimpleAction.new("quit")
|
678
|
-
app.add_action(act_quit)
|
679
|
-
act_quit.signal_connect "activate" do |_simple_action, _parameter|
|
680
|
-
window.destroy
|
681
|
-
exit!
|
682
|
-
end
|
683
|
-
|
684
611
|
menubar = Gio::Menu.new
|
685
612
|
app.menubar = menubar
|
686
613
|
@window.show_menubar = true
|
687
614
|
|
688
615
|
@menubar = menubar
|
689
616
|
|
690
|
-
@windows[1] = { :sw => @sw, :overlay => @overlay, :id => 1 }
|
691
617
|
@active_window = @windows[1]
|
692
618
|
|
693
619
|
@window.show
|
@@ -728,23 +654,20 @@ class VMAgui
|
|
728
654
|
vma.start
|
729
655
|
end
|
730
656
|
|
731
|
-
# Vimamsa::Menu.new(@menubar) #TODO:gtk4
|
732
657
|
GLib::Idle.add(proc { self.monitor })
|
733
658
|
|
734
659
|
app.run
|
735
|
-
|
736
|
-
# @window.show_all
|
737
|
-
# @window.show
|
738
660
|
end
|
739
661
|
|
740
662
|
def monitor
|
663
|
+
swa = @windows[1][:sw]
|
741
664
|
@monitor_time ||= Time.now
|
742
|
-
@sw_width ||=
|
665
|
+
@sw_width ||= swa.width
|
743
666
|
return true if Time.now - @monitor_time < 0.2
|
744
667
|
# Detect element resize
|
745
|
-
if
|
668
|
+
if swa.width != @sw_width
|
746
669
|
# puts "@sw.width=#{@sw.width}"
|
747
|
-
@sw_width =
|
670
|
+
@sw_width = swa.width
|
748
671
|
DelayExecutioner.exec(id: :scale_images, wait: 0.7, callable: proc { vma.gui.scale_all_images })
|
749
672
|
end
|
750
673
|
@monitor_time = Time.now
|
@@ -768,55 +691,83 @@ class VMAgui
|
|
768
691
|
#This always closes the leftmost column/window
|
769
692
|
#TODO: close rightmost column if left active
|
770
693
|
set_active_window(1)
|
771
|
-
|
694
|
+
|
772
695
|
@windows[2][:sw].set_child(nil)
|
773
696
|
@windows.delete(2)
|
697
|
+
w1 = @windows[1]
|
774
698
|
|
775
699
|
@pane.set_start_child(nil)
|
776
700
|
@pane.set_end_child(nil)
|
777
701
|
|
778
702
|
@vbox.remove(@pane)
|
779
|
-
@vbox.attach(
|
780
|
-
@vbox.attach(@statbox, 1, 1, 1, 1)
|
703
|
+
@vbox.attach(w1[:overlay], 0, 2, 2, 1)
|
704
|
+
# @vbox.attach(@statbox, 1, 1, 1, 1)
|
781
705
|
@two_column = false
|
782
706
|
end
|
783
707
|
|
784
|
-
def
|
785
|
-
|
786
|
-
|
787
|
-
|
788
|
-
|
789
|
-
# @
|
790
|
-
|
791
|
-
@sw2 = Gtk::ScrolledWindow.new
|
792
|
-
@sw2.set_policy(:automatic, :automatic)
|
793
|
-
@overlay2 = Gtk::Overlay.new
|
794
|
-
@overlay2.add_overlay(@sw2)
|
795
|
-
@pane = Gtk::Paned.new(:horizontal)
|
708
|
+
def new_window(win_id)
|
709
|
+
n_sw = Gtk::ScrolledWindow.new
|
710
|
+
n_sw.set_policy(:automatic, :automatic)
|
711
|
+
n_overlay = Gtk::Overlay.new
|
712
|
+
n_overlay.add_overlay(n_sw)
|
713
|
+
# @pane = Gtk::Paned.new(:horizontal)
|
796
714
|
|
797
|
-
|
715
|
+
win = { :sw => n_sw, :overlay => n_overlay, :id => win_id }
|
716
|
+
# @windows[2] = { :sw => @sw2, :overlay => @overlay2, :id => 2 }
|
798
717
|
|
799
|
-
@vbox.remove(@overlay)
|
718
|
+
# @vbox.remove(@overlay)
|
800
719
|
|
801
|
-
@pane.set_start_child(@overlay2)
|
802
|
-
@pane.set_end_child(@overlay)
|
720
|
+
# @pane.set_start_child(@overlay2)
|
721
|
+
# @pane.set_end_child(@overlay)
|
803
722
|
|
804
723
|
# numbers: left, top, width, height
|
805
|
-
@vbox.attach(@pane, 0, 2, 2, 1)
|
724
|
+
# @vbox.attach(@pane, 0, 2, 2, 1)
|
725
|
+
|
726
|
+
n_sw.vexpand = true
|
727
|
+
n_sw.hexpand = true
|
728
|
+
|
729
|
+
n_overlay.vexpand = true
|
730
|
+
n_overlay.hexpand = true
|
731
|
+
|
732
|
+
# TODO: remove??
|
733
|
+
n_sw.vadjustment.signal_connect("value-changed") { |x|
|
734
|
+
# pp x.page_increment
|
735
|
+
# pp x.page_size
|
736
|
+
# pp x.step_increment
|
737
|
+
# pp x.upper
|
738
|
+
# pp x.value
|
739
|
+
# pp x
|
740
|
+
# @last_adj_time = Time.now
|
741
|
+
}
|
742
|
+
|
743
|
+
# @sw2.show
|
744
|
+
return win
|
745
|
+
end
|
746
|
+
|
747
|
+
def set_two_column
|
748
|
+
return if @two_column
|
749
|
+
@windows[2] = new_window(2)
|
750
|
+
|
751
|
+
w1 = @windows[1]
|
752
|
+
w2 = @windows[2]
|
806
753
|
|
807
|
-
@
|
808
|
-
@
|
754
|
+
# Remove overlay from @vbox and add the Gtk::Paned instead
|
755
|
+
@pane = Gtk::Paned.new(:horizontal)
|
756
|
+
@vbox.remove(w1[:overlay])
|
757
|
+
@pane.set_start_child(w2[:overlay])
|
758
|
+
@pane.set_end_child(w1[:overlay])
|
809
759
|
|
810
|
-
|
811
|
-
@
|
760
|
+
# numbers: left, top, width, height
|
761
|
+
@vbox.attach(@pane, 0, 2, 2, 1)
|
812
762
|
|
813
|
-
|
763
|
+
w2[:sw].show
|
814
764
|
@two_column = true
|
815
765
|
|
816
766
|
last = vma.buffers.get_last_visited_id
|
817
767
|
if !last.nil?
|
818
768
|
set_buffer_to_window(last, 2)
|
819
769
|
else
|
770
|
+
# If there is only one buffer, create a new one and add to the new window/column
|
820
771
|
bf = create_new_buffer "\n\n", "buff", false
|
821
772
|
set_buffer_to_window(bf.id, 2)
|
822
773
|
end
|
@@ -836,11 +787,17 @@ class VMAgui
|
|
836
787
|
end
|
837
788
|
end
|
838
789
|
|
839
|
-
#
|
790
|
+
# Activate that window which has the given view
|
840
791
|
def set_current_view(view)
|
792
|
+
# Window of current view:
|
841
793
|
w = @windows.find { |k, v| v[:sw].child == view }
|
794
|
+
# All other windows:
|
795
|
+
otherw = @windows.find_all { |k, v| v[:sw].child != view }
|
842
796
|
if !w.nil?
|
843
797
|
set_active_window(w[0])
|
798
|
+
for k, x in otherw
|
799
|
+
x[:sw].child.focus_out()
|
800
|
+
end
|
844
801
|
end
|
845
802
|
end
|
846
803
|
|
@@ -855,19 +812,21 @@ class VMAgui
|
|
855
812
|
end
|
856
813
|
|
857
814
|
@active_window = @windows[id]
|
858
|
-
@active_column = id
|
815
|
+
@active_column = id
|
859
816
|
|
860
|
-
@
|
861
|
-
|
862
|
-
|
863
|
-
|
864
|
-
|
865
|
-
|
817
|
+
@active_window[:sw].child.focus_in()
|
818
|
+
for k, w in @windows
|
819
|
+
if w != @active_window
|
820
|
+
fochild = w[:sw].child
|
821
|
+
run_as_idle proc { fochild.focus_out() }
|
822
|
+
end
|
823
|
+
end
|
866
824
|
|
825
|
+
vma.buffers.set_current_buffer_by_id(@active_window[:sw].child.bufo.id)
|
867
826
|
end
|
868
827
|
|
869
828
|
def current_view
|
870
|
-
return @sw.child
|
829
|
+
return @active_window[:sw].child
|
871
830
|
end
|
872
831
|
|
873
832
|
def set_buffer_to_window(bufid, winid)
|
@@ -878,9 +837,6 @@ class VMAgui
|
|
878
837
|
@windows[winid][:sw].set_child(view)
|
879
838
|
idle_ensure_cursor_drawn
|
880
839
|
|
881
|
-
# @overlay = Gtk::Overlay.new
|
882
|
-
# @overlay.add_overlay(view)
|
883
|
-
|
884
840
|
#TODO:???
|
885
841
|
# @view = view
|
886
842
|
# @buf1 = buf1
|
@@ -890,10 +846,10 @@ class VMAgui
|
|
890
846
|
end
|
891
847
|
|
892
848
|
def set_current_buffer(id)
|
893
|
-
|
849
|
+
view2 = @buffers[id]
|
894
850
|
debug "vma.gui.set_current_buffer(#{id}), view=#{view}"
|
895
|
-
buf1 =
|
896
|
-
@view =
|
851
|
+
buf1 = view2.buffer
|
852
|
+
@view = view2
|
897
853
|
@buf1 = buf1
|
898
854
|
$view = view
|
899
855
|
$vbuf = buf1
|
@@ -906,14 +862,17 @@ class VMAgui
|
|
906
862
|
toggle_active_window
|
907
863
|
else
|
908
864
|
#TODO: improve
|
909
|
-
@
|
910
|
-
@
|
865
|
+
swa = @active_window[:sw]
|
866
|
+
ol = @active_window[:overlay]
|
867
|
+
ol.remove_overlay(swa)
|
868
|
+
swa.set_child(nil)
|
911
869
|
# Creating a new ScrolledWindow every time to avoid a layout bug
|
912
870
|
# https://gitlab.gnome.org/GNOME/gtk/-/issues/6189
|
913
|
-
|
914
|
-
|
915
|
-
|
916
|
-
@active_window[:
|
871
|
+
swb = new_scrolled_window
|
872
|
+
swb.set_child(view2)
|
873
|
+
ol.add_overlay(swb)
|
874
|
+
@active_window[:view] = view
|
875
|
+
@active_window[:sw] = swb
|
917
876
|
end
|
918
877
|
view.grab_focus
|
919
878
|
|
@@ -932,18 +891,20 @@ class VMAgui
|
|
932
891
|
end
|
933
892
|
|
934
893
|
def page_down(multip: 1.0)
|
935
|
-
|
894
|
+
sw = @active_window[:sw]
|
895
|
+
va = sw.vadjustment
|
936
896
|
newval = va.value + va.page_increment * multip
|
937
897
|
va.value = newval
|
938
|
-
|
898
|
+
sw.child.set_cursor_to_top
|
939
899
|
end
|
940
900
|
|
941
901
|
def page_up(multip: 1.0)
|
942
|
-
|
902
|
+
sw = @active_window[:sw]
|
903
|
+
va = sw.vadjustment
|
943
904
|
newval = va.value - va.page_increment * multip
|
944
905
|
newval = 0 if newval < 0
|
945
906
|
va.value = newval
|
946
|
-
|
907
|
+
sw.child.set_cursor_to_top
|
947
908
|
end
|
948
909
|
|
949
910
|
def idle_ensure_cursor_drawn
|
data/lib/vimamsa/gui_dialog.rb
CHANGED
@@ -40,8 +40,9 @@ class OneInputAction
|
|
40
40
|
def initialize(main_window, title, field_label, button_title, callback, opt = {})
|
41
41
|
@window = Gtk::Window.new()
|
42
42
|
# @window.screen = main_window.screen
|
43
|
-
# @window.title = title
|
44
43
|
@window.title = ""
|
44
|
+
# @window.width_request = 800
|
45
|
+
# @window.hexpand = false
|
45
46
|
|
46
47
|
frame = Gtk::Frame.new()
|
47
48
|
# frame.margin = 20
|
@@ -49,15 +50,17 @@ class OneInputAction
|
|
49
50
|
|
50
51
|
infolabel = Gtk::Label.new
|
51
52
|
infolabel.markup = title
|
53
|
+
infolabel.wrap = true
|
54
|
+
infolabel.max_width_chars = 80
|
55
|
+
|
52
56
|
|
53
57
|
vbox = Gtk::Box.new(:vertical, 8)
|
54
58
|
vbox.margin = 10
|
55
59
|
frame.set_child(vbox)
|
56
60
|
|
57
61
|
hbox = Gtk::Box.new(:horizontal, 8)
|
58
|
-
|
59
|
-
vbox.
|
60
|
-
vbox.pack_end(hbox, :expand => false, :fill => false, :padding => 0)
|
62
|
+
vbox.append(infolabel)
|
63
|
+
vbox.append(hbox)
|
61
64
|
|
62
65
|
button = Gtk::Button.new(:label => button_title)
|
63
66
|
cancel_button = Gtk::Button.new(:label => "Cancel")
|
@@ -95,10 +98,10 @@ class OneInputAction
|
|
95
98
|
end
|
96
99
|
end
|
97
100
|
|
98
|
-
hbox.
|
99
|
-
hbox.
|
100
|
-
hbox.
|
101
|
-
hbox.
|
101
|
+
hbox.append(label)
|
102
|
+
hbox.append(@entry1)
|
103
|
+
hbox.append(button)
|
104
|
+
hbox.append(cancel_button)
|
102
105
|
return
|
103
106
|
end
|
104
107
|
|
@@ -49,9 +49,7 @@ class PopupFormGenerator
|
|
49
49
|
if params.has_key?("title")
|
50
50
|
infolabel = Gtk::Label.new
|
51
51
|
infolabel.markup = params["title"]
|
52
|
-
|
53
|
-
# vbox.pack_start(infolabel, :expand => false, :fill => false, :padding => 0)
|
54
|
-
vbox.pack_end(infolabel, :expand => false, :fill => false, :padding => 0)
|
52
|
+
vbox.append(infolabel)
|
55
53
|
end
|
56
54
|
|
57
55
|
hbox = Gtk::Box.new(:horizontal, 8)
|
@@ -61,7 +59,7 @@ class PopupFormGenerator
|
|
61
59
|
for id, elem in params["inputs"]
|
62
60
|
if elem[:type] == :button
|
63
61
|
button = Gtk::Button.new(:label => elem[:label])
|
64
|
-
hbox.
|
62
|
+
hbox.append(button)
|
65
63
|
if elem[:default_focus] == true
|
66
64
|
@default_button = button
|
67
65
|
end
|
@@ -75,8 +73,8 @@ class PopupFormGenerator
|
|
75
73
|
if elem.has_key?(:initial_text)
|
76
74
|
entry.text = elem[:initial_text]
|
77
75
|
end
|
78
|
-
hbox.
|
79
|
-
hbox.
|
76
|
+
hbox.append(label)
|
77
|
+
hbox.append(entry)
|
80
78
|
@vals[id] = entry
|
81
79
|
|
82
80
|
press = Gtk::EventControllerKey.new
|
@@ -96,13 +94,13 @@ class PopupFormGenerator
|
|
96
94
|
end
|
97
95
|
end
|
98
96
|
|
99
|
-
vbox.
|
97
|
+
vbox.append(hbox)
|
100
98
|
|
101
99
|
cancel_button = Gtk::Button.new(:label => "Cancel")
|
102
100
|
cancel_button.signal_connect "clicked" do
|
103
101
|
@window.destroy
|
104
102
|
end
|
105
|
-
hbox.
|
103
|
+
hbox.append(cancel_button)
|
106
104
|
@cancel_button = cancel_button
|
107
105
|
return
|
108
106
|
end
|
data/lib/vimamsa/gui_menu.rb
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
module Vimamsa
|
2
2
|
class Menu
|
3
3
|
def add_to_menu(_mpath, x)
|
4
|
+
# If no menu label provided, take from the action definition
|
5
|
+
if !x[:action].nil? and x[:label].nil?
|
6
|
+
x[:label] = vma.actions[x[:action]].method_name
|
7
|
+
end
|
8
|
+
|
4
9
|
mpath = _mpath.split(".")
|
5
10
|
curnfo = @nfo
|
6
11
|
for y in mpath
|
@@ -31,9 +36,10 @@ module Vimamsa
|
|
31
36
|
add_to_menu "Edit.Redo", { :label => "Redo edit", :action => :edit_redo }
|
32
37
|
add_to_menu "Edit.SearchReplace", { :label => "Search and replace", :action => :gui_search_replace }
|
33
38
|
add_to_menu "Edit.Find", { :label => "Find", :action => :find_in_buffer }
|
34
|
-
|
35
|
-
add_to_menu "Edit.StartCompletion", { :label => "StartCompletion", :action => :start_autocomplete }
|
36
|
-
add_to_menu "Edit.ShowCompletion", { :label => "ShowCompletion", :action => :show_autocomplete }
|
39
|
+
|
40
|
+
# add_to_menu "Edit.StartCompletion", { :label => "StartCompletion", :action => :start_autocomplete }
|
41
|
+
# add_to_menu "Edit.ShowCompletion", { :label => "ShowCompletion", :action => :show_autocomplete }
|
42
|
+
add_to_menu "Edit.CustomRb", { :action => :edit_customrb }
|
37
43
|
|
38
44
|
add_to_menu "Actions.SearchForActions", { :label => "Search for Actions", :action => :search_actions }
|
39
45
|
|
@@ -46,13 +52,11 @@ module Vimamsa
|
|
46
52
|
add_to_menu "Actions.experimental.EnableDebug", { :label => "Enable debug", :action => :enable_debug }
|
47
53
|
add_to_menu "Actions.experimental.DisableDebug", { :label => "Disable debug", :action => :disable_debug }
|
48
54
|
add_to_menu "Actions.experimental.ShowImages", { :label => "Show images ⟦img:path⟧", :action => :show_images }
|
49
|
-
|
55
|
+
|
50
56
|
add_to_menu "Actions.debug.dumpkbd", { :label => "Dump kbd state", :action => :kbd_dump_state }
|
51
|
-
|
52
|
-
|
57
|
+
|
53
58
|
add_to_menu "View.BufferManager", { :label => "Show open files", :action => :start_buf_manager }
|
54
59
|
add_to_menu "View.TwoColumn", { :label => "Toggle two column mode", :action => :toggle_two_column }
|
55
|
-
|
56
60
|
|
57
61
|
add_to_menu "Actions.EncryptFile", { :label => "Encrypt file", :action => :encrypt_file }
|
58
62
|
add_to_menu "Help.KeyBindings", { :label => "Show key bindings", :action => :show_key_bindings }
|
@@ -89,7 +93,7 @@ module Vimamsa
|
|
89
93
|
label_str = nfo[:label] + kbd_str
|
90
94
|
actkey = nfo[:action].to_s
|
91
95
|
menuitem = Gio::MenuItem.new(label_str, "app.#{actkey}")
|
92
|
-
|
96
|
+
|
93
97
|
# This worked in GTK3:
|
94
98
|
# But seems there is no way to access the Label object in GTK4
|
95
99
|
# menuitem.children[0].set_markup(label_str)
|
@@ -110,7 +114,6 @@ module Vimamsa
|
|
110
114
|
# menuitem.set_attribute_value("use-markup", true)
|
111
115
|
# This might change in the future(?), but the string version still works in gtk-4.13.0 (gtk/gtkmenutrackeritem.c)
|
112
116
|
|
113
|
-
|
114
117
|
if !nfo[:items].nil? and !nfo[:items].empty?
|
115
118
|
for k2, item in nfo[:items]
|
116
119
|
build_menu(item, menu)
|
@@ -118,7 +121,6 @@ module Vimamsa
|
|
118
121
|
menuitem.submenu = menu
|
119
122
|
end
|
120
123
|
o = parent.append_item(menuitem)
|
121
|
-
|
122
124
|
end
|
123
125
|
end #end class
|
124
126
|
end
|
@@ -154,7 +154,9 @@ class SelectUpdateWindow
|
|
154
154
|
sw = Gtk::ScrolledWindow.new(nil, nil)
|
155
155
|
# sw.shadow_type = :etched_in #TODO:gtk4
|
156
156
|
sw.set_policy(:never, :automatic)
|
157
|
-
vbox.
|
157
|
+
vbox.append(sw)
|
158
|
+
sw.vexpand = true
|
159
|
+
sw.hexpand = true
|
158
160
|
|
159
161
|
# sw.add(treeview) #TODO:gtk4
|
160
162
|
sw.set_child(treeview)
|