Widget tableRowFor()

in packages/devtools_app/lib/src/shared/table.dart [1335:1462]


  Widget tableRowFor(BuildContext context, {VoidCallback onPressed}) {
    Widget columnFor(ColumnData<T> column, double columnWidth) {
      Widget content;
      final node = widget.node;
      if (node == null) {
        final isSortColumn = column == widget.sortColumn;

        final title = Text(
          column.title,
          overflow: TextOverflow.ellipsis,
        );

        content = InkWell(
          canRequestFocus: false,
          onTap: () => _handleSortChange(
            column,
            secondarySortColumn: widget.secondarySortColumn,
          ),
          child: Row(
            mainAxisAlignment: _mainAxisAlignmentFor(column),
            children: [
              if (isSortColumn)
                Icon(
                  widget.sortDirection == SortDirection.ascending
                      ? Icons.expand_less
                      : Icons.expand_more,
                  size: defaultIconSize,
                ),
              if (isSortColumn) const SizedBox(width: densePadding),
              // TODO: This Flexible wrapper was added to get the
              // network_profiler_test.dart tests to pass.
              Flexible(
                child: column.titleTooltip != null
                    ? DevToolsTooltip(
                        message: column.titleTooltip,
                        padding: const EdgeInsets.all(denseSpacing),
                        child: title,
                      )
                    : title,
              ),
            ],
          ),
        );
      } else {
        final padding = column.getNodeIndentPx(node);
        assert(padding >= 0);

        if (column is ColumnRenderer) {
          content = (column as ColumnRenderer).build(
            context,
            node,
            isRowSelected: widget.isSelected,
            onPressed: onPressed,
          );
        }
        content ??= Text(
          column.getDisplayValue(node),
          overflow: TextOverflow.ellipsis,
          style: contentTextStyle(column),
          maxLines: 1,
        );

        final tooltip = column.getTooltip(node);
        if (tooltip != null && tooltip is String && tooltip.isNotEmpty) {
          content = DevToolsTooltip(
            message: tooltip,
            waitDuration: tooltipWaitLong,
            child: content,
          );
        }

        if (column == widget.expandableColumn) {
          final expandIndicator = widget.isExpandable
              ? RotationTransition(
                  turns: expandArrowAnimation,
                  child: Icon(
                    Icons.expand_more,
                    color: widget.isSelected
                        ? defaultSelectionForegroundColor
                        : null,
                    size: defaultIconSize,
                  ),
                )
              : SizedBox(width: defaultIconSize, height: defaultIconSize);
          content = Row(
            mainAxisSize: MainAxisSize.min,
            children: [
              expandIndicator,
              Expanded(child: content),
            ],
          );
        }
        content = Padding(
          padding: EdgeInsets.only(left: padding),
          child: ClipRect(
            child: content,
          ),
        );
      }

      content = SizedBox(
        width: columnWidth,
        child: Align(
          alignment: _alignmentFor(column),
          child: content,
        ),
      );
      return content;
    }

    return Padding(
      padding: const EdgeInsets.symmetric(horizontal: defaultSpacing),
      child: ListView.builder(
        scrollDirection: Axis.horizontal,
        controller: scrollController,
        itemCount: widget.columns.length + widget.numSpacers,
        itemBuilder: (context, int i) {
          if (i % 2 == 1) {
            return const SizedBox(width: defaultSpacing);
          }
          return columnFor(
            widget.columns[i ~/ 2],
            widget.columnWidths[i ~/ 2],
          );
        },
      ),
    );
  }