void CGUIControl::QueueAnimation(ANIMATION_TYPE animType) { MarkDirtyRegion(); if (!CheckAnimation(animType)) return; CAnimation *reverseAnim = GetAnimation((ANIMATION_TYPE)-animType, false); CAnimation *forwardAnim = GetAnimation(animType); // we first check whether the reverse animation is in progress (and reverse it) // then we check for the normal animation, and queue it if (reverseAnim && reverseAnim->IsReversible() && (reverseAnim->GetState() == ANIM_STATE_IN_PROCESS || reverseAnim->GetState() == ANIM_STATE_DELAYED)) { reverseAnim->QueueAnimation(ANIM_PROCESS_REVERSE); if (forwardAnim) forwardAnim->ResetAnimation(); } else if (forwardAnim) { forwardAnim->QueueAnimation(ANIM_PROCESS_NORMAL); if (reverseAnim) reverseAnim->ResetAnimation(); } else { // hidden and visible animations delay the change of state. If there is no animations // to perform, then we should just change the state straightaway if (reverseAnim) reverseAnim->ResetAnimation(); UpdateStates(animType, ANIM_PROCESS_NORMAL, ANIM_STATE_APPLIED); } }
bool SWP::CLauflicht::KonvertiereString(stSequenz &sBefehl) { if(sBefehl.sOriginal.empty() == true) //Sequenz ist leer { std::cerr << "Leere Sequenzen sind ungültig!" << std::endl; m_bFlagFail = true; return false; } //Uhrzeitbehandlung (Keine Animationen vor Uhrzeit, wenn kein Text in der Sequenz ist) CheckClock(sBefehl); //Zeichenketten auf Animationen prüfen (Prüfen ob vor jeder Zeichenkette eine Animation ist) CheckAnimation(sBefehl); if(m_bFlagFail == true) { return false; } /** int iColors[3]: Dient zur Speicherung der Farbwerte iColors[COLOR_FG]: Vordergrundfarbe iColors[COLOR_BG]: Hintergrundfarbe iColors[COLOR_FB]: Berechnete Farbenkombination (Addition aus Vorder-/Hintergrundfarbe) */ int iColors[3]; iColors[COLOR_FG] = 3; iColors[COLOR_BG] = 0; iColors[COLOR_FB] = 3; //Autocenter und Left behandeln AutoLeft(sBefehl); //Temporäre Variable zur Verarbeitung anlegen (beinhaltet den aktuellen Befehl std::wstring sTemp; //Start der Konvertierung - der fertige Befehl wird in sBefehl.sKonvertiert gespeichert for(unsigned int i = 0;i < sBefehl.sOriginal.length() && m_bFlagFail == false;i++) { sTemp = L""; if(sBefehl.sOriginal[i] == '<') //Befehlsanfang wurde gefunden { for(;sBefehl.sOriginal[i] != '>';i++) //Den kompletten Befehl einlesen { sTemp += sBefehl.sOriginal[i]; } sTemp += '>'; //Da bei '>' die Schleife abgebrochen wird, muss das Zeichen für das Ende des Befehls //hinzugefügt werden if(sTemp == L"<BIG>") //Prüfen, ob der Befehl BIG vorliegt { m_bFlagBig = true; continue; } if(sTemp == L"<NORMAL>") //Prüfen, ob der Befehl NORMAL vorliegt { m_bFlagBig = false; continue; } //Prüfen, ob Hintergrundfarbe vorliegt if(sTemp == L"<BGCOLOR b>" || sTemp == L"<BGCOLOR r>" || sTemp == L"<BGCOLOR g>" || sTemp == L"<BGCOLOR y>") { if(iColors[COLOR_FB] == 32) //Farbe Rainbow { if(sTemp != L"<BGCOLOR b>") //Bei Regenbogen: Schwarzen Hintergrund ignorieren { //Bei Hintergrundänderung auf Schriftfarbe Gelb schalten iColors[COLOR_FG] = GetCode(L"<COLOR y>"); iColors[COLOR_BG] = GetCode(sTemp); iColors[COLOR_FB] = iColors[COLOR_FG] + iColors[COLOR_BG]; } } else if((sTemp == L"<BGCOLOR b>") && (iColors[COLOR_FG] == GetCode(L"<COLOR b>"))) { m_bFlagFail = true; std::cerr << "Schwarzer Hintergrund und Textfarbe verboten!" << std::endl; } else { iColors[COLOR_BG] = GetCode(sTemp); iColors[COLOR_FB] = iColors[COLOR_FG] + iColors[COLOR_BG]; } }//Prüfen, ob Vordergrundfarbe vorliegt else if(sTemp == L"<COLOR b>" || sTemp == L"<COLOR r>" || sTemp == L"<COLOR g>" || sTemp == L"<COLOR y>") { //Farbe in Tabelle nachschauen und Variablen aktualisieren iColors[COLOR_FG] = GetCode(sTemp); iColors[COLOR_FB] = iColors[COLOR_FG] + iColors[COLOR_BG]; } else if(sTemp == L"<COLOR rainbow>") { /* Der Hintergrund muss schwarz sein - Rainbow lässt keinen anderen Hintergrund zu. */ iColors[COLOR_FG] = GetCode(sTemp); iColors[COLOR_BG] = 0; iColors[COLOR_FB] = iColors[COLOR_FG] + iColors[COLOR_BG]; } else if(sTemp == L"<CLOCK24>" || sTemp == L"<CLOCK12>") { sBefehl.sKonvertiert += 143; //Clockbefehl sBefehl.sKonvertiert += GetCode(sTemp); //12h oder 24h Uhr } else if(sTemp.find(L"WAIT") != std::wstring::npos) { char c = sTemp[sTemp.find(' ') + 1]; //Sekundenanzahl speichern if(c != '0') //Falls Sekunden != 0, dann WAIT ignorieren { sBefehl.sKonvertiert += GetCode(L"<WAIT>"); sBefehl.sKonvertiert += c;//GetCode(L&c); } } else if(sTemp.find(L"SPEED") != std::wstring::npos) { char c = sTemp[sTemp.find(' ') + 1]; //Geschwindigkeit speichern sBefehl.sKonvertiert += GetCode(L"<SPEED>"); sBefehl.sKonvertiert += c; } else { //Befehl in der Codetabelle nachschauen und konvertieren: sBefehl.sKonvertiert += GetCode(sTemp); sBefehl.sKonvertiert += 3; //Befehl nur bestimmte Farben! } } //if(sBefehl.sOriginal[i] == '<')... else //Wenn kein Befehl gefunden wurde, dann muss es normaler Text sein { sTemp = sBefehl.sOriginal[i]; //Prüfen, ob Sonderzeichen vorliegen (Sonderzeichen müssen gesondert behandelt werden) if(sTemp == L"Ω" || sTemp == L"Σ" || sTemp == L"¤" || sTemp == L"æ" || sTemp == L"£" || sTemp == L"🍷" || sTemp == L"♪" || sTemp == L"🚗" || sTemp == L"⛵" || sTemp == L"🕓" || sTemp == L"♥" || sTemp == L"⌂" || sTemp == L"◆" || sTemp == L"▲" || sTemp == L"▶" || sTemp == L"▼" || sTemp == L"◀" || sTemp == L"☉" || sTemp == L"⬆" || sTemp == L"⬇" || sTemp == L"⇦" || sTemp == L"⇨" || sTemp == L"[" || sTemp == L"]" || sTemp == L"_" ) { sBefehl.sKonvertiert += GetCode(L"<GRAPH>"); sBefehl.sKonvertiert += GetCode(sTemp, m_bFlagBig); } else if(sTemp == L"€") { switch(iColors[0]) { case 2: //Grünes Eurozeichen verwenden sTemp += 'G'; break; case 1: //Rotes Eurozeichen verwenden sTemp += 'R'; break; default: //Für die restlichen Farben das gelbe Eurozeichen verwenden sTemp += 'Y'; break; } sBefehl.sKonvertiert += GetCode(L"<GRAPH>"); sBefehl.sKonvertiert += GetCode(sTemp, m_bFlagBig); } //Bei Zeichen kommt erst die Farbe, anschließend das Zeichen else if(sTemp == L"\\") //Escapezeichen { i++; //Wegen Escapezeichen muss weitergeschaltet werden sTemp = sBefehl.sOriginal[i]; //Nächstes Zeichen abholen if(sTemp == L"\\") //Dieses Zeichen gibt es nur als Grafik { sBefehl.sKonvertiert += GetCode(L"<GRAPH>"); sBefehl.sKonvertiert += GetCode(L"\\", m_bFlagBig); } else //Für die Zeichen '<', '>' { sBefehl.sKonvertiert += iColors[COLOR_FB]; //Farbe sBefehl.sKonvertiert += GetCode(sTemp, m_bFlagBig); //Zeichen } } else { //Wenn es kein \ ist, dann ist es ein normales Zeichen sBefehl.sKonvertiert += iColors[COLOR_FB]; //Farbe sBefehl.sKonvertiert += GetCode(sTemp, m_bFlagBig); //Zeichen } m_iLetters++; } } //Start- und Endsequenz std::string SKonvertiertTemp; //Lauflicht initialisieren, sonst Gerät nicht ansprechbar for(int i = 0; i < 10; i++) { SKonvertiertTemp += GetCode(L"<INIT>"); } //Sequenzstart signalisieren SKonvertiertTemp += GetCode(L"<START>"); //Programmwahl im Lauflicht (für die Website wird immer Programm A benutzt SKonvertiertTemp += GetCode(L"<PROGRAM->"); SKonvertiertTemp += GetCode(L"A"); SKonvertiertTemp += sBefehl.sKonvertiert; sBefehl.sKonvertiert = SKonvertiertTemp; //Endbefehl hinzufügen sBefehl.sKonvertiert += GetCode(L"<END>"); sBefehl.sKonvertiert += 177; //Leider unbekannter Befehl, dient aber vermutlich zur Löschung der vorherigen Sequenz sBefehl.sKonvertiert += GetCode(L"<END>"); if(m_bFlagFail == false) //Sequenz erfolgreich konvertiert { return true; } else //Sequenzkonvertierung fehlgeschlagen { return false; } }