MeOS version 3.5.860

This commit is contained in:
Erik Melin 2018-04-21 21:59:00 +02:00
parent 5327deebbb
commit b53348f17f
26 changed files with 2629 additions and 204 deletions

View File

@ -987,20 +987,46 @@ void PunchMachine::process(gdioutput &gdi, oEvent *oe, AutoSyncType ast)
{ {
#ifndef MEOSDB #ifndef MEOSDB
SICard sic(ConvertedTimeStatus::Hour24); SICard sic(ConvertedTimeStatus::Hour24);
oe->generateTestCard(sic);
SportIdent &si = TabSI::getSI(gdi); SportIdent &si = TabSI::getSI(gdi);
if (radio == 0) {
oe->generateTestCard(sic);
if (!sic.empty()) { if (!sic.empty()) {
if (!radio) si.addCard(sic); if (!radio) si.addCard(sic);
} }
else gdi.addInfoBox("", L"Failed to generate card.", interval*2); else gdi.addInfoBox("", L"Failed to generate card.", interval * 2);
}
if (radio && !sic.empty()) { else {
pRunner r=oe->getRunnerByCardNo(sic.CardNumber, 0, false); SICard sic(ConvertedTimeStatus::Hour24);
if (r && r->getCardNo()) { vector<pRunner> rr;
sic.CardNumber=r->getCardNo(); oe->getRunners(0, 0, rr);
sic.punchOnly=true; vector<pRunner> cCand;
sic.nPunch=1; vector<pFreePunch> pp;
sic.Punch[0].Code=radio; for (auto r : rr) {
if (r->getStatus() == StatusUnknown && r->startTimeAvailable()) {
auto pc = r->getCourse(false);
if (radio < 10 || pc->hasControlCode(radio)) {
pp.clear();
oe->getPunchesForRunner(r->getId(), pp);
bool hit = false;
for (auto p : pp) {
if (p->getTypeCode() == radio)
hit = true;
}
if (!hit)
cCand.push_back(r);
}
}
}
if (cCand.size() > 0) {
int ix = rand() % cCand.size();
pRunner r = cCand[ix];
sic.convertedTime = ConvertedTimeStatus::Done;
sic.CardNumber = r->getCardNo();
sic.punchOnly = true;
sic.nPunch = 1;
sic.Punch[0].Code = radio;
sic.Punch[0].Time = 600 + rand() % 1200 + r->getStartTime();
si.addCard(sic); si.addCard(sic);
} }
} }

View File

@ -432,7 +432,7 @@ int TabClass::multiCB(gdioutput &gdi, int type, void *data)
wstring st=gdi.getText("StartTime"); wstring st=gdi.getText("StartTime");
int nst = oe->convertAbsoluteTime(st); int nst = oe->convertAbsoluteTime(st);
if (warnDrawStartTime(gdi, nst)) { if (nst >= 0 && warnDrawStartTime(gdi, nst, true)) {
nst = 3600; nst = 3600;
st = oe->getAbsTime(nst); st = oe->getAbsTime(nst);
} }
@ -876,9 +876,11 @@ int TabClass::classCB(gdioutput &gdi, int type, void *data)
} }
else else
specs[ci.classId].push_back(cds); specs[ci.classId].push_back(cds);
maxST = max(cds.firstStart + drawInfo.nFields * drawInfo.baseInterval * ci.interval, maxST);
} }
if (warnDrawStartTime(gdi, maxST)) if (warnDrawStartTime(gdi, maxST, false))
return 0; return 0;
for (map<int, vector<ClassDrawSpecification> >::iterator it = specs.begin(); for (map<int, vector<ClassDrawSpecification> >::iterator it = specs.begin();
@ -1409,7 +1411,7 @@ int TabClass::classCB(gdioutput &gdi, int type, void *data)
else if (bi.id=="DoDrawBefore") else if (bi.id=="DoDrawBefore")
dtype = oEvent::remainingBefore; dtype = oEvent::remainingBefore;
else { else {
if (warnDrawStartTime(gdi, t)) if (warnDrawStartTime(gdi, t, false))
return 0; return 0;
} }
//bool pairwise = false; //bool pairwise = false;
@ -4181,11 +4183,14 @@ void TabClass::setLockForkingState(gdioutput &gdi, bool poolState, bool lockStat
bool TabClass::warnDrawStartTime(gdioutput &gdi, const wstring &firstStart) { bool TabClass::warnDrawStartTime(gdioutput &gdi, const wstring &firstStart) {
int st = oe->getRelativeTime(firstStart); int st = oe->getRelativeTime(firstStart);
return warnDrawStartTime(gdi, st); return warnDrawStartTime(gdi, st, false);
} }
bool TabClass::warnDrawStartTime(gdioutput &gdi, int time) { bool TabClass::warnDrawStartTime(gdioutput &gdi, int time, bool absTime) {
if (!hasWarnedStartTime && time > 3600 * 8 && !oe->useLongTimes()) { if (absTime)
time = oe->getRelativeTime(formatTimeHMS(time));
if (!hasWarnedStartTime && (time > 3600 * 11 && !oe->useLongTimes())) {
bool res = gdi.ask(L"warn:latestarttime#" + itow(time/3600)); bool res = gdi.ask(L"warn:latestarttime#" + itow(time/3600));
if (res) if (res)
hasWarnedStartTime = true; hasWarnedStartTime = true;

View File

@ -82,7 +82,7 @@ class TabClass :
void pursuitDialog(gdioutput &gdi); void pursuitDialog(gdioutput &gdi);
bool warnDrawStartTime(gdioutput &gdi, int time); bool warnDrawStartTime(gdioutput &gdi, int time, bool absTime);
bool warnDrawStartTime(gdioutput &gdi, const wstring &firstStart); bool warnDrawStartTime(gdioutput &gdi, const wstring &firstStart);
void static clearPage(gdioutput &gdi, bool autoRefresh); void static clearPage(gdioutput &gdi, bool autoRefresh);

View File

@ -1710,6 +1710,13 @@ int TabCompetition::competitionCB(gdioutput &gdi, int type, void *data)
else if (bi.id=="DoFreeImport") { else if (bi.id=="DoFreeImport") {
fi.addEntries(oe, entries); fi.addEntries(oe, entries);
entryText.clear(); entryText.clear();
// Update qualification/final
vector<pClass> cls;
oe->getClasses(cls, false);
for (pClass c : cls) {
c->updateFinalClasses(0, false);
}
loadPage(gdi); loadPage(gdi);
} }
else if (bi.id=="Startlist") { else if (bi.id=="Startlist") {
@ -2377,7 +2384,8 @@ void TabCompetition::loadAboutPage(gdioutput &gdi) const
"\n\nDanish Translation by Michael Leth Jess and Chris Bagge" "\n\nDanish Translation by Michael Leth Jess and Chris Bagge"
"\n\nRussian Translation by Paul A. Kazakov and Albert Salihov" "\n\nRussian Translation by Paul A. Kazakov and Albert Salihov"
"\n\nOriginal French Translation by Jerome Monclard" "\n\nOriginal French Translation by Jerome Monclard"
"\n\nAdaption to French conditions and extended translation by Pierre Gaufillet"); "\n\nAdaption to French conditions and extended translation by Pierre Gaufillet"
"\n\nCzech Translation by Marek Kustka");
gdi.dropLine(); gdi.dropLine();
gdi.addString("", 0, "Det här programmet levereras utan någon som helst garanti. Programmet är "); gdi.addString("", 0, "Det här programmet levereras utan någon som helst garanti. Programmet är ");
@ -2514,7 +2522,7 @@ bool TabCompetition::loadPage(gdioutput &gdi)
gdi.dropLine(1.2); gdi.dropLine(1.2);
gdi.addCheckbox("LongTimes", "Aktivera stöd för tider över 24 timmar", CompetitionCB, oe->useLongTimes()); gdi.addCheckbox("LongTimes", "Aktivera stöd för tider över 24 timmar", CompetitionCB, oe->useLongTimes());
if (oe->isClient()) { if (false && oe->isClient()) {
gdi.popX(); gdi.popX();
gdi.disableInput("ZeroTime"); gdi.disableInput("ZeroTime");
gdi.disableInput("LongTimes"); gdi.disableInput("LongTimes");
@ -3502,6 +3510,12 @@ TabCompetition::FlowOperation TabCompetition::saveEntries(gdioutput &gdi, bool r
} }
} }
// Update qualification/final
vector<pClass> cls;
oe->getClasses(cls, false);
for (pClass c : cls) {
c->updateFinalClasses(0, false);
}
return FlowContinue; return FlowContinue;
} }

View File

@ -1124,7 +1124,7 @@ wstring TabCourse::encodeCourse(const wstring &in, bool firstStart, bool lastFin
out.reserve(in.length() * 2); out.reserve(in.length() * 2);
wstring bf; wstring bf;
for (size_t i = 0; i < newC.size(); ++i) { for (size_t i = 0; i < newC.size(); ++i) {
if (i == 0) { if (i == 0 && (newC.size() > 1 || firstStart)) {
out += lang.tl("Start"); out += lang.tl("Start");
if (firstStart) if (firstStart)
out += L"(" + itow(newC[i]) + L")"; out += L"(" + itow(newC[i]) + L")";
@ -1141,6 +1141,9 @@ wstring TabCourse::encodeCourse(const wstring &in, bool firstStart, bool lastFin
out += dash; out += dash;
if (i+1 == newC.size()) { if (i+1 == newC.size()) {
if (i == 0) {
out = lang.tl("Start") + dash;
}
if (lastFinish) if (lastFinish)
out += lang.tl("Mål") + L"(" + itow(newC[i]) + L")"; out += lang.tl("Mål") + L"(" + itow(newC[i]) + L")";
else else

View File

@ -111,9 +111,6 @@ void TabSI::logCard(gdioutput &gdi, const SICard &card)
extern SportIdent *gSI; extern SportIdent *gSI;
extern pEvent gEvent; extern pEvent gEvent;
void LoadRunnerPage(gdioutput &gdi);
int SportIdentCB(gdioutput *gdi, int type, void *data) { int SportIdentCB(gdioutput *gdi, int type, void *data) {
TabSI &tsi = dynamic_cast<TabSI &>(*gdi->getTabs().get(TSITab)); TabSI &tsi = dynamic_cast<TabSI &>(*gdi->getTabs().get(TSITab));
@ -1580,17 +1577,6 @@ bool TabSI::loadPage(gdioutput &gdi) {
gdi.addInput("C" + itos(i+1), itow(c), 3, 0, L"#C" + itow(i+1)); gdi.addInput("C" + itos(i+1), itow(c), 3, 0, L"#C" + itow(i+1));
} }
/*
gdi.addInput("C1", "33", 5, 0, "#C1");
gdi.addInput("C2", "34", 5, 0, "#C2");
gdi.addInput("C3", "45", 5, 0, "#C3");
gdi.addInput("C4", "50", 5, 0, "#C4");
gdi.addInput("C5", "61", 5, 0, "#C5");
gdi.addInput("C6", "62", 5, 0, "#C6");
gdi.addInput("C7", "67", 5, 0, "#C7");
gdi.addInput("C8", "100", 5, 0, "#C8");
*/
gdi.dropLine(); gdi.dropLine();
gdi.addButton("Save", "Bricka", SportIdentCB); gdi.addButton("Save", "Bricka", SportIdentCB);
@ -1666,7 +1652,7 @@ bool TabSI::loadPage(gdioutput &gdi) {
gdi.dropLine(2); gdi.dropLine(2);
gdi.setRestorePoint("SIPageLoaded"); gdi.setRestorePoint("SIPageLoaded");
if (mode==ModeReadOut) { if (mode == ModeReadOut) {
gdi.addButton("Import", "Importera från fil...", SportIdentCB); gdi.addButton("Import", "Importera från fil...", SportIdentCB);
gdi.setRestorePoint("Help"); gdi.setRestorePoint("Help");
@ -1677,7 +1663,7 @@ bool TabSI::loadPage(gdioutput &gdi) {
gdi.dropLine(); gdi.dropLine();
} }
else if (mode==ModeAssignCards) { else if (mode == ModeAssignCards) {
gdi.dropLine(1); gdi.dropLine(1);
showAssignCard(gdi, true); showAssignCard(gdi, true);
} }
@ -3867,6 +3853,19 @@ void TabSI::handleAutoComplete(gdioutput &gdi, AutoCompleteInfo &info) {
directEntryGUI.updateFees(gdi, cls, getThisYear() - year); directEntryGUI.updateFees(gdi, cls, getThisYear() - year);
} }
} }
if (r) {
if (gdi.hasField("Club") && r->dbe().clubNo) {
if (gdi.getText("Club").empty()) {
auto pclub = oe->getRunnerDatabase().getClub(r->dbe().clubNo);
if (pclub)
gdi.setText("Club", pclub->getName());
}
}
if (gdi.hasField("CardNo") && r->dbe().cardNo) {
if (gdi.getText("CardNo").empty())
gdi.setText("CardNo", r->dbe().cardNo);
}
}
} }
} }
gdi.clearAutoComplete(""); gdi.clearAutoComplete("");

View File

@ -31,7 +31,7 @@ class csvparser;
struct AutoCompleteRecord; struct AutoCompleteRecord;
class TabSI : public TabBase, AutoCompleteHandler { class TabSI : public TabBase, AutoCompleteHandler {
public: public:
enum SIMode { enum SIMode {
ModeReadOut, ModeReadOut,
ModeAssignCards, ModeAssignCards,
@ -40,6 +40,7 @@ class TabSI : public TabBase, AutoCompleteHandler {
ModeCardData ModeCardData
}; };
void setMode(SIMode m) { mode = m; }
private: private:
/** Try to automatcally assign a class to runner (if none is given) /** Try to automatcally assign a class to runner (if none is given)
Return true if runner has a class on exist */ Return true if runner has a class on exist */

View File

@ -1 +0,0 @@
encoding = EASTEUROPE

View File

@ -1 +0,0 @@
encoding = HEBREW

2316
code/czech.lng Normal file

File diff suppressed because it is too large Load Diff

View File

@ -16,6 +16,39 @@
[Radera] = [Slet] [Radera] = [Slet]
[Uppdaterad anmälan] = [Opdateret tilmelding] [Uppdaterad anmälan] = [Opdateret tilmelding]
[VARNING] ingen/okänd = [ADVARSEL] ingen/ukendt [VARNING] ingen/okänd = [ADVARSEL] ingen/ukendt
ÅÅÅÅ-MM-DD = ÅÅÅÅ-MM-DD
Åldersfilter = Aldersfilter
Åldersgräns äldre = Aldersgrænse ældre
Åldersgräns ungdom = Aldersgrænse ungdom
Åldersgränser, reducerad anmälningsavgift = Aldersgrænser, reduceret løbsafgift
Ångra = Fortryd
Återansluten mot databasen, tävlingen synkroniserad = Gentilsluttet til databasen, løbet synkroniseret
Återbud = Slet tilmelding
Återbud[status] = Afbud
Återgå = Gå tilbage
Återskapa = Gendan
Återskapa tidigare sparade fönster- och speakerinställningar = Gendan vidues- og speakerindstillinger.
Återställ / uppdatera klasstillhörighet = Gendan / opdater klassetilhørsforhold
Återställ <Ej Start> till <Status Okänd> = Tilbagefør <Ej Startet> till <Status ukendt>
Återställ = Fortryd
Återställ löpare <Ej Start> med registrering till <Status Okänd> = Gendan løber med status <Ikke startet> til <Status ukendt>
Återställ säkerhetskopia = Gendan fra sikkerhedskopi
Återställ tabeldesignen och visa allt = Gendan tabeldesign og vis alt
övriga = øvrige
är först i mål med tiden X = er først i mål med tiden X
är först vid växeln med tiden X = er først ved skiftet med tiden X
är först vid X med tiden Y = er først ved X med tiden Y
är inte godkänd = er diskvalificeret
är nu på delad X plats med tiden Y = er nu på delt X plads med tiden Y
är nu på X plats med tiden Y = er nu på X plads med tiden Y
är X efter = er X efter
är X efter Y = er X efter Y
är X efter; har tagit in Y = er X efter; har indhentet Y
är X efter; har tappat Y = er X efter; har tabt Y
är X före Y = er X foran Y
återställd = gendannet
åtta = otte
åttonde = ottende
Ökande = Stigende Ökande = Stigende
Öppen = Åben Öppen = Åben
Öppen klass = Åben klasse Öppen klass = Åben klasse
@ -56,39 +89,6 @@
Ändra X = Ændr X Ändra X = Ændr X
Ändrad = Ændret Ändrad = Ændret
Ändrade avgift för X deltagare = Ændret afgift for X deltager(e) Ändrade avgift för X deltagare = Ændret afgift for X deltager(e)
är först i mål med tiden X = er først i mål med tiden X
är först vid växeln med tiden X = er først ved skiftet med tiden X
är först vid X med tiden Y = er først ved X med tiden Y
är inte godkänd = er diskvalificeret
är nu på delad X plats med tiden Y = er nu på delt X plads med tiden Y
är nu på X plats med tiden Y = er nu på X plads med tiden Y
är X efter = er X efter
är X efter Y = er X efter Y
är X efter; har tagit in Y = er X efter; har indhentet Y
är X efter; har tappat Y = er X efter; har tabt Y
är X före Y = er X foran Y
återställd = gendannet
åtta = otte
åttonde = ottende
övriga = øvrige
ÅÅÅÅ-MM-DD = ÅÅÅÅ-MM-DD
Åldersfilter = Aldersfilter
Åldersgräns äldre = Aldersgrænse ældre
Åldersgräns ungdom = Aldersgrænse ungdom
Åldersgränser, reducerad anmälningsavgift = Aldersgrænser, reduceret løbsafgift
Ångra = Fortryd
Återansluten mot databasen, tävlingen synkroniserad = Gentilsluttet til databasen, løbet synkroniseret
Återbud = Slet tilmelding
Återbud[status] = Afbud
Återgå = Gå tilbage
Återskapa = Gendan
Återskapa tidigare sparade fönster- och speakerinställningar = Gendan vidues- og speakerindstillinger.
Återställ / uppdatera klasstillhörighet = Gendan / opdater klassetilhørsforhold
Återställ <Ej Start> till <Status Okänd> = Tilbagefør <Ej Startet> till <Status ukendt>
Återställ = Fortryd
Återställ löpare <Ej Start> med registrering till <Status Okänd> = Gendan løber med status <Ikke startet> til <Status ukendt>
Återställ säkerhetskopia = Gendan fra sikkerhedskopi
Återställ tabeldesignen och visa allt = Gendan tabeldesign og vis alt
Accepterade elektroniska fakturor = Godkendte elektroniske fakturaer Accepterade elektroniska fakturor = Godkendte elektroniske fakturaer
Adress = Adresse Adress = Adresse
Adress och kontakt = Adresse og kontakt Adress och kontakt = Adresse og kontakt
@ -527,11 +527,10 @@ Extra avstånd ovanför textblock = Ekstra plads over tekstblok
Extra stämplingar = Ekstra stemplinger Extra stämplingar = Ekstra stemplinger
Extralöparstafett = Ekstraløberstafet Extralöparstafett = Ekstraløberstafet
Extraplatser = Ekstra pladser Extraplatser = Ekstra pladser
Färg = Farve
Födelseår = Fødselsår Födelseår = Fødselsår
Följande deltagare överfördes ej = Følgende deltagere blev ikke overført
Följande deltagare är anmälda till nästa etapp men inte denna = Følgende deltagere er tilmeldt næste etape, men ikke denne Följande deltagare är anmälda till nästa etapp men inte denna = Følgende deltagere er tilmeldt næste etape, men ikke denne
Följande deltagare är nyanmälda = Følgende deltagere er nytilmeldte Följande deltagare är nyanmälda = Følgende deltagere er nytilmeldte
Följande deltagare överfördes ej = Følgende deltagere blev ikke overført
Följande deltagare deltar ej = Følgende deltagere deltager ikke Följande deltagare deltar ej = Følgende deltagere deltager ikke
Följande deltagare har bytt klass (inget totalresultat) = Følgende deltagere har skiftet klasse (intet samlet resultat) Följande deltagare har bytt klass (inget totalresultat) = Følgende deltagere har skiftet klasse (intet samlet resultat)
Följande deltagare har bytt klass = Følgende deltagere har skiftet klasse Följande deltagare har bytt klass = Følgende deltagere har skiftet klasse
@ -567,6 +566,7 @@ Förväntad andel efteranmälda = Forventet andel eftertilmeldte
Förväntat antal besökare: X = Forventet antal deltagere: X Förväntat antal besökare: X = Forventet antal deltagere: X
Förvarning på (SI-kod): alla stämplingar = Forvarsel (SI kode): alle stemplinger Förvarning på (SI-kod): alla stämplingar = Forvarsel (SI kode): alle stemplinger
Förvarningsröst = Forvarselsstemme Förvarningsröst = Forvarselsstemme
Färg = Farve
Failed to generate card = FEJL: Kunne ikke indlæse Failed to generate card = FEJL: Kunne ikke indlæse
Failed to open 'X' for reading = FEJL: Kunne ikke læse 'X' Failed to open 'X' for reading = FEJL: Kunne ikke læse 'X'
Failed to read file = Kunne ikke læse fil Failed to read file = Kunne ikke læse fil
@ -680,6 +680,8 @@ Grund avg. = Grundafg.
Grundavgift = Grundafgift Grundavgift = Grundafgift
Grundinställningar = Grundindstillinger Grundinställningar = Grundindstillinger
Gruppera = Grupper Gruppera = Grupper
Hög avgift = Forhøjet afgift
Höger = Højre
Hämta (efter)anmälningar från Eventor = Hent (efter)tilmeldinger fra Eventor Hämta (efter)anmälningar från Eventor = Hent (efter)tilmeldinger fra Eventor
Hämta data från Eventor = Hent data fra Eventor Hämta data från Eventor = Hent data fra Eventor
Hämta efteranmälningar = Hent eftertilmeldinger Hämta efteranmälningar = Hent eftertilmeldinger
@ -697,8 +699,6 @@ Hämtar löpardatabasen = Henter løberdatabasen
Hämtar tävling = Henter løb Hämtar tävling = Henter løb
Händelser - tidslinje = Begivenheder - tidslinje Händelser - tidslinje = Begivenheder - tidslinje
Händelser = Begivenheder Händelser = Begivenheder
Hög avgift = Forhøjet afgift
Höger = Højre
handskakning = handshaking handskakning = handshaking
Hantera brickor = Håndter brikker Hantera brickor = Håndter brikker
Hantera deltagare som bytt klass = Håndtering af deltagere der har skiftet klasse Hantera deltagare som bytt klass = Håndtering af deltagere der har skiftet klasse
@ -856,6 +856,7 @@ Informationsserver = Informationsserver
Inga = Ingen Inga = Ingen
Inga bommar registrerade = Inga bommar registrerade =
Inga deltagare = Ingen deltagere Inga deltagare = Ingen deltagere
Inga klasser tillåter direktanmälan. På sidan klasser kan du ändra denna egenskap. = Ingen klasser tillader tilmeldong på stævneplads.\n\nDu kan ændre dette på siden klasser.
Inga vakanser tillgängliga. Vakanser skapas vanligen vid lottning = Ingen vakante. Vakante pladser oprettes normalt ved lodtrækning Inga vakanser tillgängliga. Vakanser skapas vanligen vid lottning = Ingen vakante. Vakante pladser oprettes normalt ved lodtrækning
Ingen / okänd = Ingen / ukendt Ingen / okänd = Ingen / ukendt
Ingen = Ingen Ingen = Ingen
@ -908,19 +909,19 @@ IOF Startlista, version 3.0 (xml) = IOF Startliste, version 3.0 (xml)
IP-adress eller namn på en MySQL-server = IP addresse eller navn på en MySQL server IP-adress eller namn på en MySQL-server = IP addresse eller navn på en MySQL server
Italic = Kursiv Italic = Kursiv
ItalicMediumPlus = Kursiv, større ItalicMediumPlus = Kursiv, større
Ja = Ja
Jämna klasser (placering) = Udjævn klasser (placering) Jämna klasser (placering) = Udjævn klasser (placering)
Jämna klasser (ranking) = Udjævn klasser (ranking) Jämna klasser (ranking) = Udjævn klasser (ranking)
Jämna klasser (tid) = Udjævn klasser (tid) Jämna klasser (tid) = Udjævn klasser (tid)
Ja = Ja
Jag sköter lottning själv = Jeg foretager lodtrækning manuelt Jag sköter lottning själv = Jeg foretager lodtrækning manuelt
Jaktstart = Jagtstart Jaktstart = Jagtstart
Justera blockvis = Blokvis justering Justera blockvis = Blokvis justering
Justera mot = Juster i forhold til Justera mot = Juster i forhold til
Justera visningsinställningar = Juster visningsindstilninger Justera visningsinställningar = Juster visningsindstilninger
Källa = Kilde(fra)
Källkatalog = Mappe at hente fra
Kön = Køn Kön = Køn
Kör kontroll inför tävlingen = Foretag kontrol før løbet Kör kontroll inför tävlingen = Foretag kontrol før løbet
Källa = Kilde(fra)
Källkatalog = Mappe at hente fra
Kalkylblad/csv = Regneark/csv Kalkylblad/csv = Regneark/csv
kartor = kort kartor = kort
klar = færdig klar = færdig
@ -986,8 +987,8 @@ Kontant = Kontant
Kontant betalning = Kontant betaling Kontant betalning = Kontant betaling
Konto = Konto Konto = Konto
Kontroll %s = Post %s Kontroll %s = Post %s
kontroll = post
Kontroll = Post Kontroll = Post
kontroll = post
Kontroll inför tävlingen = Kontrol før løbet Kontroll inför tävlingen = Kontrol før løbet
kontroll X (Y) = post X (Y) kontroll X (Y) = post X (Y)
Kontroll X = Post X Kontroll X = Post X
@ -1017,30 +1018,6 @@ Kval-Final-Schema = Kval-Finale-Skema
Kvar-i-skogen = Løbere i skoven Kvar-i-skogen = Løbere i skoven
Kvinna = Kvinde Kvinna = Kvinde
Kvinnor = Kvinder Kvinnor = Kvinder
Lägg till = Tilføj
Lägg till alla = Tilføj alle
Lägg till en ny rad i tabellen (X) = Tilføj række i tabellen (X)
Lägg till klasser = Tilføj klasser
Lägg till ny = Tilføj ny
Lägg till ny etapp = Tilføj ny etape
Lägg till rad = Tilføj række
Lägg till stämpling = Tilføj stempling
Lägger till klubbar = Tilføjer klubber
Lägger till löpare = Tilføjer løbere
Längd (m) = Længde (m)
Längd = Længde
Längsta svarstid: X ms = Længste svarstid: X ms
Längsta tid i sekunder att vänta med utskrift = Det længste, i sekunder, der ventes med udskrift
Länk till resultatlistan = Link til resultatlisten
Länk till startlistan = Link til startlisten
Läs brickor = Læs brikker
Läser klubbar = Læser klubber
Läser löpare = Læser løbere
Långt namn = Langt navn
Lås gafflingar = Lås gafflinger
Lås startlista = Lås startliste
Låt de bästa start först = Lad de bedste starte først
Låt klassen ha mer än en bana eller sträcka = Lad klassen have mere end en bane eller en tur
Löpande = Løbende Löpande = Løbende
Löpande information om viktiga händelser i tävlingen = Løbende information om vigtige begivenheder i løbet Löpande information om viktiga händelser i tävlingen = Løbende information om vigtige begivenheder i løbet
Löparbricka %d = Løberbrik %d Löparbricka %d = Løberbrik %d
@ -1063,6 +1040,30 @@ Löpare: X, kontroll: Y, kl Z = Løber: X, post: Y, kl: Z
Löparen hittades inte = Løber ikke fundet Löparen hittades inte = Løber ikke fundet
Löptid = Løbstid Löptid = Løbstid
Lösenord = Password Lösenord = Password
Lägg till = Tilføj
Lägg till alla = Tilføj alle
Lägg till en ny rad i tabellen (X) = Tilføj række i tabellen (X)
Lägg till klasser = Tilføj klasser
Lägg till ny = Tilføj ny
Lägg till ny etapp = Tilføj ny etape
Lägg till rad = Tilføj række
Lägg till stämpling = Tilføj stempling
Lägger till klubbar = Tilføjer klubber
Lägger till löpare = Tilføjer løbere
Längd (m) = Længde (m)
Längd = Længde
Längsta svarstid: X ms = Længste svarstid: X ms
Längsta tid i sekunder att vänta med utskrift = Det længste, i sekunder, der ventes med udskrift
Långt namn = Langt navn
Länk till resultatlistan = Link til resultatlisten
Länk till startlistan = Link til startlisten
Läs brickor = Læs brikker
Lås gafflingar = Lås gafflinger
Lås startlista = Lås startliste
Läser klubbar = Læser klubber
Läser löpare = Læser løbere
Låt de bästa start först = Lad de bedste starte først
Låt klassen ha mer än en bana eller sträcka = Lad klassen have mere end en bane eller en tur
Ladda upp öppnad tävling på server = Upload åbnet løb til server Ladda upp öppnad tävling på server = Upload åbnet løb til server
Lag %d = Hold %d Lag %d = Hold %d
Lag + sträcka = Hold + tur Lag + sträcka = Hold + tur
@ -1138,7 +1139,6 @@ Lottar: X = Trækker lod: X
Lottning = Lodtrækning Lottning = Lodtrækning
Lyssna = Lyt Lyssna = Lyt
Lyssnar på X = Lytter på X Lyssnar på X = Lytter på X
Män = Mænd
mål = mål mål = mål
Mål = Mål Mål = Mål
målet (X) = målet (X) målet (X) = målet (X)
@ -1148,6 +1148,7 @@ Målstämpling saknas = Manglende målstempling
Måltid = Måltid Måltid = Måltid
Måltid saknas = Måltid mangler Måltid saknas = Måltid mangler
Måltid: X = Måltid: X Måltid: X = Måltid: X
Män = Mænd
Man = Mand Man = Mand
Manual point reductions and adjustments = Manuel pointreduktion og justering Manual point reductions and adjustments = Manuel pointreduktion og justering
Manual time penalties and adjustments = Manuelle tidsstraf og justeringer Manual time penalties and adjustments = Manuelle tidsstraf og justeringer
@ -1186,12 +1187,12 @@ MediumPlus = Noget større tekst
Medlöpare = Medløber Medlöpare = Medløber
Mellantider visas för namngivna kontroller = Mellemtider vises for navngivne poster Mellantider visas för namngivna kontroller = Mellemtider vises for navngivne poster
MeOS = MeOS MeOS = MeOS
MeOS Funktioner = MeOS Funktioner
MeOS Resultatkiosk = MeOS Resultatformidling
MeOS Features = MeOS Specialfunktioner MeOS Features = MeOS Specialfunktioner
MeOS Funktioner = MeOS Funktioner MeOS Funktioner = MeOS Funktioner
MeOS Informationsserver REST-API = MeOS Informationsserver REST-API MeOS Informationsserver REST-API = MeOS Informationsserver REST-API
MeOS lokala datakatalog är = MeOS lokale datamappe er MeOS lokala datakatalog är = MeOS lokale datamappe er
MeOS Funktioner = MeOS Funktioner
MeOS Resultatkiosk = MeOS Resultatformidling
MeOS Three Days Race X = MeOS Tredages Løb X MeOS Three Days Race X = MeOS Tredages Løb X
MeOS Timing = MeOS Timing MeOS Timing = MeOS Timing
Metod = Metode Metod = Metode
@ -1371,6 +1372,7 @@ prefsAutoTie = Knyt automatisk Si brik til løber
prefsCardFee = Forvalgt Si brik leje prefsCardFee = Forvalgt Si brik leje
prefsclasslimit = Begräns antal viste resultater per klasse prefsclasslimit = Begräns antal viste resultater per klasse
prefsClient = Klientnavn i netværket prefsClient = Klientnavn i netværket
prefsCodePage = Tegnsæt for 8-bits text vid im- og export
prefsControlFrom = Senest brugte <fra> post prefsControlFrom = Senest brugte <fra> post
prefsControlTo = Senest brugte <til> post prefsControlTo = Senest brugte <til> post
prefsCurrencyFactor = Valutakurs prefsCurrencyFactor = Valutakurs
@ -1430,8 +1432,8 @@ Prel. bomtid = Forel. tidstab
Prel. placering = Forel. placering Prel. placering = Forel. placering
Prepare start lists = Forbered startliste Prepare start lists = Forbered startliste
Press Enter to continue = Tast <Enter> for at fortsætte Press Enter to continue = Tast <Enter> for at fortsætte
Print card data = Udskriv brikdata
Print Card Data = Udskriv brikdata Print Card Data = Udskriv brikdata
Print card data = Udskriv brikdata
Printing failed (X: Y) Z = Utskrivning fejlede (X: Y) Z Printing failed (X: Y) Z = Utskrivning fejlede (X: Y) Z
Prioritering = Prioritering Prioritering = Prioritering
Prisutdelningslista = Prisuddelingsliste Prisutdelningslista = Prisuddelingsliste
@ -1496,8 +1498,8 @@ Reserverade = Reserveret
RestService = RestService RestService = RestService
Result at a control = Resultat ved post Result at a control = Resultat ved post
Result Calculation = Resultatberegning Result Calculation = Resultatberegning
Result Module X = Resultatmodul X
Result module identifier = Resultatmodul ID Result module identifier = Resultatmodul ID
Result Module X = Resultatmodul X
Result Modules = Resultatmoduler Result Modules = Resultatmoduler
Result on leg = Result for stræk Result on leg = Result for stræk
Result score calculation for runner = Resultatberegning for løber Result score calculation for runner = Resultatberegning for løber
@ -1628,18 +1630,18 @@ RunnerTotalTimeAfter = Løbers totaltid efter
RunnerTotalTimeStatus = Løbers totaltid / status RunnerTotalTimeStatus = Løbers totaltid / status
RunnerUMMasterPoint = Uppsala möte, mesterskabspoints RunnerUMMasterPoint = Uppsala möte, mesterskabspoints
Running time for each team member = Løbstid for hvert holdmedlem Running time for each team member = Løbstid for hvert holdmedlem
Säkerhetskopiera = Lav sikkerhedskopi
Säkerhetskopierar om = Laver sikkerhedskopi om
Säkerhetskopiering = Interval Backup
Sätt okända löpare utan registrering till <Ej Start> = Sæt ukendte løbere uden registrering til <Ikke startet>
Sätt som oparad = Sæt som uparret
Sätter reptid (X) och omstartstid (Y) för = Sætter sidste skiftetid (X) og omstarttid (Y) for
Sök (X) = Søg (X) Sök (X) = Søg (X)
Sök = Søg Sök = Søg
Sök deltagare = Søg deltagere Sök deltagare = Søg deltagere
Sök och starta automatiskt = Søg og start automatisk Sök och starta automatiskt = Søg og start automatisk
Sök på namn, bricka eller startnummer = Søg efter et navn, en brik eller et startnummer Sök på namn, bricka eller startnummer = Søg efter et navn, en brik eller et startnummer
Söker efter SI-enheter = Søger efter SI-enheder Söker efter SI-enheter = Søger efter SI-enheder
Säkerhetskopiera = Lav sikkerhedskopi
Säkerhetskopierar om = Laver sikkerhedskopi om
Säkerhetskopiering = Interval Backup
Sätt okända löpare utan registrering till <Ej Start> = Sæt ukendte løbere uden registrering til <Ikke startet>
Sätt som oparad = Sæt som uparret
Sätter reptid (X) och omstartstid (Y) för = Sætter sidste skiftetid (X) og omstarttid (Y) for
Saknad starttid = Manglende starttid Saknad starttid = Manglende starttid
saknas = mangler saknas = mangler
Samlade poäng = Samlet antal point Samlade poäng = Samlet antal point
@ -1783,6 +1785,10 @@ Speakerstöd = Speaker funktion
SportIdent = SPORTident SportIdent = SPORTident
Språk = Sprog Språk = Sprog
SRR Dongle = SRR Dongle SRR Dongle = SRR Dongle
Större = Større
Störst = Meget stor
Största gruppen med samma inledning har X platser = Største gruppe med samme indledning har X pladser
Största intervall i klass = Største interval i klasse
Stämpelkod = Stempelkode Stämpelkod = Stempelkode
Stämpelkod(er) = Stempelkode(r) Stämpelkod(er) = Stempelkode(r)
Stämpelkoder = Stempelkoder Stämpelkoder = Stempelkoder
@ -1800,10 +1806,6 @@ Stämplingstest = Stemplingstest
Stämplingstid = Stemplingstid Stämplingstid = Stemplingstid
Stäng = Luk Stäng = Luk
Stäng tävlingen = Luk løbet Stäng tävlingen = Luk løbet
Större = Større
Störst = Meget stor
Största gruppen med samma inledning har X platser = Største gruppe med samme indledning har X pladser
Största intervall i klass = Største interval i klasse
Stad = By Stad = By
Stafett - sammanställning = Stafet - sammenfatning Stafett - sammanställning = Stafet - sammenfatning
Stafett - sträcka = Stafet - tur Stafett - sträcka = Stafet - tur
@ -1884,8 +1886,8 @@ Str. X = Tur X
Sträcka %d = Tur %d Sträcka %d = Tur %d
Sträcka = Tur Sträcka = Tur
Sträcka att lotta = Ture til lodtrækning Sträcka att lotta = Ture til lodtrækning
sträcka X = tur X
Sträcka X = Tur X Sträcka X = Tur X
sträcka X = tur X
Sträckans banor = Strækkets baner Sträckans banor = Strækkets baner
Sträcktider (WinSplits) = Stræktider (WinSplits) Sträcktider (WinSplits) = Stræktider (WinSplits)
Sträcktider / WinSplits = Stræktider / WinSplits Sträcktider / WinSplits = Stræktider / WinSplits
@ -1910,13 +1912,8 @@ Support time from control = Understøt tid fra post
Support time to control = Understøt tid til post Support time to control = Understøt tid til post
Symboler = Symboler Symboler = Symboler
Synkronisera med Eventor = Synkroniser med Eventor Synkronisera med Eventor = Synkroniser med Eventor
Ta bort / slå ihop = Fjern / slå sammen Töm = Clear
Ta bort = Fjern Töm databasen = Ryd database
Ta bort eventuella avanmälda deltagare = Fjern evt. afmeldte deltagere
Ta bort listposten = Fjern listeposten
Ta bort markerad = Fjern valgte
Ta bort stämpling = Fjern stempling
Ta bort valda rader från tabellen (X) = Fjern valgte rækker fra tabellen (X)
Tävling = Løb Tävling = Løb
Tävling från Eventor = Løb fra Eventor Tävling från Eventor = Løb fra Eventor
Tävling med lag = Løb med hold Tävling med lag = Løb med hold
@ -1933,8 +1930,13 @@ Tävlingsnamn = Løbsnavn
Tävlingsrapport = Løbsrapport Tävlingsrapport = Løbsrapport
Tävlingsregler = Løbsreglement Tävlingsregler = Løbsreglement
Tävlingsstatistik = Løbsstatistik Tävlingsstatistik = Løbsstatistik
Töm = Clear Ta bort / slå ihop = Fjern / slå sammen
Töm databasen = Ryd database Ta bort = Fjern
Ta bort eventuella avanmälda deltagare = Fjern evt. afmeldte deltagere
Ta bort listposten = Fjern listeposten
Ta bort markerad = Fjern valgte
Ta bort stämpling = Fjern stempling
Ta bort valda rader från tabellen (X) = Fjern valgte rækker fra tabellen (X)
Tabell = Tabel Tabell = Tabel
Tabelläge = Tabelindstilling Tabelläge = Tabelindstilling
Tabellverktyg = Tabelværktøj Tabellverktyg = Tabelværktøj

View File

@ -2315,3 +2315,9 @@ Ingen nummerlapp = No bib
Rogaining results for a team, where each team member collects points individually = Rogaining results for a team, where each team member collects points individually Rogaining results for a team, where each team member collects points individually = Rogaining results for a team, where each team member collects points individually
prefsCodePage = Code table for 8 bit text on import/export. prefsCodePage = Code table for 8 bit text on import/export.
Inga klasser tillåter direktanmälan. På sidan klasser kan du ändra denna egenskap. = No class is marked to allow quick entry.\n\nOn the page Classes you can change this property. Inga klasser tillåter direktanmälan. På sidan klasser kan du ändra denna egenskap. = No class is marked to allow quick entry.\n\nOn the page Classes you can change this property.
Database is used and cannot be deleted = Database is used and cannot be deleted
Classes together = Classes together
Finish order = Finish order
First to finish = First to finish
Individual result by finish time = Individual result by finish time
Endast tidtagning = Only timing

View File

@ -2389,6 +2389,11 @@ LRESULT gdioutput::ProcessMsgWrp(UINT iMessage, LPARAM lParam, WPARAM wParam)
} }
} }
else if (iMessage==WM_LBUTTONDOWN) { else if (iMessage==WM_LBUTTONDOWN) {
if (autoCompleteInfo) {
autoCompleteInfo.reset();
return 0;
}
list<InfoBox>::iterator it=IBox.begin(); list<InfoBox>::iterator it=IBox.begin();
POINT pt; POINT pt;
@ -6920,9 +6925,17 @@ AutoCompleteInfo &gdioutput::addAutoComplete(const string &key) {
POINT pt; POINT pt;
int height = scaleLength(200); int height = scaleLength(200);
pt.x = rc.right; pt.x = rc.right;
pt.y = min(rc.top, rcMain.bottom-height); //pt.y = min(rc.top, rcMain.bottom-height);
pt.y = rc.bottom;
if (pt.y + height > rcMain.bottom)
pt.y = rc.top - height;
ScreenToClient(hWndTarget, &pt); ScreenToClient(hWndTarget, &pt);
// TODO Place window if (pt.y < 0) { //Fallback
pt.x = rc.right;
pt.y = min(rc.top, rcMain.bottom - height);
ScreenToClient(hWndTarget, &pt);
}
if (autoCompleteInfo && autoCompleteInfo->matchKey(key)) { if (autoCompleteInfo && autoCompleteInfo->matchKey(key)) {
return *autoCompleteInfo; return *autoCompleteInfo;

View File

@ -1,4 +1,4 @@
/************************************************************************ /************************************************************************
MeOS - Orienteering Software MeOS - Orienteering Software
Copyright (C) 2009-2018 Melin Software HB Copyright (C) 2009-2018 Melin Software HB
@ -16,7 +16,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
Melin Software HB - software@melin.nu - www.melin.nu Melin Software HB - software@melin.nu - www.melin.nu
Eksoppsvägen 16, SE-75646 UPPSALA, Sweden Eksoppsvägen 16, SE-75646 UPPSALA, Sweden
************************************************************************/ ************************************************************************/
@ -287,17 +287,18 @@ int APIENTRY WinMain(HINSTANCE hInstance,
lang.get().addLangResource(L"Svenska", L"103"); lang.get().addLangResource(L"Svenska", L"103");
lang.get().addLangResource(L"Deutsch", L"105"); lang.get().addLangResource(L"Deutsch", L"105");
lang.get().addLangResource(L"Dansk", L"106"); lang.get().addLangResource(L"Dansk", L"106");
lang.get().addLangResource(L"Français", L"110"); lang.get().addLangResource(L"Český", L"108");
lang.get().addLangResource(L"Français", L"110");
lang.get().addLangResource(L"Russian", L"107"); lang.get().addLangResource(L"Russian", L"107");
if (fileExist(L"extra.lng")) { if (fileExist(L"extra.lng")) {
lang.get().addLangResource(L"Extraspråk", L"extra.lng"); lang.get().addLangResource(L"Extraspråk", L"extra.lng");
} }
else { else {
wchar_t lpath[260]; wchar_t lpath[260];
getUserFile(lpath, L"extra.lng"); getUserFile(lpath, L"extra.lng");
if (fileExist(lpath)) if (fileExist(lpath))
lang.get().addLangResource(L"Extraspråk", lpath); lang.get().addLangResource(L"Extraspråk", lpath);
} }
wstring defLang = gEvent->getPropertyString("Language", L"Svenska"); wstring defLang = gEvent->getPropertyString("Language", L"Svenska");
@ -1020,7 +1021,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{ {
case WM_CREATE: case WM_CREATE:
tabList->push_back(TabObject(gdi_main->getTabs().get(TCmpTab), "Tävling")); tabList->push_back(TabObject(gdi_main->getTabs().get(TCmpTab), "Tävling"));
tabList->push_back(TabObject(gdi_main->getTabs().get(TRunnerTab), "Deltagare")); tabList->push_back(TabObject(gdi_main->getTabs().get(TRunnerTab), "Deltagare"));
tabList->push_back(TabObject(gdi_main->getTabs().get(TTeamTab), "Lag(flera)")); tabList->push_back(TabObject(gdi_main->getTabs().get(TTeamTab), "Lag(flera)"));
tabList->push_back(TabObject(gdi_main->getTabs().get(TListTab), "Listor")); tabList->push_back(TabObject(gdi_main->getTabs().get(TListTab), "Listor"));
@ -1174,7 +1175,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
break; break;
} }
case WM_USER+1: case WM_USER+1:
MessageBox(hWnd, lang.tl(L"Kommunikationen med en SI-enhet avbröts.").c_str(), L"SportIdent", MB_OK); MessageBox(hWnd, lang.tl(L"Kommunikationen med en SI-enhet avbröts.").c_str(), L"SportIdent", MB_OK);
break; break;
case WM_USER + 3: case WM_USER + 3:
@ -1209,7 +1210,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
break; break;
case WM_CLOSE: case WM_CLOSE:
if (!gEvent || gEvent->empty() || gdi_main->ask(L"Vill du verkligen stänga MeOS?")) if (!gEvent || gEvent->empty() || gdi_main->ask(L"Vill du verkligen stänga MeOS?"))
DestroyWindow(hWnd); DestroyWindow(hWnd);
break; break;
@ -1227,20 +1228,20 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
gEvent->save(); gEvent->save();
} }
catch (meosException &ex) { catch (meosException &ex) {
MessageBox(hWnd, lang.tl(ex.wwhat()).c_str(), L"Fel när tävlingen skulle sparas", MB_OK); MessageBox(hWnd, lang.tl(ex.wwhat()).c_str(), L"Fel när tävlingen skulle sparas", MB_OK);
} }
catch(std::exception &ex) { catch(std::exception &ex) {
MessageBox(hWnd, lang.tl(ex.what()).c_str(), L"Fel när tävlingen skulle sparas", MB_OK); MessageBox(hWnd, lang.tl(ex.what()).c_str(), L"Fel när tävlingen skulle sparas", MB_OK);
} }
try { try {
gEvent->saveRunnerDatabase(L"database", true); gEvent->saveRunnerDatabase(L"database", true);
} }
catch (meosException &ex) { catch (meosException &ex) {
MessageBox(hWnd, lang.tl(ex.wwhat()).c_str(), L"Fel när löpardatabas skulle sparas", MB_OK); MessageBox(hWnd, lang.tl(ex.wwhat()).c_str(), L"Fel när löpardatabas skulle sparas", MB_OK);
} }
catch(std::exception &ex) { catch(std::exception &ex) {
MessageBox(hWnd, lang.tl(ex.what()).c_str(), L"Fel när löpardatabas skulle sparas", MB_OK); MessageBox(hWnd, lang.tl(ex.what()).c_str(), L"Fel när löpardatabas skulle sparas", MB_OK);
} }
if (gEvent) if (gEvent)

View File

@ -37,6 +37,7 @@
#include "../progress.h" #include "../progress.h"
#include "../metalist.h" #include "../metalist.h"
#include "../MeOSFeatures.h" #include "../MeOSFeatures.h"
#include "../meosexception.h"
using namespace mysqlpp; using namespace mysqlpp;
@ -3493,7 +3494,7 @@ bool MeosSQL::checkConnection(oEvent *oe)
monitorId=static_cast<int>(res.insert_id); monitorId=static_cast<int>(res.insert_id);
} }
catch (const mysqlpp::Exception& er){ catch (const mysqlpp::Exception& er){
oe->connectedClients.push_back(er.what()); oe->connectedClients.push_back(L"Error: " + fromUTF(er.what()));
return false; return false;
} }
} }
@ -3505,7 +3506,7 @@ bool MeosSQL::checkConnection(oEvent *oe)
query.execute(); query.execute();
} }
catch (const mysqlpp::Exception& er){ catch (const mysqlpp::Exception& er){
oe->connectedClients.push_back(er.what()); oe->connectedClients.push_back(L"Error: " + fromUTF(er.what()));
return false; return false;
} }
} }
@ -3521,7 +3522,7 @@ bool MeosSQL::checkConnection(oEvent *oe)
if (res) { if (res) {
for (int i=0; i<res.num_rows(); i++) { for (int i=0; i<res.num_rows(); i++) {
Row row=res.at(i); Row row=res.at(i);
oe->connectedClients.push_back(string(row["Client"])); oe->connectedClients.push_back(fromUTF(string(row["Client"])));
if (int(row["Id"])==monitorId) if (int(row["Id"])==monitorId)
callback=true; callback=true;
@ -3529,7 +3530,7 @@ bool MeosSQL::checkConnection(oEvent *oe)
} }
} }
catch (const mysqlpp::Exception& er){ catch (const mysqlpp::Exception& er){
oe->connectedClients.push_back(er.what()); oe->connectedClients.push_back(L"Error: " + fromUTF(er.what()));
return false; return false;
} }
return callback; return callback;
@ -3554,16 +3555,14 @@ void MeosSQL::setDefaultDB()
bool MeosSQL::dropDatabase(oEvent *oe) bool MeosSQL::dropDatabase(oEvent *oe)
{ {
// Check if other cients are connected. // Check if other clients are connected.
if ( !checkConnection(oe) ) { if ( !checkConnection(oe) ) {
if (!oe->connectedClients.empty()) if (!oe->connectedClients.empty())
alert(oe->connectedClients[0]); throw meosException("Database is used and cannot be deleted.");
return false;
} }
if (oe->connectedClients.size()!=1) { if (oe->connectedClients.size()!=1) {
alert("Database is used and cannot be deleted"); throw meosException("Database is used and cannot be deleted.");
return false; return false;
} }

View File

@ -12,8 +12,7 @@ IDR_3002 300 DISCARDABLE "english.lng"
IDR_3003 300 DISCARDABLE "german.lng" IDR_3003 300 DISCARDABLE "german.lng"
IDR_3004 300 DISCARDABLE "danish.lng" IDR_3004 300 DISCARDABLE "danish.lng"
IDR_3005 300 DISCARDABLE "russian.lng" IDR_3005 300 DISCARDABLE "russian.lng"
IDR_3006 300 DISCARDABLE "cp1250.lng" IDR_3006 300 DISCARDABLE "czech.lng"
IDR_3007 300 DISCARDABLE "cp1255.lng"
IDR_3008 300 DISCARDABLE "french.lng" IDR_3008 300 DISCARDABLE "french.lng"
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////

View File

@ -27,9 +27,9 @@
//V2: ABCDEFGHIHJKMN //V2: ABCDEFGHIHJKMN
//V31: a //V31: a
//V33: abcde //V33: abcde
//V35: abcde //V35: abcdef
int getMeosBuild() { int getMeosBuild() {
string revision("$Rev: 669 $"); string revision("$Rev: 686 $");
return 174 + atoi(revision.substr(5, string::npos).c_str()); return 174 + atoi(revision.substr(5, string::npos).c_str());
} }
@ -41,12 +41,12 @@ int getMeosBuild() {
//V33: abcdefghij //V33: abcdefghij
//V34: abcdfge //V34: abcdfge
wstring getMeosDate() { wstring getMeosDate() {
wstring date(L"$Date: 2018-03-25 07:29:55 +0200 (sö, 25 mar 2018) $"); wstring date(L"$Date: 2018-04-17 21:45:35 +0200 (ti, 17 apr 2018) $");
return date.substr(7,10); return date.substr(7,10);
} }
wstring getBuildType() { wstring getBuildType() {
return L"RC2"; // No parantheses (...) return L""; // No parantheses (...)
} }
wstring getMajorVersion() { wstring getMajorVersion() {
@ -188,4 +188,6 @@ void getSupporters(vector<wstring> &supp)
supp.push_back(L"Siguldas Takas, Latvia"); supp.push_back(L"Siguldas Takas, Latvia");
supp.push_back(L"Eric Teutsch, Ottawa Orienteering Club, Canada"); supp.push_back(L"Eric Teutsch, Ottawa Orienteering Club, Canada");
supp.push_back(L"Silkeborg OK, Denmark"); supp.push_back(L"Silkeborg OK, Denmark");
supp.push_back(L"Erik Ivarsson Sandberg");
supp.push_back(L"Stenungsunds OK");
} }

View File

@ -4006,17 +4006,20 @@ void oClass::drawSeeded(ClassSeedMethod seed, int leg, int firstStart,
} }
if (noClubNb) { if (noClubNb) {
set<int> pushed_back;
for (size_t k = 1; k < startOrder.size(); k++) { for (size_t k = 1; k < startOrder.size(); k++) {
int idMe = startOrder[k]->getClubId(); int idMe = startOrder[k]->getClubId();
if (idMe != 0 && idMe == startOrder[k-1]->getClubId()) { if (idMe != 0 && idMe == startOrder[k-1]->getClubId()) {
// Make sure the runner with worst ranking is moved back. (Swedish SM rules) // Make sure the runner with worst ranking is moved back. (Swedish SM rules)
if (startOrder[k-1]->getRanking() > startOrder[k]->getRanking()) bool skipRank = pushed_back.count(startOrder[k - 1]->getId()) != 0;
if (!skipRank && startOrder[k-1]->getRanking() > startOrder[k]->getRanking())
swap(startOrder[k-1], startOrder[k]); swap(startOrder[k-1], startOrder[k]);
pushed_back.insert(startOrder[k]->getId());
vector<pair<int, pRunner> > rqueue; vector<pair<int, pRunner> > rqueue;
rqueue.push_back(make_pair(k, startOrder[k])); rqueue.push_back(make_pair(k, startOrder[k]));
for (size_t j = k + 1; j < startOrder.size(); j++) { for (size_t j = k + 1; j < startOrder.size(); j++) {
if (idMe != startOrder[j]->getClubId()) { if (idMe != startOrder[j]->getClubId()) {
pushed_back.insert(startOrder[j]->getId());
swap(startOrder[j], startOrder[k]); // k-1 now has a non-club nb behind swap(startOrder[j], startOrder[k]); // k-1 now has a non-club nb behind
rqueue.push_back(make_pair(j, pRunner(0))); rqueue.push_back(make_pair(j, pRunner(0)));
// Shift the queue // Shift the queue

View File

@ -1377,6 +1377,14 @@ bool oCourse::hasControl(const oControl *ctrl) const {
return false; return false;
} }
bool oCourse::hasControlCode(int code) const {
for (int i = 0; i < nControls; i++) {
if (Controls[i]->hasNumber(code))
return true;
}
return false;
}
void oCourse::getClasses(vector<pClass> &usageClass) const { void oCourse::getClasses(vector<pClass> &usageClass) const {
vector<pClass> cls; vector<pClass> cls;
oe->getClasses(cls, false); oe->getClasses(cls, false);

View File

@ -103,6 +103,7 @@ public:
wstring getRadioName(int courseControlId) const; wstring getRadioName(int courseControlId) const;
bool hasControl(const oControl *ctrl) const; bool hasControl(const oControl *ctrl) const;
bool hasControlCode(int code) const;
/// Returns course specific id for specified control (taking duplicats of the control into account) /// Returns course specific id for specified control (taking duplicats of the control into account)
int getCourseControlId(int controlIx) const; int getCourseControlId(int controlIx) const;

View File

@ -4825,7 +4825,7 @@ void oEvent::analyzeClassResultStatus() const
void oEvent::generateTestCard(SICard &sic) const void oEvent::generateTestCard(SICard &sic) const
{ {
sic.clear(0); sic.clear(0);
sic.convertedTime == ConvertedTimeStatus::Hour24; sic.convertedTime = ConvertedTimeStatus::Hour24;
if (Runners.empty()) if (Runners.empty())
return; return;

View File

@ -393,7 +393,7 @@ protected:
void storeChangeStatus(bool onlyChangable=true); void storeChangeStatus(bool onlyChangable=true);
wstring clientName; wstring clientName;
vector<string> connectedClients; vector<wstring> connectedClients;
DWORD clientCheckSum() const; //Calculate a check sum for current clients DWORD clientCheckSum() const; //Calculate a check sum for current clients
DWORD currentClientCS; //The current, stored check sum. DWORD currentClientCS; //The current, stored check sum.

View File

@ -836,7 +836,7 @@ void oEvent::drawList(const vector<ClassDrawSpecification> &spec,
int minStartNo = Runners.size(); int minStartNo = Runners.size();
for(unsigned k=0;k<stimes.size(); k++) { for(unsigned k=0;k<stimes.size(); k++) {
runners[k]->setStartTime(stimes[k], true, false); runners[k]->setStartTime(stimes[k], true, false, false);
minStartNo = min(minStartNo, runners[k]->getStartNo()); minStartNo = min(minStartNo, runners[k]->getStartNo());
} }
@ -1113,12 +1113,14 @@ void oEvent::drawListClumped(int ClassID, int FirstStart, int Interval, int Vaca
k=0; k=0;
for (it=Runners.begin(); it != Runners.end(); ++it) for (it = Runners.begin(); it != Runners.end(); ++it) {
if (it->Class && it->Class->Id==ClassID){ if (it->Class && it->Class->Id == ClassID) {
it->setStartTime(stimes[k++], true, false); it->setStartTime(stimes[k++], true, false, false);
it->StartNo=k; it->StartNo = k;
it->synchronize(); it->synchronize();
} }
}
reCalculateLeaderTimes(ClassID);
delete[] stimes; delete[] stimes;
} }
@ -1426,15 +1428,15 @@ void oEvent::drawPersuitList(int classId, int firstTime, int restartTime,
if ((times[k].first - delta) < maxTime && breakIndex == -1) { if ((times[k].first - delta) < maxTime && breakIndex == -1) {
if (!reverse) if (!reverse)
r->setStartTime(firstTime + times[k].first - delta, true, false); r->setStartTime(firstTime + times[k].first - delta, true, false, false);
else else
r->setStartTime(firstTime - times[k].first + reverseDelta, true, false); r->setStartTime(firstTime - times[k].first + reverseDelta, true, false, false);
} }
else if (!reverse) { else if (!reverse) {
if (breakIndex == -1) if (breakIndex == -1)
breakIndex = k; breakIndex = k;
r->setStartTime(restartTime + ((k - breakIndex)/pairSize) * interval, true, false); r->setStartTime(restartTime + ((k - breakIndex)/pairSize) * interval, true, false, false);
} }
else { else {
if (breakIndex == -1) { if (breakIndex == -1) {
@ -1442,8 +1444,9 @@ void oEvent::drawPersuitList(int classId, int firstTime, int restartTime,
odd = times.size() % 2; odd = times.size() % 2;
} }
r->setStartTime(restartTime + ((breakIndex - k + odd)/pairSize) * interval, true, false); r->setStartTime(restartTime + ((breakIndex - k + odd)/pairSize) * interval, true, false, false);
} }
r->synchronize(true); r->synchronize(true);
} }
reCalculateLeaderTimes(classId);
} }

View File

@ -468,13 +468,23 @@ pFreePunch oEvent::addFreePunch(int time, int type, int card, bool updateStartFi
fp->updateChanged(); fp->updateChanged();
fp->synchronize(); fp->synchronize();
// Update start/finish time
if (updateStartFinish && type == oPunch::PunchStart || type == oPunch::PunchFinish) {
pRunner tr = fp->getTiedRunner(); pRunner tr = fp->getTiedRunner();
if (tr && tr->getStatus() == StatusUnknown && time > 0) {
if (tr != nullptr) {
// Update start/finish time
if (updateStartFinish) {
int startType = oPunch::PunchStart;
int finishType = oPunch::PunchFinish;
pCourse pCrs = tr->getCourse(false);
if (pCrs) {
startType = pCrs->getStartPunchType();
finishType = pCrs->getFinishPunchType();
}
if (type == startType || type == finishType) {
if (tr->getStatus() == StatusUnknown && time > 0) {
tr->synchronize(); tr->synchronize();
if (type == oPunch::PunchStart) { if (type == startType) {
if (tr->getClassRef(false) && !tr->getClassRef(true)->ignoreStartPunch()) if (tr->getClassRef(false) && !tr->getClassRef(true)->ignoreStartPunch())
tr->setStartTime(time, true, false); tr->setStartTime(time, true, false);
} }
@ -482,7 +492,7 @@ pFreePunch oEvent::addFreePunch(int time, int type, int card, bool updateStartFi
tr->setFinishTime(time); tr->setFinishTime(time);
// Direct result // Direct result
if (type == oPunch::PunchFinish && tr->getClassRef(false) && tr->getClassRef(true)->hasDirectResult()) { if (type == finishType && tr->getClassRef(false) && tr->getClassRef(true)->hasDirectResult()) {
if (tr->getCourse(false) == 0 && tr->getCard() == 0) { if (tr->getCourse(false) == 0 && tr->getCard() == 0) {
tr->setStatus(StatusOK, true, false, true); tr->setStatus(StatusOK, true, false, true);
} }
@ -498,8 +508,10 @@ pFreePunch oEvent::addFreePunch(int time, int type, int card, bool updateStartFi
tr->synchronize(true); tr->synchronize(true);
} }
} }
if (fp->getTiedRunner()) }
pushDirectChange(); pushDirectChange();
}
return fp; return fp;
} }

View File

@ -2317,3 +2317,9 @@ Ingen nummerlapp = Ingen nummerlapp
Rogaining results for a team, where each team member collects points individually = Rogainingresultat för ett lag där varje lagmedlem samlar poäng individuellt Rogaining results for a team, where each team member collects points individually = Rogainingresultat för ett lag där varje lagmedlem samlar poäng individuellt
prefsCodePage = Kodtabell för 8-bitars text vid import/export prefsCodePage = Kodtabell för 8-bitars text vid import/export
Inga klasser tillåter direktanmälan. På sidan klasser kan du ändra denna egenskap. = Inga klasser tillåter direktanmälan.\n\nPå sidan klasser kan du ändra denna egenskap. Inga klasser tillåter direktanmälan. På sidan klasser kan du ändra denna egenskap. = Inga klasser tillåter direktanmälan.\n\nPå sidan klasser kan du ändra denna egenskap.
Database is used and cannot be deleted = Databasen används och kan inte tas bort
Classes together = Klasser gemensamt
Finish order = Målgångsordning
First to finish = Först i mål
Individual result by finish time = Individuella resultat efter måltid
Endast tidtagning = Endast tidtagning

View File

@ -135,9 +135,12 @@ void TestMeOS::runProtected(bool protect) const {
oe_main->setProperty("FirstTime", 0); oe_main->setProperty("FirstTime", 0);
oe_main->setProperty("TestPath", tp); oe_main->setProperty("TestPath", tp);
oe_main->getPropertyInt("UseEventor", 1); oe_main->getPropertyInt("UseEventor", 1);
TabSI *tsi = dynamic_cast<TabSI*>(gdi_main->getTabs().get(TabType::TSITab));
tsi->setMode(TabSI::ModeReadOut);
//string pmOrig = oe_main->getPropertyString("PayModes", ""); //string pmOrig = oe_main->getPropertyString("PayModes", "");
//oe_main->setProperty("PayModes", ""); //oe_main->setProperty("PayModes", "");
OutputDebugString((L"Running test" + gdi_main->widen(test) + L"\n").c_str());
try { try {
status = RUNNING; status = RUNNING;
run(); run();
@ -153,6 +156,7 @@ void TestMeOS::runProtected(bool protect) const {
gdi_main->isTestMode = false; gdi_main->isTestMode = false;
} }
catch (const meosAssertionFailure & ex) { catch (const meosAssertionFailure & ex) {
OutputDebugString(L"Test FAILED (assert)\n");
status = FAILED; status = FAILED;
oe_main->useDefaultProperties(false); oe_main->useDefaultProperties(false);
gdi_main->clearDialogAnswers(false); gdi_main->clearDialogAnswers(false);
@ -166,6 +170,8 @@ void TestMeOS::runProtected(bool protect) const {
} }
catch (const std::exception &ex) { catch (const std::exception &ex) {
status = FAILED; status = FAILED;
OutputDebugString(L"Test FAILED (std)\n");
oe_main->useDefaultProperties(false); oe_main->useDefaultProperties(false);
gdi_main->clearDialogAnswers(false); gdi_main->clearDialogAnswers(false);
gdi_main->dbRegisterSubCommand(0, ""); gdi_main->dbRegisterSubCommand(0, "");
@ -177,6 +183,8 @@ void TestMeOS::runProtected(bool protect) const {
throw; throw;
} }
catch (...) { catch (...) {
OutputDebugString(L"Test FAILED (...)\n");
status = FAILED; status = FAILED;
oe_main->useDefaultProperties(false); oe_main->useDefaultProperties(false);
gdi_main->clearDialogAnswers(false); gdi_main->clearDialogAnswers(false);
@ -195,7 +203,7 @@ void TestMeOS::runProtected(bool protect) const {
for (size_t k = 0; k < tmpFiles.size(); k++) for (size_t k = 0; k < tmpFiles.size(); k++)
removeTempFile(tmpFiles[k]); removeTempFile(tmpFiles[k]);
tmpFiles.clear(); tmpFiles.clear();
OutputDebugString(L"Test PASSED\n");
if (protect) { if (protect) {
cleanup(); cleanup();
} }