Calcul Mental - 1.2
En retard de plus de 14 ans (30/10/2010)
Version Client-Serveur complète
51%
En retard de plus de 14 ans (30/10/2010)
Version Client-Serveur complète
51%
En retard de plus de 14 ans (16/11/2010)
FriLogos version C/EFL nextgen
76%
En retard de plus de 13 ans (12/01/2011)
Mise en place des fonctionnalités complémentaires
75%
En retard de plus de 13 ans (13/03/2011)
Première étape stable
11%
En retard de plus de 12 ans (23/04/2012)
Le temps de la consolidation a sonné
93%
En retard de plus de 11 ans (05/05/2013)
Première version Qt
50%
En retard de plus de 11 ans (30/06/2013)
Version intégrant les modifications de fin avril 2013
92%
En retard de plus de 11 ans (11/07/2013)
Intégration comme abuledu utilitaire
0%
2 demandes (0 fermée — 2 ouvertes)
En retard de plus de 10 ans (31/05/2014)
Nouvelle version en Qt 5.x
54%
Échéance dans plus de 5 ans (23/07/2030)
Idées absoluement géniales qu'on développera un jour si on trouve comment et si on a le temps ... ça fait rêver !
100%
9 demandes (9 fermées — 0 ouverte)
Ancienne version programmée en TCL/TK (pour archives)
Aucune demande pour cette version
Fichiers "réservés" aux développeurs
Aucune demande pour cette version
Aucune demande pour cette version
Version un peu spéciale pour accrocher tous les développements qui peuvent faire l'objet d'une mission ponctuelle de développement (cf https://redmine.ryxeo.com/projects/ryxeo/wiki/Missions_Ponctuelles)
0%
2 demandes (0 fermée — 2 ouvertes)
Version un peu spéciale pour accrocher toutes les demandes qui peuvent faire l'objet d'une mission ponctuelle graphique (cf https://redmine.ryxeo.com/projects/ryxeo/wiki/Missions_Ponctuelles)
63%
Version un peu spéciale pour accrocher toutes les demandes qui peuvent faire l'objet d'une mission ponctuelle de ressources (cf https://redmine.ryxeo.com/projects/ryxeo/wiki/Missions_Ponctuelles)
30%
3 demandes (0 fermée — 3 ouvertes)
Les paquets en attente de validation
Aucune demande pour cette version
Aucune demande pour cette version
Vu qu'il semble interdit (ref: http://www.activestate.com/activetcl/license-agreement) de prendre un morceau d'active-tcl pour le diffuser à nos utilisateurs je me suis lancé dans la compilation de TCL/TK sous windows à partir du code source du projet.
On croit rêver et on se demande si c'est possible de restreindre ainsi les droits d'un logiciel qui est sous licence GNU/GPL:
4. Restrictions.
1. a. Except as expressly provided herein You may not: (i) permit others outside Your organization to use the Software; (ii) modify or translate the Software; (iii) reverse engineer, decompile, or disassemble the Software, except to the extent this restriction is expressly prohibited by applicable law; (iv) create derivative works based on the Software; (v) merge the Software with another product; (vi) copy the Software; (vii) remove or obscure any proprietary rights notices or labels on the Software; (vii) (a) redistribute the Software as a whole whether as a wrapped application or on a stand alone basis, (b) use its parts to create a language distribution, or (c) redistribute the ACTIVESTATE components with Your Wrapped Application.
pour chaque répertoire de ce dossier, par exemple pour tcl
Le résultat se trouve dans /opt/tcl. Par rapport à la racine windows, ça se trouve ici: C:\MinGW\msys\1.0\opt\tcl
Pour créer l'équivalent du setup-tcl.exe que nous utilisons depuis des années, il faut créer un fichier iss comme suit:
; Script generated by the Inno Setup Script Wizard. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! #define MyAppName "TCL/TK pour AbulEdu" #define MyAppVersion "8.5.9" #define MyAppPublisher "RyXeo SARL" #define MyAppURL "http://www.abuledu.org/" [Setup] ; NOTE: The value of AppId uniquely identifies this application. ; Do not use the same AppId value in installers for other applications. ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId={{F5429D87-D7E1-47C4-B69D-507BD91EA92F} AppName={#MyAppName} AppVersion={#MyAppVersion} ;AppVerName={#MyAppName} {#MyAppVersion} AppPublisher={#MyAppPublisher} AppPublisherURL={#MyAppURL} AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} DefaultDirName={pf}\TCL DefaultGroupName={#MyAppName} DisableProgramGroupPage=yes OutputBaseFilename=setup Compression=lzma SolidCompression=yes [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" Name: "french"; MessagesFile: "compiler:Languages\French.isl" [Files] Source: opt\tcl\bin\*.*; DestDir: {app}\bin\ Source: opt\tcl\bin\wish85.exe; DestDir: {app}\bin\; DestName: wish.exe Source: opt\tcl\lib\*.*; DestDir: {app}\lib\; Flags: recursesubdirs [Registry] Root: HKCR; SubKey: .tcl; ValueType: string; ValueData: TclScript; Flags: uninsdeletekey Root: HKCR; SubKey: TclScript; ValueType: string; ValueData: TclScript; Flags: uninsdeletekey Root: HKCR; SubKey: TclScript\Shell\Open\Command; ValueType: string; ValueData: """{app}\bin\wish.exe"" ""%1"""; Flags: uninsdeletevalue
Il faut compiler la DLL de kidistb à partir de cette nouvelle version de TCL/TK
Modification pour passage à snack 2.2 cf tcl.tk (eric) à tester et valider, notes prises rapidement:
package require -exact snack 2.2
au lieu de
#switch [info tclversion] {+ modification du code pour avoir
set currentson [file join $Home sons $son$ext]
snack::sound s -file $currentson
s play -block 1
-> semble pb de play (son haché)
Aucune demande pour cette version
Aucune demande pour cette version
Premier prototype du logiciel
Aucune demande pour cette version
Les plugins/modules étant tous indépendants du moteur (Core), leur compilation se fera désormais séparément.
Ils implémentent tous l'interface IPlugin de l'API, doivent se voir appliquer tous les changements apportés à cette interface, et constitueront chacun un projet à part entière.
Le projet représentant le développement d'un plugin sera un sous projet du projet principal et sera hébergé dans le répertoire du module concerné, lui même se trouvant dans le répertoire Plugins des sources.
Ainsi pour les plugins livrés par défaut avec le logiciel, on fera un CMakLists.txt de compilation globale de tous les modules, et un CMakeLists.txt de chaque plugin, se trouvant dans son répertoire.
Ci-joint un template de CMakeLists.txt, personnalisable en fonction du module sur lequel on travail.
Cette 5° version du logiciel sera la première a être développée en QT/C++
99%
En 2011 nous lançons le re-développement de ALLER en QT/C++. La 1ère décision a été de choisir le nom du logiciel, ça sera donc ALLER version 5.0, la dernière en TCL/TK étant 4.x :)
Lors des travaux de Juillet 2011 à Concots, il a été décidé de porter Aller 5.0 sur le nouveau (pour nous) paradigme de QStateMachine. Les deux classes AbulEduStateMachineV1 et AbulEduCommonStatesV1 constituent le moteur du logiciel. Elles gèrent le déroulement de la séquence d'exercices (eux-mêmes composés de questions).
Le schéma de fonctionnement de AbulEduStateMachine est visible ici Boite A OutilsV1
Attention, le dépot utilise le plugin bzr-externals pour savoir comment l'installer, aller ici
puis faire en console :
bzr branch http://redmine.ryxeo.com/code/leterrier-aller/version-5.0
On peut s'inspirer d'une séquence déjà créée comme exerciceordrealpha1. Sinon, j'ai ajouter dans le dépôt les fichiers maquette.cpp et .h qui peuvent servir de démarrage. Pensez à bien les renommer et à modifier toutes les références à maquette dans ces deux fichiers ;-)
Il va falloir ajouter au bon endroit les élèments constitutifs de votre séquence.
À cet endroit, on va créer, initialiser les objets qui vont servir par la suite comme des ZoneEtiquette (ici gv_listeMot) ou des DropZone (gv_tableau).
Il faut le faire à cet endroit sinon ils risquent dêtre initialiser plusieurs fois, et ça va couiner !
AbulEduMaquette::AbulEduMaquette() :
AbulEduOutilsV1()
{
setWindowTitle(abeApp->getAbeApplicationLongName()+"--"+trUtf8("Ordre Alphabétique"));
m_prefixeTetes="pingouin"; // A adapter en fonction des têtes désirées
m_tailleTetes = 0;
gv_listeMot = new ZoneEtiquette(QRectF(0,100,100,100)); // exemple à supprimer
gv_listeMot->setBrush(QColor(Qt::gray)); // exemple à supprimer
gv_tableau = new DropZone(QRectF(0,100,100,100)); // exemple à supprimer
sequenceMachine->start();
}
La ligne sequenceMachine->start(); lance la séquence et hop !
C'est dans les différents slots appelés par la AbulEduStateMachine sous-jacente que l'on va pouvoir insérer toute l'intelligence métier (pédagogique)!
Le premier slot disponible est SlotSequenceEntered() normalement, on n'y passe qu'une fois tout de suite après le démarrage de la StateMachine.
C'est le bon endroit pour définir des variables d'ordre général, entre autre celle servant au push des log utilisateur.
void ExerciceOrdreAlpha1::slotSequenceEntered()
{
qDebug()<<" AbulEduOrdreAlpha1::slotSequenceEntered()";
setAbeLevel("niveau 1");
setAbeNbExercices(2);
//on lance directement le 1er exo de la sequence
setAbeExerciceName("Ordre Alphabétique - Exercice 1");
setAbeNbTotalQuestions(1);
//Quelques customisations
ui->btnAccueilDemo->setVisible(false);
teConsigne->setFixedSize(400,200);
teConsigne->setStyleSheet("background-color:qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(214, 214, 214, 255), stop:1 rgba(167, 165, 164, 255))");
// Determine si on présente la séquence ou pas.
onPeutPresenterSequence = true;
// Determine si on présente l'exercice ou pas.
onPeutPresenterExercice = true;
// Determine si on affiche le bilan de l'exercice
onPeutPresenterBilanExercice = true;
// Préparation des exercices
JEVEUXCOLORIERETIQUETTESMALPLACEES=1;
AbulEduCommonStatesV1::slotSequenceEntered(); // ligne à conserver
m_prefixeTetes="pingouin";
m_tailleTetes = 64;
ui->gvPrincipale->scene()->addItem(gv_listeMot); // exemple à supprimer
ui->gvPrincipale->scene()->addItem(gv_tableau); // exemple à supprimer
gv_listeMot->setVisible(false); // exemple à supprimer
gv_tableau->setVisible(false); // exemple à supprimer
D'une manière générale, toutes les lignes faisant appel à AbulEduCommonStates::Slot... ou AbulEduStateMachine::Slot... sont à conserver !
La variable booléenne onPeutPresenterSequence décidera d'afficher ou non la présentation de la séquence qui se fait comme suit :
void ExerciceOrdreAlpha1::slotPresenteSequenceEntered()
{
qDebug()<<" AbulEduOrdreAlpha1::slotPresenteSequenceEntered();";
// Normalement, on n'efface pas cette ligne, sinon tant pis
AbulEduCommonStatesV1::slotPresenteSequenceEntered();
teConsigne->setHtml(trUtf8("Ici, on affiche les consignes générales de la séquence\n"
"On peut mettre du html avec des images, des tableaux..."));
}
L'animation visible à ce moment peut être modifiée dans AbulEduCommonStates, c'est une classe prévue pour cela. Si on les modifie dans AbulEduCommonStates, elles le seront pour toutes les séquences. Elles doivent aussi pouvoir être redéfinies pour une seule séquence, mais il faut trouver le bon endroit ;-)
La variable booléenne onPeutPresenterExercice décidera d'afficher ou non la présentation de la séquence qui se fait comme suit :
void ExerciceOrdreAlpha1::slotPresentationExerciceEntered()
{
qDebug()<<" AbulEduOrdreAlpha1::slotPresenteExoEntered();------";
teConsigne->setHtml(trUtf8("<font color=#ff0000>Affichage des consignes de l'exercice</font>"));
AbulEduCommonStatesV1::slotPresentationExerciceEntered();
}
Si l'on veut que cette présentation ne se fasse qu'une fois, il faut mettre onPeutPresenterExercice à false comme ci-dessous
Ici on va préparer les questions : initialisation des variables liées à la question qui va être proposée.
void ExerciceOrdreAlpha1::slotInitQuestionEntered()
{
qDebug()<<" AbulEduOrdreAlpha1::slotInitQuestionEntered();";
onPeutPresenterExercice = false;
m_listeMots = m_listeExo.value(m_numExercice); // exemple à supprimer
AbulEduCommonStatesV1::slotInitQuestionEntered(); // Ne pas enlever sinon...
afficheMots(); // exemple à supprimer
gv_listeMot->setVisible(true); // exemple à supprimer
gv_tableau->setVisible(true); // exemple à supprimer
}
C'est à ce moment qu'il va falloir insérer tout le code permettant la réalisation de l'exercice par l'utilisateur. L'autre partie essentielle vient juste après, c'est la vérification de la réponse proposée.
void ExerciceOrdreAlpha1::slotQuestionEntered()
{qDebug()<<" AbulEduOrdreAlpha1::slotQuestionEntered()";
setDimensionsWidgets(); // Place les Widgets à leur place
AbulEduCommonStatesV1::slotQuestionEntered();
ui->pbarQuestion->setVisible(false); // Je cache un des widgets fournis par défaut
}
Bon, oui, d'accord, là il n'y a pas de code pour l'exercice. C'est parce que les éléments que j'ai déposés au préalable sont suffisament intelligents pour se débrouiller tout seul !
Sinon, je vous conseille d'insérer dans ce bloc une fonction qui déportera le code exercice plus bas. Cela permet de garder de la lisibilité, mais vous faites comme vous voulez !
Quand l'utilisateur aura cliqué sur le bouton vérifier, on entrera dans le slot ci-dessous :
void ExerciceOrdreAlpha1::slotVerificationQuestionEntered()
{
qDebug()<<" AbulEduOrdreAlpha1::slotVerificationQuestionEntered()";
int rep = verifieReponse(); // Le code de vérification est déporté plus bas
//et on passe au parent pour qu'il s'occupe de l'enchaînement
//si on souhaite beneficier de l'enchainement par defaut, sinon on
//implemente ici les sequenceMachine->postEvent(new StringEvent("Questionredo"));
//and co ad-hoc et on commente la ligne ci-dessous
AbulEduStateMachineV1::slotVerificationQuestionEntered();
// if(verifieReponse()==0)
// {
// sequenceMachine->postEvent(new StringEvent("Questionsdone"));
// }
// else
// {
// sequenceMachine->postEvent(new StringEvent("Questionredo"));
// }
}
Ici, il y a quelques subtilités : la fonction verifieReponse() retourne un entier représentant le nombre d'erreur : 0 pas d'erreur, on passe à la suite.
L'appel à AbulEduStateMachineV1::slotVerificationQuestionEntered(); permet de passer à la question suivante s'il y en a encore, sinon on passe à l'exercice suivant s'il en reste sinon, on s'oriente vers la sortie !
Mais ce comportement ne convient pas forcément à tous les types d'exercice : par exemple, si la réponse n'est pas bonne, l'utilisateur doit modifier sa réponse juste qu'à ce que le résultat soit celui attendu.
C'est ce que l'on fait en appelant sequenceMachine->postEvent(new StringEvent("Questionredo")); dans le cas contraire, on appelle : sequenceMachine->postEvent(new StringEvent("Questionloop")); ou sequenceMachine->postEvent(new StringEvent("Questionsdone")); s'il n'y a plus de question dans l'exercice. Dans mon cas, j'appelle directement "Questionsdone" car il n'y a qu'une question par exercice !
Il y a deux types de bilans : ceux des exercices et celui de la séquence. Le contenu de ces bilan est à votre charge, non mais ! faut travailler un peu !
void ExerciceOrdreAlpha1::slotBilanExerciceEntered()
{
qDebug()<<" AbulEduOrdreAlpha1::slotBilanExerciceEntered();";
gv_listeMot->setVisible(false); //exemple à supprimer
gv_tableau->setVisible(false); //exemple à supprimer
boiteTetes->setEtatTete(m_numExercice, 1); // affichage des têtes pour évaluation
AbulEduCommonStatesV1::slotBilanExerciceEntered();
}
void ExerciceOrdreAlpha1::slotBilanSequenceEntered()
{
qDebug()<<" AbulEduOrdreAlpha1::slotBilanSequenceEntered();------";
teBilan->setHtml(trUtf8("BILAN DE LA SÉQUENCE")+"\n");
AbulEduCommonStatesV1::slotBilanSequenceEntered();
}
Rien de bien complexe ici. Il faudra cependant consulter la doc de AbulEduTeteV1 pour l'utiliser correctement !
Pour toute demande de fonctionnalité ou rapport de bug, cliquez en haut de page sur nouvelle demande et hop !
ou écrivez un mail à dev@abuledu.org
Aucune demande pour cette version
Aucune demande pour cette version
Ressources mises à disposition pour le logiciel
Aucune demande pour cette version
Aucune demande pour cette version
Pour tester le portage vers android
Aucune demande pour cette version
Version proposant au moins autant de fontionnalités que le logiciel de départ
100%
Dans la version 1.0 de Chronosphère je vise à minima: proposer à peu près les mêmes fonctionnalités que kworldclock de kde version 3.5.9.
Ensuite on partira des besoins pédagogiques pour calibrer le développement.
Aucune demande pour cette version
Aucune demande pour cette version
Aucune demande pour cette version
Aucune demande pour cette version
Nouvelle implémentation en QT/C++
Aucune demande pour cette version
Version initiale en TCL/TK
Aucune demande pour cette version
Aucune demande pour cette version