ruber 0.0.7 → 0.0.8
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/CHANGES +54 -0
- data/bin/ruber +12 -1
- data/data/share/apps/ruber/ruberui.rc +5 -0
- data/data/share/icons/pin.png +0 -0
- data/lib/ruber/application/application.rb +1 -1
- data/lib/ruber/documents/document_list.rb +1 -1
- data/lib/ruber/editor/document.rb +26 -6
- data/lib/ruber/editor/editor_view.rb +21 -2
- data/lib/ruber/filtered_output_widget.rb +1 -1
- data/lib/ruber/ktexteditor_sugar.rb +124 -0
- data/lib/ruber/main_window/main_window.rb +34 -16
- data/lib/ruber/main_window/main_window_actions.rb +98 -5
- data/lib/ruber/main_window/main_window_internal.rb +1 -1
- data/lib/ruber/main_window/plugin.yaml +5 -0
- data/lib/ruber/main_window/ui/choose_plugins_widget.rb +2 -2
- data/lib/ruber/main_window/ui/main_window_settings_widget.rb +67 -34
- data/lib/ruber/main_window/ui/main_window_settings_widget.ui +77 -30
- data/lib/ruber/main_window/ui/new_project_widget.rb +2 -2
- data/lib/ruber/main_window/ui/open_file_in_project_dlg.rb +2 -2
- data/lib/ruber/main_window/ui/output_color_widget.rb +2 -2
- data/lib/ruber/main_window/ui/workspace_settings_widget.rb +1 -1
- data/lib/ruber/main_window/view_manager.rb +14 -1
- data/lib/ruber/output_widget.rb +409 -288
- data/lib/ruber/pane.rb +22 -0
- data/lib/ruber/projects/ui/project_files_rule_chooser_widget.rb +2 -2
- data/lib/ruber/projects/ui/project_files_widget.rb +2 -2
- data/lib/ruber/qt_sugar.rb +11 -0
- data/lib/ruber/version.rb +1 -1
- data/plugins/auto_end/auto_end.rb +122 -0
- data/plugins/auto_end/plugin.yaml +11 -0
- data/plugins/autosave/ui/autosave_config_widget.rb +2 -2
- data/plugins/command/command.rb +71 -12
- data/plugins/command/output.rb +592 -0
- data/plugins/command/ui/tool_widget.rb +143 -0
- data/plugins/command/ui/tool_widget.ui +147 -0
- data/plugins/find_in_files/ui/config_widget.rb +2 -2
- data/plugins/find_in_files/ui/find_in_files_widget.rb +2 -2
- data/plugins/rake/ui/add_quick_task_widget.rb +2 -2
- data/plugins/rake/ui/choose_task_widget.rb +2 -2
- data/plugins/rake/ui/config_widget.rb +2 -2
- data/plugins/rake/ui/project_widget.rb +2 -2
- data/plugins/rspec/plugin.yaml +7 -2
- data/plugins/rspec/rspec.rb +178 -53
- data/plugins/rspec/rspecui.rc +2 -3
- data/plugins/rspec/ui/config_widget.rb +79 -0
- data/plugins/rspec/ui/config_widget.ui +89 -0
- data/plugins/rspec/ui/rspec_project_widget.rb +2 -2
- data/plugins/ruby_development/ruby_development.rb +1 -1
- data/plugins/ruby_development/ui/config_widget.rb +1 -1
- data/plugins/ruby_development/ui/project_widget.rb +2 -2
- data/plugins/ruby_runner/ruby_runner.rb +13 -12
- data/plugins/ruby_runner/ui/config_widget.rb +2 -2
- data/plugins/ruby_runner/ui/project_widget.rb +2 -2
- data/plugins/ruby_runner/ui/ruby_runnner_plugin_option_widget.rb +2 -2
- data/plugins/state/ui/config_widget.rb +2 -2
- data/plugins/syntax_checker/syntax_checker.rb +1 -1
- data/spec/auto_end_spec.rb +272 -0
- data/spec/common.rb +1 -0
- data/spec/document_spec.rb +83 -0
- data/spec/editor_view_spec.rb +41 -0
- data/spec/filtered_output_widget_spec.rb +2 -2
- data/spec/ktexteditor_sugar_spec.rb +190 -0
- data/spec/output_widget_spec.rb +120 -11
- data/spec/pane_spec.rb +1 -1
- data/spec/qt_sugar_spec.rb +14 -0
- data/spec/state_spec.rb +0 -26
- metadata +14 -3
data/lib/ruber/pane.rb
CHANGED
@@ -96,6 +96,10 @@ allow to resize it. It *must not* be used to add or remove widgets to or from it
|
|
96
96
|
margins.top = margins.left = margins.bottom = margins.right = 0
|
97
97
|
layout.contents_margins = margins
|
98
98
|
@label = Qt::Label.new '', self
|
99
|
+
# Use the following three lines when attempting to debug issue number 10, as it
|
100
|
+
# helps understanding which pane each label belongs to
|
101
|
+
# color = Qt::Color.new(rand(256), rand(256), rand(256))
|
102
|
+
# @label.style_sheet = "background-color: #{color.name};"
|
99
103
|
@label.hide unless parent_pane
|
100
104
|
layout.add_widget @label
|
101
105
|
end
|
@@ -314,6 +318,22 @@ Iterates on child panes
|
|
314
318
|
self
|
315
319
|
end
|
316
320
|
|
321
|
+
=begin rdoc
|
322
|
+
The panes contained in this pane
|
323
|
+
|
324
|
+
@overload panes(:recursive)
|
325
|
+
@return [Array<Pane>] an array containing the panes contained in this pane,
|
326
|
+
directly or indirectly. Returns an empty array if the pane is in single view
|
327
|
+
mode
|
328
|
+
@overload panes
|
329
|
+
@return [Array<Pane>] an array containing the panes directly contained in this pane.
|
330
|
+
Returns an empty array if the pane is in single view mode
|
331
|
+
@return [Array<Pane>]
|
332
|
+
=end
|
333
|
+
def panes mode = :flat
|
334
|
+
single_view? ? [] : each_pane(mode).to_a
|
335
|
+
end
|
336
|
+
|
317
337
|
=begin rdoc
|
318
338
|
Changes the text of the label for the given view
|
319
339
|
|
@@ -500,6 +520,8 @@ It does nothing if the splitter is already in single view mode
|
|
500
520
|
self.label = label
|
501
521
|
@label.visible = false unless parent_pane
|
502
522
|
connect @view, SIGNAL('closing(QWidget*)'), self, SLOT('remove_view(QWidget*)')
|
523
|
+
@splitter.delete_later
|
524
|
+
@splitter = nil
|
503
525
|
self
|
504
526
|
end
|
505
527
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
=begin
|
2
2
|
** Form generated from reading ui file 'project_files_rule_chooser_widget.ui'
|
3
3
|
**
|
4
|
-
** Created:
|
5
|
-
** by: Qt User Interface Compiler version 4.7.
|
4
|
+
** Created: mer gen 12 12:12:11 2011
|
5
|
+
** by: Qt User Interface Compiler version 4.7.1
|
6
6
|
**
|
7
7
|
** WARNING! All changes made in this file will be lost when recompiling ui file!
|
8
8
|
=end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
=begin
|
2
2
|
** Form generated from reading ui file 'project_files_widget.ui'
|
3
3
|
**
|
4
|
-
** Created:
|
5
|
-
** by: Qt User Interface Compiler version 4.7.
|
4
|
+
** Created: mer gen 12 12:12:11 2011
|
5
|
+
** by: Qt User Interface Compiler version 4.7.1
|
6
6
|
**
|
7
7
|
** WARNING! All changes made in this file will be lost when recompiling ui file!
|
8
8
|
=end
|
data/lib/ruber/qt_sugar.rb
CHANGED
data/lib/ruber/version.rb
CHANGED
@@ -0,0 +1,122 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (C) 2011 by Stefano Crocco
|
3
|
+
stefano.crocco@alice.it
|
4
|
+
|
5
|
+
This program is free software; you can redistribute it andor modify
|
6
|
+
it under the terms of the GNU General Public License as published by
|
7
|
+
the Free Software Foundation; either version 2 of the License, or
|
8
|
+
(at your option) any later version.
|
9
|
+
|
10
|
+
This program is distributed in the hope that it will be useful,
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
GNU General Public License for more details.
|
14
|
+
|
15
|
+
You should have received a copy of the GNU General Public License
|
16
|
+
along with this program; if not, write to the
|
17
|
+
Free Software Foundation, Inc.,
|
18
|
+
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
19
|
+
=end
|
20
|
+
|
21
|
+
module Ruber
|
22
|
+
|
23
|
+
module AutoEnd
|
24
|
+
|
25
|
+
class Extension < Qt::Object
|
26
|
+
|
27
|
+
include Ruber::Extension
|
28
|
+
|
29
|
+
Insertion = Struct.new :line_number, :lines, :final_position
|
30
|
+
|
31
|
+
IDENTIFIER_PATTERN = RUBY_VERSION >= '1.9.2' ? '\p{Word}+' : '\w+'
|
32
|
+
|
33
|
+
MULTI_ID_PATTERN = "#{IDENTIFIER_PATTERN}(?:::#{IDENTIFIER_PATTERN})*"
|
34
|
+
|
35
|
+
PATTERNS = [
|
36
|
+
[/^\s*if\s/, "\nend", [0, -1]],
|
37
|
+
[/=\s*if\s/, "\nend", [0, -1]],
|
38
|
+
[/\bdo\s*$/, "\nend", [0, -1]],
|
39
|
+
[/\bdo\s+\|/, "\nend", [0, -1]],
|
40
|
+
[/^\s*def\s/, "\nend", [0, -1]],
|
41
|
+
[/^class\s+#{IDENTIFIER_PATTERN}\s*$/, "\nend", [0, -1]],
|
42
|
+
[/^class\s+#{MULTI_ID_PATTERN}\s*<{1,2}\s*#{MULTI_ID_PATTERN}\s*$/, "\nend", [0, -1]],
|
43
|
+
[/^\s*module\s+#{MULTI_ID_PATTERN}\s*$/, "\nend", [0,-1]],
|
44
|
+
[/^=begin(\s|$)/, "\n=end", [0, -1]],
|
45
|
+
[/^\s*begin\s/, "\nend", [0, -1]],
|
46
|
+
[/=\s*begin\s/, "\nend", [0, -1]],
|
47
|
+
]
|
48
|
+
|
49
|
+
def initialize prj
|
50
|
+
super
|
51
|
+
@doc = prj.document
|
52
|
+
@insertion = nil
|
53
|
+
connect_slots
|
54
|
+
end
|
55
|
+
|
56
|
+
def text_inserted range
|
57
|
+
text = @doc.text range
|
58
|
+
return unless text.end_with? "\n"
|
59
|
+
@insertion = nil
|
60
|
+
line = @doc.line( range.end.line - 1)
|
61
|
+
pattern = PATTERNS.find{|pat| pat[0].match line}
|
62
|
+
if pattern and !line.start_with? '#'
|
63
|
+
indentation = line.match(/^\s*/)[0].size
|
64
|
+
next_indentation = @doc.line(range.end.line + 1).match(/^\s*/)[0].size
|
65
|
+
unless next_indentation > indentation
|
66
|
+
@insertion = Insertion.new range.end.line, pattern[1], pattern[2]
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
slots 'text_inserted(KTextEditor::Range)'
|
71
|
+
|
72
|
+
def text_changed
|
73
|
+
if @insertion
|
74
|
+
insert_text KTextEditor::Cursor.new(@insertion.line_number, 0),
|
75
|
+
@insertion.lines, @insertion.final_position
|
76
|
+
@insertion = nil
|
77
|
+
end
|
78
|
+
end
|
79
|
+
slots :text_changed
|
80
|
+
|
81
|
+
def remove_from_project
|
82
|
+
disconnect_slots
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
def connect_slots
|
88
|
+
connect @doc, SIGNAL('text_inserted(KTextEditor::Range, QObject*)'), self, SLOT('text_inserted(KTextEditor::Range)')
|
89
|
+
connect @doc, SIGNAL('text_changed(QObject*)'), self, SLOT(:text_changed)
|
90
|
+
end
|
91
|
+
|
92
|
+
def disconnect_slots
|
93
|
+
disconnect @doc, SIGNAL('text_inserted(KTextEditor::Range, QObject*)'), self, SLOT('text_inserted(KTextEditor::Range)')
|
94
|
+
disconnect @doc, SIGNAL('text_changed(QObject*)'), self, SLOT(:text_changed)
|
95
|
+
end
|
96
|
+
|
97
|
+
def insert_text insert_pos, lines, dest
|
98
|
+
view = @doc.active_view
|
99
|
+
return unless view
|
100
|
+
disconnect_slots
|
101
|
+
replace_pos = KTextEditor::Cursor.new insert_pos.line, @doc.line_length(insert_pos.line)
|
102
|
+
insert_pos.column = @doc.line_length insert_pos.line
|
103
|
+
@doc.insert_text insert_pos, lines
|
104
|
+
final_pos = KTextEditor::Cursor.new insert_pos.line + lines.size - 1,
|
105
|
+
lines[-1].size
|
106
|
+
do_indentation view
|
107
|
+
dest_line = insert_pos.line+dest[0]
|
108
|
+
dest_col = dest[1]
|
109
|
+
dest_col += @doc.line_length(dest_line) + 1 if dest_col < 0
|
110
|
+
view.go_to dest_line, dest_col
|
111
|
+
connect_slots
|
112
|
+
end
|
113
|
+
|
114
|
+
def do_indentation view
|
115
|
+
view.execute_action 'tools_align'
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
name: auto_end
|
2
|
+
version: 0.0.1
|
3
|
+
about:
|
4
|
+
authors: [Stefano Crocco, stefano.crocco@alice.it]
|
5
|
+
license: gpl
|
6
|
+
description: Automatically inserts end keywords after if, do and similar statements
|
7
|
+
bug_address: stefano.crocco@alice.it
|
8
|
+
require: auto_end
|
9
|
+
extensions:
|
10
|
+
auto_end: {class: Ruber::AutoEnd::Extension, scope: document, file_extension: ['*.rb', 'Rakefile', 'rakefile', '*.gemspec'], mimetype: ['application/x-ruby']}
|
11
|
+
|
@@ -1,8 +1,8 @@
|
|
1
1
|
=begin
|
2
2
|
** Form generated from reading ui file 'autosave_config_widget.ui'
|
3
3
|
**
|
4
|
-
** Created:
|
5
|
-
** by: Qt User Interface Compiler version 4.7.
|
4
|
+
** Created: mer gen 12 12:12:11 2011
|
5
|
+
** by: Qt User Interface Compiler version 4.7.1
|
6
6
|
**
|
7
7
|
** WARNING! All changes made in this file will be lost when recompiling ui file!
|
8
8
|
=end
|
data/plugins/command/command.rb
CHANGED
@@ -1,3 +1,26 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (C) 2010,2011 by Stefano Crocco
|
3
|
+
stefano.crocco@alice.it
|
4
|
+
|
5
|
+
This program is free software; you can redistribute it andor modify
|
6
|
+
it under the terms of the GNU General Public License as published by
|
7
|
+
the Free Software Foundation; either version 2 of the License, or
|
8
|
+
(at your option) any later version.
|
9
|
+
|
10
|
+
This program is distributed in the hope that it will be useful,
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
GNU General Public License for more details.
|
14
|
+
|
15
|
+
You should have received a copy of the GNU General Public License
|
16
|
+
along with this program; if not, write to the
|
17
|
+
Free Software Foundation, Inc.,
|
18
|
+
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
19
|
+
=end
|
20
|
+
|
21
|
+
require 'command/output'
|
22
|
+
require_relative 'ui/tool_widget'
|
23
|
+
|
1
24
|
module Ruber
|
2
25
|
|
3
26
|
=begin rdoc
|
@@ -7,7 +30,9 @@ plugin, which simply starts a new ruby interpreter and runs a script in it).
|
|
7
30
|
|
8
31
|
This plugin doesn't provide a plugin class but just a tool widget where the user
|
9
32
|
can enter the code and a button to execute it. It also doesn't provide any
|
10
|
-
API for the feature.
|
33
|
+
API for the feature. Beside the editor widget, the plugin also provides an output
|
34
|
+
widget, where the text written to standard output and standard error by the code
|
35
|
+
executed will be displayed.
|
11
36
|
|
12
37
|
*Note:* the ruby code is executed in the top level context. Any exception
|
13
38
|
raised by the code won't cause Ruber to crash, but will be displayed in a dialog.
|
@@ -18,7 +43,7 @@ raised by the code won't cause Ruber to crash, but will be displayed in a dialog
|
|
18
43
|
The tool widget where the user can enter the ruby code to execute.
|
19
44
|
=end
|
20
45
|
class ToolWidget < Qt::Widget
|
21
|
-
|
46
|
+
|
22
47
|
slots :execute_command, :load_settings
|
23
48
|
|
24
49
|
=begin rdoc
|
@@ -26,13 +51,13 @@ The tool widget where the user can enter the ruby code to execute.
|
|
26
51
|
=end
|
27
52
|
def initialize parent = nil
|
28
53
|
super
|
29
|
-
|
30
|
-
@
|
31
|
-
|
32
|
-
|
33
|
-
@
|
34
|
-
connect
|
35
|
-
|
54
|
+
@ui = Ui::CommandToolWidget.new
|
55
|
+
@ui.setup_ui self
|
56
|
+
self.focus_proxy = @ui.editor
|
57
|
+
connect @ui.execute, SIGNAL(:clicked), self, SLOT(:execute_command)
|
58
|
+
connect @ui.show_output, SIGNAL('toggled(bool)'), self, SLOT('output_visible=(bool)')
|
59
|
+
@ui.clear.connect(SIGNAL(:clicked)){@ui.output.clear}
|
60
|
+
self.output_visible = @ui.show_output.checked?
|
36
61
|
end
|
37
62
|
|
38
63
|
=begin rdoc
|
@@ -44,15 +69,23 @@ it will be displayed on standard error and in a message box.
|
|
44
69
|
was raised.
|
45
70
|
=end
|
46
71
|
def execute_command
|
47
|
-
code = @editor.to_plain_text
|
72
|
+
code = @ui.editor.to_plain_text
|
48
73
|
begin
|
74
|
+
old_stdout = $stdout
|
75
|
+
old_stderr = $stderr
|
76
|
+
$stdout = Output.new @ui.output, Ruber[:config][:output_colors, :output], $stdout.fileno
|
77
|
+
$stderr = Output.new @ui.output, Ruber[:config][:output_colors, :error], $stderr.fileno
|
49
78
|
eval code, TOPLEVEL_BINDING, 'COMMAND'
|
50
79
|
true
|
51
80
|
rescue Exception => ex
|
52
|
-
dlg = ExceptionDialog.new ex, Ruber[:main_window],
|
81
|
+
dlg = ExceptionDialog.new ex, Ruber[:main_window], true,
|
53
82
|
'The command you issued raised the following exception:'
|
83
|
+
dlg.set_button_text KDE::Dialog::Ok, i18n('Ok')
|
54
84
|
dlg.exec
|
55
85
|
false
|
86
|
+
ensure
|
87
|
+
$stdout = old_stdout
|
88
|
+
$stderr = old_stderr
|
56
89
|
end
|
57
90
|
end
|
58
91
|
|
@@ -63,10 +96,36 @@ Sets the font of the editor to the font chosen by the user as the output font
|
|
63
96
|
@return [nil]
|
64
97
|
=end
|
65
98
|
def load_settings
|
66
|
-
|
99
|
+
font = Ruber[:config][:general, :output_font]
|
100
|
+
metrics = Qt::FontMetrics.new font
|
101
|
+
tab_width = metrics.max_width * 2
|
102
|
+
@ui.editor.font = font
|
103
|
+
@ui.editor.tab_stop_width = tab_width
|
104
|
+
@ui.output.font = font
|
105
|
+
@ui.output.tab_stop_width = tab_width
|
67
106
|
nil
|
68
107
|
end
|
69
108
|
|
109
|
+
private
|
110
|
+
|
111
|
+
=begin rdoc
|
112
|
+
Shows or hides the output widget and related widgets
|
113
|
+
|
114
|
+
It also changes the text of the Show Output button so that it becomes 'Hide Output'
|
115
|
+
if the button is visible.
|
116
|
+
|
117
|
+
@param [Boolean] visible whether the output widget should be shown or hidden
|
118
|
+
@return [nil]
|
119
|
+
=end
|
120
|
+
def output_visible= visible
|
121
|
+
@ui.output.visible = visible
|
122
|
+
@ui.clear.visible = visible
|
123
|
+
@ui.output_label.visible = visible
|
124
|
+
@ui.show_output.text = i18n(visible ? '&Hide Output' : '&Show Output')
|
125
|
+
nil
|
126
|
+
end
|
127
|
+
slots 'output_visible=(bool)'
|
128
|
+
|
70
129
|
end
|
71
130
|
|
72
131
|
end
|
@@ -0,0 +1,592 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (C) 2011 by Stefano Crocco
|
3
|
+
stefano.crocco@alice.it
|
4
|
+
|
5
|
+
This program is free software; you can redistribute it andor modify
|
6
|
+
it under the terms of the GNU General Public License as published by
|
7
|
+
the Free Software Foundation; either version 2 of the License, or
|
8
|
+
(at your option) any later version.
|
9
|
+
|
10
|
+
This program is distributed in the hope that it will be useful,
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
GNU General Public License for more details.
|
14
|
+
|
15
|
+
You should have received a copy of the GNU General Public License
|
16
|
+
along with this program; if not, write to the
|
17
|
+
Free Software Foundation, Inc.,
|
18
|
+
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
19
|
+
=end
|
20
|
+
|
21
|
+
module Ruber
|
22
|
+
|
23
|
+
module CommandPlugin
|
24
|
+
|
25
|
+
=begin rdoc
|
26
|
+
Fake IO object for use by the command plugin. Despite the name, it can be used
|
27
|
+
to display standard error as well as standard output.
|
28
|
+
|
29
|
+
It displays the text in a @Qt::PlainTextEdit@ using a given color.
|
30
|
+
|
31
|
+
All the methods in this class are implementations of the API provided by IO.
|
32
|
+
|
33
|
+
@example Typical usage
|
34
|
+
|
35
|
+
old_stdout = $stdout #store the old standard output to restore it later
|
36
|
+
$stdout = Output.new plain_text_edit, Qt::Color.new(Qt.blue)
|
37
|
+
puts "hello" # => the string "hello" is displayed in the widget
|
38
|
+
$stdout = old_stout # restore the old standard output
|
39
|
+
=end
|
40
|
+
class Output
|
41
|
+
|
42
|
+
=begin rdoc
|
43
|
+
@param [Qt::PlainTextEdit] widget the widget to display the output into
|
44
|
+
@param [Qt::Color] color the color to use for the text
|
45
|
+
@param [Integer] fileno the number that the {#fileno} method should return
|
46
|
+
=end
|
47
|
+
def initialize widget, color, fileno = 1
|
48
|
+
@widget = widget
|
49
|
+
@close_on_exec = false
|
50
|
+
@closed = false
|
51
|
+
@sync = true
|
52
|
+
@brush = Qt::Brush.new color
|
53
|
+
@fileno = fileno
|
54
|
+
end
|
55
|
+
|
56
|
+
=begin rdoc
|
57
|
+
@return [Boolean] whether byffering is disabled or enabled. This class doesn't buffer
|
58
|
+
output, so this makes no difference. It's only provided for compatibility with
|
59
|
+
@IO@ API
|
60
|
+
=end
|
61
|
+
attr_accessor :sync
|
62
|
+
|
63
|
+
=begin rdoc
|
64
|
+
As @IO#<<@
|
65
|
+
|
66
|
+
@return [Output] self
|
67
|
+
=end
|
68
|
+
def << text
|
69
|
+
write text
|
70
|
+
self
|
71
|
+
end
|
72
|
+
|
73
|
+
=begin rdoc
|
74
|
+
As @IO#binmode@
|
75
|
+
|
76
|
+
This method doesn't actually do anything. It's just for compatibility with the @IO@
|
77
|
+
API
|
78
|
+
@return [nil]
|
79
|
+
=end
|
80
|
+
def binmode
|
81
|
+
end
|
82
|
+
|
83
|
+
=begin rdoc
|
84
|
+
As @IO#binmode?@
|
85
|
+
|
86
|
+
This method always returns *true*. It's just for compatibility with the @IO@
|
87
|
+
API
|
88
|
+
@return [TrueClass] *true*
|
89
|
+
=end
|
90
|
+
def binmode?
|
91
|
+
true
|
92
|
+
end
|
93
|
+
|
94
|
+
=begin rdoc
|
95
|
+
As @IO#bytes@
|
96
|
+
|
97
|
+
@return [Enumerator] an enumerator which calls {#each_byte}
|
98
|
+
=end
|
99
|
+
def bytes
|
100
|
+
each_byte
|
101
|
+
end
|
102
|
+
|
103
|
+
=begin rdoc
|
104
|
+
As @IO#chars@
|
105
|
+
|
106
|
+
@return [Enumerator] an enumerator which calls {#each_char}
|
107
|
+
=end
|
108
|
+
|
109
|
+
def chars
|
110
|
+
each_char
|
111
|
+
end
|
112
|
+
|
113
|
+
=begin rdoc
|
114
|
+
As @IO#close@
|
115
|
+
|
116
|
+
@return [nil]
|
117
|
+
=end
|
118
|
+
def close
|
119
|
+
@closed = true
|
120
|
+
nil
|
121
|
+
end
|
122
|
+
|
123
|
+
=begin rdoc
|
124
|
+
As @IO#close_on_exec@
|
125
|
+
|
126
|
+
This method does nothing. It's only for compatibility with @IO@ API
|
127
|
+
@param [Object] val the new value
|
128
|
+
@return [Object] _val_
|
129
|
+
=end
|
130
|
+
|
131
|
+
def close_on_exec= val
|
132
|
+
@close_on_exec = val.to_bool
|
133
|
+
end
|
134
|
+
|
135
|
+
=begin rdoc
|
136
|
+
As @IO#close_on_exec?@
|
137
|
+
|
138
|
+
{#close_on_exec=} has no influence on this class, so the value returned here is
|
139
|
+
meaningless. It's only provided for compatibility with @IO@ API
|
140
|
+
@return [Boolean] whether close on exec is enabled or not. Nothing changes in either
|
141
|
+
case
|
142
|
+
=end
|
143
|
+
def close_on_exec?
|
144
|
+
@close_on_exec
|
145
|
+
end
|
146
|
+
|
147
|
+
=begin rdoc
|
148
|
+
As @IO#close_read@
|
149
|
+
|
150
|
+
@raise [IOError] always as this class isn't open for reading
|
151
|
+
@return [nil]
|
152
|
+
=end
|
153
|
+
def close_read
|
154
|
+
raise IOError, 'closing non-duplex IO for reading'
|
155
|
+
end
|
156
|
+
|
157
|
+
=begin rdoc
|
158
|
+
As @IO#close_write@
|
159
|
+
|
160
|
+
@return [nil]
|
161
|
+
=end
|
162
|
+
def close_write
|
163
|
+
@closed = true
|
164
|
+
nil
|
165
|
+
end
|
166
|
+
|
167
|
+
=begin rdoc
|
168
|
+
As @IO#closed?@
|
169
|
+
|
170
|
+
@return [Boolean] whether the stream is closed or not
|
171
|
+
=end
|
172
|
+
def closed?
|
173
|
+
@closed
|
174
|
+
end
|
175
|
+
|
176
|
+
=begin rdoc
|
177
|
+
As @IO#each@
|
178
|
+
|
179
|
+
@raise [IOError] when called with a block because the stream is not open for reading
|
180
|
+
@return [Enumerator] an enumerator which calls {#each} when called without a block
|
181
|
+
=end
|
182
|
+
def each
|
183
|
+
raise IOError, "not opened for reading" if block_given?
|
184
|
+
to_enum
|
185
|
+
end
|
186
|
+
|
187
|
+
=begin rdoc
|
188
|
+
As @IO#each_byte@
|
189
|
+
|
190
|
+
@raise [IOError] when called with a block because the stream is not open for reading
|
191
|
+
@return [Enumerator] an enumerator which calls {#each_byte} when called without a block
|
192
|
+
=end
|
193
|
+
def each_byte
|
194
|
+
raise IOError, "not opened for reading" if block_given?
|
195
|
+
to_enum :each_byte
|
196
|
+
end
|
197
|
+
|
198
|
+
=begin rdoc
|
199
|
+
As @IO#each_char@
|
200
|
+
|
201
|
+
@raise [IOError] when called with a block because the stream is not open for reading
|
202
|
+
@return [Enumerator] an enumerator which calls {#each_char} when called without a block
|
203
|
+
=end
|
204
|
+
def each_char
|
205
|
+
raise IOError, "not opened for reading" if block_given?
|
206
|
+
to_enum :each_char
|
207
|
+
end
|
208
|
+
|
209
|
+
=begin rdoc
|
210
|
+
As @IO#each@
|
211
|
+
|
212
|
+
@raise [IOError] when called with a block because the stream is not open for reading
|
213
|
+
@return [Enumerator] an enumerator which calls {#each_line} when called without a block
|
214
|
+
=end
|
215
|
+
def each_line sep
|
216
|
+
raise IOError, "not opened for reading" if block_given?
|
217
|
+
to_enum :each_line
|
218
|
+
end
|
219
|
+
|
220
|
+
=begin rdoc
|
221
|
+
As @IO#eof@
|
222
|
+
|
223
|
+
@raise [IOError] always because the stream is not open for reading
|
224
|
+
@return [nil]
|
225
|
+
=end
|
226
|
+
def eof
|
227
|
+
raise IOError, "not opened for reading"
|
228
|
+
end
|
229
|
+
|
230
|
+
=begin rdoc
|
231
|
+
As @IO#eof?@
|
232
|
+
|
233
|
+
@raise [IOError] always because the stream is not open for reading
|
234
|
+
@return [nil]
|
235
|
+
=end
|
236
|
+
def eof?
|
237
|
+
raise IOError, "not opened for reading"
|
238
|
+
end
|
239
|
+
|
240
|
+
=begin rdoc
|
241
|
+
As @IO#external_encoding@
|
242
|
+
|
243
|
+
@return [nil]
|
244
|
+
=end
|
245
|
+
def external_encoding
|
246
|
+
nil
|
247
|
+
end
|
248
|
+
|
249
|
+
=begin rdoc
|
250
|
+
As @IO#fileno@
|
251
|
+
|
252
|
+
@return [Integer] the third argument passed to the constructor
|
253
|
+
=end
|
254
|
+
def fileno
|
255
|
+
@fileno
|
256
|
+
end
|
257
|
+
|
258
|
+
=begin rdoc
|
259
|
+
As @IO#flush@
|
260
|
+
|
261
|
+
As this class doesn't do any buffering, this method does nothing and is only
|
262
|
+
provided for compatibility with @IO@ API
|
263
|
+
|
264
|
+
@return [Output] *self*
|
265
|
+
=end
|
266
|
+
def flush
|
267
|
+
self
|
268
|
+
end
|
269
|
+
|
270
|
+
=begin rdoc
|
271
|
+
As @IO#getbyte@
|
272
|
+
|
273
|
+
@raise [IOError] always because the stream is not open for reading
|
274
|
+
@return [nil]
|
275
|
+
=end
|
276
|
+
def getbyte
|
277
|
+
raise IOError, "not opened for reading"
|
278
|
+
end
|
279
|
+
|
280
|
+
=begin rdoc
|
281
|
+
As @IO#getc@
|
282
|
+
|
283
|
+
@raise [IOError] always because the stream is not open for reading
|
284
|
+
@return [nil]
|
285
|
+
=end
|
286
|
+
def getc
|
287
|
+
raise IOError, "not opened for reading"
|
288
|
+
end
|
289
|
+
|
290
|
+
=begin rdoc
|
291
|
+
As @IO#gets@
|
292
|
+
|
293
|
+
@raise [IOError] always because the stream is not open for reading
|
294
|
+
@return [nil]
|
295
|
+
=end
|
296
|
+
def gets
|
297
|
+
raise IOError, "not opened for reading"
|
298
|
+
end
|
299
|
+
|
300
|
+
=begin rdoc
|
301
|
+
As @IO#internal_encoding@
|
302
|
+
|
303
|
+
@return [nil]
|
304
|
+
=end
|
305
|
+
def internal_encoding
|
306
|
+
nil
|
307
|
+
end
|
308
|
+
|
309
|
+
=begin rdoc
|
310
|
+
As @IO#isatty@
|
311
|
+
|
312
|
+
@return [false]
|
313
|
+
=end
|
314
|
+
def isatty
|
315
|
+
false
|
316
|
+
end
|
317
|
+
alias_method :tty?, :isatty
|
318
|
+
|
319
|
+
=begin rdoc
|
320
|
+
As @IO#lineno@
|
321
|
+
|
322
|
+
@raise [IOError] always because the stream is not open for reading
|
323
|
+
@return [nil]
|
324
|
+
=end
|
325
|
+
def lineno
|
326
|
+
raise IOError, "not opened for reading"
|
327
|
+
end
|
328
|
+
|
329
|
+
=begin rdoc
|
330
|
+
As @IO#lineno=@
|
331
|
+
|
332
|
+
@raise [IOError] always because the stream is not open for reading
|
333
|
+
@return [nil]
|
334
|
+
=end
|
335
|
+
def lineno= val
|
336
|
+
raise IOError, "not opened for reading"
|
337
|
+
end
|
338
|
+
|
339
|
+
=begin rdoc
|
340
|
+
As @IO#lines@
|
341
|
+
|
342
|
+
@return [Enumerator] an enumerator which calls {#each_line}
|
343
|
+
=end
|
344
|
+
def lines
|
345
|
+
each_line
|
346
|
+
end
|
347
|
+
|
348
|
+
=begin rdoc
|
349
|
+
As @IO#pid@
|
350
|
+
|
351
|
+
@return [nil]
|
352
|
+
=end
|
353
|
+
def pid
|
354
|
+
nil
|
355
|
+
end
|
356
|
+
|
357
|
+
=begin rdoc
|
358
|
+
As @IO#print@
|
359
|
+
|
360
|
+
@param [Array<Object>] args the objects to print
|
361
|
+
@return [nil]
|
362
|
+
=end
|
363
|
+
def print *args
|
364
|
+
args = [$_] if args.empty?
|
365
|
+
args.each{|a| write a}
|
366
|
+
STDOUT.write $\
|
367
|
+
write $\ if $\
|
368
|
+
nil
|
369
|
+
end
|
370
|
+
|
371
|
+
=begin rdoc
|
372
|
+
As @IO#printf@
|
373
|
+
|
374
|
+
@param [String] format_string the format string. See @Kernel.sprintf@
|
375
|
+
@param [Array<Object>] args the parameter to substitute in the format string
|
376
|
+
@return [nil]
|
377
|
+
=end
|
378
|
+
def printf format_string, *args
|
379
|
+
str = sprintf format_string, *args
|
380
|
+
write str
|
381
|
+
nil
|
382
|
+
end
|
383
|
+
|
384
|
+
=begin rdoc
|
385
|
+
As @IO#putc@
|
386
|
+
|
387
|
+
@param [Object] obj the object
|
388
|
+
@return [Object] obj
|
389
|
+
=end
|
390
|
+
def putc obj
|
391
|
+
if obj.is_a? Numeric then write obj.floor.chr
|
392
|
+
else obj.to_s.each_char.to_a[0]
|
393
|
+
end
|
394
|
+
obj
|
395
|
+
end
|
396
|
+
|
397
|
+
=begin rdoc
|
398
|
+
As @IO#puts@
|
399
|
+
|
400
|
+
@param [Array<Object>] args the objects to write
|
401
|
+
@return [nil]
|
402
|
+
=end
|
403
|
+
def puts *args
|
404
|
+
args << '' if args.empty?
|
405
|
+
args.each do |a|
|
406
|
+
a = a.to_s
|
407
|
+
write a
|
408
|
+
write "\n" unless a.end_with? "\n"
|
409
|
+
end
|
410
|
+
nil
|
411
|
+
end
|
412
|
+
|
413
|
+
=begin rdoc
|
414
|
+
As @IO#read@
|
415
|
+
|
416
|
+
@raise [IOError] always because the stream is not open for reading
|
417
|
+
@param [Integer] length unused
|
418
|
+
@param [String] buffer unused
|
419
|
+
@return [nil]
|
420
|
+
=end
|
421
|
+
def read length, buffer = nil
|
422
|
+
raise IOError, "not opened for reading"
|
423
|
+
end
|
424
|
+
|
425
|
+
=begin rdoc
|
426
|
+
As @IO#read_nonblock@
|
427
|
+
|
428
|
+
@raise [IOError] always because the stream is not open for reading
|
429
|
+
@param [Integer] max unused
|
430
|
+
@param [String] outbuf unused
|
431
|
+
@return [nil]
|
432
|
+
=end
|
433
|
+
def read_nonblock max, outbuf = nil
|
434
|
+
raise IOError, "not opened for reading"
|
435
|
+
end
|
436
|
+
|
437
|
+
=begin rdoc
|
438
|
+
As @IO#readbyte@
|
439
|
+
|
440
|
+
@raise [IOError] always because the stream is not open for reading
|
441
|
+
@return [nil]
|
442
|
+
=end
|
443
|
+
def readbyte
|
444
|
+
raise IOError, "not opened for reading"
|
445
|
+
end
|
446
|
+
|
447
|
+
=begin rdoc
|
448
|
+
As @IO#readchar@
|
449
|
+
|
450
|
+
@raise [IOError] always because the stream is not open for reading
|
451
|
+
@return [nil]
|
452
|
+
=end
|
453
|
+
def readchar
|
454
|
+
raise IOError, "not opened for reading"
|
455
|
+
end
|
456
|
+
|
457
|
+
=begin rdoc
|
458
|
+
As @IO#readline@
|
459
|
+
|
460
|
+
@raise [IOError] always because the stream is not open for reading
|
461
|
+
@param [String] sep unused
|
462
|
+
@param [Integer] limit unused
|
463
|
+
@return [nil]
|
464
|
+
=end
|
465
|
+
def readline sep, limit
|
466
|
+
raise IOError, "not opened for reading"
|
467
|
+
end
|
468
|
+
|
469
|
+
=begin rdoc
|
470
|
+
As @IO#readlines@
|
471
|
+
|
472
|
+
@raise [IOError] always because the stream is not open for reading
|
473
|
+
@param [String] sep unused
|
474
|
+
@param [Integer] limit unused
|
475
|
+
@return [nil]
|
476
|
+
=end
|
477
|
+
def readlines sep, limit
|
478
|
+
raise IOError, "not opened for reading"
|
479
|
+
end
|
480
|
+
|
481
|
+
=begin rdoc
|
482
|
+
As @IO#readpartial@
|
483
|
+
|
484
|
+
@raise [IOError] always because the stream is not open for reading
|
485
|
+
@param [Integer] maxlen unused
|
486
|
+
@param [String] outbuf unused
|
487
|
+
@return [nil]
|
488
|
+
=end
|
489
|
+
def readpartial maxlen, outbuf = nil
|
490
|
+
raise IOError, "not opened for reading"
|
491
|
+
end
|
492
|
+
|
493
|
+
=begin rdoc
|
494
|
+
As @IO#reopen@
|
495
|
+
|
496
|
+
@raise [RuntimeError] always
|
497
|
+
@param [String,IO] a path or another IO. Unused
|
498
|
+
@param [String] the mode. Unused
|
499
|
+
@return [nil]
|
500
|
+
=end
|
501
|
+
def reopen arg1, arg2 = 'r'
|
502
|
+
raise RuntimeError, "You can\'t reopen #{self.class}"
|
503
|
+
end
|
504
|
+
|
505
|
+
=begin rdoc
|
506
|
+
As @IO#set_encoding@
|
507
|
+
|
508
|
+
This method does nothing. It's only provided for compatibility with @IO@ API
|
509
|
+
@param [Array<Object>] args the arguments. See @IO#set_encoding@
|
510
|
+
=end
|
511
|
+
def set_encoding *args
|
512
|
+
end
|
513
|
+
|
514
|
+
=begin rdoc
|
515
|
+
As @IO#stat@
|
516
|
+
|
517
|
+
@return [nil] as this class isn't associated with any file
|
518
|
+
=end
|
519
|
+
def stat
|
520
|
+
nil
|
521
|
+
end
|
522
|
+
|
523
|
+
=begin rdoc
|
524
|
+
As @IO#sysread@
|
525
|
+
|
526
|
+
@raise [IOError] always because the stream is not open for reading
|
527
|
+
@param [Integer] num unused
|
528
|
+
@param [String] outbuf unused
|
529
|
+
@return [nil]
|
530
|
+
=end
|
531
|
+
def sysread num, outbuf = nil
|
532
|
+
raise IOError, "not opened for reading"
|
533
|
+
end
|
534
|
+
|
535
|
+
=begin rdoc
|
536
|
+
As @IO#to_io@
|
537
|
+
|
538
|
+
@return [Output] self
|
539
|
+
=end
|
540
|
+
def to_io
|
541
|
+
self
|
542
|
+
end
|
543
|
+
|
544
|
+
=begin rdoc
|
545
|
+
As @IO#ungetbyte@
|
546
|
+
|
547
|
+
@raise [IOError] always because the stream is not open for reading
|
548
|
+
@param [String,Integer] arg unused
|
549
|
+
@return [nil]
|
550
|
+
=end
|
551
|
+
def ungetbyte arg
|
552
|
+
raise IOError, "not opened for reading"
|
553
|
+
end
|
554
|
+
|
555
|
+
=begin rdoc
|
556
|
+
As @IO#ungetc@
|
557
|
+
|
558
|
+
@raise [IOError] always because the stream is not open for reading
|
559
|
+
@param [String] str unused
|
560
|
+
@return [nil]
|
561
|
+
=end
|
562
|
+
def ungetc str
|
563
|
+
raise IOError, "not opened for reading"
|
564
|
+
end
|
565
|
+
|
566
|
+
=begin rdoc
|
567
|
+
As @IO#write@
|
568
|
+
|
569
|
+
@param [Object] obj the object to write
|
570
|
+
@raise [IOError] if the stream has been closed
|
571
|
+
@return [Integer] the number of written bytes
|
572
|
+
=end
|
573
|
+
def write obj
|
574
|
+
if !@closed
|
575
|
+
cur = @widget.text_cursor
|
576
|
+
cur.move_position Qt::TextCursor::End
|
577
|
+
text = obj.to_s
|
578
|
+
format = cur.char_format
|
579
|
+
format.foreground = @brush
|
580
|
+
cur.insert_text text, format
|
581
|
+
text.bytes.count
|
582
|
+
else raise IOError, 'closed stream'
|
583
|
+
end
|
584
|
+
end
|
585
|
+
alias_method :syswrite, :write
|
586
|
+
alias_method :write_nonblock, :write
|
587
|
+
|
588
|
+
end
|
589
|
+
|
590
|
+
end
|
591
|
+
|
592
|
+
end
|