aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/guiSQLiteStudio/completer
diff options
context:
space:
mode:
Diffstat (limited to 'SQLiteStudio3/guiSQLiteStudio/completer')
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/completer/completerview.cpp8
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/completer/completerwindow.cpp88
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/completer/completerwindow.h21
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/completer/completerwindow.ui66
4 files changed, 173 insertions, 10 deletions
diff --git a/SQLiteStudio3/guiSQLiteStudio/completer/completerview.cpp b/SQLiteStudio3/guiSQLiteStudio/completer/completerview.cpp
index c154b14..a209c42 100644
--- a/SQLiteStudio3/guiSQLiteStudio/completer/completerview.cpp
+++ b/SQLiteStudio3/guiSQLiteStudio/completer/completerview.cpp
@@ -1,6 +1,9 @@
#include "completerview.h"
#include "completeritemdelegate.h"
+#include "sqleditor.h"
+#include <QKeySequence>
#include <QMouseEvent>
+#include <QDebug>
CompleterView::CompleterView(QWidget *parent) :
QListView(parent)
@@ -46,6 +49,11 @@ void CompleterView::focusOutEvent(QFocusEvent* e)
void CompleterView::keyPressEvent(QKeyEvent* e)
{
+ QKeySequence hotkey = GET_SHORTCUTS_CATEGORY(SqlEditor).COMPLETE.get();
+ QKeySequence theKey = QKeySequence(e->key() | e->modifiers());
+ if (hotkey == theKey)
+ return;
+
QString txt = e->text();
if (!txt.isEmpty() && txt[0].isPrint())
{
diff --git a/SQLiteStudio3/guiSQLiteStudio/completer/completerwindow.cpp b/SQLiteStudio3/guiSQLiteStudio/completer/completerwindow.cpp
index 89a0848..68ca58d 100644
--- a/SQLiteStudio3/guiSQLiteStudio/completer/completerwindow.cpp
+++ b/SQLiteStudio3/guiSQLiteStudio/completer/completerwindow.cpp
@@ -4,16 +4,20 @@
#include "common/unused.h"
#include "sqleditor.h"
#include "common/utils_sql.h"
+#include "services/codesnippetmanager.h"
+#include "sqlitestudio.h"
#include <QKeyEvent>
+#include <QSignalMapper>
#include <QListView>
+#include <QShortcut>
#include <QDebug>
+#include <QListWidget>
CompleterWindow::CompleterWindow(SqlEditor *parent) :
QDialog(parent, Qt::FramelessWindowHint),
ui(new Ui::CompleterWindow),
sqlEditor(parent)
{
- ui->setupUi(this);
init();
}
@@ -24,6 +28,11 @@ CompleterWindow::~CompleterWindow()
void CompleterWindow::init()
{
+ ui->setupUi(this);
+
+ modeChangeShortcut = new QShortcut(GET_SHORTCUTS_CATEGORY(SqlEditor).COMPLETE.get(), this);
+ snippetSignalMapper = new QSignalMapper(this);
+
model = new CompleterModel(this);
ui->list->setModel(model);
model->setCompleterView(ui->list);
@@ -36,9 +45,42 @@ void CompleterWindow::init()
connect(ui->list, SIGNAL(backspace()), this, SIGNAL(backspacePressed()));
connect(ui->list, SIGNAL(left()), this, SIGNAL(leftPressed()));
connect(ui->list, SIGNAL(right()), this, SIGNAL(rightPressed()));
+ connect(modeChangeShortcut, SIGNAL(activated()), this, SLOT(modeChangeRequested()));
+ connect(ui->snippets, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(snippetDoubleClicked(QListWidgetItem*)));
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
+ connect(snippetSignalMapper, SIGNAL(mappedInt(int)), this, SLOT(snippetHotkeyPressed(int)));
+#else
+ connect(snippetSignalMapper, SIGNAL(mapped(int)), this, SLOT(snippetHotkeyPressed(int)));
+#endif
reset();
}
+void CompleterWindow::refreshSnippets()
+{
+ ui->snippets->clear();
+ for (QShortcut*& sc : snippetShortcuts)
+ delete sc;
+
+ snippetShortcuts.clear();
+
+ int i = 0;
+ for (CodeSnippetManager::CodeSnippet* snip : CODESNIPPETS->getSnippets())
+ {
+ ui->snippets->addItem(snip->name);
+ if (!snip->hotkey.isEmpty())
+ {
+ QShortcut* shortcut = new QShortcut(snip->hotkey, ui->snippets);
+ snippetShortcuts << shortcut;
+ snippetSignalMapper->setMapping(shortcut, i);
+ connect(shortcut, SIGNAL(activated()), snippetSignalMapper, SLOT(map()));
+ }
+ i++;
+ }
+
+ if (ui->snippets->count() > 0)
+ ui->snippets->setCurrentRow(0);
+}
+
void CompleterWindow::reset()
{
model->clear();
@@ -110,7 +152,17 @@ bool CompleterWindow::immediateResolution()
return false;
}
-ExpectedTokenPtr CompleterWindow::getSelected()
+CompleterWindow::Mode CompleterWindow::getMode() const
+{
+ return static_cast<Mode>(ui->modeStack->currentIndex());
+}
+
+QString CompleterWindow::getSnippetName() const
+{
+ return ui->snippets->currentItem()->text();
+}
+
+ExpectedTokenPtr CompleterWindow::getSelected() const
{
QModelIndex current = ui->list->currentIndex();
if (!current.isValid())
@@ -228,10 +280,42 @@ void CompleterWindow::currentRowChanged(const QModelIndex& current, const QModel
ui->status->showMessage(getStatusMsg(current));
}
+void CompleterWindow::modeChangeRequested()
+{
+ ui->modeStack->setCurrentIndex((ui->modeStack->currentIndex() + 1) % ui->modeStack->count());
+
+ switch (ui->modeStack->currentIndex())
+ {
+ case SNIPPETS:
+ ui->status->showMessage(tr("Insert a code snippet"));
+ refreshSnippets();
+ break;
+ case CODE:
+ ui->status->showMessage(getStatusMsg(ui->list->currentIndex()));
+ break;
+ }
+}
+
+void CompleterWindow::snippetHotkeyPressed(int index)
+{
+ ui->snippets->setCurrentRow(index);
+ accept();
+}
+
+void CompleterWindow::snippetDoubleClicked(QListWidgetItem* item)
+{
+ UNUSED(item);
+ accept();
+}
+
void CompleterWindow::showEvent(QShowEvent*e)
{
+ ui->modeStack->setCurrentIndex(0);
QDialog::showEvent(e);
// A hack for Gnome3 to give this widget a focus. Harmless for others.
ui->list->activateWindow();
+
+ // Refresh hotkey if changed
+ modeChangeShortcut->setKey(GET_SHORTCUTS_CATEGORY(SqlEditor).COMPLETE.get());
}
diff --git a/SQLiteStudio3/guiSQLiteStudio/completer/completerwindow.h b/SQLiteStudio3/guiSQLiteStudio/completer/completerwindow.h
index ec7256c..6e1f087 100644
--- a/SQLiteStudio3/guiSQLiteStudio/completer/completerwindow.h
+++ b/SQLiteStudio3/guiSQLiteStudio/completer/completerwindow.h
@@ -10,27 +10,37 @@
namespace Ui {
class CompleterWindow;
}
-
+class QListWidgetItem;
+class QSignalMapper;
class CompleterModel;
class QSizeGrip;
class SqlEditor;
+class QShortcut;
class GUI_API_EXPORT CompleterWindow : public QDialog
{
Q_OBJECT
public:
+ enum Mode
+ {
+ CODE,
+ SNIPPETS
+ };
+
explicit CompleterWindow(SqlEditor* parent = 0);
~CompleterWindow();
void reset();
void setData(const CompletionHelper::Results& completionResults);
void setDb(Db* db);
- ExpectedTokenPtr getSelected();
+ ExpectedTokenPtr getSelected() const;
int getNumberOfCharsToRemove();
void shringFilterBy(int chars);
void extendFilterBy(const QString& text);
bool immediateResolution();
+ Mode getMode() const;
+ QString getSnippetName() const;
protected:
void changeEvent(QEvent *e);
@@ -42,6 +52,7 @@ class GUI_API_EXPORT CompleterWindow : public QDialog
QString getStatusMsg(const QModelIndex& index);
void updateFilter();
void init();
+ void refreshSnippets();
Ui::CompleterWindow *ui = nullptr;
CompleterModel* model = nullptr;
@@ -49,11 +60,17 @@ class GUI_API_EXPORT CompleterWindow : public QDialog
QString filter;
Db* db = nullptr;
bool wrappedFilter = false;
+ QShortcut* modeChangeShortcut = nullptr;
+ QList<QShortcut*> snippetShortcuts;
+ QSignalMapper* snippetSignalMapper = nullptr;
private slots:
void focusOut();
void doubleClicked(const QModelIndex& index);
void currentRowChanged(const QModelIndex& current, const QModelIndex& previous);
+ void modeChangeRequested();
+ void snippetHotkeyPressed(int index);
+ void snippetDoubleClicked(QListWidgetItem* item);
signals:
void textTyped(const QString& text);
diff --git a/SQLiteStudio3/guiSQLiteStudio/completer/completerwindow.ui b/SQLiteStudio3/guiSQLiteStudio/completer/completerwindow.ui
index d5ce987..8944640 100644
--- a/SQLiteStudio3/guiSQLiteStudio/completer/completerwindow.ui
+++ b/SQLiteStudio3/guiSQLiteStudio/completer/completerwindow.ui
@@ -16,18 +16,72 @@
<property name="sizeGripEnabled">
<bool>true</bool>
</property>
- <layout class="QVBoxLayout" name="verticalLayout">
+ <layout class="QVBoxLayout" name="verticalLayout_3">
<property name="spacing">
<number>0</number>
</property>
- <property name="margin">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
<number>0</number>
</property>
<item>
- <widget class="CompleterView" name="list">
- <property name="alternatingRowColors">
- <bool>true</bool>
- </property>
+ <widget class="QStackedWidget" name="modeStack">
+ <widget class="QWidget" name="codeMode">
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="CompleterView" name="list">
+ <property name="alternatingRowColors">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="snippetMode">
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QListWidget" name="snippets"/>
+ </item>
+ </layout>
+ </widget>
</widget>
</item>
<item>