Subversion Repositories Scribus

Rev

Rev 1321 | Rev 1379 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3 paul 1
#include "fontprefs.h"
2
#include "fontprefs.moc"
3
#include <qhbox.h>
4
#include <qfile.h>
5
#include <qfileinfo.h>
6
#include <qfiledialog.h>
415 Franz 7
#include "prefscontext.h"
8
#include "prefsfile.h"
1321 fschmid 9
#include "scribusdoc.h"
33 Franz 10
 
617 cbradney 11
#ifdef _MSC_VER
12
 #if (_MSC_VER >= 1200)
13
  #include "win-config.h"
14
 #endif
128 Franz 15
#else
16
 #include "config.h"
17
#endif
18
 
3 paul 19
extern QPixmap loadIcon(QString nam);
415 Franz 20
extern PrefsFile* prefsFile;
3 paul 21
 
1321 fschmid 22
FontPrefs::FontPrefs( QWidget* parent,  SCFonts &flist, bool Hdoc, ApplicationPrefs *prefs, QString PPath, ScribusDoc* doc ) : QTabWidget( parent, "fpre" )
3 paul 23
{
245 Franz 24
        Prefs = prefs;
161 Franz 25
        RList = Prefs->GFontSub;
26
        HomeP = PPath;
27
        DocAvail = Hdoc;
28
        UsedFonts.clear();
245 Franz 29
        CurrentPath = "";
1321 fschmid 30
        docc = doc;
31
        setMinimumSize(fontMetrics().width( tr( "Available Fonts" )+ tr( "Font Substitutions" )+ tr( "Additional Paths" ))+180, 200);
32
        tab1 = new QWidget( this, "tab1" );
33
        tab1Layout = new QVBoxLayout( tab1, 10, 5, "tab1Layout");
1338 fschmid 34
        fontList = new QListView(tab1, "fontList" );
35
        fontList->addColumn(tr("Font Name", "font preview"));
36
        fontList->addColumn(tr("Use Font", "font preview"));
37
        fontList->addColumn(tr("Embed in:", "font preview"));
38
        fontList->addColumn(tr("Subset", "font preview"));
39
        fontList->setColumnAlignment(3, Qt::AlignCenter);
40
        fontList->addColumn(tr("Path to Font File", "font preview"));
161 Franz 41
        SCFontsIterator it(flist);
1338 fschmid 42
        ttfFont = loadIcon("font_truetype16.png");
43
        otfFont = loadIcon("font_otf16.png");
44
        psFont = loadIcon("font_type1_16.png");
45
        okIcon = loadIcon("ok.png");
46
        empty = QPixmap(16,16);
47
        empty.fill(white);
245 Franz 48
        for ( ; it.current(); ++it)
49
        {
1338 fschmid 50
                fontSet foS;
51
                QListViewItem *row = new QListViewItem(fontList);
52
                row->setText(0, it.currentKey());
161 Franz 53
                if (it.current()->UseFont)
1338 fschmid 54
                {
161 Franz 55
                        UsedFonts.append(it.currentKey());
1338 fschmid 56
                        foS.FlagUse = true;
57
                        row->setPixmap(1, okIcon);
58
                }
59
                else
60
                {
61
                        foS.FlagUse = false;
62
                        row->setPixmap(1, empty);
63
                }
64
                row->setText(2, tr("Postscript"));
65
                if (it.current()->EmbedPS)
66
                {
67
                        foS.FlagPS = true;
68
                        row->setPixmap(2, okIcon);
69
                }
70
                else
71
                {
72
                        foS.FlagPS = false;
73
                        row->setPixmap(2, empty);
74
                }
161 Franz 75
                QFileInfo fi = QFileInfo(it.current()->Datei);
76
                QString ext = fi.extension(false).lower();
77
                if (ext == "otf")
1338 fschmid 78
                        foS.FlagOTF = true;
79
                else
80
                        foS.FlagOTF = false;
81
                if (it.current()->Subset)
161 Franz 82
                {
1338 fschmid 83
                        foS.FlagSub = true;
84
                        row->setPixmap(3, okIcon);
161 Franz 85
                }
86
                else
1338 fschmid 87
                {
88
                        foS.FlagSub = false;
89
                        row->setPixmap(3, empty);
90
                }
161 Franz 91
                if ((ext == "pfa") || (ext == "pfb"))
1338 fschmid 92
                        row->setPixmap(0, psFont);
161 Franz 93
                else
94
                {
95
                        if (ext == "ttf")
1338 fschmid 96
                                row->setPixmap(0, ttfFont);
161 Franz 97
                        if (ext == "otf")
1338 fschmid 98
                                row->setPixmap(0, otfFont);
161 Franz 99
                }
1338 fschmid 100
                row->setText(4, it.current()->Datei);
101
                fontFlags.insert(it.currentKey(), foS);
245 Franz 102
        }
1338 fschmid 103
        fontList->setSorting(0);
104
        fontList->sort();
161 Franz 105
        UsedFonts.sort();
1338 fschmid 106
        fontList->setSorting(-1);
107
        tab1Layout->addWidget( fontList );
1321 fschmid 108
        insertTab( tab1, tr( "&Available Fonts" ) );
3 paul 109
 
1321 fschmid 110
        tab = new QWidget( this, "tab" );
111
        tabLayout = new QVBoxLayout( tab, 10, 5, "tabLayout");
253 Franz 112
        Table3 = new QTable( tab, "Repl" );
245 Franz 113
        Table3->setSorting(false);
114
        Table3->setSelectionMode(QTable::SingleRow);
115
        Table3->setLeftMargin(0);
116
        Table3->verticalHeader()->hide();
117
        Table3->setNumCols( 2 );
118
        Table3->setNumRows(Prefs->GFontSub.count());
119
        Header2 = Table3->horizontalHeader();
120
        Header2->setLabel(0, tr("Font Name"));
121
        Header2->setLabel(1, tr("Replacement"));
1338 fschmid 122
        int a = 0;
161 Franz 123
        QMap<QString,QString>::Iterator itfsu;
124
        for (itfsu = RList.begin(); itfsu != RList.end(); ++itfsu)
125
        {
126
                Table3->setText(a, 0, itfsu.key());
245 Franz 127
                QComboBox *item = new QComboBox( true, this, "Replace" );
161 Franz 128
                item->setEditable(false);
129
                item->insertStringList(UsedFonts);
130
                item->setCurrentText(itfsu.data());
245 Franz 131
                Table3->setCellWidget(a, 1, item);
132
                FlagsRepl.append(item);
161 Franz 133
                a++;
134
        }
245 Franz 135
        Table3->setColumnStretchable(0, true);
136
        Table3->setColumnStretchable(1, true);
248 Franz 137
        Table3->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
245 Franz 138
        tabLayout->addWidget( Table3 );
1321 fschmid 139
        Layout2a = new QHBoxLayout( 0, 0, 5, "Layout2");
245 Franz 140
        QSpacerItem* spacer1 = new QSpacerItem( 0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum );
141
        Layout2a->addItem( spacer1 );
341 Franz 142
        DelB = new QPushButton( tr( "&Delete" ), tab, "DelB" );
161 Franz 143
        DelB->setEnabled(false);
245 Franz 144
        Layout2a->addWidget( DelB );
145
        QSpacerItem* spacer2 = new QSpacerItem( 0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum );
146
        Layout2a->addItem( spacer2 );
147
        tabLayout->addLayout( Layout2a );
1321 fschmid 148
        insertTab( tab, tr( "Font &Substitutions" ) );
3 paul 149
 
1321 fschmid 150
        tab3 = new QWidget( this, "tab3" );
151
        tab3Layout = new QHBoxLayout( tab3, 10, 5, "tab3Layout");
245 Franz 152
        PathList = new QListBox( tab3, "PathList" );
161 Franz 153
        ReadPath();
248 Franz 154
        PathList->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
245 Franz 155
        tab3Layout->addWidget( PathList );
1321 fschmid 156
        LayoutR = new QVBoxLayout( 0, 0, 5, "LayoutR");
341 Franz 157
        ChangeB = new QPushButton( tr( "C&hange..." ), tab3, "ChangeB" );
245 Franz 158
        LayoutR->addWidget( ChangeB );
341 Franz 159
        AddB = new QPushButton( tr( "A&dd..." ), tab3, "AddB" );
245 Franz 160
        LayoutR->addWidget( AddB );
341 Franz 161
        RemoveB = new QPushButton( tr( "&Remove" ), tab3, "RemoveB" );
245 Franz 162
        LayoutR->addWidget( RemoveB );
163
        QSpacerItem* spacer_2 = new QSpacerItem( 0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding );
164
        LayoutR->addItem( spacer_2 );
165
        tab3Layout->addLayout( LayoutR );
1321 fschmid 166
        insertTab( tab3, tr( "Additional &Paths" ) );
161 Franz 167
        ChangeB->setEnabled(false);
168
        RemoveB->setEnabled(false);
3 paul 169
 
245 Franz 170
        // signals and slots connections
171
        connect(Table3, SIGNAL(currentChanged(int, int)), this, SLOT(ReplaceSel(int, int)));
172
        connect(DelB, SIGNAL(clicked()), this, SLOT(DelEntry()));
173
        connect(PathList, SIGNAL(highlighted(QListBoxItem*)), this, SLOT(SelectPath(QListBoxItem*)));
174
        connect(AddB, SIGNAL(clicked()), this, SLOT(AddPath()));
175
        connect(ChangeB, SIGNAL(clicked()), this, SLOT(ChangePath()));
176
        connect(RemoveB, SIGNAL(clicked()), this, SLOT(DelPath()));
1338 fschmid 177
        connect(fontList, SIGNAL(clicked(QListViewItem *, const QPoint &, int)), this, SLOT(slotClick(QListViewItem*, const QPoint &, int)));
3 paul 178
}
179
 
1338 fschmid 180
void FontPrefs::slotClick(QListViewItem* ite, const QPoint &, int col)
181
{
182
        if (ite == NULL)
183
                return;
184
        QString tmp = ite->text(0);
185
        if ((col == 1) && (!DocAvail))
186
        {
187
                fontFlags[tmp].FlagUse = !fontFlags[tmp].FlagUse;
188
                if (fontFlags[tmp].FlagUse)
189
                        ite->setPixmap(1, okIcon);
190
                else
191
                        ite->setPixmap(1, empty);
192
        }
193
        if (col == 2)
194
        {
195
                fontFlags[tmp].FlagPS = !fontFlags[tmp].FlagPS;
196
                if (fontFlags[tmp].FlagPS)
197
                        ite->setPixmap(2, okIcon);
198
                else
199
                        ite->setPixmap(2, empty);
200
        }
201
        if ((col == 3) && (!fontFlags[tmp].FlagOTF))
202
        {
203
                fontFlags[tmp].FlagSub = !fontFlags[tmp].FlagSub;
204
                if (fontFlags[tmp].FlagSub)
205
                        ite->setPixmap(3, okIcon);
206
                else
207
                        ite->setPixmap(3, empty);
208
        }
209
        UpdateFliste();
210
}
211
 
3 paul 212
void FontPrefs::ReplaceSel(int, int)
213
{
214
        DelB->setEnabled(true);
215
}
216
 
217
void FontPrefs::UpdateFliste()
218
{
219
        QString tmp;
220
        UsedFonts.clear();
221
        SCFontsIterator it(Prefs->AvailFonts);
222
        for ( ; it.current() ; ++it)
161 Franz 223
        {
1338 fschmid 224
                if (fontFlags[it.currentKey()].FlagUse)
3 paul 225
                        UsedFonts.append(it.currentKey());
161 Franz 226
        }
3 paul 227
        UsedFonts.sort();
228
        for (uint b = 0; b < FlagsRepl.count(); ++b)
161 Franz 229
        {
3 paul 230
                tmp = FlagsRepl.at(b)->currentText();
231
                FlagsRepl.at(b)->clear();
232
                FlagsRepl.at(b)->insertStringList(UsedFonts);
233
                if (UsedFonts.contains(tmp) != 0)
234
                        FlagsRepl.at(b)->setCurrentText(tmp);
235
                else
236
                        FlagsRepl.at(b)->setCurrentItem(0);
161 Franz 237
        }
3 paul 238
}
239
 
240
void FontPrefs::DelEntry()
241
{
242
        int r = Table3->currentRow();
243
        QString tmp = Table3->text(r, 0);
244
        Table3->removeRow(r);
245
        FlagsRepl.remove(r);
246
        RList.remove(tmp);
247
}
248
 
249
void FontPrefs::ReadPath()
250
{
1144 cbradney 251
        QFile fx(HomeP+"/scribusfont13.rc");
3 paul 252
        QString ExtraPath = "";
253
        ExtraFonts.clear();
254
        PathList->clear();
255
        if ( fx.exists() )
161 Franz 256
        {
257
                if (fx.open(IO_ReadOnly))
3 paul 258
                {
259
                        QTextStream tsx(&fx);
260
                        ExtraPath = tsx.read();
261
                        fx.close();
262
                        ExtraFonts = QStringList::split("\n",ExtraPath);
161 Franz 263
                }
3 paul 264
                PathList->insertStringList(ExtraFonts);
265
        }
266
}
267
 
268
void FontPrefs::SelectPath(QListBoxItem *c)
269
{
1321 fschmid 270
        if (!DocAvail)
271
        {
272
                ChangeB->setEnabled(true);
273
                RemoveB->setEnabled(true);
274
        }
3 paul 275
        CurrentPath = c->text();
276
}
277
 
278
void FontPrefs::AddPath()
279
{
415 Franz 280
        PrefsContext* dirs = prefsFile->getContext("dirs");
281
        CurrentPath = dirs->get("fontprefs", ".");
3 paul 282
        QString s = QFileDialog::getExistingDirectory(CurrentPath, this, "d", tr("Choose a Directory"), true);
283
        if (s != "")
161 Franz 284
        {
415 Franz 285
                dirs->set("fontprefs", s.left(s.findRev("/", -2)));
3 paul 286
                s = s.left(s.length()-1);
287
                if (PathList->findItem(s))
288
                        return;
1321 fschmid 289
                if (!DocAvail)
161 Franz 290
                {
1321 fschmid 291
                        QFile fx(HomeP+"/scribusfont13.rc");
292
                        if (fx.open(IO_WriteOnly))
293
                        {
294
                                QTextStream tsx(&fx);
295
                                for (uint a = 0; a < PathList->count(); ++a)
296
                                        tsx << PathList->text(a) << "\n" ;
297
                                tsx << s;
298
                                fx.close();
299
                        }
300
                        else
301
                                return;
302
                        ChangeB->setEnabled(true);
303
                        RemoveB->setEnabled(true);
161 Franz 304
                }
3 paul 305
                PathList->insertItem(s);
306
                CurrentPath = s;
307
                RebuildDialog();
161 Franz 308
        }
3 paul 309
}
310
 
311
void FontPrefs::ChangePath()
312
{
313
        QString s = QFileDialog::getExistingDirectory(CurrentPath, this, "d", tr("Choose a Directory"), true);
314
        if (s != "")
161 Franz 315
        {
3 paul 316
                s = s.left(s.length()-1);
317
                if (PathList->findItem(s))
318
                        return;
1144 cbradney 319
                QFile fx(HomeP+"/scribusfont13.rc");
3 paul 320
                if (fx.open(IO_WriteOnly))
161 Franz 321
                {
3 paul 322
                        PathList->changeItem(s, PathList->currentItem());
323
                        QTextStream tsx(&fx);
324
                        for (uint a = 0; a < PathList->count(); ++a)
325
                                tsx << PathList->text(a) << "\n" ;
326
                        fx.close();
161 Franz 327
                }
3 paul 328
                else
329
                        return;
330
                CurrentPath = s;
331
                RebuildDialog();
332
                ChangeB->setEnabled(true);
333
                RemoveB->setEnabled(true);
161 Franz 334
        }
3 paul 335
}
336
 
337
void FontPrefs::DelPath()
338
{
1144 cbradney 339
        QFile fx(HomeP+"/scribusfont13.rc");
3 paul 340
        if (fx.open(IO_WriteOnly))
161 Franz 341
        {
45 Franz 342
                if (PathList->count() == 1)
343
                        PathList->clear();
344
                else
345
                        PathList->removeItem(PathList->currentItem());
3 paul 346
                QTextStream tsx(&fx);
347
                for (uint a = 0; a < PathList->count(); ++a)
348
                        tsx << PathList->text(a) << "\n" ;
349
                fx.close();
161 Franz 350
        }
3 paul 351
        else
352
                return;
353
        CurrentPath = "";
354
        RebuildDialog();
80 Franz 355
        bool setter = PathList->count() > 0 ? true : false;
356
        ChangeB->setEnabled(setter);
357
        RemoveB->setEnabled(setter);
3 paul 358
}
359
 
360
void FontPrefs::RebuildDialog()
361
{
161 Franz 362
        Prefs->AvailFonts.clear();
363
        Prefs->AvailFonts.GetFonts(HomeP);
1321 fschmid 364
        if (DocAvail)
365
        {
366
                for (uint a = 0; a < PathList->count(); ++a)
367
                {
368
                        if (ExtraFonts.contains(PathList->text(a)) == 0)
369
                                Prefs->AvailFonts.AddScalableFonts(PathList->text(a)+"/", docc->DocName);
370
                }
371
        }
161 Franz 372
        UsedFonts.clear();
1338 fschmid 373
        fontFlags.clear();
161 Franz 374
        SCFontsIterator it(Prefs->AvailFonts);
245 Franz 375
        for ( ; it.current(); ++it)
376
        {
1338 fschmid 377
                fontSet foS;
378
                QListViewItem *row = new QListViewItem(fontList);
379
                row->setText(0, it.currentKey());
161 Franz 380
                if (it.current()->UseFont)
1338 fschmid 381
                {
161 Franz 382
                        UsedFonts.append(it.currentKey());
1338 fschmid 383
                        foS.FlagUse = true;
384
                        row->setPixmap(1, okIcon);
385
                }
386
                else
387
                {
388
                        foS.FlagUse = false;
389
                        row->setPixmap(1, empty);
390
                }
391
                row->setText(2, tr("Postscript"));
392
                if (it.current()->EmbedPS)
393
                {
394
                        foS.FlagPS = true;
395
                        row->setPixmap(2, okIcon);
396
                }
397
                else
398
                {
399
                        foS.FlagPS = false;
400
                        row->setPixmap(2, empty);
401
                }
161 Franz 402
                QFileInfo fi = QFileInfo(it.current()->Datei);
403
                QString ext = fi.extension(false).lower();
1338 fschmid 404
                row->setText(3, tr("Yes"));
161 Franz 405
                if (ext == "otf")
1338 fschmid 406
                        foS.FlagOTF = true;
407
                else
408
                        foS.FlagOTF = false;
409
                if (it.current()->Subset)
161 Franz 410
                {
1338 fschmid 411
                        foS.FlagSub = true;
412
                        row->setPixmap(3, okIcon);
161 Franz 413
                }
414
                else
1338 fschmid 415
                {
416
                        foS.FlagSub = false;
417
                        row->setPixmap(3, empty);
418
                }
161 Franz 419
                if ((ext == "pfa") || (ext == "pfb"))
1338 fschmid 420
                        row->setPixmap(0, psFont);
161 Franz 421
                else
422
                {
423
                        if (ext == "ttf")
1338 fschmid 424
                                row->setPixmap(0, ttfFont);
161 Franz 425
                        if (ext == "otf")
1338 fschmid 426
                                row->setPixmap(0, otfFont);
161 Franz 427
                }
1338 fschmid 428
                row->setText(4, it.current()->Datei);
429
                fontFlags.insert(it.currentKey(), foS);
245 Franz 430
        }
1338 fschmid 431
        fontList->setSorting(0);
432
        fontList->sort();
253 Franz 433
        UsedFonts.sort();
1338 fschmid 434
        fontList->setSorting(-1);
161 Franz 435
        UpdateFliste();
3 paul 436
}