ui: IDE communication integration

* handled communication from VS to Coati and vice versa.
* one bug still remains: Coati regards a tab as a single character while VS regards it as multiple characters. This causes offsets in communicated positions.
This commit is contained in:
malte_langkabel
2015-10-23 13:25:15 +02:00
parent c06beb21cb
commit c704b4f65c
15 changed files with 104 additions and 60 deletions
+33 -4
View File
@@ -1,5 +1,6 @@
#include "qt/element/QtCodeArea.h"
#include <qapplication.h>
#include <QFont>
#include <QHBoxLayout>
#include <QPainter>
@@ -11,6 +12,7 @@
#include "utility/messaging/type/MessageShowFile.h"
#include "utility/messaging/type/MessageFocusIn.h"
#include "utility/messaging/type/MessageFocusOut.h"
#include "utility/messaging/type/MessageMoveIDECursor.h"
#include "utility/utility.h"
#include "data/location/TokenLocation.h"
@@ -249,12 +251,20 @@ void QtCodeArea::mouseReleaseEvent(QMouseEvent* event)
if (event->button() == Qt::LeftButton)
{
m_panningValue = -1;
QTextCursor cursor = this->cursorForPosition(event->pos());
std::vector<Id> locationIds = findLocationIdsForPosition(cursor.position());
if (locationIds.size())
if (Qt::KeyboardModifier::ControlModifier && QApplication::keyboardModifiers())
{
MessageActivateTokenLocations(locationIds).dispatch();
std::pair<int, int> lineColumn = toLineColumn(this->cursorForPosition(event->pos()).position());
MessageMoveIDECursor(m_locationFile->getFilePath().str(), lineColumn.first, lineColumn.second).dispatch();
}
else
{
QTextCursor cursor = this->cursorForPosition(event->pos());
std::vector<Id> locationIds = findLocationIdsForPosition(cursor.position());
if (locationIds.size())
{
MessageActivateTokenLocations(locationIds).dispatch();
}
}
}
}
@@ -566,6 +576,25 @@ int QtCodeArea::toTextEditPosition(int lineNumber, int columnNumber) const
return position;
}
std::pair<int, int> QtCodeArea::toLineColumn(int textEditPosition) const
{
int lineNumber = m_startLineNumber;
for (int i = 0; i < document()->lineCount(); i++)
{
int nextTextEditPosition = textEditPosition - document()->findBlockByLineNumber(i).length();
if (nextTextEditPosition >= 0)
{
textEditPosition = nextTextEditPosition;
lineNumber++;
}
else
{
break;
}
}
return std::make_pair(lineNumber, textEditPosition);
}
int QtCodeArea::startTextEditPosition() const
{
return 0;
+1
View File
@@ -114,6 +114,7 @@ private:
bool locationBelongsToSnippet(TokenLocation* location) const;
int toTextEditPosition(int lineNumber, int columnNumber) const;
std::pair<int, int> toLineColumn(int textEditPosition) const;
int startTextEditPosition() const;
int endTextEditPosition() const;
@@ -2,8 +2,9 @@
#include <functional>
QtIDECommunicationController::QtIDECommunicationController(QObject* parent)
: m_tcpWrapper(parent)
QtIDECommunicationController::QtIDECommunicationController(QObject* parent, StorageAccess* storageAccess)
: IDECommunicationController(storageAccess)
, m_tcpWrapper(parent)
{
m_tcpWrapper.setReadCallback(std::bind(&QtIDECommunicationController::handleIncomingMessage, this, std::placeholders::_1));
}
@@ -7,11 +7,13 @@
#include "component/controller/IDECommunicationController.h"
class StorageAccess;
class QtIDECommunicationController
: public IDECommunicationController
{
public:
QtIDECommunicationController(QObject* parent);
QtIDECommunicationController(QObject* parent, StorageAccess* storageAccess);
~QtIDECommunicationController();
private:
+2 -2
View File
@@ -10,7 +10,7 @@ QtNetworkFactory::~QtNetworkFactory()
{
}
std::shared_ptr<IDECommunicationController> QtNetworkFactory::createIDECommunicationController() const
std::shared_ptr<IDECommunicationController> QtNetworkFactory::createIDECommunicationController(StorageAccess* storageAccess) const
{
return std::make_shared<QtIDECommunicationController>(nullptr);
return std::make_shared<QtIDECommunicationController>(nullptr, storageAccess);
}
+1 -1
View File
@@ -9,7 +9,7 @@ public:
QtNetworkFactory();
virtual ~QtNetworkFactory();
virtual std::shared_ptr<IDECommunicationController> createIDECommunicationController() const;
virtual std::shared_ptr<IDECommunicationController> createIDECommunicationController(StorageAccess* storageAccess) const;
};
#endif // QT_NETWORK_FACTORY_H
+1 -18
View File
@@ -2,23 +2,6 @@
#include "utility/logging/logging.h"
QtTcpWrapper::QtTcpWrapper(QObject* parent)
: QObject(parent)
, m_port(6667)
, m_ip("127.0.0.1")
{
QHostAddress address(m_ip.c_str());
m_tcpServer = new QTcpServer(this);
connect(m_tcpServer, SIGNAL(newConnection()), this, SLOT(acceptConnection()));
if (!m_tcpServer->listen(QHostAddress::LocalHost, m_port))
{
LOG_ERROR_STREAM(<< "TCP server failed to start. Unable to listen for IDE plugin messages.");
}
}
QtTcpWrapper::QtTcpWrapper(QObject* parent, const std::string& ip, const quint16 port)
: QObject(parent)
, m_port(port)
@@ -32,7 +15,7 @@ QtTcpWrapper::QtTcpWrapper(QObject* parent, const std::string& ip, const quint16
if (!m_tcpServer->listen(QHostAddress::LocalHost, m_port))
{
LOG_ERROR_STREAM(<< "TCP server failed to start. Unable to listen for IDE plugin messages.");
LOG_ERROR_STREAM(<< "TCP server failed to start with error: \"" + m_tcpServer->errorString().toStdString() + "\". Unable to listen for IDE plugin messages.");
}
}
+1 -2
View File
@@ -13,8 +13,7 @@ class QtTcpWrapper : public QObject
Q_OBJECT
public:
QtTcpWrapper(QObject* parent);
QtTcpWrapper(QObject* parent, const std::string& ip, const quint16 port);
QtTcpWrapper(QObject* parent, const std::string& ip = "127.0.0.1", const quint16 port = 6667);
~QtTcpWrapper();
void sendMessage(const std::string& message) const;