code format

This commit is contained in:
2022-12-14 14:14:33 +03:00
parent 09e5342956
commit cdb02fc9be
278 changed files with 15371 additions and 12176 deletions

View File

@@ -1,29 +1,37 @@
#include "sql_table_widget.h"
#include "qad_types.h"
#include "ui_sql_table_widget.h"
#include <QApplication>
#include <QFile>
#include <QTextStream>
#include <QFileInfo>
#include <QItemDelegate>
#include <QApplication>
#include "qad_types.h"
#include <QTextStream>
QString SQLTableWidget::_dir;
ColumnProperties::ColumnProperties(const QString & table_, const QString & type_, const QString & name_, const QString & def_, bool auto_, bool prim_, bool option_) {
visible = true;
table = table_;
name = name_;
def = def_;
ColumnProperties::ColumnProperties(const QString & table_,
const QString & type_,
const QString & name_,
const QString & def_,
bool auto_,
bool prim_,
bool option_) {
visible = true;
table = table_;
name = name_;
def = def_;
auto_increment = auto_;
primary = prim_;
optional = option_;
primary = prim_;
optional = option_;
int bs = type_.indexOf("("), bf = type_.indexOf(")");
size = type_.mid(bs + 1, bf - bs - 1).toInt();
size = type_.mid(bs + 1, bf - bs - 1).toInt();
key_column = 0;
type = typeFromString(type_.toLower());
is_text = (type == ColumnProperties::Chars || type == ColumnProperties::Text);
type = typeFromString(type_.toLower());
is_text = (type == ColumnProperties::Chars || type == ColumnProperties::Text);
}
@@ -33,19 +41,17 @@ ColumnProperties::DataType ColumnProperties::typeFromString(const QString & n) {
if (n.indexOf("time") >= 0) return ColumnProperties::Time;
if (n.indexOf("int") >= 0) return ColumnProperties::Int;
if (n.indexOf("char") >= 0) return ColumnProperties::Chars;
if (n.indexOf("dec") >= 0 || n.indexOf("numeric") >= 0 || n.indexOf("real") >= 0 ||
n.indexOf("float") >= 0 || n.indexOf("double") >= 0) return ColumnProperties::Float;
if (n.indexOf("dec") >= 0 || n.indexOf("numeric") >= 0 || n.indexOf("real") >= 0 || n.indexOf("float") >= 0 || n.indexOf("double") >= 0)
return ColumnProperties::Float;
if (n.indexOf("text") >= 0) return ColumnProperties::Text;
if (n.indexOf("blob") >= 0) return ColumnProperties::Binary;
return ColumnProperties::Unknown;
}
QVariant SQLQueryModel::data(const QModelIndex & item, int role) const {
QVariant var = QSqlQueryModel::data(item, role);
//QVariant::Type t = var.type();
// QVariant::Type t = var.type();
/*if (t == QVariant::Date) return var.toDate().toString("dd.MM.yyyy");
if (t == QVariant::Time) return var.toTime().toString("hh:mm:ss");
if (t == QVariant::DateTime) return var.toDateTime().toString("dd.MM.yyyy hh:mm:ss");*/
@@ -53,25 +59,23 @@ QVariant SQLQueryModel::data(const QModelIndex & item, int role) const {
}
bool SQLQueryModel::setData(const QModelIndex& index, const QVariant & value, int role) {
bool SQLQueryModel::setData(const QModelIndex & index, const QVariant & value, int role) {
if (value.isValid() && role == Qt::EditRole) {
QSqlQuery q(QSqlDatabase::database(conn_name));
int col = mapColumn(index.column());
int col = mapColumn(index.column());
ColumnProperties::DataType t = column_props[col].type;
bool quotes = (t == ColumnProperties::Chars || t == ColumnProperties::Text ||
t == ColumnProperties::Date || t == ColumnProperties::Time ||
t == ColumnProperties::ColumnProperties::DateTime);
QString val = value.toString();
bool quotes = (t == ColumnProperties::Chars || t == ColumnProperties::Text || t == ColumnProperties::Date ||
t == ColumnProperties::Time || t == ColumnProperties::ColumnProperties::DateTime);
QString val = value.toString();
if (t == ColumnProperties::Date) val = value.toDate().toString("yyyy-MM-dd");
if (t == ColumnProperties::Time) val = value.toTime().toString("hh:mm:ss");
if (t == ColumnProperties::DateTime) val = value.toDateTime().toString("yyyy-MM-dd hh:mm:ss");
if (!q.exec("UPDATE " + table_ + " SET " + column_props[col].name + "=" +
(quotes ? "'" : "") + val + (quotes ? "'" : "") +
" WHERE " + column_props[0].name + "=" + record(index.row()).value(0).toString() + ";")) {
if (!q.exec("UPDATE " + table_ + " SET " + column_props[col].name + "=" + (quotes ? "'" : "") + val + (quotes ? "'" : "") +
" WHERE " + column_props[0].name + "=" + record(index.row()).value(0).toString() + ";")) {
qDebug() << "[UPDATE]" << q.lastQuery() << "Error:" << q.lastError();
return false;
}
//qDebug() << "[UPDATE]" << q.lastQuery();
// qDebug() << "[UPDATE]" << q.lastQuery();
dataChanged(index, index);
updateTable(true);
emit tableChanged();
@@ -81,19 +85,34 @@ bool SQLQueryModel::setData(const QModelIndex& index, const QVariant & value, in
}
SQLUniEdit::SQLUniEdit(const ColumnProperties & prop, const QString & conn_name, QWidget * parent): QWidget(parent), prop_(prop), connection_name(conn_name) {
wtext = 0; wint = 0; wfloat = 0; wdate = 0; wtime = 0; wdatetime = 0; wrelation = 0;
SQLUniEdit::SQLUniEdit(const ColumnProperties & prop, const QString & conn_name, QWidget * parent)
: QWidget(parent)
, prop_(prop)
, connection_name(conn_name) {
wtext = 0;
wint = 0;
wfloat = 0;
wdate = 0;
wtime = 0;
wdatetime = 0;
wrelation = 0;
setProp(prop_);
w_ << (QWidget **)&wtext << (QWidget **)&wint << (QWidget **)&wfloat << (QWidget **)&wdate << (QWidget **)&wtime << (QWidget **)&wdatetime << (QWidget **)&wrelation;
w_ << (QWidget **)&wtext << (QWidget **)&wint << (QWidget **)&wfloat << (QWidget **)&wdate << (QWidget **)&wtime
<< (QWidget **)&wdatetime << (QWidget **)&wrelation;
}
void SQLUniEdit::setProp(const ColumnProperties & p) {
for (int i = 0; i < w_.size(); ++i) deleteW(*w_[i]);
wtext = 0; wint = 0; wfloat = 0; wdate = 0; wtime = 0; wdatetime = 0; wrelation = 0;
prop_ = p;
for (int i = 0; i < w_.size(); ++i)
deleteW(*w_[i]);
wtext = 0;
wint = 0;
wfloat = 0;
wdate = 0;
wtime = 0;
wdatetime = 0;
wrelation = 0;
prop_ = p;
if (prop_.isRelation()) {
wrelation = new QComboBox(this);
wrelation->installEventFilter(this);
@@ -103,15 +122,44 @@ void SQLUniEdit::setProp(const ColumnProperties & p) {
} else {
ColumnProperties::DataType t = prop_.getType();
switch (t) {
case ColumnProperties::Int: wint = new QSpinBox(this); wint->setRange(-0x7FFFFFFF, 0x7FFFFFFF); connect(wint, SIGNAL(valueChanged(int)), this, SLOT(value_int(int))); break;
case ColumnProperties::Float: wfloat = new QDoubleSpinBox(this); wfloat->setRange(-1E+300, 1E+300); wfloat->setDecimals(2); connect(wfloat, SIGNAL(valueChanged(double)), this, SLOT(value_float(double))); break;
case ColumnProperties::Date: wdate = new QDateEdit(this); wdate->setDisplayFormat("dd.MM.yyyy"); wdate->setCalendarPopup(true); wdate->setDate(QDate::currentDate()); connect(wdate, SIGNAL(dateChanged(QDate)), this, SLOT(value_date(QDate))); break;
case ColumnProperties::Time: wtime = new QTimeEdit(this); wtime->setDisplayFormat("hh:mm:ss"); wtime->setTime(QTime::currentTime()); connect(wtime, SIGNAL(timeChanged(QTime)), this, SLOT(value_time(QTime))); break;
case ColumnProperties::DateTime: wdatetime = new QDateTimeEdit(this); wdatetime->setDisplayFormat("dd.MM.yyyy hh:mm:ss"); wdatetime->setCalendarPopup(true); wdatetime->setDateTime(QDateTime::currentDateTime()); connect(wdatetime, SIGNAL(dateTimeChanged(QDateTime)), this, SLOT(value_datetime(QDateTime))); break;
case ColumnProperties::Int:
wint = new QSpinBox(this);
wint->setRange(-0x7FFFFFFF, 0x7FFFFFFF);
connect(wint, SIGNAL(valueChanged(int)), this, SLOT(value_int(int)));
break;
case ColumnProperties::Float:
wfloat = new QDoubleSpinBox(this);
wfloat->setRange(-1E+300, 1E+300);
wfloat->setDecimals(2);
connect(wfloat, SIGNAL(valueChanged(double)), this, SLOT(value_float(double)));
break;
case ColumnProperties::Date:
wdate = new QDateEdit(this);
wdate->setDisplayFormat("dd.MM.yyyy");
wdate->setCalendarPopup(true);
wdate->setDate(QDate::currentDate());
connect(wdate, SIGNAL(dateChanged(QDate)), this, SLOT(value_date(QDate)));
break;
case ColumnProperties::Time:
wtime = new QTimeEdit(this);
wtime->setDisplayFormat("hh:mm:ss");
wtime->setTime(QTime::currentTime());
connect(wtime, SIGNAL(timeChanged(QTime)), this, SLOT(value_time(QTime)));
break;
case ColumnProperties::DateTime:
wdatetime = new QDateTimeEdit(this);
wdatetime->setDisplayFormat("dd.MM.yyyy hh:mm:ss");
wdatetime->setCalendarPopup(true);
wdatetime->setDateTime(QDateTime::currentDateTime());
connect(wdatetime, SIGNAL(dateTimeChanged(QDateTime)), this, SLOT(value_datetime(QDateTime)));
break;
case ColumnProperties::Chars:
case ColumnProperties::Text:
case ColumnProperties::Unknown:
default: wtext = new QLineEdit(this); connect(wtext, SIGNAL(textChanged(QString)), this, SLOT(value_text(QString))); break;
default:
wtext = new QLineEdit(this);
connect(wtext, SIGNAL(textChanged(QString)), this, SLOT(value_text(QString)));
break;
}
}
for (int i = 0; i < w_.size(); ++i)
@@ -123,9 +171,8 @@ void SQLUniEdit::setProp(const ColumnProperties & p) {
QString SQLUniEdit::value(bool for_insert) {
QString ret;
ColumnProperties::DataType t = (for_insert ? prop_.type : prop_.getType());
bool quotes = (t == ColumnProperties::Chars || t == ColumnProperties::Text ||
t == ColumnProperties::Date || t == ColumnProperties::Time ||
t == ColumnProperties::ColumnProperties::DateTime);
bool quotes = (t == ColumnProperties::Chars || t == ColumnProperties::Text || t == ColumnProperties::Date ||
t == ColumnProperties::Time || t == ColumnProperties::ColumnProperties::DateTime);
if (quotes) ret = "'";
if (prop_.isRelation())
if (for_insert)
@@ -133,15 +180,20 @@ QString SQLUniEdit::value(bool for_insert) {
else
ret += wrelation->currentText();
else {
if (wint != 0) ret += QString::number(wint->value());
if (wint != 0)
ret += QString::number(wint->value());
else {
if (wfloat != 0) ret += QString::number(wfloat->value());
if (wfloat != 0)
ret += QString::number(wfloat->value());
else {
if (wdate != 0) ret += wdate->date().toString("yyyy-MM-dd");
if (wdate != 0)
ret += wdate->date().toString("yyyy-MM-dd");
else {
if (wtime != 0) ret += wtime->time().toString("hh:mm:ss");
if (wtime != 0)
ret += wtime->time().toString("hh:mm:ss");
else {
if (wdatetime != 0) ret += wdatetime->dateTime().toString("yyyy-MM-dd hh:mm:ss");
if (wdatetime != 0)
ret += wdatetime->dateTime().toString("yyyy-MM-dd hh:mm:ss");
else {
ret += wtext->text();
}
@@ -157,23 +209,27 @@ QString SQLUniEdit::value(bool for_insert) {
bool SQLUniEdit::eventFilter(QObject * o, QEvent * e) {
if (e->type() == QEvent::MouseButtonPress)
updateRelation();
if (e->type() == QEvent::MouseButtonPress) updateRelation();
return QWidget::eventFilter(o, e);
}
void SQLUniEdit::setValue(const QVariant & value) {
if (prop_.isRelation()) return;
if (wint != 0) wint->setValue(value.toInt());
if (wint != 0)
wint->setValue(value.toInt());
else {
if (wfloat != 0) wfloat->setValue(value.toDouble());
if (wfloat != 0)
wfloat->setValue(value.toDouble());
else {
if (wdate != 0) wdate->setDate(value.toDate());
if (wdate != 0)
wdate->setDate(value.toDate());
else {
if (wtime != 0) wtime->setTime(value.toTime());
if (wtime != 0)
wtime->setTime(value.toTime());
else {
if (wdatetime != 0) wdatetime->setDateTime(value.toDateTime());
if (wdatetime != 0)
wdatetime->setDateTime(value.toDateTime());
else {
wtext->setText(value.toString());
}
@@ -181,13 +237,12 @@ void SQLUniEdit::setValue(const QVariant & value) {
}
}
}
}
void SQLUniEdit::updateRelation() {
prop_.relation_list = SQLTableWidget::getColumnValues(prop_.relation_table, prop_.relation_key, prop_.relation_column, connection_name);
int pi = wrelation->currentIndex();
int pi = wrelation->currentIndex();
wrelation->blockSignals(true);
wrelation->clear();
for (int i = 0; i < prop_.relation_list.size(); ++i)
@@ -197,7 +252,6 @@ void SQLUniEdit::updateRelation() {
}
SQLNewEdit::SQLNewEdit(const ColumnProperties & prop, const QString & conn_name, QWidget * parent): QWidget(parent), prop_(prop) {
line = new SQLUniEdit(prop, conn_name);
line->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
@@ -224,14 +278,14 @@ void SQLNewEdit::setProp(const ColumnProperties & p) {
}
SQLFilterEdit::SQLFilterEdit(const ColumnProperties & prop, const QString & conn_name, QWidget * parent): QWidget(parent), prop_(prop) {
line = new SQLUniEdit(prop, conn_name);
line->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
combo = new QComboBox();
combo->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
QStringList sl;
sl << " " << "=" << QString::fromUtf8("") << QString::fromUtf8("") << ">" << QString::fromUtf8("") << "<" << QString::fromUtf8("");
sl << " "
<< "=" << QString::fromUtf8("") << QString::fromUtf8("") << ">" << QString::fromUtf8("") << "<" << QString::fromUtf8("");
combo->addItems(sl);
combo->setCurrentIndex(0);
connect(line, SIGNAL(valueChanged(QVariant)), this, SIGNAL(filterChanged()));
@@ -275,14 +329,17 @@ QString SQLFilterEdit::filter() const {
void SQLFilterEdit::clear() {
line->setValue(QVariant());
combo->setCurrentIndex(0);
}
SQLItemDelegate::SQLItemDelegate(QList<ColumnProperties> & cp, QVector<int> & ci, bool & ro, const QString & conn_name, QObject * parent):
QStyledItemDelegate(parent), column_props(cp), column_indexes(ci), read_only(ro), connection_name(conn_name) {;}
SQLItemDelegate::SQLItemDelegate(QList<ColumnProperties> & cp, QVector<int> & ci, bool & ro, const QString & conn_name, QObject * parent)
: QStyledItemDelegate(parent)
, column_props(cp)
, column_indexes(ci)
, read_only(ro)
, connection_name(conn_name) {
;
}
QWidget * SQLItemDelegate::createEditor(QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index) const {
@@ -290,19 +347,24 @@ QWidget * SQLItemDelegate::createEditor(QWidget * parent, const QStyleOptionView
ColumnProperties & cp(column_props[mapColumn(index.column())]);
if (cp.isRelation()) {
cp.relation_list = SQLTableWidget::getColumnValues(cp.relation_table, cp.relation_key, cp.relation_column, connection_name);
QComboBox * w = new QComboBox(parent);
QComboBox * w = new QComboBox(parent);
w->setGeometry(option.rect);
for (int i = 0; i < cp.relation_list.size(); ++i) {
w->addItem(cp.relation_list[i].second, cp.relation_list[i].first);
if (index.data().toString() == cp.relation_list[i].second)
w->setCurrentIndex(i);
if (index.data().toString() == cp.relation_list[i].second) w->setCurrentIndex(i);
}
return w;
} else {
QWidget * w = QStyledItemDelegate::createEditor(parent, option, index);
if (qobject_cast<QTimeEdit * >(w)) {qobject_cast<QTimeEdit * >(w)->setDisplayFormat("hh:mm:ss");}
else if (qobject_cast<QDateEdit * >(w)) {qobject_cast<QDateEdit * >(w)->setCalendarPopup(true); qobject_cast<QDateEdit * >(w)->setDisplayFormat("dd.MM.yyyy");}
else if (qobject_cast<QDateTimeEdit * >(w)) {qobject_cast<QDateTimeEdit * >(w)->setCalendarPopup(true); qobject_cast<QDateTimeEdit * >(w)->setDisplayFormat("dd.MM.yyyy hh:mm:ss");}
if (qobject_cast<QTimeEdit *>(w)) {
qobject_cast<QTimeEdit *>(w)->setDisplayFormat("hh:mm:ss");
} else if (qobject_cast<QDateEdit *>(w)) {
qobject_cast<QDateEdit *>(w)->setCalendarPopup(true);
qobject_cast<QDateEdit *>(w)->setDisplayFormat("dd.MM.yyyy");
} else if (qobject_cast<QDateTimeEdit *>(w)) {
qobject_cast<QDateTimeEdit *>(w)->setCalendarPopup(true);
qobject_cast<QDateTimeEdit *>(w)->setDisplayFormat("dd.MM.yyyy hh:mm:ss");
}
return w;
}
return 0;
@@ -319,20 +381,19 @@ QString SQLItemDelegate::displayText(const QVariant & value, const QLocale & loc
void SQLItemDelegate::setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const {
if (qobject_cast<QComboBox * >(editor)) {
model->setData(index, qobject_cast<QComboBox * >(editor)->itemData(qobject_cast<QComboBox * >(editor)->currentIndex()));
if (qobject_cast<QComboBox *>(editor)) {
model->setData(index, qobject_cast<QComboBox *>(editor)->itemData(qobject_cast<QComboBox *>(editor)->currentIndex()));
return;
}
QStyledItemDelegate::setModelData(editor, model, index);
}
SQLTableWidget::SQLTableWidget(QWidget * parent): QWidget(parent), filters_group(this) {
ui = new Ui::SQLTableWidget();
ui->setupUi(this);
model = 0;
timer = 0;
model = 0;
timer = 0;
connection_name = QSqlDatabase::defaultConnection;
filters_active = first_update = debug = true;
table_opened = read_only = false;
@@ -345,30 +406,33 @@ SQLTableWidget::SQLTableWidget(QWidget * parent): QWidget(parent), filters_group
ui->view->setItemDelegate(new SQLItemDelegate(column_props, column_indexes, read_only, connection_name));
ui->view->horizontalHeader()->setItemDelegate(new QItemDelegate());
ui->view->verticalHeader()->setDefaultSectionSize(fontHeight(this) * 1.5);
//qDebug() << view->horizontalHeader()->itemDelegate();
//qDebug() << fontMetrics().elidedText(, Qt::ElideNone, 30, Qt::TextWordWrap);
// qDebug() << view->horizontalHeader()->itemDelegate();
// qDebug() << fontMetrics().elidedText(, Qt::ElideNone, 30, Qt::TextWordWrap);
setTableVisible(false);
connect(ui->view->horizontalHeader(), SIGNAL(sectionResized(int, int, int)), this, SLOT(header_sectionResized(int, int, int)));
connect(ui->view->horizontalHeader(), SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)), this, SLOT(header_sortIndicatorChanged(int, Qt::SortOrder)));
connect(ui->view->horizontalHeader(),
SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)),
this,
SLOT(header_sortIndicatorChanged(int, Qt::SortOrder)));
connect(ui->view->horizontalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(scrolled(int)));
//act_add.setText(tr("Add ..."));
//act_del.setText(tr("Remove selected"));
// act_add.setText(tr("Add ..."));
// act_del.setText(tr("Remove selected"));
action_del = new QAction(QIcon(":/icons/edit-delete.png"), tr("Remove selected"), this);
connect(action_del, SIGNAL(triggered(bool)), this, SLOT(del_triggered()));
popup_menu.addAction(action_del);
ui->actionFilter_AND->setChecked(true);
filters_group.addAction(ui->actionFilter_AND);
filters_group.addAction(ui->actionFilter_OR);
connect(&filters_group, SIGNAL(triggered(QAction * )), this, SLOT(updateTable()));
connect(&filters_group, SIGNAL(triggered(QAction *)), this, SLOT(updateTable()));
popup_filter.addAction(ui->actionFiltersClear);
popup_filter.addSeparator();
popup_filter.addAction(ui->actionFilter_AND);
popup_filter.addAction(ui->actionFilter_OR);
ui->buttonFilterConfig->setMenu(&popup_filter);
//connect(&act_add, SIGNAL(triggered(bool)), this, SLOT(add_triggered()));
//connect(&act_del, SIGNAL(triggered(bool)), this, SLOT(del_triggered()));
// connect(&act_add, SIGNAL(triggered(bool)), this, SLOT(add_triggered()));
// connect(&act_del, SIGNAL(triggered(bool)), this, SLOT(del_triggered()));
}
@@ -381,14 +445,20 @@ SQLTableWidget::~SQLTableWidget() {
bool SQLTableWidget::eventFilter(QObject * o, QEvent * e) {
if (o == ui->view) {
if (e->type() == QEvent::KeyPress) {
QKeyEvent * ke = (QKeyEvent * )e;
if (ke->key() == Qt::Key_Home) {ui->view->selectRow(0); return true;}
if (ke->key() == Qt::Key_End) {ui->view->selectRow(ui->view->verticalHeader()->count() - 1); return true;}
QKeyEvent * ke = (QKeyEvent *)e;
if (ke->key() == Qt::Key_Home) {
ui->view->selectRow(0);
return true;
}
if (ke->key() == Qt::Key_End) {
ui->view->selectRow(ui->view->verticalHeader()->count() - 1);
return true;
}
}
}
if (o == ui->view->viewport()) {
if (e->type() == QEvent::MouseButtonPress) {
QMouseEvent * me = (QMouseEvent * )e;
QMouseEvent * me = (QMouseEvent *)e;
if (me->button() == Qt::RightButton) {
action_del->setVisible(!read_only);
popup_menu.popup(me->globalPos());
@@ -396,24 +466,24 @@ bool SQLTableWidget::eventFilter(QObject * o, QEvent * e) {
}
}
if (o == ui->view->horizontalHeader()->viewport()) {
QMouseEvent * me = (QMouseEvent * )e;
if (e->type() == QEvent::MouseButtonPress)
pp = me->pos();
QMouseEvent * me = (QMouseEvent *)e;
if (e->type() == QEvent::MouseButtonPress) pp = me->pos();
if (e->type() == QEvent::MouseButtonRelease) {
if ((me->pos() - pp).manhattanLength() < QApplication::startDragDistance()) {
if (me->button() == Qt::LeftButton) {
int ci = ui->view->horizontalHeader()->logicalIndexAt(me->pos()),
ri = ui->view->horizontalHeader()->logicalIndexAt(me->pos() + QPoint(3, 0)),
li = ui->view->horizontalHeader()->logicalIndexAt(me->pos() - QPoint(3, 0));
//qDebug() << ci << ri << li;
if ((ci < 0) || (ci >= ui->view->horizontalHeader()->count()) || (ci != ri) || (ci != li) || (tm.elapsed() <= QApplication::doubleClickInterval())) {
ri = ui->view->horizontalHeader()->logicalIndexAt(me->pos() + QPoint(3, 0)),
li = ui->view->horizontalHeader()->logicalIndexAt(me->pos() - QPoint(3, 0));
// qDebug() << ci << ri << li;
if ((ci < 0) || (ci >= ui->view->horizontalHeader()->count()) || (ci != ri) || (ci != li) ||
(tm.elapsed() <= QApplication::doubleClickInterval())) {
tm.restart();
return QObject::eventFilter(o, e);
}
tm.restart();
Qt::SortOrder o = Qt::AscendingOrder;
if (ui->view->horizontalHeader()->sortIndicatorSection() == ci &&
ui->view->horizontalHeader()->sortIndicatorOrder() == Qt::AscendingOrder)
ui->view->horizontalHeader()->sortIndicatorOrder() == Qt::AscendingOrder)
o = Qt::DescendingOrder;
ui->view->horizontalHeader()->setSortIndicator(ci, o);
return true;
@@ -422,7 +492,7 @@ bool SQLTableWidget::eventFilter(QObject * o, QEvent * e) {
popup_col.clear();
for (int i = 0; i < column_props.size(); ++i) {
QPair<QString, QString> ctr = trColumn(column_props[i].name);
QAction * a = popup_col.addAction(ctr.first, this, SLOT(column_triggered(bool)));
QAction * a = popup_col.addAction(ctr.first, this, SLOT(column_triggered(bool)));
a->setToolTip(ctr.second);
a->setCheckable(true);
a->setChecked(column_props[i].visible);
@@ -431,14 +501,15 @@ bool SQLTableWidget::eventFilter(QObject * o, QEvent * e) {
popup_col.popup(me->globalPos());
return true;
}
} else return true;
} else
return true;
}
}
return QWidget::eventFilter(o, e);
}
void SQLTableWidget::timerEvent(QTimerEvent * ) {
void SQLTableWidget::timerEvent(QTimerEvent *) {
setTableName(table_);
}
@@ -446,12 +517,11 @@ void SQLTableWidget::timerEvent(QTimerEvent * ) {
void SQLTableWidget::changeEvent(QEvent * e) {
QWidget::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
action_del->setText(tr("Remove selected"));
break;
default:
break;
case QEvent::LanguageChange:
ui->retranslateUi(this);
action_del->setText(tr("Remove selected"));
break;
default: break;
}
}
@@ -461,7 +531,7 @@ void SQLTableWidget::setTableName(const QString & t) {
stopTimer();
table_opened = false;
first_update = true;
table_ = t;
table_ = t;
if (!QSqlDatabase::database(connection_name).isOpen()) {
if (debug) qDebug() << "[setTableName] Database in not opened!";
setTableVisible(false);
@@ -471,15 +541,19 @@ void SQLTableWidget::setTableName(const QString & t) {
model = new SQLQueryModel(table_, connection_name, column_props, column_indexes, this);
connect(model, SIGNAL(updateTable(bool)), this, SLOT(updateTable(bool)));
connect(model, SIGNAL(tableChanged()), this, SIGNAL(tableChanged()));
//model->setTable(table_);
// model->setTable(table_);
cquery = "SELECT * FROM " + table_ + ";";
model->setQuery(cquery, QSqlDatabase::database(connection_name));
ui->view->setModel(model);
connect(ui->view->selectionModel(), SIGNAL(currentRowChanged(QModelIndex, QModelIndex)), this, SIGNAL(selectionChanged()), Qt::UniqueConnection);
connect(ui->view->selectionModel(),
SIGNAL(currentRowChanged(QModelIndex, QModelIndex)),
this,
SIGNAL(selectionChanged()),
Qt::UniqueConnection);
//((QSqlQueryModel * )model)->setQuery(QSqlQuery("SELECT id FROM " + table_ + ";"));
setTableVisible(checkTable());
updateTable();
foreach (const QString & wr, wait_rels) {
foreach(const QString & wr, wait_rels) {
QStringList wrl = wr.split(";");
addRelation(wrl[0], wrl[1], wrl[2], wrl[3]);
}
@@ -492,59 +566,58 @@ void SQLTableWidget::setTableName(const QString & t) {
bool SQLTableWidget::checkTable() {
table_opened = false;
table_opened = false;
QSqlDatabase db = QSqlDatabase::database(connection_name);
if (db.driver() == 0) return false;
bool te = db.tables(QSql::Tables).contains(table_, Qt::CaseInsensitive );
//qDebug() << "tables:" << db.tables(QSql::Tables) << table_ << table_opened;
bool te = db.tables(QSql::Tables).contains(table_, Qt::CaseInsensitive);
// qDebug() << "tables:" << db.tables(QSql::Tables) << table_ << table_opened;
if (!te) {
timer = startTimer(1000);
return false;
}
/*if (!q.exec("SHOW TABLES")) {
qDebug() << "[SHOW TABLES]" << q.lastError();
timer = startTimer(1000);
return false;
qDebug() << "[SHOW TABLES]" << q.lastError();
timer = startTimer(1000);
return false;
}
while (q.next()) {
//qDebug() << q.value(0);
if (q.value(0) == table_)
{table_opened = true; break;}
//qDebug() << q.value(0);
if (q.value(0) == table_)
{table_opened = true; break;}
}
if (!table_opened) {
timer = startTimer(1000);
return false;
timer = startTimer(1000);
return false;
}*/
QSqlRecord header = db.record(table_);
QString pin = db.primaryIndex(table_).fieldName(0);
table_opened = true;
QString pin = db.primaryIndex(table_).fieldName(0);
table_opened = true;
column_props.clear();
for (int i = 0; i < header.count(); ++i) {
QSqlField f = header.field(i);
column_props << ColumnProperties(table_,
f.type() == QVariant::String ? "text" : QVariant::typeToName(f.type()),
f.name(),
f.defaultValue().toString(),
f.isAutoValue(),
f.name() == pin,
f.requiredStatus() == QSqlField::Optional
);
f.type() == QVariant::String ? "text" : QVariant::typeToName(f.type()),
f.name(),
f.defaultValue().toString(),
f.isAutoValue(),
f.name() == pin,
f.requiredStatus() == QSqlField::Optional);
}
/*if (!q.exec("DESCRIBE " + table_ + ";")) {
qDebug() << "[DESCRIBE " + table_ + "]" << q.lastError();
timer = startTimer(1000);
return false;
qDebug() << "[DESCRIBE " + table_ + "]" << q.lastError();
timer = startTimer(1000);
return false;
}
while (q.next()) {
column_props << ColumnProperties(table_,
q.value(1).toString().toLower(),
q.value(0).toString().toLower(),
q.value(4).toString().toLower(),
q.value(5).toString().toLower().indexOf("auto_increment") >= 0,
q.value(3).toString().toLower().indexOf("pri") >= 0);
column_props << ColumnProperties(table_,
q.value(1).toString().toLower(),
q.value(0).toString().toLower(),
q.value(4).toString().toLower(),
q.value(5).toString().toLower().indexOf("auto_increment") >= 0,
q.value(3).toString().toLower().indexOf("pri") >= 0);
}*/
//ui->labelNew->setFixedWidth(qMax<int>(ui->view->verticalHeader()->sizeHint().width() + 2, 16));
//ui->labelFilter->setFixedWidth(qMax<int>(ui->view->verticalHeader()->sizeHint().width() + 2, 16));
// ui->labelNew->setFixedWidth(qMax<int>(ui->view->verticalHeader()->sizeHint().width() + 2, 16));
// ui->labelFilter->setFixedWidth(qMax<int>(ui->view->verticalHeader()->sizeHint().width() + 2, 16));
ui->scrollAreaNew->setFixedHeight(QLineEdit().sizeHint().height() + 2);
ui->scrollAreaFilter->setFixedHeight(QLineEdit().sizeHint().height() + 2);
qDeleteAll(column_news);
@@ -571,7 +644,7 @@ bool SQLTableWidget::checkTable() {
QStringList SQLTableWidget::getTableColumns(const QString & t) {
QStringList ret;
QSqlDatabase db = QSqlDatabase::database(connection_name);
QSqlDatabase db = QSqlDatabase::database(connection_name);
QSqlRecord header = db.record(t);
for (int i = 0; i < header.count(); ++i)
ret << header.field(i).name();
@@ -580,7 +653,7 @@ QStringList SQLTableWidget::getTableColumns(const QString & t) {
QString SQLTableWidget::getColumnType(const QString & t, const QString & c) {
QSqlDatabase db = QSqlDatabase::database(connection_name);
QSqlDatabase db = QSqlDatabase::database(connection_name);
QSqlRecord header = db.record(t);
for (int i = 0; i < header.count(); ++i) {
QSqlField f = header.field(i);
@@ -591,11 +664,11 @@ QString SQLTableWidget::getColumnType(const QString & t, const QString & c) {
}
QList<QPair<QString, QString> > SQLTableWidget::getColumnValues(const QString &t, const QString &k, const QString &c, const QString &conn_name) {
QList<QPair<QString, QString> > ret;
QList<QPair<QString, QString>>
SQLTableWidget::getColumnValues(const QString & t, const QString & k, const QString & c, const QString & conn_name) {
QList<QPair<QString, QString>> ret;
QSqlQuery q(QSqlDatabase::database(conn_name));
if (!q.exec("SELECT " + t + "." + k + "," + t + "." + c + " FROM " + t + ";"))
return ret;
if (!q.exec("SELECT " + t + "." + k + "," + t + "." + c + " FROM " + t + ";")) return ret;
while (q.next())
ret << QPair<QString, QString>(q.value(0).toString(), q.value(1).toString());
return ret;
@@ -604,8 +677,7 @@ QList<QPair<QString, QString> > SQLTableWidget::getColumnValues(const QString &t
QPair<QString, QString> SQLTableWidget::trColumn(const QString & n) {
QPair<QString, QString> ftr = fixed_translates.value(n);
if (!ftr.first.isEmpty())
return ftr;
if (!ftr.first.isEmpty()) return ftr;
QPair<QString, QString> trn = translates.value(n);
if (trn.first.isEmpty()) return QPair<QString, QString>(n, "");
return trn;
@@ -616,42 +688,39 @@ void SQLTableWidget::updateTable(bool save_selection) {
if (!filters_active || !table_opened) return;
int vp = ui->view->verticalScrollBar()->value();
int hp = ui->view->horizontalScrollBar()->value();
//bool focus = view->hasFocus();
// bool focus = view->hasFocus();
QModelIndex csi;
QModelIndexList sl;
if (save_selection) {
csi = ui->view->selectionModel()->currentIndex();
sl = ui->view->selectionModel()->selectedRows();
sl = ui->view->selectionModel()->selectedRows();
}
if (custom_query.isEmpty()) {
QString cr = columnRelations(), cf = columnFilters();
bool where = !cr.isEmpty() || !cf.isEmpty(), and_ = !cr.isEmpty() && !cf.isEmpty();
cquery = "SELECT " + columnNames() + " FROM " + tableNames() +
(where ? " WHERE " : "") + cr + (and_ ? " AND " : "") + cf + " ORDER BY " +
column_props[ui->view->horizontalHeader()->sortIndicatorSection()].fullName() +
(ui->view->horizontalHeader()->sortIndicatorOrder() == Qt::DescendingOrder ? " DESC" : " ASC") + ";";
cquery = "SELECT " + columnNames() + " FROM " + tableNames() + (where ? " WHERE " : "") + cr + (and_ ? " AND " : "") + cf +
" ORDER BY " + column_props[ui->view->horizontalHeader()->sortIndicatorSection()].fullName() +
(ui->view->horizontalHeader()->sortIndicatorOrder() == Qt::DescendingOrder ? " DESC" : " ASC") + ";";
} else
cquery = custom_query;
//qDebug() << cquery;
// qDebug() << cquery;
model->setQuery(cquery, QSqlDatabase::database(connection_name));
if (model->lastError().isValid())
qDebug() << model->lastError();
if (model->lastError().isValid()) qDebug() << model->lastError();
if (first_update) {
ui->view->resizeColumnsToContents();
for (int i = 0; i < ui->view->horizontalHeader()->count(); ++i)
if (ui->view->horizontalHeader()->sectionSize(i) < 100)
ui->view->horizontalHeader()->resizeSection(i, 100);
if (ui->view->horizontalHeader()->sectionSize(i) < 100) ui->view->horizontalHeader()->resizeSection(i, 100);
first_update = false;
}
//ui->labelNew->setFixedWidth(qMax<int>(ui->view->verticalHeader()->sizeHint().width() + 2, 16));
//ui->labelFilter->setFixedWidth(qMax<int>(ui->view->verticalHeader()->sizeHint().width() + 2, 16));
// ui->labelNew->setFixedWidth(qMax<int>(ui->view->verticalHeader()->sizeHint().width() + 2, 16));
// ui->labelFilter->setFixedWidth(qMax<int>(ui->view->verticalHeader()->sizeHint().width() + 2, 16));
ui->layoutNew->invalidate();
if (save_selection) {
QItemSelectionModel * sm = ui->view->selectionModel();
foreach (const QModelIndex & i, sl)
foreach(const QModelIndex & i, sl)
sm->select(i, QItemSelectionModel::Select | QItemSelectionModel::Rows);
sm->setCurrentIndex(csi, QItemSelectionModel::Select);
//ui->view->setFocus();
// ui->view->setFocus();
}
if (custom_query.isEmpty()) {
for (int i = 0; i < model->columnCount(); ++i) {
@@ -663,7 +732,7 @@ void SQLTableWidget::updateTable(bool save_selection) {
if (custom_col_names.isEmpty()) {
QSqlRecord header = model->record();
for (int i = 0; i < header.count(); ++i) {
QSqlField f = header.field(i);
QSqlField f = header.field(i);
QPair<QString, QString> ctr = trColumn(f.name());
model->setHeaderData(i, Qt::Horizontal, ctr.first, Qt::DisplayRole);
model->setHeaderData(i, Qt::Horizontal, ctr.second, Qt::ToolTipRole);
@@ -678,7 +747,7 @@ void SQLTableWidget::updateTable(bool save_selection) {
}
ui->view->verticalScrollBar()->setValue(vp);
ui->view->horizontalScrollBar()->setValue(hp);
//if (focus) view->setFocus();
// if (focus) view->setFocus();
}
@@ -693,10 +762,8 @@ QString SQLTableWidget::tableNames() {
QSet<QString> rtables;
for (int i = 0; i < column_props.size(); ++i) {
ColumnProperties & cp(column_props[i]);
if (!cp.visible || cp.relation_key.isEmpty() || cp.relation_column.isEmpty())
continue;
if (rtables.contains(cp.relation_table))
continue;
if (!cp.visible || cp.relation_key.isEmpty() || cp.relation_column.isEmpty()) continue;
if (rtables.contains(cp.relation_table)) continue;
rtables << cp.relation_table;
ret.append("," + cp.relation_table);
}
@@ -712,14 +779,13 @@ QString SQLTableWidget::columnNames() {
ColumnProperties & cp(column_props[i]);
column_news[i]->setVisible(cp.visible);
column_filters[i]->setVisible(cp.visible);
if (!cp.visible && !cp.primary)
continue;
if (!cp.visible && !cp.primary) continue;
if (!first) ret.append(",");
first = false;
ret.append(cp.fullName());
if (i > 0) column_indexes.push_back(i);
}
//qDebug() << column_indexes;
// qDebug() << column_indexes;
return ret;
}
@@ -728,10 +794,8 @@ QString SQLTableWidget::columnFilters() {
QString ret;
bool and_ = ui->actionFilter_AND->isChecked();
for (int i = 0; i < column_props.size(); ++i) {
if (!column_filters[i]->isVisible() || column_filters[i]->isEmpty())
continue;
if (!ret.isEmpty())
ret.append(and_ ? " AND " : " OR ");
if (!column_filters[i]->isVisible() || column_filters[i]->isEmpty()) continue;
if (!ret.isEmpty()) ret.append(and_ ? " AND " : " OR ");
ret.append(column_filters[i]->filter());
}
if (!ret.isEmpty()) {
@@ -746,10 +810,8 @@ QString SQLTableWidget::columnRelations() {
QString ret;
for (int i = 0; i < column_props.size(); ++i) {
ColumnProperties & cp(column_props[i]);
if (!cp.visible || cp.relation_key.isEmpty() || cp.relation_column.isEmpty())
continue;
if (!ret.isEmpty())
ret.append(" AND ");
if (!cp.visible || cp.relation_key.isEmpty() || cp.relation_column.isEmpty()) continue;
if (!ret.isEmpty()) ret.append(" AND ");
ret.append(table_ + "." + cp.name + "=");
ret.append(cp.relation_table + "." + cp.relation_key);
}
@@ -792,13 +854,13 @@ void SQLTableWidget::on_buttonAdd_clicked() {
emit tableChanged();
} else
qDebug() << q.lastError();
//qDebug() << q.lastQuery();
// qDebug() << q.lastQuery();
}
void SQLTableWidget::on_actionFiltersClear_triggered() {
filters_active = false;
foreach (SQLFilterEdit * l, column_filters)
foreach(SQLFilterEdit * l, column_filters)
l->clear();
filters_active = true;
updateTable();
@@ -814,18 +876,18 @@ void SQLTableWidget::on_view_clicked(const QModelIndex & index) {
void SQLTableWidget::del_triggered() {
QModelIndexList si = ui->view->selectionModel()->selectedIndexes();
QSet<int> ids;
foreach (const QModelIndex & i, si)
foreach(const QModelIndex & i, si)
ids << model->index(i.row(), 0).data().toInt();
if (ids.isEmpty()) return;
QString qs("DELETE FROM " + table_ + " WHERE " + column_props[0].name + " IN (");
bool first = true;
foreach (int i, ids) {
foreach(int i, ids) {
if (!first) qs.append(",");
qs.append(QString::number(i));
first = false;
}
qs.append(");");
//qDebug() << qs; return;
// qDebug() << qs; return;
QSqlQuery q(QSqlDatabase::database(connection_name));
if (q.exec(qs)) {
updateTable();
@@ -842,7 +904,7 @@ void SQLTableWidget::setColumnVisible(int ind, bool visible) {
ui->view->setColumnHidden(0, !visible);
if (visible) ui->view->horizontalHeader()->resizeSection(0, ui->view->horizontalHeader()->defaultSectionSize());
}
//qDebug() << ind << on;
// qDebug() << ind << on;
updateTable();
for (int i = 0; i < ui->view->horizontalHeader()->count(); ++i) {
column_news[mapColumn(i)]->setFixedWidth(ui->view->horizontalHeader()->sectionSize(i));
@@ -851,16 +913,19 @@ void SQLTableWidget::setColumnVisible(int ind, bool visible) {
}
bool SQLTableWidget::addRelation(const QString & this_column, const QString & other_table, const QString & other_key, const QString & other_column) {
bool SQLTableWidget::addRelation(const QString & this_column,
const QString & other_table,
const QString & other_key,
const QString & other_column) {
QString wr = this_column + ";" + other_table + ";" + other_key + ";" + other_column;
if (!wait_rels.contains(wr)) wait_rels << wr;
ColumnProperties * cp = const_cast<ColumnProperties * >(columnProperty(this_column));
ColumnProperties * cp = const_cast<ColumnProperties *>(columnProperty(this_column));
if (cp == 0) return false;
cp->relation_table = other_table;
cp->relation_key = other_key;
cp->relation_table = other_table;
cp->relation_key = other_key;
cp->relation_column = other_column;
cp->relation_type = ColumnProperties::typeFromString(getColumnType(other_table, other_column));
cp->relation_list = getColumnValues(other_table, other_key, other_column, connection_name);
cp->relation_type = ColumnProperties::typeFromString(getColumnType(other_table, other_column));
cp->relation_list = getColumnValues(other_table, other_key, other_column, connection_name);
for (int i = 0; i < column_props.size(); ++i)
column_news[i]->setProp(column_props[i]);
for (int i = 0; i < column_props.size(); ++i)
@@ -873,7 +938,7 @@ bool SQLTableWidget::addRelation(const QString & this_column, const QString & ot
void SQLTableWidget::addTranslation(const QString & file) {
QPIConfig conf(file, QIODevice::ReadOnly, QPIConfig::Config);
QPIConfig::Branch ae = conf.allLeaves();
foreach (QPIConfig::Entry * e, ae)
foreach(QPIConfig::Entry * e, ae)
translates[e->name()] = QPair<QString, QString>(e->value(), e->comment());
}
@@ -894,8 +959,8 @@ void SQLTableWidget::selectId(int id) {
}
void SQLTableWidget::setAdditionalActions(QList<QAction * > a) {
foreach (QAction * i, add_actions)
void SQLTableWidget::setAdditionalActions(QList<QAction *> a) {
foreach(QAction * i, add_actions)
popup_menu.removeAction(i);
add_actions = a;
popup_menu.addActions(a);
@@ -914,19 +979,17 @@ QString SQLTableWidget::preprocessScript(QString text) {
int ce = 0;
while (!s.atEnd()) {
QString line = s.readLine();
ce = line.indexOf("--");
if (ce >= 0)
line.chop(line.length() - ce);
ce = line.indexOf("--");
if (ce >= 0) line.chop(line.length() - ce);
out.append(line).append("\n");
}
int cs = out.indexOf("/*");
while (cs >= 0) {
ce = out.indexOf("*/", cs);
if (ce > cs)
out.remove(cs, ce - cs + 2);
if (ce > cs) out.remove(cs, ce - cs + 2);
cs = out.indexOf("/*");
}
//qDebug() << out;
// qDebug() << out;
return out;
}
@@ -951,8 +1014,7 @@ bool SQLTableWidget::executeScript(const QString & text_, QSqlDatabase db, bool
} else {
if (!q.exec(line)) {
qDebug() << q.lastError();
if (!skip_errors)
return false;
if (!skip_errors) return false;
}
}
ls = le + 1;
@@ -969,10 +1031,10 @@ bool SQLTableWidget::executeScriptFile(const QString & file, QSqlDatabase db, bo
qDebug() << "Can`t open file" << file << "!";
return false;
}
QString pd = _dir;
_dir = QFileInfo(f).absolutePath() + "/";
QString pd = _dir;
_dir = QFileInfo(f).absolutePath() + "/";
QByteArray ba = f.readAll();
bool ok = executeScript(QString::fromUtf8(ba.data(), ba.size()), db, skip_errors, sqlite);
bool ok = executeScript(QString::fromUtf8(ba.data(), ba.size()), db, skip_errors, sqlite);
f.close();
_dir = pd;
return ok;
@@ -980,7 +1042,7 @@ bool SQLTableWidget::executeScriptFile(const QString & file, QSqlDatabase db, bo
void SQLTableWidget::column_triggered(bool on) {
setColumnVisible(((QAction * )sender())->data().toInt(), on);
setColumnVisible(((QAction *)sender())->data().toInt(), on);
}
@@ -1017,27 +1079,26 @@ bool SQLTableWidget::connectToDatabase(const QString & config, const QString & c
}
}
}
if (!ok)
QSqlDatabase::removeDatabase(conn_name);
if (!ok) QSqlDatabase::removeDatabase(conn_name);
/*QSqlQuery q;
QString dbname = conf.getValue("database", "").stringValue();
bool dbex = false;
if (!q.exec("SHOW DATABASES;")) {
qDebug() << "[SHOW DATABASES]" << q.lastError();
return false;
qDebug() << "[SHOW DATABASES]" << q.lastError();
return false;
}
while (q.next())
if (q.value(0) == dbname)
{dbex = true; break;}
if (q.value(0) == dbname)
{dbex = true; break;}
if (!dbex) {
if (!q.exec("CREATE DATABASE " + dbname + ";")) {
qDebug() << "[CREATE DATABASE]" << q.lastError();
return false;
}
if (!q.exec("CREATE DATABASE " + dbname + ";")) {
qDebug() << "[CREATE DATABASE]" << q.lastError();
return false;
}
}
if (!q.exec("USE " + dbname + ";")) {
qDebug() << "[USE]" << q.lastError();
return false;
qDebug() << "[USE]" << q.lastError();
return false;
}*/
return ok;
}