summaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/guiSQLiteStudio/windows/functionseditormodel.cpp
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@ubuntu.com>2014-12-06 17:33:25 -0500
committerLibravatarUnit 193 <unit193@ubuntu.com>2014-12-06 17:33:25 -0500
commit7167ce41b61d2ba2cdb526777a4233eb84a3b66a (patch)
treea35c14143716e1f2c98f808c81f89426045a946f /SQLiteStudio3/guiSQLiteStudio/windows/functionseditormodel.cpp
Imported Upstream version 2.99.6upstream/2.99.6
Diffstat (limited to 'SQLiteStudio3/guiSQLiteStudio/windows/functionseditormodel.cpp')
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/windows/functionseditormodel.cpp348
1 files changed, 348 insertions, 0 deletions
diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/functionseditormodel.cpp b/SQLiteStudio3/guiSQLiteStudio/windows/functionseditormodel.cpp
new file mode 100644
index 0000000..cf7efdf
--- /dev/null
+++ b/SQLiteStudio3/guiSQLiteStudio/windows/functionseditormodel.cpp
@@ -0,0 +1,348 @@
+#include "functionseditormodel.h"
+#include "common/strhash.h"
+#include "common/unused.h"
+#include "services/pluginmanager.h"
+#include "plugins/scriptingplugin.h"
+#include "icon.h"
+#include <QDebug>
+
+#define SETTER(X, Y) \
+ if (!isValidRowIndex(row) || X == Y) \
+ return; \
+ \
+ X = Y; \
+ emitDataChanged(row);
+
+#define GETTER(X, Y) \
+ if (!isValidRowIndex(row)) \
+ return Y; \
+ \
+ return X;
+
+FunctionsEditorModel::FunctionsEditorModel(QObject *parent) :
+ QAbstractListModel(parent)
+{
+ init();
+}
+
+void FunctionsEditorModel::clearModified()
+{
+ beginResetModel();
+ foreach (Function* func, functionList)
+ func->modified = false;
+
+ listModified = false;
+ originalFunctionList = functionList;
+
+ endResetModel();
+}
+
+bool FunctionsEditorModel::isModified() const
+{
+ if (functionList != originalFunctionList)
+ return true;
+
+ foreach (Function* func, functionList)
+ {
+ if (func->modified)
+ return true;
+ }
+ return false;
+}
+
+bool FunctionsEditorModel::isModified(int row) const
+{
+ GETTER(functionList[row]->modified, false);
+}
+
+void FunctionsEditorModel::setModified(int row, bool modified)
+{
+ SETTER(functionList[row]->modified, modified);
+}
+
+bool FunctionsEditorModel::isValid() const
+{
+ foreach (Function* func, functionList)
+ {
+ if (!func->valid)
+ return false;
+ }
+ return true;
+}
+
+bool FunctionsEditorModel::isValid(int row) const
+{
+ GETTER(functionList[row]->valid, false);
+}
+
+void FunctionsEditorModel::setValid(int row, bool valid)
+{
+ SETTER(functionList[row]->valid, valid);
+}
+
+void FunctionsEditorModel::setCode(int row, const QString& code)
+{
+ SETTER(functionList[row]->data.code, code);
+}
+
+QString FunctionsEditorModel::getCode(int row) const
+{
+ GETTER(functionList[row]->data.code, QString::null);
+}
+
+void FunctionsEditorModel::setFinalCode(int row, const QString& code)
+{
+ SETTER(functionList[row]->data.finalCode, code);
+}
+
+QString FunctionsEditorModel::getFinalCode(int row) const
+{
+ GETTER(functionList[row]->data.finalCode, QString::null);
+}
+
+void FunctionsEditorModel::setInitCode(int row, const QString& code)
+{
+ SETTER(functionList[row]->data.initCode, code);
+}
+
+QString FunctionsEditorModel::getInitCode(int row) const
+{
+ GETTER(functionList[row]->data.initCode, QString::null);
+}
+
+void FunctionsEditorModel::setName(int row, const QString& newName)
+{
+ SETTER(functionList[row]->data.name, newName);
+}
+
+QString FunctionsEditorModel::getName(int row) const
+{
+ GETTER(functionList[row]->data.name, QString::null);
+}
+
+void FunctionsEditorModel::setLang(int row, const QString& lang)
+{
+ SETTER(functionList[row]->data.lang, lang);
+}
+
+QString FunctionsEditorModel::getLang(int row) const
+{
+ GETTER(functionList[row]->data.lang, QString::null);
+}
+
+bool FunctionsEditorModel::getUndefinedArgs(int row) const
+{
+ GETTER(functionList[row]->data.undefinedArgs, true);
+}
+
+void FunctionsEditorModel::setUndefinedArgs(int row, bool value)
+{
+ SETTER(functionList[row]->data.undefinedArgs, value);
+}
+
+bool FunctionsEditorModel::getAllDatabases(int row) const
+{
+ GETTER(functionList[row]->data.allDatabases, true);
+}
+
+void FunctionsEditorModel::setAllDatabases(int row, bool value)
+{
+ SETTER(functionList[row]->data.allDatabases, value);
+}
+
+FunctionManager::ScriptFunction::Type FunctionsEditorModel::getType(int row) const
+{
+ GETTER(functionList[row]->data.type, FunctionManager::ScriptFunction::SCALAR);
+}
+
+void FunctionsEditorModel::setType(int row, FunctionManager::ScriptFunction::Type type)
+{
+ SETTER(functionList[row]->data.type, type);
+}
+
+bool FunctionsEditorModel::isAggregate(int row) const
+{
+ GETTER(functionList[row]->data.type == FunctionManager::ScriptFunction::AGGREGATE, false);
+}
+
+bool FunctionsEditorModel::isScalar(int row) const
+{
+ GETTER(functionList[row]->data.type == FunctionManager::ScriptFunction::SCALAR, false);
+}
+
+QStringList FunctionsEditorModel::getArguments(int row) const
+{
+ GETTER(functionList[row]->data.arguments, QStringList());
+}
+
+void FunctionsEditorModel::setArguments(int row, const QStringList& value)
+{
+ SETTER(functionList[row]->data.arguments, value);
+}
+
+QStringList FunctionsEditorModel::getDatabases(int row) const
+{
+ GETTER(functionList[row]->data.databases, QStringList());
+}
+
+void FunctionsEditorModel::setDatabases(int row, const QStringList& value)
+{
+ SETTER(functionList[row]->data.databases, value);
+}
+
+void FunctionsEditorModel::setData(const QList<FunctionManager::ScriptFunction*>& functions)
+{
+ beginResetModel();
+
+ for (Function* functionPtr : functionList)
+ delete functionPtr;
+
+ functionList.clear();
+
+ foreach (FunctionManager::ScriptFunction* func, functions)
+ functionList << new Function(func);
+
+ listModified = false;
+ originalFunctionList = functionList;
+
+ endResetModel();
+}
+
+void FunctionsEditorModel::addFunction(FunctionManager::ScriptFunction* function)
+{
+ int row = functionList.size();
+
+ beginInsertRows(QModelIndex(), row, row);
+
+ functionList << new Function(function);
+ listModified = true;
+
+ endInsertRows();
+}
+
+void FunctionsEditorModel::deleteFunction(int row)
+{
+ if (!isValidRowIndex(row))
+ return;
+
+ beginRemoveRows(QModelIndex(), row, row);
+
+ delete functionList[row];
+ functionList.removeAt(row);
+
+ listModified = true;
+
+ endRemoveRows();
+}
+
+QList<FunctionManager::ScriptFunction*> FunctionsEditorModel::generateFunctions() const
+{
+ QList<FunctionManager::ScriptFunction*> results;
+
+ foreach (Function* func, functionList)
+ results << new FunctionManager::ScriptFunction(func->data);
+
+ return results;
+}
+
+QStringList FunctionsEditorModel::getFunctionNames() const
+{
+ QStringList names;
+ foreach (Function* func, functionList)
+ names << func->data.name;
+
+ return names;
+}
+
+void FunctionsEditorModel::validateNames()
+{
+ StrHash<QList<int>> counter;
+
+ int row = 0;
+ foreach (Function* func, functionList)
+ {
+ func->valid &= true;
+ counter[func->data.name] << row++;
+ }
+
+ QHashIterator<QString,QList<int>> cntIt = counter.iterator();
+ while (cntIt.hasNext())
+ {
+ cntIt.next();
+ if (cntIt.value().size() > 1)
+ {
+ foreach (int cntRow, cntIt.value())
+ setValid(cntRow, false);
+ }
+ }
+
+ QModelIndex idx;
+ for (int i = 0; i < functionList.size(); i++)
+ {
+ idx = index(i);
+ emit dataChanged(idx, idx);
+ }
+}
+
+bool FunctionsEditorModel::isAllowedName(int rowToSkip, const QString& nameToValidate)
+{
+ QStringList names = getFunctionNames();
+ names.removeAt(rowToSkip);
+ return !names.contains(nameToValidate, Qt::CaseInsensitive);
+}
+
+int FunctionsEditorModel::rowCount(const QModelIndex& parent) const
+{
+ UNUSED(parent);
+ return functionList.size();
+}
+
+QVariant FunctionsEditorModel::data(const QModelIndex& index, int role) const
+{
+ if (!index.isValid() || !isValidRowIndex(index.row()))
+ return QVariant();
+
+ if (role == Qt::DisplayRole)
+ {
+ Function* fn = functionList[index.row()];
+ return fn->data.toString();
+ }
+
+ if (role == Qt::DecorationRole && langToIcon.contains(functionList[index.row()]->data.lang))
+ {
+ QIcon icon = langToIcon[functionList[index.row()]->data.lang];
+ if (!functionList[index.row()]->valid)
+ icon = Icon::merge(icon, Icon::ERROR);
+
+ return icon;
+ }
+
+ return QVariant();
+}
+
+void FunctionsEditorModel::init()
+{
+ foreach (ScriptingPlugin* plugin, PLUGINS->getLoadedPlugins<ScriptingPlugin>())
+ langToIcon[plugin->getLanguage()] = QIcon(plugin->getIconPath());
+}
+
+bool FunctionsEditorModel::isValidRowIndex(int row) const
+{
+ return (row >= 0 && row < functionList.size());
+}
+
+void FunctionsEditorModel::emitDataChanged(int row)
+{
+ QModelIndex idx = index(row);
+ emit dataChanged(idx, idx);
+}
+
+FunctionsEditorModel::Function::Function()
+{
+}
+
+FunctionsEditorModel::Function::Function(FunctionManager::ScriptFunction* other)
+{
+ data = FunctionManager::ScriptFunction(*other);
+ originalName = data.name;
+}