lib/ruby_jard/screen.rb in ruby_jard-0.2.0 vs lib/ruby_jard/screen.rb in ruby_jard-0.2.1

- old
+ new

@@ -4,136 +4,41 @@ ## # A screen is a unit of information drawing on the terminal. Each screen is # generated based on input layout specifiation, screen data, and top-left # corner cordination. class Screen - attr_accessor :output, :rows, :width, :height, :x, :y + attr_accessor :layout, :rows, :color_scheme, :window, :cursor, :selected - def initialize(screen_template:, session: nil, width:, height:, x:, y:) + def initialize(session: nil, layout:, color_scheme:) @session = session || RubyJard.current_session - @screen_template = screen_template - @width = width - @height = height - @x = x - @y = y + @layout = layout + @color_scheme = color_scheme + @window = [] + @cursor = nil + @selected = 0 + @rows = [] + @need_to_render = true end - def draw(output) - calculate - drawer = RubyJard::ScreenDrawer.new( - output: output, - screen: self, - x: @x, - y: @y - ) - drawer.draw - end + def move_down; end - def data_size - raise NotImplementedError, "#{self.class} must implement #data_size method" - end + def move_up; end - def data_window - raise NotImplementedError, "#{self.class} must implement #data_window method" - end + def page_up; end - def calculate - @rows = [] - row_template = @screen_template.row_template - @rows = data_window.map.with_index do |data_row, index| - create_row(row_template, data_row, index) - end - column_widths = calculate_column_widths(row_template, @rows) - fill_column_widths(@rows, column_widths) - end + def page_down; end - private + def click(relative_x, relative_y); end - def calculate_column_widths(row_template, rows) - column_widths = {} - ideal_column_width = @width / row_template.columns.length - row_template.columns.each_with_index do |_column_template, column_index| - column_widths[column_index] ||= 0 - rows.each do |row| - column = row.columns[column_index] - if column.content_length > ideal_column_width - column_widths[column_index] = nil - break - elsif column.content_length > column_widths[column_index] - column_widths[column_index] = column.content_length - end - end - end - column_widths + def build + raise NotImplementedError, "#{self.class} should implement this method." end - def fill_column_widths(rows, column_widths) - fixed_count = column_widths.length - fixed_width = column_widths.values.inject(0) do |sum, col| - col.nil? ? sum : sum + col - end - - rows.each do |row| - total_width = 0 - row.columns.each_with_index do |column, column_index| - column.width = - if column_index == row.columns.length - 1 - @width - total_width - elsif column_widths[column_index].nil? - (@width - fixed_width) / fixed_count - else - column_widths[column_index] - end - total_width += column.width - end - end + def need_to_render? + @need_to_render == true end - def create_row(row_template, data_row, index) - row = Row.new(row_template: row_template) - row.columns = row_template.columns.map do |column_template| - create_column(column_template, data_row, index) - end - row - end - - def create_column(column_template, data_row, index) - column = Column.new(column_template: column_template) - column.spans = column_template.spans.map do |span_template| - create_span(span_template, data_row, index) - end.flatten - column.content_length = - column.spans.map(&:content_length).inject(&:+) + - column.margin_left + - column.margin_right - column - end - - def create_span(span_template, data_row, index) - span = Span.new(span_template: span_template) - span_content_method = "span_#{span_template.name}".to_sym - - if respond_to?(span_content_method) - content, styles = send(span_content_method, data_row, index) - if content.nil? - span.content = '' - span.content_length = 0 - elsif content.is_a?(Array) - content.each do |sub_span| - sub_span.styles += Array(styles).flatten.compact - end - return content - else - content = ' ' * span_template.margin_left + content if span_template.margin_left - content += ' ' * span_template.margin_right if span_template.margin_right - span.content = content - span.styles = Array(styles).flatten.compact - span.content_length = span.content.length - end - else - raise NotImplementedError, "#{self.class} must implement #{span_content_method} method" - end - - span + def mark_rendered! + @need_to_render = false end end end