Skip to content

Commit

Permalink
Decouple TextRender from Util
Browse files Browse the repository at this point in the history
  • Loading branch information
pvuorela committed Jun 8, 2016
1 parent f3db38c commit 1ba4bd7
Show file tree
Hide file tree
Showing 8 changed files with 155 additions and 157 deletions.
2 changes: 0 additions & 2 deletions main.cpp
Expand Up @@ -155,11 +155,9 @@ int main(int argc, char *argv[])
if(!root)
qFatal("no root object - qml error");

TextRender *tr = root->findChild<TextRender*>("textrender");
term.setWindow(&view);
util.setWindow(&view);
util.setTerm(&term);
util.setRenderer(tr);

QObject::connect(view.engine(),SIGNAL(quit()),&app,SLOT(quit()));

Expand Down
7 changes: 3 additions & 4 deletions qml/Main.qml
Expand Up @@ -143,7 +143,7 @@ Item {
multiTouchArea.firstTouchId = touchPoint.pointId;

//gestures c++ handler
util.mousePress(touchPoint.x, touchPoint.y);
textrender.mousePress(touchPoint.x, touchPoint.y);
}

var key = vkb.keyAt(touchPoint.x, touchPoint.y);
Expand All @@ -157,7 +157,7 @@ Item {
touchPoints.forEach(function (touchPoint) {
if (multiTouchArea.firstTouchId == touchPoint.pointId) {
//gestures c++ handler
util.mouseMove(touchPoint.x, touchPoint.y);
textrender.mouseMove(touchPoint.x, touchPoint.y);
}

var key = multiTouchArea.pressedKeys[touchPoint.pointId];
Expand Down Expand Up @@ -185,7 +185,7 @@ Item {
}

//gestures c++ handler
util.mouseRelease(touchPoint.x, touchPoint.y);
textrender.mouseRelease(touchPoint.x, touchPoint.y);
multiTouchArea.firstTouchId = -1;
}

Expand Down Expand Up @@ -236,7 +236,6 @@ Item {
property int duration
property int cutAfter: height

objectName: "textrender"
height: parent.height
width: parent.width

Expand Down
10 changes: 6 additions & 4 deletions terminal.cpp
Expand Up @@ -1450,7 +1450,7 @@ void Terminal::adjustSelectionPosition(int lines)
emit selectionChanged();
}

void Terminal::setSelection(QPoint start, QPoint end)
void Terminal::setSelection(QPoint start, QPoint end, bool selectionOngoing)
{
if (start.y() > end.y())
qSwap(start, end);
Expand All @@ -1469,6 +1469,10 @@ void Terminal::setSelection(QPoint start, QPoint end)
iSelection = QRect(start, end);

emit selectionChanged();

if (!selectionOngoing) {
emit selectionFinished();
}
}

void Terminal::clearSelection()
Expand All @@ -1478,9 +1482,7 @@ void Terminal::clearSelection()

iSelection = QRect();

if (iUtil)
iUtil->selectionFinished();

emit selectionFinished();
emit selectionChanged();
}

Expand Down
3 changes: 2 additions & 1 deletion terminal.h
Expand Up @@ -93,7 +93,7 @@ class Terminal : public QObject
int backBufferScrollPos() { return iBackBufferScrollPos; }
void resetBackBufferScrollPos();

void setSelection(QPoint start, QPoint end);
void setSelection(QPoint start, QPoint end, bool selectionOngoing);
QRect selection();
Q_INVOKABLE void clearSelection();
bool hasSelection();
Expand All @@ -106,6 +106,7 @@ class Terminal : public QObject
void displayBufferChanged();
void selectionChanged();
void scrollBackBufferAdjusted(bool reset);
void selectionFinished();

private:
Q_DISABLE_COPY(Terminal)
Expand Down
115 changes: 114 additions & 1 deletion textrender.cpp
Expand Up @@ -26,7 +26,8 @@ Terminal* TextRender::sTerm = 0;
Util* TextRender::sUtil = 0;

TextRender::TextRender(QQuickItem *parent) :
QQuickPaintedItem(parent)
QQuickPaintedItem(parent),
newSelection(true)
{
setFlag(ItemHasContents);

Expand Down Expand Up @@ -302,6 +303,73 @@ void TextRender::updateTermSize()
sTerm->setTermSize(size);
}

void TextRender::mousePress(float eventX, float eventY)
{
if(!sUtil->allowGestures())
return;

dragOrigin = QPointF(eventX, eventY);
newSelection = true;
}

void TextRender::mouseMove(float eventX, float eventY)
{
QPointF eventPos(eventX, eventY);

if(!sUtil->allowGestures())
return;

if(sUtil->settingsValue("ui/dragMode")=="scroll") {
dragOrigin = scrollBackBuffer(eventPos, dragOrigin);
}
else if(sUtil->settingsValue("ui/dragMode")=="select") {
selectionHelper(eventPos, true);
}
}

void TextRender::mouseRelease(float eventX, float eventY)
{
QPointF eventPos(eventX, eventY);
const int reqDragLength = 140;

if(!sUtil->allowGestures())
return;

if(sUtil->settingsValue("ui/dragMode")=="gestures") {
int xdist = qAbs(eventPos.x() - dragOrigin.x());
int ydist = qAbs(eventPos.y() - dragOrigin.y());
if(eventPos.x() < dragOrigin.x()-reqDragLength && xdist > ydist*2)
doGesture(PanLeft);
else if(eventPos.x() > dragOrigin.x()+reqDragLength && xdist > ydist*2)
doGesture(PanRight);
else if(eventPos.y() > dragOrigin.y()+reqDragLength && ydist > xdist*2)
doGesture(PanDown);
else if(eventPos.y() < dragOrigin.y()-reqDragLength && ydist > xdist*2)
doGesture(PanUp);
}
else if(sUtil->settingsValue("ui/dragMode")=="scroll") {
scrollBackBuffer(eventPos, dragOrigin);
}
else if(sUtil->settingsValue("ui/dragMode")=="select") {
selectionHelper(eventPos, false);
}
}

void TextRender::selectionHelper(QPointF scenePos, bool selectionOngoing)
{
int yCorr = fontDescent();

QPoint start(qRound((dragOrigin.x()+2) / fontWidth()),
qRound((dragOrigin.y()+yCorr) / fontHeight()));
QPoint end(qRound((scenePos.x()+2) / fontWidth()),
qRound((scenePos.y()+yCorr) / fontHeight()));

if (start != end) {
sTerm->setSelection(start, end, selectionOngoing);
newSelection = false;
}
}

void TextRender::handleScrollBack(bool reset)
{
if (reset) {
Expand Down Expand Up @@ -343,3 +411,48 @@ QSize TextRender::cursorPixelSize()
{
return QSize(iFontWidth, iFontHeight);
}

QPointF TextRender::scrollBackBuffer(QPointF now, QPointF last)
{
if(!sTerm)
return last;

int xdist = qAbs(now.x() - last.x());
int ydist = qAbs(now.y() - last.y());
int fontSize = sUtil->settingsValue("ui/fontSize").toInt();

int lines = ydist / fontSize;

if(lines > 0 && now.y() < last.y() && xdist < ydist*2) {
sTerm->scrollBackBufferFwd(lines);
last = QPointF(now.x(), last.y() - lines * fontSize);
} else if(lines > 0 && now.y() > last.y() && xdist < ydist*2) {
sTerm->scrollBackBufferBack(lines);
last = QPointF(now.x(), last.y() + lines * fontSize);
}

return last;
}

void TextRender::doGesture(PanGesture gesture)
{
if(!sTerm)
return;

if( gesture==PanLeft ) {
sUtil->notifyText(sUtil->settingsValue("gestures/panLeftTitle").toString());
sTerm->putString(sUtil->settingsValue("gestures/panLeftCommand").toString(), true);
}
else if( gesture==PanRight ) {
sUtil->notifyText(sUtil->settingsValue("gestures/panRightTitle").toString());
sTerm->putString(sUtil->settingsValue("gestures/panRightCommand").toString(), true);
}
else if( gesture==PanDown ) {
sUtil->notifyText(sUtil->settingsValue("gestures/panDownTitle").toString());
sTerm->putString(sUtil->settingsValue("gestures/panDownCommand").toString(), true);
}
else if( gesture==PanUp ) {
sUtil->notifyText(sUtil->settingsValue("gestures/panUpTitle").toString());
sTerm->putString(sUtil->settingsValue("gestures/panUpCommand").toString(), true);
}
}
19 changes: 19 additions & 0 deletions textrender.h
Expand Up @@ -61,17 +61,36 @@ class TextRender : public QQuickPaintedItem
public slots:
void redraw();
void updateTermSize();
void mousePress(float eventX, float eventY);
void mouseMove(float eventX, float eventY);
void mouseRelease(float eventX, float eventY);

private slots:
void handleScrollBack(bool reset);

private:
Q_DISABLE_COPY(TextRender)

enum PanGesture { PanNone, PanLeft, PanRight, PanUp, PanDown };

void paintFromBuffer(QPainter* painter, QList<QList<TermChar> >& buffer, int from, int to, int &y);
void drawBgFragment(QPainter* painter, int x, int y, int width, TermChar style);
void drawTextFragment(QPainter* painter, int x, int y, QString text, TermChar style);
QPoint charsToPixels(QPoint pos);
void selectionHelper(QPointF scenePos, bool selectionOngoing);

/**
* Scroll the back buffer on drag.
*
* @param now The current position
* @param last The last position (or start position)
* @return The new value for last (modified by any consumed offset)
**/
QPointF scrollBackBuffer(QPointF now, QPointF last);
void doGesture(PanGesture gesture);

bool newSelection;
QPointF dragOrigin;

QFont iFont;
int iFontWidth;
Expand Down

0 comments on commit 1ba4bd7

Please sign in to comment.