Hauptseite | Klassenhierarchie | Alphabetische Liste | Übersicht | Auflistung der Dateien | Datenstruktur-Elemente | Datei-Elemente

lftvideodialog.cpp

gehe zur Dokumentation dieser Datei
00001 // lftvideodialog.cpp
00002 // LFTVideo.cpp  v1.71
00003 //               14.5.2003
00004 // 
00005 // für weitere Informationen:
00006 // siehe header von main.cpp
00007 
00008 #include "lftvideodialog.h"
00009 
00010 #include <qframe.h>
00011 #include <qpushbutton.h>
00012 #include <qlcdnumber.h>
00013 #include <qslider.h>
00014 #include <qlabel.h>
00015 #include <qlineedit.h>
00016 #include <qradiobutton.h>
00017 #include <qbuttongroup.h>
00018 #include <qmessagebox.h>
00019 #include <math.h>                       // for floor()
00020 
00021 LFTVideoDialog::LFTVideoDialog( QWidget* parent, 
00022                                                             const char* name, bool modal, WFlags f )
00023         : LFTVideoDialogBase( parent, name, modal, f )
00024 {
00025         this->setProperty( "caption", tr( "v1.76 LFTVideo" ) );
00026 
00027         KonfigDialog=new SitzungsKonfigurationDialog ( this, "KonfigDialog", TRUE,
00028                 Qt::WStyle_Customize | Qt::WStyle_Title  | Qt::WStyle_SysMenu);
00029 
00030         QFont *dialog_font=new QFont (  KonfigDialog->font() );
00031         dialog_font->setFamily( "Arial" ); 
00032         dialog_font->setPointSize( 8 );
00033         KonfigDialog->setFont ( *dialog_font, TRUE) ;
00034         BtTherapeut_NLF->setText("nicht\nLös.Sprache (6)");
00035         BtTherapeut_NLF->setProperty( "accel", 268435510 );
00036         BtKlient_NLF->setText("nicht\nLös.Sprache (3)");
00037         BtKlient_NLF->setProperty( "accel", 268435507 );
00038 
00039         // signals and slots connections for buttons
00040         connect( (const QObject*) BtKonfiguration, SIGNAL(clicked() ),
00041                 this, SLOT(openKonfigDialog() ) );
00042         connect( (const QObject*) BtRun, SIGNAL(toggled(bool) ),
00043                 this, SLOT(RatingBeginnOderPause(bool) ) );
00044         connect ((const QObject*) BtGrpRating, SIGNAL(pressed(int)),
00045                 this, SLOT(SpeichereRatingButton(int)) );
00046         connect ((const QObject*) BtSave, SIGNAL(pressed()),
00047                 this, SLOT(RatingEnde()) );
00048         connect ((const QObject*) BtKorrigieren, SIGNAL(toggled(bool)),
00049                 this, SLOT(KorrigierenSchalter(bool)) );
00050         connect ((const QObject*) PushButtonCountdown, SIGNAL(toggled(bool)),
00051                 this, SLOT(CountdownStart(bool)) );
00052         // Countdown Timer:
00053         CountdownTimer=new QTimer();
00054         connect( CountdownTimer, SIGNAL(timeout()),
00055              this, SLOT(Countdown()) );
00056 
00057         // der LCD update Timer:
00058         zaehlwerk=new QTime();
00059         SekundenTimer=new QTimer();
00060         connect( SekundenTimer, SIGNAL(timeout()),
00061              this, SLOT(aktualisiereZeitanzeige()) );
00062         connect( SldSecs, SIGNAL(valueChanged(int)),
00063                 this, SLOT(SliderCheckFaerbung()) );
00064         connect( SldMins, SIGNAL(valueChanged(int)),
00065                 this, SLOT(SliderCheckFaerbung()) );
00066 
00067         // Neubeginn Speicher und GUI:
00068         initNullSetzungen(); // NEW RatingVerlauf, weitergeführt=false, 
00069                                                  // Anzahl->0, Dauer->0, letzteEinsch->0
00070                              // Sld->0, Run->disabled, Counter->disabled,
00071                                                  // KonfigOK->disabled, KonfigKlient->""
00072 };
00073 
00074 // helper
00075 QString giveDateStamp (){
00076         QDate d=QDate::currentDate();
00077         QString ts="%1%2%3"; 
00078         ts=ts.arg(d.year())
00079                  .arg(leadingZero(d.month()))
00080                  .arg(leadingZero(d.day()));
00081         return ts;
00082 };
00083 
00084 QString giveTimeStamp (){
00085         QTime t=QTime::currentTime();
00086         QString ts="%1%2%3"; 
00087         ts=ts.arg(leadingZero(t.hour()))
00088                  .arg(leadingZero(t.minute()))
00089                  .arg(leadingZero(t.second()));
00090         return ts;
00091 };
00092 
00093 void LFTVideoDialog::initNullSetzungen(){
00094 
00095         Verlauf=new RatingVerlauf();
00096         weitergefuehrteSession=false;
00097         PauseGedrueckt=false;
00098         TextLabelAnzahl->setText("0");
00099         TextLabelMittlereDauer->setText("00:00");
00100         letzterEinschaetzungsZeitpunkt=MinSec(0,0);
00101         // resette Zaehlwerk
00102         SldSecs->setValue(0);
00103         SldMins->setValue(0);
00104         // zuerst muss immer Konfiguration ausgefüllt werden, sonst geht gar nix:
00105         FrmRun->setEnabled(false);
00106         FrmCounter->setEnabled(false);
00107         KonfigDialog->buttonOk->setEnabled(false);
00108         KonfigDialog->LineEditKlient->setText("");
00109 }
00110 
00111 void LFTVideoDialog::CountdownStart(bool start){
00112         if (start){
00113                 CountdownTimer->stop();
00114                 CountdownTimer->start(500);
00115                 BtRun->setText("10");
00116                 infoline1->setText("Wichtig ist eine SEHR genaue Synchronisierung "
00117                                        "mit dem Videocounter! Bitte im Zweifel mehrmals "
00118                                                    "versuchen...");
00119         }
00120 }
00121 
00122 void LFTVideoDialog::Countdown(){
00123         int i=BtRun->text().toInt();
00124         i--;
00125         if (i<0) {
00126                 CountdownTimer->stop();
00127                 BtRun->setText("&Run");
00128                 infoline1->setText("");
00129                 this->setEnabled(true);
00130                 BtRun->toggle();
00131                 PushButtonCountdown->toggle();
00132         }else{
00133                 QString temp="%1";
00134                 temp=temp.arg(i);
00135                 BtRun->setText(temp);
00136         }
00137 }
00138 
00139 
00140 void LFTVideoDialog::SliderCheckFaerbung (){
00141         MinSec slider(SldMins->value(), SldSecs->value());
00142 
00143         if (   ! (letzterEinschaetzungsZeitpunkt < slider) 
00144                 && ! (letzterEinschaetzungsZeitpunkt==MinSec(0,0)))
00145         {
00146                 LCDSecs->setPalette( QPalette( QColor(255,70,70) ) );
00147                 LCDMins->setPalette( QPalette( QColor(255,70,70) ) );
00148                 infoline2->setText("dieser Zeit-Bereich wurde schon eingeschätzt!!!"
00149                         "   Bitte nicht nochmal einschätzen, das führt garantiert zu "
00150                         "Chaos...");
00151         }else{
00152                 if (LCDSecs->palette() == QPalette( QColor(255,70,70) ) ){
00153                         LCDSecs->unsetPalette( );
00154                         LCDMins->unsetPalette( );
00155                         infoline2->setText("");
00156                 }
00157         }
00158 }
00159 
00160 void LFTVideoDialog::KorrigierenSchalter(bool toggled){
00161         if(toggled){
00162                 //qDebug("on");
00163                 FrmKorrigieren->setPalette( QPalette( QColor(255,70,70) ) );
00164                 infoline2->setPalette( QPalette( QColor(255,70,70) ) );
00165 
00166                 falscherButton=Verlauf->RatingAuslesen(Verlauf->BisherLetzterMoment())
00167                         .Einschaetzung;
00168                 if (falscherButton){
00169                         BtGrpRating->find(falscherButton)->
00170                                               setPalette( QPalette( QColor(255,150,150) ) );
00171                         infoline2->setText("Bitte nun die letzte Entscheidung korrigieren");
00172                 } else infoline2->setText("nix zu korrigieren...");
00173         }else{
00174                 //qDebug("off");
00175                 FrmKorrigieren->unsetPalette( );
00176                 infoline2->unsetPalette( );
00177                 if (falscherButton>0)
00178                         BtGrpRating->find(falscherButton)->unsetPalette(  );
00179                 BtKorrigieren->setOn(false);
00180                 infoline2->setText("");
00181         }
00182 }
00183 
00184 void LFTVideoDialog::SpeichereRatingButton(int BtNumber){
00185         if (BtKorrigieren->isOn()){
00186                 //qDebug("Korrektur");
00187                 MinSec letzterEintrag=Verlauf->BisherLetzterMoment();
00188                 if (letzterEintrag==MinSec(0,0))
00189                         infoline2->setText("Noch nix zu korrigieren.");
00190                 else 
00191                 {
00192                         Verlauf->RatingLoeschen (letzterEintrag);
00193                         Verlauf->RatingAnhaengen(letzterEintrag,(RatingSkala)BtNumber);
00194                         infoline2->setText("Die letzte Einschaetzung wurde korrigiert.");
00195                 }
00196                 KorrigierenSchalter(false);
00197 
00198         }else
00199         {
00200                 MinSec Zeitpunkt=MinSec(vergangeneMinuten(), vergangeneSekunden());
00201                 Verlauf->RatingAnhaengen(Zeitpunkt, (RatingSkala) BtNumber);
00202                 // qDebug(Zeitpunkt.toQString()+" %d", BtNumber);
00203 
00204                 // Anzahl-Anzeige
00205                 int anz=TextLabelAnzahl->text().toInt() + 1 ;
00206                 QString temp="%1";
00207                 temp=temp.arg(anz);
00208                 TextLabelAnzahl->setText(temp);
00209                 // Durchschnittsdauer-Anzeige
00210                 double dauer= Zeitpunkt.toSecs() / (double) anz;
00211                 temp=MinSec(0, dauer).toQString();
00212                 TextLabelMittlereDauer->setText(temp);
00213         }
00214 }
00215 
00216 void LFTVideoDialog::RatingEnde(){
00217         MinSec Zeitpunkt=MinSec(vergangeneMinuten(), vergangeneSekunden());
00218         // qDebug("Gesamter Verlauf bis "+Zeitpunkt.toQString()+" :");
00219         // qDebug(Verlauf->printGesamtenRatingVerlauf(MinSec(0,0), Zeitpunkt));
00220 
00221         // SPEICHERE Verlauf 
00222         VerlaufSpeichern *Speicherer=new VerlaufSpeichern (this);
00223         Speicherer->setzePointerAufDaten(Verlauf);
00224         QString filenameVerlauf= Speicherer->gibFilename(
00225                 KonfigDialog->LineEditKlient->text(),
00226                 KonfigDialog->LineEditRater->text());
00227         bool erfolgreichVerlauf;
00228         erfolgreichVerlauf = Speicherer->
00229                                    speichereDaten(filenameVerlauf,"Rating Verlauf");
00230         delete Speicherer;
00231     qDebug("Speichern war erfolgreich: %d",erfolgreichVerlauf);
00232 
00233         // SPEICHERE Info
00234         InfoSpeichern *InfoSpeicherer=new InfoSpeichern (this);
00235         InfoSpeicherer->merkDirDaten(TextLabelAnzahl->text(), 
00236                                                                  TextLabelMittlereDauer->text(),
00237                                                                  Verlauf->BisherLetzterMoment(),
00238                                                                  weitergefuehrteSession,
00239                                                                  PauseGedrueckt);
00240         QString filenameInfo= InfoSpeicherer->gibFilename(
00241                   KonfigDialog->LineEditKlient->text(),
00242                   KonfigDialog->LineEditRater->text());
00243         bool erfolgreichInfo;
00244         erfolgreichInfo = InfoSpeicherer->
00245                                     speichereDaten(filenameInfo,"Rating Verlauf");
00246         delete InfoSpeicherer;
00247     qDebug("InfoSpeichern war erfolgreich: %d",erfolgreichInfo);
00248 
00249         if (erfolgreichVerlauf && erfolgreichInfo){
00250                 infoline1->setText("Verlauf und Info gespeichert: "
00251                 +filenameVerlauf+" und "+filenameInfo);
00252                 infoline2->setText("Alle flüchtigen Daten gelöscht,\n"
00253                                        "Neubeginn möglich.");
00254         }else {
00255                 infoline1->setText("Irgendwelche Speicherprobleme\n"
00256                 "Am besten nochmal versuchen...");
00257                 return;
00258         }
00259         
00260         // TODO: Auswerten
00261 
00262         // zerstöre Daten:
00263         Verlauf->Sinneinheiten.clear();
00264         delete Verlauf;
00265 
00266         // Neubeginn Speicher und GUI:
00267         initNullSetzungen(); // NEW RatingVerlauf, weitergeführt=false, 
00268                                                  // Anzahl->0, Dauer->0, letzteEinsch->0
00269                              // Sld->0, Run->disabled, Counter->disabled,
00270                                                  // KonfigOK->disabled, KonfigKlient->""
00271 
00272 }
00273 
00274 
00275 double LFTVideoDialog::vergangeneZeitInSekunden(){
00276         double secs = StartLCDSekunden+StartLCDMinuten*60;
00277         // vergangene MILLIsekunden sind nur im laufenden Timer gespeichert
00278         if (SekundenTimer->isActive()) 
00279                 secs += ((double) zaehlwerk->elapsed()) / (double) 1000;
00280         return secs;
00281 }
00282 
00283 
00284 double LFTVideoDialog::vergangeneSekunden(){
00285         double secs=vergangeneZeitInSekunden();
00286         int nurSecs=((int) secs) % 60;
00287         return nurSecs + nachkomma(secs);
00288 }
00289 
00290 int LFTVideoDialog::vergangeneMinuten(){
00291         int mins=vergangeneZeitInSekunden()/60;
00292         return mins;
00293 }
00294 
00295 void LFTVideoDialog::aktualisiereZeitanzeige(){
00296         int secs=(int) vergangeneZeitInSekunden();
00297         SldSecs->setValue(secs%60);
00298         int mins=vergangeneMinuten();
00299         SldMins->setValue(mins);
00300 };
00301 
00302 
00303 void LFTVideoDialog::RatingBeginnOderPause(bool beginn){
00304 
00305         if(beginn){
00306                 // TODO / EVTL: Sicherste Variante wäre LÖSCHEN der Restdaten!
00307                 // Wenn restart, dann checken, ob schon gerateter Bereich 
00308                 // betroffen, (dann Abfrage und bei OK:)
00309                 // den ganzen Rest löschen (die Folge wäre Neu-Rating!)
00310                 // bei Cancel: RatingBeginnOderPause(false)
00311 
00312                 infoline1->setText("Abschalten des Run-Buttons "
00313                         "PAUSIERT das Zählwerk (nur benutzen wenn NICHT die "
00314                         "Inter-Rater-Übereinstimmung gemessen werden muss!)");
00315                 infoline2->setText("Das Zählwerk läuft. Am Ende jeder Sinneinheit "
00316                                        "eine der 7 Tasten drücken.");
00317 
00318                 StartLCDSekunden=LCDSecs->value();
00319                 StartLCDMinuten=LCDMins->value();
00320                 SldMins->setEnabled(false);
00321                 SldSecs->setEnabled(false);
00322                 if(MinSec(0,0) < Verlauf->BisherLetzterMoment() ){
00323                         qDebug("pause gedrückt"); // taucht später in _info.dat auf
00324                         PauseGedrueckt=true;      // macht nämlich inter-Rater-Vergleich schwerer!
00325                 }
00326                 zaehlwerk->restart();
00327                 SekundenTimer->stop();
00328                 SekundenTimer->start(1000);
00329         } else
00330         {
00331                 infoline1->setText("Zählwerk angehalten (PAUSE)");
00332                 infoline2->setText("");
00333                 SekundenTimer->stop();
00334                 KorrigierenSchalter(false);
00335                 letzterEinschaetzungsZeitpunkt=Verlauf->BisherLetzterMoment();
00336                 SldMins->setEnabled(true);
00337                 SldSecs->setEnabled(true);
00338         }
00339 }
00340 
00341 void LFTVideoDialog::openKonfigDialog(){
00342 
00343         // TODO / EVTL: 
00344         // Im Falle von Cancel die alten Einträge wiederherstellen?
00345 
00346         KonfigDialog->LineEditDatum->setText(QDate::currentDate().toString());
00347         KonfigDialog->LineEditUhrzeit->setText(QTime::currentTime().toString());
00348         KonfigDialog->show();
00349 
00350         // wenn's geht mit alten Daten weitermachen 
00351         if (   KonfigDialog->ja->isChecked() 
00352                 && KonfigDialog->TextLabelExistiert->text()=="schon")
00353         {
00354                 VerlaufSpeichern *Speicherer=new VerlaufSpeichern (this);
00355                 Speicherer->setzePointerAufDaten(Verlauf);
00356                 QString filename= Speicherer->gibFilename(
00357                         KonfigDialog->LineEditKlient->text(),
00358                         KonfigDialog->LineEditRater->text());
00359                 bool erfolgreich = Speicherer->leseDaten(filename,"Rating Verlauf");
00360                 if (erfolgreich) {
00361                         weitergefuehrteSession=true; 
00362 
00363                         if (MinSec(0,0) < Verlauf->BisherLetzterMoment()) // schon Daten da?
00364                                 PauseGedrueckt=true;  // TODO: Die ist vereinfachend.
00365                                                   // Besser wäre dies aus _Info auszulesen
00366                                                   // Denn nur einlesen und sofort wieder speichern
00367                                                   // macht nix kaputt an Zeitkohärenz...
00368                 }
00369                 delete Speicherer;
00370                 QString infotext="Daten wurden";
00371                 infotext+=(erfolgreich?" ":" NICHT ");
00372                 infotext+="erfolgreich aus ";
00373                 infotext+=filename;
00374                 infotext+=" eingelesen";
00375                 infoline1->setText(infotext);
00376 
00377                 letzterEinschaetzungsZeitpunkt=Verlauf->BisherLetzterMoment();
00378                 SldMins->setValue(letzterEinschaetzungsZeitpunkt.mins());
00379                 SldSecs->setValue(letzterEinschaetzungsZeitpunkt.secs());
00380 
00381                 // Anzahl-Anzeige
00382                 int anz=Verlauf->Sinneinheiten.size()-1 ; // -1 wegen Nullpunkt
00383                 QString temp="%1";
00384                 temp=temp.arg(anz);
00385                 TextLabelAnzahl->setText(temp);
00386                 // Durchschnittsdauer-Anzeige
00387                 double dauer= letzterEinschaetzungsZeitpunkt.toSecs() / (double) anz;
00388                 temp=MinSec(0, dauer).toQString();
00389                 TextLabelMittlereDauer->setText(temp);
00390         }
00391 
00392         if (KonfigDialog->buttonOk->isEnabled()){
00393                 infoline1->setText("OK. Es kann losgehen...");
00394                 FrmRun->setEnabled(true);
00395                 FrmCounter->setEnabled(true);
00396         }else   {
00397                 infoline1->setText("Zuerst die Sitzung konfigurieren");
00398                 FrmRun->setEnabled(false);
00399                 FrmCounter->setEnabled(false);
00400         }
00401 };
00402 
00403 
00404 LFTVideoDialog::~LFTVideoDialog()
00405 // ein umfangreicher Destruktor, der erst mit dem Nutzer schimpft
00406 // und dann versucht, die Daten unter einem Timestamp-Namen abzuspeichern.
00407 // 
00408 {
00409         int verloren=Verlauf->Sinneinheiten.size();
00410         MinSec arbeitszeit=Verlauf->BisherLetzterMoment();
00411 
00412         if (verloren>1)
00413         {
00414                 QString dasDatum="SIKO_"; dasDatum+=giveDateStamp();
00415                 QString dieZeit=giveTimeStamp();
00416                 QString filename1=(dasDatum + "_" + dieZeit +"_info.dat").lower();
00417                 QString filename2=(dasDatum + "_" + dieZeit +"_verlauf.dat").lower();
00418 
00419                 QString temp="Vor dem Beenden dieses Programmes müssen die Daten IMMER "
00420                                  "manuell per 'Ende'-Taste abge-SPEICHER-t werden.\n\nFast wären "
00421                                          "die wertvollen %1 Sinneinheiten verloren gewesen, die in "
00422                                          "mühseliger %2 dauernden Arbeitszeit eingegeben wurden.\n"
00423                                          "Also: Bitte immer als letztes 'Ende' drücken, dann erst das "
00424                                          "Programm schliessen!\n\nIch werde nun versuchen, eine "
00425                                          "Sicherheitskopie der Daten abzuspeichern unter: \n%3\n%4\n\n"
00426                                          "Nach Kopieren und manuellem Umbenennen ins normale Schema "
00427                                          "können die Daten dann einfach\nmittels "
00428                                          "'angefangene Sitzung weiterführen' eingelesen und neu "
00429                                          "abgespeichert werden.\n\n"
00430                                          "Vielleicht nochmal Glück gehabt? Schaun wir mal, ob das "
00431                                          "Speichern nun klappt ...";
00432                 temp=temp.arg(verloren)
00433                              .arg(arbeitszeit.toQString())
00434                                  .arg(filename1).arg(filename2);
00435                 QMessageBox::critical( this, "LFTVideo - so beenden ist VERBOTEN!", 
00436                                               temp);
00437 
00438                 VerlaufSpeichern *Speicherer=new VerlaufSpeichern (this);
00439                  Speicherer->setzePointerAufDaten(Verlauf);
00440                  QString filenameVerlauf=Speicherer->gibFilename(dasDatum, dieZeit);
00441                  bool erfolgreichVerlauf = Speicherer->
00442                                            speichereDaten(filenameVerlauf,"Rating Verlauf");
00443                 delete Speicherer;
00444                 qDebug("Verlauf Speichern war erfolgreich: %d",erfolgreichVerlauf);
00445 
00446                 InfoSpeichern *InfoSpeicherer=new InfoSpeichern (this);
00447                  InfoSpeicherer->merkDirDaten(TextLabelAnzahl->text(), 
00448                                                                  TextLabelMittlereDauer->text(),
00449                                                                  Verlauf->BisherLetzterMoment(),
00450                                                                  weitergefuehrteSession,
00451                                                                  PauseGedrueckt);
00452                  QString filenameInfo= InfoSpeicherer->gibFilename(dasDatum, dieZeit);
00453                  bool erfolgreichInfo;
00454                  erfolgreichInfo = InfoSpeicherer->
00455                                     speichereDaten(filenameInfo,"Rating Verlauf");
00456                 delete InfoSpeicherer;
00457                 qDebug("InfoSpeichern war erfolgreich: %d",erfolgreichInfo);
00458         }
00459         
00460         // zerstöre Daten:
00461         Verlauf->Sinneinheiten.clear();  delete Verlauf;
00462         delete KonfigDialog, CountdownTimer, SekundenTimer;
00463 
00464     // no need to delete child widgets, Qt does it all for us
00465 }

Erzeugt am Mon Jun 16 18:08:23 2003 für LFTVideo von doxygen 1.3.2