From f7a7a0443a5253bfd88cb256705153938607bf5a Mon Sep 17 00:00:00 2001 From: mmtalaie Date: Mon, 3 Aug 2020 19:26:20 +0430 Subject: [PATCH] first commit --- .gitignore | 57 +++++ DatabaseBuilder.pro | 36 +++ main.cpp | 11 + mainwindow.cpp | 592 ++++++++++++++++++++++++++++++++++++++++++++ mainwindow.h | 87 +++++++ mainwindow.ui | 304 +++++++++++++++++++++++ res/Icons.qrc | 8 + res/add.png | Bin 0 -> 4297 bytes res/column.png | Bin 0 -> 3015 bytes res/edit.png | Bin 0 -> 1831 bytes res/new.png | Bin 0 -> 28735 bytes state.h | 13 + 12 files changed, 1108 insertions(+) create mode 100644 .gitignore create mode 100644 DatabaseBuilder.pro create mode 100644 main.cpp create mode 100644 mainwindow.cpp create mode 100644 mainwindow.h create mode 100644 mainwindow.ui create mode 100644 res/Icons.qrc create mode 100644 res/add.png create mode 100644 res/column.png create mode 100644 res/edit.png create mode 100644 res/new.png create mode 100644 state.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a231aea --- /dev/null +++ b/.gitignore @@ -0,0 +1,57 @@ +# C++ objects and libs +*.slo +*.lo +*.o +*.a +*.la +*.lai +*.so +*.dll +*.dylib + +# Qt-es +object_script.*.Release +object_script.*.Debug +*_plugin_import.cpp +/.qmake.cache +/.qmake.stash +*.pro.user +*.pro.user.* +*.qbs.user +*.qbs.user.* +*.moc +moc_*.cpp +moc_*.h +qrc_*.cpp +ui_*.h +*.qmlc +*.jsc +Makefile* +*build-* + +# Qt unit tests +target_wrapper.* + +# QtCreator +*.autosave + +# QtCreator Qml +*.qmlproject.user +*.qmlproject.user.* + +# QtCreator CMake +CMakeLists.txt.user* + +# QtCreator 4.8< compilation database +compile_commands.json + +# QtCreator local machine specific files for imported projects +*creator.user* + +#added be H-4nd-H to the template to comply with project needs + +*.pro.dummy + +bin/ +doc/ +*.lupdate diff --git a/DatabaseBuilder.pro b/DatabaseBuilder.pro new file mode 100644 index 0000000..7ac4b51 --- /dev/null +++ b/DatabaseBuilder.pro @@ -0,0 +1,36 @@ +QT += core gui +QT += xml + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +CONFIG += c++11 + +# The following define makes your compiler emit warnings if you use +# any Qt feature that has been marked deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if it uses deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +SOURCES += \ + main.cpp \ + mainwindow.cpp + +HEADERS += \ + mainwindow.h \ + state.h + +FORMS += \ + mainwindow.ui + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target + +RESOURCES += \ + res/Icons.qrc diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..fd3e533 --- /dev/null +++ b/main.cpp @@ -0,0 +1,11 @@ +#include "mainwindow.h" + +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.show(); + return a.exec(); +} diff --git a/mainwindow.cpp b/mainwindow.cpp new file mode 100644 index 0000000..00df2ca --- /dev/null +++ b/mainwindow.cpp @@ -0,0 +1,592 @@ +#include +#include "mainwindow.h" +#include "ui_mainwindow.h" +#include "state.h" + +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent) + , ui(new Ui::MainWindow) +{ + ui->setupUi(this); + + //create model + hideWidgets(); + _model = new QStandardItemModel(0,1,this); + ui->treeView->setModel(_model); +} + +MainWindow::~MainWindow() +{ + delete ui; +} + +void MainWindow::readFile() +{ + _model->clear(); + QStandardItem *root = new QStandardItem("root:Root"); + _model->appendRow(root); + + QDomDocument document; + + //load file + QFile file(_fileName); + if(file.open(QIODevice::ReadOnly | QIODevice::Text)) + { + document.setContent(&file); + file.close(); + } + + //read xml file + QDomElement xmlroot = document.firstChildElement(); + + QDomNodeList Databases = xmlroot.elementsByTagName("Database"); + for (int i = 0; i < Databases.count(); ++i) + { + QDomElement database= Databases.at(i).toElement(); + _DBElementVector.append(database); + _DBNameVector.append(database.attribute("name")); + QStandardItem *databaseItem = new QStandardItem(QString("DB : %1").arg(database.attribute("name"))); + + //read tables + QDomNodeList tables = database.elementsByTagName("Table"); + for (int t = 0; t < tables.count(); ++t) + { + QDomElement table = tables.at(t).toElement(); + QStandardItem *tableItem = new QStandardItem(QString("TBL : %1").arg(table.attribute("name"))); + + //read Field + QDomNodeList fields = table.elementsByTagName("Field"); + for (int f = 0; f < fields.count(); ++f) + { + QDomElement field = fields.at(f).toElement(); + QStandardItem *fieldItem = new QStandardItem(QString("FLD : %1").arg(field.attribute("name"))); +// "Name: "+field.attribute("name") + "; Type: " + field.attribute("type") + "; Allow Null: " + field.attribute("null") + "; Is Forign key:" + field.attribute("isforeignkey")); + + tableItem->appendRow(fieldItem); + } + databaseItem->appendRow(tableItem); + } + root->appendRow(databaseItem); + } + _xmlDoc = document; +} + +void MainWindow::readFile(QDomDocument xmlInput) +{ + _model->clear(); + QStandardItem *root = new QStandardItem("root:Root"); + _model->appendRow(root); + + QDomDocument document; + document = xmlInput; + + //read xml file + QDomElement xmlroot = document.firstChildElement(); + + QDomNodeList Databases = xmlroot.elementsByTagName("Database"); + for (int i = 0; i < Databases.count(); ++i) + { + QDomElement database= Databases.at(i).toElement(); + QStandardItem *databaseItem = new QStandardItem(QString("DB : %1").arg(database.attribute("name"))); + + //read tables + QDomNodeList tables = database.elementsByTagName("Table"); + for (int t = 0; t < tables.count(); ++t) + { + QDomElement table = tables.at(t).toElement(); + QStandardItem *tableItem = new QStandardItem(QString("TBL : %1").arg(table.attribute("name"))); + + //read Field + QDomNodeList fields = table.elementsByTagName("Field"); + for (int f = 0; f < fields.count(); ++f) + { + QDomElement field = fields.at(f).toElement(); + QStandardItem *fieldItem = new QStandardItem(QString("FLD : %1").arg(field.attribute("name"))); +// "Name: "+field.attribute("name") + "; Type: " + field.attribute("type") + "; Allow Null: " + field.attribute("null") + "; Is Forign key:" + field.attribute("isforeignkey")); + + tableItem->appendRow(fieldItem); + } + databaseItem->appendRow(tableItem); + } + root->appendRow(databaseItem); + } +} + + +void MainWindow::writeFile() +{ + _fileName = QFileDialog::getSaveFileName(this); + QFile savefile(_fileName); + if(!savefile.open(QIODevice::WriteOnly | QIODevice::Text)) + { + qDebug()<< "Ops! can not create file"; + } + QTextStream stream(&savefile); + stream<<_xmlDoc.toString(); + savefile.close(); + +} + + +void MainWindow::on_actionCreate_Database_triggered() +{ + hideWidgets(); + _state = eStateLevel::createDatabase; + if(_xmlDoc.isNull()) + { + _root = _xmlDoc.createElement("Root"); + _xmlDoc.appendChild(_root); + + } + else + { + _root = _xmlDoc.firstChild().toElement(); + } + + readFile(_xmlDoc); + + + ui->label_1->setText("Database Name"); + ui->label_1->show(); + ui->lineEdit_1->show(); + ui->Append_btn->show(); +} + +void MainWindow::on_actionAdd_Table_triggered() +{ + + if(!_xmlDoc.isNull()) + { + hideWidgets(); + _state = eStateLevel::createTable; + ui->label_1->setText("Table Name"); + ui->label_1->show(); + ui->lineEdit_1->show(); + ui->Append_btn->show(); + } +} + +void MainWindow::on_actionAdd_Field_triggered() +{ + + if(!_xmlDoc.isNull() /*&& !_lastDBElement.isNull()*/) + { + hideWidgets(); + _state = eStateLevel::createField; + ui->label_1->setText("Field Name :"); + ui->cmbType->show(); + ui->label_1->show(); + ui->lineEdit_1->show(); + ui->Append_btn->show(); + ui->chbIsNull->show(); + ui->chbIsForignKey->show(); + } + +} + +void MainWindow::on_chbIsForignKey_stateChanged(int arg1) +{ + if(arg1 > 0) + { + ui->cmbTablsName->addItem(""); + for (int i = 0; i < _lastDBElement.childNodes().count(); ++i) + { + auto tblElem = _lastDBElement.childNodes().at(i); + ui->cmbTablsName->addItem(tblElem.toElement().attribute("name")); + } + ui->cmbTablsName->show(); + } + else + { + ui->cmbTablsName->hide(); + } +} + +void MainWindow::hideWidgets() +{ + ui->label_1->hide(); + ui->label_2->hide(); + ui->label_3->hide(); + ui->label_4->hide(); + + ui->lineEdit_1->hide(); + ui->lineEdit_2->hide(); + ui->lineEdit_3->hide(); + ui->lineEdit_4->hide(); + + ui->Append_btn->setText("Append"); + ui->Append_btn->hide(); + + ui->cmbType->hide(); + ui->chbIsNull->hide(); + ui->chbIsForignKey->hide(); + ui->cmbTablsName->hide(); + +} + +void MainWindow::on_Append_btn_clicked() +{ + switch (_state) + { + case eStateLevel::createDatabase: + { + _lastDBElement =_xmlDoc.createElement("Database"); + auto dbName = ui->lineEdit_1->text(); + _lastDBElement.setAttribute("name",dbName); + _DBElementVector.append(_lastDBElement); + _root.appendChild(_lastDBElement); + _xmlDoc.childNodes().at(0) = _root; + readFile(_xmlDoc); + hideWidgets(); + ui->lineEdit_1->setText(""); + break; + } + case eStateLevel::createTable: + { + _lastTableElement = _xmlDoc.createElement("Table"); + auto tableName = ui->lineEdit_1->text(); + _lastTableElement.setAttribute("name",tableName); + _lastDBElement.appendChild(_lastTableElement); + readFile(_xmlDoc); + ui->lineEdit_1->setText(""); + hideWidgets(); + break; + } + case eStateLevel::createField: + { + if(_lastTableElement.isNull() || _lastDBElement.isNull()) + { + //TODO :: show mesagebox Text "Please select Database and Table" + break; + } + if(ui->lineEdit_1->text() == "") + { + //TODO :: show mesagebox Text "Please set the field name" + break; + } + auto a = ui->cmbType->currentIndex(); + if(a < 1) + { + //TODO :: show mesagebox Text "Please set the Type" + break; + } + auto fieldName = ui->lineEdit_1->text(); + auto field = _xmlDoc.createElement("Field"); + field.setAttribute("name",fieldName); + if(ui->cmbType->currentText() == "VARCHAR") + { + field.setAttribute("type",QString("%1(%2)").arg(ui->cmbType->currentText()).arg(ui->lineEdit_2->text())); + } + else + { + field.setAttribute("type",ui->cmbType->currentText()); + } + if(ui->chbIsNull->checkState() == Qt::CheckState::Unchecked) + field.setAttribute("null","NOT"); + if(ui->chbIsForignKey->checkState() == Qt::CheckState::Checked) + { + field.setAttribute("isforeignkey","true"); + field.setAttribute("lookuptable",ui->cmbTablsName->currentText()); + field.setAttribute("lookuptable","ID"); + } + else + { + field.setAttribute("isforeignkey","false"); + } + + _lastTableElement.appendChild(field); + + readFile(_xmlDoc); + ui->lineEdit_1->setText(""); + hideWidgets(); + + break; + } + case eStateLevel::editDatabase: + { + + auto oldDB = _lastDBElement; + _lastDBElement.setAttribute("name",ui->lineEdit_1->text()); + auto root = _xmlDoc.firstChildElement().replaceChild(_lastDBElement,oldDB); + readFile(_xmlDoc); + ui->lineEdit_1->setText(""); + hideWidgets(); + break; + } + case eStateLevel::editTable: + { + + auto oldTbl = _lastTableElement; + _lastTableElement.setAttribute("name",ui->lineEdit_1->text()); + auto root = _lastDBElement.replaceChild(_lastTableElement,oldTbl); + readFile(_xmlDoc); + ui->lineEdit_1->setText(""); + hideWidgets(); + break; + } + case eStateLevel::editField: + { + if(_lastTableElement.isNull() || _lastDBElement.isNull()) + { + //TODO :: show mesagebox Text "Please select Database and Table" + break; + } + if(ui->lineEdit_1->text() == "") + { + //TODO :: show mesagebox Text "Please set the field name" + break; + } + auto a = ui->cmbType->currentIndex(); + if(a < 1) + { + //TODO :: show mesagebox Text "Please set the Type" + break; + } + auto fieldName = ui->lineEdit_1->text(); + auto field = _xmlDoc.createElement("Field"); + field.setAttribute("name",fieldName); + if(ui->cmbType->currentText() == "VARCHAR") + { + field.setAttribute("type",QString("%1(%2)").arg(ui->cmbType->currentText()).arg(ui->lineEdit_2->text())); + } + else + { + field.setAttribute("type",ui->cmbType->currentText()); + } + if(ui->chbIsNull->checkState() == Qt::CheckState::Unchecked) + field.setAttribute("null","NOT"); + if(ui->chbIsForignKey->checkState() == Qt::CheckState::Checked) + { + field.setAttribute("isforeignkey","true"); + field.setAttribute("lookuptable",ui->cmbTablsName->currentText()); + field.setAttribute("lookuptable","ID"); + } + else + { + field.setAttribute("isforeignkey","false"); + } + auto oldFld = _lastFieldElement; + _lastTableElement.replaceChild(field,oldFld); + + readFile(_xmlDoc); + ui->lineEdit_1->setText(""); + hideWidgets(); + + break; + } + default: + break; + + } +} + + + + + + +void MainWindow::on_cmbTablsName_currentIndexChanged(int index) +{ + if(ui->chbIsForignKey->checkState() == Qt::CheckState::Checked) + { + if(index > 0 ) + { + ui->lineEdit_1->setText(QString("%1_id").arg(ui->cmbTablsName->currentText())); + ui->cmbType->setCurrentIndex(1); + } + } +} + +void MainWindow::on_treeView_doubleClicked(const QModelIndex &index) +{ + hideWidgets(); + auto type = getElementType(index); + switch (type) + { + case MainWindow::eElementType::root : + { + break; + } + case MainWindow::eElementType::database : + { + _state = MainWindow::eStateLevel::editDatabase; + for (int i = 0; i < _xmlDoc.firstChild().childNodes().count(); ++i) + { + if( _xmlDoc.firstChild().childNodes().at(i).toElement().attribute("name") == index.data().toString().split(" : ").at(1)) + { + + _lastDBElement = _xmlDoc.firstChild().childNodes().at(i).toElement(); + ui->label_1->setText("Database Name: "); + ui->label_1->show(); + ui->lineEdit_1->setText(_xmlDoc.firstChild().childNodes().at(i).toElement().attribute("name")); + ui->lineEdit_1->show(); + ui->Append_btn->setText("edit"); + ui->Append_btn->show(); + break; + } + } +// _lastDBElement.clear(); + break; + } + case MainWindow::eElementType::table : + { + _state = MainWindow::eStateLevel::editTable; + auto database = index.parent(); + _lastDBElement.clear(); + for (int i = 0; i < _xmlDoc.firstChild().childNodes().count(); ++i) + { + if(_xmlDoc.firstChild().childNodes().at(i).toElement().attribute("name") == database.data().toString().split(" : ").at(1)) + { + _lastDBElement = _xmlDoc.firstChild().childNodes().at(i).toElement(); + break; + } + } + for (int i = 0; i < _lastDBElement.childNodes().count(); ++i) + { + auto tblItem = _lastDBElement.childNodes().at(i); + _lastTableElement.clear(); + auto elem = tblItem.toElement(); + if(elem.attribute("name") == index.data().toString().split(" : ").at(1)) + { + _lastTableElement = elem; + ui->label_1->setText("Table Name: "); + ui->label_1->show(); + ui->lineEdit_1->setText(elem.attribute("name")); + ui->lineEdit_1->show(); + ui->Append_btn->setText("edit"); + ui->Append_btn->show(); + break; + } + } + + break; + } + case MainWindow::eElementType::field : + { + _state = MainWindow::eStateLevel::editField; + auto table = index.parent(); + auto database = table.parent(); + _lastDBElement.clear(); + for (int i = 0; i < _xmlDoc.firstChild().childNodes().count(); ++i) + { + if(_xmlDoc.firstChild().childNodes().at(i).toElement().attribute("name") == database.data().toString().split(" : ").at(1)) + { + _lastDBElement = _xmlDoc.firstChild().childNodes().at(i).toElement(); + break; + } + } + for (int i = 0; i < _lastDBElement.childNodes().count(); ++i) + { + auto tblelem = _lastDBElement.childNodes().at(i).toElement(); + _lastTableElement.clear(); + if(tblelem.attribute("name") == table.data().toString().split(" : ").at(1)) + { + _lastTableElement = tblelem; + break; + } + } + for (int i = 0; i < _lastTableElement.childNodes().count(); ++i) + { + _lastFieldElement = _lastTableElement.childNodes().at(i).toElement(); + if(_lastFieldElement.attribute("name") == index.data().toString().split(" : ").at(1)) + { + ui->label_1->setText("Field Name: "); + ui->label_1->show(); + ui->lineEdit_1->setText(_lastFieldElement.attribute("name")); + ui->lineEdit_1->show(); + ui->Append_btn->setText("edit"); + if(_lastFieldElement.attribute("type") == "INTEGER") + ui->cmbType->setCurrentText("INT"); + else if(_lastFieldElement.attribute("type").toLower().contains("varchar")) + { + ui->cmbType->setCurrentText("VARCHAR"); + auto size = _lastFieldElement.attribute("type").toLower().split("(").at(1); + size.replace(")",""); + ui->lineEdit_2->setText(size); + ui->lineEdit_2->show(); + } + else + ui->cmbType->setCurrentText(_lastFieldElement.attribute("type")); + + ui->cmbType->show(); + if(_lastFieldElement.attribute("null") == "NOT") + ui->chbIsNull->setCheckState(Qt::CheckState::Unchecked); + else + { + ui->chbIsNull->setCheckState(Qt::CheckState::Checked); + } + ui->chbIsNull->show(); + + if(_lastFieldElement.attribute("isforeignkey") == "true") + { + ui->chbIsForignKey->show(); + ui->cmbTablsName->show(); + ui->chbIsForignKey->setCheckState(Qt::CheckState::Checked); + ui->cmbTablsName->setCurrentText(_lastFieldElement.attribute("lookuptable")); + } + else + { + ui->chbIsForignKey->setCheckState(Qt::CheckState::Unchecked); + } + ui->Append_btn->show(); + } + + } + break; + } + } + int a = index.row(); + int b = index.column(); + auto parent = index.parent(); + auto par0 = parent.parent(); + auto ac = index.data(); + qDebug()<lineEdit_2->show(); + ui->label_2->setText("Len :"); + ui->label_2->show(); + ui->lineEdit_2->setText("200"); + } + else + { + ui->lineEdit_2->hide(); + ui->label_2->setText("Len :"); + ui->label_2->hide(); + ui->lineEdit_2->setText("200"); + } + +} + +void MainWindow::on_actionsave_triggered() +{ + writeFile(); +} + +void MainWindow::on_actionEdit_Database_triggered() +{ + _fileName = QFileDialog::getOpenFileName(this, + tr("Open XML file"), "/home/", + tr("Address XML (*.xml);;All Files (*)")); + readFile(); +} diff --git a/mainwindow.h b/mainwindow.h new file mode 100644 index 0000000..89a1f82 --- /dev/null +++ b/mainwindow.h @@ -0,0 +1,87 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE +namespace Ui { class MainWindow; } +QT_END_NAMESPACE + +class MainWindow : public QMainWindow +{ + Q_OBJECT + enum eStateLevel: quint8 + { + createRoot, + createDatabase, + createTable, + createField, + editDatabase, + editTable, + editField + }; + enum eElementType:quint8 + { + root, + database, + table, + field, + unknown + }; + +public: + MainWindow(QWidget *parent = nullptr); + ~MainWindow(); + +private slots: + void on_actionCreate_Database_triggered(); + + void on_Append_btn_clicked(); + + void on_actionAdd_Table_triggered(); + + void on_actionAdd_Field_triggered(); + + void on_chbIsForignKey_stateChanged(int arg1); + + void on_cmbTablsName_currentIndexChanged(int index); + + void on_treeView_doubleClicked(const QModelIndex &index); + + void on_cmbType_currentTextChanged(const QString &arg1); + + void on_actionsave_triggered(); + + void on_actionEdit_Database_triggered(); + +private: + Ui::MainWindow *ui; + QStandardItemModel *_model; + QString _fileName; + + int _state = 0; + + QDomDocument _xmlDoc; + QString _xmlAddress; + QDomElement _root; + QVector _DBNameVector; + QVector _DBElementVector; + QDomElement _lastDBElement; + QDomElement _lastTableElement; + QDomElement _lastFieldElement; + QDomElement* _lastDBPointer; + + void readFile(); + void readFile(QDomDocument xmlInput); + void writeFile(); + void hideWidgets(); + + eElementType getElementType(QModelIndex indInput); + + +}; +#endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui new file mode 100644 index 0000000..8dbcfe1 --- /dev/null +++ b/mainwindow.ui @@ -0,0 +1,304 @@ + + + MainWindow + + + + 0 + 0 + 800 + 600 + + + + MainWindow + + + + + + 0 + 180 + 791 + 331 + + + + + 1 + 1 + + + + QAbstractScrollArea::AdjustToContents + + + + + + 600 + 150 + 89 + 25 + + + + Append + + + + + + 10 + 10 + 181 + 17 + + + + TextLabel + + + + + + 203 + 10 + 84 + 25 + + + + + + + 510 + 10 + 67 + 17 + + + + TextLabel + + + + + + 600 + 10 + 136 + 25 + + + + + + + 291 + 10 + 95 + 23 + + + + Allow Null + + + + + + 390 + 10 + 100 + 25 + + + + + + + + + + INT + + + + + BOOLEAN + + + + + DOUBLE + + + + + VARCHAR + + + + + + + 10 + 70 + 101 + 23 + + + + IsForignKey + + + + + + 150 + 70 + 131 + 25 + + + + + + + 70 + 150 + 418 + 25 + + + + Qt::Horizontal + + + + TextLabel + + + + + + TextLabel + + + + + + + + 700 + 150 + 89 + 25 + + + + Cancel + + + + + + + 0 + 0 + 800 + 22 + + + + + File + + + + + + + + + + + + toolBar + + + TopToolBarArea + + + false + + + + + + + + + + :/Icons/new.png:/Icons/new.png + + + Create Database + + + Ctrl+D + + + + + + :/Icons/edit.png:/Icons/edit.png + + + Edit Database + + + + + close + + + close + + + + + + :/Icons/add.png:/Icons/add.png + + + Add Table + + + Ctrl+T + + + + + + :/Icons/column.png:/Icons/column.png + + + Add Field + + + Ctrl+F + + + + + save + + + + + + + + diff --git a/res/Icons.qrc b/res/Icons.qrc new file mode 100644 index 0000000..1b9e6a8 --- /dev/null +++ b/res/Icons.qrc @@ -0,0 +1,8 @@ + + + new.png + edit.png + column.png + add.png + + diff --git a/res/add.png b/res/add.png new file mode 100644 index 0000000000000000000000000000000000000000..046e536ef446a8171368557297c3a5bf0b99326e GIT binary patch literal 4297 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 UZc~=4ZwCNa&s4Wk+v(MR0J!oo^Z)<= literal 0 HcmV?d00001 diff --git a/res/column.png b/res/column.png new file mode 100644 index 0000000000000000000000000000000000000000..b67746b91936e8490e89c9a0de755165c402efdd GIT binary patch literal 3015 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 SOMvxs1Exmk%axaI#QYC{Zje?0 literal 0 HcmV?d00001 diff --git a/res/edit.png b/res/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..567b277992cefd8c9986c3229c43e31580f7f9cb GIT binary patch literal 1831 zcmV+?2iW+DP)4Dtv||;T;IwKQS_)l2sgRHg zA}KADFI6mHfrNxgRfGf!B3AXHNG++<1ri7$AtA9~#aED!*g&BvRa>X6(gJo8CrwG> zIB`7oc*gTS?)|eE*Ur@A@z@@}H;Wv}vfsPU_uO;lzWdJmUt8D!)#o4C7iH~(YW05S z+yPY?u};hCw4jRTR6P(1IU|+bxe%xWO^`*<8Q?O)dC-$M`7geklmkc4Y{Z)s{6 zUVETy>&3&da}Pz4yEBS4-%CfOf=6X{u22CygiRW7Ei7;pBTvbP{xH6k4z>dWaQUB~8>?Rp-)bz``?ex}oA7`y z+Kw=Y{E)Yf0~}6_v>C)d9su#H5c$4NeBlF0 z(U~aH;iSlVM24ltXObc_o^eTW^^WE{BS}#iKfaI@S8s^sp!xRONzs{R^)z`ipA=tr z#5JhBmMEnGXwJS)E}F#mQo0>9hQ?`_{};G0QELC)AA-e;P@g7OtRVSYiMRo~lYXd$ zcn*R~5Ke=Oc93j+_-#k31ocZ$ztn2X7V!%e@P}|x#A+6&!loaaE(BX&{fg!wUI5Zx zfct#(N5tUa!GZ%UI1B1PgXJkbNI|0=T@6?d&PF)fK4pCi z8ak4APf}u)RJQ>-MO|blqL$J;N3Wv6rBkv zlP!N3&r8_`5h&gcrTvN0`T&9K#teUwe0YkmF@tkSKDP~ID^R=*{GkMSTUf~fPJNo0 z14wy4IlY2JGuU8(D31D{V@wV*H$rANu(=Q~~J+c?6^y+m%;M+t0cyS!V6U4+`35LdU= z&HJCda8o939nB~*Xn&zlMWe={4?Z*XAI7vT$+R6r&3U5cal{DO{4PxHX4Kn7 zthxSFh&5g=idI{~qdCz2RD(y3OjmO8!lc@8-K{!6VlaiFdq!`l|MKjZew#6IJr_ltM!2PUpz|)0m#6hgn=o$w`E(_!cK_so)`v7y zLHrz`-@2``7*4_CTdE2V3Rc9&n-SlF!gu!lZ1LCtJo~nW?TBB6``%z0AlPor{Sgl! z_ZZ)h&Zb;97+p6B_D?*Z%$s~x{=DUZ?hO7RpNih-)X-P)fEf9Ux%o@MqlK*ed+X!v zD^3vkU+dJ+Z}Gq^#(UC;;BNV9aQFL)JnMTTyE(s#1(2t3!F}@C<*n&!FmmKnC7P>E z^iljg;vSxQtZ=UF!L5J8zq*k9QRw()7&B@uUatyDd8q8#R1T;EF95$M41OyII|qzb z$k7S4LAh&hn-hQN%;Uo^Lx(?=y%w{7%pJ7oH>~3$PIXUgW!PCVor=U87%&Z-M43RC z0P`ZHrB~!*-521U77rU3ux>9$b9Y!_zr)>xl@TE8XVBr2oWMx~BMnSkM>8|n#%1|5 z@n$)a5D!~4V5gCkco;wfk`xaEW6u@7#g2oy&3wh=-I7@Wnmau^}Pxkg@^J+6UI0Oi(f+V^4N5^gq-a3f0+^C`NYMZz?(@KA65h;a5?-%JZD+{yz1g^H z!jrS0n(@Fdy>Q_%Y4m#>slE*D`|0d2@UmYAxeR*zU9q9M@$=sunoVL1{|A)} VLdfr>TYCTi002ovPDHLkV1l{MaJm2h literal 0 HcmV?d00001 diff --git a/res/new.png b/res/new.png new file mode 100644 index 0000000000000000000000000000000000000000..8bf53411fb0012d4b4031946d4f3424547f9e3d7 GIT binary patch literal 28735 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 + +//class EnumsLebel :public QObject +//{ +//public: + +// Q_ENUM(eStateLevel) + +//}; +#endif // STATE_H