ruber 0.0.5 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -0,0 +1,58 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<ui version="4.0">
|
3
|
+
<class>RubyDevelopmentConfigWidget</class>
|
4
|
+
<widget class="QWidget" name="RubyDevelopmentConfigWidget">
|
5
|
+
<property name="geometry">
|
6
|
+
<rect>
|
7
|
+
<x>0</x>
|
8
|
+
<y>0</y>
|
9
|
+
<width>400</width>
|
10
|
+
<height>38</height>
|
11
|
+
</rect>
|
12
|
+
</property>
|
13
|
+
<property name="windowTitle">
|
14
|
+
<string>Form</string>
|
15
|
+
</property>
|
16
|
+
<layout class="QHBoxLayout" name="horizontalLayout">
|
17
|
+
<item>
|
18
|
+
<widget class="QLabel" name="label">
|
19
|
+
<property name="toolTip">
|
20
|
+
<string>The command to use to run a ruby script in a terminal</string>
|
21
|
+
</property>
|
22
|
+
<property name="whatsThis">
|
23
|
+
<string>In the command line, use %d to indicate the initial working directory for the terminal and %r to indicate where to put the ruby command line. The %r sequence should be either sourrounded by spaces or have a space before it and the end of the command after it.
|
24
|
+
|
25
|
+
Note that you can't use arguments containing spaces in the command line.</string>
|
26
|
+
</property>
|
27
|
+
<property name="text">
|
28
|
+
<string>&Terminal</string>
|
29
|
+
</property>
|
30
|
+
<property name="buddy">
|
31
|
+
<cstring>_ruby__run_in_terminal_cmd</cstring>
|
32
|
+
</property>
|
33
|
+
</widget>
|
34
|
+
</item>
|
35
|
+
<item>
|
36
|
+
<widget class="KLineEdit" name="_ruby__run_in_terminal_cmd">
|
37
|
+
<property name="toolTip">
|
38
|
+
<string>The command to use to run a ruby script in a terminal</string>
|
39
|
+
</property>
|
40
|
+
<property name="whatsThis">
|
41
|
+
<string>In the command line, use %d to indicate the initial working directory for the terminal and %r to indicate where to put the ruby command line.
|
42
|
+
|
43
|
+
Note that you can't use arguments containing spaces in the command line</string>
|
44
|
+
</property>
|
45
|
+
</widget>
|
46
|
+
</item>
|
47
|
+
</layout>
|
48
|
+
</widget>
|
49
|
+
<customwidgets>
|
50
|
+
<customwidget>
|
51
|
+
<class>KLineEdit</class>
|
52
|
+
<extends>QLineEdit</extends>
|
53
|
+
<header>klineedit.h</header>
|
54
|
+
</customwidget>
|
55
|
+
</customwidgets>
|
56
|
+
<resources/>
|
57
|
+
<connections/>
|
58
|
+
</ui>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
=begin
|
2
2
|
** Form generated from reading ui file 'project_widget.ui'
|
3
3
|
**
|
4
|
-
** Created:
|
4
|
+
** Created: mar nov 16 11:52:49 2010
|
5
5
|
** by: Qt User Interface Compiler version 4.7.0
|
6
6
|
**
|
7
7
|
** WARNING! All changes made in this file will be lost when recompiling ui file!
|
@@ -7,7 +7,7 @@ about:
|
|
7
7
|
bug_address: http://github.com/stcrocco/ruber/issues
|
8
8
|
icon: ruby.png
|
9
9
|
class: Ruber::RubyRunner::RubyInterpretersPlugin
|
10
|
-
require: ruby_runner
|
10
|
+
require: ruby_runner.rb
|
11
11
|
ui_file: ruby_interpretersui.rc
|
12
12
|
features: [ruby_interpreters]
|
13
13
|
config_widgets:
|
@@ -19,7 +19,7 @@ config_options:
|
|
19
19
|
ruby_options: {:default: [-w]}
|
20
20
|
project_options:
|
21
21
|
ruby:
|
22
|
-
ruby: {default: 'Ruber[:config][:ruby, :ruby]', scope: [global, document], mimetype: 'application/x-ruby', file_extension: [*.rb, Rakefile, rakefile]}
|
22
|
+
ruby: {default: 'Ruber[:config][:ruby, :ruby]', scope: [global, document], mimetype: 'application/x-ruby', file_extension: [*.rb, Rakefile, rakefile], place: all}
|
23
23
|
project_widgets:
|
24
24
|
- {caption: Ruby, pixmap: ruby.png, class: 'Ruber::RubyRunner::ProjectWidget', scope: [global, document], mimetype: 'application/x-ruby', file_extension: [*.rb, Rakefile, rakefile]}
|
25
25
|
actions:
|
@@ -156,7 +156,6 @@ the plugin
|
|
156
156
|
def initialize psf
|
157
157
|
silently do
|
158
158
|
Object.const_set :RubyOptionsWidget, RubyOptionsWidget
|
159
|
-
Ruber::RubyRunner.const_set :RubyRunnerPlugin, RubyRunnerPluginInternal
|
160
159
|
end
|
161
160
|
super
|
162
161
|
@default_interpreter_action = action_collection.action('ruby_runner-configured_interpreter')
|
@@ -245,6 +244,18 @@ default entry is selected.
|
|
245
244
|
nil
|
246
245
|
end
|
247
246
|
|
247
|
+
=begin rdoc
|
248
|
+
Override of {PluginLike#unload}
|
249
|
+
|
250
|
+
Besides doing the same as the base class method, it also removes the @Ruber::RubyRunner::RubyRunnerPlugin@
|
251
|
+
constant, so that other plugins may reimplement it using another base class.
|
252
|
+
@return [nil]
|
253
|
+
=end
|
254
|
+
def unload
|
255
|
+
Ruber::RubyRunner.send :remove_const, :RubyRunnerPlugin
|
256
|
+
super
|
257
|
+
end
|
258
|
+
|
248
259
|
end
|
249
260
|
|
250
261
|
=begin
|
@@ -266,7 +277,7 @@ plugin.
|
|
266
277
|
@api_method #interpreter_for
|
267
278
|
@api_method #ruby_command_for
|
268
279
|
=end
|
269
|
-
class
|
280
|
+
class RubyRunnerPlugin < ExternalProgramPlugin
|
270
281
|
|
271
282
|
=begin rdoc
|
272
283
|
Creates a new instance.
|
@@ -293,7 +304,7 @@ must be an array, even if it only contains one entry
|
|
293
304
|
def initialize pso, group, rules = {}, order = nil, line_buffered = true
|
294
305
|
group = group.to_sym
|
295
306
|
@group = group
|
296
|
-
default_rules = {:scope => [:global], :file_extension => [], :mimetype => []}
|
307
|
+
default_rules = {:scope => [:global], :file_extension => [], :mimetype => [], :place => [:local]}
|
297
308
|
rules = default_rules.merge rules
|
298
309
|
ruby_options_data = {
|
299
310
|
:name => :ruby_options,
|
@@ -303,6 +314,7 @@ must be an array, even if it only contains one entry
|
|
303
314
|
:mimetype => rules[:mimetype],
|
304
315
|
:file_extension => rules[:file_extension],
|
305
316
|
:order => order,
|
317
|
+
:place => rules[:place]
|
306
318
|
}
|
307
319
|
pso.project_options[[group, :ruby_options]] ||= PluginSpecificationReader::Option.new ruby_options_data
|
308
320
|
super pso, line_buffered
|
@@ -1,7 +1,7 @@
|
|
1
1
|
=begin
|
2
2
|
** Form generated from reading ui file 'config_widget.ui'
|
3
3
|
**
|
4
|
-
** Created:
|
4
|
+
** Created: mar nov 16 11:52:49 2010
|
5
5
|
** by: Qt User Interface Compiler version 4.7.0
|
6
6
|
**
|
7
7
|
** WARNING! All changes made in this file will be lost when recompiling ui file!
|
@@ -1,7 +1,7 @@
|
|
1
1
|
=begin
|
2
2
|
** Form generated from reading ui file 'project_widget.ui'
|
3
3
|
**
|
4
|
-
** Created:
|
4
|
+
** Created: mar nov 16 11:52:49 2010
|
5
5
|
** by: Qt User Interface Compiler version 4.7.0
|
6
6
|
**
|
7
7
|
** WARNING! All changes made in this file will be lost when recompiling ui file!
|
@@ -1,7 +1,7 @@
|
|
1
1
|
=begin
|
2
2
|
** Form generated from reading ui file 'ruby_runnner_plugin_option_widget.ui'
|
3
3
|
**
|
4
|
-
** Created:
|
4
|
+
** Created: mar nov 16 11:52:49 2010
|
5
5
|
** by: Qt User Interface Compiler version 4.7.0
|
6
6
|
**
|
7
7
|
** WARNING! All changes made in this file will be lost when recompiling ui file!
|
data/plugins/state/plugin.yaml
CHANGED
@@ -11,14 +11,18 @@ config_options:
|
|
11
11
|
state:
|
12
12
|
open_documents: {default: []}
|
13
13
|
open_projects: {default: []}
|
14
|
-
active_document: {default: nil}
|
15
14
|
restore_cursor_position: {default: true}
|
16
15
|
restore_project_files: {default: true}
|
17
16
|
startup_behaviour: {default: :restore_all}
|
17
|
+
tabs: {default: []}
|
18
|
+
active_view: {default: nil}
|
19
|
+
cursor_positions: {default: []}
|
18
20
|
project_options:
|
19
21
|
state:
|
20
22
|
open_documents: {default: [], type: session, scope: global}
|
21
|
-
|
23
|
+
tabs: {default: [], scope: global, type: session}
|
24
|
+
cursor_positions: {default: [], type: session, scope: global }
|
25
|
+
active_view: {default: ~, type: session, scope: global}
|
22
26
|
cursor_position: {default: [0, 0], type: session, scope: document}
|
23
27
|
config_widgets:
|
24
28
|
- {class: Ruber::State::ConfigWidget, caption: General}
|
data/plugins/state/state.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
|
@@ -30,12 +30,18 @@ module Ruber
|
|
30
30
|
=begin rdoc
|
31
31
|
Plugin which allows Ruber to store and restore back its state.
|
32
32
|
|
33
|
-
In this context, the term _state_ means the open project and documents, the
|
34
|
-
|
33
|
+
In this context, the term _state_ means the open project and documents, the tabs
|
34
|
+
in the main window, the editors in each tab, the position of the cursor in the
|
35
|
+
editors and the active editor. All this data is stored
|
35
36
|
in the configuration file and in the project or document project files. Using
|
36
37
|
the API provided by this plugin, it is possible to restore a single document,
|
37
38
|
project or the whole application to the state it was when it was last closed.
|
38
39
|
|
40
|
+
Documents which haven't been saved to a file are only partially restored: an empty
|
41
|
+
document is created for them (different views associated with the same document
|
42
|
+
will correctly be associated with the same empty document after restoration). Unsaved
|
43
|
+
changes in documents not associated with files won't be restored.
|
44
|
+
|
39
45
|
In addition to providing an API for saving and restoring state, this plugin also
|
40
46
|
restores the full Ruber state when restoring a session and (according to the
|
41
47
|
user preferences) when the application starts up.
|
@@ -57,7 +63,7 @@ Plugin object for the State plugin
|
|
57
63
|
|
58
64
|
=begin rdoc
|
59
65
|
@param [Ruber::PluginSpecification] psf the plugin specification object associated
|
60
|
-
with the plugin
|
66
|
+
with the plugin
|
61
67
|
=end
|
62
68
|
def initialize psf
|
63
69
|
super
|
@@ -155,7 +161,7 @@ files in projects should be restored, regardless of what the user chose
|
|
155
161
|
=begin rdoc
|
156
162
|
Restores the given document
|
157
163
|
|
158
|
-
|
164
|
+
@see DocumentExtension#restore DocumentExtension#restore for more information
|
159
165
|
|
160
166
|
@param [Ruber::Document] doc the document to restore
|
161
167
|
@return [nil]
|
@@ -167,7 +173,7 @@ See {DocumentExtension#restore} for more information
|
|
167
173
|
=begin rdoc
|
168
174
|
Restores the given global project
|
169
175
|
|
170
|
-
|
176
|
+
@see ProjectExtension#restore ProjectExtension#restore for more information
|
171
177
|
|
172
178
|
@param [Ruber::Project] prj the document to restore
|
173
179
|
@return [nil]
|
@@ -179,6 +185,9 @@ See {ProjectExtension#restore} for more information
|
|
179
185
|
=begin rdoc
|
180
186
|
Restores the open projects according to a given configuration object
|
181
187
|
|
188
|
+
Restoring the project means closing all the open projects and opening the projects
|
189
|
+
and setting the active project according to the information in _conf_
|
190
|
+
|
182
191
|
This method is called both when the session is restored and when ruber starts
|
183
192
|
up (if the user chose so).
|
184
193
|
|
@@ -200,6 +209,13 @@ for more information
|
|
200
209
|
=begin rdoc
|
201
210
|
Restores the open documents according to a given configuration object
|
202
211
|
|
212
|
+
Restoring the open documents means:
|
213
|
+
* closing all the open documents. If any of thess is modified, the user is asked
|
214
|
+
how to proceed. If the choses to abort, nothing else is done
|
215
|
+
* opening the documents according to the @state/open_documents@ entry of _conf_
|
216
|
+
* recreating the tabs and the editors according to the @state/tabs@ entry of _conf_
|
217
|
+
* activating the editor contained in the @state/active_editor@ entry of _conf_
|
218
|
+
|
203
219
|
This method is called both when the session is restored and when ruber starts
|
204
220
|
up (if the user chose so).
|
205
221
|
|
@@ -208,17 +224,91 @@ for more information
|
|
208
224
|
@return [nil]
|
209
225
|
=end
|
210
226
|
def restore_documents config = Ruber[:config]
|
211
|
-
Ruber[:
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
227
|
+
return unless Ruber[:documents].close_all
|
228
|
+
docs = config[:state, :open_documents]
|
229
|
+
unnamed_docs = []
|
230
|
+
docs = docs.map do |i|
|
231
|
+
if i.is_a?(String) then Ruber[:documents].document(i)
|
232
|
+
else
|
233
|
+
doc = Ruber[:documents].new_document
|
234
|
+
unnamed_docs << doc
|
235
|
+
doc
|
236
|
+
end
|
237
|
+
end
|
238
|
+
return if docs.empty?
|
239
|
+
tabs = config[:state, :tabs]
|
216
240
|
mw = Ruber[:main_window]
|
217
|
-
|
218
|
-
|
219
|
-
|
241
|
+
positions = config[:state, :cursor_positions]
|
242
|
+
tabs.each_with_index do |t, i|
|
243
|
+
pn = restore_pane t, unnamed_docs
|
244
|
+
views = pn.to_a
|
245
|
+
views.each_with_index do |v, j|
|
246
|
+
cursor = KTextEditor::Cursor.new(*(positions[i][j] rescue [0,0]))
|
247
|
+
v.cursor_position = cursor
|
248
|
+
end
|
249
|
+
end
|
250
|
+
active_editor = config[:state, :active_view]
|
251
|
+
if active_editor
|
252
|
+
mw.focus_on_editor mw.tabs[active_editor[0]].to_a[active_editor[1]]
|
220
253
|
end
|
221
|
-
|
254
|
+
end
|
255
|
+
|
256
|
+
=begin rdoc
|
257
|
+
Restores a pane
|
258
|
+
|
259
|
+
Restoring a pane means creating the editors which were contained in the pane,
|
260
|
+
in the correct disposition.
|
261
|
+
|
262
|
+
The contents of the pane are described by the array _data_, which has the following
|
263
|
+
format:
|
264
|
+
|
265
|
+
* if it has a single element, the corresponding pane contains only a view. If the
|
266
|
+
element is a string, it must represent the URL of the document the view is associated
|
267
|
+
with. If it is a number, it means the view is associated with a document which
|
268
|
+
hasn't been saved
|
269
|
+
* if it has more than one element, it means that the pane contains more than one
|
270
|
+
view. The first element represents the orientation of the pane and can be either
|
271
|
+
@Qt::Horizontal@ or @Qt::Vertical@. The other elements can be either strings,
|
272
|
+
numbers or arrays. A string or number means, as above, the URL of the document
|
273
|
+
associated with the view or a document which isn't associated with a file. An
|
274
|
+
array (which should have the same format as this) means a sub pane
|
275
|
+
@param [Array] data the array containing the description of the contents of the
|
276
|
+
pane
|
277
|
+
@param [Array<Document>] docs the document not associated with files to use for
|
278
|
+
the numeric entries of _data_. A number _n_ in _data_ means to use the entry
|
279
|
+
_n_ in _docs_
|
280
|
+
@return [Pane] the new pane
|
281
|
+
=end
|
282
|
+
def restore_pane data, docs
|
283
|
+
mw = Ruber[:main_window]
|
284
|
+
find_first_view = lambda do |array|
|
285
|
+
if array.size == 1 then array[0]
|
286
|
+
elsif array[1].is_a? Array then find_first_view.call array[1]
|
287
|
+
else array[1]
|
288
|
+
end
|
289
|
+
end
|
290
|
+
recreate_pane = lambda do |pn, array|
|
291
|
+
orientation = array[0]
|
292
|
+
last_view = pn.view
|
293
|
+
array.each_with_index do |e, i|
|
294
|
+
#the first element of the array is the orientation; the second is
|
295
|
+
#the first view, which is already contained in the pane
|
296
|
+
next if i < 2
|
297
|
+
view = e.is_a?(Array) ? find_first_view.call(e) : e
|
298
|
+
view = mw.editor_for! view.is_a?(String) ? view: docs[view],
|
299
|
+
:existing => :never, :show => false
|
300
|
+
pn.split last_view, view, orientation
|
301
|
+
last_view = view
|
302
|
+
recreate_pane.call view.parent, e if e.is_a? Array
|
303
|
+
end
|
304
|
+
recreate_pane.call pn.splitter.widget(0), array[1] if array[1].is_a?(Array)
|
305
|
+
end
|
306
|
+
view = find_first_view.call data
|
307
|
+
view = mw.editor_for! view.is_a?(String) ? view : docs[view],
|
308
|
+
:existing => :never, :new => :new_tab
|
309
|
+
pane = view.parent
|
310
|
+
recreate_pane.call pane, data
|
311
|
+
pane
|
222
312
|
end
|
223
313
|
|
224
314
|
=begin rdoc
|
@@ -262,7 +352,7 @@ Since this method deals with session management, it ignores the user settings
|
|
262
352
|
@return [nil]
|
263
353
|
=end
|
264
354
|
def restore_session data
|
265
|
-
hash = data['State'] || {:open_projects => [], :open_documents => [], :
|
355
|
+
hash = data['State'] || {:open_projects => [], :open_documents => [], :active_view => nil, :tabs => []}
|
266
356
|
hash = hash.map_hash{|k, v| [[:state, k], v]}
|
267
357
|
def hash.[] k, v
|
268
358
|
super [k, v]
|
@@ -281,8 +371,8 @@ Saves Ruber's state to the global config object
|
|
281
371
|
def save_settings
|
282
372
|
h = gather_settings
|
283
373
|
cfg = Ruber[:config]
|
284
|
-
|
285
|
-
cfg[:state,
|
374
|
+
h.each_pair do |k, v|
|
375
|
+
cfg[:state, k] = v
|
286
376
|
end
|
287
377
|
nil
|
288
378
|
end
|
@@ -296,6 +386,84 @@ Override of {PluginLike#session_data}
|
|
296
386
|
{'State' => gather_settings}
|
297
387
|
end
|
298
388
|
|
389
|
+
=begin rdoc
|
390
|
+
The open projects in a form suitable to be written to a configuration object
|
391
|
+
|
392
|
+
@return [Array<String>] an array containing the names of the project files for
|
393
|
+
the currently open projects. The active project is the first one. This value
|
394
|
+
is the one to write under the @state/open_projects@ entry in a project or configuration
|
395
|
+
object
|
396
|
+
=end
|
397
|
+
def projects_state
|
398
|
+
projects = Ruber[:projects].projects.map{|pr| pr.project_file}
|
399
|
+
unless projects.empty?
|
400
|
+
active_prj = Ruber[:projects].current
|
401
|
+
projects.unshift projects.delete(active_prj.project_file) if active_prj
|
402
|
+
end
|
403
|
+
projects
|
404
|
+
end
|
405
|
+
|
406
|
+
=begin rdoc
|
407
|
+
The open documents in a form suitable to be written to a configuration object
|
408
|
+
|
409
|
+
@return [Array<String,nil>] an array containing the names of the URLs associated with
|
410
|
+
the currently open documents. Documents not associated with files are represented
|
411
|
+
by *nil*s in the array. This value is the one to write under the @state/open_documents@
|
412
|
+
entry in a project or configuration object
|
413
|
+
=end
|
414
|
+
def documents_state
|
415
|
+
docs = Ruber[:documents].documents
|
416
|
+
docs.map{ |doc| doc.has_file? ? doc.url.to_encoded.to_s : nil}
|
417
|
+
end
|
418
|
+
|
419
|
+
=begin rdoc
|
420
|
+
The open tabs configuration in a form suitable to be written to a configuration object
|
421
|
+
|
422
|
+
@return [Hash] A hash containing the following keys:
|
423
|
+
* @:tabs@: an array of arrays, with each inner array representing one tab, with
|
424
|
+
the format described in {#restore_pane}. This value is the one to write under
|
425
|
+
the @state/tabs@ entry in a project or configuration object
|
426
|
+
* @:cursor_positions@:an array of arrays. Each inner array corresponds to a tab
|
427
|
+
and contains the cursor position of each view. Each cursor position is represented
|
428
|
+
as an array with two elements: the first is the line, the second is the column.
|
429
|
+
The order the views are is the same used by {Pane#each_view}. This value is the one to write under
|
430
|
+
the @state/cursor_positions@ entry in a project or configuration object
|
431
|
+
* @:active_view@: the active view. It is represented by a size 2 array, with the
|
432
|
+
first element being the index of the tab of the active view and the second being
|
433
|
+
the index of the view in the corresponding pane (according to the order used by
|
434
|
+
{Pane#each_view}). If there's no active view, this entry is *nil*. This is the value to write under
|
435
|
+
the @state/active_view@ entry in a project or configuration object
|
436
|
+
=end
|
437
|
+
def tabs_state
|
438
|
+
res = {}
|
439
|
+
doc_map = {}
|
440
|
+
doc_idx = 0
|
441
|
+
Ruber[:documents].each do |doc|
|
442
|
+
if !doc.has_file?
|
443
|
+
doc_map[doc] = doc_idx
|
444
|
+
doc_idx += 1
|
445
|
+
end
|
446
|
+
end
|
447
|
+
tabs = Ruber[:main_window].tabs
|
448
|
+
tabs_tree = []
|
449
|
+
cursor_positions = []
|
450
|
+
tabs.each do |t|
|
451
|
+
tabs_tree << tab_to_tree(t, doc_map)
|
452
|
+
cursor_positions << t.map do |v|
|
453
|
+
pos = v.cursor_position
|
454
|
+
[pos.line, pos.column]
|
455
|
+
end
|
456
|
+
end
|
457
|
+
res[:tabs] = tabs_tree
|
458
|
+
res[:cursor_positions] = cursor_positions
|
459
|
+
active = Ruber[:main_window].active_editor
|
460
|
+
if active
|
461
|
+
active_tab = Ruber[:main_window].tab(active)
|
462
|
+
res[:active_view] = [tabs.index(active_tab), active_tab.to_a.index(active)]
|
463
|
+
end
|
464
|
+
res
|
465
|
+
end
|
466
|
+
|
299
467
|
private
|
300
468
|
|
301
469
|
=begin rdoc
|
@@ -307,60 +475,95 @@ Creates a hash with all the data needed to restore Ruber's state
|
|
307
475
|
* @:open_documents@: an array with the name of the file corresponding to each
|
308
476
|
open document (documents without an associated file can't be restored and aren't
|
309
477
|
included). The order is that of opening
|
478
|
+
* @:visible_documents@: an array with the name of the files corresponding to the
|
479
|
+
documents associated with a file and having a view
|
310
480
|
* @:active_document@: the name of the file associated with the active document or
|
311
481
|
*nil* if there's no open document
|
312
482
|
=end
|
313
483
|
def gather_settings
|
314
|
-
res = {
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
end
|
320
|
-
res[:open_projects] = projects
|
321
|
-
docs = Ruber[:docs].documents.map{|doc| doc.path}.select{|path| !path.empty?}
|
322
|
-
res[:open_documents] = docs
|
323
|
-
current_doc = Ruber[:main_window].current_document.path rescue ''
|
324
|
-
res[:active_document] = current_doc.empty? ? nil : current_doc
|
484
|
+
res = {
|
485
|
+
:open_projects => projects_state,
|
486
|
+
:open_documents => documents_state
|
487
|
+
}
|
488
|
+
res.merge! tabs_state
|
325
489
|
res
|
326
490
|
end
|
327
491
|
|
492
|
+
=begin rdoc
|
493
|
+
A representation of a pane's configuration suitable to be written to a configuration
|
494
|
+
object
|
495
|
+
|
496
|
+
@param [Pane] pane the pane to return the representation for
|
497
|
+
@param [Hash{Document=>Integer}] docs a map between documents not associated
|
498
|
+
with files and the number to represent them
|
499
|
+
@return [Array<Array,Integer,String>] an array as described in {#restore_pane}
|
500
|
+
=end
|
501
|
+
def tab_to_tree pane, docs
|
502
|
+
if pane.single_view?
|
503
|
+
doc = pane.view.document
|
504
|
+
return [doc.has_file? ? doc.url.url : docs[doc]]
|
505
|
+
end
|
506
|
+
panes = {}
|
507
|
+
tab_to_tree_prc = lambda do |pn|
|
508
|
+
if pn.single_view?
|
509
|
+
doc = pn.view.document
|
510
|
+
panes[pn.parent_pane] << (doc.has_file? ? doc.url.url : docs[doc])
|
511
|
+
else
|
512
|
+
data = [pn.orientation]
|
513
|
+
panes[pn] = data
|
514
|
+
panes[pn.parent_pane] << data if pn.parent_pane
|
515
|
+
end
|
516
|
+
end
|
517
|
+
tab_to_tree_prc.call pane
|
518
|
+
pane.each_pane :recursive, &tab_to_tree_prc
|
519
|
+
panes[pane]
|
520
|
+
end
|
521
|
+
|
328
522
|
end
|
329
523
|
|
330
524
|
=begin rdoc
|
331
525
|
Extension for documents needed by the State plugin
|
332
526
|
|
333
|
-
The scope of this extension is to
|
334
|
-
in the
|
527
|
+
The scope of this extension is to move the cursor of all newly created views
|
528
|
+
associated with the document to the position it was in the last used view. The
|
529
|
+
cursor position for the first view is read from the document's own project, where
|
530
|
+
it is saved whenever the document is closed.
|
531
|
+
|
532
|
+
The cursor position for a view is moved in response to the {Document#view_created}
|
533
|
+
signal.
|
335
534
|
=end
|
336
535
|
class DocumentExtension < Qt::Object
|
337
536
|
|
338
537
|
include Extension
|
339
538
|
|
340
|
-
slots
|
539
|
+
slots 'auto_restore(QObject*)'
|
341
540
|
|
342
541
|
=begin rdoc
|
343
542
|
@param [Ruber::DocumentProject] prj the project associated with the document
|
344
543
|
=end
|
345
544
|
def initialize prj
|
346
545
|
super
|
546
|
+
@last_view = nil
|
347
547
|
@project = prj
|
348
548
|
@document = prj.document
|
349
|
-
connect @document, SIGNAL('view_created(QObject*, QObject*)'), self, SLOT(
|
549
|
+
connect @document, SIGNAL('view_created(QObject*, QObject*)'), self, SLOT('auto_restore(QObject*)')
|
550
|
+
connect @document, SIGNAL('closing_view(QWidget*, QObject*)'), self, SLOT('view_closing(QWidget*)')
|
350
551
|
end
|
351
552
|
|
352
553
|
=begin rdoc
|
353
|
-
|
354
|
-
own project
|
554
|
+
Moves the cursor of a view to the position it was in the last used view
|
355
555
|
|
356
|
-
|
556
|
+
If there are no other views associated with the document, the position of the
|
557
|
+
cursor is read from the document's own project
|
558
|
+
@param [EditorView] the view to move the cursor for
|
357
559
|
@return [nil]
|
358
560
|
=end
|
359
|
-
def restore
|
360
|
-
view = @
|
361
|
-
|
362
|
-
|
363
|
-
|
561
|
+
def restore view
|
562
|
+
if @last_view then view.cursor_position = @last_view.cursor_position
|
563
|
+
else
|
564
|
+
pos = @document.own_project[:state, :cursor_position]
|
565
|
+
view.go_to *pos
|
566
|
+
end
|
364
567
|
nil
|
365
568
|
end
|
366
569
|
|
@@ -371,43 +574,74 @@ It does nothing if the document isn't associated with a view
|
|
371
574
|
@return [nil]
|
372
575
|
=end
|
373
576
|
def save_settings
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
[
|
378
|
-
|
379
|
-
end
|
380
|
-
@project[:state, :cursor_position] = pos
|
577
|
+
if @last_view
|
578
|
+
cur = @last_view.cursor_position
|
579
|
+
pos = [cur.line, cur.column]
|
580
|
+
@project[:state, :cursor_position] = pos
|
581
|
+
end
|
381
582
|
nil
|
382
583
|
end
|
383
584
|
|
384
585
|
private
|
385
586
|
|
386
587
|
=begin rdoc
|
387
|
-
|
588
|
+
Restores the cursor position for a view if the user choosed to do so
|
589
|
+
|
590
|
+
It does nothing if the user choosed not to restore the cursor position when a view
|
591
|
+
is created
|
592
|
+
|
593
|
+
@param [EditorView] the view to restore the cursor position for
|
594
|
+
@return [nil]
|
595
|
+
=end
|
596
|
+
def auto_restore view
|
597
|
+
restore view if Ruber[:state].restore_cursor_position?
|
598
|
+
connect view, SIGNAL('focus_in(QWidget*)'), self, SLOT('view_received_focus(QWidget*)')
|
599
|
+
nil
|
600
|
+
end
|
601
|
+
|
602
|
+
=begin rdoc
|
603
|
+
Memorizes which view has last received focus
|
388
604
|
|
389
|
-
|
390
|
-
a
|
605
|
+
This information is used to decide which view to ask for the cursor position when
|
606
|
+
a new view is created or the cursor position needs to be saved to the project
|
607
|
+
@param [EditorView] view the view which has received focus
|
391
608
|
@return [nil]
|
392
609
|
=end
|
393
|
-
def
|
394
|
-
|
610
|
+
def view_received_focus view
|
611
|
+
@last_view = view
|
395
612
|
nil
|
396
613
|
end
|
614
|
+
slots 'view_received_focus(QWidget*)'
|
615
|
+
|
616
|
+
=begin rdoc
|
617
|
+
Method called whenever a view associated with the document is closed
|
618
|
+
|
619
|
+
If the closed view is the one which last got focus, its cursor position is saved
|
620
|
+
in the document's own project. Otherwise nothing is done.
|
621
|
+
@param [EditorView] view the view being closed
|
622
|
+
@return [nil]
|
623
|
+
=end
|
624
|
+
def view_closing view
|
625
|
+
if view == @last_view
|
626
|
+
save_settings
|
627
|
+
@last_view = nil
|
628
|
+
end
|
629
|
+
end
|
630
|
+
slots 'view_closing(QWidget*)'
|
397
631
|
|
398
632
|
end
|
399
633
|
|
400
634
|
=begin rdoc
|
401
635
|
Extension for projects needed by the State plugin
|
402
636
|
|
403
|
-
The scope of this extension is to save and restore the
|
404
|
-
|
637
|
+
The scope of this extension is to save and restore the state of the tabs open
|
638
|
+
when the project was last closed
|
405
639
|
=end
|
406
640
|
class ProjectExtension < Qt::Object
|
407
641
|
|
408
642
|
include Extension
|
409
643
|
|
410
|
-
slots :auto_restore
|
644
|
+
slots :auto_restore, :save_settings
|
411
645
|
|
412
646
|
=begin rdoc
|
413
647
|
@param [Ruber::Project] prj the project associated with the extension
|
@@ -416,55 +650,45 @@ with projects
|
|
416
650
|
super
|
417
651
|
@project = prj
|
418
652
|
connect @project, SIGNAL(:activated), self, SLOT(:auto_restore)
|
653
|
+
connect @project, SIGNAL(:deactivated), self, SLOT(:save_settings)
|
419
654
|
end
|
420
655
|
|
421
656
|
=begin rdoc
|
422
|
-
|
423
|
-
project's state was changed
|
657
|
+
Restore Ruber's state as it was when the project was last closed
|
424
658
|
|
425
|
-
|
659
|
+
See {Plugin#restore_documents} for more information
|
426
660
|
|
427
661
|
@return [nil]
|
428
662
|
=end
|
429
663
|
|
430
664
|
def restore
|
431
|
-
|
432
|
-
Ruber[:docs].close_all
|
433
|
-
return if files.empty?
|
434
|
-
active_file = @project[:state, :active_document]
|
435
|
-
active_file = files[-1] unless files.include? active_file
|
436
|
-
mw = Ruber[:main_window]
|
437
|
-
mw.without_activating do
|
438
|
-
files.each{|f| mw.editor_for! f}
|
439
|
-
end
|
440
|
-
mw.display_document active_file
|
665
|
+
Ruber[:state].restore_documents @project
|
441
666
|
nil
|
442
667
|
end
|
443
668
|
|
444
669
|
=begin rdoc
|
445
|
-
Saves
|
670
|
+
Saves Ruber's state to the project
|
671
|
+
|
672
|
+
The saved information is: the configuration of open tabs, the position of the cursor
|
673
|
+
in the views and the active view
|
446
674
|
|
447
675
|
@return [nil]
|
448
676
|
=end
|
449
677
|
def save_settings
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
678
|
+
@project[:state, :open_documents] = Ruber[:state].documents_state
|
679
|
+
tabs_state = Ruber[:state].tabs_state
|
680
|
+
[:tabs, :cursor_positions, :active_view].each do |e|
|
681
|
+
@project[:state, e] = tabs_state[e]
|
682
|
+
end
|
455
683
|
nil
|
456
684
|
end
|
457
685
|
|
458
686
|
private
|
459
687
|
|
460
688
|
=begin rdoc
|
461
|
-
|
462
|
-
project's state was changed when the project is opened.
|
463
|
-
|
464
|
-
Any already open document is closed (after saving).
|
689
|
+
Restores the project's state when a new project is activated
|
465
690
|
|
466
|
-
It does nothing if the user
|
467
|
-
project.
|
691
|
+
It does nothing if the user choosed not to restore the projects's state.
|
468
692
|
@return [nil]
|
469
693
|
=end
|
470
694
|
def auto_restore
|