ruber 0.0.5 → 0.0.7
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 +25 -0
- data/bin/ruber +0 -0
- data/data/share/apps/ruber/ruberui.rc +15 -1
- data/data/share/icons/{ruber.png → ruber-old.pgn} +0 -0
- data/lib/ruber/application/application.rb +216 -73
- data/lib/ruber/application/plugin.yaml +2 -2
- data/lib/ruber/document_project.rb +25 -5
- data/lib/ruber/documents/document_list.rb +11 -15
- data/lib/ruber/editor/document.rb +106 -50
- data/lib/ruber/editor/editor_view.rb +4 -2
- data/lib/ruber/external_program_plugin.rb +8 -0
- data/lib/ruber/kde_config_option_backend.rb +12 -4
- data/lib/ruber/kde_sugar.rb +35 -1
- data/lib/ruber/main_window/choose_plugins_dlg.rb +10 -10
- data/lib/ruber/main_window/hint_solver.rb +263 -0
- data/lib/ruber/main_window/main_window.rb +462 -206
- data/lib/ruber/main_window/main_window_actions.rb +228 -62
- data/lib/ruber/main_window/main_window_internal.rb +169 -115
- data/lib/ruber/main_window/plugin.yaml +13 -3
- data/lib/ruber/main_window/save_modified_files_dlg.rb +1 -1
- data/lib/ruber/main_window/ui/choose_plugins_widget.rb +1 -1
- data/lib/ruber/main_window/ui/main_window_settings_widget.rb +1 -1
- data/lib/ruber/main_window/ui/new_project_widget.rb +1 -1
- data/lib/ruber/main_window/ui/open_file_in_project_dlg.rb +1 -1
- data/lib/ruber/main_window/ui/output_color_widget.rb +1 -1
- data/lib/ruber/main_window/ui/workspace_settings_widget.rb +51 -0
- data/lib/ruber/main_window/ui/workspace_settings_widget.ui +28 -0
- data/lib/ruber/main_window/view_manager.rb +418 -0
- data/lib/ruber/main_window/workspace.png +0 -0
- data/lib/ruber/output_widget.rb +43 -37
- data/lib/ruber/pane.rb +621 -0
- data/lib/ruber/plugin_specification_reader.rb +8 -1
- data/lib/ruber/projects/project_files_list.rb +6 -0
- data/lib/ruber/projects/ui/project_files_rule_chooser_widget.rb +1 -1
- data/lib/ruber/projects/ui/project_files_widget.rb +1 -1
- data/lib/ruber/qt_sugar.rb +94 -4
- data/lib/ruber/utils.rb +16 -7
- data/lib/ruber/version.rb +2 -2
- data/plugins/autosave/autosave.rb +62 -1
- data/plugins/autosave/plugin.yaml +1 -0
- data/plugins/autosave/ui/autosave_config_widget.rb +37 -14
- data/plugins/autosave/ui/autosave_config_widget.ui +62 -12
- data/plugins/find_in_files/find_in_files_widgets.rb +1 -3
- data/plugins/find_in_files/ui/config_widget.rb +1 -1
- data/plugins/find_in_files/ui/find_in_files_widget.rb +1 -1
- data/plugins/rake/plugin.yaml +1 -1
- data/plugins/rake/ui/add_quick_task_widget.rb +1 -1
- data/plugins/rake/ui/choose_task_widget.rb +1 -1
- data/plugins/rake/ui/config_widget.rb +1 -1
- data/plugins/rake/ui/project_widget.rb +1 -1
- data/plugins/rspec/rspec.rb +14 -22
- data/plugins/rspec/ruber_rspec_formatter.rb +4 -1
- data/plugins/rspec/ui/rspec_project_widget.rb +1 -1
- data/plugins/ruby_development/plugin.yaml +7 -2
- data/plugins/ruby_development/ruby_development.rb +134 -13
- data/plugins/ruby_development/ui/config_widget.rb +66 -0
- data/plugins/ruby_development/ui/config_widget.ui +58 -0
- data/plugins/ruby_development/ui/project_widget.rb +1 -1
- data/plugins/ruby_runner/plugin.yaml +2 -2
- data/plugins/ruby_runner/ruby_runner.rb +15 -3
- data/plugins/ruby_runner/ui/config_widget.rb +1 -1
- data/plugins/ruby_runner/ui/project_widget.rb +1 -1
- data/plugins/ruby_runner/ui/ruby_runnner_plugin_option_widget.rb +1 -1
- data/plugins/state/plugin.yaml +6 -2
- data/plugins/state/state.rb +305 -81
- data/plugins/state/ui/config_widget.rb +1 -1
- data/spec/common.rb +11 -3
- data/spec/document_list_spec.rb +8 -8
- data/spec/document_project_spec.rb +98 -25
- data/spec/document_spec.rb +178 -152
- data/spec/editor_view_spec.rb +26 -5
- data/spec/framework.rb +5 -0
- data/spec/hint_solver_spec.rb +450 -0
- data/spec/kde_sugar_spec.rb +73 -6
- data/spec/output_widget_spec.rb +172 -156
- data/spec/pane_spec.rb +1165 -0
- data/spec/plugin_specification_reader_spec.rb +37 -1
- data/spec/project_files_list_spec.rb +30 -20
- data/spec/qt_sugar_spec.rb +269 -0
- data/spec/state_spec.rb +566 -353
- data/spec/utils_spec.rb +1 -1
- data/spec/view_manager_spec.rb +71 -0
- metadata +16 -4
data/spec/editor_view_spec.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require 'spec/common'
|
|
1
|
+
require './spec/common'
|
|
2
2
|
|
|
3
3
|
require 'tempfile'
|
|
4
4
|
require 'fileutils'
|
|
@@ -33,7 +33,7 @@ describe Ruber::EditorView do
|
|
|
33
33
|
res += ($1 || '')+')'
|
|
34
34
|
res
|
|
35
35
|
end
|
|
36
|
-
it "
|
|
36
|
+
it "emits the \"#{sig}\" signal in response to the underlying KTextEditor::View #{o_sig} signal" do
|
|
37
37
|
prc = lambda do
|
|
38
38
|
mock = flexmock('mock')
|
|
39
39
|
if has_view_arg
|
|
@@ -75,6 +75,14 @@ describe Ruber::EditorView do
|
|
|
75
75
|
after do
|
|
76
76
|
@view.disconnect
|
|
77
77
|
end
|
|
78
|
+
|
|
79
|
+
describe 'when created' do
|
|
80
|
+
|
|
81
|
+
it 'has the Qt::WA_DeleteOnClose attribute' do
|
|
82
|
+
@view.test_attribute(Qt::WA_DeleteOnClose).should be_true
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
end
|
|
78
86
|
|
|
79
87
|
test_auto_signal 'context_menu_about_to_show(QMenu*, @)', 'Qt::Menu.new'
|
|
80
88
|
test_auto_signal 'focus_in(@)'
|
|
@@ -87,7 +95,7 @@ describe Ruber::EditorView do
|
|
|
87
95
|
test_auto_signal 'text_inserted(KTextEditor::Cursor, QString, @)', ['KTextEditor::Cursor.new(0,0)', '"test text"']
|
|
88
96
|
test_auto_signal 'vertical_scroll_position_changed(KTextEditor::Cursor, @)', 'KTextEditor::Cursor.new()'
|
|
89
97
|
|
|
90
|
-
it "
|
|
98
|
+
it "emits the \"selection_mode_changed(bool, QWidget*)\" signal when the selection mode changes" do
|
|
91
99
|
mock = flexmock('mock')
|
|
92
100
|
mock.should_receive(:block_mode_on).globally.ordered.once.with(@view.object_id)
|
|
93
101
|
mock.should_receive(:block_mode_off).globally.ordered.once.with(@view.object_id)
|
|
@@ -98,7 +106,7 @@ describe Ruber::EditorView do
|
|
|
98
106
|
@view.block_selection = false
|
|
99
107
|
end
|
|
100
108
|
|
|
101
|
-
it "
|
|
109
|
+
it "emits the \"edit_mode_changed(KTextEditor::View::EditoMode, QWidget*)\" signal in response to the underlying KTextEditor::View viewEditModeChanged(KTextEditor::View, KTextEditor::View::EditMode) signal" do
|
|
102
110
|
mock = flexmock('mock')
|
|
103
111
|
mock.should_receive(:test).globally.ordered.once.with(1, @view.object_id)
|
|
104
112
|
mock.should_receive(:test).globally.ordered.once.with(0, @view.object_id)
|
|
@@ -110,7 +118,7 @@ describe Ruber::EditorView do
|
|
|
110
118
|
v.instance_eval{emit viewEditModeChanged(self, KTextEditor::View::EditInsert)}
|
|
111
119
|
end
|
|
112
120
|
|
|
113
|
-
it "
|
|
121
|
+
it "emits the \"view_mode_changed(QString, QWidget*)\" signal in response to the underlying KTextEditor::View viewModeChanged(KTextEditor::View*) signal" do
|
|
114
122
|
mock = flexmock('mock')
|
|
115
123
|
mock.should_receive(:test).once.with("INS", @view.object_id)
|
|
116
124
|
@view.connect(SIGNAL('view_mode_changed(QString, QWidget*)')) do |m, v|
|
|
@@ -127,6 +135,19 @@ describe Ruber::EditorView do
|
|
|
127
135
|
end
|
|
128
136
|
|
|
129
137
|
end
|
|
138
|
+
|
|
139
|
+
describe '#close' do
|
|
140
|
+
|
|
141
|
+
it 'emits the closing(QWidget*) signal passing self as argument when the close method is called' do
|
|
142
|
+
mock = flexmock('mock')
|
|
143
|
+
mock.should_receive(:test).once.with(@view)
|
|
144
|
+
@view.connect(SIGNAL('closing(QWidget*)')) do |v|
|
|
145
|
+
mock.test v
|
|
146
|
+
end
|
|
147
|
+
@view.close
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
end
|
|
130
151
|
|
|
131
152
|
end
|
|
132
153
|
|
data/spec/framework.rb
ADDED
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
require './spec/common'
|
|
2
|
+
require 'ruber/main_window/hint_solver'
|
|
3
|
+
require 'ruber/editor/document'
|
|
4
|
+
require 'ruber/pane'
|
|
5
|
+
|
|
6
|
+
describe Ruber::MainWindow::HintSolver do
|
|
7
|
+
|
|
8
|
+
class HintSolverSpecComponentManager < Qt::Object
|
|
9
|
+
extend Forwardable
|
|
10
|
+
signals 'component_loaded(QObject*)', 'unloading_component(QObject*)'
|
|
11
|
+
def_delegators :@data, :[], :<<
|
|
12
|
+
def_delegator :@data, :each, :each_component
|
|
13
|
+
|
|
14
|
+
def initialize parent = nil
|
|
15
|
+
super
|
|
16
|
+
@data = []
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
before do
|
|
22
|
+
@main_window = Qt::Widget.new
|
|
23
|
+
flexmock(Ruber).should_receive(:[]).with(:main_window).and_return(@main_window).by_default
|
|
24
|
+
flexmock(Ruber).should_receive(:[]).with(:components).and_return(HintSolverSpecComponentManager.new).by_default
|
|
25
|
+
@doc = Ruber::Document.new
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
context 'when created' do
|
|
29
|
+
|
|
30
|
+
it 'takes the tab widget as argument' do
|
|
31
|
+
tabs = KDE::TabWidget.new
|
|
32
|
+
lambda{Ruber::MainWindow::HintSolver.new tabs, KParts::PartManager.new(@main_window), []}.should_not raise_error
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
describe '#find_editor' do
|
|
38
|
+
|
|
39
|
+
before do
|
|
40
|
+
@tabs = KDE::TabWidget.new
|
|
41
|
+
@solver = Ruber::MainWindow::HintSolver.new @tabs, KParts::PartManager.new(@main_window), []
|
|
42
|
+
@doc = Ruber::Document.new nil
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
context 'when the tab widget contains no tabs' do
|
|
46
|
+
|
|
47
|
+
it 'returns nil' do
|
|
48
|
+
@solver.find_editor(@doc, {}).should be_nil
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
context 'if the tab widget doesn\'t contain any editor for the given document' do
|
|
54
|
+
|
|
55
|
+
before do
|
|
56
|
+
other_doc = Ruber::Document.new nil
|
|
57
|
+
views = 3.times.map{other_doc.create_view}
|
|
58
|
+
pane1 = Ruber::Pane.new views[0]
|
|
59
|
+
pane1.split views[0], views[1], Qt::Vertical
|
|
60
|
+
@tabs.add_tab pane1, '1'
|
|
61
|
+
pane2 = Ruber::Pane.new views[2]
|
|
62
|
+
@tabs.add_tab pane2, '2'
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it 'returns nil' do
|
|
66
|
+
@solver.find_editor(@doc, {}).should be_nil
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
context 'if the existing hint is never' do
|
|
72
|
+
|
|
73
|
+
it 'always returns nil' do
|
|
74
|
+
@solver.find_editor(@doc, :existing => :never).should be_nil
|
|
75
|
+
view = @doc.create_view
|
|
76
|
+
@tabs.add_tab Ruber::Pane.new(view), '1'
|
|
77
|
+
@solver.find_editor(@doc, :existing => :never).should be_nil
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
context 'when an editor already exists for the document' do
|
|
83
|
+
|
|
84
|
+
context 'if the existing hint is :always' do
|
|
85
|
+
|
|
86
|
+
before do
|
|
87
|
+
@view = @doc.create_view
|
|
88
|
+
other_doc = Ruber::Document.new nil
|
|
89
|
+
views = 3.times.map{other_doc.create_view}
|
|
90
|
+
pane1 = Ruber::Pane.new views[0]
|
|
91
|
+
pane1.split views[0], views[1], Qt::Vertical
|
|
92
|
+
@tabs.add_tab pane1, '1'
|
|
93
|
+
pane2 = Ruber::Pane.new views[2]
|
|
94
|
+
pane2.split views[2], @view, Qt::Vertical
|
|
95
|
+
@tabs.add_tab pane2, '2'
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
it 'returns the existing view if it is in the current tab' do
|
|
99
|
+
@tabs.current_index = 1
|
|
100
|
+
@solver.find_editor(@doc, :existing => :always).should == @view
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it 'returns the existing view if it is not in the current tab' do
|
|
104
|
+
@tabs.current_index = 0
|
|
105
|
+
@solver.find_editor(@doc, :existing => :always).should == @view
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
context 'if the existing hint is :current_tab' do
|
|
111
|
+
|
|
112
|
+
before do
|
|
113
|
+
@view = @doc.create_view
|
|
114
|
+
other_doc = Ruber::Document.new nil
|
|
115
|
+
views = 3.times.map{other_doc.create_view}
|
|
116
|
+
pane1 = Ruber::Pane.new views[0]
|
|
117
|
+
pane1.object_name = '1'
|
|
118
|
+
pane1.split views[0], views[1], Qt::Vertical
|
|
119
|
+
@tabs.add_tab pane1, '1'
|
|
120
|
+
pane2 = Ruber::Pane.new views[2]
|
|
121
|
+
pane2.split views[2], @view, Qt::Vertical
|
|
122
|
+
pane2.object_name = '2'
|
|
123
|
+
@tabs.add_tab pane2, '2'
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
it 'returns the existing view if it is in the current tab' do
|
|
127
|
+
@tabs.current_index = 1
|
|
128
|
+
@solver.find_editor(@doc, :existing => :current_tab).should == @view
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
it 'returns nil if the existing view is not in the current tab' do
|
|
132
|
+
@tabs.current_index = 0
|
|
133
|
+
@solver.find_editor(@doc, :existing => :current_tab).should be_nil
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
context 'if only one editor respects the existing hint' do
|
|
141
|
+
|
|
142
|
+
it 'returns that editor, regardless of the strategy hint' do
|
|
143
|
+
view = @doc.create_view
|
|
144
|
+
other_doc = Ruber::Document.new
|
|
145
|
+
other_view = other_doc.create_view
|
|
146
|
+
pane = Ruber::Pane.new other_view
|
|
147
|
+
pane.split other_view, view, Qt::Vertical
|
|
148
|
+
@tabs.add_tab pane, 'x'
|
|
149
|
+
@solver.find_editor(@doc, :strategy => :current).should == view
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
context 'if more than an editor exists for the given document' do
|
|
155
|
+
|
|
156
|
+
before do
|
|
157
|
+
@views = 3.times.map{@doc.create_view}
|
|
158
|
+
other_doc = Ruber::Document.new nil
|
|
159
|
+
@other_views = 3.times.map{other_doc.create_view}
|
|
160
|
+
pane1 = Ruber::Pane.new @other_views[0]
|
|
161
|
+
pane1.object_name = '1'
|
|
162
|
+
pane1.split @other_views[0], @other_views[1], Qt::Vertical
|
|
163
|
+
pane1.split @other_views[1], @views[0], Qt::Horizontal
|
|
164
|
+
@tabs.add_tab pane1, '1'
|
|
165
|
+
pane2 = Ruber::Pane.new @other_views[2]
|
|
166
|
+
pane2.split @other_views[2], @views[1], Qt::Vertical
|
|
167
|
+
pane2.object_name = '2'
|
|
168
|
+
@tabs.add_tab pane2, '2'
|
|
169
|
+
@view_order = @solver.instance_variable_get(:@view_order)
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
context 'if the first entry in the strategy hint is :current' do
|
|
173
|
+
|
|
174
|
+
it 'returns the current editor, if it is associated with the document' do
|
|
175
|
+
@view_order << @views[1] << @other_views[2] << @other_views[1] << @views[0] << @views[2] << @other_views[0]
|
|
176
|
+
@solver.find_editor( @doc, :existing => :always, :strategy => [:current]).should == @views[1]
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
it 'doesn\'t return the current editor if it\'s not associated with the document' do
|
|
180
|
+
flexmock(@pm).should_receive(:active_part).and_return(@other_views[1].send(:internal))
|
|
181
|
+
@view_order << @other_views[1] << @other_views[2] << @views[1] << @views[0] << @views[2] << @other_views[0]
|
|
182
|
+
@solver.find_editor( @doc, :existing => :always, :strategy => [:current]).should_not == @other_views[1]
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
context 'if the first entry in the strategy hint is :current_tab' do
|
|
188
|
+
|
|
189
|
+
it 'returns the first editor in the current tab which corresponds to the document, if any' do
|
|
190
|
+
flexmock(@pm).should_receive(:active_part).and_return(@views[1].send(:internal))
|
|
191
|
+
@tabs.current_index = 0
|
|
192
|
+
view = @doc.create_view
|
|
193
|
+
@tabs.current_widget.split @views[0], view, Qt::Horizontal, :before
|
|
194
|
+
@solver.find_editor( @doc, :existing => :always, :strategy => [:current_tab]).should == view
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
context 'if the first entry in the strategy hint is :last_current_tab' do
|
|
200
|
+
|
|
201
|
+
it 'returns the last editor in the current tab associated with the document, if the tab contains more than one editor associated with it' do
|
|
202
|
+
@tabs.current_index = 0
|
|
203
|
+
view = @doc.create_view
|
|
204
|
+
@tabs.current_widget.split @views[0], view, Qt::Horizontal, :before
|
|
205
|
+
@solver.find_editor( @doc, :existing => :always, :strategy => [:last_current_tab]).should == @views[0]
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
it 'returns the editor associated with the document in the current tab if there\'s only one such editor' do
|
|
209
|
+
@tabs.current_index = 0
|
|
210
|
+
@solver.find_editor( @doc, :existing => :always, :strategy => [:last_current_tab]).should == @views[0]
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
context 'if the first entry in the strategy hint is :next' do
|
|
216
|
+
|
|
217
|
+
it 'returns the first editor in the current tab associated with the document, if any' do
|
|
218
|
+
@tabs.current_index = 0
|
|
219
|
+
view = @doc.create_view
|
|
220
|
+
@tabs.current_widget.split @views[0], view, Qt::Horizontal, :before
|
|
221
|
+
@solver.find_editor( @doc, :existing => :always, :strategy => [:next]).should == view
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
it 'returns the first editor associated with the document it finds, starting from the current tab if no editor for the document exists in the current tab' do
|
|
225
|
+
other_doc = Ruber::Document.new
|
|
226
|
+
other_view = other_doc.create_view
|
|
227
|
+
pane = Ruber::Pane.new other_view
|
|
228
|
+
@tabs.insert_tab 1, pane, 'new'
|
|
229
|
+
@tabs.current_index = 1
|
|
230
|
+
@tabs.widget(2).split @views[1], @views[2], Qt::Horizontal
|
|
231
|
+
@solver.find_editor(@doc, :existing => :always, :strategy => [:next]).should == @views[1]
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
it 'returns the first editor associated with the document starting from the first tab if no editor in or after the current tab is found' do
|
|
235
|
+
other_doc = Ruber::Document.new
|
|
236
|
+
other_view = other_doc.create_view
|
|
237
|
+
pane = Ruber::Pane.new other_view
|
|
238
|
+
@tabs.add_tab pane, 'new'
|
|
239
|
+
pane2 = Ruber::Pane.new other_doc.create_view
|
|
240
|
+
@tabs.add_tab pane2, 'new2'
|
|
241
|
+
@tabs.current_index = 2
|
|
242
|
+
@solver.find_editor(@doc, :existing => :always, :strategy => [:next]).should == @views[0]
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
context 'if the first entry in the strategy hint is :previous' do
|
|
248
|
+
|
|
249
|
+
it 'returns the first editor associated with the document it finds, starting from the tab before the current and going backwards tab' do
|
|
250
|
+
other_doc = Ruber::Document.new
|
|
251
|
+
other_view = other_doc.create_view
|
|
252
|
+
pane = Ruber::Pane.new other_view
|
|
253
|
+
@tabs.insert_tab 1, pane, 'new'
|
|
254
|
+
@tabs.widget(0).split @views[0], @views[2], Qt::Horizontal
|
|
255
|
+
@tabs.current_index = 1
|
|
256
|
+
@solver.find_editor(@doc, :existing => :always, :strategy => [:previous]).should == @views[2]
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
it 'returns the last editor associated with the document starting from the last tab if no editor before the current tab is found' do
|
|
260
|
+
other_doc = Ruber::Document.new
|
|
261
|
+
other_view = other_doc.create_view
|
|
262
|
+
pane = Ruber::Pane.new other_view
|
|
263
|
+
@tabs.insert_tab 1, pane, 'new'
|
|
264
|
+
pane2 = Ruber::Pane.new other_doc.create_view
|
|
265
|
+
@tabs.insert_tab 0, pane2, 'new2'
|
|
266
|
+
@tabs.current_index = 1
|
|
267
|
+
@solver.find_editor(@doc, :existing => :always, :strategy => [:previous]).should == @views[1]
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
context 'if the first entry in the strategy hint is :first' do
|
|
273
|
+
|
|
274
|
+
it 'returns the first editor associated with the document' do
|
|
275
|
+
@solver.find_editor(@doc, :existing => :always, :strategy => [:first]).should == @views[0]
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
context 'if the first entry in the strategy hint is :last' do
|
|
281
|
+
|
|
282
|
+
it 'returns the last editor associated with the document' do
|
|
283
|
+
@solver.find_editor(@doc, :existing => :always, :strategy => [:last]).should == @views[1]
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
context 'if the first entry in the strategy hint is :last_used' do
|
|
289
|
+
|
|
290
|
+
it 'returns the editor which respects the existing hint and comes first in the view_order list among those associated with the document' do
|
|
291
|
+
@tabs.clear
|
|
292
|
+
views = 3.times.map{@doc.create_view}
|
|
293
|
+
other_doc = Ruber::Document.new
|
|
294
|
+
other_views = 3.times.map{other_doc.create_view}
|
|
295
|
+
order = @solver.instance_variable_get(:@view_order)
|
|
296
|
+
order << other_views[1] << views[2] << other_views[0] << other_views[2] << views[0] << views[1]
|
|
297
|
+
pane1 = Ruber::Pane.new other_views[0]
|
|
298
|
+
pane1.split other_views[0], views[1], Qt::Vertical
|
|
299
|
+
@tabs.add_tab pane1, '1'
|
|
300
|
+
pane2 = Ruber::Pane.new views[0]
|
|
301
|
+
pane2.split views[0], views[2], Qt::Vertical
|
|
302
|
+
@tabs.add_tab pane2, '2'
|
|
303
|
+
pane3 = Ruber::Pane.new other_views[1]
|
|
304
|
+
pane3.split other_views[1], other_views[2], Qt::Vertical
|
|
305
|
+
@tabs.add_tab pane3, '3'
|
|
306
|
+
@solver.find_editor(@doc, :existing => :always, :strategy => [:last_used]).should == views[2]
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
it 'attempts all the listed strategies until one succeeds' do
|
|
312
|
+
other_doc = Ruber::Document.new
|
|
313
|
+
pane = Ruber::Pane.new other_doc.create_view
|
|
314
|
+
@tabs.add_tab pane, 'new'
|
|
315
|
+
@tabs.current_index = 2
|
|
316
|
+
@solver.find_editor(@doc, :existing => :always, :strategy => [:current, :last]).should == @views[1]
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
it 'uses :next as fallback strategy if all listed strategies fail' do
|
|
320
|
+
other_doc = Ruber::Document.new
|
|
321
|
+
pane = Ruber::Pane.new other_doc.create_view
|
|
322
|
+
@tabs.insert_tab 1, pane, 'new'
|
|
323
|
+
@tabs.current_index = 1
|
|
324
|
+
@solver.find_editor(@doc, :existing => :always, :strategy => :current).should == @views[1]
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
describe '#place_editor' do
|
|
332
|
+
|
|
333
|
+
before do
|
|
334
|
+
@tabs = KDE::TabWidget.new
|
|
335
|
+
@solver = Ruber::MainWindow::HintSolver.new @tabs, KParts::PartManager.new(@main_window), []
|
|
336
|
+
@doc = Ruber::Document.new nil
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
context 'when the new hint is :new_tab' do
|
|
340
|
+
|
|
341
|
+
it 'returns nil' do
|
|
342
|
+
@solver.place_editor(:new => :new_tab).should be_nil
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
context 'when the new hint is current' do
|
|
348
|
+
|
|
349
|
+
it 'returns the current view' do
|
|
350
|
+
views = 3.times.map{@doc.create_view}
|
|
351
|
+
pane1 = Ruber::Pane.new views[0]
|
|
352
|
+
pane2 = Ruber::Pane.new views[1]
|
|
353
|
+
pane2.split views[1], views[2], Qt::Horizontal
|
|
354
|
+
@tabs.add_tab pane1, '1'
|
|
355
|
+
@tabs.add_tab pane2, '2'
|
|
356
|
+
@tabs.current_index = 1
|
|
357
|
+
view_order = @solver.instance_variable_get(:@view_order)
|
|
358
|
+
view_order << views[2] << views[1] << views[0]
|
|
359
|
+
@solver.place_editor(:new => :current).should == views[2]
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
it 'returns nil if there\'s no tab' do
|
|
363
|
+
@solver.place_editor(:new => :current).should be_nil
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
it 'returns nil if the current view can\'t be found' do
|
|
367
|
+
views = 3.times.map{@doc.create_view}
|
|
368
|
+
pane1 = Ruber::Pane.new views[0]
|
|
369
|
+
pane2 = Ruber::Pane.new views[1]
|
|
370
|
+
pane2.split views[1], views[2], Qt::Horizontal
|
|
371
|
+
@tabs.add_tab pane1, '1'
|
|
372
|
+
@tabs.add_tab pane2, '2'
|
|
373
|
+
@tabs.current_index = 1
|
|
374
|
+
@solver.place_editor(:new => :current).should be_nil
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
context 'when the new hint is :current_tab' do
|
|
380
|
+
|
|
381
|
+
it 'returns the first view in the current tab' do
|
|
382
|
+
views = 3.times.map{@doc.create_view}
|
|
383
|
+
pane1 = Ruber::Pane.new views[0]
|
|
384
|
+
pane2 = Ruber::Pane.new views[1]
|
|
385
|
+
pane2.split views[1], views[2], Qt::Horizontal
|
|
386
|
+
@tabs.add_tab pane1, '1'
|
|
387
|
+
@tabs.add_tab pane2, '2'
|
|
388
|
+
@tabs.current_index = 1
|
|
389
|
+
@solver.place_editor(:new => :current_tab).should == views[1]
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
it 'returns nil if there\'s no tab' do
|
|
393
|
+
@solver.place_editor(:new => :current_tab).should be_nil
|
|
394
|
+
end
|
|
395
|
+
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
context 'when the new hint is an integer' do
|
|
399
|
+
|
|
400
|
+
it 'returns the first view in the tab with that index' do
|
|
401
|
+
views = 3.times.map{@doc.create_view}
|
|
402
|
+
pane1 = Ruber::Pane.new views[0]
|
|
403
|
+
pane2 = Ruber::Pane.new views[1]
|
|
404
|
+
pane2.split views[1], views[2], Qt::Horizontal
|
|
405
|
+
@tabs.add_tab pane1, '1'
|
|
406
|
+
@tabs.add_tab pane2, '2'
|
|
407
|
+
@tabs.current_index = 0
|
|
408
|
+
@solver.place_editor(:new => 1).should == views[1]
|
|
409
|
+
end
|
|
410
|
+
|
|
411
|
+
it 'returns nil if there\'s not a pane with that index' do
|
|
412
|
+
@solver.place_editor(:new => 1).should be_nil
|
|
413
|
+
|
|
414
|
+
views = 3.times.map{@doc.create_view}
|
|
415
|
+
pane1 = Ruber::Pane.new views[0]
|
|
416
|
+
pane2 = Ruber::Pane.new views[1]
|
|
417
|
+
pane2.split views[1], views[2], Qt::Horizontal
|
|
418
|
+
@tabs.add_tab pane1, '1'
|
|
419
|
+
@tabs.add_tab pane2, '2'
|
|
420
|
+
@tabs.current_index = 0
|
|
421
|
+
@solver.place_editor(:new => 5).should be_nil
|
|
422
|
+
end
|
|
423
|
+
|
|
424
|
+
end
|
|
425
|
+
|
|
426
|
+
context 'when the new hint is a view' do
|
|
427
|
+
|
|
428
|
+
it 'returns the view' do
|
|
429
|
+
views = 3.times.map{@doc.create_view}
|
|
430
|
+
pane1 = Ruber::Pane.new views[1]
|
|
431
|
+
pane1.split views[1], views[2], Qt::Vertical
|
|
432
|
+
pane2 = Ruber::Pane.new views[0]
|
|
433
|
+
@tabs.add_tab pane1, '1'
|
|
434
|
+
@tabs.add_tab pane2, '2'
|
|
435
|
+
@solver.place_editor(:new => views[2]).should == views[2]
|
|
436
|
+
end
|
|
437
|
+
|
|
438
|
+
it 'returns nil if the view\'s parent isn\'t a pane' do
|
|
439
|
+
view = @doc.create_view
|
|
440
|
+
@solver.place_editor(:new => view).should be_nil
|
|
441
|
+
w = Qt::Widget.new
|
|
442
|
+
view = @doc.create_view w
|
|
443
|
+
@solver.place_editor(:new => view).should be_nil
|
|
444
|
+
end
|
|
445
|
+
|
|
446
|
+
end
|
|
447
|
+
|
|
448
|
+
end
|
|
449
|
+
|
|
450
|
+
end
|