class Roby::GUI::ChronicleWidget::TaskLayout

Attributes

add_point[R]
base_height[R]
base_time[R]
end_point[R]
event_height[R]
event_max_x[R]
events[R]
finalization_point[R]
fm[R]
messages[RW]
start_point[R]
state[R]
task[R]
time_to_pixel[R]
title[RW]

Public Class Methods

new(task, base_time, time_to_pixel, fm) click to toggle source
# File lib/roby/gui/chronicle_widget.rb, line 645
def initialize(task, base_time, time_to_pixel, fm)
    @task = task
    @base_time = base_time
    @time_to_pixel = time_to_pixel
    @fm = fm
    @event_height = [2 * EVENT_CIRCLE_RADIUS, fm.height].max

    @add_point = time_to_pixel * (task.addition_time - base_time)
    @start_point = nil
    @end_point   = nil
    @finalization_point = nil

    @state = :pending
    @messages = Array.new
    @events = Array.new
    @event_max_x = Array.new
    @base_height = event_height
    update
end

Public Instance Methods

append_event(event, event_height) click to toggle source
# File lib/roby/gui/chronicle_widget.rb, line 698
def append_event(event, event_height)
    event_x = Integer(time_to_pixel * (event.time - base_time))
    event_current_level = nil
    event_max_x.each_with_index do |x, idx|
        if x < event_x - EVENT_CIRCLE_RADIUS
            event_current_level = idx
            break
        end
    end
    event_current_level ||= event_max_x.size

    event_y = event_current_level * event_height
    event_max_x[event_current_level] = event_x + 2 * EVENT_CIRCLE_RADIUS + fm.width(event.symbol.to_s)
    events << [event.time, event_x, event_y, event.symbol.to_s]
end
events_in_range(display_start_time, display_end_time) click to toggle source
# File lib/roby/gui/chronicle_widget.rb, line 714
def events_in_range(display_start_time, display_end_time)
    if !@time_first_event
        return
    elsif @time_first_event > display_end_time
        return
    elsif @time_last_event < display_start_time
        return
    else
        result = []
        events.each do |ev|
            time = ev.first
            if time > display_start_time
                if time < display_end_time
                    result << ev
                else
                    break
                end
            end
        end
        result if !result.empty?
    end
end
height(display_start_time, display_end_time) click to toggle source
# File lib/roby/gui/chronicle_widget.rb, line 737
def height(display_start_time, display_end_time)
    if events = events_in_range(display_start_time, display_end_time)
        max_event_y = events.max_by { |_, _, y, _| y }
        max_event_y = max_event_y[2]
    end
    (max_event_y || 0) + (messages.size + 1) * fm.height
end
update() click to toggle source
# File lib/roby/gui/chronicle_widget.rb, line 665
def update
    return if @finalization_point
    history_size = events.size
    return if !task.finalization_time && task.history.size == history_size

    last_event = task.last_event
    if !last_event
        @state = :pending
    else
        @state = GUI.task_state_at(task, last_event.time)
        @time_last_event = last_event.time
        if state != :running
            end_time = last_event.time
        end
    end


    if start_time = task.start_time
        @time_first_event = start_time
        @start_point = time_to_pixel * (start_time - base_time)
    end
    if end_time
        @end_point = time_to_pixel * (end_time - base_time)
    end
    if finalization_time = task.finalization_time
        @finalization_point = time_to_pixel * (finalization_time - base_time)
    end

    task.history[history_size..-1].each do |event|
        append_event(event, event_height)
    end
end