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.
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 => [[Gtk::Stock::OPEN, :accept],
7
- [Gtk::Stock::CANCEL, :cancel]])
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.filename)
13
- # debug "uri = #{dialog.uri}"
13
+ open_new_file(dialog.file.parse_name)
14
14
  end
15
15
  dialog.destroy
16
16
  end
17
- dialog.run
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 => [[Gtk::Stock::SAVE, :accept],
24
- [Gtk::Stock::CANCEL, :cancel]])
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.filename)
30
+ file_saveas(dialog.file.parse_name)
29
31
  end
30
32
  dialog.destroy
31
33
  end
32
34
 
33
- dialog.run
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
- # clipboard = $vmag.window.get_clipboard(Gdk::Selection::CLIPBOARD)
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
- # return if arg.class != String
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 gui_set_current_buffer(id)
187
- view = $vmag.buffers[id]
188
- debug "gui_set_current_buffer(#{id}), view=#{view}"
189
- buf1 = view.buffer
190
- $vmag.view = view
191
- $vmag.buf1 = buf1
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 = buf1
193
+ $vbuf = view.buffer
194
+ end
194
195
 
195
- $vmag.sw.remove($vmag.sw.child) if !$vmag.sw.child.nil?
196
- $vmag.sw.add(view)
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
- $vmag.sw.show_all
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.window.titlebar.subtitle = subtitle
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
- 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)
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
- Gtk.main
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
- # puts "scale all"
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
- @overlay.set_overlay_pass_through(@da, true)
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.show_all
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.show_all
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.add(sw)
402
- # @vpaned.pack2(overlay, :resize => false)
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:#ff0000}")
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.add(view)
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
- @window = Gtk::Window.new(:toplevel)
518
- sh = @window.screen.height
519
- sw = @window.screen.width
520
- # TODO:Maximise vertically
521
- @window.set_default_size((sw * 0.45).to_i, sh - 20)
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
- @window.title = "Multiple Views"
524
- @window.show_all
525
- @vpaned = Gtk::Paned.new(:vertical)
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
- @vbox = Gtk::Grid.new()
528
- @window.add(@vbox)
733
+ menubar = Gio::Menu.new
734
+ app.menubar = menubar
735
+ @window.show_menubar = true
529
736
 
530
- @menubar = Gtk::MenuBar.new
531
- @menubar.expand = false
737
+ @menubar = menubar
532
738
 
533
- @sw = Gtk::ScrolledWindow.new
534
- @sw.set_policy(:automatic, :automatic)
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
- init_header_bar
742
+ @window.show
539
743
 
540
- @statnfo = Gtk::Label.new
541
- provider = Gtk::CssProvider.new
542
- provider.load(data: "textview { background-color:#353535; font-family: Monospace; font-size: 10pt; margin-top:4px;}")
543
- @statnfo.style_context.add_provider(provider)
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
- # Deprecated, but found no other way to do it. css doesn't work.
546
- # TODO: should select color automatically from theme
547
- @statnfo.override_background_color(Gtk::StateFlags::NORMAL, "#353535")
827
+ @sw2.show
828
+ @two_column = true
548
829
 
549
- # column, row, width height
550
- @vbox.attach(@menubar, 0, 0, 1, 1)
551
- @vbox.attach(@statnfo, 1, 0, 1, 1)
552
- @vbox.attach(@overlay, 0, 1, 2, 1)
553
- @overlay.vexpand = true
554
- @overlay.hexpand = true
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
- @menubar.vexpand = false
557
- @menubar.hexpand = false
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
- init_minibuffer
860
+ if @windows[id].nil?
861
+ debug "No such window #{id}", 2
862
+ return
863
+ end
560
864
 
561
- @window.show_all
562
- vma.start
563
- Vimamsa::Menu.new(@menubar)
865
+ @active_window = @windows[id]
866
+ @active_column = id #TODO: remove
564
867
 
565
- @window.show_all
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