vimamsa 0.1.1 → 0.1.6

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.
@@ -53,7 +53,7 @@ end
53
53
 
54
54
  class KeyBindingTree
55
55
  attr_accessor :C, :I, :cur_state, :root, :match_state, :last_action, :cur_action
56
- attr_reader :mode_root_state, :state_trail
56
+ attr_reader :mode_root_state, :state_trail, :act_bindings
57
57
 
58
58
  def initialize()
59
59
  @modes = {}
@@ -67,6 +67,10 @@ class KeyBindingTree
67
67
 
68
68
  @modifiers = [] # TODO: create a queue
69
69
  @last_event = [nil, nil, nil, nil, nil]
70
+
71
+ @override_keyhandling_callback = nil
72
+ # Allows h["foo"]["faa"]=1
73
+ @act_bindings = Hash.new { |h, k| h[k] = Hash.new(&h.default_proc) }
70
74
  end
71
75
 
72
76
  def set_default_mode(label)
@@ -110,6 +114,14 @@ class KeyBindingTree
110
114
  return nil
111
115
  end
112
116
 
117
+ def set_keyhandling_override(_callback)
118
+ @override_keyhandling_callback = _callback
119
+ end
120
+
121
+ def remove_keyhandling_override()
122
+ @override_keyhandling_callback = nil
123
+ end
124
+
113
125
  def match(key_name)
114
126
  new_state = []
115
127
  @match_state.each { |parent|
@@ -129,9 +141,7 @@ class KeyBindingTree
129
141
  end
130
142
  }
131
143
  }
132
- if key_name == "o"
133
- # Ripl.start :binding => binding
134
- end
144
+
135
145
 
136
146
  if new_state.any? # Match found
137
147
  @match_state = new_state
@@ -242,8 +252,10 @@ class KeyBindingTree
242
252
  # $cur_key_dict = $key_bind_dict[$context[:mode]]
243
253
  print "MATCH KEY CONF: #{[c, translated_c]}" if $debug
244
254
 
245
- # Sometimes we get ASCII-8BIT encoding although content actually UTF-8
246
- c = c.force_encoding("UTF-8"); # TODO:correct?
255
+ if !@override_keyhandling_callback.nil?
256
+ ret = @override_keyhandling_callback.call(c, event_type)
257
+ return if ret
258
+ end
247
259
 
248
260
  eval_s = nil
249
261
 
@@ -306,7 +318,6 @@ class KeyBindingTree
306
318
  # act_s = cstate.action.to_s if cstate.action != nil
307
319
  # puts " #{cstate.to_s} #{act_s}"
308
320
  # end
309
- # Ripl.start :binding => binding
310
321
  # new_state[0].children.collect{|x|x.to_s}
311
322
  end
312
323
 
@@ -328,7 +339,7 @@ class KeyBindingTree
328
339
 
329
340
  printf("\n") if $debug
330
341
  else
331
-
342
+
332
343
  # Don't execute action if one of the states has children
333
344
  state_with_children = new_state.select { |s| s.children.any? }
334
345
  s_act = new_state.select { |s| s.action != nil }
@@ -432,7 +443,7 @@ class KeyBindingTree
432
443
  @last_event = event #TODO: outside if?
433
444
  end
434
445
 
435
- # qt_refresh_cursor
446
+ # gui_refresh_cursor
436
447
 
437
448
  event_handle_time = Time.now - t1
438
449
  debug "RB key event handle time: #{event_handle_time}" if event_handle_time > 1 / 40.0
@@ -484,6 +495,7 @@ class KeyBindingTree
484
495
 
485
496
  modes.each { |mode_id|
486
497
  mode_bind_key(mode_id, keydef, action)
498
+ @act_bindings[mode_id][action] = keydef
487
499
  }
488
500
  end
489
501
 
@@ -0,0 +1,259 @@
1
+
2
+ bindkey ["VCB M","B m"], :run_last_macro
3
+
4
+ bindkey "VC s", :easy_jump
5
+ bindkey "VC , m f", [:find_macro_gui, proc{$macro.find_macro_gui}, "Find named macro"]
6
+ bindkey "C , m n", [:gui_name_macro, proc{$macro.gui_name_macro}, "Name last macro"]
7
+ bindkey "C , j r", :jump_to_random
8
+ bindkey "I enter", :insert_new_line
9
+ bindkey "C , ; s k", :show_key_bindings #TODO: better binding
10
+ bindkey "C , , c b", :put_file_path_to_clipboard #TODO: better binding or remove?
11
+ bindkey "C , , e", :encrypt_file #TODO: better binding
12
+ bindkey "C , ; u", :set_unencrypted #TODO: better binding
13
+ bindkey "C , c b", :close_current_buffer
14
+ bindkey "V ctrl-c", :comment_selection
15
+ bindkey "C x", :delete_char_forward
16
+ bindkey "C , , l t", :load_theme
17
+ bindkey "C , f", :gui_file_finder
18
+ bindkey "C , h", :gui_file_history_finder
19
+ bindkey "C , r r", :gui_search_replace
20
+ bindkey "V , r r", :gui_search_replace
21
+ bindkey "V , t b", :set_style_bold
22
+ bindkey "V , t l", :set_style_link
23
+ bindkey "V J", :V_join_lines
24
+ bindkey "V , t c", :clear_formats
25
+ bindkey "C , t h", :set_line_style_heading
26
+ bindkey "C , t 1", :set_line_style_h1
27
+ bindkey "C , t 2", :set_line_style_h2
28
+ bindkey "C , t 3", :set_line_style_h3
29
+ bindkey "C , t 4", :set_line_style_h4
30
+ bindkey "C , t b", :set_line_style_bold
31
+ bindkey "C , t t", :set_line_style_title
32
+ bindkey "C , t c", :clear_line_styles
33
+ bindkey "C , b", :gui_select_buffer
34
+ # bindkey "C , f o", :open_file_dialog
35
+ bindkey "CI ctrl-o", :open_file_dialog
36
+ # bindkey "M enter", :minibuffer_end
37
+ bindkey "C , a", :ack_search
38
+ bindkey "C d w", :delete_to_word_end
39
+ bindkey "C d 0", :delete_to_line_start
40
+ bindkey "C , , f", :file_finder
41
+ bindkey "VC h", :e_move_backward_char
42
+ bindkey "C , , .", :backup_all_buffers
43
+ bindkey "C z ", :start_browse_mode
44
+ bindkey "B h", :history_switch_backwards
45
+ bindkey "B l", :history_switch_forwards
46
+ #bindkey 'B z', :center_on_current_line
47
+ bindkey "B z", "center_on_current_line();call(:exit_browse_mode)"
48
+ bindkey "B enter || B return || B esc || B j || B ctrl!", :exit_browse_mode
49
+ bindkey "B s", :page_up
50
+ bindkey "B d", :page_down
51
+ bindkey "B s", :page_up
52
+ bindkey "B d", :page_down
53
+ bindkey "B i", :jump_to_start_of_buffer
54
+ bindkey "B o", :jump_to_end_of_buffer
55
+ bindkey "B c", :close_current_buffer
56
+ bindkey "B ;", "buf.jump_to_last_edit"
57
+ bindkey "B q", :jump_to_last_edit
58
+ bindkey "B w", :jump_to_next_edit
59
+ bindkey "C , d", :diff_buffer
60
+ bindkey "C , g", :invoke_grep_search
61
+ #bindkey 'C , g', proc{invoke_grep_search}
62
+ bindkey "C , v", :auto_indent_buffer
63
+ bindkey "C , , d", :savedebug
64
+ bindkey "C , , u", :update_file_index
65
+ bindkey "C , s a", :buf_save_as
66
+ bindkey "C d d", [:delete_line, proc{buf.delete_line}, "Delete current line"]
67
+ bindkey "C enter || C return", [:line_action,proc{buf.handle_line_action()}, "Line action"]
68
+ bindkey "C p" , [:paste_after,proc{buf.paste(AFTER)},""] # TODO: implement as replace for visual mode
69
+ bindkey "V d" , [:delete_selection,proc{buf.delete(SELECTION)},""]
70
+
71
+ default_keys = {
72
+
73
+ # File handling
74
+ "C ctrl-s" => :buf_save,
75
+
76
+ # Buffer handling
77
+ "C B" => "bufs.switch",
78
+ "C tab" => "bufs.switch_to_last_buf",
79
+ # 'C , s'=> 'gui_select_buffer',
80
+ "C , r v b" => :buf_revert,
81
+ "C , c b" => "bufs.close_current_buffer",
82
+ #"C , b" => '$kbd.set_mode("S");gui_select_buffer',
83
+ "C , n b" => :buf_new,
84
+ # "C , , ." => "backup_all_buffers()",
85
+ "VC , , s" => :search_actions,
86
+
87
+
88
+ # MOVING
89
+ # 'VC h' => 'buf.move(BACKWARD_CHAR)',
90
+ "VC l" => "buf.move(FORWARD_CHAR)",
91
+ "VC j" => "buf.move(FORWARD_LINE)",
92
+ "VC k" => "buf.move(BACKWARD_LINE)",
93
+
94
+ "VC pagedown" => "page_down",
95
+ "VC pageup" => "page_up",
96
+
97
+ "VCI left" => "buf.move(BACKWARD_CHAR)",
98
+ "VCI right" => "buf.move(FORWARD_CHAR)",
99
+ "VCI down" => "buf.move(FORWARD_LINE)",
100
+ "VCI up" => "buf.move(BACKWARD_LINE)",
101
+
102
+ "VC w" => "buf.jump_word(FORWARD,WORD_START)",
103
+ "VC b" => "buf.jump_word(BACKWARD,WORD_START)",
104
+ "VC e" => "buf.jump_word(FORWARD,WORD_END)",
105
+ # 'C '=> 'buf.jump_word(BACKWARD,END)',#TODO
106
+ "VC f <char>" => "buf.jump_to_next_instance_of_char(<char>)",
107
+ "VC F <char>" => "buf.jump_to_next_instance_of_char(<char>,BACKWARD)",
108
+ "VC f space" => "buf.jump_to_next_instance_of_char(' ')",
109
+ "VC F space" => "buf.jump_to_next_instance_of_char(' ',BACKWARD)",
110
+
111
+ "VC /[1-9]/" => "set_next_command_count(<char>)",
112
+ # 'VC number=/[0-9]/+ g'=> 'jump_to_line(<number>)',
113
+ # 'VC X=/[0-9]/+ * Y=/[0-9]/+ '=> 'x_times_y(<X>,<Y>)',
114
+ "VC ^" => "buf.jump(BEGINNING_OF_LINE)",
115
+ "VC G($next_command_count!=nil)" => "buf.jump_to_line()",
116
+ "VC 0($next_command_count!=nil)" => "set_next_command_count(<char>)",
117
+ "VC 0($next_command_count==nil)" => "buf.jump(BEGINNING_OF_LINE)",
118
+ # 'C 0'=> 'buf.jump(BEGINNING_OF_LINE)',
119
+ "VC g g" => "buf.jump(START_OF_BUFFER)",
120
+ "VC g ;" => "buf.jump_to_last_edit",
121
+ "VC G" => "buf.jump(END_OF_BUFFER)",
122
+ # 'VC z z' => 'center_on_current_line',
123
+ "VC *" => "buf.jump_to_next_instance_of_word",
124
+
125
+ "C , e" => "invoke_command", # Currently eval
126
+
127
+ "VC /" => :find_in_buffer,
128
+
129
+ # READCHAR bindings
130
+
131
+ "R <char>" => "readchar_new_char(<char>)",
132
+
133
+ "C n" => "$search.jump_to_next()",
134
+ "C N" => "$search.jump_to_previous()",
135
+
136
+ # Debug
137
+ "C , d r p" => "start_ripl",
138
+ "C , D" => "debug_print_buffer",
139
+ "C , c s" => "bufs.close_scrap_buffers",
140
+ "C , d b" => "debug_print_buffer",
141
+ "C , d c" => "debug_dump_clipboard",
142
+ "C , d d" => "debug_dump_deltas",
143
+ "VC O" => "buf.jump(END_OF_LINE)",
144
+ "VC $" => "buf.jump(END_OF_LINE)",
145
+
146
+ "C o" => 'buf.jump(END_OF_LINE);buf.insert_txt("\n");$kbd.set_mode(:insert)',
147
+ "C X" => 'buf.jump(END_OF_LINE);buf.insert_txt("\n");',
148
+ "C A" => "buf.jump(END_OF_LINE);$kbd.set_mode(:insert)",
149
+ "C I" => "buf.jump(FIRST_NON_WHITESPACE);$kbd.set_mode(:insert)",
150
+ "C a" => "buf.move(FORWARD_CHAR);$kbd.set_mode(:insert)",
151
+ "C J" => "buf.join_lines()",
152
+ "C u" => "buf.undo()",
153
+
154
+ "C ^" => "buf.jump(BEGINNING_OF_LINE)",
155
+ "C /[1-9]/" => "set_next_command_count(<char>)",
156
+
157
+ # Command mode only:
158
+ "C ctrl-r" => "buf.redo()", # TODO:???
159
+ "C R" => "buf.redo()",
160
+ "C v" => "buf.start_visual_mode",
161
+ "C P" => "buf.paste(BEFORE)", # TODO: implement as replace for visual mode
162
+ "C space <char>" => "buf.insert_txt(<char>)",
163
+ "C space space" => "buf.insert_txt(' ')",
164
+ "C y y" => "buf.copy_line",
165
+ "C y O" => "buf.copy(:to_line_end)",
166
+ "C y 0" => "buf.copy(:to_line_start)",
167
+ "C y e" => "buf.copy(:to_word_end)", # TODO
168
+ #### Deleting
169
+ "C x" => "buf.delete(CURRENT_CHAR_FORWARD)",
170
+ # 'C d k'=> 'delete_line(BACKWARD)', #TODO
171
+ # 'C d j'=> 'delete_line(FORWARD)', #TODO
172
+ # 'C d d'=> 'buf.delete_cur_line',
173
+ "C d e" => "buf.delete2(:to_word_end)",
174
+ "C d O" => "buf.delete2(:to_line_end)",
175
+ "C d $" => "buf.delete2(:to_line_end)",
176
+ # 'C d e'=> 'buf.delete_to_next_word_end',
177
+ "C d <num> e" => "delete_next_word",
178
+ "C r <char>" => "buf.replace_with_char(<char>)", # TODO
179
+ "C , l b" => "load_buffer_list",
180
+ "C , l l" => "save_buffer_list",
181
+ "C , r <char>" => "set_register(<char>)", # TODO
182
+ "C , p <char>" => "buf.paste(BEFORE,<char>)", # TODO
183
+
184
+ "C ctrl-c" => "buf.comment_line()",
185
+ "C ctrl-x" => "buf.comment_line(:uncomment)",
186
+
187
+ # 'C 0($next_command_count==nil)'=> 'jump_to_beginning_of_line',
188
+
189
+ # Visual mode only:
190
+ "V esc" => "buf.end_visual_mode",
191
+ "V ctrl!" => "buf.end_visual_mode",
192
+ "V y" => "buf.copy_active_selection",
193
+ "V g U" => "buf.transform_selection(:upcase)",
194
+ "V g u" => "buf.transform_selection(:downcase)",
195
+ "V g c" => "buf.transform_selection(:capitalize)",
196
+ "V g s" => "buf.transform_selection(:swapcase)",
197
+ "V g r" => "buf.transform_selection(:reverse)",
198
+
199
+ "V x" => "buf.delete(SELECTION)",
200
+ # "V ctrl-c" => "buf.comment_selection",
201
+ "V ctrl-x" => "buf.comment_selection(:uncomment)",
202
+
203
+ "CI ctrl-v" => "buf.paste(BEFORE)",
204
+ "CI backspace" => "buf.delete(BACKWARD_CHAR)",
205
+
206
+ # Marks
207
+ "CV m <char>" => "buf.mark_current_position(<char>)",
208
+ 'CV \' <char>' => "buf.jump_to_mark(<char>)",
209
+ # "CV ''" =>'jump_to_mark(NEXT_MARK)', #TODO
210
+
211
+ "C i" => "$kbd.set_mode(:insert)",
212
+ "C ctrl!" => "$kbd.set_mode(:insert)",
213
+
214
+ # Macros
215
+ # (experimental, may not work correctly)
216
+ # "C q a" => '$macro.start_recording("a")',
217
+ "VC q <char>" => '$macro.start_recording(<char>)',
218
+ "VC q($macro.is_recording==true) " => "$macro.end_recording", # TODO
219
+ # 'C q'=> '$macro.end_recording', #TODO
220
+ "C q v" => "$macro.end_recording",
221
+ # 'C v'=> '$macro.end_recording',
222
+ # "C M" => '$macro.run_last_macro',
223
+ "C @ <char>" => '$macro.run_macro(<char>)',
224
+ "C , m S" => '$macro.save_macro("a")',
225
+ "C , m s" => '$macro.save',
226
+ "C , t r" => "run_tests()",
227
+
228
+ # "C ." => "repeat_last_action", # TODO
229
+ "VC ;" => "repeat_last_find",
230
+ # "CV Q" => :quit,
231
+ "CV ctrl-q" => :quit,
232
+ "CV , R" => "restart_application",
233
+ "I ctrl!" => "$kbd.set_mode(:command)",
234
+ "C shift!" => "buf.save",
235
+ "I <char>" => "buf.insert_txt(<char>)",
236
+ "I esc" => "$kbd.set_mode(:command)",
237
+
238
+ "I ctrl-d" => "buf.delete2(:to_word_end)",
239
+
240
+ # INSERT MODE: Moving
241
+ "I ctrl-a" => "buf.jump(BEGINNING_OF_LINE)",
242
+ "I ctrl-b" => "buf.move(BACKWARD_CHAR)",
243
+ "I ctrl-f" => "buf.move(FORWARD_CHAR)",
244
+ "I ctrl-n" => "buf.move(FORWARD_LINE)",
245
+ "I ctrl-p" => "buf.move(BACKWARD_LINE)",
246
+ "I ctrl-e" => "buf.jump(END_OF_LINE)", # context: mode:I, buttons down: {C}
247
+ "I alt-f" => "buf.jump_word(FORWARD,WORD_START)",
248
+ "I alt-b" => "buf.jump_word(BACKWARD,WORD_START)",
249
+
250
+ "I tab" => 'buf.insert_txt(" ")',
251
+ "I space" => 'buf.insert_txt(" ")',
252
+ # "I return" => 'buf.insert_new_line()',
253
+ }
254
+
255
+ default_keys.each { |key, value|
256
+ bindkey(key, value)
257
+ }
258
+
259
+
data/lib/vimamsa/macro.rb CHANGED
@@ -58,7 +58,7 @@ class Macro
58
58
  $macro_search_list = l
59
59
  $select_keys = ["h", "l", "f", "d", "s", "a", "g", "z"]
60
60
 
61
- qt_select_update_window(l, $select_keys.collect { |x| x.upcase },
61
+ gui_select_update_window(l, $select_keys.collect { |x| x.upcase },
62
62
  "gui_find_macro_select_callback",
63
63
  "gui_find_macro_update_callback")
64
64
  end
data/lib/vimamsa/main.rb CHANGED
@@ -28,7 +28,6 @@ $search_dirs = []
28
28
  $errors = []
29
29
 
30
30
  $cur_register = "a"
31
- $input_char_call_func = nil
32
31
  $debuginfo = {}
33
32
 
34
33
  $jump_sequence = []
@@ -51,7 +50,7 @@ end
51
50
 
52
51
  require "vimamsa/editor.rb"
53
52
 
54
- # load "qt_funcs.rb"
53
+ # load "gui_funcs.rb"
55
54
 
56
55
  $vma = Editor.new
57
56
  def vma()
data/lib/vimamsa/rbvma.rb CHANGED
@@ -1,4 +1,3 @@
1
- require "rbvma/version"
2
1
  require "gtk3"
3
2
  require "gtksourceview3"
4
3
  #require "gtksourceview4"
@@ -8,17 +7,24 @@ require "pathname"
8
7
  require "date"
9
8
  require "ripl/multi_line"
10
9
  require "json"
11
-
12
- puts "INIT rbvma"
10
+ require "listen"
13
11
 
14
12
  require "vimamsa/util"
15
- # require "rbvma/rbvma"
16
- require "vimamsa/main" #
17
- require "vimamsa/key_binding_tree" #
18
- require "vimamsa/actions" #
19
- require "vimamsa/macro" #
20
- require "vimamsa/buffer" #
21
- require "vimamsa/debug" #
13
+ require "vimamsa/main"
14
+
15
+ require "vimamsa/actions"
16
+ require "vimamsa/key_binding_tree"
17
+ require "vimamsa/key_actions"
18
+
19
+
20
+ require "vimamsa/gui"
21
+ require "vimamsa/gui_menu"
22
+ require "vimamsa/gui_select_window"
23
+ require "vimamsa/gui_sourceview"
24
+
25
+ require "vimamsa/macro"
26
+ require "vimamsa/buffer"
27
+ require "vimamsa/debug"
22
28
  require "vimamsa/constants"
23
29
  require "vimamsa/easy_jump"
24
30
  require "vimamsa/hook"
@@ -41,418 +47,12 @@ def vma()
41
47
  return $vma
42
48
  end
43
49
 
44
- $idle_scroll_to_mark = false
45
-
46
- def idle_func
47
- # puts "IDLEFUNC"
48
- if $idle_scroll_to_mark
49
- # Ripl.start :binding => binding
50
- # $view.get_visible_rect
51
- vr = $view.visible_rect
52
-
53
- # iter = b.get_iter_at(:offset => i)
54
-
55
- b = $view.buffer
56
- iter = b.get_iter_at(:offset => b.cursor_position)
57
- iterxy = $view.get_iter_location(iter)
58
- # puts "ITERXY" + iterxy.inspect
59
- # Ripl.start :binding => binding
60
-
61
- intr = iterxy.intersect(vr)
62
- if intr.nil?
63
- $view.set_cursor_pos($view.buffer.cursor_position)
64
- else
65
- $idle_scroll_to_mark = false
66
- end
67
-
68
- sleep(0.1)
69
- end
70
- sleep(0.01)
71
- return true
72
- end
73
-
74
- # qt_select_update_window(l, $select_keys.collect { |x| x.upcase },
75
- # "gui_find_macro_select_callback",
76
- # "gui_find_macro_update_callback")
77
- class SelectUpdateWindow
78
- COLUMN_JUMP_KEY = 0
79
- COLUMN_DESCRIPTION = 1
80
-
81
- def update_item_list(item_list)
82
- # puts item_list.inspect
83
- # Ripl.start :binding => binding
84
- @model.clear
85
- for item in item_list
86
- iter = @model.append
87
- v = ["", item[0]]
88
- puts v.inspect
89
- iter.set_values(v)
90
- end
91
-
92
- set_selected_row(0)
93
- end
94
-
95
- def set_selected_row(rownum)
96
- rownum = 0 if rownum < 0
97
- @selected_row = rownum
98
-
99
- if @model.count > 0
100
- path = Gtk::TreePath.new(@selected_row.to_s)
101
- iter = @model.get_iter(path)
102
- @tv.selection.select_iter(iter)
103
- end
104
- end
105
-
106
- def initialize(main_window, item_list, jump_keys, select_callback, update_callback)
107
- @window = Gtk::Window.new(:toplevel)
108
- # @window.screen = main_window.screen
109
- @window.title = "List Store"
110
-
111
- @selected_row = 0
112
-
113
- puts item_list.inspect
114
- @update_callback = method(update_callback)
115
- @select_callback = method(select_callback)
116
- # puts @update_callback_m.call("").inspect
117
-
118
- vbox = Gtk::Box.new(:vertical, 8)
119
- vbox.margin = 8
120
- @window.add(vbox)
121
-
122
- @entry = Gtk::SearchEntry.new
123
- @entry.width_chars = 45
124
- container = Gtk::Box.new(:horizontal, 10)
125
- # container.halign = :start
126
- container.halign = :center
127
- container.pack_start(@entry,
128
- :expand => false, :fill => false, :padding => 0)
129
-
130
- # create tree view
131
- @model = Gtk::ListStore.new(String, String)
132
- treeview = Gtk::TreeView.new(@model)
133
- treeview.search_column = COLUMN_DESCRIPTION
134
- @tv = treeview
135
- # item_list = @update_callback.call("")
136
- update_item_list(item_list)
137
-
138
- # Ripl.start :binding => binding
139
- @window.signal_connect("key-press-event") do |_widget, event|
140
- # puts "KEYPRESS 1"
141
- @entry.handle_event(event)
142
- end
143
-
144
- @entry.signal_connect("key_press_event") do |widget, event|
145
- # puts "KEYPRESS 2"
146
- if event.keyval == Gdk::Keyval::KEY_Down
147
- puts "DOWN"
148
- set_selected_row(@selected_row + 1)
149
- # fixed = iter[COLUMN_FIXED]
150
-
151
- true
152
- elsif event.keyval == Gdk::Keyval::KEY_Up
153
- set_selected_row(@selected_row - 1)
154
- puts "UP"
155
- true
156
- elsif event.keyval == Gdk::Keyval::KEY_Return
157
- path = Gtk::TreePath.new(@selected_row.to_s)
158
- iter = @model.get_iter(path)
159
- ret = iter[1]
160
- @select_callback.call(ret, @selected_row)
161
- @window.destroy
162
- # puts iter[1].inspect
163
- true
164
- elsif event.keyval == Gdk::Keyval::KEY_Escape
165
- @window.destroy
166
- true
167
- else
168
- false
169
- end
170
- end
171
-
172
- @entry.signal_connect("search-changed") do |widget|
173
- puts "search changed: #{widget.text || ""}"
174
- item_list = @update_callback.call(widget.text)
175
- update_item_list(item_list)
176
- # label.text = widget.text || ""
177
- end
178
- @entry.signal_connect("changed") { puts "[changed] " }
179
- @entry.signal_connect("next-match") { puts "[next-match] " }
180
-
181
- label = Gtk::Label.new(<<-EOF)
182
-
183
- Search:
184
- EOF
185
- vbox.pack_start(label, :expand => false, :fill => false, :padding => 0)
186
-
187
- vbox.pack_start(container, :expand => false, :fill => false, :padding => 0)
188
- sw = Gtk::ScrolledWindow.new(nil, nil)
189
- sw.shadow_type = :etched_in
190
- sw.set_policy(:never, :automatic)
191
- vbox.pack_start(sw, :expand => true, :fill => true, :padding => 0)
192
-
193
- sw.add(treeview)
194
-
195
- renderer = Gtk::CellRendererText.new
196
- column = Gtk::TreeViewColumn.new("JMP",
197
- renderer,
198
- "text" => COLUMN_JUMP_KEY)
199
- column.sort_column_id = COLUMN_JUMP_KEY
200
- treeview.append_column(column)
201
-
202
- renderer = Gtk::CellRendererText.new
203
- column = Gtk::TreeViewColumn.new("Description",
204
- renderer,
205
- "text" => COLUMN_DESCRIPTION)
206
- column.sort_column_id = COLUMN_DESCRIPTION
207
- treeview.append_column(column)
208
-
209
- @window.set_default_size(280, 500)
210
- puts "SelectUpdateWindow"
211
- end
212
-
213
- def run
214
- if !@window.visible?
215
- @window.show_all
216
- # add_spinner
217
- else
218
- @window.destroy
219
- # GLib::Source.remove(@tiemout) unless @timeout.zero?
220
- @timeout = 0
221
- end
222
- @window
223
- end
224
- end
225
-
226
- def center_on_current_line()
227
- b = $view.buffer
228
- iter = b.get_iter_at(:offset => b.cursor_position)
229
- within_margin = 0.0 #margin as a [0.0,0.5) fraction of screen size
230
- use_align = true
231
- xalign = 0.0 #0.0=top 1.0=bottom, 0.5=center
232
- yalign = 0.5
233
- $view.scroll_to_iter(iter, within_margin, use_align, xalign, yalign)
234
- end
235
-
236
- def qt_select_update_window(item_list, jump_keys, select_callback, update_callback)
237
- $selup = SelectUpdateWindow.new(nil, item_list, jump_keys, select_callback, update_callback)
238
- $selup.run
239
- end
240
-
241
- # ~/Drive/code/ruby-gnome/gtk3/sample/gtk-demo/search_entry2.rb
242
- # ~/Drive/code/ruby-gnome/gtk3/sample/gtk-demo/list_store.rb
243
-
244
- def qt_open_file_dialog(dirpath)
245
- dialog = Gtk::FileChooserDialog.new(:title => "Open file",
246
- :action => :open,
247
- :buttons => [[Gtk::Stock::OPEN, :accept],
248
- [Gtk::Stock::CANCEL, :cancel]])
249
- dialog.set_current_folder(dirpath)
250
-
251
- dialog.signal_connect("response") do |dialog, response_id|
252
- if response_id == Gtk::ResponseType::ACCEPT
253
- open_new_file(dialog.filename)
254
- # puts "uri = #{dialog.uri}"
255
- end
256
- dialog.destroy
257
- end
258
- dialog.run
259
- end
260
-
261
- def qt_file_saveas(dirpath)
262
- dialog = Gtk::FileChooserDialog.new(:title => "Save as",
263
- :action => :save,
264
- :buttons => [[Gtk::Stock::SAVE, :accept],
265
- [Gtk::Stock::CANCEL, :cancel]])
266
- dialog.set_current_folder(dirpath)
267
- dialog.signal_connect("response") do |dialog, response_id|
268
- if response_id == Gtk::ResponseType::ACCEPT
269
- file_saveas(dialog.filename)
270
- end
271
- dialog.destroy
272
- end
273
-
274
- dialog.run
275
- end
276
-
277
- def qt_create_buffer(id)
278
- puts "qt_create_buffer(#{id})"
279
- buf1 = GtkSource::Buffer.new()
280
- view = VSourceView.new()
281
-
282
- view.set_highlight_current_line(true)
283
- view.set_show_line_numbers(true)
284
- view.set_buffer(buf1)
285
-
286
- ssm = GtkSource::StyleSchemeManager.new
287
- ssm.set_search_path(ssm.search_path << ppath("styles/"))
288
- # sty = ssm.get_scheme("dark")
289
- sty = ssm.get_scheme("molokai_edit")
290
- # puts ssm.scheme_ids
291
-
292
- view.buffer.highlight_matching_brackets = true
293
- view.buffer.style_scheme = sty
294
-
295
- provider = Gtk::CssProvider.new
296
- provider.load(data: "textview { font-family: Monospace; font-size: 11pt; }")
297
- # provider.load(data: "textview { font-family: Arial; font-size: 12pt; }")
298
- view.style_context.add_provider(provider)
299
- view.wrap_mode = :char
300
-
301
- $vmag.buffers[id] = view
302
- end
303
-
304
- def gui_set_file_lang(id, lname)
305
- view = $vmag.buffers[id]
306
- lm = GtkSource::LanguageManager.new
307
- lang = nil
308
- lm.set_search_path(lm.search_path << ppath("lang/"))
309
- lang = lm.get_language(lname)
310
-
311
- view.buffer.language = lang
312
- view.buffer.highlight_syntax = true
313
- end
314
-
315
- def qt_process_deltas
316
- end
317
-
318
- def qt_add_image(imgpath, pos)
319
- end
320
-
321
- def qt_process_deltas
322
- end
323
-
324
- def qt_process_events
325
- end
326
-
327
- def qt_select_window_close(arg = nil)
328
- end
329
-
330
- def set_window_title(str)
331
- unimplemented
332
- end
333
-
334
- def render_text(tmpbuf, pos, selection_start, reset)
335
- unimplemented
336
- end
337
-
338
- def qt_set_buffer_contents(id, txt)
339
- # $vbuf.set_text(txt)
340
- puts "qt_set_buffer_contents(#{id}, txt)"
341
-
342
- $vmag.buffers[id].buffer.set_text(txt)
343
- end
344
-
345
- def qt_set_cursor_pos(id, pos)
346
- $view.set_cursor_pos(pos)
347
- # Ripl.start :binding => binding
348
- end
349
-
350
- def qt_set_selection_start(id, selection_start)
351
- end
352
-
353
- def qt_set_current_buffer(id)
354
- view = $vmag.buffers[id]
355
- puts "qt_set_current_buffer(#{id}), view=#{view}"
356
- buf1 = view.buffer
357
- $vmag.view = view
358
- $vmag.buf1 = buf1
359
- $view = view
360
- $vbuf = buf1
361
-
362
- $vmag.sw.remove($vmag.sw.child) if !$vmag.sw.child.nil?
363
- $vmag.sw.add(view)
364
-
365
- view.grab_focus
366
- #view.set_focus(10)
367
- view.set_cursor_visible(true)
368
- #view.move_cursor(1, 1, false)
369
- view.place_cursor_onscreen
370
-
371
- #TODO:
372
- # itr = view.buffer.get_iter_at(:offset => 0)
373
- # view.buffer.place_cursor(itr)
374
-
375
- wtitle = ""
376
- wtitle = buf.fname if !buf.fname.nil?
377
- $vmag.window.title = wtitle
378
- $vmag.sw.show_all
379
- end
380
-
381
50
  def unimplemented
382
51
  puts "unimplemented"
383
52
  end
384
53
 
385
- def center_where_cursor
386
- unimplemented
387
- end
388
-
389
- def paste_system_clipboard()
390
- # clipboard = $vmag.window.get_clipboard(Gdk::Selection::CLIPBOARD)
391
- utf8_string = Gdk::Atom.intern("UTF8_STRING")
392
- # x = clipboard.request_contents(utf8_string)
393
-
394
- widget = Gtk::Invisible.new
395
- clipboard = Gtk::Clipboard.get_default($vmag.window.display)
396
- received_text = ""
397
54
 
398
- target_string = Gdk::Selection::TARGET_STRING
399
- ti = clipboard.request_contents(target_string)
400
-
401
- # clipboard.request_contents(target_string) do |_clipboard, selection_data|
402
- # received_text = selection_data.text
403
- # puts "received_text=#{received_text}"
404
- # end
405
- if clipboard.wait_is_text_available?
406
- received_text = clipboard.wait_for_text
407
- end
408
-
409
- if received_text != "" and !received_text.nil?
410
- max_clipboard_items = 100
411
- if received_text != $clipboard[-1]
412
- #TODO: HACK
413
- $paste_lines = false
414
- end
415
- $clipboard << received_text
416
- # puts $clipboard[-1]
417
- $clipboard = $clipboard[-([$clipboard.size, max_clipboard_items].min)..-1]
418
- end
419
- return received_text
420
- end
421
-
422
- def set_system_clipboard(arg)
423
- # return if arg.class != String
424
- # return if s.size < 1
425
- # utf8_string = Gdk::Atom.intern("UTF8_STRING")
426
- widget = Gtk::Invisible.new
427
- clipboard = Gtk::Clipboard.get_default($vmag.window.display)
428
- clipboard.text = arg
429
- end
430
-
431
- def get_visible_area()
432
- view = $view
433
- vr = view.visible_rect
434
- startpos = view.get_iter_at_position_raw(vr.x, vr.y)[1].offset
435
- endpos = view.get_iter_at_position_raw(vr.x + vr.width, vr.y + vr.height)[1].offset
436
- return [startpos, endpos]
437
- end
438
-
439
- def page_up
440
- $view.signal_emit("move-cursor", Gtk::MovementStep.new(:PAGES), -1, false)
441
- return true
442
- end
443
-
444
- def page_down
445
- $view.signal_emit("move-cursor", Gtk::MovementStep.new(:PAGES), 1, false)
446
- return true
447
- end
448
-
449
- # module Rbvma
450
- # # Your code goes here...
451
- # def foo
452
- # puts "BAR"
453
- # end
454
- # end
455
- $debug = true
55
+ $debug = false
456
56
 
457
57
  def scan_indexes(txt, regex)
458
58
  # indexes = txt.enum_for(:scan, regex).map { Regexp.last_match.begin(0) + 1 }
@@ -462,553 +62,4 @@ end
462
62
 
463
63
  $update_cursor = false
464
64
 
465
- class VSourceView < GtkSource::View
466
- def initialize(title = nil)
467
- # super(:toplevel)
468
- super()
469
- puts "vsource init"
470
- @last_keyval = nil
471
- @last_event = [nil, nil]
472
-
473
- signal_connect("key_press_event") do |widget, event|
474
- handle_key_event(event, :key_press_event)
475
- true
476
- end
477
-
478
- signal_connect("key_release_event") do |widget, event|
479
- handle_key_event(event, :key_release_event)
480
- true
481
- end
482
-
483
- signal_connect("move-cursor") do |widget, event|
484
- $update_cursor = true
485
- false
486
- end
487
-
488
- signal_connect "button-release-event" do |widget, event|
489
- $buffer.set_pos(buffer.cursor_position)
490
- false
491
- end
492
- @curpos_mark = nil
493
- end
494
-
495
- def handle_key_event(event, sig)
496
- if $update_cursor
497
- curpos = buffer.cursor_position
498
- puts "MOVE CURSOR: #{curpos}"
499
- buf.set_pos(curpos)
500
- $update_cursor = false
501
- end
502
- puts $view.visible_rect.inspect
503
-
504
- puts "key event"
505
- puts event
506
-
507
- key_name = event.string
508
- if event.state.control_mask?
509
- key_name = Gdk::Keyval.to_name(event.keyval)
510
- # Gdk::Keyval.to_name()
511
- end
512
-
513
- keyval_trans = {}
514
- keyval_trans[Gdk::Keyval::KEY_Control_L] = "ctrl"
515
- keyval_trans[Gdk::Keyval::KEY_Control_R] = "ctrl"
516
-
517
- keyval_trans[Gdk::Keyval::KEY_Escape] = "esc"
518
-
519
- keyval_trans[Gdk::Keyval::KEY_Return] = "enter"
520
- keyval_trans[Gdk::Keyval::KEY_ISO_Enter] = "enter"
521
- keyval_trans[Gdk::Keyval::KEY_KP_Enter] = "enter"
522
- keyval_trans[Gdk::Keyval::KEY_Alt_L] = "alt"
523
- keyval_trans[Gdk::Keyval::KEY_Alt_R] = "alt"
524
-
525
- keyval_trans[Gdk::Keyval::KEY_BackSpace] = "backspace"
526
- keyval_trans[Gdk::Keyval::KEY_KP_Page_Down] = "pagedown"
527
- keyval_trans[Gdk::Keyval::KEY_KP_Page_Up] = "pageup"
528
- keyval_trans[Gdk::Keyval::KEY_Page_Down] = "pagedown"
529
- keyval_trans[Gdk::Keyval::KEY_Page_Up] = "pageup"
530
- keyval_trans[Gdk::Keyval::KEY_Left] = "left"
531
- keyval_trans[Gdk::Keyval::KEY_Right] = "right"
532
- keyval_trans[Gdk::Keyval::KEY_Down] = "down"
533
- keyval_trans[Gdk::Keyval::KEY_Up] = "up"
534
- keyval_trans[Gdk::Keyval::KEY_space] = "space"
535
-
536
- keyval_trans[Gdk::Keyval::KEY_Shift_L] = "shift"
537
- keyval_trans[Gdk::Keyval::KEY_Shift_R] = "shift"
538
- keyval_trans[Gdk::Keyval::KEY_Tab] = "tab"
539
-
540
- key_trans = {}
541
- key_trans["\e"] = "esc"
542
- tk = keyval_trans[event.keyval]
543
- key_name = tk if !tk.nil?
544
-
545
- key_str_parts = []
546
- key_str_parts << "ctrl" if event.state.control_mask? and key_name != "ctrl"
547
- key_str_parts << "alt" if event.state.mod1_mask? and key_name != "alt"
548
-
549
- key_str_parts << key_name
550
- key_str = key_str_parts.join("-")
551
- keynfo = { :key_str => key_str, :key_name => key_name, :keyval => event.keyval }
552
- puts keynfo.inspect
553
- # $kbd.match_key_conf(key_str, nil, :key_press)
554
- # puts "key_str=#{key_str} key_"
555
-
556
- if key_str != "" # or prefixed_key_str != ""
557
- if sig == :key_release_event and event.keyval == @last_keyval
558
- $kbd.match_key_conf(key_str + "!", nil, :key_release)
559
- @last_event = [event, :key_release]
560
- elsif sig == :key_press_event
561
- $kbd.match_key_conf(key_str, nil, :key_press)
562
- @last_event = [event, key_str, :key_press]
563
- end
564
- @last_keyval = event.keyval #TODO: outside if?
565
- end
566
-
567
- handle_deltas
568
-
569
- # set_focus(5)
570
- # false
571
-
572
- end
573
-
574
- def pos_to_coord(i)
575
- b = buffer
576
- iter = b.get_iter_at(:offset => i)
577
- iterxy = get_iter_location(iter)
578
- winw = parent_window.width
579
- view_width = visible_rect.width
580
- gutter_width = winw - view_width
581
-
582
- x = iterxy.x + gutter_width
583
- y = iterxy.y
584
-
585
- # buffer_to_window_coords(Gtk::TextWindowType::TEXT, iterxy.x, iterxy.y).inspect
586
- # puts buffer_to_window_coords(Gtk::TextWindowType::TEXT, x, y).inspect
587
- (x, y) = buffer_to_window_coords(Gtk::TextWindowType::TEXT, x, y)
588
- # Ripl.start :binding => binding
589
-
590
- return [x, y]
591
- end
592
-
593
- def handle_deltas()
594
- any_change = false
595
- while d = buf.deltas.shift
596
- any_change = true
597
- pos = d[0]
598
- op = d[1]
599
- num = d[2]
600
- txt = d[3]
601
- if op == DELETE
602
- startiter = buffer.get_iter_at(:offset => pos)
603
- enditer = buffer.get_iter_at(:offset => pos + num)
604
- buffer.delete(startiter, enditer)
605
- elsif op == INSERT
606
- startiter = buffer.get_iter_at(:offset => pos)
607
- buffer.insert(startiter, txt)
608
- end
609
- end
610
- if any_change
611
- qt_set_cursor_pos($buffer.id, $buffer.pos) #TODO: only when necessary
612
- end
613
-
614
- # sanity_check #TODO
615
- end
616
-
617
- def sanity_check()
618
- a = buffer.text
619
- b = buf.to_s
620
- # puts "===================="
621
- # puts a.lines[0..10].join()
622
- # puts "===================="
623
- # puts b.lines[0..10].join()
624
- # puts "===================="
625
- if a == b
626
- puts "Buffers match"
627
- else
628
- puts "ERROR: Buffer's don't match."
629
- end
630
- end
631
-
632
- def set_cursor_pos(pos)
633
- # return
634
- itr = buffer.get_iter_at(:offset => pos)
635
- itr2 = buffer.get_iter_at(:offset => pos + 1)
636
- buffer.place_cursor(itr)
637
-
638
- # $view.signal_emit("extend-selection", Gtk::MovementStep.new(:PAGES), -1, false)
639
-
640
- within_margin = 0.075 #margin as a [0.0,0.5) fraction of screen size
641
- use_align = false
642
- xalign = 0.5 #0.0=top 1.0=bottom, 0.5=center
643
- yalign = 0.5
644
-
645
- if @curpos_mark.nil?
646
- @curpos_mark = buffer.create_mark("cursor", itr, false)
647
- else
648
- buffer.move_mark(@curpos_mark, itr)
649
- end
650
- scroll_to_mark(@curpos_mark, within_margin, use_align, xalign, yalign)
651
- $idle_scroll_to_mark = true
652
- ensure_cursor_visible
653
-
654
- # scroll_to_iter(itr, within_margin, use_align, xalign, yalign)
655
-
656
- # $view.signal_emit("extend-selection", Gtk::TextExtendSelection.new, itr,itr,itr2)
657
- # Ripl.start :binding => binding
658
- draw_cursor
659
-
660
- return true
661
- end
662
-
663
- def cursor_visible_idle_func
664
- puts "cursor_visible_idle_func"
665
- # From https://picheta.me/articles/2013/08/gtk-plus--a-method-to-guarantee-scrolling.html
666
- # vr = visible_rect
667
-
668
- # b = $view.buffer
669
- # iter = buffer.get_iter_at(:offset => buffer.cursor_position)
670
- # iterxy = get_iter_location(iter)
671
-
672
- sleep(0.01)
673
- # intr = iterxy.intersect(vr)
674
- if is_cursor_visible == false
675
- # set_cursor_pos(buffer.cursor_position)
676
-
677
- itr = buffer.get_iter_at(:offset => buffer.cursor_position)
678
-
679
- within_margin = 0.075 #margin as a [0.0,0.5) fraction of screen size
680
- use_align = false
681
- xalign = 0.5 #0.0=top 1.0=bottom, 0.5=center
682
- yalign = 0.5
683
-
684
- scroll_to_iter(itr, within_margin, use_align, xalign, yalign)
685
-
686
- # return true # Call this func again
687
- else
688
- return false # Don't call this idle func again
689
- end
690
- end
691
-
692
- def is_cursor_visible
693
- vr = visible_rect
694
- iter = buffer.get_iter_at(:offset => buffer.cursor_position)
695
- iterxy = get_iter_location(iter)
696
- iterxy.width = 1 if iterxy.width == 0
697
- iterxy.height = 1 if iterxy.height == 0
698
-
699
- intr = iterxy.intersect(vr)
700
- if intr.nil?
701
- puts iterxy.inspect
702
- puts vr.inspect
703
- # Ripl.start :binding => binding
704
-
705
- # exit!
706
- return false
707
- else
708
- return true
709
- end
710
- end
711
65
 
712
- def ensure_cursor_visible
713
- if is_cursor_visible == false
714
- Thread.new {
715
- sleep 0.01
716
- GLib::Idle.add(proc { cursor_visible_idle_func })
717
- }
718
- end
719
- end
720
-
721
- def draw_cursor
722
- if is_command_mode
723
- itr = buffer.get_iter_at(:offset => buf.pos)
724
- itr2 = buffer.get_iter_at(:offset => buf.pos + 1)
725
- $view.buffer.select_range(itr, itr2)
726
- elsif buf.visual_mode?
727
- puts "VISUAL MODE"
728
- (_start, _end) = buf.get_visual_mode_range2
729
- puts "#{_start}, #{_end}"
730
- itr = buffer.get_iter_at(:offset => _start)
731
- itr2 = buffer.get_iter_at(:offset => _end + 1)
732
- $view.buffer.select_range(itr, itr2)
733
- else # Insert mode
734
- itr = buffer.get_iter_at(:offset => buf.pos)
735
- $view.buffer.select_range(itr, itr)
736
- puts "INSERT MODE"
737
- end
738
- end
739
-
740
- # def quit
741
- # destroy
742
- # true
743
- # end
744
- end
745
-
746
- class VMAg
747
- attr_accessor :buffers, :sw, :view, :buf1, :window
748
-
749
- VERSION = "1.0"
750
-
751
- HEART = "♥"
752
- RADIUS = 150
753
- N_WORDS = 5
754
- FONT = "Serif 18"
755
- TEXT = "I ♥ GTK+"
756
-
757
- def initialize()
758
- @show_overlay = true
759
- @da = nil
760
- @buffers = {}
761
- @view = nil
762
- @buf1 = nil
763
- end
764
-
765
- def run
766
- init_window
767
- # init_rtext
768
- Gtk.main
769
- end
770
-
771
- def start_overlay_draw()
772
- @da = Gtk::Fixed.new
773
- @overlay.add_overlay(@da)
774
- @overlay.set_overlay_pass_through(@da, true)
775
- end
776
-
777
- def clear_overlay()
778
- if @da != nil
779
- @overlay.remove(@da)
780
- end
781
- end
782
-
783
- def overlay_draw_text(text, textpos)
784
- # puts "overlay_draw_text #{[x,y]}"
785
- (x, y) = @view.pos_to_coord(textpos)
786
- # puts "overlay_draw_text #{[x,y]}"
787
- label = Gtk::Label.new("<span background='#00000088' foreground='#ff0000' weight='ultrabold'>#{text}</span>")
788
- label.use_markup = true
789
- @da.put(label, x, y)
790
- end
791
-
792
- def end_overlay_draw()
793
- @da.show_all
794
- end
795
-
796
- def toggle_overlay
797
- @show_overlay = @show_overlay ^ 1
798
- if !@show_overlay
799
- if @da != nil
800
- @overlay.remove(@da)
801
- end
802
- return
803
- else
804
- @da = Gtk::Fixed.new
805
- @overlay.add_overlay(@da)
806
- @overlay.set_overlay_pass_through(@da, true)
807
- end
808
-
809
- (startpos, endpos) = get_visible_area
810
- s = @view.buffer.text
811
- wpos = s.enum_for(:scan, /\W(\w)/).map { Regexp.last_match.begin(0) + 1 }
812
- wpos = wpos[0..130]
813
-
814
- # vr = @view.visible_rect
815
- # # gtk_text_view_get_line_at_y
816
- # # gtk_text_view_get_iter_at_position
817
- # gtk_text_view_get_iter_at_position(vr.
818
- # istart = @view.get_iter_at_position(vr.x,vr.y)
819
- # istart = @view.get_iter_at_y(vr.y)
820
- # startpos = @view.get_iter_at_position_raw(vr.x,vr.y)[1].offset
821
- # endpos = @view.get_iter_at_position_raw(vr.x+vr.width,vr.y+vr.height)[1].offset
822
- # puts "startpos,endpos:#{[startpos, endpos]}"
823
-
824
- da = @da
825
- if false
826
- da.signal_connect "draw" do |widget, cr|
827
- cr.save
828
- for pos in wpos
829
- (x, y) = @view.pos_to_coord(pos)
830
-
831
- layout = da.create_pango_layout("XY")
832
- desc = Pango::FontDescription.new("sans bold 11")
833
- layout.font_description = desc
834
-
835
- cr.move_to(x, y)
836
- # cr.move_to(gutter_width, 300)
837
- cr.pango_layout_path(layout)
838
-
839
- cr.set_source_rgb(1.0, 0.0, 0.0)
840
- cr.fill_preserve
841
- end
842
- cr.restore
843
- false # = draw other
844
- # true # = Don't draw others
845
- end
846
- end
847
-
848
- for pos in wpos
849
- (x, y) = @view.pos_to_coord(pos)
850
- # da.put(Gtk::Label.new("AB"), x, y)
851
- label = Gtk::Label.new("<span background='#00000088' foreground='#ff0000' weight='ultrabold'>AB</span>")
852
- label.use_markup = true
853
- da.put(label, x, y)
854
- end
855
-
856
- # puts @view.pos_to_coord(300).inspect
857
-
858
- @da.show_all
859
- end
860
-
861
- def init_keybindings
862
- $kbd = KeyBindingTree.new()
863
- $kbd.add_mode("C", :command)
864
- $kbd.add_mode("I", :insert)
865
- $kbd.add_mode("V", :visual)
866
- $kbd.add_mode("M", :minibuffer)
867
- $kbd.add_mode("R", :readchar)
868
- $kbd.add_mode("B", :browse)
869
- $kbd.set_default_mode(:command)
870
- require "default_key_bindings"
871
-
872
- $macro = Macro.new
873
-
874
- # bindkey "VC j", "buf.move(FORWARD_LINE)"
875
- bindkey "VC j", "puts('j_key_action')"
876
- bindkey "VC ctrl-j", "puts('ctrl_j_key_action')"
877
-
878
- bindkey "VC l", "buf.move(FORWARD_CHAR)"
879
- bindkey "C x", "buf.delete(CURRENT_CHAR_FORWARD)"
880
- # bindkey "C r <char>", "buf.replace_with_char(<char>)"
881
- bindkey "I space", 'buf.insert_txt(" ")'
882
-
883
- bindkey "VC l", "buf.move(FORWARD_CHAR)"
884
- bindkey "VC j", "buf.move(FORWARD_LINE)"
885
- bindkey "VC k", "buf.move(BACKWARD_LINE)"
886
- bindkey "VC h", "buf.move(BACKWARD_CHAR)"
887
- end
888
-
889
- def handle_deltas()
890
- while d = buf.deltas.shift
891
- pos = d[0]
892
- op = d[1]
893
- num = d[2]
894
- txt = d[3]
895
- if op == DELETE
896
- startiter = @buf1.get_iter_at(:offset => pos)
897
- enditer = @buf1.get_iter_at(:offset => pos + num)
898
- @buf1.delete(startiter, enditer)
899
- elsif op == INSERT
900
- startiter = @buf1.get_iter_at(:offset => pos)
901
- @buf1.insert(startiter, txt)
902
- end
903
- end
904
- end
905
-
906
- def add_to_minibuf(msg)
907
- startiter = @minibuf.buffer.get_iter_at(:offset => 0)
908
- @minibuf.buffer.insert(startiter, "#{msg}\n")
909
- @minibuf.signal_emit("move-cursor", Gtk::MovementStep.new(:PAGES), -1, false)
910
- end
911
-
912
- def init_minibuffer()
913
- # Init minibuffer
914
- sw = Gtk::ScrolledWindow.new
915
- sw.set_policy(:automatic, :automatic)
916
- overlay = Gtk::Overlay.new
917
- overlay.add(sw)
918
- @vpaned.pack2(overlay, :resize => false)
919
- # overlay.set_size_request(-1, 50)
920
- # $ovrl = overlay
921
- # $ovrl.set_size_request(-1, 30)
922
- $sw2 = sw
923
- sw.set_size_request(-1, 12)
924
-
925
- view = VSourceView.new()
926
- view.set_highlight_current_line(false)
927
- view.set_show_line_numbers(false)
928
- # view.set_buffer(buf1)
929
- ssm = GtkSource::StyleSchemeManager.new
930
- ssm.set_search_path(ssm.search_path << ppath("styles/"))
931
- sty = ssm.get_scheme("molokai_edit")
932
- view.buffer.highlight_matching_brackets = false
933
- view.buffer.style_scheme = sty
934
- provider = Gtk::CssProvider.new
935
- # provider.load(data: "textview { font-family: Monospace; font-size: 11pt; }")
936
- provider.load(data: "textview { font-family: Arial; font-size: 10pt; color:#ff0000}")
937
- view.style_context.add_provider(provider)
938
- view.wrap_mode = :char
939
- @minibuf = view
940
- # Ripl.start :binding => binding
941
- # startiter = view.buffer.get_iter_at(:offset => 0)
942
- message("STARTUP")
943
- sw.add(view)
944
- end
945
-
946
- def init_header_bar()
947
- # @window = Gtk::Window.new(:toplevel)
948
- # @window.screen = main_window.screen
949
- # @window.set_default_size(600, 400)
950
-
951
- header = Gtk::HeaderBar.new
952
- header.show_close_button = true
953
- header.title = "Welcome to Facebook - Log in, sign up or learn more"
954
- header.has_subtitle = false
955
-
956
- # icon = Gio::ThemedIcon.new("mail-send-receive-symbolic")
957
- # icon = Gio::ThemedIcon.new("document-open-symbolic")
958
- # icon = Gio::ThemedIcon.new("dialog-password")
959
-
960
- #edit-redo edit-paste edit-find-replace edit-undo edit-find edit-cut edit-copy
961
- #document-open document-save document-save-as document-properties document-new
962
- button = Gtk::Button.new
963
- icon = Gio::ThemedIcon.new("open-menu-symbolic")
964
- image = Gtk::Image.new(:icon => icon, :size => :button)
965
- button.add(image)
966
- header.pack_end(button)
967
-
968
- button = Gtk::Button.new
969
- icon = Gio::ThemedIcon.new("document-revert-symbolic")
970
- image = Gtk::Image.new(:icon => icon, :size => :button)
971
- button.add(image)
972
- header.pack_end(button)
973
-
974
- box = Gtk::Box.new(:horizontal, 0)
975
- box.style_context.add_class("linked")
976
-
977
- button = Gtk::Button.new
978
- image = Gtk::Image.new(:icon_name => "pan-start-symbolic", :size => :button)
979
- button.add(image)
980
- box.add(button)
981
-
982
- button = Gtk::Button.new
983
- image = Gtk::Image.new(:icon_name => "pan-end-symbolic", :size => :button)
984
- button.add(image)
985
- box.add(button)
986
-
987
- header.pack_start(box)
988
- @window.titlebar = header
989
- @window.add(Gtk::TextView.new)
990
- end
991
-
992
- def init_window
993
- @window = Gtk::Window.new(:toplevel)
994
- @window.set_default_size(650, 850)
995
- @window.title = "Multiple Views"
996
- @window.show_all
997
- # vpaned = Gtk::Paned.new(:horizontal)
998
- @vpaned = Gtk::Paned.new(:vertical)
999
- @window.add(@vpaned)
1000
-
1001
- @sw = Gtk::ScrolledWindow.new
1002
- @sw.set_policy(:automatic, :automatic)
1003
- @overlay = Gtk::Overlay.new
1004
- @overlay.add(@sw)
1005
- @vpaned.pack1(@overlay, :resize => true)
1006
-
1007
- init_minibuffer
1008
- init_header_bar
1009
-
1010
- @window.show_all
1011
-
1012
- vma.start
1013
- end
1014
- end