processColumns() {
    let columns = this._columns;
    let prevLeft, prevWidth;
    columns = columns.map(({ id, name, width, visible }, index) => {
      let last = this._columns[this._columns.length - 1];
      let left = 0;
      if (index > 0) {
        left = prevWidth + prevLeft;
      }
      let maxWidth = width + last.width - this.minWidth;
      prevLeft = left;
      prevWidth = width;
      return { id, name, width, left, maxWidth, visible };
    });
    this.saveVisibility();
    this.saveWidths();
    set(this, 'columns', columns);
  }
Calculates the columns' left positions and maximum width.
The maximum width of one column depends on the columns
positioned after that column.

This method also saves all visibility and width settings.

@method processColumns