r16074 by pierremarc - Made text selection possible and fixed a couple of text cursor issues.
scribus-commit
scribus-commit at lists.scribus.net
Mon Dec 6 16:39:17 CET 2010
Author: pierremarc
Date: Mon Dec 6 15:39:16 2010
New Revision: 16074
URL: http://scribus.info/websvn/listing.php?repname=Scribus&sc=1&rev=16074
Log:
Made text selection possible and fixed a couple of text cursor issues.
Modified:
branches/ScribusOIF/scribus/canvasmode_edit.cpp
branches/ScribusOIF/scribus/pageitem_textframe.cpp
branches/ScribusOIF/scribus/scribusview.cpp
branches/ScribusOIF/scribus/sctextstruct.h
branches/ScribusOIF/scribus/text/boxes.cpp
branches/ScribusOIF/scribus/text/storytext.cpp
branches/ScribusOIF/scribus/text/storytext.h
Modified: branches/ScribusOIF/scribus/canvasmode_edit.cpp
URL: http://scribus.info/websvn/diff.php?repname=Scribus&rev=16074&path=/branches/ScribusOIF/scribus/canvasmode_edit.cpp
==============================================================================
--- branches/ScribusOIF/scribus/canvasmode_edit.cpp (original)
+++ branches/ScribusOIF/scribus/canvasmode_edit.cpp Mon Dec 6 15:39:16 2010
@@ -176,7 +176,7 @@
{
if(textframe->lastInFrame() < 0)
return;
- if ( m_blinkTime.elapsed() > qApp->cursorFlashTime() / 2 )
+ if ( m_blinkTime.elapsed() > qApp->cursorFlashTime() / 2)
{
m_cursorVisible = !m_cursorVisible;
m_blinkTime.restart();
@@ -299,9 +299,9 @@
{
bbox = textframe->textLayout->boundingBox ( textCursorPos );
cursorDirection = !textframe->itemText.charAttributes(textCursorPos).testFlag(TextFlag_RightToLeft);
- dx = cursorDirection ? bbox.x() :bbox.right() ;
+ dx = cursorDirection ? bbox.right() : bbox.x();
dy = bbox.y();
- dx += bbox.width();
+// dx += bbox.width();
if ( bbox.height() <= 2 )
dy1 = bbox.y() + textframe->itemText.charStyle ( textCursorPos ).fontSize() / 30.0;
else
@@ -317,10 +317,10 @@
bbox = textframe->textLayout->boundingBox ( textCursorPos );
dx = cursorDirection ? bbox.x() :bbox.right();
dy = bbox.y();
-// if ( bbox.height() <= 2 )
-// dy1 = bbox.y() + textframe->itemText.charStyle ( textCursorPos ).fontSize() / 30.0;
-// else
- dy1 = bbox.y() + bbox.height();
+ if ( bbox.height() <= 2 )
+ dy1 = bbox.y() + textframe->itemText.charStyle ( textCursorPos ).fontSize() / 30.0;
+ else
+ dy1 = bbox.y() + textframe->textLayout->boxAscent(textCursorPos);
cPen.setColor ( ScColorEngine::getRGBColor ( m_doc->PageColors[textframe->itemText.charStyle ( textCursorPos ).fillColor() ], m_doc ) );
}
Modified: branches/ScribusOIF/scribus/pageitem_textframe.cpp
URL: http://scribus.info/websvn/diff.php?repname=Scribus&rev=16074&path=/branches/ScribusOIF/scribus/pageitem_textframe.cpp
==============================================================================
--- branches/ScribusOIF/scribus/pageitem_textframe.cpp (original)
+++ branches/ScribusOIF/scribus/pageitem_textframe.cpp Mon Dec 6 15:39:16 2010
@@ -378,10 +378,10 @@
assert( lastInFrame() < itemText.length() );
RenderOptions options;
- options.markSelection = itemText.lengthOfSelection() > 0;
+ options.markSelection = (itemText.lengthOfSelection() > 0) && (m_Doc->appMode == modeEdit);
options.showControls = (m_Doc->guidesPrefs().showControls);
options.controlCharColor = PrefsManager::instance()->appPrefs.displayPrefs.controlCharColor;
- options.reverse = Reverse; // hope we have bidi soon...
+ options.reverse = Reverse; // hope we have bidi soon... // we have, but it's not frame based :)
options.layerOutline = (m_Doc->layerOutline(LayerID));
options.layerMarker = m_Doc->layerMarker(LayerID);
textLayout->render(p, options);
Modified: branches/ScribusOIF/scribus/scribusview.cpp
URL: http://scribus.info/websvn/diff.php?repname=Scribus&rev=16074&path=/branches/ScribusOIF/scribus/scribusview.cpp
==============================================================================
--- branches/ScribusOIF/scribus/scribusview.cpp (original)
+++ branches/ScribusOIF/scribus/scribusview.cpp Mon Dec 6 15:39:16 2010
@@ -1687,8 +1687,9 @@
else
{
FPoint point(pf.x() - currItem->xPos(), pf.y() - currItem->yPos());
+ int screenToPos(currItem->textLayout->screenToPosition(point));
currItem->CPos = currItem->itemText.length() == 0 ? 0 :
- /*currItem->itemText.screenToPosition(point)*/ currItem->textLayout->screenToPosition(point);
+ (screenToPos < 0 ? currItem->itemText.length() : screenToPos);
}
if (currItem->itemText.length() > 0)
Modified: branches/ScribusOIF/scribus/sctextstruct.h
URL: http://scribus.info/websvn/diff.php?repname=Scribus&rev=16074&path=/branches/ScribusOIF/scribus/sctextstruct.h
==============================================================================
--- branches/ScribusOIF/scribus/sctextstruct.h (original)
+++ branches/ScribusOIF/scribus/sctextstruct.h Mon Dec 6 15:39:16 2010
@@ -56,7 +56,8 @@
TextFlag_StartOfLine = 16,
TextFlag_ClusterStart = 32,
TextFlag_WordBoundary = 64,
- TextFlag_RightToLeft = 128
+ TextFlag_RightToLeft = 128,
+ TextFlag_TextSelected = 256
};
Q_DECLARE_FLAGS(TextFlags, TextFlag)
Modified: branches/ScribusOIF/scribus/text/boxes.cpp
URL: http://scribus.info/websvn/diff.php?repname=Scribus&rev=16074&path=/branches/ScribusOIF/scribus/text/boxes.cpp
==============================================================================
--- branches/ScribusOIF/scribus/text/boxes.cpp (original)
+++ branches/ScribusOIF/scribus/text/boxes.cpp Mon Dec 6 15:39:16 2010
@@ -13,8 +13,11 @@
#include "specialchars.h"
#include "storytext.h"
#include "scpainterexbase.h"
+#include "text/storytext.h"
#include <QDebug>
+#include <QApplication>
+#include <QPalette>
BoxGroup::BoxGroup(BoxType type):
@@ -88,8 +91,13 @@
for (int i=0; i < m_boxes.count(); ++i)
{
Box* b = m_boxes[i];
+ // FIXME_OIF - we should return a bb running towards many glyphboxes
if (b->containsPos(pos))
- result = result.unite(b->boundingBox(pos, len));
+ {
+ result = b->boundingBox(pos, len);
+// qDebug()<<"R1"<<result.x()<<result.y();
+ break;
+ }
}
return result;
}
@@ -445,13 +453,55 @@
p->drawLine(FPoint(x(), y()), FPoint(x() + width(), y()));
p->restore();
+ // Position the painter
p->save();
p->setAntialiasing(true);
if(rtl)
p->translate(x() + width(), y());
else
p->translate(x(), y());
-
+
+ // Paint the selection rectangle
+ if(renderOptions.markSelection)
+ {
+ int selStart(-1);
+ int selEnd(-1);
+
+ for(int si(m_charStart); si <= m_charEnd; ++si)
+ {
+ if(m_glyphs->story()->charAttributes(si).testFlag(TextFlag_TextSelected))
+ {
+ if(selStart < 0)
+ {
+ selEnd = selStart = si;
+ }
+ else
+ selEnd = si;
+ }
+ }
+ double selX(0);
+ double selWidth(m_glyphs->itemWidth(m_item, selStart, selEnd - selStart + 1));
+ if(rtl)
+ selX = m_width - selWidth;
+ if(selStart != m_charStart)
+ {
+ if(rtl)
+ selX -= m_glyphs->itemWidth(m_item, m_charStart, selStart - m_charStart );
+ else
+ selX += m_glyphs->itemWidth(m_item, m_charStart, selStart - m_charStart );
+ }
+
+ if(selStart >= 0)
+ {
+ p->save();
+ p->setPen(qApp->palette().color(QPalette::Active, QPalette::Highlight), 0.0, Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin);
+ p->setFillMode(ScPainter::Solid);
+ p->setBrush(qApp->palette().color(QPalette::Active, QPalette::Highlight));
+ p->drawRect(selX, -m_ascent, selWidth, m_ascent + m_descent);
+ p->restore();
+ }
+ }
+
QString color = style.fillColor();
QColor fillColor(Qt::transparent);
double shade = style.fillShade();
@@ -545,7 +595,16 @@
// p->setFillMode(ScPainter::None);
// p->drawRect(0, -m_ascent, layout->xadvance , height());
// p->restore();
- layout->renderOutlines(p, renderOptions, style);
+
+ if(renderOptions.markSelection && m_glyphs->story()->charAttributes(cluster.textPosition()).testFlag(TextFlag_TextSelected))
+ {
+
+ p->setBrush(qApp->palette().color(QPalette::Active, QPalette::HighlightedText));
+ layout->renderOutlines(p, renderOptions, style);
+ p->setBrush(fillColor);
+ }
+ else
+ layout->renderOutlines(p, renderOptions, style);
if ((style.effects() & ScStyle_Strikethrough) && (style.strokeColor() != CommonStrings::None))
{
@@ -665,26 +724,25 @@
FRect ret;
if (!containsPos(pos))
return ret;
+ ret.setTop(y() - m_ascent);
+ ret.setHeight(height());
bool rtl(m_glyphs->story()->charAttributes(m_glyphs->itemTextPosition(m_item)).testFlag(TextFlag_RightToLeft));
uint clen(len);
- if(pos + len > m_charEnd)
- clen = m_charEnd - pos;
+ if(pos + len > m_charEnd + 1)
+ clen = (m_charEnd - pos) + 1;
double width(m_glyphs->itemWidth(m_item, pos, clen));
double poffset(0);
if(pos != m_charStart)
{
poffset = m_glyphs->itemWidth(m_item, m_charStart , pos - m_charStart);
}
-
- ret.setTop(y() - m_ascent);
if(rtl)
ret.setLeft(x() + m_width - (width + poffset));
else
ret.setLeft(x() + poffset);
ret.setWidth(width);
- ret.setHeight(height());
-
- qDebug()<<"GS::bb"<<"text:"<<m_glyphs->story()->text(pos, len)<<"width"<<ret.width()<<"x"<<x()<<"offset"<<poffset<<"px"<<ret.x();
+
+// qDebug()<<"GS::bb"<<"text:"<<m_glyphs->story()->text(pos, len)<<"width"<<ret.width()<<"x"<<x()<<"offset"<<poffset<<"px"<<ret.x();
return ret;
// return FRect(8*pos,0,8*len,10); // FIXME!
Modified: branches/ScribusOIF/scribus/text/storytext.cpp
URL: http://scribus.info/websvn/diff.php?repname=Scribus&rev=16074&path=/branches/ScribusOIF/scribus/text/storytext.cpp
==============================================================================
--- branches/ScribusOIF/scribus/text/storytext.cpp (original)
+++ branches/ScribusOIF/scribus/text/storytext.cpp Mon Dec 6 15:39:16 2010
@@ -839,6 +839,19 @@
return selFirst <= selLast? selLast - selFirst + 1 : 0;
}
+void StoryText::attrSelection()
+{
+ if(selLast >= 0)
+ {
+ for(int i(0); i < length() ; ++i)
+ {
+ if(selected(i))
+ data->charAttributes(i) |= TextFlag_TextSelected;
+ else
+ data->charAttributes(i) &= ~TextFlag_TextSelected;
+ }
+ }
+}
bool StoryText::selected(int pos) const
{
@@ -910,7 +923,7 @@
// Grr, deselection splits selection
selLast = pos - 1;
}
-
+ attrSelection();
// qDebug("new selection: %d - %d", selFirst, selLast);
}
@@ -922,11 +935,13 @@
if (selLast == oldPos - 1)
{
selLast = newPos - 1;
+ attrSelection();
return;
}
else if (selFirst == oldPos)
{
selFirst = newPos;
+ attrSelection();
return;
}
// can't extend, fall through
@@ -942,6 +957,7 @@
selFirst = newPos;
selLast = oldPos - 1;
}
+ attrSelection();
}
void StoryText::selectAll()
@@ -955,6 +971,7 @@
*/
selFirst = 0;
selLast = length() - 1;
+ attrSelection();
}
void StoryText::deselectAll()
@@ -968,6 +985,7 @@
*/
selFirst = 0;
selLast = -1;
+ attrSelection();
}
void StoryText::removeSelection()
Modified: branches/ScribusOIF/scribus/text/storytext.h
URL: http://scribus.info/websvn/diff.php?repname=Scribus&rev=16074&path=/branches/ScribusOIF/scribus/text/storytext.h
==============================================================================
--- branches/ScribusOIF/scribus/text/storytext.h (original)
+++ branches/ScribusOIF/scribus/text/storytext.h Mon Dec 6 15:39:16 2010
@@ -174,6 +174,8 @@
int startOfSelection() const;
int endOfSelection() const;
int lengthOfSelection() const;
+ // to be called after any change on selection to update text attributes
+ void attrSelection();
// when physical view doesn't match logical view any more:
More information about the scribus-commit
mailing list