plasma-framework/declarativeimports/plasmacomponents/qml/TextArea.qml
2012-01-28 14:00:58 +01:00

375 lines
13 KiB
QML

/*
* Copyright (C) 2011 by Daker Fernandes Pinheiro <dakerfp@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the
* Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/**Documented API
Inherits:
Item
Imports:
QtQuick 1.1
org.kde.plasma.core 0.1
Description:
Creates a simple plasma theme based text area.
Like kates..
Properties:
* font font:
This property holds the font used in the text field.
The default font value is the font from plasma desktop theme.
* Qt::InputMethodHints inputMethodHints:
This property holds the the currently supported input method hints
for the text field.
The default values is Qt.ImhNone.
* bool errorHighlight:
This property holds if the text field is highlighted or not
If it is true then the problematic lines will be highlighted.
This feature is defined in the Common API but is unimplemented in plasma components.
* int cursorPosition:
This property holds the current cursor position.
* enumeration horizontalAlignment:
* enumeration verticalAlignment:
Sets the horizontal and vertical alignment of the text within the TextArea item's width and height.
By default, the text alignment follows the natural alignment of the text,
for example text that is read from left to right will be aligned to the left.
Valid values for horizontalAlignment are:
* TextEdit.AlignLeft (default)
* TextEdit.AlignRight
* TextEdit.AlignHCenter
* TextEdit.AlignJustify
Valid values for verticalAlignment are:
* TextEdit.AlignTop (default)
* TextEdit.AlignBottom
* TextEdit.AlignVCenter
* bool readOnly:
This property holds if the TextArea can be modified by the user interaction.
The default value is false.
* string selectedText:
This property holds the text selected by the user.
If no text is selected it holds an empty string.
This property is read-only.
* int selectionEnd:
This property holds the cursor position after the last character in the current selection.
This property is read-only.
* int selectionStart:
This property holds the cursor position before the first character in the current selection.
This property is read-only.
* string text:
This property holds the entire text in the TextArea.
* enumeration textFormat:
The way the text property should be displayed.
* TextEdit.AutoText
* TextEdit.PlainText
* TextEdit.RichText
* TextEdit.StyledText
The default is TextEdit.AutoText. If the text format is TextEdit.AutoText the text edit will automatically determine whether the text should be treated as rich text. This determination is made using Qt::mightBeRichText().
* enumeration wrapMode:
Set this property to wrap the text to the TextArea item's width. The text will only wrap if an explicit width has been set.
* TextEdit.NoWrap - no wrapping will be performed.
If the text contains insufficient newlines, then implicitWidth will exceed a set width.
* TextEdit.WordWrap - wrapping is done on word boundaries only.
If a word is too long, implicitWidth will exceed a set width.
* TextEdit.WrapAnywhere - wrapping is done at any point on a line, even if it occurs in the middle of a word.
* TextEdit.Wrap - if possible, wrapping occurs at a word boundary; otherwise it will occur at the appropriate point on the line, even in the middle of a word.
The default is TextEdit.NoWrap. If you set a width, consider using TextEdit.Wrap.
* string placeholderText:
This property holds the text displayed in when the text is empty.
The default value is empty string, meaning no placeholderText shown.
Plasma properties:
* bool interactive:
This property describes whether the user can interact with the TextArea flicking content.
A user cannot drag or flick a TextArea that is not interactive.
This property is useful for temporarily disabling flicking.
* int contentMaxWidth:
This property holds the maximum width that the text content can have.
* int contentMaxHeight:
This property holds the maximum height that the text content can have.
* property real scrollWidth:
This property holds the stepSize of the ScrollBar present at the TextArea
when it's content are bigger than it's size.
Methods:
* void copy():
Copies the currently selected text to the system clipboard.
* void cut():
Moves the currently selected text to the system clipboard.
* void deselect():
Removes active text selection.
* void paste():
Replaces the currently selected text by the contents of the system clipboard.
* void select(int start, int end):
Causes the text from start to end to be selected.
If either start or end is out of range, the selection is not changed.
After calling this, selectionStart will become the lesser and selectionEnd will become the greater
(regardless of the order passed to this method).
* void selectAll():
Causes all text to be selected.
* void selectWord():
Causes the word closest to the current cursor position to be selected.
* void positionAt(int position):
This function returns the character position at x pixels from the left of the TextArea.
Position 0 is before the first character, position 1 is after the first character but before the second,
and so on until position text.length, which is after all characters.
This means that for all x values before the first character this function returns 0,
and for all x values after the last character this function returns text.length.
* rectangle positionToRectangle(position):
Returns the rectangle at the given position in the text.
The x, y, and height properties correspond to the cursor that would describe that position.
**/
import QtQuick 1.1
import org.kde.plasma.core 0.1 as PlasmaCore
import "private" as Private
Item {
id: textArea
// Common API
property alias font: textEdit.font // alias to textEdit.font
property int inputMethodHints
property bool errorHighlight
property alias cursorPosition: textEdit.cursorPosition
property alias horizontalAlignment: textEdit.cursorPosition
property alias verticalAlignment: textEdit.cursorPosition
property alias readOnly: textEdit.readOnly
property alias selectedText: textEdit.selectedText // read-only
property alias selectionEnd: textEdit.selectionEnd // read-only
property alias selectionStart: textEdit.selectionStart // read-only
property alias text: textEdit.text
property alias textFormat: textEdit.textFormat // enumeration
property alias wrapMode: textEdit.wrapMode // enumeration
property string placeholderText
// functions
function copy() {
textEdit.copy();
}
function paste() {
textEdit.paste();
}
function cut() {
textEdit.cut();
}
function select(start, end) {
textEdit.select(start, end);
}
function selectAll() {
textEdit.selectAll();
}
function selectWord() {
textEdit.selectWord();
}
function positionAt(pos) {
return textEdit.positionAt(pos);
}
function positionToRectangle(pos) {
return textEdit.positionToRectangle(pos);
}
// Plasma API
property alias interactive: flickArea.interactive
property alias contentMaxWidth: textEdit.width
property alias contentMaxHeight: textEdit.height
// Set active focus to it's internal textInput.
// Overriding QtQuick.Item forceActiveFocus function.
function forceActiveFocus() {
textEdit.forceActiveFocus();
}
// Overriding QtQuick.Item activeFocus property.
property alias activeFocus: textEdit.activeFocus
opacity: enabled ? 1.0 : 0.5
Private.TextFieldFocus {
id: hover
state: textArea.activeFocus ? "focus" : (mouseWatcher.containsMouse ? "hover" : "hidden")
anchors.fill: base
}
MouseArea {
id: mouseWatcher
anchors.fill: hover
hoverEnabled: true
}
PlasmaCore.FrameSvgItem {
id: base
// TODO: see what is the best policy for margins
anchors {
fill: parent
}
imagePath: "widgets/lineedit"
prefix: "base"
}
Flickable {
id: flickArea
anchors {
fill: parent
leftMargin: 2 * base.margins.left
rightMargin: 2 * base.margins.right + (verticalScroll.visible ? verticalScroll.width : 0)
topMargin: 2 * base.margins.top
bottomMargin: 2 * base.margins.bottom + (horizontalScroll.visible ? verticalScroll.width : 0)
}
interactive: !verticalScroll.interactive //textArea.activeFocus
contentWidth: {
if (textEdit.wrapMode == TextEdit.NoWrap)
return textEdit.paintedWidth;
return Math.min(textEdit.paintedWidth, textEdit.width);
}
contentHeight: Math.min(textEdit.paintedHeight, textEdit.height)
clip: true
TextEdit {
id: textEdit
width: flickArea.width
height: flickArea.height
clip: true
wrapMode: TextEdit.Wrap
enabled: textArea.enabled
font.capitalization: theme.defaultFont.capitalization
font.family: theme.defaultFont.family
font.italic: theme.defaultFont.italic
font.letterSpacing: theme.defaultFont.letterSpacing
font.pointSize: theme.defaultFont.pointSize
font.strikeout: theme.defaultFont.strikeout
font.underline: theme.defaultFont.underline
font.weight: theme.defaultFont.weight
font.wordSpacing: theme.defaultFont.wordSpacing
color: theme.viewTextColor
selectByMouse: verticalScroll.interactive
onCursorPositionChanged: {
if (cursorRectangle.x < flickArea.contentX) {
flickArea.contentX = cursorRectangle.x;
return;
}
if (cursorRectangle.x > flickArea.contentX +
flickArea.width - cursorRectangle.width) {
flickArea.contentX = cursorRectangle.x -
cursorRectangle.width;
return;
}
if (cursorRectangle.y < flickArea.contentY) {
flickArea.contentY = cursorRectangle.y;
return;
}
if (cursorRectangle.y > flickArea.contentY +
flickArea.height - cursorRectangle.height) {
flickArea.contentY = cursorRectangle.y -
cursorRectangle.height;
return;
}
}
// Proxying keys events is not required by the
// common API but is desired in the plasma API.
Keys.onPressed: textArea.Keys.pressed(event);
Keys.onReleased: textArea.Keys.released(event);
Text {
anchors.fill: parent
text: textArea.placeholderText
visible: textEdit.text == "" && !textArea.activeFocus
opacity: 0.5
}
onActiveFocusChanged: {
if (!textEdit.activeFocus) {
textInput.closeSoftwareInputPanel()
}
}
}
}
ScrollBar {
id: horizontalScroll
anchors {
bottom: parent.bottom
left: parent.left
right: flickArea.right
}
enabled: parent.enabled
flickableItem: flickArea
orientation: Qt.Horizontal
stepSize: textEdit.font.pixelSize
}
ScrollBar {
id: verticalScroll
anchors {
right: parent.right
top: parent.top
bottom: flickArea.bottom
}
enabled: parent.enabled
flickableItem: flickArea
orientation: Qt.Vertical
stepSize: textEdit.font.pixelSize
}
}