aboutsummaryrefslogtreecommitdiff
path: root/src/corelib/widgets/mrichtexteditdialogsmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/widgets/mrichtexteditdialogsmanager.cpp')
-rw-r--r--src/corelib/widgets/mrichtexteditdialogsmanager.cpp256
1 files changed, 252 insertions, 4 deletions
diff --git a/src/corelib/widgets/mrichtexteditdialogsmanager.cpp b/src/corelib/widgets/mrichtexteditdialogsmanager.cpp
index c0d78202..3ea1a263 100644
--- a/src/corelib/widgets/mrichtexteditdialogsmanager.cpp
+++ b/src/corelib/widgets/mrichtexteditdialogsmanager.cpp
@@ -19,18 +19,150 @@
#include <QFontDatabase>
#include <QStringListModel>
+#include <QGraphicsSceneMouseEvent>
#include <QDebug>
+#include <MApplication>
+#include <MApplicationWindow>
+#include <MBasicListItem>
#include <MComboBox>
#include <MDialog>
#include <MLayout>
#include <MLinearLayoutPolicy>
+#include <MSceneManager>
#include "mrichtexteditdialogsmanager_p.h"
MRichTextEditDialogsManager *MRichTextEditDialogsManager::dialogsManager = 0;
+MRichTextEditFontStyleWidget::MRichTextEditFontStyleWidget(QGraphicsItem *parent)
+ : QGraphicsWidget(parent)
+{
+}
+
+
+MRichTextEditFontStyleWidget::~MRichTextEditFontStyleWidget()
+{
+}
+
+void MRichTextEditFontStyleWidget::updateSize(int numRows, int numColumns)
+{
+ QSizeF boundingRect = maximumSize();
+ // TODO: Yet to get the layout guide and need to align accordingly
+ static const int translateX = 10;
+ static const int translateY = 10;
+ static const int rectWidth = 70;
+ static const int rectHeight = 50;
+
+ qreal width = numColumns * rectWidth;
+ qreal height = numRows * rectHeight;
+
+ // Using 75% width and height of the parent (MDialog)
+ qreal boundingRectWidth = 0.75 * boundingRect.width();
+ qreal boundingRectHeight = 0.75 * boundingRect.height();
+
+ qreal horizontalGapSize = (boundingRectWidth - width - translateX) / (numColumns + 1);
+ qreal verticalGapSize = (boundingRectHeight - height - translateY) / (numRows + 1);
+
+ items.clear();
+ int size = numRows * numColumns;
+ for (int index = 0; index < size; index++) {
+ QRectF rect;
+ rect.setX(translateX + ((index % numColumns) * horizontalGapSize) +
+ ((index % numColumns) * rectWidth));
+ rect.setY(translateY + ((index / numColumns) * verticalGapSize) +
+ ((index / numColumns) * rectHeight));
+ rect.setWidth(rectWidth);
+ rect.setHeight(rectHeight);
+
+ items << rect;
+ }
+}
+
+
+void MRichTextEditFontStyleWidget::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+ QPointF curPos = event->pos();
+ event->accept();
+
+ int size = items.size();
+ for (int index = 0; index < size; index++) {
+ if (items[index].contains(curPos)) {
+ selectItem(index);
+ update();
+ break;
+ }
+ }
+}
+
+
+void MRichTextEditFontStyleWidget::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+ event->accept();
+}
+
+
+MRichTextEditFontSizeWidget::MRichTextEditFontSizeWidget(const QList<int> &fontSizeValues,
+ QGraphicsItem *parent)
+ : MRichTextEditFontStyleWidget(parent),
+ sizeValues(fontSizeValues),
+ activeIndex(-1)
+{
+}
+
+
+MRichTextEditFontSizeWidget::~MRichTextEditFontSizeWidget()
+{
+}
+
+void MRichTextEditFontSizeWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
+ QWidget *widget)
+{
+ Q_UNUSED(option);
+ Q_UNUSED(widget);
+
+ QBrush brush(Qt::gray, Qt::SolidPattern);
+ painter->setBrush(brush);
+
+ int size = items.size();
+ for (int index = 0; index < size; index++) {
+ if (activeIndex == index) {
+ painter->drawRect(items[index]);
+ } else {
+ painter->fillRect(items[index], brush);
+ }
+ // Draw the font size value as text
+ painter->drawText(items[index], Qt::AlignCenter, QString::number(sizeValues[index]));
+ }
+}
+
+
+void MRichTextEditFontSizeWidget::selectItem(int index)
+{
+ if (index >= 0 && index < sizeValues.size()) {
+ activeIndex = index;
+ emit fontSizeSelected(sizeValues[index]);
+ }
+}
+
+
+void MRichTextEditFontSizeWidget::updateOrientation(M::Orientation orientation)
+{
+ Q_UNUSED(orientation);
+
+ // Update the size of the items in the ui when the orientation changes
+ updateSize(sizeValues.size() / 4, 4);
+}
+
+
+void MRichTextEditFontSizeWidget::setActiveSize(int size)
+{
+ activeIndex = sizeValues.indexOf(size);
+}
+
MRichTextEditDialogsManager::MRichTextEditDialogsManager()
- : fontFamilyCombo(0)
+ : fontFamilyCombo(0),
+ fontSizeListItem(0),
+ fontSizeWidget(0)
{
}
@@ -38,6 +170,7 @@ MRichTextEditDialogsManager::MRichTextEditDialogsManager()
MRichTextEditDialogsManager::~MRichTextEditDialogsManager()
{
delete dialogs.textStyles.first;
+ delete dialogs.fontSize.first;
}
@@ -78,10 +211,114 @@ void MRichTextEditDialogsManager::initTextStylingDialog()
connect(fontFamilyCombo, SIGNAL(activated(QString)),
this, SIGNAL(fontFamilySelected(QString)));
+
+ fontSizeListItem = new MBasicListItem(MBasicListItem::TitleWithSubtitle, centralWidget);
+ //% "Font size"
+ fontSizeData.titleName = qtTrId("qtn_comm_font_size");
+ fontSizeListItem->setTitle(fontSizeData.titleName);
+
+ fontSizeData.sizeValues << 8 << 9 << 10 << 11
+ << 12 << 14 << 16 << 18
+ << 20 << 22 << 24 << 26
+ << 28 << 32 << 48 << 72;
+
+ fontSizeListItem->setSubtitle(QString::number(fontSizeData.sizeValues[0]));
+
+ connect(fontSizeListItem, SIGNAL(clicked()),
+ this, SLOT(showFontSizeDialog()));
+ policy->addItem(fontSizeListItem);
+}
+
+
+void MRichTextEditDialogsManager::initFontSizeDialog()
+{
+ if (dialogs.fontSize.first) {
+ return;
+ }
+
+ dialogs.fontSize.first = new MDialog();
+ dialogs.fontSize.first->setTitle(fontSizeData.titleName);
+ dialogs.fontSize.second = false;
+
+ QGraphicsWidget *centralWidget = dialogs.fontSize.first->centralWidget();
+ MLayout *layout = new MLayout(centralWidget);
+ MLinearLayoutPolicy *policy = new MLinearLayoutPolicy(layout, Qt::Vertical);
+
+ fontSizeWidget = new MRichTextEditFontSizeWidget(fontSizeData.sizeValues, centralWidget);
+ policy->addItem(fontSizeWidget);
+
+ connect(fontSizeWidget, SIGNAL(fontSizeSelected(int)),
+ SLOT(setFontSize(int)));
+}
+
+
+void MRichTextEditDialogsManager::showFontSizeDialog()
+{
+ initFontSizeDialog();
+
+ Q_ASSERT(MApplication::activeApplicationWindow());
+
+ const MSceneManager *sceneManager = MApplication::activeApplicationWindow()->sceneManager();
+
+ // Orientation could be changing when the font size widget is not active, so
+ // update the orientation change before showing the widget
+ updateFontSizeWidgetOrientation(sceneManager->orientation());
+
+ Q_ASSERT(fontSizeWidget);
+
+ int activeSizeIndex = fontSizeData.activeSizeIndex;
+ if (activeSizeIndex >= 0 && activeSizeIndex < fontSizeData.sizeValues.size()) {
+ fontSizeWidget->setActiveSize(fontSizeData.sizeValues[activeSizeIndex]);
+ } else {
+ fontSizeWidget->setActiveSize(-1);
+ }
+
+ // For getting the orientation change when the font size widget is active
+ connect(sceneManager, SIGNAL(orientationChanged(M::Orientation)),
+ SLOT(updateFontSizeWidgetOrientation(M::Orientation)));
+
+ execDialog(&dialogs.fontSize);
+
+ disconnect(sceneManager, SIGNAL(orientationChanged(M::Orientation)),
+ this, SLOT(updateFontSizeWidgetOrientation(M::Orientation)));
}
-void MRichTextEditDialogsManager::setTextStyleValues(const QString &fontfamily)
+void MRichTextEditDialogsManager::updateFontSizeWidgetOrientation(M::Orientation orientation)
+{
+ Q_ASSERT(fontSizeWidget);
+ if (dialogs.fontSize.first) {
+ // Update the font widget size when the orientation changes
+ fontSizeWidget->setMinimumSize(dialogs.fontSize.first->maximumSize());
+ fontSizeWidget->setMaximumSize(dialogs.fontSize.first->maximumSize());
+ fontSizeWidget->updateOrientation(orientation);
+ }
+}
+
+
+void MRichTextEditDialogsManager::setFontSize(int fontSize)
+{
+ Q_ASSERT(fontSizeListItem);
+
+ fontSizeData.activeSizeIndex = fontSizeData.sizeValues.indexOf(fontSize);
+
+ if (fontSizeData.activeSizeIndex >= 0 &&
+ fontSizeData.activeSizeIndex < fontSizeData.sizeValues.size()) {
+ int fontSize = fontSizeData.sizeValues[fontSizeData.activeSizeIndex];
+ fontSizeListItem->setSubtitle(QString::number(fontSize));
+ } else {
+ fontSizeListItem->setSubtitle(QString());
+ }
+
+ if (dialogs.fontSize.first) {
+ dialogs.fontSize.first->done(MDialog::Accepted);
+ }
+
+ emit fontSizeSelected(fontSize);
+}
+
+
+void MRichTextEditDialogsManager::setTextStyleValues(const QString &fontfamily, int fontPointSize)
{
Q_ASSERT(fontFamilyCombo);
@@ -93,6 +330,17 @@ void MRichTextEditDialogsManager::setTextStyleValues(const QString &fontfamily)
}
fontFamilyCombo->setCurrentIndex(familyIndex);
+
+ Q_ASSERT(fontSizeListItem);
+
+ fontSizeData.activeSizeIndex = fontSizeData.sizeValues.indexOf(fontPointSize);
+ if (fontSizeData.activeSizeIndex >= 0 &&
+ fontSizeData.activeSizeIndex < fontSizeData.sizeValues.size()) {
+ int fontSize = fontSizeData.sizeValues[fontSizeData.activeSizeIndex];
+ fontSizeListItem->setSubtitle(QString::number(fontSize));
+ } else {
+ fontSizeListItem->setSubtitle(QString());
+ }
}
@@ -107,10 +355,10 @@ void MRichTextEditDialogsManager::execDialog(ActiveDialog *activeDialog)
}
}
-void MRichTextEditDialogsManager::showTextStylingDialog(const QString &fontfamily)
+void MRichTextEditDialogsManager::showTextStylingDialog(const QString &fontfamily, int fontPointSize)
{
initTextStylingDialog();
- setTextStyleValues(fontfamily);
+ setTextStyleValues(fontfamily, fontPointSize);
execDialog(&dialogs.textStyles);
}