Class: QtSourceGenerator

Inherits:
GeneratorQtBase show all
Defined in:
lib/metarecord/generators/qt/source_generator.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from GeneratorQtBase

#get_type, #id_type, #nativeTypeNameFor, #null_id, super_class, super_class_include

Methods inherited from GeneratorBase

#_append, _use_by_files, _use_by_models, #get_classname, #get_pluralized_name, #get_singular_name, #get_type, #get_value, #id_type, #indent, #make_block, #null_id, prepare, #ptr_type, #should_generate_for, #should_generate_from_manifest, #should_skip_on_client?, sourcefile_to_destfile, #unindent, use

Class Method Details

.extensionObject



120
# File 'lib/metarecord/generators/qt/source_generator.rb', line 120

def extension ; ".cpp" ; end

.is_file_based?Boolean

Returns:



122
# File 'lib/metarecord/generators/qt/source_generator.rb', line 122

def is_file_based? ; true ; end

.make_file(filename, data) ⇒ Object



124
125
126
127
128
129
130
131
# File 'lib/metarecord/generators/qt/source_generator.rb', line 124

def make_file filename, data
  source = <<CPP
#include "#{filename.split('/').last[0...-3]}.h"
#{collect_includes_for(filename).join "\n"}

#{data[:bodies].join "\n"}
CPP
end

Instance Method Details

#generate_constructor(object) ⇒ Object



31
32
33
34
35
36
37
38
# File 'lib/metarecord/generators/qt/source_generator.rb', line 31

def generate_constructor object
  @state = :constructor
  _append "#{@class_name}::#{@class_name}(QObject* parent) : #{super_class}(parent)"
  make_block do
    self.instance_eval &object[:block]
  end
  _append ""
end

#generate_for(object) ⇒ Object



13
14
15
16
17
18
19
20
21
# File 'lib/metarecord/generators/qt/source_generator.rb', line 13

def generate_for object
  reset
  @class_name = object[:name]
  @inherits = object[:inherits]
  generate_constructor object
  generate_transient_members unless @transients.empty?
  generate_methods object
  @src
end

#generate_methods(object) ⇒ Object



47
48
49
50
# File 'lib/metarecord/generators/qt/source_generator.rb', line 47

def generate_methods object
  @state = :methods
  self.instance_eval &object[:block]
end

#generate_transient_membersObject



40
41
42
43
44
45
# File 'lib/metarecord/generators/qt/source_generator.rb', line 40

def generate_transient_members
  @transients.each do |member|
    list << "{#{member.inspect}}"
  end
  _append "const QStringList #{@class_name}::virtualPropertyNames = {#{list.join ','}};"
end

#has_many(type, name, options = {}) ⇒ Object



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/metarecord/generators/qt/source_generator.rb', line 94

def has_many type, name, options = {}
  setter = "set#{name.camelcase}"
  member_name = "m_#{name.lower_camelcase}"
  signal = "#{name}Changed"
  case @state
  when :constructor
    _append "registerRelationship(\"#{name}\", #{member_name});"
  when :methods
    _append "void #{@class_name}::#{setter}(const  QList<#{type}*>& value)"
    make_block do
      _append "#{member_name} = value;"
      _append "Q_EMIT #{signal}();"
    end 
  end
end

#has_one(type, name, options = {}) ⇒ Object



87
88
89
90
91
92
# File 'lib/metarecord/generators/qt/source_generator.rb', line 87

def has_one type, name, options = {}
  case @state
  when :constructor
    @transients << name
  end
end

#order_by(name, flow = nil) ⇒ Object



116
117
# File 'lib/metarecord/generators/qt/source_generator.rb', line 116

def order_by name, flow = nil
end

#property(type, name, options = {}) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/metarecord/generators/qt/source_generator.rb', line 52

def property type, name, options = {}
  property_type = type.to_property_type(self)
  type = property_type.name
  member = "m_#{name.lower_camelcase}"
  member = options[:qt][:member] if options[:qt] && options[:qt][:member]
  getter = name.lower_camelcase
  setter = "set#{name.camelcase}"
  signal = "#{name.lower_camelcase}Changed"
  case @state
  when :constructor
    _append "connect(this, &#{@class_name}::#{signal}, this, &#{@class_name}::attributeChanged);"
    unless options[:qt].nil? || options[:qt][:member].nil?
      _append "#{member} = #{get_value options[:default]};" unless options[:default].nil?
    end
    @transients << name if options[:db] && options[:db][:transient]
  when :methods
    getter_options = if options[:qt] && options[:qt][:getter] then options[:qt][:getter] else {} end
    setter_options = if options[:qt] && options[:qt][:setter] then options[:qt][:setter] else {} end
    getter_type = property_type.parameter_type getter_options
    setter_type = property_type.parameter_type setter_options
    _append "\n#{getter_type} #{@class_name}::#{getter}() const"
    make_block do
      _append "return #{member};"
    end
    _append "\nvoid #{@class_name}::#{setter}(#{setter_type} _value)"
    make_block do
      _append "if (_value != #{member})"
      make_block do
        _append "#{member} = _value;"
        _append "Q_EMIT #{signal}();"
      end
    end
  end
end

#resetObject



4
5
6
7
8
9
10
11
# File 'lib/metarecord/generators/qt/source_generator.rb', line 4

def reset
  super
  @state = nil
  @relations = {}
  @fields = []
  @transients = []
  @signals = []
end

#resource_name(name) ⇒ Object



113
114
# File 'lib/metarecord/generators/qt/source_generator.rb', line 113

def resource_name name
end

#super_classObject



23
24
25
26
27
28
29
# File 'lib/metarecord/generators/qt/source_generator.rb', line 23

def super_class
  if @inherits.nil?
    self.class.super_class
  else
    @inherits
  end
end

#visibility(name) ⇒ Object



110
111
# File 'lib/metarecord/generators/qt/source_generator.rb', line 110

def visibility name
end