aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMurugappan Nataraj <murugappan.nataraj@nokia.com>2010-07-09 17:36:47 +0530
committerPekka Vuorela <pekka.ta.vuorela@nokia.com>2011-01-11 18:18:10 +0200
commitb452ea8b71cc49b21886049945003911453515a5 (patch)
tree702a3b00033adf3d2eb32d6e0725a2c3082613c1
parentd614b9753c6d9c62aa31052c8877019780f2e218 (diff)
Changes: Added dialog to select font
RevBy : Michael Hasselmann, Pekka Vuorela Details: Added dialog manager to manage dialogs required for rich text editor. Added font selection option.
-rw-r--r--[-rwxr-xr-x]src/corelib/widgets/mrichtextedit.cpp90
-rw-r--r--src/corelib/widgets/mrichtextedit.h1
-rw-r--r--src/corelib/widgets/mrichtextedit_p.h12
-rw-r--r--src/corelib/widgets/mrichtexteditdialogsmanager.cpp116
-rw-r--r--src/corelib/widgets/mrichtexteditdialogsmanager_p.h87
-rw-r--r--src/corelib/widgets/widgets.pri2
-rw-r--r--src/data/RichTextEditorToolbar1.xml6
7 files changed, 312 insertions, 2 deletions
diff --git a/src/corelib/widgets/mrichtextedit.cpp b/src/corelib/widgets/mrichtextedit.cpp
index 35821ad4..3c161bf7 100755..100644
--- a/src/corelib/widgets/mrichtextedit.cpp
+++ b/src/corelib/widgets/mrichtextedit.cpp
@@ -25,9 +25,10 @@
#include <MInputMethodState>
#include "mrichtextedit.h"
#include "mrichtextedit_p.h"
+#include "mrichtexteditdialogsmanager_p.h"
-#include "mwidgetcreator.h"
-M_REGISTER_WIDGET(MRichTextEdit)
+#include "mwidgetcreator.h"
+M_REGISTER_WIDGET(MRichTextEdit)
namespace
{
@@ -135,6 +136,86 @@ void MRichTextEditPrivate::_q_updateStyle()
QVariant((format.fontItalic()) ? "true" : "false"));
}
+
+void MRichTextEditPrivate::showTextStylingOptions()
+{
+ Q_Q(MRichTextEdit);
+
+ MRichTextEditDialogsManager *dialogsManager = MRichTextEditDialogsManager::instance();
+
+ q->connect(dialogsManager, SIGNAL(fontFamilySelected(QString)),
+ SLOT(_q_setFontFamily(QString)));
+
+ QString fontFamily;
+
+ textStyleValues(&fontFamily);
+
+ int startPos = -1;
+ int endPos = -1;
+ const bool hasSelectedText = q->hasSelectedText();
+ // removing the focus from the text entry widget is removing the text selection, so
+ // retain the selection
+ if (hasSelectedText) {
+ QTextCursor textcursor = q->textCursor();
+ startPos = textcursor.selectionStart();
+ endPos = textcursor.selectionEnd();
+ }
+
+ // Get rid of software input panel (SIP), which might obstruct our dialog otherwise.
+ q->clearFocus();
+
+ if (hasSelectedText) {
+ q->setSelection(startPos, endPos - startPos);
+ }
+
+ dialogsManager->showTextStylingDialog(fontFamily);
+ q->setFocus();
+
+ q->disconnect(dialogsManager, 0, q, 0);
+}
+
+
+void MRichTextEditPrivate::textStyleValues(QString *fontfamily)
+{
+ Q_Q(MRichTextEdit);
+
+ QTextCursor textcursor = q->textCursor();
+ *fontfamily = textcursor.charFormat().font().family();
+
+ if (!q->hasSelectedText()) {
+ return;
+ }
+
+ // If the text selection has different styles don't set the current text style value
+ int startPos = textcursor.selectionStart();
+ int endPos = textcursor.selectionEnd();
+ bool familyDiffers = false;
+
+ // Starting from startPos + 1 to get the style that would be used when
+ // text is inserted in the positions
+ for (int i = startPos + 1; i <= endPos; i++) {
+ textcursor.setPosition(i);
+
+ if (!familyDiffers && (fontfamily != textcursor.charFormat().font().family())) {
+ familyDiffers = true;
+ fontfamily->clear();
+ }
+ }
+}
+
+
+void MRichTextEditPrivate::_q_setFontFamily(const QString &fontFamily)
+{
+ Q_Q(MRichTextEdit);
+
+ QTextCursor textcursor = q->textCursor();
+ QTextCharFormat format;
+
+ format.setFontFamily(fontFamily);
+ textcursor.mergeCharFormat(format);
+ q->setTextCursor(textcursor);
+}
+
///////////////////////////////////////////////
// Actual class implementation
@@ -317,6 +398,8 @@ QFont MRichTextEdit::currentFont()
void MRichTextEdit::keyPressEvent(QKeyEvent *event)
{
+ Q_D(MRichTextEdit);
+
if (QEvent::KeyPress == event->type()) {
if (event->matches(QKeySequence::Bold)) {
QFont curFont = currentFont();
@@ -333,6 +416,9 @@ void MRichTextEdit::keyPressEvent(QKeyEvent *event)
bool underlineStyle = !curFont.underline();
// set current underline style option
setFontUnderline(underlineStyle);
+ } else if ((event->key() == Qt::Key_F) && (event->modifiers() & Qt::ControlModifier)) {
+ // show text styling options
+ d->showTextStylingOptions();
} else {
// Pass the remaining events to MTextEdit will handle
MTextEdit::keyPressEvent(event);
diff --git a/src/corelib/widgets/mrichtextedit.h b/src/corelib/widgets/mrichtextedit.h
index 4f37ebfa..a177a0ab 100644
--- a/src/corelib/widgets/mrichtextedit.h
+++ b/src/corelib/widgets/mrichtextedit.h
@@ -104,6 +104,7 @@ private:
Q_DECLARE_PRIVATE(MRichTextEdit)
Q_PRIVATE_SLOT(d_func(), void _q_updateStyle())
+ Q_PRIVATE_SLOT(d_func(), void _q_setFontFamily(const QString &))
Q_DISABLE_COPY(MRichTextEdit)
diff --git a/src/corelib/widgets/mrichtextedit_p.h b/src/corelib/widgets/mrichtextedit_p.h
index 2df73ba7..15c32dc5 100644
--- a/src/corelib/widgets/mrichtextedit_p.h
+++ b/src/corelib/widgets/mrichtextedit_p.h
@@ -62,6 +62,18 @@ public:
* the current cursor position
*/
void _q_updateStyle();
+
+ /*!
+ * \brief shows the text styling options
+ */
+ void showTextStylingOptions();
+
+ /*!
+ * \brief gets the current text style values to be shown in the text styling ui
+ */
+ void textStyleValues(QString *fontfamily);
+
+ void _q_setFontFamily(const QString &fontFamily);
};
#endif
diff --git a/src/corelib/widgets/mrichtexteditdialogsmanager.cpp b/src/corelib/widgets/mrichtexteditdialogsmanager.cpp
new file mode 100644
index 00000000..c0d78202
--- /dev/null
+++ b/src/corelib/widgets/mrichtexteditdialogsmanager.cpp
@@ -0,0 +1,116 @@
+/***************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (directui@nokia.com)
+**
+** This file is part of libmeegotouch.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at directui@nokia.com.
+**
+** This library is free software; you can redistribute it and/or
+** modify it under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation
+** and appearing in the file LICENSE.LGPL included in the packaging
+** of this file.
+**
+****************************************************************************/
+
+#include <QFontDatabase>
+#include <QStringListModel>
+#include <QDebug>
+#include <MComboBox>
+#include <MDialog>
+#include <MLayout>
+#include <MLinearLayoutPolicy>
+#include "mrichtexteditdialogsmanager_p.h"
+
+MRichTextEditDialogsManager *MRichTextEditDialogsManager::dialogsManager = 0;
+
+
+MRichTextEditDialogsManager::MRichTextEditDialogsManager()
+ : fontFamilyCombo(0)
+{
+}
+
+
+MRichTextEditDialogsManager::~MRichTextEditDialogsManager()
+{
+ delete dialogs.textStyles.first;
+}
+
+
+MRichTextEditDialogsManager *MRichTextEditDialogsManager::instance()
+{
+ if (!dialogsManager) {
+ dialogsManager = new MRichTextEditDialogsManager();
+ }
+
+ return dialogsManager;
+}
+
+
+void MRichTextEditDialogsManager::initTextStylingDialog()
+{
+ if (dialogs.textStyles.first) {
+ return;
+ }
+
+ dialogs.textStyles.first = new MDialog();
+ //% "Text styles"
+ dialogs.textStyles.first->setTitle(qtTrId("qtn_comm_text_styles"));
+ dialogs.textStyles.second = false;
+
+ QGraphicsWidget *centralWidget = dialogs.textStyles.first->centralWidget();
+ MLayout *layout = new MLayout(centralWidget);
+ MLinearLayoutPolicy *policy = new MLinearLayoutPolicy(layout, Qt::Vertical);
+
+ QFontDatabase fontDatabase;
+ QStringList fontFamilyValues = fontDatabase.families();
+ fontFamilyCombo = new MComboBox(centralWidget);
+ //% "Font"
+ fontFamilyCombo->setTitle(qtTrId("qtn_comm_font"));
+ QStringListModel *fontModel = new QStringListModel(centralWidget);
+ fontModel->setStringList(fontFamilyValues);
+ fontFamilyCombo->setItemModel(fontModel);
+ policy->addItem(fontFamilyCombo);
+
+ connect(fontFamilyCombo, SIGNAL(activated(QString)),
+ this, SIGNAL(fontFamilySelected(QString)));
+}
+
+
+void MRichTextEditDialogsManager::setTextStyleValues(const QString &fontfamily)
+{
+ Q_ASSERT(fontFamilyCombo);
+
+ int familyIndex = -1;
+ QStringListModel *fontModel = dynamic_cast<QStringListModel *>(fontFamilyCombo->itemModel());
+ if (fontModel) {
+ QStringList fontFamilies = fontModel->stringList();
+ familyIndex = fontFamilies.indexOf(fontfamily);
+ }
+
+ fontFamilyCombo->setCurrentIndex(familyIndex);
+}
+
+
+void MRichTextEditDialogsManager::execDialog(ActiveDialog *activeDialog)
+{
+ if (activeDialog &&
+ !activeDialog->second &&
+ activeDialog->first) {
+ activeDialog->second = true;
+ activeDialog->first->exec();
+ activeDialog->second = false;
+ }
+}
+
+void MRichTextEditDialogsManager::showTextStylingDialog(const QString &fontfamily)
+{
+ initTextStylingDialog();
+ setTextStyleValues(fontfamily);
+ execDialog(&dialogs.textStyles);
+}
+
diff --git a/src/corelib/widgets/mrichtexteditdialogsmanager_p.h b/src/corelib/widgets/mrichtexteditdialogsmanager_p.h
new file mode 100644
index 00000000..652f5363
--- /dev/null
+++ b/src/corelib/widgets/mrichtexteditdialogsmanager_p.h
@@ -0,0 +1,87 @@
+/***************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (directui@nokia.com)
+**
+** This file is part of libmeegotouch.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at directui@nokia.com.
+**
+** This library is free software; you can redistribute it and/or
+** modify it under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation
+** and appearing in the file LICENSE.LGPL included in the packaging
+** of this file.
+**
+****************************************************************************/
+
+#ifndef MRICHTEXTEDITDIALOGSMANAGER_P_H
+#define MRICHTEXTEDITDIALOGSMANAGER_P_H
+
+#include <QPointer>
+#include <QPair>
+
+class MDialog;
+class MComboBox;
+
+class MRichTextEditDialogsManager : public QObject
+{
+ Q_OBJECT
+
+public:
+ /*!
+ * \brief returns the MRichTextEditDialogsManager instance
+ */
+ static MRichTextEditDialogsManager *instance();
+ /*!
+ * \brief shows the text styling dialog with the current style
+ */
+ void showTextStylingDialog(const QString &fontfamily = "");
+
+Q_SIGNALS:
+
+ /**
+ * \brief Emitted whenever a font family is selected
+ */
+ void fontFamilySelected(const QString &fontFamily);
+
+private:
+ // QPointer<MDialog> in ActiveDialog will hold a dialog
+ // bool in ActiveDialog is used to avoid calling its dialog's exec() when it is active
+ typedef QPair<QPointer<MDialog>, bool> ActiveDialog;
+
+ /*!
+ * \brief private constructor to make the class singleton
+ */
+ MRichTextEditDialogsManager();
+ /*!
+ * \brief private destructor to avoid deleting the singleton object
+ */
+ virtual ~MRichTextEditDialogsManager();
+ /*!
+ * \brief initializes the TextStyles dialog
+ */
+ void initTextStylingDialog();
+ /*!
+ * \brief updates the ui components of the TextStyles dialog to show the current style
+ */
+ void setTextStyleValues(const QString &fontfamily);
+ /*!
+ * \brief launches the dialog of given type
+ */
+ void execDialog(ActiveDialog *activeDialog);
+
+ static MRichTextEditDialogsManager *dialogsManager;
+
+ struct Dialogs
+ {
+ ActiveDialog textStyles;
+ };
+ Dialogs dialogs;
+
+ MComboBox *fontFamilyCombo;
+};
+
+#endif
diff --git a/src/corelib/widgets/widgets.pri b/src/corelib/widgets/widgets.pri
index 682d2c2e..538a3d81 100644
--- a/src/corelib/widgets/widgets.pri
+++ b/src/corelib/widgets/widgets.pri
@@ -119,6 +119,7 @@ PRIVATE_HEADERS += \
$$WIDGETS_SRC_DIR/mscenewindow_p.h \
$$WIDGETS_SRC_DIR/mstatusbar_p.h \
$$WIDGETS_SRC_DIR/mwindow_p.h \
+ $$WIDGETS_SRC_DIR/mrichtexteditdialogsmanager_p.h \
SOURCES += \
$$WIDGETS_SRC_DIR/mwidgetmodel.cpp \
@@ -159,6 +160,7 @@ SOURCES += \
$$WIDGETS_SRC_DIR/mpositionindicator.cpp \
$$WIDGETS_SRC_DIR/mprogressindicator.cpp \
$$WIDGETS_SRC_DIR/mrichtextedit.cpp \
+ $$WIDGETS_SRC_DIR/mrichtexteditdialogsmanager.cpp \
$$WIDGETS_SRC_DIR/mscenewindow.cpp \
$$WIDGETS_SRC_DIR/mseekbar.cpp \
$$WIDGETS_SRC_DIR/mslider.cpp \
diff --git a/src/data/RichTextEditorToolbar1.xml b/src/data/RichTextEditorToolbar1.xml
index 90ca0517..adf90602 100644
--- a/src/data/RichTextEditorToolbar1.xml
+++ b/src/data/RichTextEditorToolbar1.xml
@@ -3,6 +3,11 @@
<input-method version="1">
<toolbar>
<items>
+ <button name="Font" group="Styles" showon="always" text="Font" text_id="" icon="Icon-m-common-option" size="80%">
+ <actions>
+ <sendkeysequence keysequence="Ctrl+F"> </sendkeysequence>
+ </actions>
+ </button>
<button name="Underline" group="Styles" showon="always" text="&lt;U&gt;U&lt;&#x002F;U&gt;" text_id="" toggle="true" pressed="false" icon="Icon-m-common-underline" size="80%">
<actions>
<sendkeysequence keysequence="Ctrl+U"> </sendkeysequence>
@@ -20,6 +25,7 @@
</button>
</items>
<layout>
+ <item name="Font" />
<item name="Underline" />
<item name="Italic" />
<item name="Bold" />