Class: Syskit::GUI::BatchManager

Inherits:
WidgetList show all
Defined in:
lib/syskit/gui/batch_manager.rb

Defined Under Namespace

Classes: NewJobDialog, StartJob, ToString

Instance Method Summary collapse

Methods inherited from WidgetList

#add_after, #add_before, #add_separator, #add_widget, #auto_resize?, #children_size_updated, #clear_widgets, #each_widget, #resizeEvent

Constructor Details

#initialize(syskit, parent = nil) ⇒ BatchManager

Returns a new instance of BatchManager



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/syskit/gui/batch_manager.rb', line 6

def initialize(syskit, parent = nil)
    super(parent)
    @syskit = syskit

    @actions         = Qt::Widget.new
    actions_layout  = Qt::HBoxLayout.new(@actions)
    @process_btn = Qt::PushButton.new("Process")
    @cancel_btn  = Qt::PushButton.new("Cancel")

    actions_layout.add_widget(@process_btn)
    actions_layout.add_widget(@cancel_btn)
    add_widget(@actions, permanent: true)

    @process_btn.connect(SIGNAL(:clicked)) do
        process
    end
    @cancel_btn.connect(SIGNAL(:clicked)) do
        cancel
    end
    disable_actions

    @start_job = Array.new
    @drop_job = Array.new
end

Instance Method Details

#cancelObject



49
50
51
# File 'lib/syskit/gui/batch_manager.rb', line 49

def cancel
    clear
end

#clearObject



53
54
55
56
57
58
# File 'lib/syskit/gui/batch_manager.rb', line 53

def clear
    clear_widgets
    @start_job.clear
    @drop_job.clear
    disable_actions
end

#create_new_job(action_name, arguments = Hash.new) ⇒ Object



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/syskit/gui/batch_manager.rb', line 88

def create_new_job(action_name, arguments = Hash.new)
    action_model = @syskit.actions.find { |m| m.name == action_name }
    if !action_model
        raise ArgumentError, "no action named #{action_name} found"
    end

    if action_model.arguments.empty?
        start_job(action_name, Hash.new)
        true
    else
        formatted_arguments = String.new
        action_model.arguments.each do |arg|
            default_arg     = arguments.fetch(
                arg.name.to_sym, arg.default)
            has_default_arg = arguments.has_key?(arg.name.to_sym) || !arg.required?

            if !formatted_arguments.empty?
                formatted_arguments << ",\n"
            end
            doc_lines = (arg.doc || "").split("\n")
            formatted_arguments << "\n  # #{doc_lines.join("\n  # ")}\n"
            if !has_default_arg
                formatted_arguments << "  #{arg.name}: "
            elsif default_arg.nil?
                formatted_arguments << "  #{arg.name}: nil"
            elsif default_arg.respond_to?(:name) && MetaRuby::Registration.accessible_by_name?(default_arg)
                formatted_arguments << "  #{arg.name}: #{default_arg.name}"
            elsif as_string = ToString.convert(default_arg)
                formatted_arguments << "  #{arg.name}: #{as_string}"
            elsif arg.required?
                formatted_arguments << "  #{arg.name}: "
            else
                formatted_arguments << "  # #{arg.name}'s default argument cannot be handled by the IDE\n"
                formatted_arguments << "  # #{arg.name}: #{default_arg}"

            end
        end
        formatted_action = "#{action_name}!(\n#{formatted_arguments}\n)"
        dialog = NewJobDialog.new(self, formatted_action)
        if dialog.exec == Qt::Dialog::Accepted
            action_name, action_options = dialog.result
            start_job(action_name, action_options)
            true
        else false
        end
    end
end

#disable_actionsObject



62
63
64
65
66
# File 'lib/syskit/gui/batch_manager.rb', line 62

def disable_actions
    emit active(false)
    @process_btn.enabled = false
    @cancel_btn.enabled = false
end

#drop_job(job_widget) ⇒ Object



76
77
78
79
80
# File 'lib/syskit/gui/batch_manager.rb', line 76

def drop_job(job_widget)
    @drop_job << job_widget.job
    add_before(Qt::Label.new("<b>Drop</b> #{job_widget.label}"), @actions)
    enable_actions
end

#enable_actionsObject



68
69
70
71
72
# File 'lib/syskit/gui/batch_manager.rb', line 68

def enable_actions
    emit active(true)
    @process_btn.enabled = true
    @cancel_btn.enabled = true
end

#processObject



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/syskit/gui/batch_manager.rb', line 31

def process
    batch = @syskit.client.create_batch
    @drop_job.each do |j|
        batch.drop_job(j.job_id)
    end
    @start_job.each do |j|
        arguments = j.action_arguments
        arguments.delete(:job_id)
        batch.start_job(j.action_name, arguments)
    end
    begin
        batch.__process
    rescue Exception => e
        Qt::MessageBox.critical(self, "Syskit Process Batch", "failed to process batch: #{e.message}, see console output for more details")
    end
    clear
end

#start_job(action_name, action_arguments) ⇒ Object



82
83
84
85
86
# File 'lib/syskit/gui/batch_manager.rb', line 82

def start_job(action_name, action_arguments)
    @start_job << StartJob.new(action_name, action_arguments)
    add_before(Qt::Label.new("<b>Start</b> #{action_name}"), @actions)
    enable_actions
end