Permalink
Browse files

Changed - samples are now stored at system level _and_ user level to …

…allow easy distribution of large sets of samples. More samples to come then ;-)
  • Loading branch information...
1 parent 7c3e80a commit e63a3840ccd4eb5e7e3f4feaad43353080b315ed Pierre Marchand committed May 23, 2009
Showing with 338 additions and 295 deletions.
  1. +1 −0 CMakeLists.txt
  2. +7 −0 samples/CMakeLists.txt
  3. +8 −0 samples/fr/CMakeLists.txt
  4. +3 −0 samples/fr/Mamere
  5. +1 −1 src/CMakeLists.txt
  6. +56 −121 src/dataloader.cpp
  7. +17 −26 src/dataloader.h
  8. +6 −0 src/fmpaths.cpp
  9. +3 −1 src/fmpaths.h
  10. +78 −68 src/mainview.ui
  11. +51 −26 src/mainviewwidget.cpp
  12. +1 −1 src/prefspaneldialog.cpp
  13. +97 −45 src/typotek.cpp
  14. +9 −6 src/typotek.h
View
@@ -272,6 +272,7 @@ IF(WIN32)
ENDIF(WIN32)
ADD_SUBDIRECTORY(help)
+ADD_SUBDIRECTORY(samples)
SET(CPACK_PACKAGE_VERSION_MAJOR ${VERSION_MAJOR})
SET(CPACK_PACKAGE_VERSION_MINOR ${VERSION_MINOR})
View
@@ -0,0 +1,7 @@
+# Samples
+SET(SAMPLE_DIR ${RESOURCESDIR}/Samples/)
+
+# Français
+ADD_SUBDIRECTORY(fr)
+
+
@@ -0,0 +1,8 @@
+# Exemples en Français
+
+set(SAMPLES_FR
+Mamere
+)
+
+install(FILES ${SAMPLES_FR}
+ DESTINATION ${SAMPLE_DIR}/fr)
View
@@ -0,0 +1,3 @@
+Ma mère, quand il fut question d’avoir pour la première fois M. de Norpois à dîner, ayant exprimé le regret que le Professeur Cottard fût en voyage et qu’elle-même eût entièrement cessé de fréquenter Swann, car l’un et l’autre eussent sans doute intéressé l’ancien Ambassadeur, mon père répondit qu’un convive éminent, un savant illustre, comme Cottard, ne pouvait jamais mal faire dans un dîner, mais que Swann, avec son ostentation, avec sa manière de crier sur les toits ses moindres relations, était un vulgaire esbrouffeur que le Marquis de Norpois eût sans doute trouvé selon son expression, «puant». Or cette réponse de mon père demande quelques mots d’explication, certaines personnes se souvenant peut-être d’un Cottard bien médiocre et d’un Swann poussant jusqu’à la plus extrême délicatesse, en matière mondaine, la modestie et la discrétion. Mais pour ce qui regarde celui-ci, il était arrivé qu’au «fils Swann» et aussi au Swann du Jockey, l’ancien ami de mes parents avait ajouté une personnalité nouvelle (et qui ne devait pas être la dernière), celle de mari d’Odette. Adaptant aux humbles ambitions de cette femme, l’instinct, le désir, l’industrie, qu’il avait toujours eus, il s’était ingénié à se bâtir, fort au-dessous de l’ancienne, une position nouvelle et appropriée à la compagne qui l’occuperait avec lui. Or il s’y montrait un autre homme. Puisque (tout en continuant à fréquenter seul ses amis personnels, à qui il ne voulait pas imposer Odette quand ils ne lui demandaient pas spontanément à la connaître) c’était une seconde vie qu’il commençait, en commun avec sa femme, au milieu d’êtres nouveaux, on eût encore compris que pour mesurer le rang de ceux-ci, et par conséquent le plaisir d’amour-propre qu’il pouvait éprouver à les recevoir, il se fût servi, comme un point de comparaison, non pas des gens les plus brillants qui formaient sa société avant son mariage, mais des relations antérieures d’Odette. Mais, même quand on savait que c’était avec d’inélégants fonctionnaires, avec des femmes tarées, parure des bals de ministères, qu’il désirait de se lier, on était étonné de l’entendre, lui qui autrefois et même encore aujourd’hui dissimulait si gracieusement une invitation de Twickenham ou de Buckingham Palace, faire sonner bien haut que la femme d’un sous-chef de cabinet était venue rendre sa visite à Madame Swann. On dira peut-être que cela tenait à ce que la simplicité du Swann élégant, n’avait été chez lui qu’une forme plus raffinée de la vanité et que, comme certains israélites, l’ancien ami de mes parents avait pu présenter tour à tour les états successifs par où avaient passé ceux de sa race, depuis le snobisme le plus naïf et la plus grossière goujaterie, jusqu’à la plus fine politesse. Mais la principale raison, et celle-là applicable à l’humanité en général, était que nos vertus elles-mêmes ne sont pas quelque chose de libre, de flottant, de quoi nous gardions la disponibilité permanente; elles finissent par s’associer si étroitement dans notre esprit avec les actions à l’occasion desquelles nous nous sommes fait un devoir de les exercer, que si surgit pour nous une activité d’un autre ordre, elle nous prend au dépourvu et sans que nous ayons seulement l’idée qu’elle pourrait comporter la mise en œuvre de ces mêmes vertus. Swann empressé avec ces nouvelles relations et les citant avec fierté, était comme ces grands artistes modestes ou généreux qui, s’ils se mettent à la fin de leur vie à se mêler de cuisine ou de jardinage, étalent une satisfaction naïve des louanges qu’on donne à leurs plats ou à leurs plates-bandes pour lesquels ils n’admettent pas la critique qu’ils acceptent aisément s’il s’agit de leurs chefs-d’œuvre; ou bien qui, donnant une de leurs toiles pour rien, ne peuvent en revanche sans mauvaise humeur perdre quarante sous aux dominos.</sampleline>
+ <sampleline name="défaut"></sampleline>
+ <sampleline name="défaut">Quant au Professeur Cottard, on le reverra, longuement, beaucoup plus loin, chez la Patronne, au château de la Raspelière. Qu’il suffise actuellement, à son égard, de faire observer ceci: pour Swann, à la rigueur le changement peut surprendre puisqu’il était accompli et non soupçonné de moi quand je voyais le père de Gilberte aux Champs-Elysées, où d’ailleurs ne m’adressant pas la parole il ne pouvait faire étalage devant moi de ses relations politiques (il est vrai que s’il l’eût fait, je ne me fusse peut-être pas aperçu tout de suite de sa vanité car l’idée qu’on s’est faite longtemps d’une personne, bouche les yeux et les oreilles; ma mère pendant trois ans ne distingua pas plus le fard qu’une de ses nièces se mettait aux lèvres que s’il eût été invisiblement entièrement dissous dans un liquide; jusqu’au jour où une parcelle supplémentaire, ou bien quelque autre cause amena le phénomène appelé sursaturation; tout le fard non aperçu, cristallisa et ma mère devant cette débauche soudaine de couleurs déclara, comme on eût fait à Combray que c’était une honte et cessa presque toute relation avec sa nièce). Mais pour Cottard au contraire, l’époque où on l’a vu assister aux débuts de Swann chez les Verdurin était déjà assez lointaine; or les honneurs, les titres officiels viennent avec les années; deuxièmement, on peut être illettré, faire des calembours stupides, et posséder un don particulier, qu’aucune culture générale ne remplace, comme le don du grand stratège ou du grand clinicien. Ce n’est pas seulement en effet comme un praticien obscur, devenu à la longue, notoriété européenne, que ses confrères considéraient Cottard. Les plus intelligents d’entre les jeunes médecins déclarèrent, -- au moins pendant quelques années, car les modes changent étant nées elles-mêmes du besoin de changement, -- que si jamais ils tombaient malades, Cottard était le seul maître auquel ils confieraient leur peau. Sans doute ils préféraient le commerce de certains chefs plus lettrés, plus artistes, avec lesquels ils pouvaient parler de Nietsche, de Wagner. Quand on faisait de la musique chez Madame Cottard, aux soirées où elle recevait, avec l’espoir qu’il devint un jour doyen de la Faculté, les collègues et les élèves de son mari, celui-ci au lieu d’écouter, préférait jouer aux cartes dans un salon voisin. Mais on vantait la promptitude, la profondeur, la sûreté de son coup d’œil, de son diagnostic. En troisième lieu, en ce qui concerne l’ensemble de façons que le Professeur Cottard montrait à un homme comme mon père, remarquons que la nature que nous faisons paraître dans la seconde partie de notre vie, n’est pas toujours, si elle l’est souvent, notre nature première développée ou flétrie, grossie ou atténuée; elle est quelquefois une nature inverse, un véritable vêtement retourné. Sauf chez les Verdurin qui s’étaient engoués de lui, l’air hésitant de Cottard, sa timidité, son amabilité excessives, lui avaient, dans sa jeunesse, valu de perpétuels brocards. Quel ami charitable lui conseilla l’air glacial? L’importance de sa situation lui rendit plus aisé de le prendre. Partout, sinon chez les Verdurin où il redevenait instinctivement lui-même, il se rendit froid, volontiers silencieux, péremptoire, quand il fallait parler, n’oubliant pas de dire des choses désagréables. Il put faire l’essai de cette nouvelle attitude devant des clients qui ne l’ayant pas encore vu, n’étaient pas à même de faire des comparaisons, et eussent été bien étonnés d’apprendre qu’il n’était pas un homme d’une rudesse naturelle. C’est surtout à l’impassibilité qu’il s’efforçait et même dans son service d’hôpital, quand il débitait quelques-uns de ces calembours qui faisaient rire tout le monde, du chef de clinique au plus récent externe, il le faisait toujours sans qu’un muscle bougeât dans sa figure d’ailleurs méconnaissable depuis qu’il avait rasé barbe et moustaches.
View
@@ -54,7 +54,7 @@ ${CMAKE_CURRENT_SOURCE_DIR}/panosematch.cpp
${CMAKE_CURRENT_SOURCE_DIR}/pangoshaper.cpp
${CMAKE_CURRENT_SOURCE_DIR}/prefspaneldialog.cpp
${CMAKE_CURRENT_SOURCE_DIR}/remotedir.cpp
-${CMAKE_CURRENT_SOURCE_DIR}/savedata.cpp
+#${CMAKE_CURRENT_SOURCE_DIR}/savedata.cpp
${CMAKE_CURRENT_SOURCE_DIR}/schelptreemodel.cpp
${CMAKE_CURRENT_SOURCE_DIR}/sctextbrowser.cpp
${CMAKE_CURRENT_SOURCE_DIR}/shortcuts.cpp
View
@@ -18,153 +18,88 @@
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "dataloader.h"
-#include "typotek.h"
+#include "fmpaths.h"
-
-#include <QDomDocument>
-#include <QDomNodeList>
-#include <QMessageBox>
-#include <QString>
-#include <QStatusBar>
#include <QDebug>
+#include <QDir>
+#include <QFile>
-extern bool __FM_SHOW_FONTLOADED;
-
-DataLoader::DataLoader ( QFile *file )
- : m_file ( file )
+DataLoader::DataLoader ()
{
- m_typo = typotek::getInstance();
-
+ load();
}
-
-DataLoader::~DataLoader()
+void DataLoader::reload()
{
+ load();
}
-int DataLoader::load()
+void DataLoader::load()
{
- QDomDocument doc ( "fontdata" );
- QStringList fallbackSample ( QObject::tr ( "ABCDEFGH\nIJKLMNOPQ\nRSTUVXYZ\n\nabcdefgh\nijklmnopq\nrstuvxyz\n0123456789\n,;:!?." ).split ( "\n" ) );
- QString defaultWord(QObject::tr ( "hamburgefonstiv" ));
- if ( !m_file->open ( QFile::ReadOnly ) )
- {
- for ( uint i = 0; i < fallbackSample.count(); ++i )
- {
- m_typo->addNamedSampleFragment ( m_typo->defaultSampleName() , fallbackSample[i] );
- }
- m_typo->setWord ( defaultWord , false );
-
- return FONTDATA_NO_FILE;
- }
- if ( !doc.setContent ( m_file ) )
- {
- m_file->close();
- m_typo->statusBar()->showMessage ( QString ( "ERROR loading xml for %1" ).arg ( m_file->fileName() ),3000 );
-
- for ( uint i = 0; i < fallbackSample.count(); ++i )
- {
- m_typo->addNamedSampleFragment ( m_typo->defaultSampleName() , fallbackSample[i] );
- }
- m_typo->setWord ( defaultWord , false );
-
- return FONTDATA_NO_CONTENT;
- }
-
- m_file->close();
- QDomElement rootElement(doc.documentElement());
-
- if(rootElement.nodeName() != "fontmatrix")
- {
- for ( uint i = 0; i < fallbackSample.count(); ++i )
- {
- m_typo->addNamedSampleFragment ( m_typo->defaultSampleName() , fallbackSample[i] );
- }
- m_typo->setWord ( defaultWord , false );
-
- return FONTDATA_NOT_FONTMATRIX;
- }
- if(rootElement.attributeNode("version").value() != "1.1")
+ sm.clear();
+ pm.clear();
+ // First we load system samples
+ QDir samplesDir(FMPaths::ResourcesDir() + "Samples" );
+ foreach(QString ld,
+ samplesDir.entryList(QDir::NoDotAndDotDot | QDir::AllDirs) )
{
- for ( uint i = 0; i < fallbackSample.count(); ++i )
+ QDir lang(samplesDir.absoluteFilePath(ld));
+ foreach(QString st,
+ lang.entryList(QDir::NoDotAndDotDot | QDir::NoSymLinks | QDir::Files) )
{
- m_typo->addNamedSampleFragment ( m_typo->defaultSampleName() , fallbackSample[i] );
+ QFile fp(lang.absoluteFilePath(st));
+ if(fp.open(QIODevice::ReadOnly))
+ {
+ sm[ld][st] = QString::fromUtf8(fp.readAll());
+ }
}
- m_typo->setWord ( defaultWord , false );
-
- return FONTDATA_VERSION_MISMATCH;
}
-
-
-// QStringList collectedTags;
-// //loading tagsets
-// QDomNodeList setList = doc.elementsByTagName ( "tagset" );
-// if ( setList.length() == 0 )
-// {
-// m_typo->statusBar()->showMessage ( QString ( "WARNING: no tagset in %1" ).arg ( m_file->fileName() ),3000 );
-// }
-// for ( uint i = 0; i < setList.length(); ++i )
-// {
-// QDomNode col = setList.item ( i );
-// QString set = col.toElement().attributeNode ( "name" ).value();
-// QDomNodeList taglist = col.toElement().elementsByTagName ( "tag" );
-// QStringList tl;
-// for ( int ti = 0; ti < taglist.count(); ++ti )
-// {
-// tl << taglist.at ( ti ).toElement().text();
-// }
-// // m_typo->addTagSetMapEntry ( set,tl );
-// collectedTags << tl;
-//
-// // qDebug() << set << tl.join(":");
-// }
-// collectedTags.removeAll ( "" );
-// // typotek::tagsList = collectedTags.toSet().toList();
-
-
-
- //loading sample text
- QString sampleText;
- QDomNodeList sampleList = doc.elementsByTagName ( "sampleline" );
- if ( sampleList.length() == 0 )
+ // Then personals
+ QDir uDir(FMPaths::SamplesDir());
+ if(!uDir.exists())
{
- m_typo->statusBar()->showMessage ( QString ( "WARNING: no sample text in %1" ).arg ( m_file->fileName() ),3000 );
- QStringList fallbackSample ( QObject::tr ( "ABCDEFGH\nIJKLMNOPQ\nRSTUVXYZ\n\nabcdefgh\nijklmnopq\nrstuvxyz\n0123456789\n,;:!?." ).split ( "\n" ) );
- for ( uint i = 0; i < fallbackSample.count(); ++i )
- {
- m_typo->addNamedSampleFragment ( m_typo->defaultSampleName(), fallbackSample[i] );
- }
+ qDebug()<<"Create Directory:"<<uDir.absolutePath();
+ uDir.mkpath(uDir.absolutePath());
}
else
{
- for ( uint i = 0; i < sampleList.length(); ++i )
+ foreach(QString ld, uDir.entryList(QDir::NoDotAndDotDot | QDir::NoSymLinks | QDir::Files) )
{
- QDomNode col = sampleList.item ( i );
- QString name = col.toElement().attributeNode ( "name" ).value();
- if ( name.isEmpty()
- || name == "default" ) // rather to not break previous installation
- name = m_typo->defaultSampleName();
- m_typo->addNamedSampleFragment ( name, col.toElement().text() );
+ QFile fp(uDir.absoluteFilePath(ld));
+ if(fp.open(QIODevice::ReadOnly))
+ {
+ pm[ld] = QString::fromUtf8(fp.readAll());
+ }
}
}
- //loading preview word
- QString pWord;
- QDomNodeList previewList = doc.elementsByTagName ( "previewword" );
- if ( previewList.length() == 0 )
+ // Emergency !!
+ if(sm.isEmpty() && pm.isEmpty())
{
- m_typo->statusBar()->showMessage ( QString ( "WARNING: no preview word in %1" ).arg ( m_file->fileName() ),3000 );
- pWord = QObject::tr ( "hamburgefonstiv" );
+ sm["Emergency"]["Text"] = QString("Emergency Text");
}
- else
+}
+
+// TODO
+bool DataLoader::update(const QString& name, const QString& sample)
+{
+ QDir uDir(FMPaths::SamplesDir());
+ QFile fp(uDir.absoluteFilePath(name));
+ if(fp.open(QIODevice::WriteOnly | QIODevice::Truncate))
{
- QDomNode col = previewList.item ( 0 );
- pWord = col.toElement().text();
+ fp.write(sample.toUtf8());
}
- m_typo->setWord ( pWord, false );
-
- return FONTDATA_OK;
+ pm[name] = sample;
}
-
+bool DataLoader::remove(const QString& name)
+{
+ QDir uDir(FMPaths::SamplesDir());
+ QFile fp(uDir.absoluteFilePath(name));
+ if(fp.exists())
+ {
+ if(fp.remove())
+ pm.remove(name);
+ }
+}
View
@@ -20,39 +20,30 @@
#ifndef DATALOADER_H
#define DATALOADER_H
-#include <QFile>
-#include <QStringList>
-
-#include "fontitem.h"
-
-#define FONTDATA_OK 0
-#define FONTDATA_NO_CONTENT 1
-#define FONTDATA_NO_FILE 2
-#define FONTDATA_NOT_FONTMATRIX 3
-#define FONTDATA_VERSION_MISMATCH 4
-
-
-class typotek;
+#include <QMap>
+#include <QString>
/**
@author Pierre Marchand <pierre@oep-h.com>
*/
class DataLoader
{
-
- public:
- DataLoader ( QFile *file );
-
- ~DataLoader();
- int load();
- QStringList fontList() const { return m_fontList; }
- QMap< QString,FontLocalInfo > fastList() const { return m_fastList; }
- private :
- QFile *m_file;
- typotek *m_typo;
- QStringList m_fontList;
- QMap< QString,FontLocalInfo > m_fastList;
+
+ QMap<QString, QMap<QString,QString> > sm;
+ QMap<QString,QString> pm;
+
+ void load();
+public:
+ DataLoader();
+ ~DataLoader(){}
+
+ bool update(const QString& name, const QString& sample);
+ bool remove(const QString& name);
+ void reload();
+
+ const QMap<QString, QMap<QString,QString> >& systemSamples()const{return sm;}
+ const QMap<QString,QString>& userSamples()const{return pm;}
};
View
@@ -127,4 +127,10 @@ QString FMPaths::ScriptsDir()
return typotek::getInstance()->getOwnDir().absolutePath() + sep + "Scripts"+ sep;
}
+QString FMPaths::SamplesDir()
+{
+ QString sep(QDir::separator());
+ return typotek::getInstance()->getOwnDir().absolutePath() + sep + "Samples"+ sep;
+}
+
View
@@ -13,7 +13,7 @@
class FMPaths
{
QMap<QString,QString> FMPathsDB;
- FMPaths() {};
+ FMPaths() {}
static FMPaths *instance;
static FMPaths *getThis();
public:
@@ -29,5 +29,7 @@ class FMPaths
static QString HelpDir();
static QString ScriptsDir();
+
+ static QString SamplesDir();
};
#endif
Oops, something went wrong.

0 comments on commit e63a384

Please sign in to comment.