aboutsummaryrefslogtreecommitdiff
path: root/qtmips_gui/statictable.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qtmips_gui/statictable.cpp')
-rw-r--r--qtmips_gui/statictable.cpp125
1 files changed, 102 insertions, 23 deletions
diff --git a/qtmips_gui/statictable.cpp b/qtmips_gui/statictable.cpp
index 8686847..fe8a820 100644
--- a/qtmips_gui/statictable.cpp
+++ b/qtmips_gui/statictable.cpp
@@ -3,6 +3,7 @@
#include <qtmipsexception.h>
#include <iostream>
+#include <QLabel>
using namespace std;
StaticTableLayout::StaticTableLayout(QWidget *parent, int margin, int horizontal_big_spacing, int horizontal_small_spacing, int vertical_spacing) : QLayout(parent) {
@@ -29,21 +30,28 @@ bool StaticTableLayout::hasHeightForWidth() const {
}
int StaticTableLayout::heightForWidth(int w) const {
- // TODO cache value
- return layout_height(w);
+ if (cch_heightForWidth.w != w || cch_heightForWidth.count != items.count())
+ cch_heightForWidth.width = layout_height(w);
+ cch_heightForWidth.w = w;
+ cch_heightForWidth.count = items.count();
+ return cch_heightForWidth.width;
}
QSize StaticTableLayout::minimumSize() const {
- QSize s;
+ if (cch_minSize.count == items.size())
+ return cch_minSize.size;
+ cch_minSize.count = items.size();
+
+ cch_minSize.size = QSize();
for (int i = 0; i < items.size(); i++) {
QSize ss;
for (int y = 0; y < items[i].size(); y++) {
- ss = s.expandedTo(items[i][y]->minimumSize() + QSize(shspace, 0));
+ ss = cch_minSize.size.expandedTo(items[i][y]->minimumSize() + QSize(shspace, 0));
}
- s = s.expandedTo(ss - QSize(shspace, 0));
+ cch_minSize.size = cch_minSize.size.expandedTo(ss - QSize(shspace, 0));
}
- s += QSize(2*margin(), 2*margin());
- return s;
+ cch_minSize.size += QSize(2*margin(), 2*margin());
+ return cch_minSize.size;
}
void StaticTableLayout::setGeometry(const QRect &rect) {
@@ -72,13 +80,28 @@ int StaticTableLayout::count() const {
}
void StaticTableLayout::addRow(QList<QWidget*> w) {
- QVector<QLayoutItem*> v;
- for (int i = 0; i < w.size(); i++) {
- addChildWidget(w[i]);
- v.append(new QWidgetItem(w[i]));
+ items.append(list2vec(w));
+}
+
+void StaticTableLayout::insertRow(QList<QWidget*> w, int i) {
+ items.insert(i, list2vec(w));
+}
+
+void StaticTableLayout::removeRow(int i) {
+ for (int y = 0; y < items[i].size(); y++) {
+ delete items[i][y]->widget();
+ delete items[i][y];
}
+ items.remove(i);
+}
- items.append(v);
+void StaticTableLayout::clearRows() {
+ for (int i = 0; i < items.size(); i++)
+ for (int y = 0; y < items[i].size(); y++) {
+ delete items[i][y]->widget();
+ delete items[i][y];
+ }
+ items.clear();
}
void StaticTableLayout::itemRect(QRect &rect, QVector<int> &separators, int i) {
@@ -100,7 +123,6 @@ void StaticTableLayout::itemRect(QRect &rect, QVector<int> &separators, int i) {
x -= bhspace/2;
int y = top + (row * (row_height + vspace));
-
int width = 0;
for (int t = 0; t < row_widths[col].size(); t++) {
width += row_widths[col][t] + shspace;
@@ -117,14 +139,32 @@ int StaticTableLayout::columns() {
return row_widths.size();
}
+int StaticTableLayout::real_row_height() {
+ return row_height + vspace;
+}
+
int StaticTableLayout::layout_count_approx(const QRect &rect) const {
if (items.size() <= 0)
return 1;
+ // Note: for some reason (probably optimalisation) when qlabel is not visible it reports 0 size. So we have to found at least one that is visible
+ int vis = 0;
+ while (items[vis].size() <= 0 || !items[vis][0]->widget()->isVisible()) {
+ vis++;
+ if (vis >= items.size())
+ return 1; // If non is visible then just say that it has to be single column
+ }
+
int w = 0;
- for (int i = 0; i < items[0].size(); i++)
- w += items[0][i]->sizeHint().width() + shspace;
+ for (int i = 0; i < items[vis].size(); i++)
+ w += items[vis][i]->sizeHint().width() + shspace;
w -= shspace; // subtract lastest spacing
int width = rect.right() / w; // Note: this always rounds down so this always founds maximal possible count
+
+ cout << "ST: widht:" << rect.right() << " row_w" << w << " so count:" << width << " we have:" << items.count() << " In 0:" << items[vis].count() << " contains:";
+ for (int i = 0; i < items[0].size(); i++)
+ cout << ((QLabel*)items[0][i]->widget())->text().toStdString() << " ";
+ cout << endl;
+
return width <= 0 ? 1 : width; // We have to fit at least one column
}
@@ -164,22 +204,24 @@ void StaticTableLayout::layout_parms(QRect &rect, int &row_h, QList<QList<int>>
// Firt let's do orientation count only on first line
count = layout_count_approx(rect);
- if (layout_size(row_h, row_w, count) > rect.right()) {
+ while (layout_size(row_h, row_w, count) > rect.right() && count > 1) {
// Not using orientation count go down if we can't fit (if we can then just be happy with what we have)
- do {
- if (count <= 1)
- // TODO meaby warning?
- break; // We can't fit it but ignore that.
- count--;
- } while (layout_size(row_h, row_w, count) <= rect.width());
+ count--;
}
}
void StaticTableLayout::do_layout(const QRect &rect) {
+ if (cch_do_layout.size == rect.size() && cch_do_layout.count == items.size())
+ // No effective change so don't do layout
+ return;
+ cch_do_layout.size = rect.size();
+ cch_do_layout.count = items.size();
+
int row_h;
QList<QList<int>> row_w;
int count;
+ cout << "Doing layout" << endl;
QRect reff(rect);
layout_parms(reff, row_h, row_w, count);
@@ -202,6 +244,7 @@ void StaticTableLayout::do_layout(const QRect &rect) {
}
int StaticTableLayout::layout_height(int width) const {
+ cout << "Quering height" << endl;
QRect reff(0, 0, width, 0);
int row_h;
QList<QList<int>> row_w;
@@ -211,15 +254,51 @@ int StaticTableLayout::layout_height(int width) const {
return (row_h + vspace) * (items.size() / count);
}
+QVector<QLayoutItem*> StaticTableLayout::list2vec(QList<QWidget*> w) {
+ QVector<QLayoutItem*> v;
+ for (int i = 0; i < w.size(); i++) {
+ addChildWidget(w[i]);
+ v.append(new QWidgetItem(w[i]));
+ }
+ return v;
+}
+
StaticTable::StaticTable(QWidget *parent) : QWidget(parent), layout(this) {
setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
}
+int StaticTable::count() {
+ return layout.count();
+}
+
void StaticTable::addRow(QList<QWidget*> w) {
layout.addRow(w);
}
+void StaticTable::insertRow(QList<QWidget*> w, int i) {
+ layout.insertRow(w, i);
+}
+
+void StaticTable::removeRow(int i) {
+ layout.removeRow(i);
+}
+
+void StaticTable::clearRows() {
+ layout.clearRows();
+}
+
+int StaticTable::columns() {
+ return qMax(layout.columns(), 1);
+}
+
+int StaticTable::row_size() {
+ return layout.real_row_height();
+}
+
void StaticTable::paintEvent(QPaintEvent*) {
+ if (layout.columns() <= 0) // Don't paint unless we have at least one column
+ return;
+
QPainter p(this);
p.setPen(QPen(QColor(200, 200, 200)));
@@ -232,7 +311,7 @@ void StaticTable::paintEvent(QPaintEvent*) {
if ((col % 2) == (row % 2))
p.setBrush(QBrush(QColor(255, 255, 255)));
else
- p.setBrush(QBrush(QColor(230, 230, 230)));
+ p.setBrush(QBrush(QColor(235, 235, 235)));
layout.itemRect(rect, separators, i);