X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Funicodedialog.cpp;h=d55c30dfaffe1edca32bda5b06fdb1b642d9e0f0;hb=c3302003093710ee247ad84c0fe2ef3c579d417f;hp=53e1a9695bdbe1e46111e70f3b332971733ccc1e;hpb=ca8cd6607f6277a27b5654dafe3780235b0bc7a0;p=kdenlive diff --git a/src/unicodedialog.cpp b/src/unicodedialog.cpp index 53e1a969..d55c30df 100644 --- a/src/unicodedialog.cpp +++ b/src/unicodedialog.cpp @@ -9,66 +9,96 @@ #include "unicodedialog.h" +#include + /// CONSTANTS const int MAX_LENGTH_HEX = 4; const uint MAX_UNICODE_V1 = 65535; +UnicodeDialog::UnicodeDialog(InputMethod inputMeth, QWidget *parent) + : KDialog(parent) +{ + setCaption( i18n("Details") ); + setButtons( Ok|Cancel ); + mUnicodeWidget = new UnicodeWidget(inputMeth); + connect(mUnicodeWidget, SIGNAL(charSelected(QString)), SIGNAL(charSelected(QString))); + setMainWidget(mUnicodeWidget); + connect(this, SIGNAL(okClicked()), SLOT(slotAccept())); +} + +UnicodeDialog::~UnicodeDialog() +{ +} + +void UnicodeDialog::slotAccept() +{ + mUnicodeWidget->slotReturnPressed(); + accept(); +} + + /// CONSTRUCTORS/DECONSTRUCTORS -UnicodeDialog::UnicodeDialog(InputMethod inputMeth) : inputMethod(inputMeth), lastCursorPos(0), lastUnicodeNumber("") +UnicodeWidget::UnicodeWidget(UnicodeDialog::InputMethod inputMeth, QWidget *parent) + : QWidget(parent), + inputMethod(inputMeth), + m_lastCursorPos(0) { setupUi(this); + readChoices(); + showLastUnicode(); connect(unicodeNumber, SIGNAL(textChanged(QString)), this, SLOT(slotTextChanged(QString))); connect(unicodeNumber, SIGNAL(returnPressed()), this, SLOT(slotReturnPressed())); - connect(arrowUp, SIGNAL(clicked()), this, SLOT(slotNextUnicode())); - connect(arrowDown, SIGNAL(clicked()), this, SLOT(slotPrevUnicode())); + connect(arrowUp, SIGNAL(clicked()), this, SLOT(slotPrevUnicode())); + connect(arrowDown, SIGNAL(clicked()), this, SLOT(slotNextUnicode())); switch (inputMethod) { - case InputHex: + case UnicodeDialog::InputHex: unicodeNumber->setMaxLength(MAX_LENGTH_HEX); break; - case InputDec: + case UnicodeDialog::InputDec: break; } arrowUp->setShortcut(Qt::Key_Up); arrowDown->setShortcut(Qt::Key_Down); - - arrowUp->setToolTip(i18n("Next Unicode character (Arrow Up)")); - arrowDown->setToolTip(i18n("Previous Unicode character (Arrow Down)")); + unicode_link->setText(i18n("Information about unicode characters: http://decodeunicode.org")); + arrowUp->setToolTip(i18n("Previous Unicode character (Arrow Up)")); + arrowDown->setToolTip(i18n("Next Unicode character (Arrow Down)")); unicodeNumber->setToolTip(i18n("Enter your Unicode number here. Allowed characters: [0-9] and [a-f].")); + unicodeNumber->selectAll(); // Selection will be reset by setToolTip and similar, so set it here } -UnicodeDialog::~UnicodeDialog() +UnicodeWidget::~UnicodeWidget() { } - - /// METHODS -void UnicodeDialog::showLastUnicode() +void UnicodeWidget::showLastUnicode() { - unicodeNumber->setText(lastUnicodeNumber); + unicodeNumber->setText(m_lastUnicodeNumber); + unicodeNumber->selectAll(); + slotTextChanged(m_lastUnicodeNumber); } -bool UnicodeDialog::controlCharacter(QString text) +bool UnicodeWidget::controlCharacter(const QString &text) { bool isControlCharacter = false; QString t = text.toLower(); switch (inputMethod) { - case InputHex: - if (t == "" + case UnicodeDialog::InputHex: + if (t.isEmpty() || (t.length() == 1 && !(t == "9" || t == "a" || t == "d")) || (t.length() == 2 && t.at(0) == QChar('1'))) { isControlCharacter = true; } break; - case InputDec: + case UnicodeDialog::InputDec: bool ok; isControlCharacter = controlCharacter(text.toUInt(&ok, 16)); break; @@ -77,7 +107,7 @@ bool UnicodeDialog::controlCharacter(QString text) return isControlCharacter; } -bool UnicodeDialog::controlCharacter(uint value) +bool UnicodeWidget::controlCharacter(uint value) { bool isControlCharacter = false; @@ -88,29 +118,31 @@ bool UnicodeDialog::controlCharacter(uint value) } -QString UnicodeDialog::trimmedUnicodeNumber(QString text) +QString UnicodeWidget::trimmedUnicodeNumber(QString text) { - while (text.length() > 0 && text.at(0) == QChar('0')) { + while (!text.isEmpty() && text.at(0) == QChar('0')) { text = text.remove(0, 1); } return text; } -QString UnicodeDialog::unicodeInfo(QString unicode_number) +QString UnicodeWidget::unicodeInfo(const QString &unicode) { QString infoText(i18n("(no character selected)")); - if (unicode_number.length() == 0) return infoText; + if (unicode.length() == 0) return infoText; - QString u = trimmedUnicodeNumber(unicode_number).toLower(); + QString u = trimmedUnicodeNumber(unicode).toLower(); if (controlCharacter(u)) { infoText = i18n("Control character. Cannot be inserted/printed. See Wikipedia:Control_character"); } else if (u == "a") { infoText = i18n("Line Feed (newline character, \\\\n)"); } else if (u == "20") { - infoText = i18n("Standard space character. (See U+00a0 and U+2000–200b)"); + infoText = i18n("Standard space character. (Other space characters: U+00a0, U+2000–200b, U+202f)"); } else if (u == "a0") { - infoText = i18n("No-break space.   in HTML. See U+0020."); + infoText = i18n("No-break space.   in HTML. See U+2009 and U+0020."); + } else if (u == "ab" || u == "bb" || u == "2039" || u == "203a") { + infoText = i18n("

« (u+00ab, &lfquo; in HTML) and » (u+00bb, &rfquo; in HTML) are called Guillemets or angle quotes. Usage in different countries: France (with non-breaking Space 0x00a0), Switzerland, Germany, Finland and Sweden.

and (U+2039/203a, ‹/›) are their single quote equivalents.

See Wikipedia:Guillemets

"); } else if (u == "2002") { infoText = i18n("En Space (width of an n)"); } else if (u == "2003") { @@ -126,17 +158,31 @@ QString UnicodeDialog::unicodeInfo(QString unicode_number) } else if (u == "2008") { infoText = i18n("Punctuation Space. Width the same as between a punctuation character and the next character."); } else if (u == "2009") { - infoText = i18n("Thin space, in HTML also  . See Wikipedia:Space_(punctuation)"); + infoText = i18n("Thin space, in HTML also  . See U+202f and Wikipedia:Space_(punctuation)"); } else if (u == "200a") { infoText = i18n("Hair Space. Thinner than U+2009."); } else if (u == "2019") { infoText = i18n("Punctuation Apostrophe. Should be used instead of U+0027. See Wikipedia:Apostrophe"); } else if (u == "2013") { - infoText = i18n("An en Dash (dash of the width of an n). See Wikipedia:Dash"); + infoText = i18n("

An en Dash (dash of the width of an n).

Usage examples: In English language for value ranges (1878–1903), for relationships/connections (Zurich–Dublin). In the German language it is also used (with spaces!) for showing thoughts: “Es war – wie immer in den Ferien – ein regnerischer Tag.

See Wikipedia:Dash

"); } else if (u == "2014") { - infoText = i18n("An em Dash (dash of the widht of an m). See Wikipedia:Dash"); + infoText = i18n("

An em Dash (dash of the width of an m).

Usage examples: In English language to mark—like here—thoughts. Traditionally without spaces.

See Wikipedia:Dash

"); + } else if (u == "202f") { + infoText = i18n("

Narrow no-break space. Has the same width as U+2009.

Usage: For units (spaces are marked with U+2423, ␣): 230␣V, −21␣°C, 50␣lb, but 90° (no space). In German for abbreviations (like: i. d. R. instead of i. d. R. with U+00a0).

See Wikipedia:de:Schmales_Leerzeichen

"); } else if (u == "2026") { - infoText = i18n("Ellipsis: If text has been left out. See Wikipedia:Ellipsis"); + infoText = i18n("Ellipsis: If text has been left o… See Wikipedia:Ellipsis"); + } else if (u == "2212") { + infoText = i18n("Minus sign. For numbers: −42"); + } else if (u == "2423") { + infoText = i18n("Open box; stands for a space."); + } else if (u == "2669") { + infoText = i18n("Quarter note (Am.) or crochet (Brit.). See Wikipedia:Quarter_note"); + } else if (u == "266a" || u == "266b") { + infoText = i18n("Eighth note (Am.) or quaver (Brit.). Half as long as a quarter note (U+2669). See Wikipedia:Eighth_note"); + } else if (u == "266c") { + infoText = i18n("Sixteenth note (Am.) or semiquaver (Brit.). Half as long as an eighth note (U+266a). See Wikipedia:Sixteenth_note"); + } else if (u == "1D162") { + infoText = i18n("Thirty-second note (Am.) or demisemiquaver (Brit.). Half as long as a sixteenth note (U+266b). See Wikipedia:Thirty-second_note"); } else { infoText = i18n("No additional information available for this character."); } @@ -144,14 +190,14 @@ QString UnicodeDialog::unicodeInfo(QString unicode_number) return infoText; } -QString UnicodeDialog::validateText(QString text) +QString UnicodeWidget::validateText(const QString &text) { QRegExp regex("([0-9]|[a-f])", Qt::CaseInsensitive, QRegExp::RegExp2); - QString newText = ""; + QString newText; int pos = 0; switch (inputMethod) { - case InputHex: + case UnicodeDialog::InputHex: // Remove all characters we don't want while ((pos = regex.indexIn(text, pos)) != -1) { newText += regex.cap(1); @@ -159,7 +205,7 @@ QString UnicodeDialog::validateText(QString text) } break; - case InputDec: + case UnicodeDialog::InputDec: // TODO break; } @@ -167,23 +213,23 @@ QString UnicodeDialog::validateText(QString text) return newText; } -void UnicodeDialog::updateOverviewChars(uint unicode) +void UnicodeWidget::updateOverviewChars(uint unicode) { - QString left = ""; - QString right = ""; + QString left; + QString right; uint i; - for (i = 1; i <= 4; i++) { + for (i = 1; i <= 4; ++i) { if (unicode > i && !controlCharacter(unicode - i)) { - left = " " + left; + left = ' ' + left; left = QChar(unicode - i) + left; } } - for (i = 1; i <= 8; i++) { + for (i = 1; i <= 8; ++i) { if (unicode + i <= MAX_UNICODE_V1 && !controlCharacter(unicode + i)) { right += QChar(unicode + i); - right += " "; + right += ' '; } } @@ -192,20 +238,20 @@ void UnicodeDialog::updateOverviewChars(uint unicode) } -void UnicodeDialog::clearOverviewChars() +void UnicodeWidget::clearOverviewChars() { leftChars->setText(""); rightChars->setText(""); } -QString UnicodeDialog::nextUnicode(QString text, Direction direction) +QString UnicodeWidget::nextUnicode(const QString &text, Direction direction) { uint value = 0; - QString newText = ""; + QString newText; bool ok; switch (inputMethod) { - case InputHex: + case UnicodeDialog::InputHex: value = text.toUInt(&ok, 16); switch (direction) { case Backward: @@ -222,20 +268,39 @@ QString UnicodeDialog::nextUnicode(QString text, Direction direction) newText.setNum(value, 16); break; - case InputDec: + case UnicodeDialog::InputDec: break; } return newText; } +void UnicodeWidget::readChoices() +{ + // Get a pointer to a shared configuration instance, then get the TitleWidget group. + KSharedConfigPtr config = KGlobal::config(); + KConfigGroup titleConfig(config, "TitleWidget"); + + // Default is 2013 because there is also (perhaps interesting) information. + m_lastUnicodeNumber = titleConfig.readEntry("unicode_number", QString("2013")); +} + +void UnicodeWidget::writeChoices() +{ + // Get a pointer to a shared configuration instance, then get the TitleWidget group. + KSharedConfigPtr config = KGlobal::config(); + KConfigGroup titleConfig(config, "TitleWidget"); + + titleConfig.writeEntry("unicode_number", m_lastUnicodeNumber); +} + /// SLOTS /** * \brief Validates the entered Unicode number and displays its Unicode character. */ -void UnicodeDialog::slotTextChanged(QString text) +void UnicodeWidget::slotTextChanged(const QString &text) { unicodeNumber->blockSignals(true); @@ -244,8 +309,8 @@ void UnicodeDialog::slotTextChanged(QString text) unicodeChar->setText(""); unicodeNumber->setText(""); clearOverviewChars(); - lastCursorPos = 0; - lastUnicodeNumber = ""; + m_lastCursorPos = 0; + m_lastUnicodeNumber = ""; labelInfoText->setText(unicodeInfo("")); } else { @@ -259,10 +324,10 @@ void UnicodeDialog::slotTextChanged(QString text) bool ok; uint value = 0; switch (inputMethod) { - case InputHex: + case UnicodeDialog::InputHex: value = newText.toUInt(&ok, 16); break; - case InputDec: + case UnicodeDialog::InputDec: value = newText.toUInt(&ok, 10); break; } @@ -274,12 +339,12 @@ void UnicodeDialog::slotTextChanged(QString text) // If an invalid character has been entered: // Reset the cursor position because the entered char has been deleted. - if (text != newText && newText == lastUnicodeNumber) { - unicodeNumber->setCursorPosition(lastCursorPos); + if (text != newText && newText == m_lastUnicodeNumber) { + unicodeNumber->setCursorPosition(m_lastCursorPos); } - lastCursorPos = unicodeNumber->cursorPosition(); - lastUnicodeNumber = newText; + m_lastCursorPos = unicodeNumber->cursorPosition(); + m_lastUnicodeNumber = newText; labelInfoText->setText(unicodeInfo(newText)); unicodeChar->setText(QChar(value)); @@ -292,25 +357,36 @@ void UnicodeDialog::slotTextChanged(QString text) * When return pressed, we return the selected unicode character * if it was not a control character. */ -void UnicodeDialog::slotReturnPressed() +void UnicodeWidget::slotReturnPressed() { - QString text = trimmedUnicodeNumber(unicodeNumber->text()); + unicodeNumber->setFocus(); + const QString text = trimmedUnicodeNumber(unicodeNumber->text()); if (!controlCharacter(text)) { emit charSelected(unicodeChar->text()); + writeChoices(); } - emit accept(); } -void UnicodeDialog::slotNextUnicode() +void UnicodeWidget::slotNextUnicode() { - QString text = unicodeNumber->text(); + const QString text = unicodeNumber->text(); unicodeNumber->setText(nextUnicode(text, Forward)); } -void UnicodeDialog::slotPrevUnicode() +void UnicodeWidget::slotPrevUnicode() { - QString text = unicodeNumber->text(); + const QString text = unicodeNumber->text(); unicodeNumber->setText(nextUnicode(text, Backward)); } +void UnicodeWidget::wheelEvent(QWheelEvent * event) +{ + if (frame->underMouse()) { + if (event->delta() > 0) + slotNextUnicode(); + else + slotPrevUnicode(); + } +} + #include "unicodedialog.moc"