aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/coreSQLiteStudio/services/codesnippetmanager.cpp
blob: b50e791a8530173cb7153911db0e71afcba9cb01 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include "codesnippetmanager.h"
#include "common/utils.h"
#include "services/config.h"
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>

CodeSnippetManager::CodeSnippetManager(Config* config) :
    config(config)
{
    loadFromConfig();
    if (!CFG_CORE.Internal.DefaultSnippetsCreated.get())
        createDefaultSnippets();
}

void CodeSnippetManager::setSnippets(const QList<CodeSnippet*>& snippets)
{
    clearSnippets();
    allSnippets = snippets;
    refreshNames();
    saveToConfig();
}

const QList<CodeSnippetManager::CodeSnippet*>& CodeSnippetManager::getSnippets() const
{
    return allSnippets;
}

const QStringList& CodeSnippetManager::getNames() const
{
    return names;
}

void CodeSnippetManager::saveToConfig()
{
    QVariantList list;
    QHash<QString,QVariant> snHash;
    for (CodeSnippet*& snip : allSnippets)
    {
        snHash["name"] = snip->name;
        snHash["code"] = snip->code;
        snHash["hoteky"] = snip->hotkey;
        list << snHash;
    }
    CFG_CORE.Internal.CodeSnippets.set(list);
}

QString CodeSnippetManager::getCodeByName(const QString& name) const
{
    CodeSnippet* snippet = findFirst<CodeSnippet>(allSnippets, [name](CodeSnippet* snippet) -> bool
    {
        return snippet->name == name;
    });
    return snippet ? snippet->code : QString();
}

void CodeSnippetManager::loadFromConfig()
{
    clearSnippets();

    QVariantList list = CFG_CORE.Internal.CodeSnippets.get();
    QHash<QString,QVariant> snHash;
    CodeSnippet* snip = nullptr;
    for (const QVariant& var : list)
    {
        snHash = var.toHash();
        snip = new CodeSnippet();
        snip->name = snHash["name"].toString();
        snip->code = snHash["code"].toString();
        snip->hotkey = snHash["hoteky"].toString();
        allSnippets << snip;
    }
    refreshNames();
}

void CodeSnippetManager::refreshNames()
{
    names = map<CodeSnippet*, QString>(allSnippets, [](CodeSnippet* snippet) -> QString
    {
        return snippet->name;
    });
}

void CodeSnippetManager::clearSnippets()
{
    for (CodeSnippet*& snip : allSnippets)
        delete snip;

    allSnippets.clear();
}

void CodeSnippetManager::createDefaultSnippets()
{
    CodeSnippet* snip = new CodeSnippet();
    snip->name = "Create Table";
    snip->code = "CREATE TABLE tableName (\n"
                  "   id      INTEGER PRIMARY KEY AUTOINCREMENT,\n"
                  "   value   TEXT,\n"
                  "   image   BLOB\n"
                  ");";
    snip->hotkey = "c";
    allSnippets << snip;

    snip = new CodeSnippet();
    snip->name = "With Recursive";
    snip->code = "WITH RECURSIVE\n"
                  "   cnt(x) AS (\n"
                  "       SELECT 1\n"
                  "        UNION ALL\n"
                  "       SELECT x+1 FROM cnt\n"
                  "        LIMIT 1000000\n"
                  "   )\n"
                  "SELECT x FROM cnt;";
    snip->hotkey = "w";
    allSnippets << snip;

    saveToConfig();
    CFG_CORE.Internal.DefaultSnippetsCreated.set(true);
}