//Copyright 2017 Ryan Wick
//This file is part of Bandage
//Bandage is free software: you can redistribute it and/or modify
//it under the terms of the GNU General Public License as published by
//the Free Software Foundation, either version 3 of the License, or
//(at your option) any later version.
//Bandage is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU General Public License for more details.
//You should have received a copy of the GNU General Public License
//along with Bandage. If not, see .
#include "mytablewidget.h"
#include
#include
#include
#include
#include
#include
MyTableWidget::MyTableWidget(QWidget * parent) :
QTableWidget(parent), m_smallFirstColumn(false), m_smallSecondColumn(false)
{
verticalHeader()->hide();
horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
}
void MyTableWidget::resizeColumns()
{
//If sorting is enabled, the columns are given way too much space.
setSortingEnabled(false);
resizeColumnsToContents();
setSortingEnabled(true);
//For some table widgets, we set the first column to a minimum size, as it
//will hold the colour for both queries and hits.
int minColumnWidth = horizontalHeader()->minimumSectionSize();
if (m_smallFirstColumn)
horizontalHeader()->resizeSection(0, minColumnWidth);
std::vector columnWidths;
int oldTotalColumnWidth = 0;
for (int i = 0; i < columnCount(); ++i)
{
int columnWidth = horizontalHeader()->sectionSize(i);
columnWidths.push_back(columnWidth);
oldTotalColumnWidth += columnWidth;
}
//If the total column width exceeds the size of the table, just leave things alone.
int tableWidth = viewport()->width();
if (oldTotalColumnWidth > tableWidth)
return;
//If the code got here, then there is width to spare in the table. Resize each column
//(except for the first) to take up the whole width, keeping their relative size.
int newTotalColumnWidth = 0.0;
int startingColumn = 0;
if (m_smallFirstColumn)
{
startingColumn = 1;
newTotalColumnWidth += horizontalHeader()->sectionSize(0);
}
if (m_smallSecondColumn)
{
startingColumn = 2;
newTotalColumnWidth += horizontalHeader()->sectionSize(1);
}
for (int i = startingColumn; i < columnCount() - 1; ++i)
{
int oldColumnWidth = columnWidths[i];
double fraction = double(oldColumnWidth) / oldTotalColumnWidth;
int newColumnWidth = fraction * tableWidth;
newTotalColumnWidth += newColumnWidth;
horizontalHeader()->resizeSection(i, newColumnWidth);
}
int lastColumnWidth = tableWidth - newTotalColumnWidth;
horizontalHeader()->resizeSection(columnCount() - 1, lastColumnWidth);
}
void MyTableWidget::showEvent(QShowEvent * event)
{
QTableWidget::showEvent(event);
resizeColumns();
}
//http://stackoverflow.com/questions/3135737/copying-part-of-qtableview
void MyTableWidget::keyPressEvent(QKeyEvent* event)
{
//If Ctrl-C typed (Command-C on Mac)
if (event->key() == Qt::Key_C && (event->modifiers() & Qt::ControlModifier))
{
QModelIndexList cells = selectedIndexes();
std::sort(cells.begin(), cells.end()); // Necessary, otherwise they are in column order
QString text;
int currentRow = 0; // To determine when to insert newlines
foreach (const QModelIndex& cell, cells) {
if (text.length() == 0) {
// First item
} else if (cell.row() != currentRow) {
// New row
text += '\n';
} else {
// Next cell
text += '\t';
}
currentRow = cell.row();
text += cell.data().toString();
}
QApplication::clipboard()->setText(text);
}
}