troshka 0.0.3 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/troshka +5 -3
- data/lib/shirka/app.rb +41 -0
- data/lib/shirka/components.rb +31 -0
- data/lib/shirka/controller.rb +57 -0
- data/lib/shirka/eventalk.rb +41 -0
- data/lib/shirka/qt.rb +4 -0
- data/lib/shirka/qt/app.rb +21 -0
- data/lib/shirka/qt/list/controller.rb +38 -0
- data/lib/shirka/qt/list/view.rb +23 -0
- data/lib/shirka/qt/list_item/controller.rb +31 -0
- data/lib/shirka/qt/list_item/view.rb +19 -0
- data/lib/shirka/qt/multipanel/controller.rb +8 -0
- data/lib/shirka/qt/multipanel/view.rb +31 -0
- data/lib/shirka/qt/tab/view.rb +16 -0
- data/lib/shirka/qt/tree/controller.rb +40 -0
- data/lib/shirka/qt/tree/view.rb +26 -0
- data/lib/shirka/qt/tree_item/controller.rb +51 -0
- data/lib/shirka/qt/tree_item/view.rb +23 -0
- data/lib/shirka/shirka.rb +8 -0
- data/lib/shirka/view.rb +47 -0
- data/lib/troshka/app.rb +12 -52
- data/lib/troshka/detail/controller.rb +25 -0
- data/lib/troshka/detail/view.rb +5 -0
- data/lib/troshka/detail_panel_enumerable/controller.rb +14 -0
- data/lib/troshka/detail_panel_enumerable/view.rb +5 -0
- data/lib/troshka/detail_panel_hash/controller.rb +14 -0
- data/lib/troshka/detail_panel_hash/view.rb +5 -0
- data/lib/troshka/detail_panel_item_enumerable/controller.rb +14 -0
- data/lib/troshka/detail_panel_item_enumerable/view.rb +10 -0
- data/lib/troshka/detail_panel_item_hash/controller.rb +14 -0
- data/lib/troshka/detail_panel_item_hash/view.rb +10 -0
- data/lib/troshka/detail_panel_item_object/controller.rb +4 -0
- data/lib/troshka/detail_panel_item_object/view.rb +6 -0
- data/lib/troshka/detail_panel_object/controller.rb +5 -0
- data/lib/troshka/detail_panel_object/view.rb +9 -0
- data/lib/troshka/editor/bond_completer.rb +14 -0
- data/lib/troshka/editor/completer.rb +4 -0
- data/lib/troshka/editor/controller.rb +71 -0
- data/lib/troshka/editor/line.rb +43 -0
- data/lib/troshka/editor/qscintilla_view.rb +56 -0
- data/lib/troshka/editor/qtextedit_view.rb +28 -0
- data/lib/troshka/editor/qxscintilla.rb +98 -0
- data/lib/troshka/editor/shell.rb +30 -0
- data/lib/troshka/main/controller.rb +16 -0
- data/lib/troshka/main/view.rb +50 -0
- data/lib/troshka/methods/controller.rb +16 -0
- data/lib/troshka/methods/view.rb +13 -0
- data/lib/troshka/methods_item/controller.rb +4 -0
- data/lib/troshka/methods_item/view.rb +5 -0
- data/lib/troshka/output/controller.rb +13 -0
- data/lib/troshka/output/view.rb +11 -0
- data/lib/troshka/output_item/controller.rb +15 -0
- data/lib/troshka/output_item/view.rb +9 -0
- data/lib/troshka/output_item_code/controller.rb +5 -0
- data/lib/troshka/output_item_code/view.rb +5 -0
- data/lib/troshka/output_item_exception/controller.rb +2 -0
- data/lib/troshka/output_item_exception/view.rb +6 -0
- data/lib/troshka/output_item_obj/controller.rb +2 -0
- data/lib/troshka/output_item_obj/view.rb +2 -0
- data/lib/troshka/output_item_output/controller.rb +5 -0
- data/lib/troshka/output_item_output/view.rb +5 -0
- data/resources/logo.png +0 -0
- metadata +63 -27
- data/lib/troshka.rb +0 -15
- data/lib/troshka/detail.rb +0 -25
- data/lib/troshka/detail_anything.rb +0 -9
- data/lib/troshka/detail_array_hash.rb +0 -86
- data/lib/troshka/editor.rb +0 -113
- data/lib/troshka/output.rb +0 -58
- data/lib/troshka/qt_editor.rb +0 -27
- data/lib/troshka/shell.rb +0 -27
@@ -0,0 +1,43 @@
|
|
1
|
+
class Line
|
2
|
+
attr_accessor :cursor
|
3
|
+
attr_accessor :selection
|
4
|
+
|
5
|
+
def initialize(text, cursor=0)
|
6
|
+
@text = text
|
7
|
+
@cursor = cursor
|
8
|
+
end
|
9
|
+
|
10
|
+
def word(separator=/[ ,();]/)
|
11
|
+
word_begin = @text.rindex(separator, cursor-1)+1 rescue 0
|
12
|
+
word_begin = 0 if word_begin.nil?
|
13
|
+
word_end = @text.index(separator, cursor)
|
14
|
+
word_end = size if word_end.nil?
|
15
|
+
|
16
|
+
[word_begin, word_end]
|
17
|
+
end
|
18
|
+
|
19
|
+
def text(range=nil)
|
20
|
+
if range.nil?
|
21
|
+
@text
|
22
|
+
else
|
23
|
+
if range[0]==range[1]
|
24
|
+
""
|
25
|
+
else
|
26
|
+
@text[range[0]..range[1]-1]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def replace_selection_text(text)
|
32
|
+
pre = self.text [0, selection.first]
|
33
|
+
post = self.text [selection[1], size]
|
34
|
+
|
35
|
+
@text = "#{pre}#{text}#{post}"
|
36
|
+
@cursor = selection[1] + text.size
|
37
|
+
@selection = nil
|
38
|
+
end
|
39
|
+
|
40
|
+
def size
|
41
|
+
@text.size
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require_relative 'qxscintilla'
|
2
|
+
|
3
|
+
class EditorView < Shirka::View
|
4
|
+
def widget_class
|
5
|
+
Qx::Scintilla
|
6
|
+
end
|
7
|
+
|
8
|
+
def build(widget)
|
9
|
+
widget.setAutoIndent true
|
10
|
+
widget.setIndentationGuides true
|
11
|
+
widget.setIndentationWidth 2
|
12
|
+
widget.setFolding ::Qsci::Scintilla::PlainFoldStyle
|
13
|
+
widget.setLexer ::Qsci::LexerRuby.new
|
14
|
+
widget.setMarginWidth 1, 0
|
15
|
+
|
16
|
+
# Events
|
17
|
+
widget.key_pressed do |e|
|
18
|
+
# Autocompletion hotkey
|
19
|
+
if e.key==Qt::Key_Space && e.modifiers==Qt::Control_Modifier
|
20
|
+
controller.autocompletion_list_requesting \
|
21
|
+
widget.current_line_text, widget.current_column_number rescue pust $!
|
22
|
+
e.continue = false
|
23
|
+
# Enter code hotkey
|
24
|
+
elsif e.key==Qt::Key_Return && e.modifiers==Qt::Control_Modifier
|
25
|
+
controller.code_entering widget.text
|
26
|
+
e.continue = false
|
27
|
+
end
|
28
|
+
end #key_pressed
|
29
|
+
|
30
|
+
widget.user_list_activated do |id, text|
|
31
|
+
controller.autocompletion_item_selecting text
|
32
|
+
end
|
33
|
+
|
34
|
+
end #build
|
35
|
+
|
36
|
+
def autocompletion_list_requested(list, selection)
|
37
|
+
widget.move_cursor(column: selection.first)
|
38
|
+
widget.show_user_list 1, list
|
39
|
+
widget.move_cursor(column: selection[1])
|
40
|
+
end
|
41
|
+
|
42
|
+
def autocompletion_item_selected(line, cursor)
|
43
|
+
widget.replace_line line
|
44
|
+
widget.move_cursor(column: cursor)
|
45
|
+
end
|
46
|
+
|
47
|
+
def on_code_evaluated(e)
|
48
|
+
widget.text = ""
|
49
|
+
end
|
50
|
+
|
51
|
+
def replace_code(code)
|
52
|
+
widget.text = code
|
53
|
+
widget.move_cursor_to_end
|
54
|
+
widget.setFocus
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class EditorView < Shirka::View
|
2
|
+
def widget_class
|
3
|
+
Qt::TextEdit
|
4
|
+
end
|
5
|
+
|
6
|
+
def build(widget)
|
7
|
+
v = self
|
8
|
+
|
9
|
+
widget.define_singleton_method :keyPressEvent do |evt|
|
10
|
+
if evt.key==Qt::Key_Return && evt.modifiers==Qt::Control_Modifier
|
11
|
+
v.controller.code_entering toPlainText
|
12
|
+
else
|
13
|
+
super evt
|
14
|
+
end
|
15
|
+
end #kewyPressEvent
|
16
|
+
end
|
17
|
+
|
18
|
+
def on_code_evaluated(e)
|
19
|
+
widget.setPlainText ""
|
20
|
+
end
|
21
|
+
|
22
|
+
def replace_code(code)
|
23
|
+
widget.setPlainText code
|
24
|
+
widget.moveCursor Qt::TextCursor::End
|
25
|
+
widget.setFocus
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require "qscintilla"
|
2
|
+
|
3
|
+
module Qx
|
4
|
+
class Scintilla < ::Qsci::Scintilla
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
super
|
8
|
+
connect(SIGNAL "userListActivated(int, const QString)") do |id, text|
|
9
|
+
@autocompletion_activated.(id, text) rescue nil
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def keyPressEvent(event)
|
14
|
+
e = OpenStruct.new
|
15
|
+
e.key = event.key
|
16
|
+
e.modifiers = event.modifiers
|
17
|
+
e.continue = true
|
18
|
+
|
19
|
+
@key_pressed.(e) rescue nil
|
20
|
+
super event if e.continue
|
21
|
+
end
|
22
|
+
|
23
|
+
#Events
|
24
|
+
def user_list_activated(&block)
|
25
|
+
@autocompletion_activated = block
|
26
|
+
end
|
27
|
+
|
28
|
+
def key_pressed(&blk)
|
29
|
+
@key_pressed = blk
|
30
|
+
end
|
31
|
+
|
32
|
+
# Operations
|
33
|
+
def current_line_number
|
34
|
+
# SCI_LINEFROMPOSITION
|
35
|
+
SendScintilla(2166,pos,0)
|
36
|
+
end
|
37
|
+
|
38
|
+
def current_column_number
|
39
|
+
# SCI_GETCOLUMN = 2129
|
40
|
+
SendScintilla(2129,pos,0)
|
41
|
+
end
|
42
|
+
|
43
|
+
def line_length(line)
|
44
|
+
# SCI_GETLINEENDPOSITION
|
45
|
+
SendScintilla(2136, line, 0)
|
46
|
+
end
|
47
|
+
|
48
|
+
def line_text(line_number)
|
49
|
+
text line_number
|
50
|
+
end
|
51
|
+
|
52
|
+
def current_line_text
|
53
|
+
line_text current_line_number
|
54
|
+
end
|
55
|
+
|
56
|
+
def select_line(line_number=nil)
|
57
|
+
line ||= current_line_number
|
58
|
+
setSelection line, 0, line, line_length(line)
|
59
|
+
end
|
60
|
+
|
61
|
+
def replace_line(text, line_number=nil)
|
62
|
+
select_line
|
63
|
+
replaceSelectedText text
|
64
|
+
end
|
65
|
+
|
66
|
+
def move_cursor(position)
|
67
|
+
line, column = position[:line], position[:column]
|
68
|
+
line ||= current_line_number
|
69
|
+
column ||= current_column_number
|
70
|
+
|
71
|
+
setCursorPosition line, column
|
72
|
+
end
|
73
|
+
|
74
|
+
def number_of_lines
|
75
|
+
lines
|
76
|
+
end
|
77
|
+
|
78
|
+
def move_cursor_to_end
|
79
|
+
setCursorPosition number_of_lines, line_length(number_of_lines)
|
80
|
+
end
|
81
|
+
|
82
|
+
def current_position
|
83
|
+
{line: current_line_number, column: current_column_number}
|
84
|
+
end
|
85
|
+
|
86
|
+
def current_line
|
87
|
+
{text: current_line_text, line_number: current_line_number}
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
|
92
|
+
def pos
|
93
|
+
# SCI_GETCURRENTPOS
|
94
|
+
SendScintilla(2008, 0, 0)
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'stringio'
|
2
|
+
|
3
|
+
class Shell
|
4
|
+
attr_accessor :result
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@binding = TOPLEVEL_BINDING
|
8
|
+
$stdout = StringIO.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def run(str)
|
12
|
+
result = eval(str, @binding, "(troshka)")
|
13
|
+
::Troshka::App.last_result = result
|
14
|
+
eval("_ = Troshka::App.last_result", @binding)
|
15
|
+
|
16
|
+
exception = nil
|
17
|
+
|
18
|
+
$stdout.rewind
|
19
|
+
output = $stdout.read
|
20
|
+
$stdout.truncate(0)
|
21
|
+
$stdout.rewind
|
22
|
+
rescue Exception => e
|
23
|
+
output = nil
|
24
|
+
obj = nil
|
25
|
+
exception = e
|
26
|
+
ensure
|
27
|
+
return {code: str, output: output, obj: result, exception: exception}
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class MainController < Shirka::Controller
|
2
|
+
def start
|
3
|
+
view.show
|
4
|
+
end
|
5
|
+
|
6
|
+
def init(data)
|
7
|
+
app.components[:output] = OutputController.new(app, self, [])
|
8
|
+
add_component app.components[:output], :main
|
9
|
+
|
10
|
+
add_component DetailController.new(app, self, []), :info
|
11
|
+
add_component MethodsController.new(app, self, []), :info2
|
12
|
+
|
13
|
+
app.components[:editor] = EditorController.new(app, self, [])
|
14
|
+
add_component app.components[:editor], :editor
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
class MainView < ::Shirka::View
|
2
|
+
def widget
|
3
|
+
return @widget unless @widget.nil?
|
4
|
+
|
5
|
+
@widget = Qt::MainWindow.new
|
6
|
+
|
7
|
+
@splitter1 = Qt::Splitter.new
|
8
|
+
@splitter1.set_orientation Qt::Horizontal
|
9
|
+
|
10
|
+
@splitter2 = Qt::Splitter.new
|
11
|
+
@splitter2.set_orientation Qt::Vertical
|
12
|
+
|
13
|
+
@splitter3 = Qt::Splitter.new
|
14
|
+
@splitter3.set_orientation Qt::Vertical
|
15
|
+
|
16
|
+
#@main = Qt::TabWidget.new
|
17
|
+
#@info = Qt::TabWidget.new
|
18
|
+
|
19
|
+
|
20
|
+
@splitter1.add_widget @splitter2
|
21
|
+
#@splitter2.add_widget @main
|
22
|
+
|
23
|
+
@splitter1.add_widget @splitter3
|
24
|
+
#@splitter3.add_widget @info
|
25
|
+
|
26
|
+
@widget.setCentralWidget @splitter1
|
27
|
+
@widget
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
def on_view_adding(view, slot=nil)
|
32
|
+
widget
|
33
|
+
case slot
|
34
|
+
when :editor
|
35
|
+
@splitter2.add_widget view.widget
|
36
|
+
view.widget.setFocus
|
37
|
+
when :info
|
38
|
+
#@info.addTab view.widget, view.label
|
39
|
+
@splitter3.add_widget view.widget
|
40
|
+
when :main
|
41
|
+
@splitter2.add_widget view.widget
|
42
|
+
when :info2
|
43
|
+
@splitter3.add_widget view.widget
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def show
|
48
|
+
widget.show
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class MethodsController < Shirka::Qt::TreeController
|
2
|
+
def on_starting(e)
|
3
|
+
watch app.components[:editor]
|
4
|
+
end
|
5
|
+
|
6
|
+
def on_code_evaluated(e)
|
7
|
+
view.clear
|
8
|
+
obj = e.msg[:obj]
|
9
|
+
#obj.methods.sort.each {|m| puts m.to_s}
|
10
|
+
#obj.methods.sort.each {|m| add_item m.to_s}
|
11
|
+
add_item ["class", obj.class.to_s]
|
12
|
+
add_item ["object_id", obj.object_id.to_s]
|
13
|
+
add_item ["methods", obj.methods.size.to_s]
|
14
|
+
add_item ["count", obj.count.to_s] rescue nil
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class OutputItemController < Shirka::Qt::TreeItemController
|
2
|
+
def init(data)
|
3
|
+
add_item data[:code], OutputItemCodeController
|
4
|
+
if data[:exception].nil?
|
5
|
+
add_item data[:obj].inspect, OutputItemObjController
|
6
|
+
add_item data[:output], OutputItemOutputController unless data[:output].to_s.empty?
|
7
|
+
else
|
8
|
+
add_item data[:exception], OutputItemExceptionController
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def view
|
13
|
+
@view ||= view_class.new self, data[:time]
|
14
|
+
end
|
15
|
+
end
|