blob: 512536f032cec7ee477977095da379b6585913e6 [file] [log] [blame]
// Copyright 2018 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "tools/render/table.h"
namespace quic_trace {
namespace render {
Table::Table(const ProgramState* state,
TextRenderer* text_factory,
RectangleRenderer* rectangles)
: state_(state), text_renderer_(text_factory), rectangles_(rectangles) {}
void Table::AddHeader(const std::string& text) {
rows_.push_back(Row{/*.header=*/text_renderer_->RenderTextBold(text),
/*.label=*/nullptr,
/*.value=*/nullptr});
}
void Table::AddRow(const std::string& label, const std::string& value) {
rows_.push_back(Row{
/*.header=*/nullptr,
/*.label=*/text_renderer_->RenderTextBold(label),
/*.value=*/text_renderer_->RenderText(value),
});
}
vec2 Table::Layout() {
spacing_ = state_->ScaleForDpi(8);
int y_offset = 0;
width_ = height_ = 0;
for (Row& row : rows_) {
int row_width = 2 * spacing_;
int row_height = spacing_;
if (row.header != nullptr) {
row_width += row.header->width();
row_height += row.header->height();
// Add extra margin for all headers except the first one.
if (y_offset > 0) {
y_offset += spacing_ / 2;
}
} else {
// A label-value combination
row_width += row.label->width() + spacing_ + row.value->width();
row_height += std::max(row.label->height(), row.value->height());
}
width_ = std::max(row_width, width_);
row.y_offset = y_offset;
row.height = row_height;
y_offset += row_height;
}
height_ = y_offset + spacing_;
return vec2(width_, height_);
}
void Table::Draw(vec2 position) {
vec2 base_offset = position + vec2(spacing_, spacing_);
rectangles_->AddRectangleWithBorder(Box{position, vec2(width_, height_)},
0xffffffff);
for (const Row& row : rows_) {
vec2 row_offset =
base_offset + vec2(0, height_ - row.y_offset - row.height - spacing_);
if (row.header != nullptr) {
row_offset += vec2((width_ - spacing_ * 2 - row.header->width()) / 2, 0);
text_renderer_->AddText(row.header, row_offset.x, row_offset.y);
} else {
text_renderer_->AddText(row.label, row_offset.x, row_offset.y);
text_renderer_->AddText(row.value,
row_offset.x + row.label->width() + spacing_,
row_offset.y);
}
}
}
} // namespace render
} // namespace quic_trace