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
@@ -104,7 +104,7 @@ It adds the document to the part manager and makes several signal-slot connectio
|
|
104
104
|
update_switch_to_list
|
105
105
|
end
|
106
106
|
slots 'document_created(QObject*)'
|
107
|
-
|
107
|
+
|
108
108
|
def remove_document_from_part_manager doc
|
109
109
|
@view_manager.part_manager.remove_part doc.send(:internal)
|
110
110
|
end
|
@@ -8,6 +8,7 @@ config_options:
|
|
8
8
|
output_font: {default: 'Qt::Font.new("Courier",10)'}
|
9
9
|
auto_annotations: {type: bool, default: 'true'}
|
10
10
|
wrap_output: {type: bool, default: 'true'}
|
11
|
+
tool_open_files: {default: :existing}
|
11
12
|
output_colors:
|
12
13
|
message: {default: 'Qt::Color.new(Qt.black)'}
|
13
14
|
message_good: {default: 'Qt::Color.new(Qt.blue)'}
|
@@ -64,5 +65,9 @@ actions:
|
|
64
65
|
window-switch_to_new_document: {text: Switch to New File, slot: switch_to_new_document(), state: current_document}
|
65
66
|
window-switch_to_file: {text: Switch to Open File, slot: switch_to_file(), state: current_document}
|
66
67
|
window-switch_to_recent_file: {signal: urlSelected(KUrl), slot: switch_to_recent_file(KUrl), class: KDE::RecentFilesAction, text: Switch to Recent File, state: current_document}
|
68
|
+
window-next_horizontally: {text: Next View Horizontally, slot: move_among_views(), state: current_document, shortcut: Ctrl+Alt+Right}
|
69
|
+
window-next_vertically: {text: Next View Vertically, slot: move_among_views(), state: current_document, shortcut: Ctrl+Alt+PgDown}
|
70
|
+
window-previous_horizontally: {text: Previous View Horizontally, slot: move_among_views(), state: current_document, shortcut: Ctrl+Alt+Left}
|
71
|
+
window-previous_vertically: {text: Previous View Vertically, slot: move_among_views(), state: current_document, shortcut: Ctrl+Alt+PgUp}
|
67
72
|
extensions:
|
68
73
|
ruber_default_document: {class: Ruber::Application::DefaultDocumentExtension, scope: document, place: all}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
=begin
|
2
2
|
** Form generated from reading ui file 'choose_plugins_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,40 +1,76 @@
|
|
1
1
|
=begin
|
2
2
|
** Form generated from reading ui file 'main_window_settings_widget.ui'
|
3
3
|
**
|
4
|
-
** Created:
|
5
|
-
** by: Qt User Interface Compiler version 4.7.
|
4
|
+
** Created: ven gen 28 14:09:05 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
|
9
9
|
|
10
10
|
class Ui_MainWindowSettingsWidget
|
11
|
+
attr_reader :verticalLayout_2
|
12
|
+
attr_reader :groupBox
|
13
|
+
attr_reader :gridLayout_2
|
14
|
+
attr_reader :label_2
|
15
|
+
attr_reader :_general__default_script_directory
|
16
|
+
attr_reader :label_3
|
17
|
+
attr_reader :_general__default_project_directory
|
18
|
+
attr_reader :groupBox_2
|
11
19
|
attr_reader :verticalLayout
|
12
20
|
attr_reader :horizontalLayout
|
13
21
|
attr_reader :label
|
14
22
|
attr_reader :_general__output_font
|
15
23
|
attr_reader :_general__wrap_output
|
16
|
-
attr_reader :
|
17
|
-
attr_reader :
|
18
|
-
attr_reader :
|
19
|
-
attr_reader :label_3
|
20
|
-
attr_reader :_general__default_script_directory
|
21
|
-
attr_reader :_general__default_project_directory
|
24
|
+
attr_reader :horizontalLayout_2
|
25
|
+
attr_reader :label_4
|
26
|
+
attr_reader :_general__tool_open_files
|
22
27
|
|
23
28
|
def setupUi(mainWindowSettingsWidget)
|
24
29
|
if mainWindowSettingsWidget.objectName.nil?
|
25
30
|
mainWindowSettingsWidget.objectName = "mainWindowSettingsWidget"
|
26
31
|
end
|
27
|
-
mainWindowSettingsWidget.resize(
|
28
|
-
@
|
32
|
+
mainWindowSettingsWidget.resize(507, 235)
|
33
|
+
@verticalLayout_2 = Qt::VBoxLayout.new(mainWindowSettingsWidget)
|
34
|
+
@verticalLayout_2.objectName = "verticalLayout_2"
|
35
|
+
@groupBox = Qt::GroupBox.new(mainWindowSettingsWidget)
|
36
|
+
@groupBox.objectName = "groupBox"
|
37
|
+
@gridLayout_2 = Qt::GridLayout.new(@groupBox)
|
38
|
+
@gridLayout_2.objectName = "gridLayout_2"
|
39
|
+
@label_2 = Qt::Label.new(@groupBox)
|
40
|
+
@label_2.objectName = "label_2"
|
41
|
+
|
42
|
+
@gridLayout_2.addWidget(@label_2, 0, 0, 1, 1)
|
43
|
+
|
44
|
+
@_general__default_script_directory = KDE::UrlRequester.new(@groupBox)
|
45
|
+
@_general__default_script_directory.objectName = "_general__default_script_directory"
|
46
|
+
|
47
|
+
@gridLayout_2.addWidget(@_general__default_script_directory, 0, 1, 1, 1)
|
48
|
+
|
49
|
+
@label_3 = Qt::Label.new(@groupBox)
|
50
|
+
@label_3.objectName = "label_3"
|
51
|
+
|
52
|
+
@gridLayout_2.addWidget(@label_3, 1, 0, 1, 1)
|
53
|
+
|
54
|
+
@_general__default_project_directory = KDE::UrlRequester.new(@groupBox)
|
55
|
+
@_general__default_project_directory.objectName = "_general__default_project_directory"
|
56
|
+
|
57
|
+
@gridLayout_2.addWidget(@_general__default_project_directory, 1, 1, 1, 1)
|
58
|
+
|
59
|
+
|
60
|
+
@verticalLayout_2.addWidget(@groupBox)
|
61
|
+
|
62
|
+
@groupBox_2 = Qt::GroupBox.new(mainWindowSettingsWidget)
|
63
|
+
@groupBox_2.objectName = "groupBox_2"
|
64
|
+
@verticalLayout = Qt::VBoxLayout.new(@groupBox_2)
|
29
65
|
@verticalLayout.objectName = "verticalLayout"
|
30
66
|
@horizontalLayout = Qt::HBoxLayout.new()
|
31
67
|
@horizontalLayout.objectName = "horizontalLayout"
|
32
|
-
@label = Qt::Label.new(
|
68
|
+
@label = Qt::Label.new(@groupBox_2)
|
33
69
|
@label.objectName = "label"
|
34
70
|
|
35
71
|
@horizontalLayout.addWidget(@label)
|
36
72
|
|
37
|
-
@_general__output_font = KDE::FontRequester.new(
|
73
|
+
@_general__output_font = KDE::FontRequester.new(@groupBox_2)
|
38
74
|
@_general__output_font.objectName = "_general__output_font"
|
39
75
|
|
40
76
|
@horizontalLayout.addWidget(@_general__output_font)
|
@@ -42,37 +78,28 @@ class Ui_MainWindowSettingsWidget
|
|
42
78
|
|
43
79
|
@verticalLayout.addLayout(@horizontalLayout)
|
44
80
|
|
45
|
-
@_general__wrap_output = Qt::CheckBox.new(
|
81
|
+
@_general__wrap_output = Qt::CheckBox.new(@groupBox_2)
|
46
82
|
@_general__wrap_output.objectName = "_general__wrap_output"
|
47
83
|
|
48
84
|
@verticalLayout.addWidget(@_general__wrap_output)
|
49
85
|
|
50
|
-
@
|
51
|
-
@
|
52
|
-
@
|
53
|
-
@
|
54
|
-
@label_2 = Qt::Label.new(@groupBox)
|
55
|
-
@label_2.objectName = "label_2"
|
86
|
+
@horizontalLayout_2 = Qt::HBoxLayout.new()
|
87
|
+
@horizontalLayout_2.objectName = "horizontalLayout_2"
|
88
|
+
@label_4 = Qt::Label.new(@groupBox_2)
|
89
|
+
@label_4.objectName = "label_4"
|
56
90
|
|
57
|
-
@
|
91
|
+
@horizontalLayout_2.addWidget(@label_4)
|
58
92
|
|
59
|
-
@
|
60
|
-
@
|
61
|
-
|
62
|
-
@formLayout.setWidget(2, Qt::FormLayout::LabelRole, @label_3)
|
93
|
+
@_general__tool_open_files = KDE::ComboBox.new(@groupBox_2)
|
94
|
+
@_general__tool_open_files.objectName = "_general__tool_open_files"
|
63
95
|
|
64
|
-
@
|
65
|
-
@_general__default_script_directory.objectName = "_general__default_script_directory"
|
96
|
+
@horizontalLayout_2.addWidget(@_general__tool_open_files)
|
66
97
|
|
67
|
-
@formLayout.setWidget(1, Qt::FormLayout::FieldRole, @_general__default_script_directory)
|
68
98
|
|
69
|
-
@
|
70
|
-
@_general__default_project_directory.objectName = "_general__default_project_directory"
|
99
|
+
@verticalLayout.addLayout(@horizontalLayout_2)
|
71
100
|
|
72
|
-
@formLayout.setWidget(2, Qt::FormLayout::FieldRole, @_general__default_project_directory)
|
73
101
|
|
74
|
-
|
75
|
-
@verticalLayout.addWidget(@groupBox)
|
102
|
+
@verticalLayout_2.addWidget(@groupBox_2)
|
76
103
|
|
77
104
|
@label_2.buddy = @_general__default_script_directory
|
78
105
|
@label_3.buddy = @_general__default_project_directory
|
@@ -88,11 +115,17 @@ class Ui_MainWindowSettingsWidget
|
|
88
115
|
|
89
116
|
def retranslateUi(mainWindowSettingsWidget)
|
90
117
|
mainWindowSettingsWidget.windowTitle = Qt::Application.translate("MainWindowSettingsWidget", "Form", nil, Qt::Application::UnicodeUTF8)
|
91
|
-
@label.text = Qt::Application.translate("MainWindowSettingsWidget", "Output font", nil, Qt::Application::UnicodeUTF8)
|
92
|
-
@_general__wrap_output.text = Qt::Application.translate("MainWindowSettingsWidget", "&Wrap lines in output widgets", nil, Qt::Application::UnicodeUTF8)
|
93
118
|
@groupBox.title = Qt::Application.translate("MainWindowSettingsWidget", "Default paths", nil, Qt::Application::UnicodeUTF8)
|
94
119
|
@label_2.text = Qt::Application.translate("MainWindowSettingsWidget", "&Default script directory", nil, Qt::Application::UnicodeUTF8)
|
95
120
|
@label_3.text = Qt::Application.translate("MainWindowSettingsWidget", "&Default project directory", nil, Qt::Application::UnicodeUTF8)
|
121
|
+
@groupBox_2.title = Qt::Application.translate("MainWindowSettingsWidget", "Output", nil, Qt::Application::UnicodeUTF8)
|
122
|
+
@label.text = Qt::Application.translate("MainWindowSettingsWidget", "Output font", nil, Qt::Application::UnicodeUTF8)
|
123
|
+
@_general__wrap_output.text = Qt::Application.translate("MainWindowSettingsWidget", "&Wrap lines in output widgets", nil, Qt::Application::UnicodeUTF8)
|
124
|
+
@label_4.text = Qt::Application.translate("MainWindowSettingsWidget", "When opening files from tool widgets in a new editor", nil, Qt::Application::UnicodeUTF8)
|
125
|
+
@_general__tool_open_files.insertItems(0, [Qt::Application.translate("MainWindowSettingsWidget", "Open editor in new tab", nil, Qt::Application::UnicodeUTF8),
|
126
|
+
Qt::Application.translate("MainWindowSettingsWidget", "Split current editor horizontally", nil, Qt::Application::UnicodeUTF8),
|
127
|
+
Qt::Application.translate("MainWindowSettingsWidget", "Split current editor vertically", nil, Qt::Application::UnicodeUTF8)])
|
128
|
+
@_general__tool_open_files.setProperty("access", Qt::Variant.new(Qt::Application.translate("MainWindowSettingsWidget", "$tool_open_files", nil, Qt::Application::UnicodeUTF8)))
|
96
129
|
end # retranslateUi
|
97
130
|
|
98
131
|
def retranslate_ui(mainWindowSettingsWidget)
|
@@ -6,42 +6,21 @@
|
|
6
6
|
<rect>
|
7
7
|
<x>0</x>
|
8
8
|
<y>0</y>
|
9
|
-
<width>
|
10
|
-
<height>
|
9
|
+
<width>507</width>
|
10
|
+
<height>235</height>
|
11
11
|
</rect>
|
12
12
|
</property>
|
13
13
|
<property name="windowTitle">
|
14
14
|
<string>Form</string>
|
15
15
|
</property>
|
16
|
-
<layout class="QVBoxLayout" name="
|
17
|
-
<item>
|
18
|
-
<layout class="QHBoxLayout" name="horizontalLayout">
|
19
|
-
<item>
|
20
|
-
<widget class="QLabel" name="label">
|
21
|
-
<property name="text">
|
22
|
-
<string>Output font</string>
|
23
|
-
</property>
|
24
|
-
</widget>
|
25
|
-
</item>
|
26
|
-
<item>
|
27
|
-
<widget class="KFontRequester" name="_general__output_font"/>
|
28
|
-
</item>
|
29
|
-
</layout>
|
30
|
-
</item>
|
31
|
-
<item>
|
32
|
-
<widget class="QCheckBox" name="_general__wrap_output">
|
33
|
-
<property name="text">
|
34
|
-
<string>&Wrap lines in output widgets</string>
|
35
|
-
</property>
|
36
|
-
</widget>
|
37
|
-
</item>
|
16
|
+
<layout class="QVBoxLayout" name="verticalLayout_2">
|
38
17
|
<item>
|
39
18
|
<widget class="QGroupBox" name="groupBox">
|
40
19
|
<property name="title">
|
41
20
|
<string>Default paths</string>
|
42
21
|
</property>
|
43
|
-
<layout class="
|
44
|
-
<item row="
|
22
|
+
<layout class="QGridLayout" name="gridLayout_2">
|
23
|
+
<item row="0" column="0">
|
45
24
|
<widget class="QLabel" name="label_2">
|
46
25
|
<property name="text">
|
47
26
|
<string>&Default script directory</string>
|
@@ -51,7 +30,10 @@
|
|
51
30
|
</property>
|
52
31
|
</widget>
|
53
32
|
</item>
|
54
|
-
<item row="
|
33
|
+
<item row="0" column="1">
|
34
|
+
<widget class="KUrlRequester" name="_general__default_script_directory"/>
|
35
|
+
</item>
|
36
|
+
<item row="1" column="0">
|
55
37
|
<widget class="QLabel" name="label_3">
|
56
38
|
<property name="text">
|
57
39
|
<string>&Default project directory</string>
|
@@ -62,14 +44,74 @@
|
|
62
44
|
</widget>
|
63
45
|
</item>
|
64
46
|
<item row="1" column="1">
|
65
|
-
<widget class="KUrlRequester" name="_general__default_script_directory"/>
|
66
|
-
</item>
|
67
|
-
<item row="2" column="1">
|
68
47
|
<widget class="KUrlRequester" name="_general__default_project_directory"/>
|
69
48
|
</item>
|
70
49
|
</layout>
|
71
50
|
</widget>
|
72
51
|
</item>
|
52
|
+
<item>
|
53
|
+
<widget class="QGroupBox" name="groupBox_2">
|
54
|
+
<property name="title">
|
55
|
+
<string>Output</string>
|
56
|
+
</property>
|
57
|
+
<layout class="QVBoxLayout" name="verticalLayout">
|
58
|
+
<item>
|
59
|
+
<layout class="QHBoxLayout" name="horizontalLayout">
|
60
|
+
<item>
|
61
|
+
<widget class="QLabel" name="label">
|
62
|
+
<property name="text">
|
63
|
+
<string>Output font</string>
|
64
|
+
</property>
|
65
|
+
</widget>
|
66
|
+
</item>
|
67
|
+
<item>
|
68
|
+
<widget class="KFontRequester" name="_general__output_font"/>
|
69
|
+
</item>
|
70
|
+
</layout>
|
71
|
+
</item>
|
72
|
+
<item>
|
73
|
+
<widget class="QCheckBox" name="_general__wrap_output">
|
74
|
+
<property name="text">
|
75
|
+
<string>&Wrap lines in output widgets</string>
|
76
|
+
</property>
|
77
|
+
</widget>
|
78
|
+
</item>
|
79
|
+
<item>
|
80
|
+
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
81
|
+
<item>
|
82
|
+
<widget class="QLabel" name="label_4">
|
83
|
+
<property name="text">
|
84
|
+
<string>When opening files from tool widgets in a new editor</string>
|
85
|
+
</property>
|
86
|
+
</widget>
|
87
|
+
</item>
|
88
|
+
<item>
|
89
|
+
<widget class="KComboBox" name="_general__tool_open_files">
|
90
|
+
<property name="access" stdset="0">
|
91
|
+
<string>$tool_open_files</string>
|
92
|
+
</property>
|
93
|
+
<item>
|
94
|
+
<property name="text">
|
95
|
+
<string>Open editor in new tab</string>
|
96
|
+
</property>
|
97
|
+
</item>
|
98
|
+
<item>
|
99
|
+
<property name="text">
|
100
|
+
<string>Split current editor horizontally</string>
|
101
|
+
</property>
|
102
|
+
</item>
|
103
|
+
<item>
|
104
|
+
<property name="text">
|
105
|
+
<string>Split current editor vertically</string>
|
106
|
+
</property>
|
107
|
+
</item>
|
108
|
+
</widget>
|
109
|
+
</item>
|
110
|
+
</layout>
|
111
|
+
</item>
|
112
|
+
</layout>
|
113
|
+
</widget>
|
114
|
+
</item>
|
73
115
|
</layout>
|
74
116
|
</widget>
|
75
117
|
<customwidgets>
|
@@ -83,6 +125,11 @@
|
|
83
125
|
<extends>QWidget</extends>
|
84
126
|
<header>kfontrequester.h</header>
|
85
127
|
</customwidget>
|
128
|
+
<customwidget>
|
129
|
+
<class>KComboBox</class>
|
130
|
+
<extends>QComboBox</extends>
|
131
|
+
<header>kcombobox.h</header>
|
132
|
+
</customwidget>
|
86
133
|
</customwidgets>
|
87
134
|
<resources/>
|
88
135
|
<connections/>
|
@@ -1,8 +1,8 @@
|
|
1
1
|
=begin
|
2
2
|
** Form generated from reading ui file 'new_project_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 'open_file_in_project_dlg.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 'output_color_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,7 +1,7 @@
|
|
1
1
|
=begin
|
2
2
|
** Form generated from reading ui file 'workspace_settings_widget.ui'
|
3
3
|
**
|
4
|
-
** Created:
|
4
|
+
** Created: mer gen 12 12:12:11 2011
|
5
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!
|
@@ -113,6 +113,7 @@ contain another value, @:close_starting_document@
|
|
113
113
|
view = @solver.place_editor hints
|
114
114
|
if view
|
115
115
|
dir = Qt.const_get hints[:split].to_s.capitalize
|
116
|
+
# tab(view).split view, editor, dir
|
116
117
|
view.parent.split view, editor, dir
|
117
118
|
else
|
118
119
|
if hints[:close_starting_document]
|
@@ -335,14 +336,26 @@ The views is activated, unless it was already active
|
|
335
336
|
=begin rdoc
|
336
337
|
Slot called whenever a view is closed
|
337
338
|
|
338
|
-
It deactivates the view (if it was active)
|
339
|
+
It deactivates the view (if it was active), performs some cleanup and gives focus
|
340
|
+
to the editor which had focus before (if any).
|
339
341
|
@param [EditorView] view the view which is being closed
|
340
342
|
@return [nil]
|
341
343
|
=end
|
342
344
|
def view_closing view
|
345
|
+
view_tab = self.tab(view)
|
346
|
+
has_focus = view_tab.is_active_window if view_tab
|
347
|
+
if has_focus
|
348
|
+
views = view_tab.to_a
|
349
|
+
idx = views.index(view)
|
350
|
+
new_view = views[idx-1] || views[idx+1]
|
351
|
+
end
|
343
352
|
@activation_order.delete view
|
344
353
|
disconnect view, SIGNAL('focus_in(QWidget*)'), self, SLOT('focus_in_view(QWidget*)')
|
345
354
|
deactivate_editor view
|
355
|
+
if new_view
|
356
|
+
make_editor_active new_view
|
357
|
+
new_view.set_focus
|
358
|
+
end
|
346
359
|
nil
|
347
360
|
end
|
348
361
|
slots 'view_closing(QWidget*)'
|
data/lib/ruber/output_widget.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
=begin
|
2
|
-
Copyright (C) 2010 by Stefano Crocco
|
2
|
+
Copyright (C) 2010,2011 by Stefano Crocco
|
3
3
|
stefano.crocco@alice.it
|
4
4
|
|
5
5
|
This program is free software; you can redistribute it andor modify
|
@@ -24,6 +24,7 @@ require 'ruber/gui_states_handler'
|
|
24
24
|
|
25
25
|
module Ruber
|
26
26
|
|
27
|
+
|
27
28
|
=begin rdoc
|
28
29
|
Widget meant to be used as tool widget to display the output of a program. It is
|
29
30
|
based on Qt Model/View classes and provides the following facitlities:
|
@@ -44,140 +45,151 @@ based on Qt Model/View classes and provides the following facitlities:
|
|
44
45
|
couple of convenience methods to make text insertion even easier.
|
45
46
|
|
46
47
|
Note that OutputWidget is not (and doesn't derive from) one of the View classes.
|
47
|
-
Rather, it's a normal
|
48
|
+
Rather, it's a normal @Qt::Widget@ which has the view as its only child.
|
48
49
|
You can add other widgets to the OutputWidget as you would with any other widget:
|
49
50
|
create the widget with the OutputWidget as parent and add it to the OutputWidget's
|
50
|
-
layout (which is a
|
51
|
+
layout (which is a @Qt::GridLayout@ where the view is at position 0,0).
|
51
52
|
|
52
|
-
|
53
|
-
which correspond to
|
53
|
+
*Note:* this class defines two new roles (@OutputTypeRole@ and @IsTitleRole@),
|
54
|
+
which correspond to @Qt::UserRole@ and @Qt::UserRole+1@. Therefore,
|
54
55
|
if you need to define other custom roles, please have them start from
|
55
|
-
|
56
|
+
@Ruber::OutputWidget::IsTitleRole+1@.
|
56
57
|
|
57
|
-
|
58
|
-
|
58
|
+
h3. Output types
|
59
|
+
|
60
|
+
The @output_type@ of an entry in the model can be set using the {#set_output_type}
|
59
61
|
method. This has two effects: first, the item will be displayed using the color
|
60
62
|
chosen by the user for that output type; second, the name of the output type will
|
61
|
-
be stored in that item under the custom role
|
63
|
+
be stored in that item under the custom role @OutputTypeRole@.
|
62
64
|
|
63
|
-
There are several predefined output types:
|
64
|
-
|
65
|
-
|
65
|
+
There are several predefined output types: @message@, @message_good@,
|
66
|
+
@message_bad@, @output@,
|
67
|
+
@output1@, @output2@, @warning@, @warning1@, @warning2@, @error@, @error1@ and @error2@.
|
66
68
|
The types ending with a number
|
67
|
-
can be used when you need different types with similar meaning.
|
69
|
+
can be used when you need different types with similar meaning.
|
70
|
+
|
71
|
+
The @message@ type
|
68
72
|
(and its variations) are meant to display messages which don't come from the external
|
69
73
|
program but from Ruber itself (for example, a message telling that the external
|
70
|
-
problem exited successfully or exited with an error) Its good and bad version are
|
74
|
+
problem exited successfully or exited with an error). Its good and bad version are
|
71
75
|
meant to display messages with good news and bad news respectively (for example:
|
72
|
-
"the program exited successfully" could be displayed using the
|
73
|
-
type, while "the program crashed" could be displayed using the
|
74
|
-
type).
|
76
|
+
"the program exited successfully" could be displayed using the @message_good@
|
77
|
+
type, while "the program crashed" could be displayed using the @message_bad@
|
78
|
+
type).
|
79
|
+
|
80
|
+
The @output@ type is meant
|
75
81
|
to be used to show the text written by the external program on standard output,
|
76
|
-
while the
|
77
|
-
you can distinguish between warning and errors, you can use the
|
82
|
+
while the @error@ type is used to display the text written on standard error. If
|
83
|
+
you can distinguish between warning and errors, you can use the @warning@ type
|
78
84
|
for the latter.
|
79
85
|
|
80
86
|
The colors for the default output types are chosen by the user from the configuration
|
81
87
|
dialog and are used whenever those output types are requested.
|
82
88
|
|
83
89
|
New output types (and their associated colors) can be make known to the output
|
84
|
-
widget by using the
|
90
|
+
widget by using the @set_color_for@ method. There's no need to remove the
|
85
91
|
color, for example when the plugin is unloaded (indeed, there's no way to do so).
|
86
92
|
|
87
|
-
|
88
|
-
|
89
|
-
|
93
|
+
h3. The context menu
|
94
|
+
|
95
|
+
This widget automatically creates a context menu containing three actions: Copy,
|
96
|
+
Copy Selected and Clear. Copy and Copy Selected copy the text contained respectively
|
90
97
|
in all the items and in the selected items to the clipboard. The clear action
|
91
98
|
removes all the entries from the model.
|
92
99
|
|
93
100
|
You can add other actions to the menu by performing the following steps:
|
94
|
-
* add an entry in the appropriate position of
|
95
|
-
that
|
96
|
-
and
|
97
|
-
correct place.
|
101
|
+
* add an entry in the appropriate position of {#action_list}. Note
|
102
|
+
that this is an instance of ActionList, so it provides the {ActionList#insert_after insert_after}
|
103
|
+
and {ActionList#insert_before insert_before} methods which allow to easily put the actions in the
|
104
|
+
correct place. {#action_list} contains the @object_name@ of
|
98
105
|
the actions (and *nil* for the separators), not the action themselves
|
99
|
-
* create the actions (setting their
|
100
|
-
in
|
106
|
+
* create the actions (setting their @object_name@ to the values inserted
|
107
|
+
in {#action_list}) and put them into the {#actions} hash, using the @object_name@
|
101
108
|
as keys. Of course, you also need to define the appropriate slots and connect
|
102
109
|
them to the actions' signals.
|
103
110
|
|
104
111
|
Note that actions can only be added _before_ the menu is first shown (usually, you
|
105
|
-
do that in the widget's constructor). The signal
|
112
|
+
do that in the widget's constructor). The {#about_to_fill_menu} signal is
|
106
113
|
emitted just before the menu is built: this is the last time you can add entries
|
107
114
|
to it.
|
108
115
|
|
109
|
-
OutputWidget mixes in the GuiStatesHandler module, which means you can define states
|
110
|
-
to enable and disable actions as usual. By default, two states are defined:
|
111
|
-
and
|
116
|
+
{OutputWidget} mixes in the {GuiStatesHandler} module, which means you can define states
|
117
|
+
to enable and disable actions as usual. By default, two states are defined: @no_text@
|
118
|
+
and @no_selection@. As the names imply, the former is *true* when the model
|
112
119
|
is empty and *false* when there's at least one item; the second is *true* when no
|
113
120
|
item is selected and *false* when there are selected items.
|
114
121
|
|
115
|
-
For the menu to be displayed automatically, the view should have a
|
122
|
+
For the menu to be displayed automatically, the view should have a @context_menu_requested(QPoint)@
|
116
123
|
signal. The menu will be displayed in response to that signal, at the point given
|
117
|
-
as argument. For convenience, there are three classes
|
118
|
-
|
119
|
-
respectively from
|
120
|
-
which emit that signal from their
|
124
|
+
as argument. For convenience, there are three classes {OutputWidget::ListView},
|
125
|
+
{OutputWidget::TreeView} and {OutputWidget::TableView}, derived
|
126
|
+
respectively from @Qt::ListView@, @Qt::TreeView@ and @Qt::TableView@
|
127
|
+
which emit that signal from their @contextMenuEvent@ method. If you use
|
121
128
|
one of these classes as view, the menu will work automatically.
|
122
129
|
|
123
|
-
|
130
|
+
h3. Autoscrolling
|
131
|
+
|
124
132
|
Whenever an item is added to the list, the view will be scrolled so that the added
|
125
|
-
item is visible. Plugins which don't want this feature can disable it
|
126
|
-
|
133
|
+
item is visible. Plugins which don't want this feature can disable it by setting
|
134
|
+
{#auto_scroll} to *false*. Note that auto scrolling won't happen if an item
|
127
135
|
is modified or removed
|
128
136
|
|
129
|
-
|
130
|
-
|
131
|
-
the
|
137
|
+
h3. Word wrapping
|
138
|
+
|
139
|
+
If the user has enabled word wrapping for output widgets in the config dialog
|
140
|
+
(the @general/wrap_output@ option), word wrapping will be automatically enabled for
|
132
141
|
all output widgets. If the user has disabled it, it will be disabled for all
|
133
142
|
widgets.
|
134
143
|
|
135
|
-
Subclasses can avoid the automatic behaviour by setting the
|
144
|
+
Subclasses can avoid the automatic behaviour by setting the {#ignore_word_wrap_option}
|
136
145
|
attribute to *true* and managing word wrap by themselves. This is mostly useful
|
137
146
|
for output widgets for which word wrap is undesirable or meaningless.
|
138
147
|
|
139
|
-
|
148
|
+
h3. Opening files in the editor
|
149
|
+
|
140
150
|
Whenever the user activates an item, the text of the item is searched for a filename
|
141
151
|
(and optionally for a line number). If it's found, a new editor view is opened
|
142
|
-
and the file is displayed in it.
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
the
|
151
|
-
|
152
|
+
and the file is displayed in it. The editor can be an already existing editor
|
153
|
+
or a new one created by splitting the current editor or in a new tab, according to
|
154
|
+
the @general/tool_open_files@ option.
|
155
|
+
|
156
|
+
This process uses four methods:
|
157
|
+
|
158
|
+
- {#maybe_open_file}:=
|
159
|
+
the method connected to the view's @activated(QModelIndex)@ signal. It
|
160
|
+
starts the search for the filename and, if successful, opens the editor view =:
|
161
|
+
- {#find_filename_in_index}:=
|
162
|
+
performs the search of the filename. By default, it uses {#find_filename_in_string},
|
163
|
+
but subclasses can override it to change the behaviour=:
|
164
|
+
- {#find_filename_in_string}:=
|
165
|
+
the method used by default by {#find_filename_in_index} to find the
|
166
|
+
filename.=:
|
167
|
+
- {#display_file}:= opens the file in an editor. By default uses the @general/tool_open_files@
|
168
|
+
to decide how the editor should be created, but this behaviour can be overridden
|
169
|
+
by subclasses.
|
152
170
|
|
153
171
|
If a relative filename is found, it's considered relative to the directory contained
|
154
|
-
in the
|
172
|
+
in the {#working_dir} attribute.
|
155
173
|
|
156
|
-
|
157
|
-
It behaves as a standard <tt>Qt::StandardItemModel</tt>, but it provides an +insert+
|
158
|
-
method and an <tt>insert_lines</tt> method which make easier adding items. You
|
159
|
-
don't need to use this model. If you don't, simply pass another one to the OutputWidget
|
160
|
-
constructor
|
174
|
+
h3. {OutputWidget::Model}
|
161
175
|
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
===Slots
|
168
|
-
* <tt>show_menu(QPoint)</tt>
|
169
|
-
* <tt>selection_changed(QItemSelection, QItemSelection)</tt>
|
170
|
-
* <tt>rows_changed()</tt>
|
171
|
-
* <tt>do_auto_scroll(QModelIndex, int, int)</tt>
|
172
|
-
* <tt>copy()</tt>
|
173
|
-
* <tt>copy_selected()</tt>
|
174
|
-
* <tt>clear_output()</tt>
|
175
|
-
* <tt>maybe_open_file()</tt>
|
176
|
+
The {OutputWidget::Model} class behaves as a standard @Qt::StandardItemModel@, but
|
177
|
+
provides two methods, {OutputWidget::Model#insert insert} and
|
178
|
+
{OutputWidget::Model#insert_lines insert_lines} which make easier adding items. You
|
179
|
+
aren't forced to use this model, however: if you want to use another class,
|
180
|
+
pass it to the constructor.
|
176
181
|
=end
|
177
182
|
class OutputWidget < Qt::Widget
|
178
183
|
|
179
184
|
include GuiStatesHandler
|
185
|
+
|
186
|
+
=begin rdoc
|
187
|
+
Signal emitted immediately before the menu is created
|
180
188
|
|
189
|
+
You should connect to this
|
190
|
+
signal if you want to add actions to the menu at the last possible time. Usually,
|
191
|
+
however, you don't need it, as actions are usually created in the constructor.
|
192
|
+
=end
|
181
193
|
signals :about_to_fill_menu
|
182
194
|
|
183
195
|
slots 'show_menu(QPoint)', 'selection_changed(QItemSelection, QItemSelection)',
|
@@ -195,76 +207,70 @@ The role which contains whether an item is or not the title
|
|
195
207
|
IsTitleRole = OutputTypeRole + 1
|
196
208
|
|
197
209
|
=begin rdoc
|
198
|
-
|
210
|
+
@return [Boolean ] whether auto scrolling should be enabled or not (default: *true*)
|
199
211
|
=end
|
200
212
|
attr_accessor :auto_scroll
|
201
213
|
|
202
214
|
=begin rdoc
|
203
|
-
|
204
|
-
the general/wrap_output setting or not (default: *false*)
|
215
|
+
@return [Boolean] whether or not word wrapping should respect the @general/wrap_output@ option (default: *false*)
|
205
216
|
=end
|
206
217
|
attr_accessor :ignore_word_wrap_option
|
207
218
|
|
208
219
|
=begin rdoc
|
209
|
-
|
220
|
+
@return [String] the directory used to resolve relative paths when opening a file (default *nil*)
|
210
221
|
=end
|
211
222
|
attr_accessor :working_dir
|
212
223
|
alias :working_directory :working_dir
|
213
224
|
alias :working_directory= :working_dir=
|
214
225
|
|
215
226
|
=begin rdoc
|
216
|
-
|
217
|
-
|
227
|
+
@return [Boolean] whether or not to {#find_filename_in_index} should skip the first
|
228
|
+
file name in the title
|
218
229
|
=end
|
219
230
|
attr_accessor :skip_first_file_in_title
|
220
231
|
|
221
232
|
=begin rdoc
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
233
|
+
@return [ActionList] the names of the action to use to build the menu
|
234
|
+
|
235
|
+
Separators are represented by *nil* entries. The default is
|
236
|
+
@['copy', 'copy_selected', nil, 'clear']@.
|
226
237
|
=end
|
227
238
|
attr_reader :action_list
|
228
239
|
|
229
240
|
=begin rdoc
|
230
|
-
|
231
|
-
themselves as values. By default, it contains the 'copy', 'copy_selected' and
|
232
|
-
'clear' actions.
|
241
|
+
@return [Hash{String => KDE::Action}] the actions to insert in the menu
|
233
242
|
|
234
|
-
|
243
|
+
Each action is inserted using its @object_name@ as key. By default, the hash
|
244
|
+
contains the 'copy', 'copy_selected' and 'clear' actions.
|
235
245
|
=end
|
236
246
|
attr_reader :actions
|
237
247
|
|
238
248
|
=begin rdoc
|
239
|
-
|
249
|
+
@return [Qt::AbstractItemModel] the model used by the {OutputWidget}
|
240
250
|
=end
|
241
251
|
attr_reader :model
|
242
252
|
|
243
253
|
=begin rdoc
|
244
|
-
|
254
|
+
@return [Qt::AbstractItemView] the view used by the OutputWidget
|
245
255
|
=end
|
246
256
|
attr_reader :view
|
247
257
|
|
248
|
-
|
249
258
|
private :action_list, :actions
|
250
259
|
|
251
260
|
=begin rdoc
|
252
|
-
|
253
|
-
the
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
<b>Note:</b> if a widget is specified as value of the +:view+ option, it will become
|
267
|
-
a child of the new OutputWidget.
|
261
|
+
@param [Qt::Widget,nil] the parent widget
|
262
|
+
@param [Hash] opts fine-tune the new widget
|
263
|
+
@option opts [Qt::AbstractItemView, Symbol] :view (:list) the view to use for
|
264
|
+
the widget. If it is an instance of a subclass of @Qt::AbstractItemView@, it'll
|
265
|
+
be used as it is (and the new widget will become a child of the output widget).
|
266
|
+
If it is a symbol, it can be either @:list@, @:tree@ or @:table@. In this case,
|
267
|
+
a new instance respectively of {ListView}, {TreeView} or {TableView} will be
|
268
|
+
created
|
269
|
+
@option opts [Qt::AbstractItemModel,nil] :model (nil) the model the output widget
|
270
|
+
should use. If *nil*, a new instance of {Model} will be used
|
271
|
+
@option opts [Boolean] :use_default_font (false) whether or not the application's
|
272
|
+
default font should by used for the output widget. By default, the font used
|
273
|
+
is the one the user set in the @general/output_font@ option
|
268
274
|
=end
|
269
275
|
def initialize parent = nil, opts = {}
|
270
276
|
|
@@ -296,26 +302,29 @@ a child of the new OutputWidget.
|
|
296
302
|
end
|
297
303
|
|
298
304
|
=begin rdoc
|
299
|
-
|
300
|
-
whose output type is _name_. _name_ should be a symbol.
|
305
|
+
Associates a color with an output type
|
301
306
|
|
302
|
-
If a color had already been
|
307
|
+
If a color had already been associated with the given output type, it'll be overwritten.
|
308
|
+
|
309
|
+
This method is useful to define new output types.
|
310
|
+
@param [Symbol] name the name of the output type
|
311
|
+
@param [Qt::Color] color the color to associate with the given output type
|
312
|
+
@return [nil]
|
303
313
|
=end
|
304
314
|
def set_color_for name, color
|
305
315
|
@colors[name] = color
|
316
|
+
nil
|
306
317
|
end
|
307
318
|
|
308
319
|
=begin rdoc
|
309
|
-
Scrolls the view so that the item corresponding
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
* *nil*. In this case, the view will be scrolled so that the first toplevel item
|
318
|
-
of the last row is visible.
|
320
|
+
Scrolls the view so that the item corresponding the given index is visible
|
321
|
+
|
322
|
+
@param [Qt::ModelIndex,Integer,nil] idx the item to make visible. If it's a
|
323
|
+
@Qt::ModelIndex@, it's the index to make visible. If it is a positive integer.
|
324
|
+
the view will be scrolled so that the first toplevel item in the row _idx_ is
|
325
|
+
visible; if it's a negative integer, the rows are counted from the end. If *nil*
|
326
|
+
the first toplevel item of the last row will become visible
|
327
|
+
@return [nil]
|
319
328
|
=end
|
320
329
|
def scroll_to idx
|
321
330
|
case idx
|
@@ -334,19 +343,19 @@ of the last row is visible.
|
|
334
343
|
@view.scroll_to @model.index(@model.row_count - 1, 0),
|
335
344
|
Qt::AbstractItemView::PositionAtBottom
|
336
345
|
end
|
346
|
+
nil
|
337
347
|
end
|
338
348
|
|
339
349
|
=begin rdoc
|
340
|
-
|
341
|
-
(a symbol).
|
350
|
+
Changes the output type of a given index
|
342
351
|
|
343
|
-
If a color has been associated with
|
344
|
-
|
345
|
-
role of the index will be changed to that color and the +OutputTypeRole+ of the
|
346
|
-
index will be set to a string version of _type_. In this case, _type_ is returned.
|
352
|
+
If a color has been associated with that output type, the foreground role and the
|
353
|
+
output type role of that index are updated accordingly.
|
347
354
|
|
348
|
-
If no color has been associated with
|
349
|
-
|
355
|
+
If no color has been associated with the output type, nothing is done
|
356
|
+
@param [Qt::ModelIndex] idx the index to set the output type for
|
357
|
+
@param [Symbol] type the new output type to associate with the index
|
358
|
+
@return [Symbol,nil] _type_ if a color was associated with it and *nil* otherwise
|
350
359
|
=end
|
351
360
|
def set_output_type idx, type
|
352
361
|
color = @colors[type]
|
@@ -358,8 +367,13 @@ If no color has been associated with _type_, this method does nothing and return
|
|
358
367
|
end
|
359
368
|
|
360
369
|
=begin rdoc
|
361
|
-
Executes
|
362
|
-
|
370
|
+
Executes a block while temporarily turning autoscrolling on or off
|
371
|
+
|
372
|
+
After the block has been executed, autoscrolling returns to the original state.
|
373
|
+
|
374
|
+
@param [Boolean] val whether to turn autoscrolling on or off
|
375
|
+
@yield the block to execute with autoscroll turned on or off
|
376
|
+
@return [Object] the value returned by the block
|
363
377
|
=end
|
364
378
|
def with_auto_scrolling val
|
365
379
|
old = @auto_scroll
|
@@ -372,19 +386,21 @@ permanently changing the autoscrolling setting.
|
|
372
386
|
=begin rdoc
|
373
387
|
Gives a title to the widget.
|
374
388
|
|
375
|
-
A title is a toplevel entry at position 0,0 with output type
|
376
|
-
the
|
389
|
+
A title is a toplevel entry at position 0, 0 with output type @:message@ and has
|
390
|
+
the @IsTitleRole@ set to *true*. Of course, there can be only one item which is
|
377
391
|
a title.
|
378
392
|
|
379
|
-
If the item in position 0,0 is not a title, a new row
|
380
|
-
|
381
|
-
true.
|
393
|
+
If the item in position 0, 0 is not a title, a new row with title role and the
|
394
|
+
given text is inserted.
|
382
395
|
|
383
|
-
If the item in position 0,0 is a title, then its
|
384
|
-
|
396
|
+
If the item in position 0,0 is a title, then its display role is replaced with
|
397
|
+
the given text.
|
385
398
|
|
386
399
|
Usually, the title is created when the external program is started and changed
|
387
|
-
later if needed
|
400
|
+
later if needed.
|
401
|
+
|
402
|
+
@param [String] text the text of title
|
403
|
+
@return [nil]
|
388
404
|
=end
|
389
405
|
def title= text
|
390
406
|
idx = @model.index 0, 0
|
@@ -398,11 +414,14 @@ later if needed
|
|
398
414
|
@model.set_data idx, Qt::Variant.new(true), IsTitleRole
|
399
415
|
end
|
400
416
|
set_output_type idx, :message
|
417
|
+
nil
|
401
418
|
end
|
402
419
|
|
403
420
|
=begin rdoc
|
404
|
-
|
405
|
-
|
421
|
+
Whether or not the output widget has a title
|
422
|
+
|
423
|
+
See {#title=} for what is meant here by title
|
424
|
+
@return [Boolean] whether or not the output widget has a title
|
406
425
|
=end
|
407
426
|
def has_title?
|
408
427
|
@model.index(0,0).data(IsTitleRole).to_bool
|
@@ -410,6 +429,8 @@ for the meaning of the title
|
|
410
429
|
|
411
430
|
=begin rdoc
|
412
431
|
Loads the settings from the configuration file.
|
432
|
+
|
433
|
+
@return [nil]
|
413
434
|
=end
|
414
435
|
def load_settings
|
415
436
|
cfg = Ruber[:config]
|
@@ -427,34 +448,30 @@ Loads the settings from the configuration file.
|
|
427
448
|
rescue NoMethodError
|
428
449
|
end
|
429
450
|
end
|
451
|
+
nil
|
430
452
|
end
|
431
453
|
|
432
454
|
=begin rdoc
|
433
455
|
Removes all the entries from the model
|
456
|
+
|
457
|
+
@return [nil]
|
434
458
|
=end
|
435
459
|
def clear_output
|
436
460
|
@model.remove_rows 0, @model.row_count
|
461
|
+
nil
|
437
462
|
end
|
438
|
-
|
439
|
-
protected
|
440
|
-
|
441
|
-
# def keyReleaseEvent e
|
442
|
-
# ed = Ruber[:main_window].active_editor
|
443
|
-
# return super unless ed
|
444
|
-
# Ruber[:main_window].activate_editor ed
|
445
|
-
# ed.set_focus
|
446
|
-
# # mod = e.modifiers
|
447
|
-
# # if mod == Qt::NoModifier or mod == Qt::ShiftModifier
|
448
|
-
# # ed.insert_text e.text
|
449
|
-
# # end
|
450
|
-
# nil
|
451
|
-
# end
|
452
463
|
|
464
|
+
def pinned_down?
|
465
|
+
@pin_button.checked?
|
466
|
+
end
|
467
|
+
|
453
468
|
private
|
454
469
|
|
455
470
|
=begin rdoc
|
456
|
-
|
457
|
-
|
471
|
+
Updates the color of an index and its children so that it matches their output types
|
472
|
+
@param [Qt::ModelIndex] idx the index whose foreground color should be updated.
|
473
|
+
Its children will also be updated
|
474
|
+
@return [nil]
|
458
475
|
=end
|
459
476
|
def update_index_color idx
|
460
477
|
type = idx.data(OutputTypeRole).to_string.to_sym rescue nil
|
@@ -469,10 +486,17 @@ that it matches the color set for its output type.
|
|
469
486
|
end
|
470
487
|
end
|
471
488
|
end
|
489
|
+
nil
|
472
490
|
end
|
473
491
|
|
474
492
|
=begin rdoc
|
475
|
-
|
493
|
+
Prepares the model to use
|
494
|
+
|
495
|
+
After a call to this method, the model will become a child of the {OutputWidget}
|
496
|
+
|
497
|
+
@param [Qt::AbstractItemModel,nil] mod the model to use. If *nil*, a new instance
|
498
|
+
of {Model} will be used
|
499
|
+
@return [nil]
|
476
500
|
=end
|
477
501
|
def setup_model mod
|
478
502
|
@model = mod || Model.new(self)
|
@@ -482,26 +506,48 @@ Creates the model (if needed) and makes some signal-slot connections
|
|
482
506
|
connect @model, SIGNAL('rowsInserted(QModelIndex, int, int)'), self, SLOT(:rows_changed)
|
483
507
|
connect @model, SIGNAL('rowsRemoved(QModelIndex, int, int)'), self, SLOT(:rows_changed)
|
484
508
|
connect @model, SIGNAL('rowsInserted(QModelIndex, int, int)'), self, SLOT('do_auto_scroll(QModelIndex, int, int)')
|
509
|
+
nil
|
485
510
|
end
|
486
511
|
|
487
512
|
=begin rdoc
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
513
|
+
Slot called whenever rows are inserted in the model
|
514
|
+
|
515
|
+
If autoscrolling is enabled, it scrolls so that the last row inserted is at the
|
516
|
+
bottom of the widget. It does nothing if autoscrolling is disabled.
|
517
|
+
|
518
|
+
If the scrollbar slider is not at the bottom of the scroll bar, autoscrolling
|
519
|
+
isn't done, regardless of the option. This is because it's likely that the user
|
520
|
+
moved the slider, which may mean he's looking at some particular lines of output
|
521
|
+
and he wouldn't like them to scroll away.
|
522
|
+
|
523
|
+
@param [Qt::ModelIndex] parent the parent index of the inserted rows
|
524
|
+
@param [Qt::ModelIndex] start_idx the index corresponding to the first inserted
|
525
|
+
row (unused)
|
526
|
+
@param [Qt::ModelIndex] end_idx the index correspodnding to the last inserted row
|
527
|
+
|
528
|
+
@note all indexes are considered relative to the model associated with the view,
|
529
|
+
not to the model returned by {#model}. This doesn' matter for {OutputWidget} itself,
|
530
|
+
but makes a difference in sublclasses where the two models are different (for
|
531
|
+
example, {FilteredOutputWidget})
|
532
|
+
@return [nil]
|
493
533
|
=end
|
494
534
|
def do_auto_scroll parent, start_idx, end_idx
|
495
|
-
|
535
|
+
if @auto_scroll
|
536
|
+
scroll_bar = @view.vertical_scroll_bar
|
537
|
+
scroll_to @view.model.index(end_idx, 0, parent) if scroll_bar.value == scroll_bar.maximum
|
538
|
+
end
|
539
|
+
nil
|
496
540
|
end
|
497
541
|
|
498
542
|
=begin rdoc
|
499
|
-
Creates the menu
|
500
|
-
<tt>@actions</tt> instance variables.
|
543
|
+
Creates the context menu
|
501
544
|
|
502
|
-
|
545
|
+
The menu is created using the values returned by {#action_list} and {#actions}.
|
546
|
+
|
547
|
+
Before creating the menu, the {#about_to_fill_menu} signal is emitted. Connecting
|
503
548
|
to this signal allows to do some last-minute changes to the actions which will
|
504
549
|
be inserted in the menu.
|
550
|
+
@return [nil]
|
505
551
|
=end
|
506
552
|
def fill_menu
|
507
553
|
emit about_to_fill_menu
|
@@ -513,18 +559,28 @@ be inserted in the menu.
|
|
513
559
|
end
|
514
560
|
|
515
561
|
=begin rdoc
|
516
|
-
Shows the menu
|
562
|
+
Shows the menu
|
517
563
|
|
518
564
|
If the menu hasn't as yet been created, it creates it.
|
565
|
+
|
566
|
+
The menu is shown asynchronously. This means that this method doesn't wait for
|
567
|
+
the user to choose an action but returns immediately.
|
568
|
+
|
569
|
+
@param [Qt::Point] the point where the menu should be shown
|
570
|
+
@return [ni;]
|
519
571
|
=end
|
520
572
|
def show_menu pt
|
521
573
|
fill_menu if @menu.empty?
|
522
574
|
@menu.popup pt
|
575
|
+
nil
|
523
576
|
end
|
524
577
|
|
525
578
|
=begin rdoc
|
526
|
-
Creates the layout and the view
|
527
|
-
|
579
|
+
Creates the layout and the view
|
580
|
+
|
581
|
+
@param [AbstractItemView,Symbol] view the view to use. Has the same meaning as the
|
582
|
+
@:view@ option to {#initialize}
|
583
|
+
@return [nil]
|
528
584
|
=end
|
529
585
|
def create_widgets view
|
530
586
|
self.layout = Qt::GridLayout.new(self)
|
@@ -534,12 +590,21 @@ option in the constructor
|
|
534
590
|
else @view = self.class.const_get(view.to_s.capitalize + 'View').new self
|
535
591
|
end
|
536
592
|
@view.selection_mode = Qt::AbstractItemView::ExtendedSelection
|
537
|
-
|
593
|
+
@pin_button = Qt::ToolButton.new self
|
594
|
+
@pin_button.tool_tip = i18n("Don't hide the tool widget when clicking on a file name")
|
595
|
+
@pin_button.auto_raise = true
|
596
|
+
@pin_button.icon = Qt::Icon.new KDE::Global.dirs.find_resource('icon', 'pin.png')
|
597
|
+
@pin_button.checkable = true
|
598
|
+
layout.add_widget @view, 1, 0
|
599
|
+
layout.add_widget @pin_button, 0, 0, 1, -1, Qt::AlignRight | Qt::AlignVCenter
|
600
|
+
nil
|
538
601
|
end
|
539
602
|
|
540
603
|
=begin rdoc
|
541
|
-
Creates the
|
542
|
-
|
604
|
+
Creates the default actions for the context menu
|
605
|
+
|
606
|
+
It also sets up the gui state handlers for them
|
607
|
+
@return [nil]
|
543
608
|
=end
|
544
609
|
def create_standard_actions
|
545
610
|
@actions['copy'] = KDE::Action.new(self){|a| a.text = '&Copy'}
|
@@ -553,13 +618,15 @@ state handlers
|
|
553
618
|
connect @actions['copy'], SIGNAL(:triggered), self, SLOT(:copy)
|
554
619
|
connect @actions['copy_selected'], SIGNAL(:triggered), self, SLOT(:copy_selected)
|
555
620
|
connect @actions['clear'], SIGNAL(:triggered), self, SLOT(:clear_output)
|
621
|
+
nil
|
556
622
|
end
|
557
623
|
|
558
624
|
=begin rdoc
|
559
625
|
Slot connected to the 'Copy' action.
|
560
626
|
|
561
627
|
It copies the content of all the items to the clipboard. The text is obtained
|
562
|
-
from the items by calling
|
628
|
+
from the items by calling {#text_for_clipboard}.
|
629
|
+
@return [nil]
|
563
630
|
=end
|
564
631
|
def copy
|
565
632
|
items = []
|
@@ -576,13 +643,15 @@ from the items by calling <tt>text_for_clipboard</tt> passing it all the items.
|
|
576
643
|
end
|
577
644
|
clp = KDE::Application.clipboard
|
578
645
|
clp.text = text_for_clipboard items
|
646
|
+
nil
|
579
647
|
end
|
580
648
|
|
581
649
|
=begin rdoc
|
582
650
|
Slot connected to the 'Copy Selection' action.
|
583
651
|
|
584
652
|
It copies the content of all the items to the clipboard. The text is obtained
|
585
|
-
from the items by calling
|
653
|
+
from the items by calling {#text_for_clipboard}.
|
654
|
+
@return [nil]
|
586
655
|
=end
|
587
656
|
def copy_selected
|
588
657
|
clp = KDE::Application.clipboard
|
@@ -590,20 +659,22 @@ from the items by calling <tt>text_for_clipboard</tt> passing it the selected it
|
|
590
659
|
end
|
591
660
|
|
592
661
|
=begin rdoc
|
593
|
-
|
594
|
-
to put in the clipboard from the indexes.
|
662
|
+
Retrieves the text to copy to the clipboard from the given indexes
|
595
663
|
|
596
|
-
The
|
597
|
-
|
664
|
+
The string is created by joining the text of toplevel items on the same row and
|
665
|
+
different columns using tabs as separators. Different rows are separated with
|
598
666
|
newlines. Child items are ignored.
|
599
667
|
|
600
668
|
Derived class can override this method (and, if they plan to put child items in
|
601
|
-
the view, they're advised to do so).
|
602
|
-
as argument and return a string with the text to put in the clipboard.
|
669
|
+
the view, they're advised to do so).
|
603
670
|
|
604
671
|
The reason the default behaviour ignores child items is that their meaning (and
|
605
672
|
therefore the way their contents should be inserted into the string) depends
|
606
|
-
very much on the specific content
|
673
|
+
very much on the specific content, so there's no way to have a sensible default
|
674
|
+
behaviour.
|
675
|
+
|
676
|
+
@param [Array<Qt::ModelIndex>] indexes the indexes to use to create the text
|
677
|
+
@return [String] the text which should be put in the clipboard
|
607
678
|
=end
|
608
679
|
def text_for_clipboard indexes
|
609
680
|
indexes = indexes.select{|i| !i.parent.valid?}
|
@@ -622,96 +693,128 @@ very much on the specific content.
|
|
622
693
|
end
|
623
694
|
|
624
695
|
=begin rdoc
|
625
|
-
Slot connected to the view's selection model's selectionChanged signal
|
696
|
+
Slot connected to the view's selection model's @selectionChanged@ signal
|
626
697
|
|
627
|
-
Turns the
|
628
|
-
is empty or not
|
698
|
+
Turns the @no_selection@ gui state on or off according to whether the selection
|
699
|
+
is empty or not.
|
700
|
+
|
701
|
+
@return [nil]
|
629
702
|
=end
|
630
703
|
def selection_changed sel, desel
|
631
704
|
change_state 'no_selection', !@view.selection_model.has_selection
|
705
|
+
nil
|
632
706
|
end
|
633
707
|
|
634
708
|
=begin rdoc
|
635
|
-
|
709
|
+
Slot called whenever rows are added to or removed from the model
|
710
|
+
|
711
|
+
Turns the @no_text@ gui state on or off depending on whether the model
|
636
712
|
is empty or not
|
713
|
+
@return [nil]
|
637
714
|
=end
|
638
715
|
def rows_changed
|
639
716
|
change_state 'no_text', @model.row_count == 0
|
717
|
+
nil
|
640
718
|
end
|
641
719
|
|
642
720
|
=begin rdoc
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
|
721
|
+
Attempts to display the file whose name is contained in the given index
|
722
|
+
|
723
|
+
Searches for a filename in the DisplayRole of the index using the {#find_filename_in_index}
|
724
|
+
method. If a filename is found, an editor for it is displayed.
|
647
725
|
|
648
726
|
The behaviour of this method (which usually is only called via a signal-slot connection
|
649
|
-
to the views'
|
650
|
-
keyboard modifiers:
|
727
|
+
to the views' @activated(QModelindex)@ signal) changes according to the active
|
728
|
+
keyboard modifiers and to whether the Pinned tool button is on or off:
|
651
729
|
* if Ctrl or Shift are pressed and the view allows selection (that is, its selection
|
652
730
|
mode is not +NoSelection+), then this method does nothing. The reason for this
|
653
731
|
behaviour is that Ctrl and Shift are used to select items, so the user is most
|
654
732
|
likely doing that, not requesting to open a file
|
655
|
-
* if
|
733
|
+
* if the Pinned button is pressed, then the tool widget won't be closed (but the
|
734
|
+
focus will be moved to the editor)
|
735
|
+
* if Meta is pressed, then the file will be opened in a new editor, regardless
|
736
|
+
of whether an editor for that file already exists
|
737
|
+
|
738
|
+
If a new editor should be created (either because the Meta key is pressed or because
|
739
|
+
no editor exists for the given file), the hints returned by {#hints} are used.
|
740
|
+
Unless the {#hints} method has been overloaded, this means that the @general/tool_open_files@
|
741
|
+
option is used.
|
742
|
+
@param [Qt::ModelIndex] idx the index which could contain the file name
|
743
|
+
@return [EditorView,nil] the editor for the filename contained in the index or
|
744
|
+
*nil* if no file name was found or if either the Shift or Control modifiers were
|
745
|
+
active
|
746
|
+
@see #find_filename_in_index
|
747
|
+
@see #hints
|
656
748
|
=end
|
657
749
|
def maybe_open_file idx
|
658
750
|
modifiers = Application.keyboard_modifiers
|
659
751
|
if @view.selection_mode != Qt::AbstractItemView::NoSelection
|
660
752
|
return if Qt::ControlModifier & modifiers != 0 or Qt::ShiftModifier & modifiers != 0
|
661
753
|
end
|
662
|
-
file = find_filename_in_index idx
|
754
|
+
file, line = find_filename_in_index idx
|
663
755
|
return unless file
|
664
|
-
line
|
665
|
-
|
666
|
-
|
667
|
-
Ruber[:main_window].
|
756
|
+
line -= 1 unless line == 0
|
757
|
+
existing = (Qt::MetaModifier & modifiers) == 0 ? :always : :never
|
758
|
+
display_hints = hints.merge(:line => line, :existing => existing)
|
759
|
+
ed = Ruber[:main_window].display_document file, display_hints
|
760
|
+
Ruber[:main_window].hide_tool self unless pinned_down?
|
761
|
+
ed
|
668
762
|
end
|
669
763
|
|
670
764
|
=begin rdoc
|
671
|
-
|
672
|
-
(if any) when an item is activated.
|
765
|
+
The hints to pass to {MainWindow#display_document}
|
673
766
|
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
767
|
+
This method determines the hints to use according to the @general/tool_open_files@
|
768
|
+
option. Derived classes may override this method to provide different hints. The
|
769
|
+
values which can be used are the ones described for {MainWindow#editor_for!}. Note,
|
770
|
+
however, that the @:existing@ entry won't be used.
|
771
|
+
@return [Hash] see the description for the _hints_ argument of {MainWindow#editor_for!}
|
772
|
+
=end
|
773
|
+
def hints
|
774
|
+
case Ruber[:config][:general, :tool_open_files]
|
775
|
+
when :split_horizontally then {:new => :current_tab, :split => :horizontal}
|
776
|
+
when :split_vertically then {:new => :current_tab, :split => :vertical}
|
777
|
+
else {:new => :new_tab}
|
778
|
+
end
|
779
|
+
end
|
780
|
+
|
781
|
+
=begin rdoc
|
782
|
+
Searches in the display role of the given index for a file name
|
688
783
|
|
689
|
-
|
690
|
-
|
691
|
-
from it before being passed to <tt>find_filename_in_string</tt>. The reason is
|
692
|
-
that often the title contains the command line of a program, for example:
|
784
|
+
This method is used by {#maybe_open_file} to find out the name of the file to open
|
785
|
+
(if any) when an item is activated.
|
693
786
|
|
694
|
-
|
787
|
+
The actual search for the file name is done by {#find_filename_in_string}. If it
|
788
|
+
reports a success, this method makes sure the file actually exists, expanding it
|
789
|
+
relative to {#working_dir} if it's not an absolute path. If {#working_dir} is
|
790
|
+
not set, the current directory will be used. However, you're advised not to relay
|
791
|
+
on this behaviour and always set the working directory.
|
695
792
|
|
696
|
-
|
697
|
-
|
698
|
-
|
699
|
-
|
793
|
+
If the given index is the title of the widget (see {#title=}) and {#skip_first_file_in_title}
|
794
|
+
is *true*, all the text from the beginning of the title up to the first whitespace
|
795
|
+
or colon is ignored. Since often the first word of the title is the name of the
|
796
|
+
program being run (which may as well be compiled), it doesn't make sense to attempt
|
797
|
+
to open it. This behaviour allows the user to activate on a title like
|
798
|
+
@/usr/bin/ruby /path/to/script.rb@ and see the file @/path/to/script.rb@ in the
|
799
|
+
editor. Without it, @/usr/bin/ruby@ would be opened instead.
|
700
800
|
|
701
801
|
Subclasses can override this method to extend or change its functionality. They
|
702
802
|
have two choices on how to do this. The simplest is useful if they want to alter
|
703
803
|
the string. In this case they can retrieve the text from the index, change it
|
704
|
-
then call *super* passing the modified string as argument.
|
705
|
-
reimplement
|
706
|
-
|
707
|
-
|
708
|
-
|
709
|
-
|
710
|
-
|
711
|
-
|
712
|
-
|
713
|
-
|
714
|
-
|
804
|
+
then call *super* passing the modified string as argument. The other way is to
|
805
|
+
reimplement this method from scratch.
|
806
|
+
|
807
|
+
A subclass can also decide to completely disallow opening a file by activating the
|
808
|
+
corresponding item by overriding this method to always return *nil*.
|
809
|
+
|
810
|
+
@param [Qt::ModelIndex,String] idx the index or string to search a file name in.
|
811
|
+
The form which takes a string is usually used by subclasses which want to alter
|
812
|
+
the string without reimplementing all the functionality. Note that if _idx_
|
813
|
+
is a string, there's no way to know whether it refers to the title or not, so
|
814
|
+
{#skip_first_file_in_title} is ignored
|
815
|
+
@return [Array(String,Integer),nil] if a file name is found (and the corresponding
|
816
|
+
file exists) an array containing the filename and the line number (or 0 if no
|
817
|
+
line number was found). If no suitable file is found, *nil* is returned
|
715
818
|
=end
|
716
819
|
def find_filename_in_index idx
|
717
820
|
str = if idx.is_a?(String) then idx
|
@@ -720,7 +823,6 @@ method with one which always returns *nil*.
|
|
720
823
|
else idx.data.to_string
|
721
824
|
end
|
722
825
|
res = find_filename_in_string str
|
723
|
-
d res
|
724
826
|
return unless res
|
725
827
|
res = Array res
|
726
828
|
res << 0 if res.size == 1
|
@@ -729,7 +831,7 @@ method with one which always returns *nil*.
|
|
729
831
|
res[0].sub! %r{^file://}, ''
|
730
832
|
if KDE::Url.file_url?(res[0]) then res
|
731
833
|
else
|
732
|
-
res[0] = File.join @working_dir, res[0] unless Pathname.new(res[0]).absolute?
|
834
|
+
res[0] = File.join (@working_dir || Dir.pwd), res[0] unless Pathname.new(res[0]).absolute?
|
733
835
|
if File.exist?(res[0]) and !File.directory?(res[0])
|
734
836
|
res
|
735
837
|
else nil
|
@@ -738,24 +840,25 @@ method with one which always returns *nil*.
|
|
738
840
|
end
|
739
841
|
|
740
842
|
=begin rdoc
|
741
|
-
Searches the given string for the first occurrence of a file name
|
742
|
-
number). If a file name is found, returns an array containing the file name and
|
743
|
-
the corresponding line number (if present). Returns *nil* if no file name was found.
|
843
|
+
Searches the given string for the first occurrence of a file name
|
744
844
|
|
845
|
+
The file name can optionally be followed by a colon and a line number.
|
846
|
+
|
745
847
|
What is a file name and what isn't is a bit arbitrary. Here's what this method
|
746
848
|
recognizes as a filename:
|
747
849
|
* an absolute path not containing spaces and colons starting with '/'
|
748
850
|
* an absolute path not containing spaces and colons starting with '~' or '~user'
|
749
|
-
(they're expanded using @File.expand_path@)
|
851
|
+
(they're expanded using @File.expand_path@)
|
750
852
|
* a relative path starting with @./@ or @../@ (either followed by a slash or not)
|
751
853
|
* a relative path of the form @.filename@ or @.dirname/dir/file@
|
752
|
-
* any string not containing spaces or colons followed by a colon and a line number
|
753
854
|
* absolute URLs with an authority component
|
855
|
+
* any string not containing spaces or colons followed by a colon and a line number
|
856
|
+
(in this case, the line number is required)
|
754
857
|
|
755
858
|
File names enclosed in quotes or parentheses are recognized.
|
756
|
-
|
757
|
-
|
758
|
-
|
859
|
+
@return [Array(String,Integer), Array(String),nil] an array whose first element
|
860
|
+
is the file name and whose second element is the line number (if found) or
|
861
|
+
*nil* if no file name was found. Note that the file name can be relative
|
759
862
|
=end
|
760
863
|
def find_filename_in_string str
|
761
864
|
#This ensures that file names inside quotes or brackets are found. It's
|
@@ -781,8 +884,6 @@ number; for the last one they're mandatory
|
|
781
884
|
m = str.match a
|
782
885
|
matches << [m.begin(0),[$1,$2]] if m
|
783
886
|
end
|
784
|
-
d str
|
785
|
-
d matches
|
786
887
|
match = matches.sort_by{|i| i[0]}[0]
|
787
888
|
return unless match
|
788
889
|
file, line = *match[1]
|
@@ -967,18 +1068,23 @@ same type is used for all lines.
|
|
967
1068
|
end
|
968
1069
|
|
969
1070
|
=begin rdoc
|
970
|
-
Convenience class to be used instead of
|
1071
|
+
Convenience class to be used instead of @Qt::ListView@ in an {OutputWidget}.
|
971
1072
|
|
972
|
-
The only difference from Qt::ListVew is that it defines a
|
973
|
-
signal and emits it from its
|
1073
|
+
The only difference from @Qt::ListVew@ is that it defines a @context_menu_requested(QPoint)@
|
1074
|
+
signal and emits it from its {#contextMenuEvent} method
|
974
1075
|
=end
|
975
1076
|
class ListView < Qt::ListView
|
976
1077
|
|
1078
|
+
=begin rdoc
|
1079
|
+
Signal emitted when the user right-clicks on the view
|
1080
|
+
@param [Qt::Point] pt the point where the user clicked
|
1081
|
+
=end
|
977
1082
|
signals 'context_menu_requested(QPoint)'
|
978
1083
|
|
979
1084
|
=begin rdoc
|
980
|
-
|
981
|
-
|
1085
|
+
Override of @Qt::ListView#contextMenuEvent@
|
1086
|
+
|
1087
|
+
It emits the {#context_menu_requested} signal
|
982
1088
|
=end
|
983
1089
|
def contextMenuEvent e
|
984
1090
|
super e
|
@@ -988,18 +1094,23 @@ signal
|
|
988
1094
|
end
|
989
1095
|
|
990
1096
|
=begin rdoc
|
991
|
-
Convenience class to be used instead of
|
1097
|
+
Convenience class to be used instead of @Qt::TreeView@ in an {OutputWidget}.
|
992
1098
|
|
993
|
-
The only difference from Qt::TreeVew is that it defines a
|
994
|
-
signal and emits it from its
|
1099
|
+
The only difference from @Qt::TreeVew@ is that it defines a {#context_menu_requested}
|
1100
|
+
signal and emits it from its {#contextMenuEvent} method
|
995
1101
|
=end
|
996
1102
|
class TreeView < Qt::TreeView
|
997
|
-
|
1103
|
+
|
1104
|
+
=begin rdoc
|
1105
|
+
Signal emitted when the user right-clicks on the view
|
1106
|
+
@param [Qt::Point] pt the point where the user clicked
|
1107
|
+
=end
|
998
1108
|
signals 'context_menu_requested(QPoint)'
|
999
1109
|
|
1000
1110
|
=begin rdoc
|
1001
|
-
|
1002
|
-
|
1111
|
+
Override of @Qt::TreeView#contextMenuEvent@
|
1112
|
+
|
1113
|
+
It emits the {#context_menu_requested} signal
|
1003
1114
|
=end
|
1004
1115
|
def contextMenuEvent e
|
1005
1116
|
super e
|
@@ -1009,18 +1120,23 @@ signal
|
|
1009
1120
|
end
|
1010
1121
|
|
1011
1122
|
=begin rdoc
|
1012
|
-
Convenience class to be used instead of
|
1123
|
+
Convenience class to be used instead of @Qt::TableView@ in an {OutputWidget}.
|
1013
1124
|
|
1014
|
-
The only difference from Qt::TableVew is that it defines a
|
1015
|
-
signal and emits it from its
|
1125
|
+
The only difference from @Qt::TableVew@ is that it defines a {#context_menu_requested}
|
1126
|
+
signal and emits it from its {#contextMenuEvent} method
|
1016
1127
|
=end
|
1017
1128
|
class TableView < Qt::TableView
|
1018
|
-
|
1129
|
+
|
1130
|
+
=begin rdoc
|
1131
|
+
Signal emitted when the user right-clicks on the view
|
1132
|
+
@param [Qt::Point] pt the point where the user clicked
|
1133
|
+
=end
|
1019
1134
|
signals 'context_menu_requested(QPoint)'
|
1020
1135
|
|
1021
1136
|
=begin rdoc
|
1022
|
-
|
1023
|
-
|
1137
|
+
Override of @Qt::TableView#contextMenuEvent@
|
1138
|
+
|
1139
|
+
It emits the {#context_menu_requested} signal
|
1024
1140
|
=end
|
1025
1141
|
def contextMenuEvent e
|
1026
1142
|
super e
|
@@ -1036,30 +1152,32 @@ signal
|
|
1036
1152
|
class ActionList < Array
|
1037
1153
|
|
1038
1154
|
=begin rdoc
|
1039
|
-
|
1040
|
-
|
1041
|
-
|
1042
|
-
|
1043
|
-
|
1044
|
-
|
1045
|
-
|
1046
|
-
|
1047
|
-
|
1155
|
+
Inserts one or more actions before a given one
|
1156
|
+
|
1157
|
+
@param [String,Integer] entry the entry before which the new action(s) should
|
1158
|
+
be inserted. If it's a string, the actions will be inserted before the action
|
1159
|
+
with that name. If it's an integer, the new actions will be inserted before
|
1160
|
+
the action at position _entry_. If the given entry doesn't exist (or it's a number
|
1161
|
+
larger than the size of the array), the new actions will be appended at the end
|
1162
|
+
@param [Array<String,nil>] names the names of the actions to insert. *nil* entries
|
1163
|
+
represent separator
|
1164
|
+
@return [self]
|
1048
1165
|
=end
|
1049
1166
|
def insert_before entry, *names
|
1050
1167
|
insert_after_or_before entry, :before, names
|
1051
1168
|
end
|
1052
1169
|
|
1053
1170
|
=begin rdoc
|
1054
|
-
|
1055
|
-
|
1056
|
-
|
1057
|
-
|
1058
|
-
|
1059
|
-
|
1060
|
-
|
1061
|
-
|
1062
|
-
|
1171
|
+
Inserts one or more actions after a given one
|
1172
|
+
|
1173
|
+
@param [String,Integer] entry the entry after which the new action(s) should
|
1174
|
+
be inserted. If it's a string, the actions will be inserted after the action
|
1175
|
+
with that name. If it's an integer, the new actions will be inserted after
|
1176
|
+
the action at position _entry_. If the given entry doesn't exist (or it's a number
|
1177
|
+
larger than the size of the array), the new actions will be appended at the end
|
1178
|
+
@param [Array<String,nil>] names the names of the actions to insert. *nil* entries
|
1179
|
+
represent separator
|
1180
|
+
@return [self]
|
1063
1181
|
=end
|
1064
1182
|
def insert_after entry, *names
|
1065
1183
|
insert_after_or_before entry, :after, names
|
@@ -1068,13 +1186,15 @@ signal
|
|
1068
1186
|
private
|
1069
1187
|
|
1070
1188
|
=begin rdoc
|
1071
|
-
Helper method used by
|
1072
|
-
|
1189
|
+
Helper method used by {#insert_after} and {#insert_before}
|
1190
|
+
|
1191
|
+
This is the method which performs the actual insertion of elements
|
1073
1192
|
|
1074
|
-
|
1075
|
-
|
1076
|
-
|
1077
|
-
|
1193
|
+
@param entry (see #insert_after)
|
1194
|
+
@param [Symbol] where whether the new actions should be inserted before or after
|
1195
|
+
_entry_. It can be either @:before@ or @:after@
|
1196
|
+
@param names (see #insert_after)
|
1197
|
+
@return [self]
|
1078
1198
|
=end
|
1079
1199
|
def insert_after_or_before entry, where, names
|
1080
1200
|
idx = if entry.is_a? Integer
|
@@ -1090,6 +1210,7 @@ inserted after or before the position.
|
|
1090
1210
|
#first item should be at position idx, the second at idx+1 and so on. With reverse_each)
|
1091
1211
|
#this happens automatically. The +1 is needed to insert the items after idx
|
1092
1212
|
names.reverse_each{|n| insert idx, n}
|
1213
|
+
self
|
1093
1214
|
end
|
1094
1215
|
|
1095
1216
|
end
|