Module: Ruber::KTextEditorWrapper
- Included in:
- Document, EditorView
- Defined in:
- lib/ruber/editor/ktexteditor_wrapper.rb
Overview
Module which abstracts some common functionality of Document and EditorView due to the fact that both are mostly simply wrappers around two KTextEditor
classes.
Throught this documentation, the KTextEditor::Document or KTextEditor::View corresponding to the object will be referred to as the wrapped object.
In particular, this class:
-
provide a way to access methods provided by the different interfaces implemented by the wrapped object without directly accessing it (using InterfaceProxy)
-
redirect to the wrapped object any method call the object itself doesn’t respond to
-
provide a (private) method to access the wrapped object
-
provide some automatization in the process having the object emit an appropriate signal when the wrapped object emits a signal.
Defined Under Namespace
Classes: InterfaceProxy
Class Method Summary collapse
-
.prepare_wrapper_connections(cls, data) ⇒ Object
Makes easier having the object emit a signal in corrispondence with signals emitted by the wrapped object.
Instance Method Summary collapse
-
#interface(name) ⇒ Object
Returns an InterfaceProxy set to the interface name.
-
#method_missing(name, *args, &blk) ⇒ Object
Forwards the method call to the wrapped object.
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *args, &blk) ⇒ Object
Forwards the method call to the wrapped object
156 157 158 159 160 161 |
# File 'lib/ruber/editor/ktexteditor_wrapper.rb', line 156 def method_missing name, *args, &blk begin super rescue NoMethodError, NameError, NotImplementedError @_wrapped.send name, *args, &blk end end |
Class Method Details
.prepare_wrapper_connections(cls, data) ⇒ Object
Makes easier having the object emit a signal in corrispondence with signals emitted by the wrapped object. In particular, this method does the following (for each signal given in the arguments):
-
creates a signal for the object based on the name of the signal in the wrapped object
-
creates a slot for the object with a name obtained from the name of the signal, which takes the same arguments as the signal in the wrapped object and emits the associated signal of the object. The arguments of the emitted signal are taken from those passed to the slot, but they can be reordered. Also, self can be specified
-
returns a hash suitable to be passed as second argument to
initialize_wrapper
.
Usually, this method is called when the class is created and the returned hash is stored in a class instance variable. The class’s initialize
method then passes it as second argument to initialize_wrapper
.
cls is the class for which signals and slots will be defined. data is a hash containing the information for the signal and slot to create.
-
its keys are the names of the signals converted to snakecase. This name will be converted to camelcase to obtain the name of the signal of the wrapped object, while will be used as is for the signal of the object.
-
its values are arrays. The first element is the signature of the signal of the wrapped object. The second element is an array of integers and *nil*s. An integer i in the position n of the array means that the _n_th argument of the new signal will be the _i_th argument of the signal of the wrapped object (both indexes start from 0). If the array contains nil in position n, the _n_th argument of the new signal will be self (in the signature of the new signal, this will mean
QWidget*
if cls derives fromQt::Widget
andQObject*
otherwise).
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
# File 'lib/ruber/editor/ktexteditor_wrapper.rb', line 115 def self.prepare_wrapper_connections cls, data res = {} data.each_pair do |name, d| old_args = d[0].split(/,\s*/) new_args = d[1].map do |i| if i then old_args[i] elsif cls.ancestors.include?(Qt::Widget) then 'QWidget*' else 'QObject*' end end new_args = new_args.join ', ' new_signal = "#{name}(#{new_args})" old_signal = "#{name.camelcase :lower}(#{d[0]})" slot_name = "__emit_#{name}_signal(#{d[0]})" cls.send :signals, new_signal cls.send :slots, slot_name res[old_signal] = slot_name method_def = <<-EOS def __emit_#{name}_signal(#{old_args.size.times.map{|i| "a#{i}"}.join ', '}) emit #{name}(#{d[1].map{|i| i ? "a#{i}" : 'self'}.join ', '}) end EOS cls.class_eval method_def end res end |
Instance Method Details
#interface(name) ⇒ Object
Returns an InterfaceProxy set to the interface name. See InterfaceProxy#interface=
for the possible values for name. It is meant to be used this way (supposing doc is an object which wraps KTextEditor::Document
)
doc.interface(:modification_interface).modified_on_disk_warning = true
148 149 150 151 |
# File 'lib/ruber/editor/ktexteditor_wrapper.rb', line 148 def interface name @_interface.interface = name @_interface end |