diff options
author | Murugappan Nataraj <murugappan.nataraj@nokia.com> | 2010-07-09 17:36:47 +0530 |
---|---|---|
committer | Pekka Vuorela <pekka.ta.vuorela@nokia.com> | 2011-01-11 18:18:10 +0200 |
commit | b452ea8b71cc49b21886049945003911453515a5 (patch) | |
tree | 702a3b00033adf3d2eb32d6e0725a2c3082613c1 | |
parent | d614b9753c6d9c62aa31052c8877019780f2e218 (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.cpp | 90 | ||||
-rw-r--r-- | src/corelib/widgets/mrichtextedit.h | 1 | ||||
-rw-r--r-- | src/corelib/widgets/mrichtextedit_p.h | 12 | ||||
-rw-r--r-- | src/corelib/widgets/mrichtexteditdialogsmanager.cpp | 116 | ||||
-rw-r--r-- | src/corelib/widgets/mrichtexteditdialogsmanager_p.h | 87 | ||||
-rw-r--r-- | src/corelib/widgets/widgets.pri | 2 | ||||
-rw-r--r-- | src/data/RichTextEditorToolbar1.xml | 6 |
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="<U>U</U>" 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" /> |