Bans manager
authorunc0rr
Sat, 01 Dec 2012 00:38:06 +0400
changeset 8157 695f1eef72c8
parent 8156 3ccc61102b58
child 8158 5da1c26d5b10
Bans manager
QTfrontend/hwform.cpp
QTfrontend/net/newnetclient.cpp
QTfrontend/net/newnetclient.h
QTfrontend/ui/dialog/bandialog.cpp
QTfrontend/ui/dialog/bandialog.h
QTfrontend/ui/page/pageadmin.cpp
QTfrontend/ui/page/pageadmin.h
project_files/hedgewars.pro
--- a/QTfrontend/hwform.cpp	Sat Dec 01 00:37:23 2012 +0400
+++ b/QTfrontend/hwform.cpp	Sat Dec 01 00:38:06 2012 +0400
@@ -1180,11 +1180,16 @@
     connect(hwnet, SIGNAL(serverMessageNew(const QString&)), ui.pageAdmin, SLOT(serverMessageNew(const QString &)));
     connect(hwnet, SIGNAL(serverMessageOld(const QString&)), ui.pageAdmin, SLOT(serverMessageOld(const QString &)));
     connect(hwnet, SIGNAL(latestProtocolVar(int)), ui.pageAdmin, SLOT(protocol(int)));
+    connect(hwnet, SIGNAL(bansList(const QStringList &)), ui.pageAdmin, SLOT(setBansList(const QStringList &)));
     connect(ui.pageAdmin, SIGNAL(setServerMessageNew(const QString&)), hwnet, SLOT(setServerMessageNew(const QString &)));
     connect(ui.pageAdmin, SIGNAL(setServerMessageOld(const QString&)), hwnet, SLOT(setServerMessageOld(const QString &)));
     connect(ui.pageAdmin, SIGNAL(setProtocol(int)), hwnet, SLOT(setLatestProtocolVar(int)));
     connect(ui.pageAdmin, SIGNAL(askServerVars()), hwnet, SLOT(askServerVars()));
     connect(ui.pageAdmin, SIGNAL(clearAccountsCache()), hwnet, SLOT(clearAccountsCache()));
+    connect(ui.pageAdmin, SIGNAL(bansListRequest()), hwnet, SLOT(getBanList()));
+    connect(ui.pageAdmin, SIGNAL(removeBan(QString)), hwnet, SLOT(removeBan(QString)));
+    connect(ui.pageAdmin, SIGNAL(banIP(QString,QString,int)), hwnet, SLOT(banIP(QString,QString,int)));
+    connect(ui.pageAdmin, SIGNAL(banNick(QString,QString,int)), hwnet, SLOT(banNick(QString,QString,int)));
 
 // disconnect
     connect(hwnet, SIGNAL(disconnected(const QString&)), this, SLOT(ForcedDisconnect(const QString&)), Qt::QueuedConnection);
--- a/QTfrontend/net/newnetclient.cpp	Sat Dec 01 00:37:23 2012 +0400
+++ b/QTfrontend/net/newnetclient.cpp	Sat Dec 01 00:38:06 2012 +0400
@@ -364,6 +364,14 @@
         return;
     }
 
+    if (lst[0] == "BANLIST")
+    {
+        QStringList tmp = lst;
+        tmp.removeFirst();
+        emit bansList(tmp);
+        return;
+    }
+
     if (lst[0] == "CLIENT_FLAGS")
     {
         if(lst.size() < 3 || lst[1].size() < 2)
@@ -863,6 +871,26 @@
     RawSendNet(QString("BAN%1%2").arg(delimeter).arg(nick));
 }
 
+void HWNewNet::banIP(const QString & ip, const QString & reason, int seconds)
+{
+    RawSendNet(QString("BANIP%1%2%1%3%1%4").arg(delimeter).arg(ip).arg(reason).arg(seconds));
+}
+
+void HWNewNet::banNick(const QString & nick, const QString & reason, int seconds)
+{
+    RawSendNet(QString("BANNICK%1%2%1%3%1%4").arg(delimeter).arg(nick).arg(reason).arg(seconds));
+}
+
+void HWNewNet::getBanList()
+{
+    RawSendNet(QByteArray("BANLIST"));
+}
+
+void HWNewNet::removeBan(const QString & b)
+{
+    RawSendNet(QString("UNBAN%1%2").arg(delimeter).arg(b));
+}
+
 void HWNewNet::kickPlayer(const QString & nick)
 {
     RawSendNet(QString("KICK%1%2").arg(delimeter).arg(nick));
--- a/QTfrontend/net/newnetclient.h	Sat Dec 01 00:37:23 2012 +0400
+++ b/QTfrontend/net/newnetclient.h	Sat Dec 01 00:38:06 2012 +0400
@@ -123,6 +123,7 @@
         void serverMessageNew(const QString &);
         void serverMessageOld(const QString &);
         void latestProtocolVar(int);
+        void bansList(const QStringList &);
 
         void setMyReadyStatus(bool isReady);
 
@@ -156,7 +157,11 @@
         void toggleRestrictJoins();
         void toggleRestrictTeamAdds();
         void partRoom();
-        void clearAccountsCache();
+        void clearAccountsCache();        
+        void getBanList();
+        void removeBan(const QString &);
+        void banIP(const QString & ip, const QString & reason, int seconds);
+        void banNick(const QString & nick, const QString & reason, int seconds);
 
     private slots:
         void ClientRead();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/dialog/bandialog.cpp	Sat Dec 01 00:38:06 2012 +0400
@@ -0,0 +1,85 @@
+#include <QFormLayout>
+#include <QComboBox>
+#include <QRadioButton>
+#include <QLineEdit>
+#include <QLabel>
+#include <QPushButton>
+#include <QHBoxLayout>
+#include <QMessageBox>
+
+#include "bandialog.h"
+
+BanDialog::BanDialog(QWidget *parent) :
+    QDialog(parent)
+{
+    QFormLayout * formLayout = new QFormLayout(this);
+
+    rbIP = new QRadioButton(this);
+    rbIP->setChecked(true);
+    rbNick = new QRadioButton(this);
+    leId = new QLineEdit(this);
+    leReason = new QLineEdit(this);
+    cbTime = new QComboBox(this);
+
+    cbTime->addItem(tr("10 minutes"), 5 * 60);
+    cbTime->addItem(tr("30 minutes"), 10 * 60);
+    cbTime->addItem(tr("1 hour"), 60 * 60);
+    cbTime->addItem(tr("3 hours"), 3 * 60 * 60);
+    cbTime->addItem(tr("5 hours"), 5 * 60 * 60);
+    cbTime->addItem(tr("24 hours"), 24 * 60 * 60);
+    cbTime->addItem(tr("3 days"), 72 * 60 * 60);
+    cbTime->addItem(tr("7 days"), 168 * 60 * 60);
+    cbTime->addItem(tr("14 days"), 336 * 60 * 60);
+    cbTime->addItem(tr("permanent"), 3650 * 60 * 60);
+    cbTime->setCurrentIndex(0);
+
+    formLayout->addRow(tr("IP"), rbIP);
+    formLayout->addRow(tr("Nick"), rbNick);
+    formLayout->addRow(tr("IP/Nick"), leId);
+    formLayout->addRow(tr("Reason"), leReason);
+    formLayout->addRow(tr("Duration"), cbTime);
+
+    formLayout->setLabelAlignment(Qt::AlignRight);
+
+    QHBoxLayout * hbox = new QHBoxLayout();
+    formLayout->addRow(hbox);
+    QPushButton * btnOk = new QPushButton(tr("Ok"), this);
+    QPushButton * btnCancel = new QPushButton(tr("Cancel"), this);
+    hbox->addStretch();
+    hbox->addWidget(btnOk);
+    hbox->addWidget(btnCancel);
+
+    connect(btnOk, SIGNAL(clicked()), this, SLOT(okClicked()));
+    connect(btnCancel, SIGNAL(clicked()), this, SLOT(reject()));
+}
+
+bool BanDialog::byIP()
+{
+    return rbIP->isChecked();
+}
+
+int BanDialog::duration()
+{
+    return cbTime->itemData(cbTime->currentIndex()).toInt();
+}
+
+QString BanDialog::banId()
+{
+    return leId->text();
+}
+
+QString BanDialog::reason()
+{
+    return leReason->text().isEmpty() ? tr("you know why") : leReason->text();
+}
+
+void BanDialog::okClicked()
+{
+    if(leId->text().isEmpty())
+    {
+        QMessageBox::warning(this, tr("Warning"), tr("Please, specify %1").arg(byIP() ? tr("IP") : tr("nickname")));
+        return;
+    }
+
+    accept();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/ui/dialog/bandialog.h	Sat Dec 01 00:38:06 2012 +0400
@@ -0,0 +1,32 @@
+#ifndef BANDIALOG_H
+#define BANDIALOG_H
+
+#include <QDialog>
+
+class QComboBox;
+class QRadioButton;
+class QLineEdit;
+
+class BanDialog : public QDialog
+{
+    Q_OBJECT
+public:
+    explicit BanDialog(QWidget *parent = 0);    
+
+    bool byIP();
+    int duration();
+    QString banId();
+    QString reason();
+
+private:
+    QRadioButton * rbIP;
+    QRadioButton * rbNick;
+    QLineEdit * leId;
+    QLineEdit * leReason;
+    QComboBox * cbTime;
+
+private slots:
+    void okClicked();
+};
+
+#endif // BANDIALOG_H
--- a/QTfrontend/ui/page/pageadmin.cpp	Sat Dec 01 00:37:23 2012 +0400
+++ b/QTfrontend/ui/page/pageadmin.cpp	Sat Dec 01 00:38:06 2012 +0400
@@ -22,56 +22,98 @@
 #include <QSpinBox>
 #include <QPushButton>
 #include <QTextBrowser>
+#include <QTableWidget>
+#include <QHeaderView>
 
 #include "pageadmin.h"
 #include "chatwidget.h"
+#include "bandialog.h"
 
 QLayout * PageAdmin::bodyLayoutDefinition()
 {
-    QGridLayout * pageLayout = new QGridLayout();
-
-    // 0
-    pbAsk = addButton(tr("Fetch data"), pageLayout, 0, 0, 1, 3);
+    QVBoxLayout * pageLayout = new QVBoxLayout();
 
-    // 1
-    QLabel * lblSMN = new QLabel(this);
-    lblSMN->setText(tr("Server message for latest version:"));
-    pageLayout->addWidget(lblSMN, 1, 0);
+    QTabWidget * tabs = new QTabWidget(this);
+    pageLayout->addWidget(tabs);
+    QWidget * page1 = new QWidget(this);
+    QWidget * page2 = new QWidget(this);
+    tabs->addTab(page1, tr("General"));
+    tabs->addTab(page2, tr("Bans"));
+
+    // page 1
+    {
+        QGridLayout * tab1Layout = new QGridLayout(page1);
+
+        // 0
+        pbAsk = addButton(tr("Fetch data"), tab1Layout, 0, 0, 1, 3);
 
-    leServerMessageNew = new QLineEdit(this);
-    pageLayout->addWidget(leServerMessageNew, 1, 1);
+        // 1
+        QLabel * lblSMN = new QLabel(this);
+        lblSMN->setText(tr("Server message for latest version:"));
+        tab1Layout->addWidget(lblSMN, 1, 0);
+
+        leServerMessageNew = new QLineEdit(this);
+        tab1Layout->addWidget(leServerMessageNew, 1, 1);
 
-    // 2
-    QLabel * lblSMO = new QLabel(this);
-    lblSMO->setText(tr("Server message for previous versions:"));
-    pageLayout->addWidget(lblSMO, 2, 0);
+        // 2
+        QLabel * lblSMO = new QLabel(this);
+        lblSMO->setText(tr("Server message for previous versions:"));
+        tab1Layout->addWidget(lblSMO, 2, 0);
+
+        leServerMessageOld = new QLineEdit(this);
+        tab1Layout->addWidget(leServerMessageOld, 2, 1);
 
-    leServerMessageOld = new QLineEdit(this);
-    pageLayout->addWidget(leServerMessageOld, 2, 1);
+        // 3
+        QLabel * lblP = new QLabel(this);
+        lblP->setText(tr("Latest version protocol number:"));
+        tab1Layout->addWidget(lblP, 3, 0);
+
+        sbProtocol = new QSpinBox(this);
+        tab1Layout->addWidget(sbProtocol, 3, 1);
 
-    // 3
-    QLabel * lblP = new QLabel(this);
-    lblP->setText(tr("Latest version protocol number:"));
-    pageLayout->addWidget(lblP, 3, 0);
+        // 4
+        QLabel * lblPreview = new QLabel(this);
+        lblPreview->setText(tr("MOTD preview:"));
+        tab1Layout->addWidget(lblPreview, 4, 0);
 
-    sbProtocol = new QSpinBox(this);
-    pageLayout->addWidget(sbProtocol, 3, 1);
+        tb = new QTextBrowser(this);
+        tb->setOpenExternalLinks(true);
+        tb->document()->setDefaultStyleSheet(HWChatWidget::styleSheet());
+        tab1Layout->addWidget(tb, 4, 1, 1, 2);
+
+        // 5
+        pbClearAccountsCache = addButton(tr("Clear Accounts Cache"), tab1Layout, 5, 0);
+
+        // 6
+        pbSetSM = addButton(tr("Set data"), tab1Layout, 6, 0, 1, 3);
+    }
 
-    // 4
-    QLabel * lblPreview = new QLabel(this);
-    lblPreview->setText(tr("MOTD preview:"));
-    pageLayout->addWidget(lblPreview, 4, 0);
+    // page 2
+    {
+        QGridLayout * tab2Layout = new QGridLayout(page2);
+        twBans = new QTableWidget(this);
+        twBans->setColumnCount(3);
+        twBans->setHorizontalHeaderLabels(QStringList()
+                              << tr("IP/Nick")
+                              << tr("Expiration")
+                              << tr("Reason")
+                    );
+        twBans->horizontalHeader()->setResizeMode(2, QHeaderView::Stretch);
+        twBans->setEditTriggers(QAbstractItemView::NoEditTriggers);
+        twBans->setSelectionBehavior(QAbstractItemView::SelectRows);
+        twBans->setSelectionMode(QAbstractItemView::SingleSelection);
+        twBans->setAlternatingRowColors(true);
+        tab2Layout->addWidget(twBans, 0, 1, 4, 1);
 
-    tb = new QTextBrowser(this);
-    tb->setOpenExternalLinks(true);
-    tb->document()->setDefaultStyleSheet(HWChatWidget::styleSheet());
-    pageLayout->addWidget(tb, 4, 1, 1, 2);
+        QPushButton * btnRefresh = addButton(tr("Refresh"), tab2Layout, 0, 0);
+        QPushButton * btnAdd = addButton(tr("Add"), tab2Layout, 1, 0);
+        QPushButton * btnRemove = addButton(tr("Remove"), tab2Layout, 2, 0);
 
-    // 5
-    pbClearAccountsCache = addButton(tr("Clear Accounts Cache"), pageLayout, 5, 0);
-
-    // 6
-    pbSetSM = addButton(tr("Set data"), pageLayout, 6, 0, 1, 3);
+        connect(btnRefresh, SIGNAL(clicked()), this, SIGNAL(bansListRequest()));
+        connect(btnRefresh, SIGNAL(clicked()), this, SLOT(onRefreshClicked()));
+        connect(btnAdd, SIGNAL(clicked()), this, SLOT(onAddClicked()));
+        connect(btnRemove, SIGNAL(clicked()), this, SLOT(onRemoveClicked()));
+    }
 
     return pageLayout;
 }
@@ -106,7 +148,64 @@
 {
     leServerMessageOld->setText(str);
 }
+
 void PageAdmin::protocol(int proto)
 {
     sbProtocol->setValue(proto);
 }
+
+void PageAdmin::onAddClicked()
+{
+    BanDialog dialog;
+
+    if(dialog.exec())
+    {
+        if(dialog.byIP())
+        {
+            emit banIP(dialog.banId(), dialog.reason(), dialog.duration());
+        } else
+        {
+            emit banNick(dialog.banId(), dialog.reason(), dialog.duration());
+        }
+
+        emit bansListRequest();
+    }
+}
+
+void PageAdmin::onRemoveClicked()
+{
+    QList<QTableWidgetItem *> sel = twBans->selectedItems();
+
+    if(sel.size())
+    {
+        emit removeBan(twBans->item(sel[0]->row(), 0)->data(Qt::DisplayRole).toString());
+        emit bansListRequest();
+    }
+}
+
+void PageAdmin::setBansList(const QStringList & bans)
+{
+    if(bans.size() % 4)
+        return;
+
+    twBans->setRowCount(bans.size() / 4);
+
+    for(int i = 0; i < bans.size(); i += 4)
+    {
+        if(!twBans->item(i / 4, 0))
+        {
+            twBans->setItem(i / 4, 0, new QTableWidgetItem());
+            twBans->setItem(i / 4, 1, new QTableWidgetItem());
+            twBans->setItem(i / 4, 2, new QTableWidgetItem());
+        }
+
+        twBans->item(i / 4, 0)->setData(Qt::DisplayRole, bans[i + 1]);
+        twBans->item(i / 4, 1)->setData(Qt::DisplayRole, bans[i + 3]);
+        twBans->item(i / 4, 2)->setData(Qt::DisplayRole, bans[i + 2]);
+    }
+}
+
+void PageAdmin::onRefreshClicked()
+{
+    twBans->setRowCount(0);
+}
--- a/QTfrontend/ui/page/pageadmin.h	Sat Dec 01 00:37:23 2012 +0400
+++ b/QTfrontend/ui/page/pageadmin.h	Sat Dec 01 00:38:06 2012 +0400
@@ -21,6 +21,8 @@
 
 #include "AbstractPage.h"
 
+class QTableWidget;
+
 class PageAdmin : public AbstractPage
 {
         Q_OBJECT
@@ -32,6 +34,7 @@
         void serverMessageNew(const QString & str);
         void serverMessageOld(const QString & str);
         void protocol(int proto);
+        void setBansList(const QStringList & bans);
 
     signals:
         void setServerMessageNew(const QString & str);
@@ -39,6 +42,10 @@
         void setProtocol(int proto);
         void askServerVars();
         void clearAccountsCache();
+        void bansListRequest();
+        void removeBan(const QString &);
+        void banIP(const QString & ip, const QString & reason, int seconds);
+        void banNick(const QString & nick, const QString & reason, int seconds);
 
     protected:
         QLayout * bodyLayoutDefinition();
@@ -52,9 +59,13 @@
         QSpinBox * sbProtocol;
         QTextBrowser * tb;
         QPushButton * pbClearAccountsCache;
+        QTableWidget * twBans;
 
     private slots:
         void smChanged();
+        void onAddClicked();
+        void onRemoveClicked();
+        void onRefreshClicked();
 };
 
 #endif
--- a/project_files/hedgewars.pro	Sat Dec 01 00:37:23 2012 +0400
+++ b/project_files/hedgewars.pro	Sat Dec 01 00:38:06 2012 +0400
@@ -1,271 +1,273 @@
-TEMPLATE = app
-TARGET = hedgewars
-DEPENDPATH += ../QTfrontend/
-INCLUDEPATH += ../QTfrontend
-INCLUDEPATH += ../QTfrontend/model
-INCLUDEPATH += ../QTfrontend/ui
-INCLUDEPATH += ../QTfrontend/ui/widget
-INCLUDEPATH += ../QTfrontend/ui/page
-INCLUDEPATH += ../QTfrontend/ui/dialog
-INCLUDEPATH += ../QTfrontend/net
-INCLUDEPATH += ../QTfrontend/util
-INCLUDEPATH += ../misc/physfs/src
-INCLUDEPATH += ../misc/physfs/extras
-INCLUDEPATH += ../project_files/frontlib
-
-DESTDIR = ../bin
-
-QT += network
-QT += webkit
-
-HEADERS += ../QTfrontend/model/ThemeModel.h \
-    ../QTfrontend/model/MapModel.h \
-    ../QTfrontend/model/ammoSchemeModel.h \
-    ../QTfrontend/model/netserverslist.h \
-    ../QTfrontend/ui/page/pagedrawmap.h \
-    ../QTfrontend/ui/page/pagedata.h \
-    ../QTfrontend/ui/page/pagetraining.h \
-    ../QTfrontend/ui/page/pageselectweapon.h \
-    ../QTfrontend/ui/page/pagesingleplayer.h \
-    ../QTfrontend/ui/page/pagenettype.h \
-    ../QTfrontend/ui/page/pageingame.h \
-    ../QTfrontend/ui/page/pageadmin.h \
-    ../QTfrontend/ui/page/pagescheme.h \
-    ../QTfrontend/ui/page/pagemultiplayer.h \
-    ../QTfrontend/ui/page/pageplayrecord.h \
-    ../QTfrontend/ui/page/pagemain.h \
-    ../QTfrontend/ui/page/pageoptions.h \
-    ../QTfrontend/ui/page/pagenetgame.h \
-    ../QTfrontend/ui/page/pageeditteam.h \
-    ../QTfrontend/ui/page/pageconnecting.h \
-    ../QTfrontend/ui/page/pageroomslist.h \
-    ../QTfrontend/ui/page/pagenet.h \
-    ../QTfrontend/ui/page/pagecampaign.h \
-    ../QTfrontend/ui/page/pageinfo.h \
-    ../QTfrontend/ui/page/pagenetserver.h \
-    ../QTfrontend/ui/page/pagegamestats.h \
-    ../QTfrontend/ui/dialog/input_ip.h \
-    ../QTfrontend/ui/qaspectratiolayout.h \
-    ../QTfrontend/ui/widget/bgwidget.h \
-    ../QTfrontend/ui/widget/fpsedit.h \
-    ../QTfrontend/ui/widget/FreqSpinBox.h \
-    ../QTfrontend/ui/widget/igbox.h \
-    ../QTfrontend/ui/widget/chatwidget.h \
-    ../QTfrontend/ui/widget/togglebutton.h \
-    ../QTfrontend/ui/widget/SquareLabel.h \
-    ../QTfrontend/ui/widget/itemNum.h \
-    ../QTfrontend/ui/widget/frameTeam.h \
-    ../QTfrontend/ui/widget/teamselect.h \
-    ../QTfrontend/ui/widget/vertScrollArea.h \
-    ../QTfrontend/ui/widget/about.h \
-    ../QTfrontend/ui/widget/teamselhelper.h \
-    ../QTfrontend/ui/widget/drawmapwidget.h \
-    ../QTfrontend/ui/widget/databrowser.h \
-    ../QTfrontend/ui/widget/hedgehogerWidget.h \
-    ../QTfrontend/ui/widget/selectWeapon.h \
-    ../QTfrontend/ui/widget/weaponItem.h \
-    ../QTfrontend/ui/widget/gamecfgwidget.h \
-    ../QTfrontend/ui/widget/mapContainer.h \
-    ../QTfrontend/ui/widget/HistoryLineEdit.h \
-    ../QTfrontend/ui/widget/SmartLineEdit.h \
-    ../QTfrontend/util/DataManager.h \
-    ../QTfrontend/net/netregister.h \
-    ../QTfrontend/net/netserver.h \
-    ../QTfrontend/net/netudpwidget.h \
-    ../QTfrontend/net/tcpBase.h \
-    ../QTfrontend/net/proto.h \
-    ../QTfrontend/net/newnetclient.h \
-    ../QTfrontend/net/netudpserver.h \
-    ../QTfrontend/net/hwmap.h \
-    ../QTfrontend/util/namegen.h \
-    ../QTfrontend/ui/page/AbstractPage.h \
-    ../QTfrontend/drawmapscene.h \
-    ../QTfrontend/game.h \
-    ../QTfrontend/gameuiconfig.h \
-    ../QTfrontend/HWApplication.h \
-    ../QTfrontend/hwform.h \
-    ../QTfrontend/util/SDLInteraction.h \
-    ../QTfrontend/team.h \
-    ../QTfrontend/achievements.h \
-    ../QTfrontend/binds.h \
-    ../QTfrontend/ui_hwform.h \
-    ../QTfrontend/KB.h \
-    ../QTfrontend/hwconsts.h \
-    ../QTfrontend/sdlkeys.h \
-    ../QTfrontend/ui/mouseoverfilter.h \
-    ../QTfrontend/ui/qpushbuttonwithsound.h \
-    ../QTfrontend/ui/widget/qpushbuttonwithsound.h \
-    ../QTfrontend/ui/page/pagefeedback.h \
-    ../QTfrontend/model/roomslistmodel.h \
-    ../QTfrontend/ui/dialog/input_password.h \
-    ../QTfrontend/ui/widget/colorwidget.h \
-    ../QTfrontend/model/HatModel.h \
-    ../QTfrontend/model/GameStyleModel.h \
-    ../QTfrontend/ui/page/pagevideos.h \
-    ../QTfrontend/net/recorder.h \
-    ../QTfrontend/ui/dialog/ask_quit.h \
-    ../QTfrontend/ui/dialog/upload_video.h \
-    ../QTfrontend/campaign.h \
-    ../QTfrontend/model/playerslistmodel.h \
-    ../QTfrontend/util/LibavInteraction.h \
-    ../QTfrontend/util/FileEngine.h
-
-
-SOURCES += ../QTfrontend/model/ammoSchemeModel.cpp \
-    ../QTfrontend/model/MapModel.cpp \
-    ../QTfrontend/model/ThemeModel.cpp \
-    ../QTfrontend/model/netserverslist.cpp \
-    ../QTfrontend/ui/qaspectratiolayout.cpp \
-    ../QTfrontend/ui/page/pagemain.cpp \
-    ../QTfrontend/ui/page/pagetraining.cpp \
-    ../QTfrontend/ui/page/pageroomslist.cpp \
-    ../QTfrontend/ui/page/pagemultiplayer.cpp \
-    ../QTfrontend/ui/page/pagegamestats.cpp \
-    ../QTfrontend/ui/page/pagenettype.cpp \
-    ../QTfrontend/ui/page/pageeditteam.cpp \
-    ../QTfrontend/ui/page/pagenetgame.cpp \
-    ../QTfrontend/ui/page/pagedata.cpp \
-    ../QTfrontend/ui/page/pagedrawmap.cpp \
-    ../QTfrontend/ui/page/pageplayrecord.cpp \
-    ../QTfrontend/ui/page/pageselectweapon.cpp \
-    ../QTfrontend/ui/page/pageingame.cpp \
-    ../QTfrontend/ui/page/pagenetserver.cpp \
-    ../QTfrontend/ui/page/pagecampaign.cpp \
-    ../QTfrontend/ui/page/pageadmin.cpp \
-    ../QTfrontend/ui/page/pageinfo.cpp \
-    ../QTfrontend/ui/page/pageconnecting.cpp \
-    ../QTfrontend/ui/page/pagesingleplayer.cpp \
-    ../QTfrontend/ui/page/pagenet.cpp \
-    ../QTfrontend/ui/page/pagescheme.cpp \
-    ../QTfrontend/ui/page/pageoptions.cpp \
-    ../QTfrontend/ui/dialog/input_ip.cpp \
-    ../QTfrontend/ui/widget/igbox.cpp \
-    ../QTfrontend/ui/widget/selectWeapon.cpp \
-    ../QTfrontend/ui/widget/FreqSpinBox.cpp \
-    ../QTfrontend/ui/widget/SquareLabel.cpp \
-    ../QTfrontend/ui/widget/frameTeam.cpp \
-    ../QTfrontend/ui/widget/fpsedit.cpp \
-    ../QTfrontend/ui/widget/databrowser.cpp \
-    ../QTfrontend/ui/widget/teamselect.cpp \
-    ../QTfrontend/ui/widget/gamecfgwidget.cpp \
-    ../QTfrontend/ui/widget/chatwidget.cpp \
-    ../QTfrontend/ui/widget/itemNum.cpp \
-    ../QTfrontend/ui/widget/bgwidget.cpp \
-    ../QTfrontend/ui/widget/about.cpp \
-    ../QTfrontend/ui/widget/togglebutton.cpp \
-    ../QTfrontend/ui/widget/vertScrollArea.cpp \
-    ../QTfrontend/ui/widget/hedgehogerWidget.cpp \
-    ../QTfrontend/ui/widget/teamselhelper.cpp \
-    ../QTfrontend/ui/widget/drawmapwidget.cpp \
-    ../QTfrontend/ui/widget/weaponItem.cpp \
-    ../QTfrontend/ui/widget/mapContainer.cpp \
-    ../QTfrontend/ui/widget/HistoryLineEdit.cpp \
-    ../QTfrontend/ui/widget/SmartLineEdit.cpp \
-    ../QTfrontend/util/DataManager.cpp \
-    ../QTfrontend/net/tcpBase.cpp \
-    ../QTfrontend/net/netregister.cpp \
-    ../QTfrontend/net/proto.cpp \
-    ../QTfrontend/net/hwmap.cpp \
-    ../QTfrontend/net/netudpserver.cpp \
-    ../QTfrontend/net/newnetclient.cpp \
-    ../QTfrontend/net/netudpwidget.cpp \
-    ../QTfrontend/net/netserver.cpp \
-    ../QTfrontend/util/namegen.cpp \
-    ../QTfrontend/ui/page/AbstractPage.cpp \
-    ../QTfrontend/achievements.cpp \
-    ../QTfrontend/binds.cpp \
-    ../QTfrontend/drawmapscene.cpp \
-    ../QTfrontend/game.cpp \
-    ../QTfrontend/gameuiconfig.cpp \
-    ../QTfrontend/HWApplication.cpp \
-    ../QTfrontend/hwform.cpp \
-    ../QTfrontend/main.cpp \
-    ../QTfrontend/util/SDLInteraction.cpp \
-    ../QTfrontend/team.cpp \
-    ../QTfrontend/ui_hwform.cpp \
-    ../QTfrontend/hwconsts.cpp \
-    ../QTfrontend/ui/mouseoverfilter.cpp \
-    ../QTfrontend/ui/widget/qpushbuttonwithsound.cpp \
-    ../QTfrontend/ui/page/pagefeedback.cpp \
-    ../QTfrontend/model/roomslistmodel.cpp \
-    ../QTfrontend/ui/dialog/input_password.cpp \
-    ../QTfrontend/ui/widget/colorwidget.cpp \
-    ../QTfrontend/model/HatModel.cpp \
-    ../QTfrontend/model/GameStyleModel.cpp \
-    ../QTfrontend/ui/page/pagevideos.cpp \
-    ../QTfrontend/net/recorder.cpp \
-    ../QTfrontend/ui/dialog/ask_quit.cpp \
-    ../QTfrontend/ui/dialog/upload_video.cpp \
-    ../QTfrontend/campaign.cpp \
-    ../QTfrontend/model/playerslistmodel.cpp \
-    ../QTfrontend/util/LibavInteraction.cpp \
-    ../QTfrontend/util/FileEngine.cpp
-
-
-TRANSLATIONS += ../share/hedgewars/Data/Locale/hedgewars_ar.ts \
-    ../share/hedgewars/Data/Locale/hedgewars_bg.ts \
-    ../share/hedgewars/Data/Locale/hedgewars_cs.ts \
-    ../share/hedgewars/Data/Locale/hedgewars_da.ts \
-    ../share/hedgewars/Data/Locale/hedgewars_de.ts \ 
-    ../share/hedgewars/Data/Locale/hedgewars_el.ts \
-    ../share/hedgewars/Data/Locale/hedgewars_en.ts \ 
-    ../share/hedgewars/Data/Locale/hedgewars_es.ts \
-    ../share/hedgewars/Data/Locale/hedgewars_fi.ts \
-    ../share/hedgewars/Data/Locale/hedgewars_fr.ts \ 
-    ../share/hedgewars/Data/Locale/hedgewars_gl.ts \
-    ../share/hedgewars/Data/Locale/hedgewars_hu.ts \ 
-    ../share/hedgewars/Data/Locale/hedgewars_it.ts \ 
-    ../share/hedgewars/Data/Locale/hedgewars_ja.ts \ 
-    ../share/hedgewars/Data/Locale/hedgewars_ko.ts \ 
-    ../share/hedgewars/Data/Locale/hedgewars_lt.ts \
-    ../share/hedgewars/Data/Locale/hedgewars_ms.ts \
-    ../share/hedgewars/Data/Locale/hedgewars_nl.ts \ 
-    ../share/hedgewars/Data/Locale/hedgewars_pl.ts \ 
-    ../share/hedgewars/Data/Locale/hedgewars_pt_BR.ts \
-    ../share/hedgewars/Data/Locale/hedgewars_pt_PT.ts \
-    ../share/hedgewars/Data/Locale/hedgewars_ro.ts \
-    ../share/hedgewars/Data/Locale/hedgewars_ru.ts \
-    ../share/hedgewars/Data/Locale/hedgewars_sk.ts \
-    ../share/hedgewars/Data/Locale/hedgewars_sv.ts \
-    ../share/hedgewars/Data/Locale/hedgewars_tr_TR.ts \
-    ../share/hedgewars/Data/Locale/hedgewars_uk.ts \
-    ../share/hedgewars/Data/Locale/hedgewars_zh_CN.ts \
-    ../share/hedgewars/Data/Locale/hedgewars_zh_TW.ts
-
-RESOURCES += ../QTfrontend/hedgewars.qrc
-
-LIBS += -L../bin -lphysfs -lfrontlib
-
-macx {
-    QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.6
-    QMAKE_MAC_SDK=/Developer/SDKs/MacOSX10.6.sdk
-
-    OBJECTIVE_SOURCES += ../QTfrontend/*.m ../QTfrontend/*.mm
-    SOURCES += ../QTfrontend/AutoUpdater.cpp ../QTfrontend/InstallController.cpp \
-               ../../build/QTfrontend/hwconsts.cpp
-    HEADERS += ../QTfrontend/M3InstallController.h ../QTfrontend/M3Panel.h \
-               ../QTfrontend/NSWorkspace_RBAdditions.h ../QTfrontend/AutoUpdater.h \
-               ../QTfrontend/CocoaInitializer.h ../QTfrontend/InstallController.h \
-               ../QTfrontend/SparkleAutoUpdater.h
-
-    LIBS += -lobjc -framework AppKit -framework IOKit -framework Foundation -framework SDL -framework SDL_Mixer -framework Sparkle -DSPARKLE_ENABLED
-    INCLUDEPATH += /Library/Frameworks/SDL.framework/Headers /Library/Frameworks/SDL_Mixer.framework/Headers
-    CONFIG += warn_on x86
-    #CONFIG += x86 ppc x86_64 ppc64
-}
-
-win32 {
-    RC_FILE = ../QTfrontend/hedgewars.rc
-    SOURCES += ../QTfrontend/xfire.cpp
-    INCLUDEPATH += ../misc/winutils/include
-    LIBS += -L../misc/winutils/lib
-}
-
-!macx {
-    LIBS += -lSDL -lSDL_mixer -lSDL_net
-    !win32 {
-        INCLUDEPATH += /usr/local/include/SDL /usr/include/SDL
-    }
-}
-
-FORMS +=
+TEMPLATE = app
+TARGET = hedgewars
+DEPENDPATH += ../QTfrontend/
+INCLUDEPATH += ../QTfrontend
+INCLUDEPATH += ../QTfrontend/model
+INCLUDEPATH += ../QTfrontend/ui
+INCLUDEPATH += ../QTfrontend/ui/widget
+INCLUDEPATH += ../QTfrontend/ui/page
+INCLUDEPATH += ../QTfrontend/ui/dialog
+INCLUDEPATH += ../QTfrontend/net
+INCLUDEPATH += ../QTfrontend/util
+INCLUDEPATH += ../misc/physfs/src
+INCLUDEPATH += ../misc/physfs/extras
+INCLUDEPATH += ../project_files/frontlib
+
+DESTDIR = ../bin
+
+QT += network
+QT += webkit
+
+HEADERS += ../QTfrontend/model/ThemeModel.h \
+    ../QTfrontend/model/MapModel.h \
+    ../QTfrontend/model/ammoSchemeModel.h \
+    ../QTfrontend/model/netserverslist.h \
+    ../QTfrontend/ui/page/pagedrawmap.h \
+    ../QTfrontend/ui/page/pagedata.h \
+    ../QTfrontend/ui/page/pagetraining.h \
+    ../QTfrontend/ui/page/pageselectweapon.h \
+    ../QTfrontend/ui/page/pagesingleplayer.h \
+    ../QTfrontend/ui/page/pagenettype.h \
+    ../QTfrontend/ui/page/pageingame.h \
+    ../QTfrontend/ui/page/pageadmin.h \
+    ../QTfrontend/ui/page/pagescheme.h \
+    ../QTfrontend/ui/page/pagemultiplayer.h \
+    ../QTfrontend/ui/page/pageplayrecord.h \
+    ../QTfrontend/ui/page/pagemain.h \
+    ../QTfrontend/ui/page/pageoptions.h \
+    ../QTfrontend/ui/page/pagenetgame.h \
+    ../QTfrontend/ui/page/pageeditteam.h \
+    ../QTfrontend/ui/page/pageconnecting.h \
+    ../QTfrontend/ui/page/pageroomslist.h \
+    ../QTfrontend/ui/page/pagenet.h \
+    ../QTfrontend/ui/page/pagecampaign.h \
+    ../QTfrontend/ui/page/pageinfo.h \
+    ../QTfrontend/ui/page/pagenetserver.h \
+    ../QTfrontend/ui/page/pagegamestats.h \
+    ../QTfrontend/ui/dialog/input_ip.h \
+    ../QTfrontend/ui/qaspectratiolayout.h \
+    ../QTfrontend/ui/widget/bgwidget.h \
+    ../QTfrontend/ui/widget/fpsedit.h \
+    ../QTfrontend/ui/widget/FreqSpinBox.h \
+    ../QTfrontend/ui/widget/igbox.h \
+    ../QTfrontend/ui/widget/chatwidget.h \
+    ../QTfrontend/ui/widget/togglebutton.h \
+    ../QTfrontend/ui/widget/SquareLabel.h \
+    ../QTfrontend/ui/widget/itemNum.h \
+    ../QTfrontend/ui/widget/frameTeam.h \
+    ../QTfrontend/ui/widget/teamselect.h \
+    ../QTfrontend/ui/widget/vertScrollArea.h \
+    ../QTfrontend/ui/widget/about.h \
+    ../QTfrontend/ui/widget/teamselhelper.h \
+    ../QTfrontend/ui/widget/drawmapwidget.h \
+    ../QTfrontend/ui/widget/databrowser.h \
+    ../QTfrontend/ui/widget/hedgehogerWidget.h \
+    ../QTfrontend/ui/widget/selectWeapon.h \
+    ../QTfrontend/ui/widget/weaponItem.h \
+    ../QTfrontend/ui/widget/gamecfgwidget.h \
+    ../QTfrontend/ui/widget/mapContainer.h \
+    ../QTfrontend/ui/widget/HistoryLineEdit.h \
+    ../QTfrontend/ui/widget/SmartLineEdit.h \
+    ../QTfrontend/util/DataManager.h \
+    ../QTfrontend/net/netregister.h \
+    ../QTfrontend/net/netserver.h \
+    ../QTfrontend/net/netudpwidget.h \
+    ../QTfrontend/net/tcpBase.h \
+    ../QTfrontend/net/proto.h \
+    ../QTfrontend/net/newnetclient.h \
+    ../QTfrontend/net/netudpserver.h \
+    ../QTfrontend/net/hwmap.h \
+    ../QTfrontend/util/namegen.h \
+    ../QTfrontend/ui/page/AbstractPage.h \
+    ../QTfrontend/drawmapscene.h \
+    ../QTfrontend/game.h \
+    ../QTfrontend/gameuiconfig.h \
+    ../QTfrontend/HWApplication.h \
+    ../QTfrontend/hwform.h \
+    ../QTfrontend/util/SDLInteraction.h \
+    ../QTfrontend/team.h \
+    ../QTfrontend/achievements.h \
+    ../QTfrontend/binds.h \
+    ../QTfrontend/ui_hwform.h \
+    ../QTfrontend/KB.h \
+    ../QTfrontend/hwconsts.h \
+    ../QTfrontend/sdlkeys.h \
+    ../QTfrontend/ui/mouseoverfilter.h \
+    ../QTfrontend/ui/qpushbuttonwithsound.h \
+    ../QTfrontend/ui/widget/qpushbuttonwithsound.h \
+    ../QTfrontend/ui/page/pagefeedback.h \
+    ../QTfrontend/model/roomslistmodel.h \
+    ../QTfrontend/ui/dialog/input_password.h \
+    ../QTfrontend/ui/widget/colorwidget.h \
+    ../QTfrontend/model/HatModel.h \
+    ../QTfrontend/model/GameStyleModel.h \
+    ../QTfrontend/ui/page/pagevideos.h \
+    ../QTfrontend/net/recorder.h \
+    ../QTfrontend/ui/dialog/ask_quit.h \
+    ../QTfrontend/ui/dialog/upload_video.h \
+    ../QTfrontend/campaign.h \
+    ../QTfrontend/model/playerslistmodel.h \
+    ../QTfrontend/util/LibavInteraction.h \
+    ../QTfrontend/util/FileEngine.h \
+    ../QTfrontend/ui/dialog/bandialog.h
+
+
+SOURCES += ../QTfrontend/model/ammoSchemeModel.cpp \
+    ../QTfrontend/model/MapModel.cpp \
+    ../QTfrontend/model/ThemeModel.cpp \
+    ../QTfrontend/model/netserverslist.cpp \
+    ../QTfrontend/ui/qaspectratiolayout.cpp \
+    ../QTfrontend/ui/page/pagemain.cpp \
+    ../QTfrontend/ui/page/pagetraining.cpp \
+    ../QTfrontend/ui/page/pageroomslist.cpp \
+    ../QTfrontend/ui/page/pagemultiplayer.cpp \
+    ../QTfrontend/ui/page/pagegamestats.cpp \
+    ../QTfrontend/ui/page/pagenettype.cpp \
+    ../QTfrontend/ui/page/pageeditteam.cpp \
+    ../QTfrontend/ui/page/pagenetgame.cpp \
+    ../QTfrontend/ui/page/pagedata.cpp \
+    ../QTfrontend/ui/page/pagedrawmap.cpp \
+    ../QTfrontend/ui/page/pageplayrecord.cpp \
+    ../QTfrontend/ui/page/pageselectweapon.cpp \
+    ../QTfrontend/ui/page/pageingame.cpp \
+    ../QTfrontend/ui/page/pagenetserver.cpp \
+    ../QTfrontend/ui/page/pagecampaign.cpp \
+    ../QTfrontend/ui/page/pageadmin.cpp \
+    ../QTfrontend/ui/page/pageinfo.cpp \
+    ../QTfrontend/ui/page/pageconnecting.cpp \
+    ../QTfrontend/ui/page/pagesingleplayer.cpp \
+    ../QTfrontend/ui/page/pagenet.cpp \
+    ../QTfrontend/ui/page/pagescheme.cpp \
+    ../QTfrontend/ui/page/pageoptions.cpp \
+    ../QTfrontend/ui/dialog/input_ip.cpp \
+    ../QTfrontend/ui/widget/igbox.cpp \
+    ../QTfrontend/ui/widget/selectWeapon.cpp \
+    ../QTfrontend/ui/widget/FreqSpinBox.cpp \
+    ../QTfrontend/ui/widget/SquareLabel.cpp \
+    ../QTfrontend/ui/widget/frameTeam.cpp \
+    ../QTfrontend/ui/widget/fpsedit.cpp \
+    ../QTfrontend/ui/widget/databrowser.cpp \
+    ../QTfrontend/ui/widget/teamselect.cpp \
+    ../QTfrontend/ui/widget/gamecfgwidget.cpp \
+    ../QTfrontend/ui/widget/chatwidget.cpp \
+    ../QTfrontend/ui/widget/itemNum.cpp \
+    ../QTfrontend/ui/widget/bgwidget.cpp \
+    ../QTfrontend/ui/widget/about.cpp \
+    ../QTfrontend/ui/widget/togglebutton.cpp \
+    ../QTfrontend/ui/widget/vertScrollArea.cpp \
+    ../QTfrontend/ui/widget/hedgehogerWidget.cpp \
+    ../QTfrontend/ui/widget/teamselhelper.cpp \
+    ../QTfrontend/ui/widget/drawmapwidget.cpp \
+    ../QTfrontend/ui/widget/weaponItem.cpp \
+    ../QTfrontend/ui/widget/mapContainer.cpp \
+    ../QTfrontend/ui/widget/HistoryLineEdit.cpp \
+    ../QTfrontend/ui/widget/SmartLineEdit.cpp \
+    ../QTfrontend/util/DataManager.cpp \
+    ../QTfrontend/net/tcpBase.cpp \
+    ../QTfrontend/net/netregister.cpp \
+    ../QTfrontend/net/proto.cpp \
+    ../QTfrontend/net/hwmap.cpp \
+    ../QTfrontend/net/netudpserver.cpp \
+    ../QTfrontend/net/newnetclient.cpp \
+    ../QTfrontend/net/netudpwidget.cpp \
+    ../QTfrontend/net/netserver.cpp \
+    ../QTfrontend/util/namegen.cpp \
+    ../QTfrontend/ui/page/AbstractPage.cpp \
+    ../QTfrontend/achievements.cpp \
+    ../QTfrontend/binds.cpp \
+    ../QTfrontend/drawmapscene.cpp \
+    ../QTfrontend/game.cpp \
+    ../QTfrontend/gameuiconfig.cpp \
+    ../QTfrontend/HWApplication.cpp \
+    ../QTfrontend/hwform.cpp \
+    ../QTfrontend/main.cpp \
+    ../QTfrontend/util/SDLInteraction.cpp \
+    ../QTfrontend/team.cpp \
+    ../QTfrontend/ui_hwform.cpp \
+    ../QTfrontend/hwconsts.cpp \
+    ../QTfrontend/ui/mouseoverfilter.cpp \
+    ../QTfrontend/ui/widget/qpushbuttonwithsound.cpp \
+    ../QTfrontend/ui/page/pagefeedback.cpp \
+    ../QTfrontend/model/roomslistmodel.cpp \
+    ../QTfrontend/ui/dialog/input_password.cpp \
+    ../QTfrontend/ui/widget/colorwidget.cpp \
+    ../QTfrontend/model/HatModel.cpp \
+    ../QTfrontend/model/GameStyleModel.cpp \
+    ../QTfrontend/ui/page/pagevideos.cpp \
+    ../QTfrontend/net/recorder.cpp \
+    ../QTfrontend/ui/dialog/ask_quit.cpp \
+    ../QTfrontend/ui/dialog/upload_video.cpp \
+    ../QTfrontend/campaign.cpp \
+    ../QTfrontend/model/playerslistmodel.cpp \
+    ../QTfrontend/util/LibavInteraction.cpp \
+    ../QTfrontend/util/FileEngine.cpp \
+    ../QTfrontend/ui/dialog/bandialog.cpp
+
+
+TRANSLATIONS += ../share/hedgewars/Data/Locale/hedgewars_ar.ts \
+    ../share/hedgewars/Data/Locale/hedgewars_bg.ts \
+    ../share/hedgewars/Data/Locale/hedgewars_cs.ts \
+    ../share/hedgewars/Data/Locale/hedgewars_da.ts \
+    ../share/hedgewars/Data/Locale/hedgewars_de.ts \ 
+    ../share/hedgewars/Data/Locale/hedgewars_el.ts \
+    ../share/hedgewars/Data/Locale/hedgewars_en.ts \ 
+    ../share/hedgewars/Data/Locale/hedgewars_es.ts \
+    ../share/hedgewars/Data/Locale/hedgewars_fi.ts \
+    ../share/hedgewars/Data/Locale/hedgewars_fr.ts \ 
+    ../share/hedgewars/Data/Locale/hedgewars_gl.ts \
+    ../share/hedgewars/Data/Locale/hedgewars_hu.ts \ 
+    ../share/hedgewars/Data/Locale/hedgewars_it.ts \ 
+    ../share/hedgewars/Data/Locale/hedgewars_ja.ts \ 
+    ../share/hedgewars/Data/Locale/hedgewars_ko.ts \ 
+    ../share/hedgewars/Data/Locale/hedgewars_lt.ts \
+    ../share/hedgewars/Data/Locale/hedgewars_ms.ts \
+    ../share/hedgewars/Data/Locale/hedgewars_nl.ts \ 
+    ../share/hedgewars/Data/Locale/hedgewars_pl.ts \ 
+    ../share/hedgewars/Data/Locale/hedgewars_pt_BR.ts \
+    ../share/hedgewars/Data/Locale/hedgewars_pt_PT.ts \
+    ../share/hedgewars/Data/Locale/hedgewars_ro.ts \
+    ../share/hedgewars/Data/Locale/hedgewars_ru.ts \
+    ../share/hedgewars/Data/Locale/hedgewars_sk.ts \
+    ../share/hedgewars/Data/Locale/hedgewars_sv.ts \
+    ../share/hedgewars/Data/Locale/hedgewars_tr_TR.ts \
+    ../share/hedgewars/Data/Locale/hedgewars_uk.ts \
+    ../share/hedgewars/Data/Locale/hedgewars_zh_CN.ts \
+    ../share/hedgewars/Data/Locale/hedgewars_zh_TW.ts
+
+RESOURCES += ../QTfrontend/hedgewars.qrc
+
+LIBS += -L../bin -lphysfs -lfrontlib
+
+macx {
+    QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.6
+    QMAKE_MAC_SDK=/Developer/SDKs/MacOSX10.6.sdk
+
+    OBJECTIVE_SOURCES += ../QTfrontend/*.m ../QTfrontend/*.mm
+    SOURCES += ../QTfrontend/AutoUpdater.cpp ../QTfrontend/InstallController.cpp \
+               ../../build/QTfrontend/hwconsts.cpp
+    HEADERS += ../QTfrontend/M3InstallController.h ../QTfrontend/M3Panel.h \
+               ../QTfrontend/NSWorkspace_RBAdditions.h ../QTfrontend/AutoUpdater.h \
+               ../QTfrontend/CocoaInitializer.h ../QTfrontend/InstallController.h \
+               ../QTfrontend/SparkleAutoUpdater.h
+
+    LIBS += -lobjc -framework AppKit -framework IOKit -framework Foundation -framework SDL -framework SDL_Mixer -framework Sparkle -DSPARKLE_ENABLED
+    INCLUDEPATH += /Library/Frameworks/SDL.framework/Headers /Library/Frameworks/SDL_Mixer.framework/Headers
+    CONFIG += warn_on x86
+    #CONFIG += x86 ppc x86_64 ppc64
+}
+
+win32 {
+    RC_FILE = ../QTfrontend/hedgewars.rc
+    SOURCES += ../QTfrontend/xfire.cpp
+    INCLUDEPATH += ../misc/winutils/include
+    LIBS += -L../misc/winutils/lib
+}
+
+!macx {
+    LIBS += -lSDL -lSDL_mixer -lSDL_net
+    !win32 {
+        INCLUDEPATH += /usr/local/include/SDL /usr/include/SDL
+    }
+}
+
+FORMS +=