Subversion Repositories Scribus

Rev

Rev 1828 | Rev 2295 | 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" );
1878 cbradney 33
        tab1Layout = new QVBoxLayout( tab1, 0, 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
 
1828 fschmid 180
void FontPrefs::restoreDefaults()
181
{
182
}
183
 
1338 fschmid 184
void FontPrefs::slotClick(QListViewItem* ite, const QPoint &, int col)
185
{
186
        if (ite == NULL)
187
                return;
188
        QString tmp = ite->text(0);
189
        if ((col == 1) && (!DocAvail))
190
        {
191
                fontFlags[tmp].FlagUse = !fontFlags[tmp].FlagUse;
192
                if (fontFlags[tmp].FlagUse)
193
                        ite->setPixmap(1, okIcon);
194
                else
195
                        ite->setPixmap(1, empty);
196
        }
197
        if (col == 2)
198
        {
199
                fontFlags[tmp].FlagPS = !fontFlags[tmp].FlagPS;
200
                if (fontFlags[tmp].FlagPS)
201
                        ite->setPixmap(2, okIcon);
202
                else
203
                        ite->setPixmap(2, empty);
204
        }
205
        if ((col == 3) && (!fontFlags[tmp].FlagOTF))
206
        {
207
                fontFlags[tmp].FlagSub = !fontFlags[tmp].FlagSub;
208
                if (fontFlags[tmp].FlagSub)
209
                        ite->setPixmap(3, okIcon);
210
                else
211
                        ite->setPixmap(3, empty);
212
        }
213
        UpdateFliste();
214
}
215
 
3 paul 216
void FontPrefs::ReplaceSel(int, int)
217
{
218
        DelB->setEnabled(true);
219
}
220
 
221
void FontPrefs::UpdateFliste()
222
{
223
        QString tmp;
224
        UsedFonts.clear();
225
        SCFontsIterator it(Prefs->AvailFonts);
226
        for ( ; it.current() ; ++it)
161 Franz 227
        {
1338 fschmid 228
                if (fontFlags[it.currentKey()].FlagUse)
3 paul 229
                        UsedFonts.append(it.currentKey());
161 Franz 230
        }
3 paul 231
        UsedFonts.sort();
232
        for (uint b = 0; b < FlagsRepl.count(); ++b)
161 Franz 233
        {
3 paul 234
                tmp = FlagsRepl.at(b)->currentText();
235
                FlagsRepl.at(b)->clear();
236
                FlagsRepl.at(b)->insertStringList(UsedFonts);
237
                if (UsedFonts.contains(tmp) != 0)
238
                        FlagsRepl.at(b)->setCurrentText(tmp);
239
                else
240
                        FlagsRepl.at(b)->setCurrentItem(0);
161 Franz 241
        }
3 paul 242
}
243
 
244
void FontPrefs::DelEntry()
245
{
246
        int r = Table3->currentRow();
247
        QString tmp = Table3->text(r, 0);
248
        Table3->removeRow(r);
249
        FlagsRepl.remove(r);
250
        RList.remove(tmp);
251
}
252
 
253
void FontPrefs::ReadPath()
254
{
1144 cbradney 255
        QFile fx(HomeP+"/scribusfont13.rc");
3 paul 256
        QString ExtraPath = "";
257
        ExtraFonts.clear();
258
        PathList->clear();
259
        if ( fx.exists() )
161 Franz 260
        {
261
                if (fx.open(IO_ReadOnly))
3 paul 262
                {
263
                        QTextStream tsx(&fx);
264
                        ExtraPath = tsx.read();
265
                        fx.close();
266
                        ExtraFonts = QStringList::split("\n",ExtraPath);
161 Franz 267
                }
3 paul 268
                PathList->insertStringList(ExtraFonts);
269
        }
270
}
271
 
272
void FontPrefs::SelectPath(QListBoxItem *c)
273
{
1321 fschmid 274
        if (!DocAvail)
275
        {
276
                ChangeB->setEnabled(true);
277
                RemoveB->setEnabled(true);
278
        }
3 paul 279
        CurrentPath = c->text();
280
}
281
 
282
void FontPrefs::AddPath()
283
{
415 Franz 284
        PrefsContext* dirs = prefsFile->getContext("dirs");
285
        CurrentPath = dirs->get("fontprefs", ".");
3 paul 286
        QString s = QFileDialog::getExistingDirectory(CurrentPath, this, "d", tr("Choose a Directory"), true);
287
        if (s != "")
161 Franz 288
        {
415 Franz 289
                dirs->set("fontprefs", s.left(s.findRev("/", -2)));
3 paul 290
                s = s.left(s.length()-1);
291
                if (PathList->findItem(s))
292
                        return;
1321 fschmid 293
                if (!DocAvail)
161 Franz 294
                {
1321 fschmid 295
                        QFile fx(HomeP+"/scribusfont13.rc");
296
                        if (fx.open(IO_WriteOnly))
297
                        {
298
                                QTextStream tsx(&fx);
299
                                for (uint a = 0; a < PathList->count(); ++a)
300
                                        tsx << PathList->text(a) << "\n" ;
301
                                tsx << s;
302
                                fx.close();
303
                        }
304
                        else
305
                                return;
306
                        ChangeB->setEnabled(true);
307
                        RemoveB->setEnabled(true);
161 Franz 308
                }
3 paul 309
                PathList->insertItem(s);
310
                CurrentPath = s;
311
                RebuildDialog();
161 Franz 312
        }
3 paul 313
}
314
 
315
void FontPrefs::ChangePath()
316
{
317
        QString s = QFileDialog::getExistingDirectory(CurrentPath, this, "d", tr("Choose a Directory"), true);
318
        if (s != "")
161 Franz 319
        {
3 paul 320
                s = s.left(s.length()-1);
321
                if (PathList->findItem(s))
322
                        return;
1144 cbradney 323
                QFile fx(HomeP+"/scribusfont13.rc");
3 paul 324
                if (fx.open(IO_WriteOnly))
161 Franz 325
                {
3 paul 326
                        PathList->changeItem(s, PathList->currentItem());
327
                        QTextStream tsx(&fx);
328
                        for (uint a = 0; a < PathList->count(); ++a)
329
                                tsx << PathList->text(a) << "\n" ;
330
                        fx.close();
161 Franz 331
                }
3 paul 332
                else
333
                        return;
334
                CurrentPath = s;
335
                RebuildDialog();
336
                ChangeB->setEnabled(true);
337
                RemoveB->setEnabled(true);
161 Franz 338
        }
3 paul 339
}
340
 
341
void FontPrefs::DelPath()
342
{
1144 cbradney 343
        QFile fx(HomeP+"/scribusfont13.rc");
3 paul 344
        if (fx.open(IO_WriteOnly))
161 Franz 345
        {
45 Franz 346
                if (PathList->count() == 1)
347
                        PathList->clear();
348
                else
349
                        PathList->removeItem(PathList->currentItem());
3 paul 350
                QTextStream tsx(&fx);
351
                for (uint a = 0; a < PathList->count(); ++a)
352
                        tsx << PathList->text(a) << "\n" ;
353
                fx.close();
161 Franz 354
        }
3 paul 355
        else
356
                return;
357
        CurrentPath = "";
358
        RebuildDialog();
80 Franz 359
        bool setter = PathList->count() > 0 ? true : false;
360
        ChangeB->setEnabled(setter);
361
        RemoveB->setEnabled(setter);
3 paul 362
}
363
 
364
void FontPrefs::RebuildDialog()
365
{
161 Franz 366
        Prefs->AvailFonts.clear();
367
        Prefs->AvailFonts.GetFonts(HomeP);
1321 fschmid 368
        if (DocAvail)
369
        {
370
                for (uint a = 0; a < PathList->count(); ++a)
371
                {
372
                        if (ExtraFonts.contains(PathList->text(a)) == 0)
373
                                Prefs->AvailFonts.AddScalableFonts(PathList->text(a)+"/", docc->DocName);
374
                }
375
        }
161 Franz 376
        UsedFonts.clear();
1338 fschmid 377
        fontFlags.clear();
1379 fschmid 378
        fontList->clear();
161 Franz 379
        SCFontsIterator it(Prefs->AvailFonts);
245 Franz 380
        for ( ; it.current(); ++it)
381
        {
1338 fschmid 382
                fontSet foS;
383
                QListViewItem *row = new QListViewItem(fontList);
384
                row->setText(0, it.currentKey());
161 Franz 385
                if (it.current()->UseFont)
1338 fschmid 386
                {
161 Franz 387
                        UsedFonts.append(it.currentKey());
1338 fschmid 388
                        foS.FlagUse = true;
389
                        row->setPixmap(1, okIcon);
390
                }
391
                else
392
                {
393
                        foS.FlagUse = false;
394
                        row->setPixmap(1, empty);
395
                }
396
                row->setText(2, tr("Postscript"));
397
                if (it.current()->EmbedPS)
398
                {
399
                        foS.FlagPS = true;
400
                        row->setPixmap(2, okIcon);
401
                }
402
                else
403
                {
404
                        foS.FlagPS = false;
405
                        row->setPixmap(2, empty);
406
                }
161 Franz 407
                QFileInfo fi = QFileInfo(it.current()->Datei);
408
                QString ext = fi.extension(false).lower();
409
                if (ext == "otf")
1338 fschmid 410
                        foS.FlagOTF = true;
411
                else
412
                        foS.FlagOTF = false;
413
                if (it.current()->Subset)
161 Franz 414
                {
1338 fschmid 415
                        foS.FlagSub = true;
416
                        row->setPixmap(3, okIcon);
161 Franz 417
                }
418
                else
1338 fschmid 419
                {
420
                        foS.FlagSub = false;
421
                        row->setPixmap(3, empty);
422
                }
161 Franz 423
                if ((ext == "pfa") || (ext == "pfb"))
1338 fschmid 424
                        row->setPixmap(0, psFont);
161 Franz 425
                else
426
                {
427
                        if (ext == "ttf")
1338 fschmid 428
                                row->setPixmap(0, ttfFont);
161 Franz 429
                        if (ext == "otf")
1338 fschmid 430
                                row->setPixmap(0, otfFont);
161 Franz 431
                }
1338 fschmid 432
                row->setText(4, it.current()->Datei);
433
                fontFlags.insert(it.currentKey(), foS);
245 Franz 434
        }
1338 fschmid 435
        fontList->setSorting(0);
436
        fontList->sort();
253 Franz 437
        UsedFonts.sort();
1338 fschmid 438
        fontList->setSorting(-1);
161 Franz 439
        UpdateFliste();
3 paul 440
}