diff options
Diffstat (limited to 'scribus/charselectenhanced.cpp')
| -rw-r--r-- | scribus/charselectenhanced.cpp | 475 |
1 files changed, 475 insertions, 0 deletions
diff --git a/scribus/charselectenhanced.cpp b/scribus/charselectenhanced.cpp new file mode 100644 index 0000000..581b438 --- /dev/null +++ b/scribus/charselectenhanced.cpp @@ -0,0 +1,475 @@ +/* +For general Scribus (>=1.3.2) copyright and licensing information please refer +to the COPYING file provided with the program. Following this notice may exist +a copyright and/or license notice that predates the release of Scribus 1.3.2 +for which a new license (GPL+exception) is in place. +*/ + +#include <QFileDialog> +#include <QMessageBox> + +#include "charselectenhanced.h" +#include "fonts/scfontmetrics.h" +#include "scribusdoc.h" +#include "util.h" + + +CharSelectEnhanced::CharSelectEnhanced(QWidget* parent) + : ScrPaletteBase(parent, "CharSelectEnhanced"), + m_doc(0), + m_characterClass(0) +{ + setupUi(this); + + m_charTableModel = new CharTableModel(this, 26, m_doc);//, +// PrefsManager::instance()->appPrefs.toolSettings.defFont); + m_charTable->setModel(m_charTableModel); + m_charTable->setDragEnabled(true); + + // insert hex codes directly + QValidator* insValidator = new QRegExpValidator(QRegExp("[A-F,a-f,0-9]{4}"), this); + hexLineEdit->setValidator(insValidator); + + // signals and slots connections + connect(deleteButton, SIGNAL(clicked()), this, SLOT(delEdit())); + connect(insertButton, SIGNAL(clicked()), this, SLOT(insChar())); + connect(m_charTable, SIGNAL(selectChar(uint)), this, SLOT(newChar(uint))); + connect(fontSelector, SIGNAL(activated(int)), this, SLOT(newFont(int))); + connect(rangeSelector, SIGNAL(activated(int)), this, SLOT(newCharClass(int))); + connect(hexLineEdit, SIGNAL(returnPressed()), + this, SLOT(hexLineEdit_returnPressed())); +} + +CharSelectEnhanced::~CharSelectEnhanced() +{ +} + +void CharSelectEnhanced::setDoc(ScribusDoc* doc) +{ +// tDebug("CharSelectEnhanced setDoc start"); + if (m_doc != doc) + { + m_doc = doc; + m_charTableModel->setDoc(m_doc); + delEdit(); + setupRangeCombo(); + newCharClass(1); + } + + QString oldFont(m_fontInUse); + m_fontInUse = m_doc->currentStyle.charStyle().font().scName(); + if (oldFont != m_fontInUse && !m_fontInUse.isEmpty()) + { + setCurrentComboItem(fontSelector, m_fontInUse); + newFont(fontSelector->currentIndex()); + } +// tDebug("CharSelectEnhanced setDoc end"); +} + +void CharSelectEnhanced::scanFont() +{ +// tDebug("scanFont start"); + uint charcode; + uint gindex; + QString gname; + allClasses.clear(); + charactersFull.clear(); + charactersLatin1.clear(); + charactersLatin1Supplement.clear(); + charactersLatinExtendedA.clear(); + charactersLatinExtendedB.clear(); + charactersGeneralPunctuation.clear(); + charactersSuperSubscripts.clear(); + charactersCurrencySymbols.clear(); + charactersLetterlikeSymbols.clear(); + charactersNumberForms.clear(); + charactersArrows.clear(); + charactersMathematicalOperators.clear(); + charactersBoxDrawing.clear(); + charactersBlockElements.clear(); + charactersGeometricShapes.clear(); + charactersMiscellaneousSymbols.clear(); + charactersDingbats.clear(); + charactersSmallFormVariants.clear(); + charactersAlphabeticPresentationForms.clear(); + charactersSpecial.clear(); + charactersGreek.clear(); + charactersGreekExtended.clear(); + charactersCyrillic.clear(); + charactersCyrillicSupplement.clear(); + charactersArabic.clear(); + charactersArabicPresentationFormsA.clear(); + charactersArabicPresentationFormsB.clear(); + charactersHebrew.clear(); + QMap<uint, std::pair<QChar, QString> > glyphs; + (*m_doc->AllFonts)[m_fontInUse].glyphNames(glyphs); + for (QMap<uint, std::pair<QChar, QString> >::iterator it=glyphs.begin(); + it != glyphs.end(); ++it) + { + charcode = it.value().first.unicode(); + gindex = it.key(); + gname = it.value().second; + charactersFull.append(charcode); + if ((charcode >= 0x0020) && (charcode <= 0x007F)) + charactersLatin1.append(charcode); + else if ((charcode >= 0x0080) && (charcode <= 0x00FF)) + charactersLatin1Supplement.append(charcode); + else if ((charcode >= 0x0100) && (charcode <= 0x017F)) + charactersLatinExtendedA.append(charcode); + else if ((charcode >= 0x0180) && (charcode <= 0x024F)) + charactersLatinExtendedB.append(charcode); + else if ((charcode >= 0x0370) && (charcode <= 0x03FF)) + charactersGreek.append(charcode); + else if ((charcode >= 0x0400) && (charcode <= 0x04FF)) + charactersCyrillic.append(charcode); + else if ((charcode >= 0x0500) && (charcode <= 0x052F)) + charactersCyrillicSupplement.append(charcode); + else if ((charcode >= 0x0590) && (charcode <= 0x05FF)) + charactersHebrew.append(charcode); + else if ((charcode >= 0x0600) && (charcode <= 0x06FF)) + charactersArabic.append(charcode); + else if ((charcode >= 0x1F00) && (charcode <= 0x1FFF)) + charactersGreekExtended.append(charcode); + else if ((charcode >= 0x2000) && (charcode <= 0x206F)) + charactersGeneralPunctuation.append(charcode); + else if ((charcode >= 0x2070) && (charcode <= 0x209F)) + charactersSuperSubscripts.append(charcode); + else if ((charcode >= 0x20A0) && (charcode <= 0x20CF)) + charactersCurrencySymbols.append(charcode); + else if ((charcode >= 0x2100) && (charcode <= 0x214F)) + charactersLetterlikeSymbols.append(charcode); + else if ((charcode >= 0x2150) && (charcode <= 0x218F)) + charactersNumberForms.append(charcode); + else if ((charcode >= 0x2190) && (charcode <= 0x21FF)) + charactersArrows.append(charcode); + else if ((charcode >= 0x2200) && (charcode <= 0x22FF)) + charactersMathematicalOperators.append(charcode); + else if ((charcode >= 0x2500) && (charcode <= 0x257F)) + charactersBoxDrawing.append(charcode); + else if ((charcode >= 0x2580) && (charcode <= 0x259F)) + charactersBlockElements.append(charcode); + else if ((charcode >= 0x25A0) && (charcode <= 0x25FF)) + charactersGeometricShapes.append(charcode); + else if ((charcode >= 0x2600) && (charcode <= 0x26FF)) + charactersMiscellaneousSymbols.append(charcode); + else if ((charcode >= 0x2700) && (charcode <= 0x27BF)) + charactersDingbats.append(charcode); + else if ((charcode >= 0xFE50) && (charcode <= 0xFE6F)) + charactersSmallFormVariants.append(charcode); + else if ((charcode >= 0xFB00) && (charcode <= 0xFB4F)) + charactersAlphabeticPresentationForms.append(charcode); + else if ((charcode >= 0xFB50) && (charcode <= 0xFDFF)) + charactersArabicPresentationFormsA.append(charcode); + else if ((charcode >= 0xFE70) && (charcode <= 0xFEFF)) + charactersArabicPresentationFormsB.append(charcode); + else if ((charcode >= 0xFFF0) && (charcode <= 0xFFFF)) + charactersSpecial.append(charcode); + } + allClasses.append(charactersFull); + allClasses.append(charactersLatin1); + allClasses.append(charactersLatin1Supplement); + allClasses.append(charactersLatinExtendedA); + allClasses.append(charactersLatinExtendedB); + allClasses.append(charactersGeneralPunctuation); + allClasses.append(charactersSuperSubscripts); + allClasses.append(charactersCurrencySymbols); + allClasses.append(charactersLetterlikeSymbols); + allClasses.append(charactersNumberForms); + allClasses.append(charactersArrows); + allClasses.append(charactersMathematicalOperators); + allClasses.append(charactersBoxDrawing); + allClasses.append(charactersBlockElements); + allClasses.append(charactersGeometricShapes); + allClasses.append(charactersMiscellaneousSymbols); + allClasses.append(charactersDingbats); + allClasses.append(charactersSmallFormVariants); + allClasses.append(charactersAlphabeticPresentationForms); + allClasses.append(charactersSpecial); + allClasses.append(charactersGreek); + allClasses.append(charactersGreekExtended); + allClasses.append(charactersCyrillic); + allClasses.append(charactersCyrillicSupplement); + allClasses.append(charactersArabic); + allClasses.append(charactersArabicPresentationFormsA); + allClasses.append(charactersArabicPresentationFormsB); + allClasses.append(charactersHebrew); +// tDebug("scanFont end"); +} + +void CharSelectEnhanced::setupRangeCombo() +{ +// tDebug("setupRangeCombo start"); + disconnect(rangeSelector, SIGNAL(activated(int)), this, SLOT(newCharClass(int))); + int counter = 0; + rangeSelector->clear(); + rangeSelector->addItem( tr("Full Character Set")); + usedCharClasses.insert(counter, 0); + counter++; + if (charactersLatin1.count() != 0) + { + rangeSelector->addItem( tr("Basic Latin")); + usedCharClasses.insert(counter, 1); + counter++; + } + if (charactersLatin1Supplement.count() != 0) + { + rangeSelector->addItem( tr("Latin-1 Supplement")); + usedCharClasses.insert(counter, 2); + counter++; + } + if (charactersLatinExtendedA.count() != 0) + { + rangeSelector->addItem( tr("Latin Extended-A")); + usedCharClasses.insert(counter, 3); + counter++; + } + if (charactersLatinExtendedB.count() != 0) + { + rangeSelector->addItem( tr("Latin Extended-B")); + usedCharClasses.insert(counter, 4); + counter++; + } + if (charactersGeneralPunctuation.count() != 0) + { + rangeSelector->addItem( tr("General Punctuation")); + usedCharClasses.insert(counter, 5); + counter++; + } + if (charactersSuperSubscripts.count() != 0) + { + rangeSelector->addItem( tr("Super- and Subscripts")); + usedCharClasses.insert(counter, 6); + counter++; + } + if (charactersCurrencySymbols.count() != 0) + { + rangeSelector->addItem( tr("Currency Symbols")); + usedCharClasses.insert(counter, 7); + counter++; + } + if (charactersLetterlikeSymbols.count() != 0) + { + rangeSelector->addItem( tr("Letterlike Symbols")); + usedCharClasses.insert(counter, 8); + counter++; + } + if (charactersNumberForms.count() != 0) + { + rangeSelector->addItem( tr("Number Forms")); + usedCharClasses.insert(counter, 9); + counter++; + } + if (charactersArrows.count() != 0) + { + rangeSelector->addItem( tr("Arrows")); + usedCharClasses.insert(counter, 10); + counter++; + } + if (charactersMathematicalOperators.count() != 0) + { + rangeSelector->addItem( tr("Mathematical Operators")); + usedCharClasses.insert(counter, 11); + counter++; + } + if (charactersBoxDrawing.count() != 0) + { + rangeSelector->addItem( tr("Box Drawing")); + usedCharClasses.insert(counter, 12); + counter++; + } + if (charactersBlockElements.count() != 0) + { + rangeSelector->addItem( tr("Block Elements")); + usedCharClasses.insert(counter, 13); + counter++; + } + if (charactersGeometricShapes.count() != 0) + { + rangeSelector->addItem( tr("Geometric Shapes")); + usedCharClasses.insert(counter, 14); + counter++; + } + if (charactersMiscellaneousSymbols.count() != 0) + { + rangeSelector->addItem( tr("Miscellaneous Symbols")); + usedCharClasses.insert(counter, 15); + counter++; + } + if (charactersDingbats.count() != 0) + { + rangeSelector->addItem( tr("Dingbats")); + usedCharClasses.insert(counter, 16); + counter++; + } + if (charactersSmallFormVariants.count() != 0) + { + rangeSelector->addItem( tr("Small Form Variants")); + usedCharClasses.insert(counter, 17); + counter++; + } + if (charactersAlphabeticPresentationForms.count() != 0) + { + rangeSelector->addItem( tr("Ligatures")); + usedCharClasses.insert(counter, 18); + counter++; + } + if (charactersSpecial.count() != 0) + { + rangeSelector->addItem( tr("Specials")); + usedCharClasses.insert(counter, 19); + counter++; + } + if (charactersGreek.count() != 0) + { + rangeSelector->addItem( tr("Greek")); + usedCharClasses.insert(counter, 20); + counter++; + } + if (charactersGreekExtended.count() != 0) + { + rangeSelector->addItem( tr("Greek Extended")); + usedCharClasses.insert(counter, 21); + counter++; + } + if (charactersCyrillic.count() != 0) + { + rangeSelector->addItem( tr("Cyrillic")); + usedCharClasses.insert(counter, 22); + counter++; + } + if (charactersCyrillicSupplement.count() != 0) + { + rangeSelector->addItem( tr("Cyrillic Supplement")); + usedCharClasses.insert(counter, 23); + counter++; + } + if (charactersArabic.count() != 0) + { + rangeSelector->addItem( tr("Arabic")); + usedCharClasses.insert(counter, 24); + counter++; + } + if (charactersArabicPresentationFormsA.count() != 0) + { + rangeSelector->addItem( tr("Arabic Extended A")); + usedCharClasses.insert(counter, 25); + counter++; + } + if (charactersArabicPresentationFormsB.count() != 0) + { + rangeSelector->addItem( tr("Arabic Extended B")); + usedCharClasses.insert(counter, 26); + counter++; + } + if (charactersHebrew.count() != 0) + { + rangeSelector->addItem( tr("Hebrew")); + usedCharClasses.insert(counter, 27); + counter++; + } + rangeSelector->setCurrentIndex(0); + connect(rangeSelector, SIGNAL(activated(int)), this, SLOT(newCharClass(int))); +// tDebug("setupRangeCombo end"); +} + +void CharSelectEnhanced::generatePreview(int charClass) +{ +// tDebug("generatePreview start"); + characters.clear(); + if (charClass>=0 && charClass<allClasses.count()) + characters = allClasses[charClass]; + m_charTableModel->setCharacters(characters); +// tDebug("generatePreview end"); +} + +void CharSelectEnhanced::newCharClass(int c) +{ +// tDebug("newCharClass start"); + m_characterClass = usedCharClasses[c]; + generatePreview(m_characterClass); +// tDebug("newCharClass end"); +} + +void CharSelectEnhanced::newFont(int font) +{ +// tDebug("newFont start"); + QString oldFont(m_fontInUse); + m_fontInUse = fontSelector->itemText(font); + if (!m_fontInUse.isEmpty()) + { + m_charTableModel->setFontInUse(m_fontInUse); + (*m_doc->AllFonts)[m_fontInUse].increaseUsage(); + if (!oldFont.isEmpty()) + (*m_doc->AllFonts)[oldFont].decreaseUsage(); + delEdit(); + scanFont(); + generatePreview(0); + m_characterClass = 0; + setupRangeCombo(); + } +// tDebug("newFont end"); +} + +void CharSelectEnhanced::newChar(uint i) +{ + chToIns += QChar(i); + sample->setPixmap(FontSample((*m_doc->AllFonts)[m_fontInUse], 28, chToIns, palette().color(QPalette::Window), true)); + insertButton->setEnabled(true); +} + +void CharSelectEnhanced::delChar() +{ + if (chToIns.length() == 0) + return; + if (chToIns.length() == 1) + { + delEdit(); + return; + } + chToIns.truncate(chToIns.length() - 1); + sample->setPixmap(FontSample((*m_doc->AllFonts)[m_fontInUse], 28, chToIns, palette().color(QPalette::Window), true)); + insertButton->setEnabled(chToIns.length() > 0); +} + +void CharSelectEnhanced::delEdit() +{ + chToIns = ""; + QPixmap pm(1,28); + pm.fill(palette().color(QPalette::Window)); + sample->setPixmap(pm); + insertButton->setEnabled(false); +} + +void CharSelectEnhanced::insChar() +{ + // #7810 : won't work as insertButton->hasFocus() + // always return false on OSX + /*if (!insertButton->hasFocus()) + return;*/ + emit insertSpecialChars(chToIns); + delEdit(); +} + +void CharSelectEnhanced::hexLineEdit_returnPressed() +{ + QString tx("0x%1");; + bool ok = false; + uint code = tx.arg(hexLineEdit->text()).toUInt(&ok, 16); + if ((ok) && (code > 31)) + newChar(code); +} + +void CharSelectEnhanced::changeEvent(QEvent *e) +{ + if (e->type() == QEvent::LanguageChange) + { + Ui::CharSelectEnhanced::retranslateUi(this); + int i=rangeSelector->currentIndex(); + setupRangeCombo(); + disconnect(rangeSelector, SIGNAL(activated(int)), this, SLOT(newCharClass(int))); + rangeSelector->setCurrentIndex(i); + connect(rangeSelector, SIGNAL(activated(int)), this, SLOT(newCharClass(int))); + } + else + QWidget::changeEvent(e); +} |
