+ issue #0001038: Improve and show List properties in Tree View

This commit is contained in:
wmayer 2014-12-16 14:31:36 +01:00
parent f37a752975
commit 5aac822c71
3 changed files with 223 additions and 8 deletions

View File

@ -980,9 +980,173 @@ void StatusWidget::adjustPosition(QWidget* w)
// --------------------------------------------------------------------
class LineNumberArea : public QWidget
{
public:
LineNumberArea(PropertyListEditor *editor) : QWidget(editor) {
codeEditor = editor;
}
QSize sizeHint() const {
return QSize(codeEditor->lineNumberAreaWidth(), 0);
}
protected:
void paintEvent(QPaintEvent *event) {
codeEditor->lineNumberAreaPaintEvent(event);
}
private:
PropertyListEditor *codeEditor;
};
PropertyListEditor::PropertyListEditor(QWidget *parent) : QPlainTextEdit(parent)
{
lineNumberArea = new LineNumberArea(this);
connect(this, SIGNAL(blockCountChanged(int)),
this, SLOT(updateLineNumberAreaWidth(int)));
connect(this, SIGNAL(updateRequest(QRect,int)),
this, SLOT(updateLineNumberArea(QRect,int)));
connect(this, SIGNAL(cursorPositionChanged()),
this, SLOT(highlightCurrentLine()));
updateLineNumberAreaWidth(0);
highlightCurrentLine();
}
int PropertyListEditor::lineNumberAreaWidth()
{
int digits = 1;
int max = qMax(1, blockCount());
while (max >= 10) {
max /= 10;
++digits;
}
int space = 3 + fontMetrics().width(QLatin1Char('9')) * digits;
return space;
}
void PropertyListEditor::updateLineNumberAreaWidth(int /* newBlockCount */)
{
setViewportMargins(lineNumberAreaWidth(), 0, 0, 0);
}
void PropertyListEditor::updateLineNumberArea(const QRect &rect, int dy)
{
if (dy)
lineNumberArea->scroll(0, dy);
else
lineNumberArea->update(0, rect.y(), lineNumberArea->width(), rect.height());
if (rect.contains(viewport()->rect()))
updateLineNumberAreaWidth(0);
}
void PropertyListEditor::resizeEvent(QResizeEvent *e)
{
QPlainTextEdit::resizeEvent(e);
QRect cr = contentsRect();
lineNumberArea->setGeometry(QRect(cr.left(), cr.top(), lineNumberAreaWidth(), cr.height()));
}
void PropertyListEditor::highlightCurrentLine()
{
QList<QTextEdit::ExtraSelection> extraSelections;
if (!isReadOnly()) {
QTextEdit::ExtraSelection selection;
QColor lineColor = QColor(Qt::yellow).lighter(160);
selection.format.setBackground(lineColor);
selection.format.setProperty(QTextFormat::FullWidthSelection, true);
selection.cursor = textCursor();
selection.cursor.clearSelection();
extraSelections.append(selection);
}
setExtraSelections(extraSelections);
}
void PropertyListEditor::lineNumberAreaPaintEvent(QPaintEvent *event)
{
QPainter painter(lineNumberArea);
painter.fillRect(event->rect(), Qt::lightGray);
QTextBlock block = firstVisibleBlock();
int blockNumber = block.blockNumber();
int top = (int) blockBoundingGeometry(block).translated(contentOffset()).top();
int bottom = top + (int) blockBoundingRect(block).height();
while (block.isValid() && top <= event->rect().bottom()) {
if (block.isVisible() && bottom >= event->rect().top()) {
QString number = QString::number(blockNumber + 1);
painter.setPen(Qt::black);
painter.drawText(0, top, lineNumberArea->width(), fontMetrics().height(),
Qt::AlignRight, number);
}
block = block.next();
top = bottom;
bottom = top + (int) blockBoundingRect(block).height();
++blockNumber;
}
}
class PropertyListDialog : public QDialog
{
int type;
public:
PropertyListDialog(int type, QWidget* parent) : QDialog(parent),type(type)
{
}
void accept()
{
PropertyListEditor* edit = this->findChild<PropertyListEditor*>();
QStringList lines;
if (edit) {
QString inputText = edit->toPlainText();
lines = inputText.split(QString::fromLatin1("\n"));
}
if (type == 1) { // floats
bool ok;
int line=1;
for (QStringList::iterator it = lines.begin(); it != lines.end(); ++it, ++line) {
it->toDouble(&ok);
if (!ok) {
QMessageBox::critical(this, tr("Invalid input"), tr("Input in line %1 is not a number").arg(line));
return;
}
}
}
else if (type == 2) { // integers
bool ok;
int line=1;
for (QStringList::iterator it = lines.begin(); it != lines.end(); ++it, ++line) {
it->toInt(&ok);
if (!ok) {
QMessageBox::critical(this, tr("Invalid input"), tr("Input in line %1 is not a number").arg(line));
return;
}
}
}
QDialog::accept();
}
};
// --------------------------------------------------------------------
LabelEditor::LabelEditor (QWidget * parent)
: QWidget(parent)
{
type = String;
QHBoxLayout *layout = new QHBoxLayout(this);
layout->setMargin(0);
layout->setSpacing(2);
@ -1008,30 +1172,40 @@ LabelEditor::~LabelEditor()
QString LabelEditor::text() const
{
return lineEdit->text();
return this->plainText;
}
void LabelEditor::setText(const QString& s)
{
lineEdit->setText(s);
this->plainText = s;
QStringList list = this->plainText.split(QString::fromLatin1("\n"));
QString text = QString::fromUtf8("[%1]").arg(list.join(QLatin1String(",")));
lineEdit->setText(text);
}
void LabelEditor::changeText()
{
QDialog dlg(this);
PropertyListDialog dlg(static_cast<int>(type), this);
dlg.setWindowTitle(tr("List"));
QVBoxLayout* hboxLayout = new QVBoxLayout(&dlg);
QDialogButtonBox* buttonBox = new QDialogButtonBox(&dlg);
buttonBox->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
QPlainTextEdit *edit = new QPlainTextEdit(&dlg);
edit->setPlainText(this->lineEdit->text());
PropertyListEditor *edit = new PropertyListEditor(&dlg);
edit->setPlainText(this->plainText);
hboxLayout->addWidget(edit);
hboxLayout->addWidget(buttonBox);
connect(buttonBox, SIGNAL(accepted()), &dlg, SLOT(accept()));
connect(buttonBox, SIGNAL(rejected()), &dlg, SLOT(reject()));
if (dlg.exec() == QDialog::Accepted) {
this->lineEdit->setText(edit->toPlainText());
QString inputText = edit->toPlainText();
this->plainText = inputText;
QStringList list = this->plainText.split(QString::fromLatin1("\n"));
QString text = QString::fromUtf8("[%1]").arg(list.join(QLatin1String(",")));
lineEdit->setText(text);
}
}
@ -1054,4 +1228,9 @@ QString LabelEditor::buttonText() const
return button->text();
}
void LabelEditor::setInputType(InputType t)
{
this->type = t;
}
#include "moc_Widgets.cpp"

View File

@ -30,6 +30,7 @@
#include <QLineEdit>
#include <QPointer>
#include <QPushButton>
#include <QPlainTextEdit>
#include <QBasicTimer>
#include <QTime>
@ -341,6 +342,30 @@ private:
// ----------------------------------------------------------------------
class PropertyListEditor : public QPlainTextEdit
{
Q_OBJECT
public:
PropertyListEditor(QWidget *parent = 0);
void lineNumberAreaPaintEvent(QPaintEvent *event);
int lineNumberAreaWidth();
protected:
void resizeEvent(QResizeEvent *event);
private Q_SLOTS:
void updateLineNumberAreaWidth(int newBlockCount);
void highlightCurrentLine();
void updateLineNumberArea(const QRect &, int);
private:
QWidget *lineNumberArea;
};
// ----------------------------------------------------------------------
class GuiExport LabelEditor : public QWidget
{
Q_OBJECT
@ -349,11 +374,13 @@ class GuiExport LabelEditor : public QWidget
Q_PROPERTY(QString buttonText READ buttonText WRITE setButtonText)
public:
enum InputType {String, Float, Integer};
LabelEditor (QWidget * parent = 0);
virtual ~LabelEditor();
/**
* Returns the filename.
* Returns the text.
*/
QString text() const;
@ -362,6 +389,11 @@ public:
*/
QString buttonText() const;
/**
* Set the input type.
*/
void setInputType(InputType);
public Q_SLOTS:
virtual void setText(const QString &);
virtual void setButtonText (const QString &);
@ -373,6 +405,8 @@ private Q_SLOTS:
void changeText();
private:
InputType type;
QString plainText;
QLineEdit *lineEdit;
QPushButton *button;
};

View File

@ -1853,6 +1853,7 @@ QWidget* PropertyFloatListItem::createEditor(QWidget* parent, const QObject* rec
{
Gui::LabelEditor* le = new Gui::LabelEditor(parent);
le->setAutoFillBackground(true);
le->setInputType(Gui::LabelEditor::Float);
QObject::connect(le, SIGNAL(textChanged(const QString&)), receiver, method);
return le;
}
@ -1920,6 +1921,7 @@ QWidget* PropertyIntegerListItem::createEditor(QWidget* parent, const QObject* r
{
Gui::LabelEditor* le = new Gui::LabelEditor(parent);
le->setAutoFillBackground(true);
le->setInputType(Gui::LabelEditor::Integer);
QObject::connect(le, SIGNAL(textChanged(const QString&)), receiver, method);
return le;
}