# HG changeset patch # User sheepluva # Date 1317230876 -7200 # Node ID fdfc014198152d2353e24c15f2627aaa816a3a6f # Parent ddf020d0941ac09069bbdcf6cee78af9f0ca9cd2 I started to move stuff around, c'mon, hate on meee. PS: if your (clean) build is broken - let me know) diff -r ddf020d0941a -r fdfc01419815 QTfrontend/CMakeLists.txt --- 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) diff -r ddf020d0941a -r fdfc01419815 QTfrontend/SquareLabel.cpp --- 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 - * - * 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 -#include -#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(); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/SquareLabel.h --- 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 - * - * 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 -#include - -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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/about.cpp --- 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 - * - * 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 -#include -#include -#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( - "" - "

Hedgewars

" - "

" + QLabel::tr("Version") + " " + *cVersionString + "

" - "

http://www.hedgewars.org/


" + - QLabel::tr("This program is distributed under the GNU General Public License") + - "
" - ); - lbl1->setWordWrap(true); - mainLayout->addWidget(lbl1, 0, 1); - - QTextBrowser *lbl2 = new QTextBrowser(this); - - lbl2->setOpenExternalLinks(true); - lbl2->setText( - "" + - QString("

") + - QLabel::tr("Developers:") + - "

" - "Engine, frontend, net server: Andrey Korotaev <unC0Rr@gmail.com>
" - "Many frontend improvements: Igor Ulyanov <disinbox@gmail.com>
" - "Many engine and frontend improvements: Derek Pomery <nemo@m8y.org>
" - "Drill rocket, Ballgun, RC Plane weapons: Martin Boze <afffect@gmail.com>
" - "Mine number and time game settings: David A. Cuadrado <krawek@gmail.com>
" - "Frontend improvements: Martin Minarik <ttsmj@pokec.sk>
" - "Frontend improvements: Kristian Lehmann <email@thexception.net>
" - "Mac OS X/iPhone port, OpenGL-ES conversion: Vittorio Giovara <vittorio.giovara@gmail.com>
" - "Many engine and frontend improvements (and bugs): Richard Karolyi <sheepluva@" "ercatec.net>
" - "Gamepad and Lua integration: Mario Liebisch <mario.liebisch@gmail.com>
" - "Many engine improvements and graphics: Carlos Vives <mail@carlosvives.es>
" - "Maze maps: Henning Kühn <prg@cooco.de>
" - "Engine and frontend improvements: Henrik Rostedt <henrik.rostedt@gmail.com>
" - "Lua game modes and missions: John Lambert <redgrinner@gmail.com>
" - "Frontend improvements: Mayur Pawashe <zorgiepoo@gmail.com>
" - "Android port: Richard Deurwaarder <xeli@xelification.com>
" - "

" + - - QLabel::tr("Art:") + "

" - + QString::fromUtf8( - "

John Dum <fizzy@gmail.com>" - "
" - "Joshua Frese <joshfrese@gmail.com>" - "
" - "Stanko Tadić <stanko@mfhinc.net>" - "
" - "Julien Koesten <julienkoesten@aol.com>" - "
" - "Joshua O'Sullivan <coheedftw@hotmail.co.uk>" - "
" - "Nils Lück <nils.luck.design@gmail.com>" - "
" - "Guillaume Englert <genglert@hybird.org>" - "
" - "Hats: Trey Perry <tx.perry.j@gmail.com>" - "

") + - QLabel::tr("Sounds:") + "

" - "Hedgehogs voice: Stephen Alexander <ArmagonNo1@gmail.com>" - "
" - "John Dum <fizzy@gmail.com>" - "
" - "Jonatan Nilsson <jonatanfan@gmail.com>" - "
" - "Daniel Martin <elhombresinremedio@gmail.com>" - "

" + - - QLabel::tr("Translations:") + "

" - + QString::fromUtf8( - "Brazilian Portuguese: Romulo Fernandes Machado <abra185@gmail.com>
" - "Bulgarian: Svetoslav Stefanov
" - "Czech: Petr Řezáček <rezacek@gmail.com>
" - "Chinese: Jie Luo <lililjlj@gmail.com>
" - "English: Andrey Korotaev <unC0Rr@gmail.com>
" - "Finnish: Nina Kuisma <ninnnu@gmail.com>
" - "French: Antoine Turmel <geekshadow@gmail.com>
" - "German: Peter Hüwe <PeterHuewe@gmx.de>, Mario Liebisch <mario.liebisch@gmail.com>, Richard Karolyi <sheepluva@" "ercatec.net>
" - "Greek: <talos_kriti@yahoo.gr>
" - "Italian: Luca Bonora <bonora.luca@gmail.com>, Marco Bresciani
" - "Japanese: ADAM Etienne <etienne.adam@gmail.com>
" - "Korean: Anthony Bellew <webmaster@anthonybellew.com>
" - "Lithuanian: Lukas Urbonas <lukasu08@gmail.com>
" - "Polish: Maciej Mroziński <mynick2@o2.pl>, Wojciech Latkowski <magik17l@gmail.com>, Piotr Mitana, Maciej Górny
" - "Portuguese: Fábio Canário <inufabie@gmail.com>
" - "Russian: Andrey Korotaev <unC0Rr@gmail.com>
" - "Slovak: Jose Riha
" - "Spanish: Carlos Vives <mail@carlosvives.es>
" - "Swedish: Niklas Grahn <raewolusjoon@yaoo.com>, Henrik Rostedt <henrik.rostedt@gmail.com>
" - "Ukrainian: Eugene V. Lyubimkin <jackyf.devel@gmail.com>, Igor Paliychuk <mansonigor@gmail.com>, Eugene Sakara <eresid@gmail.com>" - "

") + - - QLabel::tr("Special thanks:") + "

" - "Aleksey Andreev <blaknayabr@gmail.com>
" - "Aleksander Rudalev <alexv@pomorsu.ru>
" - "Natasha Korotaeva <layout@pisem.net>
" - "Adam Higerd (aka ahigerd at FreeNode)" - "

" - ); - mainLayout->addWidget(lbl2, 1, 1); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/about.h --- 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 - * - * 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 - - -class About : public QWidget -{ - Q_OBJECT - -public: - About(QWidget * parent = 0); -}; - -#endif // _ABOUT_H diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ammoSchemeModel.cpp --- 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 - * - * 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 -#include - -#include "ammoSchemeModel.h" -#include "hwconsts.h" - -QList defaultScheme = QList() - << 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 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 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 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 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 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 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 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 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 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 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 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 newScheme = defaultScheme; - newScheme[0] = QVariant(tr("new")); - schemes.insert(schemes.size(), newScheme); - } - else - { - QList 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 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(); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ammoSchemeModel.h --- 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 - * - * 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 -#include -#include -#include - -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 > 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 netScheme; -}; - -#endif // _AMMO_SCHEME_MODEL_INCLUDED diff -r ddf020d0941a -r fdfc01419815 QTfrontend/bgwidget.cpp --- 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 - * Copyright (c) 2009-2011 Andrey Korotaev - * - * 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(); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/bgwidget.h --- 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 - * Copyright (c) 2009-2011 Andrey Korotaev - * - * 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 -//#include -#include -#include -#include -#include -#include - -#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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/chatwidget.cpp --- 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 - * Copyright (c) 2007-2011 Andrey Korotaev - * - * 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#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(dynamic_cast(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 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(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, "\\3"); - - // "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("%2").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("%1").arg(line).arg(cssClass); - - chatStrings.append(line); - - chatText->setHtml(chatStrings.join("
")); - - chatText->moveCursor(QTextCursor::End); -} - -void HWChatWidget::onServerMessage(const QString& str) -{ - if (chatStrings.size() > 250) - chatStrings.removeFirst(); - - chatStrings.append("
" + str + "
"); - - chatText->setHtml(chatStrings.join("
")); - - 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 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 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); - } -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/chatwidget.h --- 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 - * Copyright (c) 2007-2011 Andrey Korotaev - * - * 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 -#include -#include -#include -#include - -#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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/databrowser.cpp --- 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 -#include -#include -#include -#include - -#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(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(); - } -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/databrowser.h --- 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 -#include - -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 resources; - QSet requestedResources; - - QVariant loadResource(int type, const QUrl & name); - -private slots: - void resourceDownloaded(); -}; - -#endif // DATABROWSER_H diff -r ddf020d0941a -r fdfc01419815 QTfrontend/drawmapwidget.cpp --- 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 - * - * 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 -#include -#include - -#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()))); - } -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/drawmapwidget.h --- 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 - * - * 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 -#include -#include -#include - -#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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/fpsedit.cpp --- 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 - * - * 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)); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/fpsedit.h --- 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 - * - * 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 - -class FPSEdit : public QSpinBox -{ - Q_OBJECT - -public: - FPSEdit(QWidget * parent = 0); - -protected: - QString textFromValue (int value) const; -}; - -#endif // _FPSEDIT_H diff -r ddf020d0941a -r fdfc01419815 QTfrontend/frameTeam.cpp --- 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 - * Copyright (c) 2007-2011 Andrey Korotaev - * - * 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 -#include -#include - -#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(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::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(getTeamWidget(team)); - if(!pTeamShowWidget) return; - pTeamShowWidget->setHHNum(team.numHedgehogs()); -} - -void FrameTeams::setTeamColor(const HWTeam& team) -{ - TeamShowWidget* pTeamShowWidget = dynamic_cast(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); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/frameTeam.h --- 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 - * Copyright (c) 2007-2011 Andrey Korotaev - * - * 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 -#include -#include - -#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 availableColors; - QList::Iterator currentColor; - - void emitTeamColorChanged(const HWTeam& team); - - QVBoxLayout mainLayout; - typedef QMap tmapTeamToWidget; - tmapTeamToWidget teamToWidget; - bool nonInteractive; -}; - -#endif // _FRAME_TAM_INCLUDED diff -r ddf020d0941a -r fdfc01419815 QTfrontend/gamecfgwidget.cpp --- 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 - * - * 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 -#include -#include -#include -#include -#include -#include -#include -#include - -#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 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 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())); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/gamecfgwidget.h --- 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 - * - * 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 -#include -#include -#include -#include - -#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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/hats.cpp --- 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 - * - * 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 -#include -#include -#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; -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/hats.h --- 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 - * - * 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 -#include -#include -#include -#include - -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 > hats; -}; - -#endif // _HATS_INCLUDED diff -r ddf020d0941a -r fdfc01419815 QTfrontend/hedgehogerWidget.cpp --- 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 - * Copyright (c) 2008-2011 Andrey Korotaev - * - * 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(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; -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/hedgehogerWidget.h --- 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 - * Copyright (c) 2007-2011 Andrey Korotaev - * - * 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/hwmap.cpp --- 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 - * Copyright (c) 2007-2011 Andrey Korotaev - * - * 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("!"); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/hwmap.h --- 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 - * Copyright (c) 2006-2011 Andrey Korotaev - * - * 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 -#include -#include - -#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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/igbox.cpp --- 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 - * - * 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 -#include -#include -#include - -#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; -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/igbox.h --- 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 - * - * 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 -#include - -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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/input_ip.cpp --- 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 - * - * 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 -#include -#include -#include -#include - -#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); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/input_ip.h --- 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 - * - * 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 -#include - -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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/itemNum.cpp --- 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 - * - * 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 -#include - -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 - * - * 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 -#include - -#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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/misc.cpp --- 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 - * - * 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" diff -r ddf020d0941a -r fdfc01419815 QTfrontend/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 - * - * 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 -#include - -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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/namegen.cpp --- 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 - * Copyright (c) 2009-2011 Andrey Korotaev - * - * 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 -#include -#include -#include -#include "namegen.h" -#include "hwform.h" -#include "hwconsts.h" - - -HWNamegen::HWNamegen() {} - -QList HWNamegen::TypesTeamnames; -QList 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())]; -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/namegen.h --- 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 - * Copyright (c) 2009-2011 Andrey Korotaev - * - * 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 - -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 TypesTeamnames; - static QList 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/net/hwmap.cpp --- /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 + * Copyright (c) 2007-2011 Andrey Korotaev + * + * 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("!"); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/net/hwmap.h --- /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 + * Copyright (c) 2006-2011 Andrey Korotaev + * + * 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 +#include +#include + +#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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/net/netregister.cpp --- /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 + * + * 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() +{ + +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/net/netregister.h --- /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 + * + * 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 + +class HWNetRegisterServer : public QObject +{ + Q_OBJECT + +public: + HWNetRegisterServer(QObject *parent, const QString & descr, quint16 port); + +public slots: + virtual void unregister(); +}; + +#endif // _NET_REGISTER_INCLUDED diff -r ddf020d0941a -r fdfc01419815 QTfrontend/net/netserver.cpp --- /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 + * Copyright (c) 2008-2011 Andrey Korotaev + * + * 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 + +#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; +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/net/netserver.h --- /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 + * Copyright (c) 2008-2011 Andrey Korotaev + * + * 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 +#include + +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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/net/netudpserver.cpp --- /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 + * Copyright (c) 2008-2011 Andrey Korotaev + * + * 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 + +#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(); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/net/netudpserver.h --- /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 + * Copyright (c) 2008-2011 Andrey Korotaev + * + * 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 +#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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/net/netudpwidget.cpp --- /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 + * Copyright (c) 2007-2011 Andrey Korotaev + * + * 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 + +#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()]; +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/net/netudpwidget.h --- /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 + * Copyright (c) 2007-2011 Andrey Korotaev + * + * 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/net/newnetclient.cpp --- /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 + * Copyright (c) 2008-2011 Andrey Korotaev + * + * 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 +#include +#include + +#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; + } + } +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/net/newnetclient.h --- /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 + * Copyright (c) 2008-2011 Andrey Korotaev + * + * 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 +#include +#include +#include + +#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 + 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 + 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/net/proto.cpp --- /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 + * + * 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); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/net/proto.h --- /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 + * + * 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 +#include +#include + + +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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/net/tcpBase.cpp --- /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 + * Copyright (c) 2007-2011 Andrey Korotaev + * + * 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 +#include + +#include + +#include "hwconsts.h" + +QList srvsList; +QPointer 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); + } + } +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/net/tcpBase.h --- /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 + * Copyright (c) 2007-2011 Andrey Korotaev + * + * 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 +#include +#include +#include +#include +#include +#include +#include + +#include + +#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 IPCServer; + + bool m_isDemoMode; + void RealStart(); + QPointer IPCSocket; + + private slots: + void NewConnection(); + void ClientDisconnect(); + void ClientRead(); + void StartProcessError(QProcess::ProcessError error); + + void tcpServerReady(); +}; + +#endif // _TCPBASE_INCLUDED diff -r ddf020d0941a -r fdfc01419815 QTfrontend/netregister.cpp --- 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 - * - * 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() -{ - -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/netregister.h --- 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 - * - * 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 - -class HWNetRegisterServer : public QObject -{ - Q_OBJECT - -public: - HWNetRegisterServer(QObject *parent, const QString & descr, quint16 port); - -public slots: - virtual void unregister(); -}; - -#endif // _NET_REGISTER_INCLUDED diff -r ddf020d0941a -r fdfc01419815 QTfrontend/netserver.cpp --- 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 - * Copyright (c) 2008-2011 Andrey Korotaev - * - * 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 - -#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; -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/netserver.h --- 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 - * Copyright (c) 2008-2011 Andrey Korotaev - * - * 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 -#include - -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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/netserverslist.cpp --- 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 - * - * 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 -#include - -#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; -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/netserverslist.h --- 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 - * - * 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 -#include - -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 games; -}; - -#endif // _NET_SERVERSLIST_INCLUDED diff -r ddf020d0941a -r fdfc01419815 QTfrontend/netudpserver.cpp --- 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 - * Copyright (c) 2008-2011 Andrey Korotaev - * - * 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 - -#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(); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/netudpserver.h --- 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 - * Copyright (c) 2008-2011 Andrey Korotaev - * - * 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 -#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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/netudpwidget.cpp --- 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 - * Copyright (c) 2007-2011 Andrey Korotaev - * - * 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 - -#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()]; -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/netudpwidget.h --- 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 - * Copyright (c) 2007-2011 Andrey Korotaev - * - * 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/newnetclient.cpp --- 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 - * Copyright (c) 2008-2011 Andrey Korotaev - * - * 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 -#include -#include - -#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; - } - } -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/newnetclient.h --- 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 - * Copyright (c) 2008-2011 Andrey Korotaev - * - * 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 -#include -#include -#include - -#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 - 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 - 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pageadmin.cpp --- 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 - * - * 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 -#include -#include -#include -#include -#include - -#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); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pageadmin.h --- 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 - * - * 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagecampaign.cpp --- 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 - * - * 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 -#include -#include - -#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(); -} - - diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagecampaign.h --- 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 - * - * 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pageconnecting.cpp --- 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 - * - * 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 -#include - -#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(); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pageconnecting.h --- 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 - * - * 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagedata.cpp --- 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 - * - * 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#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(sender()); - - if(reply) - { - QString html = QString::fromUtf8(reply->readAll()); - int begin = html.indexOf(""); - int end = html.indexOf(""); - if(begin != -1 && begin < end) - { - html.truncate(end); - html.remove(0, begin); - } - web->setHtml(html); - } -} - -void PageDataDownload::fileDownloaded() -{ - QNetworkReply * reply = qobject_cast(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(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; -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagedata.h --- 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 - * - * 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 -#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 progressBars; - QVBoxLayout *progressBarsLayout; - - bool extractDataPack(QByteArray * buf); - -private slots: - void request(const QUrl &url); - - void pageDownloaded(); - void fileDownloaded(); - void downloadProgress(qint64, qint64); -}; - -#endif diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagedrawmap.cpp --- 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 - * - * 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 -#include -#include - -#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); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagedrawmap.h --- 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 - * - * 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 - diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pageeditteam.cpp --- 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 - * - * 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#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(); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pageeditteam.h --- 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 - * - * 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 - diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagegamestats.cpp --- 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 - * - * 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 -#include -#include -#include -#include -#include - -#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("

" + PageGameStats::tr("Details") + "

"); - 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("

" + PageGameStats::tr("Health graph") + "

"); - 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("

" + PageGameStats::tr("Ranking") + "

"); - 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 >::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 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("

%1

").arg(info)); - break; - } - case 'D' : { - int i = info.indexOf(' '); - QString message = "

" + PageGameStats::tr("The best shot award was won by %1 with %2 pts.").arg(info.mid(i + 1), info.left(i)) + "

"; - AddStatText(message); - break; - } - case 'k' : { - int i = info.indexOf(' '); - int num = info.left(i).toInt(); - QString message = "

" + PageGameStats::tr("The best killer is %1 with %2 kills in a turn.", "", num).arg(info.mid(i + 1), info.left(i)) + "

"; - AddStatText(message); - break; - } - case 'K' : { - int num = info.toInt(); - QString message = "

" + PageGameStats::tr("A total of %1 hedgehog(s) were killed during this round.", "", num).arg(num) + "

"; - 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("

local team: " + info + "

"); - 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 = ""; - break; - case 2: - image = ""; - break; - case 3: - image = ""; - break; - default: - image = ""; - break; - } - - QString message; - QString killstring = PageGameStats::tr("(%1 kill)", "", kills).arg(kills); - - message = QString("

%1 %2. %3 ").arg(image, QString::number(playerPosition), playername, clanColor.name()) + killstring + "

"; - - labelGameRank->setText(labelGameRank->text() + message); - break; - } - case 's' : { - int i = info.indexOf(' '); - int num = info.left(i).toInt(); - QString message = "

" + PageGameStats::tr("%1 thought it's good to shoot his own hedgehogs with %2 pts.", "", num).arg(info.mid(i + 1)).arg(num) + "

"; - AddStatText(message); - break; - } - case 'S' : { - int i = info.indexOf(' '); - int num = info.left(i).toInt(); - QString message = "

" + PageGameStats::tr("%1 killed %2 of his own hedgehogs.", "", num).arg(info.mid(i + 1)).arg(num) + "

"; - AddStatText(message); - break; - } - case 'B' : { - int i = info.indexOf(' '); - int num = info.left(i).toInt(); - QString message = "

" + PageGameStats::tr("%1 was scared and skipped turn %2 times.", "", num).arg(info.mid(i + 1)).arg(num) + "

"; - AddStatText(message); - break; - } - - } -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagegamestats.h --- 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 - * - * 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 -#include -#include - -#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 > healthPoints; - unsigned int playerPosition; - quint32 lastColor; - -protected: - QLayout * bodyLayoutDefinition(); - QLayout * footerLayoutDefinition(); - void connectSignals(); -}; - -#endif // STATSPAGE_H diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pageinfo.cpp --- 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 - * - * 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 -#include - -#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(); -} - diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pageinfo.h --- 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 - * - * 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 - diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pageingame.cpp --- 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 - * - * 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 -#include - -#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(); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pageingame.h --- 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 - * - * 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 - diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagemain.cpp --- 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 - * - * 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 -#include -#include -#include -#include - -#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("http://www.hedgewars.org/"); - 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("Facebook").arg("Twitter"); - 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()]; -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagemain.h --- 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 - * - * 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 - diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagemultiplayer.cpp --- 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 - * - * 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 -#include - -#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(); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagemultiplayer.h --- 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 - * - * 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 - - diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagenet.cpp --- 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 - * - * 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 -#include -#include -#include -#include -#include - -#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(tvServersList->model())->updateList(); - - connect(BtnUpdateSList, SIGNAL(clicked()), static_cast(tvServersList->model()), SLOT(updateList())); - connect(tvServersList, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(slotConnect())); -} - -void PageNet::slotConnect() -{ - HWNetServersModel * model = static_cast(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); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagenet.h --- 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 - * - * 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 - diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagenetgame.cpp --- 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 - * - * 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 -#include -#include -#include -#include - -#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); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagenetgame.h --- 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 - * - * 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagenetserver.cpp --- 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 - * - * 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 -#include -#include -#include -#include -#include -#include -#include - -#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); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagenetserver.h --- 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 - * - * 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagenettype.cpp --- 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 - * - * 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 -#include - -#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(); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagenettype.h --- 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 - * - * 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pageoptions.cpp --- 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 - * - * 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#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); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pageoptions.h --- 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 - * - * 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 - diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pageplayrecord.cpp --- 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 - * - * 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 -#include -#include -#include -#include -#include -#include -#include - -#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; -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pageplayrecord.h --- 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 - * - * 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 - -#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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pageroomslist.cpp --- 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 - * - * 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 -#include -#include -#include -#include -#include -#include -#include - -#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 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)); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pageroomslist.h --- 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 - * - * 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagescheme.cpp --- 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 - * - * 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#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("" + ToggleButtonWidget::tr("Fort Mode") + ":
" + 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("" + ToggleButtonWidget::tr("Divide Teams") + ":
" + 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("" + ToggleButtonWidget::tr("Solid Land") + ":
" + 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("" + ToggleButtonWidget::tr("Add Border") + ":
" + 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("" + ToggleButtonWidget::tr("Low Gravity") + ":
" + tr("Lower gravity")); - glGMLayout->addWidget(TBW_lowGravity,0,4,1,1); - - TBW_laserSight = new ToggleButtonWidget(gbGameModes, ":/res/btnLaserSight.png"); - TBW_laserSight->setToolTip("" + ToggleButtonWidget::tr("Laser Sight") + ":
" + 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("" + ToggleButtonWidget::tr("Invulnerable") + ":
" + 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("" + ToggleButtonWidget::tr("Reset Health") + ":
" + 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("" + ToggleButtonWidget::tr("Vampirism") + ":
" + 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("" + ToggleButtonWidget::tr("Karma") + ":
" + 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("" + ToggleButtonWidget::tr("Artillery") + ":
" + 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("" + ToggleButtonWidget::tr("Random Order") + ":
" + 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("" + ToggleButtonWidget::tr("King") + ":
" + 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("" + ToggleButtonWidget::tr("Place Hedgehogs") + ":
" + 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("" + ToggleButtonWidget::tr("Clan Shares Ammo") + ":
" + 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("" + ToggleButtonWidget::tr("Disable Girders") + ":
" + 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("" + ToggleButtonWidget::tr("Disable Land Objects") + ":
" + 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("" + ToggleButtonWidget::tr("AI Survival Mode") + ":
" + tr("AI respawns on death.")); - glGMLayout->addWidget(TBW_aisurvival,3,2,1,1); - - TBW_infattack = new ToggleButtonWidget(gbGameModes, ":/res/btnInfAttack.png"); - TBW_infattack->setToolTip("" + ToggleButtonWidget::tr("Unlimited Attacks") + ":
" + 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("" + ToggleButtonWidget::tr("Reset Weapons") + ":
" + 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("" + ToggleButtonWidget::tr("Per Hedgehog Ammo") + ":
" + 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("" + ToggleButtonWidget::tr("Disable Wind") + ":
" + 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("" + ToggleButtonWidget::tr("More Wind") + ":
" + 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("" + ToggleButtonWidget::tr("Tag Team") + ":
" + 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("" + ToggleButtonWidget::tr("Add Bottom Border") + ":
" + 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); -} - - diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagescheme.h --- 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 - * - * 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pageselectweapon.cpp --- 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 - * - * 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 -#include -#include -#include - -#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(); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pageselectweapon.h --- 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 - * - * 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagesingleplayer.cpp --- 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 - * - * 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 -#include - -#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(); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagesingleplayer.h --- 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 - * - * 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 - diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagetraining.cpp --- 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 - * - * 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 -#include -#include -#include -#include -#include - -#include -#include -#include - -#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("

" + caption +"

"); - lblDescription->setText(description); - } - else - { - btnPreview->setIcon(QIcon(":/res/Trainings.png")); - lblCaption->setText(tr("Select a mission!")); - // TODO better text and tr() - lblDescription->setText(""); - } -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/pagetraining.h --- 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 - * - * 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 - -#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 - diff -r ddf020d0941a -r fdfc01419815 QTfrontend/proto.cpp --- 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 - * - * 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); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/proto.h --- 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 - * - * 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 -#include -#include - - -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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/qaspectratiolayout.cpp --- 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; -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/qaspectratiolayout.h --- 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 -#include -#include -#include -#include - - -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_ */ diff -r ddf020d0941a -r fdfc01419815 QTfrontend/selectWeapon.cpp --- 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 - * Copyright (c) 2008-2011 Andrey Korotaev - * - * 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -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); - } -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/selectWeapon.h --- 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 - * Copyright (c) 2008-2011 Andrey Korotaev - * - * 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 -#include -#include - -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 ItemsList; - typedef QMap twi; - twi weaponItems; - //layout element for each tab: - QGridLayout* p1Layout; - QGridLayout* p2Layout; - QGridLayout* p3Layout; - QGridLayout* p4Layout; -}; - -#endif // _SELECT_WEAPON_INCLUDED diff -r ddf020d0941a -r fdfc01419815 QTfrontend/tcpBase.cpp --- 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 - * Copyright (c) 2007-2011 Andrey Korotaev - * - * 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 -#include - -#include - -#include "hwconsts.h" - -QList srvsList; -QPointer 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); - } - } -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/tcpBase.h --- 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 - * Copyright (c) 2007-2011 Andrey Korotaev - * - * 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 -#include -#include -#include -#include -#include -#include -#include - -#include - -#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 IPCServer; - - bool m_isDemoMode; - void RealStart(); - QPointer IPCSocket; - - private slots: - void NewConnection(); - void ClientDisconnect(); - void ClientRead(); - void StartProcessError(QProcess::ProcessError error); - - void tcpServerReady(); -}; - -#endif // _TCPBASE_INCLUDED diff -r ddf020d0941a -r fdfc01419815 QTfrontend/team.cpp --- 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) : diff -r ddf020d0941a -r fdfc01419815 QTfrontend/teamselect.cpp --- 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 - * Copyright (c) 2007-2011 Andrey Korotaev - * - * 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 - -#include -#include -#include -#include -#include - -#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(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::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::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::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::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::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::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::iterator itDontPlay=std::find(m_curNotPlayingTeams.begin(), m_curNotPlayingTeams.end(), team); - QList::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(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& 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 TeamSelWidget::getPlayingTeams() const -{ - return curPlayingTeams; -} - -QList TeamSelWidget::getNotPlayingTeams() const -{ - return m_curNotPlayingTeams; -} - -void TeamSelWidget::pre_changeTeamStatus(HWTeam team) -{ - team.setColor(framePlaying->getNextColor()); - emit acceptRequested(team); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/teamselect.h --- 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 - * Copyright (c) 2007-2011 Andrey Korotaev - * - * 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 -#include -#include -#include - -#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& teamslist); - bool isPlaying(HWTeam team) const; - QList getPlayingTeams() const; - QList 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 curPlayingTeams; - QList m_curNotPlayingTeams; -}; - -#endif // _TEAM_SELECT_INCLUDED diff -r ddf020d0941a -r fdfc01419815 QTfrontend/teamselhelper.cpp --- 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 - * Copyright (c) 2007-2011 Andrey Korotaev - * - * 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 -#include -#include - -#include - -#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(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; -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/teamselhelper.h --- 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 - * Copyright (c) 2007-2011 Andrey Korotaev - * - * 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 -#include -#include -#include - -#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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/themesmodel.cpp --- 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()); - 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; - } - -} - - - - diff -r ddf020d0941a -r fdfc01419815 QTfrontend/themesmodel.h --- 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 -#include -#include - -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 > m_data; -}; - -#endif // THEMESMODEL_H diff -r ddf020d0941a -r fdfc01419815 QTfrontend/togglebutton.cpp --- 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 - * Copyright (c) 2009-2011 Andrey Korotaev - * - * 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); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/togglebutton.h --- 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 - * Copyright (c) 2009-2011 Andrey Korotaev - * - * 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 -#include -#include -#include -#include - -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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/dialog/input_ip.cpp --- /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 + * + * 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 +#include +#include +#include +#include + +#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); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/dialog/input_ip.h --- /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 + * + * 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 +#include + +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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/model/ammoSchemeModel.cpp --- /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 + * + * 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 +#include + +#include "ammoSchemeModel.h" +#include "hwconsts.h" + +QList defaultScheme = QList() + << 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 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 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 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 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 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 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 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 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 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 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 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 newScheme = defaultScheme; + newScheme[0] = QVariant(tr("new")); + schemes.insert(schemes.size(), newScheme); + } + else + { + QList 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 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(); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/model/ammoSchemeModel.h --- /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 + * + * 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 +#include +#include +#include + +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 > 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 netScheme; +}; + +#endif // _AMMO_SCHEME_MODEL_INCLUDED diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/model/hats.cpp --- /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 + * + * 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 +#include +#include +#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; +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/model/hats.h --- /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 + * + * 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 +#include +#include +#include +#include + +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 > hats; +}; + +#endif // _HATS_INCLUDED diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/model/netserverslist.cpp --- /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 + * + * 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 +#include + +#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; +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/model/netserverslist.h --- /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 + * + * 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 +#include + +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 games; +}; + +#endif // _NET_SERVERSLIST_INCLUDED diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/model/themesmodel.cpp --- /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()); + 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; + } + +} + + + + diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/model/themesmodel.h --- /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 +#include +#include + +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 > m_data; +}; + +#endif // THEMESMODEL_H diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pageadmin.cpp --- /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 + * + * 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 +#include +#include +#include +#include +#include + +#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); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pageadmin.h --- /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 + * + * 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagecampaign.cpp --- /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 + * + * 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 +#include +#include + +#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(); +} + + diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagecampaign.h --- /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 + * + * 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pageconnecting.cpp --- /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 + * + * 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 +#include + +#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(); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pageconnecting.h --- /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 + * + * 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagedata.cpp --- /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 + * + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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(sender()); + + if(reply) + { + QString html = QString::fromUtf8(reply->readAll()); + int begin = html.indexOf(""); + int end = html.indexOf(""); + if(begin != -1 && begin < end) + { + html.truncate(end); + html.remove(0, begin); + } + web->setHtml(html); + } +} + +void PageDataDownload::fileDownloaded() +{ + QNetworkReply * reply = qobject_cast(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(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; +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagedata.h --- /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 + * + * 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 +#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 progressBars; + QVBoxLayout *progressBarsLayout; + + bool extractDataPack(QByteArray * buf); + +private slots: + void request(const QUrl &url); + + void pageDownloaded(); + void fileDownloaded(); + void downloadProgress(qint64, qint64); +}; + +#endif diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagedrawmap.cpp --- /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 + * + * 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 +#include +#include + +#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); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagedrawmap.h --- /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 + * + * 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 + diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pageeditteam.cpp --- /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 + * + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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(); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pageeditteam.h --- /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 + * + * 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 + diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagegamestats.cpp --- /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 + * + * 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 +#include +#include +#include +#include +#include + +#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("

" + PageGameStats::tr("Details") + "

"); + 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("

" + PageGameStats::tr("Health graph") + "

"); + 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("

" + PageGameStats::tr("Ranking") + "

"); + 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 >::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 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("

%1

").arg(info)); + break; + } + case 'D' : { + int i = info.indexOf(' '); + QString message = "

" + PageGameStats::tr("The best shot award was won by %1 with %2 pts.").arg(info.mid(i + 1), info.left(i)) + "

"; + AddStatText(message); + break; + } + case 'k' : { + int i = info.indexOf(' '); + int num = info.left(i).toInt(); + QString message = "

" + PageGameStats::tr("The best killer is %1 with %2 kills in a turn.", "", num).arg(info.mid(i + 1), info.left(i)) + "

"; + AddStatText(message); + break; + } + case 'K' : { + int num = info.toInt(); + QString message = "

" + PageGameStats::tr("A total of %1 hedgehog(s) were killed during this round.", "", num).arg(num) + "

"; + 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("

local team: " + info + "

"); + 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 = ""; + break; + case 2: + image = ""; + break; + case 3: + image = ""; + break; + default: + image = ""; + break; + } + + QString message; + QString killstring = PageGameStats::tr("(%1 kill)", "", kills).arg(kills); + + message = QString("

%1 %2. %3 ").arg(image, QString::number(playerPosition), playername, clanColor.name()) + killstring + "

"; + + labelGameRank->setText(labelGameRank->text() + message); + break; + } + case 's' : { + int i = info.indexOf(' '); + int num = info.left(i).toInt(); + QString message = "

" + PageGameStats::tr("%1 thought it's good to shoot his own hedgehogs with %2 pts.", "", num).arg(info.mid(i + 1)).arg(num) + "

"; + AddStatText(message); + break; + } + case 'S' : { + int i = info.indexOf(' '); + int num = info.left(i).toInt(); + QString message = "

" + PageGameStats::tr("%1 killed %2 of his own hedgehogs.", "", num).arg(info.mid(i + 1)).arg(num) + "

"; + AddStatText(message); + break; + } + case 'B' : { + int i = info.indexOf(' '); + int num = info.left(i).toInt(); + QString message = "

" + PageGameStats::tr("%1 was scared and skipped turn %2 times.", "", num).arg(info.mid(i + 1)).arg(num) + "

"; + AddStatText(message); + break; + } + + } +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagegamestats.h --- /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 + * + * 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 +#include +#include + +#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 > healthPoints; + unsigned int playerPosition; + quint32 lastColor; + +protected: + QLayout * bodyLayoutDefinition(); + QLayout * footerLayoutDefinition(); + void connectSignals(); +}; + +#endif // STATSPAGE_H diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pageinfo.cpp --- /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 + * + * 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 +#include + +#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(); +} + diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pageinfo.h --- /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 + * + * 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 + diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pageingame.cpp --- /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 + * + * 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 +#include + +#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(); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pageingame.h --- /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 + * + * 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 + diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagemain.cpp --- /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 + * + * 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 +#include +#include +#include +#include + +#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("http://www.hedgewars.org/"); + 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("Facebook").arg("Twitter"); + 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()]; +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagemain.h --- /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 + * + * 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 + diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagemultiplayer.cpp --- /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 + * + * 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 +#include + +#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(); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagemultiplayer.h --- /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 + * + * 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 + + diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagenet.cpp --- /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 + * + * 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 +#include +#include +#include +#include +#include + +#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(tvServersList->model())->updateList(); + + connect(BtnUpdateSList, SIGNAL(clicked()), static_cast(tvServersList->model()), SLOT(updateList())); + connect(tvServersList, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(slotConnect())); +} + +void PageNet::slotConnect() +{ + HWNetServersModel * model = static_cast(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); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagenet.h --- /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 + * + * 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 + diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagenetgame.cpp --- /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 + * + * 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 +#include +#include +#include +#include + +#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); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagenetgame.h --- /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 + * + * 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagenetserver.cpp --- /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 + * + * 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 +#include +#include +#include +#include +#include +#include +#include + +#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); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagenetserver.h --- /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 + * + * 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagenettype.cpp --- /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 + * + * 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 +#include + +#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(); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagenettype.h --- /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 + * + * 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pageoptions.cpp --- /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 + * + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pageoptions.h --- /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 + * + * 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 + diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pageplayrecord.cpp --- /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 + * + * 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 +#include +#include +#include +#include +#include +#include +#include + +#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; +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pageplayrecord.h --- /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 + * + * 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 + +#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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pageroomslist.cpp --- /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 + * + * 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 +#include +#include +#include +#include +#include +#include +#include + +#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 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)); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pageroomslist.h --- /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 + * + * 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagescheme.cpp --- /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 + * + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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("" + ToggleButtonWidget::tr("Fort Mode") + ":
" + 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("" + ToggleButtonWidget::tr("Divide Teams") + ":
" + 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("" + ToggleButtonWidget::tr("Solid Land") + ":
" + 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("" + ToggleButtonWidget::tr("Add Border") + ":
" + 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("" + ToggleButtonWidget::tr("Low Gravity") + ":
" + tr("Lower gravity")); + glGMLayout->addWidget(TBW_lowGravity,0,4,1,1); + + TBW_laserSight = new ToggleButtonWidget(gbGameModes, ":/res/btnLaserSight.png"); + TBW_laserSight->setToolTip("" + ToggleButtonWidget::tr("Laser Sight") + ":
" + 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("" + ToggleButtonWidget::tr("Invulnerable") + ":
" + 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("" + ToggleButtonWidget::tr("Reset Health") + ":
" + 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("" + ToggleButtonWidget::tr("Vampirism") + ":
" + 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("" + ToggleButtonWidget::tr("Karma") + ":
" + 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("" + ToggleButtonWidget::tr("Artillery") + ":
" + 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("" + ToggleButtonWidget::tr("Random Order") + ":
" + 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("" + ToggleButtonWidget::tr("King") + ":
" + 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("" + ToggleButtonWidget::tr("Place Hedgehogs") + ":
" + 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("" + ToggleButtonWidget::tr("Clan Shares Ammo") + ":
" + 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("" + ToggleButtonWidget::tr("Disable Girders") + ":
" + 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("" + ToggleButtonWidget::tr("Disable Land Objects") + ":
" + 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("" + ToggleButtonWidget::tr("AI Survival Mode") + ":
" + tr("AI respawns on death.")); + glGMLayout->addWidget(TBW_aisurvival,3,2,1,1); + + TBW_infattack = new ToggleButtonWidget(gbGameModes, ":/res/btnInfAttack.png"); + TBW_infattack->setToolTip("" + ToggleButtonWidget::tr("Unlimited Attacks") + ":
" + 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("" + ToggleButtonWidget::tr("Reset Weapons") + ":
" + 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("" + ToggleButtonWidget::tr("Per Hedgehog Ammo") + ":
" + 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("" + ToggleButtonWidget::tr("Disable Wind") + ":
" + 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("" + ToggleButtonWidget::tr("More Wind") + ":
" + 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("" + ToggleButtonWidget::tr("Tag Team") + ":
" + 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("" + ToggleButtonWidget::tr("Add Bottom Border") + ":
" + 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); +} + + diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagescheme.h --- /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 + * + * 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pageselectweapon.cpp --- /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 + * + * 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 +#include +#include +#include + +#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(); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pageselectweapon.h --- /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 + * + * 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagesingleplayer.cpp --- /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 + * + * 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 +#include + +#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(); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagesingleplayer.h --- /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 + * + * 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 + diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagetraining.cpp --- /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 + * + * 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 +#include +#include +#include +#include +#include + +#include +#include +#include + +#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("

" + caption +"

"); + lblDescription->setText(description); + } + else + { + btnPreview->setIcon(QIcon(":/res/Trainings.png")); + lblCaption->setText(tr("Select a mission!")); + // TODO better text and tr() + lblDescription->setText(""); + } +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/page/pagetraining.h --- /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 + * + * 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 + +#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 + diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/qaspectratiolayout.cpp --- /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; +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/qaspectratiolayout.h --- /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 +#include +#include +#include +#include + + +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_ */ diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/SquareLabel.cpp --- /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 + * + * 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 +#include +#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(); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/SquareLabel.h --- /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 + * + * 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 +#include + +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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/about.cpp --- /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 + * + * 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 +#include +#include +#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( + "" + "

Hedgewars

" + "

" + QLabel::tr("Version") + " " + *cVersionString + "

" + "

http://www.hedgewars.org/


" + + QLabel::tr("This program is distributed under the GNU General Public License") + + "
" + ); + lbl1->setWordWrap(true); + mainLayout->addWidget(lbl1, 0, 1); + + QTextBrowser *lbl2 = new QTextBrowser(this); + + lbl2->setOpenExternalLinks(true); + lbl2->setText( + "" + + QString("

") + + QLabel::tr("Developers:") + + "

" + "Engine, frontend, net server: Andrey Korotaev <unC0Rr@gmail.com>
" + "Many frontend improvements: Igor Ulyanov <disinbox@gmail.com>
" + "Many engine and frontend improvements: Derek Pomery <nemo@m8y.org>
" + "Drill rocket, Ballgun, RC Plane weapons: Martin Boze <afffect@gmail.com>
" + "Mine number and time game settings: David A. Cuadrado <krawek@gmail.com>
" + "Frontend improvements: Martin Minarik <ttsmj@pokec.sk>
" + "Frontend improvements: Kristian Lehmann <email@thexception.net>
" + "Mac OS X/iPhone port, OpenGL-ES conversion: Vittorio Giovara <vittorio.giovara@gmail.com>
" + "Many engine and frontend improvements (and bugs): Richard Karolyi <sheepluva@" "ercatec.net>
" + "Gamepad and Lua integration: Mario Liebisch <mario.liebisch@gmail.com>
" + "Many engine improvements and graphics: Carlos Vives <mail@carlosvives.es>
" + "Maze maps: Henning Kühn <prg@cooco.de>
" + "Engine and frontend improvements: Henrik Rostedt <henrik.rostedt@gmail.com>
" + "Lua game modes and missions: John Lambert <redgrinner@gmail.com>
" + "Frontend improvements: Mayur Pawashe <zorgiepoo@gmail.com>
" + "Android port: Richard Deurwaarder <xeli@xelification.com>
" + "

" + + + QLabel::tr("Art:") + "

" + + QString::fromUtf8( + "

John Dum <fizzy@gmail.com>" + "
" + "Joshua Frese <joshfrese@gmail.com>" + "
" + "Stanko Tadić <stanko@mfhinc.net>" + "
" + "Julien Koesten <julienkoesten@aol.com>" + "
" + "Joshua O'Sullivan <coheedftw@hotmail.co.uk>" + "
" + "Nils Lück <nils.luck.design@gmail.com>" + "
" + "Guillaume Englert <genglert@hybird.org>" + "
" + "Hats: Trey Perry <tx.perry.j@gmail.com>" + "

") + + QLabel::tr("Sounds:") + "

" + "Hedgehogs voice: Stephen Alexander <ArmagonNo1@gmail.com>" + "
" + "John Dum <fizzy@gmail.com>" + "
" + "Jonatan Nilsson <jonatanfan@gmail.com>" + "
" + "Daniel Martin <elhombresinremedio@gmail.com>" + "

" + + + QLabel::tr("Translations:") + "

" + + QString::fromUtf8( + "Brazilian Portuguese: Romulo Fernandes Machado <abra185@gmail.com>
" + "Bulgarian: Svetoslav Stefanov
" + "Czech: Petr Řezáček <rezacek@gmail.com>
" + "Chinese: Jie Luo <lililjlj@gmail.com>
" + "English: Andrey Korotaev <unC0Rr@gmail.com>
" + "Finnish: Nina Kuisma <ninnnu@gmail.com>
" + "French: Antoine Turmel <geekshadow@gmail.com>
" + "German: Peter Hüwe <PeterHuewe@gmx.de>, Mario Liebisch <mario.liebisch@gmail.com>, Richard Karolyi <sheepluva@" "ercatec.net>
" + "Greek: <talos_kriti@yahoo.gr>
" + "Italian: Luca Bonora <bonora.luca@gmail.com>, Marco Bresciani
" + "Japanese: ADAM Etienne <etienne.adam@gmail.com>
" + "Korean: Anthony Bellew <webmaster@anthonybellew.com>
" + "Lithuanian: Lukas Urbonas <lukasu08@gmail.com>
" + "Polish: Maciej Mroziński <mynick2@o2.pl>, Wojciech Latkowski <magik17l@gmail.com>, Piotr Mitana, Maciej Górny
" + "Portuguese: Fábio Canário <inufabie@gmail.com>
" + "Russian: Andrey Korotaev <unC0Rr@gmail.com>
" + "Slovak: Jose Riha
" + "Spanish: Carlos Vives <mail@carlosvives.es>
" + "Swedish: Niklas Grahn <raewolusjoon@yaoo.com>, Henrik Rostedt <henrik.rostedt@gmail.com>
" + "Ukrainian: Eugene V. Lyubimkin <jackyf.devel@gmail.com>, Igor Paliychuk <mansonigor@gmail.com>, Eugene Sakara <eresid@gmail.com>" + "

") + + + QLabel::tr("Special thanks:") + "

" + "Aleksey Andreev <blaknayabr@gmail.com>
" + "Aleksander Rudalev <alexv@pomorsu.ru>
" + "Natasha Korotaeva <layout@pisem.net>
" + "Adam Higerd (aka ahigerd at FreeNode)" + "

" + ); + mainLayout->addWidget(lbl2, 1, 1); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/about.h --- /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 + * + * 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 + + +class About : public QWidget +{ + Q_OBJECT + +public: + About(QWidget * parent = 0); +}; + +#endif // _ABOUT_H diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/bgwidget.cpp --- /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 + * Copyright (c) 2009-2011 Andrey Korotaev + * + * 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(); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/bgwidget.h --- /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 + * Copyright (c) 2009-2011 Andrey Korotaev + * + * 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 +//#include +#include +#include +#include +#include +#include + +#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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/chatwidget.cpp --- /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 + * Copyright (c) 2007-2011 Andrey Korotaev + * + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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(dynamic_cast(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 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(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, "\\3"); + + // "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("%2").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("%1").arg(line).arg(cssClass); + + chatStrings.append(line); + + chatText->setHtml(chatStrings.join("
")); + + chatText->moveCursor(QTextCursor::End); +} + +void HWChatWidget::onServerMessage(const QString& str) +{ + if (chatStrings.size() > 250) + chatStrings.removeFirst(); + + chatStrings.append("
" + str + "
"); + + chatText->setHtml(chatStrings.join("
")); + + 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 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 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); + } +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/chatwidget.h --- /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 + * Copyright (c) 2007-2011 Andrey Korotaev + * + * 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 +#include +#include +#include +#include + +#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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/databrowser.cpp --- /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 +#include +#include +#include +#include + +#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(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(); + } +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/databrowser.h --- /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 +#include + +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 resources; + QSet requestedResources; + + QVariant loadResource(int type, const QUrl & name); + +private slots: + void resourceDownloaded(); +}; + +#endif // DATABROWSER_H diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/drawmapwidget.cpp --- /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 + * + * 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 +#include +#include + +#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()))); + } +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/drawmapwidget.h --- /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 + * + * 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 +#include +#include +#include + +#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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/fpsedit.cpp --- /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 + * + * 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)); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/fpsedit.h --- /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 + * + * 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 + +class FPSEdit : public QSpinBox +{ + Q_OBJECT + +public: + FPSEdit(QWidget * parent = 0); + +protected: + QString textFromValue (int value) const; +}; + +#endif // _FPSEDIT_H diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/frameTeam.cpp --- /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 + * Copyright (c) 2007-2011 Andrey Korotaev + * + * 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 +#include +#include + +#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(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::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(getTeamWidget(team)); + if(!pTeamShowWidget) return; + pTeamShowWidget->setHHNum(team.numHedgehogs()); +} + +void FrameTeams::setTeamColor(const HWTeam& team) +{ + TeamShowWidget* pTeamShowWidget = dynamic_cast(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); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/frameTeam.h --- /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 + * Copyright (c) 2007-2011 Andrey Korotaev + * + * 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 +#include +#include + +#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 availableColors; + QList::Iterator currentColor; + + void emitTeamColorChanged(const HWTeam& team); + + QVBoxLayout mainLayout; + typedef QMap tmapTeamToWidget; + tmapTeamToWidget teamToWidget; + bool nonInteractive; +}; + +#endif // _FRAME_TAM_INCLUDED diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/gamecfgwidget.cpp --- /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 + * + * 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 +#include +#include +#include +#include +#include +#include +#include +#include + +#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 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 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())); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/gamecfgwidget.h --- /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 + * + * 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 +#include +#include +#include +#include + +#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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/hedgehogerWidget.cpp --- /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 + * Copyright (c) 2008-2011 Andrey Korotaev + * + * 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(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; +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/hedgehogerWidget.h --- /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 + * Copyright (c) 2007-2011 Andrey Korotaev + * + * 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/igbox.cpp --- /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 + * + * 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 +#include +#include +#include + +#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; +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/igbox.h --- /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 + * + * 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 +#include + +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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/itemNum.cpp --- /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 + * + * 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 +#include + +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 + * + * 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 +#include + +#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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/misc.cpp --- /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 + * + * 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" diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/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 + * + * 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 +#include + +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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/selectWeapon.cpp --- /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 + * Copyright (c) 2008-2011 Andrey Korotaev + * + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include + +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); + } +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/selectWeapon.h --- /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 + * Copyright (c) 2008-2011 Andrey Korotaev + * + * 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 +#include +#include + +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 ItemsList; + typedef QMap twi; + twi weaponItems; + //layout element for each tab: + QGridLayout* p1Layout; + QGridLayout* p2Layout; + QGridLayout* p3Layout; + QGridLayout* p4Layout; +}; + +#endif // _SELECT_WEAPON_INCLUDED diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/teamselect.cpp --- /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 + * Copyright (c) 2007-2011 Andrey Korotaev + * + * 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 + +#include +#include +#include +#include +#include + +#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(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::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::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::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::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::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::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::iterator itDontPlay=std::find(m_curNotPlayingTeams.begin(), m_curNotPlayingTeams.end(), team); + QList::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(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& 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 TeamSelWidget::getPlayingTeams() const +{ + return curPlayingTeams; +} + +QList TeamSelWidget::getNotPlayingTeams() const +{ + return m_curNotPlayingTeams; +} + +void TeamSelWidget::pre_changeTeamStatus(HWTeam team) +{ + team.setColor(framePlaying->getNextColor()); + emit acceptRequested(team); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/teamselect.h --- /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 + * Copyright (c) 2007-2011 Andrey Korotaev + * + * 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 +#include +#include +#include + +#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& teamslist); + bool isPlaying(HWTeam team) const; + QList getPlayingTeams() const; + QList 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 curPlayingTeams; + QList m_curNotPlayingTeams; +}; + +#endif // _TEAM_SELECT_INCLUDED diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/teamselhelper.cpp --- /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 + * Copyright (c) 2007-2011 Andrey Korotaev + * + * 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 +#include +#include + +#include + +#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(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; +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/teamselhelper.h --- /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 + * Copyright (c) 2007-2011 Andrey Korotaev + * + * 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 +#include +#include +#include + +#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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/togglebutton.cpp --- /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 + * Copyright (c) 2009-2011 Andrey Korotaev + * + * 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); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/togglebutton.h --- /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 + * Copyright (c) 2009-2011 Andrey Korotaev + * + * 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 +#include +#include +#include +#include + +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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/vertScrollArea.cpp --- /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 + * Copyright (c) 2006-2011 Andrey Korotaev + * + * 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 + +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()); +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/vertScrollArea.h --- /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 + * Copyright (c) 2006-2011 Andrey Korotaev + * + * 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 + +class VertScrArea : public QScrollArea +{ + Q_OBJECT + +public: + VertScrArea(QColor frameColor, QWidget * parent = 0); + +protected: + virtual void resizeEvent(QResizeEvent * event); +}; + +#endif // _VERT_SCROLL_AREA_INCLUDED diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/weaponItem.cpp --- /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 + * Copyright (c) 2008-2011 Andrey Korotaev + * + * 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; +} + diff -r ddf020d0941a -r fdfc01419815 QTfrontend/ui/widget/weaponItem.h --- /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 + * Copyright (c) 2008-2011 Andrey Korotaev + * + * 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/util/namegen.cpp --- /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 + * Copyright (c) 2009-2011 Andrey Korotaev + * + * 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 +#include +#include +#include +#include "namegen.h" +#include "hwform.h" +#include "hwconsts.h" + + +HWNamegen::HWNamegen() {} + +QList HWNamegen::TypesTeamnames; +QList 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())]; +} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/util/namegen.h --- /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 + * Copyright (c) 2009-2011 Andrey Korotaev + * + * 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 + +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 TypesTeamnames; + static QList 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 diff -r ddf020d0941a -r fdfc01419815 QTfrontend/vertScrollArea.cpp --- 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 - * Copyright (c) 2006-2011 Andrey Korotaev - * - * 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 - -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()); -} diff -r ddf020d0941a -r fdfc01419815 QTfrontend/vertScrollArea.h --- 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 - * Copyright (c) 2006-2011 Andrey Korotaev - * - * 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 - -class VertScrArea : public QScrollArea -{ - Q_OBJECT - -public: - VertScrArea(QColor frameColor, QWidget * parent = 0); - -protected: - virtual void resizeEvent(QResizeEvent * event); -}; - -#endif // _VERT_SCROLL_AREA_INCLUDED diff -r ddf020d0941a -r fdfc01419815 QTfrontend/weaponItem.cpp --- 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 - * Copyright (c) 2008-2011 Andrey Korotaev - * - * 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; -} - diff -r ddf020d0941a -r fdfc01419815 QTfrontend/weaponItem.h --- 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 - * Copyright (c) 2008-2011 Andrey Korotaev - * - * 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