diff options
Diffstat (limited to 'SQLiteStudio3/guiSQLiteStudio/completer')
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> |
