From 90ece8a023da4535eb0c2830e3dcab1bfb93b881 Mon Sep 17 00:00:00 2001 From: David Solbach Date: Sat, 9 Oct 2010 15:05:33 +0200 Subject: [PATCH] - added settingsdialog - correct score and matchstate parsing - display day and time of game --- BundesligaWidget.pro | 11 +- resources.qrc | 1 + src/backendkicker.cpp | 81 ++- src/backendkicker.h | 9 +- src/livescores.cpp | 22 - src/livescores.h | 26 - src/main.cpp | 2 +- src/mainwidget.cpp | 48 +- src/mainwidget.h | 13 +- src/match.cpp | 23 +- src/match.h | 66 +- src/matchdaymodel.cpp | 54 +- src/matchdaymodel.h | 9 +- src/scoretable.cpp | 11 +- src/scoretable.h | 8 +- src/settingsdialog.cpp | 38 ++ src/settingsdialog.h | 26 + src/settingsdialog.ui | 71 +++ testdata/spieltag.html | 1656 ++++++++++++++++++++++++++++++++++++++++++++++++ 19 files changed, 2035 insertions(+), 140 deletions(-) delete mode 100644 src/livescores.cpp delete mode 100644 src/livescores.h create mode 100644 src/settingsdialog.cpp create mode 100644 src/settingsdialog.h create mode 100644 src/settingsdialog.ui create mode 100644 testdata/spieltag.html diff --git a/BundesligaWidget.pro b/BundesligaWidget.pro index af9ee39..0d5dfcf 100644 --- a/BundesligaWidget.pro +++ b/BundesligaWidget.pro @@ -6,21 +6,24 @@ OTHER_FILES += \ bundesligawidget.desktop HEADERS += \ - src/livescores.h \ src/match.h \ src/backendkicker.h \ src/mainwidget.h \ src/matchdaymodel.h \ - src/scoretable.h + src/scoretable.h \ + src/settingsdialog.h SOURCES += \ src/main.cpp \ - src/livescores.cpp \ src/match.cpp \ src/backendkicker.cpp \ src/mainwidget.cpp \ src/matchdaymodel.cpp \ - src/scoretable.cpp + src/scoretable.cpp \ + src/settingsdialog.cpp RESOURCES += \ resources.qrc + +FORMS += \ + src/settingsdialog.ui diff --git a/resources.qrc b/resources.qrc index 7bbfdf3..dc577c8 100644 --- a/resources.qrc +++ b/resources.qrc @@ -18,5 +18,6 @@ Icons/St.Pauli.png Icons/Stuttgart.png Icons/Wolfsburg.png + Icons/Application/football diff --git a/src/backendkicker.cpp b/src/backendkicker.cpp index 847cb56..ed71b36 100644 --- a/src/backendkicker.cpp +++ b/src/backendkicker.cpp @@ -5,30 +5,33 @@ #include #include #include +#include #include "backendkicker.h" -#include "livescores.h" BackendKicker::BackendKicker(QObject *parent) : QObject(parent) { + QSettings settings("David Solbach", "BuliScores"); + this->setLeague(settings.value("League", "1. Bundesliga").toString()); + this->update(); } -Match* BackendKicker::getMatch(QString hometeam, QString awayteam) +Match* BackendKicker::getMatch(QString hometeam, QString awayteam, QDateTime date) { QListIterator iter(m_matchlist); Match* match; while (iter.hasNext()) { match = iter.next(); - if (match->awayteam() == awayteam && - match->hometeam() == hometeam) { + if (match->awayTeam() == awayteam && + match->homeTeam() == hometeam) { return match; } } - match = new Match(hometeam, awayteam, this); + match = new Match(hometeam, awayteam, date, this); m_matchlist.append(match); emit matchListChanged(); @@ -83,24 +86,45 @@ static QString parseTeam(QString teamhtml) return team; } -static int parseScore(QString scorehtml, bool home, bool firsthalf) +static int parseScore(Match* match, QString scorehtml) { int score = -1; - int index = 0; QStringList tokens; qDebug() << "parseScore in: " << scorehtml; - tokens = scorehtml.split(QRegExp("[>&();:<]"), QString::SkipEmptyParts); qDebug() << tokens; - index = 1; - if (!home) { index++; } - if (firsthalf) { index += 3; } - - score = tokens.at(index).toInt(); + if (tokens.count() == 7) { + // no extra color tag -> either not started, halftime or finished + if (tokens.at(4) == "-") { + // no first half results -> match not started yet + match->setState(Match::NotStarted); + } else if (tokens.at(1) == "-") { + // second half has not been started but there are first + // half results -> currently half time + match->setScore(tokens.at(4).toInt(), tokens.at(5).toInt()); + match->setState(Match::HalfTime); + } else { + // no color tag and no "-" -> game is finished + match->setScore(tokens.at(1).toInt(), tokens.at(3).toInt()); + match->setState(Match::Finished); + } + } else { + // there is a color tag which means that either first + // half or second half are currently running + if (tokens.at(4).contains("color")) { + // first half score marked red -> first half running + match->setScore(tokens.at(5).toInt(), tokens.at(6).toInt()); + match->setState(Match::FirstHalf); + } else if (tokens.at(1).contains("color")) { + // second half score marked res -> second half running + match->setState(Match::SecondHalf); + match->setScore(tokens.at(2).toInt(), tokens.at(3).toInt()); + } - qDebug() << "parseScore out: " << score; + } + qDebug() << "match out: " << match; return score; } @@ -115,9 +139,6 @@ void BackendKicker::parsePage (QString htmlstr) int pos = 0; int count = 0; - int homescore, awayscore; - int homescorefh, awayscorefh; - //qDebug() << "parsePage in: " << htmlstr; @@ -149,35 +170,39 @@ void BackendKicker::parsePage (QString htmlstr) break; case 5: // awayteam awayteam = parseTeam(tmp); + match = getMatch(hometeam, awayteam, date); break; case 6: // scores - homescore = parseScore(tmp, true, false); - homescorefh = parseScore(tmp, true, true); - awayscore = parseScore(tmp, false, false); - awayscorefh = parseScore(tmp, false, true); + parseScore(match, tmp); break; default: ;; } } - match = getMatch(hometeam, awayteam); - match->setScore(homescore, awayscore); } } -void BackendKicker::update() +void BackendKicker::setLeague(QString league) { - //QString URL = "http://www.kicker.de/news/fussball/bundesliga/spieltag/1-bundesliga/2010-11/spieltag.html"; - QString URL = "http://www.kicker.de/news/fussball/2bundesliga/spieltag/2-bundesliga/2010-11/spieltag.html"; + if (league == "1. Bundesliga") { + m_URL = "http://www.kicker.de/news/fussball/bundesliga/spieltag/1-bundesliga/2010-11/spieltag.html"; + } else if (league == "2. Bundesliga") { + m_URL = "http://www.kicker.de/news/fussball/bundesliga/spieltag/2-bundesliga/2010-11/spieltag.html"; + } else if (league == "tipp3 Bundesliga") { + m_URL = "http://www.kicker.de/news/fussball/intligen/oesterreich/tipp3-bundesliga/2010-11/spieltag.html"; + } +} +void BackendKicker::update() +{ QNetworkAccessManager *manager = new QNetworkAccessManager(this); connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(dlndFinished(QNetworkReply*))); - qDebug() << "URL: " << URL; - manager->get(QNetworkRequest(QUrl(URL))); + qDebug() << "URL: " << m_URL; + manager->get(QNetworkRequest(QUrl(m_URL))); } void BackendKicker::dlndFinished(QNetworkReply *reply) diff --git a/src/backendkicker.h b/src/backendkicker.h index 77d9705..34598dd 100644 --- a/src/backendkicker.h +++ b/src/backendkicker.h @@ -3,23 +3,26 @@ #include #include -#include "livescores.h" + +#include "match.h" class BackendKicker : public QObject { Q_OBJECT private: QList m_matchlist; + QString m_URL; void parsePage (QString htmlstr); public: explicit BackendKicker(QObject *parent = 0); - Match* getMatch(QString hometeam, QString awayteam); - + Match* getMatch(QString hometeam, QString awayteam, QDateTime date); QList matchList(); + void setLeague(QString league); + signals: void matchListChanged(void); diff --git a/src/livescores.cpp b/src/livescores.cpp deleted file mode 100644 index a86c0e2..0000000 --- a/src/livescores.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "livescores.h" -#include "match.h" -#include "QDate" - - - -LiveScores::LiveScores(QObject *parent) : - QObject(parent) -{ - - -} - - -QList LiveScores::getMatchList() -{ - - - return m_matchlist; -} - - diff --git a/src/livescores.h b/src/livescores.h deleted file mode 100644 index 1c14d16..0000000 --- a/src/livescores.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef LIVESCORES_H -#define LIVESCORES_H - -#include -#include "match.h" - -class LiveScores : public QObject -{ - Q_OBJECT - -private: - QList m_matchlist; - -public: - explicit LiveScores(QObject *parent = 0); - - Match* getMatch(QString hometeam, QString awayteam); - QList getMatchList(); - -signals: - -public slots: - -}; - -#endif // LIVESCORES_H diff --git a/src/main.cpp b/src/main.cpp index 71ed059..52792ae 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -54,7 +54,7 @@ int main(int argc, char *argv[]) QApplication app(argc, argv); MainWidget mw; - //mw.resize(400,250); + mw.resize(400,250); QMaemo5HomescreenAdaptor *adaptor = new QMaemo5HomescreenAdaptor(&mw); adaptor->setSettingsAvailable(true); diff --git a/src/mainwidget.cpp b/src/mainwidget.cpp index b2c1678..e9cdc75 100644 --- a/src/mainwidget.cpp +++ b/src/mainwidget.cpp @@ -1,22 +1,52 @@ -#include -#include +#include +#include + #include "mainwidget.h" +#include "matchdaymodel.h" +#include "settingsdialog.h" MainWidget::MainWidget(QWidget *parent) : - QWidget(parent) + QWidget(parent), + m_datamodel(new MatchDayModel(this)), + m_scoretbl(new ScoreTable(this, m_datamodel)) { - QVBoxLayout layout; - QLabel statuslbl; + QFont f; + QPalette palette; + + f.setPixelSize(14); + palette.setColor(QPalette::Window, QColor(100, 100, 100, 127)); + + m_statuslbl.setPalette(palette); + m_statuslbl.setFont(f); + m_statuslbl.setText(tr("Last Update: Never")); this->setAttribute(Qt::WA_TranslucentBackground); - statuslbl.setText("Last Update: Never"); - layout.addWidget(&statuslbl); - layout.addWidget(&m_scoretbl); - this->setLayout(&layout); + this->setLayout(&m_layout); + + //m_layout.addWidget(&m_statuslbl); + m_layout.addWidget(m_scoretbl); + this->setAutoFillBackground(true); } + +void MainWidget::mousePressEvent(QMouseEvent) +{ + this->m_datamodel->update(); +} + + +void MainWidget::showSettingsDialog() +{ + QSettings settings("David Solbach", "BuliScores"); + + SettingsDialog* sd = new SettingsDialog(this); + sd->show(); + + m_datamodel->update(); +} + diff --git a/src/mainwidget.h b/src/mainwidget.h index 87c8e7f..b0d2139 100644 --- a/src/mainwidget.h +++ b/src/mainwidget.h @@ -2,6 +2,9 @@ #define MAINWIDGET_H #include +#include +#include + #include "scoretable.h" @@ -9,7 +12,14 @@ class MainWidget : public QWidget { Q_OBJECT private: - ScoreTable m_scoretbl; + MatchDayModel* m_datamodel; + ScoreTable* m_scoretbl; + + QVBoxLayout m_layout; + QLabel m_statuslbl; + +protected: + void mousePressEvent(QMouseEvent); public: explicit MainWidget(QWidget *parent = 0); @@ -17,6 +27,7 @@ public: signals: public slots: + void showSettingsDialog(); }; diff --git a/src/match.cpp b/src/match.cpp index f37f008..20bc393 100644 --- a/src/match.cpp +++ b/src/match.cpp @@ -1,13 +1,15 @@ #include "match.h" -Match::Match(QString hometeam, QString awayteam, QObject *parent) : +Match::Match(QString hometeam, QString awayteam, QDateTime date, QObject *parent) : QObject(parent) { - m_hometeam = hometeam; - m_awayteam = awayteam; + m_date = date; + + m_homeTeam = hometeam; + m_awayTeam = awayteam; - m_awayEmblem = getEmblemByName(awayteam); m_homeEmblem = getEmblemByName(hometeam); + m_awayEmblem = getEmblemByName(awayteam); } @@ -57,7 +59,6 @@ QIcon Match::getEmblemByName(QString team) i = QIcon(); } - return i; } @@ -65,13 +66,13 @@ void Match::setScore(int home, int away) { bool changed; - if (m_homescore != home) { - m_homescore = home; + if (m_homeScore != home) { + m_homeScore = home; changed = true; } - if (m_awayscore != away) { - m_awayscore = away; + if (m_awayScore != away) { + m_awayScore = away; changed = true; } @@ -79,3 +80,7 @@ void Match::setScore(int home, int away) emit scoreChanged(home, away); } } + +void Match::setState(MatchState state) { + m_state = state; +} diff --git a/src/match.h b/src/match.h index e65d486..38c1f72 100644 --- a/src/match.h +++ b/src/match.h @@ -8,36 +8,64 @@ class Match : public QObject { Q_OBJECT + Q_PROPERTY(QDateTime date READ date) + Q_PROPERTY(QIcon homeEmblem READ homeEmblem) + Q_PROPERTY(QIcon awayEmblem READ awayEmblem) + Q_PROPERTY(QString homeTeam READ homeTeam) + Q_PROPERTY(QString awayTeam READ awayTeam) + Q_PROPERTY(int homeScore READ homeScore) + Q_PROPERTY(int homeScoreFH READ homeScoreFH) + Q_PROPERTY(int awayScore READ awayScore) + Q_PROPERTY(int awayScoreFH READ awayScoreFH) + Q_PROPERTY(MatchState state READ state) + + Q_ENUMS(MatchState) + +public: + enum MatchState { + NotStarted, + FirstHalf, + HalfTime, + SecondHalf, + ExtraTime, + Finished + }; private: - QDateTime m_date; - QIcon m_homeEmblem; - QIcon m_awayEmblem; - QString m_hometeam; - QString m_awayteam; - int m_homescore; - int m_homescorefh; - int m_awayscore; - int m_awayscorefh; - bool m_FirstHalfFinished; + QDateTime m_date; + QString m_homeTeam; + QString m_awayTeam; + QIcon m_homeEmblem; + QIcon m_awayEmblem; + int m_homeScore; + int m_homeScoreFH; + int m_awayScore; + int m_awayScoreFH; + MatchState m_state; QIcon getEmblemByName(QString team); public: - explicit Match(QString hometeam, QString awayteam, QObject *parent = 0); + explicit Match(QString hometeam, QString awayteam, QDateTime date, QObject *parent = 0); - void setScore(int home, int away); - void setFirstHalfFinished(bool finished); + QDateTime date() const {return m_date;} - QString hometeam() {return m_hometeam;} - QString awayteam() {return m_awayteam;} - QIcon homeEmblem() {return m_homeEmblem;} - QIcon awayEmblem() {return m_awayEmblem;} + QString homeTeam() const {return m_homeTeam;} + QString awayTeam() const {return m_awayTeam;} - int homescore() {return m_homescore;} - int awayscore() {return m_awayscore;} + int homeScore() const {return m_homeScore;} + int homeScoreFH() const {return m_homeScoreFH;} + + int awayScore() const {return m_awayScore;} + int awayScoreFH() const {return m_awayScoreFH;} + + void setScore(int home, int away); + QIcon homeEmblem() const {return m_homeEmblem;} + QIcon awayEmblem() const {return m_awayEmblem;} + MatchState state() const {return m_state;} + void setState(MatchState state); signals: void scoreChanged(int homescore, int awayscore); diff --git a/src/matchdaymodel.cpp b/src/matchdaymodel.cpp index 970dec4..89f24d3 100644 --- a/src/matchdaymodel.cpp +++ b/src/matchdaymodel.cpp @@ -1,29 +1,32 @@ -#include "matchdaymodel.h" #include #include #include #include +#include + +#include "matchdaymodel.h" +#include "match.h" MatchDayModel::MatchDayModel(QObject *parent) : QAbstractTableModel(parent) { - backendkicker = new BackendKicker(this); + m_backend = new BackendKicker(this); - connect(backendkicker, SIGNAL(matchListChanged()), + connect(m_backend, SIGNAL(matchListChanged()), this, SLOT(onMatchListChanged())); } -int MatchDayModel::rowCount(const QModelIndex& index) const +int MatchDayModel::rowCount(const QModelIndex&) const { - int count = backendkicker->matchList().count(); + int count = m_backend->matchList().count(); return count; } -int MatchDayModel::columnCount(const QModelIndex& index) const +int MatchDayModel::columnCount(const QModelIndex&) const { - return 7; + return 8; } QVariant MatchDayModel::data(const QModelIndex& index, int role) const @@ -35,7 +38,7 @@ QVariant MatchDayModel::data(const QModelIndex& index, int role) const f.setPixelSize(14); - if ((match = backendkicker->matchList().at(index.row())) == NULL) { + if ((match = m_backend->matchList().at(index.row())) == NULL) { return QVariant(QVariant::Invalid); } @@ -49,6 +52,9 @@ QVariant MatchDayModel::data(const QModelIndex& index, int role) const case HomeIcon: i = match->homeEmblem().pixmap(25,25); break; + case Seperator: + i = QIcon(":/Icons/Application/football.png").pixmap(20,20); + break; } return i; break; @@ -59,19 +65,30 @@ QVariant MatchDayModel::data(const QModelIndex& index, int role) const return match->awayEmblem(); break; case AwayTeam: - return match->awayteam(); + return match->awayTeam(); break; case AwayScore: - return match->awayscore(); + if (match->state() == Match::NotStarted) { + return "-"; + } else { + return match->awayScore(); + } break; case HomeIcon: return match->homeEmblem(); break; case HomeTeam: - return match->hometeam(); + return match->homeTeam(); break; case HomeScore: - return match->homescore(); + if (match->state() == Match::NotStarted) { + return "-"; + } else { + return match->homeScore(); + } + break; + case Date: + return match->date().toString("ddd hh mm"); break; default: return QVariant(QVariant::Invalid); @@ -103,6 +120,9 @@ QVariant MatchDayModel::data(const QModelIndex& index, int role) const case Seperator: s.setWidth(3); break; + case Date: + s.setWidth(110); + break; default: return QVariant(QVariant::Invalid); break; @@ -131,6 +151,8 @@ QVariant MatchDayModel::data(const QModelIndex& index, int role) const default: return QVariant(QVariant::Invalid); } + + return QVariant(QVariant::Invalid); } @@ -147,3 +169,11 @@ void MatchDayModel::onMatchListChanged(void) index(rowCount(QModelIndex()) - 1, columnCount(QModelIndex()) - 1)); } + +void MatchDayModel::update(void) +{ + QSettings settings("David Solbach", "BuliScores"); + + this->m_backend->setLeague(settings.value("League", "1. Bundesliga").toString()); + this->m_backend->update(); +} diff --git a/src/matchdaymodel.h b/src/matchdaymodel.h index 8005e57..b99ef48 100644 --- a/src/matchdaymodel.h +++ b/src/matchdaymodel.h @@ -17,11 +17,14 @@ class MatchDayModel : public QAbstractTableModel Seperator = 3, AwayScore = 4, AwayTeam = 5, - AwayIcon = 6 + AwayIcon = 6, + Date = 7 }; private: - BackendKicker* backendkicker; + QString m_url; + BackendKicker* m_backend; + public: explicit MatchDayModel(QObject *parent = 0); @@ -30,6 +33,8 @@ public: int columnCount(const QModelIndex& index) const; QVariant data(const QModelIndex& index, int role) const; + void update(void); + signals: diff --git a/src/scoretable.cpp b/src/scoretable.cpp index b9a7145..8bf4b7d 100644 --- a/src/scoretable.cpp +++ b/src/scoretable.cpp @@ -5,11 +5,11 @@ #include "scoretable.h" #include "matchdaymodel.h" -ScoreTable::ScoreTable(QWidget *parent) : +ScoreTable::ScoreTable(QWidget *parent, MatchDayModel* model) : QTableView(parent) { this->setAttribute(Qt::WA_TranslucentBackground); - this->setModel(new MatchDayModel(this)); + this->setModel(model); this->setSelectionMode(QAbstractItemView::NoSelection); this->verticalHeader()->hide(); @@ -22,7 +22,6 @@ ScoreTable::ScoreTable(QWidget *parent) : qDebug() << "Min VertHeaderSize: " << this->verticalHeader()->minimumSectionSize(); - this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); @@ -77,3 +76,9 @@ void ScoreTable::dataChanged(const QModelIndex &topLeft, const QModelIndex &bott updateGeometry(); } + +void ScoreTable::mousePressEvent(QMouseEvent* event) +{ + event->ignore(); +} + diff --git a/src/scoretable.h b/src/scoretable.h index 3232a0c..e4f9748 100644 --- a/src/scoretable.h +++ b/src/scoretable.h @@ -2,12 +2,18 @@ #define SCORETABLE_H #include +#include + +#include "matchdaymodel.h" class ScoreTable : public QTableView { Q_OBJECT +protected: + void mousePressEvent(QMouseEvent* event); + public: - explicit ScoreTable(QWidget *parent = 0); + explicit ScoreTable(QWidget *parent, MatchDayModel* model); QSize sizeHint() const; signals: diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp new file mode 100644 index 0000000..132d66f --- /dev/null +++ b/src/settingsdialog.cpp @@ -0,0 +1,38 @@ +#include + +#include "settingsdialog.h" +#include "ui_settingsdialog.h" + +SettingsDialog::SettingsDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::SettingsDialog) +{ + QSettings settings("David Solbach", "BuliScores"); + QString league; + + ui->setupUi(this); + + league = settings.value("League", "1. Bundesliga").toString(); + + if (league == "1. Bundesliga") { + ui->rbBL1->setChecked(true); + } else if (league == "2. Bundesliga") { + ui->rbBL1->setChecked(true); + } else if (league == "tipp3 Bundesliga") { + ui->rbBL1->setChecked(true); + } else { + ui->rbBL1->setChecked(true); + } +} + +SettingsDialog::~SettingsDialog() +{ + delete ui; +} + +void SettingsDialog::closeEvent(QCloseEvent) +{ + QSettings settings("David Solbach", "BuliScores"); + + settings.setValue("League", ui->buttonGroup->checkedButton()->text()); +} diff --git a/src/settingsdialog.h b/src/settingsdialog.h new file mode 100644 index 0000000..c902c28 --- /dev/null +++ b/src/settingsdialog.h @@ -0,0 +1,26 @@ +#ifndef SETTINGSDIALOG_H +#define SETTINGSDIALOG_H + +#include +#include + +namespace Ui { + class SettingsDialog; +} + +class SettingsDialog : public QDialog +{ + Q_OBJECT + +public: + explicit SettingsDialog(QWidget *parent = 0); + ~SettingsDialog(); + +protected: + void closeEvent(QCloseEvent); + +private: + Ui::SettingsDialog *ui; +}; + +#endif // SETTINGSDIALOG_H diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui new file mode 100644 index 0000000..72267f7 --- /dev/null +++ b/src/settingsdialog.ui @@ -0,0 +1,71 @@ + + + SettingsDialog + + + + 0 + 0 + 400 + 79 + + + + Dialog + + + + + + 1. Bundesliga + + + buttonGroup + + + + + + + 2. Bundesliga + + + buttonGroup + + + + + + + tipp3 Bundesliga + + + buttonGroup + + + + + + + + + buttonGroup + buttonClicked(QAbstractButton*) + SettingsDialog + accept() + + + -1 + -1 + + + 199 + 149 + + + + + + + + diff --git a/testdata/spieltag.html b/testdata/spieltag.html new file mode 100644 index 0000000..4cc349a --- /dev/null +++ b/testdata/spieltag.html @@ -0,0 +1,1656 @@ + + + +1. Bundesliga: Spielpaarungen, Tabelle und Ergebnisse der Saison 2010/11 am 7. Spieltag - kicker online + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Zur Loginbox springen +Zur Navigation springen +Zum Inhalt springen +
+ + +
+ +
+ + + + +
+ +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+
+
+ + + +
+
+ +
+ +
+ + +
+ + +
+ +
+ +
+ +Seite versenden + +
+
+
+ + + +
+ +
+
+
+
+

+Begegnungen +

+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AnstoßHeim AuswärtsErg.BerichtiS
Fr01.10. 20:30
+ +
+
 - 
+ +
+
0:1 (0:1)Analyse
 
Sa02.10. 15:30
+ +
+
 -  +2:1 (0:1)Analyse
 
   + -  +4:2 (1:1)Analyse
 
   + -  +1:1 (0:1)Analyse
 
  
+ +
+
 - 
+ +
+
3:2 (2:1)Analyse
 
   + -  +-:- (0:0)Analyse
 
So03.10. 15:30 + -  +-:- (-:-)Analyse
 
So03.10. 17:30 + -  +-:- (0:0)Analyse
 
So03.10. 17:45 + -  +2:2 (1:0)Analyse
+ +
+
+
+
+ +
+
+
+
+ +
+
+
- Anzeige -
+ +
+
+
+
+
+
+

+Tabelle +

+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Pl.Verein Sp. g.u.v. ToreDiff. Pkte.
1
+ +
+
 7 700 18:711 21
 
2 + 7 601 18:513 18
 
3
+ +
+
 7 412 11:83 13
 
4 + 7 331 15:123 12
 
5
+ +
+
 7 403 11:110 12
 
6
+ +
+
 7 322 13:103 11
 
7
+ +
+
 7 322 12:111 11
 
8
+ +
+
 7 313 12:111 10
 
9 + 7 313 8:80 10
 
10 + 7 304 11:92 9
 
11
+ +
+
 7 232 7:8-1 9
 
12 + 7 223 5:8-3 8
 
13
+ +
+
 7 223 11:16-5 8
 
14 + 7 214 9:13-4 7
 
15 + 7 133 11:20-9 6
 
16
+ +
+
 7 124 7:13-6 5
 
17
+ +
+
 7 115 8:14-6 4
 
18
+ +
+
 7 106 12:15-3 3
+
+
+
Stand: Sa. 09.10. 12:14 Uhr
+
Durch die erste Linie sind die Champions-League-Plätze gekennzeichnet, durch die zweite der Platz für die CL-Qualifikation. Durch die dritte Linie sind die Europa-League-Plätze, durch die vierte der Relegationsplatz und durch die fünfte die Abstiegsplätze gekennzeichnet. +
+
+
+
+
+
+ +
+
+
+
+
09.10.10, 12:14
+
+ +Seite versenden + +
+
+
+ + +
+
+ +
+
+
+ +
- Anzeige -
+
+
+
+

+Matchkalender - Alle Ligen und Wettbewerbe +

+
+
+
+
+
+
+
+
Okt
+
09
+
Sa
+
+
+ +
+
+z.B.: Israel - Kroatien +
+
+
+
+
Okt
+
10
+
So
+
+
+ +
+
+z.B.: Cruzeiro - Fluminense Rio de Janeiro +
+
+
+
+
Okt
+
11
+
Mo
+
+
+ +
+
+z.B.: Brasilien - Ukraine +
+
+
+
+
Okt
+
12
+
Di
+
+
+ +
+
+z.B.: Weißrussland - Albanien +
+
+
+ +
+
+
+
+
+
+ + +
+1 von 6 +
+
+ +
+
+
+
+
- Anzeige -
+
- Anzeige -
+ + + + +
+
- Anzeige -
+ +
+
+ +
+ + +
+
+
+ + + + + + + + + + + + + + + +
HOMENewsGamesCommunityAbo & ShopTools & Servicenach oben
  + + + + + + + + + + 
+
 
+

+Kontakt | Impressum | +Links | Mediadaten | AGB | Datenschutzhinweis +

+

+developed by Netbiscuits +- powered by netpioneer +

+

+Weitere Angebote des Olympia Verlags:
+alpin.de | berge.de | unterwasser.de +| olympia-verlag.de +

+
+
+ + + +
+ +
+ +
+ +
+
- Anzeige -
+ +
+
+ +
+ + +
+ + -- 1.7.9.5