Author: jghali
Date: Tue Mar 12 10:49:42 2019
New Revision: 22886

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=22886
Log:
#15550: Add a tab to Preferences > Fonts with the rejected fonts

Modified:
    trunk/Scribus/scribus/scfonts.cpp
    trunk/Scribus/scribus/scfonts.h
    trunk/Scribus/scribus/ui/prefs_fonts.cpp
    trunk/Scribus/scribus/ui/prefs_fonts.h
    trunk/Scribus/scribus/ui/prefs_fontsbase.ui

Modified: trunk/Scribus/scribus/scfonts.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22886&path=/trunk/Scribus/scribus/scfonts.cpp
==============================================================================
--- trunk/Scribus/scribus/scfonts.cpp   (original)
+++ trunk/Scribus/scribus/scfonts.cpp   Tue Mar 12 10:49:42 2019
@@ -660,6 +660,7 @@
                if (face != nullptr)
                        FT_Done_Face(face);
                checkedFonts.insert(filename, foCache);
+               addRejectedFont(filename, QObject::tr("Font is broken: 
\"%1\"").arg(getFtError(error)));
                if (showFontInformation)
                        sDebug(QObject::tr("Font %1 is broken, discarding it. 
Error message: \"%2\"").arg(filename, getFtError(error)));
                return true;
@@ -667,6 +668,7 @@
        getFontFormat(face, format, type);
        if (format == ScFace::UNKNOWN_FORMAT) 
        {
+               addRejectedFont(filename, QObject::tr("Failed to load font: 
font type unknown"));
                if (showFontInformation)
                        sDebug(QObject::tr("Failed to load font %1 - font type 
unknown").arg(filename));
                FT_Done_Face(face);
@@ -677,6 +679,7 @@
        // and do not provide a valid value for units_per_EM
        if (face->units_per_EM == 0)
        {
+               addRejectedFont(filename, QObject::tr("Failed to load font: 
font is not scalable"));
                if (showFontInformation)
                        sDebug(QObject::tr("Failed to load font %1 - font is 
not scalable").arg(filename));
                FT_Done_Face(face);
@@ -696,12 +699,14 @@
                        error = FT_Load_Glyph(face, gindex, FT_LOAD_NO_SCALE | 
FT_LOAD_NO_BITMAP);
                        if (error)
                        {
-                               if (showFontInformation)
-                                       sDebug(QObject::tr("Font %1 has broken 
glyph %2 (charcode U+%3). Error message: \"%4\"")
+                               auto errorMessage = QObject::tr("Font %1 has 
broken glyph %2 (charcode U+%3). Error message: \"%4\"")
                                                           .arg(filename)
                                                           .arg(gindex)
                                                           .arg(charcode, 4, 
16, QChar('0'))
-                                                          
.arg(getFtError(error)));
+                                                          
.arg(getFtError(error));
+                               addRejectedFont(filename, errorMessage);
+                               if (showFontInformation)
+                                       sDebug(errorMessage);
                                FT_Done_Face(face);
                                checkedFonts.insert(filename, foCache);
                                return true;
@@ -737,12 +742,14 @@
                                error = FT_Load_Glyph(face, gindex, 
FT_LOAD_NO_SCALE | FT_LOAD_NO_BITMAP);
                                if (error)
                                {
-                                       if (showFontInformation)
-                                               sDebug(QObject::tr("Font %1 has 
broken glyph %2 (charcode U+%3). Error message: \"%4\"")
+                                       auto errorMessage = QObject::tr("Font 
%1 has broken glyph %2 (charcode U+%3). Error message: \"%4\"")
                                                                   
.arg(filename)
                                                                   .arg(gindex)
                                                                   
.arg(charcode, 4, 16, QChar('0'))
-                                                                  
.arg(getFtError(error)));
+                                                                  
.arg(getFtError(error));
+                                       addRejectedFont(filename, errorMessage);
+                                       if (showFontInformation)
+                                               sDebug(errorMessage);
                                        FT_Done_Face(face);
                                        checkedFonts.insert(filename, foCache);
                                        return true;
@@ -1021,7 +1028,11 @@
                }
                else
                        if (showFontInformation)
-                               sDebug(QObject::tr("Failed to load a font - 
freetype2 couldn't find the font file"));
+                       {
+                               auto errorMessage = QObject::tr("Failed to load 
a font - freetype2 couldn't find the font file");
+                               addRejectedFont(QString((char*)file), 
errorMessage);
+                               sDebug(errorMessage);
+                       }
        }
        FT_Done_FreeType(library);
        FcFontSetDestroy(fs);
@@ -1221,3 +1232,8 @@
        updateFontMap();
        WriteCacheList(pf);
 }
+
+void SCFonts::addRejectedFont(QString fontPath, QString message)
+{
+       rejectedFonts.insert(fontPath, message);
+}

Modified: trunk/Scribus/scribus/scfonts.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22886&path=/trunk/Scribus/scribus/scfonts.h
==============================================================================
--- trunk/Scribus/scribus/scfonts.h     (original)
+++ trunk/Scribus/scribus/scfonts.h     Tue Mar 12 10:49:42 2019
@@ -12,6 +12,8 @@
 #include <QFont>
 #include <QList>
 #include <QMap>
+#include <QVector>
+#include <QPair>
 #include <QString>
 #include <QStringList>
 
@@ -38,6 +40,7 @@
        public:
                SCFonts();
                ~SCFonts();
+
                void updateFontMap();
                void GetFonts(const QString& pf, bool showFontInfo=false);
                ScFace LoadScalableFont(const QString &filename);
@@ -54,6 +57,8 @@
                void WriteCacheList();
                /// maps family name to face variants
                QMap<QString, QStringList> fontMap;
+               QMap<QString, QString>     rejectedFonts;
+
        private:
                void ReadCacheList(const QString& pf);
                void WriteCacheList(const QString& pf);
@@ -77,6 +82,7 @@
                        QDateTime lastMod;
                };
                QMap<QString, testCache> checkedFonts;
+               void addRejectedFont(QString fontPath, QString message);
        protected:
                bool showFontInformation;
 };

Modified: trunk/Scribus/scribus/ui/prefs_fonts.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22886&path=/trunk/Scribus/scribus/ui/prefs_fonts.cpp
==============================================================================
--- trunk/Scribus/scribus/ui/prefs_fonts.cpp    (original)
+++ trunk/Scribus/scribus/ui/prefs_fonts.cpp    Tue Mar 12 10:49:42 2019
@@ -1,403 +1,433 @@
-/*
-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 "ui/prefs_fonts.h"
-#include "prefsstructs.h"
-
-
-#include <QListWidget>
-#include <QListWidgetItem>
-#include <QTreeWidget>
-#include <QTreeWidgetItem>
-#include <QTableWidget>
-#include <QHeaderView>
-#include <QLabel>
-#include <QDir>
-#include <QFileDialog>
-#include <QFileInfo>
-#include <QFile>
-#include <QSpacerItem>
-#include <QPixmap>
-
-#include "prefscontext.h"
-#include "prefsfile.h"
-#include "sccombobox.h"
-#include "scribuscore.h"
-#include "scribusdoc.h"
-#include "prefsmanager.h"
-#include "scconfig.h"
-#include "util.h"
-#include "util_color.h"
-#include "scpaths.h"
-#include "fontlistmodel.h"
-#include "fontlistview.h"
-
-Prefs_Fonts::Prefs_Fonts(QWidget* parent, ScribusDoc* doc)
-       : Prefs_Pane(parent),
-       m_doc(doc)
-{
-       setupUi(this);
-
-       RList = PrefsManager::instance()->appPrefs.fontPrefs.GFontSub;
-       UsedFonts.clear();
-       CurrentPath = "";
-       m_askBeforeSubstitute = true;
-
-       setMinimumSize(fontMetrics().width( tr( "Available Fonts" )+ tr( "Font 
Substitutions" )+ tr( "Additional Paths" ))+180, 200);
-
-       fontListTableView->setModel(new FontListModel(fontListTableView, m_doc, 
true));
-
-       fontSubstitutionsTableWidget->setRowCount(RList.count());
-       fontSubstitutionsTableWidget->setColumnCount(2);
-       fontSubstitutionsTableWidget->setHorizontalHeaderItem(0, new 
QTableWidgetItem( tr("Font Name")));
-       fontSubstitutionsTableWidget->setHorizontalHeaderItem(1, new 
QTableWidgetItem( tr("Replacement")));
-       fontSubstitutionsTableWidget->setSortingEnabled(false);
-       fontSubstitutionsTableWidget->setSelectionBehavior( 
QAbstractItemView::SelectRows );
-       QHeaderView *header = fontSubstitutionsTableWidget->horizontalHeader();
-       header->setSectionsMovable(false);
-       header->setSectionsClickable(false);
-       header->setSectionResizeMode(QHeaderView::Stretch);
-       fontSubstitutionsTableWidget->verticalHeader()->hide();
-       
fontSubstitutionsTableWidget->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, 
QSizePolicy::Expanding));
-
-
-       // If we're being called for global application preferences, not 
document
-       // preferences, we let the user customize font search paths. Because 
things
-       // go rather badly if paths are changed/removed while a doc is open, the
-       // control is also not displayed if there is a document open.
-       if (m_doc==nullptr && !ScCore->primaryMainWindow()->HaveDoc)
-       {
-               whyBlankLabel->resize(0,0);
-               whyBlankLabel->hide();
-               readPaths();
-               changeButton->setEnabled(false);
-               removeButton->setEnabled(false);
-               connect(pathListWidget, SIGNAL(itemClicked(QListWidgetItem*)), 
this, SLOT(SelectPath(QListWidgetItem*)));
-               connect(addButton, SIGNAL(clicked()), this, SLOT(AddPath()));
-               connect(changeButton, SIGNAL(clicked()), this, 
SLOT(ChangePath()));
-               connect(removeButton, SIGNAL(clicked()), this, SLOT(DelPath()));
-       }
-       else
-       {
-               pathListWidget->resize(0,0);
-               changeButton->resize(0,0);
-               addButton->resize(0,0);
-               removeButton->resize(0,0);
-               pathListWidget->hide();
-               changeButton->hide();
-               addButton->hide();
-               removeButton->hide();
-
-               // Rather than just making the tab vanish when editing 
doc-specific settings
-               // (we don't support per-doc font paths), show a useful 
explanation.
-               whyBlankLabel->setText("<qt>" +
-                               tr("Font search paths can only be set in File > 
Preferences, and only when "
-                                  "there is no document currently open. Close 
any open documents, then "
-                                  "use File > Preferences > Fonts to change 
the font search path.") + "</qt>");
-               additionalPathsButtonsVerticalSpacer->changeSize(0,0);
-               //additionalPathsButtonsVerticalSpacer->invalidate();
-               
additionalPathsLabelVerticalSpacer->changeSize(0,0,QSizePolicy::Expanding, 
QSizePolicy::Expanding);
-               additionalPathsLabelVerticalSpacer->invalidate();
-       }
-
-       // signals and slots connections
-       connect(fontSubstitutionsTableWidget, SIGNAL(itemSelectionChanged()), 
this, SLOT(ReplaceSel()));
-       connect(deleteSubstitutionButton, SIGNAL(clicked()), this, 
SLOT(DelEntry()));
-
-
-
-       //fontListTableView
-//fontSubstitutionsTableWidget
-}
-
-Prefs_Fonts::~Prefs_Fonts()
-{
-}
-
-void Prefs_Fonts::languageChange()
-{
-}
-
-void Prefs_Fonts::restoreDefaults(struct ApplicationPrefs *prefsData)
-{
-       //      SCFonts* 
availFonts=&(PrefsManager::instance()->appPrefs.AvailFonts);
-       m_availFonts = prefsData->fontPrefs.AvailFonts;
-       fontListTableView->setFonts(m_availFonts);
-       /*
-       DON'T REMOVE THIS COMMENTS, PLEASE! (Petr)
-       It's just a performance vs. functionality test.
-       availFonts->clear();
-       // FIXME: This is main preformance issue. It's about 90% of all 
preference reads! - PV
-       availFonts->GetFonts(HomeP); */
-       /* Are you wondering why this condition? See the comment at
-       line #102 (or somewhere near) as reference. Hint: PathList
-       is not initialized for example... - PV */
-/*     if (!DocAvail && !ScCore->primaryMainWindow()->HaveDoc)
-       {
-               for (uint a = 0; a < PathList->count(); ++a)
-               {
-                       QString dir = 
ScPaths::separatorsToSlashes(PathList->text(a));
-                       availFonts->AddScalableFonts(dir +"/"); //, 
docc->DocName);
-                       availFonts->updateFontMap();
-               }
-       } */
-//     UsedFonts.clear();
-//     fontFlags.clear();
-//     fontList->clear();
-//     SCFontsIterator it(*availFonts);
-//     for ( ; it.hasNext(); it.next())
-//     {
-//             if (it.current().isNone())
-//                     continue;
-//             fontSet foS;
-//             QTreeWidgetItem *row = new QTreeWidgetItem(fontList);
-//             row->setText(0, it.currentKey());
-
-//             foS.FlagUse = it.current().usable();
-//             row->setIcon(1, foS.FlagUse ? checkOn : checkOff);
-//             if (foS.FlagUse)
-//                     UsedFonts.append(it.currentKey());
-
-//             foS.FlagPS = it.current().embedPs();
-//             row->setIcon(2, foS.FlagPS ? checkOn : checkOff);
-
-//             foS.FlagSub = it.current().subset();
-//             row->setIcon(3, foS.FlagSub ? checkOn : checkOff);
-
-//             ScFace::FontType type = it.current().type();
-//             foS.FlagOTF = (type == ScFace::OTF) ? true : false;
-//             if (it.current().isReplacement())
-//                     row->setIcon(0, substFont);
-//             else if (type == ScFace::TYPE1)
-//                     row->setIcon(0, psFont);
-//             else if (type == ScFace::TTF)
-//                     row->setIcon(0, ttfFont);
-//             else if (type == ScFace::OTF)
-//                     row->setIcon(0, otfFont);
-
-//             foS.FlagNames = it.current().hasNames();
-//             row->setText(4, it.current().fontPath());
-//             fontFlags.insert(it.currentKey(), foS);
-//     }
-//     fontList->sortByColumn(0, Qt::AscendingOrder);
-//     fontList->resizeColumnToContents(0);
-//     fontList->resizeColumnToContents(4);
-//     UsedFonts.sort();
-       FlagsRepl.clear();
-       fontSubstitutionsTableWidget->clearContents();
-       m_GFontSub=prefsData->fontPrefs.GFontSub;
-       int a = 0;
-       QMap<QString,QString>::Iterator itfsu;
-       for (itfsu = RList.begin(); itfsu != RList.end(); ++itfsu)
-       {
-               QTableWidgetItem* tWidgetItem = new 
QTableWidgetItem(itfsu.key());
-               tWidgetItem->setFlags(tWidgetItem->flags() & 
~Qt::ItemIsEditable);
-               fontSubstitutionsTableWidget->setItem(a, 0, tWidgetItem);
-               ScComboBox *item = new ScComboBox(fontSubstitutionsTableWidget);
-               fontSubstitutionsTableWidget->setCellWidget(a, 1, item);
-               item->setEditable(false);
-               item->addItem(itfsu.value());
-               setCurrentComboItem(item, itfsu.value());
-               FlagsRepl.append(item);
-               a++;
-       }
-       deleteSubstitutionButton->setEnabled(false);
-       updateFontList();
-}
-
-void Prefs_Fonts::saveGuiToPrefs(struct ApplicationPrefs *prefsData) const
-{
-       int fontCount = fontListTableView->model()->rowCount();
-       for (int i = 0; i < fontCount; ++i)
-       {
-               QString fontName = fontListTableView->fontName(i);
-               ScFace face = m_availFonts[fontName];
-
-               face.usable(fontListTableView->isFontUsable(i));
-               face.subset(fontListTableView->isFontSubsetted(i));
-       }
-
-       if (m_doc==nullptr)
-               writePaths();
-
-       prefsData->fontPrefs.GFontSub.clear();
-       uint a = 0;
-       for (QMap<QString,QString>::ConstIterator itfsu = RList.begin(); itfsu 
!= RList.end(); ++itfsu)
-               prefsData->fontPrefs.GFontSub[itfsu.key()] = 
FlagsRepl.at(a++)->currentText();
-}
-
-void Prefs_Fonts::changeUnit(ApplicationPrefs *prefsData) const
-{
-       //Blank, no units on this tab, yet
-}
-
-void Prefs_Fonts::ReplaceSel()
-{
-       int selCount = fontSubstitutionsTableWidget->selectedItems().count();
-       deleteSubstitutionButton->setEnabled(selCount > 0);
-}
-
-void Prefs_Fonts::updateFontList()
-{
-       UsedFonts.clear();
-       SCFontsIterator it(m_availFonts);
-       for ( ; it.hasNext() ; it.next())
-       {
-               if (m_availFonts[it.currentKey()].usable())
-                       UsedFonts.append(it.currentKey());
-       }
-       UsedFonts.sort();
-       QString tmp;
-       for (int b = 0; b < FlagsRepl.count(); ++b)
-       {
-               tmp = FlagsRepl.at(b)->currentText();
-               FlagsRepl.at(b)->clear();
-               FlagsRepl.at(b)->addItems(UsedFonts);
-               if (UsedFonts.contains(tmp) != 0)
-                       setCurrentComboItem(FlagsRepl.at(b), tmp);
-               else
-                       FlagsRepl.at(b)->setCurrentIndex(0);
-       }
-}
-
-void Prefs_Fonts::DelEntry()
-{
-       // This works a because selection mode is "Full rows"
-       QList<QTableWidgetItem*> selItems = 
fontSubstitutionsTableWidget->selectedItems();
-       for (int i = 0; i < selItems.count(); ++i)
-       {
-               QTableWidgetItem* item = selItems.at(i);
-               int r = item->row();
-               QString tmp = fontSubstitutionsTableWidget->item(r, 0)->text();
-               fontSubstitutionsTableWidget->removeRow(r);
-               delete FlagsRepl.takeAt(r);
-               RList.remove(tmp);
-       }
-       deleteSubstitutionButton->setEnabled(false);
-}
-
-void Prefs_Fonts::readPaths()
-{
-       Q_ASSERT(m_doc==nullptr); // should never be called in doc-specific 
prefs
-       PrefsContext *fontPrefsContext = 
PrefsManager::instance()->prefsFile->getContext("Fonts");
-       PrefsTable *fontPathTable = fontPrefsContext->getTable("ExtraFontDirs");
-       pathListWidget->clear();
-       for (int i = 0; i < fontPathTable->getRowCount(); ++i)
-               pathListWidget->addItem( 
QDir::toNativeSeparators(fontPathTable->get(i,0)) );
-}
-
-void Prefs_Fonts::writePaths() const
-{
-       Q_ASSERT(m_doc==nullptr); // should never be called in doc-specific 
prefs
-       PrefsContext *fontPrefsContext = 
PrefsManager::instance()->prefsFile->getContext("Fonts");
-       PrefsTable *fontPathTable = fontPrefsContext->getTable("ExtraFontDirs");
-       fontPathTable->clear();
-       for (int i = 0; i < pathListWidget->count(); ++i)
-               fontPathTable->set(i, 0, 
QDir::fromNativeSeparators(pathListWidget->item(i)->text()));
-}
-
-void Prefs_Fonts::SelectPath(QListWidgetItem *c)
-{
-       if (m_doc==nullptr)
-       {
-               changeButton->setEnabled(true);
-               removeButton->setEnabled(true);
-       }
-       CurrentPath = c->text();
-}
-
-void Prefs_Fonts::AddPath()
-{
-       Q_ASSERT(m_doc==nullptr); // should never be called in doc-specific 
prefs
-       PrefsContext* dirs = 
PrefsManager::instance()->prefsFile->getContext("dirs");
-       CurrentPath = dirs->get("fontprefs", ".");
-       QString s = QFileDialog::getExistingDirectory(this, tr("Choose a 
Directory"), CurrentPath);
-       if (s.isEmpty())
-               return;
-
-       dirs->set("fontprefs", s.left(s.lastIndexOf("/", -2)));
-       if (s.endsWith("/"))
-               s.chop(1);
-       QString s2 = QDir::toNativeSeparators(s);
-       if (pathListWidget->findItems(s2, Qt::MatchExactly).count() != 0)
-               return;
-       pathListWidget->addItem(s2);
-       //writePaths();
-       changeButton->setEnabled(false);
-       removeButton->setEnabled(false);
-       CurrentPath = s;
-       QString dir(QDir::fromNativeSeparators(s2));
-       m_availFonts.AddScalableFonts(dir +"/");
-       m_availFonts.updateFontMap();
-       m_availFonts.WriteCacheList();
-       updateFontList();
-}
-
-void Prefs_Fonts::ChangePath()
-{
-       Q_ASSERT(m_doc==nullptr); // should never be called in doc-specific 
prefs
-       QString s = QFileDialog::getExistingDirectory(this, tr("Choose a 
Directory"), CurrentPath);
-       if (s.isEmpty())
-               return;
-
-       if (s.endsWith("/"))
-               s.chop(1);
-       QString s2 = QDir::toNativeSeparators(s);
-       if (pathListWidget->findItems(s2, Qt::MatchExactly).count() != 0)
-               return;
-       QString path = pathListWidget->currentItem()->text();
-       SCFontsIterator it(m_availFonts);
-       for ( ; it.hasNext(); it.next())
-       {
-               if (it.current().isNone())
-                       continue;
-               QFileInfo fi(it.current().fontFilePath());
-               if (fi.absolutePath() == path)
-                       m_availFonts.remove(it.currentKey());
-       }
-       pathListWidget->currentItem()->setText(s2);
-       //writePaths();
-       CurrentPath = s;
-       QString dir = QDir::fromNativeSeparators(s2);
-       m_availFonts.AddScalableFonts(dir +"/");
-       m_availFonts.updateFontMap();
-       updateFontList();
-       changeButton->setEnabled(false);
-       removeButton->setEnabled(false);
-}
-
-void Prefs_Fonts::DelPath()
-{
-       Q_ASSERT(m_doc==nullptr); // should never be called in doc-specific 
prefs
-       QFile 
fx(PrefsManager::instance()->preferencesLocation()+"/scribusfont13.rc");
-       if (!fx.open(QIODevice::WriteOnly))
-               return;
-
-       QString path = pathListWidget->currentItem()->text();
-       if (pathListWidget->count() == 1)
-               pathListWidget->clear();
-       else
-               delete pathListWidget->takeItem(pathListWidget->currentRow());
-       //writePaths();
-
-       QMutableMapIterator<QString,ScFace> it(m_availFonts);
-       while (it.hasNext())
-       {
-               it.next();
-               if (it.value().isNone())
-                       continue;
-               QFileInfo fi(it.value().fontFilePath());
-               if (fi.absolutePath() == path)
-                       m_availFonts.remove(it.key());
-       }
-       m_availFonts.updateFontMap();
-       CurrentPath = "";
-       updateFontList();
-       changeButton->setEnabled(false);
-       removeButton->setEnabled(false);
-}
-
+/*
+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 "ui/prefs_fonts.h"
+#include "prefsstructs.h"
+
+
+#include <QListWidget>
+#include <QListWidgetItem>
+#include <QTreeWidget>
+#include <QTreeWidgetItem>
+#include <QTableWidget>
+#include <QHeaderView>
+#include <QLabel>
+#include <QDir>
+#include <QFileDialog>
+#include <QFileInfo>
+#include <QFile>
+#include <QSpacerItem>
+#include <QPixmap>
+
+#include "prefscontext.h"
+#include "prefsfile.h"
+#include "sccombobox.h"
+#include "scribuscore.h"
+#include "scribusdoc.h"
+#include "prefsmanager.h"
+#include "scconfig.h"
+#include "util.h"
+#include "util_color.h"
+#include "scpaths.h"
+#include "fontlistmodel.h"
+#include "fontlistview.h"
+
+Prefs_Fonts::Prefs_Fonts(QWidget* parent, ScribusDoc* doc)
+       : Prefs_Pane(parent),
+       m_doc(doc)
+{
+       setupUi(this);
+
+       RList = PrefsManager::instance()->appPrefs.fontPrefs.GFontSub;
+       UsedFonts.clear();
+       CurrentPath = "";
+       m_askBeforeSubstitute = true;
+
+       setMinimumSize(fontMetrics().width( tr( "Available Fonts" )+ tr( "Font 
Substitutions" )+ tr( "Additional Paths" )+ tr( "Rejected Fonts" ))+180, 200);
+
+       fontListTableView->setModel(new FontListModel(fontListTableView, m_doc, 
true));
+
+       fontSubstitutionsTableWidget->setRowCount(RList.count());
+       fontSubstitutionsTableWidget->setColumnCount(2);
+       fontSubstitutionsTableWidget->setHorizontalHeaderItem(0, new 
QTableWidgetItem( tr("Font Name")));
+       fontSubstitutionsTableWidget->setHorizontalHeaderItem(1, new 
QTableWidgetItem( tr("Replacement")));
+       fontSubstitutionsTableWidget->setSortingEnabled(false);
+       fontSubstitutionsTableWidget->setSelectionBehavior( 
QAbstractItemView::SelectRows );
+       QHeaderView *header = fontSubstitutionsTableWidget->horizontalHeader();
+       header->setSectionsMovable(false);
+       header->setSectionsClickable(false);
+       header->setSectionResizeMode(QHeaderView::Stretch);
+       fontSubstitutionsTableWidget->verticalHeader()->hide();
+       
fontSubstitutionsTableWidget->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, 
QSizePolicy::Expanding));
+
+
+       // If we're being called for global application preferences, not 
document
+       // preferences, we let the user customize font search paths. Because 
things
+       // go rather badly if paths are changed/removed while a doc is open, the
+       // control is also not displayed if there is a document open.
+       if (m_doc==nullptr && !ScCore->primaryMainWindow()->HaveDoc)
+       {
+               whyBlankLabel->resize(0,0);
+               whyBlankLabel->hide();
+               readPaths();
+               changeButton->setEnabled(false);
+               removeButton->setEnabled(false);
+               connect(pathListWidget, SIGNAL(itemClicked(QListWidgetItem*)), 
this, SLOT(SelectPath(QListWidgetItem*)));
+               connect(addButton, SIGNAL(clicked()), this, SLOT(AddPath()));
+               connect(changeButton, SIGNAL(clicked()), this, 
SLOT(ChangePath()));
+               connect(removeButton, SIGNAL(clicked()), this, SLOT(DelPath()));
+       }
+       else
+       {
+               pathListWidget->resize(0,0);
+               changeButton->resize(0,0);
+               addButton->resize(0,0);
+               removeButton->resize(0,0);
+               pathListWidget->hide();
+               changeButton->hide();
+               addButton->hide();
+               removeButton->hide();
+
+               // Rather than just making the tab vanish when editing 
doc-specific settings
+               // (we don't support per-doc font paths), show a useful 
explanation.
+               whyBlankLabel->setText("<qt>" +
+                               tr("Font search paths can only be set in File > 
Preferences, and only when "
+                                  "there is no document currently open. Close 
any open documents, then "
+                                  "use File > Preferences > Fonts to change 
the font search path.") + "</qt>");
+               additionalPathsButtonsVerticalSpacer->changeSize(0,0);
+               //additionalPathsButtonsVerticalSpacer->invalidate();
+               
additionalPathsLabelVerticalSpacer->changeSize(0,0,QSizePolicy::Expanding, 
QSizePolicy::Expanding);
+               additionalPathsLabelVerticalSpacer->invalidate();
+       }
+
+       // signals and slots connections
+       connect(fontSubstitutionsTableWidget, SIGNAL(itemSelectionChanged()), 
this, SLOT(ReplaceSel()));
+       connect(deleteSubstitutionButton, SIGNAL(clicked()), this, 
SLOT(DelEntry()));
+
+
+
+       //fontListTableView
+//fontSubstitutionsTableWidget
+}
+
+Prefs_Fonts::~Prefs_Fonts()
+{
+}
+
+void Prefs_Fonts::languageChange()
+{
+}
+
+void Prefs_Fonts::restoreDefaults(struct ApplicationPrefs *prefsData)
+{
+       //      SCFonts* 
availFonts=&(PrefsManager::instance()->appPrefs.AvailFonts);
+       m_availFonts = prefsData->fontPrefs.AvailFonts;
+       fontListTableView->setFonts(m_availFonts);
+       /*
+       DON'T REMOVE THIS COMMENTS, PLEASE! (Petr)
+       It's just a performance vs. functionality test.
+       availFonts->clear();
+       // FIXME: This is main preformance issue. It's about 90% of all 
preference reads! - PV
+       availFonts->GetFonts(HomeP); */
+       /* Are you wondering why this condition? See the comment at
+       line #102 (or somewhere near) as reference. Hint: PathList
+       is not initialized for example... - PV */
+/*     if (!DocAvail && !ScCore->primaryMainWindow()->HaveDoc)
+       {
+               for (uint a = 0; a < PathList->count(); ++a)
+               {
+                       QString dir = 
ScPaths::separatorsToSlashes(PathList->text(a));
+                       availFonts->AddScalableFonts(dir +"/"); //, 
docc->DocName);
+                       availFonts->updateFontMap();
+               }
+       } */
+//     UsedFonts.clear();
+//     fontFlags.clear();
+//     fontList->clear();
+//     SCFontsIterator it(*availFonts);
+//     for ( ; it.hasNext(); it.next())
+//     {
+//             if (it.current().isNone())
+//                     continue;
+//             fontSet foS;
+//             QTreeWidgetItem *row = new QTreeWidgetItem(fontList);
+//             row->setText(0, it.currentKey());
+
+//             foS.FlagUse = it.current().usable();
+//             row->setIcon(1, foS.FlagUse ? checkOn : checkOff);
+//             if (foS.FlagUse)
+//                     UsedFonts.append(it.currentKey());
+
+//             foS.FlagPS = it.current().embedPs();
+//             row->setIcon(2, foS.FlagPS ? checkOn : checkOff);
+
+//             foS.FlagSub = it.current().subset();
+//             row->setIcon(3, foS.FlagSub ? checkOn : checkOff);
+
+//             ScFace::FontType type = it.current().type();
+//             foS.FlagOTF = (type == ScFace::OTF) ? true : false;
+//             if (it.current().isReplacement())
+//                     row->setIcon(0, substFont);
+//             else if (type == ScFace::TYPE1)
+//                     row->setIcon(0, psFont);
+//             else if (type == ScFace::TTF)
+//                     row->setIcon(0, ttfFont);
+//             else if (type == ScFace::OTF)
+//                     row->setIcon(0, otfFont);
+
+//             foS.FlagNames = it.current().hasNames();
+//             row->setText(4, it.current().fontPath());
+//             fontFlags.insert(it.currentKey(), foS);
+//     }
+//     fontList->sortByColumn(0, Qt::AscendingOrder);
+//     fontList->resizeColumnToContents(0);
+//     fontList->resizeColumnToContents(4);
+//     UsedFonts.sort();
+       FlagsRepl.clear();
+       fontSubstitutionsTableWidget->clearContents();
+       m_GFontSub = prefsData->fontPrefs.GFontSub;
+       int a = 0;
+       for (auto itfsu = RList.begin(); itfsu != RList.end(); ++itfsu)
+       {
+               QTableWidgetItem* tWidgetItem = new 
QTableWidgetItem(itfsu.key());
+               tWidgetItem->setFlags(tWidgetItem->flags() & 
~Qt::ItemIsEditable);
+               fontSubstitutionsTableWidget->setItem(a, 0, tWidgetItem);
+               ScComboBox *item = new ScComboBox(fontSubstitutionsTableWidget);
+               fontSubstitutionsTableWidget->setCellWidget(a, 1, item);
+               item->setEditable(false);
+               item->addItem(itfsu.value());
+               setCurrentComboItem(item, itfsu.value());
+               FlagsRepl.append(item);
+               a++;
+       }
+       deleteSubstitutionButton->setEnabled(false);
+
+       
fontsRejectedTableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
+       auto headerView = fontsRejectedTableWidget->horizontalHeader();
+       headerView->resizeSection(0, 150);
+       headerView->resizeSection(1, 250);
+       headerView->setStretchLastSection(true);
+       
+       updateFontList();
+       updateRejectedFontList();
+}
+
+void Prefs_Fonts::saveGuiToPrefs(struct ApplicationPrefs *prefsData) const
+{
+       int fontCount = fontListTableView->model()->rowCount();
+       for (int i = 0; i < fontCount; ++i)
+       {
+               QString fontName = fontListTableView->fontName(i);
+               ScFace face = m_availFonts[fontName];
+
+               face.usable(fontListTableView->isFontUsable(i));
+               face.subset(fontListTableView->isFontSubsetted(i));
+       }
+
+       if (m_doc==nullptr)
+               writePaths();
+
+       prefsData->fontPrefs.GFontSub.clear();
+       uint a = 0;
+       for (QMap<QString,QString>::ConstIterator itfsu = RList.begin(); itfsu 
!= RList.end(); ++itfsu)
+               prefsData->fontPrefs.GFontSub[itfsu.key()] = 
FlagsRepl.at(a++)->currentText();
+}
+
+void Prefs_Fonts::changeUnit(ApplicationPrefs *prefsData) const
+{
+       //Blank, no units on this tab, yet
+}
+
+void Prefs_Fonts::ReplaceSel()
+{
+       int selCount = fontSubstitutionsTableWidget->selectedItems().count();
+       deleteSubstitutionButton->setEnabled(selCount > 0);
+}
+
+void Prefs_Fonts::updateFontList()
+{
+       UsedFonts.clear();
+       SCFontsIterator it(m_availFonts);
+       for ( ; it.hasNext() ; it.next())
+       {
+               if (m_availFonts[it.currentKey()].usable())
+                       UsedFonts.append(it.currentKey());
+       }
+       UsedFonts.sort();
+       QString tmp;
+       for (int b = 0; b < FlagsRepl.count(); ++b)
+       {
+               tmp = FlagsRepl.at(b)->currentText();
+               FlagsRepl.at(b)->clear();
+               FlagsRepl.at(b)->addItems(UsedFonts);
+               if (UsedFonts.contains(tmp) != 0)
+                       setCurrentComboItem(FlagsRepl.at(b), tmp);
+               else
+                       FlagsRepl.at(b)->setCurrentIndex(0);
+       }
+}
+
+void Prefs_Fonts::updateRejectedFontList()
+{
+       const auto& rejectedFonts = m_availFonts.rejectedFonts;
+
+       fontsRejectedTableWidget->clearContents();
+       
+       int i = 0;
+       for (auto it = rejectedFonts.cbegin(); it != rejectedFonts.cend(); ++it)
+       {
+               const auto& key = it.key();
+               const auto& value = it.value();
+               const auto  baseName = QFileInfo(key).baseName();
+
+               fontsRejectedTableWidget->insertRow(i);
+               fontsRejectedTableWidget->setItem(i, 0, new 
QTableWidgetItem(baseName));
+               fontsRejectedTableWidget->setItem(i, 1, new 
QTableWidgetItem(value));
+               fontsRejectedTableWidget->setItem(i, 2, new 
QTableWidgetItem(key));
+       }
+}
+
+void Prefs_Fonts::DelEntry()
+{
+       // This works a because selection mode is "Full rows"
+       QList<QTableWidgetItem*> selItems = 
fontSubstitutionsTableWidget->selectedItems();
+       for (int i = 0; i < selItems.count(); ++i)
+       {
+               QTableWidgetItem* item = selItems.at(i);
+               int r = item->row();
+               QString tmp = fontSubstitutionsTableWidget->item(r, 0)->text();
+               fontSubstitutionsTableWidget->removeRow(r);
+               delete FlagsRepl.takeAt(r);
+               RList.remove(tmp);
+       }
+       deleteSubstitutionButton->setEnabled(false);
+}
+
+void Prefs_Fonts::readPaths()
+{
+       Q_ASSERT(m_doc==nullptr); // should never be called in doc-specific 
prefs
+       PrefsContext *fontPrefsContext = 
PrefsManager::instance()->prefsFile->getContext("Fonts");
+       PrefsTable *fontPathTable = fontPrefsContext->getTable("ExtraFontDirs");
+       pathListWidget->clear();
+       for (int i = 0; i < fontPathTable->getRowCount(); ++i)
+               pathListWidget->addItem( 
QDir::toNativeSeparators(fontPathTable->get(i,0)) );
+}
+
+void Prefs_Fonts::writePaths() const
+{
+       Q_ASSERT(m_doc==nullptr); // should never be called in doc-specific 
prefs
+       PrefsContext *fontPrefsContext = 
PrefsManager::instance()->prefsFile->getContext("Fonts");
+       PrefsTable *fontPathTable = fontPrefsContext->getTable("ExtraFontDirs");
+       fontPathTable->clear();
+       for (int i = 0; i < pathListWidget->count(); ++i)
+               fontPathTable->set(i, 0, 
QDir::fromNativeSeparators(pathListWidget->item(i)->text()));
+}
+
+void Prefs_Fonts::SelectPath(QListWidgetItem *c)
+{
+       if (m_doc==nullptr)
+       {
+               changeButton->setEnabled(true);
+               removeButton->setEnabled(true);
+       }
+       CurrentPath = c->text();
+}
+
+void Prefs_Fonts::AddPath()
+{
+       Q_ASSERT(m_doc==nullptr); // should never be called in doc-specific 
prefs
+       PrefsContext* dirs = 
PrefsManager::instance()->prefsFile->getContext("dirs");
+       CurrentPath = dirs->get("fontprefs", ".");
+       QString s = QFileDialog::getExistingDirectory(this, tr("Choose a 
Directory"), CurrentPath);
+       if (s.isEmpty())
+               return;
+
+       dirs->set("fontprefs", s.left(s.lastIndexOf("/", -2)));
+       if (s.endsWith("/"))
+               s.chop(1);
+       QString s2 = QDir::toNativeSeparators(s);
+       if (pathListWidget->findItems(s2, Qt::MatchExactly).count() != 0)
+               return;
+       pathListWidget->addItem(s2);
+       //writePaths();
+       changeButton->setEnabled(false);
+       removeButton->setEnabled(false);
+       CurrentPath = s;
+       QString dir(QDir::fromNativeSeparators(s2));
+       m_availFonts.AddScalableFonts(dir +"/");
+       m_availFonts.updateFontMap();
+       m_availFonts.WriteCacheList();
+
+       updateFontList();
+       updateRejectedFontList();
+}
+
+void Prefs_Fonts::ChangePath()
+{
+       Q_ASSERT(m_doc==nullptr); // should never be called in doc-specific 
prefs
+       QString s = QFileDialog::getExistingDirectory(this, tr("Choose a 
Directory"), CurrentPath);
+       if (s.isEmpty())
+               return;
+
+       if (s.endsWith("/"))
+               s.chop(1);
+       QString s2 = QDir::toNativeSeparators(s);
+       if (pathListWidget->findItems(s2, Qt::MatchExactly).count() != 0)
+               return;
+       QString path = pathListWidget->currentItem()->text();
+       SCFontsIterator it(m_availFonts);
+       for ( ; it.hasNext(); it.next())
+       {
+               if (it.current().isNone())
+                       continue;
+               QFileInfo fi(it.current().fontFilePath());
+               if (fi.absolutePath() == path)
+                       m_availFonts.remove(it.currentKey());
+       }
+       pathListWidget->currentItem()->setText(s2);
+       //writePaths();
+       CurrentPath = s;
+       QString dir = QDir::fromNativeSeparators(s2);
+       m_availFonts.AddScalableFonts(dir +"/");
+       m_availFonts.updateFontMap();
+       updateFontList();
+       updateRejectedFontList();
+       changeButton->setEnabled(false);
+       removeButton->setEnabled(false);
+}
+
+void Prefs_Fonts::DelPath()
+{
+       Q_ASSERT(m_doc==nullptr); // should never be called in doc-specific 
prefs
+       QFile 
fx(PrefsManager::instance()->preferencesLocation()+"/scribusfont13.rc");
+       if (!fx.open(QIODevice::WriteOnly))
+               return;
+
+       QString path = pathListWidget->currentItem()->text();
+       if (pathListWidget->count() == 1)
+               pathListWidget->clear();
+       else
+               delete pathListWidget->takeItem(pathListWidget->currentRow());
+       //writePaths();
+
+       QMutableMapIterator<QString,ScFace> it(m_availFonts);
+       while (it.hasNext())
+       {
+               it.next();
+               if (it.value().isNone())
+                       continue;
+               QFileInfo fi(it.value().fontFilePath());
+               if (fi.absolutePath() == path)
+                       m_availFonts.remove(it.key());
+       }
+       m_availFonts.updateFontMap();
+       CurrentPath = "";
+       updateFontList();
+       changeButton->setEnabled(false);
+       removeButton->setEnabled(false);
+}
+

Modified: trunk/Scribus/scribus/ui/prefs_fonts.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22886&path=/trunk/Scribus/scribus/ui/prefs_fonts.h
==============================================================================
--- trunk/Scribus/scribus/ui/prefs_fonts.h      (original)
+++ trunk/Scribus/scribus/ui/prefs_fonts.h      Tue Mar 12 10:49:42 2019
@@ -25,6 +25,7 @@
        public:
                Prefs_Fonts(QWidget* parent, ScribusDoc* doc=nullptr);
                ~Prefs_Fonts();
+
                virtual void restoreDefaults(struct ApplicationPrefs 
*prefsData);
                virtual void saveGuiToPrefs(struct ApplicationPrefs *prefsData) 
const;
                virtual void changeUnit(struct ApplicationPrefs *prefsData) 
const;
@@ -32,7 +33,6 @@
        public slots:
                void languageChange();
                void ReplaceSel();
-               void updateFontList();
                void DelEntry();
                void SelectPath(QListWidgetItem *c);
                void AddPath();
@@ -42,6 +42,9 @@
        protected:
                void readPaths();
                void writePaths() const;
+
+               void updateFontList();
+               void updateRejectedFontList();
 
                QMap<QString,QString> RList;
                QList<ScComboBox*> FlagsRepl;

Modified: trunk/Scribus/scribus/ui/prefs_fontsbase.ui
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22886&path=/trunk/Scribus/scribus/ui/prefs_fontsbase.ui
==============================================================================
--- trunk/Scribus/scribus/ui/prefs_fontsbase.ui (original)
+++ trunk/Scribus/scribus/ui/prefs_fontsbase.ui Tue Mar 12 10:49:42 2019
@@ -1,202 +1,231 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Prefs_Fonts</class>
- <widget class="QWidget" name="Prefs_Fonts">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>509</width>
-    <height>426</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string notr="true">Form</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <widget class="QLabel" name="label">
-     <property name="font">
-      <font>
-       <pointsize>14</pointsize>
-       <weight>75</weight>
-       <bold>true</bold>
-      </font>
-     </property>
-     <property name="text">
-      <string>Fonts</string>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="Line" name="line">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QTabWidget" name="tabWidget">
-     <property name="currentIndex">
-      <number>0</number>
-     </property>
-     <widget class="QWidget" name="availableFontsTab">
-      <attribute name="title">
-       <string>Available Fonts</string>
-      </attribute>
-      <layout class="QVBoxLayout" name="verticalLayout_2">
-       <property name="leftMargin">
-        <number>10</number>
-       </property>
-       <property name="topMargin">
-        <number>6</number>
-       </property>
-       <property name="rightMargin">
-        <number>10</number>
-       </property>
-       <property name="bottomMargin">
-        <number>10</number>
-       </property>
-       <item>
-        <widget class="FontListView" name="fontListTableView"/>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="fontSubstitutionsTab">
-      <attribute name="title">
-       <string>Font Substitutions</string>
-      </attribute>
-      <layout class="QVBoxLayout" name="verticalLayout_3">
-       <property name="leftMargin">
-        <number>10</number>
-       </property>
-       <property name="topMargin">
-        <number>6</number>
-       </property>
-       <property name="rightMargin">
-        <number>10</number>
-       </property>
-       <property name="bottomMargin">
-        <number>10</number>
-       </property>
-       <item>
-        <widget class="QTableWidget" name="fontSubstitutionsTableWidget"/>
-       </item>
-       <item>
-        <layout class="QHBoxLayout" name="horizontalLayout">
-         <item>
-          <spacer name="horizontalSpacer">
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="sizeHint" stdset="0">
-            <size>
-             <width>40</width>
-             <height>20</height>
-            </size>
-           </property>
-          </spacer>
-         </item>
-         <item>
-          <widget class="QPushButton" name="deleteSubstitutionButton">
-           <property name="text">
-            <string>Delete</string>
-           </property>
-          </widget>
-         </item>
-        </layout>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="additionalPathsTab">
-      <attribute name="title">
-       <string>Additional Paths</string>
-      </attribute>
-      <layout class="QVBoxLayout" name="verticalLayout_5">
-       <item>
-        <layout class="QHBoxLayout" name="horizontalLayout_2">
-         <item>
-          <widget class="QListWidget" name="pathListWidget"/>
-         </item>
-         <item>
-          <layout class="QVBoxLayout" name="verticalLayout_4">
-           <item>
-            <widget class="QPushButton" name="changeButton">
-             <property name="text">
-              <string>C&amp;hange...</string>
-             </property>
-            </widget>
-           </item>
-           <item>
-            <widget class="QPushButton" name="addButton">
-             <property name="text">
-              <string>A&amp;dd...</string>
-             </property>
-            </widget>
-           </item>
-           <item>
-            <widget class="QPushButton" name="removeButton">
-             <property name="text">
-              <string>&amp;Remove</string>
-             </property>
-            </widget>
-           </item>
-           <item>
-            <spacer name="additionalPathsButtonsVerticalSpacer">
-             <property name="orientation">
-              <enum>Qt::Vertical</enum>
-             </property>
-             <property name="sizeHint" stdset="0">
-              <size>
-               <width>20</width>
-               <height>40</height>
-              </size>
-             </property>
-            </spacer>
-           </item>
-          </layout>
-         </item>
-        </layout>
-       </item>
-       <item>
-        <widget class="QLabel" name="whyBlankLabel">
-         <property name="text">
-          <string/>
-         </property>
-         <property name="wordWrap">
-          <bool>true</bool>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <spacer name="additionalPathsLabelVerticalSpacer">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeType">
-          <enum>QSizePolicy::Minimum</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>0</width>
-           <height>0</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-      </layout>
-     </widget>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <customwidgets>
-  <customwidget>
-   <class>FontListView</class>
-   <extends>QTableView</extends>
-   <header>ui/fontlistview.h</header>
-  </customwidget>
- </customwidgets>
- <resources/>
- <connections/>
-</ui>
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Prefs_Fonts</class>
+ <widget class="QWidget" name="Prefs_Fonts">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>509</width>
+    <height>426</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string notr="true">Form</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QLabel" name="label">
+     <property name="font">
+      <font>
+       <pointsize>14</pointsize>
+       <weight>75</weight>
+       <bold>true</bold>
+      </font>
+     </property>
+     <property name="text">
+      <string>Fonts</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="Line" name="line">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QTabWidget" name="tabWidget">
+     <property name="currentIndex">
+      <number>0</number>
+     </property>
+     <widget class="QWidget" name="availableFontsTab">
+      <attribute name="title">
+       <string>Available Fonts</string>
+      </attribute>
+      <layout class="QVBoxLayout" name="verticalLayout_2">
+       <property name="leftMargin">
+        <number>10</number>
+       </property>
+       <property name="topMargin">
+        <number>6</number>
+       </property>
+       <property name="rightMargin">
+        <number>10</number>
+       </property>
+       <property name="bottomMargin">
+        <number>10</number>
+       </property>
+       <item>
+        <widget class="FontListView" name="fontListTableView"/>
+       </item>
+      </layout>
+     </widget>
+     <widget class="QWidget" name="fontSubstitutionsTab">
+      <attribute name="title">
+       <string>Font Substitutions</string>
+      </attribute>
+      <layout class="QVBoxLayout" name="verticalLayout_3">
+       <property name="leftMargin">
+        <number>10</number>
+       </property>
+       <property name="topMargin">
+        <number>6</number>
+       </property>
+       <property name="rightMargin">
+        <number>10</number>
+       </property>
+       <property name="bottomMargin">
+        <number>10</number>
+       </property>
+       <item>
+        <widget class="QTableWidget" name="fontSubstitutionsTableWidget"/>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout">
+         <item>
+          <spacer name="horizontalSpacer">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QPushButton" name="deleteSubstitutionButton">
+           <property name="text">
+            <string>Delete</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+      </layout>
+     </widget>
+     <widget class="QWidget" name="additionalPathsTab">
+      <attribute name="title">
+       <string>Additional Paths</string>
+      </attribute>
+      <layout class="QVBoxLayout" name="verticalLayout_5">
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_2">
+         <item>
+          <widget class="QListWidget" name="pathListWidget"/>
+         </item>
+         <item>
+          <layout class="QVBoxLayout" name="verticalLayout_4">
+           <item>
+            <widget class="QPushButton" name="changeButton">
+             <property name="text">
+              <string>C&amp;hange...</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QPushButton" name="addButton">
+             <property name="text">
+              <string>A&amp;dd...</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QPushButton" name="removeButton">
+             <property name="text">
+              <string>&amp;Remove</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <spacer name="additionalPathsButtonsVerticalSpacer">
+             <property name="orientation">
+              <enum>Qt::Vertical</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>20</width>
+               <height>40</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
+          </layout>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <widget class="QLabel" name="whyBlankLabel">
+         <property name="text">
+          <string/>
+         </property>
+         <property name="wordWrap">
+          <bool>true</bool>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="additionalPathsLabelVerticalSpacer">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeType">
+          <enum>QSizePolicy::Minimum</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>0</width>
+           <height>0</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </widget>
+     <widget class="QWidget" name="rejectedFontsTab">
+      <attribute name="title">
+       <string>Rejected Fonts</string>
+      </attribute>
+      <layout class="QGridLayout" name="gridLayout">
+       <item row="0" column="0">
+        <widget class="QTableWidget" name="fontsRejectedTableWidget">
+         <property name="columnCount">
+          <number>3</number>
+         </property>
+         <column>
+          <property name="text">
+           <string>Font name</string>
+          </property>
+         </column>
+         <column>
+          <property name="text">
+           <string>Error message</string>
+          </property>
+         </column>
+         <column>
+          <property name="text">
+           <string>Font file</string>
+          </property>
+         </column>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>FontListView</class>
+   <extends>QTableView</extends>
+   <header>ui/fontlistview.h</header>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>


_______________________________________________
scribus-commit mailing list
[email protected]
http://lists.scribus.net/mailman/listinfo/scribus-commit

Reply via email to