vimamsa 0.1.10 → 0.1.11

Sign up to get free protection for your applications and to get access to all the features.
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