summaryrefslogtreecommitdiffstats
path: root/atlantikdesigner/designer/designer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'atlantikdesigner/designer/designer.cpp')
-rw-r--r--atlantikdesigner/designer/designer.cpp1099
1 files changed, 1099 insertions, 0 deletions
diff --git a/atlantikdesigner/designer/designer.cpp b/atlantikdesigner/designer/designer.cpp
new file mode 100644
index 0000000..11da0e3
--- /dev/null
+++ b/atlantikdesigner/designer/designer.cpp
@@ -0,0 +1,1099 @@
+#include <qcolor.h>
+#include <qpalette.h>
+#include <qevent.h>
+#include <qfile.h>
+#include <qguardedptr.h>
+#include <qlayout.h>
+#include <qpoint.h>
+#include <qpopupmenu.h>
+#include <qptrlist.h>
+#include <qstring.h>
+#include <qtextcodec.h>
+#include <qtextstream.h>
+#include <qtimer.h>
+#include <qwidget.h>
+
+#include <kaction.h>
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kglobal.h>
+#include <kfiledialog.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kmainwindow.h>
+#include <kmessagebox.h>
+#include <kstandarddirs.h>
+#include <kstdaction.h>
+#include <kurl.h>
+
+#include <atlantic/estate.h>
+#include <atlantic/player.h>
+#include <atlantik/ui/board.h>
+
+#include "boardinfo.h"
+#include "editor.h"
+#include "designer.h"
+
+AtlanticDesigner::AtlanticDesigner(QWidget *parent, const char *name)
+ : KMainWindow(parent, name)
+{
+ firstBoard = true;
+ estates.setAutoDelete(true);
+
+ isMod = false;
+ m_player = 0;
+ copiedEstate = 0;
+ editor = 0;
+ board = 0;
+ layout = 0;
+
+ (void) KStdAction::quit(this, SLOT(close()), actionCollection());
+ (void) KStdAction::open(this, SLOT(open()), actionCollection());
+ (void) KStdAction::openNew(this, SLOT(openNew()), actionCollection());
+ (void) KStdAction::save(this, SLOT(save()), actionCollection());
+ (void) KStdAction::saveAs(this, SLOT(saveAs()), actionCollection());
+ (void) new KAction(i18n("&Edit Gameboard Info..."), CTRL+Key_I, this, SLOT(info()), actionCollection(), "boardinfo");
+ (void) new KAction(i18n("&Edit Groups..."), CTRL+Key_G, this, SLOT(editGroups()), actionCollection(), "groupeditor");
+
+ (void) new KAction(i18n("&Add 4 Squares"), "viewmag+", 0, this, SLOT(larger()), actionCollection(), "larger");
+ (void) new KAction(i18n("&Remove 4 Squares"), "viewmag-", 0, this, SLOT(smaller()), actionCollection(), "smaller");
+ (void) KStdAction::copy(this, SLOT(copy()), actionCollection());
+ (void) KStdAction::paste(this, SLOT(paste()), actionCollection());
+ (void) new KAction(i18n("&Up"), Key_Up, this, SLOT(up()), actionCollection(), "up");
+ (void) new KAction(i18n("&Down"), Key_Down, this, SLOT(down()), actionCollection(), "down");
+ (void) new KAction(i18n("&Left"), Key_Left, this, SLOT(left()), actionCollection(), "left");
+ (void) new KAction(i18n("&Right"), Key_Right, this, SLOT(right()), actionCollection(), "right");
+
+ recentAct = KStdAction::openRecent(0, 0, actionCollection());
+ connect(recentAct, SIGNAL(urlSelected(const KURL &)), this, SLOT(openRecent(const KURL &)));
+ recentAct->loadEntries(KGlobal::config(), "Designer recent files");
+
+ estateAct = new KListAction(i18n("Change Estate"), 0, 0, 0, actionCollection(), "estate_num");
+ connect(estateAct, SIGNAL(activated(int)), SLOT(changeEstate(int)));
+
+ createGUI("atlantikdesignerui.rc");
+
+ KConfig *config = kapp->config();
+ config->setGroup("General");
+ QColor defaultColor = colorGroup().background();
+ defaultBg = config->readColorEntry("alternateBackground", &defaultColor);
+ config->setGroup("WM");
+ defaultColor = colorGroup().dark();
+ defaultFg = config->readColorEntry("activeBackground", &defaultColor);
+
+ // these must match up to the ones in editor.cpp!
+ // I don't think these are used anymore.
+ types.append("street");
+ types.append("cards");
+ types.append("freeparking");
+ types.append("tojail");
+ types.append("tax");
+ types.append("jail");
+
+ openNew();
+
+ resize(350, 400);
+ applyMainWindowSettings(KGlobal::config(), "DesignerTopLevelWindow");
+}
+
+AtlanticDesigner::~AtlanticDesigner()
+{
+ delete m_player;
+}
+
+void AtlanticDesigner::initMembers()
+{
+ estates.clear();
+ cards.clear();
+ groups.clear();
+
+ boardInfo = BoardInfo();
+
+ for (ConfigEstateGroupList::Iterator it = groups.begin(); it != groups.end(); ++it)
+ if ((*it).name() == "Default")
+ return;
+
+ ConfigEstateGroup defaultGroup("Default");
+ defaultGroup.setBgColor(defaultBg);
+ defaultGroup.setFgColor(defaultFg);
+ groups.append(defaultGroup);
+}
+
+void AtlanticDesigner::initBoard()
+{
+ // let her say her prayers (if she's alive)
+ if (!firstBoard)
+ editor->aboutToDie();
+
+ firstBoard = false;
+
+ delete editor;
+ delete board;
+ delete layout;
+
+ board = new AtlantikBoard(0, max, AtlantikBoard::Edit, this, "Board");
+
+ setCentralWidget(board);
+ layout = new QVBoxLayout(board->centerWidget());
+ editor = new EstateEdit(&groups, &estates, &cards, board->centerWidget(), "Estate Editor");
+ connect(editor, SIGNAL(goChecked(int)), this, SLOT(goChanged(int)));
+ connect(editor, SIGNAL(updateBackground()), this, SLOT(updateBackground()));
+ connect(editor, SIGNAL(resized()), board, SLOT(slotResizeAftermath()));
+ layout->addWidget(editor);
+
+ editor->setReady(false);
+
+ board->show();
+ editor->show();
+
+ initToken();
+}
+
+void AtlanticDesigner::initToken()
+{
+ if (!m_player)
+ m_player = new Player(0);
+ else
+ m_player->setLocation(0);
+
+ board->addToken(m_player);
+
+ connect(m_player, SIGNAL(changed(Player *)), board, SLOT(playerChanged(Player *)));
+}
+
+void AtlanticDesigner::openNew()
+{
+ if (warnClose())
+ return;
+ filename = QString::null;
+
+ max = 40;
+
+ initMembers();
+ initBoard();
+
+ for (int i = 0; i < 40; ++i)
+ {
+ (void) newEstate(i);
+ }
+
+ doCaption(false);
+ updateJumpMenu();
+
+ groupsChanged();
+ updateBackground();
+
+ QTimer::singleShot(500, this, SLOT(setPlayerAtBeginning()));
+ doCaption(false);
+}
+
+ConfigEstate *AtlanticDesigner::newEstate(int i)
+{
+ ConfigEstate *estate = new ConfigEstate(i);
+ estate->setName(i18n("New Estate"));
+ estate->setPrice(100);
+ for (int j = 0; j < 6; ++j)
+ estate->setRent(j, 10 * (j + 1));
+ estate->setChanged(false);
+ estates.insert(i, estate);
+
+ connect(estate, SIGNAL(LMBClicked(Estate *)), this, SLOT(changeEstate(Estate *)));
+ connect(estate, SIGNAL(changed()), this, SLOT(modified()));
+
+ board->addEstateView(estate);
+
+ return estate;
+}
+
+bool AtlanticDesigner::warnClose()
+{
+ if (isMod)
+ {
+ int result = KMessageBox::warningYesNoCancel(this, i18n("There are unsaved changes to gameboard. Save them?"), i18n("Unsaved Changes"), KStdGuiItem::save(), KStdGuiItem::discard(), "DiscardAsk", true);
+ switch(result)
+ {
+ case KMessageBox::Yes:
+ save();
+ // fallthrough
+ case KMessageBox::No:
+ return false;
+ case KMessageBox::Cancel:
+ return true;
+ }
+ }
+ return false;
+}
+
+void AtlanticDesigner::open()
+{
+ if (warnClose())
+ return;
+
+ filename = KFileDialog::getOpenFileName();
+
+ if (filename.isNull())
+ return;
+
+ openFile(filename);
+ recentAct->addURL(KURL::fromPathOrURL( filename ));
+}
+
+void AtlanticDesigner::openRecent(const KURL &url)
+{
+ if (url.isLocalFile())
+ {
+ filename = url.path();
+ openFile(filename);
+
+ recentAct->popupMenu()->setItemChecked(recentAct->currentItem(), false);
+ }
+ else
+ {
+ recentAct->removeURL(url);
+ }
+}
+
+void AtlanticDesigner::openFile(const QString &filename)
+{
+ enum ParseMode { Parse_Nothing, Parse_General, Parse_Board, Parse_Cards, Parse_EstateGroups, Parse_Estates };
+ QFile f(filename);
+ if (!f.open(IO_ReadOnly))
+ return;
+
+ initMembers();
+
+ QTextStream t(&f);
+ t.setCodec(QTextCodec::codecForName("utf8"));
+
+ QString s = t.readLine();
+ int parseMode = Parse_Nothing;
+
+ CardStack *curCardStack = 0;
+
+ int goEstate = 0;
+ int i;
+ for (i = 0; !t.atEnd();)
+ {
+ s = s.stripWhiteSpace();
+
+ if (s.isEmpty())
+ {
+ s = t.readLine();
+ continue;
+ }
+
+ QString name;
+
+ if (s.left(1) == "<")
+ {
+ if (s == "<General>")
+ parseMode = Parse_General;
+ else if (s == "<Board>")
+ parseMode = Parse_Board;
+ else if (s == "<EstateGroups>")
+ parseMode = Parse_EstateGroups;
+ else if (s == "<Cards>")
+ parseMode = Parse_Cards;
+ else if (s == "<Estates>")
+ parseMode = Parse_Estates;
+
+ s = t.readLine();
+ continue;
+ }
+
+ // this for outside-of-[]-settings
+ int eqSign = s.find("=");
+ if (eqSign >= 0)
+ {
+ QString key = s.left(eqSign);
+ QString value = s.right(s.length() - eqSign - 1);
+
+ if (parseMode == Parse_Cards)
+ {
+ if (key == "groupname")
+ {
+ cards.append(CardStack(value));
+ curCardStack = &cards.last();
+ }
+ }
+ else if (parseMode == Parse_General)
+ {
+ if (key == "name")
+ boardInfo.name = value;
+ else if (key == "description")
+ boardInfo.description = value;
+ else if (key == "version")
+ boardInfo.version = value;
+ else if (key == "url")
+ boardInfo.url = value;
+ else if (key == "authors")
+ boardInfo.authors = QStringList::split(",", value);
+ else if (key == "credits")
+ boardInfo.credits = QStringList::split(",", value);
+ }
+ else if (parseMode == Parse_Board)
+ {
+ if (key == "go")
+ goEstate = value.toInt();
+ else if (key == "bgcolor")
+ boardInfo.bgColor.setNamedColor(value);
+ }
+
+ s = t.readLine();
+ continue;
+ }
+
+ name = s.left(s.find("]"));
+ name = name.right(name.length() - name.find("[") - 1);
+
+ if (name.isEmpty())
+ name = i18n("No Name");
+
+ // for estates
+ int type = FreeParking;
+ QString group, takeCard;
+ int price = -1;
+ int rent[6] = {-1, -1, -1, -1, -1, -1};
+ int tax = -1;
+ int taxPercentage = -1;
+ int passMoney = -1;
+ QColor forceBg;
+
+ // for groups
+ QColor color, bgColor;
+ QString rentMath;
+ int housePrice = -1;
+ int globalPrice = -1;
+
+ // for cards
+ QStringList keys;
+ QValueList<int> values;
+
+ while (true)
+ {
+ if (t.atEnd())
+ break;
+
+ s = t.readLine().stripWhiteSpace();
+
+ if (s.left(1) == "[" || s.left(1) == "<")
+ break;
+
+ int eqSign = s.find("=");
+ if (eqSign < 0)
+ continue;
+
+ QString key = s.left(eqSign);
+ QString value = s.right(s.length() - eqSign - 1);
+
+ //////////////////////////////// ESTATES
+ if (parseMode == Parse_Estates)
+ {
+ if (key == "price")
+ price = value.toInt();
+ else if (key.left(4) == "rent")
+ {
+ int houses = key.right(1).toInt();
+ if (houses < 0 || houses > 5)
+ continue;
+
+ rent[houses] = value.toInt();
+ }
+ else if (key == "tax")
+ {
+ tax = value.toInt();
+ type = Tax;
+ }
+ else if (key == "taxpercentage")
+ taxPercentage = value.toInt();
+ else if (key == "group")
+ {
+ group = value;
+ type = Street;
+ }
+ else if (key == "tojail")
+ type = ToJail;
+ else if (key == "jail")
+ type = Jail;
+ else if (key == "freeparking")
+ type = FreeParking;
+ else if (key == "takecard")
+ {
+ takeCard = value;
+ type = Cards;
+ }
+ else if (key == "bgcolor")
+ forceBg = QColor(value);
+ else if (key == "passmoney")
+ passMoney = value.toInt();
+ }
+ else if (parseMode == Parse_EstateGroups)
+ {
+ if (key == "color")
+ color.setNamedColor(value);
+ else if (key == "bgcolor")
+ bgColor.setNamedColor(value);
+ else if (key == "houseprice")
+ housePrice = value.toInt();
+ else if (key == "price")
+ globalPrice = value.toInt();
+ else if (key == "rentmath")
+ rentMath = value;
+ }
+ else if (parseMode == Parse_Cards)
+ {
+ bool ok;
+ int v = value.toInt(&ok);
+ if (!ok)
+ continue;
+
+ if (key == "pay" && v < 0)
+ {
+ v *= -1;
+ key = "collect";
+ }
+ else if (key == "payeach" && v < 0)
+ {
+ v *= -1;
+ key = "collecteach";
+ }
+ else if (key == "advance" && v < 0)
+ {
+ v *= -1;
+ key = "goback";
+ }
+
+ keys.append(key);
+ values.append(v);
+ }
+ }
+
+ if (parseMode == Parse_Estates)
+ {
+ ConfigEstate *estate = new ConfigEstate(i);
+ estate->setName(name);
+ estate->setType(type);
+ if (!group.isEmpty())
+ estate->setGroup(group);
+ estate->setTakeCard(takeCard);
+ estate->setPrice(price);
+ for (int j = 0; j < 6; j++)
+ estate->setRent(j, rent[j]);
+ estate->setTax(tax);
+ estate->setTaxPercentage(taxPercentage);
+ estate->setForceBg(forceBg);
+ estate->setPassMoney(passMoney);
+ estates.append(estate);
+
+ connect(estate, SIGNAL(LMBClicked(Estate *)), this, SLOT(changeEstate(Estate *)));
+ connect(estate, SIGNAL(changed()), this, SLOT(modified()));
+ i++;
+ }
+ else if (parseMode == Parse_Cards)
+ {
+ Card card;
+ card.name = name;
+ card.keys = keys;
+ card.values = values;
+ if (curCardStack)
+ curCardStack->append(card);
+ }
+ else if (parseMode == Parse_EstateGroups)
+ {
+ bool found = false;
+ for (ConfigEstateGroupList::Iterator it = groups.begin(); it != groups.end(); ++it)
+ {
+ if ((*it).name() == name)
+ {
+ found = true;
+ break;
+ }
+ }
+
+ if (found)
+ continue;
+
+ ConfigEstateGroup group(name);
+ group.setHousePrice(housePrice);
+ group.setGlobalPrice(globalPrice);
+ group.setFgColor(color);
+ group.setBgColor(bgColor);
+ group.setRentMath(rentMath);
+ groups.append(group);
+ }
+ }
+
+ if (i < 8)
+ {
+ KMessageBox::detailedSorry(this, i18n("This board file is invalid; cannot open."), i18n("There are only %1 estates specified in this file.").arg(i));
+ if (this->filename.isNull())
+ close();
+ return;
+ }
+ max = i;
+
+ initBoard();
+ ConfigEstate *estate = 0;
+ for (estate = estates.first(); estate; estate = estates.next())
+ board->addEstateView(estate);
+
+ if (goEstate >= 0 && goEstate < max - 1)
+ estates.at(goEstate)->setGo(true);
+
+ groupsChanged();
+ updateBackground();
+ updateJumpMenu();
+
+ QTimer::singleShot(500, this, SLOT(setPlayerAtBeginning()));
+ doCaption(false);
+}
+
+void AtlanticDesigner::updateJumpMenu()
+{
+ QStringList estates;
+ for (int i = 1; i <= max; i++)
+ estates.append(i18n("Jump to Estate %1").arg(QString::number(i)));
+ estateAct->setItems(estates);
+}
+
+void AtlanticDesigner::setPlayerAtBeginning()
+{
+ ConfigEstate *go = 0;
+ for (go = estates.first(); go; go = estates.next())
+ if (go->go())
+ break;
+
+ if (!go)
+ go = estates.first();
+
+ movePlayer(go);
+ editor->setEstate(go);
+}
+
+void AtlanticDesigner::saveAs()
+{
+ QString oldfilename = filename;
+ filename = QString::null;
+
+ save();
+
+ if (filename.isNull())
+ {
+ filename = oldfilename;
+ return;
+ }
+ else
+ recentAct->addURL(KURL::fromPathOrURL( filename ));
+}
+
+void AtlanticDesigner::save()
+{
+ (void) editor->saveEstate();
+ QString oldfilename = filename;
+ if (filename.isNull())
+ filename = KFileDialog::getOpenFileName();
+
+ if (filename.isNull())
+ {
+ filename = oldfilename;
+ return;
+ }
+
+ QFile f(filename);
+ if (!f.open(IO_WriteOnly))
+ return;
+
+ QTextStream t(&f);
+ t.setCodec(QTextCodec::codecForName("utf8"));
+
+ t << "<General>" << endl << endl;
+ if (!boardInfo.name.isEmpty())
+ t << "name=" << boardInfo.name << endl;
+ if (!boardInfo.description.isEmpty())
+ t << "description=" << boardInfo.description << endl;
+ if (!boardInfo.url.isEmpty())
+ t << "url=" << boardInfo.url << endl;
+ if (!boardInfo.version.isEmpty())
+ t << "version=" << boardInfo.version << endl;
+ if (!boardInfo.authors.isEmpty())
+ t << "authors=" << boardInfo.authors.join(",") << endl;
+ if (!boardInfo.credits.isEmpty())
+ t << "credits=" << boardInfo.credits.join(",") << endl;
+
+ // FIXME: make configurable. Hardcoded defaults are still better than
+ // non-existant entries that would make the saved configs useless.
+ t << "minplayers=2" << endl;
+ t << "maxplayers=6" << endl;
+ t << "houses=32" << endl;
+ t << "hotels=16" << endl;
+ t << "startmoney=1500" << endl;
+
+ t << endl;
+ t << "<Board>" << endl << endl;
+
+ ConfigEstate *estate = 0;
+ bool hasGo = false;
+ for (estate = estates.first(); estate; estate = estates.next())
+ {
+ if (estate->go())
+ {
+ t << "go=" << estate->id() << endl;
+ hasGo = true;
+ break;
+ }
+ }
+ if (!hasGo)
+ t << "go=" << 0 << endl;
+
+ if (boardInfo.bgColor.isValid())
+ t << "bgcolor=" << boardInfo.bgColor.name() << endl;
+
+ t << endl << endl;
+
+ t << "<EstateGroups>" << endl;
+
+ // double-prevent duplicates
+ QStringList writtenGroups;
+
+ for (ConfigEstateGroupList::Iterator it = groups.begin(); it != groups.end(); ++it)
+ {
+ if (writtenGroups.contains((*it).name()) > 0)
+ continue;
+
+ if ((*it).name() == "Default")
+ {
+ bool containsDefault = false;
+ for (estate = estates.first(); estate; estate = estates.next())
+ {
+ if (estate->group() == "Default")
+ {
+ containsDefault = true;
+ break;
+ }
+ }
+
+ if (!containsDefault)
+ continue;
+ }
+
+ writtenGroups.append((*it).name());
+
+ t << endl << QString("[%1]").arg((*it).name()) << endl;
+
+ if ((*it).globalPrice() > 0)
+ t << "price=" << (*it).globalPrice() << endl;
+
+ if ((*it).fgColor().isValid())
+ t << "color=" << (*it).fgColor().name() << endl;
+ if ((*it).bgColor().isValid())
+ t << "bgcolor=" << (*it).bgColor().name() << endl;
+
+ if ((*it).housePrice() > 0)
+ t << "houseprice=" << (*it).housePrice() << endl;
+
+ if (!(*it).rentMath().isEmpty())
+ t << "rentmath=" << (*it).rentMath() << endl;
+ }
+
+ // now do the cards
+
+ for (QValueList<CardStack>::Iterator it = cards.begin(); it != cards.end(); ++it)
+ {
+ t << endl << endl;
+ t << "<Cards>" << endl << endl;
+ t << "groupname=" << (*it).name() << endl;
+
+ for (CardStack::Iterator cit = (*it).begin(); cit != (*it).end(); ++cit)
+ {
+ t << endl << "[" << (*cit).name << "]" << endl;
+ QValueList<int>::Iterator vit = (*cit).values.begin();
+ for (QStringList::Iterator it = (*cit).keys.begin(); it != (*cit).keys.end(); ++it, ++vit)
+ {
+ QString key = (*it);
+ int value = (*vit);
+
+ if (key == "collect")
+ {
+ value *= -1;
+ key = "pay";
+ }
+ else if (key == "collecteach")
+ {
+ value *= -1;
+ key = "payeach";
+ }
+ else if (key == "goback")
+ {
+ value *= -1;
+ key = "advance";
+ }
+
+ if (key == "outofjail" || key == "tojail" || key == "nextrr" || key == "nextutil")
+ value = 1;
+
+ if (key == "outofjail")
+ {
+ t << "canbeowned=" << 1 << endl;
+ }
+
+ t << key << "=" << value << endl;
+ }
+ }
+ }
+
+ t << endl << endl;
+
+ t << "<Estates>" << endl;
+
+ for (estate = estates.first(); estate; estate = estates.next())
+ {
+ t << endl << QString("[%1]").arg(estate->name()) << endl;
+
+ switch (estate->type())
+ {
+ case Street:
+ if (!estate->group().isNull())
+ t << "group=" << estate->group() << endl;
+
+ if (estate->price() > 0)
+ t << "price=" << estate->price() << endl;
+
+ for (int i = 0; i < 6; i++)
+ {
+ if (estate->rent(i) > 0)
+ t << "rent" << i << "=" << estate->rent(i) << endl;
+ }
+ break;
+
+ case Tax:
+ if (estate->tax() > 0)
+ t << "tax=" << estate->tax() << endl;
+ if (estate->taxPercentage() > 0)
+ t << "taxpercentage=" << estate->taxPercentage() << endl;
+ break;
+
+ case Jail:
+ t << "jail=1" << endl;
+ if (estate->forceBg().isValid())
+ t << "bgcolor=" << estate->forceBg().name() << endl;
+ break;
+
+ case ToJail:
+ t << "tojail=1" << endl;
+ if (estate->forceBg().isValid())
+ t << "bgcolor=" << estate->forceBg().name() << endl;
+ break;
+
+ case Cards:
+ t << "takecard=" << estate->takeCard() << endl;
+ break;
+
+ case FreeParking:
+ t << "freeparking=1" << endl;
+ if (estate->forceBg().isValid())
+ t << "bgcolor=" << estate->forceBg().name() << endl;
+ break;
+ }
+
+ if (estate->passMoney() > 0)
+ t << "passmoney=" << estate->passMoney() << endl;
+ }
+
+ f.flush();
+ doCaption(false);
+}
+
+void AtlanticDesigner::copy()
+{
+ copiedEstate = editor->theEstate();
+}
+
+void AtlanticDesigner::paste()
+{
+ ConfigEstate *estate = editor->theEstate();
+ for (int i = 0; i < 6; i++)
+ estate->setRent(i, copiedEstate->rent(i));
+ estate->setPrice(copiedEstate->price());
+ estate->setTax(copiedEstate->tax());
+ estate->setTaxPercentage(copiedEstate->taxPercentage());
+ estate->setGroup(copiedEstate->group());
+ estate->setTakeCard(copiedEstate->takeCard());
+ estate->setType(copiedEstate->type());
+ estate->setName(copiedEstate->name());
+ estate->setPassMoney(copiedEstate->passMoney());
+
+ editor->setEstate(estate);
+
+ groupsChanged();
+}
+
+void AtlanticDesigner::closeEvent(QCloseEvent *e)
+{
+ if (warnClose())
+ return;
+
+ saveMainWindowSettings(KGlobal::config(), "DesignerTopLevelWindow");
+ recentAct->saveEntries(KGlobal::config(), "Designer recent files");
+
+ e->accept();
+ kapp->quit();
+}
+
+void AtlanticDesigner::changeEstate(int index)
+{
+ if (index < 0 || index > max - 1)
+ return;
+
+ changeEstate(estates.at(index));
+}
+
+void AtlanticDesigner::changeEstate(Estate *estate)
+{
+ if (!estate)
+ return;
+
+ setFocus();
+
+ (void) editor->saveEstate();
+
+ editor->setEstate(static_cast<ConfigEstate *>(estate));
+ movePlayer(estate);
+}
+
+void AtlanticDesigner::movePlayer(Estate *estate)
+{
+ estateAct->setCurrentItem(estate->id());
+ board->setFocus();
+ m_player->setLocation(estate);
+ m_player->update();
+}
+
+// this will add a square to all sides
+void AtlanticDesigner::larger()
+{
+ max += 4;
+ int sideLen = max/4;
+
+ initBoard();
+
+ ConfigEstate *estate = 0;
+ for (int i = 0; i < max; ++i)
+ {
+ estate = estates.at(i);
+ estate->setEstateId(i);
+ board->addEstateView(estate);
+
+ // make a newEstate
+ if ((i % sideLen - 1) == 0 || i == 1)
+ {
+ newEstate(i);
+ }
+ }
+
+ updateJumpMenu();
+ groupsChanged();
+ updateBackground();
+
+ QTimer::singleShot(500, this, SLOT(setPlayerAtBeginning()));
+ doCaption(true);
+}
+
+void AtlanticDesigner::smaller()
+{
+ if (max < 12)
+ return;
+
+ max -= 4;
+ int sideLen = max/4;
+
+ initBoard();
+
+ bool remove = true;
+
+ ConfigEstate *estate = 0;
+ for (int i = 0; i < max; ++i)
+ {
+ // remove estate
+ if (((i % sideLen - 1) == 0 || i == 1) && remove)
+ {
+ estates.remove(i);
+ i--;
+ remove = false;
+ }
+ else
+ {
+ estate = estates.at(i);
+ estate->setEstateId(i);
+ board->addEstateView(estate);
+
+ remove = true;
+ }
+ }
+
+ updateJumpMenu();
+ groupsChanged();
+ updateBackground();
+ QTimer::singleShot(500, this, SLOT(setPlayerAtBeginning()));
+
+ doCaption(true);
+}
+
+void AtlanticDesigner::modified()
+{
+ doCaption(true);
+}
+
+void AtlanticDesigner::doCaption(bool modified)
+{
+ setCaption(filename.isNull()? i18n("Atlantik Gameboard Editor") : filename, modified);
+ isMod = modified;
+}
+
+void AtlanticDesigner::editGroups()
+{
+ if (groupEditor.isNull())
+ {
+ groupEditor = new GroupEditor(&groups, this);
+ groupEditor->show();
+
+ connect(groupEditor, SIGNAL(changed()), this, SLOT(modified()));
+ connect(groupEditor, SIGNAL(update()), this, SLOT(groupsChanged()));
+ connect(groupEditor, SIGNAL(update()), editor, SLOT(groupsChanged()));
+ }
+ else
+ groupEditor->raise();
+}
+
+void AtlanticDesigner::goChanged(int id)
+{
+ ConfigEstate *curEstate = 0;
+ for (curEstate = estates.first(); curEstate; curEstate = estates.next())
+ if (curEstate->go() && curEstate->id() != id)
+ curEstate->setGo(false);
+}
+
+void AtlanticDesigner::groupsChanged()
+{
+ ConfigEstate *curEstate = 0;
+ for (curEstate = estates.first(); curEstate; curEstate = estates.next())
+ {
+ for (ConfigEstateGroupList::Iterator it = groups.begin(); it != groups.end(); ++it)
+ {
+ if ((*it).name() == curEstate->group() && curEstate->type() == Street)
+ {
+ curEstate->setBgColor((*it).bgColor().isValid()? (*it).bgColor() : boardInfo.bgColor);
+ curEstate->setColor((*it).fgColor());
+ curEstate->update();
+ break;
+ }
+ }
+ }
+}
+
+void AtlanticDesigner::updateBackground()
+{
+ ConfigEstate *curEstate = 0;
+ for (curEstate = estates.first(); curEstate; curEstate = estates.next())
+ {
+ if (curEstate->type() != Street || (curEstate->type() == Street && curEstate->group().isNull()))
+ {
+ curEstate->setColor(QColor());
+ curEstate->setBgColor(boardInfo.bgColor);
+ }
+
+ if (curEstate->forceBg().isValid() && (curEstate->type() == FreeParking || curEstate->type() == Jail || curEstate->type() == ToJail))
+ {
+ curEstate->setBgColor(curEstate->forceBg());
+ }
+
+ curEstate->update();
+ }
+}
+
+void AtlanticDesigner::info()
+{
+ if (boardInfoDlg.isNull())
+ {
+ // non-modal
+ boardInfoDlg = new BoardInfoDlg(true, &boardInfo, this, "Board Information", false);
+ boardInfoDlg->show();
+
+ connect(boardInfoDlg, SIGNAL(okClicked()), this, SLOT(updateBackground()));
+ connect(boardInfoDlg, SIGNAL(okClicked()), this, SLOT(modified()));
+ }
+ else
+ boardInfoDlg->raise();
+}
+
+// now some fun functions ;)
+
+void AtlanticDesigner::up()
+{
+ if (editor->upArrow())
+ return;
+ int fourth = max / 4;
+ int estateId = editor->theEstate()->id() + 1;
+ int dest = estateId - 1;
+
+ if (estateId <= 2*fourth && estateId > fourth) // left side
+ dest++;
+ else if (estateId > (3*fourth + 1)) // right side
+ dest--;
+ else if (estateId == 1)
+ dest = max - 1;
+
+ changeEstate(dest);
+}
+
+void AtlanticDesigner::down()
+{
+ if (editor->downArrow())
+ return;
+ int fourth = max / 4;
+ int estateId = editor->theEstate()->id() + 1;
+ int dest = estateId - 1;
+
+ if (estateId <= (2*fourth + 1) && estateId > (fourth + 1)) // left side
+ dest--;
+ else if (estateId > 3*fourth && estateId < max) // right side
+ dest++;
+ else if (estateId == max)
+ dest = 0;
+
+ changeEstate(dest);
+}
+
+void AtlanticDesigner::left()
+{
+ if (editor->leftArrow())
+ return;
+ int fourth = max / 4;
+ int estateId = editor->theEstate()->id() + 1;
+ int dest = estateId - 1;
+
+ if (estateId <= fourth) // bottom
+ dest++;
+ else if (estateId > (2*fourth + 1) && estateId <= (3*fourth + 1)) // top
+ dest--;
+
+ changeEstate(dest);
+}
+
+void AtlanticDesigner::right()
+{
+ if (editor->rightArrow())
+ return;
+ int fourth = max / 4;
+ int estateId = editor->theEstate()->id() + 1;
+ int dest = estateId - 1;
+
+ if (estateId <= (fourth + 1) && estateId != 1) // bottom
+ dest--;
+ else if (estateId > 2*fourth && estateId <= 3*fourth) // top
+ dest++;
+
+ changeEstate(dest);
+}
+
+#include "designer.moc"