first commit

This commit is contained in:
2016-10-18 17:43:02 +02:00
commit 1f9c503e67
2475 changed files with 137095 additions and 0 deletions
+100
View File
@@ -0,0 +1,100 @@
#include "cconfigdialog.h"
#include "ui_cconfigdialog.h"
#include <QMessageBox>
#include <QSettings>
#include <QCloseEvent>
cConfigDialog::cConfigDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::cConfigDialog),
m_bPasswordChanged(false)
{
ui->setupUi(this);
}
cConfigDialog::~cConfigDialog()
{
delete ui;
}
void cConfigDialog::setHostname(const QString& szHostname)
{
ui->m_lpHostname->setText(szHostname);
}
void cConfigDialog::setDatabase(const QString& szDatabase)
{
ui->m_lpDatabase->setText(szDatabase);
}
void cConfigDialog::setUserName(const QString& szUserName)
{
ui->m_lpUsername->setText(szUserName);
}
void cConfigDialog::setPassword(const QString& szPassword)
{
ui->m_lpPassword->setText(szPassword);
ui->m_lpPassword2->setText(szPassword);
}
QString cConfigDialog::hostname()
{
return(ui->m_lpHostname->text());
}
QString cConfigDialog::database()
{
return(ui->m_lpDatabase->text());
}
QString cConfigDialog::userName()
{
return(ui->m_lpUsername->text());
}
QString cConfigDialog::password()
{
return(ui->m_lpPassword->text());
}
void cConfigDialog::on_m_lpTestButton_clicked()
{
}
void cConfigDialog::on_m_lpOKButton_clicked()
{
if(ui->m_lpPassword->text() != ui->m_lpPassword2->text())
QMessageBox::critical(this, "Database", "password does not match");
else
accept();
}
void cConfigDialog::on_m_lpCancelButton_clicked()
{
reject();
}
void cConfigDialog::on_m_lpPassword_textChanged(const QString&/*arg1*/)
{
m_bPasswordChanged = true;
if(ui->m_lpPassword->text() != ui->m_lpPassword2->text())
ui->m_lpPasswordMatch->setText("password does not match");
else
ui->m_lpPasswordMatch->setText("");
}
void cConfigDialog::on_m_lpPassword2_textChanged(const QString&/*arg1*/)
{
m_bPasswordChanged = true;
if(ui->m_lpPassword->text() != ui->m_lpPassword2->text())
ui->m_lpPasswordMatch->setText("password does not match");
else
ui->m_lpPasswordMatch->setText("");
}
QWidget* cConfigDialog::widget()
{
return((QWidget*)ui->gridLayout);
}
+135
View File
@@ -0,0 +1,135 @@
/**
* \class cConfigDialog
*
* \brief Configuration Dialog for dMySQL
*
* \ingroup MYSQL
*
* This class implements basic import functionality for Kooky.
* All functions may be overwritten by derriving classes.
*
* \note Attempts at zen rarely work.
*
* \author Herwig Birke
*
* \version 1.0
*
* \date 2016/02/09
*/
#ifndef CCONFIGDIALOG_H
#define CCONFIGDIALOG_H
#include <QDialog>
#include <QCloseEvent>
namespace Ui {
class cConfigDialog;
}
class cConfigDialog : public QDialog
{
Q_OBJECT
public:
/**
* \brief
*
\param parent
*/
explicit cConfigDialog(QWidget *parent = 0);
/**
* \brief
*
*/
~cConfigDialog();
/**
* \brief
*
\param szHostname
*/
void setHostname(const QString& szHostname);
/**
* \brief
*
\param szDatabase
*/
void setDatabase(const QString& szDatabase);
/**
* \brief
*
\param szUserName
*/
void setUserName(const QString& szUserName);
/**
* \brief
*
\param szPassword
*/
void setPassword(const QString& szPassword);
/**
* \brief
*
\return QString
*/
QString hostname();
/**
* \brief
*
\return QString
*/
QString database();
/**
* \brief
*
\return QString
*/
QString userName();
/**
* \brief
*
\return QString
*/
QString password();
QWidget* widget();
private slots:
/**
* \brief
*
*/
void on_m_lpTestButton_clicked();
/**
* \brief
*
\param arg1
*/
void on_m_lpPassword_textChanged(const QString &arg1);
/**
* \brief
*
\param arg1
*/
void on_m_lpPassword2_textChanged(const QString &arg1);
/**
* \brief
*
*/
void on_m_lpOKButton_clicked();
/**
* \brief
*
*/
void on_m_lpCancelButton_clicked();
private:
Ui::cConfigDialog *ui; /*!< TODO: describe */
bool m_bPasswordChanged; /*!< TODO: describe */
protected:
};
#endif // CCONFIGDIALOG_H
+162
View File
@@ -0,0 +1,162 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>cConfigDialog</class>
<widget class="QDialog" name="cConfigDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>398</width>
<height>173</height>
</rect>
</property>
<property name="windowTitle">
<string>MySQL Plugin - Configure</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0" colspan="5">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Hostname:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="m_lpHostname">
<property name="echoMode">
<enum>QLineEdit::Normal</enum>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Database:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="m_lpDatabase"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>User:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="m_lpUsername"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Password:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="m_lpPassword">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>retype Password:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="m_lpPassword2">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QLabel" name="m_lpPasswordMatch">
<property name="styleSheet">
<string notr="true">QLabel { red; color : red; }</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QPushButton" name="m_lpTestButton">
<property name="text">
<string>Test</string>
</property>
</widget>
</item>
<item row="1" column="1">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>134</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="m_lpOKButton">
<property name="text">
<string>OK</string>
</property>
<property name="default">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QPushButton" name="m_lpCancelButton">
<property name="text">
<string>Cancel</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
+353
View File
@@ -0,0 +1,353 @@
#include "cmysqlplugin.h"
#include "cconfigdialog.h"
#include <QSqlError>
#include <QSettings>
#include <QSqlQuery>
#include <QMessageBox>
bool cMySQLPlugin::connect()
{
QSettings settings;
m_db = QSqlDatabase::addDatabase("QMYSQL");
m_db.setHostName(settings.value(QString("plugins/%1/hostName").arg(pluginName())).toString());
m_db.setDatabaseName(settings.value(QString("plugins/%1/databaseName").arg(pluginName())).toString());
m_db.setUserName(settings.value(QString("plugins/%1/userName").arg(pluginName())).toString());
m_db.setPassword(settings.value(QString("plugins/%1/password").arg(pluginName())).toString());
return(open());
}
bool cMySQLPlugin::init()
{
QSettings settings;
m_db = QSqlDatabase::addDatabase("QMYSQL");
m_db.setHostName(settings.value(QString("plugins/%1/hostName").arg(pluginName())).toString());
m_db.setDatabaseName(settings.value(QString("plugins/%1/databaseName").arg(pluginName())).toString());
m_db.setUserName(settings.value(QString("plugins/%1/userName").arg(pluginName())).toString());
m_db.setPassword(settings.value(QString("plugins/%1/password").arg(pluginName())).toString());
m_bConnected = m_db.open();
if(m_bConnected)
{
QStringList tables = m_db.tables();
if(tables.count())
{
if(QMessageBox::question(0, "Tables exist", "Database not empty.\nExisting tables will be deleted.\nContinue?", QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No)
return(m_bConnected);
}
QSqlQuery query(m_db);
for(int z = 0;z < tables.count();z++)
query.exec(QString("DROP TABLE %1;").arg(tables.at(z)));
if(!query.exec("CREATE TABLE `kooky`.settings ( `var` VARCHAR(100) NOT NULL , `val` VARCHAR(100) NOT NULL ) ENGINE = InnoDB;"))
{
m_szLastError = query.lastError().text();
m_db.close();
m_bConnected = false;
return(m_bConnected);
}
if(!query.exec("INSERT INTO `kooky`.settings values ('version', '1.0');"))
{
m_szLastError = query.lastError().text();
m_db.close();
m_bConnected = false;
return(m_bConnected);
}
if(!query.exec("CREATE TABLE `kooky`.ingredient_group ( `id` INT NOT NULL AUTO_INCREMENT, `name` VARCHAR(100) NOT NULL, PRIMARY KEY (id) )"))
{
m_szLastError = query.lastError().text();
m_db.close();
m_bConnected = false;
return(m_bConnected);
}
if(!query.exec("CREATE TABLE `kooky`.ingredient ( `id` INT NOT NULL AUTO_INCREMENT, `name` VARCHAR(100) NOT NULL, ingredient_group_id INT NOT NULL, PRIMARY KEY (id) )"))
{
m_szLastError = query.lastError().text();
m_db.close();
m_bConnected = false;
return(m_bConnected);
}
if(!query.exec("CREATE TABLE `kooky`.ingredient_values ( `id` INT NOT NULL AUTO_INCREMENT, `ingredient_id` INT NOT NULL, `ingredient_number` INT NOT NULL, `value` DOUBLE, PRIMARY KEY (id), FOREIGN KEY(ingredient_id) REFERENCES ingredient(id) )"))
{
m_szLastError = query.lastError().text();
m_db.close();
m_bConnected = false;
return(m_bConnected);
}
createGroup("default");
}
else
m_szLastError = m_db.lastError().text();
return(m_bConnected);
}
bool cMySQLPlugin::open()
{
m_bConnected = m_db.open();
if(m_bConnected)
{
QSqlQuery query(m_db);
if(!query.exec("SELECT * FROM settings"))
{
init();
QSqlQuery query1(m_db);
if(!query1.exec("SELECT * FROM settings"))
{
m_szLastError = query.lastError().text();
m_db.close();
m_bConnected = false;
return(m_bConnected);
}
}
}
else
m_szLastError = m_db.lastError().text();
return(m_bConnected);
}
QString cMySQLPlugin::lastError()
{
return(m_szLastError);
}
bool cMySQLPlugin::config()
{
cConfigDialog dlg;
QSettings settings;
dlg.setHostname(settings.value(QString("plugins/%1/hostName").arg(pluginName())).toString());
dlg.setDatabase(settings.value(QString("plugins/%1/databaseName").arg(pluginName())).toString());
dlg.setUserName(settings.value(QString("plugins/%1/userName").arg(pluginName())).toString());
dlg.setPassword(settings.value(QString("plugins/%1/password").arg(pluginName())).toString());
if(dlg.exec() == QDialog::Accepted)
{
m_db.close();
settings.setValue(QString("plugins/%1/hostName").arg(pluginName()), dlg.hostname());
settings.setValue(QString("plugins/%1/databaseName").arg(pluginName()), dlg.database());
settings.setValue(QString("plugins/%1/userName").arg(pluginName()), dlg.userName());
settings.setValue(QString("plugins/%1/password").arg(pluginName()), dlg.password());
m_db.setHostName(settings.value(QString("plugins/%1/hostName").arg(pluginName())).toString());
m_db.setDatabaseName(settings.value(QString("plugins/%1/databaseName").arg(pluginName())).toString());
m_db.setUserName(settings.value(QString("plugins/%1/userName").arg(pluginName())).toString());
m_db.setPassword(settings.value(QString("plugins/%1/password").arg(pluginName())).toString());
return(open());
}
return(m_bConnected);
}
qint32 cMySQLPlugin::exists(const QString& szName, const QString& szGroup)
{
if(!m_bConnected)
return(-1);
qint32 iGroup = existsGroup(szGroup);
if(iGroup == -1)
return(-1);
QSqlQuery query(m_db);
if(!query.exec(QString("SELECT id FROM ingredient WHERE name = \"%1\" AND ingredient_group_id=%2").arg(szName).arg(iGroup)))
{
m_szLastError = query.lastError().text();
return(-1);
}
query.first();
if(!query.isValid())
return(-1);
return(query.value(0).toInt());
}
qint32 cMySQLPlugin::existsGroup(const QString& szGroup)
{
if(!m_bConnected)
return(-1);
QSqlQuery query(m_db);
if(!query.exec(QString("SELECT id FROM ingredient_group WHERE name = \"%1\"").arg(szGroup)))
{
m_szLastError = query.lastError().text();
return(-1);
}
query.first();
if(!query.isValid())
return(-1);
return(query.value(0).toInt());
}
qint32 cMySQLPlugin::existsIngredient(qint32 id, qint16 ingredientNumber)
{
if(!m_bConnected)
return(-1);
QSqlQuery query(m_db);
if(!query.exec(QString("SELECT id FROM ingredient_values WHERE ingredient_id = %1 AND ingredient_number = %2").arg(id).arg(ingredientNumber)))
{
m_szLastError = query.lastError().text();
return(-1);
}
query.first();
if(!query.isValid())
return(-1);
return(query.value(0).toInt());
}
qint32 cMySQLPlugin::create(const QString& szName, const QString& szGroup)
{
if(!m_bConnected)
return(-1);
qint32 iGroup = existsGroup(szGroup);
if(iGroup == -1)
return(-1);
if(exists(szName, szGroup) != -1)
return(-1);
QSqlQuery query(m_db);
if(!query.exec(QString("INSERT INTO ingredient (name, ingredient_group_id) VALUES (\"%1\", %2)").arg(szName).arg(iGroup)))
{
m_szLastError = query.lastError().text();
return(-1);
}
return(exists(szName, szGroup));
}
qint32 cMySQLPlugin::createGroup(const QString& szGroup)
{
if(!m_bConnected)
return(-1);
if(existsGroup(szGroup) != -1)
return(-1);
QSqlQuery query(m_db);
if(!query.exec(QString("INSERT INTO ingredient_group (name) VALUES (\"%1\")").arg(szGroup)))
{
m_szLastError = query.lastError().text();
return(-1);
}
return(existsGroup(szGroup));
}
bool cMySQLPlugin::set(qint32 id, qint16 ingredientNumber, qreal value)
{
if(!m_bConnected)
return(-1);
if(existsIngredient(id, ingredientNumber) != -1)
return(-1);
QSqlQuery query(m_db);
if(!query.exec(QString("INSERT INTO ingredient_values (ingredient_id, ingredient_number, value) VALUES (%1, %2, %3)").arg(id).arg(ingredientNumber).arg(value)))
{
m_szLastError = query.lastError().text();
return(-1);
}
return(existsIngredient(id, ingredientNumber));
}
INGREDIENT_LIST cMySQLPlugin::ingredients()
{
if(!m_bConnected)
return(INGREDIENT_LIST());
QSqlQuery query(m_db);
if(!query.exec(QString("SELECT ingredient.name, ingredient_group.name FROM ingredient, ingredient_group WHERE ingredient.ingredient_group_id = ingredient_group.id ORDER BY ingredient_group.name, ingredient.name")))
{
m_szLastError = query.lastError().text();
return(INGREDIENT_LIST());
}
INGREDIENT_LIST list;
while(query.next())
{
INGREDIENT i;
i.szGroup = query.value(1).toString();
i.szIngredient = query.value(0).toString();
list.append(i);
}
return(list);
}
QStringList cMySQLPlugin::groups()
{
if(!m_bConnected)
return(QStringList());
QSqlQuery query(m_db);
if(!query.exec(QString("SELECT name FROM ingredient_group ORDER BY name")))
{
m_szLastError = query.lastError().text();
return(QStringList());
}
QStringList list;
while(query.next())
list.append(query.value(0).toString());
return(list);
}
bool cMySQLPlugin::beginTransaction()
{
if(!m_bConnected)
return(false);
QSqlQuery query(m_db);
return(query.exec("SET autocommit = 0"));
}
bool cMySQLPlugin::endTransaction()
{
if(!m_bConnected)
return(false);
QSqlQuery query(m_db);
query.exec("SET autocommit = 1");
return(m_db.commit());
}
QString cMySQLPlugin::author()
{
return("Herwig Birke");
}
QString cMySQLPlugin::company()
{
return("WIN-DESIGN");
}
QString cMySQLPlugin::link()
{
return("http://www.windesign.at");
}
QString cMySQLPlugin::description()
{
return("This is the description.");
}
QString cMySQLPlugin::copyright()
{
return("This is the copyright.");
}
+143
View File
@@ -0,0 +1,143 @@
/**
* \defgroup MYSQL MySQL Database Connector Plugin
*
* \brief
*
* This module is designed to connect to MySQL Databases.
*
*/
/**
* \class cMySQLPlugin
*
* \brief MySQL Database Connector Plugin class
*
* \ingroup MYSQL
*
* This class implements the database connector for MySQL.
* All functions may be overwritten by derriving classes.
*
* \note
*
* \author Herwig Birke
*
* \version 1.0
*
* \date $Date: 2016/02/09
*/
#ifndef CMYSQLPLUGIN_H
#define CMYSQLPLUGIN_H
#include "cdbinterface.h"
#include <QtCore>
#include <QObject>
#include <QString>
#include <QSqlDatabase>
/**
* \brief
*
*/
class cMySQLPlugin : public QObject, public cDBInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "cMySQLPlugin" FILE "dMySQL.json")
Q_INTERFACES(cDBInterface)
public:
/**
* \brief Returns the version of the plugin API
*
* \return qint16 plugin API version
*/
qint16 pluginAPIVersion() { return(1); }
/**
* \brief Returns the name of the plugin
*
* \return QString name of the plugin
*/
QString pluginName() { return("MySQL DB"); }
/**
* \brief returns the version of the plugin
*
* \return qint16 version of the plugin
*/
qint16 pluginVersion() { return(1); }
/**
* \brief returns the type of the plugin.
*
* \return iType type of the plugin.
*
* Returns the type of the plugin. Possible values are:
* <ul>
* <li> cInterface::iTypeDB
* <br> plugin provides DB connector
* <li> cInterface::iTypeExport
* <br> plugin provides export capabilities
* <li> cInterface::iTypeImport
* <br> plugin provides import capabilities
* </ol>
* </ul>
*/
iType pluginType() { return(cInterface::iTypeDB); }
/**
* \brief connects to the database.
*
* \return bool true on success or false otherwise
*/
bool connect();
/**
* \brief initializes default settings for the plugin.
*
* \return bool true if settings where successfully tested or false otherwise.
*/
bool init();
/**
* \brief returns the last error string.
*
* \return QString last error
*/
QString lastError();
/**
* \brief calls the configuration dialog.
*
* \return bool true if the configuration has been changed successfully or false otherwise.
*/
bool config();
qint32 exists(const QString& szName, const QString& szGroup);
qint32 existsGroup(const QString& szGroup);
qint32 existsIngredient(qint32 id, qint16 ingredientNumber);
qint32 create(const QString& szName, const QString& szGroup);
qint32 createGroup(const QString& szGroup);
bool set(qint32 id, qint16 ingredientNumber, qreal value);
INGREDIENT_LIST ingredients();
QStringList groups();
bool beginTransaction();
bool endTransaction();
QString author();
QString company();
QString link();
QString description();
QString copyright();
protected:
/**
* \brief opens the database.
*
* \return bool true on success or false otherwise.
*/
bool open();
QSqlDatabase m_db; /*!< holds the database connection */
QString m_szLastError; /*!< holds the last error message */
};
#endif // CMYSQLPLUGIN_H
+3
View File
@@ -0,0 +1,3 @@
{
"Keys" : [ ]
}
+36
View File
@@ -0,0 +1,36 @@
#-------------------------------------------------
#
# Project created by QtCreator 2015-11-18T11:56:38
#
#-------------------------------------------------
QT += core gui sql
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = dMySQL
TEMPLATE = lib
CONFIG += plugin
SOURCES += \
cmysqlplugin.cpp \
cconfigdialog.cpp
HEADERS += \
cmysqlplugin.h \
cconfigdialog.h
OTHER_FILES += dMySQL.json
DESTDIR = ../bin/plugins
INCLUDEPATH += ../Kooky
unix {
target.path = /usr/lib
INSTALLS += target
}
DISTFILES += \
dMySQL.json
FORMS += \
cconfigdialog.ui
+257
View File
@@ -0,0 +1,257 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 3.5.0, 2016-01-25T10:39:00. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{90551da6-f083-4f65-96d6-4435a4c6527f}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="int">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap>
</valuemap>
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap"/>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.5.0 MinGW 32bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.5.0 MinGW 32bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.55.win32_mingw492_kit</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:/Users/birkeh/Documents/Projects/Kooky/build-dMySQL-Desktop_Qt_5_5_0_MinGW_32bit-Debug</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:/Users/birkeh/Documents/Projects/Kooky/build-dMySQL-Desktop_Qt_5_5_0_MinGW_32bit-Release</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy locally</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
<value type="int">0</value>
<value type="int">1</value>
<value type="int">2</value>
<value type="int">3</value>
<value type="int">4</value>
<value type="int">5</value>
<value type="int">6</value>
<value type="int">7</value>
<value type="int">8</value>
<value type="int">9</value>
<value type="int">10</value>
<value type="int">11</value>
<value type="int">12</value>
<value type="int">13</value>
<value type="int">14</value>
</valuelist>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Arguments"></value>
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Executable"></value>
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.WorkingDirectory">%{buildDir}</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Custom Executable</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="int">1</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">18</value>
</data>
<data>
<variable>Version</variable>
<value type="int">18</value>
</data>
</qtcreator>