// Copyright (c) 2002-2003 Rob Kaper // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 2.1 as published by the Free Software Foundation. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with this library; see the file COPYING.LIB. If not, write to // the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, // Boston, MA 02110-1301, USA. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "trade_widget.moc" TradeDisplay::TradeDisplay(Trade *trade, AtlanticCore *atlanticCore, TQWidget *parent, const char *name) : TQWidget(parent, name, WType_Dialog | WStyle_Customize | WStyle_DialogBorder | WStyle_Title | WStyle_Minimize | WStyle_ContextHelp ) { m_trade = trade; m_atlanticCore = atlanticCore; setCaption(i18n("Trade %1").arg(trade->tradeId())); TQVBoxLayout *listCompBox = new TQVBoxLayout(this, KDialog::marginHint()); m_updateComponentBox = new TQHGroupBox(i18n("Add Component"), this); listCompBox->addWidget(m_updateComponentBox); m_editTypeCombo = new KComboBox(m_updateComponentBox); m_editTypeCombo->insertItem(i18n("Estate")); m_editTypeCombo->insertItem(i18n("Money")); connect(m_editTypeCombo, TQT_SIGNAL(activated(int)), this, TQT_SLOT(setTypeCombo(int))); m_estateCombo = new KComboBox(m_updateComponentBox); TQPtrList estateList = m_atlanticCore->estates(); Estate *estate; for (TQPtrListIterator it(estateList); *it; ++it) { if ((estate = *it) && estate->isOwned()) { m_estateCombo->insertItem( PortfolioEstate::drawPixmap(estate), estate->name() ); m_estateMap[m_estateCombo->count() - 1] = estate; m_estateRevMap[estate] = m_estateCombo->count() - 1; } } connect(m_estateCombo, TQT_SIGNAL(activated(int)), this, TQT_SLOT(setEstateCombo(int))); m_moneyBox = new TQSpinBox(0, 10000, 1, m_updateComponentBox); TQPtrList playerList = m_atlanticCore->players(); Player *player, *pSelf = m_atlanticCore->playerSelf(); m_fromLabel = new TQLabel(m_updateComponentBox); m_fromLabel->setText(i18n("From")); m_playerFromCombo = new KComboBox(m_updateComponentBox); m_toLabel = new TQLabel(m_updateComponentBox); m_toLabel->setText(i18n("To")); m_playerTargetCombo = new KComboBox(m_updateComponentBox); for (TQPtrListIterator it(playerList); *it; ++it) { if ((player = *it) && player->game() == pSelf->game()) { m_playerFromCombo->insertItem(player->name()); m_playerFromMap[m_playerFromCombo->count() - 1] = player; m_playerFromRevMap[player] = m_playerFromCombo->count() - 1; m_playerTargetCombo->insertItem(player->name()); m_playerTargetMap[m_playerTargetCombo->count() - 1] = player; m_playerTargetRevMap[player] = m_playerTargetCombo->count() - 1; connect(player, TQT_SIGNAL(changed(Player *)), this, TQT_SLOT(playerChanged(Player *))); } } m_updateButton = new KPushButton(i18n("Update"), m_updateComponentBox); m_updateButton->setEnabled(false); connect(m_updateButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(updateComponent())); m_componentList = new TDEListView(this, "componentList"); listCompBox->addWidget(m_componentList); m_componentList->addColumn(i18n("Player")); m_componentList->addColumn(i18n("Gives")); m_componentList->addColumn(i18n("Player")); m_componentList->addColumn(i18n("Item")); connect(m_componentList, TQT_SIGNAL(contextMenu(TDEListView*, TQListViewItem *, const TQPoint&)), TQT_SLOT(contextMenu(TDEListView *, TQListViewItem *, const TQPoint&))); connect(m_componentList, TQT_SIGNAL(clicked(TQListViewItem *)), this, TQT_SLOT(setCombos(TQListViewItem *))); TQHBoxLayout *actionBox = new TQHBoxLayout(this, 0, KDialog::spacingHint()); listCompBox->addItem(actionBox); actionBox->addItem(new TQSpacerItem(20, 20, TQSizePolicy::Expanding, TQSizePolicy::Minimum)); m_rejectButton = new KPushButton(BarIcon("cancel", TDEIcon::SizeSmall), i18n("Reject"), this); actionBox->addWidget(m_rejectButton); connect(m_rejectButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(reject())); m_acceptButton = new KPushButton(BarIcon("ok", TDEIcon::SizeSmall), i18n("Accept"), this); // m_acceptButton->setEnabled(false); actionBox->addWidget(m_acceptButton); connect(m_acceptButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(accept())); m_status = new TQLabel(this); listCompBox->addWidget(m_status); m_status->setText( i18n( "%1 out of %2 players accept current trade proposal." ).arg( m_trade->count( true ) ).arg( m_trade->count( false ) ) ); // mPlayerList->header()->hide(); // mPlayerList->setRootIsDecorated(true); // mPlayerList->setResizeMode(TDEListView::AllColumns); connect(m_trade, TQT_SIGNAL(itemAdded(TradeItem *)), this, TQT_SLOT(tradeItemAdded(TradeItem *))); connect(m_trade, TQT_SIGNAL(itemRemoved(TradeItem *)), this, TQT_SLOT(tradeItemRemoved(TradeItem *))); connect(m_trade, TQT_SIGNAL(changed(Trade *)), this, TQT_SLOT(tradeChanged())); connect(m_trade, TQT_SIGNAL(rejected(Player *)), this, TQT_SLOT(tradeRejected(Player *))); connect(this, TQT_SIGNAL(updateEstate(Trade *, Estate *, Player *)), m_trade, TQT_SIGNAL(updateEstate(Trade *, Estate *, Player *))); connect(this, TQT_SIGNAL(updateMoney(Trade *, unsigned int, Player *, Player *)), m_trade, TQT_SIGNAL(updateMoney(Trade *, unsigned int, Player *, Player *))); connect(this, TQT_SIGNAL(reject(Trade *)), m_trade, TQT_SIGNAL(reject(Trade *))); connect(this, TQT_SIGNAL(accept(Trade *)), m_trade, TQT_SIGNAL(accept(Trade *))); setTypeCombo(m_editTypeCombo->currentItem()); setEstateCombo(m_estateCombo->currentItem()); m_contextTradeItem = 0; } void TradeDisplay::closeEvent(TQCloseEvent *e) { // Don't send network event when trade is already rejected if (m_trade->isRejected()) m_atlanticCore->removeTrade(m_trade); else emit reject(m_trade); e->accept(); } void TradeDisplay::tradeItemAdded(TradeItem *tradeItem) { TDEListViewItem *item = new TDEListViewItem(m_componentList, (tradeItem->from() ? tradeItem->from()->name() : TQString("?")), i18n("gives is transitive ;)", "gives"), (tradeItem->to() ? tradeItem->to()->name() : TQString("?")), tradeItem->text()); connect(tradeItem, TQT_SIGNAL(changed(TradeItem *)), this, TQT_SLOT(tradeItemChanged(TradeItem *))); item->setPixmap(0, TQPixmap(SmallIcon("personal"))); item->setPixmap(2, TQPixmap(SmallIcon("personal"))); if (TradeEstate *tradeEstate = dynamic_cast(tradeItem)) item->setPixmap(3, PortfolioEstate::drawPixmap(tradeEstate->estate())); // else if (TradeMoney *tradeMoney = dynamic_cast(tradeItem)) // item->setPixmap(3, PortfolioEstate::pixMap(tradeEstate->estate())); m_componentMap[tradeItem] = item; m_componentRevMap[item] = tradeItem; } void TradeDisplay::tradeItemRemoved(TradeItem *t) { TDEListViewItem *item = m_componentMap[t]; delete item; m_componentMap[t] = 0; } void TradeDisplay::tradeItemChanged(TradeItem *t) { TDEListViewItem *item = m_componentMap[t]; if (item) { item->setText(0, t->from() ? t->from()->name() : TQString("?")); item->setPixmap(0, TQPixmap(SmallIcon("personal"))); item->setText(2, t->to() ? t->to()->name() : TQString("?")); item->setPixmap(2, TQPixmap(SmallIcon("personal"))); item->setText(3, t->text()); } } void TradeDisplay::tradeChanged() { // TODO: add notification whether playerSelf has accepted or not and // enable/disable accept button based on that m_status->setText( i18n( "%1 out of %2 players accept current trade proposal." ).arg( m_trade->count( true ) ).arg( m_trade->count( false ) ) ); } void TradeDisplay::playerChanged(Player *player) { m_playerFromCombo->changeItem(player->name(), m_playerFromRevMap[player]); m_playerTargetCombo->changeItem(player->name(), m_playerTargetRevMap[player]); TradeItem *item = 0; for (TQMap::Iterator it=m_componentRevMap.begin() ; it != m_componentRevMap.end() && (item = *it) ; ++it) tradeItemChanged(item); } void TradeDisplay::tradeRejected(Player *player) { if (player) m_status->setText(i18n("Trade proposal was rejected by %1.").arg(player->name())); else m_status->setText(i18n("Trade proposal was rejected.")); // Disable GUI elements m_updateButton->setEnabled(false); m_componentList->setEnabled(false); m_rejectButton->setEnabled(false); m_acceptButton->setEnabled(false); // TODO: add/enable close button } void TradeDisplay::setTypeCombo(int index) { switch (index) { case 0: // Editing estate component m_estateCombo->show(); m_estateCombo->setMaximumWidth(9999); m_moneyBox->hide(); m_moneyBox->setMaximumWidth(0); setEstateCombo(m_estateCombo->currentItem()); // also updates playerfromCombo m_playerFromCombo->setEnabled(false); m_updateButton->setEnabled( m_estateCombo->count() > 0 ); break; case 1: // Editing money component m_estateCombo->hide(); m_estateCombo->setMaximumWidth(0); m_moneyBox->show(); m_moneyBox->setMaximumWidth(9999); m_playerFromCombo->setEnabled(true); m_updateButton->setEnabled(true); break; } } void TradeDisplay::setEstateCombo(int index) { if (m_estateCombo->currentItem() != index) m_estateCombo->setCurrentItem(index); if (Estate *estate = m_estateMap[index]) m_playerFromCombo->setCurrentItem( m_playerFromRevMap[estate->owner()] ); } void TradeDisplay::setCombos(TQListViewItem *i) { TradeItem *item = m_componentRevMap[(TDEListViewItem *)(i)]; if (TradeEstate *tradeEstate = dynamic_cast(item)) { setTypeCombo(0); setEstateCombo( m_estateRevMap[tradeEstate->estate()] ); // also updates playerFromCombo m_playerTargetCombo->setCurrentItem( m_playerTargetRevMap[tradeEstate->to()] ); } else if (TradeMoney *tradeMoney = dynamic_cast(item)) { setTypeCombo(1); m_moneyBox->setValue( tradeMoney->money() ); m_playerFromCombo->setCurrentItem( m_playerFromRevMap[tradeMoney->from()] ); m_playerTargetCombo->setCurrentItem( m_playerTargetRevMap[tradeMoney->to()] ); } } void TradeDisplay::updateComponent() { Estate *estate; Player *pFrom, *pTarget; switch (m_editTypeCombo->currentItem()) { case 0: // Updating estate component estate = m_estateMap[m_estateCombo->currentItem()]; pTarget = m_playerTargetMap[m_playerTargetCombo->currentItem()]; if (estate && pTarget) emit updateEstate(m_trade, estate, pTarget); break; case 1: // Updating money component pFrom = m_playerFromMap[m_playerFromCombo->currentItem()]; pTarget = m_playerTargetMap[m_playerTargetCombo->currentItem()]; if (pFrom && pTarget) emit updateMoney(m_trade, m_moneyBox->value(), pFrom, pTarget); break; } } void TradeDisplay::reject() { emit reject(m_trade); } void TradeDisplay::accept() { emit accept(m_trade); } void TradeDisplay::contextMenu(TDEListView *, TQListViewItem *i, const TQPoint& p) { m_contextTradeItem = m_componentRevMap[(TDEListViewItem *)(i)]; TDEPopupMenu *rmbMenu = new TDEPopupMenu(this); // rmbMenu->insertTitle( ... ); rmbMenu->insertItem(i18n("Remove From Trade"), 0); connect(rmbMenu, TQT_SIGNAL(activated(int)), this, TQT_SLOT(contextMenuClicked(int))); rmbMenu->exec(p); } void TradeDisplay::contextMenuClicked(int) { if (!m_contextTradeItem) return; if (TradeEstate *tradeEstate = dynamic_cast(m_contextTradeItem)) emit updateEstate(m_trade, tradeEstate->estate(), 0); else if (TradeMoney *tradeMoney = dynamic_cast(m_contextTradeItem)) emit updateMoney(m_trade, 0, tradeMoney->from(), tradeMoney->to()); m_contextTradeItem = 0; }