]> Some of my projects - localmylist.git/commitdiff
Add line numbers to the rename script editor.
authorAPTX <marek321@gmail.com>
Thu, 6 Jun 2013 15:11:25 +0000 (17:11 +0200)
committerAPTX <marek321@gmail.com>
Thu, 6 Jun 2013 15:11:25 +0000 (17:11 +0200)
This uses code from a Qt example of a code editor.

localmylist-management/codeeditor.cpp [new file with mode: 0644]
localmylist-management/codeeditor.h [new file with mode: 0644]
localmylist-management/localmylist-management.pro
localmylist-management/renamesettingsdialog.cpp
localmylist-management/renamesettingsdialog.ui

diff --git a/localmylist-management/codeeditor.cpp b/localmylist-management/codeeditor.cpp
new file mode 100644 (file)
index 0000000..84016a5
--- /dev/null
@@ -0,0 +1,166 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
+**     of its contributors may be used to endorse or promote products derived
+**     from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "codeeditor.h"
+
+#include <QPainter>
+#include <QTextBlock>
+
+class LineNumberArea : public QWidget
+{
+public:
+       LineNumberArea(CodeEditor *editor) : QWidget(editor)
+       {
+               codeEditor = editor;
+       }
+
+       QSize sizeHint() const
+       {
+               return QSize(codeEditor->lineNumberAreaWidth(), 0);
+       }
+
+protected:
+       void paintEvent(QPaintEvent *event)
+       {
+               codeEditor->lineNumberAreaPaintEvent(event);
+       }
+
+private:
+       CodeEditor *codeEditor;
+};
+
+CodeEditor::CodeEditor(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 CodeEditor::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 CodeEditor::updateLineNumberAreaWidth(int /* newBlockCount */)
+{
+       setViewportMargins(lineNumberAreaWidth(), 0, 0, 0);
+}
+
+void CodeEditor::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 CodeEditor::resizeEvent(QResizeEvent *e)
+{
+       QPlainTextEdit::resizeEvent(e);
+
+       QRect cr = contentsRect();
+       lineNumberArea->setGeometry(QRect(cr.left(), cr.top(), lineNumberAreaWidth(), cr.height()));
+}
+
+void CodeEditor::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 CodeEditor::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;
+       }
+}
diff --git a/localmylist-management/codeeditor.h b/localmylist-management/codeeditor.h
new file mode 100644 (file)
index 0000000..5d87d87
--- /dev/null
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
+**     of its contributors may be used to endorse or promote products derived
+**     from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef CODEEDITOR_H
+#define CODEEDITOR_H
+
+#include <QPlainTextEdit>
+#include <QObject>
+
+class QPaintEvent;
+class QResizeEvent;
+class QSize;
+class QWidget;
+
+class LineNumberArea;
+
+class CodeEditor : public QPlainTextEdit
+{
+       Q_OBJECT
+
+public:
+       CodeEditor(QWidget *parent = 0);
+
+       void lineNumberAreaPaintEvent(QPaintEvent *event);
+       int lineNumberAreaWidth();
+
+protected:
+       void resizeEvent(QResizeEvent *event);
+
+private slots:
+       void updateLineNumberAreaWidth(int newBlockCount);
+       void highlightCurrentLine();
+       void updateLineNumberArea(const QRect &, int);
+
+private:
+       QWidget *lineNumberArea;
+};
+
+#endif // CODEEDITOR_H
index e5202a2a343482a07ed5c109898be9968b12b384..074c58771e749322482c7a64ba4ac00cdd051fe4 100644 (file)
@@ -30,7 +30,8 @@ SOURCES += main.cpp\
        tabs/clientlogtab.cpp \
        fonts.cpp \
        aniaddsyntaxhighlighter.cpp \
-       settingsdialog.cpp
+       settingsdialog.cpp \
+       codeeditor.cpp
 
 HEADERS += mainwindow.h \
        databaseconnectiondialog.h \
@@ -51,7 +52,8 @@ HEADERS += mainwindow.h \
        tabs/clientlogtab.h \
        fonts.h \
        aniaddsyntaxhighlighter.h \
-       settingsdialog.h
+       settingsdialog.h \
+       codeeditor.h
 
 FORMS += mainwindow.ui \
        databaseconnectiondialog.ui \
index adca91cc2cec3572fcebc7d9c0ad80dbf348ab4a..1722fdc3560798f20117557e85849807d22ee232 100644 (file)
@@ -187,7 +187,7 @@ void RenameSettingsDialog::setupEnvForFile(int fid)
 
        if (!q.next())
        {
-               ui->input->setText("");
+               ui->input->setPlainText("");
                ui->status->setText(tr("Rename data not available for fid %1. "
                                                           "Note: there must be a file location for the file.").arg(fid));
                return;
@@ -204,7 +204,7 @@ void RenameSettingsDialog::setupEnvForFile(int fid)
        {
                s += i.key() + " := '" + i.value() + "'\n";
        }
-       ui->input->setText(s);
+       ui->input->setPlainText(s);
 }
 
 void RenameSettingsDialog::saveSettings()
index 4107d85a69ba63375910a95612120017cf9ca9a4..a2254c1e272a45fb6b97acd86e2a365231e38aa0 100644 (file)
@@ -23,7 +23,7 @@
        </property>
        <layout class="QVBoxLayout" name="verticalLayout_4">
         <item>
-         <widget class="QTextEdit" name="input">
+         <widget class="CodeEditor" name="input">
           <property name="font">
            <font>
             <family>DejaVu Sans Mono</family>
@@ -41,7 +41,7 @@
        </property>
        <layout class="QVBoxLayout" name="verticalLayout_2">
         <item>
-         <widget class="QTextEdit" name="result">
+         <widget class="CodeEditor" name="result">
           <property name="font">
            <font>
             <family>DejaVu Sans Mono</family>
        </layout>
       </item>
       <item>
-       <widget class="QTextEdit" name="renameScript">
+       <widget class="CodeEditor" name="renameScript">
         <property name="font">
          <font>
           <family>DejaVu Sans Mono</family>
    </item>
   </layout>
  </widget>
+ <customwidgets>
+  <customwidget>
+   <class>CodeEditor</class>
+   <extends>QTextEdit</extends>
+   <header>codeeditor.h</header>
+  </customwidget>
+ </customwidgets>
  <resources/>
  <connections>
   <connection>