I started to move stuff around, c'mon, hate on meee. PS: if your (clean) build is broken - let me know)
authorsheepluva
Wed, 28 Sep 2011 19:27:56 +0200
changeset 6060 fdfc01419815
parent 6059 ddf020d0941a
child 6061 15b4b485a1c5
I started to move stuff around, c'mon, hate on meee. PS: if your (clean) build is broken - let me know)
QTfrontend/CMakeLists.txt
QTfrontend/SquareLabel.cpp
QTfrontend/SquareLabel.h
QTfrontend/about.cpp
QTfrontend/about.h
QTfrontend/ammoSchemeModel.cpp
QTfrontend/ammoSchemeModel.h
QTfrontend/bgwidget.cpp
QTfrontend/bgwidget.h
QTfrontend/chatwidget.cpp
QTfrontend/chatwidget.h
QTfrontend/databrowser.cpp
QTfrontend/databrowser.h
QTfrontend/drawmapwidget.cpp
QTfrontend/drawmapwidget.h
QTfrontend/fpsedit.cpp
QTfrontend/fpsedit.h
QTfrontend/frameTeam.cpp
QTfrontend/frameTeam.h
QTfrontend/gamecfgwidget.cpp
QTfrontend/gamecfgwidget.h
QTfrontend/hats.cpp
QTfrontend/hats.h
QTfrontend/hedgehogerWidget.cpp
QTfrontend/hedgehogerWidget.h
QTfrontend/hwmap.cpp
QTfrontend/hwmap.h
QTfrontend/igbox.cpp
QTfrontend/igbox.h
QTfrontend/input_ip.cpp
QTfrontend/input_ip.h
QTfrontend/itemNum.cpp
QTfrontend/itemNum.h
QTfrontend/misc.cpp
QTfrontend/misc.h
QTfrontend/namegen.cpp
QTfrontend/namegen.h
QTfrontend/net/hwmap.cpp
QTfrontend/net/hwmap.h
QTfrontend/net/netregister.cpp
QTfrontend/net/netregister.h
QTfrontend/net/netserver.cpp
QTfrontend/net/netserver.h
QTfrontend/net/netudpserver.cpp
QTfrontend/net/netudpserver.h
QTfrontend/net/netudpwidget.cpp
QTfrontend/net/netudpwidget.h
QTfrontend/net/newnetclient.cpp
QTfrontend/net/newnetclient.h
QTfrontend/net/proto.cpp
QTfrontend/net/proto.h
QTfrontend/net/tcpBase.cpp
QTfrontend/net/tcpBase.h
QTfrontend/netregister.cpp
QTfrontend/netregister.h
QTfrontend/netserver.cpp
QTfrontend/netserver.h
QTfrontend/netserverslist.cpp
QTfrontend/netserverslist.h
QTfrontend/netudpserver.cpp
QTfrontend/netudpserver.h
QTfrontend/netudpwidget.cpp
QTfrontend/netudpwidget.h
QTfrontend/newnetclient.cpp
QTfrontend/newnetclient.h
QTfrontend/pageadmin.cpp
QTfrontend/pageadmin.h
QTfrontend/pagecampaign.cpp
QTfrontend/pagecampaign.h
QTfrontend/pageconnecting.cpp
QTfrontend/pageconnecting.h
QTfrontend/pagedata.cpp
QTfrontend/pagedata.h
QTfrontend/pagedrawmap.cpp
QTfrontend/pagedrawmap.h
QTfrontend/pageeditteam.cpp
QTfrontend/pageeditteam.h
QTfrontend/pagegamestats.cpp
QTfrontend/pagegamestats.h
QTfrontend/pageinfo.cpp
QTfrontend/pageinfo.h
QTfrontend/pageingame.cpp
QTfrontend/pageingame.h
QTfrontend/pagemain.cpp
QTfrontend/pagemain.h
QTfrontend/pagemultiplayer.cpp
QTfrontend/pagemultiplayer.h
QTfrontend/pagenet.cpp
QTfrontend/pagenet.h
QTfrontend/pagenetgame.cpp
QTfrontend/pagenetgame.h
QTfrontend/pagenetserver.cpp
QTfrontend/pagenetserver.h
QTfrontend/pagenettype.cpp
QTfrontend/pagenettype.h
QTfrontend/pageoptions.cpp
QTfrontend/pageoptions.h
QTfrontend/pageplayrecord.cpp
QTfrontend/pageplayrecord.h
QTfrontend/pageroomslist.cpp
QTfrontend/pageroomslist.h
QTfrontend/pagescheme.cpp
QTfrontend/pagescheme.h
QTfrontend/pageselectweapon.cpp
QTfrontend/pageselectweapon.h
QTfrontend/pagesingleplayer.cpp
QTfrontend/pagesingleplayer.h
QTfrontend/pagetraining.cpp
QTfrontend/pagetraining.h
QTfrontend/proto.cpp
QTfrontend/proto.h
QTfrontend/qaspectratiolayout.cpp
QTfrontend/qaspectratiolayout.h
QTfrontend/selectWeapon.cpp
QTfrontend/selectWeapon.h
QTfrontend/tcpBase.cpp
QTfrontend/tcpBase.h
QTfrontend/team.cpp
QTfrontend/teamselect.cpp
QTfrontend/teamselect.h
QTfrontend/teamselhelper.cpp
QTfrontend/teamselhelper.h
QTfrontend/themesmodel.cpp
QTfrontend/themesmodel.h
QTfrontend/togglebutton.cpp
QTfrontend/togglebutton.h
QTfrontend/ui/dialog/input_ip.cpp
QTfrontend/ui/dialog/input_ip.h
QTfrontend/ui/model/ammoSchemeModel.cpp
QTfrontend/ui/model/ammoSchemeModel.h
QTfrontend/ui/model/hats.cpp
QTfrontend/ui/model/hats.h
QTfrontend/ui/model/netserverslist.cpp
QTfrontend/ui/model/netserverslist.h
QTfrontend/ui/model/themesmodel.cpp
QTfrontend/ui/model/themesmodel.h
QTfrontend/ui/page/pageadmin.cpp
QTfrontend/ui/page/pageadmin.h
QTfrontend/ui/page/pagecampaign.cpp
QTfrontend/ui/page/pagecampaign.h
QTfrontend/ui/page/pageconnecting.cpp
QTfrontend/ui/page/pageconnecting.h
QTfrontend/ui/page/pagedata.cpp
QTfrontend/ui/page/pagedata.h
QTfrontend/ui/page/pagedrawmap.cpp
QTfrontend/ui/page/pagedrawmap.h
QTfrontend/ui/page/pageeditteam.cpp
QTfrontend/ui/page/pageeditteam.h
QTfrontend/ui/page/pagegamestats.cpp
QTfrontend/ui/page/pagegamestats.h
QTfrontend/ui/page/pageinfo.cpp
QTfrontend/ui/page/pageinfo.h
QTfrontend/ui/page/pageingame.cpp
QTfrontend/ui/page/pageingame.h
QTfrontend/ui/page/pagemain.cpp
QTfrontend/ui/page/pagemain.h
QTfrontend/ui/page/pagemultiplayer.cpp
QTfrontend/ui/page/pagemultiplayer.h
QTfrontend/ui/page/pagenet.cpp
QTfrontend/ui/page/pagenet.h
QTfrontend/ui/page/pagenetgame.cpp
QTfrontend/ui/page/pagenetgame.h
QTfrontend/ui/page/pagenetserver.cpp
QTfrontend/ui/page/pagenetserver.h
QTfrontend/ui/page/pagenettype.cpp
QTfrontend/ui/page/pagenettype.h
QTfrontend/ui/page/pageoptions.cpp
QTfrontend/ui/page/pageoptions.h
QTfrontend/ui/page/pageplayrecord.cpp
QTfrontend/ui/page/pageplayrecord.h
QTfrontend/ui/page/pageroomslist.cpp
QTfrontend/ui/page/pageroomslist.h
QTfrontend/ui/page/pagescheme.cpp
QTfrontend/ui/page/pagescheme.h
QTfrontend/ui/page/pageselectweapon.cpp
QTfrontend/ui/page/pageselectweapon.h
QTfrontend/ui/page/pagesingleplayer.cpp
QTfrontend/ui/page/pagesingleplayer.h
QTfrontend/ui/page/pagetraining.cpp
QTfrontend/ui/page/pagetraining.h
QTfrontend/ui/qaspectratiolayout.cpp
QTfrontend/ui/qaspectratiolayout.h
QTfrontend/ui/widget/SquareLabel.cpp
QTfrontend/ui/widget/SquareLabel.h
QTfrontend/ui/widget/about.cpp
QTfrontend/ui/widget/about.h
QTfrontend/ui/widget/bgwidget.cpp
QTfrontend/ui/widget/bgwidget.h
QTfrontend/ui/widget/chatwidget.cpp
QTfrontend/ui/widget/chatwidget.h
QTfrontend/ui/widget/databrowser.cpp
QTfrontend/ui/widget/databrowser.h
QTfrontend/ui/widget/drawmapwidget.cpp
QTfrontend/ui/widget/drawmapwidget.h
QTfrontend/ui/widget/fpsedit.cpp
QTfrontend/ui/widget/fpsedit.h
QTfrontend/ui/widget/frameTeam.cpp
QTfrontend/ui/widget/frameTeam.h
QTfrontend/ui/widget/gamecfgwidget.cpp
QTfrontend/ui/widget/gamecfgwidget.h
QTfrontend/ui/widget/hedgehogerWidget.cpp
QTfrontend/ui/widget/hedgehogerWidget.h
QTfrontend/ui/widget/igbox.cpp
QTfrontend/ui/widget/igbox.h
QTfrontend/ui/widget/itemNum.cpp
QTfrontend/ui/widget/itemNum.h
QTfrontend/ui/widget/misc.cpp
QTfrontend/ui/widget/misc.h
QTfrontend/ui/widget/selectWeapon.cpp
QTfrontend/ui/widget/selectWeapon.h
QTfrontend/ui/widget/teamselect.cpp
QTfrontend/ui/widget/teamselect.h
QTfrontend/ui/widget/teamselhelper.cpp
QTfrontend/ui/widget/teamselhelper.h
QTfrontend/ui/widget/togglebutton.cpp
QTfrontend/ui/widget/togglebutton.h
QTfrontend/ui/widget/vertScrollArea.cpp
QTfrontend/ui/widget/vertScrollArea.h
QTfrontend/ui/widget/weaponItem.cpp
QTfrontend/ui/widget/weaponItem.h
QTfrontend/util/namegen.cpp
QTfrontend/util/namegen.h
QTfrontend/vertScrollArea.cpp
QTfrontend/vertScrollArea.h
QTfrontend/weaponItem.cpp
QTfrontend/weaponItem.h
--- a/QTfrontend/CMakeLists.txt	Wed Sep 28 06:24:10 2011 +0200
+++ b/QTfrontend/CMakeLists.txt	Wed Sep 28 19:27:56 2011 +0200
@@ -28,6 +28,13 @@
 find_package(SDL_mixer REQUIRED)
 
 include_directories(.)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/net)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ui)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ui/dialog)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ui/page)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ui/model)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ui/widget)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/util)
 include_directories(${SDL_INCLUDE_DIR})
 include_directories(${SDLMIXER_INCLUDE_DIR})
 include_directories(${CMAKE_SOURCE_DIR}/misc/quazip)
@@ -57,77 +64,28 @@
 
 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/hwconsts.cpp.in ${CMAKE_CURRENT_BINARY_DIR}/hwconsts.cpp)
 
+file(GLOB NetCpp ${CMAKE_CURRENT_SOURCE_DIR} net/*.cpp)
+file(GLOB_RECURSE UIcpp ${CMAKE_CURRENT_SOURCE_DIR} ui/*.cpp)
+file(GLOB UtilCpp ${CMAKE_CURRENT_SOURCE_DIR} util/*.cpp)
+
 set(hwfr_src
-    HWApplication.cpp
-    game.cpp
-    main.cpp
-    hwform.cpp
-    team.cpp
-    namegen.cpp
-    teamselect.cpp
-    teamselhelper.cpp
-    frameTeam.cpp
-    vertScrollArea.cpp
-    gameuiconfig.cpp
-    ui_hwform.cpp
-    gamecfgwidget.cpp
+    ${NetCpp}
+    ${UIcpp}
+    ${UtilCpp}
     AbstractPage.cpp
-    pagemain.cpp
-    pageeditteam.cpp
-    pagemultiplayer.cpp
-    pageoptions.cpp
-    pagenet.cpp
-    pagenetserver.cpp
-    pagenetgame.cpp
-    pageinfo.cpp
-    pagedata.cpp
-    pagesingleplayer.cpp
-    pagetraining.cpp
-    pagecampaign.cpp
-    pageselectweapon.cpp
-    pageingame.cpp
-    pageroomslist.cpp
-    pageconnecting.cpp
-    pagescheme.cpp
-    pagegamestats.cpp
-    pageplayrecord.cpp
-    pageadmin.cpp
-    pagenettype.cpp
-    pagedrawmap.cpp
-    SquareLabel.cpp
-    hats.cpp
-    hedgehogerWidget.cpp
-    hwmap.cpp
+    achievements.cpp
+    binds.cpp
+    drawmapscene.cpp
+    game.cpp
+    gameuiconfig.cpp
+    HWApplication.cpp
+    hwform.cpp
+    main.cpp
     mapContainer.cpp
-    tcpBase.cpp
-    about.cpp
-    proto.cpp
-    fpsedit.cpp
-    netserver.cpp
-    newnetclient.cpp
-    netudpserver.cpp
-    netudpwidget.cpp
-    netregister.cpp
-    netserverslist.cpp
-    chatwidget.cpp
-    binds.cpp
     SDLs.cpp
+    team.cpp
+    ui_hwform.cpp
     ${CMAKE_CURRENT_BINARY_DIR}/hwconsts.cpp
-    selectWeapon.cpp
-    itemNum.cpp
-    input_ip.cpp
-    igbox.cpp
-    weaponItem.cpp
-    misc.cpp
-    ammoSchemeModel.cpp
-    togglebutton.cpp
-    bgwidget.cpp
-    achievements.cpp
-    qaspectratiolayout.cpp
-    drawmapwidget.cpp
-    drawmapscene.cpp
-    themesmodel.cpp
-    databrowser.cpp
     )
 
 #xfire integration
@@ -146,77 +104,33 @@
     set(hwfr_src ${hwfr_src} hedgewars.rc)
 endif(MINGW)
 
+file(GLOB NetHdr ${CMAKE_CURRENT_SOURCE_DIR} net/*.h)
+file(GLOB_RECURSE UIhdr ${CMAKE_CURRENT_SOURCE_DIR} ui/*.h)
+file(GLOB UtilHdr ${CMAKE_CURRENT_SOURCE_DIR} util/*.h)
+
+
 set(hwfr_moc_hdrs
-    HWApplication.h
-    game.h
-    hats.h
-    hwform.h
-    teamselect.h
-    teamselhelper.h
-    frameTeam.h
-    vertScrollArea.h
-    gameuiconfig.h
-    gamecfgwidget.h
+    ${NetHdr}
+    ${UIhdr}
     AbstractPage.h
-    pagenet.h
-    pagemultiplayer.h
-    pagenetserver.h
-    pageingame.h
-    pagetraining.h
-    pageeditteam.h
-    pageoptions.h
-    pagemain.h
-    pageinfo.h
-    pagedata.h
-    pagesingleplayer.h
-    pagenettype.h
-    pageconnecting.h
-    pagedrawmap.h
-    pagecampaign.h
-    pagenetgame.h
-    pageroomslist.h
-    pagegamestats.h
-    pageadmin.h
-    pagescheme.h
-    pageselectweapon.h
-    pageplayrecord.h
-    SquareLabel.h
-    hedgehogerWidget.h
-    hwmap.h
+    drawmapscene.h
+    game.h
+    gameuiconfig.h
+    HWApplication.h
+    hwform.h
     mapContainer.h
-    tcpBase.h
-    about.h
-    proto.h
-    fpsedit.h
-    netserver.h
-    newnetclient.h
-    netudpserver.h
-    netudpwidget.h
-    netregister.h
-    netserverslist.h
-    chatwidget.h
     SDLs.h
-    selectWeapon.h
-    itemNum.h
-    input_ip.h
-    igbox.h
-    weaponItem.h
-    misc.h
-    ammoSchemeModel.h
-    togglebutton.h
-    bgwidget.h
-    qaspectratiolayout.h
-    drawmapwidget.h
-    drawmapscene.h
-    themesmodel.h
-    databrowser.h
     )
 
 set(hwfr_hdrs
+    ${UtilHdr}
+    team.h
+    achievements.h
     binds.h
     ui_hwform.h
     KB.h
     hwconsts.h
+    sdlkeys.h
     )
 
 set(hwfr_rez hedgewars.qrc)
--- a/QTfrontend/SquareLabel.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QPaintEvent>
-#include <QPainter>
-#include "SquareLabel.h"
-#include "hwform.h"
-
-SquareLabel::SquareLabel(QWidget * parent) :
-    QWidget(parent)
-{
-    if(frontendEffects) setAttribute(Qt::WA_PaintOnScreen, true);
-}
-
-void SquareLabel::paintEvent(QPaintEvent * event)
-{
-    Q_UNUSED(event);
-
-    QPainter painter(this);
-    int pixsize;
-    if (width() > height()) {
-        pixsize = height();
-        painter.translate((width() - pixsize) / 2, 0);
-    } else {
-        pixsize = width();
-        painter.translate(0, (height() - pixsize) / 2);
-    }
-    painter.drawPixmap(0, 0, pixsize, pixsize, pixmap.scaled(pixsize, pixsize, Qt::KeepAspectRatio));
-}
-
-void SquareLabel::setPixmap(const QPixmap & pixmap)
-{
-    this->pixmap = pixmap;
-    repaint();
-}
--- a/QTfrontend/SquareLabel.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef _SQUARELABEL_H
-#define _SQUARELABEL_H
-
-#include <QWidget>
-#include <QPixmap>
-
-class SquareLabel : public QWidget
-{
-    Q_OBJECT
-
-public:
-    SquareLabel(QWidget * parent = 0);
-
-    void setPixmap(const QPixmap & pixmap);
-protected:
-    virtual void paintEvent(QPaintEvent * event);
-
-private:
-    QPixmap pixmap;
-
-};
-
-#endif // _SQUARELABEL_H
--- a/QTfrontend/about.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,146 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QGridLayout>
-#include <QLabel>
-#include <QTextBrowser>
-#include "about.h"
-#include "hwconsts.h"
-
-About::About(QWidget * parent) :
-  QWidget(parent)
-{
-    QGridLayout *mainLayout = new QGridLayout(this);
-
-    QLabel *imageLabel = new QLabel;
-    QImage image(":/res/Hedgehog.png");
-    imageLabel->setPixmap(QPixmap::fromImage(image));
-    imageLabel->setScaledContents(true);
-    imageLabel->setMinimumWidth(2.8);
-    imageLabel->setMaximumWidth(280);
-    imageLabel->setMinimumHeight(30);
-    imageLabel->setMaximumHeight(300);
-
-    mainLayout->addWidget(imageLabel, 0, 0, 2, 1);
-
-    QLabel *lbl1 = new QLabel(this);
-    lbl1->setOpenExternalLinks(true);
-    lbl1->setText(
-            "<style type=\"text/css\">"
-            "a { color: #ffcc00; }"
-//            "a:hover { color: yellow; }"
-            "</style>"
-            "<div align=\"center\"><h1>Hedgewars</h1>"
-            "<h3>" + QLabel::tr("Version") + " " + *cVersionString + "</h3>"
-            "<p><a href=\"http://www.hedgewars.org/\">http://www.hedgewars.org/</a></p><br>" +
-            QLabel::tr("This program is distributed under the GNU General Public License") +
-            "</div>"
-            );
-    lbl1->setWordWrap(true);
-    mainLayout->addWidget(lbl1, 0, 1);
-
-    QTextBrowser *lbl2 = new QTextBrowser(this);
-
-    lbl2->setOpenExternalLinks(true);
-    lbl2->setText(
-            "<style type=\"text/css\">"
-            "a { color: #ffcc00; }"
-//            "a:hover { color: yellow; }"
-            "</style>" +
-            QString("<h2>") +
-            QLabel::tr("Developers:") +
-            "</h2><p>"
-            "Engine, frontend, net server: Andrey Korotaev &lt;<a href=\"mailto:unC0Rr@gmail.com\">unC0Rr@gmail.com</a>&gt;<br>"
-            "Many frontend improvements: Igor Ulyanov &lt;<a href=\"mailto:disinbox@gmail.com\">disinbox@gmail.com</a>&gt;<br>"
-            "Many engine and frontend improvements: Derek Pomery &lt;<a href=\"mailto:nemo@m8y.org\">nemo@m8y.org</a>&gt;<br>"
-            "Drill rocket, Ballgun, RC Plane weapons: Martin Boze &lt;<a href=\"mailto:afffect@gmail.com\">afffect@gmail.com</a>&gt;<br>"
-            "Mine number and time game settings: David A. Cuadrado &lt;<a href=\"mailto:krawek@gmail.com\">krawek@gmail.com</a>&gt;<br>"
-            "Frontend improvements: Martin Minarik &lt;<a href=\"mailto:ttsmj@pokec.sk\">ttsmj@pokec.sk</a>&gt;<br>"
-            "Frontend improvements: Kristian Lehmann &lt;<a href=\"mailto:email@thexception.net\">email@thexception.net</a>&gt;<br>"
-            "Mac OS X/iPhone port, OpenGL-ES conversion: Vittorio Giovara &lt;<a href=\"mailto:vittorio.giovara@gmail.com\">vittorio.giovara@gmail.com</a>&gt;<br>"
-            "Many engine and frontend improvements (and bugs): Richard Karolyi &lt;<a href=\"mailto:sheepluva@" "ercatec.net\">sheepluva@" "ercatec.net</a>&gt;<br>"
-            "Gamepad and Lua integration: Mario Liebisch &lt;<a href=\"mailto:mario.liebisch@gmail.com\">mario.liebisch@gmail.com</a>&gt;<br>"
-            "Many engine improvements and graphics: Carlos Vives &lt;<a href=\"mailto:mail@carlosvives.es\">mail@carlosvives.es</a>&gt;<br>"
-            "Maze maps: Henning K&uuml;hn &lt;<a href=\"mailto:prg@cooco.de\">prg@cooco.de</a>&gt;<br>"
-            "Engine and frontend improvements: Henrik Rostedt &lt;<a href=\"mailto:henrik.rostedt@gmail.com\">henrik.rostedt@gmail.com</a>&gt;<br>"
-            "Lua game modes and missions: John Lambert &lt;<a href=\"mailto:redgrinner@gmail.com\">redgrinner@gmail.com</a>&gt;<br>"
-            "Frontend improvements: Mayur Pawashe &lt;<a href=\"mailto:zorgiepoo@gmail.com\">zorgiepoo@gmail.com</a>&gt;<br>"
-            "Android port: Richard Deurwaarder &lt;<a href=\"mailto:xeli@xelification.com\">xeli@xelification.com</a>&gt;<br>"
-            "</p><h2>" +
-
-            QLabel::tr("Art:") + "</h2>"
-            + QString::fromUtf8(
-            "<p>John Dum &lt;<a href=\"mailto:fizzy@gmail.com\">fizzy@gmail.com</a>&gt;"
-            "<br>"
-            "Joshua Frese &lt;<a href=\"mailto:joshfrese@gmail.com\">joshfrese@gmail.com</a>&gt;"
-            "<br>"
-            "Stanko Tadić &lt;<a href=\"mailto:stanko@mfhinc.net\">stanko@mfhinc.net</a>&gt;"
-            "<br>"
-            "Julien Koesten &lt;<a href=\"mailto:julienkoesten@aol.com\">julienkoesten@aol.com</a>&gt;"
-            "<br>"
-            "Joshua O'Sullivan &lt;<a href=\"mailto:coheedftw@hotmail.co.uk\">coheedftw@hotmail.co.uk</a>&gt;"
-            "<br>"
-            "Nils Lück &lt;<a href=\"mailto:nils.luck.design@gmail.com\">nils.luck.design@gmail.com</a>&gt;"
-            "<br>"
-            "Guillaume Englert &lt;<a href=\"mailto:genglert@hybird.org\">genglert@hybird.org</a>&gt;"
-            "<br>"
-            "Hats: Trey Perry &lt;<a href=\"mailto:tx.perry.j@gmail.com\">tx.perry.j@gmail.com</a>&gt;"
-            "</p><h2>") +
-            QLabel::tr("Sounds:") + "</h2>"
-            "Hedgehogs voice: Stephen Alexander &lt;<a href=\"mailto:ArmagonNo1@gmail.com\">ArmagonNo1@gmail.com</a>&gt;"
-            "<br>"
-            "John Dum &lt;<a href=\"mailto:fizzy@gmail.com\">fizzy@gmail.com</a>&gt;"
-            "<br>"
-            "Jonatan Nilsson &lt;<a href=\"mailto:jonatanfan@gmail.com\">jonatanfan@gmail.com</a>&gt;"
-            "<br>"
-            "Daniel Martin &lt;<a href=\"mailto:elhombresinremedio@gmail.com\">elhombresinremedio@gmail.com</a>&gt;"
-            "</p><h2>" +
-
-            QLabel::tr("Translations:") + "</h2><p>"
-            + QString::fromUtf8(
-            "Brazilian Portuguese: Romulo Fernandes Machado &lt;<a href=\"mailto:abra185@gmail.com\">abra185@gmail.com</a>&gt;<br>"
-            "Bulgarian: Svetoslav Stefanov<br>"
-            "Czech: Petr Řezáček &lt;<a href=\"mailto:rezacek@gmail.com\">rezacek@gmail.com</a>&gt;<br>"
-            "Chinese: Jie Luo &lt;<a href=\"mailto:lililjlj@gmail.com\">lililjlj@gmail.com</a>&gt;<br>"
-            "English: Andrey Korotaev &lt;<a href=\"mailto:unC0Rr@gmail.com\">unC0Rr@gmail.com</a>&gt;<br>"
-            "Finnish: Nina Kuisma &lt;<a href=\"mailto:ninnnu@gmail.com\">ninnnu@gmail.com</a>&gt;<br>"
-            "French: Antoine Turmel &lt;<a href=\"mailto:geekshadow@gmail.com\">geekshadow@gmail.com</a>&gt;<br>"
-            "German: Peter Hüwe &lt;<a href=\"mailto:PeterHuewe@gmx.de\">PeterHuewe@gmx.de</a>&gt;, Mario Liebisch &lt;<a href=\"mailto:mario.liebisch@gmail.com\">mario.liebisch@gmail.com</a>&gt;, Richard Karolyi &lt;<a href=\"mailto:sheepluva@" "ercatec.net\">sheepluva@" "ercatec.net</a>&gt;<br>"
-            "Greek: &lt;<a href=\"mailto:talos_kriti@yahoo.gr\">talos_kriti@yahoo.gr</a>&gt;<br>"
-            "Italian: Luca Bonora &lt;<a href=\"mailto:bonora.luca@gmail.com\">bonora.luca@gmail.com</a>&gt;, Marco Bresciani<br>"
-            "Japanese: ADAM Etienne &lt;<a href=\"mailto:etienne.adam@gmail.com\">etienne.adam@gmail.com</a>&gt;<br>"
-            "Korean: Anthony Bellew &lt;<a href=\"mailto:webmaster@anthonybellew.com\">webmaster@anthonybellew.com</a>&gt;<br>"
-            "Lithuanian: Lukas Urbonas &lt;<a href=\"mailto:lukasu08@gmail.com\">lukasu08@gmail.com</a>&gt;<br>"
-            "Polish: Maciej Mroziński &lt;<a href=\"mailto:mynick2@o2.pl\">mynick2@o2.pl</a>&gt;, Wojciech Latkowski &lt;<a href=\"mailto:magik17l@gmail.com\">magik17l@gmail.com</a>&gt;, Piotr Mitana, Maciej Górny<br>"
-            "Portuguese: Fábio Canário &lt;<a href=\"mailto:inufabie@gmail.com\">inufabie@gmail.com</a>&gt;<br>"
-            "Russian: Andrey Korotaev &lt;<a href=\"mailto:unC0Rr@gmail.com\">unC0Rr@gmail.com</a>&gt;<br>"
-            "Slovak: Jose Riha<br>"
-            "Spanish: Carlos Vives &lt;<a href=\"mailto:mail@carlosvives.es\">mail@carlosvives.es</a>&gt;<br>"
-            "Swedish: Niklas Grahn &lt;<a href=\"mailto:raewolusjoon@yaoo.com\">raewolusjoon@yaoo.com</a>&gt;, Henrik Rostedt &lt;<a href=\"mailto:henrik.rostedt@gmail.com\">henrik.rostedt@gmail.com</a>&gt;<br>"
-            "Ukrainian: Eugene V. Lyubimkin &lt;<a href=\"mailto:jackyf.devel@gmail.com\">jackyf.devel@gmail.com</a>&gt;, Igor Paliychuk &lt;<a href=\"mailto:mansonigor@gmail.com\">mansonigor@gmail.com</a>&gt;, Eugene Sakara &lt;<a href=\"mailto:eresid@gmail.com\">eresid@gmail.com</a>&gt;"
-            "</p><h2>") +
-
-            QLabel::tr("Special thanks:") + "</h2><p>"
-            "Aleksey Andreev &lt;<a href=\"mailto:blaknayabr@gmail.com\">blaknayabr@gmail.com</a>&gt;<br>"
-            "Aleksander Rudalev &lt;<a href=\"mailto:alexv@pomorsu.ru\">alexv@pomorsu.ru</a>&gt;<br>"
-            "Natasha Korotaeva &lt;<a href=\"mailto:layout@pisem.net\">layout@pisem.net</a>&gt;<br>"
-            "Adam Higerd (aka ahigerd at FreeNode)"
-            "</p>"
-            );
-    mainLayout->addWidget(lbl2, 1, 1);
-}
--- a/QTfrontend/about.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef _ABOUT_H
-#define _ABOUT_H
-
-#include <QWidget>
-
-
-class About : public QWidget
-{
-    Q_OBJECT
-
-public:
-    About(QWidget * parent = 0);
-};
-
-#endif // _ABOUT_H
--- a/QTfrontend/ammoSchemeModel.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,786 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2005-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QDebug>
-#include <QModelIndex>
-
-#include "ammoSchemeModel.h"
-#include "hwconsts.h"
-
-QList<QVariant> defaultScheme = QList<QVariant>()
-        << QVariant("Default")     // name           0
-        << QVariant(false)         // fortsmode      1
-        << QVariant(false)         // team divide    2
-        << QVariant(false)         // solid land     3
-        << QVariant(false)         // border         4
-        << QVariant(false)         // low gravity    5
-        << QVariant(false)         // laser sight    6
-        << QVariant(false)         // invulnerable   7
-        << QVariant(false)         // reset health   8
-        << QVariant(false)         // vampiric       9
-        << QVariant(false)         // karma          10
-        << QVariant(false)         // artillery      11
-        << QVariant(true)          // random order   12
-        << QVariant(false)         // king           13
-        << QVariant(false)         // place hog      14
-        << QVariant(false)         // shared ammo    15
-        << QVariant(false)         // disable girders 16
-        << QVariant(false)         // disable land objects 17
-        << QVariant(false)         // AI survival    18
-        << QVariant(false)         // inf. attack    19
-        << QVariant(false)         // reset weps     20
-        << QVariant(false)         // per hog ammo   21
-        << QVariant(false)         // no wind        22
-        << QVariant(false)         // more wind      23
-        << QVariant(false)         // tag team       24
-        << QVariant(false)         // bottom border  25
-        << QVariant(100)           // damage modfier 26
-        << QVariant(45)            // turn time      27
-        << QVariant(100)           // init health    28
-        << QVariant(15)            // sudden death   29
-        << QVariant(5)             // case prob      30
-        << QVariant(3)             // mines time     31
-        << QVariant(4)             // mines number   32
-        << QVariant(0)             // mine dud pct   33
-        << QVariant(2)             // explosives     34
-        << QVariant(35)            // health case pct 35
-        << QVariant(25)            // health case amt 36
-        << QVariant(47)            // water rise amt 37
-        << QVariant(5)             // health dec amt 38
-        << QVariant(100)           // rope modfier   39
-        << QVariant(100)           // get away time  40
-        ;
-
-AmmoSchemeModel::AmmoSchemeModel(QObject* parent, const QString & fileName) :
-    QAbstractTableModel(parent),
-    fileConfig(fileName, QSettings::IniFormat)
-{
-    predefSchemesNames = QStringList()
-        << "Default"
-        << "Pro Mode"
-        << "Shoppa"
-        << "Clean Slate"
-        << "Minefield"
-        << "Barrel Mayhem"
-        << "Tunnel Hogs"
-        << "Fort Mode"
-        << "Timeless"
-        << "Thinking with Portals"
-        << "King Mode"
-        ;
-
-    numberOfDefaultSchemes = predefSchemesNames.size();
-
-    spNames = QStringList()
-        << "name"                //  0
-        << "fortsmode"           //  1
-        << "divteams"            //  2
-        << "solidland"           //  3
-        << "border"              //  4
-        << "lowgrav"             //  5
-        << "laser"               //  6
-        << "invulnerability"     //  7
-        << "resethealth"         //  8
-        << "vampiric"            //  9
-        << "karma"               // 10
-        << "artillery"           // 11
-        << "randomorder"         // 12
-        << "king"                // 13
-        << "placehog"            // 14
-        << "sharedammo"          // 15
-        << "disablegirders"      // 16
-        << "disablelandobjects"  // 17
-        << "aisurvival"          // 18
-        << "infattack"           // 19
-        << "resetweps"           // 20
-        << "perhogammo"          // 21
-        << "disablewind"         // 22
-        << "morewind"            // 23
-        << "tagteam"             // 24
-        << "bottomborder"        // 25
-        << "damagefactor"        // 26
-        << "turntime"            // 27
-        << "health"              // 28
-        << "suddendeath"         // 29
-        << "caseprobability"     // 30
-        << "minestime"           // 31
-        << "minesnum"            // 32
-        << "minedudpct"          // 33
-        << "explosives"          // 34
-        << "healthprobability"   // 35
-        << "healthcaseamount"    // 36
-        << "waterrise"           // 37
-        << "healthdecrease"      // 38
-        << "ropepct"             // 39
-        << "getawaytime"         // 40
-        ;
-
-    QList<QVariant> proMode;
-    proMode
-        << predefSchemesNames[1]   // name           0
-        << QVariant(false)         // fortsmode      1
-        << QVariant(false)         // team divide    2
-        << QVariant(false)         // solid land     3
-        << QVariant(false)         // border         4
-        << QVariant(false)         // low gravity    5
-        << QVariant(false)         // laser sight    6
-        << QVariant(false)         // invulnerable   7
-        << QVariant(false)         // reset health   8
-        << QVariant(false)         // vampiric       9
-        << QVariant(false)         // karma          10
-        << QVariant(false)         // artillery      11
-        << QVariant(true)          // random order   12
-        << QVariant(false)         // king           13
-        << QVariant(false)         // place hog      14
-        << QVariant(true)          // shared ammo    15
-        << QVariant(false)         // disable girders 16
-        << QVariant(false)         // disable land objects 17
-        << QVariant(false)         // AI survival    18
-        << QVariant(false)         // inf. attack    19
-        << QVariant(false)         // reset weps     20
-        << QVariant(false)         // per hog ammo   21
-        << QVariant(false)         // no wind        22
-        << QVariant(false)         // more wind      23
-        << QVariant(false)         // tag team       24
-        << QVariant(false)         // bottom border  25
-        << QVariant(100)           // damage modfier 26
-        << QVariant(15)            // turn time      27
-        << QVariant(100)           // init health    28
-        << QVariant(15)            // sudden death   29
-        << QVariant(0)             // case prob      30
-        << QVariant(3)             // mines time     31
-        << QVariant(0)             // mines number   32
-        << QVariant(0)             // mine dud pct   33
-        << QVariant(2)             // explosives     34
-        << QVariant(35)            // health case pct 35
-        << QVariant(25)            // health case amt 36
-        << QVariant(47)            // water rise amt 37
-        << QVariant(5)             // health dec amt 38
-        << QVariant(100)           // rope modfier   39
-        << QVariant(100)           // get away time  40
-        ;
-
-    QList<QVariant> shoppa;
-    shoppa
-        << predefSchemesNames[2]   // name           0
-        << QVariant(false)         // fortsmode      1
-        << QVariant(false)         // team divide    2
-        << QVariant(true)          // solid land     3
-        << QVariant(true)          // border         4
-        << QVariant(false)         // low gravity    5
-        << QVariant(false)         // laser sight    6
-        << QVariant(false)         // invulnerable   7
-        << QVariant(false)         // reset health   8
-        << QVariant(false)         // vampiric       9
-        << QVariant(false)         // karma          10
-        << QVariant(false)         // artillery      11
-        << QVariant(true)          // random order   12
-        << QVariant(false)         // king           13
-        << QVariant(false)         // place hog      14
-        << QVariant(true)          // shared ammo    15
-        << QVariant(true)          // disable girders 16
-        << QVariant(false)         // disable land objects 17
-        << QVariant(false)         // AI survival    18
-        << QVariant(false)         // inf. attack    19
-        << QVariant(true)          // reset weps     20
-        << QVariant(false)         // per hog ammo   21
-        << QVariant(false)         // no wind        22
-        << QVariant(false)         // more wind      23
-        << QVariant(false)         // tag team       24
-        << QVariant(false)         // bottom border  25
-        << QVariant(100)           // damage modfier 26
-        << QVariant(30)            // turn time      27
-        << QVariant(100)           // init health    28
-        << QVariant(50)            // sudden death   29
-        << QVariant(1)             // case prob      30
-        << QVariant(3)             // mines time     31
-        << QVariant(0)             // mines number   32
-        << QVariant(0)             // mine dud pct   33
-        << QVariant(0)             // explosives     34
-        << QVariant(0)             // health case pct 35
-        << QVariant(25)            // health case amt 36
-        << QVariant(47)            // water rise amt 37
-        << QVariant(5)             // health dec amt 38
-        << QVariant(100)           // rope modfier   39
-        << QVariant(100)           // get away time  40
-        ;
-
-    QList<QVariant> cleanslate;
-    cleanslate
-        << predefSchemesNames[3]   // name           0
-        << QVariant(false)         // fortsmode      1
-        << QVariant(false)         // team divide    2
-        << QVariant(false)         // solid land     3
-        << QVariant(false)         // border         4
-        << QVariant(false)         // low gravity    5
-        << QVariant(false)         // laser sight    6
-        << QVariant(false)         // invulnerable   7
-        << QVariant(true)          // reset health   8
-        << QVariant(false)         // vampiric       9
-        << QVariant(false)         // karma          10
-        << QVariant(false)         // artillery      11
-        << QVariant(true)          // random order   12
-        << QVariant(false)         // king           13
-        << QVariant(false)         // place hog      14
-        << QVariant(false)         // shared ammo    15
-        << QVariant(false)         // disable girders 16
-        << QVariant(false)         // disable land objects 17
-        << QVariant(false)         // AI survival    18
-        << QVariant(true)          // inf. attack    19
-        << QVariant(true)          // reset weps     20
-        << QVariant(false)         // per hog ammo   21
-        << QVariant(false)         // no wind        22
-        << QVariant(false)         // more wind      23
-        << QVariant(false)         // tag team       24
-        << QVariant(false)         // bottom border  25
-        << QVariant(100)           // damage modfier 26
-        << QVariant(45)            // turn time      27
-        << QVariant(100)           // init health    28
-        << QVariant(15)            // sudden death   29
-        << QVariant(5)             // case prob      30
-        << QVariant(3)             // mines time     31
-        << QVariant(4)             // mines number   32
-        << QVariant(0)             // mine dud pct   33
-        << QVariant(2)             // explosives     34
-        << QVariant(35)            // health case pct 35
-        << QVariant(25)            // health case amt 36
-        << QVariant(47)            // water rise amt 37
-        << QVariant(5)             // health dec amt 38
-        << QVariant(100)           // rope modfier   39
-        << QVariant(100)           // get away time  40
-        ;
-
-    QList<QVariant> minefield;
-    minefield
-        << predefSchemesNames[4]   // name           0
-        << QVariant(false)         // fortsmode      1
-        << QVariant(false)         // team divide    2
-        << QVariant(false)         // solid land     3
-        << QVariant(false)         // border         4
-        << QVariant(false)         // low gravity    5
-        << QVariant(false)         // laser sight    6
-        << QVariant(false)         // invulnerable   7
-        << QVariant(false)         // reset health   8
-        << QVariant(false)         // vampiric       9
-        << QVariant(false)         // karma          10
-        << QVariant(false)         // artillery      11
-        << QVariant(true)          // random order   12
-        << QVariant(false)         // king           13
-        << QVariant(false)         // place hog      14
-        << QVariant(true)          // shared ammo    15
-        << QVariant(true)          // disable girders 16
-        << QVariant(false)         // disable land objects 17
-        << QVariant(false)         // AI survival    18
-        << QVariant(false)         // inf. attack    19
-        << QVariant(false)         // reset weps     20
-        << QVariant(false)         // per hog ammo   21
-        << QVariant(false)         // no wind        22
-        << QVariant(false)         // more wind      23
-        << QVariant(false)         // tag team       24
-        << QVariant(false)         // bottom border  25
-        << QVariant(100)           // damage modfier 26
-        << QVariant(30)            // turn time      27
-        << QVariant(50)            // init health    28
-        << QVariant(15)            // sudden death   29
-        << QVariant(0)             // case prob      30
-        << QVariant(0)             // mines time     31
-        << QVariant(80)            // mines number   32
-        << QVariant(0)             // mine dud pct   33
-        << QVariant(0)             // explosives     34
-        << QVariant(35)            // health case pct 35
-        << QVariant(25)            // health case amt 36
-        << QVariant(47)            // water rise amt 37
-        << QVariant(5)             // health dec amt 38
-        << QVariant(100)           // rope modfier   39
-        << QVariant(100)           // get away time  40
-        ;
-
-    QList<QVariant> barrelmayhem;
-    barrelmayhem
-        << predefSchemesNames[5]   // name           0
-        << QVariant(false)         // fortsmode      1
-        << QVariant(false)         // team divide    2
-        << QVariant(false)         // solid land     3
-        << QVariant(false)         // border         4
-        << QVariant(false)         // low gravity    5
-        << QVariant(false)         // laser sight    6
-        << QVariant(false)         // invulnerable   7
-        << QVariant(false)         // reset health   8
-        << QVariant(false)         // vampiric       9
-        << QVariant(false)         // karma          10
-        << QVariant(false)         // artillery      11
-        << QVariant(true)          // random order   12
-        << QVariant(false)         // king           13
-        << QVariant(false)         // place hog      14
-        << QVariant(true)          // shared ammo    15
-        << QVariant(false)         // disable girders 16
-        << QVariant(false)         // disable land objects 17
-        << QVariant(false)         // AI survival    18
-        << QVariant(false)         // inf. attack    19
-        << QVariant(false)         // reset weps     20
-        << QVariant(false)         // per hog ammo   21
-        << QVariant(false)         // no wind        22
-        << QVariant(false)         // more wind      23
-        << QVariant(false)         // tag team       24
-        << QVariant(false)         // bottom border  25
-        << QVariant(100)           // damage modfier 26
-        << QVariant(30)            // turn time      27
-        << QVariant(100)           // init health    28
-        << QVariant(15)            // sudden death   29
-        << QVariant(0)             // case prob      30
-        << QVariant(0)             // mines time     31
-        << QVariant(0)             // mines number   32
-        << QVariant(0)             // mine dud pct   33
-        << QVariant(80)            // explosives     34
-        << QVariant(35)            // health case pct 35
-        << QVariant(25)            // health case amt 36
-        << QVariant(47)            // water rise amt 37
-        << QVariant(5)             // health dec amt 38
-        << QVariant(100)           // rope modfier   39
-        << QVariant(100)           // get away time  40
-        ;
-
-    QList<QVariant> tunnelhogs;
-    tunnelhogs
-        << predefSchemesNames[6]   // name           0
-        << QVariant(false)         // fortsmode      1
-        << QVariant(false)         // team divide    2
-        << QVariant(false)         // solid land     3
-        << QVariant(true)          // border         4
-        << QVariant(false)         // low gravity    5
-        << QVariant(false)         // laser sight    6
-        << QVariant(false)         // invulnerable   7
-        << QVariant(false)         // reset health   8
-        << QVariant(false)         // vampiric       9
-        << QVariant(false)         // karma          10
-        << QVariant(false)         // artillery      11
-        << QVariant(true)          // random order   12
-        << QVariant(false)         // king           13
-        << QVariant(false)         // place hog      14
-        << QVariant(true)          // shared ammo    15
-        << QVariant(true)          // disable girders 16
-        << QVariant(true)          // disable land objects 17
-        << QVariant(false)         // AI survival    18
-        << QVariant(false)         // inf. attack    19
-        << QVariant(false)         // reset weps     20
-        << QVariant(false)         // per hog ammo   21
-        << QVariant(false)         // no wind        22
-        << QVariant(false)         // more wind      23
-        << QVariant(false)         // tag team       24
-        << QVariant(false)         // bottom border  25
-        << QVariant(100)           // damage modfier 26
-        << QVariant(30)            // turn time      27
-        << QVariant(100)           // init health    28
-        << QVariant(15)            // sudden death   29
-        << QVariant(5)             // case prob      30
-        << QVariant(3)             // mines time     31
-        << QVariant(10)            // mines number   32
-        << QVariant(10)            // mine dud pct   33
-        << QVariant(10)            // explosives     34
-        << QVariant(35)            // health case pct 35
-        << QVariant(25)            // health case amt 36
-        << QVariant(47)            // water rise amt 37
-        << QVariant(5)             // health dec amt 38
-        << QVariant(100)           // rope modfier   39
-        << QVariant(100)           // get away time  40
-        ;
-
-    QList<QVariant> forts;
-    forts
-        << predefSchemesNames[7]   // name           0
-        << QVariant(true)          // fortsmode      1
-        << QVariant(true)          // team divide    2
-        << QVariant(false)         // solid land     3
-        << QVariant(false)         // border         4
-        << QVariant(true)          // low gravity    5
-        << QVariant(false)         // laser sight    6
-        << QVariant(false)         // invulnerable   7
-        << QVariant(false)         // reset health   8
-        << QVariant(false)         // vampiric       9
-        << QVariant(false)         // karma          10
-        << QVariant(false)         // artillery      11
-        << QVariant(true)          // random order   12
-        << QVariant(false)         // king           13
-        << QVariant(false)         // place hog      14
-        << QVariant(false)         // shared ammo    15
-        << QVariant(false)         // disable girders 16
-        << QVariant(false)         // disable land objects 17
-        << QVariant(false)         // AI survival    18
-        << QVariant(false)         // inf. attack    19
-        << QVariant(false)         // reset weps     20
-        << QVariant(false)         // per hog ammo   21
-        << QVariant(false)         // no wind        22
-        << QVariant(false)         // more wind      23
-        << QVariant(false)         // tag team       24
-        << QVariant(false)         // bottom border  25
-        << QVariant(100)           // damage modfier 26
-        << QVariant(45)            // turn time      27
-        << QVariant(100)           // init health    28
-        << QVariant(15)            // sudden death   29
-        << QVariant(5)             // case prob      30
-        << QVariant(3)             // mines time     31
-        << QVariant(0)             // mines number   32
-        << QVariant(0)             // mine dud pct   33
-        << QVariant(0)             // explosives     34
-        << QVariant(35)            // health case pct 35
-        << QVariant(25)            // health case amt 36
-        << QVariant(47)            // water rise amt 37
-        << QVariant(5)             // health dec amt 38
-        << QVariant(100)           // rope modfier   39
-        << QVariant(100)           // get away time  40
-        ;
-
-    QList<QVariant> timeless;
-    timeless
-        << predefSchemesNames[8]   // name           0
-        << QVariant(false)         // fortsmode      1
-        << QVariant(false)         // team divide    2
-        << QVariant(false)         // solid land     3
-        << QVariant(false)         // border         4
-        << QVariant(false)         // low gravity    5
-        << QVariant(false)         // laser sight    6
-        << QVariant(false)         // invulnerable   7
-        << QVariant(false)         // reset health   8
-        << QVariant(false)         // vampiric       9
-        << QVariant(false)         // karma          10
-        << QVariant(false)         // artillery      11
-        << QVariant(true)          // random order   12
-        << QVariant(false)         // king           13
-        << QVariant(false)         // place hog      14
-        << QVariant(false)         // shared ammo    15
-        << QVariant(false)         // disable girders 16
-        << QVariant(false)         // disable land objects 17
-        << QVariant(false)         // AI survival    18
-        << QVariant(false)         // inf. attack    19
-        << QVariant(false)         // reset weps     20
-        << QVariant(true)          // per hog ammo   21
-        << QVariant(false)         // no wind        22
-        << QVariant(false)         // more wind      23
-        << QVariant(false)         // tag team       24
-        << QVariant(false)         // bottom border  25
-        << QVariant(100)           // damage modfier 26
-        << QVariant(9999)          // turn time      27
-        << QVariant(100)           // init health    28
-        << QVariant(15)            // sudden death   29
-        << QVariant(5)             // case prob      30
-        << QVariant(3)             // mines time     31
-        << QVariant(5)             // mines number   32
-        << QVariant(10)            // mine dud pct   33
-        << QVariant(2)             // explosives     34
-        << QVariant(35)            // health case pct 35
-        << QVariant(30)            // health case amt 36
-        << QVariant(0)             // water rise amt 37
-        << QVariant(0)             // health dec amt 38
-        << QVariant(100)           // rope modfier   39
-        << QVariant(100)           // get away time  40
-        ;
-
-    QList<QVariant> thinkingportals;
-    thinkingportals
-        << predefSchemesNames[9]   // name           0
-        << QVariant(false)         // fortsmode      1
-        << QVariant(false)         // team divide    2
-        << QVariant(false)         // solid land     3
-        << QVariant(false)         // border         4
-        << QVariant(false)         // low gravity    5
-        << QVariant(false)         // laser sight    6
-        << QVariant(false)         // invulnerable   7
-        << QVariant(false)         // reset health   8
-        << QVariant(false)         // vampiric       9
-        << QVariant(false)         // karma          10
-        << QVariant(true)          // artillery      11
-        << QVariant(true)          // random order   12
-        << QVariant(false)         // king           13
-        << QVariant(false)         // place hog      14
-        << QVariant(false)         // shared ammo    15
-        << QVariant(false)         // disable girders 16
-        << QVariant(false)         // disable land objects 17
-        << QVariant(false)         // AI survival    18
-        << QVariant(false)         // inf. attack    19
-        << QVariant(false)         // reset weps     20
-        << QVariant(false)         // per hog ammo   21
-        << QVariant(false)         // no wind        22
-        << QVariant(false)         // more wind      23
-        << QVariant(false)         // tag team       24
-        << QVariant(false)         // bottom border  25
-        << QVariant(100)           // damage modfier 26
-        << QVariant(45)            // turn time      27
-        << QVariant(100)           // init health    28
-        << QVariant(15)            // sudden death   29
-        << QVariant(2)             // case prob      30
-        << QVariant(3)             // mines time     31
-        << QVariant(5)             // mines number   32
-        << QVariant(0)             // mine dud pct   33
-        << QVariant(5)             // explosives     34
-        << QVariant(25)            // health case pct 35
-        << QVariant(25)            // health case amt 36
-        << QVariant(47)            // water rise amt 37
-        << QVariant(5)             // health dec amt 38
-        << QVariant(100)           // rope modfier   39
-        << QVariant(100)           // get away time  40
-        ;
-
-    QList<QVariant> kingmode;
-    kingmode
-        << predefSchemesNames[10]  // name           0
-        << QVariant(false)         // fortsmode      1
-        << QVariant(false)         // team divide    2
-        << QVariant(false)         // solid land     3
-        << QVariant(false)         // border         4
-        << QVariant(false)         // low gravity    5
-        << QVariant(false)         // laser sight    6
-        << QVariant(false)         // invulnerable   7
-        << QVariant(false)         // reset health   8
-        << QVariant(false)         // vampiric       9
-        << QVariant(false)         // karma          10
-        << QVariant(false)         // artillery      11
-        << QVariant(true)          // random order   12
-        << QVariant(true)          // king           13
-        << QVariant(false)         // place hog      14
-        << QVariant(false)         // shared ammo    15
-        << QVariant(false)         // disable girders 16
-        << QVariant(false)         // disable land objects 17
-        << QVariant(false)         // AI survival    18
-        << QVariant(false)         // inf. attack    19
-        << QVariant(false)         // reset weps     20
-        << QVariant(false)         // per hog ammo   21
-        << QVariant(false)         // no wind        22
-        << QVariant(false)         // more wind      23
-        << QVariant(false)         // tag team       24
-        << QVariant(false)         // bottom border  25
-        << QVariant(100)           // damage modfier 26
-        << QVariant(45)            // turn time      27
-        << QVariant(100)           // init health    28
-        << QVariant(15)            // sudden death   29
-        << QVariant(5)             // case prob      30
-        << QVariant(3)             // mines time     31
-        << QVariant(4)             // mines number   32
-        << QVariant(0)             // mine dud pct   33
-        << QVariant(2)             // explosives     34
-        << QVariant(35)            // health case pct 35
-        << QVariant(25)            // health case amt 36
-        << QVariant(47)            // water rise amt 37
-        << QVariant(5)             // health dec amt 38
-        << QVariant(100)           // rope modfier   39
-        << QVariant(100)           // get away time  40
-        ;
-
-
-    schemes.append(defaultScheme);
-    schemes.append(proMode);
-    schemes.append(shoppa);
-    schemes.append(cleanslate);
-    schemes.append(minefield);
-    schemes.append(barrelmayhem);
-    schemes.append(tunnelhogs);
-    schemes.append(forts);
-    schemes.append(timeless);
-    schemes.append(thinkingportals);
-    schemes.append(kingmode);
-
-
-    int size = fileConfig.beginReadArray("schemes");
-    for (int i = 0; i < size; ++i) {
-        fileConfig.setArrayIndex(i);
-
-        if (!predefSchemesNames.contains(fileConfig.value(spNames[0]).toString()))
-        {
-            QList<QVariant> scheme;
-
-            for (int k = 0; k < spNames.size(); ++k)
-                scheme << fileConfig.value(spNames[k], defaultScheme[k]);
-
-            schemes.append(scheme);
-        }
-    }
-    fileConfig.endArray();
-}
-
-QVariant AmmoSchemeModel::headerData(int section, Qt::Orientation orientation, int role) const
-{
-    Q_UNUSED(section);
-    Q_UNUSED(orientation);
-    Q_UNUSED(role);
-
-    return QVariant();
-}
-
-int AmmoSchemeModel::rowCount(const QModelIndex &parent) const
-{
-    if (parent.isValid())
-        return 0;
-    else
-        return schemes.size();
-}
-
-int AmmoSchemeModel::columnCount(const QModelIndex & parent) const
-{
-    if (parent.isValid())
-        return 0;
-    else
-        return defaultScheme.size();
-}
-
-Qt::ItemFlags AmmoSchemeModel::flags(const QModelIndex & index) const
-{
-    Q_UNUSED(index);
-
-    return
-        Qt::ItemIsEnabled
-        | Qt::ItemIsSelectable
-        | Qt::ItemIsEditable;
-}
-
-bool AmmoSchemeModel::setData(const QModelIndex & index, const QVariant & value, int role)
-{
-    if (!index.isValid() || index.row() < numberOfDefaultSchemes
-        || index.row() >= schemes.size()
-        || index.column() >= defaultScheme.size()
-        || role != Qt::EditRole)
-        return false;
-
-    schemes[index.row()][index.column()] = value;
-
-    emit dataChanged(index, index);
-    return true;
-}
-
-bool AmmoSchemeModel::insertRows(int row, int count, const QModelIndex & parent)
-{
-    Q_UNUSED(count);
-
-    beginInsertRows(parent, schemes.size(), schemes.size());
-
-    if (row == -1)
-    {
-        QList<QVariant> newScheme = defaultScheme;
-        newScheme[0] = QVariant(tr("new"));
-        schemes.insert(schemes.size(), newScheme);
-    }
-    else
-    {
-        QList<QVariant> newScheme = schemes[row];
-        newScheme[0] = QVariant(tr("copy of") + " " + newScheme[0].toString());
-        schemes.insert(schemes.size(), newScheme);
-    }
-
-    endInsertRows();
-
-    return true;
-}
-
-bool AmmoSchemeModel::removeRows(int row, int count, const QModelIndex & parent)
-{
-    if(count != 1
-        || row < numberOfDefaultSchemes
-        || row >= schemes.size())
-        return false;
-
-    beginRemoveRows(parent, row, row);
-
-    schemes.removeAt(row);
-
-    endRemoveRows();
-
-    return true;
-}
-
-QVariant AmmoSchemeModel::data(const QModelIndex &index, int role) const
-{
-    if (!index.isValid() || index.row() < 0
-        || index.row() >= schemes.size()
-        || index.column() >= defaultScheme.size()
-        || (role != Qt::EditRole && role != Qt::DisplayRole)
-        )
-        return QVariant();
-
-    return schemes[index.row()][index.column()];
-}
-
-void AmmoSchemeModel::Save()
-{
-    fileConfig.beginWriteArray("schemes", schemes.size() - numberOfDefaultSchemes);
-
-    for (int i = 0; i < schemes.size() - numberOfDefaultSchemes; ++i) {
-        fileConfig.setArrayIndex(i);
-
-        QList<QVariant> scheme = schemes[i + numberOfDefaultSchemes];
-
-        for (int k = 0; k < scheme.size(); ++k)
-            fileConfig.setValue(spNames[k], scheme[k]);
-    }
-    fileConfig.endArray();
-}
-
-
-NetAmmoSchemeModel::NetAmmoSchemeModel(QObject * parent) :
-    QAbstractTableModel(parent)
-{
-    netScheme = defaultScheme;
-}
-
-QVariant NetAmmoSchemeModel::headerData(int section, Qt::Orientation orientation, int role) const
-{
-    Q_UNUSED(section);
-    Q_UNUSED(orientation);
-    Q_UNUSED(role);
-
-    return QVariant();
-}
-
-int NetAmmoSchemeModel::rowCount(const QModelIndex & parent) const
-{
-    if (parent.isValid())
-        return 0;
-    else
-        return 1;
-}
-
-int NetAmmoSchemeModel::columnCount(const QModelIndex & parent) const
-{
-    if (parent.isValid())
-        return 0;
-    else
-        return defaultScheme.size();
-}
-
-QVariant NetAmmoSchemeModel::data(const QModelIndex &index, int role) const
-{
-    if (!index.isValid() || index.row() < 0
-        || index.row() > 1
-        || index.column() >= defaultScheme.size()
-        || (role != Qt::EditRole && role != Qt::DisplayRole)
-        )
-        return QVariant();
-
-    return netScheme[index.column()];
-}
-
-void NetAmmoSchemeModel::setNetSchemeConfig(QStringList & cfg)
-{
-    if(cfg.size() != netScheme.size())
-    {
-        qWarning("Incorrect scheme cfg size");
-        return;
-    }
-
-    for(int i = 0; i < cfg.size(); ++i)
-        netScheme[i] = QVariant(cfg[i]);
-
-    reset();
-}
--- a/QTfrontend/ammoSchemeModel.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2005-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef _AMMO_SCHEME_MODEL_INCLUDED
-#define _AMMO_SCHEME_MODEL_INCLUDED
-
-#include <QSettings>
-#include <QAbstractTableModel>
-#include <QStringList>
-#include <QList>
-
-class AmmoSchemeModel : public QAbstractTableModel
-{
-    Q_OBJECT
-
-public:
-    AmmoSchemeModel(QObject * parent, const QString & fileName);
-
-    QVariant headerData(int section, Qt::Orientation orientation, int role) const;
-    int rowCount(const QModelIndex & parent) const;
-    int columnCount(const QModelIndex & parent) const;
-    Qt::ItemFlags flags(const QModelIndex & index) const;
-    bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole);
-    bool insertRows(int row, int count, const QModelIndex & parent = QModelIndex());
-    bool removeRows(int row, int count, const QModelIndex & parent = QModelIndex());
-    QVariant data(const QModelIndex &index, int role) const;
-
-    int numberOfDefaultSchemes;
-    QStringList predefSchemesNames;
-    QStringList spNames;
-
-public slots:
-    void Save();
-
-signals:
-    void dataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight);
-
-protected:
-    QList< QList<QVariant> > schemes;
-
-private:
-    QSettings fileConfig;
-};
-
-class NetAmmoSchemeModel : public QAbstractTableModel
-{
-    Q_OBJECT
-
-public:
-    NetAmmoSchemeModel(QObject * parent);
-
-    QVariant headerData(int section, Qt::Orientation orientation, int role) const;
-    int rowCount(const QModelIndex & parent) const;
-    int columnCount(const QModelIndex & parent) const;
-    QVariant data(const QModelIndex &index, int role) const;
-
-public slots:
-    void setNetSchemeConfig(QStringList & cfg);
-
-private:
-    QList<QVariant> netScheme;
-};
-
-#endif // _AMMO_SCHEME_MODEL_INCLUDED
--- a/QTfrontend/bgwidget.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,143 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2009 Kristian Lehmann <email@thexception.net>
- * Copyright (c) 2009-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include "bgwidget.h"
-
-SpritePosition::SpritePosition(QWidget * parent, int sh)
-{
-    wParent = parent;
-    iSpriteHeight = sh;
-    reset();
-}
-
-SpritePosition::~SpritePosition()
-{
-}
-
-void SpritePosition::move()
-{
-    fX += fXMov;
-    fY += fYMov;
-    iAngle += 4;
-    if (iAngle >= 360) iAngle = 0;
-    if (fY > wParent->height()) reset();
-}
-
-void SpritePosition::reset()
-{
-    fY = -1 * iSpriteHeight;
-    fX = (qrand() % ((int)(wParent->width() * 1.5))) - wParent->width()/2;
-    fYMov = ((qrand() % 400)+300) / 100.0f;
-    fXMov = fYMov * 0.2f+((qrand()%100)/100.0f * 0.6f); //so between 0.2 and 0.6, or 0.5 +/- 0.3
-    iAngle = qrand() % 360;
-}
-
-QPoint SpritePosition::pos()
-{
-    return QPoint((int)fX,(int)fY);
-}
-
-int SpritePosition::getAngle()
-{
-    return iAngle;
-}
-
-void SpritePosition::init()
-{
-    fY = qrand() % (wParent->height() + 1);
-    fX = qrand() % (wParent->width() + 1);
-}
-
-BGWidget::BGWidget(QWidget * parent) : QWidget(parent)
-{
-    setAttribute(Qt::WA_NoSystemBackground, true);
-    sprite.load(":/res/Star.png");
-
-    setAutoFillBackground(false);
-
-    for (int i = 0; i < SPRITE_MAX; i++) spritePositions[i] = new SpritePosition(this, sprite.height());
-
-    for (int i = 0; i < 360; i++)
-    {
-        rotatedSprites[i] = new QImage(sprite.width(), sprite.height(), QImage::Format_ARGB32);
-        rotatedSprites[i]->fill(0);
-
-        QPoint translate(sprite.width()/2, sprite.height()/2);
-
-        QPainter p;
-        p.begin(rotatedSprites[i]);
-    //  p.setRenderHint(QPainter::Antialiasing);
-        p.setRenderHint(QPainter::SmoothPixmapTransform);
-        p.translate(translate.x(), translate.y());
-        p.rotate(i);
-        p.translate(-1*translate.x(), -1*translate.y());
-        p.drawImage(0, 0, sprite);
-    }
-
-    timerAnimation = new QTimer();
-    connect(timerAnimation, SIGNAL(timeout()), this, SLOT(animate()));
-    timerAnimation->setInterval(ANIMATION_INTERVAL);
-}
-
-BGWidget::~BGWidget()
-{
-    for (int i = 0; i < SPRITE_MAX; i++) delete spritePositions[i];
-    for (int i = 0; i < 360; i++) delete rotatedSprites[i];
-    delete timerAnimation;
-}
-
-void BGWidget::paintEvent(QPaintEvent *event)
-{
-    Q_UNUSED(event);
-
-    QPainter p;
-    p.begin(this);
-    //p.setRenderHint(QPainter::Antialiasing);
-    for (int i = 0; i < SPRITE_MAX; i++)
-    {
-        QPoint point = spritePositions[i]->pos();
-        p.drawImage(point.x(), point.y(), *rotatedSprites[spritePositions[i]->getAngle()]);
-    }
-    p.end();
-}
-
-void BGWidget::animate()
-{
-    for (int i = 0; i < SPRITE_MAX; i++)
-    {
-        // bottom edge of star *seems* clipped, but in fact, if I switch to just plain old repaint()/update() it is still clipped - artifact of transform?  As for 5, is arbitrary number. 4 was noticeably clipping, 5 seemed same as update() - I assume extra room is due to rotation and value really should be calculated proportional to width/height
-        update(spritePositions[i]->pos().x(),spritePositions[i]->pos().y(), sprite.width()+5, sprite.height()+5);
-        spritePositions[i]->move();
-    }
-}
-
-void BGWidget::startAnimation()
-{
-    timerAnimation->start();
-}
-
-void BGWidget::stopAnimation()
-{
-    timerAnimation->stop();
-}
-
-void BGWidget::init()
-{
-    for (int i = 0; i < SPRITE_MAX; i++) spritePositions[i]->init();
-}
--- a/QTfrontend/bgwidget.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2009 Kristian Lehmann <email@thexception.net>
- * Copyright (c) 2009-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef BGWIDGET_H
-#define BGWIDGET_H
-
-#include <QWidget>
-//#include <QGLWidget>
-#include <QPainter>
-#include <QTimer>
-#include <QPaintEvent>
-#include <QTime>
-#include <QPoint>
-
-#define SPRITE_MAX 12
-
-#define ANIMATION_INTERVAL 40
-
-class SpritePosition
-{
-public:
-    SpritePosition(QWidget * parent, int sh);
-    ~SpritePosition();
-private:
-    float fX;
-    float fY;
-    float fXMov;
-    float fYMov;
-    int iAngle;
-    QWidget * wParent;
-    int iSpriteHeight;
-public:
-    void move();
-    void reset();
-    QPoint pos();
-    int getAngle();
-    void init();
-};
-
-class BGWidget : public QWidget
-{
-    Q_OBJECT
-public:
-    BGWidget(QWidget * parent);
-    ~BGWidget();
-    void startAnimation();
-    void stopAnimation();
-    void init();
-private:
-    QImage sprite;
-    QTimer * timerAnimation;
-    SpritePosition * spritePositions[SPRITE_MAX];
-    QImage * rotatedSprites[360];
-protected:
-    void paintEvent(QPaintEvent * event);
-private slots:
-    void animate();
-};
-
-#endif // BGWIDGET_H
--- a/QTfrontend/chatwidget.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,584 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2007 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QDesktopServices>
-#include <QTextBrowser>
-#include <QLineEdit>
-#include <QAction>
-#include <QTextDocument>
-#include <QDir>
-#include <QSettings>
-#include <QFile>
-#include <QTextStream>
-#include <QMenu>
-#include <QCursor>
-#include <QScrollBar>
-#include <QItemSelectionModel>
-#include <QStringList>
-
-#include "hwconsts.h"
-#include "SDLs.h"
-#include "gameuiconfig.h"
-#include "chatwidget.h"
-
-ListWidgetNickItem::ListWidgetNickItem(const QString& nick, bool isFriend, bool isIgnored) : QListWidgetItem(nick)
-{
-    this->aFriend = isFriend;
-    this->isIgnored = isIgnored;
-}
-
-void ListWidgetNickItem::setFriend(bool isFriend)
-{
-    this->aFriend = isFriend;
-}
-
-void ListWidgetNickItem::setIgnored(bool isIgnored)
-{
-    this->isIgnored = isIgnored;
-}
-
-bool ListWidgetNickItem::isFriend()
-{
-    return aFriend;
-}
-
-bool ListWidgetNickItem::ignored()
-{
-    return isIgnored;
-}
-
-bool ListWidgetNickItem::operator< (const QListWidgetItem & other) const
-{
-    // case in-sensitive comparison of the associated strings
-    // chars that are no letters are sorted at the end of the list
-
-    ListWidgetNickItem otherNick = const_cast<ListWidgetNickItem &>(dynamic_cast<const ListWidgetNickItem &>(other));
-
-    // ignored always down
-    if (isIgnored != otherNick.ignored())
-        return !isIgnored;
-
-    // friends always up
-    if (aFriend != otherNick.isFriend())
-        return aFriend;
-
-    QString txt1 = text().toLower();
-    QString txt2 = other.text().toLower();
-
-    bool firstIsShorter = (txt1.size() < txt2.size());
-    int len = firstIsShorter?txt1.size():txt2.size();
-
-    for (int i = 0; i < len; i++)
-    {
-        if (txt1[i] == txt2[i])
-            continue;
-        if (txt1[i].isLetter() != txt2[i].isLetter())
-            return txt1[i].isLetter();
-        return (txt1[i] < txt2[i]);
-    }
-
-    return firstIsShorter;
-}
-
-const char* HWChatWidget::STYLE = 
-"\
-a { color:#c8c8ff; }\
-.nick { text-decoration: none; }\
-.UserChat .nick { color:#ffec20; }\
-.FriendChat { color: #08e008; }\
-.FriendChat .nick { color: #20ff20; }\
-.UserJoin { color: #c0c0c0; }\
-.UserJoin .nick { color: #d0d0d0; }\
-.FriendJoin { color: #c0e0c0; }\
-.FriendJoin .nick { color: #d0f0d0; }\
-.UserAction { color: #ff80ff; }\
-.UserAction .nick { color: #ffa0ff; }\
-.FriendAction { color: #ff00ff; }\
-.FriendAction .nick { color: #ff30ff; }\
-.Error { color: #ff0000 }\
-.Warning { color: #ff8000 }\
-.Notice { color: #fefefe }\
-";
-
-HWChatWidget::HWChatWidget(QWidget* parent, QSettings * gameSettings, SDLInteraction * sdli, bool notify) :
-  QWidget(parent),
-  mainLayout(this)
-{
-    this->gameSettings = gameSettings;
-    this->sdli = sdli;
-    this->notify = notify;
-    if(notify && gameSettings->value("frontend/sound", true).toBool()) {
-        QFile tmpfile;
-        sdli->SDLMusicInit();
-        for(int i=0;i<4;i++) {
-            tmpfile.setFileName(cfgdir->absolutePath() + "/Data/Sounds/voices/Classic/Hello.ogg");
-            if (tmpfile.exists()) sound[i] = Mix_LoadWAV(QFileInfo(tmpfile).absoluteFilePath().toLocal8Bit().constData());
-            else sound[i] = Mix_LoadWAV(QString(datadir->absolutePath() + 
-                "/Sounds/voices/Classic/Hello.ogg").toLocal8Bit().constData());
-        }
-    }
-
-    mainLayout.setSpacing(1);
-    mainLayout.setMargin(1);
-    mainLayout.setSizeConstraint(QLayout::SetMinimumSize);
-    mainLayout.setColumnStretch(0, 76);
-    mainLayout.setColumnStretch(1, 24);
-
-    chatEditLine = new QLineEdit(this);
-    chatEditLine->setMaxLength(300);
-    connect(chatEditLine, SIGNAL(returnPressed()), this, SLOT(returnPressed()));
-
-    mainLayout.addWidget(chatEditLine, 2, 0);
-
-    chatText = new QTextBrowser(this);
-    chatText->document()->setDefaultStyleSheet(STYLE);
-    chatText->setMinimumHeight(20);
-    chatText->setMinimumWidth(10);
-    chatText->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
-    chatText->setOpenLinks(false);
-    connect(chatText, SIGNAL(anchorClicked(const QUrl&)),
-        this, SLOT(linkClicked(const QUrl&)));
-    mainLayout.addWidget(chatText, 0, 0, 2, 1);
-
-    chatNicks = new QListWidget(this);
-    chatNicks->setMinimumHeight(10);
-    chatNicks->setMinimumWidth(10);
-    chatNicks->setSortingEnabled(true);
-    chatNicks->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
-    chatNicks->setContextMenuPolicy(Qt::ActionsContextMenu);
-    connect(chatNicks, SIGNAL(itemDoubleClicked(QListWidgetItem *)),
-        this, SLOT(chatNickDoubleClicked(QListWidgetItem *)));
-    connect(chatNicks, SIGNAL(currentRowChanged(int)),
-        this, SLOT(chatNickSelected(int)));
-
-    mainLayout.addWidget(chatNicks, 0, 1, 3, 1);
-
-    acInfo = new QAction(QAction::tr("Info"), chatNicks);
-    acInfo->setIcon(QIcon(":/res/info.png"));
-    connect(acInfo, SIGNAL(triggered(bool)), this, SLOT(onInfo()));
-    acKick = new QAction(QAction::tr("Kick"), chatNicks);
-    acKick->setIcon(QIcon(":/res/kick.png"));
-    connect(acKick, SIGNAL(triggered(bool)), this, SLOT(onKick()));
-    acBan = new QAction(QAction::tr("Ban"), chatNicks);
-    acBan->setIcon(QIcon(":/res/ban.png"));
-    connect(acBan, SIGNAL(triggered(bool)), this, SLOT(onBan()));
-    acFollow = new QAction(QAction::tr("Follow"), chatNicks);
-    acFollow->setIcon(QIcon(":/res/follow.png"));
-    connect(acFollow, SIGNAL(triggered(bool)), this, SLOT(onFollow()));
-    acIgnore = new QAction(QAction::tr("Ignore"), chatNicks);
-    acIgnore->setIcon(QIcon(":/res/ignore.png"));
-    connect(acIgnore, SIGNAL(triggered(bool)), this, SLOT(onIgnore()));
-    acFriend = new QAction(QAction::tr("Add friend"), chatNicks);
-    acFriend->setIcon(QIcon(":/res/addfriend.png"));
-    connect(acFriend, SIGNAL(triggered(bool)), this, SLOT(onFriend()));
-
-    chatNicks->insertAction(0, acFriend);
-    chatNicks->insertAction(0, acInfo);
-    chatNicks->insertAction(0, acIgnore);
-
-    showReady = false;
-    setShowFollow(true);
-}
-
-void HWChatWidget::linkClicked(const QUrl & link)
-{
-    if (link.scheme() == "http")
-        QDesktopServices::openUrl(link);
-    if (link.scheme() == "hwnick")
-    {
-        // decode nick
-        const QString& nick = QString::fromUtf8(QByteArray::fromBase64(link.encodedQuery()));
-        QList<QListWidgetItem *> items = chatNicks->findItems(nick, Qt::MatchExactly);
-        if (items.size() < 1)
-            return;
-        QMenu * popup = new QMenu(this);
-        // selecting an item will automatically scroll there, so let's save old position
-        QScrollBar * scrollBar = chatNicks->verticalScrollBar();
-        int oldScrollPos = scrollBar->sliderPosition();
-        // select the nick which we want to see the actions for
-        chatNicks->setCurrentItem(items[0], QItemSelectionModel::Clear);
-        // selecting an item will automatically scroll there, so let's save old position
-        scrollBar->setSliderPosition(oldScrollPos);
-        // load actions
-        popup->addActions(chatNicks->actions());
-        // display menu popup at mouse cursor position
-        popup->popup(QCursor::pos());
-    }
-}
-
-void HWChatWidget::setShowFollow(bool enabled)
-{
-    if (enabled) {
-        if (!(chatNicks->actions().contains(acFollow)))
-            chatNicks->insertAction(acFriend, acFollow);
-    }
-    else {
-        if (chatNicks->actions().contains(acFollow))
-            chatNicks->removeAction(acFollow);
-    }
-}
-
-void HWChatWidget::loadList(QStringList & list, const QString & file)
-{
-    list.clear();
-    QFile txt(cfgdir->absolutePath() + "/" + file);
-    if(!txt.open(QIODevice::ReadOnly))
-        return;
-    QTextStream stream(&txt);
-    stream.setCodec("UTF-8");
-
-    while(!stream.atEnd())
-    {
-        QString str = stream.readLine();
-        if(str.startsWith(";") || str.length() == 0)
-            continue;
-        list << str.trimmed();
-    }
-    //readd once we require newer Qt than 4.4
-    //list.removeDuplicates();
-    txt.close();
-}
-
-void HWChatWidget::saveList(QStringList & list, const QString & file)
-{
-    QFile txt(cfgdir->absolutePath() + "/" + file);
-    if(!txt.open(QIODevice::WriteOnly | QIODevice::Truncate))
-        return;
-    QTextStream stream(&txt);
-    stream.setCodec("UTF-8");
-
-    stream << "; this list is used by Hedgewars - do not edit it unless you know what you're doing!" << endl;
-    for(int i = 0; i < list.size(); i++)
-        stream << list[i] << endl;
-    txt.close();
-}
-
-void HWChatWidget::updateNickItem(QListWidgetItem *nickItem)
-{
-    QString nick = nickItem->text();
-    ListWidgetNickItem * item = dynamic_cast<ListWidgetNickItem*>(nickItem);
-
-    item->setFriend(friendsList.contains(nick, Qt::CaseInsensitive));
-    item->setIgnored(ignoreList.contains(nick, Qt::CaseInsensitive));
-
-    if(item->ignored())
-    {
-        item->setIcon(QIcon(showReady ? (item->data(Qt::UserRole).toBool() ? ":/res/chat_ignore_on.png" : ":/res/chat_ignore_off.png") : ":/res/chat_ignore.png"));
-        item->setForeground(Qt::gray);
-    }
-    else if(item->isFriend())
-    {
-        item->setIcon(QIcon(showReady ? (item->data(Qt::UserRole).toBool() ? ":/res/chat_friend_on.png" : ":/res/chat_friend_off.png") : ":/res/chat_friend.png"));
-        item->setForeground(Qt::green);
-    }
-    else
-    {
-        item->setIcon(QIcon(showReady ? (item->data(Qt::UserRole).toBool() ? ":/res/chat_default_on.png" : ":/res/chat_default_off.png") : ":/res/chat_default.png"));
-        item->setForeground(QBrush(QColor(0xff, 0xcc, 0x00)));
-    }
-}
-
-void HWChatWidget::updateNickItems()
-{
-    for(int i = 0; i < chatNicks->count(); i++)
-        updateNickItem(chatNicks->item(i));
-
-    chatNicks->sortItems();
-}
-
-void HWChatWidget::loadLists(const QString & nick)
-{
-    loadList(ignoreList, nick.toLower() + "_ignore.txt");
-    loadList(friendsList, nick.toLower() + "_friends.txt");
-    updateNickItems();
-}
-
-void HWChatWidget::saveLists(const QString & nick)
-{
-    saveList(ignoreList, nick.toLower() + "_ignore.txt");
-    saveList(friendsList, nick.toLower() + "_friends.txt");
-}
-
-void HWChatWidget::returnPressed()
-{
-    QStringList lines = chatEditLine->text().split('\n');
-    chatEditLine->clear();
-    foreach (const QString &line, lines)
-        emit chatLine(line);
-}
-
-
-void HWChatWidget::onChatString(const QString& str)
-{
-    onChatString("", str);
-}
-
-const QRegExp HWChatWidget::URLREGEXP = QRegExp("(http://)?(www\\.)?(hedgewars\\.org(/[^ ]*)?)");
-
-void HWChatWidget::onChatString(const QString& nick, const QString& str)
-{
-    bool isFriend = false;
-
-    if (!nick.isEmpty()) {
-        // don't show chat lines that are from ignored nicks
-        if (ignoreList.contains(nick, Qt::CaseInsensitive))
-            return;
-        // friends will get special treatment, of course
-        isFriend = friendsList.contains(nick, Qt::CaseInsensitive);
-    }
-
-    QString formattedStr = Qt::escape(str.mid(1));
-    // make hedgewars.org urls actual links
-    formattedStr = formattedStr.replace(URLREGEXP, "<a href=\"http://\\3\">\\3</a>");
-
-    // "link" nick, but before that encode it in base64 to make sure it can't intefere with html/url syntax
-    // the nick is put as querystring as putting it as host would convert it to it's lower case variant
-    if(!nick.isEmpty())
-        formattedStr.replace("|nick|",QString("<a href=\"hwnick://?%1\" class=\"nick\">%2</a>").arg(QString(nick.toUtf8().toBase64())).arg(nick));
-
-    QString cssClass("UserChat");
-
-    // check first character for color code and set color properly
-    switch (str[0].toAscii()) {
-        case 3:
-            cssClass = (isFriend ? "FriendJoin" : "UserJoin");
-            break;
-        case 2:
-            cssClass = (isFriend ? "FriendAction" : "UserAction");
-            break;
-        default:
-            if (isFriend)
-                cssClass = "FriendChat";
-    }
-
-    addLine(cssClass,formattedStr);
-}
-
-void HWChatWidget::addLine(const QString& cssClass, QString line)
-{
-    if (chatStrings.size() > 250)
-        chatStrings.removeFirst();
-
-    line = QString("<span class=\"%2\">%1</span>").arg(line).arg(cssClass);
-
-    chatStrings.append(line);
-
-    chatText->setHtml(chatStrings.join("<br>"));
-
-    chatText->moveCursor(QTextCursor::End);
-}
-
-void HWChatWidget::onServerMessage(const QString& str)
-{
-    if (chatStrings.size() > 250)
-        chatStrings.removeFirst();
-
-    chatStrings.append("<hr>" + str + "<hr>");
-
-    chatText->setHtml(chatStrings.join("<br>"));
-
-    chatText->moveCursor(QTextCursor::End);
-}
-
-void HWChatWidget::nickAdded(const QString& nick, bool notifyNick)
-{
-    QListWidgetItem * item = new ListWidgetNickItem(nick, friendsList.contains(nick, Qt::CaseInsensitive), ignoreList.contains(nick, Qt::CaseInsensitive));
-    updateNickItem(item);
-    chatNicks->addItem(item);
-
-    emit nickCountUpdate(chatNicks->count());
-
-    if(notifyNick && notify && gameSettings->value("frontend/sound", true).toBool()) {
-       Mix_PlayChannel(-1, sound[rand()%4], 0);
-    }
-}
-
-void HWChatWidget::nickRemoved(const QString& nick)
-{
-    foreach(QListWidgetItem * item, chatNicks->findItems(nick, Qt::MatchExactly))
-        chatNicks->takeItem(chatNicks->row(item));
-
-    emit nickCountUpdate(chatNicks->count());
-}
-
-void HWChatWidget::clear()
-{
-    chatText->clear();
-    chatStrings.clear();
-    chatNicks->clear();
-}
-
-void HWChatWidget::onKick()
-{
-    QListWidgetItem * curritem = chatNicks->currentItem();
-    if (curritem)
-        emit kick(curritem->text());
-}
-
-void HWChatWidget::onBan()
-{
-    QListWidgetItem * curritem = chatNicks->currentItem();
-    if (curritem)
-        emit ban(curritem->text());
-}
-
-void HWChatWidget::onInfo()
-{
-    QListWidgetItem * curritem = chatNicks->currentItem();
-    if (curritem)
-        emit info(curritem->text());
-}
-
-void HWChatWidget::onFollow()
-{
-    QListWidgetItem * curritem = chatNicks->currentItem();
-    if (curritem)
-        emit follow(curritem->text());
-}
-
-void HWChatWidget::onIgnore()
-{
-    QListWidgetItem * curritem = chatNicks->currentItem();
-    if(!curritem)
-        return;
-
-    if(ignoreList.contains(curritem->text(), Qt::CaseInsensitive)) // already on list - remove him
-    {
-        ignoreList.removeAll(curritem->text().toLower());
-        onChatString(HWChatWidget::tr("%1 *** %2 has been removed from your ignore list").arg('\x03').arg(curritem->text()));
-    }
-    else // not on list - add
-    {
-        // don't consider ignored people friends
-        if(friendsList.contains(curritem->text(), Qt::CaseInsensitive))
-            emit onFriend();
-
-        // scroll down on first ignore added so that people see where that nick went to
-        if (ignoreList.isEmpty())
-            chatNicks->scrollToBottom();
-
-        ignoreList << curritem->text().toLower();
-        onChatString(HWChatWidget::tr("%1 *** %2 has been added to your ignore list").arg('\x03').arg(curritem->text()));
-    }
-    updateNickItem(curritem); // update icon/sort order/etc
-    chatNicks->sortItems();
-    chatNickSelected(0); // update context menu
-}
-
-void HWChatWidget::onFriend()
-{
-    QListWidgetItem * curritem = chatNicks->currentItem();
-    if(!curritem)
-        return;
-
-    if(friendsList.contains(curritem->text(), Qt::CaseInsensitive)) // already on list - remove him
-    {
-        friendsList.removeAll(curritem->text().toLower());
-        onChatString(HWChatWidget::tr("%1 *** %2 has been removed from your friends list").arg('\x03').arg(curritem->text()));
-    }
-    else // not on list - add
-    {
-        // don't ignore the new friend
-        if(ignoreList.contains(curritem->text(), Qt::CaseInsensitive))
-            emit onIgnore();
-
-        // scroll up on first friend added so that people see where that nick went to
-        if (friendsList.isEmpty())
-            chatNicks->scrollToTop();
-
-        friendsList << curritem->text().toLower();
-        onChatString(HWChatWidget::tr("%1 *** %2 has been added to your friends list").arg('\x03').arg(curritem->text()));
-    }
-    updateNickItem(curritem); // update icon/sort order/etc
-    chatNicks->sortItems();
-    chatNickSelected(0); // update context menu
-}
-
-void HWChatWidget::chatNickDoubleClicked(QListWidgetItem * item)
-{
-    Q_UNUSED(item);
-
-    QList<QAction *> actions = chatNicks->actions();
-    actions.first()->activate(QAction::Trigger);
-}
-
-void HWChatWidget::chatNickSelected(int index)
-{
-    Q_UNUSED(index);
-
-    QListWidgetItem* item = chatNicks->currentItem();
-    if (!item)
-        return;
-
-    // update context menu labels according to possible action
-    if(ignoreList.contains(item->text(), Qt::CaseInsensitive))
-    {
-        acIgnore->setText(QAction::tr("Unignore"));
-        acIgnore->setIcon(QIcon(":/res/unignore.png"));
-    }
-    else
-    {
-        acIgnore->setText(QAction::tr("Ignore"));
-        acIgnore->setIcon(QIcon(":/res/ignore.png"));
-    }
-
-    if(friendsList.contains(item->text(), Qt::CaseInsensitive))
-    {
-        acFriend->setText(QAction::tr("Remove friend"));
-        acFriend->setIcon(QIcon(":/res/remfriend.png"));
-    }
-    else
-    {
-        acFriend->setText(QAction::tr("Add friend"));
-        acFriend->setIcon(QIcon(":/res/addfriend.png"));
-    }
-}
-
-void HWChatWidget::setShowReady(bool s)
-{
-    showReady = s;
-}
-
-void HWChatWidget::setReadyStatus(const QString & nick, bool isReady)
-{
-    QList<QListWidgetItem *> items = chatNicks->findItems(nick, Qt::MatchExactly);
-    if (items.size() != 1)
-    {
-        qWarning("Bug: cannot find user in chat");
-        return;
-    }
-
-    items[0]->setData(Qt::UserRole, isReady); // bulb status
-    updateNickItem(items[0]);
-
-    // ensure we're still showing the status bulbs
-    showReady = true;
-}
-
-void HWChatWidget::adminAccess(bool b)
-{
-    chatNicks->removeAction(acKick);
-    chatNicks->removeAction(acBan);
-
-    if(b)
-    {
-        chatNicks->insertAction(0, acKick);
-//      chatNicks->insertAction(0, acBan);
-    }
-}
--- a/QTfrontend/chatwidget.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,124 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2007 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef _CHAT_WIDGET_INCLUDED
-#define _CHAT_WIDGET_INCLUDED
-
-#include <QWidget>
-#include <QListWidget>
-#include <QString>
-#include <QGridLayout>
-#include <QRegExp>
-
-#include "SDLs.h"
-
-class ListWidgetNickItem;
-class QTextBrowser;
-class QLineEdit;
-class QListWidget;
-class QSettings;
-class SDLInteraction;
-
-// this class is for custom nick sorting
-class ListWidgetNickItem : public QListWidgetItem
-{
-public:
-  ListWidgetNickItem(const QString& nick, bool isFriend, bool isIgnored);
-  bool operator<(const QListWidgetItem & other) const;
-  void setFriend(bool isFriend);
-  void setIgnored(bool isIgnored);
-  bool isFriend();
-  bool ignored();
-
-private:
-  bool aFriend;
-  bool isIgnored;
-};
-
-class HWChatWidget : public QWidget
-{
-  Q_OBJECT
-
- public:
-  HWChatWidget(QWidget* parent, QSettings * gameSettings, SDLInteraction * sdli, bool notify);
-  void loadLists(const QString & nick);
-  void saveLists(const QString & nick);
-  void setShowReady(bool s);
-  void setShowFollow(bool enabled);
-  void addLine(const QString & cssClass, QString line);
-  static const char* STYLE;
-  QStringList ignoreList, friendsList;
-
-private:
-  void loadList(QStringList & list, const QString & file);
-  void saveList(QStringList & list, const QString & file);
-  void updateNickItem(QListWidgetItem *item);
-  void updateNickItems();
-  static const QRegExp URLREGEXP;
-
- public slots:
-  void onChatString(const QString& str);
-  void onChatString(const QString& nick, const QString& str);
-  void onServerMessage(const QString& str);
-  void nickAdded(const QString& nick, bool notifyNick);
-  void nickRemoved(const QString& nick);
-  void clear();
-  void setReadyStatus(const QString & nick, bool isReady);
-  void adminAccess(bool);
-
- signals:
-  void chatLine(const QString& str);
-  void kick(const QString & str);
-  void ban(const QString & str);
-  void info(const QString & str);
-  void follow(const QString &);
-  void nickCountUpdate(int cnt);
-
- private:
-  QGridLayout mainLayout;
-  QTextBrowser* chatText;
-  QStringList chatStrings;
-  QListWidget* chatNicks;
-  QLineEdit* chatEditLine;
-  QAction * acInfo;
-  QAction * acKick;
-  QAction * acBan;
-  QAction * acFollow;
-  QAction * acIgnore;
-  QAction * acFriend;
-  QSettings * gameSettings;
-  SDLInteraction * sdli;
-  Mix_Chunk *sound[4];
-  bool notify;
-  bool showReady;
-
- private slots:
-  void returnPressed();
-  void onBan();
-  void onKick();
-  void onInfo();
-  void onFollow();
-  void onIgnore();
-  void onFriend();
-  void chatNickDoubleClicked(QListWidgetItem * item);
-  void chatNickSelected(int index);
-  void linkClicked(const QUrl & link);
-};
-
-#endif // _CHAT_WIDGET_INCLUDED
--- a/QTfrontend/databrowser.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,57 +0,0 @@
-#include <QNetworkAccessManager>
-#include <QNetworkRequest>
-#include <QNetworkReply>
-#include <QDebug>
-#include <QUrl>
-
-#include "databrowser.h"
-
-const QNetworkRequest::Attribute typeAttribute = (QNetworkRequest::Attribute)(QNetworkRequest::User + 1);
-const QNetworkRequest::Attribute urlAttribute = (QNetworkRequest::Attribute)(QNetworkRequest::User + 2);
-
-DataBrowser::DataBrowser(QWidget *parent) :
-    QTextBrowser(parent)
-{
-
-    manager = new QNetworkAccessManager(this);
-}
-
-QVariant DataBrowser::loadResource(int type, const QUrl & name)
-{
-    if(type == QTextDocument::ImageResource || type == QTextDocument::StyleSheetResource)
-    {
-        if(resources.contains(name.toString()))
-        {
-            return resources.take(name.toString());
-        }
-        else
-            if(!requestedResources.contains(name.toString()))
-            {
-                qDebug() << "Requesting resource" << name.toString();
-                requestedResources.insert(name.toString());
-
-                QNetworkRequest newRequest(QUrl("http://www.hedgewars.org" + name.toString()));
-                newRequest.setAttribute(typeAttribute, type);
-                newRequest.setAttribute(urlAttribute, name);
-
-                QNetworkReply *reply = manager->get(newRequest);
-                connect(reply, SIGNAL(finished()), this, SLOT(resourceDownloaded()));
-            }
-    }
-
-    return QVariant();
-}
-
-void DataBrowser::resourceDownloaded()
-{
-    QNetworkReply * reply = qobject_cast<QNetworkReply *>(sender());
-
-    if(reply)
-    {
-        int type = reply->request().attribute(typeAttribute).toInt();
-        QUrl url = reply->request().attribute(urlAttribute).toUrl();
-        resources.insert(url.toString(), reply->readAll());
-        document()->addResource(type, reply->request().url(), QVariant());
-        update();
-    }
-}
--- a/QTfrontend/databrowser.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-#ifndef DATABROWSER_H
-#define DATABROWSER_H
-
-#include <QTextBrowser>
-#include <QSet>
-
-class QNetworkAccessManager;
-
-class DataBrowser : public QTextBrowser
-{
-    Q_OBJECT
-public:
-    explicit DataBrowser(QWidget *parent = 0);
-
-signals:
-
-public slots:
-
-private:
-    QNetworkAccessManager *manager;
-    
-    // hash and set of QString instead of QUrl to support Qt versions 
-    // older than 4.7 (those have no support for qHash(const QUrl &))
-    QHash<QString, QByteArray> resources;
-    QSet<QString> requestedResources;
-
-    QVariant loadResource(int type, const QUrl & name);
-
-private slots:
-    void resourceDownloaded();
-};
-
-#endif // DATABROWSER_H
--- a/QTfrontend/drawmapwidget.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,106 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QFile>
-#include <QMessageBox>
-#include <QEvent>
-
-#include "drawmapwidget.h"
-
-DrawMapWidget::DrawMapWidget(QWidget *parent) :
-    QWidget(parent),
-    ui(new Ui::DrawMapWidget)
-{
-    ui->setupUi(this);
-
-    m_scene = 0;
-}
-
-DrawMapWidget::~DrawMapWidget()
-{
-    delete ui;
-}
-
-void DrawMapWidget::changeEvent(QEvent *e)
-{
-    QWidget::changeEvent(e);
-    switch (e->type()) {
-    case QEvent::LanguageChange:
-        ui->retranslateUi(this);
-        break;
-    default:
-        break;
-    }
-}
-
-void DrawMapWidget::setScene(DrawMapScene * scene)
-{
-    ui->graphicsView->setScene(scene);
-    m_scene = scene;
-}
-
-void DrawMapWidget::resizeEvent(QResizeEvent * event)
-{
-    Q_UNUSED(event);
-
-    if(ui->graphicsView && ui->graphicsView->scene())
-        ui->graphicsView->fitInView(ui->graphicsView->scene()->sceneRect(), Qt::KeepAspectRatio);
-}
-
-void DrawMapWidget::showEvent(QShowEvent * event)
-{
-    Q_UNUSED(event);
-
-    resizeEvent(0);
-}
-
-void DrawMapWidget::undo()
-{
-    if(m_scene) m_scene->undo();
-}
-
-void DrawMapWidget::clear()
-{
-    if(m_scene) m_scene->clearMap();
-}
-
-void DrawMapWidget::save(const QString & fileName)
-{
-    if(m_scene)
-    {
-        QFile file(fileName);
-
-        if(!file.open(QIODevice::WriteOnly))
-            QMessageBox::warning(this, tr("File error"), tr("Cannot open file '%1' for writing").arg(fileName));
-        else
-            file.write(qCompress(m_scene->encode()).toBase64());
-    }
-}
-
-void DrawMapWidget::load(const QString & fileName)
-{
-    if(m_scene)
-    {
-        QFile f(fileName);
-
-        if(!f.open(QIODevice::ReadOnly))
-            QMessageBox::warning(this, tr("File error"), tr("Cannot read file '%1'").arg(fileName));
-        else
-            m_scene->decode(qUncompress(QByteArray::fromBase64(f.readAll())));
-    }
-}
--- a/QTfrontend/drawmapwidget.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,86 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef DRAWMAPWIDGET_H
-#define DRAWMAPWIDGET_H
-
-#include <QWidget>
-#include <QHBoxLayout>
-#include <QPushButton>
-#include <QGraphicsView>
-
-#include "qaspectratiolayout.h"
-#include "drawmapscene.h"
-
-namespace Ui {
-    class Ui_DrawMapWidget
-    {
-    public:
-        QGraphicsView *graphicsView;
-
-        void setupUi(QWidget *drawMapWidget)
-        {
-            QAspectRatioLayout * arLayout = new QAspectRatioLayout(drawMapWidget);
-            arLayout->setMargin(0);
-
-            graphicsView = new QGraphicsView(drawMapWidget);
-            arLayout->addWidget(graphicsView);
-
-            retranslateUi(drawMapWidget);
-
-            QMetaObject::connectSlotsByName(drawMapWidget);
-        } // setupUi
-
-        void retranslateUi(QWidget *drawMapWidget)
-        {
-            Q_UNUSED(drawMapWidget);
-        } // retranslateUi
-
-    };
-
-    class DrawMapWidget: public Ui_DrawMapWidget {};
-}
-
-class DrawMapWidget : public QWidget
-{
-    Q_OBJECT
-
-public:
-    explicit DrawMapWidget(QWidget *parent = 0);
-    ~DrawMapWidget();
-
-    void setScene(DrawMapScene * scene);
-
-public slots:
-    void undo();
-    void clear();
-    void save(const QString & fileName);
-    void load(const QString & fileName);
-
-protected:
-    void changeEvent(QEvent *e);
-    virtual void resizeEvent(QResizeEvent * event);
-    virtual void showEvent(QShowEvent * event);
-
-private:
-    Ui::DrawMapWidget *ui;
-
-    DrawMapScene * m_scene;
-};
-
-#endif // DRAWMAPWIDGET_H
--- a/QTfrontend/fpsedit.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include "fpsedit.h"
-
-FPSEdit::FPSEdit(QWidget * parent) :
-    QSpinBox(parent)
-{
-    setRange(1, 34);
-    setValue(27);
-}
-
-QString FPSEdit::textFromValue(int value) const
-{
-    return QString::number(1000 / (35 - value));
-}
--- a/QTfrontend/fpsedit.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef _FPSEDIT_H
-#define _FPSEDIT_H
-
-#include <QSpinBox>
-
-class FPSEdit : public QSpinBox
-{
-    Q_OBJECT
-
-public:
-    FPSEdit(QWidget * parent = 0);
-
-protected:
-     QString textFromValue (int value) const;
-};
-
-#endif // _FPSEDIT_H
--- a/QTfrontend/frameTeam.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,128 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2007 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QResizeEvent>
-#include <QCoreApplication>
-#include <QPalette>
-
-#include "frameTeam.h"
-#include "teamselhelper.h"
-#include "hwconsts.h"
-
-FrameTeams::FrameTeams(QWidget* parent) :
-  QFrame(parent), maxHedgehogsPerGame(48), overallHedgehogs(0), mainLayout(this), nonInteractive(false)
-{
-    QPalette newPalette = palette();
-    newPalette.setColor(QPalette::Window, QColor(0x00, 0x00, 0x00));
-    setPalette(newPalette);
-    setAutoFillBackground(true);
-
-    mainLayout.setSpacing(1);
-    mainLayout.setContentsMargins(4, 4, 4, 4);
-
-    int i = 0;
-    while(colors[i] != 0)
-        availableColors.push_back(QColor(colors[i++]));
-
-    resetColors();
-}
-
-void FrameTeams::setInteractivity(bool interactive)
-{
-    nonInteractive = !interactive;
-    for(tmapTeamToWidget::iterator it=teamToWidget.begin(); it!=teamToWidget.end(); ++it) {
-        TeamShowWidget* pts = dynamic_cast<TeamShowWidget*>(it.value());
-        if(!pts) throw;
-        pts->setInteractivity(interactive);
-    }
-}
-
-void FrameTeams::resetColors()
-{
-  currentColor=availableColors.end() - 1; // ensure next color is the first one
-}
-
-QColor FrameTeams::getNextColor() const
-{
-  QList<QColor>::ConstIterator nextColor=currentColor;
-  ++nextColor;
-  if (nextColor==availableColors.end()) nextColor=availableColors.begin();
-  return *nextColor;
-}
-
-void FrameTeams::addTeam(HWTeam team, bool willPlay)
-{
-  TeamShowWidget* pTeamShowWidget = new TeamShowWidget(team, willPlay, this);
-  if(nonInteractive) pTeamShowWidget->setInteractivity(false);
-//  int hght=teamToWidget.empty() ? 0 : teamToWidget.begin()->second->size().height();
-  mainLayout.addWidget(pTeamShowWidget);
-  teamToWidget.insert(team, pTeamShowWidget);
-  QResizeEvent* pevent=new QResizeEvent(parentWidget()->size(), parentWidget()->size());
-  QCoreApplication::postEvent(parentWidget(), pevent);
-}
-
-void FrameTeams::removeTeam(HWTeam team)
-{
-  tmapTeamToWidget::iterator it=teamToWidget.find(team);
-  if(it==teamToWidget.end()) return;
-  mainLayout.removeWidget(it.value());
-  it.value()->deleteLater();
-  teamToWidget.erase(it);
-}
-
-void FrameTeams::resetTeams()
-{
-  for(tmapTeamToWidget::iterator it=teamToWidget.begin(); it!=teamToWidget.end(); ) {
-    mainLayout.removeWidget(it.value());
-    it.value()->deleteLater();
-    teamToWidget.erase(it++);
-  }
-}
-
-void FrameTeams::setHHNum(const HWTeam& team)
-{
-  TeamShowWidget* pTeamShowWidget = dynamic_cast<TeamShowWidget*>(getTeamWidget(team));
-  if(!pTeamShowWidget) return;
-  pTeamShowWidget->setHHNum(team.numHedgehogs());
-}
-
-void FrameTeams::setTeamColor(const HWTeam& team)
-{
-  TeamShowWidget* pTeamShowWidget = dynamic_cast<TeamShowWidget*>(getTeamWidget(team));
-  if(!pTeamShowWidget) return;
-  pTeamShowWidget->changeTeamColor(team.color());
-}
-
-QWidget* FrameTeams::getTeamWidget(HWTeam team)
-{
-//qDebug() << "FrameTeams::getTeamWidget getNetID() = " << team.getNetID();
-  tmapTeamToWidget::iterator it=teamToWidget.find(team);
-  QWidget* ret = it!=teamToWidget.end() ? it.value() : 0;
-  return ret;
-}
-
-bool FrameTeams::isFullTeams() const
-{
-  return overallHedgehogs==maxHedgehogsPerGame;
-}
-
-void FrameTeams::emitTeamColorChanged(const HWTeam& team)
-{
-  emit teamColorChanged(team);
-}
--- a/QTfrontend/frameTeam.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2007 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef _FRAME_TEAM_INCLUDED
-#define _FRAME_TEAM_INCLUDED
-
-#include <QFrame>
-#include <QList>
-#include <QColor>
-
-#include "teamselect.h"
-
-class FrameTeams : public QFrame
-{
-  Q_OBJECT
-
- friend class CHedgehogerWidget;
- friend class TeamShowWidget;
-
- public:
-  FrameTeams(QWidget* parent=0);
-  QWidget* getTeamWidget(HWTeam team);
-  bool isFullTeams() const;
-  void resetColors();
-  void resetTeams();
-  void setHHNum(const HWTeam& team);
-  void setTeamColor(const HWTeam& team);
-  void setInteractivity(bool interactive);
-  QColor getNextColor() const;
-
- signals:
-  void teamColorChanged(const HWTeam&);
-
- public slots:
-  void addTeam(HWTeam team, bool willPlay);
-  void removeTeam(HWTeam team);
-
- private:
-  const int maxHedgehogsPerGame;
-  int overallHedgehogs;
-  QList<QColor> availableColors;
-  QList<QColor>::Iterator currentColor;
-
-  void emitTeamColorChanged(const HWTeam& team);
-
-  QVBoxLayout mainLayout;
-  typedef QMap<HWTeam, QWidget*> tmapTeamToWidget;
-  tmapTeamToWidget teamToWidget;
-  bool nonInteractive;
-};
-
-#endif // _FRAME_TAM_INCLUDED
--- a/QTfrontend/gamecfgwidget.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,573 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QResizeEvent>
-#include <QGroupBox>
-#include <QCheckBox>
-#include <QGridLayout>
-#include <QSpinBox>
-#include <QLabel>
-#include <QMessageBox>
-#include <QTableView>
-#include <QPushButton>
-
-#include "gamecfgwidget.h"
-#include "igbox.h"
-#include "hwconsts.h"
-#include "ammoSchemeModel.h"
-#include "proto.h"
-
-GameCFGWidget::GameCFGWidget(QWidget* parent) :
-  QGroupBox(parent)
-  , mainLayout(this)
-  , seedRegexp("\\{[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\\}")
-{
-    mainLayout.setMargin(0);
-//  mainLayout.setSizeConstraint(QLayout::SetMinimumSize);
-
-    pMapContainer = new HWMapContainer(this);
-    mainLayout.addWidget(pMapContainer, 0, 0);
-
-    IconedGroupBox *GBoxOptions = new IconedGroupBox(this);
-    GBoxOptions->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
-    mainLayout.addWidget(GBoxOptions, 1, 0);
-
-    QGridLayout *GBoxOptionsLayout = new QGridLayout(GBoxOptions);
-
-    GBoxOptions->setTitle(tr("Game Options"));
-    GBoxOptionsLayout->addWidget(new QLabel(QLabel::tr("Style"), GBoxOptions), 1, 0);
-
-    Scripts = new QComboBox(GBoxOptions);
-    GBoxOptionsLayout->addWidget(Scripts, 1, 1);
-
-    Scripts->addItem("Normal");
-    Scripts->insertSeparator(1);
-
-    for (int i = 0; i < scriptList->size(); ++i) {
-        QString script = (*scriptList)[i].remove(".lua", Qt::CaseInsensitive);
-        QList<QVariant> scriptInfo;
-        scriptInfo.push_back(script);
-        QFile scriptCfgFile;
-        scriptCfgFile.setFileName(QString("%1/Data/Scripts/Multiplayer/%2.cfg").arg(cfgdir->absolutePath()).arg(script));
-        if (!scriptCfgFile.exists()) scriptCfgFile.setFileName(QString("%1/Scripts/Multiplayer/%2.cfg").arg(datadir->absolutePath()).arg(script));
-        if (scriptCfgFile.exists() && scriptCfgFile.open(QFile::ReadOnly)) {
-            QString scheme;
-            QString weapons;
-            QTextStream input(&scriptCfgFile);
-            input >> scheme;
-            input >> weapons;
-            if (scheme.isEmpty())
-                scheme = "locked";
-            scheme.replace("_", " ");
-            if (weapons.isEmpty())
-                weapons = "locked";
-            weapons.replace("_", " ");
-            scriptInfo.push_back(scheme);
-            scriptInfo.push_back(weapons);
-            scriptCfgFile.close();
-        }
-        else
-        {
-            scriptInfo.push_back("locked");
-            scriptInfo.push_back("locked");
-        }
-        Scripts->addItem(script.replace("_", " "), scriptInfo);
-    }
-
-    connect(Scripts, SIGNAL(currentIndexChanged(int)), this, SLOT(scriptChanged(int)));
-
-    QWidget *SchemeWidget = new QWidget(GBoxOptions);
-    GBoxOptionsLayout->addWidget(SchemeWidget, 2, 0, 1, 2);
-
-    QGridLayout *SchemeWidgetLayout = new QGridLayout(SchemeWidget);
-    SchemeWidgetLayout->setMargin(0);
-
-    GameSchemes = new QComboBox(SchemeWidget);
-    SchemeWidgetLayout->addWidget(GameSchemes, 0, 2);
-    connect(GameSchemes, SIGNAL(currentIndexChanged(int)), this, SLOT(schemeChanged(int)));
-
-    SchemeWidgetLayout->addWidget(new QLabel(QLabel::tr("Scheme"), SchemeWidget), 0, 0);
-
-    QPixmap pmEdit(":/res/edit.png");
-    
-    QPushButton * goToSchemePage = new QPushButton(SchemeWidget);
-    goToSchemePage->setToolTip(tr("Edit schemes"));
-    goToSchemePage->setIconSize(pmEdit.size());
-    goToSchemePage->setIcon(pmEdit);
-    goToSchemePage->setMaximumWidth(pmEdit.width() + 6);
-    SchemeWidgetLayout->addWidget(goToSchemePage, 0, 3);
-    connect(goToSchemePage, SIGNAL(clicked()), this, SLOT(jumpToSchemes()));
-
-    SchemeWidgetLayout->addWidget(new QLabel(QLabel::tr("Weapons"), SchemeWidget), 1, 0);
-
-    WeaponsName = new QComboBox(SchemeWidget);
-    SchemeWidgetLayout->addWidget(WeaponsName, 1, 2);
-
-    connect(WeaponsName, SIGNAL(currentIndexChanged(int)), this, SLOT(ammoChanged(int)));
-
-    QPushButton * goToWeaponPage = new QPushButton(SchemeWidget);
-    goToWeaponPage->setToolTip(tr("Edit weapons"));
-    goToWeaponPage->setIconSize(pmEdit.size());
-    goToWeaponPage->setIcon(pmEdit);
-    goToWeaponPage->setMaximumWidth(pmEdit.width() + 6);
-    SchemeWidgetLayout->addWidget(goToWeaponPage, 1, 3);
-    connect(goToWeaponPage, SIGNAL(clicked()), this, SLOT(jumpToWeapons()));
-
-    bindEntries = new QCheckBox(SchemeWidget);
-    bindEntries->setToolTip(tr("When this option is enabled selecting a game scheme will auto-select a weapon"));
-    bindEntries->setChecked(true);
-    bindEntries->setMaximumWidth(42);
-    bindEntries->setStyleSheet( "QCheckBox::indicator:checked   { image: url(\":/res/lock.png\"); }"
-                                "QCheckBox::indicator:unchecked { image: url(\":/res/unlock.png\");   }" );
-    SchemeWidgetLayout->addWidget(bindEntries, 0, 1, 0, 1, Qt::AlignVCenter);
-
-    connect(pMapContainer, SIGNAL(seedChanged(const QString &)), this, SLOT(seedChanged(const QString &)));
-    connect(pMapContainer, SIGNAL(mapChanged(const QString &)), this, SLOT(mapChanged(const QString &)));
-    connect(pMapContainer, SIGNAL(mapgenChanged(MapGenerator)), this, SLOT(mapgenChanged(MapGenerator)));
-    connect(pMapContainer, SIGNAL(mazeSizeChanged(int)), this, SLOT(maze_sizeChanged(int)));
-    connect(pMapContainer, SIGNAL(themeChanged(const QString &)), this, SLOT(themeChanged(const QString &)));
-    connect(pMapContainer, SIGNAL(newTemplateFilter(int)), this, SLOT(templateFilterChanged(int)));
-    connect(pMapContainer, SIGNAL(drawMapRequested()), this, SIGNAL(goToDrawMap()));
-    connect(pMapContainer, SIGNAL(drawnMapChanged(const QByteArray &)), this, SLOT(onDrawnMapChanged(const QByteArray &)));
-}
-
-void GameCFGWidget::jumpToSchemes()
-{
-    emit goToSchemes(GameSchemes->currentIndex());
-}
-
-void GameCFGWidget::jumpToWeapons()
-{
-    emit goToWeapons(WeaponsName->currentIndex());
-}
-
-QVariant GameCFGWidget::schemeData(int column) const
-{
-    return GameSchemes->model()->data(GameSchemes->model()->index(GameSchemes->currentIndex(), column));
-}
-
-quint32 GameCFGWidget::getGameFlags() const
-{
-    quint32 result = 0;
-
-    if (schemeData(1).toBool())
-        result |= 0x00001000;       // fort
-    if (schemeData(2).toBool())
-        result |= 0x00000010;       // divide teams
-    if (schemeData(3).toBool())
-        result |= 0x00000004;       // solid land
-    if (schemeData(4).toBool())
-        result |= 0x00000008;       // border
-    if (schemeData(5).toBool())
-        result |= 0x00000020;       // low gravity
-    if (schemeData(6).toBool())
-        result |= 0x00000040;       // laser sight
-    if (schemeData(7).toBool())
-        result |= 0x00000080;       // invulnerable
-    if (schemeData(8).toBool())
-        result |= 0x00000100;       // mines
-    if (schemeData(9).toBool())
-        result |= 0x00000200;       // vampirism
-    if (schemeData(10).toBool())
-        result |= 0x00000400;       // karma
-    if (schemeData(11).toBool())
-        result |= 0x00000800;       // artillery
-    if (schemeData(12).toBool())
-        result |= 0x00002000;       // random
-    if (schemeData(13).toBool())
-        result |= 0x00004000;       // king
-    if (schemeData(14).toBool())
-        result |= 0x00008000;       // place hogs
-    if (schemeData(15).toBool())
-        result |= 0x00010000;       // shared ammo
-    if (schemeData(16).toBool())
-        result |= 0x00020000;       // disable girders
-    if (schemeData(17).toBool())
-        result |= 0x00040000;       // disable land obj
-    if (schemeData(18).toBool())
-        result |= 0x00080000;       // ai survival
-    if (schemeData(19).toBool())
-        result |= 0x00100000;       // infinite attacks
-    if (schemeData(20).toBool())
-        result |= 0x00200000;       // reset weaps
-    if (schemeData(21).toBool())
-        result |= 0x00400000;       // per hog ammo
-    if (schemeData(22).toBool())
-        result |= 0x00800000;       // no wind
-    if (schemeData(23).toBool())
-        result |= 0x01000000;       // more wind
-    if (schemeData(24).toBool())
-        result |= 0x02000000;       // tag team
-    if (schemeData(25).toBool())
-        result |= 0x04000000;       // bottom border
-
-    return result;
-}
-
-quint32 GameCFGWidget::getInitHealth() const
-{
-    return schemeData(28).toInt();
-}
-
-QByteArray GameCFGWidget::getFullConfig() const
-{
-    QList<QByteArray> bcfg;
-    int mapgen = pMapContainer->get_mapgen();
-
-    QString currentMap = pMapContainer->getCurrentMap();
-    if (currentMap.size() > 0)
-    {
-        bcfg << QString("emap " + currentMap).toUtf8();
-        if(pMapContainer->getCurrentIsMission())
-            bcfg << QString("escript Maps/%1/map.lua").arg(currentMap).toUtf8();
-    }
-    bcfg << QString("etheme " + pMapContainer->getCurrentTheme()).toUtf8();
-
-    if (Scripts->currentIndex() > 0)
-    {
-        bcfg << QString("escript Scripts/Multiplayer/%1.lua").arg(Scripts->itemData(Scripts->currentIndex()).toList()[0].toString()).toUtf8();
-    }
-
-    bcfg << QString("eseed " + pMapContainer->getCurrentSeed()).toUtf8();
-    bcfg << QString("e$gmflags %1").arg(getGameFlags()).toUtf8();
-    bcfg << QString("e$damagepct %1").arg(schemeData(26).toInt()).toUtf8();
-    bcfg << QString("e$turntime %1").arg(schemeData(27).toInt() * 1000).toUtf8();
-    bcfg << QString("e$sd_turns %1").arg(schemeData(29).toInt()).toUtf8();
-    bcfg << QString("e$casefreq %1").arg(schemeData(30).toInt()).toUtf8();
-    bcfg << QString("e$minestime %1").arg(schemeData(31).toInt() * 1000).toUtf8();
-    bcfg << QString("e$minesnum %1").arg(schemeData(32).toInt()).toUtf8();
-    bcfg << QString("e$minedudpct %1").arg(schemeData(33).toInt()).toUtf8();
-    bcfg << QString("e$explosives %1").arg(schemeData(34).toInt()).toUtf8();
-    bcfg << QString("e$healthprob %1").arg(schemeData(35).toInt()).toUtf8();
-    bcfg << QString("e$hcaseamount %1").arg(schemeData(36).toInt()).toUtf8();
-    bcfg << QString("e$waterrise %1").arg(schemeData(37).toInt()).toUtf8();
-    bcfg << QString("e$healthdec %1").arg(schemeData(38).toInt()).toUtf8();
-    bcfg << QString("e$ropepct %1").arg(schemeData(39).toInt()).toUtf8();
-    bcfg << QString("e$getawaytime %1").arg(schemeData(40).toInt()).toUtf8();
-    bcfg << QString("e$template_filter %1").arg(pMapContainer->getTemplateFilter()).toUtf8();
-    bcfg << QString("e$mapgen %1").arg(mapgen).toUtf8();
-
-    switch (mapgen)
-    {
-        case MAPGEN_MAZE:
-            bcfg << QString("e$maze_size %1").arg(pMapContainer->getMazeSize()).toUtf8();
-            break;
-
-        case MAPGEN_DRAWN:
-        {
-            QByteArray data = pMapContainer->getDrawnMapData();
-            while(data.size() > 0)
-            {
-                QByteArray tmp = data;
-                tmp.truncate(200);
-                tmp.prepend("edraw ");
-                bcfg << tmp;
-                data.remove(0, 200);
-            }
-            break;
-        }
-        default: ;
-    }
-
-    QByteArray result;
-
-    foreach(QByteArray ba, bcfg)
-        HWProto::addByteArrayToBuffer(result, ba);
-
-    return result;
-}
-
-void GameCFGWidget::setNetAmmo(const QString& name, const QString& ammo)
-{
-    bool illegal = ammo.size() != cDefaultAmmoStore->size();
-    if (illegal)
-        QMessageBox::critical(this, tr("Error"), tr("Illegal ammo scheme"));
-
-    int pos = WeaponsName->findText(name);
-    if ((pos == -1) || illegal) { // prevent from overriding schemes with bad ones
-        WeaponsName->addItem(name, ammo);
-        WeaponsName->setCurrentIndex(WeaponsName->count() - 1);
-    } else {
-        WeaponsName->setItemData(pos, ammo);
-        WeaponsName->setCurrentIndex(pos);
-    }
-}
-
-void GameCFGWidget::fullNetConfig()
-{
-    ammoChanged(WeaponsName->currentIndex());
-
-    seedChanged(pMapContainer->getCurrentSeed());
-    templateFilterChanged(pMapContainer->getTemplateFilter());
-    themeChanged(pMapContainer->getCurrentTheme());
-
-    schemeChanged(GameSchemes->currentIndex());
-    scriptChanged(Scripts->currentIndex());
-
-    mapgenChanged(pMapContainer->get_mapgen());
-    maze_sizeChanged(pMapContainer->getMazeSize());
-
-    // map must be the last
-    QString map = pMapContainer->getCurrentMap();
-    if (map.size())
-        mapChanged(map);
-}
-
-void GameCFGWidget::setParam(const QString & param, const QStringList & slValue)
-{
-    if (slValue.size() == 1)
-    {
-        QString value = slValue[0];
-        if (param == "MAP") {
-            pMapContainer->setMap(value);
-            return;
-        }
-        if (param == "SEED") {
-            pMapContainer->setSeed(value);
-            if (!seedRegexp.exactMatch(value)) {
-                pMapContainer->seedEdit->setVisible(true);
-                }
-            return;
-        }
-        if (param == "THEME") {
-            pMapContainer->setTheme(value);
-            return;
-        }
-        if (param == "TEMPLATE") {
-            pMapContainer->setTemplateFilter(value.toUInt());
-            return;
-        }
-        if (param == "MAPGEN") {
-            pMapContainer->setMapgen((MapGenerator)value.toUInt());
-            return;
-        }
-        if (param == "MAZE_SIZE") {
-            pMapContainer->setMazeSize(value.toUInt());
-            return;
-        }
-        if (param == "SCRIPT") {
-            Scripts->setCurrentIndex(Scripts->findText(value));
-            return;
-        }
-        if (param == "DRAWNMAP") {
-            pMapContainer->setDrawnMapData(qUncompress(QByteArray::fromBase64(slValue[0].toLatin1())));
-            return;
-        }
-    }
-
-    if (slValue.size() == 2)
-    {
-        if (param == "AMMO") {
-            setNetAmmo(slValue[0], slValue[1]);
-            return;
-        }
-    }
-
-    if (slValue.size() == 5)
-    {
-        if (param == "FULLMAPCONFIG")
-        {
-            QString seed = slValue[3];
-            if (!seedRegexp.exactMatch(seed))
-                pMapContainer->seedEdit->setVisible(true);
-
-            pMapContainer->setAllMapParameters(
-                    slValue[0],
-                    (MapGenerator)slValue[1].toUInt(),
-                    slValue[2].toUInt(),
-                    seed,
-                    slValue[4].toUInt()
-                    );
-            return;
-        }
-    }
-
-    qWarning("Got bad config param from net");
-}
-
-void GameCFGWidget::ammoChanged(int index)
-{
-    if (index >= 0) {
-        emit paramChanged(
-            "AMMO",
-            QStringList() << WeaponsName->itemText(index) << WeaponsName->itemData(index).toString()
-        );
-    }
-}
-
-void GameCFGWidget::mapChanged(const QString & value)
-{
-    if(isEnabled() && pMapContainer->getCurrentIsMission())
-    {
-        Scripts->setEnabled(false);
-        Scripts->setCurrentIndex(0);
-
-        if (pMapContainer->getCurrentScheme() == "locked")
-        {
-            GameSchemes->setEnabled(false);
-            GameSchemes->setCurrentIndex(GameSchemes->findText("Default"));
-        }
-        else
-        {
-            GameSchemes->setEnabled(true);
-            int num = GameSchemes->findText(pMapContainer->getCurrentScheme());
-            if (num != -1)
-                GameSchemes->setCurrentIndex(num);
-            else
-                GameSchemes->setCurrentIndex(GameSchemes->findText("Default"));
-        }
-
-        if (pMapContainer->getCurrentWeapons() == "locked")
-        {
-            WeaponsName->setEnabled(false);
-            WeaponsName->setCurrentIndex(WeaponsName->findText("Default"));
-        }
-        else
-        {
-            WeaponsName->setEnabled(true);
-            int num = WeaponsName->findText(pMapContainer->getCurrentWeapons());
-            if (num != -1)
-                WeaponsName->setCurrentIndex(num);
-            else
-                WeaponsName->setCurrentIndex(WeaponsName->findText("Default"));
-        }
-
-        if (pMapContainer->getCurrentScheme() != "locked" && pMapContainer->getCurrentWeapons() != "locked")
-            bindEntries->setEnabled(true);
-        else
-            bindEntries->setEnabled(false);
-    }
-    else
-    {
-        Scripts->setEnabled(true);
-        GameSchemes->setEnabled(true);
-        WeaponsName->setEnabled(true);
-        bindEntries->setEnabled(true);
-    }
-    emit paramChanged("MAP", QStringList(value));
-}
-
-void GameCFGWidget::templateFilterChanged(int value)
-{
-    emit paramChanged("TEMPLATE", QStringList(QString::number(value)));
-}
-
-void GameCFGWidget::seedChanged(const QString & value)
-{
-    emit paramChanged("SEED", QStringList(value));
-}
-
-void GameCFGWidget::themeChanged(const QString & value)
-{
-    emit paramChanged("THEME", QStringList(value));
-}
-
-void GameCFGWidget::schemeChanged(int index)
-{
-    QStringList sl;
-
-    int size = GameSchemes->model()->columnCount();
-    for(int i = 0; i < size; ++i)
-        sl << schemeData(i).toString();
-
-    emit paramChanged("SCHEME", sl);
-
-    if (isEnabled() && bindEntries->isEnabled() && bindEntries->isChecked()) {
-        QString schemeName = GameSchemes->itemText(index);
-        for (int i = 0; i < WeaponsName->count(); i++) {
-             QString weapName = WeaponsName->itemText(i);
-             int res = QString::compare(weapName, schemeName, Qt::CaseSensitive);
-             if (0 == res) {
-                 WeaponsName->setCurrentIndex(i);
-                 emit ammoChanged(i);
-                 break;
-             }
-        }
-    }
-}
-
-void GameCFGWidget::scriptChanged(int index)
-{
-    if(isEnabled() && index > 0)
-    {
-        QString scheme = Scripts->itemData(Scripts->currentIndex()).toList()[1].toString();
-        QString weapons = Scripts->itemData(Scripts->currentIndex()).toList()[2].toString();
-
-        if (scheme == "locked")
-        {
-            GameSchemes->setEnabled(false);
-            GameSchemes->setCurrentIndex(GameSchemes->findText("Default"));
-        }
-        else
-        {
-            GameSchemes->setEnabled(true);
-            int num = GameSchemes->findText(scheme);
-            if (num != -1)
-                GameSchemes->setCurrentIndex(num);
-            else
-                GameSchemes->setCurrentIndex(GameSchemes->findText("Default"));
-        }
-
-        if (weapons == "locked")
-        {
-            WeaponsName->setEnabled(false);
-            WeaponsName->setCurrentIndex(WeaponsName->findText("Default"));
-        }
-        else
-        {
-            WeaponsName->setEnabled(true);
-            int num = WeaponsName->findText(weapons);
-            if (num != -1)
-                WeaponsName->setCurrentIndex(num);
-            else
-                WeaponsName->setCurrentIndex(WeaponsName->findText("Default"));
-        }
-
-        if (scheme != "locked" && weapons != "locked")
-            bindEntries->setEnabled(true);
-        else
-            bindEntries->setEnabled(false);
-    }
-    else
-    {
-        GameSchemes->setEnabled(true);
-        WeaponsName->setEnabled(true);
-        bindEntries->setEnabled(true);
-    }
-    emit paramChanged("SCRIPT", QStringList(Scripts->itemText(index)));
-}
-
-void GameCFGWidget::mapgenChanged(MapGenerator m)
-{
-    emit paramChanged("MAPGEN", QStringList(QString::number(m)));
-}
-
-void GameCFGWidget::maze_sizeChanged(int s)
-{
-    emit paramChanged("MAZE_SIZE", QStringList(QString::number(s)));
-}
-
-void GameCFGWidget::resendSchemeData()
-{
-    schemeChanged(GameSchemes->currentIndex());
-}
-
-void GameCFGWidget::onDrawnMapChanged(const QByteArray & data)
-{
-    emit paramChanged("DRAWNMAP", QStringList(qCompress(data, 9).toBase64()));
-}
--- a/QTfrontend/gamecfgwidget.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef GAMECONFIGWIDGET_H
-#define GAMECONFIGWIDGET_H
-
-#include <QWidget>
-#include <QStringList>
-#include <QGroupBox>
-#include <QSpinBox>
-#include <QRegExp>
-
-#include "mapContainer.h"
-
-class QCheckBox;
-class QVBoxLayout;
-class QLabel;
-class QTableView;
-
-class GameCFGWidget : public QGroupBox
-{
-    Q_OBJECT
-
-public:
-    GameCFGWidget(QWidget* parent);
-    quint32 getGameFlags() const;
-    quint32 getInitHealth() const;
-    QByteArray getFullConfig() const;
-    QComboBox * Scripts;
-    QComboBox * GameSchemes;
-    QComboBox * WeaponsName;
-    HWMapContainer* pMapContainer;
-    QTableView * tv;
-    QVariant schemeData(int column) const;
-
-public slots:
-    void setParam(const QString & param, const QStringList & value);
-    void fullNetConfig();
-    void resendSchemeData();
-
-signals:
-    void paramChanged(const QString & param, const QStringList & value);
-    void goToSchemes(int);
-    void goToWeapons(int);
-    void goToDrawMap();
-
-private slots:
-    void ammoChanged(int index);
-    void mapChanged(const QString &);
-    void templateFilterChanged(int);
-    void seedChanged(const QString &);
-    void themeChanged(const QString &);
-    void schemeChanged(int);
-    void scriptChanged(int);
-    void jumpToSchemes();
-    void jumpToWeapons();
-    void mapgenChanged(MapGenerator m);
-    void maze_sizeChanged(int s);
-    void onDrawnMapChanged(const QByteArray & data);
-
-private:
-    QGridLayout mainLayout;
-    QCheckBox * bindEntries;
-    QString curNetAmmoName;
-    QString curNetAmmo;
-    QRegExp seedRegexp;
-
-    void setNetAmmo(const QString& name, const QString& ammo);
-
-};
-
-#endif // GAMECONFIGWIDGET_H
--- a/QTfrontend/hats.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,142 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QDir>
-#include <QPixmap>
-#include <QPainter>
-#include "hwconsts.h"
-#include "hwform.h"
-#include "hats.h"
-
-HatsModel::HatsModel(QObject* parent) :
-  QAbstractListModel(parent)
-{
-    QFile hhfile;
-    hhfile.setFileName(cfgdir->absolutePath() + "/Data/Graphics/Hedgehog/Idle.png");
-    if (!hhfile.exists()) hhfile.setFileName(datadir->absolutePath() + "/Graphics/Hedgehog/Idle.png");
-    QPixmap hhpix = QPixmap(QFileInfo(hhfile).absoluteFilePath()).copy(0, 0, 32, 32);
-
-    QDir tmpdir;
-    tmpdir.cd(cfgdir->absolutePath());
-    tmpdir.cd("Data");
-    tmpdir.cd("Graphics");
-    tmpdir.cd("Hats");
-
-    tmpdir.setFilter(QDir::Files);
-
-    QStringList userhatsList = tmpdir.entryList(QStringList("*.png"));
-    for (QStringList::Iterator it = userhatsList.begin(); it != userhatsList.end(); ++it )
-    {
-        QString str = QString(*it).replace(QRegExp("^(.*)\\.png"), "\\1");
-        QPixmap pix(cfgdir->absolutePath() + "/Data/Graphics/Hats/" + str + ".png");
-
-        QPixmap tmppix(32, 37);
-        tmppix.fill(QColor(Qt::transparent));
-
-        QPainter painter(&tmppix);
-        painter.drawPixmap(QPoint(0, 5), hhpix);
-        painter.drawPixmap(QPoint(0, 0), pix.copy(0, 0, 32, 32));
-        if(pix.width() > 32)
-            painter.drawPixmap(QPoint(0, 0), pix.copy(32, 0, 32, 32));
-        painter.end();
-
-        hats.append(qMakePair(str, QIcon(tmppix)));
-    }
-
-    tmpdir.cd(datadir->absolutePath());
-    tmpdir.cd("Graphics");
-    tmpdir.cd("Hats");
-
-    QStringList hatsList = tmpdir.entryList(QStringList("*.png"));
-    for (QStringList::Iterator it = hatsList.begin(); it != hatsList.end(); ++it )
-    {
-        if (userhatsList.contains(*it,Qt::CaseInsensitive)) continue;
-        QString str = (*it).replace(QRegExp("^(.*)\\.png"), "\\1");
-        QPixmap pix(datadir->absolutePath() + "/Graphics/Hats/" + str + ".png");
-
-        QPixmap tmppix(32, 37);
-        tmppix.fill(QColor(Qt::transparent));
-
-        QPainter painter(&tmppix);
-        painter.drawPixmap(QPoint(0, 5), hhpix);
-        painter.drawPixmap(QPoint(0, 0), pix.copy(0, 0, 32, 32));
-        if(pix.width() > 32)
-            painter.drawPixmap(QPoint(0, 0), pix.copy(32, 0, 32, 32));
-        painter.end();
-
-        hats.append(qMakePair(str, QIcon(tmppix)));
-    }
-    // Reserved hats
-    tmpdir.cd("Reserved");
-    hatsList = tmpdir.entryList(QStringList(playerHash+"*.png"));
-    for (QStringList::Iterator it = hatsList.begin(); it != hatsList.end(); ++it )
-    {
-        QString str = (*it).replace(QRegExp("^(.*)\\.png"), "\\1");
-        QPixmap pix(datadir->absolutePath() + "/Graphics/Hats/Reserved/" + str + ".png");
-
-        QPixmap tmppix(32, 37);
-        tmppix.fill(QColor(Qt::transparent));
-
-        QPainter painter(&tmppix);
-        painter.drawPixmap(QPoint(0, 5), hhpix);
-        painter.drawPixmap(QPoint(0, 0), pix.copy(0, 0, 32, 32));
-        painter.end();
-
-        hats.append(qMakePair("Reserved "+str.remove(0,32), QIcon(tmppix)));
-    }
-}
-
-QVariant HatsModel::headerData(int section,
-            Qt::Orientation orientation, int role) const
-{
-    Q_UNUSED(section);
-    Q_UNUSED(orientation);
-    Q_UNUSED(role);
-
-    return QVariant();
-}
-
-int HatsModel::rowCount(const QModelIndex &parent) const
-{
-    if (parent.isValid())
-        return 0;
-    else
-        return hats.size();
-}
-
-/*int HatsModel::columnCount(const QModelIndex & parent) const
-{
-    if (parent.isValid())
-        return 0;
-    else
-        return 2;
-}
-*/
-QVariant HatsModel::data(const QModelIndex &index,
-                         int role) const
-{
-    if (!index.isValid() || index.row() < 0
-        || index.row() >= hats.size()
-        || (role != Qt::DisplayRole && role != Qt::DecorationRole))
-        return QVariant();
-
-    if (role == Qt::DisplayRole)
-        return hats.at(index.row()).first;
-    else // role == Qt::DecorationRole
-        return hats.at(index.row()).second;
-}
--- a/QTfrontend/hats.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef _HATS_INCLUDED
-#define _HATS_INCLUDED
-
-#include <QAbstractListModel>
-#include <QStringList>
-#include <QVector>
-#include <QPair>
-#include <QIcon>
-
-class HatsModel : public QAbstractListModel
-{
-    Q_OBJECT
-
-public:
-    HatsModel(QObject *parent = 0);
-
-    QVariant headerData(int section, Qt::Orientation orientation, int role) const;
-    int rowCount(const QModelIndex & parent) const;
-    //int columnCount(const QModelIndex & parent) const;
-
-    QVariant data(const QModelIndex &index, int role) const;
-protected:
-    QVector<QPair<QString, QIcon> > hats;
-};
-
-#endif // _HATS_INCLUDED
--- a/QTfrontend/hedgehogerWidget.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2008 Ulyanov Igor <iulyanov@gmail.com>
- * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include "hedgehogerWidget.h"
-
-#include "frameTeam.h"
-
-CHedgehogerWidget::CHedgehogerWidget(const QImage& im, const QImage& img, QWidget * parent) :
-    ItemNum(im, img, parent, 1)
-{
-  // TODO: maxHedgehogsPerGame doesn't reset properly and won't match map limits for now
-  /*if(parent) {
-    pOurFrameTeams = dynamic_cast<FrameTeams*>(parent->parentWidget());
-  }
-  if(pOurFrameTeams->overallHedgehogs + 4 > pOurFrameTeams->maxHedgehogsPerGame) {
-    numItems = pOurFrameTeams->maxHedgehogsPerGame - pOurFrameTeams->overallHedgehogs;
-  } else numItems = 4;
-  pOurFrameTeams->overallHedgehogs += numItems;*/
-}
-
-void CHedgehogerWidget::incItems()
-{
-  //if (pOurFrameTeams->overallHedgehogs < pOurFrameTeams->maxHedgehogsPerGame) {
-    numItems++;
-    //pOurFrameTeams->overallHedgehogs++;
-    emit hedgehogsNumChanged();
-  //}
-}
-
-void CHedgehogerWidget::decItems()
-{
-  numItems--;
-  //pOurFrameTeams->overallHedgehogs--;
-  emit hedgehogsNumChanged();
-}
-
-CHedgehogerWidget::~CHedgehogerWidget()
-{
-  // TODO: not called?
-  //pOurFrameTeams->overallHedgehogs-=numItems;
-}
-
-void CHedgehogerWidget::setNonInteractive()
-{
-  nonInteractive=true;
-}
-
-void CHedgehogerWidget::setHHNum(unsigned int num)
-{
-  /*unsigned int diff = num - numItems;
-  numItems += diff;
-  pOurFrameTeams->overallHedgehogs += diff;*/
-  numItems = num;
-  repaint();
-}
-
-unsigned char CHedgehogerWidget::getHedgehogsNum() const
-{
-  return numItems;
-}
--- a/QTfrontend/hedgehogerWidget.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2007 Ulyanov Igor <iulyanov@gmail.com>
- * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef _HEDGEHOGER_WIDGET
-#define _HEDGEHOGER_WIDGET
-
-#include "itemNum.h"
-
-class FrameTeams;
-
-class CHedgehogerWidget : public ItemNum
-{
-  Q_OBJECT
-
- public:
-  CHedgehogerWidget(const QImage& im, const QImage& img, QWidget * parent);
-  virtual ~CHedgehogerWidget();
-  unsigned char getHedgehogsNum() const;
-  void setHHNum (unsigned int num);
-  void setNonInteractive();
-
- signals:
-  void hedgehogsNumChanged();
-
- protected:
-  virtual void incItems();
-  virtual void decItems();
-
- private:
-  CHedgehogerWidget();
-  FrameTeams* pOurFrameTeams;
-};
-
-#endif // _HEDGEHOGER_WIDGET
--- a/QTfrontend/hwmap.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,91 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2007 Ulyanov Igor <iulyanov@gmail.com>
- * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include "hwconsts.h"
-#include "hwmap.h"
-
-HWMap::HWMap() :
-  TCPBase(false)
-{
-}
-
-HWMap::~HWMap()
-{
-}
-
-void HWMap::getImage(const QString & seed, int filter, MapGenerator mapgen, int maze_size, const QByteArray & drawMapData)
-{
-    m_seed = seed;
-    templateFilter = filter;
-    m_mapgen = mapgen;
-    m_maze_size = maze_size;
-    if(mapgen == MAPGEN_DRAWN) m_drawMapData = drawMapData;
-    Start();
-}
-
-QStringList HWMap::getArguments()
-{
-    QStringList arguments;
-    arguments << cfgdir->absolutePath();
-    arguments << QString("%1").arg(ipc_port);
-    arguments << "landpreview";
-    return arguments;
-}
-
-void HWMap::onClientDisconnect()
-{
-    if (readbuffer.size() == 128 * 32 + 1)
-    {
-        quint8 *buf = (quint8*) readbuffer.constData();
-        QImage im(buf, 256, 128, QImage::Format_Mono);
-        im.setNumColors(2);
-        emit HHLimitReceived(buf[128 * 32]);
-        emit ImageReceived(im);
-    }
-}
-
-void HWMap::SendToClientFirst()
-{
-    SendIPC(QString("eseed %1").arg(m_seed).toUtf8());
-    SendIPC(QString("e$template_filter %1").arg(templateFilter).toUtf8());
-    SendIPC(QString("e$mapgen %1").arg(m_mapgen).toUtf8());
-
-    switch (m_mapgen)
-    {
-        case MAPGEN_MAZE:
-            SendIPC(QString("e$maze_size %1").arg(m_maze_size).toUtf8());
-            break;
-
-        case MAPGEN_DRAWN:
-        {
-            QByteArray data = m_drawMapData;
-            while(data.size() > 0)
-            {
-                QByteArray tmp = data;
-                tmp.truncate(200);
-                SendIPC("edraw " + tmp);
-                data.remove(0, 200);
-            }
-            break;
-        }
-        default: ;
-    }
-
-    SendIPC("!");
-}
--- a/QTfrontend/hwmap.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef _HWMAP_INCLUDED
-#define _HWMAP_INCLUDED
-
-#include <QByteArray>
-#include <QString>
-#include <QImage>
-
-#include "tcpBase.h"
-
-enum MapGenerator
-{
-    MAPGEN_REGULAR,
-    MAPGEN_MAZE,
-    MAPGEN_DRAWN,
-    MAPGEN_MAP
-};
-
-class HWMap : public TCPBase
-{
-  Q_OBJECT
-
- public:
-  HWMap();
-  virtual ~HWMap();
-  void getImage(const QString & seed, int templateFilter, MapGenerator mapgen, int maze_size, const QByteArray & drawMapData);
-
- protected:
-  virtual QStringList getArguments();
-  virtual void onClientDisconnect();
-  virtual void SendToClientFirst();
-
- signals:
-  void ImageReceived(const QImage newImage);
-  void HHLimitReceived(int hhLimit);
-
- private:
-  QString m_seed;
-  int templateFilter;
-  MapGenerator m_mapgen;
-  int m_maze_size;
-  QByteArray m_drawMapData;
-
- private slots:
-};
-
-#endif // _HWMAP_INCLUDED
--- a/QTfrontend/igbox.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QPainter>
-#include <QPoint>
-#include <QStylePainter>
-#include <QStyleOptionGroupBox>
-
-#include "igbox.h"
-
-IconedGroupBox::IconedGroupBox(QWidget * parent)
-    : QGroupBox(parent)
-{
-// Has issues with border-radius on children
-//    setAttribute(Qt::WA_PaintOnScreen, true);
-    titleLeftPadding = 49;
-    contentTopPadding = 15;
-}
-
-void IconedGroupBox::setIcon(const QIcon & icon)
-{
-    if (this->icon.isNull())
-        setStyleSheet(QString(
-            "IconedGroupBox{"
-                "margin-top: 46px;"
-                "margin-left: 12px;"
-                "padding: %1px 2px 5px 2px;"
-                "}"
-            "IconedGroupBox::title{"
-                "subcontrol-origin: margin;"
-                "subcontrol-position: top left;"
-                "padding-left: %2px;"
-                "padding-top: %1px;"
-                "text-align: left;"
-                "}"
-                ).arg(contentTopPadding).arg(titleLeftPadding)
-        );
-
-    this->icon = icon;
-    repaint();
-}
-
-void IconedGroupBox::paintEvent(QPaintEvent * event)
-{
-    Q_UNUSED(event);
-
-    QStylePainter painter(this);
-
-    QStyleOptionGroupBox option;
-    initStyleOption(&option);
-    painter.drawComplexControl(QStyle::CC_GroupBox, option);
-
-    icon.paint(&painter, QRect(QPoint(0, 0), icon.actualSize(size())));
-}
-
-void IconedGroupBox::setTitleTextPadding(int px)
-{
-    titleLeftPadding = px;
-}
-
-void IconedGroupBox::setContentTopPadding(int px)
-{
-    contentTopPadding = px;
-}
--- a/QTfrontend/igbox.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef _IGBOX_H
-#define _IGBOX_H
-
-#include <QGroupBox>
-#include <QIcon>
-
-class IconedGroupBox : public QGroupBox
-{
-    Q_OBJECT
-
-public:
-    IconedGroupBox(QWidget * parent = 0);
-
-    void setIcon(const QIcon & icon);
-    void setTitleTextPadding(int px);
-    void setContentTopPadding(int px);
-protected:
-    virtual void paintEvent(QPaintEvent * event);
-
-private:
-    QIcon icon;
-    int titleLeftPadding;
-    int contentTopPadding;
-};
-
-#endif // _IGBOX_H
--- a/QTfrontend/input_ip.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QLineEdit>
-#include <QSpinBox>
-#include <QPushButton>
-#include <QGridLayout>
-#include <QLabel>
-
-#include "input_ip.h"
-
-HWHostPortDialog::HWHostPortDialog(QWidget* parent) : QDialog(parent)
-{
-    QGridLayout * layout = new QGridLayout(this);
-
-    QLabel * lbHost = new QLabel(this);
-    lbHost->setText(QLabel::tr("Host:"));
-    layout->addWidget(lbHost, 0, 0);
-
-    QLabel * lbPort = new QLabel(this);
-    lbPort->setText(QLabel::tr("Port:"));
-    layout->addWidget(lbPort, 1, 0);
-
-    leHost = new QLineEdit(this);
-    layout->addWidget(leHost, 0, 1, 1, 2);
-
-    sbPort = new QSpinBox(this);
-    sbPort->setMinimum(0);
-    sbPort->setMaximum(65535);
-    layout->addWidget(sbPort, 1, 1, 1, 2);
-
-    pbDefault = new QPushButton(this);
-    pbDefault->setText(QPushButton::tr("default"));
-    layout->addWidget(pbDefault, 1, 3);
-
-    pbOK = new QPushButton(this);
-    pbOK->setText(QPushButton::tr("OK"));
-    pbOK->setDefault(true);
-    layout->addWidget(pbOK, 3, 1);
-
-    pbCancel = new QPushButton(this);
-    pbCancel->setText(QPushButton::tr("Cancel"));
-    layout->addWidget(pbCancel, 3, 2);
-
-    connect(pbOK, SIGNAL(clicked()), this, SLOT(accept()));
-    connect(pbCancel, SIGNAL(clicked()), this, SLOT(reject()));
-    connect(pbDefault, SIGNAL(clicked()), this, SLOT(setDefaultPort()));
-}
-
-void HWHostPortDialog::setDefaultPort()
-{
-    sbPort->setValue(46631);
-}
--- a/QTfrontend/input_ip.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-
-#ifndef INPUT_IP_H
-#define INPUT_IP_H
-
-#include <QDialog>
-#include <QHostAddress>
-
-class QLineEdit;
-class QSpinBox;
-class QPushButton;
-
-class HWHostPortDialog : public QDialog
-{
-    Q_OBJECT
-public:
-    HWHostPortDialog(QWidget* parent = 0);
-
-    QLineEdit* leHost;
-    QSpinBox* sbPort;
-
-private:
-    QPushButton* pbOK;
-    QPushButton* pbCancel;
-    QPushButton * pbDefault;
-
-private slots:
-    void setDefaultPort();
-};
-
-
-#endif // INPUT_IP_H
--- a/QTfrontend/itemNum.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,114 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Igor Ulyanov <iulyanov@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include "itemNum.h"
-#include "hwform.h"
-
-#include <QMouseEvent>
-#include <QPainter>
-
-ItemNum::ItemNum(const QImage& im, const QImage& img, QWidget * parent, unsigned char min, unsigned char max) :
-  QFrame(parent), m_im(im), m_img(img), infinityState(false), nonInteractive(false), minItems(min), maxItems(max),
-  numItems(min+2 >= max ? min : min+2)
-{
-    enabled = true;
-    if(frontendEffects) setAttribute(Qt::WA_PaintOnScreen, true);
-}
-
-ItemNum::~ItemNum()
-{
-}
-
-void ItemNum::mousePressEvent ( QMouseEvent * event )
-{
-  if(nonInteractive) return;
-  if(event->button()==Qt::LeftButton && enabled) {
-    event->accept();
-    if((infinityState && numItems <= maxItems) || (!infinityState && numItems < maxItems)) {
-      incItems();
-    } else {
-      numItems = minItems+1;
-      // appears there's an emit in there
-      decItems();
-    }
-  } else if (event->button()==Qt::RightButton && enabled) {
-    event->accept();
-    if(numItems > minItems) {
-      decItems();
-    } else {
-      numItems = maxItems+(infinityState?0:-1);
-      incItems();
-    }
-  } else {
-    event->ignore();
-    return;
-  }
-  repaint();
-}
-
-QSize ItemNum::sizeHint () const
-{
-  return QSize((maxItems+1)*12, 32);
-}
-
-void ItemNum::paintEvent(QPaintEvent* event)
-{
-  Q_UNUSED(event);
-
-  QPainter painter(this);
-
-  if (numItems==maxItems+1) {
-    QRect target(0, 0, 100, 32);
-    if (enabled) {
-        painter.drawImage(target, QImage(":/res/infinity.png"));
-    } else {
-        painter.drawImage(target, QImage(":/res/infinitygrey.png"));
-    }
-  } else {
-    for(int i=0; i<numItems; i++) {
-      QRect target(11 * i, i % 2, 25, 35);
-      if (enabled) {
-        painter.drawImage(target, m_im);
-      } else {
-        painter.drawImage(target, m_img);
-      }
-    }
-  }
-}
-
-unsigned char ItemNum::getItemsNum() const
-{
-  return numItems;
-}
-
-void ItemNum::setItemsNum(const unsigned char num)
-{
-  numItems=num;
-  repaint();
-}
-
-void ItemNum::setInfinityState(bool value)
-{
-  infinityState=value;
-}
-
-void ItemNum::setEnabled(bool value)
-{
-  enabled=value;
-  repaint();
-}
--- a/QTfrontend/itemNum.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Igor Ulyanov <iulyanov@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QFrame>
-#include <QImage>
-
-#ifndef _ITEM_NUM_INCLUDED
-#define _ITEM_NUM_INCLUDED
-
-class ItemNum : public QFrame
-{
-  Q_OBJECT
-
-  public:
-    void setInfinityState(bool value);
-    void setEnabled(bool value);
-    unsigned char getItemsNum() const;
-    void setItemsNum(const unsigned char num);
-
-  private:
-    QImage m_im;
-    QImage m_img;
-    bool infinityState;
-    bool enabled;
-
-  protected:
-    ItemNum(const QImage& im, const QImage& img, QWidget * parent, unsigned char min=2, unsigned char max=8);
-    virtual QSize sizeHint () const;
-    virtual ~ItemNum()=0;
-
-    bool nonInteractive;
-    unsigned char minItems;
-    unsigned char maxItems;
-    unsigned char numItems;
-
-    // from QWidget
-    virtual void mousePressEvent ( QMouseEvent * event );
-    virtual void paintEvent(QPaintEvent* event);
-
-    // to be implemented in child
-    virtual void incItems()=0;
-    virtual void decItems()=0;
-};
-
-#endif // _ITEM_NUM_INCLUDED
--- a/QTfrontend/misc.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2005-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include "misc.h"
--- a/QTfrontend/misc.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2005-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef _MISC_H
-#define _MISC_H
-
-
-#include <QObject>
-#include <QSpinBox>
-
-class FreqSpinBox : public QSpinBox
-{
-    Q_OBJECT
-
-public:
-    FreqSpinBox(QWidget* parent) : QSpinBox(parent)
-    {
-
-    }
-
-    QString textFromValue(int value) const
-    {
-        if (!value)
-            return tr("Never");
-        else
-            return tr("Every %1 turn", "", value).arg(value);
-    }
-};
-
-
-#endif // _MISC_H
--- a/QTfrontend/namegen.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,285 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2009 Martin Minarik <ttsmj@pokec.sk>
- * Copyright (c) 2009-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QFile>
-#include <QTextStream>
-#include <QStringList>
-#include <QLineEdit>
-#include "namegen.h"
-#include "hwform.h"
-#include "hwconsts.h"
-
-
-HWNamegen::HWNamegen() {}
-
-QList<QStringList> HWNamegen::TypesTeamnames;
-QList<QStringList> HWNamegen::TypesHatnames;
-bool HWNamegen::typesAvailable = false;
-
-
-void HWNamegen::teamRandomNames(HWTeam & team, const bool changeteamname)
-{
-    // load types if not already loaded
-    if (!typesAvailable)
-        if (!loadTypes())
-            return; // abort if loading failed
-
-    // abort if there are no hat types
-    if (TypesHatnames.size() <= 0)
-        return;
-
-    // the hat will influence which names the hogs get
-    int kind = (rand()%(TypesHatnames.size()));
-
-    // pick team name based on hat
-    if (changeteamname)
-    {
-        if (TypesTeamnames[kind].size() > 0)
-            team.setName(TypesTeamnames[kind][rand()%(TypesTeamnames[kind].size())]);
-
-        team.setGrave(getRandomGrave());
-        team.setFort(getRandomFort());
-        team.setVoicepack("Default");
-    }
-
-    QStringList dicts;
-    QStringList dict;
-
-    if ((TypesHatnames[kind].size()) <= 0)
-    {
-        dicts = dictsForHat(team.hedgehog(0).Hat);
-        dict  = dictContents(dicts[rand()%(dicts.size())]);
-    }
-
-    for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++)
-    {
-        if ((TypesHatnames[kind].size()) > 0)
-        {
-            HWHog hh = team.hedgehog(i);
-            hh.Hat = TypesHatnames[kind][rand()%(TypesHatnames[kind].size())];
-            team.setHedgehog(i,hh);
-        }
-
-        // there is a chance that this hog has the same hat as the previous one
-        // let's reuse the hat-specific dict in this case
-        if ((i == 0) or (team.hedgehog(i).Hat != team.hedgehog(i-1).Hat))
-        {
-            dicts = dictsForHat(team.hedgehog(i).Hat);
-            dict  = dictContents(dicts[rand()%(dicts.size())]);
-        }
-
-        // give each hedgehog a random name
-        HWNamegen::teamRandomName(team,i,dict);
-    }
-
-}
-
-void HWNamegen::teamRandomName(HWTeam & team, const int HedgehogNumber)
-{
-    QStringList dicts = dictsForHat(team.hedgehog(HedgehogNumber).Hat);
-
-    QStringList dict = dictContents(dicts[rand()%(dicts.size())]);
-
-    teamRandomName(team, HedgehogNumber, dict);
-}
-
-void HWNamegen::teamRandomName(HWTeam & team, const int HedgehogNumber, const QStringList & dict)
-{
-    QStringList namesDict = dict;
-
-    for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++)
-    {
-        namesDict.removeOne(team.hedgehog(i).Name);
-    }
-
-    // if our dict doesn't have any new names we'll have to use duplicates
-    if (namesDict.size() < 1)
-        namesDict = dict;
-
-    HWHog hh = team.hedgehog(HedgehogNumber);
-
-    hh.Name = namesDict[rand()%(namesDict.size())];
-
-    team.setHedgehog(HedgehogNumber, hh);
-}
-
-QStringList HWNamegen::dictContents(const QString filename)
-{
-    QStringList list;
-
-    QFile file;
-
-    // find .cfg to load the names from
-    file.setFileName(QString("%1/Data/Names/%2.txt").arg(cfgdir->absolutePath()).arg(filename));
-    if (!file.exists())
-        file.setFileName(QString("%1/Names/%2.txt").arg(datadir->absolutePath()).arg(filename));
-
-    if (file.open(QIODevice::ReadOnly | QIODevice::Text))
-    {
-
-        QTextStream in(&file);
-        while (!in.atEnd())
-        {
-            QString line = in.readLine();
-            if(!line.isEmpty())
-                list.append(line);
-        }
-    }
-
-    if (list.size() == 0)
-         list.append(filename);
-
-    return list;
-}
-
-
-QStringList HWNamegen::dictsForHat(const QString hatname)
-{
-    QStringList list;
-
-    QFile file;
-
-    // find .cfg to load the names from
-    file.setFileName(QString("%1/Data/Names/%2.cfg").arg(cfgdir->absolutePath()).arg(hatname));
-    if (!file.exists())
-        file.setFileName(QString("%1/Names/%2.cfg").arg(datadir->absolutePath()).arg(hatname));
-
-
-    if (file.open(QIODevice::ReadOnly | QIODevice::Text))
-    {
-        QTextStream in(&file);
-        while (!in.atEnd())
-        {
-            QString line = in.readLine();
-            if(!line.isEmpty())
-                list.append(line);
-        }
-    }
-
-    if (list.size() == 0)
-         list.append(QString("generic"));
-
-    return list;
-}
-
-// loades types from ini files. returns true on success.
-bool HWNamegen::loadTypes()
-{
-    QFile file;
-
-    // find .cfg to load the names from
-    file.setFileName(QString("%1/Data/Names/types.ini").arg(cfgdir->absolutePath()));
-    if (!file.exists())
-        file.setFileName(QString("%1/Names/types.ini").arg(datadir->absolutePath()));
-
-
-    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
-        return false;
-
-    int counter = 0; //counter starts with 0 (teamnames mode)
-    TypesTeamnames.append(QStringList());
-    TypesHatnames.append(QStringList());
-
-    QTextStream in(&file);
-    while (!in.atEnd())
-    {
-        QString line = in.readLine();
-        if (line == QString("#####"))
-        {
-            counter++; //toggle mode (teamnames || hats)
-            if ((counter%2) == 0)
-            {
-                TypesTeamnames.append(QStringList());
-                TypesHatnames.append(QStringList());
-            }
-        }
-        else if ((line == QString("*****")) || (line == QString("*END*")))
-        {
-            typesAvailable = true;
-            return true; // bye bye
-        }
-        else
-        {
-            if ((counter%2) == 0)
-            {
-                // even => teamnames mode
-                TypesTeamnames[(counter/2)].append(line);
-            }
-            else
-            {
-                // odd => hats mode
-                TypesHatnames[((counter-1)/2)].append(line);
-            }
-        }
-    }
-
-    typesAvailable = true;
-    return true;
-}
-
-
-
-QString HWNamegen::getRandomGrave()
-{
-    QStringList Graves;
-
-    //list all available Graves
-    QDir tmpdir;
-    tmpdir.cd(cfgdir->absolutePath());
-    tmpdir.cd("Data/Graphics/Graves");
-    tmpdir.setFilter(QDir::Files);
-    Graves.append(tmpdir.entryList(QStringList("*.png")).replaceInStrings(QRegExp("^(.*)\\.png"), "\\1"));
-
-    tmpdir.cd(datadir->absolutePath());
-    tmpdir.cd("Graphics/Graves");
-    tmpdir.setFilter(QDir::Files);
-    QStringList tmpList = tmpdir.entryList(QStringList("*.png")).replaceInStrings(QRegExp("^(.*)\\.png"), "\\1");
-    for (QStringList::Iterator it = tmpList.begin(); it != tmpList.end(); ++it) 
-        if (!Graves.contains(*it,Qt::CaseInsensitive)) Graves.append(*it);
-
-    if(Graves.size()==0)
-    {
-        //do some serious error handling
-        return "Error";
-    }
-
-    //pick a random grave
-    return Graves[rand()%(Graves.size())];
-}
-
-QString HWNamegen::getRandomFort()
-{
-    QStringList Forts;
-
-    //list all available Forts
-    QDir tmpdir;
-    tmpdir.cd(datadir->absolutePath());
-    tmpdir.cd("Forts");
-    tmpdir.setFilter(QDir::Files);
-    Forts.append(tmpdir.entryList(QStringList("*L.png")).replaceInStrings(QRegExp("^(.*)L\\.png"), "\\1"));
-
-    if(Forts.size()==0)
-    {
-        //do some serious error handling
-        return "Error";
-    }
-
-    //pick a random fort
-    return Forts[rand()%(Forts.size())];
-}
--- a/QTfrontend/namegen.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2009 Martin Minarik <ttsmj@pokec.sk>
- * Copyright (c) 2009-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef NAMEGEN_H
-#define NAMEGEN_H
-
-#include <QString>
-
-class HWForm;
-class HWTeam;
-
-class HWNamegen
-{
-public:
-
-    static void teamRandomName(HWTeam & team, const int HedgehogNumber);
-    static void teamRandomNames(HWTeam & team, const bool changeteamname);
-
-private:
-        HWNamegen();
-
-        static QList<QStringList> TypesTeamnames;
-        static QList<QStringList> TypesHatnames;
-        static bool typesAvailable;
-
-        static bool loadTypes();
-        static QStringList dictContents(const QString filename);
-        static QStringList dictsForHat(const QString hatname);
-
-        static QString getRandomGrave();
-        static QString getRandomFort();
-        static void teamRandomName(HWTeam & team, const int HedgehogNumber, const QStringList & dict);
-};
-
-
-
-#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/net/hwmap.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,91 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2007 Ulyanov Igor <iulyanov@gmail.com>
+ * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include "hwconsts.h"
+#include "hwmap.h"
+
+HWMap::HWMap() :
+  TCPBase(false)
+{
+}
+
+HWMap::~HWMap()
+{
+}
+
+void HWMap::getImage(const QString & seed, int filter, MapGenerator mapgen, int maze_size, const QByteArray & drawMapData)
+{
+    m_seed = seed;
+    templateFilter = filter;
+    m_mapgen = mapgen;
+    m_maze_size = maze_size;
+    if(mapgen == MAPGEN_DRAWN) m_drawMapData = drawMapData;
+    Start();
+}
+
+QStringList HWMap::getArguments()
+{
+    QStringList arguments;
+    arguments << cfgdir->absolutePath();
+    arguments << QString("%1").arg(ipc_port);
+    arguments << "landpreview";
+    return arguments;
+}
+
+void HWMap::onClientDisconnect()
+{
+    if (readbuffer.size() == 128 * 32 + 1)
+    {
+        quint8 *buf = (quint8*) readbuffer.constData();
+        QImage im(buf, 256, 128, QImage::Format_Mono);
+        im.setNumColors(2);
+        emit HHLimitReceived(buf[128 * 32]);
+        emit ImageReceived(im);
+    }
+}
+
+void HWMap::SendToClientFirst()
+{
+    SendIPC(QString("eseed %1").arg(m_seed).toUtf8());
+    SendIPC(QString("e$template_filter %1").arg(templateFilter).toUtf8());
+    SendIPC(QString("e$mapgen %1").arg(m_mapgen).toUtf8());
+
+    switch (m_mapgen)
+    {
+        case MAPGEN_MAZE:
+            SendIPC(QString("e$maze_size %1").arg(m_maze_size).toUtf8());
+            break;
+
+        case MAPGEN_DRAWN:
+        {
+            QByteArray data = m_drawMapData;
+            while(data.size() > 0)
+            {
+                QByteArray tmp = data;
+                tmp.truncate(200);
+                SendIPC("edraw " + tmp);
+                data.remove(0, 200);
+            }
+            break;
+        }
+        default: ;
+    }
+
+    SendIPC("!");
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/net/hwmap.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,65 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef _HWMAP_INCLUDED
+#define _HWMAP_INCLUDED
+
+#include <QByteArray>
+#include <QString>
+#include <QImage>
+
+#include "tcpBase.h"
+
+enum MapGenerator
+{
+    MAPGEN_REGULAR,
+    MAPGEN_MAZE,
+    MAPGEN_DRAWN,
+    MAPGEN_MAP
+};
+
+class HWMap : public TCPBase
+{
+  Q_OBJECT
+
+ public:
+  HWMap();
+  virtual ~HWMap();
+  void getImage(const QString & seed, int templateFilter, MapGenerator mapgen, int maze_size, const QByteArray & drawMapData);
+
+ protected:
+  virtual QStringList getArguments();
+  virtual void onClientDisconnect();
+  virtual void SendToClientFirst();
+
+ signals:
+  void ImageReceived(const QImage newImage);
+  void HHLimitReceived(int hhLimit);
+
+ private:
+  QString m_seed;
+  int templateFilter;
+  MapGenerator m_mapgen;
+  int m_maze_size;
+  QByteArray m_drawMapData;
+
+ private slots:
+};
+
+#endif // _HWMAP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/net/netregister.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,31 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include "netregister.h"
+
+HWNetRegisterServer::HWNetRegisterServer(QObject *parent, const QString & descr, quint16 port) :
+  QObject(parent)
+{
+    Q_UNUSED(descr);
+    Q_UNUSED(port);
+}
+
+void HWNetRegisterServer::unregister()
+{
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/net/netregister.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,35 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef _NET_REGISTER_INCLUDED
+#define _NET_REGISTER_INCLUDED
+
+#include <QObject>
+
+class HWNetRegisterServer : public QObject
+{
+    Q_OBJECT
+
+public:
+    HWNetRegisterServer(QObject *parent, const QString & descr, quint16 port);
+
+public slots:
+    virtual void unregister();
+};
+
+#endif // _NET_REGISTER_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/net/netserver.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,52 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2008 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QMessageBox>
+
+#include "hwconsts.h"
+#include "netserver.h"
+
+HWNetServer::~HWNetServer()
+{
+    StopServer();
+}
+
+bool HWNetServer::StartServer(quint16 port)
+{
+    ds_port = port;
+
+    QStringList params;
+    params << QString("--port=%1").arg(port);
+    params << "--dedicated=False";
+
+    process.start(bindir->absolutePath() + "/hedgewars-server", params);
+
+    return process.waitForStarted(5000);
+}
+
+void HWNetServer::StopServer()
+{
+    process.close();
+}
+
+
+quint16 HWNetServer::getRunningPort() const
+{
+  return ds_port;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/net/netserver.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,42 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2008 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef _NETSERVER_INCLUDED
+#define _NETSERVER_INCLUDED
+
+#include <QObject>
+#include <QProcess>
+
+class HWNetServer : public QObject
+{
+    Q_OBJECT
+
+public:
+    ~HWNetServer();
+    bool StartServer(quint16 port);
+    void StopServer();
+    QString getRunningHostName() const;
+    quint16 getRunningPort() const;
+
+private:
+    quint16 ds_port;
+    QProcess process;
+};
+
+#endif // _NETSERVER_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/net/netudpserver.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,51 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2007-2008 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QUdpSocket>
+
+#include "netudpserver.h"
+
+HWNetUdpServer::HWNetUdpServer(QObject *parent, const QString & descr, quint16 port) :
+  HWNetRegisterServer(parent, descr, port),
+  m_descr(descr)
+{
+  pUdpSocket = new QUdpSocket(this);
+  pUdpSocket->bind(46631);
+  connect(pUdpSocket, SIGNAL(readyRead()), this, SLOT(onClientRead()));
+}
+
+void HWNetUdpServer::onClientRead()
+{
+  while (pUdpSocket->hasPendingDatagrams()) {
+    QByteArray datagram;
+    datagram.resize(pUdpSocket->pendingDatagramSize());
+    QHostAddress clientAddr;
+    quint16 clientPort;
+    pUdpSocket->readDatagram(datagram.data(), datagram.size(), &clientAddr, &clientPort);
+    if(datagram.startsWith("hedgewars client")) {
+      // send answer to client
+      pUdpSocket->writeDatagram(QString("hedgewars server\n%1").arg(m_descr).toUtf8(), clientAddr, clientPort);
+    }
+  }
+}
+
+void HWNetUdpServer::unregister()
+{
+  deleteLater();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/net/netudpserver.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,46 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2007-2008 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef _NET_UDPSERVER_INCLUDED
+#define _NET_UDPSERVER_INCLUDED
+
+#include <QObject>
+#include "netregister.h"
+
+class QUdpSocket;
+
+class HWNetUdpServer : public HWNetRegisterServer
+{
+  Q_OBJECT
+
+ public:
+  HWNetUdpServer(QObject *parent, const QString & descr, quint16 port);
+
+ public slots:
+  void unregister();
+
+ private slots:
+  void onClientRead();
+
+ private:
+  QUdpSocket* pUdpSocket;
+  QString m_descr;
+};
+
+#endif // _NET_UDPSERVER_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/net/netudpwidget.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,72 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2007 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QUdpSocket>
+
+#include "netudpwidget.h"
+
+HWNetUdpModel::HWNetUdpModel(QObject* parent) :
+  HWNetServersModel(parent)
+{
+    pUdpSocket = new QUdpSocket(this);
+
+    pUdpSocket->bind();
+    connect(pUdpSocket, SIGNAL(readyRead()), this, SLOT(onClientRead()));
+}
+
+void HWNetUdpModel::updateList()
+{
+    games.clear();
+
+    reset();
+
+    pUdpSocket->writeDatagram("hedgewars client", QHostAddress::Broadcast, 46631);
+}
+
+void HWNetUdpModel::onClientRead()
+{
+    while (pUdpSocket->hasPendingDatagrams()) {
+        QByteArray datagram;
+        datagram.resize(pUdpSocket->pendingDatagramSize());
+        QHostAddress clientAddr;
+        quint16 clientPort;
+
+        pUdpSocket->readDatagram(datagram.data(), datagram.size(), &clientAddr, &clientPort);
+
+        QString packet = QString::fromUtf8(datagram.data());
+        if(packet.startsWith("hedgewars server")) {
+            QStringList sl;
+            sl << packet.remove(0, 17) << clientAddr.toString() << "46631";
+            games.append(sl);
+        }
+    }
+
+    reset();
+}
+
+QVariant HWNetUdpModel::data(const QModelIndex &index,
+                             int role) const
+{
+    if (!index.isValid() || index.row() < 0
+        || index.row() >= games.size()
+        || role != Qt::DisplayRole)
+    return QVariant();
+
+    return games[index.row()][index.column()];
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/net/netudpwidget.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,46 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2007 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef _NET_UDPWIDGET_INCLUDED
+#define _NET_UDPWIDGET_INCLUDED
+
+#include "netserverslist.h"
+
+class QUdpSocket;
+
+class HWNetUdpModel : public HWNetServersModel
+{
+  Q_OBJECT
+
+public:
+    HWNetUdpModel(QObject *parent = 0);
+
+    QVariant data(const QModelIndex &index, int role) const;
+
+public slots:
+    void updateList();
+
+private slots:
+    void onClientRead();
+
+private:
+    QUdpSocket* pUdpSocket;
+};
+
+#endif // _NET_UDPWIDGET_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/net/newnetclient.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,790 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2008 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QDebug>
+#include <QInputDialog>
+#include <QCryptographicHash>
+
+#include "hwconsts.h"
+#include "newnetclient.h"
+#include "proto.h"
+#include "game.h"
+#include "misc.h"
+/* only to get the ignoreList from the chat widget */
+#include "hwform.h"
+#include "chatwidget.h"
+
+char delimeter='\n';
+
+HWNewNet::HWNewNet() :
+  isChief(false),
+  m_game_connected(false),
+  loginStep(0),
+  netClientState(Disconnected)
+{
+// socket stuff
+    connect(&NetSocket, SIGNAL(readyRead()), this, SLOT(ClientRead()));
+    connect(&NetSocket, SIGNAL(connected()), this, SLOT(OnConnect()));
+    connect(&NetSocket, SIGNAL(disconnected()), this, SLOT(OnDisconnect()));
+    connect(&NetSocket, SIGNAL(error(QAbstractSocket::SocketError)), this,
+            SLOT(displayError(QAbstractSocket::SocketError)));
+}
+
+HWNewNet::~HWNewNet()
+{
+    if (m_game_connected)
+    {
+        RawSendNet(QString("QUIT%1%2").arg(delimeter).arg("User quit"));
+        emit disconnected(tr("User quit"));
+    }
+    NetSocket.flush();
+}
+
+void HWNewNet::Connect(const QString & hostName, quint16 port, const QString & nick)
+{
+    netClientState = Connecting;
+    mynick = nick;
+    myhost = hostName + QString(":%1").arg(port);
+    NetSocket.connectToHost(hostName, port);
+}
+
+void HWNewNet::Disconnect()
+{
+    if (m_game_connected)
+        RawSendNet(QString("QUIT%1%2").arg(delimeter).arg("User quit"));
+    m_game_connected = false;
+
+    NetSocket.disconnectFromHost();
+}
+
+void HWNewNet::CreateRoom(const QString & room)
+{
+    if(netClientState != InLobby)
+    {
+        qWarning("Illegal try to create room!");
+        return;
+    }
+
+    myroom = room;
+
+    RawSendNet(QString("CREATE_ROOM%1%2").arg(delimeter).arg(room));
+    isChief = true;
+}
+
+void HWNewNet::JoinRoom(const QString & room)
+{
+    if(netClientState != InLobby)
+    {
+        qWarning("Illegal try to join room!");
+        return;
+    }
+
+    myroom = room;
+
+    RawSendNet(QString("JOIN_ROOM%1%2").arg(delimeter).arg(room));
+    isChief = false;
+}
+
+void HWNewNet::AddTeam(const HWTeam & team)
+{
+    QString cmd = QString("ADD_TEAM") + delimeter +
+         team.name() + delimeter +
+         team.color().name() + delimeter +
+         team.grave() + delimeter +
+         team.fort() + delimeter +
+         team.voicepack() + delimeter +
+         team.flag() + delimeter +
+         QString::number(team.difficulty());
+
+    for(int i = 0; i < HEDGEHOGS_PER_TEAM; ++i)
+    {
+        cmd.append(delimeter);
+        cmd.append(team.hedgehog(i).Name);
+        cmd.append(delimeter);
+        cmd.append(team.hedgehog(i).Hat);
+    }
+    RawSendNet(cmd);
+}
+
+void HWNewNet::RemoveTeam(const HWTeam & team)
+{
+    RawSendNet(QString("REMOVE_TEAM") + delimeter + team.name());
+}
+
+void HWNewNet::NewNick(const QString & nick)
+{
+    RawSendNet(QString("NICK%1%2").arg(delimeter).arg(nick));
+}
+
+void HWNewNet::ToggleReady()
+{
+  RawSendNet(QString("TOGGLE_READY"));
+}
+
+void HWNewNet::SendNet(const QByteArray & buf)
+{
+  QString msg = QString(buf.toBase64());
+
+  RawSendNet(QString("EM%1%2").arg(delimeter).arg(msg));
+}
+
+void HWNewNet::RawSendNet(const QString & str)
+{
+  RawSendNet(str.toUtf8());
+}
+
+void HWNewNet::RawSendNet(const QByteArray & buf)
+{
+    qDebug() << "Client: " << QString(buf).split("\n");
+    NetSocket.write(buf);
+    NetSocket.write("\n\n", 2);
+}
+
+void HWNewNet::ClientRead()
+{
+    while (NetSocket.canReadLine()) {
+        QString s = QString::fromUtf8(NetSocket.readLine());
+        if (s.endsWith('\n')) s.chop(1);
+
+        if (s.size() == 0) {
+            ParseCmd(cmdbuf);
+            cmdbuf.clear();
+        } else
+            cmdbuf << s;
+    }
+}
+
+void HWNewNet::OnConnect()
+{
+    netClientState = Connected;
+}
+
+void HWNewNet::OnDisconnect()
+{
+    netClientState = Disconnected;
+    if(m_game_connected) emit disconnected("");
+    m_game_connected = false;
+}
+
+void HWNewNet::displayError(QAbstractSocket::SocketError socketError)
+{
+    m_game_connected = false;
+
+    switch (socketError) {
+        case QAbstractSocket::RemoteHostClosedError:
+            break;
+        case QAbstractSocket::HostNotFoundError:
+            emit disconnected(tr("The host was not found. Please check the host name and port settings."));
+            break;
+        case QAbstractSocket::ConnectionRefusedError:
+            emit disconnected(tr("Connection refused"));
+            break;
+        default:
+            emit disconnected(NetSocket.errorString());
+        }
+}
+
+void HWNewNet::SendPasswordHash(const QString & hash)
+{
+    RawSendNet(QString("PASSWORD%1%2").arg(delimeter).arg(hash));
+}
+
+void HWNewNet::ParseCmd(const QStringList & lst)
+{
+  qDebug() << "Server: " << lst;
+
+    if(!lst.size())
+    {
+        qWarning("Net client: Bad message");
+        return;
+    }
+
+    if (lst[0] == "NICK")
+    {
+        mynick = lst[1];
+        return ;
+    }
+
+    if (lst[0] == "PROTO")
+        return ;
+
+    if (lst[0] == "ERROR") {
+        if (lst.size() == 2)
+            emit Error(lst[1]);
+        else
+            emit Error("Unknown error");
+        return;
+    }
+
+    if (lst[0] == "WARNING") {
+        if (lst.size() == 2)
+            emit Warning(lst[1]);
+        else
+            emit Warning("Unknown warning");
+        return;
+    }
+
+    if (lst[0] == "CONNECTED") {
+        if(lst.size() < 3 || lst[2].toInt() < cMinServerVersion)
+        {
+            // TODO: Warn user, disconnect
+            qWarning() << "Server too old";
+        }
+
+        RawSendNet(QString("NICK%1%2").arg(delimeter).arg(mynick));
+        RawSendNet(QString("PROTO%1%2").arg(delimeter).arg(*cProtoVer));
+        netClientState = Connected;
+        m_game_connected = true;
+        emit adminAccess(false);
+        return;
+    }
+
+    if (lst[0] == "PING") {
+        if (lst.size() > 1)
+            RawSendNet(QString("PONG%1%2").arg(delimeter).arg(lst[1]));
+        else
+            RawSendNet(QString("PONG"));
+        return;
+    }
+
+    if (lst[0] == "ROOMS") {
+        QStringList tmp = lst;
+        tmp.removeFirst();
+        emit roomsList(tmp);
+        return;
+    }
+
+    if (lst[0] == "SERVER_MESSAGE") {
+        if(lst.size() < 2)
+        {
+            qWarning("Net: Empty SERVERMESSAGE message");
+            return;
+        }
+        emit serverMessage(lst[1]);
+        return;
+    }
+
+    if (lst[0] == "CHAT") {
+        if(lst.size() < 3)
+        {
+            qWarning("Net: Empty CHAT message");
+            return;
+        }
+        if (netClientState == InLobby)
+            emit chatStringLobby(lst[1], HWProto::formatChatMsgForFrontend(lst[2]));
+        else
+            emit chatStringFromNet(HWProto::formatChatMsg(lst[1], lst[2]));
+        return;
+    }
+
+    if (lst[0] == "INFO") {
+        if(lst.size() < 5)
+        {
+            qWarning("Net: Malformed INFO message");
+            return;
+        }
+        QStringList tmp = lst;
+        tmp.removeFirst();
+        if (netClientState == InLobby)
+            emit chatStringLobby(tmp.join("\n").prepend('\x01'));
+        else
+            emit chatStringFromNet(tmp.join("\n").prepend('\x01'));
+        return;
+    }
+
+    if (lst[0] == "SERVER_VARS") {
+        QStringList tmp = lst;
+        tmp.removeFirst();
+        while (tmp.size() >= 2)
+        {
+            if(tmp[0] == "MOTD_NEW") emit serverMessageNew(tmp[1]);
+            else if(tmp[0] == "MOTD_OLD") emit serverMessageOld(tmp[1]);
+            else if(tmp[0] == "LATEST_PROTO") emit latestProtocolVar(tmp[1].toInt());
+
+            tmp.removeFirst();
+            tmp.removeFirst();
+        }
+        return;
+    }
+
+    if (lst[0] == "CLIENT_FLAGS")
+    {
+        if(lst.size() < 3 || lst[1].size() < 2)
+        {
+            qWarning("Net: Malformed CLIENT_FLAGS message");
+            return;
+        }
+
+        QString flags = lst[1];
+        bool setFlag = flags[0] == '+';
+
+        while(flags.size() > 1)
+        {
+            flags.remove(0, 1);
+            char c = flags[0].toAscii();
+
+            switch(c)
+            {
+            case 'r':
+                {
+                    for(int i = 2; i < lst.size(); ++i)
+                    {
+                        if (lst[i] == mynick)
+                            emit setMyReadyStatus(setFlag);
+                        emit setReadyStatus(lst[i], setFlag);
+                    }
+                }
+            }
+        }
+
+        return;
+    }
+
+    if (lst[0] == "ADD_TEAM") {
+        if(lst.size() != 24)
+        {
+            qWarning("Net: Bad ADDTEAM message");
+            return;
+        }
+        QStringList tmp = lst;
+        tmp.removeFirst();
+        emit AddNetTeam(tmp);
+        return;
+    }
+
+    if (lst[0] == "REMOVE_TEAM") {
+        if(lst.size() != 2)
+        {
+            qWarning("Net: Bad REMOVETEAM message");
+            return;
+        }
+        emit RemoveNetTeam(HWTeam(lst[1]));
+        return;
+    }
+
+    if(lst[0] == "ROOMABANDONED") {
+        netClientState = InLobby;
+        emit LeftRoom(tr("Room destroyed"));
+        return;
+    }
+
+    if(lst[0] == "KICKED") {
+        netClientState = InLobby;
+        emit LeftRoom(tr("You got kicked"));
+        return;
+    }
+
+    if(lst[0] == "JOINED") {
+        if(lst.size() < 2)
+        {
+            qWarning("Net: Bad JOINED message");
+            return;
+        }
+
+        for(int i = 1; i < lst.size(); ++i)
+        {
+            if (lst[i] == mynick)
+            {
+                netClientState = InRoom;
+                emit EnteredGame();
+                emit roomMaster(isChief);
+                if (isChief)
+                    emit configAsked();
+            }
+
+            emit nickAdded(lst[i], isChief && (lst[i] != mynick));
+            emit chatStringFromNet(tr("%1 *** %2 has joined the room").arg('\x03').arg(lst[i]));
+        }
+        return;
+    }
+
+    if(lst[0] == "LOBBY:JOINED") {
+        if(lst.size() < 2)
+        {
+            qWarning("Net: Bad JOINED message");
+            return;
+        }
+
+        for(int i = 1; i < lst.size(); ++i)
+        {
+            if (lst[i] == mynick)
+            {
+                netClientState = InLobby;
+                RawSendNet(QString("LIST"));
+                emit connected();
+            }
+
+            emit nickAddedLobby(lst[i], false);
+            emit chatStringLobby(lst[i], tr("%1 *** %2 has joined").arg('\x03').arg("|nick|"));
+        }
+        return;
+    }
+
+    if(lst[0] == "LEFT") {
+        if(lst.size() < 2)
+        {
+            qWarning("Net: Bad LEFT message");
+            return;
+        }
+        emit nickRemoved(lst[1]);
+        if (lst.size() < 3)
+            emit chatStringFromNet(tr("%1 *** %2 has left").arg('\x03').arg(lst[1]));
+        else
+            emit chatStringFromNet(tr("%1 *** %2 has left (%3)").arg('\x03').arg(lst[1], lst[2]));
+        return;
+    }
+
+    if(lst[0] == "ROOM") {
+        if(lst.size() < 2)
+        {
+            qWarning("Net: Bad ROOM message");
+            return;
+        }
+        RawSendNet(QString("LIST"));
+        return;
+    }
+
+    if(lst[0] == "LOBBY:LEFT") {
+        if(lst.size() < 2)
+        {
+            qWarning("Net: Bad LOBBY:LEFT message");
+            return;
+        }
+        emit nickRemovedLobby(lst[1]);
+        if (lst.size() < 3)
+            emit chatStringLobby(tr("%1 *** %2 has left").arg('\x03').arg(lst[1]));
+        else
+            emit chatStringLobby(tr("%1 *** %2 has left (%3)").arg('\x03').arg(lst[1], lst[2]));
+        return;
+    }
+
+    if (lst[0] == "RUN_GAME") {
+        netClientState = InGame;
+        emit AskForRunGame();
+        return;
+    }
+
+    if (lst[0] == "ASKPASSWORD") {
+        emit AskForPassword(mynick);
+        return;
+    }
+
+    if (lst[0] == "NOTICE") {
+        if(lst.size() < 2)
+        {
+            qWarning("Net: Bad NOTICE message");
+            return;
+        }
+
+        bool ok;
+        int n = lst[1].toInt(&ok);
+        if(!ok)
+        {
+            qWarning("Net: Bad NOTICE message");
+            return;
+        }
+
+        handleNotice(n);
+
+        return;
+    }
+
+    if (lst[0] == "TEAM_ACCEPTED") {
+        if (lst.size() != 2)
+        {
+            qWarning("Net: Bad TEAM_ACCEPTED message");
+            return;
+        }
+        emit TeamAccepted(lst[1]);
+        return;
+    }
+
+
+    if (lst[0] == "CFG") {
+        if(lst.size() < 3)
+        {
+            qWarning("Net: Bad CFG message");
+            return;
+        }
+        QStringList tmp = lst;
+        tmp.removeFirst();
+        tmp.removeFirst();
+        if (lst[1] == "SCHEME")
+            emit netSchemeConfig(tmp);
+        else
+            emit paramChanged(lst[1], tmp);
+        return;
+    }
+
+    if (lst[0] == "HH_NUM") {
+        if (lst.size() != 3)
+        {
+            qWarning("Net: Bad TEAM_ACCEPTED message");
+            return;
+        }
+        HWTeam tmptm(lst[1]);
+        tmptm.setNumHedgehogs(lst[2].toUInt());
+        emit hhnumChanged(tmptm);
+        return;
+    }
+
+    if (lst[0] == "TEAM_COLOR") {
+        if (lst.size() != 3)
+        {
+            qWarning("Net: Bad TEAM_COLOR message");
+            return;
+        }
+        HWTeam tmptm(lst[1]);
+        tmptm.setColor(QColor(lst[2]));
+        emit teamColorChanged(tmptm);
+        return;
+    }
+
+    if (lst[0] == "EM") {
+        if(lst.size() < 2)
+        {
+            qWarning("Net: Bad EM message");
+            return;
+        }
+        for(int i = 1; i < lst.size(); ++i)
+        {
+            QByteArray em = QByteArray::fromBase64(lst[i].toAscii());
+            emit FromNet(em);
+        }
+        return;
+    }
+
+    if (lst[0] == "BYE") {
+        if (lst.size() < 2)
+        {
+            qWarning("Net: Bad BYE message");
+            return;
+        }
+        if (lst[1] == "Authentication failed")
+        {
+            emit AuthFailed();
+        }
+        m_game_connected = false;
+        Disconnect();
+        emit disconnected(lst[1]);
+        return;
+    }
+
+
+    if (lst[0] == "ADMIN_ACCESS") {
+        emit adminAccess(true);
+        return;
+    }
+
+    if (lst[0] == "ROOM_CONTROL_ACCESS") {
+        if (lst.size() < 2)
+        {
+            qWarning("Net: Bad ROOM_CONTROL_ACCESS message");
+            return;
+        }
+        isChief = (lst[1] != "0");
+        emit roomMaster(isChief);
+        return;
+    }
+
+    qWarning() << "Net: Unknown message:" << lst;
+}
+
+void HWNewNet::onHedgehogsNumChanged(const HWTeam& team)
+{
+    if (isChief)
+    RawSendNet(QString("HH_NUM%1%2%1%3")
+            .arg(delimeter)
+            .arg(team.name())
+            .arg(team.numHedgehogs()));
+}
+
+void HWNewNet::onTeamColorChanged(const HWTeam& team)
+{
+    if (isChief)
+    RawSendNet(QString("TEAM_COLOR%1%2%1%3")
+            .arg(delimeter)
+            .arg(team.name())
+            .arg(team.color().name()));
+}
+
+void HWNewNet::onParamChanged(const QString & param, const QStringList & value)
+{
+    if (isChief)
+        RawSendNet(
+                QString("CFG%1%2%1%3")
+                    .arg(delimeter)
+                    .arg(param)
+                    .arg(value.join(QString(delimeter)))
+                );
+}
+
+void HWNewNet::chatLineToNet(const QString& str)
+{
+    if(str != "") {
+        RawSendNet(QString("CHAT") + delimeter + str);
+        emit(chatStringFromMe(HWProto::formatChatMsg(mynick, str)));
+    }
+}
+
+void HWNewNet::chatLineToLobby(const QString& str)
+{
+    if(str != "") {
+        RawSendNet(QString("CHAT") + delimeter + str);
+        emit(chatStringFromMeLobby(HWProto::formatChatMsg(mynick, str)));
+    }
+}
+
+void HWNewNet::SendTeamMessage(const QString& str)
+{
+    RawSendNet(QString("TEAMCHAT") + delimeter + str);
+}
+
+void HWNewNet::askRoomsList()
+{
+    if(netClientState != InLobby)
+    {
+        qWarning("Illegal try to get rooms list!");
+        return;
+    }
+    RawSendNet(QString("LIST"));
+}
+
+HWNewNet::ClientState HWNewNet::clientState()
+{
+    return netClientState;
+}
+
+QString HWNewNet::getNick()
+{
+    return mynick;
+}
+
+QString HWNewNet::getRoom()
+{
+    return myroom;
+}
+
+QString HWNewNet::getHost()
+{
+    return myhost;
+}
+
+bool HWNewNet::isRoomChief()
+{
+    return isChief;
+}
+
+void HWNewNet::gameFinished(bool correctly)
+{
+    if (netClientState == InGame) netClientState = InRoom;
+    RawSendNet(QString("ROUNDFINISHED%1%2").arg(delimeter).arg(correctly ? "1" : "0"));
+}
+
+void HWNewNet::banPlayer(const QString & nick)
+{
+    RawSendNet(QString("BAN%1%2").arg(delimeter).arg(nick));
+}
+
+void HWNewNet::kickPlayer(const QString & nick)
+{
+    RawSendNet(QString("KICK%1%2").arg(delimeter).arg(nick));
+}
+
+void HWNewNet::infoPlayer(const QString & nick)
+{
+    RawSendNet(QString("INFO%1%2").arg(delimeter).arg(nick));
+}
+
+void HWNewNet::followPlayer(const QString & nick)
+{
+    if (!isInRoom()) {
+        RawSendNet(QString("FOLLOW%1%2").arg(delimeter).arg(nick));
+        isChief = false;
+    }
+}
+
+void HWNewNet::startGame()
+{
+    RawSendNet(QString("START_GAME"));
+}
+
+void HWNewNet::updateRoomName(const QString & name)
+{
+    RawSendNet(QString("ROOM_NAME%1%2").arg(delimeter).arg(name));
+}
+
+
+void HWNewNet::toggleRestrictJoins()
+{
+    RawSendNet(QString("TOGGLE_RESTRICT_JOINS"));
+}
+
+void HWNewNet::toggleRestrictTeamAdds()
+{
+    RawSendNet(QString("TOGGLE_RESTRICT_TEAMS"));
+}
+
+void HWNewNet::clearAccountsCache()
+{
+    RawSendNet(QString("CLEAR_ACCOUNTS_CACHE"));
+}
+
+void HWNewNet::partRoom()
+{
+    netClientState = InLobby;
+    RawSendNet(QString("PART"));
+}
+
+bool HWNewNet::isInRoom()
+{
+    return netClientState >= InRoom;
+}
+
+void HWNewNet::setServerMessageNew(const QString & msg)
+{
+    RawSendNet(QString("SET_SERVER_VAR%1MOTD_NEW%1%2").arg(delimeter).arg(msg));
+}
+
+void HWNewNet::setServerMessageOld(const QString & msg)
+{
+    RawSendNet(QString("SET_SERVER_VAR%1MOTD_OLD%1%2").arg(delimeter).arg(msg));
+}
+
+void HWNewNet::setLatestProtocolVar(int proto)
+{
+    RawSendNet(QString("SET_SERVER_VAR%1LATEST_PROTO%1%2").arg(delimeter).arg(proto));
+}
+
+void HWNewNet::askServerVars()
+{
+    RawSendNet(QString("GET_SERVER_VAR"));
+}
+
+void HWNewNet::handleNotice(int n)
+{
+    switch(n)
+    {
+        case 0:
+        {
+            emit NickTaken(mynick);
+            break;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/net/newnetclient.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,177 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2008 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef _NEW_NETCLIENT_INCLUDED
+#define _NEW_NETCLIENT_INCLUDED
+
+#include <QObject>
+#include <QString>
+#include <QTcpSocket>
+#include <QMap>
+
+#include "team.h"
+#include "game.h" // for GameState
+
+class GameUIConfig;
+class GameCFGWidget;
+class TeamSelWidget;
+
+extern char delimeter;
+
+class HWNewNet : public QObject
+{
+  Q_OBJECT
+
+ public:
+  enum ClientState { Disconnected, Connecting, Connected, InLobby, InRoom, InGame };
+
+  HWNewNet();
+  ~HWNewNet();
+  void Connect(const QString & hostName, quint16 port, const QString & nick);
+  void Disconnect();
+  void SendPasswordHash(const QString & hash);
+  void NewNick(const QString & nick);
+  bool isRoomChief();
+  bool isInRoom();
+  ClientState clientState();
+  QString getNick();
+  QString getRoom();
+  QString getHost();
+
+ private:
+  bool isChief;
+  QString mynick;
+  QString myroom;
+  QString myhost;
+  QTcpSocket NetSocket;
+  QString seed;
+  bool m_game_connected;
+
+  template <typename T>
+  void SendCfgStrNet(T a) {
+    QByteArray strmsg;
+    strmsg.append(a);
+    quint8 sz = strmsg.size();
+    QByteArray enginemsg = QByteArray((char *)&sz, 1) + strmsg;
+    QString _msg = delimeter + QString(enginemsg.toBase64());
+    RawSendNet(_msg);
+  }
+
+  template <typename T>
+  void SendCfgStrLoc(T a) {
+    QByteArray strmsg;
+    strmsg.append(QString(a).toUtf8());
+    quint8 sz = strmsg.size();
+    QByteArray enginemsg = QByteArray((char *)&sz, 1) + strmsg;
+    emit FromNet(enginemsg);
+  }
+
+  QStringList cmdbuf;
+
+  void RawSendNet(const QString & buf);
+  void RawSendNet(const QByteArray & buf);
+  void ParseCmd(const QStringList & lst);
+  void handleNotice(int n);
+
+  int loginStep;
+  ClientState netClientState;
+
+ signals:
+  void AskForRunGame();
+  void connected();
+  void disconnected(const QString & reason);
+  void Error(const QString & errmsg);
+  void Warning(const QString & wrnmsg);
+  void AskForPassword(const QString & nick);
+  void NickTaken(const QString & nick);
+  void AuthFailed();
+  void EnteredGame();
+  void LeftRoom(const QString & reason);
+  void nickAdded(const QString& nick, bool notifyNick);
+  void nickRemoved(const QString& nick);
+  void nickAddedLobby(const QString& nick, bool notifyNick);
+  void nickRemovedLobby(const QString& nick);
+  void FromNet(const QByteArray & buf);
+  void adminAccess(bool);
+  void roomMaster(bool);
+
+  void netSchemeConfig(QStringList &);
+  void paramChanged(const QString & param, const QStringList & value);
+  void configAsked();
+
+  void TeamAccepted(const QString&);
+  void AddNetTeam(const HWTeam&);
+  void RemoveNetTeam(const HWTeam&);
+  void hhnumChanged(const HWTeam&);
+  void teamColorChanged(const HWTeam&);
+  void chatStringLobby(const QString&);
+  void chatStringLobby(const QString&, const QString&);
+  void chatStringFromNet(const QString&);
+  void chatStringFromMe(const QString&);
+  void chatStringFromMeLobby(const QString&);
+
+  void roomsList(const QStringList&);
+  void serverMessage(const QString &);
+  void serverMessageNew(const QString &);
+  void serverMessageOld(const QString &);
+  void latestProtocolVar(int);
+
+  void setReadyStatus(const QString & nick, bool isReady);
+  void setMyReadyStatus(bool isReady);
+
+ public slots:
+  void ToggleReady();
+  void chatLineToNet(const QString& str);
+  void chatLineToLobby(const QString& str);
+  void SendTeamMessage(const QString& str);
+  void SendNet(const QByteArray & buf);
+  void AddTeam(const HWTeam & team);
+  void RemoveTeam(const HWTeam& team);
+  void onHedgehogsNumChanged(const HWTeam& team);
+  void onTeamColorChanged(const HWTeam& team);
+  void onParamChanged(const QString & param, const QStringList & value);
+
+  void setServerMessageNew(const QString &);
+  void setServerMessageOld(const QString &);
+  void setLatestProtocolVar(int proto);
+  void askServerVars();
+
+  void JoinRoom(const QString & room);
+  void CreateRoom(const QString & room);
+  void updateRoomName(const QString &);
+  void askRoomsList();
+  void gameFinished(bool correcly);
+  void banPlayer(const QString &);
+  void kickPlayer(const QString &);
+  void infoPlayer(const QString &);
+  void followPlayer(const QString &);
+  void startGame();
+  void toggleRestrictJoins();
+  void toggleRestrictTeamAdds();
+  void partRoom();
+  void clearAccountsCache();
+
+ private slots:
+  void ClientRead();
+  void OnConnect();
+  void OnDisconnect();
+  void displayError(QAbstractSocket::SocketError socketError); 
+};
+
+#endif // _NEW_NETCLIENT_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/net/proto.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,59 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include "proto.h"
+
+HWProto::HWProto()
+{
+
+}
+
+QByteArray & HWProto::addByteArrayToBuffer(QByteArray & buf, const QByteArray & msg)
+{
+    QByteArray bmsg = msg;
+    bmsg = bmsg.left(250);
+    quint8 sz = bmsg.size();
+    buf.append(QByteArray((char *)&sz, 1));
+    buf.append(bmsg);
+    return buf;
+}
+
+QByteArray & HWProto::addStringToBuffer(QByteArray & buf, const QString & string)
+{
+    return addByteArrayToBuffer(buf, string.toUtf8());
+}
+
+QByteArray & HWProto::addStringListToBuffer(QByteArray & buf, const QStringList & strList)
+{
+    for (int i = 0; i < strList.size(); i++)
+        addStringToBuffer(buf, strList[i]);
+    return buf;
+}
+
+QString HWProto::formatChatMsgForFrontend(const QString & msg)
+{
+    return formatChatMsg("|nick|", msg);
+}
+
+QString HWProto::formatChatMsg(const QString & nick, const QString & msg)
+{
+    if(msg.left(4) == "/me ")
+        return QString("\x02* %1 %2").arg(nick).arg(msg.mid(4));
+    else
+        return QString("\x01%1: %2").arg(nick).arg(msg);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/net/proto.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,40 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef _PROTO_H
+#define _PROTO_H
+
+#include <QByteArray>
+#include <QString>
+#include <QStringList>
+
+
+class HWProto : public QObject
+{
+    Q_OBJECT
+
+public:
+    HWProto();
+    static QByteArray & addStringToBuffer(QByteArray & buf, const QString & string);
+    static QByteArray & addByteArrayToBuffer(QByteArray & buf, const QByteArray & msg);
+    static QByteArray & addStringListToBuffer(QByteArray & buf, const QStringList & strList);
+    static QString formatChatMsg(const QString & nick, const QString & msg);
+    static QString formatChatMsgForFrontend(const QString & msg);
+};
+
+#endif // _PROTO_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/net/tcpBase.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,166 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2007 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include "tcpBase.h"
+
+#include <QMessageBox>
+#include <QList>
+
+#include <QImage>
+
+#include "hwconsts.h"
+
+QList<TCPBase*> srvsList;
+QPointer<QTcpServer> TCPBase::IPCServer(0);
+
+TCPBase::~TCPBase()
+{
+}
+
+TCPBase::TCPBase(bool demoMode) :
+  m_isDemoMode(demoMode),
+  IPCSocket(0)
+{
+  if(!IPCServer) {
+    IPCServer = new QTcpServer(0);
+    IPCServer->setMaxPendingConnections(1);
+    if (!IPCServer->listen(QHostAddress::LocalHost)) {
+      QMessageBox::critical(0, tr("Error"),
+                tr("Unable to start the server: %1.")
+                .arg(IPCServer->errorString()));
+      exit(0); // FIXME - should be graceful exit here
+    }
+  }
+  ipc_port=IPCServer->serverPort();
+}
+
+void TCPBase::NewConnection()
+{
+  if(IPCSocket) {
+    // connection should be already finished
+    return;
+  }
+  disconnect(IPCServer, SIGNAL(newConnection()), this, SLOT(NewConnection()));
+  IPCSocket = IPCServer->nextPendingConnection();
+  if(!IPCSocket) return;
+  connect(IPCSocket, SIGNAL(disconnected()), this, SLOT(ClientDisconnect()));
+  connect(IPCSocket, SIGNAL(readyRead()), this, SLOT(ClientRead()));
+  SendToClientFirst();
+}
+
+void TCPBase::RealStart()
+{
+  connect(IPCServer, SIGNAL(newConnection()), this, SLOT(NewConnection()));
+  IPCSocket = 0;
+
+  QProcess * process;
+  process = new QProcess;
+  connect(process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(StartProcessError(QProcess::ProcessError)));
+  QStringList arguments=getArguments();
+
+  // redirect everything written on stdout/stderr
+  if(isDevBuild)
+    process->setProcessChannelMode(QProcess::ForwardedChannels);
+  process->start(bindir->absolutePath() + "/hwengine", arguments);
+}
+
+void TCPBase::ClientDisconnect()
+{
+  disconnect(IPCSocket, SIGNAL(readyRead()), this, SLOT(ClientRead()));
+  onClientDisconnect();
+
+  if(srvsList.size()==1) srvsList.pop_front();
+  emit isReadyNow();
+  IPCSocket->deleteLater();
+  deleteLater();
+}
+
+void TCPBase::ClientRead()
+{
+  QByteArray readed=IPCSocket->readAll();
+  if(readed.isEmpty()) return;
+  readbuffer.append(readed);
+  onClientRead();
+}
+
+void TCPBase::StartProcessError(QProcess::ProcessError error)
+{
+  QMessageBox::critical(0, tr("Error"),
+            tr("Unable to run engine: %1 (")
+            .arg(error) + bindir->absolutePath() + "/hwengine)");
+}
+
+void TCPBase::tcpServerReady()
+{
+  disconnect(srvsList.takeFirst(), SIGNAL(isReadyNow()), this, SLOT(tcpServerReady()));
+
+  RealStart();
+}
+
+void TCPBase::Start()
+{
+  if(srvsList.isEmpty()) {
+    srvsList.push_back(this);
+  } else {
+    connect(srvsList.back(), SIGNAL(isReadyNow()), this, SLOT(tcpServerReady()));
+    srvsList.push_back(this);
+    return;
+  }
+
+  RealStart();
+}
+
+void TCPBase::onClientRead()
+{
+}
+
+void TCPBase::onClientDisconnect()
+{
+}
+
+void TCPBase::SendToClientFirst()
+{
+}
+
+void TCPBase::SendIPC(const QByteArray & buf)
+{
+    if (buf.size() > MAXMSGCHARS) return;
+    quint8 len = buf.size();
+    RawSendIPC(QByteArray::fromRawData((char *)&len, 1) + buf);
+}
+
+void TCPBase::RawSendIPC(const QByteArray & buf)
+{
+    if (!IPCSocket)
+    {
+        toSendBuf += buf;
+    } else
+    {
+        if (toSendBuf.size() > 0)
+        {
+            IPCSocket->write(toSendBuf);
+            if(m_isDemoMode) demo.append(toSendBuf);
+            toSendBuf.clear();
+        }
+        if(!buf.isEmpty()) {
+          IPCSocket->write(buf);
+          if(m_isDemoMode) demo.append(buf);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/net/tcpBase.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,81 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2007 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef _TCPBASE_INCLUDED
+#define _TCPBASE_INCLUDED
+
+#include <QObject>
+#include <QTcpServer>
+#include <QTcpSocket>
+#include <QByteArray>
+#include <QString>
+#include <QDir>
+#include <QProcess>
+#include <QPointer>
+
+#include <QImage>
+
+#define MAXMSGCHARS 255
+
+class TCPBase : public QObject
+{
+  Q_OBJECT
+
+ public:
+  TCPBase(bool demoMode);
+  virtual ~TCPBase();
+
+ signals:
+  void isReadyNow();
+
+ protected:
+  quint16 ipc_port;
+
+  void Start();
+
+  QByteArray readbuffer;
+
+  QByteArray toSendBuf;
+  QByteArray demo;
+
+  void SendIPC(const QByteArray & buf);
+  void RawSendIPC(const QByteArray & buf);
+
+  virtual QStringList getArguments()=0;
+  virtual void onClientRead();
+  virtual void onClientDisconnect();
+  virtual void SendToClientFirst();
+
+ private:
+  static QPointer<QTcpServer> IPCServer;
+
+  bool m_isDemoMode;
+  void RealStart();
+  QPointer<QTcpSocket> IPCSocket;
+
+ private slots:
+  void NewConnection();
+  void ClientDisconnect();
+  void ClientRead();
+  void StartProcessError(QProcess::ProcessError error);
+
+  void tcpServerReady();
+};
+
+#endif // _TCPBASE_INCLUDED
--- a/QTfrontend/netregister.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include "netregister.h"
-
-HWNetRegisterServer::HWNetRegisterServer(QObject *parent, const QString & descr, quint16 port) :
-  QObject(parent)
-{
-    Q_UNUSED(descr);
-    Q_UNUSED(port);
-}
-
-void HWNetRegisterServer::unregister()
-{
-
-}
--- a/QTfrontend/netregister.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef _NET_REGISTER_INCLUDED
-#define _NET_REGISTER_INCLUDED
-
-#include <QObject>
-
-class HWNetRegisterServer : public QObject
-{
-    Q_OBJECT
-
-public:
-    HWNetRegisterServer(QObject *parent, const QString & descr, quint16 port);
-
-public slots:
-    virtual void unregister();
-};
-
-#endif // _NET_REGISTER_INCLUDED
--- a/QTfrontend/netserver.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2008 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QMessageBox>
-
-#include "hwconsts.h"
-#include "netserver.h"
-
-HWNetServer::~HWNetServer()
-{
-    StopServer();
-}
-
-bool HWNetServer::StartServer(quint16 port)
-{
-    ds_port = port;
-
-    QStringList params;
-    params << QString("--port=%1").arg(port);
-    params << "--dedicated=False";
-
-    process.start(bindir->absolutePath() + "/hedgewars-server", params);
-
-    return process.waitForStarted(5000);
-}
-
-void HWNetServer::StopServer()
-{
-    process.close();
-}
-
-
-quint16 HWNetServer::getRunningPort() const
-{
-  return ds_port;
-}
--- a/QTfrontend/netserver.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2008 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef _NETSERVER_INCLUDED
-#define _NETSERVER_INCLUDED
-
-#include <QObject>
-#include <QProcess>
-
-class HWNetServer : public QObject
-{
-    Q_OBJECT
-
-public:
-    ~HWNetServer();
-    bool StartServer(quint16 port);
-    void StopServer();
-    QString getRunningHostName() const;
-    quint16 getRunningPort() const;
-
-private:
-    quint16 ds_port;
-    QProcess process;
-};
-
-#endif // _NETSERVER_INCLUDED
--- a/QTfrontend/netserverslist.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QUdpSocket>
-#include <QListWidget>
-
-#include "netserverslist.h"
-
-HWNetServersModel::HWNetServersModel(QObject* parent) :
-  QAbstractTableModel(parent)
-{
-
-}
-
-void HWNetServersModel::updateList()
-{
-
-}
-
-QVariant HWNetServersModel::headerData(int section,
-            Qt::Orientation orientation, int role) const
-{
-    if (role != Qt::DisplayRole)
-        return QVariant();
-
-    if (orientation == Qt::Horizontal)
-    {
-        switch (section)
-        {
-            case 0: return tr("Title");
-            case 1: return tr("IP");
-            case 2: return tr("Port");
-            default: return QVariant();
-        }
-    } else
-        return QString("%1").arg(section + 1);
-}
-
-int HWNetServersModel::rowCount(const QModelIndex &parent) const
-{
-    if (parent.isValid())
-        return 0;
-    else
-        return games.size();
-}
-
-int HWNetServersModel::columnCount(const QModelIndex & parent) const
-{
-    if (parent.isValid())
-        return 0;
-    else
-        return 3;
-}
--- a/QTfrontend/netserverslist.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef _NET_SERVERSLIST_INCLUDED
-#define _NET_SERVERSLIST_INCLUDED
-
-#include <QAbstractTableModel>
-#include <QStringList>
-
-class HWNetServersModel : public QAbstractTableModel
-{
-    Q_OBJECT
-
-public:
-    HWNetServersModel(QObject *parent = 0);
-
-    QVariant headerData(int section, Qt::Orientation orientation, int role) const;
-    int rowCount(const QModelIndex & parent) const;
-    int columnCount(const QModelIndex & parent) const;
-
-public slots:
-    virtual void updateList();
-
-protected:
-    QList<QStringList> games;
-};
-
-#endif // _NET_SERVERSLIST_INCLUDED
--- a/QTfrontend/netudpserver.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2007-2008 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QUdpSocket>
-
-#include "netudpserver.h"
-
-HWNetUdpServer::HWNetUdpServer(QObject *parent, const QString & descr, quint16 port) :
-  HWNetRegisterServer(parent, descr, port),
-  m_descr(descr)
-{
-  pUdpSocket = new QUdpSocket(this);
-  pUdpSocket->bind(46631);
-  connect(pUdpSocket, SIGNAL(readyRead()), this, SLOT(onClientRead()));
-}
-
-void HWNetUdpServer::onClientRead()
-{
-  while (pUdpSocket->hasPendingDatagrams()) {
-    QByteArray datagram;
-    datagram.resize(pUdpSocket->pendingDatagramSize());
-    QHostAddress clientAddr;
-    quint16 clientPort;
-    pUdpSocket->readDatagram(datagram.data(), datagram.size(), &clientAddr, &clientPort);
-    if(datagram.startsWith("hedgewars client")) {
-      // send answer to client
-      pUdpSocket->writeDatagram(QString("hedgewars server\n%1").arg(m_descr).toUtf8(), clientAddr, clientPort);
-    }
-  }
-}
-
-void HWNetUdpServer::unregister()
-{
-  deleteLater();
-}
--- a/QTfrontend/netudpserver.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2007-2008 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef _NET_UDPSERVER_INCLUDED
-#define _NET_UDPSERVER_INCLUDED
-
-#include <QObject>
-#include "netregister.h"
-
-class QUdpSocket;
-
-class HWNetUdpServer : public HWNetRegisterServer
-{
-  Q_OBJECT
-
- public:
-  HWNetUdpServer(QObject *parent, const QString & descr, quint16 port);
-
- public slots:
-  void unregister();
-
- private slots:
-  void onClientRead();
-
- private:
-  QUdpSocket* pUdpSocket;
-  QString m_descr;
-};
-
-#endif // _NET_UDPSERVER_INCLUDED
--- a/QTfrontend/netudpwidget.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,72 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2007 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QUdpSocket>
-
-#include "netudpwidget.h"
-
-HWNetUdpModel::HWNetUdpModel(QObject* parent) :
-  HWNetServersModel(parent)
-{
-    pUdpSocket = new QUdpSocket(this);
-
-    pUdpSocket->bind();
-    connect(pUdpSocket, SIGNAL(readyRead()), this, SLOT(onClientRead()));
-}
-
-void HWNetUdpModel::updateList()
-{
-    games.clear();
-
-    reset();
-
-    pUdpSocket->writeDatagram("hedgewars client", QHostAddress::Broadcast, 46631);
-}
-
-void HWNetUdpModel::onClientRead()
-{
-    while (pUdpSocket->hasPendingDatagrams()) {
-        QByteArray datagram;
-        datagram.resize(pUdpSocket->pendingDatagramSize());
-        QHostAddress clientAddr;
-        quint16 clientPort;
-
-        pUdpSocket->readDatagram(datagram.data(), datagram.size(), &clientAddr, &clientPort);
-
-        QString packet = QString::fromUtf8(datagram.data());
-        if(packet.startsWith("hedgewars server")) {
-            QStringList sl;
-            sl << packet.remove(0, 17) << clientAddr.toString() << "46631";
-            games.append(sl);
-        }
-    }
-
-    reset();
-}
-
-QVariant HWNetUdpModel::data(const QModelIndex &index,
-                             int role) const
-{
-    if (!index.isValid() || index.row() < 0
-        || index.row() >= games.size()
-        || role != Qt::DisplayRole)
-    return QVariant();
-
-    return games[index.row()][index.column()];
-}
--- a/QTfrontend/netudpwidget.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2007 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef _NET_UDPWIDGET_INCLUDED
-#define _NET_UDPWIDGET_INCLUDED
-
-#include "netserverslist.h"
-
-class QUdpSocket;
-
-class HWNetUdpModel : public HWNetServersModel
-{
-  Q_OBJECT
-
-public:
-    HWNetUdpModel(QObject *parent = 0);
-
-    QVariant data(const QModelIndex &index, int role) const;
-
-public slots:
-    void updateList();
-
-private slots:
-    void onClientRead();
-
-private:
-    QUdpSocket* pUdpSocket;
-};
-
-#endif // _NET_UDPWIDGET_INCLUDED
--- a/QTfrontend/newnetclient.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,791 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2008 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QDebug>
-#include <QInputDialog>
-#include <QCryptographicHash>
-
-#include "hwconsts.h"
-#include "newnetclient.h"
-#include "proto.h"
-#include "game.h"
-#include "misc.h"
-/* only to get the ignoreList from the chat widget */
-#include "hwform.h"
-#include "pageroomslist.h"
-#include "chatwidget.h"
-
-char delimeter='\n';
-
-HWNewNet::HWNewNet() :
-  isChief(false),
-  m_game_connected(false),
-  loginStep(0),
-  netClientState(Disconnected)
-{
-// socket stuff
-    connect(&NetSocket, SIGNAL(readyRead()), this, SLOT(ClientRead()));
-    connect(&NetSocket, SIGNAL(connected()), this, SLOT(OnConnect()));
-    connect(&NetSocket, SIGNAL(disconnected()), this, SLOT(OnDisconnect()));
-    connect(&NetSocket, SIGNAL(error(QAbstractSocket::SocketError)), this,
-            SLOT(displayError(QAbstractSocket::SocketError)));
-}
-
-HWNewNet::~HWNewNet()
-{
-    if (m_game_connected)
-    {
-        RawSendNet(QString("QUIT%1%2").arg(delimeter).arg("User quit"));
-        emit disconnected(tr("User quit"));
-    }
-    NetSocket.flush();
-}
-
-void HWNewNet::Connect(const QString & hostName, quint16 port, const QString & nick)
-{
-    netClientState = Connecting;
-    mynick = nick;
-    myhost = hostName + QString(":%1").arg(port);
-    NetSocket.connectToHost(hostName, port);
-}
-
-void HWNewNet::Disconnect()
-{
-    if (m_game_connected)
-        RawSendNet(QString("QUIT%1%2").arg(delimeter).arg("User quit"));
-    m_game_connected = false;
-
-    NetSocket.disconnectFromHost();
-}
-
-void HWNewNet::CreateRoom(const QString & room)
-{
-    if(netClientState != InLobby)
-    {
-        qWarning("Illegal try to create room!");
-        return;
-    }
-
-    myroom = room;
-
-    RawSendNet(QString("CREATE_ROOM%1%2").arg(delimeter).arg(room));
-    isChief = true;
-}
-
-void HWNewNet::JoinRoom(const QString & room)
-{
-    if(netClientState != InLobby)
-    {
-        qWarning("Illegal try to join room!");
-        return;
-    }
-
-    myroom = room;
-
-    RawSendNet(QString("JOIN_ROOM%1%2").arg(delimeter).arg(room));
-    isChief = false;
-}
-
-void HWNewNet::AddTeam(const HWTeam & team)
-{
-    QString cmd = QString("ADD_TEAM") + delimeter +
-         team.name() + delimeter +
-         team.color().name() + delimeter +
-         team.grave() + delimeter +
-         team.fort() + delimeter +
-         team.voicepack() + delimeter +
-         team.flag() + delimeter +
-         QString::number(team.difficulty());
-
-    for(int i = 0; i < HEDGEHOGS_PER_TEAM; ++i)
-    {
-        cmd.append(delimeter);
-        cmd.append(team.hedgehog(i).Name);
-        cmd.append(delimeter);
-        cmd.append(team.hedgehog(i).Hat);
-    }
-    RawSendNet(cmd);
-}
-
-void HWNewNet::RemoveTeam(const HWTeam & team)
-{
-    RawSendNet(QString("REMOVE_TEAM") + delimeter + team.name());
-}
-
-void HWNewNet::NewNick(const QString & nick)
-{
-    RawSendNet(QString("NICK%1%2").arg(delimeter).arg(nick));
-}
-
-void HWNewNet::ToggleReady()
-{
-  RawSendNet(QString("TOGGLE_READY"));
-}
-
-void HWNewNet::SendNet(const QByteArray & buf)
-{
-  QString msg = QString(buf.toBase64());
-
-  RawSendNet(QString("EM%1%2").arg(delimeter).arg(msg));
-}
-
-void HWNewNet::RawSendNet(const QString & str)
-{
-  RawSendNet(str.toUtf8());
-}
-
-void HWNewNet::RawSendNet(const QByteArray & buf)
-{
-    qDebug() << "Client: " << QString(buf).split("\n");
-    NetSocket.write(buf);
-    NetSocket.write("\n\n", 2);
-}
-
-void HWNewNet::ClientRead()
-{
-    while (NetSocket.canReadLine()) {
-        QString s = QString::fromUtf8(NetSocket.readLine());
-        if (s.endsWith('\n')) s.chop(1);
-
-        if (s.size() == 0) {
-            ParseCmd(cmdbuf);
-            cmdbuf.clear();
-        } else
-            cmdbuf << s;
-    }
-}
-
-void HWNewNet::OnConnect()
-{
-    netClientState = Connected;
-}
-
-void HWNewNet::OnDisconnect()
-{
-    netClientState = Disconnected;
-    if(m_game_connected) emit disconnected("");
-    m_game_connected = false;
-}
-
-void HWNewNet::displayError(QAbstractSocket::SocketError socketError)
-{
-    m_game_connected = false;
-
-    switch (socketError) {
-        case QAbstractSocket::RemoteHostClosedError:
-            break;
-        case QAbstractSocket::HostNotFoundError:
-            emit disconnected(tr("The host was not found. Please check the host name and port settings."));
-            break;
-        case QAbstractSocket::ConnectionRefusedError:
-            emit disconnected(tr("Connection refused"));
-            break;
-        default:
-            emit disconnected(NetSocket.errorString());
-        }
-}
-
-void HWNewNet::SendPasswordHash(const QString & hash)
-{
-    RawSendNet(QString("PASSWORD%1%2").arg(delimeter).arg(hash));
-}
-
-void HWNewNet::ParseCmd(const QStringList & lst)
-{
-  qDebug() << "Server: " << lst;
-
-    if(!lst.size())
-    {
-        qWarning("Net client: Bad message");
-        return;
-    }
-
-    if (lst[0] == "NICK")
-    {
-        mynick = lst[1];
-        return ;
-    }
-
-    if (lst[0] == "PROTO")
-        return ;
-
-    if (lst[0] == "ERROR") {
-        if (lst.size() == 2)
-            emit Error(lst[1]);
-        else
-            emit Error("Unknown error");
-        return;
-    }
-
-    if (lst[0] == "WARNING") {
-        if (lst.size() == 2)
-            emit Warning(lst[1]);
-        else
-            emit Warning("Unknown warning");
-        return;
-    }
-
-    if (lst[0] == "CONNECTED") {
-        if(lst.size() < 3 || lst[2].toInt() < cMinServerVersion)
-        {
-            // TODO: Warn user, disconnect
-            qWarning() << "Server too old";
-        }
-
-        RawSendNet(QString("NICK%1%2").arg(delimeter).arg(mynick));
-        RawSendNet(QString("PROTO%1%2").arg(delimeter).arg(*cProtoVer));
-        netClientState = Connected;
-        m_game_connected = true;
-        emit adminAccess(false);
-        return;
-    }
-
-    if (lst[0] == "PING") {
-        if (lst.size() > 1)
-            RawSendNet(QString("PONG%1%2").arg(delimeter).arg(lst[1]));
-        else
-            RawSendNet(QString("PONG"));
-        return;
-    }
-
-    if (lst[0] == "ROOMS") {
-        QStringList tmp = lst;
-        tmp.removeFirst();
-        emit roomsList(tmp);
-        return;
-    }
-
-    if (lst[0] == "SERVER_MESSAGE") {
-        if(lst.size() < 2)
-        {
-            qWarning("Net: Empty SERVERMESSAGE message");
-            return;
-        }
-        emit serverMessage(lst[1]);
-        return;
-    }
-
-    if (lst[0] == "CHAT") {
-        if(lst.size() < 3)
-        {
-            qWarning("Net: Empty CHAT message");
-            return;
-        }
-        if (netClientState == InLobby)
-            emit chatStringLobby(lst[1], HWProto::formatChatMsgForFrontend(lst[2]));
-        else
-            emit chatStringFromNet(HWProto::formatChatMsg(lst[1], lst[2]));
-        return;
-    }
-
-    if (lst[0] == "INFO") {
-        if(lst.size() < 5)
-        {
-            qWarning("Net: Malformed INFO message");
-            return;
-        }
-        QStringList tmp = lst;
-        tmp.removeFirst();
-        if (netClientState == InLobby)
-            emit chatStringLobby(tmp.join("\n").prepend('\x01'));
-        else
-            emit chatStringFromNet(tmp.join("\n").prepend('\x01'));
-        return;
-    }
-
-    if (lst[0] == "SERVER_VARS") {
-        QStringList tmp = lst;
-        tmp.removeFirst();
-        while (tmp.size() >= 2)
-        {
-            if(tmp[0] == "MOTD_NEW") emit serverMessageNew(tmp[1]);
-            else if(tmp[0] == "MOTD_OLD") emit serverMessageOld(tmp[1]);
-            else if(tmp[0] == "LATEST_PROTO") emit latestProtocolVar(tmp[1].toInt());
-
-            tmp.removeFirst();
-            tmp.removeFirst();
-        }
-        return;
-    }
-
-    if (lst[0] == "CLIENT_FLAGS")
-    {
-        if(lst.size() < 3 || lst[1].size() < 2)
-        {
-            qWarning("Net: Malformed CLIENT_FLAGS message");
-            return;
-        }
-
-        QString flags = lst[1];
-        bool setFlag = flags[0] == '+';
-
-        while(flags.size() > 1)
-        {
-            flags.remove(0, 1);
-            char c = flags[0].toAscii();
-
-            switch(c)
-            {
-            case 'r':
-                {
-                    for(int i = 2; i < lst.size(); ++i)
-                    {
-                        if (lst[i] == mynick)
-                            emit setMyReadyStatus(setFlag);
-                        emit setReadyStatus(lst[i], setFlag);
-                    }
-                }
-            }
-        }
-
-        return;
-    }
-
-    if (lst[0] == "ADD_TEAM") {
-        if(lst.size() != 24)
-        {
-            qWarning("Net: Bad ADDTEAM message");
-            return;
-        }
-        QStringList tmp = lst;
-        tmp.removeFirst();
-        emit AddNetTeam(tmp);
-        return;
-    }
-
-    if (lst[0] == "REMOVE_TEAM") {
-        if(lst.size() != 2)
-        {
-            qWarning("Net: Bad REMOVETEAM message");
-            return;
-        }
-        emit RemoveNetTeam(HWTeam(lst[1]));
-        return;
-    }
-
-    if(lst[0] == "ROOMABANDONED") {
-        netClientState = InLobby;
-        emit LeftRoom(tr("Room destroyed"));
-        return;
-    }
-
-    if(lst[0] == "KICKED") {
-        netClientState = InLobby;
-        emit LeftRoom(tr("You got kicked"));
-        return;
-    }
-
-    if(lst[0] == "JOINED") {
-        if(lst.size() < 2)
-        {
-            qWarning("Net: Bad JOINED message");
-            return;
-        }
-
-        for(int i = 1; i < lst.size(); ++i)
-        {
-            if (lst[i] == mynick)
-            {
-                netClientState = InRoom;
-                emit EnteredGame();
-                emit roomMaster(isChief);
-                if (isChief)
-                    emit configAsked();
-            }
-
-            emit nickAdded(lst[i], isChief && (lst[i] != mynick));
-            emit chatStringFromNet(tr("%1 *** %2 has joined the room").arg('\x03').arg(lst[i]));
-        }
-        return;
-    }
-
-    if(lst[0] == "LOBBY:JOINED") {
-        if(lst.size() < 2)
-        {
-            qWarning("Net: Bad JOINED message");
-            return;
-        }
-
-        for(int i = 1; i < lst.size(); ++i)
-        {
-            if (lst[i] == mynick)
-            {
-                netClientState = InLobby;
-                RawSendNet(QString("LIST"));
-                emit connected();
-            }
-
-            emit nickAddedLobby(lst[i], false);
-            emit chatStringLobby(lst[i], tr("%1 *** %2 has joined").arg('\x03').arg("|nick|"));
-        }
-        return;
-    }
-
-    if(lst[0] == "LEFT") {
-        if(lst.size() < 2)
-        {
-            qWarning("Net: Bad LEFT message");
-            return;
-        }
-        emit nickRemoved(lst[1]);
-        if (lst.size() < 3)
-            emit chatStringFromNet(tr("%1 *** %2 has left").arg('\x03').arg(lst[1]));
-        else
-            emit chatStringFromNet(tr("%1 *** %2 has left (%3)").arg('\x03').arg(lst[1], lst[2]));
-        return;
-    }
-
-    if(lst[0] == "ROOM") {
-        if(lst.size() < 2)
-        {
-            qWarning("Net: Bad ROOM message");
-            return;
-        }
-        RawSendNet(QString("LIST"));
-        return;
-    }
-
-    if(lst[0] == "LOBBY:LEFT") {
-        if(lst.size() < 2)
-        {
-            qWarning("Net: Bad LOBBY:LEFT message");
-            return;
-        }
-        emit nickRemovedLobby(lst[1]);
-        if (lst.size() < 3)
-            emit chatStringLobby(tr("%1 *** %2 has left").arg('\x03').arg(lst[1]));
-        else
-            emit chatStringLobby(tr("%1 *** %2 has left (%3)").arg('\x03').arg(lst[1], lst[2]));
-        return;
-    }
-
-    if (lst[0] == "RUN_GAME") {
-        netClientState = InGame;
-        emit AskForRunGame();
-        return;
-    }
-
-    if (lst[0] == "ASKPASSWORD") {
-        emit AskForPassword(mynick);
-        return;
-    }
-
-    if (lst[0] == "NOTICE") {
-        if(lst.size() < 2)
-        {
-            qWarning("Net: Bad NOTICE message");
-            return;
-        }
-
-        bool ok;
-        int n = lst[1].toInt(&ok);
-        if(!ok)
-        {
-            qWarning("Net: Bad NOTICE message");
-            return;
-        }
-
-        handleNotice(n);
-
-        return;
-    }
-
-    if (lst[0] == "TEAM_ACCEPTED") {
-        if (lst.size() != 2)
-        {
-            qWarning("Net: Bad TEAM_ACCEPTED message");
-            return;
-        }
-        emit TeamAccepted(lst[1]);
-        return;
-    }
-
-
-    if (lst[0] == "CFG") {
-        if(lst.size() < 3)
-        {
-            qWarning("Net: Bad CFG message");
-            return;
-        }
-        QStringList tmp = lst;
-        tmp.removeFirst();
-        tmp.removeFirst();
-        if (lst[1] == "SCHEME")
-            emit netSchemeConfig(tmp);
-        else
-            emit paramChanged(lst[1], tmp);
-        return;
-    }
-
-    if (lst[0] == "HH_NUM") {
-        if (lst.size() != 3)
-        {
-            qWarning("Net: Bad TEAM_ACCEPTED message");
-            return;
-        }
-        HWTeam tmptm(lst[1]);
-        tmptm.setNumHedgehogs(lst[2].toUInt());
-        emit hhnumChanged(tmptm);
-        return;
-    }
-
-    if (lst[0] == "TEAM_COLOR") {
-        if (lst.size() != 3)
-        {
-            qWarning("Net: Bad TEAM_COLOR message");
-            return;
-        }
-        HWTeam tmptm(lst[1]);
-        tmptm.setColor(QColor(lst[2]));
-        emit teamColorChanged(tmptm);
-        return;
-    }
-
-    if (lst[0] == "EM") {
-        if(lst.size() < 2)
-        {
-            qWarning("Net: Bad EM message");
-            return;
-        }
-        for(int i = 1; i < lst.size(); ++i)
-        {
-            QByteArray em = QByteArray::fromBase64(lst[i].toAscii());
-            emit FromNet(em);
-        }
-        return;
-    }
-
-    if (lst[0] == "BYE") {
-        if (lst.size() < 2)
-        {
-            qWarning("Net: Bad BYE message");
-            return;
-        }
-        if (lst[1] == "Authentication failed")
-        {
-            emit AuthFailed();
-        }
-        m_game_connected = false;
-        Disconnect();
-        emit disconnected(lst[1]);
-        return;
-    }
-
-
-    if (lst[0] == "ADMIN_ACCESS") {
-        emit adminAccess(true);
-        return;
-    }
-
-    if (lst[0] == "ROOM_CONTROL_ACCESS") {
-        if (lst.size() < 2)
-        {
-            qWarning("Net: Bad ROOM_CONTROL_ACCESS message");
-            return;
-        }
-        isChief = (lst[1] != "0");
-        emit roomMaster(isChief);
-        return;
-    }
-
-    qWarning() << "Net: Unknown message:" << lst;
-}
-
-void HWNewNet::onHedgehogsNumChanged(const HWTeam& team)
-{
-    if (isChief)
-    RawSendNet(QString("HH_NUM%1%2%1%3")
-            .arg(delimeter)
-            .arg(team.name())
-            .arg(team.numHedgehogs()));
-}
-
-void HWNewNet::onTeamColorChanged(const HWTeam& team)
-{
-    if (isChief)
-    RawSendNet(QString("TEAM_COLOR%1%2%1%3")
-            .arg(delimeter)
-            .arg(team.name())
-            .arg(team.color().name()));
-}
-
-void HWNewNet::onParamChanged(const QString & param, const QStringList & value)
-{
-    if (isChief)
-        RawSendNet(
-                QString("CFG%1%2%1%3")
-                    .arg(delimeter)
-                    .arg(param)
-                    .arg(value.join(QString(delimeter)))
-                );
-}
-
-void HWNewNet::chatLineToNet(const QString& str)
-{
-    if(str != "") {
-        RawSendNet(QString("CHAT") + delimeter + str);
-        emit(chatStringFromMe(HWProto::formatChatMsg(mynick, str)));
-    }
-}
-
-void HWNewNet::chatLineToLobby(const QString& str)
-{
-    if(str != "") {
-        RawSendNet(QString("CHAT") + delimeter + str);
-        emit(chatStringFromMeLobby(HWProto::formatChatMsg(mynick, str)));
-    }
-}
-
-void HWNewNet::SendTeamMessage(const QString& str)
-{
-    RawSendNet(QString("TEAMCHAT") + delimeter + str);
-}
-
-void HWNewNet::askRoomsList()
-{
-    if(netClientState != InLobby)
-    {
-        qWarning("Illegal try to get rooms list!");
-        return;
-    }
-    RawSendNet(QString("LIST"));
-}
-
-HWNewNet::ClientState HWNewNet::clientState()
-{
-    return netClientState;
-}
-
-QString HWNewNet::getNick()
-{
-    return mynick;
-}
-
-QString HWNewNet::getRoom()
-{
-    return myroom;
-}
-
-QString HWNewNet::getHost()
-{
-    return myhost;
-}
-
-bool HWNewNet::isRoomChief()
-{
-    return isChief;
-}
-
-void HWNewNet::gameFinished(bool correctly)
-{
-    if (netClientState == InGame) netClientState = InRoom;
-    RawSendNet(QString("ROUNDFINISHED%1%2").arg(delimeter).arg(correctly ? "1" : "0"));
-}
-
-void HWNewNet::banPlayer(const QString & nick)
-{
-    RawSendNet(QString("BAN%1%2").arg(delimeter).arg(nick));
-}
-
-void HWNewNet::kickPlayer(const QString & nick)
-{
-    RawSendNet(QString("KICK%1%2").arg(delimeter).arg(nick));
-}
-
-void HWNewNet::infoPlayer(const QString & nick)
-{
-    RawSendNet(QString("INFO%1%2").arg(delimeter).arg(nick));
-}
-
-void HWNewNet::followPlayer(const QString & nick)
-{
-    if (!isInRoom()) {
-        RawSendNet(QString("FOLLOW%1%2").arg(delimeter).arg(nick));
-        isChief = false;
-    }
-}
-
-void HWNewNet::startGame()
-{
-    RawSendNet(QString("START_GAME"));
-}
-
-void HWNewNet::updateRoomName(const QString & name)
-{
-    RawSendNet(QString("ROOM_NAME%1%2").arg(delimeter).arg(name));
-}
-
-
-void HWNewNet::toggleRestrictJoins()
-{
-    RawSendNet(QString("TOGGLE_RESTRICT_JOINS"));
-}
-
-void HWNewNet::toggleRestrictTeamAdds()
-{
-    RawSendNet(QString("TOGGLE_RESTRICT_TEAMS"));
-}
-
-void HWNewNet::clearAccountsCache()
-{
-    RawSendNet(QString("CLEAR_ACCOUNTS_CACHE"));
-}
-
-void HWNewNet::partRoom()
-{
-    netClientState = InLobby;
-    RawSendNet(QString("PART"));
-}
-
-bool HWNewNet::isInRoom()
-{
-    return netClientState >= InRoom;
-}
-
-void HWNewNet::setServerMessageNew(const QString & msg)
-{
-    RawSendNet(QString("SET_SERVER_VAR%1MOTD_NEW%1%2").arg(delimeter).arg(msg));
-}
-
-void HWNewNet::setServerMessageOld(const QString & msg)
-{
-    RawSendNet(QString("SET_SERVER_VAR%1MOTD_OLD%1%2").arg(delimeter).arg(msg));
-}
-
-void HWNewNet::setLatestProtocolVar(int proto)
-{
-    RawSendNet(QString("SET_SERVER_VAR%1LATEST_PROTO%1%2").arg(delimeter).arg(proto));
-}
-
-void HWNewNet::askServerVars()
-{
-    RawSendNet(QString("GET_SERVER_VAR"));
-}
-
-void HWNewNet::handleNotice(int n)
-{
-    switch(n)
-    {
-        case 0:
-        {
-            emit NickTaken(mynick);
-            break;
-        }
-    }
-}
--- a/QTfrontend/newnetclient.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,177 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2008 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef _NEW_NETCLIENT_INCLUDED
-#define _NEW_NETCLIENT_INCLUDED
-
-#include <QObject>
-#include <QString>
-#include <QTcpSocket>
-#include <QMap>
-
-#include "team.h"
-#include "game.h" // for GameState
-
-class GameUIConfig;
-class GameCFGWidget;
-class TeamSelWidget;
-
-extern char delimeter;
-
-class HWNewNet : public QObject
-{
-  Q_OBJECT
-
- public:
-  enum ClientState { Disconnected, Connecting, Connected, InLobby, InRoom, InGame };
-
-  HWNewNet();
-  ~HWNewNet();
-  void Connect(const QString & hostName, quint16 port, const QString & nick);
-  void Disconnect();
-  void SendPasswordHash(const QString & hash);
-  void NewNick(const QString & nick);
-  bool isRoomChief();
-  bool isInRoom();
-  ClientState clientState();
-  QString getNick();
-  QString getRoom();
-  QString getHost();
-
- private:
-  bool isChief;
-  QString mynick;
-  QString myroom;
-  QString myhost;
-  QTcpSocket NetSocket;
-  QString seed;
-  bool m_game_connected;
-
-  template <typename T>
-  void SendCfgStrNet(T a) {
-    QByteArray strmsg;
-    strmsg.append(a);
-    quint8 sz = strmsg.size();
-    QByteArray enginemsg = QByteArray((char *)&sz, 1) + strmsg;
-    QString _msg = delimeter + QString(enginemsg.toBase64());
-    RawSendNet(_msg);
-  }
-
-  template <typename T>
-  void SendCfgStrLoc(T a) {
-    QByteArray strmsg;
-    strmsg.append(QString(a).toUtf8());
-    quint8 sz = strmsg.size();
-    QByteArray enginemsg = QByteArray((char *)&sz, 1) + strmsg;
-    emit FromNet(enginemsg);
-  }
-
-  QStringList cmdbuf;
-
-  void RawSendNet(const QString & buf);
-  void RawSendNet(const QByteArray & buf);
-  void ParseCmd(const QStringList & lst);
-  void handleNotice(int n);
-
-  int loginStep;
-  ClientState netClientState;
-
- signals:
-  void AskForRunGame();
-  void connected();
-  void disconnected(const QString & reason);
-  void Error(const QString & errmsg);
-  void Warning(const QString & wrnmsg);
-  void AskForPassword(const QString & nick);
-  void NickTaken(const QString & nick);
-  void AuthFailed();
-  void EnteredGame();
-  void LeftRoom(const QString & reason);
-  void nickAdded(const QString& nick, bool notifyNick);
-  void nickRemoved(const QString& nick);
-  void nickAddedLobby(const QString& nick, bool notifyNick);
-  void nickRemovedLobby(const QString& nick);
-  void FromNet(const QByteArray & buf);
-  void adminAccess(bool);
-  void roomMaster(bool);
-
-  void netSchemeConfig(QStringList &);
-  void paramChanged(const QString & param, const QStringList & value);
-  void configAsked();
-
-  void TeamAccepted(const QString&);
-  void AddNetTeam(const HWTeam&);
-  void RemoveNetTeam(const HWTeam&);
-  void hhnumChanged(const HWTeam&);
-  void teamColorChanged(const HWTeam&);
-  void chatStringLobby(const QString&);
-  void chatStringLobby(const QString&, const QString&);
-  void chatStringFromNet(const QString&);
-  void chatStringFromMe(const QString&);
-  void chatStringFromMeLobby(const QString&);
-
-  void roomsList(const QStringList&);
-  void serverMessage(const QString &);
-  void serverMessageNew(const QString &);
-  void serverMessageOld(const QString &);
-  void latestProtocolVar(int);
-
-  void setReadyStatus(const QString & nick, bool isReady);
-  void setMyReadyStatus(bool isReady);
-
- public slots:
-  void ToggleReady();
-  void chatLineToNet(const QString& str);
-  void chatLineToLobby(const QString& str);
-  void SendTeamMessage(const QString& str);
-  void SendNet(const QByteArray & buf);
-  void AddTeam(const HWTeam & team);
-  void RemoveTeam(const HWTeam& team);
-  void onHedgehogsNumChanged(const HWTeam& team);
-  void onTeamColorChanged(const HWTeam& team);
-  void onParamChanged(const QString & param, const QStringList & value);
-
-  void setServerMessageNew(const QString &);
-  void setServerMessageOld(const QString &);
-  void setLatestProtocolVar(int proto);
-  void askServerVars();
-
-  void JoinRoom(const QString & room);
-  void CreateRoom(const QString & room);
-  void updateRoomName(const QString &);
-  void askRoomsList();
-  void gameFinished(bool correcly);
-  void banPlayer(const QString &);
-  void kickPlayer(const QString &);
-  void infoPlayer(const QString &);
-  void followPlayer(const QString &);
-  void startGame();
-  void toggleRestrictJoins();
-  void toggleRestrictTeamAdds();
-  void partRoom();
-  void clearAccountsCache();
-
- private slots:
-  void ClientRead();
-  void OnConnect();
-  void OnDisconnect();
-  void displayError(QAbstractSocket::SocketError socketError); 
-};
-
-#endif // _NEW_NETCLIENT_INCLUDED
--- a/QTfrontend/pageadmin.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,112 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QGridLayout>
-#include <QLabel>
-#include <QLineEdit>
-#include <QSpinBox>
-#include <QPushButton>
-#include <QTextBrowser>
-
-#include "pageadmin.h"
-#include "chatwidget.h"
-
-QLayout * PageAdmin::bodyLayoutDefinition()
-{
-    QGridLayout * pageLayout = new QGridLayout();
-
-    // 0
-    pbAsk = addButton(tr("Fetch data"), pageLayout, 0, 0, 1, 3);
-    
-    // 1
-    QLabel * lblSMN = new QLabel(this);
-    lblSMN->setText(tr("Server message for latest version:"));
-    pageLayout->addWidget(lblSMN, 1, 0);
-
-    leServerMessageNew = new QLineEdit(this);
-    pageLayout->addWidget(leServerMessageNew, 1, 1);
-
-    // 2
-    QLabel * lblSMO = new QLabel(this);
-    lblSMO->setText(tr("Server message for previous versions:"));
-    pageLayout->addWidget(lblSMO, 2, 0);
-
-    leServerMessageOld = new QLineEdit(this);
-    pageLayout->addWidget(leServerMessageOld, 2, 1);
-
-    // 3
-    QLabel * lblP = new QLabel(this);
-    lblP->setText(tr("Latest version protocol number:"));
-    pageLayout->addWidget(lblP, 3, 0);
-
-    sbProtocol = new QSpinBox(this);
-    pageLayout->addWidget(sbProtocol, 3, 1);
-
-    // 4
-    QLabel * lblPreview = new QLabel(this);
-    lblPreview->setText(tr("MOTD preview:"));
-    pageLayout->addWidget(lblPreview, 4, 0);
-
-    tb = new QTextBrowser(this);
-    tb->setOpenExternalLinks(true);
-    tb->document()->setDefaultStyleSheet(HWChatWidget::STYLE);
-    pageLayout->addWidget(tb, 4, 1, 1, 2);
-    
-    // 5
-    pbClearAccountsCache = addButton(tr("Clear Accounts Cache"), pageLayout, 5, 0);
-    
-    // 6
-    pbSetSM = addButton(tr("Set data"), pageLayout, 6, 0, 1, 3);
-
-    return pageLayout;
-}
-
-void PageAdmin::connectSignals()
-{
-    connect(pbAsk, SIGNAL(clicked()), this, SIGNAL(askServerVars()));
-    connect(leServerMessageNew, SIGNAL(textEdited(const QString &)), tb, SLOT(setHtml(const QString &)));
-    connect(leServerMessageOld, SIGNAL(textEdited(const QString &)), tb, SLOT(setHtml(const QString &)));
-    connect(pbClearAccountsCache, SIGNAL(clicked()), this, SIGNAL(clearAccountsCache()));
-    connect(pbSetSM, SIGNAL(clicked()), this, SLOT(smChanged()));
-}
-
-PageAdmin::PageAdmin(QWidget* parent) : AbstractPage(parent)
-{
-    initPage();
-}
-
-void PageAdmin::smChanged()
-{
-    emit setServerMessageNew(leServerMessageNew->text());
-    emit setServerMessageOld(leServerMessageOld->text());
-    emit setProtocol(sbProtocol->value());
-}
-
-void PageAdmin::serverMessageNew(const QString & str)
-{
-    leServerMessageNew->setText(str);
-}
-
-void PageAdmin::serverMessageOld(const QString & str)
-{
-    leServerMessageOld->setText(str);
-}
-void PageAdmin::protocol(int proto)
-{
-    sbProtocol->setValue(proto);
-}
--- a/QTfrontend/pageadmin.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef PAGE_ADMIN_H
-#define PAGE_ADMIN_H
-
-#include "AbstractPage.h"
-
-class PageAdmin : public AbstractPage
-{
-    Q_OBJECT
-
-public:
-    PageAdmin(QWidget* parent = 0);
-
-public slots:
-    void serverMessageNew(const QString & str);
-    void serverMessageOld(const QString & str);
-    void protocol(int proto);
-
-signals:
-    void setServerMessageNew(const QString & str);
-    void setServerMessageOld(const QString & str);
-    void setProtocol(int proto);
-    void askServerVars();
-    void clearAccountsCache();
-
-protected:
-    QLayout * bodyLayoutDefinition();
-    void connectSignals();
-
-private:
-    QLineEdit * leServerMessageNew;
-    QLineEdit * leServerMessageOld;
-    QPushButton * pbSetSM;
-    QPushButton * pbAsk;
-    QSpinBox * sbProtocol;
-    QTextBrowser * tb;
-    QPushButton * pbClearAccountsCache;
-
-private slots:
-    void smChanged();
-};
-
-#endif
--- a/QTfrontend/pagecampaign.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QGridLayout>
-#include <QPushButton>
-#include <QComboBox>
-
-#include "pagecampaign.h"
-
-QLayout * PageCampaign::bodyLayoutDefinition()
-{
-    QGridLayout * pageLayout = new QGridLayout();
-    pageLayout->setColumnStretch(0, 1);
-    pageLayout->setColumnStretch(1, 2);
-    pageLayout->setColumnStretch(2, 1);
-    pageLayout->setRowStretch(0, 1);
-    pageLayout->setRowStretch(3, 1);
-
-    CBSelect = new QComboBox(this);
-    CBTeam = new QComboBox(this);
-
-    pageLayout->addWidget(CBTeam, 1, 1);
-    pageLayout->addWidget(CBSelect, 2, 1);
-    
-    BtnStartCampaign = new QPushButton(this);
-    BtnStartCampaign->setFont(*font14);
-    BtnStartCampaign->setText(QPushButton::tr("Go!"));
-    pageLayout->addWidget(BtnStartCampaign, 2, 2);
-
-    return pageLayout;
-}
-
-PageCampaign::PageCampaign(QWidget* parent) : AbstractPage(parent)
-{
-    initPage();
-}
-
-
--- a/QTfrontend/pagecampaign.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef PAGE_CAMPAIGN_H
-#define PAGE_CAMPAIGN_H
-
-#include "AbstractPage.h"
-
-class PageCampaign : public AbstractPage
-{
-    Q_OBJECT
-
-public:
-    PageCampaign(QWidget* parent = 0);
-
-    QPushButton *BtnStartCampaign;
-    QComboBox   *CBSelect;
-    QComboBox   *CBTeam;
-
-protected:
-    QLayout * bodyLayoutDefinition();
-};
-
-#endif
--- a/QTfrontend/pageconnecting.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QVBoxLayout>
-#include <QLabel>
-
-#include "pageconnecting.h"
-
-QLayout * PageConnecting::bodyLayoutDefinition()
-{
-    QVBoxLayout * pageLayout = new QVBoxLayout();
-
-    QLabel * lblConnecting = new QLabel(this);
-    lblConnecting->setText(tr("Connecting..."));
-    pageLayout->addWidget(lblConnecting);
-
-    return pageLayout;
-}
-
-void PageConnecting::connectSignals()
-{
-    connect(this, SIGNAL(goBack()), this, SIGNAL(cancelConnection()));
-}
-
-PageConnecting::PageConnecting(QWidget* parent) :  AbstractPage(parent)
-{
-    initPage();
-}
--- a/QTfrontend/pageconnecting.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef PAGE_CONNECTING_H
-#define PAGE_CONNECTING_H
-
-#include "AbstractPage.h"
-
-class PageConnecting : public AbstractPage
-{
-    Q_OBJECT
-
-public:
-    PageConnecting(QWidget* parent = 0);
-
-signals:
-    void cancelConnection();
-
-protected:
-    QLayout * bodyLayoutDefinition();
-    void connectSignals();
-};
-
-#endif
--- a/QTfrontend/pagedata.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,229 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QGridLayout>
-#include <QPushButton>
-#include <QNetworkAccessManager>
-#include <QNetworkRequest>
-#include <QNetworkReply>
-#include <QFileInfo>
-#include <QFileDialog>
-#include <QDebug>
-#include <QProgressBar>
-#include <QBuffer>
-
-#include "pagedata.h"
-#include "databrowser.h"
-#include "hwconsts.h"
-
-#include "quazip.h"
-#include "quazipfile.h"
-
-QLayout * PageDataDownload::bodyLayoutDefinition()
-{
-    QGridLayout * pageLayout = new QGridLayout();
-    pageLayout->setColumnStretch(0, 1);
-    pageLayout->setColumnStretch(1, 1);
-    pageLayout->setColumnStretch(2, 1);
-
-    web = new DataBrowser(this);
-    pageLayout->addWidget(web, 0, 0, 1, 3);
-
-    progressBarsLayout = new QVBoxLayout();
-    pageLayout->addLayout(progressBarsLayout, 1, 0, 1, 3);
-    return pageLayout;
-}
-
-void PageDataDownload::connectSignals()
-{
-    connect(web, SIGNAL(anchorClicked(QUrl)), this, SLOT(request(const QUrl&)));
-}
-
-PageDataDownload::PageDataDownload(QWidget* parent) : AbstractPage(parent)
-{
-    initPage();
-
-    web->setOpenLinks(false);
-    fetchList();
-}
-
-void PageDataDownload::request(const QUrl &url)
-{
-    QUrl finalUrl;
-    if(url.host().isEmpty())
-        finalUrl = QUrl("http://www.hedgewars.org" + url.path());
-    else
-        finalUrl = url;
-
-    if(url.path().endsWith(".zip"))
-    {
-        qWarning() << "Download Request" << url.toString();
-        QString fileName = QFileInfo(url.toString()).fileName();
-
-        QNetworkRequest newRequest(finalUrl);
-        newRequest.setAttribute(QNetworkRequest::User, fileName);
-
-        QNetworkAccessManager *manager = new QNetworkAccessManager(this);
-        QNetworkReply *reply = manager->get(newRequest);
-        connect(reply, SIGNAL(finished()), this, SLOT(fileDownloaded()));
-        connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64, qint64)));
-
-        QProgressBar *progressBar = new QProgressBar(this);
-        progressBarsLayout->addWidget(progressBar);
-        progressBars.insert(reply, progressBar);
-    } else
-    {
-        qWarning() << "Page Request" << url.toString();
-
-        QNetworkRequest newRequest(finalUrl);
-
-        QNetworkAccessManager *manager = new QNetworkAccessManager(this);
-        QNetworkReply *reply = manager->get(newRequest);
-        connect(reply, SIGNAL(finished()), this, SLOT(pageDownloaded()));
-    }
-}
-
-
-void PageDataDownload::pageDownloaded()
-{
-    QNetworkReply * reply = qobject_cast<QNetworkReply *>(sender());
-
-    if(reply)
-    {
-        QString html = QString::fromUtf8(reply->readAll());
-        int begin = html.indexOf("<!-- BEGIN -->");
-        int end = html.indexOf("<!-- END -->");
-        if(begin != -1 && begin < end)
-        {
-            html.truncate(end);
-            html.remove(0, begin);
-        }
-        web->setHtml(html);
-    }
-}
-
-void PageDataDownload::fileDownloaded()
-{
-    QNetworkReply * reply = qobject_cast<QNetworkReply *>(sender());
-
-    if(reply)
-    {
-        QByteArray fileContents = reply->readAll();
-        QProgressBar *progressBar = progressBars.value(reply, 0);
-
-        if(progressBar)
-        {
-            progressBars.remove(reply);
-            progressBar->deleteLater();
-        }
-
-        extractDataPack(&fileContents);
-    }
-}
-
-void PageDataDownload::downloadProgress(qint64 bytesRecieved, qint64 bytesTotal)
-{
-    QNetworkReply * reply = qobject_cast<QNetworkReply *>(sender());
-
-    if(reply)
-    {
-        QProgressBar *progressBar = progressBars.value(reply, 0);
-
-        if(progressBar)
-        {
-            progressBar->setValue(bytesRecieved);
-            progressBar->setMaximum(bytesTotal);
-        }
-    }
-}
-
-void PageDataDownload::fetchList()
-{
-    request(QUrl("http://hedgewars.org/content.html"));
-}
-
-bool PageDataDownload::extractDataPack(QByteArray * buf)
-{
-    QBuffer buffer;
-    buffer.setBuffer(buf);
-
-    QuaZip zip;
-    zip.setIoDevice(&buffer);
-    if(!zip.open(QuaZip::mdUnzip))
-    {
-      qWarning("testRead(): zip.open(): %d", zip.getZipError());
-      return false;
-    }
-
-    QuaZipFile file(&zip);
-
-    QDir extractDir(*cfgdir);
-    extractDir.cd("Data");
-
-    for(bool more = zip.goToFirstFile(); more; more = zip.goToNextFile())
-    {
-        if(!file.open(QIODevice::ReadOnly))
-        {
-            qWarning("file.open(): %d", file.getZipError());
-            return false;
-        }
-
-
-        QString fileName = file.getActualFileName();
-        QString filePath = extractDir.filePath(fileName);
-        if (fileName.endsWith("/"))
-        {
-            QFileInfo fi(filePath);
-            QDir().mkpath(fi.filePath());
-        } else
-        {
-            qDebug() << "Extracting" << filePath;
-            QFile out(filePath);
-            if(!out.open(QFile::WriteOnly))
-            {
-                qWarning() << "out.open():" << out.errorString();
-                return false;
-            }
-
-            out.write(file.readAll());
-
-            out.close();
-
-            if(file.getZipError() != UNZ_OK) {
-                qWarning("file.getFileName(): %d", file.getZipError());
-                return false;
-            }
-
-            if(!file.atEnd()) {
-                qWarning("read all but not EOF");
-                return false;
-            }
-        }
-
-        file.close();
-
-        if(file.getZipError()!=UNZ_OK) {
-            qWarning("file.close(): %d", file.getZipError());
-            return false;
-        }
-    }
-
-    zip.close();
-
-    return true;
-}
--- a/QTfrontend/pagedata.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef PAGE_DATA_H
-#define PAGE_DATA_H
-
-#include <QUrl>
-#include "AbstractPage.h"
-
-class DataBrowser;
-class QProgressBar;
-class QNetworkReply;
-class QVBoxLayout;
-
-class PageDataDownload : public AbstractPage
-{
-    Q_OBJECT
-
-public:
-    PageDataDownload(QWidget* parent = 0);
-
-public slots:
-    void fetchList();
-
-protected:
-    QLayout * bodyLayoutDefinition();
-    void connectSignals();
-
-private:
-    DataBrowser *web;
-    QHash<QNetworkReply*, QProgressBar *> progressBars;
-    QVBoxLayout *progressBarsLayout;
-
-    bool extractDataPack(QByteArray * buf);
-
-private slots:
-    void request(const QUrl &url);
-
-    void pageDownloaded();
-    void fileDownloaded();
-    void downloadProgress(qint64, qint64);
-};
-
-#endif
--- a/QTfrontend/pagedrawmap.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,69 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QGridLayout>
-#include <QPushButton>
-#include <QFileDialog>
-
-#include "pagedrawmap.h"
-#include "drawmapwidget.h"
-
-
-QLayout * PageDrawMap::bodyLayoutDefinition()
-{
-    QGridLayout * pageLayout = new QGridLayout();
-
-    pbUndo = addButton(tr("Undo"), pageLayout, 0, 0);
-    pbClear = addButton(tr("Clear"), pageLayout, 1, 0);
-    pbLoad = addButton(tr("Load"), pageLayout, 2, 0);
-    pbSave = addButton(tr("Save"), pageLayout, 3, 0);
-
-    drawMapWidget = new DrawMapWidget(this);
-    pageLayout->addWidget(drawMapWidget, 0, 1, 5, 1);
-
-    return pageLayout;
-}
-
-void PageDrawMap::connectSignals()
-{
-    connect(pbUndo, SIGNAL(clicked()), drawMapWidget, SLOT(undo()));
-    connect(pbClear, SIGNAL(clicked()), drawMapWidget, SLOT(clear()));
-    connect(pbLoad, SIGNAL(clicked()), this, SLOT(load()));
-    connect(pbSave, SIGNAL(clicked()), this, SLOT(save()));
-}
-
-PageDrawMap::PageDrawMap(QWidget* parent) : AbstractPage(parent)
-{
-    initPage();
-}
-
-void PageDrawMap::load()
-{
-    QString fileName = QFileDialog::getOpenFileName(NULL, tr("Load drawn map"), ".", tr("Drawn Maps") + " (*.hwmap);;" + tr("All files") + " (*)");
-
-    if(!fileName.isEmpty())
-        drawMapWidget->load(fileName);
-}
-
-void PageDrawMap::save()
-{
-    QString fileName = QFileDialog::getSaveFileName(NULL, tr("Save drawn map"), ".", tr("Drawn Maps") + " (*.hwmap);;" + tr("All files") + " (*)");
-
-    if(!fileName.isEmpty())
-        drawMapWidget->save(fileName);
-}
--- a/QTfrontend/pagedrawmap.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef PAGE_DRAWMAP_H
-#define PAGE_DRAWMAP_H
-
-#include "AbstractPage.h"
-
-class DrawMapWidget;
-
-class PageDrawMap : public AbstractPage
-{
-    Q_OBJECT
-
-public:
-    PageDrawMap(QWidget* parent = 0);
-
-    DrawMapWidget * drawMapWidget;
-
-protected:
-    QLayout * bodyLayoutDefinition();
-    void connectSignals();
-
-private:
-    QPushButton * pbUndo;
-    QPushButton * pbClear;
-    QPushButton * pbLoad;
-    QPushButton * pbSave;
-
-private slots:
-    void load();
-    void save();
-};
-
-#endif
-
--- a/QTfrontend/pageeditteam.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,523 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QGridLayout>
-#include <QHBoxLayout>
-#include <QPushButton>
-#include <QComboBox>
-#include <QLabel>
-#include <QLineEdit>
-#include <QTabWidget>
-#include <QGroupBox>
-#include <QToolBox>
-#include <QMessageBox>
-
-#include "pageeditteam.h"
-#include "sdlkeys.h"
-#include "SquareLabel.h"
-#include "hats.h"
-#include "HWApplication.h"
-
-QLayout * PageEditTeam::bodyLayoutDefinition()
-{
-    QGridLayout * pageLayout = new QGridLayout();
-    QTabWidget * tbw = new QTabWidget();
-    QWidget * page1 = new QWidget(this);
-    QWidget * page2 = new QWidget(this);
-    tbw->addTab(page1, tr("General"));
-    tbw->addTab(page2, tr("Advanced"));
-    pageLayout->addWidget(tbw, 0, 0, 1, 3);
-
-    QHBoxLayout * page1Layout = new QHBoxLayout(page1);
-    page1Layout->setAlignment(Qt::AlignTop);
-    QGridLayout * page2Layout = new QGridLayout(page2);
-
-// ====== Page 1 ======
-    QVBoxLayout * vbox1 = new QVBoxLayout();
-    QVBoxLayout * vbox2 = new QVBoxLayout();
-    page1Layout->addLayout(vbox1);
-    page1Layout->addLayout(vbox2);
-
-    GBoxHedgehogs = new QGroupBox(this);
-    GBoxHedgehogs->setTitle(QGroupBox::tr("Team Members"));
-    GBoxHedgehogs->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
-    QGridLayout * GBHLayout = new QGridLayout(GBoxHedgehogs);
-
-    HatsModel * hatsModel = new HatsModel(GBoxHedgehogs);
-    for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++)
-    {
-        HHHats[i] = new QComboBox(GBoxHedgehogs);
-        HHHats[i]->setModel(hatsModel);
-        HHHats[i]->setIconSize(QSize(32, 37));
-        //HHHats[i]->setSizeAdjustPolicy(QComboBox::AdjustToContents);
-        //HHHats[i]->setModelColumn(1);
-        //HHHats[i]->setMinimumWidth(132);
-        GBHLayout->addWidget(HHHats[i], i, 0);
-
-        HHNameEdit[i] = new QLineEdit(GBoxHedgehogs);
-        HHNameEdit[i]->setMaxLength(64);
-        HHNameEdit[i]->setMinimumWidth(120);
-        GBHLayout->addWidget(HHNameEdit[i], i, 1);
-
-        btnRandomHogName[i] = addButton(":/res/dice.png", GBHLayout, i, 3, true);
-    }
-
-    btnRandomTeam = addButton(QPushButton::tr("Random Team"), GBHLayout, 9, false);
-
-    vbox1->addWidget(GBoxHedgehogs);
-
-    GBoxTeam = new QGroupBox(this);
-    GBoxTeam->setTitle(QGroupBox::tr("Team Settings"));
-    GBoxTeam->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
-    QGridLayout * GBTLayout = new QGridLayout(GBoxTeam);
-    QLabel * tmpLabel = new QLabel(GBoxTeam);
-    tmpLabel->setText(QLabel::tr("Name"));
-    GBTLayout->addWidget(tmpLabel, 0, 0);
-    tmpLabel = new QLabel(GBoxTeam);
-    tmpLabel->setText(QLabel::tr("Type"));
-    GBTLayout->addWidget(tmpLabel, 1, 0);
-    tmpLabel = new QLabel(GBoxTeam);
-    tmpLabel->setText(QLabel::tr("Grave"));
-    GBTLayout->addWidget(tmpLabel, 2, 0);
-    tmpLabel = new QLabel(GBoxTeam);
-    tmpLabel->setText(QLabel::tr("Flag"));
-    GBTLayout->addWidget(tmpLabel, 3, 0);
-    tmpLabel = new QLabel(GBoxTeam);
-    tmpLabel->setText(QLabel::tr("Voice"));
-    GBTLayout->addWidget(tmpLabel, 4, 0);
-
-    TeamNameEdit = new QLineEdit(GBoxTeam);
-    TeamNameEdit->setMaxLength(64);
-    GBTLayout->addWidget(TeamNameEdit, 0, 1);
-    vbox2->addWidget(GBoxTeam);
-
-    CBTeamLvl = new QComboBox(GBoxTeam);
-    CBTeamLvl->setIconSize(QSize(48, 48));
-    CBTeamLvl->addItem(QIcon(":/res/botlevels/0.png"), QComboBox::tr("Human"));
-    for(int i = 5; i > 0; i--)
-        CBTeamLvl->addItem(
-                QIcon(QString(":/res/botlevels/%1.png").arg(6 - i)),
-                QString("%1 %2").arg(QComboBox::tr("Level")).arg(i)
-                );
-    GBTLayout->addWidget(CBTeamLvl, 1, 1);
-
-    CBGrave = new QComboBox(GBoxTeam);
-    CBGrave->setMaxCount(65535);
-    CBGrave->setIconSize(QSize(32, 32));
-    GBTLayout->addWidget(CBGrave, 2, 1);
-
-    CBFlag = new QComboBox(GBoxTeam);
-    CBFlag->setMaxCount(65535);
-    CBFlag->setIconSize(QSize(22, 15));
-    GBTLayout->addWidget(CBFlag, 3, 1);
-
-    QHBoxLayout * hbox = new QHBoxLayout();
-    CBVoicepack = new QComboBox(GBoxTeam);
-
-    hbox->addWidget(CBVoicepack, 100);
-    btnTestSound = addButton(":/res/PlaySound.png", hbox, 1, true);
-    hbox->setStretchFactor(btnTestSound, 1);
-
-    GBTLayout->addLayout(hbox, 4, 1);
-
-    GBoxFort = new QGroupBox(this);
-    GBoxFort->setTitle(QGroupBox::tr("Fort"));
-    QGridLayout * GBFLayout = new QGridLayout(GBoxFort);
-    CBFort = new QComboBox(GBoxFort);
-    CBFort->setMaxCount(65535);
-    GBFLayout->addWidget(CBFort, 0, 0);
-    FortPreview = new SquareLabel(GBoxFort);
-    FortPreview->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
-    FortPreview->setMinimumSize(128, 128);
-    FortPreview->setPixmap(QPixmap());
-    // perhaps due to handling its own paintevents, SquareLabel doesn't play nice with the stars
-    //FortPreview->setAttribute(Qt::WA_PaintOnScreen, true);
-    GBFLayout->addWidget(FortPreview, 1, 0);
-    vbox2->addWidget(GBoxFort);
-
-    vbox1->addStretch();
-    vbox2->addStretch();
-
-// ====== Page 2 ======
-    GBoxBinds = new QGroupBox(this);
-    GBoxBinds->setTitle(QGroupBox::tr("Key binds"));
-    QGridLayout * GBBLayout = new QGridLayout(GBoxBinds);
-    BindsBox = new QToolBox(GBoxBinds);
-    BindsBox->setLineWidth(0);
-    GBBLayout->addWidget(BindsBox);
-    page2Layout->addWidget(GBoxBinds, 0, 0);
-
-    quint16 i = 0;
-    quint16 num = 0;
-    QWidget * curW = NULL;
-    QGridLayout * pagelayout = NULL;
-    QLabel* l = NULL;
-    while (i < BINDS_NUMBER) {
-        if(cbinds[i].category != NULL)
-        {
-            if(curW != NULL)
-            {
-                l = new QLabel(curW);
-                l->setText("");
-                pagelayout->addWidget(l, num++, 0, 1, 2);
-            }
-            curW = new QWidget(this);
-            BindsBox->addItem(curW, HWApplication::translate("binds (categories)", cbinds[i].category));
-            pagelayout = new QGridLayout(curW);
-            num = 0;
-        }
-        if(cbinds[i].description != NULL)
-        {
-            l = new QLabel(curW);
-            l->setText((num > 0 ? QString("\n") : QString("")) + HWApplication::translate("binds (descriptions)", cbinds[i].description));
-            pagelayout->addWidget(l, num++, 0, 1, 2);
-        }
-
-        l = new QLabel(curW);
-        l->setText(HWApplication::translate("binds", cbinds[i].name));
-        l->setAlignment(Qt::AlignRight);
-        pagelayout->addWidget(l, num, 0);
-        CBBind[i] = new QComboBox(curW);
-        for(int j = 0; sdlkeys[j][1][0] != '\0'; j++)
-            CBBind[i]->addItem(HWApplication::translate("binds (keys)", sdlkeys[j][1]).contains(": ") ? HWApplication::translate("binds (keys)", sdlkeys[j][1]) : HWApplication::translate("binds (keys)", "Keyboard") + QString(": ") + HWApplication::translate("binds (keys)", sdlkeys[j][1]), sdlkeys[j][0]);
-        pagelayout->addWidget(CBBind[i++], num++, 1);
-    }
-
-    return pageLayout;
-}
-
-QLayout * PageEditTeam::footerLayoutDefinition()
-{
-    QHBoxLayout * bottomLayout = new QHBoxLayout();
-
-    btnSave = addButton(":/res/Save.png", bottomLayout, 0, true);;
-    btnSave->setStyleSheet("QPushButton{margin: 24px 0 0 0;}");
-    bottomLayout->setAlignment(btnSave, Qt::AlignRight | Qt::AlignBottom);
-
-    return bottomLayout;
-}
-
-void PageEditTeam::connectSignals()
-{
-    connect(btnSave, SIGNAL(clicked()), this, SLOT(saveTeam()));
-
-    signalMapper1 = new QSignalMapper(this);
-    signalMapper2 = new QSignalMapper(this);
-
-    connect(signalMapper1, SIGNAL(mapped(int)), this, SLOT(fixHHname(int)));
-    connect(signalMapper2, SIGNAL(mapped(int)), this, SLOT(setRandomName(int)));
-
-    for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++)
-    {
-        connect(HHNameEdit[i], SIGNAL(editingFinished()), signalMapper1, SLOT(map()));
-            signalMapper1->setMapping(HHNameEdit[i], i);
-
-        connect(btnRandomHogName[i], SIGNAL(clicked()), signalMapper2, SLOT(map()));
-            signalMapper2->setMapping(btnRandomHogName[i], i);
-    }
-
-    connect(btnRandomTeam, SIGNAL(clicked()), this, SLOT(setRandomNames()));
-    
-    connect(btnTestSound, SIGNAL(clicked()), this, SLOT(testSound()));
-
-    connect(CBFort, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(CBFort_activated(const QString &)));
-}
-
-PageEditTeam::PageEditTeam(QWidget* parent, SDLInteraction * sdli) :
-  AbstractPage(parent)
-{
-    initPage();
-
-    m_playerHash = "0000000000000000000000000000000000000000";
-    mySdli = sdli;
-
-    QDir tmpdir;
-    QStringList list;
-    tmpdir.cd(cfgdir->absolutePath());
-    if (tmpdir.cd("Data/Sounds/voices")) 
-    {
-        list = tmpdir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot, QDir::Name);
-        CBVoicepack->addItems(list);
-    }
-
-    tmpdir.cd(datadir->absolutePath());
-    tmpdir.cd("Sounds/voices");
-    QStringList tmplist = tmpdir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot, QDir::Name);
-    QStringList tmplist2;
-    foreach (const QString & line, tmplist)
-    {
-        if (!list.contains(line,Qt::CaseInsensitive))
-            tmplist2.append(line);
-    }
-
-    CBVoicepack->addItems(tmplist2);
-
-    QStringList userforts;
-    tmpdir.cd(cfgdir->absolutePath());
-    if (tmpdir.cd("Data/Forts"))
-    {
-        tmpdir.setFilter(QDir::Files);
-        userforts = tmpdir.entryList(QStringList("*L.png")).replaceInStrings(QRegExp("^(.*)L\\.png"), "\\1");
-        CBFort->addItems(userforts);
-    }
-
-    tmpdir.cd("../Graphics/Graves");
-    QStringList userlist = tmpdir.entryList(QStringList("*.png"));
-    for (QStringList::Iterator it = userlist.begin(); it != userlist.end(); ++it )
-    {
-        QPixmap pix(cfgdir->absolutePath() + "/Data/Graphics/Graves/" + *it);
-        QIcon icon(pix.copy(0, 0, 32, 32));
-        CBGrave->addItem(icon, QString(*it).replace(QRegExp("^(.*)\\.png"), "\\1"));
-    }
-
-    tmpdir.cd(datadir->absolutePath());
-    tmpdir.cd("Forts");
-    tmpdir.setFilter(QDir::Files);
-
-    tmplist = tmpdir.entryList(QStringList("*L.png")).replaceInStrings(QRegExp("^(.*)L\\.png"), "\\1");
-    QStringList dataforts;
-    foreach (const QString & line, tmplist)
-    {
-        if (!userforts.contains(line,Qt::CaseInsensitive))
-            dataforts.append(line);
-    }
-
-    CBFort->addItems(dataforts);
-
-    tmpdir.cd("../Graphics/Graves");
-    QStringList datalist = tmpdir.entryList(QStringList("*.png"));
-    foreach (const QString & line, datalist)
-    {
-        if (userlist.contains(line,Qt::CaseInsensitive)) continue;
-        QPixmap pix(datadir->absolutePath() + "/Graphics/Graves/" + line);
-        QIcon icon(pix.copy(0, 0, 32, 32));
-        QString grave = line;
-        grave = grave.replace(QRegExp("^(.*)\\.png"), "\\1");
-        CBGrave->addItem(icon, grave);
-    }
-
-    // add the default flag
-    CBFlag->addItem(QIcon(QPixmap(datadir->absolutePath() + "/Graphics/Flags/hedgewars.png").copy(0, 0, 22, 15)), "Hedgewars", "hedgewars");
-    CBFlag->insertSeparator(CBFlag->count());
-
-    tmpdir.cd(cfgdir->absolutePath());
-    tmpdir.cd("Data/Graphics/Flags");
-    userlist = tmpdir.entryList(QStringList("*.png"));
-    
-    // add all country flags
-    foreach (const QString & line, userlist)
-    {
-        QPixmap pix(cfgdir->absolutePath() + "/Data/Graphics/Flags/" + line);
-        QIcon icon(pix.copy(0, 0, 22, 15));
-        // TODO improve readablility
-        if(line.compare("cpu.png") && line.compare("hedgewars.png") && (line.indexOf("cm_") == -1)) // skip cpu and hedgewars flags as well as all community flags
-        {
-            QString flag = line;
-            flag = flag.replace(QRegExp("^(.*)\\.png"), "\\1");
-            CBFlag->addItem(icon, flag.replace("_", " "), flag);
-        }
-    }
-
-    CBFlag->insertSeparator(CBFlag->count());
-
-    // add all community flags
-    for (QStringList::Iterator it = userlist.begin(); it != userlist.end(); ++it )
-    {
-        QPixmap pix(cfgdir->absolutePath() + "/Data/Graphics/Flags/" + *it);
-        QIcon icon(pix.copy(0, 0, 22, 15));
-        if(it->indexOf("cm_") > -1) // skip non community flags this time
-        {
-            QString flag = QString(*it).replace(QRegExp("^(.*)\\.png"), "\\1");
-            CBFlag->addItem(icon, QString(flag).replace("cm_", QComboBox::tr("Community") + ": "), flag);
-        }
-    }
-
-    CBFlag->insertSeparator(CBFlag->count());
-
-    tmpdir.cd(datadir->absolutePath());
-    tmpdir.cd("Graphics/Flags");
-    datalist = tmpdir.entryList(QStringList("*.png"));
-    
-    // add all country flags
-    for (QStringList::Iterator it = datalist.begin(); it != datalist.end(); ++it )
-    {
-        if (userlist.contains(*it,Qt::CaseInsensitive)) continue;
-        QPixmap pix(datadir->absolutePath() + "/Graphics/Flags/" + *it);
-        QIcon icon(pix.copy(0, 0, 22, 15));
-        if(it->compare("cpu.png") && it->compare("hedgewars.png") && (it->indexOf("cm_") == -1)) // skip cpu and hedgewars flags as well as all community flags
-        {
-            QString flag = QString(*it).replace(QRegExp("^(.*)\\.png"), "\\1");
-            CBFlag->addItem(icon, QString(flag).replace("_", " "), flag);
-        }
-    }
-
-    CBFlag->insertSeparator(CBFlag->count());
-
-    // add all community flags
-    for (QStringList::Iterator it = datalist.begin(); it != datalist.end(); ++it )
-    {
-        if (userlist.contains(*it,Qt::CaseInsensitive)) continue;
-        QPixmap pix(datadir->absolutePath() + "/Graphics/Flags/" + *it);
-        QIcon icon(pix.copy(0, 0, 22, 15));
-        if(it->indexOf("cm_") > -1) // skip non community flags this time
-        {
-            QString flag = (*it).replace(QRegExp("^(.*)\\.png"), "\\1");
-            CBFlag->addItem(icon, QString(flag).replace("cm_", QComboBox::tr("Community") + ": "), flag);
-        }
-    }
-}
-
-void PageEditTeam::fixHHname(int idx)
-{
-    HHNameEdit[idx]->setText(HHNameEdit[idx]->text().trimmed());
-
-    if (HHNameEdit[idx]->text().isEmpty())
-        HHNameEdit[idx]->setText(QLineEdit::tr("hedgehog %1").arg(idx+1));
-}
-
-void PageEditTeam::CBFort_activated(const QString & fortname)
-{
-    QFile tmp;
-    tmp.setFileName(cfgdir->absolutePath() + "/Data/Forts/" + fortname + "L.png");
-    if (!tmp.exists()) tmp.setFileName(datadir->absolutePath() + "/Forts/" + fortname + "L.png");
-    QPixmap pix(QFileInfo(tmp).absoluteFilePath());
-    FortPreview->setPixmap(pix);
-}
-
-void PageEditTeam::testSound()
-{
-    Mix_Chunk *sound;
-    QDir tmpdir;
-    mySdli->SDLMusicInit();
-    
-    tmpdir.cd(cfgdir->absolutePath());
-    if (!tmpdir.cd("Data/Sounds/voices/"+CBVoicepack->currentText()))
-    {
-        tmpdir.cd(datadir->absolutePath());
-        tmpdir.cd("Sounds/voices");
-        tmpdir.cd(CBVoicepack->currentText());
-    }
-
-    QStringList list = tmpdir.entryList(QStringList() << "Illgetyou.ogg" << "Incoming.ogg" << "Stupid.ogg" << "Coward.ogg" << "Firstblood.ogg", QDir::Files);
-    if (list.size()) {
-        sound = Mix_LoadWAV(QString(tmpdir.absolutePath() + "/" + list[rand() % list.size()]).toLocal8Bit().constData());
-        Mix_PlayChannel(-1, sound, 0);
-    }
-}
-
-void PageEditTeam::createTeam(const QString & name, const QString & playerHash)
-{
-    m_playerHash = playerHash;
-    HWTeam newTeam(name);
-    loadTeam(newTeam);
-}
-
-void PageEditTeam::editTeam(const QString & name, const QString & playerHash)
-{
-    m_playerHash = playerHash;
-    HWTeam team(name);
-    team.loadFromFile();
-    loadTeam(team);
-}
-
-void PageEditTeam::deleteTeam(const QString & name)
-{
-    QMessageBox reallyDelete(QMessageBox::Question, QMessageBox::tr("Teams"), QMessageBox::tr("Really delete this team?"), QMessageBox::Ok | QMessageBox::Cancel, this);
-
-    if (reallyDelete.exec() == QMessageBox::Ok)
-        HWTeam(name).deleteFile();
-}
-
-void PageEditTeam::setRandomNames()
-{
-    HWTeam team = data();
-    HWNamegen::teamRandomNames(team, true);
-    loadTeam(team);
-}
-
-void PageEditTeam::setRandomName(int hh_index)
-{
-    HWTeam team = data();
-    HWNamegen::teamRandomName(team,hh_index);
-    loadTeam(team);
-}
-
-void PageEditTeam::loadTeam(const HWTeam & team)
-{
-    TeamNameEdit->setText(team.name());
-    CBTeamLvl->setCurrentIndex(team.difficulty());
-
-    for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++)
-    {
-        HWHog hh = team.hedgehog(i);
-
-        HHNameEdit[i]->setText(hh.Name);
-
-        if (hh.Hat.startsWith("Reserved"))
-            hh.Hat = hh.Hat.remove(0,40);
-
-        HHHats[i]->setCurrentIndex(HHHats[i]->findData(hh.Hat, Qt::DisplayRole));
-    }
-
-    CBGrave->setCurrentIndex(CBGrave->findText(team.grave()));
-    CBFlag->setCurrentIndex(CBFlag->findData(team.flag()));
-
-    CBFort->setCurrentIndex(CBFort->findText(team.fort()));
-    CBVoicepack->setCurrentIndex(CBVoicepack->findText(team.voicepack()));
-
-    for(int i = 0; i < BINDS_NUMBER; i++)
-    {
-        CBBind[i]->setCurrentIndex(CBBind[i]->findData(team.keyBind(i)));
-    }
-}
-
-HWTeam PageEditTeam::data()
-{
-    HWTeam team(TeamNameEdit->text());
-    team.setDifficulty(CBTeamLvl->currentIndex());
-
-    for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++)
-    {
-        HWHog hh;
-        hh.Name = HHNameEdit[i]->text();
-        hh.Hat = HHHats[i]->currentText();
-
-        if (hh.Hat.startsWith("Reserved"))
-            hh.Hat = "Reserved"+m_playerHash+hh.Hat.remove(0,9);
-
-        team.setHedgehog(i,hh);
-    }
-
-    team.setGrave(CBGrave->currentText());
-    team.setFort(CBFort->currentText());
-    team.setVoicepack(CBVoicepack->currentText());
-    team.setFlag(CBFlag->itemData(CBFlag->currentIndex()).toString());
-
-    for(int i = 0; i < BINDS_NUMBER; i++)
-    {
-        team.bindKey(i,CBBind[i]->itemData(CBBind[i]->currentIndex()).toString());
-    }
-
-    return team;
-}
-
-void PageEditTeam::saveTeam()
-{
-    data().saveToFile();
-    emit teamEdited();
-}
--- a/QTfrontend/pageeditteam.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,94 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef PAGE_EDITTEAM_H
-#define PAGE_EDITTEAM_H
-
-#include "AbstractPage.h"
-#include "binds.h"
-#include "hwconsts.h"
-#include "namegen.h"
-#include "SDLs.h"
-
-#include "team.h"
-
-class SquareLabel;
-
-class PageEditTeam : public AbstractPage
-{
-    Q_OBJECT
-
-public:
-    PageEditTeam(QWidget* parent, SDLInteraction * sdli);
-
-    void createTeam(const QString & name, const QString & playerHash);
-    void editTeam(const QString & name, const QString & playerHash);
-    void deleteTeam(const QString & name);
-
-signals:
-    void teamEdited();
-
-public slots:
-    void CBFort_activated(const QString & gravename);
-
-private:
-    QSignalMapper* signalMapper1;
-    QSignalMapper* signalMapper2;
-    QGroupBox *GBoxHedgehogs;
-    QGroupBox *GBoxTeam;
-    QGroupBox *GBoxFort;
-    QComboBox *CBFort;
-    SquareLabel *FortPreview;
-    QComboBox *CBGrave;
-    QComboBox *CBFlag;
-    QComboBox *CBTeamLvl;
-    QComboBox *CBVoicepack;
-    QGroupBox *GBoxBinds;
-    QToolBox *BindsBox;
-    QLineEdit * TeamNameEdit;
-    QLineEdit * HHNameEdit[HEDGEHOGS_PER_TEAM];
-    QComboBox * HHHats[HEDGEHOGS_PER_TEAM];
-    QComboBox * CBBind[BINDS_NUMBER];
-    SDLInteraction * mySdli;
-    HWTeam data();
-    QString m_playerHash;
-
-    QLayout * bodyLayoutDefinition();
-    QLayout * footerLayoutDefinition();
-    void connectSignals();
-
-    void loadTeam(const HWTeam & team);
-
-    // page 1
-    QPushButton * btnRandomHogName[HEDGEHOGS_PER_TEAM];
-    QPushButton * btnRandomTeam;
-    QPushButton * btnTestSound;
-
-    // footer
-    QPushButton * btnSave;
-
-private slots:
-    void saveTeam();
-    void setRandomNames();
-    void setRandomName(int hh_index);
-    void testSound();
-    void fixHHname(int idx);
-};
-
-#endif
-
--- a/QTfrontend/pagegamestats.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,274 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2010-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QLabel>
-#include <QGridLayout>
-#include <QHBoxLayout>
-#include <QGraphicsScene>
-#include <QGroupBox>
-#include <QSizePolicy>
-
-#include "pagegamestats.h"
-#include "team.h"
-
-FitGraphicsView::FitGraphicsView(QWidget* parent) : QGraphicsView(parent)
-{
-
-}
-
-void FitGraphicsView::resizeEvent(QResizeEvent * event)
-{
-    Q_UNUSED(event);
-
-    fitInView(sceneRect());
-}
-
-QLayout * PageGameStats::bodyLayoutDefinition()
-{
-    QGridLayout * pageLayout = new QGridLayout();
-    pageLayout->setSpacing(20);
-    pageLayout->setColumnStretch(0, 1);
-    pageLayout->setColumnStretch(1, 1);
-    pageLayout->setContentsMargins(7, 7, 7, 0);
-
-    QGroupBox * gb = new QGroupBox(this);
-    QVBoxLayout * gbl = new QVBoxLayout;
-
-    // details
-    labelGameStats = new QLabel(this);
-    QLabel * l = new QLabel(this);
-    l->setTextFormat(Qt::RichText);
-    l->setText("<h1><img src=\":/res/StatsD.png\"> " + PageGameStats::tr("Details") + "</h1>");
-    l->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
-    labelGameStats->setTextFormat(Qt::RichText);
-    labelGameStats->setAlignment(Qt::AlignTop);
-    labelGameStats->setWordWrap(true);
-    gbl->addWidget(l);
-    gbl->addWidget(labelGameStats);
-    gb->setLayout(gbl);
-    pageLayout->addWidget(gb, 1, 1, 1, 2);
-    
-    // graph
-    graphic = new FitGraphicsView(gb);
-    l = new QLabel(this);
-    l->setTextFormat(Qt::RichText);
-    l->setText("<br><h1><img src=\":/res/StatsH.png\"> " + PageGameStats::tr("Health graph") + "</h1>");
-    l->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
-    gbl->addWidget(l);
-    gbl->addWidget(graphic);
-    graphic->scale(1.0, -1.0);
-    graphic->setBackgroundBrush(QBrush(Qt::black));
-    
-    labelGameWin = new QLabel(this);
-    labelGameWin->setTextFormat(Qt::RichText);
-    pageLayout->addWidget(labelGameWin, 0, 0, 1, 2);
-
-    // ranking box
-    gb = new QGroupBox(this);
-    gbl = new QVBoxLayout;
-    labelGameRank = new QLabel(gb);
-    l = new QLabel(this);
-    l->setTextFormat(Qt::RichText);
-    l->setText("<h1><img src=\":/res/StatsR.png\"> " + PageGameStats::tr("Ranking") + "</h1>");
-    l->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
-    gbl->addWidget(l);
-    gbl->addWidget(labelGameRank);
-    gb->setLayout(gbl);
-
-    labelGameRank->setTextFormat(Qt::RichText);
-    labelGameRank->setAlignment(Qt::AlignTop);
-    pageLayout->addWidget(gb, 1, 0);
-
-    return pageLayout;
-}
-
-QLayout * PageGameStats::footerLayoutDefinition()
-{
-    QHBoxLayout * bottomLayout = new QHBoxLayout();
-
-    btnSave = addButton(":/res/Save.png", bottomLayout, 0, true);
-    btnSave->setStyleSheet("QPushButton{margin: 24px 0 0 0;}");
-    bottomLayout->setAlignment(btnSave, Qt::AlignRight | Qt::AlignBottom);
-
-    return bottomLayout;
-}
-
-void PageGameStats::connectSignals()
-{
-    connect(btnSave, SIGNAL(clicked()), this, SIGNAL(saveDemoRequested()));
-}
-
-PageGameStats::PageGameStats(QWidget* parent) : AbstractPage(parent)
-{
-    initPage();
-}
-
-void PageGameStats::AddStatText(const QString & msg)
-{
-    labelGameStats->setText(labelGameStats->text() + msg);
-}
-
-void PageGameStats::clear()
-{
-    labelGameStats->setText("");
-    healthPoints.clear();
-    labelGameRank->setText("");
-    playerPosition = 0;
-    lastColor = 0;
-}
-
-void PageGameStats::renderStats()
-{
-    QGraphicsScene * scene = new QGraphicsScene();
-
-    QMap<quint32, QVector<quint32> >::const_iterator i = healthPoints.constBegin();
-    while (i != healthPoints.constEnd())
-    {
-        quint32 c = i.key();
-        QColor clanColor = QColor(qRgb((c >> 16) & 255, (c >> 8) & 255, c & 255));
-        QVector<quint32> hps = i.value();
-
-        QPainterPath path;
-        if (hps.size())
-            path.moveTo(0, hps[0]);
-
-        for(int t = 1; t < hps.size(); ++t)
-            path.lineTo(t, hps[t]);
-
-        scene->addPath(path, QPen(c));
-        ++i;
-    }
-
-    graphic->setScene(scene);
-    graphic->fitInView(graphic->sceneRect());
-}
-
-void PageGameStats::GameStats(char type, const QString & info)
-{
-    switch(type) {
-        case 'r' : {
-            labelGameWin->setText(QString("<h1 align=\"center\">%1</h1>").arg(info));
-            break;
-        }
-        case 'D' : {
-            int i = info.indexOf(' ');
-            QString message = "<p><img src=\":/res/StatsBestShot.png\"> " + PageGameStats::tr("The best shot award was won by <b>%1</b> with <b>%2</b> pts.").arg(info.mid(i + 1), info.left(i)) + "</p>";
-            AddStatText(message);
-            break;
-        }
-        case 'k' : {
-            int i = info.indexOf(' ');
-            int num = info.left(i).toInt();
-            QString message = "<p><img src=\":/res/StatsBestKiller.png\"> " + PageGameStats::tr("The best killer is <b>%1</b> with <b>%2</b> kills in a turn.", "", num).arg(info.mid(i + 1), info.left(i)) + "</p>";
-            AddStatText(message);
-            break;
-        }
-        case 'K' : {
-            int num = info.toInt();
-            QString message = "<p><img src=\":/res/StatsHedgehogsKilled.png\"> " +  PageGameStats::tr("A total of <b>%1</b> hedgehog(s) were killed during this round.", "", num).arg(num) + "</p>";
-            AddStatText(message);
-            break;
-        }
-        case 'H' : {
-            int i = info.indexOf(' ');
-            quint32 clan = info.left(i).toInt();
-            quint32 hp = info.mid(i + 1).toUInt();
-            healthPoints[clan].append(hp);
-            break;
-        }
-        case 'T': { // local team stats
-            //AddStatText("<p>local team: " + info + "</p>");
-            QStringList infol = info.split(":");
-            HWTeam team(infol[0]);
-            if(team.fileExists()) // do some better test to avoid influence from scripted/predefined teams?
-            {
-                team.loadFromFile();
-                team.incRounds();
-                if(infol[1].toInt() > 0) // might require some better test for winning condition (or changed flag) ... WIP!
-                    team.incWins(); // should draws count as wins?
-                //team.SaveToFile(); // don't save yet
-            }
-            break;
-            }
-
-        case 'P' : {
-            int i = info.indexOf(' ');
-            playerPosition++;
-            QString color = info.left(i);
-            quint32 c = color.toInt();
-            QColor clanColor = QColor(qRgb((c >> 16) & 255, (c >> 8) & 255, c & 255));
-
-            QString playerinfo = info.mid(i + 1);
-
-            i = playerinfo.indexOf(' ');
-
-            int kills = playerinfo.left(i).toInt();
-            QString playername = playerinfo.mid(i + 1);
-            QString image;
-
-            if (lastColor == c) playerPosition--;
-            lastColor = c;
-
-            switch (playerPosition)
-            {
-                case 1:
-                image = "<img src=\":/res/StatsMedal1.png\">";
-                break;
-            case 2:
-                image = "<img src=\":/res/StatsMedal2.png\">";
-                break;
-            case 3:
-                image = "<img src=\":/res/StatsMedal3.png\">";
-                break;
-            default:
-                image = "<img src=\":/res/StatsMedal4.png\">";
-                break;
-            }
-
-            QString message;
-            QString killstring = PageGameStats::tr("(%1 kill)", "", kills).arg(kills);
-
-            message = QString("<p><h2>%1 %2. <font color=\"%4\">%3</font> ").arg(image, QString::number(playerPosition), playername, clanColor.name()) + killstring + "</h2></p>";
-
-            labelGameRank->setText(labelGameRank->text() + message);
-                break;
-        }
-        case 's' : {
-            int i = info.indexOf(' ');
-            int num = info.left(i).toInt();
-            QString message = "<p><img src=\":/res/StatsMostSelfDamage.png\"> " + PageGameStats::tr("<b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts.", "", num).arg(info.mid(i + 1)).arg(num) + "</p>";
-            AddStatText(message);
-            break;
-        }
-        case 'S' : {
-            int i = info.indexOf(' ');
-            int num = info.left(i).toInt();
-            QString message = "<p><img src=\":/res/StatsSelfKilled.png\"> " + PageGameStats::tr("<b>%1</b> killed <b>%2</b> of his own hedgehogs.", "", num).arg(info.mid(i + 1)).arg(num) + "</p>";
-            AddStatText(message);
-            break;
-        }
-        case 'B' : {
-            int i = info.indexOf(' ');
-            int num = info.left(i).toInt();
-            QString message = "<p><img src=\":/res/StatsSkipped.png\"> " + PageGameStats::tr("<b>%1</b> was scared and skipped turn <b>%2</b> times.", "", num).arg(info.mid(i + 1)).arg(num) + "</p>";
-            AddStatText(message);
-            break;
-        }
-
-    }
-}
--- a/QTfrontend/pagegamestats.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2010-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef STATSPAGE_H
-#define STATSPAGE_H
-
-#include <QVector>
-#include <QMap>
-#include <QGraphicsView>
-
-#include "AbstractPage.h"
-
-class FitGraphicsView : public QGraphicsView
-{
-    Q_OBJECT
-
-public:
-    FitGraphicsView(QWidget* parent = 0);
-
-protected:
-    void resizeEvent(QResizeEvent * event);
-};
-
-class PageGameStats : public AbstractPage
-{
-    Q_OBJECT
-
-public:
-    PageGameStats(QWidget* parent = 0);
-
-    QPushButton *btnSave;
-    QLabel *labelGameStats;
-    QLabel *labelGameWin;
-    QLabel *labelGameRank;
-    FitGraphicsView * graphic;
-
-public slots:
-    void GameStats(char type, const QString & info);
-    void clear();
-    void renderStats();
-    
-signals:
-    void saveDemoRequested();
-
-private:
-    void AddStatText(const QString & msg);
-
-    QMap<quint32, QVector<quint32> > healthPoints;
-    unsigned int playerPosition;
-    quint32 lastColor;
-
-protected:
-    QLayout * bodyLayoutDefinition();
-    QLayout * footerLayoutDefinition();
-    void connectSignals();
-};
-
-#endif // STATSPAGE_H
--- a/QTfrontend/pageinfo.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QGridLayout>
-#include <QPushButton>
-
-#include "pageinfo.h"
-#include "about.h"
-
-QLayout * PageInfo::bodyLayoutDefinition()
-{
-    QGridLayout * pageLayout = new QGridLayout();
-
-    pageLayout->setColumnStretch(0, 1);
-    pageLayout->setColumnStretch(1, 1);
-    pageLayout->setColumnStretch(2, 1);
-
-    about = new About();
-    pageLayout->addWidget(about, 0, 0, 1, 3);
-
-    return pageLayout;
-}
-
-QLayout * PageInfo::footerLayoutDefinition()
-{
-    QGridLayout * bottomLayout = new QGridLayout();
-    BtnSnapshots = addButton(":/res/Star.png", bottomLayout, 1, 1, true);
-    bottomLayout->setAlignment(BtnSnapshots, Qt::AlignRight | Qt::AlignVCenter);
-    return bottomLayout;
-}
-
-void PageInfo::connectSignals()
-{
-    //TODO
-}
-
-PageInfo::PageInfo(QWidget* parent) : AbstractPage(parent)
-{
-    initPage();
-}
-
--- a/QTfrontend/pageinfo.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef PAGE_INFO_H
-#define PAGE_INFO_H
-
-#include "AbstractPage.h"
-
-class About;
-
-class PageInfo : public AbstractPage
-{
-    Q_OBJECT
-
-public:
-    PageInfo(QWidget* parent = 0);
-
-    QPushButton *BtnSnapshots;
-    About *about;
-
-private:
-    QLayout * bodyLayoutDefinition();
-    QLayout * footerLayoutDefinition();
-    void connectSignals();
-};
-
-#endif
-
--- a/QTfrontend/pageingame.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QHBoxLayout>
-#include <QLabel>
-
-#include "pageingame.h"
-
-QLayout * PageInGame::bodyLayoutDefinition()
-{
-    QHBoxLayout * pageLayout = new QHBoxLayout();
-
-    QLabel * label = new QLabel(this);
-    label->setText(tr("In game..."));
-    pageLayout->addWidget(label);
-
-    setBackButtonVisible(false);
-
-    return pageLayout;
-}
-
-PageInGame::PageInGame(QWidget * parent) :  AbstractPage(parent)
-{
-    initPage();
-}
--- a/QTfrontend/pageingame.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef PAGE_INGAME_H
-#define PAGE_INGAME_H
-
-#include "AbstractPage.h"
-
-class PageInGame : public AbstractPage
-{
-    Q_OBJECT
-
-    public:
-        PageInGame(QWidget * parent = 0);
-
-        QLayout * bodyLayoutDefinition();
-};
-
-#endif
-
--- a/QTfrontend/pagemain.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,162 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
- 
-#include <QGridLayout>
-#include <QHBoxLayout>
-#include <QPushButton>
-#include <QLabel>
-#include <QTime>
-
-#include "pagemain.h"
-#include "hwconsts.h"
-#include "hwform.h"
-
-QLayout * PageMain::bodyLayoutDefinition()
-{
-    QGridLayout * pageLayout = new QGridLayout();
-    //pageLayout->setColumnStretch(0, 1);
-    //pageLayout->setColumnStretch(1, 2);
-    //pageLayout->setColumnStretch(2, 1);
-
-    //QPushButton* btnLogo = addButton(":/res/HedgewarsTitle.png", pageLayout, 0, 0, 1, 4, true);
-    //pageLayout->setAlignment(btnLogo, Qt::AlignHCenter);
-    pageLayout->setRowStretch(0, 1);
-    pageLayout->setRowStretch(1, 1);
-    pageLayout->setRowStretch(2, 0);
-    pageLayout->setRowStretch(3, 1);
-    pageLayout->setRowStretch(4, 1);
-
-    //BtnInfo = addButton(":/res/About.png", pageLayout, 3, 1, 1, 2, true);
-    BtnInfo = addButton(":/res/HedgewarsTitle.png", pageLayout, 0, 0, 1, 4, true);
-    BtnInfo->setStyleSheet("border: transparent;background: transparent;");
-    pageLayout->setAlignment(BtnInfo, Qt::AlignHCenter);
-
-    BtnSinglePlayer = addButton(":/res/LocalPlay.png", pageLayout, 2, 0, 1, 2, true);
-    BtnSinglePlayer->setToolTip(tr("Local Game (Play a game on a single computer)"));
-    pageLayout->setAlignment(BtnSinglePlayer, Qt::AlignHCenter);
-
-    BtnNet = addButton(":/res/NetworkPlay.png", pageLayout, 2, 2, 1, 2, true);
-    BtnNet->setToolTip(tr("Network Game (Play a game across a network)"));
-    pageLayout->setAlignment(BtnNet, Qt::AlignHCenter);
-
-    BtnDataDownload = addButton(tr("Downloadable Content"), pageLayout, 4, 0, 1, 4, false);
-    pageLayout->setAlignment(BtnDataDownload, Qt::AlignHCenter);
-
-    return pageLayout;
-}
-
-QLayout * PageMain::footerLayoutDefinition()
-{
-    QHBoxLayout * bottomLayout = new QHBoxLayout();
-
-    mainNote = new QLabel(this);
-    mainNote->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
-    mainNote->setWordWrap(true);
-    
-    bottomLayout->addWidget(mainNote, 0);
-    bottomLayout->setStretch(0,1);
-
-    BtnSetup = addButton(":/res/Settings.png", bottomLayout, 1, true);
-    bottomLayout->setStretch(1,0);
-
-    return bottomLayout;
-}
-
-void PageMain::connectSignals()
-{
-    //TODO
-}
-
-PageMain::PageMain(QWidget* parent) : AbstractPage(parent)
-{
-    initPage();
-
-    if(frontendEffects) setAttribute(Qt::WA_NoSystemBackground, true);
-    mainNote->setOpenExternalLinks(true);
-
-    if(!isDevBuild)
-    {
-        mainNote->setText(QLabel::tr("Tip: ") + randomTip());
-    }
-    else
-        mainNote->setText(QLabel::tr("This development build is 'work in progress' and may not be compatible with other versions of the game. Some features might be broken or incomplete. Use at your own risk!"));
-
-}
-
-QString PageMain::randomTip() const
-{
-    QStringList Tips;
-        Tips << tr("Simply pick the same color as a friend to play together as a team. Each of you will still control his or her own hedgehogs but they'll win or lose together.", "Tips");
-        Tips << tr("Some weapons might do only low damage but they can be a lot more devastating in the right situation. Try to use the Desert Eagle to knock multiple hedgehogs into the water.", "Tips");
-        Tips << tr("If you're unsure what to do and don't want to waste ammo, skip one round. But don't let too much time pass as there will be Sudden Death!", "Tips");
-        Tips << tr("Want to save ropes? Release the rope in mid air and then shoot again. As long as you don't touch the ground you'll reuse your rope without wasting ammo!", "Tips");
-        Tips << tr("If you'd like to keep others from using your preferred nickname on the official server, register an account at http://www.hedgewars.org/.", "Tips");
-        Tips << tr("You're bored of default gameplay? Try one of the missions - they'll offer different gameplay depending on the one you picked.", "Tips");
-        Tips << tr("By default the game will always record the last game played as a demo. Select 'Local Game' and pick the 'Demos' button on the lower right corner to play or manage them.", "Tips");
-        Tips << tr("Hedgewars is Open Source and Freeware we create in our spare time. If you've got problems, ask on our forums but please don't expect 24/7 support!", "Tips");
-        Tips << tr("Hedgewars is Open Source and Freeware we create in our spare time. If you like it, help us with a small donation or contribute your own work!", "Tips");
-        Tips << tr("Hedgewars is Open Source and Freeware we create in our spare time. Share it with your family and friends as you like!", "Tips");
-        Tips << tr("Hedgewars is Open Source and Freeware we create in our spare time. If someone sold you the game, you should try get a refund!", "Tips");
-        Tips << tr("From time to time there will be official tournaments. Upcoming events will be announced at http://www.hedgewars.org/ some days in advance.", "Tips");
-        Tips << tr("Hedgewars is available in many languages. If the translation in your language seems to be missing or outdated, feel free to contact us!", "Tips");
-        Tips << tr("Hedgewars can be run on lots of different operating systems including Microsoft Windows, Mac OS X and Linux.", "Tips");
-        Tips << tr("Always remember you're able to set up your own games in local and network/online play. You're not restricted to the 'Simple Game' option.", "Tips");
-        Tips << tr("Connect one or more gamepads before starting the game to be able to assign their controls to your teams.", "Tips");
-        Tips << tr("Create an account on %1 to keep others from using your most favourite nickname while playing on the official server.", "Tips").arg("<a href=\"http://www.hedgewars.org/\">http://www.hedgewars.org/</a>");
-        Tips << tr("While playing you should give yourself a short break at least once an hour.", "Tips");
-        Tips << tr("If your graphics card isn't able to provide hardware accelerated OpenGL, try to enable the low quality mode to improve performance.", "Tips");
-        Tips << tr("If your graphics card isn't able to provide hardware accelerated OpenGL, try to update the associated drivers.", "Tips");
-        Tips << tr("We're open to suggestions and constructive feedback. If you don't like something or got a great idea, let us know!", "Tips");
-        Tips << tr("Especially while playing online be polite and always remember there might be some minors playing with or against you as well!", "Tips");
-        Tips << tr("Special game modes such as 'Vampirism' or 'Karma' allow you to develop completely new tactics. Try them in a custom game!", "Tips");
-        Tips << tr("The Windows version of Hedgewars supports Xfire. Make sure to add Hedgewars to its game list so your friends can see you playing.", "Tips");
-        Tips << tr("You should never install Hedgewars on computers you don't own (school, university, work, etc.). Please ask the responsible person instead!", "Tips");
-        Tips << tr("Hedgewars can be perfect for short games during breaks. Just ensure you don't add too many hedgehogs or use an huge map. Reducing time and health might help as well.", "Tips");
-        Tips << tr("No hedgehogs were harmed in making this game.", "Tips");
-        Tips << tr("There are three different jumps available. Tap [high jump] twice to do a very high/backwards jump.", "Tips");
-        Tips << tr("Afraid of falling off a cliff? Hold down [precise] to turn [left] or [right] without actually moving.", "Tips");
-        Tips << tr("Some weapons require special strategies or just lots of training, so don't give up on a particular tool if you miss an enemy once.", "Tips");
-        Tips << tr("Most weapons won't work once they touch the water. The Homing Bee as well as the Cake are exceptions to this.", "Tips");
-        Tips << tr("The Old Limbuger only causes a small explosion. However the wind affected smelly cloud can poison lots of hogs at once.", "Tips");
-        Tips << tr("The Piano Strike is the most damaging air strike. You'll lose the hedgehog performing it, so there's a huge downside as well.", "Tips");
-        Tips << tr("The Homing Bee can be tricky to use. Its turn radius depends on its velocity, so try to not use full power.", "Tips");
-        Tips << tr("Sticky Mines are a perfect tool to create small chain reactions knocking enemy hedgehogs into dire situations ... or water.", "Tips");
-        Tips << tr("The Hammer is most effective when used on bridges or girders. Hit hogs will just break through the ground.", "Tips");
-        Tips << tr("If you're stuck behind an enemy hedgehog, use the Hammer to free yourself without getting damaged by an explosion.", "Tips");
-        Tips << tr("The Cake's maximum walking distance depends on the ground it has to pass. Use [attack] to detonate it early.", "Tips");
-        Tips << tr("The Flame Thrower is a weapon but it can be used for tunnel digging as well.", "Tips");
-        Tips << tr("Use the Molotov or Flame Thrower to temporary keep hedgehogs from passing terrain such as tunnels or platforms.", "Tips");
-        Tips << tr("Want to know who's behind the game? Click on the Hedgewars logo in the main menu to see the credits.", "Tips");
-        Tips << tr("Like Hedgewars? Become a fan on %1 or follow us on %2!", "Tips").arg("<a href=\"http://www.facebook.com/Hedgewars\">Facebook</a>").arg("<a href=\"http://twitter.com/hedgewars\">Twitter</a>");
-        Tips << tr("Feel free to draw your own graves, hats, flags or even maps and themes! But note that you'll have to share them somewhere to use them online.", "Tips");
-        Tips << tr("Really want to wear a specific hat? Donate to us and receive an exclusive hat of your choice!", "Tips");
-        // The following tip will require links to app store entries first.
-        //Tips << tr("Want to play Hedgewars any time? Grab the Mobile version for %1 and %2.", "Tips").arg("").arg("");
-        // the ios version is located here: http://itunes.apple.com/us/app/hedgewars/id391234866
-        Tips << tr("Keep your video card drivers up to date to avoid issues playing the game.", "Tips");
-        Tips << tr("You're able to associate Hedgewars related files (savegames and demo recordings) with the game to launch them right from your favorite file or internet browser.", "Tips");
-#ifdef _WIN32
-        Tips << tr("You can find your Hedgewars configuration files under \"My Documents\\Hedgewars\". Create backups or take the files with you, but don't edit them by hand.", "Tips");
-#elif defined __APPLE__
-        Tips << tr("You can find your Hedgewars configuration files under \"Library/Application Support/Hedgewars\" in your home directory. Create backups or take the files with you, but don't edit them by hand.", "Tips");
-#else
-        Tips << tr("You can find your Hedgewars configuration files under \".hedgewars\" in your home directory. Create backups or take the files with you, but don't edit them by hand.", "Tips");
-#endif
-
-        return Tips[QTime(0, 0, 0).secsTo(QTime::currentTime()) % Tips.length()];
-}
--- a/QTfrontend/pagemain.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef PAGE_MAIN_H
-#define PAGE_MAIN_H
-
-#include "AbstractPage.h"
-
-class PageMain : public AbstractPage
-{
-    Q_OBJECT
-
-public:
-    PageMain(QWidget * parent = 0);
-
-    QPushButton * BtnSinglePlayer;
-    QPushButton * BtnNet;
-    QPushButton * BtnSetup;
-    QPushButton * BtnInfo;
-    QPushButton * BtnDataDownload;
-    QLabel * mainNote;
-
-private:
-    QLayout * bodyLayoutDefinition();
-    QLayout * footerLayoutDefinition();
-    void connectSignals();
-
-    QString randomTip() const;
-};
-
-#endif
-
--- a/QTfrontend/pagemultiplayer.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
- 
-#include <QGridLayout>
-#include <QPushButton>
-
-#include "pagemultiplayer.h"
-#include "gamecfgwidget.h"
-#include "teamselect.h"
-
-QLayout * PageMultiplayer::bodyLayoutDefinition()
-{
-    QGridLayout * pageLayout = new QGridLayout();
-
-    gameCFG = new GameCFGWidget(this);
-    pageLayout->addWidget(gameCFG, 0, 0, 1, 2);
-
-    btnSetup = new QPushButton(this);
-    btnSetup->setText(QPushButton::tr("Setup"));
-    pageLayout->addWidget(btnSetup, 1, 0, 1, 2);
-
-    pageLayout->setRowStretch(2, 1);
-
-    teamsSelect = new TeamSelWidget(this);
-    pageLayout->addWidget(teamsSelect, 0, 2, 3, 2);
-
-    BtnStartMPGame = addButton(tr("Start"), pageLayout, 3, 3);
-
-    return pageLayout;
-}
-
-void PageMultiplayer::connectSignals()
-{
-    PageMultiplayer::connect(btnSetup, SIGNAL(clicked()), this, SIGNAL(SetupClicked()));
-}
-
-PageMultiplayer::PageMultiplayer(QWidget* parent) : AbstractPage(parent)
-{
-    initPage();
-}
--- a/QTfrontend/pagemultiplayer.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef PAGE_MULTIPLAYER_H
-#define PAGE_MULTIPLAYER_H
-
-#include "AbstractPage.h"
-
-class GameCFGWidget;
-class TeamSelWidget;
-
-class PageMultiplayer : public AbstractPage
-{
-    Q_OBJECT
-
-public:
-    PageMultiplayer(QWidget* parent = 0);
-
-    GameCFGWidget *gameCFG;
-    TeamSelWidget *teamsSelect;
-    QPushButton *BtnStartMPGame;
-
-signals:
-    void SetupClicked();
-
-private:
-    QLayout * bodyLayoutDefinition();
-    void connectSignals();
-
-    QPushButton * btnSetup;
-};
-
-#endif
-
-
--- a/QTfrontend/pagenet.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,109 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QGridLayout>
-#include <QPushButton>
-#include <QGroupBox>
-#include <QTableView>
-#include <QMessageBox>
-#include <QHeaderView>
-
-#include "pagenet.h"
-#include "hwconsts.h"
-#include "netudpwidget.h"
-
-QLayout * PageNet::bodyLayoutDefinition()
-{
-    QGridLayout * pageLayout = new QGridLayout();
-
-    pageLayout->setColumnStretch(0, 1);
-    pageLayout->setColumnStretch(1, 1);
-    pageLayout->setColumnStretch(2, 1);
-
-    BtnNetSvrStart = new QPushButton(this);
-    BtnNetSvrStart->setFont(*font14);
-    BtnNetSvrStart->setText(QPushButton::tr("Start server"));
-    BtnNetSvrStart->setVisible(haveServer);
-    pageLayout->addWidget(BtnNetSvrStart, 4, 2);
-
-    ConnGroupBox = new QGroupBox(this);
-    ConnGroupBox->setTitle(QGroupBox::tr("Net game"));
-    pageLayout->addWidget(ConnGroupBox, 2, 0, 1, 3);
-    GBClayout = new QGridLayout(ConnGroupBox);
-    GBClayout->setColumnStretch(0, 1);
-    GBClayout->setColumnStretch(1, 1);
-    GBClayout->setColumnStretch(2, 1);
-
-    BtnNetConnect = new QPushButton(ConnGroupBox);
-    BtnNetConnect->setFont(*font14);
-    BtnNetConnect->setText(QPushButton::tr("Connect"));
-    GBClayout->addWidget(BtnNetConnect, 2, 2);
-
-    tvServersList = new QTableView(ConnGroupBox);
-    tvServersList->setSelectionBehavior(QAbstractItemView::SelectRows);
-    GBClayout->addWidget(tvServersList, 1, 0, 1, 3);
-
-    BtnUpdateSList = new QPushButton(ConnGroupBox);
-    BtnUpdateSList->setFont(*font14);
-    BtnUpdateSList->setText(QPushButton::tr("Update"));
-    GBClayout->addWidget(BtnUpdateSList, 2, 0);
-
-    BtnSpecifyServer = new QPushButton(ConnGroupBox);
-    BtnSpecifyServer->setFont(*font14);
-    BtnSpecifyServer->setText(QPushButton::tr("Specify"));
-    GBClayout->addWidget(BtnSpecifyServer, 2, 1);
-
-    return pageLayout;
-}
-
-void PageNet::connectSignals()
-{
-    connect(BtnNetConnect, SIGNAL(clicked()), this, SLOT(slotConnect()));
-}
-
-PageNet::PageNet(QWidget* parent) : AbstractPage(parent)
-{
-    initPage();
-}
-
-void PageNet::updateServersList()
-{
-    tvServersList->setModel(new HWNetUdpModel(tvServersList));
-
-    tvServersList->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch);
-
-    static_cast<HWNetServersModel *>(tvServersList->model())->updateList();
-
-    connect(BtnUpdateSList, SIGNAL(clicked()), static_cast<HWNetServersModel *>(tvServersList->model()), SLOT(updateList()));
-    connect(tvServersList, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(slotConnect()));
-}
-
-void PageNet::slotConnect()
-{
-    HWNetServersModel * model = static_cast<HWNetServersModel *>(tvServersList->model());
-    QModelIndex mi = tvServersList->currentIndex();
-    if(!mi.isValid())
-    {
-        QMessageBox::information(this, tr("Error"), tr("Please select server from the list above"));
-        return;
-    }
-    QString host = model->index(mi.row(), 1).data().toString();
-    quint16 port = model->index(mi.row(), 2).data().toUInt();
-
-    emit connectClicked(host, port);
-}
--- a/QTfrontend/pagenet.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef PAGE_NET_H
-#define PAGE_NET_H
-
-#include "AbstractPage.h"
-
-class PageNet : public AbstractPage
-{
-    Q_OBJECT
-
-public:
-    PageNet(QWidget* parent = 0);
-
-    QPushButton* BtnUpdateSList;
-    QTableView * tvServersList;
-    QPushButton * BtnNetConnect;
-    QPushButton * BtnNetSvrStart;
-    QPushButton * BtnSpecifyServer;
-
-public slots:
-    void updateServersList();
-
-signals:
-    void connectClicked(const QString & host, quint16 port);
-
-private:
-    QLayout * bodyLayoutDefinition();
-    void connectSignals();
-
-    QGroupBox * ConnGroupBox;
-    QGridLayout * GBClayout;
-
-private slots:
-    void slotConnect();
-};
-
-#endif
-
--- a/QTfrontend/pagenetgame.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,142 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QGridLayout>
-#include <QPushButton>
-#include <QAction>
-#include <QMenu>
-#include <QMessageBox>
-
-#include "pagenetgame.h"
-#include "gamecfgwidget.h"
-#include "teamselect.h"
-#include "chatwidget.h"
-
-QLayout * PageNetGame::bodyLayoutDefinition()
-{
-    QGridLayout * pageLayout = new QGridLayout();
-    pageLayout->setSizeConstraint(QLayout::SetMinimumSize);
-    //pageLayout->setSpacing(1);
-    pageLayout->setColumnStretch(0, 50);
-    pageLayout->setColumnStretch(1, 50);
-
-    // chatwidget
-    pChatWidget = new HWChatWidget(this, m_gameSettings, m_sdli, true);
-    pChatWidget->setShowReady(true); // show status bulbs by default
-    pChatWidget->setShowFollow(false); // don't show follow in nicks' context menus
-    pageLayout->addWidget(pChatWidget, 2, 0, 1, 2);
-    pageLayout->setRowStretch(1, 100);
-    pageLayout->setRowStretch(2, 100);
-
-    pGameCFG = new GameCFGWidget(this);
-    pageLayout->addWidget(pGameCFG, 0, 0);
-
-    btnSetup = new QPushButton(this);
-    btnSetup->setText(QPushButton::tr("Setup"));
-    pageLayout->addWidget(btnSetup, 1, 0);
-
-    pNetTeamsWidget = new TeamSelWidget(this);
-    pNetTeamsWidget->setAcceptOuter(true);
-    pageLayout->addWidget(pNetTeamsWidget, 0, 1, 2, 1);
-
-    return pageLayout;
-}
-
-QLayout * PageNetGame::footerLayoutDefinition()
-{
-    QHBoxLayout * bottomLayout = new QHBoxLayout;
-
-    leRoomName = new QLineEdit(this);
-    leRoomName->setMaxLength(60);
-    leRoomName->setMinimumWidth(200);
-    leRoomName->setMaximumWidth(400);
-
-    BtnGo = new QPushButton(this);
-    BtnGo->setToolTip(QPushButton::tr("Ready"));
-    BtnGo->setIcon(QIcon(":/res/lightbulb_off.png"));
-    BtnGo->setIconSize(QSize(25, 34));
-    BtnGo->setMinimumWidth(50);
-    BtnGo->setMinimumHeight(50);
-
-
-    bottomLayout->addWidget(leRoomName);
-    BtnUpdate = addButton(QAction::tr("Update"), bottomLayout, 1, false);
-    bottomLayout->addWidget(BtnGo);
-
-    BtnMaster = addButton(tr("Control"), bottomLayout, 3);
-    bottomLayout->insertStretch(3, 100);
-
-    BtnStart = addButton(QAction::tr("Start"), bottomLayout, 3);
-
-    return bottomLayout;
-}
-
-void PageNetGame::connectSignals()
-{
-    connect(btnSetup, SIGNAL(clicked()), this, SIGNAL(SetupClicked()));
-
-    connect(BtnUpdate, SIGNAL(clicked()), this, SLOT(onUpdateClick()));
-}
-
-PageNetGame::PageNetGame(QWidget* parent, QSettings * gameSettings, SDLInteraction * sdli) : AbstractPage(parent)
-{
-    m_gameSettings = gameSettings;
-    m_sdli = sdli;
-
-    initPage();
-
-    QMenu * menu = new QMenu(BtnMaster);
-
-    restrictJoins = new QAction(QAction::tr("Restrict Joins"), menu);
-    restrictJoins->setCheckable(true);
-    restrictTeamAdds = new QAction(QAction::tr("Restrict Team Additions"), menu);
-    restrictTeamAdds->setCheckable(true);
-    //menu->addAction(startGame);
-    menu->addAction(restrictJoins);
-    menu->addAction(restrictTeamAdds);
-
-    BtnMaster->setMenu(menu);
-
-}
-
-void PageNetGame::setReadyStatus(bool isReady)
-{
-    if(isReady)
-        BtnGo->setIcon(QIcon(":/res/lightbulb_on.png"));
-    else
-        BtnGo->setIcon(QIcon(":/res/lightbulb_off.png"));
-}
-
-void PageNetGame::onUpdateClick()
-{
-    if (leRoomName->text().size())
-        emit askForUpdateRoomName(leRoomName->text());
-    else
-        QMessageBox::critical(this,
-                tr("Error"),
-                tr("Please enter room name"),
-                tr("OK"));
-}
-
-void PageNetGame::setMasterMode(bool isMaster)
-{
-    BtnMaster->setVisible(isMaster);
-    BtnStart->setVisible(isMaster);
-    BtnUpdate->setVisible(isMaster);
-    leRoomName->setVisible(isMaster);
-}
--- a/QTfrontend/pagenetgame.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,71 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef PAGE_NETGAME_H
-#define PAGE_NETGAME_H
-
-#include "AbstractPage.h"
-#include "SDLs.h"
-
-class HWChatWidget;
-class TeamSelWidget;
-class GameCFGWidget;
-
-class PageNetGame : public AbstractPage
-{
-    Q_OBJECT
-
-public:
-    PageNetGame(QWidget* parent, QSettings * gameSettings, SDLInteraction * sdli);
-
-    QPushButton *BtnGo;
-    QPushButton *BtnMaster;
-    QPushButton *BtnStart;
-    QPushButton *BtnUpdate;
-
-    QLineEdit * leRoomName;
-
-    QAction * restrictJoins;
-    QAction * restrictTeamAdds;
-
-    HWChatWidget* pChatWidget;
-
-    TeamSelWidget* pNetTeamsWidget;
-    GameCFGWidget* pGameCFG;
-
-public slots:
-    void setReadyStatus(bool isReady);
-    void onUpdateClick();
-    void setMasterMode(bool isMaster);
-
-signals:
-    void SetupClicked();
-    void askForUpdateRoomName(const QString &);
-
-private:
-    QLayout * bodyLayoutDefinition();
-    QLayout * footerLayoutDefinition();
-    void connectSignals();
-
-    QSettings * m_gameSettings;
-    SDLInteraction * m_sdli;
-
-    QPushButton * btnSetup;
-};
-
-#endif
--- a/QTfrontend/pagenetserver.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QGridLayout>
-#include <QHBoxLayout>
-#include <QVBoxLayout>
-#include <QPushButton>
-#include <QGroupBox>
-#include <QLabel>
-#include <QLineEdit>
-#include <QSpinBox>
-
-#include "pagenetserver.h"
-
-QLayout * PageNetServer::bodyLayoutDefinition()
-{
-    QVBoxLayout * pageLayout = new QVBoxLayout();
-
-    QWidget * wg = new QWidget(this);
-    pageLayout->addWidget(wg);
-
-    QGridLayout * wgLayout = new QGridLayout(wg);
-    wgLayout->setColumnStretch(0, 1);
-    wgLayout->setColumnStretch(1, 3);
-    wgLayout->setColumnStretch(2, 1);
-
-    wgLayout->setRowStretch(0, 0);
-    wgLayout->setRowStretch(1, 1);
-
-    QGroupBox * gb = new QGroupBox(wg);
-    wgLayout->addWidget(gb, 0, 1);
-
-    QGridLayout * gbLayout = new QGridLayout(gb);
-
-    labelSD = new QLabel(gb);
-    labelSD->setText(QLabel::tr("Server name:"));
-    gbLayout->addWidget(labelSD, 0, 0);
-
-    leServerDescr = new QLineEdit(gb);
-    gbLayout->addWidget(leServerDescr, 0, 1);
-
-    labelPort = new QLabel(gb);
-    labelPort->setText(QLabel::tr("Server port:"));
-    gbLayout->addWidget(labelPort, 1, 0);
-
-    sbPort = new QSpinBox(gb);
-    sbPort->setMinimum(0);
-    sbPort->setMaximum(65535);
-    gbLayout->addWidget(sbPort, 1, 1);
-
-    BtnDefault = new QPushButton(gb);
-    BtnDefault->setText(QPushButton::tr("default"));
-    gbLayout->addWidget(BtnDefault, 1, 2);
-
-    return pageLayout;
-}
-
-QLayout * PageNetServer::footerLayoutDefinition()
-{
-    QHBoxLayout * bottomLayout = new QHBoxLayout();
-
-    BtnStart = new QPushButton(this);
-    BtnStart->setFont(*font14);
-    BtnStart->setText(QPushButton::tr("Start"));
-
-    bottomLayout->addStretch();
-    bottomLayout->addWidget(BtnStart);
-
-    return bottomLayout;
-}
-
-void PageNetServer::connectSignals()
-{
-    connect(BtnDefault, SIGNAL(clicked()), this, SLOT(setDefaultPort()));
-}
-
-PageNetServer::PageNetServer(QWidget* parent) : AbstractPage(parent)
-{
-    initPage();
-}
-
-void PageNetServer::setDefaultPort()
-{
-    sbPort->setValue(46631);
-}
--- a/QTfrontend/pagenetserver.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef PAGE_NETSERVER_H
-#define PAGE_NETSERVER_H
-
-#include "AbstractPage.h"
-
-class PageNetServer : public AbstractPage
-{
-    Q_OBJECT
-
-public:
-    PageNetServer(QWidget* parent = 0);
-
-    QPushButton *BtnStart;
-    QPushButton *BtnDefault;
-    QLabel *labelSD;
-    QLineEdit *leServerDescr;
-    QLabel *labelPort;
-    QSpinBox *sbPort;
-
-protected:
-    QLayout * bodyLayoutDefinition();
-    QLayout * footerLayoutDefinition();
-    void connectSignals();
-
-private slots:
-    void setDefaultPort();
-};
-
-#endif
--- a/QTfrontend/pagenettype.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QGridLayout>
-#include <QPushButton>
-
-#include "pagenettype.h"
-
-
-QLayout * PageNetType::bodyLayoutDefinition()
-{
-    QGridLayout * pageLayout = new QGridLayout();
-    pageLayout->setRowStretch(0, 10);
-    pageLayout->setRowStretch(3, 10);
-
-    pageLayout->setColumnStretch(1, 10);
-    pageLayout->setColumnStretch(2, 20);
-    pageLayout->setColumnStretch(3, 10);
-
-    BtnLAN = addButton(tr("LAN game"), pageLayout, 1, 2);
-    BtnOfficialServer = addButton(tr("Official server"), pageLayout, 2, 2);
-
-    // hack: temporary deactivated - requires server modifications that aren't backward compatible (yet)
-    //BtnOfficialServer->setEnabled(false);
-
-    return pageLayout;
-}
-
-PageNetType::PageNetType(QWidget* parent) : AbstractPage(parent)
-{
-    initPage();
-}
--- a/QTfrontend/pagenettype.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef PAGE_NETTYPE_H
-#define PAGE_NETTYPE_H
-
-#include "AbstractPage.h"
-
-class PageNetType : public AbstractPage
-{
-    Q_OBJECT
-
-public:
-    PageNetType(QWidget* parent = 0);
-
-    QPushButton * BtnLAN;
-    QPushButton * BtnOfficialServer;
-
-protected:
-    QLayout * bodyLayoutDefinition();
-};
-
-#endif
--- a/QTfrontend/pageoptions.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,492 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QGridLayout>
-#include <QHBoxLayout>
-#include <QPushButton>
-#include <QGroupBox>
-#include <QComboBox>
-#include <QCheckBox>
-#include <QLabel>
-#include <QLineEdit>
-#include <QSpinBox>
-#include <QTextBrowser>
-#include <QTableWidget>
-#include <QSlider>
-
-#include "pageoptions.h"
-#include "hwconsts.h"
-#include "fpsedit.h"
-#include "igbox.h"
-
-// TODO cleanup
-QLayout * PageOptions::bodyLayoutDefinition()
-{
-    QGridLayout * pageLayout = new QGridLayout();
-    pageLayout->setColumnStretch(0, 100);
-    pageLayout->setColumnStretch(1, 100);
-    pageLayout->setColumnStretch(2, 100);
-    pageLayout->setRowStretch(0, 0);
-    //pageLayout->setRowStretch(1, 100);
-    pageLayout->setRowStretch(2, 0);
-    pageLayout->setContentsMargins(7, 7, 7, 0);
-    pageLayout->setSpacing(0);
-
-
-    QGroupBox * gbTwoBoxes = new QGroupBox(this);
-    pageLayout->addWidget(gbTwoBoxes, 0, 0, 1, 3);
-    QGridLayout * gbTBLayout = new QGridLayout(gbTwoBoxes);
-    gbTBLayout->setMargin(0);
-    gbTBLayout->setSpacing(0);
-    gbTBLayout->setAlignment(Qt::AlignTop | Qt::AlignLeft);
-
-    QPixmap pmNew(":/res/new.png");
-    QPixmap pmEdit(":/res/edit.png");
-    QPixmap pmDelete(":/res/delete.png");
-
-        {
-            teamsBox = new IconedGroupBox(this);
-            //teamsBox->setContentTopPadding(0);
-            //teamsBox->setAttribute(Qt::WA_PaintOnScreen, true);
-            teamsBox->setIcon(QIcon(":/res/teamicon.png"));
-            teamsBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
-            teamsBox->setTitle(QGroupBox::tr("Teams"));
-
-            QGridLayout * GBTlayout = new QGridLayout(teamsBox);
-
-            CBTeamName = new QComboBox(teamsBox);
-            GBTlayout->addWidget(CBTeamName, 0, 0);
-
-            BtnNewTeam = new QPushButton(teamsBox);
-            BtnNewTeam->setToolTip(tr("New team"));
-            BtnNewTeam->setIconSize(pmNew.size());
-            BtnNewTeam->setIcon(pmNew);
-            BtnNewTeam->setMaximumWidth(pmNew.width() + 6);
-            connect(BtnNewTeam, SIGNAL(clicked()), this, SIGNAL(newTeamRequested()));
-            GBTlayout->addWidget(BtnNewTeam, 0, 1);
-
-            BtnEditTeam = new QPushButton(teamsBox);
-            BtnEditTeam->setToolTip(tr("Edit team"));
-            BtnEditTeam->setIconSize(pmEdit.size());
-            BtnEditTeam->setIcon(pmEdit);
-            BtnEditTeam->setMaximumWidth(pmEdit.width() + 6);
-            connect(BtnEditTeam, SIGNAL(clicked()), this, SLOT(requestEditSelectedTeam()));
-            GBTlayout->addWidget(BtnEditTeam, 0, 2);
-
-            BtnDeleteTeam = new QPushButton(teamsBox);
-            BtnDeleteTeam->setToolTip(tr("Delete team"));
-            BtnDeleteTeam->setIconSize(pmDelete.size());
-            BtnDeleteTeam->setIcon(pmDelete);
-            BtnDeleteTeam->setMaximumWidth(pmDelete.width() + 6);
-            connect(BtnDeleteTeam, SIGNAL(clicked()), this, SLOT(requestDeleteSelectedTeam()));
-            GBTlayout->addWidget(BtnDeleteTeam, 0, 3);
-
-            LblNoEditTeam = new QLabel(teamsBox);
-            LblNoEditTeam->setText(tr("You can't edit teams from team selection. Go back to main menu to add, edit or delete teams."));
-            LblNoEditTeam->setWordWrap(true);
-            LblNoEditTeam->setVisible(false);
-            GBTlayout->addWidget(LblNoEditTeam, 0, 0);
-
-            gbTBLayout->addWidget(teamsBox, 0, 0);
-        }
-
-        {
-            IconedGroupBox* groupWeapons = new IconedGroupBox(this);
-            
-            //groupWeapons->setContentTopPadding(0);
-            //groupWeapons->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
-            groupWeapons->setIcon(QIcon(":/res/weaponsicon.png"));
-            groupWeapons->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
-            groupWeapons->setTitle(QGroupBox::tr("Schemes and Weapons"));
-            QGridLayout * WeaponsLayout = new QGridLayout(groupWeapons);
-
-            QLabel* SchemeLabel = new QLabel(groupWeapons);
-            SchemeLabel->setText(QLabel::tr("Game scheme"));
-            WeaponsLayout->addWidget(SchemeLabel, 1, 0);
-
-            SchemesName = new QComboBox(groupWeapons);
-            WeaponsLayout->addWidget(SchemesName, 1, 1);
-
-            SchemeNew = new QPushButton(groupWeapons);
-            SchemeNew->setToolTip(tr("New scheme"));
-            SchemeNew->setIconSize(pmNew.size());
-            SchemeNew->setIcon(pmNew);
-            SchemeNew->setMaximumWidth(pmNew.width() + 6);
-            WeaponsLayout->addWidget(SchemeNew, 1, 2);
-
-            SchemeEdit = new QPushButton(groupWeapons);
-            SchemeEdit->setToolTip(tr("Edit scheme"));
-            SchemeEdit->setIconSize(pmEdit.size());
-            SchemeEdit->setIcon(pmEdit);
-            SchemeEdit->setMaximumWidth(pmEdit.width() + 6);
-            WeaponsLayout->addWidget(SchemeEdit, 1, 3);
-
-            SchemeDelete = new QPushButton(groupWeapons);
-            SchemeDelete->setToolTip(tr("Delete scheme"));
-            SchemeDelete->setIconSize(pmDelete.size());
-            SchemeDelete->setIcon(pmDelete);
-            SchemeDelete->setMaximumWidth(pmDelete.width() + 6);
-            WeaponsLayout->addWidget(SchemeDelete, 1, 4);
-
-            QLabel* WeaponLabel = new QLabel(groupWeapons);
-            WeaponLabel->setText(QLabel::tr("Weapons"));
-            WeaponsLayout->addWidget(WeaponLabel, 2, 0);
-
-            WeaponsName = new QComboBox(groupWeapons);
-            WeaponsLayout->addWidget(WeaponsName, 2, 1);
-
-            WeaponNew = new QPushButton(groupWeapons);
-            WeaponNew->setToolTip(tr("New weapon set"));
-            WeaponNew->setIconSize(pmNew.size());
-            WeaponNew->setIcon(pmNew);
-            WeaponNew->setMaximumWidth(pmNew.width() + 6);
-            WeaponsLayout->addWidget(WeaponNew, 2, 2);
-
-            WeaponEdit = new QPushButton(groupWeapons);
-            WeaponEdit->setToolTip(tr("Edit weapon set"));
-            WeaponEdit->setIconSize(pmEdit.size());
-            WeaponEdit->setIcon(pmEdit);
-            WeaponEdit->setMaximumWidth(pmEdit.width() + 6);
-            WeaponsLayout->addWidget(WeaponEdit, 2, 3);
-
-            WeaponDelete = new QPushButton(groupWeapons);
-            WeaponDelete->setToolTip(tr("Delete weapon set"));
-            WeaponDelete->setIconSize(pmDelete.size());
-            WeaponDelete->setIcon(pmDelete);
-            WeaponDelete->setMaximumWidth(pmDelete.width() + 6);
-            WeaponsLayout->addWidget(WeaponDelete, 2, 4);
-
-            WeaponTooltip = new QCheckBox(this);
-            WeaponTooltip->setText(QCheckBox::tr("Show ammo menu tooltips"));
-            WeaponsLayout->addWidget(WeaponTooltip, 3, 0, 1, 4);
-
-            gbTBLayout->addWidget(groupWeapons, 1, 0);
-        }
-
-        {
-            IconedGroupBox* groupMisc = new IconedGroupBox(this);
-            //groupMisc->setContentTopPadding(0);
-            groupMisc->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
-            groupMisc->setIcon(QIcon(":/res/miscicon.png"));
-            //groupMisc->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
-            groupMisc->setTitle(QGroupBox::tr("Misc"));
-            QGridLayout * MiscLayout = new QGridLayout(groupMisc);
-
-            labelNN = new QLabel(groupMisc);
-            labelNN->setText(QLabel::tr("Net nick"));
-            MiscLayout->addWidget(labelNN, 0, 0);
-
-            editNetNick = new QLineEdit(groupMisc);
-            editNetNick->setMaxLength(20);
-            editNetNick->setText(QLineEdit::tr("unnamed"));
-            connect(editNetNick, SIGNAL(editingFinished()), this, SLOT(trimNetNick()));
-            MiscLayout->addWidget(editNetNick, 0, 1);
-            
-            labelNetPassword = new QLabel(groupMisc);
-            labelNetPassword->setText(QLabel::tr("Password"));
-            MiscLayout->addWidget(labelNetPassword, 1, 0);
-            
-            editNetPassword = new QLineEdit(groupMisc);
-            editNetPassword->setEchoMode(QLineEdit::Password);
-            MiscLayout->addWidget(editNetPassword, 1, 1);
-
-            QLabel *labelLanguage = new QLabel(groupMisc);
-            labelLanguage->setText(QLabel::tr("Locale") + " *");
-            MiscLayout->addWidget(labelLanguage, 2, 0);
-
-            CBLanguage = new QComboBox(groupMisc);
-            QDir tmpdir;
-            tmpdir.cd(cfgdir->absolutePath());
-            tmpdir.cd("Data/Locale");
-            tmpdir.setFilter(QDir::Files);
-            QStringList locs = tmpdir.entryList(QStringList("hedgewars_*.qm"));
-            CBLanguage->addItem(QComboBox::tr("(System default)"), QString(""));
-            for(int i = 0; i < locs.count(); i++)
-            {
-                QLocale loc(locs[i].replace(QRegExp("hedgewars_(.*)\\.qm"), "\\1"));
-                CBLanguage->addItem(QLocale::languageToString(loc.language()) + " (" + QLocale::countryToString(loc.country()) + ")", loc.name());
-            }
-
-            tmpdir.cd(datadir->absolutePath());
-            tmpdir.cd("Locale");
-            tmpdir.setFilter(QDir::Files);
-            QStringList tmplist = tmpdir.entryList(QStringList("hedgewars_*.qm"));
-            for(int i = 0; i < tmplist.count(); i++)
-            {
-                if (locs.contains(tmplist[i])) continue;
-                QLocale loc(tmplist[i].replace(QRegExp("hedgewars_(.*)\\.qm"), "\\1"));
-                CBLanguage->addItem(QLocale::languageToString(loc.language()) + " (" + QLocale::countryToString(loc.country()) + ")", loc.name());
-            }
-
-            MiscLayout->addWidget(CBLanguage, 2, 1);
-
-            CBAltDamage = new QCheckBox(groupMisc);
-            CBAltDamage->setText(QCheckBox::tr("Alternative damage show"));
-            MiscLayout->addWidget(CBAltDamage, 3, 0, 1, 2);
-
-            CBNameWithDate = new QCheckBox(groupMisc);
-            CBNameWithDate->setText(QCheckBox::tr("Append date and time to record file name"));
-            MiscLayout->addWidget(CBNameWithDate, 4, 0, 1, 2);
-
-            BtnAssociateFiles = new QPushButton(groupMisc);
-            BtnAssociateFiles->setText(QPushButton::tr("Associate file extensions"));
-            BtnAssociateFiles->setEnabled(!custom_data && !custom_config);
-            MiscLayout->addWidget(BtnAssociateFiles, 5, 0, 1, 2);
-
-#ifdef __APPLE__
-#ifdef SPARKLE_ENABLED
-            CBAutoUpdate = new QCheckBox(groupMisc);
-            CBAutoUpdate->setText(QCheckBox::tr("Check for updates at startup"));
-            MiscLayout->addWidget(CBAutoUpdate, 6, 0, 1, 3);
-#endif
-#endif
-            gbTBLayout->addWidget(groupMisc, 2, 0);
-        }
-
-        {
-            AGGroupBox = new IconedGroupBox(this);
-            //AGGroupBox->setContentTopPadding(0);
-            AGGroupBox->setIcon(QIcon(":/res/graphicsicon.png"));
-            //AGGroupBox->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
-            AGGroupBox->setTitle(QGroupBox::tr("Audio/Graphic options"));
-
-            QVBoxLayout * GBAlayout = new QVBoxLayout(AGGroupBox);
-            QHBoxLayout * GBAreslayout = new QHBoxLayout(0);
-            QHBoxLayout * GBAstereolayout = new QHBoxLayout(0);
-            QHBoxLayout * GBAqualayout = new QHBoxLayout(0);
-
-            CBFrontendFullscreen = new QCheckBox(AGGroupBox);
-            CBFrontendFullscreen->setText(QCheckBox::tr("Frontend fullscreen"));
-            GBAlayout->addWidget(CBFrontendFullscreen);
-
-            CBFrontendEffects = new QCheckBox(AGGroupBox);
-            CBFrontendEffects->setText(QCheckBox::tr("Frontend effects") + " *");
-            GBAlayout->addWidget(CBFrontendEffects);
-
-            CBEnableFrontendSound = new QCheckBox(AGGroupBox);
-            CBEnableFrontendSound->setText(QCheckBox::tr("Enable frontend sounds"));
-            GBAlayout->addWidget(CBEnableFrontendSound);
-
-            CBEnableFrontendMusic = new QCheckBox(AGGroupBox);
-            CBEnableFrontendMusic->setText(QCheckBox::tr("Enable frontend music"));
-            GBAlayout->addWidget(CBEnableFrontendMusic);
-
-            QFrame * hr = new QFrame(AGGroupBox);
-            hr->setFrameStyle(QFrame::HLine);
-            hr->setLineWidth(3);
-            hr->setFixedHeight(10);
-            GBAlayout->addWidget(hr);
-
-            QLabel * resolution = new QLabel(AGGroupBox);
-            resolution->setText(QLabel::tr("Resolution"));
-            GBAreslayout->addWidget(resolution);
-
-            CBResolution = new QComboBox(AGGroupBox);
-            GBAreslayout->addWidget(CBResolution);
-            GBAlayout->addLayout(GBAreslayout);
-
-            CBFullscreen = new QCheckBox(AGGroupBox);
-            CBFullscreen->setText(QCheckBox::tr("Fullscreen"));
-            GBAlayout->addWidget(CBFullscreen);
-
-            QLabel * quality = new QLabel(AGGroupBox);
-            quality->setText(QLabel::tr("Quality"));
-            quality->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
-            GBAqualayout->addWidget(quality);
-            
-            SLQuality = new QSlider(Qt::Horizontal, AGGroupBox);
-            SLQuality->setTickPosition(QSlider::TicksBelow);
-            SLQuality->setMaximum(5);
-            SLQuality->setMinimum(0);
-            SLQuality->setFixedWidth(150);
-            GBAqualayout->addWidget(SLQuality);
-            GBAlayout->addLayout(GBAqualayout);
-
-            QLabel * stereo = new QLabel(AGGroupBox);
-            stereo->setText(QLabel::tr("Stereo rendering"));
-            GBAstereolayout->addWidget(stereo);
-
-            CBStereoMode = new QComboBox(AGGroupBox);
-            CBStereoMode->addItem(QComboBox::tr("Disabled"));
-            CBStereoMode->addItem(QComboBox::tr("Red/Cyan"));
-            CBStereoMode->addItem(QComboBox::tr("Cyan/Red"));
-            CBStereoMode->addItem(QComboBox::tr("Red/Blue"));
-            CBStereoMode->addItem(QComboBox::tr("Blue/Red"));
-            CBStereoMode->addItem(QComboBox::tr("Red/Green"));
-            CBStereoMode->addItem(QComboBox::tr("Green/Red"));
-            CBStereoMode->addItem(QComboBox::tr("Side-by-side"));
-            CBStereoMode->addItem(QComboBox::tr("Top-Bottom"));
-            CBStereoMode->addItem(QComboBox::tr("Wiggle"));
-            CBStereoMode->addItem(QComboBox::tr("Red/Cyan grayscale"));
-            CBStereoMode->addItem(QComboBox::tr("Cyan/Red grayscale"));
-            CBStereoMode->addItem(QComboBox::tr("Red/Blue grayscale"));
-            CBStereoMode->addItem(QComboBox::tr("Blue/Red grayscale"));
-            CBStereoMode->addItem(QComboBox::tr("Red/Green grayscale"));
-            CBStereoMode->addItem(QComboBox::tr("Green/Red grayscale"));
-            connect(CBStereoMode, SIGNAL(currentIndexChanged(int)), this, SLOT(forceFullscreen(int)));
-
-            GBAstereolayout->addWidget(CBStereoMode);
-            GBAlayout->addLayout(GBAstereolayout);
-
-            hr = new QFrame(AGGroupBox);
-            hr->setFrameStyle(QFrame::HLine);
-            hr->setLineWidth(3);
-            hr->setFixedHeight(10);
-            GBAlayout->addWidget(hr);
-
-            QHBoxLayout * GBAvollayout = new QHBoxLayout(0);
-            QLabel * vol = new QLabel(AGGroupBox);
-            vol->setText(QLabel::tr("Initial sound volume"));
-            GBAvollayout->addWidget(vol);
-            GBAlayout->addLayout(GBAvollayout);
-            volumeBox = new QSpinBox(AGGroupBox);
-            volumeBox->setRange(0, 100);
-            volumeBox->setSingleStep(5);
-            GBAvollayout->addWidget(volumeBox);
-
-            CBEnableSound = new QCheckBox(AGGroupBox);
-            CBEnableSound->setText(QCheckBox::tr("Enable sound"));
-            GBAlayout->addWidget(CBEnableSound);
-
-            CBEnableMusic = new QCheckBox(AGGroupBox);
-            CBEnableMusic->setText(QCheckBox::tr("Enable music"));
-            GBAlayout->addWidget(CBEnableMusic);
-
-            hr = new QFrame(AGGroupBox);
-            hr->setFrameStyle(QFrame::HLine);
-            hr->setLineWidth(3);
-            hr->setFixedHeight(10);
-            GBAlayout->addWidget(hr);
-
-            QHBoxLayout * GBAfpslayout = new QHBoxLayout(0);
-            QLabel * maxfps = new QLabel(AGGroupBox);
-            maxfps->setText(QLabel::tr("FPS limit"));
-            GBAfpslayout->addWidget(maxfps);
-            GBAlayout->addLayout(GBAfpslayout);
-            fpsedit = new FPSEdit(AGGroupBox);
-            GBAfpslayout->addWidget(fpsedit);
-
-            CBShowFPS = new QCheckBox(AGGroupBox);
-            CBShowFPS->setText(QCheckBox::tr("Show FPS"));
-            GBAlayout->addWidget(CBShowFPS);
-
-            hr = new QFrame(AGGroupBox);
-            hr->setFrameStyle(QFrame::HLine);
-            hr->setLineWidth(3);
-            hr->setFixedHeight(10);
-            GBAlayout->addWidget(hr);
-
-            QLabel *restartNote = new QLabel(this);
-            restartNote->setText(QString("* ") + QLabel::tr("Restart game to apply"));
-            restartNote->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
-            GBAlayout->addWidget(restartNote);
-
-            gbTBLayout->addWidget(AGGroupBox, 0, 1, 3, 1);
-        }
-
-    previousQuality = this->SLQuality->value();
-    previousResolutionIndex = this->CBResolution->currentIndex();
-    previousFullscreenValue = this->CBFullscreen->isChecked();
-
-    return pageLayout;
-}
-
-QLayout * PageOptions::footerLayoutDefinition()
-{
-    QHBoxLayout * bottomLayout = new QHBoxLayout();
-    btnSave = addButton(":/res/Save.png", bottomLayout, 0, true);
-    btnSave->setStyleSheet("QPushButton{margin: 24px 0 0 0;}");
-    bottomLayout->setAlignment(btnSave, Qt::AlignRight | Qt::AlignBottom);
-    return bottomLayout;
-}
-
-void PageOptions::connectSignals()
-{
-    connect(CBResolution, SIGNAL(currentIndexChanged(int)), this, SLOT(setResolution(int)));
-    connect(CBFullscreen, SIGNAL(stateChanged(int)), this, SLOT(setFullscreen(int)));
-    connect(SLQuality, SIGNAL(valueChanged(int)), this, SLOT(setQuality(int)));
-}
-
-PageOptions::PageOptions(QWidget* parent) : AbstractPage(parent)
-{
-    initPage();
-}
-
-void PageOptions::forceFullscreen(int index)
-{
-    bool forced = (index == 7 || index == 8 || index == 9);
-
-    if (index != 0) {
-        this->SLQuality->setValue(this->SLQuality->maximum());
-        this->SLQuality->setEnabled(false);
-        this->CBFullscreen->setEnabled(!forced);
-        this->CBFullscreen->setChecked(forced ? true : previousFullscreenValue);
-        this->CBResolution->setCurrentIndex(forced ? 0 : previousResolutionIndex);
-    } else {
-        this->SLQuality->setEnabled(true);
-        this->CBFullscreen->setEnabled(true);
-        this->SLQuality->setValue(previousQuality);
-        this->CBFullscreen->setChecked(previousFullscreenValue);
-        this->CBResolution->setCurrentIndex(previousResolutionIndex);
-    }
-}
-
-void PageOptions::setQuality(int value)
-{
-    int index = this->CBStereoMode->currentIndex();
-    if (index == 0)
-        previousQuality = this->SLQuality->value();
-}
-
-void PageOptions::setFullscreen(int state)
-{
-    int index = this->CBStereoMode->currentIndex();
-    if (index != 7 && index != 8 && index != 9)
-        previousFullscreenValue = this->CBFullscreen->isChecked();
-}
-
-void PageOptions::setResolution(int state)
-{
-    int index = this->CBStereoMode->currentIndex();
-    if (index != 7 && index != 8 && index != 9)
-        previousResolutionIndex = this->CBResolution->currentIndex();
-}
-
-void PageOptions::trimNetNick()
-{
-    editNetNick->setText(editNetNick->text().trimmed());
-}
-
-void PageOptions::requestEditSelectedTeam()
-{
-    emit editTeamRequested(CBTeamName->currentText());
-}
-
-void PageOptions::requestDeleteSelectedTeam()
-{
-    emit deleteTeamRequested(CBTeamName->currentText());
-}
-
-void PageOptions::setTeamOptionsEnabled(bool enabled)
-{
-    BtnNewTeam->setVisible(enabled);
-    BtnEditTeam->setVisible(enabled);
-    BtnDeleteTeam->setVisible(enabled);
-    CBTeamName->setVisible(enabled);
-    LblNoEditTeam->setVisible(!enabled);
-}
--- a/QTfrontend/pageoptions.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,107 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef PAGE_OPTIONS_H
-#define PAGE_OPTIONS_H
-
-#include "AbstractPage.h"
-
-class FPSEdit;
-class IconedGroupBox;
-
-class PageOptions : public AbstractPage
-{
-    Q_OBJECT
-
-public:
-    PageOptions(QWidget* parent = 0);
-
-    QCheckBox *WeaponTooltip;
-    QPushButton *WeaponNew;
-    QPushButton *WeaponEdit;
-    QPushButton *WeaponDelete;
-    QComboBox *WeaponsName;
-    QPushButton *SchemeNew;
-    QPushButton *SchemeEdit;
-    QPushButton *SchemeDelete;
-    QComboBox *SchemesName;
-
-    QComboBox *CBLanguage;
-
-    IconedGroupBox *teamsBox;;
-    QPushButton *BtnAssociateFiles;
-    QComboBox *CBTeamName;
-    IconedGroupBox *AGGroupBox;
-    QComboBox *CBResolution;
-    QComboBox *CBStereoMode;
-    QCheckBox *CBEnableSound;
-    QCheckBox *CBEnableFrontendSound;
-    QCheckBox *CBEnableMusic;
-    QCheckBox *CBEnableFrontendMusic;
-    QCheckBox *CBFullscreen;
-    QCheckBox *CBFrontendFullscreen;
-    QCheckBox *CBShowFPS;
-    QCheckBox *CBAltDamage;
-    QCheckBox *CBNameWithDate;
-#ifdef __APPLE__
-    QCheckBox *CBAutoUpdate;
-#endif
-
-    FPSEdit *fpsedit;
-    QPushButton *btnSave;
-    QLabel *labelNN;
-    QLabel *labelNetPassword;
-    QSpinBox * volumeBox;
-    QLineEdit *editNetNick;
-    QLineEdit *editNetPassword;
-    QSlider *SLQuality;
-    QCheckBox *CBFrontendEffects;
-
-    void setTeamOptionsEnabled(bool enabled);
-
-signals:
-    void newTeamRequested();
-    void editTeamRequested(const QString & teamName);
-    void deleteTeamRequested(const QString & teamName);
-
-
-private:
-    QLayout * bodyLayoutDefinition();
-    QLayout * footerLayoutDefinition();
-    void connectSignals();
-
-    bool previousFullscreenValue;
-    int previousResolutionIndex;
-    int previousQuality;
-    QLabel *LblNoEditTeam;
-    QPushButton *BtnNewTeam;
-    QPushButton *BtnEditTeam;
-    QPushButton *BtnDeleteTeam;
-
-private slots:
-    void forceFullscreen(int index);
-    void setFullscreen(int state);
-    void setResolution(int state);
-    void setQuality(int value);
-    void trimNetNick();
-    void requestEditSelectedTeam();
-    void requestDeleteSelectedTeam();
-};
-
-#endif
-
--- a/QTfrontend/pageplayrecord.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,165 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QFont>
-#include <QGridLayout>
-#include <QPushButton>
-#include <QListWidget>
-#include <QListWidgetItem>
-#include <QFileInfo>
-#include <QMessageBox>
-#include <QInputDialog>
-
-#include "hwconsts.h"
-#include "pageplayrecord.h"
-
-QLayout * PagePlayDemo::bodyLayoutDefinition()
-{
-    QGridLayout * pageLayout = new QGridLayout();
-    
-    pageLayout->setColumnStretch(0, 1);
-    pageLayout->setColumnStretch(1, 2);
-    pageLayout->setColumnStretch(2, 1);
-    pageLayout->setRowStretch(2, 100);
-
-    BtnPlayDemo = new QPushButton(this);
-    BtnPlayDemo->setFont(*font14);
-    BtnPlayDemo->setText(QPushButton::tr("Play demo"));
-    pageLayout->addWidget(BtnPlayDemo, 3, 2);
-
-    BtnRenameRecord = new QPushButton(this);
-    BtnRenameRecord->setText(QPushButton::tr("Rename"));
-    pageLayout->addWidget(BtnRenameRecord, 0, 2);
-
-    BtnRemoveRecord = new QPushButton(this);
-    BtnRemoveRecord->setText(QPushButton::tr("Delete"));
-    pageLayout->addWidget(BtnRemoveRecord, 1, 2);
-
-    DemosList = new QListWidget(this);
-    DemosList->setGeometry(QRect(170, 10, 311, 311));
-    pageLayout->addWidget(DemosList, 0, 1, 3, 1);
-
-    return pageLayout;
-}
-
-void PagePlayDemo::connectSignals()
-{
-    connect(BtnRenameRecord, SIGNAL(clicked()), this, SLOT(renameRecord()));
-    connect(BtnRemoveRecord, SIGNAL(clicked()), this, SLOT(removeRecord()));
-}
-
-PagePlayDemo::PagePlayDemo(QWidget* parent) : AbstractPage(parent)
-{
-    initPage();
-}
-
-void PagePlayDemo::FillFromDir(RecordType rectype)
-{
-    QDir dir;
-    QString extension;
-
-    recType = rectype;
-
-    dir.cd(cfgdir->absolutePath());
-    if (rectype == RT_Demo)
-    {
-        dir.cd("Demos");
-        extension = "hwd";
-        BtnPlayDemo->setText(QPushButton::tr("Play demo"));
-    } else
-    {
-        dir.cd("Saves");
-        extension = "hws";
-        BtnPlayDemo->setText(QPushButton::tr("Load"));
-    }
-    dir.setFilter(QDir::Files);
-
-    QStringList sl = dir.entryList(QStringList(QString("*.%2.%1").arg(extension, *cProtoVer)));
-    sl.replaceInStrings(QRegExp(QString("^(.*)\\.%2\\.%1$").arg(extension, *cProtoVer)), "\\1");
-
-    DemosList->clear();
-    DemosList->addItems(sl);
-
-    for (int i = 0; i < DemosList->count(); ++i)
-    {
-        DemosList->item(i)->setData(Qt::UserRole, dir.absoluteFilePath(QString("%1.%3.%2").arg(sl[i], extension, *cProtoVer)));
-        DemosList->item(i)->setIcon(recType == RT_Demo ? QIcon(":/res/file_demo.png") : QIcon(":/res/file_save.png"));
-    }
-}
-
-void PagePlayDemo::renameRecord()
-{
-    QListWidgetItem * curritem = DemosList->currentItem();
-    if (!curritem)
-    {
-        QMessageBox::critical(this,
-                tr("Error"),
-                tr("Please select record from the list"),
-                tr("OK"));
-        return ;
-    }
-    QFile rfile(curritem->data(Qt::UserRole).toString());
-
-    QFileInfo finfo(rfile);
-
-    bool ok;
-
-    QString newname = QInputDialog::getText(this, tr("Rename dialog"), tr("Enter new file name:"), QLineEdit::Normal, finfo.completeBaseName().replace("." + *cProtoVer, ""), &ok);
-
-    if(ok && newname.size())
-    {
-        QString newfullname = QString("%1/%2.%3.%4")
-                                      .arg(finfo.absolutePath())
-                                      .arg(newname)
-                                      .arg(*cProtoVer)
-                                      .arg(finfo.suffix());
-
-        ok = rfile.rename(newfullname);
-        if(!ok)
-            QMessageBox::critical(this, tr("Error"), tr("Cannot rename to") + newfullname);
-        else
-            FillFromDir(recType);
-    }
-}
-
-void PagePlayDemo::removeRecord()
-{
-    QListWidgetItem * curritem = DemosList->currentItem();
-    if (!curritem)
-    {
-        QMessageBox::critical(this,
-                tr("Error"),
-                tr("Please select record from the list"),
-                tr("OK"));
-        return ;
-    }
-    QFile rfile(curritem->data(Qt::UserRole).toString());
-
-    bool ok;
-
-    ok = rfile.remove();
-    if(!ok)
-        QMessageBox::critical(this, tr("Error"), tr("Cannot delete file"));
-    else
-        FillFromDir(recType);
-}
-
-bool PagePlayDemo::isSave()
-{
-    return recType == RT_Save;
-}
--- a/QTfrontend/pageplayrecord.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef PLAYRECORDPAGE_H
-#define PLAYRECORDPAGE_H
-
-#include <QDir>
-
-#include "AbstractPage.h"
-
-class QPushButton;
-class QListWidget;
-
-class PagePlayDemo : public AbstractPage
-{
-    Q_OBJECT
-
-public:
-    enum RecordType {
-        RT_Demo,
-        RT_Save
-    };
-
-    PagePlayDemo(QWidget* parent = 0);
-
-    void FillFromDir(RecordType rectype);
-    bool isSave();
-
-    QPushButton *BtnPlayDemo;
-    QPushButton *BtnRenameRecord;
-    QPushButton *BtnRemoveRecord;
-    QListWidget *DemosList;
-
-private:
-    QLayout * bodyLayoutDefinition();
-    void connectSignals();
-
-    RecordType recType;
-
-private slots:
-    void renameRecord();
-    void removeRecord();
-};
-
-
-#endif // PLAYRECORDPAGE_H
--- a/QTfrontend/pageroomslist.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,419 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QGridLayout>
-#include <QPushButton>
-#include <QComboBox>
-#include <QLabel>
-#include <QLineEdit>
-#include <QMessageBox>
-#include <QHeaderView>
-#include <QTableWidget>
-
-#include "ammoSchemeModel.h"
-#include "pageroomslist.h"
-#include "hwconsts.h"
-#include "chatwidget.h"
-
-QLayout * PageRoomsList::bodyLayoutDefinition()
-{
-    QGridLayout * pageLayout = new QGridLayout();
-
-    QHBoxLayout * newRoomLayout = new QHBoxLayout();
-    QLabel * roomNameLabel = new QLabel(this);
-    roomNameLabel->setText(tr("Room Name:"));
-    roomName = new QLineEdit(this);
-    roomName->setMaxLength(60);
-    newRoomLayout->addWidget(roomNameLabel);
-    newRoomLayout->addWidget(roomName);
-    pageLayout->addLayout(newRoomLayout, 0, 0, 1, 2);
-
-    roomsList = new QTableWidget(this);
-    roomsList->setSelectionBehavior(QAbstractItemView::SelectRows);
-    roomsList->verticalHeader()->setVisible(false);
-    roomsList->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
-    roomsList->setAlternatingRowColors(true);
-    roomsList->setShowGrid(false);
-    roomsList->setSelectionMode(QAbstractItemView::SingleSelection);
-    pageLayout->addWidget(roomsList, 1, 0, 3, 2);
-    pageLayout->setRowStretch(2, 100);
-
-    QHBoxLayout * filterLayout = new QHBoxLayout();
-
-    QLabel * stateLabel = new QLabel(this);
-    CBState = new QComboBox(this);
-
-    filterLayout->addWidget(stateLabel);
-    filterLayout->addWidget(CBState);
-    filterLayout->addSpacing(30);
-
-    QLabel * ruleLabel = new QLabel(this);
-    ruleLabel->setText(tr("Rules:"));
-    CBRules = new QComboBox(this);
-
-    filterLayout->addWidget(ruleLabel);
-    filterLayout->addWidget(CBRules);
-    filterLayout->addSpacing(30);
-
-    QLabel * weaponLabel = new QLabel(this);
-    weaponLabel->setText(tr("Weapons:"));
-    CBWeapons = new QComboBox(this);
-
-    filterLayout->addWidget(weaponLabel);
-    filterLayout->addWidget(CBWeapons);
-    filterLayout->addSpacing(30);
-
-    QLabel * searchLabel = new QLabel(this);
-    searchLabel->setText(tr("Search:"));
-    searchText = new QLineEdit(this);
-    searchText->setMaxLength(60);
-    filterLayout->addWidget(searchLabel);
-    filterLayout->addWidget(searchText);
-
-    pageLayout->addLayout(filterLayout, 4, 0, 1, 2);
-
-    chatWidget = new HWChatWidget(this, m_gameSettings, m_sdli, false);
-    pageLayout->addWidget(chatWidget, 5, 0, 1, 3);
-    pageLayout->setRowStretch(5, 350);
-
-    BtnCreate = addButton(tr("Create"), pageLayout, 0, 2);
-    BtnJoin = addButton(tr("Join"), pageLayout, 1, 2);
-    BtnRefresh = addButton(tr("Refresh"), pageLayout, 3, 2);
-    BtnClear = addButton(tr("Clear"), pageLayout, 4, 2);
-
-    CBRules->addItem(QComboBox::tr("Any"));
-    CBState->addItem(QComboBox::tr("Any"));
-    CBState->addItem(QComboBox::tr("In lobby"));
-    CBState->addItem(QComboBox::tr("In progress"));
-
-    return pageLayout;
-}
-
-QLayout * PageRoomsList::footerLayoutDefinition()
-{
-    QGridLayout * bottomLayout = new QGridLayout();
-
-    lblCount = new QLabel(this);
-    bottomLayout->addWidget(lblCount, 0, 0, Qt::AlignHCenter);
-    lblCount->setText("?");
-    lblCount->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
-
-    BtnAdmin = addButton(tr("Admin features"), bottomLayout, 6, 2);
-
-    return bottomLayout;
-}
-
-void PageRoomsList::connectSignals()
-{
-    connect(chatWidget, SIGNAL(nickCountUpdate(const int)), this, SLOT(updateNickCounter(const int)));
-
-    connect(BtnCreate, SIGNAL(clicked()), this, SLOT(onCreateClick()));
-    connect(BtnJoin, SIGNAL(clicked()), this, SLOT(onJoinClick()));
-    connect(BtnRefresh, SIGNAL(clicked()), this, SLOT(onRefreshClick()));
-    connect(BtnClear, SIGNAL(clicked()), this, SLOT(onClearClick()));
-    connect(roomsList, SIGNAL(doubleClicked (const QModelIndex &)), this, SLOT(onJoinClick()));
-    connect(CBState, SIGNAL(currentIndexChanged (int)), this, SLOT(onRefreshClick()));
-    connect(CBRules, SIGNAL(currentIndexChanged (int)), this, SLOT(onRefreshClick()));
-    connect(CBWeapons, SIGNAL(currentIndexChanged (int)), this, SLOT(onRefreshClick()));
-    connect(searchText, SIGNAL(textChanged (const QString &)), this, SLOT(onRefreshClick()));
-    connect(this, SIGNAL(askJoinConfirmation (const QString &)), this, SLOT(onJoinConfirmation(const QString &)), Qt::QueuedConnection);
-}
-
-
-PageRoomsList::PageRoomsList(QWidget* parent, QSettings * gameSettings, SDLInteraction * sdli) :
-  AbstractPage(parent)
-{
-    m_gameSettings = gameSettings;
-    m_sdli = sdli;
-
-    initPage();
-
-    // not the most elegant solution but it works
-    ammoSchemeModel = new AmmoSchemeModel(this, NULL);
-    for (int i = 0; i < ammoSchemeModel->predefSchemesNames.count(); i++)
-        CBRules->addItem(ammoSchemeModel->predefSchemesNames.at(i).toAscii().constData());
-
-    CBWeapons->addItem(QComboBox::tr("Any"));
-    for (int i = 0; i < cDefaultAmmos.count(); i++) {
-        QPair<QString,QString> ammo = cDefaultAmmos.at(i);
-        CBWeapons->addItem(ammo.first.toAscii().constData());
-    }
-
-    gameInLobby = false;
-}
-
-void PageRoomsList::setAdmin(bool flag)
-{
-    BtnAdmin->setVisible(flag);
-}
-
-void PageRoomsList::setRoomsList(const QStringList & list)
-{
-    QBrush red(QColor(255, 0, 0));
-    QBrush orange(QColor(127, 127, 0));
-    QBrush yellow(QColor(255, 255, 0));
-    QBrush green(QColor(0, 255, 0));
-
-    listFromServer = list;
-    
-    QString selection = "";
-    
-    if(QTableWidgetItem *item = roomsList->item(roomsList->currentRow(), 0))
-        selection = item->text();
-    
-    roomsList->clear();
-    roomsList->setColumnCount(7);
-    roomsList->setHorizontalHeaderLabels(
-            QStringList() <<
-            QTableWidget::tr("Room Name") <<
-            QTableWidget::tr("C") <<
-            QTableWidget::tr("T") <<
-            QTableWidget::tr("Owner") <<
-            QTableWidget::tr("Map") <<
-            QTableWidget::tr("Rules") <<
-            QTableWidget::tr("Weapons")
-            );
-
-    // set minimum sizes
-//  roomsList->horizontalHeader()->resizeSection(0, 200);
-//  roomsList->horizontalHeader()->resizeSection(1, 50);
-//  roomsList->horizontalHeader()->resizeSection(2, 50);
-//  roomsList->horizontalHeader()->resizeSection(3, 100);
-//  roomsList->horizontalHeader()->resizeSection(4, 100);
-//  roomsList->horizontalHeader()->resizeSection(5, 100);
-//  roomsList->horizontalHeader()->resizeSection(6, 100);
-
-    // set resize modes
-//  roomsList->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
-
-    bool gameCanBeJoined = true;
-
-    if (list.size() % 8)
-        return;
-
-    roomsList->setRowCount(list.size() / 8);
-    for(int i = 0, r = 0; i < list.size(); i += 8, r++)
-    {
-        // if we are joining a game
-        // TODO: Should NOT be done here
-        if (gameInLobby) {
-            if (gameInLobbyName == list[i + 1]) {
-                gameCanBeJoined = list[i].compare("True");
-            }
-        }
-        
-        // check filter settings
-        #define NO_FILTER_MATCH roomsList->setRowCount(roomsList->rowCount() - 1); --r; continue
-        
-        if (list[i].compare("True") && CBState->currentIndex() == 2) { NO_FILTER_MATCH; }
-        if (list[i].compare("False") && CBState->currentIndex() == 1) { NO_FILTER_MATCH; }
-        if (CBRules->currentIndex() != 0 && list[i + 6].compare(CBRules->currentText())) { NO_FILTER_MATCH; }
-        if (CBWeapons->currentIndex() != 0 && list[i + 7].compare(CBWeapons->currentText())) { NO_FILTER_MATCH; }
-        bool found = list[i + 1].contains(searchText->text(), Qt::CaseInsensitive);
-        if (!found) {
-            for (int a = 4; a <= 7; ++a) {
-                QString compString = list[i + a];
-                if (a == 5 && compString == "+rnd+") {
-                    compString = "Random Map";
-                } else if (a == 5 && compString == "+maze+") {
-                    compString = "Random Maze";
-                } else if (a == 5 && compString == "+drawn+") {
-                    compString = "Drawn Map";
-                }
-                if (compString.contains(searchText->text(), Qt::CaseInsensitive)) {
-                    found = true;
-                    break;
-                }
-            }
-        }
-        if (!searchText->text().isEmpty() && !found) { NO_FILTER_MATCH; }
-        
-        QTableWidgetItem * item;
-        item = new QTableWidgetItem(list[i + 1]); // room name
-        item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
-        
-        // pick appropriate room icon and tooltip (game in progress yes/no; later maybe locked rooms etc.)
-        if(list[i].compare("True"))
-        {
-            item->setIcon(QIcon(":/res/iconTime.png"));// game is in lobby
-            item->setToolTip(tr("This game is in lobby.\nYou may join and start playing once the game starts."));
-        }
-        else
-        {
-            item->setIcon(QIcon(":/res/iconDamage.png"));// game has started
-            item->setToolTip(tr("This game is in progress.\nYou may join and spectate now but you'll have to wait for the game to end to start playing."));
-        }
-
-        roomsList->setItem(r, 0, item);
-
-        item = new QTableWidgetItem(list[i + 2]); // number of clients
-        item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
-        item->setTextAlignment(Qt::AlignCenter);
-        item->setToolTip(tr("There are %1 clients connected to this room.", "", list[i + 2].toInt()).arg(list[i + 2]));
-        roomsList->setItem(r, 1, item);
-
-        item = new QTableWidgetItem(list[i + 3]); // number of teams
-        item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
-        item->setTextAlignment(Qt::AlignCenter);
-        item->setToolTip(tr("There are %1 teams participating in this room.", "", list[i + 3].toInt()).arg(list[i + 3]));
-        //Should we highlight "full" games? Might get misinterpreted
-        //if(list[i + 3].toInt() >= cMaxTeams)
-        //    item->setForeground(red);
-        roomsList->setItem(r, 2, item);
-
-        item = new QTableWidgetItem(list[i + 4].left(15)); // name of host
-        item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
-        item->setToolTip(tr("%1 is the host. He may adjust settings and start the game.").arg(list[i + 4]));
-        roomsList->setItem(r, 3, item);
-
-        if(list[i + 5] == "+rnd+")
-        {
-            item = new QTableWidgetItem(tr("Random Map")); // selected map (is randomized)
-// FIXME - need real icons. Disabling until then
-//            item->setIcon(QIcon(":/res/mapRandom.png"));
-        }
-        else if (list[i+5] == "+maze+")
-        {
-            item = new QTableWidgetItem(tr("Random Maze"));
-// FIXME - need real icons. Disabling until then
-//            item->setIcon(QIcon(":/res/mapMaze.png"));
-        }
-        else
-        {
-            item = new QTableWidgetItem(list[i + 5]); // selected map
-            
-            // check to see if we've got this map
-            // not perfect but a start
-            if(!mapList->contains(list[i + 5]))
-            {
-                item->setForeground(red);
-                item->setIcon(QIcon(":/res/mapMissing.png"));
-            }
-            else
-            {
-               // todo: mission icon?
-// FIXME - need real icons. Disabling until then
-//               item->setIcon(QIcon(":/res/mapCustom.png"));
-            }
-        }
-        
-        item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
-        item->setToolTip(tr("Games may be played on precreated or randomized maps."));
-        roomsList->setItem(r, 4, item);
-
-        item = new QTableWidgetItem(list[i + 6].left(24)); // selected game scheme
-        item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
-        item->setToolTip(tr("The Game Scheme defines general options and preferences like Round Time, Sudden Death or Vampirism."));
-        roomsList->setItem(r, 5, item);
-
-        item = new QTableWidgetItem(list[i + 7].left(24)); // selected weapon scheme
-        item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
-        item->setToolTip(tr("The Weapon Scheme defines available weapons and their ammunition count."));
-        roomsList->setItem(r, 6, item);
-
-        if(!list[i + 1].compare(selection) && !selection.isEmpty())
-            roomsList->selectionModel()->setCurrentIndex(roomsList->model()->index(r, 0), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
-    }
-
-    roomsList->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch);
-    roomsList->horizontalHeader()->setResizeMode(1, QHeaderView::ResizeToContents);
-    roomsList->horizontalHeader()->setResizeMode(2, QHeaderView::ResizeToContents);
-    roomsList->horizontalHeader()->setResizeMode(3, QHeaderView::ResizeToContents);
-    roomsList->horizontalHeader()->setResizeMode(4, QHeaderView::ResizeToContents);
-    roomsList->horizontalHeader()->setResizeMode(5, QHeaderView::ResizeToContents);
-    roomsList->horizontalHeader()->setResizeMode(6, QHeaderView::ResizeToContents);
-
-    // TODO: Should NOT be done here
-    if (gameInLobby) {
-        gameInLobby = false;
-        if (gameCanBeJoined) {
-            emit askForJoinRoom(gameInLobbyName);
-        } else {
-            emit askJoinConfirmation(gameInLobbyName);
-        }
-    }
-
-//  roomsList->resizeColumnsToContents();
-}
-
-void PageRoomsList::onCreateClick()
-{
-    if (roomName->text().size())
-        emit askForCreateRoom(roomName->text());
-    else
-        QMessageBox::critical(this,
-                tr("Error"),
-                tr("Please enter room name"),
-                tr("OK"));
-}
-
-void PageRoomsList::onJoinClick()
-{
-    QTableWidgetItem * curritem = roomsList->item(roomsList->currentRow(), 0);
-    if (!curritem)
-    {
-        QMessageBox::critical(this,
-                tr("Error"),
-                tr("Please select room from the list"),
-                tr("OK"));
-        return;
-    }
-
-    for (int i = 0; i < listFromServer.size(); i += 8) {
-        if (listFromServer[i + 1] == curritem->data(Qt::DisplayRole).toString()) {
-            gameInLobby = listFromServer[i].compare("True");
-            break;
-        }
-    }
-    
-    if (gameInLobby) {
-        gameInLobbyName = curritem->data(Qt::DisplayRole).toString();
-        emit askForRoomList();
-    } else {
-        emit askForJoinRoom(curritem->data(Qt::DisplayRole).toString());
-    }
-}
-
-void PageRoomsList::onRefreshClick()
-{
-    emit askForRoomList();
-}
-
-void PageRoomsList::onClearClick()
-{
-    CBState->setCurrentIndex(0);
-    CBRules->setCurrentIndex(0);
-    CBWeapons->setCurrentIndex(0);
-    searchText->clear();
-}
-
-void PageRoomsList::onJoinConfirmation(const QString & room)
-{
-    if (QMessageBox::warning(this,
-        tr("Warning"),
-        tr("The game you are trying to join has started.\nDo you still want to join the room?"),
-        QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes)
-    {
-        emit askForJoinRoom(room);
-    }
-}
-
-void PageRoomsList::updateNickCounter(int cnt)
-{
-    lblCount->setText(tr("%1 players online", 0, cnt).arg(cnt));
-}
--- a/QTfrontend/pageroomslist.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,83 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef PAGE_ROOMLIST_H
-#define PAGE_ROOMLIST_H
-
-#include "AbstractPage.h"
-#include "SDLs.h"
-
-class HWChatWidget;
-class AmmoSchemeModel;
-
-class PageRoomsList : public AbstractPage
-{
-    Q_OBJECT
-
-public:
-    PageRoomsList(QWidget* parent, QSettings * config, SDLInteraction * sdli);
-
-    QLineEdit * roomName;
-    QLineEdit * searchText;
-    QTableWidget * roomsList;
-    QPushButton * BtnCreate;
-    QPushButton * BtnJoin;
-    QPushButton * BtnRefresh;
-    QPushButton * BtnAdmin;
-    QPushButton * BtnClear;
-    QComboBox * CBState;
-    QComboBox * CBRules;
-    QComboBox * CBWeapons;
-    HWChatWidget * chatWidget;
-    QLabel * lblCount;
-
-public slots:
-    void setRoomsList(const QStringList & list);
-    void setAdmin(bool);
-    void updateNickCounter(int cnt);
-
-signals:
-    void askForCreateRoom(const QString &);
-    void askForJoinRoom(const QString &);
-    void askForRoomList();
-    void askJoinConfirmation(const QString &);
-
-protected:
-    QLayout * bodyLayoutDefinition();
-    QLayout * footerLayoutDefinition();
-    void connectSignals();
-
-private slots:
-    void onCreateClick();
-    void onJoinClick();
-    void onRefreshClick();
-    void onClearClick();
-    void onJoinConfirmation(const QString &);
-
-private:
-    QSettings * m_gameSettings;
-    SDLInteraction * m_sdli;
-
-    bool gameInLobby;
-    QString gameInLobbyName;
-    QStringList listFromServer;
-    AmmoSchemeModel * ammoSchemeModel;
-
-};
-
-#endif
--- a/QTfrontend/pagescheme.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,510 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QGridLayout>
-#include <QHBoxLayout>
-#include <QPushButton>
-#include <QGroupBox>
-#include <QComboBox>
-#include <QLabel>
-#include <QLineEdit>
-#include <QMessageBox>
-#include <QDataWidgetMapper>
-#include <QSpinBox>
-
-#include "ammoSchemeModel.h"
-#include "pagescheme.h"
-#include "misc.h"
-
-
-QLayout * PageScheme::bodyLayoutDefinition()
-{
-    QGridLayout * pageLayout = new QGridLayout();
-    QGroupBox * gb = new QGroupBox(this);
-
-    QGridLayout * gl = new QGridLayout();
-    gb->setLayout(gl);
-    QSizePolicy sp;
-    sp.setVerticalPolicy(QSizePolicy::MinimumExpanding);
-    sp.setHorizontalPolicy(QSizePolicy::Expanding);
-
-    pageLayout->addWidget(gb, 1,0,13,5);
-
-    gbGameModes = new QGroupBox(QGroupBox::tr("Game Modifiers"), gb);
-    gbBasicSettings = new QGroupBox(QGroupBox::tr("Basic Settings"), gb);
-
-    // TODO name stuff and put CSS into main style sheet
-    gbGameModes->setStyleSheet(".QGroupBox {"
-            "background-color: #130f2c; background-image:url();"
-            "}");
-    gbBasicSettings->setStyleSheet(".QGroupBox {"
-            "background-color: #130f2c; background-image:url();"
-            "}");
-
-    gbGameModes->setSizePolicy(sp);
-    gbBasicSettings->setSizePolicy(sp);
-    gl->addWidget(gbGameModes,0,0,1,3,Qt::AlignTop);
-    gl->addWidget(gbBasicSettings,0,3,1,3,Qt::AlignTop);
-
-    QGridLayout * glGMLayout = new QGridLayout(gbGameModes);
-    QGridLayout * glBSLayout = new QGridLayout(gbBasicSettings);
-    gbGameModes->setLayout(glGMLayout);
-    gbBasicSettings->setLayout(glBSLayout);
-    // Left
-
-    TBW_mode_Forts = new ToggleButtonWidget(gbGameModes, ":/res/btnForts.png");
-    TBW_mode_Forts->setToolTip("<b>" + ToggleButtonWidget::tr("Fort Mode") + "</b>:<br />" + tr("Defend your fort and destroy the opponents, two team colours max!"));
-    glGMLayout->addWidget(TBW_mode_Forts,0,0,1,1);
-
-    TBW_teamsDivide = new ToggleButtonWidget(gbGameModes, ":/res/btnTeamsDivide.png");
-    TBW_teamsDivide->setToolTip("<b>" + ToggleButtonWidget::tr("Divide Teams") + "</b>:<br />" + tr("Teams will start on opposite sides of the terrain, two team colours max!"));
-    glGMLayout->addWidget(TBW_teamsDivide,0,1,1,1);
-
-    TBW_solid = new ToggleButtonWidget(gbGameModes, ":/res/btnSolid.png");
-    TBW_solid->setToolTip("<b>" + ToggleButtonWidget::tr("Solid Land") + "</b>:<br />" + tr("Land can not be destroyed!"));
-    glGMLayout->addWidget(TBW_solid,0,2,1,1);
-
-    TBW_border = new ToggleButtonWidget(gbGameModes, ":/res/btnBorder.png");
-    TBW_border->setToolTip("<b>" + ToggleButtonWidget::tr("Add Border") + "</b>:<br />" + tr("Add an indestructible border around the terrain"));
-    glGMLayout->addWidget(TBW_border,0,3,1,1);
-
-    TBW_lowGravity = new ToggleButtonWidget(gbGameModes, ":/res/btnLowGravity.png");
-    TBW_lowGravity->setToolTip("<b>" + ToggleButtonWidget::tr("Low Gravity") + "</b>:<br />" + tr("Lower gravity"));
-    glGMLayout->addWidget(TBW_lowGravity,0,4,1,1);
-
-    TBW_laserSight = new ToggleButtonWidget(gbGameModes, ":/res/btnLaserSight.png");
-    TBW_laserSight->setToolTip("<b>" + ToggleButtonWidget::tr("Laser Sight") + "</b>:<br />" + tr("Assisted aiming with laser sight"));
-    glGMLayout->addWidget(TBW_laserSight,1,0,1,1);
-
-    TBW_invulnerable = new ToggleButtonWidget(gbGameModes, ":/res/btnInvulnerable.png");
-    TBW_invulnerable->setToolTip("<b>" + ToggleButtonWidget::tr("Invulnerable") + "</b>:<br />" + tr("All hogs have a personal forcefield"));
-    glGMLayout->addWidget(TBW_invulnerable,1,1,1,1);
-
-    TBW_resethealth = new ToggleButtonWidget(gbGameModes, ":/res/btnResetHealth.png");
-    TBW_resethealth->setToolTip("<b>" + ToggleButtonWidget::tr("Reset Health") + "</b>:<br />" + tr("All (living) hedgehogs are fully restored at the end of turn"));
-    glGMLayout->addWidget(TBW_resethealth,1,2,1,1);
-
-    TBW_vampiric = new ToggleButtonWidget(gbGameModes, ":/res/btnVampiric.png");
-    TBW_vampiric->setToolTip("<b>" + ToggleButtonWidget::tr("Vampirism") + "</b>:<br />" + tr("Gain 80% of the damage you do back in health"));
-    glGMLayout->addWidget(TBW_vampiric,1,3,1,1);
-
-    TBW_karma = new ToggleButtonWidget(gbGameModes, ":/res/btnKarma.png");
-    TBW_karma->setToolTip("<b>" + ToggleButtonWidget::tr("Karma") + "</b>:<br />" + tr("Share your opponents pain, share their damage"));
-    glGMLayout->addWidget(TBW_karma,1,4,1,1);
-
-    TBW_artillery = new ToggleButtonWidget(gbGameModes, ":/res/btnArtillery.png");
-    TBW_artillery->setToolTip("<b>" + ToggleButtonWidget::tr("Artillery") + "</b>:<br />" + tr("Your hogs are unable to move, put your artillery skills to the test"));
-    glGMLayout->addWidget(TBW_artillery,2,0,1,1);
-
-    TBW_randomorder = new ToggleButtonWidget(gbGameModes, ":/res/btnRandomOrder.png");
-    TBW_randomorder->setToolTip("<b>" + ToggleButtonWidget::tr("Random Order") + "</b>:<br />" + tr("Order of play is random instead of in room order."));
-    glGMLayout->addWidget(TBW_randomorder,2,1,1,1);
-
-    TBW_king = new ToggleButtonWidget(gbGameModes, ":/res/btnKing.png");
-    TBW_king->setToolTip("<b>" + ToggleButtonWidget::tr("King") + "</b>:<br />" + tr("Play with a King. If he dies, your side dies."));
-    glGMLayout->addWidget(TBW_king,2,2,1,1);
-
-    TBW_placehog = new ToggleButtonWidget(gbGameModes, ":/res/btnPlaceHog.png");
-    TBW_placehog->setToolTip("<b>" + ToggleButtonWidget::tr("Place Hedgehogs") + "</b>:<br />" + tr("Take turns placing your hedgehogs before the start of play."));
-    glGMLayout->addWidget(TBW_placehog,2,3,1,1);
-
-    TBW_sharedammo = new ToggleButtonWidget(gbGameModes, ":/res/btnSharedAmmo.png");
-    TBW_sharedammo->setToolTip("<b>" + ToggleButtonWidget::tr("Clan Shares Ammo") + "</b>:<br />" + tr("Ammo is shared between all teams that share a colour."));
-    glGMLayout->addWidget(TBW_sharedammo,2,4,1,1);
-
-    TBW_disablegirders = new ToggleButtonWidget(gbGameModes, ":/res/btnDisableGirders.png");
-    TBW_disablegirders->setToolTip("<b>" + ToggleButtonWidget::tr("Disable Girders") + "</b>:<br />" + tr("Disable girders when generating random maps."));
-    glGMLayout->addWidget(TBW_disablegirders,3,0,1,1);
-
-    TBW_disablelandobjects = new ToggleButtonWidget(gbGameModes, ":/res/btnDisableLandObjects.png");
-    TBW_disablelandobjects->setToolTip("<b>" + ToggleButtonWidget::tr("Disable Land Objects") + "</b>:<br />" + tr("Disable land objects when generating random maps."));
-    glGMLayout->addWidget(TBW_disablelandobjects,3,1,1,1);
-
-    TBW_aisurvival = new ToggleButtonWidget(gbGameModes, ":/res/btnAISurvival.png");
-    TBW_aisurvival->setToolTip("<b>" + ToggleButtonWidget::tr("AI Survival Mode") + "</b>:<br />" + tr("AI respawns on death."));
-    glGMLayout->addWidget(TBW_aisurvival,3,2,1,1);
-
-    TBW_infattack = new ToggleButtonWidget(gbGameModes, ":/res/btnInfAttack.png");
-    TBW_infattack->setToolTip("<b>" + ToggleButtonWidget::tr("Unlimited Attacks") + "</b>:<br />" + tr("Attacking does not end your turn."));
-    glGMLayout->addWidget(TBW_infattack,3,3,1,1);
-
-    TBW_resetweps = new ToggleButtonWidget(gbGameModes, ":/res/btnResetWeps.png");
-    TBW_resetweps->setToolTip("<b>" + ToggleButtonWidget::tr("Reset Weapons") + "</b>:<br />" + tr("Weapons are reset to starting values each turn."));
-    glGMLayout->addWidget(TBW_resetweps,3,4,1,1);
-
-    TBW_perhogammo = new ToggleButtonWidget(gbGameModes, ":/res/btnPerHogAmmo.png");
-    TBW_perhogammo->setToolTip("<b>" + ToggleButtonWidget::tr("Per Hedgehog Ammo") + "</b>:<br />" + tr("Each hedgehog has its own ammo. It does not share with the team."));
-    glGMLayout->addWidget(TBW_perhogammo,4,0,1,1);
-
-    TBW_nowind = new ToggleButtonWidget(gbGameModes, ":/res/btnNoWind.png");
-    TBW_nowind->setToolTip("<b>" + ToggleButtonWidget::tr("Disable Wind") + "</b>:<br />" + tr("You will not have to worry about wind anymore."));
-    glGMLayout->addWidget(TBW_nowind,4,1,1,1);
-
-    TBW_morewind = new ToggleButtonWidget(gbGameModes, ":/res/btnMoreWind.png");
-    TBW_morewind->setToolTip("<b>" + ToggleButtonWidget::tr("More Wind") + "</b>:<br />" + tr("Wind will affect almost everything."));
-    glGMLayout->addWidget(TBW_morewind,4,2,1,1);
-
-    TBW_tagteam = new ToggleButtonWidget(gbGameModes, ":/res/btnTagTeam.png");
-    TBW_tagteam->setToolTip("<b>" + ToggleButtonWidget::tr("Tag Team") + "</b>:<br />" + tr("Teams in each clan take successive turns sharing their turn time."));
-    glGMLayout->addWidget(TBW_tagteam,4,3,1,1);
-
-    TBW_bottomborder = new ToggleButtonWidget(gbGameModes, ":/res/btnBottomBorder.png");
-    TBW_bottomborder->setToolTip("<b>" + ToggleButtonWidget::tr("Add Bottom Border") + "</b>:<br />" + tr("Add an indestructible border along the bottom"));
-    glGMLayout->addWidget(TBW_bottomborder,4,4,1,1);
-
-
-    // Right
-    QLabel * l;
-
-    l = new QLabel(gbBasicSettings);
-    l->setText(QLabel::tr("Damage Modifier"));
-    l->setWordWrap(true);
-    glBSLayout->addWidget(l,0,0,1,1);
-    l = new QLabel(gbBasicSettings);
-    l->setFixedSize(32,32);
-    l->setPixmap(QPixmap(":/res/iconDamage.png"));
-    glBSLayout->addWidget(l,0,1,1,1);
-    SB_DamageModifier = new QSpinBox(gbBasicSettings);
-    SB_DamageModifier->setRange(10, 300);
-    SB_DamageModifier->setValue(100);
-    SB_DamageModifier->setSingleStep(25);
-    glBSLayout->addWidget(SB_DamageModifier,0,2,1,1);
-
-    l = new QLabel(gbBasicSettings);
-    l->setText(QLabel::tr("Turn Time"));
-    l->setWordWrap(true);
-    glBSLayout->addWidget(l,1,0,1,1);
-    l = new QLabel(gbBasicSettings);
-    l->setFixedSize(32,32);
-    l->setPixmap(QPixmap(":/res/iconTime.png"));
-    glBSLayout->addWidget(l,1,1,1,1);
-    SB_TurnTime = new QSpinBox(gbBasicSettings);
-    SB_TurnTime->setRange(1, 9999);
-    SB_TurnTime->setValue(45);
-    SB_TurnTime->setSingleStep(15);
-    glBSLayout->addWidget(SB_TurnTime,1,2,1,1);
-
-    l = new QLabel(gbBasicSettings);
-    l->setText(QLabel::tr("Initial Health"));
-    l->setWordWrap(true);
-    glBSLayout->addWidget(l,2,0,1,1);
-    l = new QLabel(gbBasicSettings);
-    l->setFixedSize(32,32);
-    l->setPixmap(QPixmap(":/res/iconHealth.png"));
-    glBSLayout->addWidget(l,2,1,1,1);
-    SB_InitHealth = new QSpinBox(gbBasicSettings);
-    SB_InitHealth->setRange(50, 200);
-    SB_InitHealth->setValue(100);
-    SB_InitHealth->setSingleStep(25);
-    glBSLayout->addWidget(SB_InitHealth,2,2,1,1);
-
-    l = new QLabel(gbBasicSettings);
-    l->setText(QLabel::tr("Sudden Death Timeout"));
-    l->setWordWrap(true);
-    glBSLayout->addWidget(l,3,0,1,1);
-    l = new QLabel(gbBasicSettings);
-    l->setFixedSize(32,32);
-    l->setPixmap(QPixmap(":/res/iconSuddenDeath.png"));
-    glBSLayout->addWidget(l,3,1,1,1);
-    SB_SuddenDeath = new QSpinBox(gbBasicSettings);
-    SB_SuddenDeath->setRange(0, 50);
-    SB_SuddenDeath->setValue(15);
-    SB_SuddenDeath->setSingleStep(3);
-    glBSLayout->addWidget(SB_SuddenDeath,3,2,1,1);
-
-    l = new QLabel(gbBasicSettings);
-    l->setText(QLabel::tr("Sudden Death Water Rise"));
-    l->setWordWrap(true);
-    glBSLayout->addWidget(l,4,0,1,1);
-    l = new QLabel(gbBasicSettings);
-    l->setFixedSize(32,32);
-    l->setPixmap(QPixmap(":/res/iconSuddenDeath.png")); // TODO: icon
-    glBSLayout->addWidget(l,4,1,1,1);
-    SB_WaterRise = new QSpinBox(gbBasicSettings);
-    SB_WaterRise->setRange(0, 100);
-    SB_WaterRise->setValue(47);
-    SB_WaterRise->setSingleStep(5);
-    glBSLayout->addWidget(SB_WaterRise,4,2,1,1);
-
-    l = new QLabel(gbBasicSettings);
-    l->setText(QLabel::tr("Sudden Death Health Decrease"));
-    l->setWordWrap(true);
-    glBSLayout->addWidget(l,5,0,1,1);
-    l = new QLabel(gbBasicSettings);
-    l->setFixedSize(32,32);
-    l->setPixmap(QPixmap(":/res/iconSuddenDeath.png")); // TODO: icon
-    glBSLayout->addWidget(l,5,1,1,1);
-    SB_HealthDecrease = new QSpinBox(gbBasicSettings);
-    SB_HealthDecrease->setRange(0, 100);
-    SB_HealthDecrease->setValue(5);
-    SB_HealthDecrease->setSingleStep(1);
-    glBSLayout->addWidget(SB_HealthDecrease,5,2,1,1);
-
-    l = new QLabel(gbBasicSettings);
-    l->setText(QLabel::tr("% Rope Length"));
-    l->setWordWrap(true);
-    glBSLayout->addWidget(l,6,0,1,1);
-    l = new QLabel(gbBasicSettings);
-    l->setFixedSize(32,32);
-    l->setPixmap(QPixmap(":/res/iconRope.png"));
-    glBSLayout->addWidget(l,6,1,1,1);
-    SB_RopeModifier = new QSpinBox(gbBasicSettings);
-    SB_RopeModifier->setRange(25, 999);
-    SB_RopeModifier->setValue(100);
-    SB_RopeModifier->setSingleStep(25);
-    glBSLayout->addWidget(SB_RopeModifier,6,2,1,1);
-
-    l = new QLabel(gbBasicSettings);
-    l->setText(QLabel::tr("Crate Drops"));
-    l->setWordWrap(true);
-    glBSLayout->addWidget(l,7,0,1,1);
-    l = new QLabel(gbBasicSettings);
-    l->setFixedSize(32,32);
-    l->setPixmap(QPixmap(":/res/iconBox.png"));
-    glBSLayout->addWidget(l,7,1,1,1);
-    SB_CaseProb = new FreqSpinBox(gbBasicSettings);
-    SB_CaseProb->setRange(0, 9);
-    SB_CaseProb->setValue(5);
-    glBSLayout->addWidget(SB_CaseProb,7,2,1,1);
-
-    l = new QLabel(gbBasicSettings);
-    l->setText(QLabel::tr("% Health Crates"));
-    l->setWordWrap(true);
-    glBSLayout->addWidget(l,8,0,1,1);
-    l = new QLabel(gbBasicSettings);
-    l->setFixedSize(32,32);
-    l->setPixmap(QPixmap(":/res/iconHealth.png")); // TODO: icon
-    glBSLayout->addWidget(l,8,1,1,1);
-    SB_HealthCrates = new QSpinBox(gbBasicSettings);
-    SB_HealthCrates->setRange(0, 100);
-    SB_HealthCrates->setValue(35);
-    SB_HealthCrates->setSingleStep(5);
-    glBSLayout->addWidget(SB_HealthCrates,8,2,1,1);
-
-    l = new QLabel(gbBasicSettings);
-    l->setText(QLabel::tr("Health in Crates"));
-    l->setWordWrap(true);
-    glBSLayout->addWidget(l,9,0,1,1);
-    l = new QLabel(gbBasicSettings);
-    l->setFixedSize(32,32);
-    l->setPixmap(QPixmap(":/res/iconHealth.png")); // TODO: icon
-    glBSLayout->addWidget(l,9,1,1,1);
-    SB_CrateHealth = new QSpinBox(gbBasicSettings);
-    SB_CrateHealth->setRange(0, 200);
-    SB_CrateHealth->setValue(25);
-    SB_CrateHealth->setSingleStep(5);
-    glBSLayout->addWidget(SB_CrateHealth,9,2,1,1);
-
-    l = new QLabel(gbBasicSettings);
-    l->setText(QLabel::tr("Mines Time"));
-    l->setWordWrap(true);
-    glBSLayout->addWidget(l,10,0,1,1);
-    l = new QLabel(gbBasicSettings);
-    l->setFixedSize(32,32);
-    l->setPixmap(QPixmap(":/res/iconTime.png")); // TODO: icon
-    glBSLayout->addWidget(l,10,1,1,1);
-    SB_MinesTime = new QSpinBox(gbBasicSettings);
-    SB_MinesTime->setRange(-1, 5);
-    SB_MinesTime->setValue(3);
-    SB_MinesTime->setSingleStep(1);
-    SB_MinesTime->setSpecialValueText(tr("Random"));
-    SB_MinesTime->setSuffix(" "+ tr("Seconds"));
-    glBSLayout->addWidget(SB_MinesTime,10,2,1,1);
-
-    l = new QLabel(gbBasicSettings);
-    l->setText(QLabel::tr("Mines"));
-    l->setWordWrap(true);
-    glBSLayout->addWidget(l,11,0,1,1);
-    l = new QLabel(gbBasicSettings);
-    l->setFixedSize(32,32);
-    l->setPixmap(QPixmap(":/res/iconMine.png")); // TODO: icon
-    glBSLayout->addWidget(l,11,1,1,1);
-    SB_Mines = new QSpinBox(gbBasicSettings);
-    SB_Mines->setRange(0, 80);
-    SB_Mines->setValue(0);
-    SB_Mines->setSingleStep(5);
-    glBSLayout->addWidget(SB_Mines,11,2,1,1);
-
-    l = new QLabel(gbBasicSettings);
-    l->setText(QLabel::tr("% Dud Mines"));
-    l->setWordWrap(true);
-    glBSLayout->addWidget(l,12,0,1,1);
-    l = new QLabel(gbBasicSettings);
-    l->setFixedSize(32,32);
-    l->setPixmap(QPixmap(":/res/iconDud.png"));
-    glBSLayout->addWidget(l,12,1,1,1);
-    SB_MineDuds = new QSpinBox(gbBasicSettings);
-    SB_MineDuds->setRange(0, 100);
-    SB_MineDuds->setValue(0);
-    SB_MineDuds->setSingleStep(5);
-    glBSLayout->addWidget(SB_MineDuds,12,2,1,1);
-
-    l = new QLabel(gbBasicSettings);
-    l->setText(QLabel::tr("Explosives"));
-    l->setWordWrap(true);
-    glBSLayout->addWidget(l,13,0,1,1);
-    l = new QLabel(gbBasicSettings);
-    l->setFixedSize(32,32);
-    l->setPixmap(QPixmap(":/res/iconDamage.png"));
-    glBSLayout->addWidget(l,13,1,1,1);
-    SB_Explosives = new QSpinBox(gbBasicSettings);
-    SB_Explosives->setRange(0, 40);
-    SB_Explosives->setValue(0);
-    SB_Explosives->setSingleStep(1);
-    glBSLayout->addWidget(SB_Explosives,13,2,1,1);
-
-    l = new QLabel(gbBasicSettings);
-    l->setText(QLabel::tr("% Get Away Time"));
-    l->setWordWrap(true);
-    glBSLayout->addWidget(l,14,0,1,1);
-    l = new QLabel(gbBasicSettings);
-    l->setFixedSize(32,32);
-    l->setPixmap(QPixmap(":/res/iconTime.png"));
-    glBSLayout->addWidget(l,14,1,1,1);
-    SB_GetAwayTime = new QSpinBox(gbBasicSettings);
-    SB_GetAwayTime->setRange(0, 999);
-    SB_GetAwayTime->setValue(100);
-    SB_GetAwayTime->setSingleStep(25);
-    glBSLayout->addWidget(SB_GetAwayTime,14,2,1,1);
- 
-    l = new QLabel(gbBasicSettings);
-    l->setText(QLabel::tr("Scheme Name:"));
-
-    LE_name = new QLineEdit(this);
-
-    gl->addWidget(LE_name,15,1,1,5);
-    gl->addWidget(l,15,0,1,1);
-
-    return pageLayout;
-}
-
-QLayout * PageScheme::footerLayoutDefinition()
-{
-    QHBoxLayout * bottomLayout = new QHBoxLayout();
-    selectScheme = new QComboBox(this);
-
-    bottomLayout->addWidget(selectScheme, 0);
-    BtnCopy = addButton(tr("Copy"), bottomLayout, 1);
-    BtnNew = addButton(tr("New"), bottomLayout, 2);
-    BtnDelete = addButton(tr("Delete"), bottomLayout, 3);
-
-    bottomLayout->setStretch(1,1);
-    bottomLayout->setStretch(2,1);
-    bottomLayout->setStretch(3,1);
-
-    return bottomLayout;
-}
-
-void PageScheme::connectSignals()
-{
-    connect(BtnCopy, SIGNAL(clicked()), this, SLOT(copyRow()));
-    connect(BtnNew, SIGNAL(clicked()), this, SLOT(newRow()));
-    connect(BtnDelete, SIGNAL(clicked()), this, SLOT(deleteRow()));
-    mapper = new QDataWidgetMapper(this);
-    connect(selectScheme, SIGNAL(currentIndexChanged(int)), mapper, SLOT(setCurrentIndex(int)));
-    connect(selectScheme, SIGNAL(currentIndexChanged(int)), this, SLOT(schemeSelected(int)));
-}
-
-PageScheme::PageScheme(QWidget* parent) : AbstractPage(parent)
-{
-    initPage();
-}
-
-void PageScheme::setModel(QAbstractItemModel * model)
-{
-    mapper->setModel(model);
-    selectScheme->setModel(model);
-
-    mapper->addMapping(LE_name, 0);
-    mapper->addMapping(TBW_mode_Forts, 1);
-    mapper->addMapping(TBW_teamsDivide, 2);
-    mapper->addMapping(TBW_solid, 3);
-    mapper->addMapping(TBW_border, 4);
-    mapper->addMapping(TBW_lowGravity, 5);
-    mapper->addMapping(TBW_laserSight, 6);
-    mapper->addMapping(TBW_invulnerable, 7);
-    mapper->addMapping(TBW_resethealth, 8);
-    mapper->addMapping(TBW_vampiric, 9);
-    mapper->addMapping(TBW_karma, 10);
-    mapper->addMapping(TBW_artillery, 11);
-    mapper->addMapping(TBW_randomorder, 12);
-    mapper->addMapping(TBW_king, 13);
-    mapper->addMapping(TBW_placehog, 14);
-    mapper->addMapping(TBW_sharedammo, 15);
-    mapper->addMapping(TBW_disablegirders, 16);
-    mapper->addMapping(TBW_disablelandobjects, 17);
-    mapper->addMapping(TBW_aisurvival, 18);
-    mapper->addMapping(TBW_infattack, 19);
-    mapper->addMapping(TBW_resetweps, 20);
-    mapper->addMapping(TBW_perhogammo, 21);
-    mapper->addMapping(TBW_nowind, 22);
-    mapper->addMapping(TBW_morewind, 23);
-    mapper->addMapping(TBW_tagteam, 24);
-    mapper->addMapping(TBW_bottomborder, 25);
-    mapper->addMapping(SB_DamageModifier, 26);
-    mapper->addMapping(SB_TurnTime, 27);
-    mapper->addMapping(SB_InitHealth, 28);
-    mapper->addMapping(SB_SuddenDeath, 29);
-    mapper->addMapping(SB_CaseProb, 30);
-    mapper->addMapping(SB_MinesTime, 31);
-    mapper->addMapping(SB_Mines, 32);
-    mapper->addMapping(SB_MineDuds, 33);
-    mapper->addMapping(SB_Explosives, 34);
-    mapper->addMapping(SB_HealthCrates, 35);
-    mapper->addMapping(SB_CrateHealth, 36);
-    mapper->addMapping(SB_WaterRise, 37);
-    mapper->addMapping(SB_HealthDecrease, 38);
-    mapper->addMapping(SB_RopeModifier, 39);
-	mapper->addMapping(SB_GetAwayTime, 40);
-
-    mapper->toFirst();
-}
-
-void PageScheme::newRow()
-{
-    QAbstractItemModel * model = mapper->model();
-    model->insertRow(-1);
-    selectScheme->setCurrentIndex(model->rowCount() - 1);
-}
-
-void PageScheme::copyRow()
-{
-    QAbstractItemModel * model = mapper->model();
-    model->insertRow(selectScheme->currentIndex());
-    selectScheme->setCurrentIndex(model->rowCount() - 1);
-}
-
-void PageScheme::deleteRow()
-{
-    QMessageBox reallyDelete(QMessageBox::Question, QMessageBox::tr("Schemes"), QMessageBox::tr("Really delete this game scheme?"), QMessageBox::Ok | QMessageBox::Cancel);
-
-    if (reallyDelete.exec() == QMessageBox::Ok) {
-        QAbstractItemModel * model = mapper->model();
-        model->removeRow(selectScheme->currentIndex());
-    }
-}
-
-void PageScheme::schemeSelected(int n)
-{
-    int c = ((AmmoSchemeModel*)mapper->model())->numberOfDefaultSchemes;
-    gbGameModes->setEnabled(n >= c);
-    gbBasicSettings->setEnabled(n >= c);
-    LE_name->setEnabled(n >= c);
-}
-
-
--- a/QTfrontend/pagescheme.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef PAGE_SCHEME_H
-#define PAGE_SCHEME_H
-
-#include "AbstractPage.h"
-#include "togglebutton.h"
-
-class FreqSpinBox;
-
-class PageScheme : public AbstractPage
-{
-    Q_OBJECT
-
-public:
-    PageScheme(QWidget* parent = 0);
-
-    QPushButton * BtnCopy;
-    QPushButton * BtnNew;
-    QPushButton * BtnDelete;
-    QPushButton * btnSave;
-    QComboBox * selectScheme;
-
-    void setModel(QAbstractItemModel * model);
-
-public slots:
-    void newRow();
-    void copyRow();
-    void deleteRow();
-
-protected:
-    QLayout * bodyLayoutDefinition();
-    QLayout * footerLayoutDefinition();
-    void connectSignals();
-
-private:
-    QDataWidgetMapper * mapper;
-    ToggleButtonWidget * TBW_mode_Forts;
-    ToggleButtonWidget * TBW_teamsDivide;
-    ToggleButtonWidget * TBW_solid;
-    ToggleButtonWidget * TBW_border;
-    ToggleButtonWidget * TBW_lowGravity;
-    ToggleButtonWidget * TBW_laserSight;
-    ToggleButtonWidget * TBW_invulnerable;
-    ToggleButtonWidget * TBW_resethealth;
-    ToggleButtonWidget * TBW_vampiric;
-    ToggleButtonWidget * TBW_karma;
-    ToggleButtonWidget * TBW_artillery;
-    ToggleButtonWidget * TBW_randomorder;
-    ToggleButtonWidget * TBW_king;
-    ToggleButtonWidget * TBW_placehog;
-    ToggleButtonWidget * TBW_sharedammo;
-    ToggleButtonWidget * TBW_disablegirders;
-    ToggleButtonWidget * TBW_disablelandobjects;
-    ToggleButtonWidget * TBW_aisurvival;
-    ToggleButtonWidget * TBW_infattack;
-    ToggleButtonWidget * TBW_resetweps;
-    ToggleButtonWidget * TBW_perhogammo;
-    ToggleButtonWidget * TBW_nowind;
-    ToggleButtonWidget * TBW_morewind;
-    ToggleButtonWidget * TBW_tagteam;
-    ToggleButtonWidget * TBW_bottomborder;
-
-    QSpinBox * SB_DamageModifier;
-    QSpinBox * SB_TurnTime;
-    QSpinBox * SB_InitHealth;
-    QSpinBox * SB_SuddenDeath;
-    QSpinBox * SB_WaterRise;
-    QSpinBox * SB_HealthDecrease;
-    FreqSpinBox * SB_CaseProb;
-    QSpinBox * SB_HealthCrates;
-    QSpinBox * SB_CrateHealth;
-    QSpinBox * SB_MinesTime;
-    QSpinBox * SB_Mines;
-    QSpinBox * SB_MineDuds;
-    QSpinBox * SB_Explosives;
-    QSpinBox * SB_RopeModifier;
-    QSpinBox * SB_GetAwayTime;
-    QLineEdit * LE_name;
-
-    QGroupBox * gbGameModes;
-    QGroupBox * gbBasicSettings;
-
-private slots:
-    void schemeSelected(int);
-};
-
-#endif
--- a/QTfrontend/pageselectweapon.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QGridLayout>
-#include <QHBoxLayout>
-#include <QPushButton>
-#include <QComboBox>
-
-#include "pageselectweapon.h"
-#include "hwconsts.h"
-#include "selectWeapon.h"
-
-QLayout * PageSelectWeapon::bodyLayoutDefinition()
-{
-    QGridLayout * pageLayout = new QGridLayout();
-
-    pWeapons = new SelWeaponWidget(cAmmoNumber, this);
-    pageLayout->addWidget(pWeapons);
-
-    return pageLayout;
-}
-
-QLayout * PageSelectWeapon::footerLayoutDefinition()
-{
-    QGridLayout * bottomLayout = new QGridLayout();
-
-    selectWeaponSet = new QComboBox(this);
-    bottomLayout->addWidget(selectWeaponSet, 0, 0, 2, 1);
-
-    // first row
-    BtnNew = addButton(tr("New"), bottomLayout, 0, 1);
-    BtnDefault = addButton(tr("Default"), bottomLayout, 0, 2);
-
-    // second row
-    BtnCopy = addButton(tr("Copy"), bottomLayout, 1, 1);
-    BtnDelete = addButton(tr("Delete"), bottomLayout, 1, 2);
-
-    bottomLayout->setColumnStretch(1,1);
-    bottomLayout->setColumnStretch(2,1);
-
-    btnSave = addButton(":/res/Save.png", bottomLayout, 0, 3, 2, 1, true);
-    btnSave->setStyleSheet("QPushButton{margin: 24px 0 0 0;}");
-    bottomLayout->setAlignment(btnSave, Qt::AlignRight | Qt::AlignBottom);
-
-    return bottomLayout;
-}
-
-void PageSelectWeapon::connectSignals()
-{
-    connect(BtnDefault, SIGNAL(clicked()), pWeapons, SLOT(setDefault()));
-    connect(btnSave, SIGNAL(clicked()), pWeapons, SLOT(save()));
-    connect(BtnNew, SIGNAL(clicked()), pWeapons, SLOT(newWeaponsName()));
-    connect(BtnCopy, SIGNAL(clicked()), pWeapons, SLOT(copy()));
-    connect(selectWeaponSet, SIGNAL(currentIndexChanged(const QString&)), pWeapons, SLOT(setWeaponsName(const QString&)));
-}
-
-PageSelectWeapon::PageSelectWeapon(QWidget* parent) :  AbstractPage(parent)
-{
-    initPage();
-}
--- a/QTfrontend/pageselectweapon.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef PAGE_SELECTWEAPON_H
-#define PAGE_SELECTWEAPON_H
-
-#include "AbstractPage.h"
-
-class SelWeaponWidget;
-
-class PageSelectWeapon : public AbstractPage
-{
-    Q_OBJECT
-
-public:
-    PageSelectWeapon(QWidget* parent = 0);
-
-    QPushButton *btnSave;
-    QPushButton *BtnDefault;
-    QPushButton *BtnDelete;
-    QPushButton *BtnNew;
-    QPushButton *BtnCopy;
-    SelWeaponWidget* pWeapons;
-    QComboBox* selectWeaponSet;
-
-protected:
-    QLayout * bodyLayoutDefinition();
-    QLayout * footerLayoutDefinition();
-    void connectSignals();
-};
-
-#endif
--- a/QTfrontend/pagesingleplayer.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,83 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QGridLayout>
-#include <QPushButton>
-
-#include "pagesingleplayer.h"
-#include "gamecfgwidget.h"
-
-QLayout * PageSinglePlayer::bodyLayoutDefinition()
-{
-    QVBoxLayout * vLayout = new QVBoxLayout();
-
-    QHBoxLayout * topLine = new QHBoxLayout();
-    QHBoxLayout * middleLine = new QHBoxLayout();
-    vLayout->addStretch();
-    vLayout->addLayout(topLine);
-    vLayout->addSpacing(30);
-    vLayout->addLayout(middleLine);
-    vLayout->addStretch();
-
-    topLine->addStretch();
-    BtnSimpleGamePage = addButton(":/res/SimpleGame.png", topLine, 0, true);
-    BtnSimpleGamePage->setToolTip(tr("Simple Game (a quick game against the computer, settings are chosen for you)"));
-    topLine->addSpacing(60);
-    BtnMultiplayer = addButton(":/res/Multiplayer.png", topLine, 1, true);
-    BtnMultiplayer->setToolTip(tr("Multiplayer (play a hotseat game against your friends, or AI teams)"));
-    topLine->addStretch();
-
-
-    BtnCampaignPage = addButton(":/res/Campaign.png", middleLine, 0, true);
-    BtnCampaignPage->setToolTip(tr("Campaign Mode (...). IN DEVELOPMENT"));
-    BtnCampaignPage->setVisible(false);
-
-    BtnTrainPage = addButton(":/res/Trainings.png", middleLine, 1, true);
-    BtnTrainPage->setToolTip(tr("Training Mode (Practice your skills in a range of training missions). IN DEVELOPMENT"));
-
-    return vLayout;
-}
-
-QLayout * PageSinglePlayer::footerLayoutDefinition()
-{
-    QHBoxLayout * bottomLine = new QHBoxLayout();
-    bottomLine->addStretch();
-
-    BtnDemos = addButton(":/res/Record.png", bottomLine, 1, true);
-    BtnDemos->setToolTip(tr("Demos (Watch recorded demos)"));
-    BtnLoad = addButton(":/res/Load.png", bottomLine, 2, true);
-    BtnLoad->setStyleSheet("QPushButton{margin: 24px 0 0 0;}");
-    BtnLoad->setToolTip(tr("Load (Load a previously saved game)"));
-
-    bottomLine->setStretch(1,0);
-    bottomLine->setStretch(2,0);
-    bottomLine->setAlignment(BtnDemos, Qt::AlignRight | Qt::AlignBottom);
-    bottomLine->setAlignment(BtnLoad, Qt::AlignRight | Qt::AlignBottom);
-
-    return bottomLine;
-}
-
-void PageSinglePlayer::connectSignals()
-{
-    //TODO
-}
-
-PageSinglePlayer::PageSinglePlayer(QWidget* parent) : AbstractPage(parent)
-{
-    initPage();
-}
--- a/QTfrontend/pagesingleplayer.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef PAGE_SINGLE_PLAYER_H
-#define PAGE_SINGLE_PLAYER_H
-
-#include "AbstractPage.h"
-
-class GameCFGWidget;
-
-class PageSinglePlayer : public AbstractPage
-{
-    Q_OBJECT
-
-public:
-    PageSinglePlayer(QWidget* parent = 0);
-
-    QPushButton *BtnSimpleGamePage;
-    QPushButton *BtnTrainPage;
-    QPushButton *BtnCampaignPage;
-    QPushButton *BtnMultiplayer;
-    QPushButton *BtnLoad;
-    QPushButton *BtnDemos;
-    GameCFGWidget *gameCFG;
-
-private:
-    QLayout * bodyLayoutDefinition();
-    QLayout * footerLayoutDefinition();
-    void connectSignals();
-};
-
-#endif
-
--- a/QTfrontend/pagetraining.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,234 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QGridLayout>
-#include <QVBoxLayout>
-#include <QLabel>
-#include <QListWidget>
-#include <QListWidgetItem>
-#include <QPushButton>
-
-#include <QFile>
-#include <QLocale>
-#include <QSettings>
-
-#include "pagetraining.h"
-#include "hwconsts.h"
-
-QLayout * PageTraining::bodyLayoutDefinition()
-{
-    QGridLayout * pageLayout = new QGridLayout();
-
-// left column
-
-    // declare start button, caption and description
-    btnPreview = formattedButton(":/res/Trainings.png", true);
-    btnPreview->setToolTip(QPushButton::tr("Go!"));
-
-    // make both rows equal height
-    pageLayout->setRowStretch(0, 1);
-    pageLayout->setRowStretch(1, 1);
-
-    // add start button, caption and description to 3 different rows
-    pageLayout->addWidget(btnPreview, 0, 0);
-
-    // center preview
-    pageLayout->setAlignment(btnPreview, Qt::AlignRight | Qt::AlignVCenter);
-
-
-// right column
-
-    // info area (caption on top, description below)
-    QVBoxLayout * infoLayout = new QVBoxLayout();
-
-    lblCaption = new QLabel();
-    lblCaption->setMinimumWidth(360);
-    lblCaption->setAlignment(Qt::AlignHCenter | Qt::AlignBottom);
-    lblCaption->setWordWrap(true);
-    lblDescription = new QLabel();
-    lblDescription->setMinimumWidth(360);
-    lblDescription->setAlignment(Qt::AlignHCenter | Qt::AlignTop);
-    lblDescription->setWordWrap(true);
-
-    infoLayout->addWidget(lblCaption);
-    infoLayout->addWidget(lblDescription);
-
-    pageLayout->addLayout(infoLayout, 0, 1);
-    pageLayout->setAlignment(infoLayout, Qt::AlignLeft);
-
-
-    // mission list
-    lstMissions = new QListWidget(this);
-    pageLayout->addWidget(lstMissions, 1, 0, 1, 2); // span 2 columns
-
-    // let's not make the list use more space than needed
-    lstMissions->setFixedWidth(360);
-    pageLayout->setAlignment(lstMissions, Qt::AlignHCenter);
-
-    return pageLayout;
-}
-
-QLayout * PageTraining::footerLayoutDefinition()
-{
-    QBoxLayout * bottomLayout = new QVBoxLayout();
-
-    btnStart = formattedButton(QPushButton::tr("Go!"));
-    btnStart->setFixedWidth(140);
-
-    bottomLayout->addWidget(btnStart);
-
-    bottomLayout->setAlignment(btnStart, Qt::AlignRight | Qt::AlignVCenter);
-
-    return bottomLayout;
-}
-
-
-void PageTraining::connectSignals()
-{
-    connect(lstMissions, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(updateInfo()));
-    connect(lstMissions, SIGNAL(clicked()), this, SLOT(updateInfo()));
-    connect(lstMissions, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(startSelected()));
-    connect(btnPreview, SIGNAL(clicked()), this, SLOT(startSelected()));
-    connect(btnStart, SIGNAL(clicked()), this, SLOT(startSelected()));
-}
-
-
-PageTraining::PageTraining(QWidget* parent) : AbstractPage(parent)
-{
-    initPage();
-
-    // get locale
-    QSettings settings(cfgdir->absolutePath() + "/hedgewars.ini",
-                       QSettings::IniFormat);
-
-    QString loc = settings.value("misc/locale", "").toString();
-    if (loc.isEmpty())
-        loc = QLocale::system().name();
-
-    QString infoFile = 
-                datadir->absolutePath() + "/Locale/missions_" + loc + ".txt";
-
-    // if file is non-existant try with language only
-    if (!QFile::exists(infoFile))
-        infoFile = datadir->absolutePath() + "/Locale/missions_" + 
-                loc.replace(QRegExp("_.*$"),"") + ".txt";
-
-    // fallback if file for current locale is non-existant
-    if (!QFile::exists(infoFile))
-        infoFile = datadir->absolutePath() + "/Locale/missions_en.txt";
-
-    // preload mission info for current locale
-    m_info = new QSettings(infoFile, QSettings::IniFormat, this);
-
-//  TODO -> this should be done in a tool "DataDir" class
-    QDir tmpdir;
-    tmpdir.cd(cfgdir->absolutePath());
-    tmpdir.cd("Data/Missions/Training");
-    QStringList missionList = scriptList(tmpdir);
-    missionList.sort();
-
-    tmpdir.cd(datadir->absolutePath());
-    tmpdir.cd("Missions/Training");
-    QStringList defaultList = scriptList(tmpdir);
-    defaultList.sort();
-
-    // add non-duplicate default scripts to the list
-    foreach (const QString & mission, defaultList)
-    {
-        if (!missionList.contains(mission))
-            missionList.append(mission);
-    }
-
-    // add default scripts that have names different from detected user scripts
-    foreach (const QString & mission, missionList)
-    {
-        QListWidgetItem * item = new QListWidgetItem(mission);
-
-        // fallback name: replace underscores in mission name with spaces
-        QString name = item->text().replace("_", " ");
-
-        // see if we can get a prettier/translated name
-        name = m_info->value(mission + ".name", name).toString();
-
-        item->setText(name);
-
-        // store original name in data
-        item->setData(Qt::UserRole, mission);
-
-        lstMissions->addItem(item);
-    }
-
-    updateInfo();
-
-    // pre-select first mission
-    if (lstMissions->count() > 0)
-        lstMissions->setCurrentRow(0);
-}
-
-QStringList PageTraining::scriptList(const QDir & scriptDir) const
-{
-    QDir dir = scriptDir;
-    dir.setFilter(QDir::Files);
-    return dir.entryList(QStringList("*.lua")).replaceInStrings(QRegExp("^(.*)\\.lua"), "\\1");
-}
-
-
-void PageTraining::startSelected()
-{
-    QListWidgetItem * curItem = lstMissions->currentItem();
-
-    if (curItem != NULL)
-        emit startMission(curItem->data(Qt::UserRole).toString());
-}
-
-
-void PageTraining::updateInfo()
-{
-    if (lstMissions->currentItem())
-    {
-        // TODO also use .pngs in userdata folder
-        QString thumbFile = datadir->absolutePath() +
-                    "/Graphics/Missions/Training/" +
-                    lstMissions->currentItem()->data(Qt::UserRole).toString() +
-                    ".png";
-
-        if (QFile::exists(thumbFile))
-            btnPreview->setIcon(QIcon(thumbFile));
-        else
-            btnPreview->setIcon(QIcon(":/res/Trainings.png"));
-
-        QString realName = lstMissions->currentItem()->data(
-                           Qt::UserRole).toString();
-
-        QString caption = m_info->value(realName + ".name", 
-                          lstMissions->currentItem()->text()).toString();
-
-        QString description = m_info->value(realName + ".desc",
-                              tr("No description available")).toString();
-
-        lblCaption->setText("<h2>" + caption +"</h2>");
-        lblDescription->setText(description);
-    }
-    else
-    {
-        btnPreview->setIcon(QIcon(":/res/Trainings.png"));
-        lblCaption->setText(tr("Select a mission!"));
-        // TODO better text and tr()
-        lblDescription->setText("");
-    }
-}
--- a/QTfrontend/pagetraining.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef PAGE_TRAINING_H
-#define PAGE_TRAINING_H
-
-#include <QDir>
-
-#include "AbstractPage.h"
-
-class PageTraining : public AbstractPage
-{
-    Q_OBJECT
-
-public:
-    PageTraining(QWidget* parent = 0);
-
-
-signals:
-    void startMission(const QString & scriptName);
-
-
-protected:
-    QLayout * bodyLayoutDefinition();
-    QLayout * footerLayoutDefinition();
-    void connectSignals();
-
-
-private:
-    QPushButton * btnPreview;
-    QPushButton * btnStart;
-    QLabel * lblCaption;
-    QLabel * lblDescription;
-    QListWidget * lstMissions;
-    QSettings * m_info;
-
-    QStringList scriptList(const QDir & scriptDir) const;
-
-
-private slots:
-    void startSelected();
-    void updateInfo();
-
-};
-
-#endif
-
--- a/QTfrontend/proto.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include "proto.h"
-
-HWProto::HWProto()
-{
-
-}
-
-QByteArray & HWProto::addByteArrayToBuffer(QByteArray & buf, const QByteArray & msg)
-{
-    QByteArray bmsg = msg;
-    bmsg = bmsg.left(250);
-    quint8 sz = bmsg.size();
-    buf.append(QByteArray((char *)&sz, 1));
-    buf.append(bmsg);
-    return buf;
-}
-
-QByteArray & HWProto::addStringToBuffer(QByteArray & buf, const QString & string)
-{
-    return addByteArrayToBuffer(buf, string.toUtf8());
-}
-
-QByteArray & HWProto::addStringListToBuffer(QByteArray & buf, const QStringList & strList)
-{
-    for (int i = 0; i < strList.size(); i++)
-        addStringToBuffer(buf, strList[i]);
-    return buf;
-}
-
-QString HWProto::formatChatMsgForFrontend(const QString & msg)
-{
-    return formatChatMsg("|nick|", msg);
-}
-
-QString HWProto::formatChatMsg(const QString & nick, const QString & msg)
-{
-    if(msg.left(4) == "/me ")
-        return QString("\x02* %1 %2").arg(nick).arg(msg.mid(4));
-    else
-        return QString("\x01%1: %2").arg(nick).arg(msg);
-}
--- a/QTfrontend/proto.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef _PROTO_H
-#define _PROTO_H
-
-#include <QByteArray>
-#include <QString>
-#include <QStringList>
-
-
-class HWProto : public QObject
-{
-    Q_OBJECT
-
-public:
-    HWProto();
-    static QByteArray & addStringToBuffer(QByteArray & buf, const QString & string);
-    static QByteArray & addByteArrayToBuffer(QByteArray & buf, const QByteArray & msg);
-    static QByteArray & addStringListToBuffer(QByteArray & buf, const QStringList & strList);
-    static QString formatChatMsg(const QString & nick, const QString & msg);
-    static QString formatChatMsgForFrontend(const QString & msg);
-};
-
-#endif // _PROTO_H
--- a/QTfrontend/qaspectratiolayout.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,206 +0,0 @@
-/*
- * Copyright (c) 2009 Nokia Corporation.
- */
-
-#include "qaspectratiolayout.h"
-
-QAspectRatioLayout::QAspectRatioLayout(QWidget* parent, int spacing) : QLayout(parent) {
-        init(spacing);
-}
-
-QAspectRatioLayout::QAspectRatioLayout(int spacing) {
-        init(spacing);
-}
-
-QAspectRatioLayout::~QAspectRatioLayout() {
-        delete item;
-        delete lastReceivedRect;
-        delete _geometry;
-}
-
-void QAspectRatioLayout::init(int spacing) {
-        item = 0;
-        lastReceivedRect = new QRect(0, 0, 0, 0);
-        _geometry = new QRect(0, 0, 0, 0);
-        setSpacing(spacing);
-}
-
-
-/* Adds item if place isn't already taken. */
-void QAspectRatioLayout::add(QLayoutItem* item) {
-        if(!hasItem()) {
-                replaceItem(item);
-        }
-}
-
-/* Adds item if place isn't already taken. */
-void QAspectRatioLayout::addItem(QLayoutItem* item) {
-        if(!hasItem()) {
-                replaceItem(item);
-        }
-}
-
-/* Adds widget if place isn't already taken. */
-void QAspectRatioLayout::addWidget(QWidget* widget) {
-        if(!hasItem()) {
-                replaceItem(new QWidgetItem(widget));
-        }
-}
-
-/* Returns the item pointer and dereferences it here. */
-QLayoutItem* QAspectRatioLayout::take() {
-        QLayoutItem* item = 0;
-        if(this->hasItem()) {
-                item = this->item;
-                this->item = 0;
-        }
-        return item;
-}
-
-/* Returns the item pointer and dereferences it here. */
-QLayoutItem* QAspectRatioLayout::takeAt(int index) {
-        if(index != 0) {
-                return 0;
-        }
-        return this->take();
-}
-
-/* Returns the item pointer. */
-QLayoutItem* QAspectRatioLayout::itemAt(int index) const {
-        if(index != 0) {
-                return 0;
-        }
-        if(hasItem()) {
-                return this->item;
-        }
-        return 0;
-}
-
-/* Checks if we have an item. */
-bool QAspectRatioLayout::hasItem() const {
-        return this->item != 0;
-}
-
-/* Returns the count of items which can be either 0 or 1. */
-int QAspectRatioLayout::count() const {
-        int returnValue = 0;
-        if(hasItem()) {
-                returnValue = 1;
-        }
-        return returnValue;
-}
-
-/* Replaces the item with the new and returns the old. */
-QLayoutItem* QAspectRatioLayout::replaceItem(QLayoutItem* item) {
-        QLayoutItem* old = 0;
-        if(this->hasItem()) {
-                old = this->item;
-        }
-        this->item = item;
-        setGeometry(*this->_geometry);
-        return old;
-}
-
-/* Tells which way layout expands. */
-Qt::Orientations QAspectRatioLayout::expandingDirections() const {
-        return Qt::Horizontal | Qt::Vertical;
-}
-
-/* Tells which size is preferred. */
-QSize QAspectRatioLayout::sizeHint() const {
-        return this->item->minimumSize();
-}
-
-/* Tells minimum size. */
-QSize QAspectRatioLayout::minimumSize() const {
-        return this->item->minimumSize();
-}
-
-/*
- * Tells if heightForWidth calculations is handled.
- * It isn't since width isn't enough to calculate
- * proper size.
- */
-bool QAspectRatioLayout::hasHeightForWidth() const {
-        return false;
-}
-
-/* Replaces lastReceivedRect. */
-void QAspectRatioLayout::setLastReceivedRect(const QRect& rect) {
-        QRect* oldRect = this->lastReceivedRect;
-        this->lastReceivedRect = new QRect(rect.topLeft(), rect.size());
-        delete oldRect;
-}
-
-/* Returns geometry */
-QRect QAspectRatioLayout::geometry() {
-        return QRect(*this->_geometry);
-}
-
-/* Sets geometry to given size. */
-void QAspectRatioLayout::setGeometry(const QRect& rect) {
-        /*
-         * We check if the item is set and
-         * if size is the same previously received.
-         * If either is false nothing is done.
-         */
-        if(!this->hasItem() ||
-           areRectsEqual(*this->lastReceivedRect, rect)) {
-                return;
-        }
-        /* Replace the last received rectangle. */
-        setLastReceivedRect(rect);
-        /* Calculate proper size for the item relative to the received size. */
-        QSize properSize = calculateProperSize(rect.size());
-        /* Calculate center location in the rect and with item size. */
-        QPoint properLocation = calculateCenterLocation(rect.size(), properSize);
-        /* Set items geometry */
-        this->item->setGeometry(QRect(properLocation, properSize));
-        QRect* oldRect = this->_geometry;
-        /* Cache the calculated geometry. */
-        this->_geometry = new QRect(properLocation, properSize);
-        delete oldRect;
-        /* Super classes setGeometry */
-        QLayout::setGeometry(*this->_geometry);
-}
-
-/* Takes the shortest side and creates QSize
- * with the shortest side as width and height. */
-QSize QAspectRatioLayout::calculateProperSize(QSize from) const {
-        QSize properSize;
-        if(from.height() * 2 < from.width()) {
-                properSize.setHeight(from.height() - this->margin());
-                properSize.setWidth(from.height() * 2 - this->margin());
-        }
-        else {
-                properSize.setWidth(from.width() - this->margin());
-                properSize.setHeight(from.width() / 2 - this->margin());
-        }
-        return properSize;
-}
-
-/* Calculates center location from the given height and width for item size. */
-QPoint QAspectRatioLayout::calculateCenterLocation(QSize from,
-                                                   QSize itemSize) const {
-        QPoint centerLocation;
-        if((from.width() - itemSize.width()) > 0) {
-                centerLocation.setX((from.width() - itemSize.width())/2);
-        }
-        if((from.height() - itemSize.height()) > 0) {
-                centerLocation.setY((from.height() - itemSize.height())/2);
-        }
-        return centerLocation;
-}
-
-/* Compares if two QRects are equal. */
-bool QAspectRatioLayout::areRectsEqual(const QRect& a,
-                                       const QRect& b) const {
-        bool result = false;
-        if(a.x() == b.x() &&
-           a.y() == b.y() &&
-           a.height() == b.height() &&
-           a.width() == b.width()) {
-                result = true;
-        }
-        return result;
-}
--- a/QTfrontend/qaspectratiolayout.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 2009 Nokia Corporation.
- */
-
-#ifndef QASPECTRATIOLAYOUT_H_
-#define QASPECTRATIOLAYOUT_H_
-
-#include <QLayout>
-#include <QPointer>
-#include <QRect>
-#include <QWidgetItem>
-#include <QLayoutItem>
-
-
-class QAspectRatioLayout : public QLayout
-{
-        Q_OBJECT
-
-public:
-        QAspectRatioLayout(QWidget* parent, int spacing =-1);
-        QAspectRatioLayout(int spacing = -1);
-        ~QAspectRatioLayout();
-
-        /* Convenience method */
-        virtual void add(QLayoutItem* item);
-
-/* http://doc.trolltech.com/qlayout.html#addItem */
-        virtual void addItem(QLayoutItem* item);
-        /* http://doc.trolltech.com/qlayout.html#addWidget */
-        virtual void addWidget(QWidget* widget);
-        /* http://doc.trolltech.com/qlayout.html#takeAt */
-        virtual QLayoutItem* takeAt(int index);
-        /* http://doc.trolltech.com/qlayout.html#itemAt */
-        virtual QLayoutItem* itemAt(int index) const;
-        /* http://doc.trolltech.com/qlayout.html#count */
-        virtual int count() const;
-
-        /*
-         * These are ours since we do have only one item.
-         */
-        virtual QLayoutItem* replaceItem(QLayoutItem* item);
-        virtual QLayoutItem* take();
-        virtual bool hasItem() const;
-
-/* http://doc.trolltech.com/qlayout.html#expandingDirections */
-        virtual Qt::Orientations expandingDirections() const;
-
-        /*
-         * This method contains most of the juice of this article.
-         * http://doc.trolltech.com/qlayoutitem.html#setGeometry
-         */
-        virtual void setGeometry(const QRect& rect);
-        /* http://doc.trolltech.com/qlayoutitem.html#geometry */
-        virtual QRect geometry();
-
-        /* http://doc.trolltech.com/qlayoutitem.html#sizeHint */
-        virtual QSize sizeHint() const;
-        /* http://doc.trolltech.com/qlayout.html#minimumSize */
-        virtual QSize minimumSize() const;
-        /* http://doc.trolltech.com/qlayoutitem.html#hasHeightForWidth */
-        virtual bool hasHeightForWidth() const;
-
-private:
-        /* Saves the last received rect. */
-        void setLastReceivedRect(const QRect& rect);
-        /* Used to initialize the object. */
-        void init(int spacing);
-        /* Calculates the maximum size for the item from the assigned size. */
-        QSize calculateProperSize(QSize from) const;
-        /* Calculates the center location from the assigned size and
-         * the items size. */
-        QPoint calculateCenterLocation(QSize from, QSize itemSize) const;
-        /* Check if two QRects are equal */
-        bool areRectsEqual(const QRect& a, const QRect& b) const;
-        /* Contains item reference */
-        QLayoutItem* item;
-        /*
-         * Used for caching so we won't do calculations every time
-         * setGeometry is called.
-         */
-        QRect* lastReceivedRect;
-        /* Contains geometry */
-        QRect* _geometry;
-
-};
-
-#endif /* QASPECTRATIOLAYOUT_H_ */
--- a/QTfrontend/selectWeapon.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,294 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2008 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include "selectWeapon.h"
-#include "weaponItem.h"
-#include "hwconsts.h"
-
-#include <QPushButton>
-#include <QGridLayout>
-#include <QHBoxLayout>
-#include <QLabel>
-#include <QBitmap>
-#include <QLineEdit>
-#include <QSettings>
-#include <QMessageBox>
-#include <QTabWidget>
-#include <math.h>
-
-QImage getAmmoImage(int num)
-{
-    static QImage ammo(":Ammos.png");
-    int x = num/(ammo.height()/32);
-    int y = (num-((ammo.height()/32)*x))*32;
-    x*=32;
-    return ammo.copy(x, y, 32, 32);
-}
-
-SelWeaponItem::SelWeaponItem(bool allowInfinite, int iconNum, int wNum, QImage image, QImage imagegrey, QWidget* parent) :
-    QWidget(parent)
-{
-    QHBoxLayout* hbLayout = new QHBoxLayout(this);
-    hbLayout->setSpacing(1);
-    hbLayout->setMargin(1);
-
-    QLabel* lbl = new QLabel(this);
-    lbl->setPixmap(QPixmap::fromImage(getAmmoImage(iconNum)));
-    lbl->setMaximumWidth(30);
-    lbl->setGeometry(0, 0, 30, 30);
-    hbLayout->addWidget(lbl);
-
-    item = new WeaponItem(image, imagegrey, this);
-    item->setItemsNum(wNum);
-    item->setInfinityState(allowInfinite);
-    hbLayout->addWidget(item);
-
-    hbLayout->setStretchFactor(lbl, 1);
-    hbLayout->setStretchFactor(item, 99);
-    hbLayout->setAlignment(lbl, Qt::AlignLeft | Qt::AlignVCenter);
-    hbLayout->setAlignment(item, Qt::AlignLeft | Qt::AlignVCenter);
-}
-
-void SelWeaponItem::setItemsNum(const unsigned char num)
-{
-    item->setItemsNum(num);
-}
-
-unsigned char SelWeaponItem::getItemsNum() const
-{
-    return item->getItemsNum();
-}
-
-void SelWeaponItem::setEnabled(bool value)
-{
-    item->setEnabled(value);
-}
-
-SelWeaponWidget::SelWeaponWidget(int numItems, QWidget* parent) :
-  QFrame(parent),
-  m_numItems(numItems)
-{
-    wconf = new QSettings(cfgdir->absolutePath() + "/weapons.ini", QSettings::IniFormat, this);
-
-    for(int i = 0; i < cDefaultAmmos.size(); ++i)
-        wconf->setValue(cDefaultAmmos[i].first, cDefaultAmmos[i].second);
-
-    QStringList keys = wconf->allKeys();
-    for(int i = 0; i < keys.size(); i++)
-    {
-        if (wconf->value(keys[i]).toString().size() != cDefaultAmmoStore->size())
-            wconf->remove(keys[i]);
-    }
-
-    QString currentState = *cDefaultAmmoStore;
-
-    QTabWidget * tbw = new QTabWidget(this);
-    QWidget * page1 = new QWidget(this);
-    p1Layout = new QGridLayout(page1);
-    p1Layout->setSpacing(1);
-    p1Layout->setMargin(1);
-    QWidget * page2 = new QWidget(this);
-    p2Layout = new QGridLayout(page2);
-    p2Layout->setSpacing(1);
-    p2Layout->setMargin(1);
-    QWidget * page3 = new QWidget(this);
-    p3Layout = new QGridLayout(page3);
-    p3Layout->setSpacing(1);
-    p3Layout->setMargin(1);
-    QWidget * page4 = new QWidget(this);
-    p4Layout = new QGridLayout(page4);
-    p4Layout->setSpacing(1);
-    p4Layout->setMargin(1);
-
-    tbw->addTab(page1, tr("Weapon set"));
-    tbw->addTab(page2, tr("Probabilities"));
-    tbw->addTab(page4, tr("Ammo in boxes"));
-    tbw->addTab(page3, tr("Delays"));
-
-    QGridLayout * pageLayout = new QGridLayout(this);
-    pageLayout->addWidget(tbw);
-
-
-    int j = -1;
-    int i = 0, k = 0;
-    for(; i < m_numItems; ++i) {
-        if (i == 6) continue;
-        if (i == 52) continue; // Disable structures for now
-        if (k % 4 == 0) ++j;
-        SelWeaponItem * swi = new SelWeaponItem(true, i, currentState[i].digitValue(), QImage(":/res/ammopic.png"), QImage(":/res/ammopicgrey.png"), this);
-        weaponItems[i].append(swi);
-        p1Layout->addWidget(swi, j, k % 4);
-
-        SelWeaponItem * pwi = new SelWeaponItem(false, i, currentState[numItems + i].digitValue(), QImage(":/res/ammopicbox.png"), QImage(":/res/ammopicboxgrey.png"), this);
-        weaponItems[i].append(pwi);
-        p2Layout->addWidget(pwi, j, k % 4);
-
-        SelWeaponItem * dwi = new SelWeaponItem(false, i, currentState[numItems*2 + i].digitValue(), QImage(":/res/ammopicdelay.png"), QImage(":/res/ammopicdelaygrey.png"), this);
-        weaponItems[i].append(dwi);
-        p3Layout->addWidget(dwi, j, k % 4);
-
-        SelWeaponItem * awi = new SelWeaponItem(false, i, currentState[numItems*3 + i].digitValue(), QImage(":/res/ammopic.png"), QImage(":/res/ammopicgrey.png"), this);
-        weaponItems[i].append(awi);
-        p4Layout->addWidget(awi, j, k % 4);
-
-        ++k;
-    }
-
-    //pLayout->setRowStretch(5, 100);
-    m_name = new QLineEdit(this);
-    pageLayout->addWidget(m_name, i, 0, 1, 5);
-}
-
-void SelWeaponWidget::setWeapons(const QString& ammo)
-{
-    bool enable = true;
-    for(int i = 0; i < cDefaultAmmos.size(); i++)
-        if (!cDefaultAmmos[i].first.compare(m_name->text())) {
-            enable = false;
-        }
-    for(int i = 0; i < m_numItems; ++i) {
-        twi::iterator it = weaponItems.find(i);
-        if (it == weaponItems.end()) continue;
-        it.value()[0]->setItemsNum(ammo[i].digitValue());
-        it.value()[1]->setItemsNum(ammo[m_numItems + i].digitValue());
-        it.value()[2]->setItemsNum(ammo[m_numItems*2 + i].digitValue());
-        it.value()[3]->setItemsNum(ammo[m_numItems*3 + i].digitValue());
-        it.value()[0]->setEnabled(enable);
-        it.value()[1]->setEnabled(enable);
-        it.value()[2]->setEnabled(enable);
-        it.value()[3]->setEnabled(enable);
-    }
-    m_name->setEnabled(enable);
-}
-
-void SelWeaponWidget::setDefault()
-{
-    for(int i = 0; i < cDefaultAmmos.size(); i++)
-        if (!cDefaultAmmos[i].first.compare(m_name->text())) {
-            return;
-        }
-    setWeapons(*cDefaultAmmoStore);
-}
-
-void SelWeaponWidget::save()
-{
-    for(int i = 0; i < cDefaultAmmos.size(); i++)
-        if (!cDefaultAmmos[i].first.compare(m_name->text())) {
-            QMessageBox::warning(0, QMessageBox::tr("Weapons"), QMessageBox::tr("Can not overwrite default weapon set '%1'!").arg(cDefaultAmmos[i].first));
-            return;
-        }
-
-    if (m_name->text() == "") return;
-
-    QString state1;
-    QString state2;
-    QString state3;
-    QString state4;
-
-    for(int i = 0; i < m_numItems; ++i) {
-        twi::const_iterator it = weaponItems.find(i);
-        int num = it == weaponItems.end() ? 9 : it.value()[0]->getItemsNum(); // 9 is for 'skip turn'
-        state1.append(QString::number(num));
-        int prob = it == weaponItems.end() ? 0 : it.value()[1]->getItemsNum();
-        state2.append(QString::number(prob));
-        int del = it == weaponItems.end() ? 0 : it.value()[2]->getItemsNum();
-        state3.append(QString::number(del));
-        int am = it == weaponItems.end() ? 0 : it.value()[3]->getItemsNum();
-        state4.append(QString::number(am));
-    }
-    if (curWeaponsName != "") {
-        // remove old entry
-        wconf->remove(curWeaponsName);
-    }
-    wconf->setValue(m_name->text(), state1 + state2 + state3 + state4);
-    emit weaponsChanged();
-}
-
-int SelWeaponWidget::operator [] (unsigned int weaponIndex) const
-{
-    twi::const_iterator it = weaponItems.find(weaponIndex);
-    return it == weaponItems.end() ? 9 : it.value()[0]->getItemsNum();
-}
-
-QString SelWeaponWidget::getWeaponsString(const QString& name) const
-{
-    return wconf->value(name).toString();
-}
-
-void SelWeaponWidget::deleteWeaponsName()
-{
-    if (curWeaponsName == "") return;
-
-    for(int i = 0; i < cDefaultAmmos.size(); i++)
-        if (!cDefaultAmmos[i].first.compare(m_name->text())) {
-            QMessageBox::warning(0, QMessageBox::tr("Weapons"), QMessageBox::tr("Can not delete default weapon set '%1'!").arg(cDefaultAmmos[i].first));
-            return;
-        }
-
-    QMessageBox reallyDelete(QMessageBox::Question, QMessageBox::tr("Weapons"), QMessageBox::tr("Really delete this weapon set?"), QMessageBox::Ok | QMessageBox::Cancel);
-
-    if (reallyDelete.exec() == QMessageBox::Ok) {
-        wconf->remove(curWeaponsName);
-        emit weaponsDeleted();
-    }
-}
-
-void SelWeaponWidget::newWeaponsName()
-{
-    QString newName = tr("new");
-    if(wconf->contains(newName)) {
-        //name already used -> look for an appropriate name:
-        int i=2;
-        while(wconf->contains(newName = tr("new")+QString::number(i++)));
-    }
-    setWeaponsName(newName);
-}
-
-void SelWeaponWidget::setWeaponsName(const QString& name)
-{
-    m_name->setText(name);
-
-    curWeaponsName = name;
-
-    if(name != "" && wconf->contains(name)) {
-        setWeapons(wconf->value(name).toString());
-    } else {
-        setWeapons(*cDefaultAmmoStore);
-    }
-}
-
-QStringList SelWeaponWidget::getWeaponNames() const
-{
-    return wconf->allKeys();
-}
-
-void SelWeaponWidget::copy()
-{
-    if(wconf->contains(curWeaponsName)) {
-        QString ammo = getWeaponsString(curWeaponsName);
-        QString newName = tr("copy of") + " " + curWeaponsName;
-        if(wconf->contains(newName)) {
-            //name already used -> look for an appropriate name:
-            int i=2;
-            while(wconf->contains(newName = tr("copy of") + " " + curWeaponsName+QString::number(i++)));
-        }
-        setWeaponsName(newName);
-        setWeapons(ammo);
-    }
-}
--- a/QTfrontend/selectWeapon.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,92 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2008 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef _SELECT_WEAPON_INCLUDED
-#define _SELECT_WEAPON_INCLUDED
-
-#include <QFrame>
-#include <QMap>
-#include <QList>
-
-class QGridLayout;
-class WeaponItem;
-class QLineEdit;
-class QSettings;
-
-class SelWeaponItem : public QWidget
-{
-  Q_OBJECT
-
-public:
-  SelWeaponItem(bool allowInfinite, int iconNum, int wNum, QImage image, QImage imagegrey, QWidget* parent=0);
-
-  unsigned char getItemsNum() const;
-  void setItemsNum(const unsigned char num);
-  void setEnabled(bool value);
-
- private:
-  WeaponItem* item;
-};
-
-class SelWeaponWidget : public QFrame
-{
-  Q_OBJECT
-
- public:
-  SelWeaponWidget(int numItems, QWidget* parent=0);
-  QString getWeaponsString(const QString& name) const;
-  QStringList getWeaponNames() const;
-
- public slots:
-  void setDefault();
-  void setWeapons(const QString& ammo);
-  //sets the name of the current set
-  void setWeaponsName(const QString& name);
-  void deleteWeaponsName();
-  void newWeaponsName();
-  void save();
-  void copy();
-
- signals:
-  void weaponsChanged();
-  void weaponsDeleted();
-
- private:
-  //the name of the current weapon set
-  QString curWeaponsName;
-
-  QLineEdit* m_name;
-
-  //storage for all the weapons sets
-  QSettings* wconf;
-
-  const int m_numItems;
-  int operator [] (unsigned int weaponIndex) const;
-
-  typedef QList<SelWeaponItem*> ItemsList;
-  typedef QMap<int, ItemsList> twi;
-  twi weaponItems;
-  //layout element for each tab:
-  QGridLayout* p1Layout;
-  QGridLayout* p2Layout;
-  QGridLayout* p3Layout;
-  QGridLayout* p4Layout;
-};
-
-#endif // _SELECT_WEAPON_INCLUDED
--- a/QTfrontend/tcpBase.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,166 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2007 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include "tcpBase.h"
-
-#include <QMessageBox>
-#include <QList>
-
-#include <QImage>
-
-#include "hwconsts.h"
-
-QList<TCPBase*> srvsList;
-QPointer<QTcpServer> TCPBase::IPCServer(0);
-
-TCPBase::~TCPBase()
-{
-}
-
-TCPBase::TCPBase(bool demoMode) :
-  m_isDemoMode(demoMode),
-  IPCSocket(0)
-{
-  if(!IPCServer) {
-    IPCServer = new QTcpServer(0);
-    IPCServer->setMaxPendingConnections(1);
-    if (!IPCServer->listen(QHostAddress::LocalHost)) {
-      QMessageBox::critical(0, tr("Error"),
-                tr("Unable to start the server: %1.")
-                .arg(IPCServer->errorString()));
-      exit(0); // FIXME - should be graceful exit here
-    }
-  }
-  ipc_port=IPCServer->serverPort();
-}
-
-void TCPBase::NewConnection()
-{
-  if(IPCSocket) {
-    // connection should be already finished
-    return;
-  }
-  disconnect(IPCServer, SIGNAL(newConnection()), this, SLOT(NewConnection()));
-  IPCSocket = IPCServer->nextPendingConnection();
-  if(!IPCSocket) return;
-  connect(IPCSocket, SIGNAL(disconnected()), this, SLOT(ClientDisconnect()));
-  connect(IPCSocket, SIGNAL(readyRead()), this, SLOT(ClientRead()));
-  SendToClientFirst();
-}
-
-void TCPBase::RealStart()
-{
-  connect(IPCServer, SIGNAL(newConnection()), this, SLOT(NewConnection()));
-  IPCSocket = 0;
-
-  QProcess * process;
-  process = new QProcess;
-  connect(process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(StartProcessError(QProcess::ProcessError)));
-  QStringList arguments=getArguments();
-
-  // redirect everything written on stdout/stderr
-  if(isDevBuild)
-    process->setProcessChannelMode(QProcess::ForwardedChannels);
-  process->start(bindir->absolutePath() + "/hwengine", arguments);
-}
-
-void TCPBase::ClientDisconnect()
-{
-  disconnect(IPCSocket, SIGNAL(readyRead()), this, SLOT(ClientRead()));
-  onClientDisconnect();
-
-  if(srvsList.size()==1) srvsList.pop_front();
-  emit isReadyNow();
-  IPCSocket->deleteLater();
-  deleteLater();
-}
-
-void TCPBase::ClientRead()
-{
-  QByteArray readed=IPCSocket->readAll();
-  if(readed.isEmpty()) return;
-  readbuffer.append(readed);
-  onClientRead();
-}
-
-void TCPBase::StartProcessError(QProcess::ProcessError error)
-{
-  QMessageBox::critical(0, tr("Error"),
-            tr("Unable to run engine: %1 (")
-            .arg(error) + bindir->absolutePath() + "/hwengine)");
-}
-
-void TCPBase::tcpServerReady()
-{
-  disconnect(srvsList.takeFirst(), SIGNAL(isReadyNow()), this, SLOT(tcpServerReady()));
-
-  RealStart();
-}
-
-void TCPBase::Start()
-{
-  if(srvsList.isEmpty()) {
-    srvsList.push_back(this);
-  } else {
-    connect(srvsList.back(), SIGNAL(isReadyNow()), this, SLOT(tcpServerReady()));
-    srvsList.push_back(this);
-    return;
-  }
-
-  RealStart();
-}
-
-void TCPBase::onClientRead()
-{
-}
-
-void TCPBase::onClientDisconnect()
-{
-}
-
-void TCPBase::SendToClientFirst()
-{
-}
-
-void TCPBase::SendIPC(const QByteArray & buf)
-{
-    if (buf.size() > MAXMSGCHARS) return;
-    quint8 len = buf.size();
-    RawSendIPC(QByteArray::fromRawData((char *)&len, 1) + buf);
-}
-
-void TCPBase::RawSendIPC(const QByteArray & buf)
-{
-    if (!IPCSocket)
-    {
-        toSendBuf += buf;
-    } else
-    {
-        if (toSendBuf.size() > 0)
-        {
-            IPCSocket->write(toSendBuf);
-            if(m_isDemoMode) demo.append(toSendBuf);
-            toSendBuf.clear();
-        }
-        if(!buf.isEmpty()) {
-          IPCSocket->write(buf);
-          if(m_isDemoMode) demo.append(buf);
-        }
-    }
-}
--- a/QTfrontend/tcpBase.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2007 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef _TCPBASE_INCLUDED
-#define _TCPBASE_INCLUDED
-
-#include <QObject>
-#include <QTcpServer>
-#include <QTcpSocket>
-#include <QByteArray>
-#include <QString>
-#include <QDir>
-#include <QProcess>
-#include <QPointer>
-
-#include <QImage>
-
-#define MAXMSGCHARS 255
-
-class TCPBase : public QObject
-{
-  Q_OBJECT
-
- public:
-  TCPBase(bool demoMode);
-  virtual ~TCPBase();
-
- signals:
-  void isReadyNow();
-
- protected:
-  quint16 ipc_port;
-
-  void Start();
-
-  QByteArray readbuffer;
-
-  QByteArray toSendBuf;
-  QByteArray demo;
-
-  void SendIPC(const QByteArray & buf);
-  void RawSendIPC(const QByteArray & buf);
-
-  virtual QStringList getArguments()=0;
-  virtual void onClientRead();
-  virtual void onClientDisconnect();
-  virtual void SendToClientFirst();
-
- private:
-  static QPointer<QTcpServer> IPCServer;
-
-  bool m_isDemoMode;
-  void RealStart();
-  QPointer<QTcpSocket> IPCSocket;
-
- private slots:
-  void NewConnection();
-  void ClientDisconnect();
-  void ClientRead();
-  void StartProcessError(QProcess::ProcessError error);
-
-  void tcpServerReady();
-};
-
-#endif // _TCPBASE_INCLUDED
--- a/QTfrontend/team.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ b/QTfrontend/team.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -25,7 +25,6 @@
 
 #include "team.h"
 #include "hwform.h"
-#include "pageeditteam.h"
 #include "hats.h"
 
 HWTeam::HWTeam(const QString & teamname) :
--- a/QTfrontend/teamselect.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,281 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2007 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <algorithm>
-
-#include <QLabel>
-#include <QPixmap>
-#include <QPushButton>
-#include <QFrame>
-#include <QDebug>
-
-#include "vertScrollArea.h"
-#include "teamselect.h"
-#include "teamselhelper.h"
-#include "frameTeam.h"
-
-void TeamSelWidget::addTeam(HWTeam team)
-{
-  if(team.isNetTeam()) {
-    framePlaying->addTeam(team, true);
-    curPlayingTeams.push_back(team);
-    connect(framePlaying->getTeamWidget(team), SIGNAL(teamStatusChanged(HWTeam)),
-             this, SLOT(netTeamStatusChanged(const HWTeam&)));
-    connect(framePlaying->getTeamWidget(team), SIGNAL(hhNmChanged(const HWTeam&)),
-                this, SLOT(hhNumChanged(const HWTeam&)));
-    dynamic_cast<TeamShowWidget*>(framePlaying->getTeamWidget(team))->hhNumChanged();
-    connect(framePlaying->getTeamWidget(team), SIGNAL(teamColorChanged(const HWTeam&)),
-                this, SLOT(proxyTeamColorChanged(const HWTeam&)));
-  } else {
-    frameDontPlaying->addTeam(team, false);
-    m_curNotPlayingTeams.push_back(team);
-    if(m_acceptOuter) {
-      connect(frameDontPlaying->getTeamWidget(team), SIGNAL(teamStatusChanged(HWTeam)),
-          this, SLOT(pre_changeTeamStatus(HWTeam)));
-    } else {
-      connect(frameDontPlaying->getTeamWidget(team), SIGNAL(teamStatusChanged(HWTeam)),
-          this, SLOT(changeTeamStatus(HWTeam)));
-    }
-  }
-  emit setEnabledGameStart(curPlayingTeams.size()>1);
-}
-
-void TeamSelWidget::setInteractivity(bool interactive)
-{
-    framePlaying->setInteractivity(interactive);
-}
-
-void TeamSelWidget::hhNumChanged(const HWTeam& team)
-{
-    QList<HWTeam>::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team);
-    if(itPlay==curPlayingTeams.end())
-    {
-        qWarning() << QString("hhNumChanged: team '%1' not found").arg(team.name());
-        return;
-    }
-    itPlay->setNumHedgehogs(team.numHedgehogs());
-    emit hhogsNumChanged(team);
-}
-
-void TeamSelWidget::proxyTeamColorChanged(const HWTeam& team)
-{
-    QList<HWTeam>::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team);
-    if(itPlay==curPlayingTeams.end())
-    {
-        qWarning() << QString("proxyTeamColorChanged: team '%1' not found").arg(team.name());
-        return;
-    }
-    itPlay->setColor(team.color());
-    emit teamColorChanged(team);
-}
-
-void TeamSelWidget::changeHHNum(const HWTeam& team)
-{
-  QList<HWTeam>::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team);
-    if(itPlay==curPlayingTeams.end())
-    {
-        qWarning() << QString("changeHHNum: team '%1' not found").arg(team.name());
-        return;
-    }
-  itPlay->setNumHedgehogs(team.numHedgehogs());
-
-  framePlaying->setHHNum(team);
-}
-
-void TeamSelWidget::changeTeamColor(const HWTeam& team)
-{
-    QList<HWTeam>::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team);
-    if(itPlay==curPlayingTeams.end())
-    {
-        qWarning() << QString("changeTeamColor: team '%1' not found").arg(team.name());
-        return;
-    }
-    itPlay->setColor(team.color());
-
-    framePlaying->setTeamColor(team);
-}
-
-void TeamSelWidget::removeNetTeam(const HWTeam& team)
-{
-    //qDebug() << QString("removeNetTeam: removing team '%1'").arg(team.TeamName);
-    for(;;) {
-        QList<HWTeam>::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team);
-        if(itPlay==curPlayingTeams.end())
-        {
-            qWarning() << QString("removeNetTeam: team '%1' not found").arg(team.name());
-            break;
-        }
-        if(itPlay->isNetTeam()) {
-            QObject::disconnect(framePlaying->getTeamWidget(*itPlay), SIGNAL(teamStatusChanged(HWTeam)));
-            framePlaying->removeTeam(team);
-            curPlayingTeams.erase(itPlay);
-            break;
-        }
-    }
-    emit setEnabledGameStart(curPlayingTeams.size()>1);
-}
-
-void TeamSelWidget::netTeamStatusChanged(const HWTeam& team)
-{
-  QList<HWTeam>::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team);
-
-}
-
-//void TeamSelWidget::removeTeam(__attribute__ ((unused)) HWTeam team)
-//{
-  //curDontPlayingTeams.erase(std::find(curDontPlayingTeams.begin(), curDontPlayingTeams.end(), team));
-//}
-
-void TeamSelWidget::changeTeamStatus(HWTeam team)
-{
-  QList<HWTeam>::iterator itDontPlay=std::find(m_curNotPlayingTeams.begin(), m_curNotPlayingTeams.end(), team);
-  QList<HWTeam>::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team);
-
-  bool willBePlaying=itDontPlay!=m_curNotPlayingTeams.end();
-
-  if(!willBePlaying) {
-    // playing team => dont playing
-    m_curNotPlayingTeams.push_back(*itPlay);
-    emit teamNotPlaying(*itPlay);
-    curPlayingTeams.erase(itPlay);
-  } else {
-    // return if max playing teams reached
-    if(framePlaying->isFullTeams()) return;
-    // dont playing team => playing
-    team=*itDontPlay; // for net team info saving in framePlaying (we have only name with netID from network)
-    itDontPlay->setColor(framePlaying->getNextColor());
-    curPlayingTeams.push_back(*itDontPlay);
-    if(!m_acceptOuter) emit teamWillPlay(*itDontPlay);
-    m_curNotPlayingTeams.erase(itDontPlay);
-  }
-
-  FrameTeams* pRemoveTeams;
-  FrameTeams* pAddTeams;
-  if(!willBePlaying) {
-    pRemoveTeams=framePlaying;
-    pAddTeams=frameDontPlaying;
-  } else {
-    pRemoveTeams=frameDontPlaying;
-    pAddTeams=framePlaying;
-  }
-
-  pAddTeams->addTeam(team, willBePlaying);
-  pRemoveTeams->removeTeam(team);
-  if(!team.isNetTeam() && m_acceptOuter && !willBePlaying) {
-    connect(frameDontPlaying->getTeamWidget(team), SIGNAL(teamStatusChanged(HWTeam)),
-        this, SLOT(pre_changeTeamStatus(HWTeam)));
-  } else {
-    connect(pAddTeams->getTeamWidget(team), SIGNAL(teamStatusChanged(HWTeam)),
-        this, SLOT(changeTeamStatus(HWTeam)));
-  }
-  if(willBePlaying) {
-    connect(framePlaying->getTeamWidget(team), SIGNAL(hhNmChanged(const HWTeam&)),
-        this, SLOT(hhNumChanged(const HWTeam&)));
-    dynamic_cast<TeamShowWidget*>(framePlaying->getTeamWidget(team))->hhNumChanged();
-    connect(framePlaying->getTeamWidget(team), SIGNAL(teamColorChanged(const HWTeam&)),
-        this, SLOT(proxyTeamColorChanged(const HWTeam&)));
-    emit teamColorChanged(((TeamShowWidget*)framePlaying->getTeamWidget(team))->getTeam());
-  }
-
-  QSize szh=pAddTeams->sizeHint();
-  QSize szh1=pRemoveTeams->sizeHint();
-  if(szh.isValid() && szh1.isValid()) {
-    pAddTeams->resize(pAddTeams->size().width(), szh.height());
-    pRemoveTeams->resize(pRemoveTeams->size().width(), szh1.height());
-  }
-
-  emit setEnabledGameStart(curPlayingTeams.size()>1);
-}
-
-void TeamSelWidget::addScrArea(FrameTeams* pfteams, QColor color, int fixedHeight)
-{
-    VertScrArea* area = new VertScrArea(color);
-    area->setWidget(pfteams);
-    mainLayout.addWidget(area, 30);
-    if (fixedHeight > 0)
-    {
-        area->setMinimumHeight(fixedHeight);
-        area->setMaximumHeight(fixedHeight);
-        area->setStyleSheet(
-                "FrameTeams{"
-                    "border: solid;"
-                    "border-width: 1px;"
-                    "border-radius: 16px;"
-                    "border-color: #ffcc00;"
-                    "}"
-        );
-    }
-}
-
-TeamSelWidget::TeamSelWidget(QWidget* parent) :
-  QGroupBox(parent), mainLayout(this), m_acceptOuter(false)
-{
-    setTitle(QGroupBox::tr("Playing teams"));
-    framePlaying = new FrameTeams();
-    frameDontPlaying = new FrameTeams();
-
-    QPalette p;
-    p.setColor(QPalette::Window, QColor(0x00, 0x00, 0x00));
-    addScrArea(framePlaying, p.color(QPalette::Window).light(105), 250);
-    addScrArea(frameDontPlaying, p.color(QPalette::Window).dark(105), 0);
-}
-
-void TeamSelWidget::setAcceptOuter(bool acceptOuter)
-{
-  m_acceptOuter=acceptOuter;
-}
-
-void TeamSelWidget::resetPlayingTeams(const QList<HWTeam>& teamslist)
-{
-  //for(it=curPlayingTeams.begin(); it!=curPlayingTeams.end(); it++) {
-  //framePlaying->removeTeam(*it);
-  //}
-  framePlaying->resetTeams();
-  framePlaying->resetColors();
-  curPlayingTeams.clear();
-  //for(it=curDontPlayingTeams.begin(); it!=curDontPlayingTeams.end(); it++) {
-  //frameDontPlaying->removeTeam(*it);
-  //}
-  frameDontPlaying->resetTeams();
-  m_curNotPlayingTeams.clear();
-
-  foreach(HWTeam team, teamslist)
-    addTeam(team);
-}
-
-bool TeamSelWidget::isPlaying(HWTeam team) const
-{
-  return std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team)!=curPlayingTeams.end();
-}
-
-QList<HWTeam> TeamSelWidget::getPlayingTeams() const
-{
-  return curPlayingTeams;
-}
-
-QList<HWTeam> TeamSelWidget::getNotPlayingTeams() const
-{
-  return m_curNotPlayingTeams;
-}
-
-void TeamSelWidget::pre_changeTeamStatus(HWTeam team)
-{
-  team.setColor(framePlaying->getNextColor());
-  emit acceptRequested(team);
-}
--- a/QTfrontend/teamselect.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,83 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2007 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef _TEAM_SELECT_INCLUDED
-#define _TEAM_SELECT_INCLUDED
-
-#include <QGroupBox>
-#include <QVBoxLayout>
-#include <QColor>
-#include <QMultiMap>
-
-#include "team.h"
-
-class TeamSelWidget;
-class FrameTeams;
-class QFrame;
-class QPushButton;
-
-using namespace std;
-
-class TeamSelWidget : public QGroupBox
-{
-  Q_OBJECT
-
- public:
-  TeamSelWidget(QWidget* parent);
-  void setAcceptOuter(bool acceptOuter);
-  void removeNetTeam(const HWTeam& team);
-  void resetPlayingTeams(const QList<HWTeam>& teamslist);
-  bool isPlaying(HWTeam team) const;
-  QList<HWTeam> getPlayingTeams() const;
-  QList<HWTeam> getNotPlayingTeams() const;
-  void setInteractivity(bool interactive);
-
- public slots:
-  void addTeam(HWTeam team);
-  void netTeamStatusChanged(const HWTeam& team);
-  void changeHHNum(const HWTeam&);
-  void changeTeamColor(const HWTeam&);
-  void changeTeamStatus(HWTeam team);
-
- signals:
-  void setEnabledGameStart(bool);
-  void teamWillPlay(HWTeam team);
-  void teamNotPlaying(const HWTeam& team);
-  void hhogsNumChanged(const HWTeam&);
-  void teamColorChanged(const HWTeam&);
-  void acceptRequested(HWTeam team);
-
- private slots:
-  void pre_changeTeamStatus(HWTeam);
-  void hhNumChanged(const HWTeam& team);
-  void proxyTeamColorChanged(const HWTeam& team);
-
- private:
-  void addScrArea(FrameTeams* pfteams, QColor color, int maxHeight);
-  FrameTeams* frameDontPlaying;
-  FrameTeams* framePlaying;
-
-  QVBoxLayout mainLayout;
-  bool m_acceptOuter;
-
-  QList<HWTeam> curPlayingTeams;
-  QList<HWTeam> m_curNotPlayingTeams;
-};
-
-#endif // _TEAM_SELECT_INCLUDED
--- a/QTfrontend/teamselhelper.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,154 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2007 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include <QPixmap>
-#include <QPainter>
-#include <QStyleFactory>
-
-#include <algorithm>
-
-#include "teamselhelper.h"
-#include "hwconsts.h"
-#include "frameTeam.h"
-
-void TeamLabel::teamButtonClicked()
-{
-  emit teamActivated(text());
-}
-
-TeamShowWidget::TeamShowWidget(HWTeam team, bool isPlaying, QWidget * parent) :
-  QWidget(parent), mainLayout(this), m_team(team), m_isPlaying(isPlaying), phhoger(0),
-  colorButt(0)
-{
-    QPalette newPalette = palette();
-    newPalette.setColor(QPalette::Window, QColor(0x00, 0x00, 0x00));
-    setPalette(newPalette);
-    setAutoFillBackground(true);
-
-    mainLayout.setSpacing(3);
-    mainLayout.setMargin(0);
-    this->setMaximumHeight(38);
-    this->setMinimumHeight(38);
-    QIcon difficultyIcon=team.isNetTeam() ?
-        QIcon(QString(":/res/botlevels/net%1.png").arg(m_team.difficulty()))
-        : QIcon(QString(":/res/botlevels/%1.png").arg(m_team.difficulty()));
-
-    butt = new QPushButton(difficultyIcon, team.name().replace("&","&&"), this);
-    butt->setFlat(true);
-    butt->setToolTip(team.owner());
-    mainLayout.addWidget(butt);
-    butt->setStyleSheet("QPushButton{"
-            "icon-size: 48px;"
-            "text-align: left;"
-            "background-color: #0d0544;"
-            "color: orange;"
-            "font: bold;"
-            "border-width: 2px;"
-            "margin: 6px 0px 6px 0px;"
-            "}");
-
-    if(m_isPlaying) {
-        // team color
-        colorButt = new QPushButton(this);
-        colorButt->setMaximumWidth(26);
-        colorButt->setMinimumHeight(26);
-        colorButt->setGeometry(0, 0, 26, 26);
-
-        changeTeamColor();
-        connect(colorButt, SIGNAL(clicked()), this, SLOT(changeTeamColor()));
-        mainLayout.addWidget(colorButt);
-
-        phhoger = new CHedgehogerWidget(QImage(":/res/hh25x25.png"), QImage(":/res/hh25x25grey.png"), this);
-        connect(phhoger, SIGNAL(hedgehogsNumChanged()), this, SLOT(hhNumChanged()));
-        phhoger->setHHNum(team.numHedgehogs());
-        mainLayout.addWidget(phhoger);
-    } else {
-    }
-
-    QObject::connect(butt, SIGNAL(clicked()), this, SLOT(activateTeam()));
-    //QObject::connect(bText, SIGNAL(clicked()), this, SLOT(activateTeam()));
-}
-
-void TeamShowWidget::setInteractivity(bool interactive)
-{
-    if(m_team.isNetTeam()) {
-        butt->setEnabled(interactive);
-    }
-
-    colorButt->setEnabled(interactive);
-    phhoger->setEnabled(interactive);
-}
-
-void TeamShowWidget::setHHNum(unsigned int num)
-{
-  phhoger->setHHNum(num);
-}
-
-void TeamShowWidget::hhNumChanged()
-{
-  m_team.setNumHedgehogs(phhoger->getHedgehogsNum());
-  emit hhNmChanged(m_team);
-}
-
-void TeamShowWidget::activateTeam()
-{
-  emit teamStatusChanged(m_team);
-}
-
-/*HWTeamTempParams TeamShowWidget::getTeamParams() const
-{
-  if(!phhoger) throw;
-  HWTeamTempParams params;
-  params.numHedgehogs=phhoger->getHedgehogsNum();
-  params.teamColor=colorButt->palette().color(QPalette::Button);
-  return params;
-}*/
-
-void TeamShowWidget::changeTeamColor(QColor color)
-{
-    FrameTeams* pOurFrameTeams=dynamic_cast<FrameTeams*>(parentWidget());
-    if(!color.isValid()) {
-        if(++pOurFrameTeams->currentColor==pOurFrameTeams->availableColors.end()) {
-            pOurFrameTeams->currentColor=pOurFrameTeams->availableColors.begin();
-        }
-        color=*pOurFrameTeams->currentColor;
-    } else {
-        // set according color iterator
-        pOurFrameTeams->currentColor=std::find(pOurFrameTeams->availableColors.begin(),
-                pOurFrameTeams->availableColors.end(), color);
-        if(pOurFrameTeams->currentColor==pOurFrameTeams->availableColors.end()) {
-            // error condition
-            pOurFrameTeams->currentColor=pOurFrameTeams->availableColors.begin();
-        }
-    }
-
-    colorButt->setStyleSheet(QString("QPushButton{"
-            "background-color: %1;"
-            "border-width: 1px;"
-            "border-radius: 2px;"
-            "}").arg(pOurFrameTeams->currentColor->name()));
-
-    m_team.setColor(color);
-    emit teamColorChanged(m_team);
-}
-
-HWTeam TeamShowWidget::getTeam() const
-{
-  return m_team;
-}
--- a/QTfrontend/teamselhelper.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2007 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef _TEAMSEL_HELPER_INCLUDED
-#define _TEAMSEL_HELPER_INCLUDED
-
-#include <QLabel>
-#include <QWidget>
-#include <QString>
-#include <QPushButton>
-
-#include "teamselect.h"
-#include "hedgehogerWidget.h"
-
-class TeamLabel : public QLabel
-{
- Q_OBJECT
-
- public:
- TeamLabel(const QString& inp_str) : QLabel(inp_str) {};
-
- signals:
- void teamActivated(QString team_name);
-
- public slots:
- void teamButtonClicked();
-
-};
-
-class TeamShowWidget : public QWidget
-{
- Q_OBJECT
-
- public slots:
- void changeTeamColor(QColor color=QColor());
- void hhNumChanged();
-
- private slots:
- void activateTeam();
-
- public:
- TeamShowWidget(HWTeam team, bool isPlaying, QWidget * parent);
- void setPlaying(bool isPlaying);
- void setHHNum(unsigned int num);
- void setInteractivity(bool interactive);
- HWTeam getTeam() const;
-
- private:
- TeamShowWidget();
- QHBoxLayout mainLayout;
- HWTeam m_team;
- bool m_isPlaying;
- CHedgehogerWidget* phhoger;
- QPushButton* colorButt;
- QPushButton* butt;
-// QPushButton* bText;
-
- signals:
- void teamStatusChanged(HWTeam team);
- void hhNmChanged(const HWTeam&);
- void teamColorChanged(const HWTeam&);
-};
-
-#endif // _TEAMSEL_HELPER_INCLUDED
--- a/QTfrontend/themesmodel.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-
-#include "themesmodel.h"
-
-ThemesModel::ThemesModel(QStringList themes, QObject *parent) :
-    QAbstractListModel(parent)
-{
-#if QT_VERSION >= QT_VERSION_CHECK(4, 7, 0)
-    m_data.reserve(themes.size());
-#endif
-
-    foreach(QString theme, themes)
-    {
-        m_data.append(QHash<int, QVariant>());
-        m_data.last().insert(Qt::DisplayRole, theme);
-    }
-}
-
-int ThemesModel::rowCount(const QModelIndex &parent) const
-{
-    if(parent.isValid())
-        return 0;
-    else
-        return m_data.size();
-}
-
-QVariant ThemesModel::data(const QModelIndex &index, int role) const
-{
-    if(index.column() > 0 || index.row() >= m_data.size())
-        return QVariant();
-    else
-        return m_data.at(index.row()).value(role);
-}
-
-bool ThemesModel::setData(const QModelIndex &index, const QVariant &value, int role)
-{
-    if(index.column() > 0 || index.row() >= m_data.size())
-        return false;
-    else
-    {
-        m_data[index.row()].insert(role, value);
-
-        return true;
-    }
-
-}
-
-
-
-
--- a/QTfrontend/themesmodel.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-#ifndef THEMESMODEL_H
-#define THEMESMODEL_H
-
-#include <QAbstractListModel>
-#include <QStringList>
-#include <QHash>
-
-class ThemesModel : public QAbstractListModel
-{
-    Q_OBJECT
-public:
-    explicit ThemesModel(QStringList themes, QObject *parent = 0);
-
-    int rowCount(const QModelIndex &parent = QModelIndex()) const;
-    QVariant data(const QModelIndex &index, int role) const;
-    bool setData(const QModelIndex &index, const QVariant &value,
-                 int role = Qt::EditRole);
-
-signals:
-
-public slots:
-
-private:
-
-    QList<QHash<int, QVariant> > m_data;
-};
-
-#endif // THEMESMODEL_H
--- a/QTfrontend/togglebutton.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2009 Kristian Lehmann <email@thexception.net>
- * Copyright (c) 2009-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include "togglebutton.h"
-
-ToggleButtonWidget::ToggleButtonWidget(QWidget * parent, QString img)
-    : QPushButton(parent)
-{
-    setCheckable(true);
-
-    QPixmap pm(":/res/btnDisabled.png");
-    QPainter * painter = new QPainter();
-
-    pmChecked.load(img);
-    pmDisabled.load(img);
-
-    setMaximumWidth(pmChecked.width() + 6);
-
-    painter->begin(&pmDisabled);
-    painter->drawPixmap(pmDisabled.rect(), pm);
-    painter->end();
-
-    setIconSize(pmDisabled.size());
-    setIcon(pmDisabled);
-
-    connect(this, SIGNAL(toggled(bool)), this, SLOT(eventToggled(bool)));
-}
-
-ToggleButtonWidget::~ToggleButtonWidget()
-{
-}
-
-void ToggleButtonWidget::eventToggled(bool checked)
-{
-    setIcon(checked ? pmChecked : pmDisabled);
-}
--- a/QTfrontend/togglebutton.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2009 Kristian Lehmann <email@thexception.net>
- * Copyright (c) 2009-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef TOGGLEBUTTONWIDGET_H
-#define TOGGLEBUTTONWIDGET_H
-
-#include <QWidget>
-#include <QPainter>
-#include <QPushButton>
-#include <QVBoxLayout>
-#include <QLabel>
-
-class ToggleButtonWidget : public QPushButton
-{
-    Q_OBJECT
-public:
-    ToggleButtonWidget(QWidget * parent, QString img);
-    ~ToggleButtonWidget();
-private:
-    QPixmap pmChecked;
-    QPixmap pmDisabled;
-private slots:
-    void eventToggled(bool checked);
-};
-
-#endif // TOGGLEBUTTONWIDGET_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/dialog/input_ip.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,68 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QLineEdit>
+#include <QSpinBox>
+#include <QPushButton>
+#include <QGridLayout>
+#include <QLabel>
+
+#include "input_ip.h"
+
+HWHostPortDialog::HWHostPortDialog(QWidget* parent) : QDialog(parent)
+{
+    QGridLayout * layout = new QGridLayout(this);
+
+    QLabel * lbHost = new QLabel(this);
+    lbHost->setText(QLabel::tr("Host:"));
+    layout->addWidget(lbHost, 0, 0);
+
+    QLabel * lbPort = new QLabel(this);
+    lbPort->setText(QLabel::tr("Port:"));
+    layout->addWidget(lbPort, 1, 0);
+
+    leHost = new QLineEdit(this);
+    layout->addWidget(leHost, 0, 1, 1, 2);
+
+    sbPort = new QSpinBox(this);
+    sbPort->setMinimum(0);
+    sbPort->setMaximum(65535);
+    layout->addWidget(sbPort, 1, 1, 1, 2);
+
+    pbDefault = new QPushButton(this);
+    pbDefault->setText(QPushButton::tr("default"));
+    layout->addWidget(pbDefault, 1, 3);
+
+    pbOK = new QPushButton(this);
+    pbOK->setText(QPushButton::tr("OK"));
+    pbOK->setDefault(true);
+    layout->addWidget(pbOK, 3, 1);
+
+    pbCancel = new QPushButton(this);
+    pbCancel->setText(QPushButton::tr("Cancel"));
+    layout->addWidget(pbCancel, 3, 2);
+
+    connect(pbOK, SIGNAL(clicked()), this, SLOT(accept()));
+    connect(pbCancel, SIGNAL(clicked()), this, SLOT(reject()));
+    connect(pbDefault, SIGNAL(clicked()), this, SLOT(setDefaultPort()));
+}
+
+void HWHostPortDialog::setDefaultPort()
+{
+    sbPort->setValue(46631);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/dialog/input_ip.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,49 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+
+#ifndef INPUT_IP_H
+#define INPUT_IP_H
+
+#include <QDialog>
+#include <QHostAddress>
+
+class QLineEdit;
+class QSpinBox;
+class QPushButton;
+
+class HWHostPortDialog : public QDialog
+{
+    Q_OBJECT
+public:
+    HWHostPortDialog(QWidget* parent = 0);
+
+    QLineEdit* leHost;
+    QSpinBox* sbPort;
+
+private:
+    QPushButton* pbOK;
+    QPushButton* pbCancel;
+    QPushButton * pbDefault;
+
+private slots:
+    void setDefaultPort();
+};
+
+
+#endif // INPUT_IP_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/model/ammoSchemeModel.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,786 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2005-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QDebug>
+#include <QModelIndex>
+
+#include "ammoSchemeModel.h"
+#include "hwconsts.h"
+
+QList<QVariant> defaultScheme = QList<QVariant>()
+        << QVariant("Default")     // name           0
+        << QVariant(false)         // fortsmode      1
+        << QVariant(false)         // team divide    2
+        << QVariant(false)         // solid land     3
+        << QVariant(false)         // border         4
+        << QVariant(false)         // low gravity    5
+        << QVariant(false)         // laser sight    6
+        << QVariant(false)         // invulnerable   7
+        << QVariant(false)         // reset health   8
+        << QVariant(false)         // vampiric       9
+        << QVariant(false)         // karma          10
+        << QVariant(false)         // artillery      11
+        << QVariant(true)          // random order   12
+        << QVariant(false)         // king           13
+        << QVariant(false)         // place hog      14
+        << QVariant(false)         // shared ammo    15
+        << QVariant(false)         // disable girders 16
+        << QVariant(false)         // disable land objects 17
+        << QVariant(false)         // AI survival    18
+        << QVariant(false)         // inf. attack    19
+        << QVariant(false)         // reset weps     20
+        << QVariant(false)         // per hog ammo   21
+        << QVariant(false)         // no wind        22
+        << QVariant(false)         // more wind      23
+        << QVariant(false)         // tag team       24
+        << QVariant(false)         // bottom border  25
+        << QVariant(100)           // damage modfier 26
+        << QVariant(45)            // turn time      27
+        << QVariant(100)           // init health    28
+        << QVariant(15)            // sudden death   29
+        << QVariant(5)             // case prob      30
+        << QVariant(3)             // mines time     31
+        << QVariant(4)             // mines number   32
+        << QVariant(0)             // mine dud pct   33
+        << QVariant(2)             // explosives     34
+        << QVariant(35)            // health case pct 35
+        << QVariant(25)            // health case amt 36
+        << QVariant(47)            // water rise amt 37
+        << QVariant(5)             // health dec amt 38
+        << QVariant(100)           // rope modfier   39
+        << QVariant(100)           // get away time  40
+        ;
+
+AmmoSchemeModel::AmmoSchemeModel(QObject* parent, const QString & fileName) :
+    QAbstractTableModel(parent),
+    fileConfig(fileName, QSettings::IniFormat)
+{
+    predefSchemesNames = QStringList()
+        << "Default"
+        << "Pro Mode"
+        << "Shoppa"
+        << "Clean Slate"
+        << "Minefield"
+        << "Barrel Mayhem"
+        << "Tunnel Hogs"
+        << "Fort Mode"
+        << "Timeless"
+        << "Thinking with Portals"
+        << "King Mode"
+        ;
+
+    numberOfDefaultSchemes = predefSchemesNames.size();
+
+    spNames = QStringList()
+        << "name"                //  0
+        << "fortsmode"           //  1
+        << "divteams"            //  2
+        << "solidland"           //  3
+        << "border"              //  4
+        << "lowgrav"             //  5
+        << "laser"               //  6
+        << "invulnerability"     //  7
+        << "resethealth"         //  8
+        << "vampiric"            //  9
+        << "karma"               // 10
+        << "artillery"           // 11
+        << "randomorder"         // 12
+        << "king"                // 13
+        << "placehog"            // 14
+        << "sharedammo"          // 15
+        << "disablegirders"      // 16
+        << "disablelandobjects"  // 17
+        << "aisurvival"          // 18
+        << "infattack"           // 19
+        << "resetweps"           // 20
+        << "perhogammo"          // 21
+        << "disablewind"         // 22
+        << "morewind"            // 23
+        << "tagteam"             // 24
+        << "bottomborder"        // 25
+        << "damagefactor"        // 26
+        << "turntime"            // 27
+        << "health"              // 28
+        << "suddendeath"         // 29
+        << "caseprobability"     // 30
+        << "minestime"           // 31
+        << "minesnum"            // 32
+        << "minedudpct"          // 33
+        << "explosives"          // 34
+        << "healthprobability"   // 35
+        << "healthcaseamount"    // 36
+        << "waterrise"           // 37
+        << "healthdecrease"      // 38
+        << "ropepct"             // 39
+        << "getawaytime"         // 40
+        ;
+
+    QList<QVariant> proMode;
+    proMode
+        << predefSchemesNames[1]   // name           0
+        << QVariant(false)         // fortsmode      1
+        << QVariant(false)         // team divide    2
+        << QVariant(false)         // solid land     3
+        << QVariant(false)         // border         4
+        << QVariant(false)         // low gravity    5
+        << QVariant(false)         // laser sight    6
+        << QVariant(false)         // invulnerable   7
+        << QVariant(false)         // reset health   8
+        << QVariant(false)         // vampiric       9
+        << QVariant(false)         // karma          10
+        << QVariant(false)         // artillery      11
+        << QVariant(true)          // random order   12
+        << QVariant(false)         // king           13
+        << QVariant(false)         // place hog      14
+        << QVariant(true)          // shared ammo    15
+        << QVariant(false)         // disable girders 16
+        << QVariant(false)         // disable land objects 17
+        << QVariant(false)         // AI survival    18
+        << QVariant(false)         // inf. attack    19
+        << QVariant(false)         // reset weps     20
+        << QVariant(false)         // per hog ammo   21
+        << QVariant(false)         // no wind        22
+        << QVariant(false)         // more wind      23
+        << QVariant(false)         // tag team       24
+        << QVariant(false)         // bottom border  25
+        << QVariant(100)           // damage modfier 26
+        << QVariant(15)            // turn time      27
+        << QVariant(100)           // init health    28
+        << QVariant(15)            // sudden death   29
+        << QVariant(0)             // case prob      30
+        << QVariant(3)             // mines time     31
+        << QVariant(0)             // mines number   32
+        << QVariant(0)             // mine dud pct   33
+        << QVariant(2)             // explosives     34
+        << QVariant(35)            // health case pct 35
+        << QVariant(25)            // health case amt 36
+        << QVariant(47)            // water rise amt 37
+        << QVariant(5)             // health dec amt 38
+        << QVariant(100)           // rope modfier   39
+        << QVariant(100)           // get away time  40
+        ;
+
+    QList<QVariant> shoppa;
+    shoppa
+        << predefSchemesNames[2]   // name           0
+        << QVariant(false)         // fortsmode      1
+        << QVariant(false)         // team divide    2
+        << QVariant(true)          // solid land     3
+        << QVariant(true)          // border         4
+        << QVariant(false)         // low gravity    5
+        << QVariant(false)         // laser sight    6
+        << QVariant(false)         // invulnerable   7
+        << QVariant(false)         // reset health   8
+        << QVariant(false)         // vampiric       9
+        << QVariant(false)         // karma          10
+        << QVariant(false)         // artillery      11
+        << QVariant(true)          // random order   12
+        << QVariant(false)         // king           13
+        << QVariant(false)         // place hog      14
+        << QVariant(true)          // shared ammo    15
+        << QVariant(true)          // disable girders 16
+        << QVariant(false)         // disable land objects 17
+        << QVariant(false)         // AI survival    18
+        << QVariant(false)         // inf. attack    19
+        << QVariant(true)          // reset weps     20
+        << QVariant(false)         // per hog ammo   21
+        << QVariant(false)         // no wind        22
+        << QVariant(false)         // more wind      23
+        << QVariant(false)         // tag team       24
+        << QVariant(false)         // bottom border  25
+        << QVariant(100)           // damage modfier 26
+        << QVariant(30)            // turn time      27
+        << QVariant(100)           // init health    28
+        << QVariant(50)            // sudden death   29
+        << QVariant(1)             // case prob      30
+        << QVariant(3)             // mines time     31
+        << QVariant(0)             // mines number   32
+        << QVariant(0)             // mine dud pct   33
+        << QVariant(0)             // explosives     34
+        << QVariant(0)             // health case pct 35
+        << QVariant(25)            // health case amt 36
+        << QVariant(47)            // water rise amt 37
+        << QVariant(5)             // health dec amt 38
+        << QVariant(100)           // rope modfier   39
+        << QVariant(100)           // get away time  40
+        ;
+
+    QList<QVariant> cleanslate;
+    cleanslate
+        << predefSchemesNames[3]   // name           0
+        << QVariant(false)         // fortsmode      1
+        << QVariant(false)         // team divide    2
+        << QVariant(false)         // solid land     3
+        << QVariant(false)         // border         4
+        << QVariant(false)         // low gravity    5
+        << QVariant(false)         // laser sight    6
+        << QVariant(false)         // invulnerable   7
+        << QVariant(true)          // reset health   8
+        << QVariant(false)         // vampiric       9
+        << QVariant(false)         // karma          10
+        << QVariant(false)         // artillery      11
+        << QVariant(true)          // random order   12
+        << QVariant(false)         // king           13
+        << QVariant(false)         // place hog      14
+        << QVariant(false)         // shared ammo    15
+        << QVariant(false)         // disable girders 16
+        << QVariant(false)         // disable land objects 17
+        << QVariant(false)         // AI survival    18
+        << QVariant(true)          // inf. attack    19
+        << QVariant(true)          // reset weps     20
+        << QVariant(false)         // per hog ammo   21
+        << QVariant(false)         // no wind        22
+        << QVariant(false)         // more wind      23
+        << QVariant(false)         // tag team       24
+        << QVariant(false)         // bottom border  25
+        << QVariant(100)           // damage modfier 26
+        << QVariant(45)            // turn time      27
+        << QVariant(100)           // init health    28
+        << QVariant(15)            // sudden death   29
+        << QVariant(5)             // case prob      30
+        << QVariant(3)             // mines time     31
+        << QVariant(4)             // mines number   32
+        << QVariant(0)             // mine dud pct   33
+        << QVariant(2)             // explosives     34
+        << QVariant(35)            // health case pct 35
+        << QVariant(25)            // health case amt 36
+        << QVariant(47)            // water rise amt 37
+        << QVariant(5)             // health dec amt 38
+        << QVariant(100)           // rope modfier   39
+        << QVariant(100)           // get away time  40
+        ;
+
+    QList<QVariant> minefield;
+    minefield
+        << predefSchemesNames[4]   // name           0
+        << QVariant(false)         // fortsmode      1
+        << QVariant(false)         // team divide    2
+        << QVariant(false)         // solid land     3
+        << QVariant(false)         // border         4
+        << QVariant(false)         // low gravity    5
+        << QVariant(false)         // laser sight    6
+        << QVariant(false)         // invulnerable   7
+        << QVariant(false)         // reset health   8
+        << QVariant(false)         // vampiric       9
+        << QVariant(false)         // karma          10
+        << QVariant(false)         // artillery      11
+        << QVariant(true)          // random order   12
+        << QVariant(false)         // king           13
+        << QVariant(false)         // place hog      14
+        << QVariant(true)          // shared ammo    15
+        << QVariant(true)          // disable girders 16
+        << QVariant(false)         // disable land objects 17
+        << QVariant(false)         // AI survival    18
+        << QVariant(false)         // inf. attack    19
+        << QVariant(false)         // reset weps     20
+        << QVariant(false)         // per hog ammo   21
+        << QVariant(false)         // no wind        22
+        << QVariant(false)         // more wind      23
+        << QVariant(false)         // tag team       24
+        << QVariant(false)         // bottom border  25
+        << QVariant(100)           // damage modfier 26
+        << QVariant(30)            // turn time      27
+        << QVariant(50)            // init health    28
+        << QVariant(15)            // sudden death   29
+        << QVariant(0)             // case prob      30
+        << QVariant(0)             // mines time     31
+        << QVariant(80)            // mines number   32
+        << QVariant(0)             // mine dud pct   33
+        << QVariant(0)             // explosives     34
+        << QVariant(35)            // health case pct 35
+        << QVariant(25)            // health case amt 36
+        << QVariant(47)            // water rise amt 37
+        << QVariant(5)             // health dec amt 38
+        << QVariant(100)           // rope modfier   39
+        << QVariant(100)           // get away time  40
+        ;
+
+    QList<QVariant> barrelmayhem;
+    barrelmayhem
+        << predefSchemesNames[5]   // name           0
+        << QVariant(false)         // fortsmode      1
+        << QVariant(false)         // team divide    2
+        << QVariant(false)         // solid land     3
+        << QVariant(false)         // border         4
+        << QVariant(false)         // low gravity    5
+        << QVariant(false)         // laser sight    6
+        << QVariant(false)         // invulnerable   7
+        << QVariant(false)         // reset health   8
+        << QVariant(false)         // vampiric       9
+        << QVariant(false)         // karma          10
+        << QVariant(false)         // artillery      11
+        << QVariant(true)          // random order   12
+        << QVariant(false)         // king           13
+        << QVariant(false)         // place hog      14
+        << QVariant(true)          // shared ammo    15
+        << QVariant(false)         // disable girders 16
+        << QVariant(false)         // disable land objects 17
+        << QVariant(false)         // AI survival    18
+        << QVariant(false)         // inf. attack    19
+        << QVariant(false)         // reset weps     20
+        << QVariant(false)         // per hog ammo   21
+        << QVariant(false)         // no wind        22
+        << QVariant(false)         // more wind      23
+        << QVariant(false)         // tag team       24
+        << QVariant(false)         // bottom border  25
+        << QVariant(100)           // damage modfier 26
+        << QVariant(30)            // turn time      27
+        << QVariant(100)           // init health    28
+        << QVariant(15)            // sudden death   29
+        << QVariant(0)             // case prob      30
+        << QVariant(0)             // mines time     31
+        << QVariant(0)             // mines number   32
+        << QVariant(0)             // mine dud pct   33
+        << QVariant(80)            // explosives     34
+        << QVariant(35)            // health case pct 35
+        << QVariant(25)            // health case amt 36
+        << QVariant(47)            // water rise amt 37
+        << QVariant(5)             // health dec amt 38
+        << QVariant(100)           // rope modfier   39
+        << QVariant(100)           // get away time  40
+        ;
+
+    QList<QVariant> tunnelhogs;
+    tunnelhogs
+        << predefSchemesNames[6]   // name           0
+        << QVariant(false)         // fortsmode      1
+        << QVariant(false)         // team divide    2
+        << QVariant(false)         // solid land     3
+        << QVariant(true)          // border         4
+        << QVariant(false)         // low gravity    5
+        << QVariant(false)         // laser sight    6
+        << QVariant(false)         // invulnerable   7
+        << QVariant(false)         // reset health   8
+        << QVariant(false)         // vampiric       9
+        << QVariant(false)         // karma          10
+        << QVariant(false)         // artillery      11
+        << QVariant(true)          // random order   12
+        << QVariant(false)         // king           13
+        << QVariant(false)         // place hog      14
+        << QVariant(true)          // shared ammo    15
+        << QVariant(true)          // disable girders 16
+        << QVariant(true)          // disable land objects 17
+        << QVariant(false)         // AI survival    18
+        << QVariant(false)         // inf. attack    19
+        << QVariant(false)         // reset weps     20
+        << QVariant(false)         // per hog ammo   21
+        << QVariant(false)         // no wind        22
+        << QVariant(false)         // more wind      23
+        << QVariant(false)         // tag team       24
+        << QVariant(false)         // bottom border  25
+        << QVariant(100)           // damage modfier 26
+        << QVariant(30)            // turn time      27
+        << QVariant(100)           // init health    28
+        << QVariant(15)            // sudden death   29
+        << QVariant(5)             // case prob      30
+        << QVariant(3)             // mines time     31
+        << QVariant(10)            // mines number   32
+        << QVariant(10)            // mine dud pct   33
+        << QVariant(10)            // explosives     34
+        << QVariant(35)            // health case pct 35
+        << QVariant(25)            // health case amt 36
+        << QVariant(47)            // water rise amt 37
+        << QVariant(5)             // health dec amt 38
+        << QVariant(100)           // rope modfier   39
+        << QVariant(100)           // get away time  40
+        ;
+
+    QList<QVariant> forts;
+    forts
+        << predefSchemesNames[7]   // name           0
+        << QVariant(true)          // fortsmode      1
+        << QVariant(true)          // team divide    2
+        << QVariant(false)         // solid land     3
+        << QVariant(false)         // border         4
+        << QVariant(true)          // low gravity    5
+        << QVariant(false)         // laser sight    6
+        << QVariant(false)         // invulnerable   7
+        << QVariant(false)         // reset health   8
+        << QVariant(false)         // vampiric       9
+        << QVariant(false)         // karma          10
+        << QVariant(false)         // artillery      11
+        << QVariant(true)          // random order   12
+        << QVariant(false)         // king           13
+        << QVariant(false)         // place hog      14
+        << QVariant(false)         // shared ammo    15
+        << QVariant(false)         // disable girders 16
+        << QVariant(false)         // disable land objects 17
+        << QVariant(false)         // AI survival    18
+        << QVariant(false)         // inf. attack    19
+        << QVariant(false)         // reset weps     20
+        << QVariant(false)         // per hog ammo   21
+        << QVariant(false)         // no wind        22
+        << QVariant(false)         // more wind      23
+        << QVariant(false)         // tag team       24
+        << QVariant(false)         // bottom border  25
+        << QVariant(100)           // damage modfier 26
+        << QVariant(45)            // turn time      27
+        << QVariant(100)           // init health    28
+        << QVariant(15)            // sudden death   29
+        << QVariant(5)             // case prob      30
+        << QVariant(3)             // mines time     31
+        << QVariant(0)             // mines number   32
+        << QVariant(0)             // mine dud pct   33
+        << QVariant(0)             // explosives     34
+        << QVariant(35)            // health case pct 35
+        << QVariant(25)            // health case amt 36
+        << QVariant(47)            // water rise amt 37
+        << QVariant(5)             // health dec amt 38
+        << QVariant(100)           // rope modfier   39
+        << QVariant(100)           // get away time  40
+        ;
+
+    QList<QVariant> timeless;
+    timeless
+        << predefSchemesNames[8]   // name           0
+        << QVariant(false)         // fortsmode      1
+        << QVariant(false)         // team divide    2
+        << QVariant(false)         // solid land     3
+        << QVariant(false)         // border         4
+        << QVariant(false)         // low gravity    5
+        << QVariant(false)         // laser sight    6
+        << QVariant(false)         // invulnerable   7
+        << QVariant(false)         // reset health   8
+        << QVariant(false)         // vampiric       9
+        << QVariant(false)         // karma          10
+        << QVariant(false)         // artillery      11
+        << QVariant(true)          // random order   12
+        << QVariant(false)         // king           13
+        << QVariant(false)         // place hog      14
+        << QVariant(false)         // shared ammo    15
+        << QVariant(false)         // disable girders 16
+        << QVariant(false)         // disable land objects 17
+        << QVariant(false)         // AI survival    18
+        << QVariant(false)         // inf. attack    19
+        << QVariant(false)         // reset weps     20
+        << QVariant(true)          // per hog ammo   21
+        << QVariant(false)         // no wind        22
+        << QVariant(false)         // more wind      23
+        << QVariant(false)         // tag team       24
+        << QVariant(false)         // bottom border  25
+        << QVariant(100)           // damage modfier 26
+        << QVariant(9999)          // turn time      27
+        << QVariant(100)           // init health    28
+        << QVariant(15)            // sudden death   29
+        << QVariant(5)             // case prob      30
+        << QVariant(3)             // mines time     31
+        << QVariant(5)             // mines number   32
+        << QVariant(10)            // mine dud pct   33
+        << QVariant(2)             // explosives     34
+        << QVariant(35)            // health case pct 35
+        << QVariant(30)            // health case amt 36
+        << QVariant(0)             // water rise amt 37
+        << QVariant(0)             // health dec amt 38
+        << QVariant(100)           // rope modfier   39
+        << QVariant(100)           // get away time  40
+        ;
+
+    QList<QVariant> thinkingportals;
+    thinkingportals
+        << predefSchemesNames[9]   // name           0
+        << QVariant(false)         // fortsmode      1
+        << QVariant(false)         // team divide    2
+        << QVariant(false)         // solid land     3
+        << QVariant(false)         // border         4
+        << QVariant(false)         // low gravity    5
+        << QVariant(false)         // laser sight    6
+        << QVariant(false)         // invulnerable   7
+        << QVariant(false)         // reset health   8
+        << QVariant(false)         // vampiric       9
+        << QVariant(false)         // karma          10
+        << QVariant(true)          // artillery      11
+        << QVariant(true)          // random order   12
+        << QVariant(false)         // king           13
+        << QVariant(false)         // place hog      14
+        << QVariant(false)         // shared ammo    15
+        << QVariant(false)         // disable girders 16
+        << QVariant(false)         // disable land objects 17
+        << QVariant(false)         // AI survival    18
+        << QVariant(false)         // inf. attack    19
+        << QVariant(false)         // reset weps     20
+        << QVariant(false)         // per hog ammo   21
+        << QVariant(false)         // no wind        22
+        << QVariant(false)         // more wind      23
+        << QVariant(false)         // tag team       24
+        << QVariant(false)         // bottom border  25
+        << QVariant(100)           // damage modfier 26
+        << QVariant(45)            // turn time      27
+        << QVariant(100)           // init health    28
+        << QVariant(15)            // sudden death   29
+        << QVariant(2)             // case prob      30
+        << QVariant(3)             // mines time     31
+        << QVariant(5)             // mines number   32
+        << QVariant(0)             // mine dud pct   33
+        << QVariant(5)             // explosives     34
+        << QVariant(25)            // health case pct 35
+        << QVariant(25)            // health case amt 36
+        << QVariant(47)            // water rise amt 37
+        << QVariant(5)             // health dec amt 38
+        << QVariant(100)           // rope modfier   39
+        << QVariant(100)           // get away time  40
+        ;
+
+    QList<QVariant> kingmode;
+    kingmode
+        << predefSchemesNames[10]  // name           0
+        << QVariant(false)         // fortsmode      1
+        << QVariant(false)         // team divide    2
+        << QVariant(false)         // solid land     3
+        << QVariant(false)         // border         4
+        << QVariant(false)         // low gravity    5
+        << QVariant(false)         // laser sight    6
+        << QVariant(false)         // invulnerable   7
+        << QVariant(false)         // reset health   8
+        << QVariant(false)         // vampiric       9
+        << QVariant(false)         // karma          10
+        << QVariant(false)         // artillery      11
+        << QVariant(true)          // random order   12
+        << QVariant(true)          // king           13
+        << QVariant(false)         // place hog      14
+        << QVariant(false)         // shared ammo    15
+        << QVariant(false)         // disable girders 16
+        << QVariant(false)         // disable land objects 17
+        << QVariant(false)         // AI survival    18
+        << QVariant(false)         // inf. attack    19
+        << QVariant(false)         // reset weps     20
+        << QVariant(false)         // per hog ammo   21
+        << QVariant(false)         // no wind        22
+        << QVariant(false)         // more wind      23
+        << QVariant(false)         // tag team       24
+        << QVariant(false)         // bottom border  25
+        << QVariant(100)           // damage modfier 26
+        << QVariant(45)            // turn time      27
+        << QVariant(100)           // init health    28
+        << QVariant(15)            // sudden death   29
+        << QVariant(5)             // case prob      30
+        << QVariant(3)             // mines time     31
+        << QVariant(4)             // mines number   32
+        << QVariant(0)             // mine dud pct   33
+        << QVariant(2)             // explosives     34
+        << QVariant(35)            // health case pct 35
+        << QVariant(25)            // health case amt 36
+        << QVariant(47)            // water rise amt 37
+        << QVariant(5)             // health dec amt 38
+        << QVariant(100)           // rope modfier   39
+        << QVariant(100)           // get away time  40
+        ;
+
+
+    schemes.append(defaultScheme);
+    schemes.append(proMode);
+    schemes.append(shoppa);
+    schemes.append(cleanslate);
+    schemes.append(minefield);
+    schemes.append(barrelmayhem);
+    schemes.append(tunnelhogs);
+    schemes.append(forts);
+    schemes.append(timeless);
+    schemes.append(thinkingportals);
+    schemes.append(kingmode);
+
+
+    int size = fileConfig.beginReadArray("schemes");
+    for (int i = 0; i < size; ++i) {
+        fileConfig.setArrayIndex(i);
+
+        if (!predefSchemesNames.contains(fileConfig.value(spNames[0]).toString()))
+        {
+            QList<QVariant> scheme;
+
+            for (int k = 0; k < spNames.size(); ++k)
+                scheme << fileConfig.value(spNames[k], defaultScheme[k]);
+
+            schemes.append(scheme);
+        }
+    }
+    fileConfig.endArray();
+}
+
+QVariant AmmoSchemeModel::headerData(int section, Qt::Orientation orientation, int role) const
+{
+    Q_UNUSED(section);
+    Q_UNUSED(orientation);
+    Q_UNUSED(role);
+
+    return QVariant();
+}
+
+int AmmoSchemeModel::rowCount(const QModelIndex &parent) const
+{
+    if (parent.isValid())
+        return 0;
+    else
+        return schemes.size();
+}
+
+int AmmoSchemeModel::columnCount(const QModelIndex & parent) const
+{
+    if (parent.isValid())
+        return 0;
+    else
+        return defaultScheme.size();
+}
+
+Qt::ItemFlags AmmoSchemeModel::flags(const QModelIndex & index) const
+{
+    Q_UNUSED(index);
+
+    return
+        Qt::ItemIsEnabled
+        | Qt::ItemIsSelectable
+        | Qt::ItemIsEditable;
+}
+
+bool AmmoSchemeModel::setData(const QModelIndex & index, const QVariant & value, int role)
+{
+    if (!index.isValid() || index.row() < numberOfDefaultSchemes
+        || index.row() >= schemes.size()
+        || index.column() >= defaultScheme.size()
+        || role != Qt::EditRole)
+        return false;
+
+    schemes[index.row()][index.column()] = value;
+
+    emit dataChanged(index, index);
+    return true;
+}
+
+bool AmmoSchemeModel::insertRows(int row, int count, const QModelIndex & parent)
+{
+    Q_UNUSED(count);
+
+    beginInsertRows(parent, schemes.size(), schemes.size());
+
+    if (row == -1)
+    {
+        QList<QVariant> newScheme = defaultScheme;
+        newScheme[0] = QVariant(tr("new"));
+        schemes.insert(schemes.size(), newScheme);
+    }
+    else
+    {
+        QList<QVariant> newScheme = schemes[row];
+        newScheme[0] = QVariant(tr("copy of") + " " + newScheme[0].toString());
+        schemes.insert(schemes.size(), newScheme);
+    }
+
+    endInsertRows();
+
+    return true;
+}
+
+bool AmmoSchemeModel::removeRows(int row, int count, const QModelIndex & parent)
+{
+    if(count != 1
+        || row < numberOfDefaultSchemes
+        || row >= schemes.size())
+        return false;
+
+    beginRemoveRows(parent, row, row);
+
+    schemes.removeAt(row);
+
+    endRemoveRows();
+
+    return true;
+}
+
+QVariant AmmoSchemeModel::data(const QModelIndex &index, int role) const
+{
+    if (!index.isValid() || index.row() < 0
+        || index.row() >= schemes.size()
+        || index.column() >= defaultScheme.size()
+        || (role != Qt::EditRole && role != Qt::DisplayRole)
+        )
+        return QVariant();
+
+    return schemes[index.row()][index.column()];
+}
+
+void AmmoSchemeModel::Save()
+{
+    fileConfig.beginWriteArray("schemes", schemes.size() - numberOfDefaultSchemes);
+
+    for (int i = 0; i < schemes.size() - numberOfDefaultSchemes; ++i) {
+        fileConfig.setArrayIndex(i);
+
+        QList<QVariant> scheme = schemes[i + numberOfDefaultSchemes];
+
+        for (int k = 0; k < scheme.size(); ++k)
+            fileConfig.setValue(spNames[k], scheme[k]);
+    }
+    fileConfig.endArray();
+}
+
+
+NetAmmoSchemeModel::NetAmmoSchemeModel(QObject * parent) :
+    QAbstractTableModel(parent)
+{
+    netScheme = defaultScheme;
+}
+
+QVariant NetAmmoSchemeModel::headerData(int section, Qt::Orientation orientation, int role) const
+{
+    Q_UNUSED(section);
+    Q_UNUSED(orientation);
+    Q_UNUSED(role);
+
+    return QVariant();
+}
+
+int NetAmmoSchemeModel::rowCount(const QModelIndex & parent) const
+{
+    if (parent.isValid())
+        return 0;
+    else
+        return 1;
+}
+
+int NetAmmoSchemeModel::columnCount(const QModelIndex & parent) const
+{
+    if (parent.isValid())
+        return 0;
+    else
+        return defaultScheme.size();
+}
+
+QVariant NetAmmoSchemeModel::data(const QModelIndex &index, int role) const
+{
+    if (!index.isValid() || index.row() < 0
+        || index.row() > 1
+        || index.column() >= defaultScheme.size()
+        || (role != Qt::EditRole && role != Qt::DisplayRole)
+        )
+        return QVariant();
+
+    return netScheme[index.column()];
+}
+
+void NetAmmoSchemeModel::setNetSchemeConfig(QStringList & cfg)
+{
+    if(cfg.size() != netScheme.size())
+    {
+        qWarning("Incorrect scheme cfg size");
+        return;
+    }
+
+    for(int i = 0; i < cfg.size(); ++i)
+        netScheme[i] = QVariant(cfg[i]);
+
+    reset();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/model/ammoSchemeModel.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,79 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2005-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef _AMMO_SCHEME_MODEL_INCLUDED
+#define _AMMO_SCHEME_MODEL_INCLUDED
+
+#include <QSettings>
+#include <QAbstractTableModel>
+#include <QStringList>
+#include <QList>
+
+class AmmoSchemeModel : public QAbstractTableModel
+{
+    Q_OBJECT
+
+public:
+    AmmoSchemeModel(QObject * parent, const QString & fileName);
+
+    QVariant headerData(int section, Qt::Orientation orientation, int role) const;
+    int rowCount(const QModelIndex & parent) const;
+    int columnCount(const QModelIndex & parent) const;
+    Qt::ItemFlags flags(const QModelIndex & index) const;
+    bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole);
+    bool insertRows(int row, int count, const QModelIndex & parent = QModelIndex());
+    bool removeRows(int row, int count, const QModelIndex & parent = QModelIndex());
+    QVariant data(const QModelIndex &index, int role) const;
+
+    int numberOfDefaultSchemes;
+    QStringList predefSchemesNames;
+    QStringList spNames;
+
+public slots:
+    void Save();
+
+signals:
+    void dataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight);
+
+protected:
+    QList< QList<QVariant> > schemes;
+
+private:
+    QSettings fileConfig;
+};
+
+class NetAmmoSchemeModel : public QAbstractTableModel
+{
+    Q_OBJECT
+
+public:
+    NetAmmoSchemeModel(QObject * parent);
+
+    QVariant headerData(int section, Qt::Orientation orientation, int role) const;
+    int rowCount(const QModelIndex & parent) const;
+    int columnCount(const QModelIndex & parent) const;
+    QVariant data(const QModelIndex &index, int role) const;
+
+public slots:
+    void setNetSchemeConfig(QStringList & cfg);
+
+private:
+    QList<QVariant> netScheme;
+};
+
+#endif // _AMMO_SCHEME_MODEL_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/model/hats.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,142 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QDir>
+#include <QPixmap>
+#include <QPainter>
+#include "hwconsts.h"
+#include "hwform.h"
+#include "hats.h"
+
+HatsModel::HatsModel(QObject* parent) :
+  QAbstractListModel(parent)
+{
+    QFile hhfile;
+    hhfile.setFileName(cfgdir->absolutePath() + "/Data/Graphics/Hedgehog/Idle.png");
+    if (!hhfile.exists()) hhfile.setFileName(datadir->absolutePath() + "/Graphics/Hedgehog/Idle.png");
+    QPixmap hhpix = QPixmap(QFileInfo(hhfile).absoluteFilePath()).copy(0, 0, 32, 32);
+
+    QDir tmpdir;
+    tmpdir.cd(cfgdir->absolutePath());
+    tmpdir.cd("Data");
+    tmpdir.cd("Graphics");
+    tmpdir.cd("Hats");
+
+    tmpdir.setFilter(QDir::Files);
+
+    QStringList userhatsList = tmpdir.entryList(QStringList("*.png"));
+    for (QStringList::Iterator it = userhatsList.begin(); it != userhatsList.end(); ++it )
+    {
+        QString str = QString(*it).replace(QRegExp("^(.*)\\.png"), "\\1");
+        QPixmap pix(cfgdir->absolutePath() + "/Data/Graphics/Hats/" + str + ".png");
+
+        QPixmap tmppix(32, 37);
+        tmppix.fill(QColor(Qt::transparent));
+
+        QPainter painter(&tmppix);
+        painter.drawPixmap(QPoint(0, 5), hhpix);
+        painter.drawPixmap(QPoint(0, 0), pix.copy(0, 0, 32, 32));
+        if(pix.width() > 32)
+            painter.drawPixmap(QPoint(0, 0), pix.copy(32, 0, 32, 32));
+        painter.end();
+
+        hats.append(qMakePair(str, QIcon(tmppix)));
+    }
+
+    tmpdir.cd(datadir->absolutePath());
+    tmpdir.cd("Graphics");
+    tmpdir.cd("Hats");
+
+    QStringList hatsList = tmpdir.entryList(QStringList("*.png"));
+    for (QStringList::Iterator it = hatsList.begin(); it != hatsList.end(); ++it )
+    {
+        if (userhatsList.contains(*it,Qt::CaseInsensitive)) continue;
+        QString str = (*it).replace(QRegExp("^(.*)\\.png"), "\\1");
+        QPixmap pix(datadir->absolutePath() + "/Graphics/Hats/" + str + ".png");
+
+        QPixmap tmppix(32, 37);
+        tmppix.fill(QColor(Qt::transparent));
+
+        QPainter painter(&tmppix);
+        painter.drawPixmap(QPoint(0, 5), hhpix);
+        painter.drawPixmap(QPoint(0, 0), pix.copy(0, 0, 32, 32));
+        if(pix.width() > 32)
+            painter.drawPixmap(QPoint(0, 0), pix.copy(32, 0, 32, 32));
+        painter.end();
+
+        hats.append(qMakePair(str, QIcon(tmppix)));
+    }
+    // Reserved hats
+    tmpdir.cd("Reserved");
+    hatsList = tmpdir.entryList(QStringList(playerHash+"*.png"));
+    for (QStringList::Iterator it = hatsList.begin(); it != hatsList.end(); ++it )
+    {
+        QString str = (*it).replace(QRegExp("^(.*)\\.png"), "\\1");
+        QPixmap pix(datadir->absolutePath() + "/Graphics/Hats/Reserved/" + str + ".png");
+
+        QPixmap tmppix(32, 37);
+        tmppix.fill(QColor(Qt::transparent));
+
+        QPainter painter(&tmppix);
+        painter.drawPixmap(QPoint(0, 5), hhpix);
+        painter.drawPixmap(QPoint(0, 0), pix.copy(0, 0, 32, 32));
+        painter.end();
+
+        hats.append(qMakePair("Reserved "+str.remove(0,32), QIcon(tmppix)));
+    }
+}
+
+QVariant HatsModel::headerData(int section,
+            Qt::Orientation orientation, int role) const
+{
+    Q_UNUSED(section);
+    Q_UNUSED(orientation);
+    Q_UNUSED(role);
+
+    return QVariant();
+}
+
+int HatsModel::rowCount(const QModelIndex &parent) const
+{
+    if (parent.isValid())
+        return 0;
+    else
+        return hats.size();
+}
+
+/*int HatsModel::columnCount(const QModelIndex & parent) const
+{
+    if (parent.isValid())
+        return 0;
+    else
+        return 2;
+}
+*/
+QVariant HatsModel::data(const QModelIndex &index,
+                         int role) const
+{
+    if (!index.isValid() || index.row() < 0
+        || index.row() >= hats.size()
+        || (role != Qt::DisplayRole && role != Qt::DecorationRole))
+        return QVariant();
+
+    if (role == Qt::DisplayRole)
+        return hats.at(index.row()).first;
+    else // role == Qt::DecorationRole
+        return hats.at(index.row()).second;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/model/hats.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,44 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef _HATS_INCLUDED
+#define _HATS_INCLUDED
+
+#include <QAbstractListModel>
+#include <QStringList>
+#include <QVector>
+#include <QPair>
+#include <QIcon>
+
+class HatsModel : public QAbstractListModel
+{
+    Q_OBJECT
+
+public:
+    HatsModel(QObject *parent = 0);
+
+    QVariant headerData(int section, Qt::Orientation orientation, int role) const;
+    int rowCount(const QModelIndex & parent) const;
+    //int columnCount(const QModelIndex & parent) const;
+
+    QVariant data(const QModelIndex &index, int role) const;
+protected:
+    QVector<QPair<QString, QIcon> > hats;
+};
+
+#endif // _HATS_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/model/netserverslist.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,68 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QUdpSocket>
+#include <QListWidget>
+
+#include "netserverslist.h"
+
+HWNetServersModel::HWNetServersModel(QObject* parent) :
+  QAbstractTableModel(parent)
+{
+
+}
+
+void HWNetServersModel::updateList()
+{
+
+}
+
+QVariant HWNetServersModel::headerData(int section,
+            Qt::Orientation orientation, int role) const
+{
+    if (role != Qt::DisplayRole)
+        return QVariant();
+
+    if (orientation == Qt::Horizontal)
+    {
+        switch (section)
+        {
+            case 0: return tr("Title");
+            case 1: return tr("IP");
+            case 2: return tr("Port");
+            default: return QVariant();
+        }
+    } else
+        return QString("%1").arg(section + 1);
+}
+
+int HWNetServersModel::rowCount(const QModelIndex &parent) const
+{
+    if (parent.isValid())
+        return 0;
+    else
+        return games.size();
+}
+
+int HWNetServersModel::columnCount(const QModelIndex & parent) const
+{
+    if (parent.isValid())
+        return 0;
+    else
+        return 3;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/model/netserverslist.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,43 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef _NET_SERVERSLIST_INCLUDED
+#define _NET_SERVERSLIST_INCLUDED
+
+#include <QAbstractTableModel>
+#include <QStringList>
+
+class HWNetServersModel : public QAbstractTableModel
+{
+    Q_OBJECT
+
+public:
+    HWNetServersModel(QObject *parent = 0);
+
+    QVariant headerData(int section, Qt::Orientation orientation, int role) const;
+    int rowCount(const QModelIndex & parent) const;
+    int columnCount(const QModelIndex & parent) const;
+
+public slots:
+    virtual void updateList();
+
+protected:
+    QList<QStringList> games;
+};
+
+#endif // _NET_SERVERSLIST_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/model/themesmodel.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,49 @@
+
+#include "themesmodel.h"
+
+ThemesModel::ThemesModel(QStringList themes, QObject *parent) :
+    QAbstractListModel(parent)
+{
+#if QT_VERSION >= QT_VERSION_CHECK(4, 7, 0)
+    m_data.reserve(themes.size());
+#endif
+
+    foreach(QString theme, themes)
+    {
+        m_data.append(QHash<int, QVariant>());
+        m_data.last().insert(Qt::DisplayRole, theme);
+    }
+}
+
+int ThemesModel::rowCount(const QModelIndex &parent) const
+{
+    if(parent.isValid())
+        return 0;
+    else
+        return m_data.size();
+}
+
+QVariant ThemesModel::data(const QModelIndex &index, int role) const
+{
+    if(index.column() > 0 || index.row() >= m_data.size())
+        return QVariant();
+    else
+        return m_data.at(index.row()).value(role);
+}
+
+bool ThemesModel::setData(const QModelIndex &index, const QVariant &value, int role)
+{
+    if(index.column() > 0 || index.row() >= m_data.size())
+        return false;
+    else
+    {
+        m_data[index.row()].insert(role, value);
+
+        return true;
+    }
+
+}
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/model/themesmodel.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,28 @@
+#ifndef THEMESMODEL_H
+#define THEMESMODEL_H
+
+#include <QAbstractListModel>
+#include <QStringList>
+#include <QHash>
+
+class ThemesModel : public QAbstractListModel
+{
+    Q_OBJECT
+public:
+    explicit ThemesModel(QStringList themes, QObject *parent = 0);
+
+    int rowCount(const QModelIndex &parent = QModelIndex()) const;
+    QVariant data(const QModelIndex &index, int role) const;
+    bool setData(const QModelIndex &index, const QVariant &value,
+                 int role = Qt::EditRole);
+
+signals:
+
+public slots:
+
+private:
+
+    QList<QHash<int, QVariant> > m_data;
+};
+
+#endif // THEMESMODEL_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pageadmin.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,112 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QGridLayout>
+#include <QLabel>
+#include <QLineEdit>
+#include <QSpinBox>
+#include <QPushButton>
+#include <QTextBrowser>
+
+#include "pageadmin.h"
+#include "chatwidget.h"
+
+QLayout * PageAdmin::bodyLayoutDefinition()
+{
+    QGridLayout * pageLayout = new QGridLayout();
+
+    // 0
+    pbAsk = addButton(tr("Fetch data"), pageLayout, 0, 0, 1, 3);
+    
+    // 1
+    QLabel * lblSMN = new QLabel(this);
+    lblSMN->setText(tr("Server message for latest version:"));
+    pageLayout->addWidget(lblSMN, 1, 0);
+
+    leServerMessageNew = new QLineEdit(this);
+    pageLayout->addWidget(leServerMessageNew, 1, 1);
+
+    // 2
+    QLabel * lblSMO = new QLabel(this);
+    lblSMO->setText(tr("Server message for previous versions:"));
+    pageLayout->addWidget(lblSMO, 2, 0);
+
+    leServerMessageOld = new QLineEdit(this);
+    pageLayout->addWidget(leServerMessageOld, 2, 1);
+
+    // 3
+    QLabel * lblP = new QLabel(this);
+    lblP->setText(tr("Latest version protocol number:"));
+    pageLayout->addWidget(lblP, 3, 0);
+
+    sbProtocol = new QSpinBox(this);
+    pageLayout->addWidget(sbProtocol, 3, 1);
+
+    // 4
+    QLabel * lblPreview = new QLabel(this);
+    lblPreview->setText(tr("MOTD preview:"));
+    pageLayout->addWidget(lblPreview, 4, 0);
+
+    tb = new QTextBrowser(this);
+    tb->setOpenExternalLinks(true);
+    tb->document()->setDefaultStyleSheet(HWChatWidget::STYLE);
+    pageLayout->addWidget(tb, 4, 1, 1, 2);
+    
+    // 5
+    pbClearAccountsCache = addButton(tr("Clear Accounts Cache"), pageLayout, 5, 0);
+    
+    // 6
+    pbSetSM = addButton(tr("Set data"), pageLayout, 6, 0, 1, 3);
+
+    return pageLayout;
+}
+
+void PageAdmin::connectSignals()
+{
+    connect(pbAsk, SIGNAL(clicked()), this, SIGNAL(askServerVars()));
+    connect(leServerMessageNew, SIGNAL(textEdited(const QString &)), tb, SLOT(setHtml(const QString &)));
+    connect(leServerMessageOld, SIGNAL(textEdited(const QString &)), tb, SLOT(setHtml(const QString &)));
+    connect(pbClearAccountsCache, SIGNAL(clicked()), this, SIGNAL(clearAccountsCache()));
+    connect(pbSetSM, SIGNAL(clicked()), this, SLOT(smChanged()));
+}
+
+PageAdmin::PageAdmin(QWidget* parent) : AbstractPage(parent)
+{
+    initPage();
+}
+
+void PageAdmin::smChanged()
+{
+    emit setServerMessageNew(leServerMessageNew->text());
+    emit setServerMessageOld(leServerMessageOld->text());
+    emit setProtocol(sbProtocol->value());
+}
+
+void PageAdmin::serverMessageNew(const QString & str)
+{
+    leServerMessageNew->setText(str);
+}
+
+void PageAdmin::serverMessageOld(const QString & str)
+{
+    leServerMessageOld->setText(str);
+}
+void PageAdmin::protocol(int proto)
+{
+    sbProtocol->setValue(proto);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pageadmin.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,60 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef PAGE_ADMIN_H
+#define PAGE_ADMIN_H
+
+#include "AbstractPage.h"
+
+class PageAdmin : public AbstractPage
+{
+    Q_OBJECT
+
+public:
+    PageAdmin(QWidget* parent = 0);
+
+public slots:
+    void serverMessageNew(const QString & str);
+    void serverMessageOld(const QString & str);
+    void protocol(int proto);
+
+signals:
+    void setServerMessageNew(const QString & str);
+    void setServerMessageOld(const QString & str);
+    void setProtocol(int proto);
+    void askServerVars();
+    void clearAccountsCache();
+
+protected:
+    QLayout * bodyLayoutDefinition();
+    void connectSignals();
+
+private:
+    QLineEdit * leServerMessageNew;
+    QLineEdit * leServerMessageOld;
+    QPushButton * pbSetSM;
+    QPushButton * pbAsk;
+    QSpinBox * sbProtocol;
+    QTextBrowser * tb;
+    QPushButton * pbClearAccountsCache;
+
+private slots:
+    void smChanged();
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagecampaign.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,53 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QGridLayout>
+#include <QPushButton>
+#include <QComboBox>
+
+#include "pagecampaign.h"
+
+QLayout * PageCampaign::bodyLayoutDefinition()
+{
+    QGridLayout * pageLayout = new QGridLayout();
+    pageLayout->setColumnStretch(0, 1);
+    pageLayout->setColumnStretch(1, 2);
+    pageLayout->setColumnStretch(2, 1);
+    pageLayout->setRowStretch(0, 1);
+    pageLayout->setRowStretch(3, 1);
+
+    CBSelect = new QComboBox(this);
+    CBTeam = new QComboBox(this);
+
+    pageLayout->addWidget(CBTeam, 1, 1);
+    pageLayout->addWidget(CBSelect, 2, 1);
+    
+    BtnStartCampaign = new QPushButton(this);
+    BtnStartCampaign->setFont(*font14);
+    BtnStartCampaign->setText(QPushButton::tr("Go!"));
+    pageLayout->addWidget(BtnStartCampaign, 2, 2);
+
+    return pageLayout;
+}
+
+PageCampaign::PageCampaign(QWidget* parent) : AbstractPage(parent)
+{
+    initPage();
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagecampaign.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,39 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef PAGE_CAMPAIGN_H
+#define PAGE_CAMPAIGN_H
+
+#include "AbstractPage.h"
+
+class PageCampaign : public AbstractPage
+{
+    Q_OBJECT
+
+public:
+    PageCampaign(QWidget* parent = 0);
+
+    QPushButton *BtnStartCampaign;
+    QComboBox   *CBSelect;
+    QComboBox   *CBTeam;
+
+protected:
+    QLayout * bodyLayoutDefinition();
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pageconnecting.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,43 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QVBoxLayout>
+#include <QLabel>
+
+#include "pageconnecting.h"
+
+QLayout * PageConnecting::bodyLayoutDefinition()
+{
+    QVBoxLayout * pageLayout = new QVBoxLayout();
+
+    QLabel * lblConnecting = new QLabel(this);
+    lblConnecting->setText(tr("Connecting..."));
+    pageLayout->addWidget(lblConnecting);
+
+    return pageLayout;
+}
+
+void PageConnecting::connectSignals()
+{
+    connect(this, SIGNAL(goBack()), this, SIGNAL(cancelConnection()));
+}
+
+PageConnecting::PageConnecting(QWidget* parent) :  AbstractPage(parent)
+{
+    initPage();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pageconnecting.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,39 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef PAGE_CONNECTING_H
+#define PAGE_CONNECTING_H
+
+#include "AbstractPage.h"
+
+class PageConnecting : public AbstractPage
+{
+    Q_OBJECT
+
+public:
+    PageConnecting(QWidget* parent = 0);
+
+signals:
+    void cancelConnection();
+
+protected:
+    QLayout * bodyLayoutDefinition();
+    void connectSignals();
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagedata.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,229 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QGridLayout>
+#include <QPushButton>
+#include <QNetworkAccessManager>
+#include <QNetworkRequest>
+#include <QNetworkReply>
+#include <QFileInfo>
+#include <QFileDialog>
+#include <QDebug>
+#include <QProgressBar>
+#include <QBuffer>
+
+#include "pagedata.h"
+#include "databrowser.h"
+#include "hwconsts.h"
+
+#include "quazip.h"
+#include "quazipfile.h"
+
+QLayout * PageDataDownload::bodyLayoutDefinition()
+{
+    QGridLayout * pageLayout = new QGridLayout();
+    pageLayout->setColumnStretch(0, 1);
+    pageLayout->setColumnStretch(1, 1);
+    pageLayout->setColumnStretch(2, 1);
+
+    web = new DataBrowser(this);
+    pageLayout->addWidget(web, 0, 0, 1, 3);
+
+    progressBarsLayout = new QVBoxLayout();
+    pageLayout->addLayout(progressBarsLayout, 1, 0, 1, 3);
+    return pageLayout;
+}
+
+void PageDataDownload::connectSignals()
+{
+    connect(web, SIGNAL(anchorClicked(QUrl)), this, SLOT(request(const QUrl&)));
+}
+
+PageDataDownload::PageDataDownload(QWidget* parent) : AbstractPage(parent)
+{
+    initPage();
+
+    web->setOpenLinks(false);
+    fetchList();
+}
+
+void PageDataDownload::request(const QUrl &url)
+{
+    QUrl finalUrl;
+    if(url.host().isEmpty())
+        finalUrl = QUrl("http://www.hedgewars.org" + url.path());
+    else
+        finalUrl = url;
+
+    if(url.path().endsWith(".zip"))
+    {
+        qWarning() << "Download Request" << url.toString();
+        QString fileName = QFileInfo(url.toString()).fileName();
+
+        QNetworkRequest newRequest(finalUrl);
+        newRequest.setAttribute(QNetworkRequest::User, fileName);
+
+        QNetworkAccessManager *manager = new QNetworkAccessManager(this);
+        QNetworkReply *reply = manager->get(newRequest);
+        connect(reply, SIGNAL(finished()), this, SLOT(fileDownloaded()));
+        connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64, qint64)));
+
+        QProgressBar *progressBar = new QProgressBar(this);
+        progressBarsLayout->addWidget(progressBar);
+        progressBars.insert(reply, progressBar);
+    } else
+    {
+        qWarning() << "Page Request" << url.toString();
+
+        QNetworkRequest newRequest(finalUrl);
+
+        QNetworkAccessManager *manager = new QNetworkAccessManager(this);
+        QNetworkReply *reply = manager->get(newRequest);
+        connect(reply, SIGNAL(finished()), this, SLOT(pageDownloaded()));
+    }
+}
+
+
+void PageDataDownload::pageDownloaded()
+{
+    QNetworkReply * reply = qobject_cast<QNetworkReply *>(sender());
+
+    if(reply)
+    {
+        QString html = QString::fromUtf8(reply->readAll());
+        int begin = html.indexOf("<!-- BEGIN -->");
+        int end = html.indexOf("<!-- END -->");
+        if(begin != -1 && begin < end)
+        {
+            html.truncate(end);
+            html.remove(0, begin);
+        }
+        web->setHtml(html);
+    }
+}
+
+void PageDataDownload::fileDownloaded()
+{
+    QNetworkReply * reply = qobject_cast<QNetworkReply *>(sender());
+
+    if(reply)
+    {
+        QByteArray fileContents = reply->readAll();
+        QProgressBar *progressBar = progressBars.value(reply, 0);
+
+        if(progressBar)
+        {
+            progressBars.remove(reply);
+            progressBar->deleteLater();
+        }
+
+        extractDataPack(&fileContents);
+    }
+}
+
+void PageDataDownload::downloadProgress(qint64 bytesRecieved, qint64 bytesTotal)
+{
+    QNetworkReply * reply = qobject_cast<QNetworkReply *>(sender());
+
+    if(reply)
+    {
+        QProgressBar *progressBar = progressBars.value(reply, 0);
+
+        if(progressBar)
+        {
+            progressBar->setValue(bytesRecieved);
+            progressBar->setMaximum(bytesTotal);
+        }
+    }
+}
+
+void PageDataDownload::fetchList()
+{
+    request(QUrl("http://hedgewars.org/content.html"));
+}
+
+bool PageDataDownload::extractDataPack(QByteArray * buf)
+{
+    QBuffer buffer;
+    buffer.setBuffer(buf);
+
+    QuaZip zip;
+    zip.setIoDevice(&buffer);
+    if(!zip.open(QuaZip::mdUnzip))
+    {
+      qWarning("testRead(): zip.open(): %d", zip.getZipError());
+      return false;
+    }
+
+    QuaZipFile file(&zip);
+
+    QDir extractDir(*cfgdir);
+    extractDir.cd("Data");
+
+    for(bool more = zip.goToFirstFile(); more; more = zip.goToNextFile())
+    {
+        if(!file.open(QIODevice::ReadOnly))
+        {
+            qWarning("file.open(): %d", file.getZipError());
+            return false;
+        }
+
+
+        QString fileName = file.getActualFileName();
+        QString filePath = extractDir.filePath(fileName);
+        if (fileName.endsWith("/"))
+        {
+            QFileInfo fi(filePath);
+            QDir().mkpath(fi.filePath());
+        } else
+        {
+            qDebug() << "Extracting" << filePath;
+            QFile out(filePath);
+            if(!out.open(QFile::WriteOnly))
+            {
+                qWarning() << "out.open():" << out.errorString();
+                return false;
+            }
+
+            out.write(file.readAll());
+
+            out.close();
+
+            if(file.getZipError() != UNZ_OK) {
+                qWarning("file.getFileName(): %d", file.getZipError());
+                return false;
+            }
+
+            if(!file.atEnd()) {
+                qWarning("read all but not EOF");
+                return false;
+            }
+        }
+
+        file.close();
+
+        if(file.getZipError()!=UNZ_OK) {
+            qWarning("file.close(): %d", file.getZipError());
+            return false;
+        }
+    }
+
+    zip.close();
+
+    return true;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagedata.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,59 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef PAGE_DATA_H
+#define PAGE_DATA_H
+
+#include <QUrl>
+#include "AbstractPage.h"
+
+class DataBrowser;
+class QProgressBar;
+class QNetworkReply;
+class QVBoxLayout;
+
+class PageDataDownload : public AbstractPage
+{
+    Q_OBJECT
+
+public:
+    PageDataDownload(QWidget* parent = 0);
+
+public slots:
+    void fetchList();
+
+protected:
+    QLayout * bodyLayoutDefinition();
+    void connectSignals();
+
+private:
+    DataBrowser *web;
+    QHash<QNetworkReply*, QProgressBar *> progressBars;
+    QVBoxLayout *progressBarsLayout;
+
+    bool extractDataPack(QByteArray * buf);
+
+private slots:
+    void request(const QUrl &url);
+
+    void pageDownloaded();
+    void fileDownloaded();
+    void downloadProgress(qint64, qint64);
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagedrawmap.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,69 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QGridLayout>
+#include <QPushButton>
+#include <QFileDialog>
+
+#include "pagedrawmap.h"
+#include "drawmapwidget.h"
+
+
+QLayout * PageDrawMap::bodyLayoutDefinition()
+{
+    QGridLayout * pageLayout = new QGridLayout();
+
+    pbUndo = addButton(tr("Undo"), pageLayout, 0, 0);
+    pbClear = addButton(tr("Clear"), pageLayout, 1, 0);
+    pbLoad = addButton(tr("Load"), pageLayout, 2, 0);
+    pbSave = addButton(tr("Save"), pageLayout, 3, 0);
+
+    drawMapWidget = new DrawMapWidget(this);
+    pageLayout->addWidget(drawMapWidget, 0, 1, 5, 1);
+
+    return pageLayout;
+}
+
+void PageDrawMap::connectSignals()
+{
+    connect(pbUndo, SIGNAL(clicked()), drawMapWidget, SLOT(undo()));
+    connect(pbClear, SIGNAL(clicked()), drawMapWidget, SLOT(clear()));
+    connect(pbLoad, SIGNAL(clicked()), this, SLOT(load()));
+    connect(pbSave, SIGNAL(clicked()), this, SLOT(save()));
+}
+
+PageDrawMap::PageDrawMap(QWidget* parent) : AbstractPage(parent)
+{
+    initPage();
+}
+
+void PageDrawMap::load()
+{
+    QString fileName = QFileDialog::getOpenFileName(NULL, tr("Load drawn map"), ".", tr("Drawn Maps") + " (*.hwmap);;" + tr("All files") + " (*)");
+
+    if(!fileName.isEmpty())
+        drawMapWidget->load(fileName);
+}
+
+void PageDrawMap::save()
+{
+    QString fileName = QFileDialog::getSaveFileName(NULL, tr("Save drawn map"), ".", tr("Drawn Maps") + " (*.hwmap);;" + tr("All files") + " (*)");
+
+    if(!fileName.isEmpty())
+        drawMapWidget->save(fileName);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagedrawmap.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,51 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef PAGE_DRAWMAP_H
+#define PAGE_DRAWMAP_H
+
+#include "AbstractPage.h"
+
+class DrawMapWidget;
+
+class PageDrawMap : public AbstractPage
+{
+    Q_OBJECT
+
+public:
+    PageDrawMap(QWidget* parent = 0);
+
+    DrawMapWidget * drawMapWidget;
+
+protected:
+    QLayout * bodyLayoutDefinition();
+    void connectSignals();
+
+private:
+    QPushButton * pbUndo;
+    QPushButton * pbClear;
+    QPushButton * pbLoad;
+    QPushButton * pbSave;
+
+private slots:
+    void load();
+    void save();
+};
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pageeditteam.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,523 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QGridLayout>
+#include <QHBoxLayout>
+#include <QPushButton>
+#include <QComboBox>
+#include <QLabel>
+#include <QLineEdit>
+#include <QTabWidget>
+#include <QGroupBox>
+#include <QToolBox>
+#include <QMessageBox>
+
+#include "pageeditteam.h"
+#include "sdlkeys.h"
+#include "SquareLabel.h"
+#include "hats.h"
+#include "HWApplication.h"
+
+QLayout * PageEditTeam::bodyLayoutDefinition()
+{
+    QGridLayout * pageLayout = new QGridLayout();
+    QTabWidget * tbw = new QTabWidget();
+    QWidget * page1 = new QWidget(this);
+    QWidget * page2 = new QWidget(this);
+    tbw->addTab(page1, tr("General"));
+    tbw->addTab(page2, tr("Advanced"));
+    pageLayout->addWidget(tbw, 0, 0, 1, 3);
+
+    QHBoxLayout * page1Layout = new QHBoxLayout(page1);
+    page1Layout->setAlignment(Qt::AlignTop);
+    QGridLayout * page2Layout = new QGridLayout(page2);
+
+// ====== Page 1 ======
+    QVBoxLayout * vbox1 = new QVBoxLayout();
+    QVBoxLayout * vbox2 = new QVBoxLayout();
+    page1Layout->addLayout(vbox1);
+    page1Layout->addLayout(vbox2);
+
+    GBoxHedgehogs = new QGroupBox(this);
+    GBoxHedgehogs->setTitle(QGroupBox::tr("Team Members"));
+    GBoxHedgehogs->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+    QGridLayout * GBHLayout = new QGridLayout(GBoxHedgehogs);
+
+    HatsModel * hatsModel = new HatsModel(GBoxHedgehogs);
+    for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++)
+    {
+        HHHats[i] = new QComboBox(GBoxHedgehogs);
+        HHHats[i]->setModel(hatsModel);
+        HHHats[i]->setIconSize(QSize(32, 37));
+        //HHHats[i]->setSizeAdjustPolicy(QComboBox::AdjustToContents);
+        //HHHats[i]->setModelColumn(1);
+        //HHHats[i]->setMinimumWidth(132);
+        GBHLayout->addWidget(HHHats[i], i, 0);
+
+        HHNameEdit[i] = new QLineEdit(GBoxHedgehogs);
+        HHNameEdit[i]->setMaxLength(64);
+        HHNameEdit[i]->setMinimumWidth(120);
+        GBHLayout->addWidget(HHNameEdit[i], i, 1);
+
+        btnRandomHogName[i] = addButton(":/res/dice.png", GBHLayout, i, 3, true);
+    }
+
+    btnRandomTeam = addButton(QPushButton::tr("Random Team"), GBHLayout, 9, false);
+
+    vbox1->addWidget(GBoxHedgehogs);
+
+    GBoxTeam = new QGroupBox(this);
+    GBoxTeam->setTitle(QGroupBox::tr("Team Settings"));
+    GBoxTeam->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+    QGridLayout * GBTLayout = new QGridLayout(GBoxTeam);
+    QLabel * tmpLabel = new QLabel(GBoxTeam);
+    tmpLabel->setText(QLabel::tr("Name"));
+    GBTLayout->addWidget(tmpLabel, 0, 0);
+    tmpLabel = new QLabel(GBoxTeam);
+    tmpLabel->setText(QLabel::tr("Type"));
+    GBTLayout->addWidget(tmpLabel, 1, 0);
+    tmpLabel = new QLabel(GBoxTeam);
+    tmpLabel->setText(QLabel::tr("Grave"));
+    GBTLayout->addWidget(tmpLabel, 2, 0);
+    tmpLabel = new QLabel(GBoxTeam);
+    tmpLabel->setText(QLabel::tr("Flag"));
+    GBTLayout->addWidget(tmpLabel, 3, 0);
+    tmpLabel = new QLabel(GBoxTeam);
+    tmpLabel->setText(QLabel::tr("Voice"));
+    GBTLayout->addWidget(tmpLabel, 4, 0);
+
+    TeamNameEdit = new QLineEdit(GBoxTeam);
+    TeamNameEdit->setMaxLength(64);
+    GBTLayout->addWidget(TeamNameEdit, 0, 1);
+    vbox2->addWidget(GBoxTeam);
+
+    CBTeamLvl = new QComboBox(GBoxTeam);
+    CBTeamLvl->setIconSize(QSize(48, 48));
+    CBTeamLvl->addItem(QIcon(":/res/botlevels/0.png"), QComboBox::tr("Human"));
+    for(int i = 5; i > 0; i--)
+        CBTeamLvl->addItem(
+                QIcon(QString(":/res/botlevels/%1.png").arg(6 - i)),
+                QString("%1 %2").arg(QComboBox::tr("Level")).arg(i)
+                );
+    GBTLayout->addWidget(CBTeamLvl, 1, 1);
+
+    CBGrave = new QComboBox(GBoxTeam);
+    CBGrave->setMaxCount(65535);
+    CBGrave->setIconSize(QSize(32, 32));
+    GBTLayout->addWidget(CBGrave, 2, 1);
+
+    CBFlag = new QComboBox(GBoxTeam);
+    CBFlag->setMaxCount(65535);
+    CBFlag->setIconSize(QSize(22, 15));
+    GBTLayout->addWidget(CBFlag, 3, 1);
+
+    QHBoxLayout * hbox = new QHBoxLayout();
+    CBVoicepack = new QComboBox(GBoxTeam);
+
+    hbox->addWidget(CBVoicepack, 100);
+    btnTestSound = addButton(":/res/PlaySound.png", hbox, 1, true);
+    hbox->setStretchFactor(btnTestSound, 1);
+
+    GBTLayout->addLayout(hbox, 4, 1);
+
+    GBoxFort = new QGroupBox(this);
+    GBoxFort->setTitle(QGroupBox::tr("Fort"));
+    QGridLayout * GBFLayout = new QGridLayout(GBoxFort);
+    CBFort = new QComboBox(GBoxFort);
+    CBFort->setMaxCount(65535);
+    GBFLayout->addWidget(CBFort, 0, 0);
+    FortPreview = new SquareLabel(GBoxFort);
+    FortPreview->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+    FortPreview->setMinimumSize(128, 128);
+    FortPreview->setPixmap(QPixmap());
+    // perhaps due to handling its own paintevents, SquareLabel doesn't play nice with the stars
+    //FortPreview->setAttribute(Qt::WA_PaintOnScreen, true);
+    GBFLayout->addWidget(FortPreview, 1, 0);
+    vbox2->addWidget(GBoxFort);
+
+    vbox1->addStretch();
+    vbox2->addStretch();
+
+// ====== Page 2 ======
+    GBoxBinds = new QGroupBox(this);
+    GBoxBinds->setTitle(QGroupBox::tr("Key binds"));
+    QGridLayout * GBBLayout = new QGridLayout(GBoxBinds);
+    BindsBox = new QToolBox(GBoxBinds);
+    BindsBox->setLineWidth(0);
+    GBBLayout->addWidget(BindsBox);
+    page2Layout->addWidget(GBoxBinds, 0, 0);
+
+    quint16 i = 0;
+    quint16 num = 0;
+    QWidget * curW = NULL;
+    QGridLayout * pagelayout = NULL;
+    QLabel* l = NULL;
+    while (i < BINDS_NUMBER) {
+        if(cbinds[i].category != NULL)
+        {
+            if(curW != NULL)
+            {
+                l = new QLabel(curW);
+                l->setText("");
+                pagelayout->addWidget(l, num++, 0, 1, 2);
+            }
+            curW = new QWidget(this);
+            BindsBox->addItem(curW, HWApplication::translate("binds (categories)", cbinds[i].category));
+            pagelayout = new QGridLayout(curW);
+            num = 0;
+        }
+        if(cbinds[i].description != NULL)
+        {
+            l = new QLabel(curW);
+            l->setText((num > 0 ? QString("\n") : QString("")) + HWApplication::translate("binds (descriptions)", cbinds[i].description));
+            pagelayout->addWidget(l, num++, 0, 1, 2);
+        }
+
+        l = new QLabel(curW);
+        l->setText(HWApplication::translate("binds", cbinds[i].name));
+        l->setAlignment(Qt::AlignRight);
+        pagelayout->addWidget(l, num, 0);
+        CBBind[i] = new QComboBox(curW);
+        for(int j = 0; sdlkeys[j][1][0] != '\0'; j++)
+            CBBind[i]->addItem(HWApplication::translate("binds (keys)", sdlkeys[j][1]).contains(": ") ? HWApplication::translate("binds (keys)", sdlkeys[j][1]) : HWApplication::translate("binds (keys)", "Keyboard") + QString(": ") + HWApplication::translate("binds (keys)", sdlkeys[j][1]), sdlkeys[j][0]);
+        pagelayout->addWidget(CBBind[i++], num++, 1);
+    }
+
+    return pageLayout;
+}
+
+QLayout * PageEditTeam::footerLayoutDefinition()
+{
+    QHBoxLayout * bottomLayout = new QHBoxLayout();
+
+    btnSave = addButton(":/res/Save.png", bottomLayout, 0, true);;
+    btnSave->setStyleSheet("QPushButton{margin: 24px 0 0 0;}");
+    bottomLayout->setAlignment(btnSave, Qt::AlignRight | Qt::AlignBottom);
+
+    return bottomLayout;
+}
+
+void PageEditTeam::connectSignals()
+{
+    connect(btnSave, SIGNAL(clicked()), this, SLOT(saveTeam()));
+
+    signalMapper1 = new QSignalMapper(this);
+    signalMapper2 = new QSignalMapper(this);
+
+    connect(signalMapper1, SIGNAL(mapped(int)), this, SLOT(fixHHname(int)));
+    connect(signalMapper2, SIGNAL(mapped(int)), this, SLOT(setRandomName(int)));
+
+    for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++)
+    {
+        connect(HHNameEdit[i], SIGNAL(editingFinished()), signalMapper1, SLOT(map()));
+            signalMapper1->setMapping(HHNameEdit[i], i);
+
+        connect(btnRandomHogName[i], SIGNAL(clicked()), signalMapper2, SLOT(map()));
+            signalMapper2->setMapping(btnRandomHogName[i], i);
+    }
+
+    connect(btnRandomTeam, SIGNAL(clicked()), this, SLOT(setRandomNames()));
+    
+    connect(btnTestSound, SIGNAL(clicked()), this, SLOT(testSound()));
+
+    connect(CBFort, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(CBFort_activated(const QString &)));
+}
+
+PageEditTeam::PageEditTeam(QWidget* parent, SDLInteraction * sdli) :
+  AbstractPage(parent)
+{
+    initPage();
+
+    m_playerHash = "0000000000000000000000000000000000000000";
+    mySdli = sdli;
+
+    QDir tmpdir;
+    QStringList list;
+    tmpdir.cd(cfgdir->absolutePath());
+    if (tmpdir.cd("Data/Sounds/voices")) 
+    {
+        list = tmpdir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot, QDir::Name);
+        CBVoicepack->addItems(list);
+    }
+
+    tmpdir.cd(datadir->absolutePath());
+    tmpdir.cd("Sounds/voices");
+    QStringList tmplist = tmpdir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot, QDir::Name);
+    QStringList tmplist2;
+    foreach (const QString & line, tmplist)
+    {
+        if (!list.contains(line,Qt::CaseInsensitive))
+            tmplist2.append(line);
+    }
+
+    CBVoicepack->addItems(tmplist2);
+
+    QStringList userforts;
+    tmpdir.cd(cfgdir->absolutePath());
+    if (tmpdir.cd("Data/Forts"))
+    {
+        tmpdir.setFilter(QDir::Files);
+        userforts = tmpdir.entryList(QStringList("*L.png")).replaceInStrings(QRegExp("^(.*)L\\.png"), "\\1");
+        CBFort->addItems(userforts);
+    }
+
+    tmpdir.cd("../Graphics/Graves");
+    QStringList userlist = tmpdir.entryList(QStringList("*.png"));
+    for (QStringList::Iterator it = userlist.begin(); it != userlist.end(); ++it )
+    {
+        QPixmap pix(cfgdir->absolutePath() + "/Data/Graphics/Graves/" + *it);
+        QIcon icon(pix.copy(0, 0, 32, 32));
+        CBGrave->addItem(icon, QString(*it).replace(QRegExp("^(.*)\\.png"), "\\1"));
+    }
+
+    tmpdir.cd(datadir->absolutePath());
+    tmpdir.cd("Forts");
+    tmpdir.setFilter(QDir::Files);
+
+    tmplist = tmpdir.entryList(QStringList("*L.png")).replaceInStrings(QRegExp("^(.*)L\\.png"), "\\1");
+    QStringList dataforts;
+    foreach (const QString & line, tmplist)
+    {
+        if (!userforts.contains(line,Qt::CaseInsensitive))
+            dataforts.append(line);
+    }
+
+    CBFort->addItems(dataforts);
+
+    tmpdir.cd("../Graphics/Graves");
+    QStringList datalist = tmpdir.entryList(QStringList("*.png"));
+    foreach (const QString & line, datalist)
+    {
+        if (userlist.contains(line,Qt::CaseInsensitive)) continue;
+        QPixmap pix(datadir->absolutePath() + "/Graphics/Graves/" + line);
+        QIcon icon(pix.copy(0, 0, 32, 32));
+        QString grave = line;
+        grave = grave.replace(QRegExp("^(.*)\\.png"), "\\1");
+        CBGrave->addItem(icon, grave);
+    }
+
+    // add the default flag
+    CBFlag->addItem(QIcon(QPixmap(datadir->absolutePath() + "/Graphics/Flags/hedgewars.png").copy(0, 0, 22, 15)), "Hedgewars", "hedgewars");
+    CBFlag->insertSeparator(CBFlag->count());
+
+    tmpdir.cd(cfgdir->absolutePath());
+    tmpdir.cd("Data/Graphics/Flags");
+    userlist = tmpdir.entryList(QStringList("*.png"));
+    
+    // add all country flags
+    foreach (const QString & line, userlist)
+    {
+        QPixmap pix(cfgdir->absolutePath() + "/Data/Graphics/Flags/" + line);
+        QIcon icon(pix.copy(0, 0, 22, 15));
+        // TODO improve readablility
+        if(line.compare("cpu.png") && line.compare("hedgewars.png") && (line.indexOf("cm_") == -1)) // skip cpu and hedgewars flags as well as all community flags
+        {
+            QString flag = line;
+            flag = flag.replace(QRegExp("^(.*)\\.png"), "\\1");
+            CBFlag->addItem(icon, flag.replace("_", " "), flag);
+        }
+    }
+
+    CBFlag->insertSeparator(CBFlag->count());
+
+    // add all community flags
+    for (QStringList::Iterator it = userlist.begin(); it != userlist.end(); ++it )
+    {
+        QPixmap pix(cfgdir->absolutePath() + "/Data/Graphics/Flags/" + *it);
+        QIcon icon(pix.copy(0, 0, 22, 15));
+        if(it->indexOf("cm_") > -1) // skip non community flags this time
+        {
+            QString flag = QString(*it).replace(QRegExp("^(.*)\\.png"), "\\1");
+            CBFlag->addItem(icon, QString(flag).replace("cm_", QComboBox::tr("Community") + ": "), flag);
+        }
+    }
+
+    CBFlag->insertSeparator(CBFlag->count());
+
+    tmpdir.cd(datadir->absolutePath());
+    tmpdir.cd("Graphics/Flags");
+    datalist = tmpdir.entryList(QStringList("*.png"));
+    
+    // add all country flags
+    for (QStringList::Iterator it = datalist.begin(); it != datalist.end(); ++it )
+    {
+        if (userlist.contains(*it,Qt::CaseInsensitive)) continue;
+        QPixmap pix(datadir->absolutePath() + "/Graphics/Flags/" + *it);
+        QIcon icon(pix.copy(0, 0, 22, 15));
+        if(it->compare("cpu.png") && it->compare("hedgewars.png") && (it->indexOf("cm_") == -1)) // skip cpu and hedgewars flags as well as all community flags
+        {
+            QString flag = QString(*it).replace(QRegExp("^(.*)\\.png"), "\\1");
+            CBFlag->addItem(icon, QString(flag).replace("_", " "), flag);
+        }
+    }
+
+    CBFlag->insertSeparator(CBFlag->count());
+
+    // add all community flags
+    for (QStringList::Iterator it = datalist.begin(); it != datalist.end(); ++it )
+    {
+        if (userlist.contains(*it,Qt::CaseInsensitive)) continue;
+        QPixmap pix(datadir->absolutePath() + "/Graphics/Flags/" + *it);
+        QIcon icon(pix.copy(0, 0, 22, 15));
+        if(it->indexOf("cm_") > -1) // skip non community flags this time
+        {
+            QString flag = (*it).replace(QRegExp("^(.*)\\.png"), "\\1");
+            CBFlag->addItem(icon, QString(flag).replace("cm_", QComboBox::tr("Community") + ": "), flag);
+        }
+    }
+}
+
+void PageEditTeam::fixHHname(int idx)
+{
+    HHNameEdit[idx]->setText(HHNameEdit[idx]->text().trimmed());
+
+    if (HHNameEdit[idx]->text().isEmpty())
+        HHNameEdit[idx]->setText(QLineEdit::tr("hedgehog %1").arg(idx+1));
+}
+
+void PageEditTeam::CBFort_activated(const QString & fortname)
+{
+    QFile tmp;
+    tmp.setFileName(cfgdir->absolutePath() + "/Data/Forts/" + fortname + "L.png");
+    if (!tmp.exists()) tmp.setFileName(datadir->absolutePath() + "/Forts/" + fortname + "L.png");
+    QPixmap pix(QFileInfo(tmp).absoluteFilePath());
+    FortPreview->setPixmap(pix);
+}
+
+void PageEditTeam::testSound()
+{
+    Mix_Chunk *sound;
+    QDir tmpdir;
+    mySdli->SDLMusicInit();
+    
+    tmpdir.cd(cfgdir->absolutePath());
+    if (!tmpdir.cd("Data/Sounds/voices/"+CBVoicepack->currentText()))
+    {
+        tmpdir.cd(datadir->absolutePath());
+        tmpdir.cd("Sounds/voices");
+        tmpdir.cd(CBVoicepack->currentText());
+    }
+
+    QStringList list = tmpdir.entryList(QStringList() << "Illgetyou.ogg" << "Incoming.ogg" << "Stupid.ogg" << "Coward.ogg" << "Firstblood.ogg", QDir::Files);
+    if (list.size()) {
+        sound = Mix_LoadWAV(QString(tmpdir.absolutePath() + "/" + list[rand() % list.size()]).toLocal8Bit().constData());
+        Mix_PlayChannel(-1, sound, 0);
+    }
+}
+
+void PageEditTeam::createTeam(const QString & name, const QString & playerHash)
+{
+    m_playerHash = playerHash;
+    HWTeam newTeam(name);
+    loadTeam(newTeam);
+}
+
+void PageEditTeam::editTeam(const QString & name, const QString & playerHash)
+{
+    m_playerHash = playerHash;
+    HWTeam team(name);
+    team.loadFromFile();
+    loadTeam(team);
+}
+
+void PageEditTeam::deleteTeam(const QString & name)
+{
+    QMessageBox reallyDelete(QMessageBox::Question, QMessageBox::tr("Teams"), QMessageBox::tr("Really delete this team?"), QMessageBox::Ok | QMessageBox::Cancel, this);
+
+    if (reallyDelete.exec() == QMessageBox::Ok)
+        HWTeam(name).deleteFile();
+}
+
+void PageEditTeam::setRandomNames()
+{
+    HWTeam team = data();
+    HWNamegen::teamRandomNames(team, true);
+    loadTeam(team);
+}
+
+void PageEditTeam::setRandomName(int hh_index)
+{
+    HWTeam team = data();
+    HWNamegen::teamRandomName(team,hh_index);
+    loadTeam(team);
+}
+
+void PageEditTeam::loadTeam(const HWTeam & team)
+{
+    TeamNameEdit->setText(team.name());
+    CBTeamLvl->setCurrentIndex(team.difficulty());
+
+    for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++)
+    {
+        HWHog hh = team.hedgehog(i);
+
+        HHNameEdit[i]->setText(hh.Name);
+
+        if (hh.Hat.startsWith("Reserved"))
+            hh.Hat = hh.Hat.remove(0,40);
+
+        HHHats[i]->setCurrentIndex(HHHats[i]->findData(hh.Hat, Qt::DisplayRole));
+    }
+
+    CBGrave->setCurrentIndex(CBGrave->findText(team.grave()));
+    CBFlag->setCurrentIndex(CBFlag->findData(team.flag()));
+
+    CBFort->setCurrentIndex(CBFort->findText(team.fort()));
+    CBVoicepack->setCurrentIndex(CBVoicepack->findText(team.voicepack()));
+
+    for(int i = 0; i < BINDS_NUMBER; i++)
+    {
+        CBBind[i]->setCurrentIndex(CBBind[i]->findData(team.keyBind(i)));
+    }
+}
+
+HWTeam PageEditTeam::data()
+{
+    HWTeam team(TeamNameEdit->text());
+    team.setDifficulty(CBTeamLvl->currentIndex());
+
+    for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++)
+    {
+        HWHog hh;
+        hh.Name = HHNameEdit[i]->text();
+        hh.Hat = HHHats[i]->currentText();
+
+        if (hh.Hat.startsWith("Reserved"))
+            hh.Hat = "Reserved"+m_playerHash+hh.Hat.remove(0,9);
+
+        team.setHedgehog(i,hh);
+    }
+
+    team.setGrave(CBGrave->currentText());
+    team.setFort(CBFort->currentText());
+    team.setVoicepack(CBVoicepack->currentText());
+    team.setFlag(CBFlag->itemData(CBFlag->currentIndex()).toString());
+
+    for(int i = 0; i < BINDS_NUMBER; i++)
+    {
+        team.bindKey(i,CBBind[i]->itemData(CBBind[i]->currentIndex()).toString());
+    }
+
+    return team;
+}
+
+void PageEditTeam::saveTeam()
+{
+    data().saveToFile();
+    emit teamEdited();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pageeditteam.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,94 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef PAGE_EDITTEAM_H
+#define PAGE_EDITTEAM_H
+
+#include "AbstractPage.h"
+#include "binds.h"
+#include "hwconsts.h"
+#include "namegen.h"
+#include "SDLs.h"
+
+#include "team.h"
+
+class SquareLabel;
+
+class PageEditTeam : public AbstractPage
+{
+    Q_OBJECT
+
+public:
+    PageEditTeam(QWidget* parent, SDLInteraction * sdli);
+
+    void createTeam(const QString & name, const QString & playerHash);
+    void editTeam(const QString & name, const QString & playerHash);
+    void deleteTeam(const QString & name);
+
+signals:
+    void teamEdited();
+
+public slots:
+    void CBFort_activated(const QString & gravename);
+
+private:
+    QSignalMapper* signalMapper1;
+    QSignalMapper* signalMapper2;
+    QGroupBox *GBoxHedgehogs;
+    QGroupBox *GBoxTeam;
+    QGroupBox *GBoxFort;
+    QComboBox *CBFort;
+    SquareLabel *FortPreview;
+    QComboBox *CBGrave;
+    QComboBox *CBFlag;
+    QComboBox *CBTeamLvl;
+    QComboBox *CBVoicepack;
+    QGroupBox *GBoxBinds;
+    QToolBox *BindsBox;
+    QLineEdit * TeamNameEdit;
+    QLineEdit * HHNameEdit[HEDGEHOGS_PER_TEAM];
+    QComboBox * HHHats[HEDGEHOGS_PER_TEAM];
+    QComboBox * CBBind[BINDS_NUMBER];
+    SDLInteraction * mySdli;
+    HWTeam data();
+    QString m_playerHash;
+
+    QLayout * bodyLayoutDefinition();
+    QLayout * footerLayoutDefinition();
+    void connectSignals();
+
+    void loadTeam(const HWTeam & team);
+
+    // page 1
+    QPushButton * btnRandomHogName[HEDGEHOGS_PER_TEAM];
+    QPushButton * btnRandomTeam;
+    QPushButton * btnTestSound;
+
+    // footer
+    QPushButton * btnSave;
+
+private slots:
+    void saveTeam();
+    void setRandomNames();
+    void setRandomName(int hh_index);
+    void testSound();
+    void fixHHname(int idx);
+};
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagegamestats.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,274 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2010-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QLabel>
+#include <QGridLayout>
+#include <QHBoxLayout>
+#include <QGraphicsScene>
+#include <QGroupBox>
+#include <QSizePolicy>
+
+#include "pagegamestats.h"
+#include "team.h"
+
+FitGraphicsView::FitGraphicsView(QWidget* parent) : QGraphicsView(parent)
+{
+
+}
+
+void FitGraphicsView::resizeEvent(QResizeEvent * event)
+{
+    Q_UNUSED(event);
+
+    fitInView(sceneRect());
+}
+
+QLayout * PageGameStats::bodyLayoutDefinition()
+{
+    QGridLayout * pageLayout = new QGridLayout();
+    pageLayout->setSpacing(20);
+    pageLayout->setColumnStretch(0, 1);
+    pageLayout->setColumnStretch(1, 1);
+    pageLayout->setContentsMargins(7, 7, 7, 0);
+
+    QGroupBox * gb = new QGroupBox(this);
+    QVBoxLayout * gbl = new QVBoxLayout;
+
+    // details
+    labelGameStats = new QLabel(this);
+    QLabel * l = new QLabel(this);
+    l->setTextFormat(Qt::RichText);
+    l->setText("<h1><img src=\":/res/StatsD.png\"> " + PageGameStats::tr("Details") + "</h1>");
+    l->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+    labelGameStats->setTextFormat(Qt::RichText);
+    labelGameStats->setAlignment(Qt::AlignTop);
+    labelGameStats->setWordWrap(true);
+    gbl->addWidget(l);
+    gbl->addWidget(labelGameStats);
+    gb->setLayout(gbl);
+    pageLayout->addWidget(gb, 1, 1, 1, 2);
+    
+    // graph
+    graphic = new FitGraphicsView(gb);
+    l = new QLabel(this);
+    l->setTextFormat(Qt::RichText);
+    l->setText("<br><h1><img src=\":/res/StatsH.png\"> " + PageGameStats::tr("Health graph") + "</h1>");
+    l->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+    gbl->addWidget(l);
+    gbl->addWidget(graphic);
+    graphic->scale(1.0, -1.0);
+    graphic->setBackgroundBrush(QBrush(Qt::black));
+    
+    labelGameWin = new QLabel(this);
+    labelGameWin->setTextFormat(Qt::RichText);
+    pageLayout->addWidget(labelGameWin, 0, 0, 1, 2);
+
+    // ranking box
+    gb = new QGroupBox(this);
+    gbl = new QVBoxLayout;
+    labelGameRank = new QLabel(gb);
+    l = new QLabel(this);
+    l->setTextFormat(Qt::RichText);
+    l->setText("<h1><img src=\":/res/StatsR.png\"> " + PageGameStats::tr("Ranking") + "</h1>");
+    l->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+    gbl->addWidget(l);
+    gbl->addWidget(labelGameRank);
+    gb->setLayout(gbl);
+
+    labelGameRank->setTextFormat(Qt::RichText);
+    labelGameRank->setAlignment(Qt::AlignTop);
+    pageLayout->addWidget(gb, 1, 0);
+
+    return pageLayout;
+}
+
+QLayout * PageGameStats::footerLayoutDefinition()
+{
+    QHBoxLayout * bottomLayout = new QHBoxLayout();
+
+    btnSave = addButton(":/res/Save.png", bottomLayout, 0, true);
+    btnSave->setStyleSheet("QPushButton{margin: 24px 0 0 0;}");
+    bottomLayout->setAlignment(btnSave, Qt::AlignRight | Qt::AlignBottom);
+
+    return bottomLayout;
+}
+
+void PageGameStats::connectSignals()
+{
+    connect(btnSave, SIGNAL(clicked()), this, SIGNAL(saveDemoRequested()));
+}
+
+PageGameStats::PageGameStats(QWidget* parent) : AbstractPage(parent)
+{
+    initPage();
+}
+
+void PageGameStats::AddStatText(const QString & msg)
+{
+    labelGameStats->setText(labelGameStats->text() + msg);
+}
+
+void PageGameStats::clear()
+{
+    labelGameStats->setText("");
+    healthPoints.clear();
+    labelGameRank->setText("");
+    playerPosition = 0;
+    lastColor = 0;
+}
+
+void PageGameStats::renderStats()
+{
+    QGraphicsScene * scene = new QGraphicsScene();
+
+    QMap<quint32, QVector<quint32> >::const_iterator i = healthPoints.constBegin();
+    while (i != healthPoints.constEnd())
+    {
+        quint32 c = i.key();
+        QColor clanColor = QColor(qRgb((c >> 16) & 255, (c >> 8) & 255, c & 255));
+        QVector<quint32> hps = i.value();
+
+        QPainterPath path;
+        if (hps.size())
+            path.moveTo(0, hps[0]);
+
+        for(int t = 1; t < hps.size(); ++t)
+            path.lineTo(t, hps[t]);
+
+        scene->addPath(path, QPen(c));
+        ++i;
+    }
+
+    graphic->setScene(scene);
+    graphic->fitInView(graphic->sceneRect());
+}
+
+void PageGameStats::GameStats(char type, const QString & info)
+{
+    switch(type) {
+        case 'r' : {
+            labelGameWin->setText(QString("<h1 align=\"center\">%1</h1>").arg(info));
+            break;
+        }
+        case 'D' : {
+            int i = info.indexOf(' ');
+            QString message = "<p><img src=\":/res/StatsBestShot.png\"> " + PageGameStats::tr("The best shot award was won by <b>%1</b> with <b>%2</b> pts.").arg(info.mid(i + 1), info.left(i)) + "</p>";
+            AddStatText(message);
+            break;
+        }
+        case 'k' : {
+            int i = info.indexOf(' ');
+            int num = info.left(i).toInt();
+            QString message = "<p><img src=\":/res/StatsBestKiller.png\"> " + PageGameStats::tr("The best killer is <b>%1</b> with <b>%2</b> kills in a turn.", "", num).arg(info.mid(i + 1), info.left(i)) + "</p>";
+            AddStatText(message);
+            break;
+        }
+        case 'K' : {
+            int num = info.toInt();
+            QString message = "<p><img src=\":/res/StatsHedgehogsKilled.png\"> " +  PageGameStats::tr("A total of <b>%1</b> hedgehog(s) were killed during this round.", "", num).arg(num) + "</p>";
+            AddStatText(message);
+            break;
+        }
+        case 'H' : {
+            int i = info.indexOf(' ');
+            quint32 clan = info.left(i).toInt();
+            quint32 hp = info.mid(i + 1).toUInt();
+            healthPoints[clan].append(hp);
+            break;
+        }
+        case 'T': { // local team stats
+            //AddStatText("<p>local team: " + info + "</p>");
+            QStringList infol = info.split(":");
+            HWTeam team(infol[0]);
+            if(team.fileExists()) // do some better test to avoid influence from scripted/predefined teams?
+            {
+                team.loadFromFile();
+                team.incRounds();
+                if(infol[1].toInt() > 0) // might require some better test for winning condition (or changed flag) ... WIP!
+                    team.incWins(); // should draws count as wins?
+                //team.SaveToFile(); // don't save yet
+            }
+            break;
+            }
+
+        case 'P' : {
+            int i = info.indexOf(' ');
+            playerPosition++;
+            QString color = info.left(i);
+            quint32 c = color.toInt();
+            QColor clanColor = QColor(qRgb((c >> 16) & 255, (c >> 8) & 255, c & 255));
+
+            QString playerinfo = info.mid(i + 1);
+
+            i = playerinfo.indexOf(' ');
+
+            int kills = playerinfo.left(i).toInt();
+            QString playername = playerinfo.mid(i + 1);
+            QString image;
+
+            if (lastColor == c) playerPosition--;
+            lastColor = c;
+
+            switch (playerPosition)
+            {
+                case 1:
+                image = "<img src=\":/res/StatsMedal1.png\">";
+                break;
+            case 2:
+                image = "<img src=\":/res/StatsMedal2.png\">";
+                break;
+            case 3:
+                image = "<img src=\":/res/StatsMedal3.png\">";
+                break;
+            default:
+                image = "<img src=\":/res/StatsMedal4.png\">";
+                break;
+            }
+
+            QString message;
+            QString killstring = PageGameStats::tr("(%1 kill)", "", kills).arg(kills);
+
+            message = QString("<p><h2>%1 %2. <font color=\"%4\">%3</font> ").arg(image, QString::number(playerPosition), playername, clanColor.name()) + killstring + "</h2></p>";
+
+            labelGameRank->setText(labelGameRank->text() + message);
+                break;
+        }
+        case 's' : {
+            int i = info.indexOf(' ');
+            int num = info.left(i).toInt();
+            QString message = "<p><img src=\":/res/StatsMostSelfDamage.png\"> " + PageGameStats::tr("<b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts.", "", num).arg(info.mid(i + 1)).arg(num) + "</p>";
+            AddStatText(message);
+            break;
+        }
+        case 'S' : {
+            int i = info.indexOf(' ');
+            int num = info.left(i).toInt();
+            QString message = "<p><img src=\":/res/StatsSelfKilled.png\"> " + PageGameStats::tr("<b>%1</b> killed <b>%2</b> of his own hedgehogs.", "", num).arg(info.mid(i + 1)).arg(num) + "</p>";
+            AddStatText(message);
+            break;
+        }
+        case 'B' : {
+            int i = info.indexOf(' ');
+            int num = info.left(i).toInt();
+            QString message = "<p><img src=\":/res/StatsSkipped.png\"> " + PageGameStats::tr("<b>%1</b> was scared and skipped turn <b>%2</b> times.", "", num).arg(info.mid(i + 1)).arg(num) + "</p>";
+            AddStatText(message);
+            break;
+        }
+
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagegamestats.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,73 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2010-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef STATSPAGE_H
+#define STATSPAGE_H
+
+#include <QVector>
+#include <QMap>
+#include <QGraphicsView>
+
+#include "AbstractPage.h"
+
+class FitGraphicsView : public QGraphicsView
+{
+    Q_OBJECT
+
+public:
+    FitGraphicsView(QWidget* parent = 0);
+
+protected:
+    void resizeEvent(QResizeEvent * event);
+};
+
+class PageGameStats : public AbstractPage
+{
+    Q_OBJECT
+
+public:
+    PageGameStats(QWidget* parent = 0);
+
+    QPushButton *btnSave;
+    QLabel *labelGameStats;
+    QLabel *labelGameWin;
+    QLabel *labelGameRank;
+    FitGraphicsView * graphic;
+
+public slots:
+    void GameStats(char type, const QString & info);
+    void clear();
+    void renderStats();
+    
+signals:
+    void saveDemoRequested();
+
+private:
+    void AddStatText(const QString & msg);
+
+    QMap<quint32, QVector<quint32> > healthPoints;
+    unsigned int playerPosition;
+    quint32 lastColor;
+
+protected:
+    QLayout * bodyLayoutDefinition();
+    QLayout * footerLayoutDefinition();
+    void connectSignals();
+};
+
+#endif // STATSPAGE_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pageinfo.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,56 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QGridLayout>
+#include <QPushButton>
+
+#include "pageinfo.h"
+#include "about.h"
+
+QLayout * PageInfo::bodyLayoutDefinition()
+{
+    QGridLayout * pageLayout = new QGridLayout();
+
+    pageLayout->setColumnStretch(0, 1);
+    pageLayout->setColumnStretch(1, 1);
+    pageLayout->setColumnStretch(2, 1);
+
+    about = new About();
+    pageLayout->addWidget(about, 0, 0, 1, 3);
+
+    return pageLayout;
+}
+
+QLayout * PageInfo::footerLayoutDefinition()
+{
+    QGridLayout * bottomLayout = new QGridLayout();
+    BtnSnapshots = addButton(":/res/Star.png", bottomLayout, 1, 1, true);
+    bottomLayout->setAlignment(BtnSnapshots, Qt::AlignRight | Qt::AlignVCenter);
+    return bottomLayout;
+}
+
+void PageInfo::connectSignals()
+{
+    //TODO
+}
+
+PageInfo::PageInfo(QWidget* parent) : AbstractPage(parent)
+{
+    initPage();
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pageinfo.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,43 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef PAGE_INFO_H
+#define PAGE_INFO_H
+
+#include "AbstractPage.h"
+
+class About;
+
+class PageInfo : public AbstractPage
+{
+    Q_OBJECT
+
+public:
+    PageInfo(QWidget* parent = 0);
+
+    QPushButton *BtnSnapshots;
+    About *about;
+
+private:
+    QLayout * bodyLayoutDefinition();
+    QLayout * footerLayoutDefinition();
+    void connectSignals();
+};
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pageingame.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,40 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QHBoxLayout>
+#include <QLabel>
+
+#include "pageingame.h"
+
+QLayout * PageInGame::bodyLayoutDefinition()
+{
+    QHBoxLayout * pageLayout = new QHBoxLayout();
+
+    QLabel * label = new QLabel(this);
+    label->setText(tr("In game..."));
+    pageLayout->addWidget(label);
+
+    setBackButtonVisible(false);
+
+    return pageLayout;
+}
+
+PageInGame::PageInGame(QWidget * parent) :  AbstractPage(parent)
+{
+    initPage();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pageingame.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,35 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef PAGE_INGAME_H
+#define PAGE_INGAME_H
+
+#include "AbstractPage.h"
+
+class PageInGame : public AbstractPage
+{
+    Q_OBJECT
+
+    public:
+        PageInGame(QWidget * parent = 0);
+
+        QLayout * bodyLayoutDefinition();
+};
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagemain.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,162 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+ 
+#include <QGridLayout>
+#include <QHBoxLayout>
+#include <QPushButton>
+#include <QLabel>
+#include <QTime>
+
+#include "pagemain.h"
+#include "hwconsts.h"
+#include "hwform.h"
+
+QLayout * PageMain::bodyLayoutDefinition()
+{
+    QGridLayout * pageLayout = new QGridLayout();
+    //pageLayout->setColumnStretch(0, 1);
+    //pageLayout->setColumnStretch(1, 2);
+    //pageLayout->setColumnStretch(2, 1);
+
+    //QPushButton* btnLogo = addButton(":/res/HedgewarsTitle.png", pageLayout, 0, 0, 1, 4, true);
+    //pageLayout->setAlignment(btnLogo, Qt::AlignHCenter);
+    pageLayout->setRowStretch(0, 1);
+    pageLayout->setRowStretch(1, 1);
+    pageLayout->setRowStretch(2, 0);
+    pageLayout->setRowStretch(3, 1);
+    pageLayout->setRowStretch(4, 1);
+
+    //BtnInfo = addButton(":/res/About.png", pageLayout, 3, 1, 1, 2, true);
+    BtnInfo = addButton(":/res/HedgewarsTitle.png", pageLayout, 0, 0, 1, 4, true);
+    BtnInfo->setStyleSheet("border: transparent;background: transparent;");
+    pageLayout->setAlignment(BtnInfo, Qt::AlignHCenter);
+
+    BtnSinglePlayer = addButton(":/res/LocalPlay.png", pageLayout, 2, 0, 1, 2, true);
+    BtnSinglePlayer->setToolTip(tr("Local Game (Play a game on a single computer)"));
+    pageLayout->setAlignment(BtnSinglePlayer, Qt::AlignHCenter);
+
+    BtnNet = addButton(":/res/NetworkPlay.png", pageLayout, 2, 2, 1, 2, true);
+    BtnNet->setToolTip(tr("Network Game (Play a game across a network)"));
+    pageLayout->setAlignment(BtnNet, Qt::AlignHCenter);
+
+    BtnDataDownload = addButton(tr("Downloadable Content"), pageLayout, 4, 0, 1, 4, false);
+    pageLayout->setAlignment(BtnDataDownload, Qt::AlignHCenter);
+
+    return pageLayout;
+}
+
+QLayout * PageMain::footerLayoutDefinition()
+{
+    QHBoxLayout * bottomLayout = new QHBoxLayout();
+
+    mainNote = new QLabel(this);
+    mainNote->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
+    mainNote->setWordWrap(true);
+    
+    bottomLayout->addWidget(mainNote, 0);
+    bottomLayout->setStretch(0,1);
+
+    BtnSetup = addButton(":/res/Settings.png", bottomLayout, 1, true);
+    bottomLayout->setStretch(1,0);
+
+    return bottomLayout;
+}
+
+void PageMain::connectSignals()
+{
+    //TODO
+}
+
+PageMain::PageMain(QWidget* parent) : AbstractPage(parent)
+{
+    initPage();
+
+    if(frontendEffects) setAttribute(Qt::WA_NoSystemBackground, true);
+    mainNote->setOpenExternalLinks(true);
+
+    if(!isDevBuild)
+    {
+        mainNote->setText(QLabel::tr("Tip: ") + randomTip());
+    }
+    else
+        mainNote->setText(QLabel::tr("This development build is 'work in progress' and may not be compatible with other versions of the game. Some features might be broken or incomplete. Use at your own risk!"));
+
+}
+
+QString PageMain::randomTip() const
+{
+    QStringList Tips;
+        Tips << tr("Simply pick the same color as a friend to play together as a team. Each of you will still control his or her own hedgehogs but they'll win or lose together.", "Tips");
+        Tips << tr("Some weapons might do only low damage but they can be a lot more devastating in the right situation. Try to use the Desert Eagle to knock multiple hedgehogs into the water.", "Tips");
+        Tips << tr("If you're unsure what to do and don't want to waste ammo, skip one round. But don't let too much time pass as there will be Sudden Death!", "Tips");
+        Tips << tr("Want to save ropes? Release the rope in mid air and then shoot again. As long as you don't touch the ground you'll reuse your rope without wasting ammo!", "Tips");
+        Tips << tr("If you'd like to keep others from using your preferred nickname on the official server, register an account at http://www.hedgewars.org/.", "Tips");
+        Tips << tr("You're bored of default gameplay? Try one of the missions - they'll offer different gameplay depending on the one you picked.", "Tips");
+        Tips << tr("By default the game will always record the last game played as a demo. Select 'Local Game' and pick the 'Demos' button on the lower right corner to play or manage them.", "Tips");
+        Tips << tr("Hedgewars is Open Source and Freeware we create in our spare time. If you've got problems, ask on our forums but please don't expect 24/7 support!", "Tips");
+        Tips << tr("Hedgewars is Open Source and Freeware we create in our spare time. If you like it, help us with a small donation or contribute your own work!", "Tips");
+        Tips << tr("Hedgewars is Open Source and Freeware we create in our spare time. Share it with your family and friends as you like!", "Tips");
+        Tips << tr("Hedgewars is Open Source and Freeware we create in our spare time. If someone sold you the game, you should try get a refund!", "Tips");
+        Tips << tr("From time to time there will be official tournaments. Upcoming events will be announced at http://www.hedgewars.org/ some days in advance.", "Tips");
+        Tips << tr("Hedgewars is available in many languages. If the translation in your language seems to be missing or outdated, feel free to contact us!", "Tips");
+        Tips << tr("Hedgewars can be run on lots of different operating systems including Microsoft Windows, Mac OS X and Linux.", "Tips");
+        Tips << tr("Always remember you're able to set up your own games in local and network/online play. You're not restricted to the 'Simple Game' option.", "Tips");
+        Tips << tr("Connect one or more gamepads before starting the game to be able to assign their controls to your teams.", "Tips");
+        Tips << tr("Create an account on %1 to keep others from using your most favourite nickname while playing on the official server.", "Tips").arg("<a href=\"http://www.hedgewars.org/\">http://www.hedgewars.org/</a>");
+        Tips << tr("While playing you should give yourself a short break at least once an hour.", "Tips");
+        Tips << tr("If your graphics card isn't able to provide hardware accelerated OpenGL, try to enable the low quality mode to improve performance.", "Tips");
+        Tips << tr("If your graphics card isn't able to provide hardware accelerated OpenGL, try to update the associated drivers.", "Tips");
+        Tips << tr("We're open to suggestions and constructive feedback. If you don't like something or got a great idea, let us know!", "Tips");
+        Tips << tr("Especially while playing online be polite and always remember there might be some minors playing with or against you as well!", "Tips");
+        Tips << tr("Special game modes such as 'Vampirism' or 'Karma' allow you to develop completely new tactics. Try them in a custom game!", "Tips");
+        Tips << tr("The Windows version of Hedgewars supports Xfire. Make sure to add Hedgewars to its game list so your friends can see you playing.", "Tips");
+        Tips << tr("You should never install Hedgewars on computers you don't own (school, university, work, etc.). Please ask the responsible person instead!", "Tips");
+        Tips << tr("Hedgewars can be perfect for short games during breaks. Just ensure you don't add too many hedgehogs or use an huge map. Reducing time and health might help as well.", "Tips");
+        Tips << tr("No hedgehogs were harmed in making this game.", "Tips");
+        Tips << tr("There are three different jumps available. Tap [high jump] twice to do a very high/backwards jump.", "Tips");
+        Tips << tr("Afraid of falling off a cliff? Hold down [precise] to turn [left] or [right] without actually moving.", "Tips");
+        Tips << tr("Some weapons require special strategies or just lots of training, so don't give up on a particular tool if you miss an enemy once.", "Tips");
+        Tips << tr("Most weapons won't work once they touch the water. The Homing Bee as well as the Cake are exceptions to this.", "Tips");
+        Tips << tr("The Old Limbuger only causes a small explosion. However the wind affected smelly cloud can poison lots of hogs at once.", "Tips");
+        Tips << tr("The Piano Strike is the most damaging air strike. You'll lose the hedgehog performing it, so there's a huge downside as well.", "Tips");
+        Tips << tr("The Homing Bee can be tricky to use. Its turn radius depends on its velocity, so try to not use full power.", "Tips");
+        Tips << tr("Sticky Mines are a perfect tool to create small chain reactions knocking enemy hedgehogs into dire situations ... or water.", "Tips");
+        Tips << tr("The Hammer is most effective when used on bridges or girders. Hit hogs will just break through the ground.", "Tips");
+        Tips << tr("If you're stuck behind an enemy hedgehog, use the Hammer to free yourself without getting damaged by an explosion.", "Tips");
+        Tips << tr("The Cake's maximum walking distance depends on the ground it has to pass. Use [attack] to detonate it early.", "Tips");
+        Tips << tr("The Flame Thrower is a weapon but it can be used for tunnel digging as well.", "Tips");
+        Tips << tr("Use the Molotov or Flame Thrower to temporary keep hedgehogs from passing terrain such as tunnels or platforms.", "Tips");
+        Tips << tr("Want to know who's behind the game? Click on the Hedgewars logo in the main menu to see the credits.", "Tips");
+        Tips << tr("Like Hedgewars? Become a fan on %1 or follow us on %2!", "Tips").arg("<a href=\"http://www.facebook.com/Hedgewars\">Facebook</a>").arg("<a href=\"http://twitter.com/hedgewars\">Twitter</a>");
+        Tips << tr("Feel free to draw your own graves, hats, flags or even maps and themes! But note that you'll have to share them somewhere to use them online.", "Tips");
+        Tips << tr("Really want to wear a specific hat? Donate to us and receive an exclusive hat of your choice!", "Tips");
+        // The following tip will require links to app store entries first.
+        //Tips << tr("Want to play Hedgewars any time? Grab the Mobile version for %1 and %2.", "Tips").arg("").arg("");
+        // the ios version is located here: http://itunes.apple.com/us/app/hedgewars/id391234866
+        Tips << tr("Keep your video card drivers up to date to avoid issues playing the game.", "Tips");
+        Tips << tr("You're able to associate Hedgewars related files (savegames and demo recordings) with the game to launch them right from your favorite file or internet browser.", "Tips");
+#ifdef _WIN32
+        Tips << tr("You can find your Hedgewars configuration files under \"My Documents\\Hedgewars\". Create backups or take the files with you, but don't edit them by hand.", "Tips");
+#elif defined __APPLE__
+        Tips << tr("You can find your Hedgewars configuration files under \"Library/Application Support/Hedgewars\" in your home directory. Create backups or take the files with you, but don't edit them by hand.", "Tips");
+#else
+        Tips << tr("You can find your Hedgewars configuration files under \".hedgewars\" in your home directory. Create backups or take the files with you, but don't edit them by hand.", "Tips");
+#endif
+
+        return Tips[QTime(0, 0, 0).secsTo(QTime::currentTime()) % Tips.length()];
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagemain.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,47 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef PAGE_MAIN_H
+#define PAGE_MAIN_H
+
+#include "AbstractPage.h"
+
+class PageMain : public AbstractPage
+{
+    Q_OBJECT
+
+public:
+    PageMain(QWidget * parent = 0);
+
+    QPushButton * BtnSinglePlayer;
+    QPushButton * BtnNet;
+    QPushButton * BtnSetup;
+    QPushButton * BtnInfo;
+    QPushButton * BtnDataDownload;
+    QLabel * mainNote;
+
+private:
+    QLayout * bodyLayoutDefinition();
+    QLayout * footerLayoutDefinition();
+    void connectSignals();
+
+    QString randomTip() const;
+};
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagemultiplayer.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,55 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+ 
+#include <QGridLayout>
+#include <QPushButton>
+
+#include "pagemultiplayer.h"
+#include "gamecfgwidget.h"
+#include "teamselect.h"
+
+QLayout * PageMultiplayer::bodyLayoutDefinition()
+{
+    QGridLayout * pageLayout = new QGridLayout();
+
+    gameCFG = new GameCFGWidget(this);
+    pageLayout->addWidget(gameCFG, 0, 0, 1, 2);
+
+    btnSetup = new QPushButton(this);
+    btnSetup->setText(QPushButton::tr("Setup"));
+    pageLayout->addWidget(btnSetup, 1, 0, 1, 2);
+
+    pageLayout->setRowStretch(2, 1);
+
+    teamsSelect = new TeamSelWidget(this);
+    pageLayout->addWidget(teamsSelect, 0, 2, 3, 2);
+
+    BtnStartMPGame = addButton(tr("Start"), pageLayout, 3, 3);
+
+    return pageLayout;
+}
+
+void PageMultiplayer::connectSignals()
+{
+    PageMultiplayer::connect(btnSetup, SIGNAL(clicked()), this, SIGNAL(SetupClicked()));
+}
+
+PageMultiplayer::PageMultiplayer(QWidget* parent) : AbstractPage(parent)
+{
+    initPage();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagemultiplayer.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,50 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef PAGE_MULTIPLAYER_H
+#define PAGE_MULTIPLAYER_H
+
+#include "AbstractPage.h"
+
+class GameCFGWidget;
+class TeamSelWidget;
+
+class PageMultiplayer : public AbstractPage
+{
+    Q_OBJECT
+
+public:
+    PageMultiplayer(QWidget* parent = 0);
+
+    GameCFGWidget *gameCFG;
+    TeamSelWidget *teamsSelect;
+    QPushButton *BtnStartMPGame;
+
+signals:
+    void SetupClicked();
+
+private:
+    QLayout * bodyLayoutDefinition();
+    void connectSignals();
+
+    QPushButton * btnSetup;
+};
+
+#endif
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagenet.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,109 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QGridLayout>
+#include <QPushButton>
+#include <QGroupBox>
+#include <QTableView>
+#include <QMessageBox>
+#include <QHeaderView>
+
+#include "pagenet.h"
+#include "hwconsts.h"
+#include "netudpwidget.h"
+
+QLayout * PageNet::bodyLayoutDefinition()
+{
+    QGridLayout * pageLayout = new QGridLayout();
+
+    pageLayout->setColumnStretch(0, 1);
+    pageLayout->setColumnStretch(1, 1);
+    pageLayout->setColumnStretch(2, 1);
+
+    BtnNetSvrStart = new QPushButton(this);
+    BtnNetSvrStart->setFont(*font14);
+    BtnNetSvrStart->setText(QPushButton::tr("Start server"));
+    BtnNetSvrStart->setVisible(haveServer);
+    pageLayout->addWidget(BtnNetSvrStart, 4, 2);
+
+    ConnGroupBox = new QGroupBox(this);
+    ConnGroupBox->setTitle(QGroupBox::tr("Net game"));
+    pageLayout->addWidget(ConnGroupBox, 2, 0, 1, 3);
+    GBClayout = new QGridLayout(ConnGroupBox);
+    GBClayout->setColumnStretch(0, 1);
+    GBClayout->setColumnStretch(1, 1);
+    GBClayout->setColumnStretch(2, 1);
+
+    BtnNetConnect = new QPushButton(ConnGroupBox);
+    BtnNetConnect->setFont(*font14);
+    BtnNetConnect->setText(QPushButton::tr("Connect"));
+    GBClayout->addWidget(BtnNetConnect, 2, 2);
+
+    tvServersList = new QTableView(ConnGroupBox);
+    tvServersList->setSelectionBehavior(QAbstractItemView::SelectRows);
+    GBClayout->addWidget(tvServersList, 1, 0, 1, 3);
+
+    BtnUpdateSList = new QPushButton(ConnGroupBox);
+    BtnUpdateSList->setFont(*font14);
+    BtnUpdateSList->setText(QPushButton::tr("Update"));
+    GBClayout->addWidget(BtnUpdateSList, 2, 0);
+
+    BtnSpecifyServer = new QPushButton(ConnGroupBox);
+    BtnSpecifyServer->setFont(*font14);
+    BtnSpecifyServer->setText(QPushButton::tr("Specify"));
+    GBClayout->addWidget(BtnSpecifyServer, 2, 1);
+
+    return pageLayout;
+}
+
+void PageNet::connectSignals()
+{
+    connect(BtnNetConnect, SIGNAL(clicked()), this, SLOT(slotConnect()));
+}
+
+PageNet::PageNet(QWidget* parent) : AbstractPage(parent)
+{
+    initPage();
+}
+
+void PageNet::updateServersList()
+{
+    tvServersList->setModel(new HWNetUdpModel(tvServersList));
+
+    tvServersList->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch);
+
+    static_cast<HWNetServersModel *>(tvServersList->model())->updateList();
+
+    connect(BtnUpdateSList, SIGNAL(clicked()), static_cast<HWNetServersModel *>(tvServersList->model()), SLOT(updateList()));
+    connect(tvServersList, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(slotConnect()));
+}
+
+void PageNet::slotConnect()
+{
+    HWNetServersModel * model = static_cast<HWNetServersModel *>(tvServersList->model());
+    QModelIndex mi = tvServersList->currentIndex();
+    if(!mi.isValid())
+    {
+        QMessageBox::information(this, tr("Error"), tr("Please select server from the list above"));
+        return;
+    }
+    QString host = model->index(mi.row(), 1).data().toString();
+    quint16 port = model->index(mi.row(), 2).data().toUInt();
+
+    emit connectClicked(host, port);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagenet.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,55 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef PAGE_NET_H
+#define PAGE_NET_H
+
+#include "AbstractPage.h"
+
+class PageNet : public AbstractPage
+{
+    Q_OBJECT
+
+public:
+    PageNet(QWidget* parent = 0);
+
+    QPushButton* BtnUpdateSList;
+    QTableView * tvServersList;
+    QPushButton * BtnNetConnect;
+    QPushButton * BtnNetSvrStart;
+    QPushButton * BtnSpecifyServer;
+
+public slots:
+    void updateServersList();
+
+signals:
+    void connectClicked(const QString & host, quint16 port);
+
+private:
+    QLayout * bodyLayoutDefinition();
+    void connectSignals();
+
+    QGroupBox * ConnGroupBox;
+    QGridLayout * GBClayout;
+
+private slots:
+    void slotConnect();
+};
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagenetgame.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,142 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QGridLayout>
+#include <QPushButton>
+#include <QAction>
+#include <QMenu>
+#include <QMessageBox>
+
+#include "pagenetgame.h"
+#include "gamecfgwidget.h"
+#include "teamselect.h"
+#include "chatwidget.h"
+
+QLayout * PageNetGame::bodyLayoutDefinition()
+{
+    QGridLayout * pageLayout = new QGridLayout();
+    pageLayout->setSizeConstraint(QLayout::SetMinimumSize);
+    //pageLayout->setSpacing(1);
+    pageLayout->setColumnStretch(0, 50);
+    pageLayout->setColumnStretch(1, 50);
+
+    // chatwidget
+    pChatWidget = new HWChatWidget(this, m_gameSettings, m_sdli, true);
+    pChatWidget->setShowReady(true); // show status bulbs by default
+    pChatWidget->setShowFollow(false); // don't show follow in nicks' context menus
+    pageLayout->addWidget(pChatWidget, 2, 0, 1, 2);
+    pageLayout->setRowStretch(1, 100);
+    pageLayout->setRowStretch(2, 100);
+
+    pGameCFG = new GameCFGWidget(this);
+    pageLayout->addWidget(pGameCFG, 0, 0);
+
+    btnSetup = new QPushButton(this);
+    btnSetup->setText(QPushButton::tr("Setup"));
+    pageLayout->addWidget(btnSetup, 1, 0);
+
+    pNetTeamsWidget = new TeamSelWidget(this);
+    pNetTeamsWidget->setAcceptOuter(true);
+    pageLayout->addWidget(pNetTeamsWidget, 0, 1, 2, 1);
+
+    return pageLayout;
+}
+
+QLayout * PageNetGame::footerLayoutDefinition()
+{
+    QHBoxLayout * bottomLayout = new QHBoxLayout;
+
+    leRoomName = new QLineEdit(this);
+    leRoomName->setMaxLength(60);
+    leRoomName->setMinimumWidth(200);
+    leRoomName->setMaximumWidth(400);
+
+    BtnGo = new QPushButton(this);
+    BtnGo->setToolTip(QPushButton::tr("Ready"));
+    BtnGo->setIcon(QIcon(":/res/lightbulb_off.png"));
+    BtnGo->setIconSize(QSize(25, 34));
+    BtnGo->setMinimumWidth(50);
+    BtnGo->setMinimumHeight(50);
+
+
+    bottomLayout->addWidget(leRoomName);
+    BtnUpdate = addButton(QAction::tr("Update"), bottomLayout, 1, false);
+    bottomLayout->addWidget(BtnGo);
+
+    BtnMaster = addButton(tr("Control"), bottomLayout, 3);
+    bottomLayout->insertStretch(3, 100);
+
+    BtnStart = addButton(QAction::tr("Start"), bottomLayout, 3);
+
+    return bottomLayout;
+}
+
+void PageNetGame::connectSignals()
+{
+    connect(btnSetup, SIGNAL(clicked()), this, SIGNAL(SetupClicked()));
+
+    connect(BtnUpdate, SIGNAL(clicked()), this, SLOT(onUpdateClick()));
+}
+
+PageNetGame::PageNetGame(QWidget* parent, QSettings * gameSettings, SDLInteraction * sdli) : AbstractPage(parent)
+{
+    m_gameSettings = gameSettings;
+    m_sdli = sdli;
+
+    initPage();
+
+    QMenu * menu = new QMenu(BtnMaster);
+
+    restrictJoins = new QAction(QAction::tr("Restrict Joins"), menu);
+    restrictJoins->setCheckable(true);
+    restrictTeamAdds = new QAction(QAction::tr("Restrict Team Additions"), menu);
+    restrictTeamAdds->setCheckable(true);
+    //menu->addAction(startGame);
+    menu->addAction(restrictJoins);
+    menu->addAction(restrictTeamAdds);
+
+    BtnMaster->setMenu(menu);
+
+}
+
+void PageNetGame::setReadyStatus(bool isReady)
+{
+    if(isReady)
+        BtnGo->setIcon(QIcon(":/res/lightbulb_on.png"));
+    else
+        BtnGo->setIcon(QIcon(":/res/lightbulb_off.png"));
+}
+
+void PageNetGame::onUpdateClick()
+{
+    if (leRoomName->text().size())
+        emit askForUpdateRoomName(leRoomName->text());
+    else
+        QMessageBox::critical(this,
+                tr("Error"),
+                tr("Please enter room name"),
+                tr("OK"));
+}
+
+void PageNetGame::setMasterMode(bool isMaster)
+{
+    BtnMaster->setVisible(isMaster);
+    BtnStart->setVisible(isMaster);
+    BtnUpdate->setVisible(isMaster);
+    leRoomName->setVisible(isMaster);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagenetgame.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,71 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef PAGE_NETGAME_H
+#define PAGE_NETGAME_H
+
+#include "AbstractPage.h"
+#include "SDLs.h"
+
+class HWChatWidget;
+class TeamSelWidget;
+class GameCFGWidget;
+
+class PageNetGame : public AbstractPage
+{
+    Q_OBJECT
+
+public:
+    PageNetGame(QWidget* parent, QSettings * gameSettings, SDLInteraction * sdli);
+
+    QPushButton *BtnGo;
+    QPushButton *BtnMaster;
+    QPushButton *BtnStart;
+    QPushButton *BtnUpdate;
+
+    QLineEdit * leRoomName;
+
+    QAction * restrictJoins;
+    QAction * restrictTeamAdds;
+
+    HWChatWidget* pChatWidget;
+
+    TeamSelWidget* pNetTeamsWidget;
+    GameCFGWidget* pGameCFG;
+
+public slots:
+    void setReadyStatus(bool isReady);
+    void onUpdateClick();
+    void setMasterMode(bool isMaster);
+
+signals:
+    void SetupClicked();
+    void askForUpdateRoomName(const QString &);
+
+private:
+    QLayout * bodyLayoutDefinition();
+    QLayout * footerLayoutDefinition();
+    void connectSignals();
+
+    QSettings * m_gameSettings;
+    SDLInteraction * m_sdli;
+
+    QPushButton * btnSetup;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagenetserver.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,100 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QGridLayout>
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+#include <QPushButton>
+#include <QGroupBox>
+#include <QLabel>
+#include <QLineEdit>
+#include <QSpinBox>
+
+#include "pagenetserver.h"
+
+QLayout * PageNetServer::bodyLayoutDefinition()
+{
+    QVBoxLayout * pageLayout = new QVBoxLayout();
+
+    QWidget * wg = new QWidget(this);
+    pageLayout->addWidget(wg);
+
+    QGridLayout * wgLayout = new QGridLayout(wg);
+    wgLayout->setColumnStretch(0, 1);
+    wgLayout->setColumnStretch(1, 3);
+    wgLayout->setColumnStretch(2, 1);
+
+    wgLayout->setRowStretch(0, 0);
+    wgLayout->setRowStretch(1, 1);
+
+    QGroupBox * gb = new QGroupBox(wg);
+    wgLayout->addWidget(gb, 0, 1);
+
+    QGridLayout * gbLayout = new QGridLayout(gb);
+
+    labelSD = new QLabel(gb);
+    labelSD->setText(QLabel::tr("Server name:"));
+    gbLayout->addWidget(labelSD, 0, 0);
+
+    leServerDescr = new QLineEdit(gb);
+    gbLayout->addWidget(leServerDescr, 0, 1);
+
+    labelPort = new QLabel(gb);
+    labelPort->setText(QLabel::tr("Server port:"));
+    gbLayout->addWidget(labelPort, 1, 0);
+
+    sbPort = new QSpinBox(gb);
+    sbPort->setMinimum(0);
+    sbPort->setMaximum(65535);
+    gbLayout->addWidget(sbPort, 1, 1);
+
+    BtnDefault = new QPushButton(gb);
+    BtnDefault->setText(QPushButton::tr("default"));
+    gbLayout->addWidget(BtnDefault, 1, 2);
+
+    return pageLayout;
+}
+
+QLayout * PageNetServer::footerLayoutDefinition()
+{
+    QHBoxLayout * bottomLayout = new QHBoxLayout();
+
+    BtnStart = new QPushButton(this);
+    BtnStart->setFont(*font14);
+    BtnStart->setText(QPushButton::tr("Start"));
+
+    bottomLayout->addStretch();
+    bottomLayout->addWidget(BtnStart);
+
+    return bottomLayout;
+}
+
+void PageNetServer::connectSignals()
+{
+    connect(BtnDefault, SIGNAL(clicked()), this, SLOT(setDefaultPort()));
+}
+
+PageNetServer::PageNetServer(QWidget* parent) : AbstractPage(parent)
+{
+    initPage();
+}
+
+void PageNetServer::setDefaultPort()
+{
+    sbPort->setValue(46631);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagenetserver.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,47 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef PAGE_NETSERVER_H
+#define PAGE_NETSERVER_H
+
+#include "AbstractPage.h"
+
+class PageNetServer : public AbstractPage
+{
+    Q_OBJECT
+
+public:
+    PageNetServer(QWidget* parent = 0);
+
+    QPushButton *BtnStart;
+    QPushButton *BtnDefault;
+    QLabel *labelSD;
+    QLineEdit *leServerDescr;
+    QLabel *labelPort;
+    QSpinBox *sbPort;
+
+protected:
+    QLayout * bodyLayoutDefinition();
+    QLayout * footerLayoutDefinition();
+    void connectSignals();
+
+private slots:
+    void setDefaultPort();
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagenettype.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,47 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QGridLayout>
+#include <QPushButton>
+
+#include "pagenettype.h"
+
+
+QLayout * PageNetType::bodyLayoutDefinition()
+{
+    QGridLayout * pageLayout = new QGridLayout();
+    pageLayout->setRowStretch(0, 10);
+    pageLayout->setRowStretch(3, 10);
+
+    pageLayout->setColumnStretch(1, 10);
+    pageLayout->setColumnStretch(2, 20);
+    pageLayout->setColumnStretch(3, 10);
+
+    BtnLAN = addButton(tr("LAN game"), pageLayout, 1, 2);
+    BtnOfficialServer = addButton(tr("Official server"), pageLayout, 2, 2);
+
+    // hack: temporary deactivated - requires server modifications that aren't backward compatible (yet)
+    //BtnOfficialServer->setEnabled(false);
+
+    return pageLayout;
+}
+
+PageNetType::PageNetType(QWidget* parent) : AbstractPage(parent)
+{
+    initPage();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagenettype.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,38 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef PAGE_NETTYPE_H
+#define PAGE_NETTYPE_H
+
+#include "AbstractPage.h"
+
+class PageNetType : public AbstractPage
+{
+    Q_OBJECT
+
+public:
+    PageNetType(QWidget* parent = 0);
+
+    QPushButton * BtnLAN;
+    QPushButton * BtnOfficialServer;
+
+protected:
+    QLayout * bodyLayoutDefinition();
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pageoptions.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,492 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QGridLayout>
+#include <QHBoxLayout>
+#include <QPushButton>
+#include <QGroupBox>
+#include <QComboBox>
+#include <QCheckBox>
+#include <QLabel>
+#include <QLineEdit>
+#include <QSpinBox>
+#include <QTextBrowser>
+#include <QTableWidget>
+#include <QSlider>
+
+#include "pageoptions.h"
+#include "hwconsts.h"
+#include "fpsedit.h"
+#include "igbox.h"
+
+// TODO cleanup
+QLayout * PageOptions::bodyLayoutDefinition()
+{
+    QGridLayout * pageLayout = new QGridLayout();
+    pageLayout->setColumnStretch(0, 100);
+    pageLayout->setColumnStretch(1, 100);
+    pageLayout->setColumnStretch(2, 100);
+    pageLayout->setRowStretch(0, 0);
+    //pageLayout->setRowStretch(1, 100);
+    pageLayout->setRowStretch(2, 0);
+    pageLayout->setContentsMargins(7, 7, 7, 0);
+    pageLayout->setSpacing(0);
+
+
+    QGroupBox * gbTwoBoxes = new QGroupBox(this);
+    pageLayout->addWidget(gbTwoBoxes, 0, 0, 1, 3);
+    QGridLayout * gbTBLayout = new QGridLayout(gbTwoBoxes);
+    gbTBLayout->setMargin(0);
+    gbTBLayout->setSpacing(0);
+    gbTBLayout->setAlignment(Qt::AlignTop | Qt::AlignLeft);
+
+    QPixmap pmNew(":/res/new.png");
+    QPixmap pmEdit(":/res/edit.png");
+    QPixmap pmDelete(":/res/delete.png");
+
+        {
+            teamsBox = new IconedGroupBox(this);
+            //teamsBox->setContentTopPadding(0);
+            //teamsBox->setAttribute(Qt::WA_PaintOnScreen, true);
+            teamsBox->setIcon(QIcon(":/res/teamicon.png"));
+            teamsBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+            teamsBox->setTitle(QGroupBox::tr("Teams"));
+
+            QGridLayout * GBTlayout = new QGridLayout(teamsBox);
+
+            CBTeamName = new QComboBox(teamsBox);
+            GBTlayout->addWidget(CBTeamName, 0, 0);
+
+            BtnNewTeam = new QPushButton(teamsBox);
+            BtnNewTeam->setToolTip(tr("New team"));
+            BtnNewTeam->setIconSize(pmNew.size());
+            BtnNewTeam->setIcon(pmNew);
+            BtnNewTeam->setMaximumWidth(pmNew.width() + 6);
+            connect(BtnNewTeam, SIGNAL(clicked()), this, SIGNAL(newTeamRequested()));
+            GBTlayout->addWidget(BtnNewTeam, 0, 1);
+
+            BtnEditTeam = new QPushButton(teamsBox);
+            BtnEditTeam->setToolTip(tr("Edit team"));
+            BtnEditTeam->setIconSize(pmEdit.size());
+            BtnEditTeam->setIcon(pmEdit);
+            BtnEditTeam->setMaximumWidth(pmEdit.width() + 6);
+            connect(BtnEditTeam, SIGNAL(clicked()), this, SLOT(requestEditSelectedTeam()));
+            GBTlayout->addWidget(BtnEditTeam, 0, 2);
+
+            BtnDeleteTeam = new QPushButton(teamsBox);
+            BtnDeleteTeam->setToolTip(tr("Delete team"));
+            BtnDeleteTeam->setIconSize(pmDelete.size());
+            BtnDeleteTeam->setIcon(pmDelete);
+            BtnDeleteTeam->setMaximumWidth(pmDelete.width() + 6);
+            connect(BtnDeleteTeam, SIGNAL(clicked()), this, SLOT(requestDeleteSelectedTeam()));
+            GBTlayout->addWidget(BtnDeleteTeam, 0, 3);
+
+            LblNoEditTeam = new QLabel(teamsBox);
+            LblNoEditTeam->setText(tr("You can't edit teams from team selection. Go back to main menu to add, edit or delete teams."));
+            LblNoEditTeam->setWordWrap(true);
+            LblNoEditTeam->setVisible(false);
+            GBTlayout->addWidget(LblNoEditTeam, 0, 0);
+
+            gbTBLayout->addWidget(teamsBox, 0, 0);
+        }
+
+        {
+            IconedGroupBox* groupWeapons = new IconedGroupBox(this);
+            
+            //groupWeapons->setContentTopPadding(0);
+            //groupWeapons->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+            groupWeapons->setIcon(QIcon(":/res/weaponsicon.png"));
+            groupWeapons->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+            groupWeapons->setTitle(QGroupBox::tr("Schemes and Weapons"));
+            QGridLayout * WeaponsLayout = new QGridLayout(groupWeapons);
+
+            QLabel* SchemeLabel = new QLabel(groupWeapons);
+            SchemeLabel->setText(QLabel::tr("Game scheme"));
+            WeaponsLayout->addWidget(SchemeLabel, 1, 0);
+
+            SchemesName = new QComboBox(groupWeapons);
+            WeaponsLayout->addWidget(SchemesName, 1, 1);
+
+            SchemeNew = new QPushButton(groupWeapons);
+            SchemeNew->setToolTip(tr("New scheme"));
+            SchemeNew->setIconSize(pmNew.size());
+            SchemeNew->setIcon(pmNew);
+            SchemeNew->setMaximumWidth(pmNew.width() + 6);
+            WeaponsLayout->addWidget(SchemeNew, 1, 2);
+
+            SchemeEdit = new QPushButton(groupWeapons);
+            SchemeEdit->setToolTip(tr("Edit scheme"));
+            SchemeEdit->setIconSize(pmEdit.size());
+            SchemeEdit->setIcon(pmEdit);
+            SchemeEdit->setMaximumWidth(pmEdit.width() + 6);
+            WeaponsLayout->addWidget(SchemeEdit, 1, 3);
+
+            SchemeDelete = new QPushButton(groupWeapons);
+            SchemeDelete->setToolTip(tr("Delete scheme"));
+            SchemeDelete->setIconSize(pmDelete.size());
+            SchemeDelete->setIcon(pmDelete);
+            SchemeDelete->setMaximumWidth(pmDelete.width() + 6);
+            WeaponsLayout->addWidget(SchemeDelete, 1, 4);
+
+            QLabel* WeaponLabel = new QLabel(groupWeapons);
+            WeaponLabel->setText(QLabel::tr("Weapons"));
+            WeaponsLayout->addWidget(WeaponLabel, 2, 0);
+
+            WeaponsName = new QComboBox(groupWeapons);
+            WeaponsLayout->addWidget(WeaponsName, 2, 1);
+
+            WeaponNew = new QPushButton(groupWeapons);
+            WeaponNew->setToolTip(tr("New weapon set"));
+            WeaponNew->setIconSize(pmNew.size());
+            WeaponNew->setIcon(pmNew);
+            WeaponNew->setMaximumWidth(pmNew.width() + 6);
+            WeaponsLayout->addWidget(WeaponNew, 2, 2);
+
+            WeaponEdit = new QPushButton(groupWeapons);
+            WeaponEdit->setToolTip(tr("Edit weapon set"));
+            WeaponEdit->setIconSize(pmEdit.size());
+            WeaponEdit->setIcon(pmEdit);
+            WeaponEdit->setMaximumWidth(pmEdit.width() + 6);
+            WeaponsLayout->addWidget(WeaponEdit, 2, 3);
+
+            WeaponDelete = new QPushButton(groupWeapons);
+            WeaponDelete->setToolTip(tr("Delete weapon set"));
+            WeaponDelete->setIconSize(pmDelete.size());
+            WeaponDelete->setIcon(pmDelete);
+            WeaponDelete->setMaximumWidth(pmDelete.width() + 6);
+            WeaponsLayout->addWidget(WeaponDelete, 2, 4);
+
+            WeaponTooltip = new QCheckBox(this);
+            WeaponTooltip->setText(QCheckBox::tr("Show ammo menu tooltips"));
+            WeaponsLayout->addWidget(WeaponTooltip, 3, 0, 1, 4);
+
+            gbTBLayout->addWidget(groupWeapons, 1, 0);
+        }
+
+        {
+            IconedGroupBox* groupMisc = new IconedGroupBox(this);
+            //groupMisc->setContentTopPadding(0);
+            groupMisc->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+            groupMisc->setIcon(QIcon(":/res/miscicon.png"));
+            //groupMisc->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+            groupMisc->setTitle(QGroupBox::tr("Misc"));
+            QGridLayout * MiscLayout = new QGridLayout(groupMisc);
+
+            labelNN = new QLabel(groupMisc);
+            labelNN->setText(QLabel::tr("Net nick"));
+            MiscLayout->addWidget(labelNN, 0, 0);
+
+            editNetNick = new QLineEdit(groupMisc);
+            editNetNick->setMaxLength(20);
+            editNetNick->setText(QLineEdit::tr("unnamed"));
+            connect(editNetNick, SIGNAL(editingFinished()), this, SLOT(trimNetNick()));
+            MiscLayout->addWidget(editNetNick, 0, 1);
+            
+            labelNetPassword = new QLabel(groupMisc);
+            labelNetPassword->setText(QLabel::tr("Password"));
+            MiscLayout->addWidget(labelNetPassword, 1, 0);
+            
+            editNetPassword = new QLineEdit(groupMisc);
+            editNetPassword->setEchoMode(QLineEdit::Password);
+            MiscLayout->addWidget(editNetPassword, 1, 1);
+
+            QLabel *labelLanguage = new QLabel(groupMisc);
+            labelLanguage->setText(QLabel::tr("Locale") + " *");
+            MiscLayout->addWidget(labelLanguage, 2, 0);
+
+            CBLanguage = new QComboBox(groupMisc);
+            QDir tmpdir;
+            tmpdir.cd(cfgdir->absolutePath());
+            tmpdir.cd("Data/Locale");
+            tmpdir.setFilter(QDir::Files);
+            QStringList locs = tmpdir.entryList(QStringList("hedgewars_*.qm"));
+            CBLanguage->addItem(QComboBox::tr("(System default)"), QString(""));
+            for(int i = 0; i < locs.count(); i++)
+            {
+                QLocale loc(locs[i].replace(QRegExp("hedgewars_(.*)\\.qm"), "\\1"));
+                CBLanguage->addItem(QLocale::languageToString(loc.language()) + " (" + QLocale::countryToString(loc.country()) + ")", loc.name());
+            }
+
+            tmpdir.cd(datadir->absolutePath());
+            tmpdir.cd("Locale");
+            tmpdir.setFilter(QDir::Files);
+            QStringList tmplist = tmpdir.entryList(QStringList("hedgewars_*.qm"));
+            for(int i = 0; i < tmplist.count(); i++)
+            {
+                if (locs.contains(tmplist[i])) continue;
+                QLocale loc(tmplist[i].replace(QRegExp("hedgewars_(.*)\\.qm"), "\\1"));
+                CBLanguage->addItem(QLocale::languageToString(loc.language()) + " (" + QLocale::countryToString(loc.country()) + ")", loc.name());
+            }
+
+            MiscLayout->addWidget(CBLanguage, 2, 1);
+
+            CBAltDamage = new QCheckBox(groupMisc);
+            CBAltDamage->setText(QCheckBox::tr("Alternative damage show"));
+            MiscLayout->addWidget(CBAltDamage, 3, 0, 1, 2);
+
+            CBNameWithDate = new QCheckBox(groupMisc);
+            CBNameWithDate->setText(QCheckBox::tr("Append date and time to record file name"));
+            MiscLayout->addWidget(CBNameWithDate, 4, 0, 1, 2);
+
+            BtnAssociateFiles = new QPushButton(groupMisc);
+            BtnAssociateFiles->setText(QPushButton::tr("Associate file extensions"));
+            BtnAssociateFiles->setEnabled(!custom_data && !custom_config);
+            MiscLayout->addWidget(BtnAssociateFiles, 5, 0, 1, 2);
+
+#ifdef __APPLE__
+#ifdef SPARKLE_ENABLED
+            CBAutoUpdate = new QCheckBox(groupMisc);
+            CBAutoUpdate->setText(QCheckBox::tr("Check for updates at startup"));
+            MiscLayout->addWidget(CBAutoUpdate, 6, 0, 1, 3);
+#endif
+#endif
+            gbTBLayout->addWidget(groupMisc, 2, 0);
+        }
+
+        {
+            AGGroupBox = new IconedGroupBox(this);
+            //AGGroupBox->setContentTopPadding(0);
+            AGGroupBox->setIcon(QIcon(":/res/graphicsicon.png"));
+            //AGGroupBox->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+            AGGroupBox->setTitle(QGroupBox::tr("Audio/Graphic options"));
+
+            QVBoxLayout * GBAlayout = new QVBoxLayout(AGGroupBox);
+            QHBoxLayout * GBAreslayout = new QHBoxLayout(0);
+            QHBoxLayout * GBAstereolayout = new QHBoxLayout(0);
+            QHBoxLayout * GBAqualayout = new QHBoxLayout(0);
+
+            CBFrontendFullscreen = new QCheckBox(AGGroupBox);
+            CBFrontendFullscreen->setText(QCheckBox::tr("Frontend fullscreen"));
+            GBAlayout->addWidget(CBFrontendFullscreen);
+
+            CBFrontendEffects = new QCheckBox(AGGroupBox);
+            CBFrontendEffects->setText(QCheckBox::tr("Frontend effects") + " *");
+            GBAlayout->addWidget(CBFrontendEffects);
+
+            CBEnableFrontendSound = new QCheckBox(AGGroupBox);
+            CBEnableFrontendSound->setText(QCheckBox::tr("Enable frontend sounds"));
+            GBAlayout->addWidget(CBEnableFrontendSound);
+
+            CBEnableFrontendMusic = new QCheckBox(AGGroupBox);
+            CBEnableFrontendMusic->setText(QCheckBox::tr("Enable frontend music"));
+            GBAlayout->addWidget(CBEnableFrontendMusic);
+
+            QFrame * hr = new QFrame(AGGroupBox);
+            hr->setFrameStyle(QFrame::HLine);
+            hr->setLineWidth(3);
+            hr->setFixedHeight(10);
+            GBAlayout->addWidget(hr);
+
+            QLabel * resolution = new QLabel(AGGroupBox);
+            resolution->setText(QLabel::tr("Resolution"));
+            GBAreslayout->addWidget(resolution);
+
+            CBResolution = new QComboBox(AGGroupBox);
+            GBAreslayout->addWidget(CBResolution);
+            GBAlayout->addLayout(GBAreslayout);
+
+            CBFullscreen = new QCheckBox(AGGroupBox);
+            CBFullscreen->setText(QCheckBox::tr("Fullscreen"));
+            GBAlayout->addWidget(CBFullscreen);
+
+            QLabel * quality = new QLabel(AGGroupBox);
+            quality->setText(QLabel::tr("Quality"));
+            quality->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+            GBAqualayout->addWidget(quality);
+            
+            SLQuality = new QSlider(Qt::Horizontal, AGGroupBox);
+            SLQuality->setTickPosition(QSlider::TicksBelow);
+            SLQuality->setMaximum(5);
+            SLQuality->setMinimum(0);
+            SLQuality->setFixedWidth(150);
+            GBAqualayout->addWidget(SLQuality);
+            GBAlayout->addLayout(GBAqualayout);
+
+            QLabel * stereo = new QLabel(AGGroupBox);
+            stereo->setText(QLabel::tr("Stereo rendering"));
+            GBAstereolayout->addWidget(stereo);
+
+            CBStereoMode = new QComboBox(AGGroupBox);
+            CBStereoMode->addItem(QComboBox::tr("Disabled"));
+            CBStereoMode->addItem(QComboBox::tr("Red/Cyan"));
+            CBStereoMode->addItem(QComboBox::tr("Cyan/Red"));
+            CBStereoMode->addItem(QComboBox::tr("Red/Blue"));
+            CBStereoMode->addItem(QComboBox::tr("Blue/Red"));
+            CBStereoMode->addItem(QComboBox::tr("Red/Green"));
+            CBStereoMode->addItem(QComboBox::tr("Green/Red"));
+            CBStereoMode->addItem(QComboBox::tr("Side-by-side"));
+            CBStereoMode->addItem(QComboBox::tr("Top-Bottom"));
+            CBStereoMode->addItem(QComboBox::tr("Wiggle"));
+            CBStereoMode->addItem(QComboBox::tr("Red/Cyan grayscale"));
+            CBStereoMode->addItem(QComboBox::tr("Cyan/Red grayscale"));
+            CBStereoMode->addItem(QComboBox::tr("Red/Blue grayscale"));
+            CBStereoMode->addItem(QComboBox::tr("Blue/Red grayscale"));
+            CBStereoMode->addItem(QComboBox::tr("Red/Green grayscale"));
+            CBStereoMode->addItem(QComboBox::tr("Green/Red grayscale"));
+            connect(CBStereoMode, SIGNAL(currentIndexChanged(int)), this, SLOT(forceFullscreen(int)));
+
+            GBAstereolayout->addWidget(CBStereoMode);
+            GBAlayout->addLayout(GBAstereolayout);
+
+            hr = new QFrame(AGGroupBox);
+            hr->setFrameStyle(QFrame::HLine);
+            hr->setLineWidth(3);
+            hr->setFixedHeight(10);
+            GBAlayout->addWidget(hr);
+
+            QHBoxLayout * GBAvollayout = new QHBoxLayout(0);
+            QLabel * vol = new QLabel(AGGroupBox);
+            vol->setText(QLabel::tr("Initial sound volume"));
+            GBAvollayout->addWidget(vol);
+            GBAlayout->addLayout(GBAvollayout);
+            volumeBox = new QSpinBox(AGGroupBox);
+            volumeBox->setRange(0, 100);
+            volumeBox->setSingleStep(5);
+            GBAvollayout->addWidget(volumeBox);
+
+            CBEnableSound = new QCheckBox(AGGroupBox);
+            CBEnableSound->setText(QCheckBox::tr("Enable sound"));
+            GBAlayout->addWidget(CBEnableSound);
+
+            CBEnableMusic = new QCheckBox(AGGroupBox);
+            CBEnableMusic->setText(QCheckBox::tr("Enable music"));
+            GBAlayout->addWidget(CBEnableMusic);
+
+            hr = new QFrame(AGGroupBox);
+            hr->setFrameStyle(QFrame::HLine);
+            hr->setLineWidth(3);
+            hr->setFixedHeight(10);
+            GBAlayout->addWidget(hr);
+
+            QHBoxLayout * GBAfpslayout = new QHBoxLayout(0);
+            QLabel * maxfps = new QLabel(AGGroupBox);
+            maxfps->setText(QLabel::tr("FPS limit"));
+            GBAfpslayout->addWidget(maxfps);
+            GBAlayout->addLayout(GBAfpslayout);
+            fpsedit = new FPSEdit(AGGroupBox);
+            GBAfpslayout->addWidget(fpsedit);
+
+            CBShowFPS = new QCheckBox(AGGroupBox);
+            CBShowFPS->setText(QCheckBox::tr("Show FPS"));
+            GBAlayout->addWidget(CBShowFPS);
+
+            hr = new QFrame(AGGroupBox);
+            hr->setFrameStyle(QFrame::HLine);
+            hr->setLineWidth(3);
+            hr->setFixedHeight(10);
+            GBAlayout->addWidget(hr);
+
+            QLabel *restartNote = new QLabel(this);
+            restartNote->setText(QString("* ") + QLabel::tr("Restart game to apply"));
+            restartNote->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+            GBAlayout->addWidget(restartNote);
+
+            gbTBLayout->addWidget(AGGroupBox, 0, 1, 3, 1);
+        }
+
+    previousQuality = this->SLQuality->value();
+    previousResolutionIndex = this->CBResolution->currentIndex();
+    previousFullscreenValue = this->CBFullscreen->isChecked();
+
+    return pageLayout;
+}
+
+QLayout * PageOptions::footerLayoutDefinition()
+{
+    QHBoxLayout * bottomLayout = new QHBoxLayout();
+    btnSave = addButton(":/res/Save.png", bottomLayout, 0, true);
+    btnSave->setStyleSheet("QPushButton{margin: 24px 0 0 0;}");
+    bottomLayout->setAlignment(btnSave, Qt::AlignRight | Qt::AlignBottom);
+    return bottomLayout;
+}
+
+void PageOptions::connectSignals()
+{
+    connect(CBResolution, SIGNAL(currentIndexChanged(int)), this, SLOT(setResolution(int)));
+    connect(CBFullscreen, SIGNAL(stateChanged(int)), this, SLOT(setFullscreen(int)));
+    connect(SLQuality, SIGNAL(valueChanged(int)), this, SLOT(setQuality(int)));
+}
+
+PageOptions::PageOptions(QWidget* parent) : AbstractPage(parent)
+{
+    initPage();
+}
+
+void PageOptions::forceFullscreen(int index)
+{
+    bool forced = (index == 7 || index == 8 || index == 9);
+
+    if (index != 0) {
+        this->SLQuality->setValue(this->SLQuality->maximum());
+        this->SLQuality->setEnabled(false);
+        this->CBFullscreen->setEnabled(!forced);
+        this->CBFullscreen->setChecked(forced ? true : previousFullscreenValue);
+        this->CBResolution->setCurrentIndex(forced ? 0 : previousResolutionIndex);
+    } else {
+        this->SLQuality->setEnabled(true);
+        this->CBFullscreen->setEnabled(true);
+        this->SLQuality->setValue(previousQuality);
+        this->CBFullscreen->setChecked(previousFullscreenValue);
+        this->CBResolution->setCurrentIndex(previousResolutionIndex);
+    }
+}
+
+void PageOptions::setQuality(int value)
+{
+    int index = this->CBStereoMode->currentIndex();
+    if (index == 0)
+        previousQuality = this->SLQuality->value();
+}
+
+void PageOptions::setFullscreen(int state)
+{
+    int index = this->CBStereoMode->currentIndex();
+    if (index != 7 && index != 8 && index != 9)
+        previousFullscreenValue = this->CBFullscreen->isChecked();
+}
+
+void PageOptions::setResolution(int state)
+{
+    int index = this->CBStereoMode->currentIndex();
+    if (index != 7 && index != 8 && index != 9)
+        previousResolutionIndex = this->CBResolution->currentIndex();
+}
+
+void PageOptions::trimNetNick()
+{
+    editNetNick->setText(editNetNick->text().trimmed());
+}
+
+void PageOptions::requestEditSelectedTeam()
+{
+    emit editTeamRequested(CBTeamName->currentText());
+}
+
+void PageOptions::requestDeleteSelectedTeam()
+{
+    emit deleteTeamRequested(CBTeamName->currentText());
+}
+
+void PageOptions::setTeamOptionsEnabled(bool enabled)
+{
+    BtnNewTeam->setVisible(enabled);
+    BtnEditTeam->setVisible(enabled);
+    BtnDeleteTeam->setVisible(enabled);
+    CBTeamName->setVisible(enabled);
+    LblNoEditTeam->setVisible(!enabled);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pageoptions.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,107 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef PAGE_OPTIONS_H
+#define PAGE_OPTIONS_H
+
+#include "AbstractPage.h"
+
+class FPSEdit;
+class IconedGroupBox;
+
+class PageOptions : public AbstractPage
+{
+    Q_OBJECT
+
+public:
+    PageOptions(QWidget* parent = 0);
+
+    QCheckBox *WeaponTooltip;
+    QPushButton *WeaponNew;
+    QPushButton *WeaponEdit;
+    QPushButton *WeaponDelete;
+    QComboBox *WeaponsName;
+    QPushButton *SchemeNew;
+    QPushButton *SchemeEdit;
+    QPushButton *SchemeDelete;
+    QComboBox *SchemesName;
+
+    QComboBox *CBLanguage;
+
+    IconedGroupBox *teamsBox;;
+    QPushButton *BtnAssociateFiles;
+    QComboBox *CBTeamName;
+    IconedGroupBox *AGGroupBox;
+    QComboBox *CBResolution;
+    QComboBox *CBStereoMode;
+    QCheckBox *CBEnableSound;
+    QCheckBox *CBEnableFrontendSound;
+    QCheckBox *CBEnableMusic;
+    QCheckBox *CBEnableFrontendMusic;
+    QCheckBox *CBFullscreen;
+    QCheckBox *CBFrontendFullscreen;
+    QCheckBox *CBShowFPS;
+    QCheckBox *CBAltDamage;
+    QCheckBox *CBNameWithDate;
+#ifdef __APPLE__
+    QCheckBox *CBAutoUpdate;
+#endif
+
+    FPSEdit *fpsedit;
+    QPushButton *btnSave;
+    QLabel *labelNN;
+    QLabel *labelNetPassword;
+    QSpinBox * volumeBox;
+    QLineEdit *editNetNick;
+    QLineEdit *editNetPassword;
+    QSlider *SLQuality;
+    QCheckBox *CBFrontendEffects;
+
+    void setTeamOptionsEnabled(bool enabled);
+
+signals:
+    void newTeamRequested();
+    void editTeamRequested(const QString & teamName);
+    void deleteTeamRequested(const QString & teamName);
+
+
+private:
+    QLayout * bodyLayoutDefinition();
+    QLayout * footerLayoutDefinition();
+    void connectSignals();
+
+    bool previousFullscreenValue;
+    int previousResolutionIndex;
+    int previousQuality;
+    QLabel *LblNoEditTeam;
+    QPushButton *BtnNewTeam;
+    QPushButton *BtnEditTeam;
+    QPushButton *BtnDeleteTeam;
+
+private slots:
+    void forceFullscreen(int index);
+    void setFullscreen(int state);
+    void setResolution(int state);
+    void setQuality(int value);
+    void trimNetNick();
+    void requestEditSelectedTeam();
+    void requestDeleteSelectedTeam();
+};
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pageplayrecord.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,165 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QFont>
+#include <QGridLayout>
+#include <QPushButton>
+#include <QListWidget>
+#include <QListWidgetItem>
+#include <QFileInfo>
+#include <QMessageBox>
+#include <QInputDialog>
+
+#include "hwconsts.h"
+#include "pageplayrecord.h"
+
+QLayout * PagePlayDemo::bodyLayoutDefinition()
+{
+    QGridLayout * pageLayout = new QGridLayout();
+    
+    pageLayout->setColumnStretch(0, 1);
+    pageLayout->setColumnStretch(1, 2);
+    pageLayout->setColumnStretch(2, 1);
+    pageLayout->setRowStretch(2, 100);
+
+    BtnPlayDemo = new QPushButton(this);
+    BtnPlayDemo->setFont(*font14);
+    BtnPlayDemo->setText(QPushButton::tr("Play demo"));
+    pageLayout->addWidget(BtnPlayDemo, 3, 2);
+
+    BtnRenameRecord = new QPushButton(this);
+    BtnRenameRecord->setText(QPushButton::tr("Rename"));
+    pageLayout->addWidget(BtnRenameRecord, 0, 2);
+
+    BtnRemoveRecord = new QPushButton(this);
+    BtnRemoveRecord->setText(QPushButton::tr("Delete"));
+    pageLayout->addWidget(BtnRemoveRecord, 1, 2);
+
+    DemosList = new QListWidget(this);
+    DemosList->setGeometry(QRect(170, 10, 311, 311));
+    pageLayout->addWidget(DemosList, 0, 1, 3, 1);
+
+    return pageLayout;
+}
+
+void PagePlayDemo::connectSignals()
+{
+    connect(BtnRenameRecord, SIGNAL(clicked()), this, SLOT(renameRecord()));
+    connect(BtnRemoveRecord, SIGNAL(clicked()), this, SLOT(removeRecord()));
+}
+
+PagePlayDemo::PagePlayDemo(QWidget* parent) : AbstractPage(parent)
+{
+    initPage();
+}
+
+void PagePlayDemo::FillFromDir(RecordType rectype)
+{
+    QDir dir;
+    QString extension;
+
+    recType = rectype;
+
+    dir.cd(cfgdir->absolutePath());
+    if (rectype == RT_Demo)
+    {
+        dir.cd("Demos");
+        extension = "hwd";
+        BtnPlayDemo->setText(QPushButton::tr("Play demo"));
+    } else
+    {
+        dir.cd("Saves");
+        extension = "hws";
+        BtnPlayDemo->setText(QPushButton::tr("Load"));
+    }
+    dir.setFilter(QDir::Files);
+
+    QStringList sl = dir.entryList(QStringList(QString("*.%2.%1").arg(extension, *cProtoVer)));
+    sl.replaceInStrings(QRegExp(QString("^(.*)\\.%2\\.%1$").arg(extension, *cProtoVer)), "\\1");
+
+    DemosList->clear();
+    DemosList->addItems(sl);
+
+    for (int i = 0; i < DemosList->count(); ++i)
+    {
+        DemosList->item(i)->setData(Qt::UserRole, dir.absoluteFilePath(QString("%1.%3.%2").arg(sl[i], extension, *cProtoVer)));
+        DemosList->item(i)->setIcon(recType == RT_Demo ? QIcon(":/res/file_demo.png") : QIcon(":/res/file_save.png"));
+    }
+}
+
+void PagePlayDemo::renameRecord()
+{
+    QListWidgetItem * curritem = DemosList->currentItem();
+    if (!curritem)
+    {
+        QMessageBox::critical(this,
+                tr("Error"),
+                tr("Please select record from the list"),
+                tr("OK"));
+        return ;
+    }
+    QFile rfile(curritem->data(Qt::UserRole).toString());
+
+    QFileInfo finfo(rfile);
+
+    bool ok;
+
+    QString newname = QInputDialog::getText(this, tr("Rename dialog"), tr("Enter new file name:"), QLineEdit::Normal, finfo.completeBaseName().replace("." + *cProtoVer, ""), &ok);
+
+    if(ok && newname.size())
+    {
+        QString newfullname = QString("%1/%2.%3.%4")
+                                      .arg(finfo.absolutePath())
+                                      .arg(newname)
+                                      .arg(*cProtoVer)
+                                      .arg(finfo.suffix());
+
+        ok = rfile.rename(newfullname);
+        if(!ok)
+            QMessageBox::critical(this, tr("Error"), tr("Cannot rename to") + newfullname);
+        else
+            FillFromDir(recType);
+    }
+}
+
+void PagePlayDemo::removeRecord()
+{
+    QListWidgetItem * curritem = DemosList->currentItem();
+    if (!curritem)
+    {
+        QMessageBox::critical(this,
+                tr("Error"),
+                tr("Please select record from the list"),
+                tr("OK"));
+        return ;
+    }
+    QFile rfile(curritem->data(Qt::UserRole).toString());
+
+    bool ok;
+
+    ok = rfile.remove();
+    if(!ok)
+        QMessageBox::critical(this, tr("Error"), tr("Cannot delete file"));
+    else
+        FillFromDir(recType);
+}
+
+bool PagePlayDemo::isSave()
+{
+    return recType == RT_Save;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pageplayrecord.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,61 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef PLAYRECORDPAGE_H
+#define PLAYRECORDPAGE_H
+
+#include <QDir>
+
+#include "AbstractPage.h"
+
+class QPushButton;
+class QListWidget;
+
+class PagePlayDemo : public AbstractPage
+{
+    Q_OBJECT
+
+public:
+    enum RecordType {
+        RT_Demo,
+        RT_Save
+    };
+
+    PagePlayDemo(QWidget* parent = 0);
+
+    void FillFromDir(RecordType rectype);
+    bool isSave();
+
+    QPushButton *BtnPlayDemo;
+    QPushButton *BtnRenameRecord;
+    QPushButton *BtnRemoveRecord;
+    QListWidget *DemosList;
+
+private:
+    QLayout * bodyLayoutDefinition();
+    void connectSignals();
+
+    RecordType recType;
+
+private slots:
+    void renameRecord();
+    void removeRecord();
+};
+
+
+#endif // PLAYRECORDPAGE_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pageroomslist.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,419 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QGridLayout>
+#include <QPushButton>
+#include <QComboBox>
+#include <QLabel>
+#include <QLineEdit>
+#include <QMessageBox>
+#include <QHeaderView>
+#include <QTableWidget>
+
+#include "ammoSchemeModel.h"
+#include "pageroomslist.h"
+#include "hwconsts.h"
+#include "chatwidget.h"
+
+QLayout * PageRoomsList::bodyLayoutDefinition()
+{
+    QGridLayout * pageLayout = new QGridLayout();
+
+    QHBoxLayout * newRoomLayout = new QHBoxLayout();
+    QLabel * roomNameLabel = new QLabel(this);
+    roomNameLabel->setText(tr("Room Name:"));
+    roomName = new QLineEdit(this);
+    roomName->setMaxLength(60);
+    newRoomLayout->addWidget(roomNameLabel);
+    newRoomLayout->addWidget(roomName);
+    pageLayout->addLayout(newRoomLayout, 0, 0, 1, 2);
+
+    roomsList = new QTableWidget(this);
+    roomsList->setSelectionBehavior(QAbstractItemView::SelectRows);
+    roomsList->verticalHeader()->setVisible(false);
+    roomsList->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
+    roomsList->setAlternatingRowColors(true);
+    roomsList->setShowGrid(false);
+    roomsList->setSelectionMode(QAbstractItemView::SingleSelection);
+    pageLayout->addWidget(roomsList, 1, 0, 3, 2);
+    pageLayout->setRowStretch(2, 100);
+
+    QHBoxLayout * filterLayout = new QHBoxLayout();
+
+    QLabel * stateLabel = new QLabel(this);
+    CBState = new QComboBox(this);
+
+    filterLayout->addWidget(stateLabel);
+    filterLayout->addWidget(CBState);
+    filterLayout->addSpacing(30);
+
+    QLabel * ruleLabel = new QLabel(this);
+    ruleLabel->setText(tr("Rules:"));
+    CBRules = new QComboBox(this);
+
+    filterLayout->addWidget(ruleLabel);
+    filterLayout->addWidget(CBRules);
+    filterLayout->addSpacing(30);
+
+    QLabel * weaponLabel = new QLabel(this);
+    weaponLabel->setText(tr("Weapons:"));
+    CBWeapons = new QComboBox(this);
+
+    filterLayout->addWidget(weaponLabel);
+    filterLayout->addWidget(CBWeapons);
+    filterLayout->addSpacing(30);
+
+    QLabel * searchLabel = new QLabel(this);
+    searchLabel->setText(tr("Search:"));
+    searchText = new QLineEdit(this);
+    searchText->setMaxLength(60);
+    filterLayout->addWidget(searchLabel);
+    filterLayout->addWidget(searchText);
+
+    pageLayout->addLayout(filterLayout, 4, 0, 1, 2);
+
+    chatWidget = new HWChatWidget(this, m_gameSettings, m_sdli, false);
+    pageLayout->addWidget(chatWidget, 5, 0, 1, 3);
+    pageLayout->setRowStretch(5, 350);
+
+    BtnCreate = addButton(tr("Create"), pageLayout, 0, 2);
+    BtnJoin = addButton(tr("Join"), pageLayout, 1, 2);
+    BtnRefresh = addButton(tr("Refresh"), pageLayout, 3, 2);
+    BtnClear = addButton(tr("Clear"), pageLayout, 4, 2);
+
+    CBRules->addItem(QComboBox::tr("Any"));
+    CBState->addItem(QComboBox::tr("Any"));
+    CBState->addItem(QComboBox::tr("In lobby"));
+    CBState->addItem(QComboBox::tr("In progress"));
+
+    return pageLayout;
+}
+
+QLayout * PageRoomsList::footerLayoutDefinition()
+{
+    QGridLayout * bottomLayout = new QGridLayout();
+
+    lblCount = new QLabel(this);
+    bottomLayout->addWidget(lblCount, 0, 0, Qt::AlignHCenter);
+    lblCount->setText("?");
+    lblCount->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
+
+    BtnAdmin = addButton(tr("Admin features"), bottomLayout, 6, 2);
+
+    return bottomLayout;
+}
+
+void PageRoomsList::connectSignals()
+{
+    connect(chatWidget, SIGNAL(nickCountUpdate(const int)), this, SLOT(updateNickCounter(const int)));
+
+    connect(BtnCreate, SIGNAL(clicked()), this, SLOT(onCreateClick()));
+    connect(BtnJoin, SIGNAL(clicked()), this, SLOT(onJoinClick()));
+    connect(BtnRefresh, SIGNAL(clicked()), this, SLOT(onRefreshClick()));
+    connect(BtnClear, SIGNAL(clicked()), this, SLOT(onClearClick()));
+    connect(roomsList, SIGNAL(doubleClicked (const QModelIndex &)), this, SLOT(onJoinClick()));
+    connect(CBState, SIGNAL(currentIndexChanged (int)), this, SLOT(onRefreshClick()));
+    connect(CBRules, SIGNAL(currentIndexChanged (int)), this, SLOT(onRefreshClick()));
+    connect(CBWeapons, SIGNAL(currentIndexChanged (int)), this, SLOT(onRefreshClick()));
+    connect(searchText, SIGNAL(textChanged (const QString &)), this, SLOT(onRefreshClick()));
+    connect(this, SIGNAL(askJoinConfirmation (const QString &)), this, SLOT(onJoinConfirmation(const QString &)), Qt::QueuedConnection);
+}
+
+
+PageRoomsList::PageRoomsList(QWidget* parent, QSettings * gameSettings, SDLInteraction * sdli) :
+  AbstractPage(parent)
+{
+    m_gameSettings = gameSettings;
+    m_sdli = sdli;
+
+    initPage();
+
+    // not the most elegant solution but it works
+    ammoSchemeModel = new AmmoSchemeModel(this, NULL);
+    for (int i = 0; i < ammoSchemeModel->predefSchemesNames.count(); i++)
+        CBRules->addItem(ammoSchemeModel->predefSchemesNames.at(i).toAscii().constData());
+
+    CBWeapons->addItem(QComboBox::tr("Any"));
+    for (int i = 0; i < cDefaultAmmos.count(); i++) {
+        QPair<QString,QString> ammo = cDefaultAmmos.at(i);
+        CBWeapons->addItem(ammo.first.toAscii().constData());
+    }
+
+    gameInLobby = false;
+}
+
+void PageRoomsList::setAdmin(bool flag)
+{
+    BtnAdmin->setVisible(flag);
+}
+
+void PageRoomsList::setRoomsList(const QStringList & list)
+{
+    QBrush red(QColor(255, 0, 0));
+    QBrush orange(QColor(127, 127, 0));
+    QBrush yellow(QColor(255, 255, 0));
+    QBrush green(QColor(0, 255, 0));
+
+    listFromServer = list;
+    
+    QString selection = "";
+    
+    if(QTableWidgetItem *item = roomsList->item(roomsList->currentRow(), 0))
+        selection = item->text();
+    
+    roomsList->clear();
+    roomsList->setColumnCount(7);
+    roomsList->setHorizontalHeaderLabels(
+            QStringList() <<
+            QTableWidget::tr("Room Name") <<
+            QTableWidget::tr("C") <<
+            QTableWidget::tr("T") <<
+            QTableWidget::tr("Owner") <<
+            QTableWidget::tr("Map") <<
+            QTableWidget::tr("Rules") <<
+            QTableWidget::tr("Weapons")
+            );
+
+    // set minimum sizes
+//  roomsList->horizontalHeader()->resizeSection(0, 200);
+//  roomsList->horizontalHeader()->resizeSection(1, 50);
+//  roomsList->horizontalHeader()->resizeSection(2, 50);
+//  roomsList->horizontalHeader()->resizeSection(3, 100);
+//  roomsList->horizontalHeader()->resizeSection(4, 100);
+//  roomsList->horizontalHeader()->resizeSection(5, 100);
+//  roomsList->horizontalHeader()->resizeSection(6, 100);
+
+    // set resize modes
+//  roomsList->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
+
+    bool gameCanBeJoined = true;
+
+    if (list.size() % 8)
+        return;
+
+    roomsList->setRowCount(list.size() / 8);
+    for(int i = 0, r = 0; i < list.size(); i += 8, r++)
+    {
+        // if we are joining a game
+        // TODO: Should NOT be done here
+        if (gameInLobby) {
+            if (gameInLobbyName == list[i + 1]) {
+                gameCanBeJoined = list[i].compare("True");
+            }
+        }
+        
+        // check filter settings
+        #define NO_FILTER_MATCH roomsList->setRowCount(roomsList->rowCount() - 1); --r; continue
+        
+        if (list[i].compare("True") && CBState->currentIndex() == 2) { NO_FILTER_MATCH; }
+        if (list[i].compare("False") && CBState->currentIndex() == 1) { NO_FILTER_MATCH; }
+        if (CBRules->currentIndex() != 0 && list[i + 6].compare(CBRules->currentText())) { NO_FILTER_MATCH; }
+        if (CBWeapons->currentIndex() != 0 && list[i + 7].compare(CBWeapons->currentText())) { NO_FILTER_MATCH; }
+        bool found = list[i + 1].contains(searchText->text(), Qt::CaseInsensitive);
+        if (!found) {
+            for (int a = 4; a <= 7; ++a) {
+                QString compString = list[i + a];
+                if (a == 5 && compString == "+rnd+") {
+                    compString = "Random Map";
+                } else if (a == 5 && compString == "+maze+") {
+                    compString = "Random Maze";
+                } else if (a == 5 && compString == "+drawn+") {
+                    compString = "Drawn Map";
+                }
+                if (compString.contains(searchText->text(), Qt::CaseInsensitive)) {
+                    found = true;
+                    break;
+                }
+            }
+        }
+        if (!searchText->text().isEmpty() && !found) { NO_FILTER_MATCH; }
+        
+        QTableWidgetItem * item;
+        item = new QTableWidgetItem(list[i + 1]); // room name
+        item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+        
+        // pick appropriate room icon and tooltip (game in progress yes/no; later maybe locked rooms etc.)
+        if(list[i].compare("True"))
+        {
+            item->setIcon(QIcon(":/res/iconTime.png"));// game is in lobby
+            item->setToolTip(tr("This game is in lobby.\nYou may join and start playing once the game starts."));
+        }
+        else
+        {
+            item->setIcon(QIcon(":/res/iconDamage.png"));// game has started
+            item->setToolTip(tr("This game is in progress.\nYou may join and spectate now but you'll have to wait for the game to end to start playing."));
+        }
+
+        roomsList->setItem(r, 0, item);
+
+        item = new QTableWidgetItem(list[i + 2]); // number of clients
+        item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+        item->setTextAlignment(Qt::AlignCenter);
+        item->setToolTip(tr("There are %1 clients connected to this room.", "", list[i + 2].toInt()).arg(list[i + 2]));
+        roomsList->setItem(r, 1, item);
+
+        item = new QTableWidgetItem(list[i + 3]); // number of teams
+        item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+        item->setTextAlignment(Qt::AlignCenter);
+        item->setToolTip(tr("There are %1 teams participating in this room.", "", list[i + 3].toInt()).arg(list[i + 3]));
+        //Should we highlight "full" games? Might get misinterpreted
+        //if(list[i + 3].toInt() >= cMaxTeams)
+        //    item->setForeground(red);
+        roomsList->setItem(r, 2, item);
+
+        item = new QTableWidgetItem(list[i + 4].left(15)); // name of host
+        item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+        item->setToolTip(tr("%1 is the host. He may adjust settings and start the game.").arg(list[i + 4]));
+        roomsList->setItem(r, 3, item);
+
+        if(list[i + 5] == "+rnd+")
+        {
+            item = new QTableWidgetItem(tr("Random Map")); // selected map (is randomized)
+// FIXME - need real icons. Disabling until then
+//            item->setIcon(QIcon(":/res/mapRandom.png"));
+        }
+        else if (list[i+5] == "+maze+")
+        {
+            item = new QTableWidgetItem(tr("Random Maze"));
+// FIXME - need real icons. Disabling until then
+//            item->setIcon(QIcon(":/res/mapMaze.png"));
+        }
+        else
+        {
+            item = new QTableWidgetItem(list[i + 5]); // selected map
+            
+            // check to see if we've got this map
+            // not perfect but a start
+            if(!mapList->contains(list[i + 5]))
+            {
+                item->setForeground(red);
+                item->setIcon(QIcon(":/res/mapMissing.png"));
+            }
+            else
+            {
+               // todo: mission icon?
+// FIXME - need real icons. Disabling until then
+//               item->setIcon(QIcon(":/res/mapCustom.png"));
+            }
+        }
+        
+        item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+        item->setToolTip(tr("Games may be played on precreated or randomized maps."));
+        roomsList->setItem(r, 4, item);
+
+        item = new QTableWidgetItem(list[i + 6].left(24)); // selected game scheme
+        item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+        item->setToolTip(tr("The Game Scheme defines general options and preferences like Round Time, Sudden Death or Vampirism."));
+        roomsList->setItem(r, 5, item);
+
+        item = new QTableWidgetItem(list[i + 7].left(24)); // selected weapon scheme
+        item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+        item->setToolTip(tr("The Weapon Scheme defines available weapons and their ammunition count."));
+        roomsList->setItem(r, 6, item);
+
+        if(!list[i + 1].compare(selection) && !selection.isEmpty())
+            roomsList->selectionModel()->setCurrentIndex(roomsList->model()->index(r, 0), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
+    }
+
+    roomsList->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch);
+    roomsList->horizontalHeader()->setResizeMode(1, QHeaderView::ResizeToContents);
+    roomsList->horizontalHeader()->setResizeMode(2, QHeaderView::ResizeToContents);
+    roomsList->horizontalHeader()->setResizeMode(3, QHeaderView::ResizeToContents);
+    roomsList->horizontalHeader()->setResizeMode(4, QHeaderView::ResizeToContents);
+    roomsList->horizontalHeader()->setResizeMode(5, QHeaderView::ResizeToContents);
+    roomsList->horizontalHeader()->setResizeMode(6, QHeaderView::ResizeToContents);
+
+    // TODO: Should NOT be done here
+    if (gameInLobby) {
+        gameInLobby = false;
+        if (gameCanBeJoined) {
+            emit askForJoinRoom(gameInLobbyName);
+        } else {
+            emit askJoinConfirmation(gameInLobbyName);
+        }
+    }
+
+//  roomsList->resizeColumnsToContents();
+}
+
+void PageRoomsList::onCreateClick()
+{
+    if (roomName->text().size())
+        emit askForCreateRoom(roomName->text());
+    else
+        QMessageBox::critical(this,
+                tr("Error"),
+                tr("Please enter room name"),
+                tr("OK"));
+}
+
+void PageRoomsList::onJoinClick()
+{
+    QTableWidgetItem * curritem = roomsList->item(roomsList->currentRow(), 0);
+    if (!curritem)
+    {
+        QMessageBox::critical(this,
+                tr("Error"),
+                tr("Please select room from the list"),
+                tr("OK"));
+        return;
+    }
+
+    for (int i = 0; i < listFromServer.size(); i += 8) {
+        if (listFromServer[i + 1] == curritem->data(Qt::DisplayRole).toString()) {
+            gameInLobby = listFromServer[i].compare("True");
+            break;
+        }
+    }
+    
+    if (gameInLobby) {
+        gameInLobbyName = curritem->data(Qt::DisplayRole).toString();
+        emit askForRoomList();
+    } else {
+        emit askForJoinRoom(curritem->data(Qt::DisplayRole).toString());
+    }
+}
+
+void PageRoomsList::onRefreshClick()
+{
+    emit askForRoomList();
+}
+
+void PageRoomsList::onClearClick()
+{
+    CBState->setCurrentIndex(0);
+    CBRules->setCurrentIndex(0);
+    CBWeapons->setCurrentIndex(0);
+    searchText->clear();
+}
+
+void PageRoomsList::onJoinConfirmation(const QString & room)
+{
+    if (QMessageBox::warning(this,
+        tr("Warning"),
+        tr("The game you are trying to join has started.\nDo you still want to join the room?"),
+        QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes)
+    {
+        emit askForJoinRoom(room);
+    }
+}
+
+void PageRoomsList::updateNickCounter(int cnt)
+{
+    lblCount->setText(tr("%1 players online", 0, cnt).arg(cnt));
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pageroomslist.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,83 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef PAGE_ROOMLIST_H
+#define PAGE_ROOMLIST_H
+
+#include "AbstractPage.h"
+#include "SDLs.h"
+
+class HWChatWidget;
+class AmmoSchemeModel;
+
+class PageRoomsList : public AbstractPage
+{
+    Q_OBJECT
+
+public:
+    PageRoomsList(QWidget* parent, QSettings * config, SDLInteraction * sdli);
+
+    QLineEdit * roomName;
+    QLineEdit * searchText;
+    QTableWidget * roomsList;
+    QPushButton * BtnCreate;
+    QPushButton * BtnJoin;
+    QPushButton * BtnRefresh;
+    QPushButton * BtnAdmin;
+    QPushButton * BtnClear;
+    QComboBox * CBState;
+    QComboBox * CBRules;
+    QComboBox * CBWeapons;
+    HWChatWidget * chatWidget;
+    QLabel * lblCount;
+
+public slots:
+    void setRoomsList(const QStringList & list);
+    void setAdmin(bool);
+    void updateNickCounter(int cnt);
+
+signals:
+    void askForCreateRoom(const QString &);
+    void askForJoinRoom(const QString &);
+    void askForRoomList();
+    void askJoinConfirmation(const QString &);
+
+protected:
+    QLayout * bodyLayoutDefinition();
+    QLayout * footerLayoutDefinition();
+    void connectSignals();
+
+private slots:
+    void onCreateClick();
+    void onJoinClick();
+    void onRefreshClick();
+    void onClearClick();
+    void onJoinConfirmation(const QString &);
+
+private:
+    QSettings * m_gameSettings;
+    SDLInteraction * m_sdli;
+
+    bool gameInLobby;
+    QString gameInLobbyName;
+    QStringList listFromServer;
+    AmmoSchemeModel * ammoSchemeModel;
+
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagescheme.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,510 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QGridLayout>
+#include <QHBoxLayout>
+#include <QPushButton>
+#include <QGroupBox>
+#include <QComboBox>
+#include <QLabel>
+#include <QLineEdit>
+#include <QMessageBox>
+#include <QDataWidgetMapper>
+#include <QSpinBox>
+
+#include "ammoSchemeModel.h"
+#include "pagescheme.h"
+#include "misc.h"
+
+
+QLayout * PageScheme::bodyLayoutDefinition()
+{
+    QGridLayout * pageLayout = new QGridLayout();
+    QGroupBox * gb = new QGroupBox(this);
+
+    QGridLayout * gl = new QGridLayout();
+    gb->setLayout(gl);
+    QSizePolicy sp;
+    sp.setVerticalPolicy(QSizePolicy::MinimumExpanding);
+    sp.setHorizontalPolicy(QSizePolicy::Expanding);
+
+    pageLayout->addWidget(gb, 1,0,13,5);
+
+    gbGameModes = new QGroupBox(QGroupBox::tr("Game Modifiers"), gb);
+    gbBasicSettings = new QGroupBox(QGroupBox::tr("Basic Settings"), gb);
+
+    // TODO name stuff and put CSS into main style sheet
+    gbGameModes->setStyleSheet(".QGroupBox {"
+            "background-color: #130f2c; background-image:url();"
+            "}");
+    gbBasicSettings->setStyleSheet(".QGroupBox {"
+            "background-color: #130f2c; background-image:url();"
+            "}");
+
+    gbGameModes->setSizePolicy(sp);
+    gbBasicSettings->setSizePolicy(sp);
+    gl->addWidget(gbGameModes,0,0,1,3,Qt::AlignTop);
+    gl->addWidget(gbBasicSettings,0,3,1,3,Qt::AlignTop);
+
+    QGridLayout * glGMLayout = new QGridLayout(gbGameModes);
+    QGridLayout * glBSLayout = new QGridLayout(gbBasicSettings);
+    gbGameModes->setLayout(glGMLayout);
+    gbBasicSettings->setLayout(glBSLayout);
+    // Left
+
+    TBW_mode_Forts = new ToggleButtonWidget(gbGameModes, ":/res/btnForts.png");
+    TBW_mode_Forts->setToolTip("<b>" + ToggleButtonWidget::tr("Fort Mode") + "</b>:<br />" + tr("Defend your fort and destroy the opponents, two team colours max!"));
+    glGMLayout->addWidget(TBW_mode_Forts,0,0,1,1);
+
+    TBW_teamsDivide = new ToggleButtonWidget(gbGameModes, ":/res/btnTeamsDivide.png");
+    TBW_teamsDivide->setToolTip("<b>" + ToggleButtonWidget::tr("Divide Teams") + "</b>:<br />" + tr("Teams will start on opposite sides of the terrain, two team colours max!"));
+    glGMLayout->addWidget(TBW_teamsDivide,0,1,1,1);
+
+    TBW_solid = new ToggleButtonWidget(gbGameModes, ":/res/btnSolid.png");
+    TBW_solid->setToolTip("<b>" + ToggleButtonWidget::tr("Solid Land") + "</b>:<br />" + tr("Land can not be destroyed!"));
+    glGMLayout->addWidget(TBW_solid,0,2,1,1);
+
+    TBW_border = new ToggleButtonWidget(gbGameModes, ":/res/btnBorder.png");
+    TBW_border->setToolTip("<b>" + ToggleButtonWidget::tr("Add Border") + "</b>:<br />" + tr("Add an indestructible border around the terrain"));
+    glGMLayout->addWidget(TBW_border,0,3,1,1);
+
+    TBW_lowGravity = new ToggleButtonWidget(gbGameModes, ":/res/btnLowGravity.png");
+    TBW_lowGravity->setToolTip("<b>" + ToggleButtonWidget::tr("Low Gravity") + "</b>:<br />" + tr("Lower gravity"));
+    glGMLayout->addWidget(TBW_lowGravity,0,4,1,1);
+
+    TBW_laserSight = new ToggleButtonWidget(gbGameModes, ":/res/btnLaserSight.png");
+    TBW_laserSight->setToolTip("<b>" + ToggleButtonWidget::tr("Laser Sight") + "</b>:<br />" + tr("Assisted aiming with laser sight"));
+    glGMLayout->addWidget(TBW_laserSight,1,0,1,1);
+
+    TBW_invulnerable = new ToggleButtonWidget(gbGameModes, ":/res/btnInvulnerable.png");
+    TBW_invulnerable->setToolTip("<b>" + ToggleButtonWidget::tr("Invulnerable") + "</b>:<br />" + tr("All hogs have a personal forcefield"));
+    glGMLayout->addWidget(TBW_invulnerable,1,1,1,1);
+
+    TBW_resethealth = new ToggleButtonWidget(gbGameModes, ":/res/btnResetHealth.png");
+    TBW_resethealth->setToolTip("<b>" + ToggleButtonWidget::tr("Reset Health") + "</b>:<br />" + tr("All (living) hedgehogs are fully restored at the end of turn"));
+    glGMLayout->addWidget(TBW_resethealth,1,2,1,1);
+
+    TBW_vampiric = new ToggleButtonWidget(gbGameModes, ":/res/btnVampiric.png");
+    TBW_vampiric->setToolTip("<b>" + ToggleButtonWidget::tr("Vampirism") + "</b>:<br />" + tr("Gain 80% of the damage you do back in health"));
+    glGMLayout->addWidget(TBW_vampiric,1,3,1,1);
+
+    TBW_karma = new ToggleButtonWidget(gbGameModes, ":/res/btnKarma.png");
+    TBW_karma->setToolTip("<b>" + ToggleButtonWidget::tr("Karma") + "</b>:<br />" + tr("Share your opponents pain, share their damage"));
+    glGMLayout->addWidget(TBW_karma,1,4,1,1);
+
+    TBW_artillery = new ToggleButtonWidget(gbGameModes, ":/res/btnArtillery.png");
+    TBW_artillery->setToolTip("<b>" + ToggleButtonWidget::tr("Artillery") + "</b>:<br />" + tr("Your hogs are unable to move, put your artillery skills to the test"));
+    glGMLayout->addWidget(TBW_artillery,2,0,1,1);
+
+    TBW_randomorder = new ToggleButtonWidget(gbGameModes, ":/res/btnRandomOrder.png");
+    TBW_randomorder->setToolTip("<b>" + ToggleButtonWidget::tr("Random Order") + "</b>:<br />" + tr("Order of play is random instead of in room order."));
+    glGMLayout->addWidget(TBW_randomorder,2,1,1,1);
+
+    TBW_king = new ToggleButtonWidget(gbGameModes, ":/res/btnKing.png");
+    TBW_king->setToolTip("<b>" + ToggleButtonWidget::tr("King") + "</b>:<br />" + tr("Play with a King. If he dies, your side dies."));
+    glGMLayout->addWidget(TBW_king,2,2,1,1);
+
+    TBW_placehog = new ToggleButtonWidget(gbGameModes, ":/res/btnPlaceHog.png");
+    TBW_placehog->setToolTip("<b>" + ToggleButtonWidget::tr("Place Hedgehogs") + "</b>:<br />" + tr("Take turns placing your hedgehogs before the start of play."));
+    glGMLayout->addWidget(TBW_placehog,2,3,1,1);
+
+    TBW_sharedammo = new ToggleButtonWidget(gbGameModes, ":/res/btnSharedAmmo.png");
+    TBW_sharedammo->setToolTip("<b>" + ToggleButtonWidget::tr("Clan Shares Ammo") + "</b>:<br />" + tr("Ammo is shared between all teams that share a colour."));
+    glGMLayout->addWidget(TBW_sharedammo,2,4,1,1);
+
+    TBW_disablegirders = new ToggleButtonWidget(gbGameModes, ":/res/btnDisableGirders.png");
+    TBW_disablegirders->setToolTip("<b>" + ToggleButtonWidget::tr("Disable Girders") + "</b>:<br />" + tr("Disable girders when generating random maps."));
+    glGMLayout->addWidget(TBW_disablegirders,3,0,1,1);
+
+    TBW_disablelandobjects = new ToggleButtonWidget(gbGameModes, ":/res/btnDisableLandObjects.png");
+    TBW_disablelandobjects->setToolTip("<b>" + ToggleButtonWidget::tr("Disable Land Objects") + "</b>:<br />" + tr("Disable land objects when generating random maps."));
+    glGMLayout->addWidget(TBW_disablelandobjects,3,1,1,1);
+
+    TBW_aisurvival = new ToggleButtonWidget(gbGameModes, ":/res/btnAISurvival.png");
+    TBW_aisurvival->setToolTip("<b>" + ToggleButtonWidget::tr("AI Survival Mode") + "</b>:<br />" + tr("AI respawns on death."));
+    glGMLayout->addWidget(TBW_aisurvival,3,2,1,1);
+
+    TBW_infattack = new ToggleButtonWidget(gbGameModes, ":/res/btnInfAttack.png");
+    TBW_infattack->setToolTip("<b>" + ToggleButtonWidget::tr("Unlimited Attacks") + "</b>:<br />" + tr("Attacking does not end your turn."));
+    glGMLayout->addWidget(TBW_infattack,3,3,1,1);
+
+    TBW_resetweps = new ToggleButtonWidget(gbGameModes, ":/res/btnResetWeps.png");
+    TBW_resetweps->setToolTip("<b>" + ToggleButtonWidget::tr("Reset Weapons") + "</b>:<br />" + tr("Weapons are reset to starting values each turn."));
+    glGMLayout->addWidget(TBW_resetweps,3,4,1,1);
+
+    TBW_perhogammo = new ToggleButtonWidget(gbGameModes, ":/res/btnPerHogAmmo.png");
+    TBW_perhogammo->setToolTip("<b>" + ToggleButtonWidget::tr("Per Hedgehog Ammo") + "</b>:<br />" + tr("Each hedgehog has its own ammo. It does not share with the team."));
+    glGMLayout->addWidget(TBW_perhogammo,4,0,1,1);
+
+    TBW_nowind = new ToggleButtonWidget(gbGameModes, ":/res/btnNoWind.png");
+    TBW_nowind->setToolTip("<b>" + ToggleButtonWidget::tr("Disable Wind") + "</b>:<br />" + tr("You will not have to worry about wind anymore."));
+    glGMLayout->addWidget(TBW_nowind,4,1,1,1);
+
+    TBW_morewind = new ToggleButtonWidget(gbGameModes, ":/res/btnMoreWind.png");
+    TBW_morewind->setToolTip("<b>" + ToggleButtonWidget::tr("More Wind") + "</b>:<br />" + tr("Wind will affect almost everything."));
+    glGMLayout->addWidget(TBW_morewind,4,2,1,1);
+
+    TBW_tagteam = new ToggleButtonWidget(gbGameModes, ":/res/btnTagTeam.png");
+    TBW_tagteam->setToolTip("<b>" + ToggleButtonWidget::tr("Tag Team") + "</b>:<br />" + tr("Teams in each clan take successive turns sharing their turn time."));
+    glGMLayout->addWidget(TBW_tagteam,4,3,1,1);
+
+    TBW_bottomborder = new ToggleButtonWidget(gbGameModes, ":/res/btnBottomBorder.png");
+    TBW_bottomborder->setToolTip("<b>" + ToggleButtonWidget::tr("Add Bottom Border") + "</b>:<br />" + tr("Add an indestructible border along the bottom"));
+    glGMLayout->addWidget(TBW_bottomborder,4,4,1,1);
+
+
+    // Right
+    QLabel * l;
+
+    l = new QLabel(gbBasicSettings);
+    l->setText(QLabel::tr("Damage Modifier"));
+    l->setWordWrap(true);
+    glBSLayout->addWidget(l,0,0,1,1);
+    l = new QLabel(gbBasicSettings);
+    l->setFixedSize(32,32);
+    l->setPixmap(QPixmap(":/res/iconDamage.png"));
+    glBSLayout->addWidget(l,0,1,1,1);
+    SB_DamageModifier = new QSpinBox(gbBasicSettings);
+    SB_DamageModifier->setRange(10, 300);
+    SB_DamageModifier->setValue(100);
+    SB_DamageModifier->setSingleStep(25);
+    glBSLayout->addWidget(SB_DamageModifier,0,2,1,1);
+
+    l = new QLabel(gbBasicSettings);
+    l->setText(QLabel::tr("Turn Time"));
+    l->setWordWrap(true);
+    glBSLayout->addWidget(l,1,0,1,1);
+    l = new QLabel(gbBasicSettings);
+    l->setFixedSize(32,32);
+    l->setPixmap(QPixmap(":/res/iconTime.png"));
+    glBSLayout->addWidget(l,1,1,1,1);
+    SB_TurnTime = new QSpinBox(gbBasicSettings);
+    SB_TurnTime->setRange(1, 9999);
+    SB_TurnTime->setValue(45);
+    SB_TurnTime->setSingleStep(15);
+    glBSLayout->addWidget(SB_TurnTime,1,2,1,1);
+
+    l = new QLabel(gbBasicSettings);
+    l->setText(QLabel::tr("Initial Health"));
+    l->setWordWrap(true);
+    glBSLayout->addWidget(l,2,0,1,1);
+    l = new QLabel(gbBasicSettings);
+    l->setFixedSize(32,32);
+    l->setPixmap(QPixmap(":/res/iconHealth.png"));
+    glBSLayout->addWidget(l,2,1,1,1);
+    SB_InitHealth = new QSpinBox(gbBasicSettings);
+    SB_InitHealth->setRange(50, 200);
+    SB_InitHealth->setValue(100);
+    SB_InitHealth->setSingleStep(25);
+    glBSLayout->addWidget(SB_InitHealth,2,2,1,1);
+
+    l = new QLabel(gbBasicSettings);
+    l->setText(QLabel::tr("Sudden Death Timeout"));
+    l->setWordWrap(true);
+    glBSLayout->addWidget(l,3,0,1,1);
+    l = new QLabel(gbBasicSettings);
+    l->setFixedSize(32,32);
+    l->setPixmap(QPixmap(":/res/iconSuddenDeath.png"));
+    glBSLayout->addWidget(l,3,1,1,1);
+    SB_SuddenDeath = new QSpinBox(gbBasicSettings);
+    SB_SuddenDeath->setRange(0, 50);
+    SB_SuddenDeath->setValue(15);
+    SB_SuddenDeath->setSingleStep(3);
+    glBSLayout->addWidget(SB_SuddenDeath,3,2,1,1);
+
+    l = new QLabel(gbBasicSettings);
+    l->setText(QLabel::tr("Sudden Death Water Rise"));
+    l->setWordWrap(true);
+    glBSLayout->addWidget(l,4,0,1,1);
+    l = new QLabel(gbBasicSettings);
+    l->setFixedSize(32,32);
+    l->setPixmap(QPixmap(":/res/iconSuddenDeath.png")); // TODO: icon
+    glBSLayout->addWidget(l,4,1,1,1);
+    SB_WaterRise = new QSpinBox(gbBasicSettings);
+    SB_WaterRise->setRange(0, 100);
+    SB_WaterRise->setValue(47);
+    SB_WaterRise->setSingleStep(5);
+    glBSLayout->addWidget(SB_WaterRise,4,2,1,1);
+
+    l = new QLabel(gbBasicSettings);
+    l->setText(QLabel::tr("Sudden Death Health Decrease"));
+    l->setWordWrap(true);
+    glBSLayout->addWidget(l,5,0,1,1);
+    l = new QLabel(gbBasicSettings);
+    l->setFixedSize(32,32);
+    l->setPixmap(QPixmap(":/res/iconSuddenDeath.png")); // TODO: icon
+    glBSLayout->addWidget(l,5,1,1,1);
+    SB_HealthDecrease = new QSpinBox(gbBasicSettings);
+    SB_HealthDecrease->setRange(0, 100);
+    SB_HealthDecrease->setValue(5);
+    SB_HealthDecrease->setSingleStep(1);
+    glBSLayout->addWidget(SB_HealthDecrease,5,2,1,1);
+
+    l = new QLabel(gbBasicSettings);
+    l->setText(QLabel::tr("% Rope Length"));
+    l->setWordWrap(true);
+    glBSLayout->addWidget(l,6,0,1,1);
+    l = new QLabel(gbBasicSettings);
+    l->setFixedSize(32,32);
+    l->setPixmap(QPixmap(":/res/iconRope.png"));
+    glBSLayout->addWidget(l,6,1,1,1);
+    SB_RopeModifier = new QSpinBox(gbBasicSettings);
+    SB_RopeModifier->setRange(25, 999);
+    SB_RopeModifier->setValue(100);
+    SB_RopeModifier->setSingleStep(25);
+    glBSLayout->addWidget(SB_RopeModifier,6,2,1,1);
+
+    l = new QLabel(gbBasicSettings);
+    l->setText(QLabel::tr("Crate Drops"));
+    l->setWordWrap(true);
+    glBSLayout->addWidget(l,7,0,1,1);
+    l = new QLabel(gbBasicSettings);
+    l->setFixedSize(32,32);
+    l->setPixmap(QPixmap(":/res/iconBox.png"));
+    glBSLayout->addWidget(l,7,1,1,1);
+    SB_CaseProb = new FreqSpinBox(gbBasicSettings);
+    SB_CaseProb->setRange(0, 9);
+    SB_CaseProb->setValue(5);
+    glBSLayout->addWidget(SB_CaseProb,7,2,1,1);
+
+    l = new QLabel(gbBasicSettings);
+    l->setText(QLabel::tr("% Health Crates"));
+    l->setWordWrap(true);
+    glBSLayout->addWidget(l,8,0,1,1);
+    l = new QLabel(gbBasicSettings);
+    l->setFixedSize(32,32);
+    l->setPixmap(QPixmap(":/res/iconHealth.png")); // TODO: icon
+    glBSLayout->addWidget(l,8,1,1,1);
+    SB_HealthCrates = new QSpinBox(gbBasicSettings);
+    SB_HealthCrates->setRange(0, 100);
+    SB_HealthCrates->setValue(35);
+    SB_HealthCrates->setSingleStep(5);
+    glBSLayout->addWidget(SB_HealthCrates,8,2,1,1);
+
+    l = new QLabel(gbBasicSettings);
+    l->setText(QLabel::tr("Health in Crates"));
+    l->setWordWrap(true);
+    glBSLayout->addWidget(l,9,0,1,1);
+    l = new QLabel(gbBasicSettings);
+    l->setFixedSize(32,32);
+    l->setPixmap(QPixmap(":/res/iconHealth.png")); // TODO: icon
+    glBSLayout->addWidget(l,9,1,1,1);
+    SB_CrateHealth = new QSpinBox(gbBasicSettings);
+    SB_CrateHealth->setRange(0, 200);
+    SB_CrateHealth->setValue(25);
+    SB_CrateHealth->setSingleStep(5);
+    glBSLayout->addWidget(SB_CrateHealth,9,2,1,1);
+
+    l = new QLabel(gbBasicSettings);
+    l->setText(QLabel::tr("Mines Time"));
+    l->setWordWrap(true);
+    glBSLayout->addWidget(l,10,0,1,1);
+    l = new QLabel(gbBasicSettings);
+    l->setFixedSize(32,32);
+    l->setPixmap(QPixmap(":/res/iconTime.png")); // TODO: icon
+    glBSLayout->addWidget(l,10,1,1,1);
+    SB_MinesTime = new QSpinBox(gbBasicSettings);
+    SB_MinesTime->setRange(-1, 5);
+    SB_MinesTime->setValue(3);
+    SB_MinesTime->setSingleStep(1);
+    SB_MinesTime->setSpecialValueText(tr("Random"));
+    SB_MinesTime->setSuffix(" "+ tr("Seconds"));
+    glBSLayout->addWidget(SB_MinesTime,10,2,1,1);
+
+    l = new QLabel(gbBasicSettings);
+    l->setText(QLabel::tr("Mines"));
+    l->setWordWrap(true);
+    glBSLayout->addWidget(l,11,0,1,1);
+    l = new QLabel(gbBasicSettings);
+    l->setFixedSize(32,32);
+    l->setPixmap(QPixmap(":/res/iconMine.png")); // TODO: icon
+    glBSLayout->addWidget(l,11,1,1,1);
+    SB_Mines = new QSpinBox(gbBasicSettings);
+    SB_Mines->setRange(0, 80);
+    SB_Mines->setValue(0);
+    SB_Mines->setSingleStep(5);
+    glBSLayout->addWidget(SB_Mines,11,2,1,1);
+
+    l = new QLabel(gbBasicSettings);
+    l->setText(QLabel::tr("% Dud Mines"));
+    l->setWordWrap(true);
+    glBSLayout->addWidget(l,12,0,1,1);
+    l = new QLabel(gbBasicSettings);
+    l->setFixedSize(32,32);
+    l->setPixmap(QPixmap(":/res/iconDud.png"));
+    glBSLayout->addWidget(l,12,1,1,1);
+    SB_MineDuds = new QSpinBox(gbBasicSettings);
+    SB_MineDuds->setRange(0, 100);
+    SB_MineDuds->setValue(0);
+    SB_MineDuds->setSingleStep(5);
+    glBSLayout->addWidget(SB_MineDuds,12,2,1,1);
+
+    l = new QLabel(gbBasicSettings);
+    l->setText(QLabel::tr("Explosives"));
+    l->setWordWrap(true);
+    glBSLayout->addWidget(l,13,0,1,1);
+    l = new QLabel(gbBasicSettings);
+    l->setFixedSize(32,32);
+    l->setPixmap(QPixmap(":/res/iconDamage.png"));
+    glBSLayout->addWidget(l,13,1,1,1);
+    SB_Explosives = new QSpinBox(gbBasicSettings);
+    SB_Explosives->setRange(0, 40);
+    SB_Explosives->setValue(0);
+    SB_Explosives->setSingleStep(1);
+    glBSLayout->addWidget(SB_Explosives,13,2,1,1);
+
+    l = new QLabel(gbBasicSettings);
+    l->setText(QLabel::tr("% Get Away Time"));
+    l->setWordWrap(true);
+    glBSLayout->addWidget(l,14,0,1,1);
+    l = new QLabel(gbBasicSettings);
+    l->setFixedSize(32,32);
+    l->setPixmap(QPixmap(":/res/iconTime.png"));
+    glBSLayout->addWidget(l,14,1,1,1);
+    SB_GetAwayTime = new QSpinBox(gbBasicSettings);
+    SB_GetAwayTime->setRange(0, 999);
+    SB_GetAwayTime->setValue(100);
+    SB_GetAwayTime->setSingleStep(25);
+    glBSLayout->addWidget(SB_GetAwayTime,14,2,1,1);
+ 
+    l = new QLabel(gbBasicSettings);
+    l->setText(QLabel::tr("Scheme Name:"));
+
+    LE_name = new QLineEdit(this);
+
+    gl->addWidget(LE_name,15,1,1,5);
+    gl->addWidget(l,15,0,1,1);
+
+    return pageLayout;
+}
+
+QLayout * PageScheme::footerLayoutDefinition()
+{
+    QHBoxLayout * bottomLayout = new QHBoxLayout();
+    selectScheme = new QComboBox(this);
+
+    bottomLayout->addWidget(selectScheme, 0);
+    BtnCopy = addButton(tr("Copy"), bottomLayout, 1);
+    BtnNew = addButton(tr("New"), bottomLayout, 2);
+    BtnDelete = addButton(tr("Delete"), bottomLayout, 3);
+
+    bottomLayout->setStretch(1,1);
+    bottomLayout->setStretch(2,1);
+    bottomLayout->setStretch(3,1);
+
+    return bottomLayout;
+}
+
+void PageScheme::connectSignals()
+{
+    connect(BtnCopy, SIGNAL(clicked()), this, SLOT(copyRow()));
+    connect(BtnNew, SIGNAL(clicked()), this, SLOT(newRow()));
+    connect(BtnDelete, SIGNAL(clicked()), this, SLOT(deleteRow()));
+    mapper = new QDataWidgetMapper(this);
+    connect(selectScheme, SIGNAL(currentIndexChanged(int)), mapper, SLOT(setCurrentIndex(int)));
+    connect(selectScheme, SIGNAL(currentIndexChanged(int)), this, SLOT(schemeSelected(int)));
+}
+
+PageScheme::PageScheme(QWidget* parent) : AbstractPage(parent)
+{
+    initPage();
+}
+
+void PageScheme::setModel(QAbstractItemModel * model)
+{
+    mapper->setModel(model);
+    selectScheme->setModel(model);
+
+    mapper->addMapping(LE_name, 0);
+    mapper->addMapping(TBW_mode_Forts, 1);
+    mapper->addMapping(TBW_teamsDivide, 2);
+    mapper->addMapping(TBW_solid, 3);
+    mapper->addMapping(TBW_border, 4);
+    mapper->addMapping(TBW_lowGravity, 5);
+    mapper->addMapping(TBW_laserSight, 6);
+    mapper->addMapping(TBW_invulnerable, 7);
+    mapper->addMapping(TBW_resethealth, 8);
+    mapper->addMapping(TBW_vampiric, 9);
+    mapper->addMapping(TBW_karma, 10);
+    mapper->addMapping(TBW_artillery, 11);
+    mapper->addMapping(TBW_randomorder, 12);
+    mapper->addMapping(TBW_king, 13);
+    mapper->addMapping(TBW_placehog, 14);
+    mapper->addMapping(TBW_sharedammo, 15);
+    mapper->addMapping(TBW_disablegirders, 16);
+    mapper->addMapping(TBW_disablelandobjects, 17);
+    mapper->addMapping(TBW_aisurvival, 18);
+    mapper->addMapping(TBW_infattack, 19);
+    mapper->addMapping(TBW_resetweps, 20);
+    mapper->addMapping(TBW_perhogammo, 21);
+    mapper->addMapping(TBW_nowind, 22);
+    mapper->addMapping(TBW_morewind, 23);
+    mapper->addMapping(TBW_tagteam, 24);
+    mapper->addMapping(TBW_bottomborder, 25);
+    mapper->addMapping(SB_DamageModifier, 26);
+    mapper->addMapping(SB_TurnTime, 27);
+    mapper->addMapping(SB_InitHealth, 28);
+    mapper->addMapping(SB_SuddenDeath, 29);
+    mapper->addMapping(SB_CaseProb, 30);
+    mapper->addMapping(SB_MinesTime, 31);
+    mapper->addMapping(SB_Mines, 32);
+    mapper->addMapping(SB_MineDuds, 33);
+    mapper->addMapping(SB_Explosives, 34);
+    mapper->addMapping(SB_HealthCrates, 35);
+    mapper->addMapping(SB_CrateHealth, 36);
+    mapper->addMapping(SB_WaterRise, 37);
+    mapper->addMapping(SB_HealthDecrease, 38);
+    mapper->addMapping(SB_RopeModifier, 39);
+	mapper->addMapping(SB_GetAwayTime, 40);
+
+    mapper->toFirst();
+}
+
+void PageScheme::newRow()
+{
+    QAbstractItemModel * model = mapper->model();
+    model->insertRow(-1);
+    selectScheme->setCurrentIndex(model->rowCount() - 1);
+}
+
+void PageScheme::copyRow()
+{
+    QAbstractItemModel * model = mapper->model();
+    model->insertRow(selectScheme->currentIndex());
+    selectScheme->setCurrentIndex(model->rowCount() - 1);
+}
+
+void PageScheme::deleteRow()
+{
+    QMessageBox reallyDelete(QMessageBox::Question, QMessageBox::tr("Schemes"), QMessageBox::tr("Really delete this game scheme?"), QMessageBox::Ok | QMessageBox::Cancel);
+
+    if (reallyDelete.exec() == QMessageBox::Ok) {
+        QAbstractItemModel * model = mapper->model();
+        model->removeRow(selectScheme->currentIndex());
+    }
+}
+
+void PageScheme::schemeSelected(int n)
+{
+    int c = ((AmmoSchemeModel*)mapper->model())->numberOfDefaultSchemes;
+    gbGameModes->setEnabled(n >= c);
+    gbBasicSettings->setEnabled(n >= c);
+    LE_name->setEnabled(n >= c);
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagescheme.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,104 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef PAGE_SCHEME_H
+#define PAGE_SCHEME_H
+
+#include "AbstractPage.h"
+#include "togglebutton.h"
+
+class FreqSpinBox;
+
+class PageScheme : public AbstractPage
+{
+    Q_OBJECT
+
+public:
+    PageScheme(QWidget* parent = 0);
+
+    QPushButton * BtnCopy;
+    QPushButton * BtnNew;
+    QPushButton * BtnDelete;
+    QPushButton * btnSave;
+    QComboBox * selectScheme;
+
+    void setModel(QAbstractItemModel * model);
+
+public slots:
+    void newRow();
+    void copyRow();
+    void deleteRow();
+
+protected:
+    QLayout * bodyLayoutDefinition();
+    QLayout * footerLayoutDefinition();
+    void connectSignals();
+
+private:
+    QDataWidgetMapper * mapper;
+    ToggleButtonWidget * TBW_mode_Forts;
+    ToggleButtonWidget * TBW_teamsDivide;
+    ToggleButtonWidget * TBW_solid;
+    ToggleButtonWidget * TBW_border;
+    ToggleButtonWidget * TBW_lowGravity;
+    ToggleButtonWidget * TBW_laserSight;
+    ToggleButtonWidget * TBW_invulnerable;
+    ToggleButtonWidget * TBW_resethealth;
+    ToggleButtonWidget * TBW_vampiric;
+    ToggleButtonWidget * TBW_karma;
+    ToggleButtonWidget * TBW_artillery;
+    ToggleButtonWidget * TBW_randomorder;
+    ToggleButtonWidget * TBW_king;
+    ToggleButtonWidget * TBW_placehog;
+    ToggleButtonWidget * TBW_sharedammo;
+    ToggleButtonWidget * TBW_disablegirders;
+    ToggleButtonWidget * TBW_disablelandobjects;
+    ToggleButtonWidget * TBW_aisurvival;
+    ToggleButtonWidget * TBW_infattack;
+    ToggleButtonWidget * TBW_resetweps;
+    ToggleButtonWidget * TBW_perhogammo;
+    ToggleButtonWidget * TBW_nowind;
+    ToggleButtonWidget * TBW_morewind;
+    ToggleButtonWidget * TBW_tagteam;
+    ToggleButtonWidget * TBW_bottomborder;
+
+    QSpinBox * SB_DamageModifier;
+    QSpinBox * SB_TurnTime;
+    QSpinBox * SB_InitHealth;
+    QSpinBox * SB_SuddenDeath;
+    QSpinBox * SB_WaterRise;
+    QSpinBox * SB_HealthDecrease;
+    FreqSpinBox * SB_CaseProb;
+    QSpinBox * SB_HealthCrates;
+    QSpinBox * SB_CrateHealth;
+    QSpinBox * SB_MinesTime;
+    QSpinBox * SB_Mines;
+    QSpinBox * SB_MineDuds;
+    QSpinBox * SB_Explosives;
+    QSpinBox * SB_RopeModifier;
+    QSpinBox * SB_GetAwayTime;
+    QLineEdit * LE_name;
+
+    QGroupBox * gbGameModes;
+    QGroupBox * gbBasicSettings;
+
+private slots:
+    void schemeSelected(int);
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pageselectweapon.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,75 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QGridLayout>
+#include <QHBoxLayout>
+#include <QPushButton>
+#include <QComboBox>
+
+#include "pageselectweapon.h"
+#include "hwconsts.h"
+#include "selectWeapon.h"
+
+QLayout * PageSelectWeapon::bodyLayoutDefinition()
+{
+    QGridLayout * pageLayout = new QGridLayout();
+
+    pWeapons = new SelWeaponWidget(cAmmoNumber, this);
+    pageLayout->addWidget(pWeapons);
+
+    return pageLayout;
+}
+
+QLayout * PageSelectWeapon::footerLayoutDefinition()
+{
+    QGridLayout * bottomLayout = new QGridLayout();
+
+    selectWeaponSet = new QComboBox(this);
+    bottomLayout->addWidget(selectWeaponSet, 0, 0, 2, 1);
+
+    // first row
+    BtnNew = addButton(tr("New"), bottomLayout, 0, 1);
+    BtnDefault = addButton(tr("Default"), bottomLayout, 0, 2);
+
+    // second row
+    BtnCopy = addButton(tr("Copy"), bottomLayout, 1, 1);
+    BtnDelete = addButton(tr("Delete"), bottomLayout, 1, 2);
+
+    bottomLayout->setColumnStretch(1,1);
+    bottomLayout->setColumnStretch(2,1);
+
+    btnSave = addButton(":/res/Save.png", bottomLayout, 0, 3, 2, 1, true);
+    btnSave->setStyleSheet("QPushButton{margin: 24px 0 0 0;}");
+    bottomLayout->setAlignment(btnSave, Qt::AlignRight | Qt::AlignBottom);
+
+    return bottomLayout;
+}
+
+void PageSelectWeapon::connectSignals()
+{
+    connect(BtnDefault, SIGNAL(clicked()), pWeapons, SLOT(setDefault()));
+    connect(btnSave, SIGNAL(clicked()), pWeapons, SLOT(save()));
+    connect(BtnNew, SIGNAL(clicked()), pWeapons, SLOT(newWeaponsName()));
+    connect(BtnCopy, SIGNAL(clicked()), pWeapons, SLOT(copy()));
+    connect(selectWeaponSet, SIGNAL(currentIndexChanged(const QString&)), pWeapons, SLOT(setWeaponsName(const QString&)));
+}
+
+PageSelectWeapon::PageSelectWeapon(QWidget* parent) :  AbstractPage(parent)
+{
+    initPage();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pageselectweapon.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,47 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef PAGE_SELECTWEAPON_H
+#define PAGE_SELECTWEAPON_H
+
+#include "AbstractPage.h"
+
+class SelWeaponWidget;
+
+class PageSelectWeapon : public AbstractPage
+{
+    Q_OBJECT
+
+public:
+    PageSelectWeapon(QWidget* parent = 0);
+
+    QPushButton *btnSave;
+    QPushButton *BtnDefault;
+    QPushButton *BtnDelete;
+    QPushButton *BtnNew;
+    QPushButton *BtnCopy;
+    SelWeaponWidget* pWeapons;
+    QComboBox* selectWeaponSet;
+
+protected:
+    QLayout * bodyLayoutDefinition();
+    QLayout * footerLayoutDefinition();
+    void connectSignals();
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagesingleplayer.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,83 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QGridLayout>
+#include <QPushButton>
+
+#include "pagesingleplayer.h"
+#include "gamecfgwidget.h"
+
+QLayout * PageSinglePlayer::bodyLayoutDefinition()
+{
+    QVBoxLayout * vLayout = new QVBoxLayout();
+
+    QHBoxLayout * topLine = new QHBoxLayout();
+    QHBoxLayout * middleLine = new QHBoxLayout();
+    vLayout->addStretch();
+    vLayout->addLayout(topLine);
+    vLayout->addSpacing(30);
+    vLayout->addLayout(middleLine);
+    vLayout->addStretch();
+
+    topLine->addStretch();
+    BtnSimpleGamePage = addButton(":/res/SimpleGame.png", topLine, 0, true);
+    BtnSimpleGamePage->setToolTip(tr("Simple Game (a quick game against the computer, settings are chosen for you)"));
+    topLine->addSpacing(60);
+    BtnMultiplayer = addButton(":/res/Multiplayer.png", topLine, 1, true);
+    BtnMultiplayer->setToolTip(tr("Multiplayer (play a hotseat game against your friends, or AI teams)"));
+    topLine->addStretch();
+
+
+    BtnCampaignPage = addButton(":/res/Campaign.png", middleLine, 0, true);
+    BtnCampaignPage->setToolTip(tr("Campaign Mode (...). IN DEVELOPMENT"));
+    BtnCampaignPage->setVisible(false);
+
+    BtnTrainPage = addButton(":/res/Trainings.png", middleLine, 1, true);
+    BtnTrainPage->setToolTip(tr("Training Mode (Practice your skills in a range of training missions). IN DEVELOPMENT"));
+
+    return vLayout;
+}
+
+QLayout * PageSinglePlayer::footerLayoutDefinition()
+{
+    QHBoxLayout * bottomLine = new QHBoxLayout();
+    bottomLine->addStretch();
+
+    BtnDemos = addButton(":/res/Record.png", bottomLine, 1, true);
+    BtnDemos->setToolTip(tr("Demos (Watch recorded demos)"));
+    BtnLoad = addButton(":/res/Load.png", bottomLine, 2, true);
+    BtnLoad->setStyleSheet("QPushButton{margin: 24px 0 0 0;}");
+    BtnLoad->setToolTip(tr("Load (Load a previously saved game)"));
+
+    bottomLine->setStretch(1,0);
+    bottomLine->setStretch(2,0);
+    bottomLine->setAlignment(BtnDemos, Qt::AlignRight | Qt::AlignBottom);
+    bottomLine->setAlignment(BtnLoad, Qt::AlignRight | Qt::AlignBottom);
+
+    return bottomLine;
+}
+
+void PageSinglePlayer::connectSignals()
+{
+    //TODO
+}
+
+PageSinglePlayer::PageSinglePlayer(QWidget* parent) : AbstractPage(parent)
+{
+    initPage();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagesingleplayer.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,48 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef PAGE_SINGLE_PLAYER_H
+#define PAGE_SINGLE_PLAYER_H
+
+#include "AbstractPage.h"
+
+class GameCFGWidget;
+
+class PageSinglePlayer : public AbstractPage
+{
+    Q_OBJECT
+
+public:
+    PageSinglePlayer(QWidget* parent = 0);
+
+    QPushButton *BtnSimpleGamePage;
+    QPushButton *BtnTrainPage;
+    QPushButton *BtnCampaignPage;
+    QPushButton *BtnMultiplayer;
+    QPushButton *BtnLoad;
+    QPushButton *BtnDemos;
+    GameCFGWidget *gameCFG;
+
+private:
+    QLayout * bodyLayoutDefinition();
+    QLayout * footerLayoutDefinition();
+    void connectSignals();
+};
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagetraining.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,234 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QGridLayout>
+#include <QVBoxLayout>
+#include <QLabel>
+#include <QListWidget>
+#include <QListWidgetItem>
+#include <QPushButton>
+
+#include <QFile>
+#include <QLocale>
+#include <QSettings>
+
+#include "pagetraining.h"
+#include "hwconsts.h"
+
+QLayout * PageTraining::bodyLayoutDefinition()
+{
+    QGridLayout * pageLayout = new QGridLayout();
+
+// left column
+
+    // declare start button, caption and description
+    btnPreview = formattedButton(":/res/Trainings.png", true);
+    btnPreview->setToolTip(QPushButton::tr("Go!"));
+
+    // make both rows equal height
+    pageLayout->setRowStretch(0, 1);
+    pageLayout->setRowStretch(1, 1);
+
+    // add start button, caption and description to 3 different rows
+    pageLayout->addWidget(btnPreview, 0, 0);
+
+    // center preview
+    pageLayout->setAlignment(btnPreview, Qt::AlignRight | Qt::AlignVCenter);
+
+
+// right column
+
+    // info area (caption on top, description below)
+    QVBoxLayout * infoLayout = new QVBoxLayout();
+
+    lblCaption = new QLabel();
+    lblCaption->setMinimumWidth(360);
+    lblCaption->setAlignment(Qt::AlignHCenter | Qt::AlignBottom);
+    lblCaption->setWordWrap(true);
+    lblDescription = new QLabel();
+    lblDescription->setMinimumWidth(360);
+    lblDescription->setAlignment(Qt::AlignHCenter | Qt::AlignTop);
+    lblDescription->setWordWrap(true);
+
+    infoLayout->addWidget(lblCaption);
+    infoLayout->addWidget(lblDescription);
+
+    pageLayout->addLayout(infoLayout, 0, 1);
+    pageLayout->setAlignment(infoLayout, Qt::AlignLeft);
+
+
+    // mission list
+    lstMissions = new QListWidget(this);
+    pageLayout->addWidget(lstMissions, 1, 0, 1, 2); // span 2 columns
+
+    // let's not make the list use more space than needed
+    lstMissions->setFixedWidth(360);
+    pageLayout->setAlignment(lstMissions, Qt::AlignHCenter);
+
+    return pageLayout;
+}
+
+QLayout * PageTraining::footerLayoutDefinition()
+{
+    QBoxLayout * bottomLayout = new QVBoxLayout();
+
+    btnStart = formattedButton(QPushButton::tr("Go!"));
+    btnStart->setFixedWidth(140);
+
+    bottomLayout->addWidget(btnStart);
+
+    bottomLayout->setAlignment(btnStart, Qt::AlignRight | Qt::AlignVCenter);
+
+    return bottomLayout;
+}
+
+
+void PageTraining::connectSignals()
+{
+    connect(lstMissions, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(updateInfo()));
+    connect(lstMissions, SIGNAL(clicked()), this, SLOT(updateInfo()));
+    connect(lstMissions, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(startSelected()));
+    connect(btnPreview, SIGNAL(clicked()), this, SLOT(startSelected()));
+    connect(btnStart, SIGNAL(clicked()), this, SLOT(startSelected()));
+}
+
+
+PageTraining::PageTraining(QWidget* parent) : AbstractPage(parent)
+{
+    initPage();
+
+    // get locale
+    QSettings settings(cfgdir->absolutePath() + "/hedgewars.ini",
+                       QSettings::IniFormat);
+
+    QString loc = settings.value("misc/locale", "").toString();
+    if (loc.isEmpty())
+        loc = QLocale::system().name();
+
+    QString infoFile = 
+                datadir->absolutePath() + "/Locale/missions_" + loc + ".txt";
+
+    // if file is non-existant try with language only
+    if (!QFile::exists(infoFile))
+        infoFile = datadir->absolutePath() + "/Locale/missions_" + 
+                loc.replace(QRegExp("_.*$"),"") + ".txt";
+
+    // fallback if file for current locale is non-existant
+    if (!QFile::exists(infoFile))
+        infoFile = datadir->absolutePath() + "/Locale/missions_en.txt";
+
+    // preload mission info for current locale
+    m_info = new QSettings(infoFile, QSettings::IniFormat, this);
+
+//  TODO -> this should be done in a tool "DataDir" class
+    QDir tmpdir;
+    tmpdir.cd(cfgdir->absolutePath());
+    tmpdir.cd("Data/Missions/Training");
+    QStringList missionList = scriptList(tmpdir);
+    missionList.sort();
+
+    tmpdir.cd(datadir->absolutePath());
+    tmpdir.cd("Missions/Training");
+    QStringList defaultList = scriptList(tmpdir);
+    defaultList.sort();
+
+    // add non-duplicate default scripts to the list
+    foreach (const QString & mission, defaultList)
+    {
+        if (!missionList.contains(mission))
+            missionList.append(mission);
+    }
+
+    // add default scripts that have names different from detected user scripts
+    foreach (const QString & mission, missionList)
+    {
+        QListWidgetItem * item = new QListWidgetItem(mission);
+
+        // fallback name: replace underscores in mission name with spaces
+        QString name = item->text().replace("_", " ");
+
+        // see if we can get a prettier/translated name
+        name = m_info->value(mission + ".name", name).toString();
+
+        item->setText(name);
+
+        // store original name in data
+        item->setData(Qt::UserRole, mission);
+
+        lstMissions->addItem(item);
+    }
+
+    updateInfo();
+
+    // pre-select first mission
+    if (lstMissions->count() > 0)
+        lstMissions->setCurrentRow(0);
+}
+
+QStringList PageTraining::scriptList(const QDir & scriptDir) const
+{
+    QDir dir = scriptDir;
+    dir.setFilter(QDir::Files);
+    return dir.entryList(QStringList("*.lua")).replaceInStrings(QRegExp("^(.*)\\.lua"), "\\1");
+}
+
+
+void PageTraining::startSelected()
+{
+    QListWidgetItem * curItem = lstMissions->currentItem();
+
+    if (curItem != NULL)
+        emit startMission(curItem->data(Qt::UserRole).toString());
+}
+
+
+void PageTraining::updateInfo()
+{
+    if (lstMissions->currentItem())
+    {
+        // TODO also use .pngs in userdata folder
+        QString thumbFile = datadir->absolutePath() +
+                    "/Graphics/Missions/Training/" +
+                    lstMissions->currentItem()->data(Qt::UserRole).toString() +
+                    ".png";
+
+        if (QFile::exists(thumbFile))
+            btnPreview->setIcon(QIcon(thumbFile));
+        else
+            btnPreview->setIcon(QIcon(":/res/Trainings.png"));
+
+        QString realName = lstMissions->currentItem()->data(
+                           Qt::UserRole).toString();
+
+        QString caption = m_info->value(realName + ".name", 
+                          lstMissions->currentItem()->text()).toString();
+
+        QString description = m_info->value(realName + ".desc",
+                              tr("No description available")).toString();
+
+        lblCaption->setText("<h2>" + caption +"</h2>");
+        lblDescription->setText(description);
+    }
+    else
+    {
+        btnPreview->setIcon(QIcon(":/res/Trainings.png"));
+        lblCaption->setText(tr("Select a mission!"));
+        // TODO better text and tr()
+        lblDescription->setText("");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/page/pagetraining.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,62 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef PAGE_TRAINING_H
+#define PAGE_TRAINING_H
+
+#include <QDir>
+
+#include "AbstractPage.h"
+
+class PageTraining : public AbstractPage
+{
+    Q_OBJECT
+
+public:
+    PageTraining(QWidget* parent = 0);
+
+
+signals:
+    void startMission(const QString & scriptName);
+
+
+protected:
+    QLayout * bodyLayoutDefinition();
+    QLayout * footerLayoutDefinition();
+    void connectSignals();
+
+
+private:
+    QPushButton * btnPreview;
+    QPushButton * btnStart;
+    QLabel * lblCaption;
+    QLabel * lblDescription;
+    QListWidget * lstMissions;
+    QSettings * m_info;
+
+    QStringList scriptList(const QDir & scriptDir) const;
+
+
+private slots:
+    void startSelected();
+    void updateInfo();
+
+};
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/qaspectratiolayout.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,206 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation.
+ */
+
+#include "qaspectratiolayout.h"
+
+QAspectRatioLayout::QAspectRatioLayout(QWidget* parent, int spacing) : QLayout(parent) {
+        init(spacing);
+}
+
+QAspectRatioLayout::QAspectRatioLayout(int spacing) {
+        init(spacing);
+}
+
+QAspectRatioLayout::~QAspectRatioLayout() {
+        delete item;
+        delete lastReceivedRect;
+        delete _geometry;
+}
+
+void QAspectRatioLayout::init(int spacing) {
+        item = 0;
+        lastReceivedRect = new QRect(0, 0, 0, 0);
+        _geometry = new QRect(0, 0, 0, 0);
+        setSpacing(spacing);
+}
+
+
+/* Adds item if place isn't already taken. */
+void QAspectRatioLayout::add(QLayoutItem* item) {
+        if(!hasItem()) {
+                replaceItem(item);
+        }
+}
+
+/* Adds item if place isn't already taken. */
+void QAspectRatioLayout::addItem(QLayoutItem* item) {
+        if(!hasItem()) {
+                replaceItem(item);
+        }
+}
+
+/* Adds widget if place isn't already taken. */
+void QAspectRatioLayout::addWidget(QWidget* widget) {
+        if(!hasItem()) {
+                replaceItem(new QWidgetItem(widget));
+        }
+}
+
+/* Returns the item pointer and dereferences it here. */
+QLayoutItem* QAspectRatioLayout::take() {
+        QLayoutItem* item = 0;
+        if(this->hasItem()) {
+                item = this->item;
+                this->item = 0;
+        }
+        return item;
+}
+
+/* Returns the item pointer and dereferences it here. */
+QLayoutItem* QAspectRatioLayout::takeAt(int index) {
+        if(index != 0) {
+                return 0;
+        }
+        return this->take();
+}
+
+/* Returns the item pointer. */
+QLayoutItem* QAspectRatioLayout::itemAt(int index) const {
+        if(index != 0) {
+                return 0;
+        }
+        if(hasItem()) {
+                return this->item;
+        }
+        return 0;
+}
+
+/* Checks if we have an item. */
+bool QAspectRatioLayout::hasItem() const {
+        return this->item != 0;
+}
+
+/* Returns the count of items which can be either 0 or 1. */
+int QAspectRatioLayout::count() const {
+        int returnValue = 0;
+        if(hasItem()) {
+                returnValue = 1;
+        }
+        return returnValue;
+}
+
+/* Replaces the item with the new and returns the old. */
+QLayoutItem* QAspectRatioLayout::replaceItem(QLayoutItem* item) {
+        QLayoutItem* old = 0;
+        if(this->hasItem()) {
+                old = this->item;
+        }
+        this->item = item;
+        setGeometry(*this->_geometry);
+        return old;
+}
+
+/* Tells which way layout expands. */
+Qt::Orientations QAspectRatioLayout::expandingDirections() const {
+        return Qt::Horizontal | Qt::Vertical;
+}
+
+/* Tells which size is preferred. */
+QSize QAspectRatioLayout::sizeHint() const {
+        return this->item->minimumSize();
+}
+
+/* Tells minimum size. */
+QSize QAspectRatioLayout::minimumSize() const {
+        return this->item->minimumSize();
+}
+
+/*
+ * Tells if heightForWidth calculations is handled.
+ * It isn't since width isn't enough to calculate
+ * proper size.
+ */
+bool QAspectRatioLayout::hasHeightForWidth() const {
+        return false;
+}
+
+/* Replaces lastReceivedRect. */
+void QAspectRatioLayout::setLastReceivedRect(const QRect& rect) {
+        QRect* oldRect = this->lastReceivedRect;
+        this->lastReceivedRect = new QRect(rect.topLeft(), rect.size());
+        delete oldRect;
+}
+
+/* Returns geometry */
+QRect QAspectRatioLayout::geometry() {
+        return QRect(*this->_geometry);
+}
+
+/* Sets geometry to given size. */
+void QAspectRatioLayout::setGeometry(const QRect& rect) {
+        /*
+         * We check if the item is set and
+         * if size is the same previously received.
+         * If either is false nothing is done.
+         */
+        if(!this->hasItem() ||
+           areRectsEqual(*this->lastReceivedRect, rect)) {
+                return;
+        }
+        /* Replace the last received rectangle. */
+        setLastReceivedRect(rect);
+        /* Calculate proper size for the item relative to the received size. */
+        QSize properSize = calculateProperSize(rect.size());
+        /* Calculate center location in the rect and with item size. */
+        QPoint properLocation = calculateCenterLocation(rect.size(), properSize);
+        /* Set items geometry */
+        this->item->setGeometry(QRect(properLocation, properSize));
+        QRect* oldRect = this->_geometry;
+        /* Cache the calculated geometry. */
+        this->_geometry = new QRect(properLocation, properSize);
+        delete oldRect;
+        /* Super classes setGeometry */
+        QLayout::setGeometry(*this->_geometry);
+}
+
+/* Takes the shortest side and creates QSize
+ * with the shortest side as width and height. */
+QSize QAspectRatioLayout::calculateProperSize(QSize from) const {
+        QSize properSize;
+        if(from.height() * 2 < from.width()) {
+                properSize.setHeight(from.height() - this->margin());
+                properSize.setWidth(from.height() * 2 - this->margin());
+        }
+        else {
+                properSize.setWidth(from.width() - this->margin());
+                properSize.setHeight(from.width() / 2 - this->margin());
+        }
+        return properSize;
+}
+
+/* Calculates center location from the given height and width for item size. */
+QPoint QAspectRatioLayout::calculateCenterLocation(QSize from,
+                                                   QSize itemSize) const {
+        QPoint centerLocation;
+        if((from.width() - itemSize.width()) > 0) {
+                centerLocation.setX((from.width() - itemSize.width())/2);
+        }
+        if((from.height() - itemSize.height()) > 0) {
+                centerLocation.setY((from.height() - itemSize.height())/2);
+        }
+        return centerLocation;
+}
+
+/* Compares if two QRects are equal. */
+bool QAspectRatioLayout::areRectsEqual(const QRect& a,
+                                       const QRect& b) const {
+        bool result = false;
+        if(a.x() == b.x() &&
+           a.y() == b.y() &&
+           a.height() == b.height() &&
+           a.width() == b.width()) {
+                result = true;
+        }
+        return result;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/qaspectratiolayout.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation.
+ */
+
+#ifndef QASPECTRATIOLAYOUT_H_
+#define QASPECTRATIOLAYOUT_H_
+
+#include <QLayout>
+#include <QPointer>
+#include <QRect>
+#include <QWidgetItem>
+#include <QLayoutItem>
+
+
+class QAspectRatioLayout : public QLayout
+{
+        Q_OBJECT
+
+public:
+        QAspectRatioLayout(QWidget* parent, int spacing =-1);
+        QAspectRatioLayout(int spacing = -1);
+        ~QAspectRatioLayout();
+
+        /* Convenience method */
+        virtual void add(QLayoutItem* item);
+
+/* http://doc.trolltech.com/qlayout.html#addItem */
+        virtual void addItem(QLayoutItem* item);
+        /* http://doc.trolltech.com/qlayout.html#addWidget */
+        virtual void addWidget(QWidget* widget);
+        /* http://doc.trolltech.com/qlayout.html#takeAt */
+        virtual QLayoutItem* takeAt(int index);
+        /* http://doc.trolltech.com/qlayout.html#itemAt */
+        virtual QLayoutItem* itemAt(int index) const;
+        /* http://doc.trolltech.com/qlayout.html#count */
+        virtual int count() const;
+
+        /*
+         * These are ours since we do have only one item.
+         */
+        virtual QLayoutItem* replaceItem(QLayoutItem* item);
+        virtual QLayoutItem* take();
+        virtual bool hasItem() const;
+
+/* http://doc.trolltech.com/qlayout.html#expandingDirections */
+        virtual Qt::Orientations expandingDirections() const;
+
+        /*
+         * This method contains most of the juice of this article.
+         * http://doc.trolltech.com/qlayoutitem.html#setGeometry
+         */
+        virtual void setGeometry(const QRect& rect);
+        /* http://doc.trolltech.com/qlayoutitem.html#geometry */
+        virtual QRect geometry();
+
+        /* http://doc.trolltech.com/qlayoutitem.html#sizeHint */
+        virtual QSize sizeHint() const;
+        /* http://doc.trolltech.com/qlayout.html#minimumSize */
+        virtual QSize minimumSize() const;
+        /* http://doc.trolltech.com/qlayoutitem.html#hasHeightForWidth */
+        virtual bool hasHeightForWidth() const;
+
+private:
+        /* Saves the last received rect. */
+        void setLastReceivedRect(const QRect& rect);
+        /* Used to initialize the object. */
+        void init(int spacing);
+        /* Calculates the maximum size for the item from the assigned size. */
+        QSize calculateProperSize(QSize from) const;
+        /* Calculates the center location from the assigned size and
+         * the items size. */
+        QPoint calculateCenterLocation(QSize from, QSize itemSize) const;
+        /* Check if two QRects are equal */
+        bool areRectsEqual(const QRect& a, const QRect& b) const;
+        /* Contains item reference */
+        QLayoutItem* item;
+        /*
+         * Used for caching so we won't do calculations every time
+         * setGeometry is called.
+         */
+        QRect* lastReceivedRect;
+        /* Contains geometry */
+        QRect* _geometry;
+
+};
+
+#endif /* QASPECTRATIOLAYOUT_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/SquareLabel.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,50 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QPaintEvent>
+#include <QPainter>
+#include "SquareLabel.h"
+#include "hwform.h"
+
+SquareLabel::SquareLabel(QWidget * parent) :
+    QWidget(parent)
+{
+    if(frontendEffects) setAttribute(Qt::WA_PaintOnScreen, true);
+}
+
+void SquareLabel::paintEvent(QPaintEvent * event)
+{
+    Q_UNUSED(event);
+
+    QPainter painter(this);
+    int pixsize;
+    if (width() > height()) {
+        pixsize = height();
+        painter.translate((width() - pixsize) / 2, 0);
+    } else {
+        pixsize = width();
+        painter.translate(0, (height() - pixsize) / 2);
+    }
+    painter.drawPixmap(0, 0, pixsize, pixsize, pixmap.scaled(pixsize, pixsize, Qt::KeepAspectRatio));
+}
+
+void SquareLabel::setPixmap(const QPixmap & pixmap)
+{
+    this->pixmap = pixmap;
+    repaint();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/SquareLabel.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,41 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef _SQUARELABEL_H
+#define _SQUARELABEL_H
+
+#include <QWidget>
+#include <QPixmap>
+
+class SquareLabel : public QWidget
+{
+    Q_OBJECT
+
+public:
+    SquareLabel(QWidget * parent = 0);
+
+    void setPixmap(const QPixmap & pixmap);
+protected:
+    virtual void paintEvent(QPaintEvent * event);
+
+private:
+    QPixmap pixmap;
+
+};
+
+#endif // _SQUARELABEL_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/about.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,146 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QGridLayout>
+#include <QLabel>
+#include <QTextBrowser>
+#include "about.h"
+#include "hwconsts.h"
+
+About::About(QWidget * parent) :
+  QWidget(parent)
+{
+    QGridLayout *mainLayout = new QGridLayout(this);
+
+    QLabel *imageLabel = new QLabel;
+    QImage image(":/res/Hedgehog.png");
+    imageLabel->setPixmap(QPixmap::fromImage(image));
+    imageLabel->setScaledContents(true);
+    imageLabel->setMinimumWidth(2.8);
+    imageLabel->setMaximumWidth(280);
+    imageLabel->setMinimumHeight(30);
+    imageLabel->setMaximumHeight(300);
+
+    mainLayout->addWidget(imageLabel, 0, 0, 2, 1);
+
+    QLabel *lbl1 = new QLabel(this);
+    lbl1->setOpenExternalLinks(true);
+    lbl1->setText(
+            "<style type=\"text/css\">"
+            "a { color: #ffcc00; }"
+//            "a:hover { color: yellow; }"
+            "</style>"
+            "<div align=\"center\"><h1>Hedgewars</h1>"
+            "<h3>" + QLabel::tr("Version") + " " + *cVersionString + "</h3>"
+            "<p><a href=\"http://www.hedgewars.org/\">http://www.hedgewars.org/</a></p><br>" +
+            QLabel::tr("This program is distributed under the GNU General Public License") +
+            "</div>"
+            );
+    lbl1->setWordWrap(true);
+    mainLayout->addWidget(lbl1, 0, 1);
+
+    QTextBrowser *lbl2 = new QTextBrowser(this);
+
+    lbl2->setOpenExternalLinks(true);
+    lbl2->setText(
+            "<style type=\"text/css\">"
+            "a { color: #ffcc00; }"
+//            "a:hover { color: yellow; }"
+            "</style>" +
+            QString("<h2>") +
+            QLabel::tr("Developers:") +
+            "</h2><p>"
+            "Engine, frontend, net server: Andrey Korotaev &lt;<a href=\"mailto:unC0Rr@gmail.com\">unC0Rr@gmail.com</a>&gt;<br>"
+            "Many frontend improvements: Igor Ulyanov &lt;<a href=\"mailto:disinbox@gmail.com\">disinbox@gmail.com</a>&gt;<br>"
+            "Many engine and frontend improvements: Derek Pomery &lt;<a href=\"mailto:nemo@m8y.org\">nemo@m8y.org</a>&gt;<br>"
+            "Drill rocket, Ballgun, RC Plane weapons: Martin Boze &lt;<a href=\"mailto:afffect@gmail.com\">afffect@gmail.com</a>&gt;<br>"
+            "Mine number and time game settings: David A. Cuadrado &lt;<a href=\"mailto:krawek@gmail.com\">krawek@gmail.com</a>&gt;<br>"
+            "Frontend improvements: Martin Minarik &lt;<a href=\"mailto:ttsmj@pokec.sk\">ttsmj@pokec.sk</a>&gt;<br>"
+            "Frontend improvements: Kristian Lehmann &lt;<a href=\"mailto:email@thexception.net\">email@thexception.net</a>&gt;<br>"
+            "Mac OS X/iPhone port, OpenGL-ES conversion: Vittorio Giovara &lt;<a href=\"mailto:vittorio.giovara@gmail.com\">vittorio.giovara@gmail.com</a>&gt;<br>"
+            "Many engine and frontend improvements (and bugs): Richard Karolyi &lt;<a href=\"mailto:sheepluva@" "ercatec.net\">sheepluva@" "ercatec.net</a>&gt;<br>"
+            "Gamepad and Lua integration: Mario Liebisch &lt;<a href=\"mailto:mario.liebisch@gmail.com\">mario.liebisch@gmail.com</a>&gt;<br>"
+            "Many engine improvements and graphics: Carlos Vives &lt;<a href=\"mailto:mail@carlosvives.es\">mail@carlosvives.es</a>&gt;<br>"
+            "Maze maps: Henning K&uuml;hn &lt;<a href=\"mailto:prg@cooco.de\">prg@cooco.de</a>&gt;<br>"
+            "Engine and frontend improvements: Henrik Rostedt &lt;<a href=\"mailto:henrik.rostedt@gmail.com\">henrik.rostedt@gmail.com</a>&gt;<br>"
+            "Lua game modes and missions: John Lambert &lt;<a href=\"mailto:redgrinner@gmail.com\">redgrinner@gmail.com</a>&gt;<br>"
+            "Frontend improvements: Mayur Pawashe &lt;<a href=\"mailto:zorgiepoo@gmail.com\">zorgiepoo@gmail.com</a>&gt;<br>"
+            "Android port: Richard Deurwaarder &lt;<a href=\"mailto:xeli@xelification.com\">xeli@xelification.com</a>&gt;<br>"
+            "</p><h2>" +
+
+            QLabel::tr("Art:") + "</h2>"
+            + QString::fromUtf8(
+            "<p>John Dum &lt;<a href=\"mailto:fizzy@gmail.com\">fizzy@gmail.com</a>&gt;"
+            "<br>"
+            "Joshua Frese &lt;<a href=\"mailto:joshfrese@gmail.com\">joshfrese@gmail.com</a>&gt;"
+            "<br>"
+            "Stanko Tadić &lt;<a href=\"mailto:stanko@mfhinc.net\">stanko@mfhinc.net</a>&gt;"
+            "<br>"
+            "Julien Koesten &lt;<a href=\"mailto:julienkoesten@aol.com\">julienkoesten@aol.com</a>&gt;"
+            "<br>"
+            "Joshua O'Sullivan &lt;<a href=\"mailto:coheedftw@hotmail.co.uk\">coheedftw@hotmail.co.uk</a>&gt;"
+            "<br>"
+            "Nils Lück &lt;<a href=\"mailto:nils.luck.design@gmail.com\">nils.luck.design@gmail.com</a>&gt;"
+            "<br>"
+            "Guillaume Englert &lt;<a href=\"mailto:genglert@hybird.org\">genglert@hybird.org</a>&gt;"
+            "<br>"
+            "Hats: Trey Perry &lt;<a href=\"mailto:tx.perry.j@gmail.com\">tx.perry.j@gmail.com</a>&gt;"
+            "</p><h2>") +
+            QLabel::tr("Sounds:") + "</h2>"
+            "Hedgehogs voice: Stephen Alexander &lt;<a href=\"mailto:ArmagonNo1@gmail.com\">ArmagonNo1@gmail.com</a>&gt;"
+            "<br>"
+            "John Dum &lt;<a href=\"mailto:fizzy@gmail.com\">fizzy@gmail.com</a>&gt;"
+            "<br>"
+            "Jonatan Nilsson &lt;<a href=\"mailto:jonatanfan@gmail.com\">jonatanfan@gmail.com</a>&gt;"
+            "<br>"
+            "Daniel Martin &lt;<a href=\"mailto:elhombresinremedio@gmail.com\">elhombresinremedio@gmail.com</a>&gt;"
+            "</p><h2>" +
+
+            QLabel::tr("Translations:") + "</h2><p>"
+            + QString::fromUtf8(
+            "Brazilian Portuguese: Romulo Fernandes Machado &lt;<a href=\"mailto:abra185@gmail.com\">abra185@gmail.com</a>&gt;<br>"
+            "Bulgarian: Svetoslav Stefanov<br>"
+            "Czech: Petr Řezáček &lt;<a href=\"mailto:rezacek@gmail.com\">rezacek@gmail.com</a>&gt;<br>"
+            "Chinese: Jie Luo &lt;<a href=\"mailto:lililjlj@gmail.com\">lililjlj@gmail.com</a>&gt;<br>"
+            "English: Andrey Korotaev &lt;<a href=\"mailto:unC0Rr@gmail.com\">unC0Rr@gmail.com</a>&gt;<br>"
+            "Finnish: Nina Kuisma &lt;<a href=\"mailto:ninnnu@gmail.com\">ninnnu@gmail.com</a>&gt;<br>"
+            "French: Antoine Turmel &lt;<a href=\"mailto:geekshadow@gmail.com\">geekshadow@gmail.com</a>&gt;<br>"
+            "German: Peter Hüwe &lt;<a href=\"mailto:PeterHuewe@gmx.de\">PeterHuewe@gmx.de</a>&gt;, Mario Liebisch &lt;<a href=\"mailto:mario.liebisch@gmail.com\">mario.liebisch@gmail.com</a>&gt;, Richard Karolyi &lt;<a href=\"mailto:sheepluva@" "ercatec.net\">sheepluva@" "ercatec.net</a>&gt;<br>"
+            "Greek: &lt;<a href=\"mailto:talos_kriti@yahoo.gr\">talos_kriti@yahoo.gr</a>&gt;<br>"
+            "Italian: Luca Bonora &lt;<a href=\"mailto:bonora.luca@gmail.com\">bonora.luca@gmail.com</a>&gt;, Marco Bresciani<br>"
+            "Japanese: ADAM Etienne &lt;<a href=\"mailto:etienne.adam@gmail.com\">etienne.adam@gmail.com</a>&gt;<br>"
+            "Korean: Anthony Bellew &lt;<a href=\"mailto:webmaster@anthonybellew.com\">webmaster@anthonybellew.com</a>&gt;<br>"
+            "Lithuanian: Lukas Urbonas &lt;<a href=\"mailto:lukasu08@gmail.com\">lukasu08@gmail.com</a>&gt;<br>"
+            "Polish: Maciej Mroziński &lt;<a href=\"mailto:mynick2@o2.pl\">mynick2@o2.pl</a>&gt;, Wojciech Latkowski &lt;<a href=\"mailto:magik17l@gmail.com\">magik17l@gmail.com</a>&gt;, Piotr Mitana, Maciej Górny<br>"
+            "Portuguese: Fábio Canário &lt;<a href=\"mailto:inufabie@gmail.com\">inufabie@gmail.com</a>&gt;<br>"
+            "Russian: Andrey Korotaev &lt;<a href=\"mailto:unC0Rr@gmail.com\">unC0Rr@gmail.com</a>&gt;<br>"
+            "Slovak: Jose Riha<br>"
+            "Spanish: Carlos Vives &lt;<a href=\"mailto:mail@carlosvives.es\">mail@carlosvives.es</a>&gt;<br>"
+            "Swedish: Niklas Grahn &lt;<a href=\"mailto:raewolusjoon@yaoo.com\">raewolusjoon@yaoo.com</a>&gt;, Henrik Rostedt &lt;<a href=\"mailto:henrik.rostedt@gmail.com\">henrik.rostedt@gmail.com</a>&gt;<br>"
+            "Ukrainian: Eugene V. Lyubimkin &lt;<a href=\"mailto:jackyf.devel@gmail.com\">jackyf.devel@gmail.com</a>&gt;, Igor Paliychuk &lt;<a href=\"mailto:mansonigor@gmail.com\">mansonigor@gmail.com</a>&gt;, Eugene Sakara &lt;<a href=\"mailto:eresid@gmail.com\">eresid@gmail.com</a>&gt;"
+            "</p><h2>") +
+
+            QLabel::tr("Special thanks:") + "</h2><p>"
+            "Aleksey Andreev &lt;<a href=\"mailto:blaknayabr@gmail.com\">blaknayabr@gmail.com</a>&gt;<br>"
+            "Aleksander Rudalev &lt;<a href=\"mailto:alexv@pomorsu.ru\">alexv@pomorsu.ru</a>&gt;<br>"
+            "Natasha Korotaeva &lt;<a href=\"mailto:layout@pisem.net\">layout@pisem.net</a>&gt;<br>"
+            "Adam Higerd (aka ahigerd at FreeNode)"
+            "</p>"
+            );
+    mainLayout->addWidget(lbl2, 1, 1);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/about.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,33 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef _ABOUT_H
+#define _ABOUT_H
+
+#include <QWidget>
+
+
+class About : public QWidget
+{
+    Q_OBJECT
+
+public:
+    About(QWidget * parent = 0);
+};
+
+#endif // _ABOUT_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/bgwidget.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,143 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2009 Kristian Lehmann <email@thexception.net>
+ * Copyright (c) 2009-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include "bgwidget.h"
+
+SpritePosition::SpritePosition(QWidget * parent, int sh)
+{
+    wParent = parent;
+    iSpriteHeight = sh;
+    reset();
+}
+
+SpritePosition::~SpritePosition()
+{
+}
+
+void SpritePosition::move()
+{
+    fX += fXMov;
+    fY += fYMov;
+    iAngle += 4;
+    if (iAngle >= 360) iAngle = 0;
+    if (fY > wParent->height()) reset();
+}
+
+void SpritePosition::reset()
+{
+    fY = -1 * iSpriteHeight;
+    fX = (qrand() % ((int)(wParent->width() * 1.5))) - wParent->width()/2;
+    fYMov = ((qrand() % 400)+300) / 100.0f;
+    fXMov = fYMov * 0.2f+((qrand()%100)/100.0f * 0.6f); //so between 0.2 and 0.6, or 0.5 +/- 0.3
+    iAngle = qrand() % 360;
+}
+
+QPoint SpritePosition::pos()
+{
+    return QPoint((int)fX,(int)fY);
+}
+
+int SpritePosition::getAngle()
+{
+    return iAngle;
+}
+
+void SpritePosition::init()
+{
+    fY = qrand() % (wParent->height() + 1);
+    fX = qrand() % (wParent->width() + 1);
+}
+
+BGWidget::BGWidget(QWidget * parent) : QWidget(parent)
+{
+    setAttribute(Qt::WA_NoSystemBackground, true);
+    sprite.load(":/res/Star.png");
+
+    setAutoFillBackground(false);
+
+    for (int i = 0; i < SPRITE_MAX; i++) spritePositions[i] = new SpritePosition(this, sprite.height());
+
+    for (int i = 0; i < 360; i++)
+    {
+        rotatedSprites[i] = new QImage(sprite.width(), sprite.height(), QImage::Format_ARGB32);
+        rotatedSprites[i]->fill(0);
+
+        QPoint translate(sprite.width()/2, sprite.height()/2);
+
+        QPainter p;
+        p.begin(rotatedSprites[i]);
+    //  p.setRenderHint(QPainter::Antialiasing);
+        p.setRenderHint(QPainter::SmoothPixmapTransform);
+        p.translate(translate.x(), translate.y());
+        p.rotate(i);
+        p.translate(-1*translate.x(), -1*translate.y());
+        p.drawImage(0, 0, sprite);
+    }
+
+    timerAnimation = new QTimer();
+    connect(timerAnimation, SIGNAL(timeout()), this, SLOT(animate()));
+    timerAnimation->setInterval(ANIMATION_INTERVAL);
+}
+
+BGWidget::~BGWidget()
+{
+    for (int i = 0; i < SPRITE_MAX; i++) delete spritePositions[i];
+    for (int i = 0; i < 360; i++) delete rotatedSprites[i];
+    delete timerAnimation;
+}
+
+void BGWidget::paintEvent(QPaintEvent *event)
+{
+    Q_UNUSED(event);
+
+    QPainter p;
+    p.begin(this);
+    //p.setRenderHint(QPainter::Antialiasing);
+    for (int i = 0; i < SPRITE_MAX; i++)
+    {
+        QPoint point = spritePositions[i]->pos();
+        p.drawImage(point.x(), point.y(), *rotatedSprites[spritePositions[i]->getAngle()]);
+    }
+    p.end();
+}
+
+void BGWidget::animate()
+{
+    for (int i = 0; i < SPRITE_MAX; i++)
+    {
+        // bottom edge of star *seems* clipped, but in fact, if I switch to just plain old repaint()/update() it is still clipped - artifact of transform?  As for 5, is arbitrary number. 4 was noticeably clipping, 5 seemed same as update() - I assume extra room is due to rotation and value really should be calculated proportional to width/height
+        update(spritePositions[i]->pos().x(),spritePositions[i]->pos().y(), sprite.width()+5, sprite.height()+5);
+        spritePositions[i]->move();
+    }
+}
+
+void BGWidget::startAnimation()
+{
+    timerAnimation->start();
+}
+
+void BGWidget::stopAnimation()
+{
+    timerAnimation->stop();
+}
+
+void BGWidget::init()
+{
+    for (int i = 0; i < SPRITE_MAX; i++) spritePositions[i]->init();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/bgwidget.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,76 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2009 Kristian Lehmann <email@thexception.net>
+ * Copyright (c) 2009-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef BGWIDGET_H
+#define BGWIDGET_H
+
+#include <QWidget>
+//#include <QGLWidget>
+#include <QPainter>
+#include <QTimer>
+#include <QPaintEvent>
+#include <QTime>
+#include <QPoint>
+
+#define SPRITE_MAX 12
+
+#define ANIMATION_INTERVAL 40
+
+class SpritePosition
+{
+public:
+    SpritePosition(QWidget * parent, int sh);
+    ~SpritePosition();
+private:
+    float fX;
+    float fY;
+    float fXMov;
+    float fYMov;
+    int iAngle;
+    QWidget * wParent;
+    int iSpriteHeight;
+public:
+    void move();
+    void reset();
+    QPoint pos();
+    int getAngle();
+    void init();
+};
+
+class BGWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    BGWidget(QWidget * parent);
+    ~BGWidget();
+    void startAnimation();
+    void stopAnimation();
+    void init();
+private:
+    QImage sprite;
+    QTimer * timerAnimation;
+    SpritePosition * spritePositions[SPRITE_MAX];
+    QImage * rotatedSprites[360];
+protected:
+    void paintEvent(QPaintEvent * event);
+private slots:
+    void animate();
+};
+
+#endif // BGWIDGET_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/chatwidget.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,584 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2007 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QDesktopServices>
+#include <QTextBrowser>
+#include <QLineEdit>
+#include <QAction>
+#include <QTextDocument>
+#include <QDir>
+#include <QSettings>
+#include <QFile>
+#include <QTextStream>
+#include <QMenu>
+#include <QCursor>
+#include <QScrollBar>
+#include <QItemSelectionModel>
+#include <QStringList>
+
+#include "hwconsts.h"
+#include "SDLs.h"
+#include "gameuiconfig.h"
+#include "chatwidget.h"
+
+ListWidgetNickItem::ListWidgetNickItem(const QString& nick, bool isFriend, bool isIgnored) : QListWidgetItem(nick)
+{
+    this->aFriend = isFriend;
+    this->isIgnored = isIgnored;
+}
+
+void ListWidgetNickItem::setFriend(bool isFriend)
+{
+    this->aFriend = isFriend;
+}
+
+void ListWidgetNickItem::setIgnored(bool isIgnored)
+{
+    this->isIgnored = isIgnored;
+}
+
+bool ListWidgetNickItem::isFriend()
+{
+    return aFriend;
+}
+
+bool ListWidgetNickItem::ignored()
+{
+    return isIgnored;
+}
+
+bool ListWidgetNickItem::operator< (const QListWidgetItem & other) const
+{
+    // case in-sensitive comparison of the associated strings
+    // chars that are no letters are sorted at the end of the list
+
+    ListWidgetNickItem otherNick = const_cast<ListWidgetNickItem &>(dynamic_cast<const ListWidgetNickItem &>(other));
+
+    // ignored always down
+    if (isIgnored != otherNick.ignored())
+        return !isIgnored;
+
+    // friends always up
+    if (aFriend != otherNick.isFriend())
+        return aFriend;
+
+    QString txt1 = text().toLower();
+    QString txt2 = other.text().toLower();
+
+    bool firstIsShorter = (txt1.size() < txt2.size());
+    int len = firstIsShorter?txt1.size():txt2.size();
+
+    for (int i = 0; i < len; i++)
+    {
+        if (txt1[i] == txt2[i])
+            continue;
+        if (txt1[i].isLetter() != txt2[i].isLetter())
+            return txt1[i].isLetter();
+        return (txt1[i] < txt2[i]);
+    }
+
+    return firstIsShorter;
+}
+
+const char* HWChatWidget::STYLE = 
+"\
+a { color:#c8c8ff; }\
+.nick { text-decoration: none; }\
+.UserChat .nick { color:#ffec20; }\
+.FriendChat { color: #08e008; }\
+.FriendChat .nick { color: #20ff20; }\
+.UserJoin { color: #c0c0c0; }\
+.UserJoin .nick { color: #d0d0d0; }\
+.FriendJoin { color: #c0e0c0; }\
+.FriendJoin .nick { color: #d0f0d0; }\
+.UserAction { color: #ff80ff; }\
+.UserAction .nick { color: #ffa0ff; }\
+.FriendAction { color: #ff00ff; }\
+.FriendAction .nick { color: #ff30ff; }\
+.Error { color: #ff0000 }\
+.Warning { color: #ff8000 }\
+.Notice { color: #fefefe }\
+";
+
+HWChatWidget::HWChatWidget(QWidget* parent, QSettings * gameSettings, SDLInteraction * sdli, bool notify) :
+  QWidget(parent),
+  mainLayout(this)
+{
+    this->gameSettings = gameSettings;
+    this->sdli = sdli;
+    this->notify = notify;
+    if(notify && gameSettings->value("frontend/sound", true).toBool()) {
+        QFile tmpfile;
+        sdli->SDLMusicInit();
+        for(int i=0;i<4;i++) {
+            tmpfile.setFileName(cfgdir->absolutePath() + "/Data/Sounds/voices/Classic/Hello.ogg");
+            if (tmpfile.exists()) sound[i] = Mix_LoadWAV(QFileInfo(tmpfile).absoluteFilePath().toLocal8Bit().constData());
+            else sound[i] = Mix_LoadWAV(QString(datadir->absolutePath() + 
+                "/Sounds/voices/Classic/Hello.ogg").toLocal8Bit().constData());
+        }
+    }
+
+    mainLayout.setSpacing(1);
+    mainLayout.setMargin(1);
+    mainLayout.setSizeConstraint(QLayout::SetMinimumSize);
+    mainLayout.setColumnStretch(0, 76);
+    mainLayout.setColumnStretch(1, 24);
+
+    chatEditLine = new QLineEdit(this);
+    chatEditLine->setMaxLength(300);
+    connect(chatEditLine, SIGNAL(returnPressed()), this, SLOT(returnPressed()));
+
+    mainLayout.addWidget(chatEditLine, 2, 0);
+
+    chatText = new QTextBrowser(this);
+    chatText->document()->setDefaultStyleSheet(STYLE);
+    chatText->setMinimumHeight(20);
+    chatText->setMinimumWidth(10);
+    chatText->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+    chatText->setOpenLinks(false);
+    connect(chatText, SIGNAL(anchorClicked(const QUrl&)),
+        this, SLOT(linkClicked(const QUrl&)));
+    mainLayout.addWidget(chatText, 0, 0, 2, 1);
+
+    chatNicks = new QListWidget(this);
+    chatNicks->setMinimumHeight(10);
+    chatNicks->setMinimumWidth(10);
+    chatNicks->setSortingEnabled(true);
+    chatNicks->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+    chatNicks->setContextMenuPolicy(Qt::ActionsContextMenu);
+    connect(chatNicks, SIGNAL(itemDoubleClicked(QListWidgetItem *)),
+        this, SLOT(chatNickDoubleClicked(QListWidgetItem *)));
+    connect(chatNicks, SIGNAL(currentRowChanged(int)),
+        this, SLOT(chatNickSelected(int)));
+
+    mainLayout.addWidget(chatNicks, 0, 1, 3, 1);
+
+    acInfo = new QAction(QAction::tr("Info"), chatNicks);
+    acInfo->setIcon(QIcon(":/res/info.png"));
+    connect(acInfo, SIGNAL(triggered(bool)), this, SLOT(onInfo()));
+    acKick = new QAction(QAction::tr("Kick"), chatNicks);
+    acKick->setIcon(QIcon(":/res/kick.png"));
+    connect(acKick, SIGNAL(triggered(bool)), this, SLOT(onKick()));
+    acBan = new QAction(QAction::tr("Ban"), chatNicks);
+    acBan->setIcon(QIcon(":/res/ban.png"));
+    connect(acBan, SIGNAL(triggered(bool)), this, SLOT(onBan()));
+    acFollow = new QAction(QAction::tr("Follow"), chatNicks);
+    acFollow->setIcon(QIcon(":/res/follow.png"));
+    connect(acFollow, SIGNAL(triggered(bool)), this, SLOT(onFollow()));
+    acIgnore = new QAction(QAction::tr("Ignore"), chatNicks);
+    acIgnore->setIcon(QIcon(":/res/ignore.png"));
+    connect(acIgnore, SIGNAL(triggered(bool)), this, SLOT(onIgnore()));
+    acFriend = new QAction(QAction::tr("Add friend"), chatNicks);
+    acFriend->setIcon(QIcon(":/res/addfriend.png"));
+    connect(acFriend, SIGNAL(triggered(bool)), this, SLOT(onFriend()));
+
+    chatNicks->insertAction(0, acFriend);
+    chatNicks->insertAction(0, acInfo);
+    chatNicks->insertAction(0, acIgnore);
+
+    showReady = false;
+    setShowFollow(true);
+}
+
+void HWChatWidget::linkClicked(const QUrl & link)
+{
+    if (link.scheme() == "http")
+        QDesktopServices::openUrl(link);
+    if (link.scheme() == "hwnick")
+    {
+        // decode nick
+        const QString& nick = QString::fromUtf8(QByteArray::fromBase64(link.encodedQuery()));
+        QList<QListWidgetItem *> items = chatNicks->findItems(nick, Qt::MatchExactly);
+        if (items.size() < 1)
+            return;
+        QMenu * popup = new QMenu(this);
+        // selecting an item will automatically scroll there, so let's save old position
+        QScrollBar * scrollBar = chatNicks->verticalScrollBar();
+        int oldScrollPos = scrollBar->sliderPosition();
+        // select the nick which we want to see the actions for
+        chatNicks->setCurrentItem(items[0], QItemSelectionModel::Clear);
+        // selecting an item will automatically scroll there, so let's save old position
+        scrollBar->setSliderPosition(oldScrollPos);
+        // load actions
+        popup->addActions(chatNicks->actions());
+        // display menu popup at mouse cursor position
+        popup->popup(QCursor::pos());
+    }
+}
+
+void HWChatWidget::setShowFollow(bool enabled)
+{
+    if (enabled) {
+        if (!(chatNicks->actions().contains(acFollow)))
+            chatNicks->insertAction(acFriend, acFollow);
+    }
+    else {
+        if (chatNicks->actions().contains(acFollow))
+            chatNicks->removeAction(acFollow);
+    }
+}
+
+void HWChatWidget::loadList(QStringList & list, const QString & file)
+{
+    list.clear();
+    QFile txt(cfgdir->absolutePath() + "/" + file);
+    if(!txt.open(QIODevice::ReadOnly))
+        return;
+    QTextStream stream(&txt);
+    stream.setCodec("UTF-8");
+
+    while(!stream.atEnd())
+    {
+        QString str = stream.readLine();
+        if(str.startsWith(";") || str.length() == 0)
+            continue;
+        list << str.trimmed();
+    }
+    //readd once we require newer Qt than 4.4
+    //list.removeDuplicates();
+    txt.close();
+}
+
+void HWChatWidget::saveList(QStringList & list, const QString & file)
+{
+    QFile txt(cfgdir->absolutePath() + "/" + file);
+    if(!txt.open(QIODevice::WriteOnly | QIODevice::Truncate))
+        return;
+    QTextStream stream(&txt);
+    stream.setCodec("UTF-8");
+
+    stream << "; this list is used by Hedgewars - do not edit it unless you know what you're doing!" << endl;
+    for(int i = 0; i < list.size(); i++)
+        stream << list[i] << endl;
+    txt.close();
+}
+
+void HWChatWidget::updateNickItem(QListWidgetItem *nickItem)
+{
+    QString nick = nickItem->text();
+    ListWidgetNickItem * item = dynamic_cast<ListWidgetNickItem*>(nickItem);
+
+    item->setFriend(friendsList.contains(nick, Qt::CaseInsensitive));
+    item->setIgnored(ignoreList.contains(nick, Qt::CaseInsensitive));
+
+    if(item->ignored())
+    {
+        item->setIcon(QIcon(showReady ? (item->data(Qt::UserRole).toBool() ? ":/res/chat_ignore_on.png" : ":/res/chat_ignore_off.png") : ":/res/chat_ignore.png"));
+        item->setForeground(Qt::gray);
+    }
+    else if(item->isFriend())
+    {
+        item->setIcon(QIcon(showReady ? (item->data(Qt::UserRole).toBool() ? ":/res/chat_friend_on.png" : ":/res/chat_friend_off.png") : ":/res/chat_friend.png"));
+        item->setForeground(Qt::green);
+    }
+    else
+    {
+        item->setIcon(QIcon(showReady ? (item->data(Qt::UserRole).toBool() ? ":/res/chat_default_on.png" : ":/res/chat_default_off.png") : ":/res/chat_default.png"));
+        item->setForeground(QBrush(QColor(0xff, 0xcc, 0x00)));
+    }
+}
+
+void HWChatWidget::updateNickItems()
+{
+    for(int i = 0; i < chatNicks->count(); i++)
+        updateNickItem(chatNicks->item(i));
+
+    chatNicks->sortItems();
+}
+
+void HWChatWidget::loadLists(const QString & nick)
+{
+    loadList(ignoreList, nick.toLower() + "_ignore.txt");
+    loadList(friendsList, nick.toLower() + "_friends.txt");
+    updateNickItems();
+}
+
+void HWChatWidget::saveLists(const QString & nick)
+{
+    saveList(ignoreList, nick.toLower() + "_ignore.txt");
+    saveList(friendsList, nick.toLower() + "_friends.txt");
+}
+
+void HWChatWidget::returnPressed()
+{
+    QStringList lines = chatEditLine->text().split('\n');
+    chatEditLine->clear();
+    foreach (const QString &line, lines)
+        emit chatLine(line);
+}
+
+
+void HWChatWidget::onChatString(const QString& str)
+{
+    onChatString("", str);
+}
+
+const QRegExp HWChatWidget::URLREGEXP = QRegExp("(http://)?(www\\.)?(hedgewars\\.org(/[^ ]*)?)");
+
+void HWChatWidget::onChatString(const QString& nick, const QString& str)
+{
+    bool isFriend = false;
+
+    if (!nick.isEmpty()) {
+        // don't show chat lines that are from ignored nicks
+        if (ignoreList.contains(nick, Qt::CaseInsensitive))
+            return;
+        // friends will get special treatment, of course
+        isFriend = friendsList.contains(nick, Qt::CaseInsensitive);
+    }
+
+    QString formattedStr = Qt::escape(str.mid(1));
+    // make hedgewars.org urls actual links
+    formattedStr = formattedStr.replace(URLREGEXP, "<a href=\"http://\\3\">\\3</a>");
+
+    // "link" nick, but before that encode it in base64 to make sure it can't intefere with html/url syntax
+    // the nick is put as querystring as putting it as host would convert it to it's lower case variant
+    if(!nick.isEmpty())
+        formattedStr.replace("|nick|",QString("<a href=\"hwnick://?%1\" class=\"nick\">%2</a>").arg(QString(nick.toUtf8().toBase64())).arg(nick));
+
+    QString cssClass("UserChat");
+
+    // check first character for color code and set color properly
+    switch (str[0].toAscii()) {
+        case 3:
+            cssClass = (isFriend ? "FriendJoin" : "UserJoin");
+            break;
+        case 2:
+            cssClass = (isFriend ? "FriendAction" : "UserAction");
+            break;
+        default:
+            if (isFriend)
+                cssClass = "FriendChat";
+    }
+
+    addLine(cssClass,formattedStr);
+}
+
+void HWChatWidget::addLine(const QString& cssClass, QString line)
+{
+    if (chatStrings.size() > 250)
+        chatStrings.removeFirst();
+
+    line = QString("<span class=\"%2\">%1</span>").arg(line).arg(cssClass);
+
+    chatStrings.append(line);
+
+    chatText->setHtml(chatStrings.join("<br>"));
+
+    chatText->moveCursor(QTextCursor::End);
+}
+
+void HWChatWidget::onServerMessage(const QString& str)
+{
+    if (chatStrings.size() > 250)
+        chatStrings.removeFirst();
+
+    chatStrings.append("<hr>" + str + "<hr>");
+
+    chatText->setHtml(chatStrings.join("<br>"));
+
+    chatText->moveCursor(QTextCursor::End);
+}
+
+void HWChatWidget::nickAdded(const QString& nick, bool notifyNick)
+{
+    QListWidgetItem * item = new ListWidgetNickItem(nick, friendsList.contains(nick, Qt::CaseInsensitive), ignoreList.contains(nick, Qt::CaseInsensitive));
+    updateNickItem(item);
+    chatNicks->addItem(item);
+
+    emit nickCountUpdate(chatNicks->count());
+
+    if(notifyNick && notify && gameSettings->value("frontend/sound", true).toBool()) {
+       Mix_PlayChannel(-1, sound[rand()%4], 0);
+    }
+}
+
+void HWChatWidget::nickRemoved(const QString& nick)
+{
+    foreach(QListWidgetItem * item, chatNicks->findItems(nick, Qt::MatchExactly))
+        chatNicks->takeItem(chatNicks->row(item));
+
+    emit nickCountUpdate(chatNicks->count());
+}
+
+void HWChatWidget::clear()
+{
+    chatText->clear();
+    chatStrings.clear();
+    chatNicks->clear();
+}
+
+void HWChatWidget::onKick()
+{
+    QListWidgetItem * curritem = chatNicks->currentItem();
+    if (curritem)
+        emit kick(curritem->text());
+}
+
+void HWChatWidget::onBan()
+{
+    QListWidgetItem * curritem = chatNicks->currentItem();
+    if (curritem)
+        emit ban(curritem->text());
+}
+
+void HWChatWidget::onInfo()
+{
+    QListWidgetItem * curritem = chatNicks->currentItem();
+    if (curritem)
+        emit info(curritem->text());
+}
+
+void HWChatWidget::onFollow()
+{
+    QListWidgetItem * curritem = chatNicks->currentItem();
+    if (curritem)
+        emit follow(curritem->text());
+}
+
+void HWChatWidget::onIgnore()
+{
+    QListWidgetItem * curritem = chatNicks->currentItem();
+    if(!curritem)
+        return;
+
+    if(ignoreList.contains(curritem->text(), Qt::CaseInsensitive)) // already on list - remove him
+    {
+        ignoreList.removeAll(curritem->text().toLower());
+        onChatString(HWChatWidget::tr("%1 *** %2 has been removed from your ignore list").arg('\x03').arg(curritem->text()));
+    }
+    else // not on list - add
+    {
+        // don't consider ignored people friends
+        if(friendsList.contains(curritem->text(), Qt::CaseInsensitive))
+            emit onFriend();
+
+        // scroll down on first ignore added so that people see where that nick went to
+        if (ignoreList.isEmpty())
+            chatNicks->scrollToBottom();
+
+        ignoreList << curritem->text().toLower();
+        onChatString(HWChatWidget::tr("%1 *** %2 has been added to your ignore list").arg('\x03').arg(curritem->text()));
+    }
+    updateNickItem(curritem); // update icon/sort order/etc
+    chatNicks->sortItems();
+    chatNickSelected(0); // update context menu
+}
+
+void HWChatWidget::onFriend()
+{
+    QListWidgetItem * curritem = chatNicks->currentItem();
+    if(!curritem)
+        return;
+
+    if(friendsList.contains(curritem->text(), Qt::CaseInsensitive)) // already on list - remove him
+    {
+        friendsList.removeAll(curritem->text().toLower());
+        onChatString(HWChatWidget::tr("%1 *** %2 has been removed from your friends list").arg('\x03').arg(curritem->text()));
+    }
+    else // not on list - add
+    {
+        // don't ignore the new friend
+        if(ignoreList.contains(curritem->text(), Qt::CaseInsensitive))
+            emit onIgnore();
+
+        // scroll up on first friend added so that people see where that nick went to
+        if (friendsList.isEmpty())
+            chatNicks->scrollToTop();
+
+        friendsList << curritem->text().toLower();
+        onChatString(HWChatWidget::tr("%1 *** %2 has been added to your friends list").arg('\x03').arg(curritem->text()));
+    }
+    updateNickItem(curritem); // update icon/sort order/etc
+    chatNicks->sortItems();
+    chatNickSelected(0); // update context menu
+}
+
+void HWChatWidget::chatNickDoubleClicked(QListWidgetItem * item)
+{
+    Q_UNUSED(item);
+
+    QList<QAction *> actions = chatNicks->actions();
+    actions.first()->activate(QAction::Trigger);
+}
+
+void HWChatWidget::chatNickSelected(int index)
+{
+    Q_UNUSED(index);
+
+    QListWidgetItem* item = chatNicks->currentItem();
+    if (!item)
+        return;
+
+    // update context menu labels according to possible action
+    if(ignoreList.contains(item->text(), Qt::CaseInsensitive))
+    {
+        acIgnore->setText(QAction::tr("Unignore"));
+        acIgnore->setIcon(QIcon(":/res/unignore.png"));
+    }
+    else
+    {
+        acIgnore->setText(QAction::tr("Ignore"));
+        acIgnore->setIcon(QIcon(":/res/ignore.png"));
+    }
+
+    if(friendsList.contains(item->text(), Qt::CaseInsensitive))
+    {
+        acFriend->setText(QAction::tr("Remove friend"));
+        acFriend->setIcon(QIcon(":/res/remfriend.png"));
+    }
+    else
+    {
+        acFriend->setText(QAction::tr("Add friend"));
+        acFriend->setIcon(QIcon(":/res/addfriend.png"));
+    }
+}
+
+void HWChatWidget::setShowReady(bool s)
+{
+    showReady = s;
+}
+
+void HWChatWidget::setReadyStatus(const QString & nick, bool isReady)
+{
+    QList<QListWidgetItem *> items = chatNicks->findItems(nick, Qt::MatchExactly);
+    if (items.size() != 1)
+    {
+        qWarning("Bug: cannot find user in chat");
+        return;
+    }
+
+    items[0]->setData(Qt::UserRole, isReady); // bulb status
+    updateNickItem(items[0]);
+
+    // ensure we're still showing the status bulbs
+    showReady = true;
+}
+
+void HWChatWidget::adminAccess(bool b)
+{
+    chatNicks->removeAction(acKick);
+    chatNicks->removeAction(acBan);
+
+    if(b)
+    {
+        chatNicks->insertAction(0, acKick);
+//      chatNicks->insertAction(0, acBan);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/chatwidget.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,124 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2007 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef _CHAT_WIDGET_INCLUDED
+#define _CHAT_WIDGET_INCLUDED
+
+#include <QWidget>
+#include <QListWidget>
+#include <QString>
+#include <QGridLayout>
+#include <QRegExp>
+
+#include "SDLs.h"
+
+class ListWidgetNickItem;
+class QTextBrowser;
+class QLineEdit;
+class QListWidget;
+class QSettings;
+class SDLInteraction;
+
+// this class is for custom nick sorting
+class ListWidgetNickItem : public QListWidgetItem
+{
+public:
+  ListWidgetNickItem(const QString& nick, bool isFriend, bool isIgnored);
+  bool operator<(const QListWidgetItem & other) const;
+  void setFriend(bool isFriend);
+  void setIgnored(bool isIgnored);
+  bool isFriend();
+  bool ignored();
+
+private:
+  bool aFriend;
+  bool isIgnored;
+};
+
+class HWChatWidget : public QWidget
+{
+  Q_OBJECT
+
+ public:
+  HWChatWidget(QWidget* parent, QSettings * gameSettings, SDLInteraction * sdli, bool notify);
+  void loadLists(const QString & nick);
+  void saveLists(const QString & nick);
+  void setShowReady(bool s);
+  void setShowFollow(bool enabled);
+  void addLine(const QString & cssClass, QString line);
+  static const char* STYLE;
+  QStringList ignoreList, friendsList;
+
+private:
+  void loadList(QStringList & list, const QString & file);
+  void saveList(QStringList & list, const QString & file);
+  void updateNickItem(QListWidgetItem *item);
+  void updateNickItems();
+  static const QRegExp URLREGEXP;
+
+ public slots:
+  void onChatString(const QString& str);
+  void onChatString(const QString& nick, const QString& str);
+  void onServerMessage(const QString& str);
+  void nickAdded(const QString& nick, bool notifyNick);
+  void nickRemoved(const QString& nick);
+  void clear();
+  void setReadyStatus(const QString & nick, bool isReady);
+  void adminAccess(bool);
+
+ signals:
+  void chatLine(const QString& str);
+  void kick(const QString & str);
+  void ban(const QString & str);
+  void info(const QString & str);
+  void follow(const QString &);
+  void nickCountUpdate(int cnt);
+
+ private:
+  QGridLayout mainLayout;
+  QTextBrowser* chatText;
+  QStringList chatStrings;
+  QListWidget* chatNicks;
+  QLineEdit* chatEditLine;
+  QAction * acInfo;
+  QAction * acKick;
+  QAction * acBan;
+  QAction * acFollow;
+  QAction * acIgnore;
+  QAction * acFriend;
+  QSettings * gameSettings;
+  SDLInteraction * sdli;
+  Mix_Chunk *sound[4];
+  bool notify;
+  bool showReady;
+
+ private slots:
+  void returnPressed();
+  void onBan();
+  void onKick();
+  void onInfo();
+  void onFollow();
+  void onIgnore();
+  void onFriend();
+  void chatNickDoubleClicked(QListWidgetItem * item);
+  void chatNickSelected(int index);
+  void linkClicked(const QUrl & link);
+};
+
+#endif // _CHAT_WIDGET_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/databrowser.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,57 @@
+#include <QNetworkAccessManager>
+#include <QNetworkRequest>
+#include <QNetworkReply>
+#include <QDebug>
+#include <QUrl>
+
+#include "databrowser.h"
+
+const QNetworkRequest::Attribute typeAttribute = (QNetworkRequest::Attribute)(QNetworkRequest::User + 1);
+const QNetworkRequest::Attribute urlAttribute = (QNetworkRequest::Attribute)(QNetworkRequest::User + 2);
+
+DataBrowser::DataBrowser(QWidget *parent) :
+    QTextBrowser(parent)
+{
+
+    manager = new QNetworkAccessManager(this);
+}
+
+QVariant DataBrowser::loadResource(int type, const QUrl & name)
+{
+    if(type == QTextDocument::ImageResource || type == QTextDocument::StyleSheetResource)
+    {
+        if(resources.contains(name.toString()))
+        {
+            return resources.take(name.toString());
+        }
+        else
+            if(!requestedResources.contains(name.toString()))
+            {
+                qDebug() << "Requesting resource" << name.toString();
+                requestedResources.insert(name.toString());
+
+                QNetworkRequest newRequest(QUrl("http://www.hedgewars.org" + name.toString()));
+                newRequest.setAttribute(typeAttribute, type);
+                newRequest.setAttribute(urlAttribute, name);
+
+                QNetworkReply *reply = manager->get(newRequest);
+                connect(reply, SIGNAL(finished()), this, SLOT(resourceDownloaded()));
+            }
+    }
+
+    return QVariant();
+}
+
+void DataBrowser::resourceDownloaded()
+{
+    QNetworkReply * reply = qobject_cast<QNetworkReply *>(sender());
+
+    if(reply)
+    {
+        int type = reply->request().attribute(typeAttribute).toInt();
+        QUrl url = reply->request().attribute(urlAttribute).toUrl();
+        resources.insert(url.toString(), reply->readAll());
+        document()->addResource(type, reply->request().url(), QVariant());
+        update();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/databrowser.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,33 @@
+#ifndef DATABROWSER_H
+#define DATABROWSER_H
+
+#include <QTextBrowser>
+#include <QSet>
+
+class QNetworkAccessManager;
+
+class DataBrowser : public QTextBrowser
+{
+    Q_OBJECT
+public:
+    explicit DataBrowser(QWidget *parent = 0);
+
+signals:
+
+public slots:
+
+private:
+    QNetworkAccessManager *manager;
+    
+    // hash and set of QString instead of QUrl to support Qt versions 
+    // older than 4.7 (those have no support for qHash(const QUrl &))
+    QHash<QString, QByteArray> resources;
+    QSet<QString> requestedResources;
+
+    QVariant loadResource(int type, const QUrl & name);
+
+private slots:
+    void resourceDownloaded();
+};
+
+#endif // DATABROWSER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/drawmapwidget.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,106 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QFile>
+#include <QMessageBox>
+#include <QEvent>
+
+#include "drawmapwidget.h"
+
+DrawMapWidget::DrawMapWidget(QWidget *parent) :
+    QWidget(parent),
+    ui(new Ui::DrawMapWidget)
+{
+    ui->setupUi(this);
+
+    m_scene = 0;
+}
+
+DrawMapWidget::~DrawMapWidget()
+{
+    delete ui;
+}
+
+void DrawMapWidget::changeEvent(QEvent *e)
+{
+    QWidget::changeEvent(e);
+    switch (e->type()) {
+    case QEvent::LanguageChange:
+        ui->retranslateUi(this);
+        break;
+    default:
+        break;
+    }
+}
+
+void DrawMapWidget::setScene(DrawMapScene * scene)
+{
+    ui->graphicsView->setScene(scene);
+    m_scene = scene;
+}
+
+void DrawMapWidget::resizeEvent(QResizeEvent * event)
+{
+    Q_UNUSED(event);
+
+    if(ui->graphicsView && ui->graphicsView->scene())
+        ui->graphicsView->fitInView(ui->graphicsView->scene()->sceneRect(), Qt::KeepAspectRatio);
+}
+
+void DrawMapWidget::showEvent(QShowEvent * event)
+{
+    Q_UNUSED(event);
+
+    resizeEvent(0);
+}
+
+void DrawMapWidget::undo()
+{
+    if(m_scene) m_scene->undo();
+}
+
+void DrawMapWidget::clear()
+{
+    if(m_scene) m_scene->clearMap();
+}
+
+void DrawMapWidget::save(const QString & fileName)
+{
+    if(m_scene)
+    {
+        QFile file(fileName);
+
+        if(!file.open(QIODevice::WriteOnly))
+            QMessageBox::warning(this, tr("File error"), tr("Cannot open file '%1' for writing").arg(fileName));
+        else
+            file.write(qCompress(m_scene->encode()).toBase64());
+    }
+}
+
+void DrawMapWidget::load(const QString & fileName)
+{
+    if(m_scene)
+    {
+        QFile f(fileName);
+
+        if(!f.open(QIODevice::ReadOnly))
+            QMessageBox::warning(this, tr("File error"), tr("Cannot read file '%1'").arg(fileName));
+        else
+            m_scene->decode(qUncompress(QByteArray::fromBase64(f.readAll())));
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/drawmapwidget.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,86 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef DRAWMAPWIDGET_H
+#define DRAWMAPWIDGET_H
+
+#include <QWidget>
+#include <QHBoxLayout>
+#include <QPushButton>
+#include <QGraphicsView>
+
+#include "qaspectratiolayout.h"
+#include "drawmapscene.h"
+
+namespace Ui {
+    class Ui_DrawMapWidget
+    {
+    public:
+        QGraphicsView *graphicsView;
+
+        void setupUi(QWidget *drawMapWidget)
+        {
+            QAspectRatioLayout * arLayout = new QAspectRatioLayout(drawMapWidget);
+            arLayout->setMargin(0);
+
+            graphicsView = new QGraphicsView(drawMapWidget);
+            arLayout->addWidget(graphicsView);
+
+            retranslateUi(drawMapWidget);
+
+            QMetaObject::connectSlotsByName(drawMapWidget);
+        } // setupUi
+
+        void retranslateUi(QWidget *drawMapWidget)
+        {
+            Q_UNUSED(drawMapWidget);
+        } // retranslateUi
+
+    };
+
+    class DrawMapWidget: public Ui_DrawMapWidget {};
+}
+
+class DrawMapWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    explicit DrawMapWidget(QWidget *parent = 0);
+    ~DrawMapWidget();
+
+    void setScene(DrawMapScene * scene);
+
+public slots:
+    void undo();
+    void clear();
+    void save(const QString & fileName);
+    void load(const QString & fileName);
+
+protected:
+    void changeEvent(QEvent *e);
+    virtual void resizeEvent(QResizeEvent * event);
+    virtual void showEvent(QShowEvent * event);
+
+private:
+    Ui::DrawMapWidget *ui;
+
+    DrawMapScene * m_scene;
+};
+
+#endif // DRAWMAPWIDGET_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/fpsedit.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,31 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include "fpsedit.h"
+
+FPSEdit::FPSEdit(QWidget * parent) :
+    QSpinBox(parent)
+{
+    setRange(1, 34);
+    setValue(27);
+}
+
+QString FPSEdit::textFromValue(int value) const
+{
+    return QString::number(1000 / (35 - value));
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/fpsedit.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,35 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef _FPSEDIT_H
+#define _FPSEDIT_H
+
+#include <QSpinBox>
+
+class FPSEdit : public QSpinBox
+{
+    Q_OBJECT
+
+public:
+    FPSEdit(QWidget * parent = 0);
+
+protected:
+     QString textFromValue (int value) const;
+};
+
+#endif // _FPSEDIT_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/frameTeam.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,128 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2007 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QResizeEvent>
+#include <QCoreApplication>
+#include <QPalette>
+
+#include "frameTeam.h"
+#include "teamselhelper.h"
+#include "hwconsts.h"
+
+FrameTeams::FrameTeams(QWidget* parent) :
+  QFrame(parent), maxHedgehogsPerGame(48), overallHedgehogs(0), mainLayout(this), nonInteractive(false)
+{
+    QPalette newPalette = palette();
+    newPalette.setColor(QPalette::Window, QColor(0x00, 0x00, 0x00));
+    setPalette(newPalette);
+    setAutoFillBackground(true);
+
+    mainLayout.setSpacing(1);
+    mainLayout.setContentsMargins(4, 4, 4, 4);
+
+    int i = 0;
+    while(colors[i] != 0)
+        availableColors.push_back(QColor(colors[i++]));
+
+    resetColors();
+}
+
+void FrameTeams::setInteractivity(bool interactive)
+{
+    nonInteractive = !interactive;
+    for(tmapTeamToWidget::iterator it=teamToWidget.begin(); it!=teamToWidget.end(); ++it) {
+        TeamShowWidget* pts = dynamic_cast<TeamShowWidget*>(it.value());
+        if(!pts) throw;
+        pts->setInteractivity(interactive);
+    }
+}
+
+void FrameTeams::resetColors()
+{
+  currentColor=availableColors.end() - 1; // ensure next color is the first one
+}
+
+QColor FrameTeams::getNextColor() const
+{
+  QList<QColor>::ConstIterator nextColor=currentColor;
+  ++nextColor;
+  if (nextColor==availableColors.end()) nextColor=availableColors.begin();
+  return *nextColor;
+}
+
+void FrameTeams::addTeam(HWTeam team, bool willPlay)
+{
+  TeamShowWidget* pTeamShowWidget = new TeamShowWidget(team, willPlay, this);
+  if(nonInteractive) pTeamShowWidget->setInteractivity(false);
+//  int hght=teamToWidget.empty() ? 0 : teamToWidget.begin()->second->size().height();
+  mainLayout.addWidget(pTeamShowWidget);
+  teamToWidget.insert(team, pTeamShowWidget);
+  QResizeEvent* pevent=new QResizeEvent(parentWidget()->size(), parentWidget()->size());
+  QCoreApplication::postEvent(parentWidget(), pevent);
+}
+
+void FrameTeams::removeTeam(HWTeam team)
+{
+  tmapTeamToWidget::iterator it=teamToWidget.find(team);
+  if(it==teamToWidget.end()) return;
+  mainLayout.removeWidget(it.value());
+  it.value()->deleteLater();
+  teamToWidget.erase(it);
+}
+
+void FrameTeams::resetTeams()
+{
+  for(tmapTeamToWidget::iterator it=teamToWidget.begin(); it!=teamToWidget.end(); ) {
+    mainLayout.removeWidget(it.value());
+    it.value()->deleteLater();
+    teamToWidget.erase(it++);
+  }
+}
+
+void FrameTeams::setHHNum(const HWTeam& team)
+{
+  TeamShowWidget* pTeamShowWidget = dynamic_cast<TeamShowWidget*>(getTeamWidget(team));
+  if(!pTeamShowWidget) return;
+  pTeamShowWidget->setHHNum(team.numHedgehogs());
+}
+
+void FrameTeams::setTeamColor(const HWTeam& team)
+{
+  TeamShowWidget* pTeamShowWidget = dynamic_cast<TeamShowWidget*>(getTeamWidget(team));
+  if(!pTeamShowWidget) return;
+  pTeamShowWidget->changeTeamColor(team.color());
+}
+
+QWidget* FrameTeams::getTeamWidget(HWTeam team)
+{
+//qDebug() << "FrameTeams::getTeamWidget getNetID() = " << team.getNetID();
+  tmapTeamToWidget::iterator it=teamToWidget.find(team);
+  QWidget* ret = it!=teamToWidget.end() ? it.value() : 0;
+  return ret;
+}
+
+bool FrameTeams::isFullTeams() const
+{
+  return overallHedgehogs==maxHedgehogsPerGame;
+}
+
+void FrameTeams::emitTeamColorChanged(const HWTeam& team)
+{
+  emit teamColorChanged(team);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/frameTeam.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,68 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2007 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef _FRAME_TEAM_INCLUDED
+#define _FRAME_TEAM_INCLUDED
+
+#include <QFrame>
+#include <QList>
+#include <QColor>
+
+#include "teamselect.h"
+
+class FrameTeams : public QFrame
+{
+  Q_OBJECT
+
+ friend class CHedgehogerWidget;
+ friend class TeamShowWidget;
+
+ public:
+  FrameTeams(QWidget* parent=0);
+  QWidget* getTeamWidget(HWTeam team);
+  bool isFullTeams() const;
+  void resetColors();
+  void resetTeams();
+  void setHHNum(const HWTeam& team);
+  void setTeamColor(const HWTeam& team);
+  void setInteractivity(bool interactive);
+  QColor getNextColor() const;
+
+ signals:
+  void teamColorChanged(const HWTeam&);
+
+ public slots:
+  void addTeam(HWTeam team, bool willPlay);
+  void removeTeam(HWTeam team);
+
+ private:
+  const int maxHedgehogsPerGame;
+  int overallHedgehogs;
+  QList<QColor> availableColors;
+  QList<QColor>::Iterator currentColor;
+
+  void emitTeamColorChanged(const HWTeam& team);
+
+  QVBoxLayout mainLayout;
+  typedef QMap<HWTeam, QWidget*> tmapTeamToWidget;
+  tmapTeamToWidget teamToWidget;
+  bool nonInteractive;
+};
+
+#endif // _FRAME_TAM_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/gamecfgwidget.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,573 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QResizeEvent>
+#include <QGroupBox>
+#include <QCheckBox>
+#include <QGridLayout>
+#include <QSpinBox>
+#include <QLabel>
+#include <QMessageBox>
+#include <QTableView>
+#include <QPushButton>
+
+#include "gamecfgwidget.h"
+#include "igbox.h"
+#include "hwconsts.h"
+#include "ammoSchemeModel.h"
+#include "proto.h"
+
+GameCFGWidget::GameCFGWidget(QWidget* parent) :
+  QGroupBox(parent)
+  , mainLayout(this)
+  , seedRegexp("\\{[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\\}")
+{
+    mainLayout.setMargin(0);
+//  mainLayout.setSizeConstraint(QLayout::SetMinimumSize);
+
+    pMapContainer = new HWMapContainer(this);
+    mainLayout.addWidget(pMapContainer, 0, 0);
+
+    IconedGroupBox *GBoxOptions = new IconedGroupBox(this);
+    GBoxOptions->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
+    mainLayout.addWidget(GBoxOptions, 1, 0);
+
+    QGridLayout *GBoxOptionsLayout = new QGridLayout(GBoxOptions);
+
+    GBoxOptions->setTitle(tr("Game Options"));
+    GBoxOptionsLayout->addWidget(new QLabel(QLabel::tr("Style"), GBoxOptions), 1, 0);
+
+    Scripts = new QComboBox(GBoxOptions);
+    GBoxOptionsLayout->addWidget(Scripts, 1, 1);
+
+    Scripts->addItem("Normal");
+    Scripts->insertSeparator(1);
+
+    for (int i = 0; i < scriptList->size(); ++i) {
+        QString script = (*scriptList)[i].remove(".lua", Qt::CaseInsensitive);
+        QList<QVariant> scriptInfo;
+        scriptInfo.push_back(script);
+        QFile scriptCfgFile;
+        scriptCfgFile.setFileName(QString("%1/Data/Scripts/Multiplayer/%2.cfg").arg(cfgdir->absolutePath()).arg(script));
+        if (!scriptCfgFile.exists()) scriptCfgFile.setFileName(QString("%1/Scripts/Multiplayer/%2.cfg").arg(datadir->absolutePath()).arg(script));
+        if (scriptCfgFile.exists() && scriptCfgFile.open(QFile::ReadOnly)) {
+            QString scheme;
+            QString weapons;
+            QTextStream input(&scriptCfgFile);
+            input >> scheme;
+            input >> weapons;
+            if (scheme.isEmpty())
+                scheme = "locked";
+            scheme.replace("_", " ");
+            if (weapons.isEmpty())
+                weapons = "locked";
+            weapons.replace("_", " ");
+            scriptInfo.push_back(scheme);
+            scriptInfo.push_back(weapons);
+            scriptCfgFile.close();
+        }
+        else
+        {
+            scriptInfo.push_back("locked");
+            scriptInfo.push_back("locked");
+        }
+        Scripts->addItem(script.replace("_", " "), scriptInfo);
+    }
+
+    connect(Scripts, SIGNAL(currentIndexChanged(int)), this, SLOT(scriptChanged(int)));
+
+    QWidget *SchemeWidget = new QWidget(GBoxOptions);
+    GBoxOptionsLayout->addWidget(SchemeWidget, 2, 0, 1, 2);
+
+    QGridLayout *SchemeWidgetLayout = new QGridLayout(SchemeWidget);
+    SchemeWidgetLayout->setMargin(0);
+
+    GameSchemes = new QComboBox(SchemeWidget);
+    SchemeWidgetLayout->addWidget(GameSchemes, 0, 2);
+    connect(GameSchemes, SIGNAL(currentIndexChanged(int)), this, SLOT(schemeChanged(int)));
+
+    SchemeWidgetLayout->addWidget(new QLabel(QLabel::tr("Scheme"), SchemeWidget), 0, 0);
+
+    QPixmap pmEdit(":/res/edit.png");
+    
+    QPushButton * goToSchemePage = new QPushButton(SchemeWidget);
+    goToSchemePage->setToolTip(tr("Edit schemes"));
+    goToSchemePage->setIconSize(pmEdit.size());
+    goToSchemePage->setIcon(pmEdit);
+    goToSchemePage->setMaximumWidth(pmEdit.width() + 6);
+    SchemeWidgetLayout->addWidget(goToSchemePage, 0, 3);
+    connect(goToSchemePage, SIGNAL(clicked()), this, SLOT(jumpToSchemes()));
+
+    SchemeWidgetLayout->addWidget(new QLabel(QLabel::tr("Weapons"), SchemeWidget), 1, 0);
+
+    WeaponsName = new QComboBox(SchemeWidget);
+    SchemeWidgetLayout->addWidget(WeaponsName, 1, 2);
+
+    connect(WeaponsName, SIGNAL(currentIndexChanged(int)), this, SLOT(ammoChanged(int)));
+
+    QPushButton * goToWeaponPage = new QPushButton(SchemeWidget);
+    goToWeaponPage->setToolTip(tr("Edit weapons"));
+    goToWeaponPage->setIconSize(pmEdit.size());
+    goToWeaponPage->setIcon(pmEdit);
+    goToWeaponPage->setMaximumWidth(pmEdit.width() + 6);
+    SchemeWidgetLayout->addWidget(goToWeaponPage, 1, 3);
+    connect(goToWeaponPage, SIGNAL(clicked()), this, SLOT(jumpToWeapons()));
+
+    bindEntries = new QCheckBox(SchemeWidget);
+    bindEntries->setToolTip(tr("When this option is enabled selecting a game scheme will auto-select a weapon"));
+    bindEntries->setChecked(true);
+    bindEntries->setMaximumWidth(42);
+    bindEntries->setStyleSheet( "QCheckBox::indicator:checked   { image: url(\":/res/lock.png\"); }"
+                                "QCheckBox::indicator:unchecked { image: url(\":/res/unlock.png\");   }" );
+    SchemeWidgetLayout->addWidget(bindEntries, 0, 1, 0, 1, Qt::AlignVCenter);
+
+    connect(pMapContainer, SIGNAL(seedChanged(const QString &)), this, SLOT(seedChanged(const QString &)));
+    connect(pMapContainer, SIGNAL(mapChanged(const QString &)), this, SLOT(mapChanged(const QString &)));
+    connect(pMapContainer, SIGNAL(mapgenChanged(MapGenerator)), this, SLOT(mapgenChanged(MapGenerator)));
+    connect(pMapContainer, SIGNAL(mazeSizeChanged(int)), this, SLOT(maze_sizeChanged(int)));
+    connect(pMapContainer, SIGNAL(themeChanged(const QString &)), this, SLOT(themeChanged(const QString &)));
+    connect(pMapContainer, SIGNAL(newTemplateFilter(int)), this, SLOT(templateFilterChanged(int)));
+    connect(pMapContainer, SIGNAL(drawMapRequested()), this, SIGNAL(goToDrawMap()));
+    connect(pMapContainer, SIGNAL(drawnMapChanged(const QByteArray &)), this, SLOT(onDrawnMapChanged(const QByteArray &)));
+}
+
+void GameCFGWidget::jumpToSchemes()
+{
+    emit goToSchemes(GameSchemes->currentIndex());
+}
+
+void GameCFGWidget::jumpToWeapons()
+{
+    emit goToWeapons(WeaponsName->currentIndex());
+}
+
+QVariant GameCFGWidget::schemeData(int column) const
+{
+    return GameSchemes->model()->data(GameSchemes->model()->index(GameSchemes->currentIndex(), column));
+}
+
+quint32 GameCFGWidget::getGameFlags() const
+{
+    quint32 result = 0;
+
+    if (schemeData(1).toBool())
+        result |= 0x00001000;       // fort
+    if (schemeData(2).toBool())
+        result |= 0x00000010;       // divide teams
+    if (schemeData(3).toBool())
+        result |= 0x00000004;       // solid land
+    if (schemeData(4).toBool())
+        result |= 0x00000008;       // border
+    if (schemeData(5).toBool())
+        result |= 0x00000020;       // low gravity
+    if (schemeData(6).toBool())
+        result |= 0x00000040;       // laser sight
+    if (schemeData(7).toBool())
+        result |= 0x00000080;       // invulnerable
+    if (schemeData(8).toBool())
+        result |= 0x00000100;       // mines
+    if (schemeData(9).toBool())
+        result |= 0x00000200;       // vampirism
+    if (schemeData(10).toBool())
+        result |= 0x00000400;       // karma
+    if (schemeData(11).toBool())
+        result |= 0x00000800;       // artillery
+    if (schemeData(12).toBool())
+        result |= 0x00002000;       // random
+    if (schemeData(13).toBool())
+        result |= 0x00004000;       // king
+    if (schemeData(14).toBool())
+        result |= 0x00008000;       // place hogs
+    if (schemeData(15).toBool())
+        result |= 0x00010000;       // shared ammo
+    if (schemeData(16).toBool())
+        result |= 0x00020000;       // disable girders
+    if (schemeData(17).toBool())
+        result |= 0x00040000;       // disable land obj
+    if (schemeData(18).toBool())
+        result |= 0x00080000;       // ai survival
+    if (schemeData(19).toBool())
+        result |= 0x00100000;       // infinite attacks
+    if (schemeData(20).toBool())
+        result |= 0x00200000;       // reset weaps
+    if (schemeData(21).toBool())
+        result |= 0x00400000;       // per hog ammo
+    if (schemeData(22).toBool())
+        result |= 0x00800000;       // no wind
+    if (schemeData(23).toBool())
+        result |= 0x01000000;       // more wind
+    if (schemeData(24).toBool())
+        result |= 0x02000000;       // tag team
+    if (schemeData(25).toBool())
+        result |= 0x04000000;       // bottom border
+
+    return result;
+}
+
+quint32 GameCFGWidget::getInitHealth() const
+{
+    return schemeData(28).toInt();
+}
+
+QByteArray GameCFGWidget::getFullConfig() const
+{
+    QList<QByteArray> bcfg;
+    int mapgen = pMapContainer->get_mapgen();
+
+    QString currentMap = pMapContainer->getCurrentMap();
+    if (currentMap.size() > 0)
+    {
+        bcfg << QString("emap " + currentMap).toUtf8();
+        if(pMapContainer->getCurrentIsMission())
+            bcfg << QString("escript Maps/%1/map.lua").arg(currentMap).toUtf8();
+    }
+    bcfg << QString("etheme " + pMapContainer->getCurrentTheme()).toUtf8();
+
+    if (Scripts->currentIndex() > 0)
+    {
+        bcfg << QString("escript Scripts/Multiplayer/%1.lua").arg(Scripts->itemData(Scripts->currentIndex()).toList()[0].toString()).toUtf8();
+    }
+
+    bcfg << QString("eseed " + pMapContainer->getCurrentSeed()).toUtf8();
+    bcfg << QString("e$gmflags %1").arg(getGameFlags()).toUtf8();
+    bcfg << QString("e$damagepct %1").arg(schemeData(26).toInt()).toUtf8();
+    bcfg << QString("e$turntime %1").arg(schemeData(27).toInt() * 1000).toUtf8();
+    bcfg << QString("e$sd_turns %1").arg(schemeData(29).toInt()).toUtf8();
+    bcfg << QString("e$casefreq %1").arg(schemeData(30).toInt()).toUtf8();
+    bcfg << QString("e$minestime %1").arg(schemeData(31).toInt() * 1000).toUtf8();
+    bcfg << QString("e$minesnum %1").arg(schemeData(32).toInt()).toUtf8();
+    bcfg << QString("e$minedudpct %1").arg(schemeData(33).toInt()).toUtf8();
+    bcfg << QString("e$explosives %1").arg(schemeData(34).toInt()).toUtf8();
+    bcfg << QString("e$healthprob %1").arg(schemeData(35).toInt()).toUtf8();
+    bcfg << QString("e$hcaseamount %1").arg(schemeData(36).toInt()).toUtf8();
+    bcfg << QString("e$waterrise %1").arg(schemeData(37).toInt()).toUtf8();
+    bcfg << QString("e$healthdec %1").arg(schemeData(38).toInt()).toUtf8();
+    bcfg << QString("e$ropepct %1").arg(schemeData(39).toInt()).toUtf8();
+    bcfg << QString("e$getawaytime %1").arg(schemeData(40).toInt()).toUtf8();
+    bcfg << QString("e$template_filter %1").arg(pMapContainer->getTemplateFilter()).toUtf8();
+    bcfg << QString("e$mapgen %1").arg(mapgen).toUtf8();
+
+    switch (mapgen)
+    {
+        case MAPGEN_MAZE:
+            bcfg << QString("e$maze_size %1").arg(pMapContainer->getMazeSize()).toUtf8();
+            break;
+
+        case MAPGEN_DRAWN:
+        {
+            QByteArray data = pMapContainer->getDrawnMapData();
+            while(data.size() > 0)
+            {
+                QByteArray tmp = data;
+                tmp.truncate(200);
+                tmp.prepend("edraw ");
+                bcfg << tmp;
+                data.remove(0, 200);
+            }
+            break;
+        }
+        default: ;
+    }
+
+    QByteArray result;
+
+    foreach(QByteArray ba, bcfg)
+        HWProto::addByteArrayToBuffer(result, ba);
+
+    return result;
+}
+
+void GameCFGWidget::setNetAmmo(const QString& name, const QString& ammo)
+{
+    bool illegal = ammo.size() != cDefaultAmmoStore->size();
+    if (illegal)
+        QMessageBox::critical(this, tr("Error"), tr("Illegal ammo scheme"));
+
+    int pos = WeaponsName->findText(name);
+    if ((pos == -1) || illegal) { // prevent from overriding schemes with bad ones
+        WeaponsName->addItem(name, ammo);
+        WeaponsName->setCurrentIndex(WeaponsName->count() - 1);
+    } else {
+        WeaponsName->setItemData(pos, ammo);
+        WeaponsName->setCurrentIndex(pos);
+    }
+}
+
+void GameCFGWidget::fullNetConfig()
+{
+    ammoChanged(WeaponsName->currentIndex());
+
+    seedChanged(pMapContainer->getCurrentSeed());
+    templateFilterChanged(pMapContainer->getTemplateFilter());
+    themeChanged(pMapContainer->getCurrentTheme());
+
+    schemeChanged(GameSchemes->currentIndex());
+    scriptChanged(Scripts->currentIndex());
+
+    mapgenChanged(pMapContainer->get_mapgen());
+    maze_sizeChanged(pMapContainer->getMazeSize());
+
+    // map must be the last
+    QString map = pMapContainer->getCurrentMap();
+    if (map.size())
+        mapChanged(map);
+}
+
+void GameCFGWidget::setParam(const QString & param, const QStringList & slValue)
+{
+    if (slValue.size() == 1)
+    {
+        QString value = slValue[0];
+        if (param == "MAP") {
+            pMapContainer->setMap(value);
+            return;
+        }
+        if (param == "SEED") {
+            pMapContainer->setSeed(value);
+            if (!seedRegexp.exactMatch(value)) {
+                pMapContainer->seedEdit->setVisible(true);
+                }
+            return;
+        }
+        if (param == "THEME") {
+            pMapContainer->setTheme(value);
+            return;
+        }
+        if (param == "TEMPLATE") {
+            pMapContainer->setTemplateFilter(value.toUInt());
+            return;
+        }
+        if (param == "MAPGEN") {
+            pMapContainer->setMapgen((MapGenerator)value.toUInt());
+            return;
+        }
+        if (param == "MAZE_SIZE") {
+            pMapContainer->setMazeSize(value.toUInt());
+            return;
+        }
+        if (param == "SCRIPT") {
+            Scripts->setCurrentIndex(Scripts->findText(value));
+            return;
+        }
+        if (param == "DRAWNMAP") {
+            pMapContainer->setDrawnMapData(qUncompress(QByteArray::fromBase64(slValue[0].toLatin1())));
+            return;
+        }
+    }
+
+    if (slValue.size() == 2)
+    {
+        if (param == "AMMO") {
+            setNetAmmo(slValue[0], slValue[1]);
+            return;
+        }
+    }
+
+    if (slValue.size() == 5)
+    {
+        if (param == "FULLMAPCONFIG")
+        {
+            QString seed = slValue[3];
+            if (!seedRegexp.exactMatch(seed))
+                pMapContainer->seedEdit->setVisible(true);
+
+            pMapContainer->setAllMapParameters(
+                    slValue[0],
+                    (MapGenerator)slValue[1].toUInt(),
+                    slValue[2].toUInt(),
+                    seed,
+                    slValue[4].toUInt()
+                    );
+            return;
+        }
+    }
+
+    qWarning("Got bad config param from net");
+}
+
+void GameCFGWidget::ammoChanged(int index)
+{
+    if (index >= 0) {
+        emit paramChanged(
+            "AMMO",
+            QStringList() << WeaponsName->itemText(index) << WeaponsName->itemData(index).toString()
+        );
+    }
+}
+
+void GameCFGWidget::mapChanged(const QString & value)
+{
+    if(isEnabled() && pMapContainer->getCurrentIsMission())
+    {
+        Scripts->setEnabled(false);
+        Scripts->setCurrentIndex(0);
+
+        if (pMapContainer->getCurrentScheme() == "locked")
+        {
+            GameSchemes->setEnabled(false);
+            GameSchemes->setCurrentIndex(GameSchemes->findText("Default"));
+        }
+        else
+        {
+            GameSchemes->setEnabled(true);
+            int num = GameSchemes->findText(pMapContainer->getCurrentScheme());
+            if (num != -1)
+                GameSchemes->setCurrentIndex(num);
+            else
+                GameSchemes->setCurrentIndex(GameSchemes->findText("Default"));
+        }
+
+        if (pMapContainer->getCurrentWeapons() == "locked")
+        {
+            WeaponsName->setEnabled(false);
+            WeaponsName->setCurrentIndex(WeaponsName->findText("Default"));
+        }
+        else
+        {
+            WeaponsName->setEnabled(true);
+            int num = WeaponsName->findText(pMapContainer->getCurrentWeapons());
+            if (num != -1)
+                WeaponsName->setCurrentIndex(num);
+            else
+                WeaponsName->setCurrentIndex(WeaponsName->findText("Default"));
+        }
+
+        if (pMapContainer->getCurrentScheme() != "locked" && pMapContainer->getCurrentWeapons() != "locked")
+            bindEntries->setEnabled(true);
+        else
+            bindEntries->setEnabled(false);
+    }
+    else
+    {
+        Scripts->setEnabled(true);
+        GameSchemes->setEnabled(true);
+        WeaponsName->setEnabled(true);
+        bindEntries->setEnabled(true);
+    }
+    emit paramChanged("MAP", QStringList(value));
+}
+
+void GameCFGWidget::templateFilterChanged(int value)
+{
+    emit paramChanged("TEMPLATE", QStringList(QString::number(value)));
+}
+
+void GameCFGWidget::seedChanged(const QString & value)
+{
+    emit paramChanged("SEED", QStringList(value));
+}
+
+void GameCFGWidget::themeChanged(const QString & value)
+{
+    emit paramChanged("THEME", QStringList(value));
+}
+
+void GameCFGWidget::schemeChanged(int index)
+{
+    QStringList sl;
+
+    int size = GameSchemes->model()->columnCount();
+    for(int i = 0; i < size; ++i)
+        sl << schemeData(i).toString();
+
+    emit paramChanged("SCHEME", sl);
+
+    if (isEnabled() && bindEntries->isEnabled() && bindEntries->isChecked()) {
+        QString schemeName = GameSchemes->itemText(index);
+        for (int i = 0; i < WeaponsName->count(); i++) {
+             QString weapName = WeaponsName->itemText(i);
+             int res = QString::compare(weapName, schemeName, Qt::CaseSensitive);
+             if (0 == res) {
+                 WeaponsName->setCurrentIndex(i);
+                 emit ammoChanged(i);
+                 break;
+             }
+        }
+    }
+}
+
+void GameCFGWidget::scriptChanged(int index)
+{
+    if(isEnabled() && index > 0)
+    {
+        QString scheme = Scripts->itemData(Scripts->currentIndex()).toList()[1].toString();
+        QString weapons = Scripts->itemData(Scripts->currentIndex()).toList()[2].toString();
+
+        if (scheme == "locked")
+        {
+            GameSchemes->setEnabled(false);
+            GameSchemes->setCurrentIndex(GameSchemes->findText("Default"));
+        }
+        else
+        {
+            GameSchemes->setEnabled(true);
+            int num = GameSchemes->findText(scheme);
+            if (num != -1)
+                GameSchemes->setCurrentIndex(num);
+            else
+                GameSchemes->setCurrentIndex(GameSchemes->findText("Default"));
+        }
+
+        if (weapons == "locked")
+        {
+            WeaponsName->setEnabled(false);
+            WeaponsName->setCurrentIndex(WeaponsName->findText("Default"));
+        }
+        else
+        {
+            WeaponsName->setEnabled(true);
+            int num = WeaponsName->findText(weapons);
+            if (num != -1)
+                WeaponsName->setCurrentIndex(num);
+            else
+                WeaponsName->setCurrentIndex(WeaponsName->findText("Default"));
+        }
+
+        if (scheme != "locked" && weapons != "locked")
+            bindEntries->setEnabled(true);
+        else
+            bindEntries->setEnabled(false);
+    }
+    else
+    {
+        GameSchemes->setEnabled(true);
+        WeaponsName->setEnabled(true);
+        bindEntries->setEnabled(true);
+    }
+    emit paramChanged("SCRIPT", QStringList(Scripts->itemText(index)));
+}
+
+void GameCFGWidget::mapgenChanged(MapGenerator m)
+{
+    emit paramChanged("MAPGEN", QStringList(QString::number(m)));
+}
+
+void GameCFGWidget::maze_sizeChanged(int s)
+{
+    emit paramChanged("MAZE_SIZE", QStringList(QString::number(s)));
+}
+
+void GameCFGWidget::resendSchemeData()
+{
+    schemeChanged(GameSchemes->currentIndex());
+}
+
+void GameCFGWidget::onDrawnMapChanged(const QByteArray & data)
+{
+    emit paramChanged("DRAWNMAP", QStringList(qCompress(data, 9).toBase64()));
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/gamecfgwidget.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,87 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef GAMECONFIGWIDGET_H
+#define GAMECONFIGWIDGET_H
+
+#include <QWidget>
+#include <QStringList>
+#include <QGroupBox>
+#include <QSpinBox>
+#include <QRegExp>
+
+#include "mapContainer.h"
+
+class QCheckBox;
+class QVBoxLayout;
+class QLabel;
+class QTableView;
+
+class GameCFGWidget : public QGroupBox
+{
+    Q_OBJECT
+
+public:
+    GameCFGWidget(QWidget* parent);
+    quint32 getGameFlags() const;
+    quint32 getInitHealth() const;
+    QByteArray getFullConfig() const;
+    QComboBox * Scripts;
+    QComboBox * GameSchemes;
+    QComboBox * WeaponsName;
+    HWMapContainer* pMapContainer;
+    QTableView * tv;
+    QVariant schemeData(int column) const;
+
+public slots:
+    void setParam(const QString & param, const QStringList & value);
+    void fullNetConfig();
+    void resendSchemeData();
+
+signals:
+    void paramChanged(const QString & param, const QStringList & value);
+    void goToSchemes(int);
+    void goToWeapons(int);
+    void goToDrawMap();
+
+private slots:
+    void ammoChanged(int index);
+    void mapChanged(const QString &);
+    void templateFilterChanged(int);
+    void seedChanged(const QString &);
+    void themeChanged(const QString &);
+    void schemeChanged(int);
+    void scriptChanged(int);
+    void jumpToSchemes();
+    void jumpToWeapons();
+    void mapgenChanged(MapGenerator m);
+    void maze_sizeChanged(int s);
+    void onDrawnMapChanged(const QByteArray & data);
+
+private:
+    QGridLayout mainLayout;
+    QCheckBox * bindEntries;
+    QString curNetAmmoName;
+    QString curNetAmmo;
+    QRegExp seedRegexp;
+
+    void setNetAmmo(const QString& name, const QString& ammo);
+
+};
+
+#endif // GAMECONFIGWIDGET_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/hedgehogerWidget.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,76 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2008 Ulyanov Igor <iulyanov@gmail.com>
+ * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include "hedgehogerWidget.h"
+
+#include "frameTeam.h"
+
+CHedgehogerWidget::CHedgehogerWidget(const QImage& im, const QImage& img, QWidget * parent) :
+    ItemNum(im, img, parent, 1)
+{
+  // TODO: maxHedgehogsPerGame doesn't reset properly and won't match map limits for now
+  /*if(parent) {
+    pOurFrameTeams = dynamic_cast<FrameTeams*>(parent->parentWidget());
+  }
+  if(pOurFrameTeams->overallHedgehogs + 4 > pOurFrameTeams->maxHedgehogsPerGame) {
+    numItems = pOurFrameTeams->maxHedgehogsPerGame - pOurFrameTeams->overallHedgehogs;
+  } else numItems = 4;
+  pOurFrameTeams->overallHedgehogs += numItems;*/
+}
+
+void CHedgehogerWidget::incItems()
+{
+  //if (pOurFrameTeams->overallHedgehogs < pOurFrameTeams->maxHedgehogsPerGame) {
+    numItems++;
+    //pOurFrameTeams->overallHedgehogs++;
+    emit hedgehogsNumChanged();
+  //}
+}
+
+void CHedgehogerWidget::decItems()
+{
+  numItems--;
+  //pOurFrameTeams->overallHedgehogs--;
+  emit hedgehogsNumChanged();
+}
+
+CHedgehogerWidget::~CHedgehogerWidget()
+{
+  // TODO: not called?
+  //pOurFrameTeams->overallHedgehogs-=numItems;
+}
+
+void CHedgehogerWidget::setNonInteractive()
+{
+  nonInteractive=true;
+}
+
+void CHedgehogerWidget::setHHNum(unsigned int num)
+{
+  /*unsigned int diff = num - numItems;
+  numItems += diff;
+  pOurFrameTeams->overallHedgehogs += diff;*/
+  numItems = num;
+  repaint();
+}
+
+unsigned char CHedgehogerWidget::getHedgehogsNum() const
+{
+  return numItems;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/hedgehogerWidget.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,50 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2007 Ulyanov Igor <iulyanov@gmail.com>
+ * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef _HEDGEHOGER_WIDGET
+#define _HEDGEHOGER_WIDGET
+
+#include "itemNum.h"
+
+class FrameTeams;
+
+class CHedgehogerWidget : public ItemNum
+{
+  Q_OBJECT
+
+ public:
+  CHedgehogerWidget(const QImage& im, const QImage& img, QWidget * parent);
+  virtual ~CHedgehogerWidget();
+  unsigned char getHedgehogsNum() const;
+  void setHHNum (unsigned int num);
+  void setNonInteractive();
+
+ signals:
+  void hedgehogsNumChanged();
+
+ protected:
+  virtual void incItems();
+  virtual void decItems();
+
+ private:
+  CHedgehogerWidget();
+  FrameTeams* pOurFrameTeams;
+};
+
+#endif // _HEDGEHOGER_WIDGET
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/igbox.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,79 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QPainter>
+#include <QPoint>
+#include <QStylePainter>
+#include <QStyleOptionGroupBox>
+
+#include "igbox.h"
+
+IconedGroupBox::IconedGroupBox(QWidget * parent)
+    : QGroupBox(parent)
+{
+// Has issues with border-radius on children
+//    setAttribute(Qt::WA_PaintOnScreen, true);
+    titleLeftPadding = 49;
+    contentTopPadding = 15;
+}
+
+void IconedGroupBox::setIcon(const QIcon & icon)
+{
+    if (this->icon.isNull())
+        setStyleSheet(QString(
+            "IconedGroupBox{"
+                "margin-top: 46px;"
+                "margin-left: 12px;"
+                "padding: %1px 2px 5px 2px;"
+                "}"
+            "IconedGroupBox::title{"
+                "subcontrol-origin: margin;"
+                "subcontrol-position: top left;"
+                "padding-left: %2px;"
+                "padding-top: %1px;"
+                "text-align: left;"
+                "}"
+                ).arg(contentTopPadding).arg(titleLeftPadding)
+        );
+
+    this->icon = icon;
+    repaint();
+}
+
+void IconedGroupBox::paintEvent(QPaintEvent * event)
+{
+    Q_UNUSED(event);
+
+    QStylePainter painter(this);
+
+    QStyleOptionGroupBox option;
+    initStyleOption(&option);
+    painter.drawComplexControl(QStyle::CC_GroupBox, option);
+
+    icon.paint(&painter, QRect(QPoint(0, 0), icon.actualSize(size())));
+}
+
+void IconedGroupBox::setTitleTextPadding(int px)
+{
+    titleLeftPadding = px;
+}
+
+void IconedGroupBox::setContentTopPadding(int px)
+{
+    contentTopPadding = px;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/igbox.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,44 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef _IGBOX_H
+#define _IGBOX_H
+
+#include <QGroupBox>
+#include <QIcon>
+
+class IconedGroupBox : public QGroupBox
+{
+    Q_OBJECT
+
+public:
+    IconedGroupBox(QWidget * parent = 0);
+
+    void setIcon(const QIcon & icon);
+    void setTitleTextPadding(int px);
+    void setContentTopPadding(int px);
+protected:
+    virtual void paintEvent(QPaintEvent * event);
+
+private:
+    QIcon icon;
+    int titleLeftPadding;
+    int contentTopPadding;
+};
+
+#endif // _IGBOX_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/itemNum.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,114 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Igor Ulyanov <iulyanov@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include "itemNum.h"
+#include "hwform.h"
+
+#include <QMouseEvent>
+#include <QPainter>
+
+ItemNum::ItemNum(const QImage& im, const QImage& img, QWidget * parent, unsigned char min, unsigned char max) :
+  QFrame(parent), m_im(im), m_img(img), infinityState(false), nonInteractive(false), minItems(min), maxItems(max),
+  numItems(min+2 >= max ? min : min+2)
+{
+    enabled = true;
+    if(frontendEffects) setAttribute(Qt::WA_PaintOnScreen, true);
+}
+
+ItemNum::~ItemNum()
+{
+}
+
+void ItemNum::mousePressEvent ( QMouseEvent * event )
+{
+  if(nonInteractive) return;
+  if(event->button()==Qt::LeftButton && enabled) {
+    event->accept();
+    if((infinityState && numItems <= maxItems) || (!infinityState && numItems < maxItems)) {
+      incItems();
+    } else {
+      numItems = minItems+1;
+      // appears there's an emit in there
+      decItems();
+    }
+  } else if (event->button()==Qt::RightButton && enabled) {
+    event->accept();
+    if(numItems > minItems) {
+      decItems();
+    } else {
+      numItems = maxItems+(infinityState?0:-1);
+      incItems();
+    }
+  } else {
+    event->ignore();
+    return;
+  }
+  repaint();
+}
+
+QSize ItemNum::sizeHint () const
+{
+  return QSize((maxItems+1)*12, 32);
+}
+
+void ItemNum::paintEvent(QPaintEvent* event)
+{
+  Q_UNUSED(event);
+
+  QPainter painter(this);
+
+  if (numItems==maxItems+1) {
+    QRect target(0, 0, 100, 32);
+    if (enabled) {
+        painter.drawImage(target, QImage(":/res/infinity.png"));
+    } else {
+        painter.drawImage(target, QImage(":/res/infinitygrey.png"));
+    }
+  } else {
+    for(int i=0; i<numItems; i++) {
+      QRect target(11 * i, i % 2, 25, 35);
+      if (enabled) {
+        painter.drawImage(target, m_im);
+      } else {
+        painter.drawImage(target, m_img);
+      }
+    }
+  }
+}
+
+unsigned char ItemNum::getItemsNum() const
+{
+  return numItems;
+}
+
+void ItemNum::setItemsNum(const unsigned char num)
+{
+  numItems=num;
+  repaint();
+}
+
+void ItemNum::setInfinityState(bool value)
+{
+  infinityState=value;
+}
+
+void ItemNum::setEnabled(bool value)
+{
+  enabled=value;
+  repaint();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/itemNum.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,60 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2011 Igor Ulyanov <iulyanov@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QFrame>
+#include <QImage>
+
+#ifndef _ITEM_NUM_INCLUDED
+#define _ITEM_NUM_INCLUDED
+
+class ItemNum : public QFrame
+{
+  Q_OBJECT
+
+  public:
+    void setInfinityState(bool value);
+    void setEnabled(bool value);
+    unsigned char getItemsNum() const;
+    void setItemsNum(const unsigned char num);
+
+  private:
+    QImage m_im;
+    QImage m_img;
+    bool infinityState;
+    bool enabled;
+
+  protected:
+    ItemNum(const QImage& im, const QImage& img, QWidget * parent, unsigned char min=2, unsigned char max=8);
+    virtual QSize sizeHint () const;
+    virtual ~ItemNum()=0;
+
+    bool nonInteractive;
+    unsigned char minItems;
+    unsigned char maxItems;
+    unsigned char numItems;
+
+    // from QWidget
+    virtual void mousePressEvent ( QMouseEvent * event );
+    virtual void paintEvent(QPaintEvent* event);
+
+    // to be implemented in child
+    virtual void incItems()=0;
+    virtual void decItems()=0;
+};
+
+#endif // _ITEM_NUM_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/misc.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,19 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2005-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include "misc.h"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/misc.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,46 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2005-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef _MISC_H
+#define _MISC_H
+
+
+#include <QObject>
+#include <QSpinBox>
+
+class FreqSpinBox : public QSpinBox
+{
+    Q_OBJECT
+
+public:
+    FreqSpinBox(QWidget* parent) : QSpinBox(parent)
+    {
+
+    }
+
+    QString textFromValue(int value) const
+    {
+        if (!value)
+            return tr("Never");
+        else
+            return tr("Every %1 turn", "", value).arg(value);
+    }
+};
+
+
+#endif // _MISC_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/selectWeapon.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,294 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2008 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include "selectWeapon.h"
+#include "weaponItem.h"
+#include "hwconsts.h"
+
+#include <QPushButton>
+#include <QGridLayout>
+#include <QHBoxLayout>
+#include <QLabel>
+#include <QBitmap>
+#include <QLineEdit>
+#include <QSettings>
+#include <QMessageBox>
+#include <QTabWidget>
+#include <math.h>
+
+QImage getAmmoImage(int num)
+{
+    static QImage ammo(":Ammos.png");
+    int x = num/(ammo.height()/32);
+    int y = (num-((ammo.height()/32)*x))*32;
+    x*=32;
+    return ammo.copy(x, y, 32, 32);
+}
+
+SelWeaponItem::SelWeaponItem(bool allowInfinite, int iconNum, int wNum, QImage image, QImage imagegrey, QWidget* parent) :
+    QWidget(parent)
+{
+    QHBoxLayout* hbLayout = new QHBoxLayout(this);
+    hbLayout->setSpacing(1);
+    hbLayout->setMargin(1);
+
+    QLabel* lbl = new QLabel(this);
+    lbl->setPixmap(QPixmap::fromImage(getAmmoImage(iconNum)));
+    lbl->setMaximumWidth(30);
+    lbl->setGeometry(0, 0, 30, 30);
+    hbLayout->addWidget(lbl);
+
+    item = new WeaponItem(image, imagegrey, this);
+    item->setItemsNum(wNum);
+    item->setInfinityState(allowInfinite);
+    hbLayout->addWidget(item);
+
+    hbLayout->setStretchFactor(lbl, 1);
+    hbLayout->setStretchFactor(item, 99);
+    hbLayout->setAlignment(lbl, Qt::AlignLeft | Qt::AlignVCenter);
+    hbLayout->setAlignment(item, Qt::AlignLeft | Qt::AlignVCenter);
+}
+
+void SelWeaponItem::setItemsNum(const unsigned char num)
+{
+    item->setItemsNum(num);
+}
+
+unsigned char SelWeaponItem::getItemsNum() const
+{
+    return item->getItemsNum();
+}
+
+void SelWeaponItem::setEnabled(bool value)
+{
+    item->setEnabled(value);
+}
+
+SelWeaponWidget::SelWeaponWidget(int numItems, QWidget* parent) :
+  QFrame(parent),
+  m_numItems(numItems)
+{
+    wconf = new QSettings(cfgdir->absolutePath() + "/weapons.ini", QSettings::IniFormat, this);
+
+    for(int i = 0; i < cDefaultAmmos.size(); ++i)
+        wconf->setValue(cDefaultAmmos[i].first, cDefaultAmmos[i].second);
+
+    QStringList keys = wconf->allKeys();
+    for(int i = 0; i < keys.size(); i++)
+    {
+        if (wconf->value(keys[i]).toString().size() != cDefaultAmmoStore->size())
+            wconf->remove(keys[i]);
+    }
+
+    QString currentState = *cDefaultAmmoStore;
+
+    QTabWidget * tbw = new QTabWidget(this);
+    QWidget * page1 = new QWidget(this);
+    p1Layout = new QGridLayout(page1);
+    p1Layout->setSpacing(1);
+    p1Layout->setMargin(1);
+    QWidget * page2 = new QWidget(this);
+    p2Layout = new QGridLayout(page2);
+    p2Layout->setSpacing(1);
+    p2Layout->setMargin(1);
+    QWidget * page3 = new QWidget(this);
+    p3Layout = new QGridLayout(page3);
+    p3Layout->setSpacing(1);
+    p3Layout->setMargin(1);
+    QWidget * page4 = new QWidget(this);
+    p4Layout = new QGridLayout(page4);
+    p4Layout->setSpacing(1);
+    p4Layout->setMargin(1);
+
+    tbw->addTab(page1, tr("Weapon set"));
+    tbw->addTab(page2, tr("Probabilities"));
+    tbw->addTab(page4, tr("Ammo in boxes"));
+    tbw->addTab(page3, tr("Delays"));
+
+    QGridLayout * pageLayout = new QGridLayout(this);
+    pageLayout->addWidget(tbw);
+
+
+    int j = -1;
+    int i = 0, k = 0;
+    for(; i < m_numItems; ++i) {
+        if (i == 6) continue;
+        if (i == 52) continue; // Disable structures for now
+        if (k % 4 == 0) ++j;
+        SelWeaponItem * swi = new SelWeaponItem(true, i, currentState[i].digitValue(), QImage(":/res/ammopic.png"), QImage(":/res/ammopicgrey.png"), this);
+        weaponItems[i].append(swi);
+        p1Layout->addWidget(swi, j, k % 4);
+
+        SelWeaponItem * pwi = new SelWeaponItem(false, i, currentState[numItems + i].digitValue(), QImage(":/res/ammopicbox.png"), QImage(":/res/ammopicboxgrey.png"), this);
+        weaponItems[i].append(pwi);
+        p2Layout->addWidget(pwi, j, k % 4);
+
+        SelWeaponItem * dwi = new SelWeaponItem(false, i, currentState[numItems*2 + i].digitValue(), QImage(":/res/ammopicdelay.png"), QImage(":/res/ammopicdelaygrey.png"), this);
+        weaponItems[i].append(dwi);
+        p3Layout->addWidget(dwi, j, k % 4);
+
+        SelWeaponItem * awi = new SelWeaponItem(false, i, currentState[numItems*3 + i].digitValue(), QImage(":/res/ammopic.png"), QImage(":/res/ammopicgrey.png"), this);
+        weaponItems[i].append(awi);
+        p4Layout->addWidget(awi, j, k % 4);
+
+        ++k;
+    }
+
+    //pLayout->setRowStretch(5, 100);
+    m_name = new QLineEdit(this);
+    pageLayout->addWidget(m_name, i, 0, 1, 5);
+}
+
+void SelWeaponWidget::setWeapons(const QString& ammo)
+{
+    bool enable = true;
+    for(int i = 0; i < cDefaultAmmos.size(); i++)
+        if (!cDefaultAmmos[i].first.compare(m_name->text())) {
+            enable = false;
+        }
+    for(int i = 0; i < m_numItems; ++i) {
+        twi::iterator it = weaponItems.find(i);
+        if (it == weaponItems.end()) continue;
+        it.value()[0]->setItemsNum(ammo[i].digitValue());
+        it.value()[1]->setItemsNum(ammo[m_numItems + i].digitValue());
+        it.value()[2]->setItemsNum(ammo[m_numItems*2 + i].digitValue());
+        it.value()[3]->setItemsNum(ammo[m_numItems*3 + i].digitValue());
+        it.value()[0]->setEnabled(enable);
+        it.value()[1]->setEnabled(enable);
+        it.value()[2]->setEnabled(enable);
+        it.value()[3]->setEnabled(enable);
+    }
+    m_name->setEnabled(enable);
+}
+
+void SelWeaponWidget::setDefault()
+{
+    for(int i = 0; i < cDefaultAmmos.size(); i++)
+        if (!cDefaultAmmos[i].first.compare(m_name->text())) {
+            return;
+        }
+    setWeapons(*cDefaultAmmoStore);
+}
+
+void SelWeaponWidget::save()
+{
+    for(int i = 0; i < cDefaultAmmos.size(); i++)
+        if (!cDefaultAmmos[i].first.compare(m_name->text())) {
+            QMessageBox::warning(0, QMessageBox::tr("Weapons"), QMessageBox::tr("Can not overwrite default weapon set '%1'!").arg(cDefaultAmmos[i].first));
+            return;
+        }
+
+    if (m_name->text() == "") return;
+
+    QString state1;
+    QString state2;
+    QString state3;
+    QString state4;
+
+    for(int i = 0; i < m_numItems; ++i) {
+        twi::const_iterator it = weaponItems.find(i);
+        int num = it == weaponItems.end() ? 9 : it.value()[0]->getItemsNum(); // 9 is for 'skip turn'
+        state1.append(QString::number(num));
+        int prob = it == weaponItems.end() ? 0 : it.value()[1]->getItemsNum();
+        state2.append(QString::number(prob));
+        int del = it == weaponItems.end() ? 0 : it.value()[2]->getItemsNum();
+        state3.append(QString::number(del));
+        int am = it == weaponItems.end() ? 0 : it.value()[3]->getItemsNum();
+        state4.append(QString::number(am));
+    }
+    if (curWeaponsName != "") {
+        // remove old entry
+        wconf->remove(curWeaponsName);
+    }
+    wconf->setValue(m_name->text(), state1 + state2 + state3 + state4);
+    emit weaponsChanged();
+}
+
+int SelWeaponWidget::operator [] (unsigned int weaponIndex) const
+{
+    twi::const_iterator it = weaponItems.find(weaponIndex);
+    return it == weaponItems.end() ? 9 : it.value()[0]->getItemsNum();
+}
+
+QString SelWeaponWidget::getWeaponsString(const QString& name) const
+{
+    return wconf->value(name).toString();
+}
+
+void SelWeaponWidget::deleteWeaponsName()
+{
+    if (curWeaponsName == "") return;
+
+    for(int i = 0; i < cDefaultAmmos.size(); i++)
+        if (!cDefaultAmmos[i].first.compare(m_name->text())) {
+            QMessageBox::warning(0, QMessageBox::tr("Weapons"), QMessageBox::tr("Can not delete default weapon set '%1'!").arg(cDefaultAmmos[i].first));
+            return;
+        }
+
+    QMessageBox reallyDelete(QMessageBox::Question, QMessageBox::tr("Weapons"), QMessageBox::tr("Really delete this weapon set?"), QMessageBox::Ok | QMessageBox::Cancel);
+
+    if (reallyDelete.exec() == QMessageBox::Ok) {
+        wconf->remove(curWeaponsName);
+        emit weaponsDeleted();
+    }
+}
+
+void SelWeaponWidget::newWeaponsName()
+{
+    QString newName = tr("new");
+    if(wconf->contains(newName)) {
+        //name already used -> look for an appropriate name:
+        int i=2;
+        while(wconf->contains(newName = tr("new")+QString::number(i++)));
+    }
+    setWeaponsName(newName);
+}
+
+void SelWeaponWidget::setWeaponsName(const QString& name)
+{
+    m_name->setText(name);
+
+    curWeaponsName = name;
+
+    if(name != "" && wconf->contains(name)) {
+        setWeapons(wconf->value(name).toString());
+    } else {
+        setWeapons(*cDefaultAmmoStore);
+    }
+}
+
+QStringList SelWeaponWidget::getWeaponNames() const
+{
+    return wconf->allKeys();
+}
+
+void SelWeaponWidget::copy()
+{
+    if(wconf->contains(curWeaponsName)) {
+        QString ammo = getWeaponsString(curWeaponsName);
+        QString newName = tr("copy of") + " " + curWeaponsName;
+        if(wconf->contains(newName)) {
+            //name already used -> look for an appropriate name:
+            int i=2;
+            while(wconf->contains(newName = tr("copy of") + " " + curWeaponsName+QString::number(i++)));
+        }
+        setWeaponsName(newName);
+        setWeapons(ammo);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/selectWeapon.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,92 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2008 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef _SELECT_WEAPON_INCLUDED
+#define _SELECT_WEAPON_INCLUDED
+
+#include <QFrame>
+#include <QMap>
+#include <QList>
+
+class QGridLayout;
+class WeaponItem;
+class QLineEdit;
+class QSettings;
+
+class SelWeaponItem : public QWidget
+{
+  Q_OBJECT
+
+public:
+  SelWeaponItem(bool allowInfinite, int iconNum, int wNum, QImage image, QImage imagegrey, QWidget* parent=0);
+
+  unsigned char getItemsNum() const;
+  void setItemsNum(const unsigned char num);
+  void setEnabled(bool value);
+
+ private:
+  WeaponItem* item;
+};
+
+class SelWeaponWidget : public QFrame
+{
+  Q_OBJECT
+
+ public:
+  SelWeaponWidget(int numItems, QWidget* parent=0);
+  QString getWeaponsString(const QString& name) const;
+  QStringList getWeaponNames() const;
+
+ public slots:
+  void setDefault();
+  void setWeapons(const QString& ammo);
+  //sets the name of the current set
+  void setWeaponsName(const QString& name);
+  void deleteWeaponsName();
+  void newWeaponsName();
+  void save();
+  void copy();
+
+ signals:
+  void weaponsChanged();
+  void weaponsDeleted();
+
+ private:
+  //the name of the current weapon set
+  QString curWeaponsName;
+
+  QLineEdit* m_name;
+
+  //storage for all the weapons sets
+  QSettings* wconf;
+
+  const int m_numItems;
+  int operator [] (unsigned int weaponIndex) const;
+
+  typedef QList<SelWeaponItem*> ItemsList;
+  typedef QMap<int, ItemsList> twi;
+  twi weaponItems;
+  //layout element for each tab:
+  QGridLayout* p1Layout;
+  QGridLayout* p2Layout;
+  QGridLayout* p3Layout;
+  QGridLayout* p4Layout;
+};
+
+#endif // _SELECT_WEAPON_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/teamselect.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,281 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2007 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <algorithm>
+
+#include <QLabel>
+#include <QPixmap>
+#include <QPushButton>
+#include <QFrame>
+#include <QDebug>
+
+#include "vertScrollArea.h"
+#include "teamselect.h"
+#include "teamselhelper.h"
+#include "frameTeam.h"
+
+void TeamSelWidget::addTeam(HWTeam team)
+{
+  if(team.isNetTeam()) {
+    framePlaying->addTeam(team, true);
+    curPlayingTeams.push_back(team);
+    connect(framePlaying->getTeamWidget(team), SIGNAL(teamStatusChanged(HWTeam)),
+             this, SLOT(netTeamStatusChanged(const HWTeam&)));
+    connect(framePlaying->getTeamWidget(team), SIGNAL(hhNmChanged(const HWTeam&)),
+                this, SLOT(hhNumChanged(const HWTeam&)));
+    dynamic_cast<TeamShowWidget*>(framePlaying->getTeamWidget(team))->hhNumChanged();
+    connect(framePlaying->getTeamWidget(team), SIGNAL(teamColorChanged(const HWTeam&)),
+                this, SLOT(proxyTeamColorChanged(const HWTeam&)));
+  } else {
+    frameDontPlaying->addTeam(team, false);
+    m_curNotPlayingTeams.push_back(team);
+    if(m_acceptOuter) {
+      connect(frameDontPlaying->getTeamWidget(team), SIGNAL(teamStatusChanged(HWTeam)),
+          this, SLOT(pre_changeTeamStatus(HWTeam)));
+    } else {
+      connect(frameDontPlaying->getTeamWidget(team), SIGNAL(teamStatusChanged(HWTeam)),
+          this, SLOT(changeTeamStatus(HWTeam)));
+    }
+  }
+  emit setEnabledGameStart(curPlayingTeams.size()>1);
+}
+
+void TeamSelWidget::setInteractivity(bool interactive)
+{
+    framePlaying->setInteractivity(interactive);
+}
+
+void TeamSelWidget::hhNumChanged(const HWTeam& team)
+{
+    QList<HWTeam>::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team);
+    if(itPlay==curPlayingTeams.end())
+    {
+        qWarning() << QString("hhNumChanged: team '%1' not found").arg(team.name());
+        return;
+    }
+    itPlay->setNumHedgehogs(team.numHedgehogs());
+    emit hhogsNumChanged(team);
+}
+
+void TeamSelWidget::proxyTeamColorChanged(const HWTeam& team)
+{
+    QList<HWTeam>::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team);
+    if(itPlay==curPlayingTeams.end())
+    {
+        qWarning() << QString("proxyTeamColorChanged: team '%1' not found").arg(team.name());
+        return;
+    }
+    itPlay->setColor(team.color());
+    emit teamColorChanged(team);
+}
+
+void TeamSelWidget::changeHHNum(const HWTeam& team)
+{
+  QList<HWTeam>::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team);
+    if(itPlay==curPlayingTeams.end())
+    {
+        qWarning() << QString("changeHHNum: team '%1' not found").arg(team.name());
+        return;
+    }
+  itPlay->setNumHedgehogs(team.numHedgehogs());
+
+  framePlaying->setHHNum(team);
+}
+
+void TeamSelWidget::changeTeamColor(const HWTeam& team)
+{
+    QList<HWTeam>::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team);
+    if(itPlay==curPlayingTeams.end())
+    {
+        qWarning() << QString("changeTeamColor: team '%1' not found").arg(team.name());
+        return;
+    }
+    itPlay->setColor(team.color());
+
+    framePlaying->setTeamColor(team);
+}
+
+void TeamSelWidget::removeNetTeam(const HWTeam& team)
+{
+    //qDebug() << QString("removeNetTeam: removing team '%1'").arg(team.TeamName);
+    for(;;) {
+        QList<HWTeam>::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team);
+        if(itPlay==curPlayingTeams.end())
+        {
+            qWarning() << QString("removeNetTeam: team '%1' not found").arg(team.name());
+            break;
+        }
+        if(itPlay->isNetTeam()) {
+            QObject::disconnect(framePlaying->getTeamWidget(*itPlay), SIGNAL(teamStatusChanged(HWTeam)));
+            framePlaying->removeTeam(team);
+            curPlayingTeams.erase(itPlay);
+            break;
+        }
+    }
+    emit setEnabledGameStart(curPlayingTeams.size()>1);
+}
+
+void TeamSelWidget::netTeamStatusChanged(const HWTeam& team)
+{
+  QList<HWTeam>::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team);
+
+}
+
+//void TeamSelWidget::removeTeam(__attribute__ ((unused)) HWTeam team)
+//{
+  //curDontPlayingTeams.erase(std::find(curDontPlayingTeams.begin(), curDontPlayingTeams.end(), team));
+//}
+
+void TeamSelWidget::changeTeamStatus(HWTeam team)
+{
+  QList<HWTeam>::iterator itDontPlay=std::find(m_curNotPlayingTeams.begin(), m_curNotPlayingTeams.end(), team);
+  QList<HWTeam>::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team);
+
+  bool willBePlaying=itDontPlay!=m_curNotPlayingTeams.end();
+
+  if(!willBePlaying) {
+    // playing team => dont playing
+    m_curNotPlayingTeams.push_back(*itPlay);
+    emit teamNotPlaying(*itPlay);
+    curPlayingTeams.erase(itPlay);
+  } else {
+    // return if max playing teams reached
+    if(framePlaying->isFullTeams()) return;
+    // dont playing team => playing
+    team=*itDontPlay; // for net team info saving in framePlaying (we have only name with netID from network)
+    itDontPlay->setColor(framePlaying->getNextColor());
+    curPlayingTeams.push_back(*itDontPlay);
+    if(!m_acceptOuter) emit teamWillPlay(*itDontPlay);
+    m_curNotPlayingTeams.erase(itDontPlay);
+  }
+
+  FrameTeams* pRemoveTeams;
+  FrameTeams* pAddTeams;
+  if(!willBePlaying) {
+    pRemoveTeams=framePlaying;
+    pAddTeams=frameDontPlaying;
+  } else {
+    pRemoveTeams=frameDontPlaying;
+    pAddTeams=framePlaying;
+  }
+
+  pAddTeams->addTeam(team, willBePlaying);
+  pRemoveTeams->removeTeam(team);
+  if(!team.isNetTeam() && m_acceptOuter && !willBePlaying) {
+    connect(frameDontPlaying->getTeamWidget(team), SIGNAL(teamStatusChanged(HWTeam)),
+        this, SLOT(pre_changeTeamStatus(HWTeam)));
+  } else {
+    connect(pAddTeams->getTeamWidget(team), SIGNAL(teamStatusChanged(HWTeam)),
+        this, SLOT(changeTeamStatus(HWTeam)));
+  }
+  if(willBePlaying) {
+    connect(framePlaying->getTeamWidget(team), SIGNAL(hhNmChanged(const HWTeam&)),
+        this, SLOT(hhNumChanged(const HWTeam&)));
+    dynamic_cast<TeamShowWidget*>(framePlaying->getTeamWidget(team))->hhNumChanged();
+    connect(framePlaying->getTeamWidget(team), SIGNAL(teamColorChanged(const HWTeam&)),
+        this, SLOT(proxyTeamColorChanged(const HWTeam&)));
+    emit teamColorChanged(((TeamShowWidget*)framePlaying->getTeamWidget(team))->getTeam());
+  }
+
+  QSize szh=pAddTeams->sizeHint();
+  QSize szh1=pRemoveTeams->sizeHint();
+  if(szh.isValid() && szh1.isValid()) {
+    pAddTeams->resize(pAddTeams->size().width(), szh.height());
+    pRemoveTeams->resize(pRemoveTeams->size().width(), szh1.height());
+  }
+
+  emit setEnabledGameStart(curPlayingTeams.size()>1);
+}
+
+void TeamSelWidget::addScrArea(FrameTeams* pfteams, QColor color, int fixedHeight)
+{
+    VertScrArea* area = new VertScrArea(color);
+    area->setWidget(pfteams);
+    mainLayout.addWidget(area, 30);
+    if (fixedHeight > 0)
+    {
+        area->setMinimumHeight(fixedHeight);
+        area->setMaximumHeight(fixedHeight);
+        area->setStyleSheet(
+                "FrameTeams{"
+                    "border: solid;"
+                    "border-width: 1px;"
+                    "border-radius: 16px;"
+                    "border-color: #ffcc00;"
+                    "}"
+        );
+    }
+}
+
+TeamSelWidget::TeamSelWidget(QWidget* parent) :
+  QGroupBox(parent), mainLayout(this), m_acceptOuter(false)
+{
+    setTitle(QGroupBox::tr("Playing teams"));
+    framePlaying = new FrameTeams();
+    frameDontPlaying = new FrameTeams();
+
+    QPalette p;
+    p.setColor(QPalette::Window, QColor(0x00, 0x00, 0x00));
+    addScrArea(framePlaying, p.color(QPalette::Window).light(105), 250);
+    addScrArea(frameDontPlaying, p.color(QPalette::Window).dark(105), 0);
+}
+
+void TeamSelWidget::setAcceptOuter(bool acceptOuter)
+{
+  m_acceptOuter=acceptOuter;
+}
+
+void TeamSelWidget::resetPlayingTeams(const QList<HWTeam>& teamslist)
+{
+  //for(it=curPlayingTeams.begin(); it!=curPlayingTeams.end(); it++) {
+  //framePlaying->removeTeam(*it);
+  //}
+  framePlaying->resetTeams();
+  framePlaying->resetColors();
+  curPlayingTeams.clear();
+  //for(it=curDontPlayingTeams.begin(); it!=curDontPlayingTeams.end(); it++) {
+  //frameDontPlaying->removeTeam(*it);
+  //}
+  frameDontPlaying->resetTeams();
+  m_curNotPlayingTeams.clear();
+
+  foreach(HWTeam team, teamslist)
+    addTeam(team);
+}
+
+bool TeamSelWidget::isPlaying(HWTeam team) const
+{
+  return std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team)!=curPlayingTeams.end();
+}
+
+QList<HWTeam> TeamSelWidget::getPlayingTeams() const
+{
+  return curPlayingTeams;
+}
+
+QList<HWTeam> TeamSelWidget::getNotPlayingTeams() const
+{
+  return m_curNotPlayingTeams;
+}
+
+void TeamSelWidget::pre_changeTeamStatus(HWTeam team)
+{
+  team.setColor(framePlaying->getNextColor());
+  emit acceptRequested(team);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/teamselect.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,83 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2007 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef _TEAM_SELECT_INCLUDED
+#define _TEAM_SELECT_INCLUDED
+
+#include <QGroupBox>
+#include <QVBoxLayout>
+#include <QColor>
+#include <QMultiMap>
+
+#include "team.h"
+
+class TeamSelWidget;
+class FrameTeams;
+class QFrame;
+class QPushButton;
+
+using namespace std;
+
+class TeamSelWidget : public QGroupBox
+{
+  Q_OBJECT
+
+ public:
+  TeamSelWidget(QWidget* parent);
+  void setAcceptOuter(bool acceptOuter);
+  void removeNetTeam(const HWTeam& team);
+  void resetPlayingTeams(const QList<HWTeam>& teamslist);
+  bool isPlaying(HWTeam team) const;
+  QList<HWTeam> getPlayingTeams() const;
+  QList<HWTeam> getNotPlayingTeams() const;
+  void setInteractivity(bool interactive);
+
+ public slots:
+  void addTeam(HWTeam team);
+  void netTeamStatusChanged(const HWTeam& team);
+  void changeHHNum(const HWTeam&);
+  void changeTeamColor(const HWTeam&);
+  void changeTeamStatus(HWTeam team);
+
+ signals:
+  void setEnabledGameStart(bool);
+  void teamWillPlay(HWTeam team);
+  void teamNotPlaying(const HWTeam& team);
+  void hhogsNumChanged(const HWTeam&);
+  void teamColorChanged(const HWTeam&);
+  void acceptRequested(HWTeam team);
+
+ private slots:
+  void pre_changeTeamStatus(HWTeam);
+  void hhNumChanged(const HWTeam& team);
+  void proxyTeamColorChanged(const HWTeam& team);
+
+ private:
+  void addScrArea(FrameTeams* pfteams, QColor color, int maxHeight);
+  FrameTeams* frameDontPlaying;
+  FrameTeams* framePlaying;
+
+  QVBoxLayout mainLayout;
+  bool m_acceptOuter;
+
+  QList<HWTeam> curPlayingTeams;
+  QList<HWTeam> m_curNotPlayingTeams;
+};
+
+#endif // _TEAM_SELECT_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/teamselhelper.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,154 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2007 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QPixmap>
+#include <QPainter>
+#include <QStyleFactory>
+
+#include <algorithm>
+
+#include "teamselhelper.h"
+#include "hwconsts.h"
+#include "frameTeam.h"
+
+void TeamLabel::teamButtonClicked()
+{
+  emit teamActivated(text());
+}
+
+TeamShowWidget::TeamShowWidget(HWTeam team, bool isPlaying, QWidget * parent) :
+  QWidget(parent), mainLayout(this), m_team(team), m_isPlaying(isPlaying), phhoger(0),
+  colorButt(0)
+{
+    QPalette newPalette = palette();
+    newPalette.setColor(QPalette::Window, QColor(0x00, 0x00, 0x00));
+    setPalette(newPalette);
+    setAutoFillBackground(true);
+
+    mainLayout.setSpacing(3);
+    mainLayout.setMargin(0);
+    this->setMaximumHeight(38);
+    this->setMinimumHeight(38);
+    QIcon difficultyIcon=team.isNetTeam() ?
+        QIcon(QString(":/res/botlevels/net%1.png").arg(m_team.difficulty()))
+        : QIcon(QString(":/res/botlevels/%1.png").arg(m_team.difficulty()));
+
+    butt = new QPushButton(difficultyIcon, team.name().replace("&","&&"), this);
+    butt->setFlat(true);
+    butt->setToolTip(team.owner());
+    mainLayout.addWidget(butt);
+    butt->setStyleSheet("QPushButton{"
+            "icon-size: 48px;"
+            "text-align: left;"
+            "background-color: #0d0544;"
+            "color: orange;"
+            "font: bold;"
+            "border-width: 2px;"
+            "margin: 6px 0px 6px 0px;"
+            "}");
+
+    if(m_isPlaying) {
+        // team color
+        colorButt = new QPushButton(this);
+        colorButt->setMaximumWidth(26);
+        colorButt->setMinimumHeight(26);
+        colorButt->setGeometry(0, 0, 26, 26);
+
+        changeTeamColor();
+        connect(colorButt, SIGNAL(clicked()), this, SLOT(changeTeamColor()));
+        mainLayout.addWidget(colorButt);
+
+        phhoger = new CHedgehogerWidget(QImage(":/res/hh25x25.png"), QImage(":/res/hh25x25grey.png"), this);
+        connect(phhoger, SIGNAL(hedgehogsNumChanged()), this, SLOT(hhNumChanged()));
+        phhoger->setHHNum(team.numHedgehogs());
+        mainLayout.addWidget(phhoger);
+    } else {
+    }
+
+    QObject::connect(butt, SIGNAL(clicked()), this, SLOT(activateTeam()));
+    //QObject::connect(bText, SIGNAL(clicked()), this, SLOT(activateTeam()));
+}
+
+void TeamShowWidget::setInteractivity(bool interactive)
+{
+    if(m_team.isNetTeam()) {
+        butt->setEnabled(interactive);
+    }
+
+    colorButt->setEnabled(interactive);
+    phhoger->setEnabled(interactive);
+}
+
+void TeamShowWidget::setHHNum(unsigned int num)
+{
+  phhoger->setHHNum(num);
+}
+
+void TeamShowWidget::hhNumChanged()
+{
+  m_team.setNumHedgehogs(phhoger->getHedgehogsNum());
+  emit hhNmChanged(m_team);
+}
+
+void TeamShowWidget::activateTeam()
+{
+  emit teamStatusChanged(m_team);
+}
+
+/*HWTeamTempParams TeamShowWidget::getTeamParams() const
+{
+  if(!phhoger) throw;
+  HWTeamTempParams params;
+  params.numHedgehogs=phhoger->getHedgehogsNum();
+  params.teamColor=colorButt->palette().color(QPalette::Button);
+  return params;
+}*/
+
+void TeamShowWidget::changeTeamColor(QColor color)
+{
+    FrameTeams* pOurFrameTeams=dynamic_cast<FrameTeams*>(parentWidget());
+    if(!color.isValid()) {
+        if(++pOurFrameTeams->currentColor==pOurFrameTeams->availableColors.end()) {
+            pOurFrameTeams->currentColor=pOurFrameTeams->availableColors.begin();
+        }
+        color=*pOurFrameTeams->currentColor;
+    } else {
+        // set according color iterator
+        pOurFrameTeams->currentColor=std::find(pOurFrameTeams->availableColors.begin(),
+                pOurFrameTeams->availableColors.end(), color);
+        if(pOurFrameTeams->currentColor==pOurFrameTeams->availableColors.end()) {
+            // error condition
+            pOurFrameTeams->currentColor=pOurFrameTeams->availableColors.begin();
+        }
+    }
+
+    colorButt->setStyleSheet(QString("QPushButton{"
+            "background-color: %1;"
+            "border-width: 1px;"
+            "border-radius: 2px;"
+            "}").arg(pOurFrameTeams->currentColor->name()));
+
+    m_team.setColor(color);
+    emit teamColorChanged(m_team);
+}
+
+HWTeam TeamShowWidget::getTeam() const
+{
+  return m_team;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/teamselhelper.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,80 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2007 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2007-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef _TEAMSEL_HELPER_INCLUDED
+#define _TEAMSEL_HELPER_INCLUDED
+
+#include <QLabel>
+#include <QWidget>
+#include <QString>
+#include <QPushButton>
+
+#include "teamselect.h"
+#include "hedgehogerWidget.h"
+
+class TeamLabel : public QLabel
+{
+ Q_OBJECT
+
+ public:
+ TeamLabel(const QString& inp_str) : QLabel(inp_str) {};
+
+ signals:
+ void teamActivated(QString team_name);
+
+ public slots:
+ void teamButtonClicked();
+
+};
+
+class TeamShowWidget : public QWidget
+{
+ Q_OBJECT
+
+ public slots:
+ void changeTeamColor(QColor color=QColor());
+ void hhNumChanged();
+
+ private slots:
+ void activateTeam();
+
+ public:
+ TeamShowWidget(HWTeam team, bool isPlaying, QWidget * parent);
+ void setPlaying(bool isPlaying);
+ void setHHNum(unsigned int num);
+ void setInteractivity(bool interactive);
+ HWTeam getTeam() const;
+
+ private:
+ TeamShowWidget();
+ QHBoxLayout mainLayout;
+ HWTeam m_team;
+ bool m_isPlaying;
+ CHedgehogerWidget* phhoger;
+ QPushButton* colorButt;
+ QPushButton* butt;
+// QPushButton* bText;
+
+ signals:
+ void teamStatusChanged(HWTeam team);
+ void hhNmChanged(const HWTeam&);
+ void teamColorChanged(const HWTeam&);
+};
+
+#endif // _TEAMSEL_HELPER_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/togglebutton.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,52 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2009 Kristian Lehmann <email@thexception.net>
+ * Copyright (c) 2009-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include "togglebutton.h"
+
+ToggleButtonWidget::ToggleButtonWidget(QWidget * parent, QString img)
+    : QPushButton(parent)
+{
+    setCheckable(true);
+
+    QPixmap pm(":/res/btnDisabled.png");
+    QPainter * painter = new QPainter();
+
+    pmChecked.load(img);
+    pmDisabled.load(img);
+
+    setMaximumWidth(pmChecked.width() + 6);
+
+    painter->begin(&pmDisabled);
+    painter->drawPixmap(pmDisabled.rect(), pm);
+    painter->end();
+
+    setIconSize(pmDisabled.size());
+    setIcon(pmDisabled);
+
+    connect(this, SIGNAL(toggled(bool)), this, SLOT(eventToggled(bool)));
+}
+
+ToggleButtonWidget::~ToggleButtonWidget()
+{
+}
+
+void ToggleButtonWidget::eventToggled(bool checked)
+{
+    setIcon(checked ? pmChecked : pmDisabled);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/togglebutton.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,42 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2009 Kristian Lehmann <email@thexception.net>
+ * Copyright (c) 2009-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef TOGGLEBUTTONWIDGET_H
+#define TOGGLEBUTTONWIDGET_H
+
+#include <QWidget>
+#include <QPainter>
+#include <QPushButton>
+#include <QVBoxLayout>
+#include <QLabel>
+
+class ToggleButtonWidget : public QPushButton
+{
+    Q_OBJECT
+public:
+    ToggleButtonWidget(QWidget * parent, QString img);
+    ~ToggleButtonWidget();
+private:
+    QPixmap pmChecked;
+    QPixmap pmDisabled;
+private slots:
+    void eventToggled(bool checked);
+};
+
+#endif // TOGGLEBUTTONWIDGET_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/vertScrollArea.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,35 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include "vertScrollArea.h"
+
+#include <QResizeEvent>
+
+VertScrArea::VertScrArea(QColor frameColor, QWidget * parent) :
+  QScrollArea(parent)
+{
+    QPalette newPalette = palette();
+    newPalette.setColor(QPalette::Background, frameColor);
+    setPalette(newPalette);
+}
+
+void VertScrArea::resizeEvent(QResizeEvent * event)
+{
+    widget()->resize(event->size().width(), widget()->sizeHint().height());
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/vertScrollArea.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,36 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef _VERT_SCROLL_AREA_INCLUDED
+#define _VERT_SCROLL_AREA_INCLUDED
+
+#include <QScrollArea>
+
+class VertScrArea : public QScrollArea
+{
+    Q_OBJECT
+
+public:
+    VertScrArea(QColor frameColor, QWidget * parent = 0);
+
+protected:
+    virtual void resizeEvent(QResizeEvent * event);
+};
+
+#endif // _VERT_SCROLL_AREA_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/weaponItem.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,40 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2008 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include "weaponItem.h"
+
+WeaponItem::WeaponItem(const QImage& im, const QImage& img, QWidget * parent) :
+  ItemNum(im, img, parent, 0)
+{
+}
+
+WeaponItem::~WeaponItem()
+{
+}
+
+void WeaponItem::incItems()
+{
+  ++numItems;
+}
+
+void WeaponItem::decItems()
+{
+  --numItems;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/widget/weaponItem.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,44 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2006-2008 Igor Ulyanov <iulyanov@gmail.com>
+ * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef _WEAPON_ITEM
+#define _WEAPON_ITEM
+
+#include "itemNum.h"
+
+class WeaponItem : public ItemNum
+{
+  Q_OBJECT
+
+ public:
+  WeaponItem(const QImage& im, const QImage& img, QWidget * parent);
+  virtual ~WeaponItem();
+
+ signals:
+  void hedgehogsNumChanged();
+
+ protected:
+  virtual void incItems();
+  virtual void decItems();
+
+ private:
+  WeaponItem();
+};
+
+#endif // _WEAPON_ITEM
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/util/namegen.cpp	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,285 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2009 Martin Minarik <ttsmj@pokec.sk>
+ * Copyright (c) 2009-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <QFile>
+#include <QTextStream>
+#include <QStringList>
+#include <QLineEdit>
+#include "namegen.h"
+#include "hwform.h"
+#include "hwconsts.h"
+
+
+HWNamegen::HWNamegen() {}
+
+QList<QStringList> HWNamegen::TypesTeamnames;
+QList<QStringList> HWNamegen::TypesHatnames;
+bool HWNamegen::typesAvailable = false;
+
+
+void HWNamegen::teamRandomNames(HWTeam & team, const bool changeteamname)
+{
+    // load types if not already loaded
+    if (!typesAvailable)
+        if (!loadTypes())
+            return; // abort if loading failed
+
+    // abort if there are no hat types
+    if (TypesHatnames.size() <= 0)
+        return;
+
+    // the hat will influence which names the hogs get
+    int kind = (rand()%(TypesHatnames.size()));
+
+    // pick team name based on hat
+    if (changeteamname)
+    {
+        if (TypesTeamnames[kind].size() > 0)
+            team.setName(TypesTeamnames[kind][rand()%(TypesTeamnames[kind].size())]);
+
+        team.setGrave(getRandomGrave());
+        team.setFort(getRandomFort());
+        team.setVoicepack("Default");
+    }
+
+    QStringList dicts;
+    QStringList dict;
+
+    if ((TypesHatnames[kind].size()) <= 0)
+    {
+        dicts = dictsForHat(team.hedgehog(0).Hat);
+        dict  = dictContents(dicts[rand()%(dicts.size())]);
+    }
+
+    for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++)
+    {
+        if ((TypesHatnames[kind].size()) > 0)
+        {
+            HWHog hh = team.hedgehog(i);
+            hh.Hat = TypesHatnames[kind][rand()%(TypesHatnames[kind].size())];
+            team.setHedgehog(i,hh);
+        }
+
+        // there is a chance that this hog has the same hat as the previous one
+        // let's reuse the hat-specific dict in this case
+        if ((i == 0) or (team.hedgehog(i).Hat != team.hedgehog(i-1).Hat))
+        {
+            dicts = dictsForHat(team.hedgehog(i).Hat);
+            dict  = dictContents(dicts[rand()%(dicts.size())]);
+        }
+
+        // give each hedgehog a random name
+        HWNamegen::teamRandomName(team,i,dict);
+    }
+
+}
+
+void HWNamegen::teamRandomName(HWTeam & team, const int HedgehogNumber)
+{
+    QStringList dicts = dictsForHat(team.hedgehog(HedgehogNumber).Hat);
+
+    QStringList dict = dictContents(dicts[rand()%(dicts.size())]);
+
+    teamRandomName(team, HedgehogNumber, dict);
+}
+
+void HWNamegen::teamRandomName(HWTeam & team, const int HedgehogNumber, const QStringList & dict)
+{
+    QStringList namesDict = dict;
+
+    for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++)
+    {
+        namesDict.removeOne(team.hedgehog(i).Name);
+    }
+
+    // if our dict doesn't have any new names we'll have to use duplicates
+    if (namesDict.size() < 1)
+        namesDict = dict;
+
+    HWHog hh = team.hedgehog(HedgehogNumber);
+
+    hh.Name = namesDict[rand()%(namesDict.size())];
+
+    team.setHedgehog(HedgehogNumber, hh);
+}
+
+QStringList HWNamegen::dictContents(const QString filename)
+{
+    QStringList list;
+
+    QFile file;
+
+    // find .cfg to load the names from
+    file.setFileName(QString("%1/Data/Names/%2.txt").arg(cfgdir->absolutePath()).arg(filename));
+    if (!file.exists())
+        file.setFileName(QString("%1/Names/%2.txt").arg(datadir->absolutePath()).arg(filename));
+
+    if (file.open(QIODevice::ReadOnly | QIODevice::Text))
+    {
+
+        QTextStream in(&file);
+        while (!in.atEnd())
+        {
+            QString line = in.readLine();
+            if(!line.isEmpty())
+                list.append(line);
+        }
+    }
+
+    if (list.size() == 0)
+         list.append(filename);
+
+    return list;
+}
+
+
+QStringList HWNamegen::dictsForHat(const QString hatname)
+{
+    QStringList list;
+
+    QFile file;
+
+    // find .cfg to load the names from
+    file.setFileName(QString("%1/Data/Names/%2.cfg").arg(cfgdir->absolutePath()).arg(hatname));
+    if (!file.exists())
+        file.setFileName(QString("%1/Names/%2.cfg").arg(datadir->absolutePath()).arg(hatname));
+
+
+    if (file.open(QIODevice::ReadOnly | QIODevice::Text))
+    {
+        QTextStream in(&file);
+        while (!in.atEnd())
+        {
+            QString line = in.readLine();
+            if(!line.isEmpty())
+                list.append(line);
+        }
+    }
+
+    if (list.size() == 0)
+         list.append(QString("generic"));
+
+    return list;
+}
+
+// loades types from ini files. returns true on success.
+bool HWNamegen::loadTypes()
+{
+    QFile file;
+
+    // find .cfg to load the names from
+    file.setFileName(QString("%1/Data/Names/types.ini").arg(cfgdir->absolutePath()));
+    if (!file.exists())
+        file.setFileName(QString("%1/Names/types.ini").arg(datadir->absolutePath()));
+
+
+    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
+        return false;
+
+    int counter = 0; //counter starts with 0 (teamnames mode)
+    TypesTeamnames.append(QStringList());
+    TypesHatnames.append(QStringList());
+
+    QTextStream in(&file);
+    while (!in.atEnd())
+    {
+        QString line = in.readLine();
+        if (line == QString("#####"))
+        {
+            counter++; //toggle mode (teamnames || hats)
+            if ((counter%2) == 0)
+            {
+                TypesTeamnames.append(QStringList());
+                TypesHatnames.append(QStringList());
+            }
+        }
+        else if ((line == QString("*****")) || (line == QString("*END*")))
+        {
+            typesAvailable = true;
+            return true; // bye bye
+        }
+        else
+        {
+            if ((counter%2) == 0)
+            {
+                // even => teamnames mode
+                TypesTeamnames[(counter/2)].append(line);
+            }
+            else
+            {
+                // odd => hats mode
+                TypesHatnames[((counter-1)/2)].append(line);
+            }
+        }
+    }
+
+    typesAvailable = true;
+    return true;
+}
+
+
+
+QString HWNamegen::getRandomGrave()
+{
+    QStringList Graves;
+
+    //list all available Graves
+    QDir tmpdir;
+    tmpdir.cd(cfgdir->absolutePath());
+    tmpdir.cd("Data/Graphics/Graves");
+    tmpdir.setFilter(QDir::Files);
+    Graves.append(tmpdir.entryList(QStringList("*.png")).replaceInStrings(QRegExp("^(.*)\\.png"), "\\1"));
+
+    tmpdir.cd(datadir->absolutePath());
+    tmpdir.cd("Graphics/Graves");
+    tmpdir.setFilter(QDir::Files);
+    QStringList tmpList = tmpdir.entryList(QStringList("*.png")).replaceInStrings(QRegExp("^(.*)\\.png"), "\\1");
+    for (QStringList::Iterator it = tmpList.begin(); it != tmpList.end(); ++it) 
+        if (!Graves.contains(*it,Qt::CaseInsensitive)) Graves.append(*it);
+
+    if(Graves.size()==0)
+    {
+        //do some serious error handling
+        return "Error";
+    }
+
+    //pick a random grave
+    return Graves[rand()%(Graves.size())];
+}
+
+QString HWNamegen::getRandomFort()
+{
+    QStringList Forts;
+
+    //list all available Forts
+    QDir tmpdir;
+    tmpdir.cd(datadir->absolutePath());
+    tmpdir.cd("Forts");
+    tmpdir.setFilter(QDir::Files);
+    Forts.append(tmpdir.entryList(QStringList("*L.png")).replaceInStrings(QRegExp("^(.*)L\\.png"), "\\1"));
+
+    if(Forts.size()==0)
+    {
+        //do some serious error handling
+        return "Error";
+    }
+
+    //pick a random fort
+    return Forts[rand()%(Forts.size())];
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/util/namegen.h	Wed Sep 28 19:27:56 2011 +0200
@@ -0,0 +1,53 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2009 Martin Minarik <ttsmj@pokec.sk>
+ * Copyright (c) 2009-2011 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#ifndef NAMEGEN_H
+#define NAMEGEN_H
+
+#include <QString>
+
+class HWForm;
+class HWTeam;
+
+class HWNamegen
+{
+public:
+
+    static void teamRandomName(HWTeam & team, const int HedgehogNumber);
+    static void teamRandomNames(HWTeam & team, const bool changeteamname);
+
+private:
+        HWNamegen();
+
+        static QList<QStringList> TypesTeamnames;
+        static QList<QStringList> TypesHatnames;
+        static bool typesAvailable;
+
+        static bool loadTypes();
+        static QStringList dictContents(const QString filename);
+        static QStringList dictsForHat(const QString hatname);
+
+        static QString getRandomGrave();
+        static QString getRandomFort();
+        static void teamRandomName(HWTeam & team, const int HedgehogNumber, const QStringList & dict);
+};
+
+
+
+#endif
--- a/QTfrontend/vertScrollArea.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include "vertScrollArea.h"
-
-#include <QResizeEvent>
-
-VertScrArea::VertScrArea(QColor frameColor, QWidget * parent) :
-  QScrollArea(parent)
-{
-    QPalette newPalette = palette();
-    newPalette.setColor(QPalette::Background, frameColor);
-    setPalette(newPalette);
-}
-
-void VertScrArea::resizeEvent(QResizeEvent * event)
-{
-    widget()->resize(event->size().width(), widget()->sizeHint().height());
-}
--- a/QTfrontend/vertScrollArea.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2006-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef _VERT_SCROLL_AREA_INCLUDED
-#define _VERT_SCROLL_AREA_INCLUDED
-
-#include <QScrollArea>
-
-class VertScrArea : public QScrollArea
-{
-    Q_OBJECT
-
-public:
-    VertScrArea(QColor frameColor, QWidget * parent = 0);
-
-protected:
-    virtual void resizeEvent(QResizeEvent * event);
-};
-
-#endif // _VERT_SCROLL_AREA_INCLUDED
--- a/QTfrontend/weaponItem.cpp	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2008 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#include "weaponItem.h"
-
-WeaponItem::WeaponItem(const QImage& im, const QImage& img, QWidget * parent) :
-  ItemNum(im, img, parent, 0)
-{
-}
-
-WeaponItem::~WeaponItem()
-{
-}
-
-void WeaponItem::incItems()
-{
-  ++numItems;
-}
-
-void WeaponItem::decItems()
-{
-  --numItems;
-}
-
--- a/QTfrontend/weaponItem.h	Wed Sep 28 06:24:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-/*
- * Hedgewars, a free turn based strategy game
- * Copyright (c) 2006-2008 Igor Ulyanov <iulyanov@gmail.com>
- * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-#ifndef _WEAPON_ITEM
-#define _WEAPON_ITEM
-
-#include "itemNum.h"
-
-class WeaponItem : public ItemNum
-{
-  Q_OBJECT
-
- public:
-  WeaponItem(const QImage& im, const QImage& img, QWidget * parent);
-  virtual ~WeaponItem();
-
- signals:
-  void hedgehogsNumChanged();
-
- protected:
-  virtual void incItems();
-  virtual void decItems();
-
- private:
-  WeaponItem();
-};
-
-#endif // _WEAPON_ITEM