From 1d136228bb4394f8dba6ab9139217d4d64078159 Mon Sep 17 00:00:00 2001
From: Andrea Ricchi
Date: Thu, 24 Jan 2019 10:41:41 +1100
Subject: Bug [#1548]. Implement calltips on Qt.
---
doc/ScintillaDoc.html | 2 --
doc/ScintillaHistory.html | 5 +++++
qt/ScintillaEditBase/ScintillaQt.cpp | 27 ++++++++++++++++++++++++++-
3 files changed, 31 insertions(+), 3 deletions(-)
diff --git a/doc/ScintillaDoc.html b/doc/ScintillaDoc.html
index 891b4ce7d..d1ce91a31 100644
--- a/doc/ScintillaDoc.html
+++ b/doc/ScintillaDoc.html
@@ -5002,8 +5002,6 @@ struct Sci_TextToFind {
There is some interaction between call tips and autocompletion lists in that showing a
call tip cancels any active autocompletion list, and vice versa.
- Call tips are not implemented on Qt.
-
Call tips can highlight part of the text within them. You could use this to highlight the
current argument to a function by counting the number of commas (or whatever separator your
language uses). See SciTEBase::CharAdded() in SciTEBase.cxx for an
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html
index 6a90f17e0..ec2e9d874 100644
--- a/doc/ScintillaHistory.html
+++ b/doc/ScintillaHistory.html
@@ -540,6 +540,7 @@
jj5 |
| Jad Altahan |
+ Andrea Ricchi |
@@ -558,6 +559,10 @@
Released 10 January 2019.
+
+ Calltips implemented on Qt.
+ Bug #1548.
+
The C++ lexer, with styling.within.preprocessor on, now interprets "(" in preprocessor "#if("
as an operator instead of part of the directive. This improves folding as well which could become
diff --git a/qt/ScintillaEditBase/ScintillaQt.cpp b/qt/ScintillaEditBase/ScintillaQt.cpp
index 804cd2dc0..dcdd7e314 100644
--- a/qt/ScintillaEditBase/ScintillaQt.cpp
+++ b/qt/ScintillaEditBase/ScintillaQt.cpp
@@ -613,11 +613,36 @@ void ScintillaQt::StartDrag()
SetDragPosition(SelectionPosition(Sci::invalidPosition));
}
+class CallTipImpl : public QWidget {
+public:
+ CallTipImpl(CallTip *pct_)
+ : QWidget(nullptr, Qt::ToolTip),
+ pct(pct_)
+ {
+ setWindowFlag(Qt::WindowTransparentForInput);
+ }
+
+ void paintEvent(QPaintEvent *) override
+ {
+ if (pct->inCallTipMode) {
+ Surface *surfaceWindow = Surface::Allocate(0);
+ surfaceWindow->Init(this);
+ surfaceWindow->SetUnicodeMode(SC_CP_UTF8 == pct->codePage);
+ surfaceWindow->SetDBCSMode(pct->codePage);
+ pct->PaintCT(surfaceWindow);
+ delete surfaceWindow;
+ }
+ }
+
+private:
+ CallTip *pct;
+};
+
void ScintillaQt::CreateCallTipWindow(PRectangle rc)
{
if (!ct.wCallTip.Created()) {
- QWidget *pCallTip = new QWidget(0, Qt::ToolTip);
+ QWidget *pCallTip = new CallTipImpl(&ct);
ct.wCallTip = pCallTip;
pCallTip->move(rc.left, rc.top);
pCallTip->resize(rc.Width(), rc.Height());
--
cgit v1.2.3