Skip to content
Permalink
Browse files
Merge pull request #1507 from NathanW2/code_editor
Code editor using QScintilla.

Thanks to Salvatore Larosa for the initial work.
  • Loading branch information
NathanW2 committed Jul 20, 2014
2 parents 4e2afeb + b2ff718 commit 44e543c834212a37e25ea902daf9319e44f9b273
@@ -5,6 +5,7 @@
%Import QtCore/QtCoremod.sip
%Import QtGui/QtGuimod.sip
%Import QtXml/QtXmlmod.sip
%Import Qsci/qscimod4.sip

%Import core/core.sip

@@ -19,6 +20,9 @@
%Include qgsattributeforminterface.sip
%Include qgsbusyindicatordialog.sip
%Include qgscollapsiblegroupbox.sip
%Include qgscodeeditor.sip
%Include qgscodeeditorpython.sip
%Include qgscodeeditorsql.sip
%Include qgscolorbutton.sip
%Include qgscolordialog.sip
%Include qgscomposerview.sip
@@ -0,0 +1,22 @@
class QgsCodeEditor: QsciScintilla
{
%TypeHeaderCode
#include <qgscodeeditor.h>
%End

public:
QgsCodeEditor( QWidget *parent /TransferThis/ = 0, QString title = "" , bool folding = false, bool margin = false );
~QgsCodeEditor();

/** Set margin visible state
* @param margin Set margin in the editor
*/
void setMarginVisible( bool margin );
bool marginVisible();

/** Set folding visible state
* @param folding Set folding in the editor
*/
void setFoldingVisible( bool folding);
bool foldingVisible();
};
@@ -0,0 +1,15 @@
class QgsCodeEditorPython: QgsCodeEditor
{
%TypeHeaderCode
#include <qgscodeeditorpython.h>
%End

public:
QgsCodeEditorPython( QWidget *parent /TransferThis/ = 0, const QList<QString> &filenames = QList<QString>() );
~QgsCodeEditorPython();

void loadAPIs(const QList<QString> &filenames );

bool loadScript( const QString &script );

};
@@ -0,0 +1,10 @@
class QgsCodeEditorSQL: QgsCodeEditor
{
%TypeHeaderCode
#include <qgscodeeditorsql.h>
%End

public:
QgsCodeEditorSQL( QWidget *parent /TransferThis/ = 0 );
~QgsCodeEditorSQL();
};
@@ -463,7 +463,7 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas* mapCanvas, QWidget *pa
grpPythonMacros->setChecked( !pythonMacros.isEmpty() );
if ( !pythonMacros.isEmpty() )
{
ptePythonMacros->setPlainText( pythonMacros );
ptePythonMacros->setText( pythonMacros );
}
else
{
@@ -867,7 +867,7 @@ void QgsProjectProperties::apply()
QgsProject::instance()->writeEntry( "DefaultStyles", "/RandomColors", cbxStyleRandomColors->isChecked() );

// store project macros
QString pythonMacros = ptePythonMacros->toPlainText();
QString pythonMacros = ptePythonMacros->text();
if ( !grpPythonMacros->isChecked() || pythonMacros.isEmpty() )
{
pythonMacros = QString::null;
@@ -1467,7 +1467,7 @@ void QgsProjectProperties::editSymbol( QComboBox* cbo )
void QgsProjectProperties::resetPythonMacros()
{
grpPythonMacros->setChecked( false );
ptePythonMacros->setPlainText( "def openProject():\n pass\n\n" \
ptePythonMacros->setText( "def openProject():\n pass\n\n" \
"def saveProject():\n pass\n\n" \
"def closeProject():\n pass\n" );
}
@@ -731,6 +731,7 @@ TARGET_LINK_LIBRARIES(qgis_core
${QT_QTNETWORK_LIBRARY}
${QT_QTSVG_LIBRARY}
${QT_QTWEBKIT_LIBRARY}
${QSCINTILLA_LIBRARY}

${PROJ_LIBRARY}
${GEOS_LIBRARY}
@@ -126,6 +126,9 @@ qgscharacterselectdialog.cpp
qgscollapsiblegroupbox.cpp
qgscolorbutton.cpp
qgscolordialog.cpp
qgscodeeditor.cpp
qgscodeeditorpython.cpp
qgscodeeditorsql.cpp
qgscomposerruler.cpp
qgscomposerview.cpp
qgsprevieweffect.cpp
@@ -316,6 +319,9 @@ qgsblendmodecombobox.h
qgsbusyindicatordialog.h
qgscharacterselectdialog.h
qgscollapsiblegroupbox.h
qgscodeeditor.h
qgscodeeditorpython.h
qgscodeeditorsql.h
qgscolordialog.h
qgsprevieweffect.h
qgscomposerruler.h
@@ -668,6 +674,7 @@ TARGET_LINK_LIBRARIES(qgis_gui

IF(WIN32)
ADD_DEFINITIONS(-DQWT_DLL)
ADD_DEFINITIONS(-DQSCINTILLA_DLL)
ENDIF(WIN32)

# install
@@ -0,0 +1,139 @@
/***************************************************************************
qgscodeeditor.cpp - A base code editor for QGIS and plugins. Provides
a base editor using QScintilla for editors
--------------------------------------
Date : 06-Oct-2013
Copyright : (C) 2013 by Salvatore Larosa
Email : lrssvtml (at) gmail (dot) com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#include "qgscodeeditor.h"

#include <QSettings>
#include <QWidget>
#include <QFont>
#include <QDebug>

QgsCodeEditor::QgsCodeEditor( QWidget *parent, QString title, bool folding, bool margin )
: QsciScintilla( parent )
, mWidgetTitle( title )
, mFolding( folding )
, mMargin( margin )
{
if ( !parent && mWidgetTitle.isEmpty() )
{
setWindowTitle( "QScintilla2 Text Editor" );
setMinimumSize( 800, 300 );
}
else
{
setWindowTitle( mWidgetTitle );
}
setSciWidget();
setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
}

QgsCodeEditor::~QgsCodeEditor()
{
}

void QgsCodeEditor::setSciWidget()
{
setUtf8( true );
setCaretLineVisible( true );
setCaretLineBackgroundColor( QColor( "#fcf3ed" ) );

setBraceMatching( QsciScintilla::SloppyBraceMatch );
setMatchedBraceBackgroundColor( QColor( "#b7f907" ) );
// whether margin will be shown
setMarginVisible( mMargin );
// whether margin will be shown
setFoldingVisible( mFolding );
// indentation
setAutoIndent( true );
setIndentationWidth( 4 );
setTabIndents( true );
setBackspaceUnindents( true );
setTabWidth( 4 );
// autocomplete
setAutoCompletionThreshold( 2 );
setAutoCompletionSource( QsciScintilla::AcsAPIs );
}

void QgsCodeEditor::setTitle( QString title )
{
setWindowTitle( title );
}

void QgsCodeEditor::setMarginVisible( bool margin )
{
mMargin = margin;
if ( margin )
{
QFont marginFont( "Courier", 10 );
setMarginLineNumbers( 1, true );
setMarginsFont( marginFont );
setMarginWidth( 1, "00000" );
setMarginsForegroundColor( QColor( "#3E3EE3" ) );
setMarginsBackgroundColor( QColor( "#f9f9f9" ) );
}
else
{
setMarginWidth( 0, 0 );
setMarginWidth( 1, 0 );
setMarginWidth( 2, 0 );
}
}

void QgsCodeEditor::setFoldingVisible( bool folding )
{
mFolding = folding;
if ( folding )
{
setFolding( QsciScintilla::PlainFoldStyle );
setFoldMarginColors( QColor( "#f4f4f4" ), QColor( "#f4f4f4" ) );
}
else
{
setFolding( QsciScintilla::NoFoldStyle );
}
}

// Settings for font and fontsize
bool QgsCodeEditor::isFixedPitch( const QFont& font )
{
const QFontInfo fi( font );
return fi.fixedPitch();
}

QFont QgsCodeEditor::getMonospaceFont()
{
QFont font( "monospace" );
if ( isFixedPitch( font ) )
{
return font;
}
font.setStyleHint( QFont::Monospace );
if ( isFixedPitch( font ) )
{
return font;
}
font.setStyleHint( QFont::TypeWriter );
if ( isFixedPitch( font ) )
{
return font;
}
font.setFamily( "courier" );
if ( isFixedPitch( font ) )
{
return font;
}
return font;
}
@@ -0,0 +1,78 @@
/***************************************************************************
qgscodeeditor.h - A base code editor for QGIS and plugins. Provides
a base editor using QScintilla for editors
--------------------------------------
Date : 06-Oct-2013
Copyright : (C) 2013 by Salvatore Larosa
Email : lrssvtml (at) gmail (dot) com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#ifndef QGSCODEEDITOR_H
#define QGSCODEEDITOR_H

#include <QString>
// qscintilla includes
#include <Qsci/qsciapis.h>


class QWidget;

/** \ingroup gui
* A text editor based on QScintilla2.
* \note added in 2.6
*/
class GUI_EXPORT QgsCodeEditor : public QsciScintilla
{
Q_OBJECT

public:
/**
* Construct a new code editor.
*
* @param parent The parent QWidget
* @param title The title to show in the code editor dialog
* @param folding False: Enable margin for code editor
* @param margin False: Enable folding for code editor
* @note added in 2.6
*/
QgsCodeEditor( QWidget *parent = 0, QString title = "" , bool folding = false, bool margin = false );
~QgsCodeEditor();

/** Set the widget title */
void setTitle( QString );

/** Set margin visible state
* @param margin Set margin in the editor
*/
void setMarginVisible( bool margin );
bool marginVisible() { return mMargin; }

/** Set folding visible state
* @param folding Set folding in the editor
*/
void setFoldingVisible( bool folding );
bool foldingVisible() { return mFolding; }

protected:

bool isFixedPitch( const QFont& font );

QFont getMonospaceFont();

private:

void setSciWidget();

QString mWidgetTitle;
bool mFolding;
bool mMargin;
};

#endif

0 comments on commit 44e543c

Please sign in to comment.