File indexing completed on 2024-04-28 05:38:02

0001 #include "antagonistboard.h"
0002 #include "ui_antagonistboard.h"
0003 
0004 #include <QBuffer>
0005 #include <QByteArray>
0006 #include <QDrag>
0007 #include <QFileDialog>
0008 #include <QJsonArray>
0009 #include <QJsonDocument>
0010 #include <QJsonObject>
0011 #include <QJsonValue>
0012 #include <QMenu>
0013 
0014 #include "controller/antagonistboardcontroller.h"
0015 #include "controller/view_controller/imageselectorcontroller.h"
0016 #include "data/campaign.h"
0017 #include "data/campaigneditor.h"
0018 #include "data/character.h"
0019 #include "data/rolisteammimedata.h"
0020 #include "model/genericmodel.h"
0021 #include "model/nonplayablecharactermodel.h"
0022 #include "model/proxystatemodel.h"
0023 #include "rwidgets/delegates/avatardelegate.h"
0024 #include "rwidgets/delegates/statedelegate.h"
0025 #include "rwidgets/delegates/taglistdelegate.h"
0026 #include "rwidgets/dialogs/imageselectordialog.h"
0027 #include "worker/iohelper.h"
0028 #include "worker/utilshelper.h"
0029 
0030 namespace campaign
0031 {
0032 namespace
0033 {
0034 template <class T>
0035 T* convertField(CharacterField* field)
0036 {
0037     return dynamic_cast<T*>(field);
0038 }
0039 
0040 void setAllRowToHeight(GenericModel* model, int height, QTableView* view)
0041 {
0042     for(int i= 0; i < model->rowCount(); ++i)
0043     {
0044         view->setRowHeight(i, height);
0045     }
0046 }
0047 
0048 campaign::FilteredCharacterModel::Definition checkDefinition(QCheckBox* with, QCheckBox* without, QCheckBox* sender)
0049 {
0050     auto filter= campaign::FilteredCharacterModel::All;
0051     if(with->isChecked() && sender == with)
0052     {
0053         if(without->isChecked())
0054             without->setChecked(false);
0055         filter= campaign::FilteredCharacterModel::With;
0056     }
0057     else if(without->isChecked() && sender == without)
0058     {
0059         if(with->isChecked())
0060             with->setChecked(false);
0061         filter= campaign::FilteredCharacterModel::Without;
0062     }
0063     return filter;
0064 }
0065 } // namespace
0066 AntagonistBoard::AntagonistBoard(campaign::CampaignEditor* editor, QWidget* parent)
0067     : QWidget(parent)
0068     , ui(new Ui::AntagonistBoard)
0069     , m_ctrl(new AntagonistBoardController(editor))
0070     , m_createTokenAct(new QAction(tr("Edit Token")))
0071     , m_cloneCharacterAct(new QAction(tr("Clone Character")))
0072     , m_changeImageAct(new QAction(tr("Change Image")))
0073     , m_fullModeAct(new QAction(tr("Main columns")))
0074     , m_minimalModeAct(new QAction(tr("Minimal Columns")))
0075     , m_saveTokenAct(new QAction(tr("Save")))
0076 {
0077     ui->setupUi(this);
0078     setAcceptDrops(true);
0079 
0080     ui->m_antogonistView->setModel(m_ctrl->filteredModel());
0081     ui->m_antogonistView->setDragEnabled(true);
0082     ui->m_antogonistView->setAcceptDrops(true);
0083     ui->m_antogonistView->setDragDropOverwriteMode(false);
0084     ui->m_antogonistView->setDropIndicatorShown(true);
0085     ui->m_antogonistView->setDefaultDropAction(Qt::MoveAction);
0086     ui->m_antogonistView->setDragDropMode(QAbstractItemView::DragDrop);
0087     ui->m_antogonistView->setSelectionMode(QAbstractItemView::ExtendedSelection);
0088     ui->m_antogonistView->setSelectionBehavior(QAbstractItemView::SelectRows);
0089     ui->m_antogonistView->setContextMenuPolicy(Qt::CustomContextMenu);
0090     ui->m_antogonistView->setItemDelegateForColumn(NonPlayableCharacterModel::ColAvatar, new AvatarDelegate(this));
0091     ui->m_antogonistView->setItemDelegateForColumn(NonPlayableCharacterModel::ColTags, new TagListDelegate(this));
0092     ui->m_antogonistView->setItemDelegateForColumn(NonPlayableCharacterModel::ColState,
0093                                                    new StateDelegate(m_ctrl->characterStateModel(), this));
0094     connect(ui->m_antogonistView, &QTableView::customContextMenuRequested, this, &AntagonistBoard::contextualMenu);
0095     m_fullModeAct->setCheckable(true);
0096     m_minimalModeAct->setCheckable(true);
0097 
0098     ui->m_currentState->setModel(new ProxyStateModel(m_ctrl->stateModel(), this));
0099     connect(ui->m_currentState, &QComboBox::currentIndexChanged, this,
0100             [this]()
0101             {
0102                 auto idx= ui->m_currentState->currentIndex();
0103                 auto model= m_ctrl->filteredModel();
0104                 auto stateModel= ui->m_currentState->model();
0105                 model->setCharacterStateId(
0106                     stateModel->data(stateModel->index(idx, 0), CharacterStateModel::ID).toString());
0107             });
0108 
0109     ui->m_antogonistView->setIconSize(QSize(64, 64));
0110 
0111     ui->m_saveBtn->setDefaultAction(m_saveTokenAct.get());
0112     ui->m_advencedBtn->setDefaultAction(ui->m_advencedAct);
0113     connect(ui->m_advencedAct, &QAction::triggered, this,
0114             [this](bool isChecked)
0115             {
0116                 ui->m_advencedGroup->setVisible(isChecked);
0117                 auto model= m_ctrl->filteredModel();
0118                 model->setAdvanced(isChecked);
0119             });
0120 
0121     ui->m_advencedGroup->setVisible(false);
0122 
0123     connect(m_saveTokenAct.get(), &QAction::triggered, this,
0124             [this]
0125             {
0126                 auto character= m_ctrl->character();
0127 
0128                 character->setName(ui->m_nameEdit->text());
0129                 character->setSize(ui->m_sizeEdit->value());
0130                 character->setInitCommand(ui->m_initCommand->text());
0131                 character->setInitiativeScore(ui->m_initValue->value());
0132                 character->setColor(ui->m_colorSelector->color());
0133                 character->setHealthPointsCurrent(ui->m_currentLife->value());
0134                 character->setHealthPointsMax(ui->m_maxLife->value());
0135                 character->setHealthPointsMin(ui->m_lifeMin->value());
0136                 character->setAvatar(IOHelper::pixmapToData(ui->m_avatarDisplay->pixmap()));
0137 
0138                 m_ctrl->saveToken();
0139                 m_ctrl->setCharacter(nullptr);
0140             });
0141 
0142     ui->m_antogonistView->installEventFilter(this);
0143 
0144     connect(m_fullModeAct.get(), &QAction::toggled, this,
0145             [this](bool val)
0146             {
0147                 if(!val)
0148                     return;
0149 
0150                 m_minimalModeAct->setChecked(false);
0151                 int i= 0;
0152                 for(auto const& col : m_columnsAction)
0153                 {
0154                     if(i < 4)
0155                         col->setChecked(true);
0156                     else
0157                         col->setChecked(false);
0158 
0159                     ++i;
0160                 }
0161             });
0162 
0163     connect(m_minimalModeAct.get(), &QAction::toggled, this,
0164             [this](bool val)
0165             {
0166                 if(!val)
0167                     return;
0168                 int i= 0;
0169                 m_fullModeAct->setChecked(false);
0170                 for(auto const& col : m_columnsAction)
0171                 {
0172                     if(i < 2)
0173                         col->setChecked(true);
0174                     else
0175                         col->setChecked(false);
0176 
0177                     ++i;
0178                 }
0179             });
0180 
0181     if(!editor)
0182         return;
0183 
0184     auto cols= editor->campaign()->npcModel()->headers();
0185 
0186     int i= 0;
0187     std::for_each(std::begin(cols), std::end(cols),
0188                   [&i, this](const QString& colname)
0189                   {
0190                       std::unique_ptr<QAction> act(new QAction(colname));
0191                       act->setCheckable(true);
0192                       act->setChecked(true);
0193                       connect(act.get(), &QAction::toggled, this, &AntagonistBoard::hideColumn);
0194                       act->setData(i);
0195                       ++i;
0196                       m_columnsAction.push_back(std::move(act));
0197                   });
0198 
0199     connect(ui->m_addCharacterAct, &QAction::triggered, this, [this]() { m_ctrl->addCharacter(); });
0200     connect(ui->m_removeCharacterAct, &QAction::triggered, this,
0201             [this]()
0202             {
0203                 auto index= ui->m_antogonistView->currentIndex();
0204                 if(!index.isValid())
0205                     return;
0206 
0207                 m_ctrl->removeCharacter(index.data(NonPlayableCharacterModel::RoleUuid).toString());
0208             });
0209     m_fullModeAct->setChecked(false);
0210     m_minimalModeAct->setChecked(true);
0211 
0212     ui->m_addCharacterBtn->setDefaultAction(ui->m_addCharacterAct);
0213     ui->m_removeCharacterBtn->setDefaultAction(ui->m_removeCharacterAct);
0214 
0215     ui->m_addPropertyBtn->setDefaultAction(ui->m_addPropertyAct);
0216     ui->m_addActionBtn->setDefaultAction(ui->m_addActionAct);
0217     ui->m_addShapeBtn->setDefaultAction(ui->m_addShapeAct);
0218 
0219     ui->m_removeActBtn->setDefaultAction(ui->m_removeActionAct);
0220     ui->m_removeShapeBtn->setDefaultAction(ui->m_removeShapeAct);
0221     ui->m_removePropertyBtn->setDefaultAction(ui->m_removePropertyAct);
0222 
0223     connect(ui->m_antogonistView, &DragableTableView::dragItem, this,
0224             [this](QModelIndex index)
0225             {
0226                 if(index.column() != NonPlayableCharacterModel::ColAvatar)
0227                     return;
0228                 auto uuid= index.data(NonPlayableCharacterModel::RoleUuid).toString();
0229                 auto name= index.data(NonPlayableCharacterModel::RoleName).toString();
0230                 auto img= index.data(NonPlayableCharacterModel::RoleAvatar);
0231                 auto pix = img.value<QPixmap>();
0232 
0233                 if(pix.isNull() || img.isNull())
0234                     return;
0235                 QDrag* drag= new QDrag(this);
0236                 RolisteamMimeData* mimeData= new RolisteamMimeData();
0237 
0238                 mimeData->setNpcUuid(uuid);
0239                 mimeData->setImageData(img);
0240                 mimeData->setText(name);
0241                 drag->setMimeData(mimeData);
0242                 drag->setPixmap(helper::utils::roundCornerImage(pix));
0243                 drag->exec();
0244             });
0245 
0246     connect(m_createTokenAct.get(), &QAction::triggered, this,
0247             [this]()
0248             {
0249                 if(m_currentItemId.isEmpty())
0250                     return;
0251                 m_ctrl->editCharacter(m_currentItemId);
0252             });
0253 
0254     auto changeImageFunc = [this](const QString& itemId)
0255     {
0256         ImageSelectorController ctrl(false, ImageSelectorController::All, ImageSelectorController::Square);
0257         ImageSelectorDialog dialog(&ctrl, this);
0258         if(QDialog::Accepted != dialog.exec())
0259             return;
0260 
0261         m_ctrl->changeImage(itemId, ctrl.finalImageData());
0262     };
0263 
0264     connect(m_changeImageAct.get(), &QAction::triggered, m_ctrl.get(),
0265             [this, changeImageFunc]()
0266             {
0267                 changeImageFunc(m_currentItemId);
0268             });
0269 
0270     connect(m_ctrl.get(), &AntagonistBoardController::characterChanged, this,
0271             [this]()
0272             {
0273                 if(m_ctrl->editingCharacter())
0274                 {
0275                     auto character= m_ctrl->character();
0276                     ui->m_nameEdit->setText(character->name());
0277                     ui->m_colorSelector->setColor(character->getColor());
0278                     ui->m_lifeMin->setValue(character->getHealthPointsMin());
0279                     ui->m_maxLife->setValue(character->getHealthPointsMax());
0280                     ui->m_currentLife->setValue(character->getHealthPointsCurrent());
0281                     ui->m_initCommand->setText(character->initCommand());
0282                     ui->m_initValue->setValue(character->getInitiativeScore());
0283                     ui->m_avatarDisplay->setPixmap(IOHelper::dataToPixmap(character->avatar()));
0284                     ui->stackedWidget->setCurrentIndex(1);
0285                 }
0286                 else
0287                 {
0288                     ui->stackedWidget->setCurrentIndex(0);
0289                 }
0290             });
0291     ui->stackedWidget->setCurrentIndex(0);
0292 
0293     ui->m_actionList->setModel(m_ctrl->actionModel());
0294     ui->m_propertyList->setModel(m_ctrl->propertyModel());
0295     ui->m_shapeList->setModel(m_ctrl->shapeModel());
0296 
0297     connect(ui->m_addActionAct, &QAction::triggered, this,
0298             [this]() { m_ctrl->appendData(campaign::ModelType::Model_Action); });
0299     connect(ui->m_addPropertyAct, &QAction::triggered, this,
0300             [this]() { m_ctrl->appendData(campaign::ModelType::Model_Properties); });
0301     connect(ui->m_addActionAct, &QAction::triggered, this,
0302             [this]()
0303             {
0304                 m_ctrl->appendData(campaign::ModelType::Model_Shape);
0305                 setAllRowToHeight(m_ctrl->shapeModel(), ui->m_sizeEdit->value(), ui->m_shapeList);
0306             });
0307 
0308     ui->m_removeActionAct->setData(QVariant::fromValue(campaign::ModelType::Model_Action));
0309     ui->m_removePropertyAct->setData(QVariant::fromValue(campaign::ModelType::Model_Properties));
0310     ui->m_removeShapeAct->setData(QVariant::fromValue(campaign::ModelType::Model_Shape));
0311 
0312     auto remove= [this]()
0313     {
0314         auto act= qobject_cast<QAction*>(sender());
0315         auto mode= act->data().value<campaign::ModelType>();
0316         QModelIndex index;
0317         switch(mode)
0318         {
0319         case campaign::ModelType::Model_Action:
0320             index= ui->m_actionList->currentIndex();
0321             break;
0322         case campaign::ModelType::Model_Shape:
0323             index= ui->m_shapeList->currentIndex();
0324             break;
0325         case campaign::ModelType::Model_Properties:
0326             index= ui->m_propertyList->currentIndex();
0327             break;
0328         }
0329         m_ctrl->removeData(index, mode);
0330     };
0331 
0332     connect(ui->m_antogonistView, &QTableView::doubleClicked, this, [changeImageFunc](const QModelIndex& index){
0333         if(!index.isValid())
0334             return;
0335 
0336         auto itemId = index.data(NonPlayableCharacterModel::RoleUuid).toString();
0337 
0338         if(itemId.isEmpty())
0339             return;
0340 
0341         switch(index.column())
0342         {
0343         case NonPlayableCharacterModel::ColAvatar:
0344             changeImageFunc(itemId);
0345             break;
0346         default:
0347             break;
0348         }
0349 
0350 
0351     });
0352     connect(ui->m_removeActionAct, &QAction::triggered, this, remove);
0353     connect(ui->m_removePropertyAct, &QAction::triggered, this, remove);
0354     connect(ui->m_removeShapeAct, &QAction::triggered, this, remove);
0355 
0356     connect(ui->m_shapeList, &QTableView::doubleClicked, this,
0357             [this](const QModelIndex& index)
0358             {
0359                 auto path= index.data().toString();
0360                 auto dir= QDir::homePath();
0361 
0362                 if(!path.isEmpty())
0363                 {
0364                     QFileInfo info(path);
0365                     dir= info.absolutePath();
0366                 }
0367 
0368                 ImageSelectorController ctrl(false, ImageSelectorController::All, ImageSelectorController::Square);
0369                 ImageSelectorDialog dialog(&ctrl, this);
0370                 if(QDialog::Accepted != dialog.exec())
0371                     return;
0372 
0373                 auto data= ctrl.finalImageData();
0374                 // m_shapeModel->setData(index, data);
0375             });
0376 
0377     connect(ui->m_sizeEdit, QOverload<int>::of(&QSpinBox::valueChanged), this,
0378             [=]
0379             {
0380                 auto val= ui->m_sizeEdit->value();
0381                 ui->m_shapeList->setIconSize(QSize(val, val));
0382                 // setAllRowToHeight(m_shapeModel, val, ui->m_shapeList);
0383             });
0384 
0385     // sconnect(ui->m_avatarEdit, &QLineEdit::textChanged, this, &AntagonistBoard::updateImage);
0386     connect(ui->m_avatarOpenFileBtn, &QPushButton::clicked, this,
0387             [this]()
0388             {
0389                 ImageSelectorController ctrl(true, ImageSelectorController::All, ImageSelectorController::Square);
0390                 ImageSelectorDialog dialog(&ctrl, this);
0391                 if(QDialog::Accepted != dialog.exec())
0392                     return;
0393 
0394                 auto data= ctrl.finalImageData();
0395                 updateImage(data);
0396             });
0397 
0398     connect(ui->m_tags, &QLineEdit::textEdited, this,
0399             [this]()
0400             {
0401                 auto model= m_ctrl->filteredModel();
0402                 if(model)
0403                     model->setTags(ui->m_tags->text());
0404             });
0405 
0406     auto avatarUpdate= [this]()
0407     {
0408         auto filtered= m_ctrl->filteredModel();
0409         if(filtered)
0410             filtered->setAvatarDefinition(
0411                 checkDefinition(ui->m_withAvatar, ui->m_withoutAvatar, qobject_cast<QCheckBox*>(sender())));
0412     };
0413 
0414     connect(ui->m_withAvatar, &QCheckBox::clicked, this, avatarUpdate);
0415     connect(ui->m_withoutAvatar, &QCheckBox::clicked, this, avatarUpdate);
0416 
0417     auto initScoreUpdate= [this]()
0418     {
0419         auto filtered= m_ctrl->filteredModel();
0420         if(filtered)
0421             filtered->setInitiativeScoreDef(
0422                 checkDefinition(ui->m_withInit, ui->m_withoutInit, qobject_cast<QCheckBox*>(sender())));
0423     };
0424 
0425     connect(ui->m_withInit, &QCheckBox::clicked, this, initScoreUpdate);
0426     connect(ui->m_withoutInit, &QCheckBox::clicked, this, initScoreUpdate);
0427 
0428     auto actionUpdate= [this]()
0429     {
0430         auto filtered= m_ctrl->filteredModel();
0431         if(filtered)
0432             filtered->setActionDef(
0433                 checkDefinition(ui->m_withActions, ui->m_withoutAction, qobject_cast<QCheckBox*>(sender())));
0434     };
0435 
0436     connect(ui->m_withActions, &QCheckBox::clicked, this, actionUpdate);
0437     connect(ui->m_withoutAction, &QCheckBox::clicked, this, actionUpdate);
0438 
0439     auto propertiesUpdate= [this]()
0440     {
0441         auto filtered= m_ctrl->filteredModel();
0442         if(filtered)
0443             filtered->setPropertiesDef(
0444                 checkDefinition(ui->m_withProperties, ui->m_withoutProperties, qobject_cast<QCheckBox*>(sender())));
0445     };
0446 
0447     connect(ui->m_withProperties, &QCheckBox::clicked, this, propertiesUpdate);
0448     connect(ui->m_withoutProperties, &QCheckBox::clicked, this, propertiesUpdate);
0449 
0450     auto shapeUpdate= [this]()
0451     {
0452         auto filtered= m_ctrl->filteredModel();
0453         if(filtered)
0454             filtered->setShapeDef(
0455                 checkDefinition(ui->m_withShape, ui->m_withoutShape, qobject_cast<QCheckBox*>(sender())));
0456     };
0457 
0458     connect(ui->m_withShape, &QCheckBox::clicked, this, shapeUpdate);
0459     connect(ui->m_withoutShape, &QCheckBox::clicked, this, shapeUpdate);
0460 
0461     auto initiativeCmdUpdate= [this]()
0462     {
0463         auto filtered= m_ctrl->filteredModel();
0464         if(filtered)
0465             filtered->setInitiativeCmdDef(
0466                 checkDefinition(ui->m_withInitCmd, ui->m_withoutInitCmd, qobject_cast<QCheckBox*>(sender())));
0467     };
0468 
0469     connect(ui->m_withInitCmd, &QCheckBox::clicked, this, initiativeCmdUpdate);
0470     connect(ui->m_withoutInitCmd, &QCheckBox::clicked, this, initiativeCmdUpdate);
0471 
0472     connect(ui->m_textToExclude, &QLineEdit::textEdited, this,
0473             [this](const QString& text)
0474             {
0475                 auto model= m_ctrl->filteredModel();
0476                 if(model)
0477                     model->setExclude(text);
0478             });
0479 
0480     connect(ui->m_exludedTags, &QLineEdit::textEdited, this,
0481             [this](const QString& text)
0482             {
0483                 auto model= m_ctrl->filteredModel();
0484                 if(model)
0485                     model->setExcludeTags(text);
0486             });
0487     auto updateHealth= [this]()
0488     {
0489         QCheckBox* sdr= qobject_cast<QCheckBox*>(sender());
0490         auto hlState= FilteredCharacterModel::HealthState::HS_All;
0491 
0492         if(sdr == ui->m_healthMin && ui->m_healthMin->isChecked())
0493         {
0494             hlState= FilteredCharacterModel::HealthState::HS_Dead;
0495             ui->m_injured->setChecked(false);
0496             ui->m_fullHealth->setChecked(false);
0497         }
0498         else if(sdr == ui->m_injured && ui->m_injured->isChecked())
0499         {
0500             hlState= FilteredCharacterModel::HealthState::HS_Injured;
0501             ui->m_healthMin->setChecked(false);
0502             ui->m_fullHealth->setChecked(false);
0503         }
0504         else if(sdr == ui->m_fullHealth && ui->m_fullHealth->isChecked())
0505         {
0506             hlState= FilteredCharacterModel::HealthState::HS_Full;
0507             ui->m_healthMin->setChecked(false);
0508             ui->m_injured->setChecked(false);
0509         }
0510         auto filtered= m_ctrl->filteredModel();
0511         if(filtered)
0512             filtered->setHlState(hlState);
0513     };
0514     connect(ui->m_healthMin, &QCheckBox::clicked, this, updateHealth);
0515     connect(ui->m_injured, &QCheckBox::clicked, this, updateHealth);
0516     connect(ui->m_fullHealth, &QCheckBox::clicked, this, updateHealth);
0517 
0518     ui->m_colorCombo->setModel(m_ctrl->colorModel());
0519     ui->m_currentState->setModel(m_ctrl->stateModel());
0520 
0521     connect(ui->m_searchLine, &QLineEdit::textChanged, this,
0522             [this]() { m_ctrl->setSearchText(ui->m_searchLine->text()); });
0523 
0524 #ifndef Q_OS_MAC
0525     ui->m_actionList->setAlternatingRowColors(true);
0526     ui->m_shapeList->setAlternatingRowColors(true);
0527     ui->m_propertyList->setAlternatingRowColors(true);
0528 #endif
0529 }
0530 
0531 AntagonistBoard::~AntagonistBoard()
0532 {
0533     delete ui;
0534 }
0535 
0536 const std::vector<std::unique_ptr<QAction>>& AntagonistBoard::columnsActions() const
0537 {
0538     return m_columnsAction;
0539 }
0540 
0541 void AntagonistBoard::contextualMenu(const QPoint& pos)
0542 {
0543     QMenu menu;
0544 
0545     auto index= ui->m_antogonistView->indexAt(pos);
0546 
0547     m_currentItemId= index.isValid() ? index.data(NonPlayableCharacterModel::RoleUuid).toString() : QString();
0548     menu.addAction(ui->m_addCharacterAct);
0549     menu.addAction(m_cloneCharacterAct.get());
0550     menu.addAction(ui->m_removeCharacterAct);
0551     menu.addAction(m_createTokenAct.get());
0552     menu.addAction(m_changeImageAct.get());
0553     menu.addSeparator();
0554     menu.addAction(m_fullModeAct.get());
0555     menu.addAction(m_minimalModeAct.get());
0556     auto colsMenu= menu.addMenu(tr("Show Columns"));
0557     for(auto const& act : m_columnsAction)
0558     {
0559         colsMenu->addAction(act.get());
0560     }
0561 
0562     m_createTokenAct->setEnabled(index.isValid());
0563     m_cloneCharacterAct->setEnabled(index.isValid());
0564     ui->m_removeCharacterAct->setEnabled(index.isValid());
0565     m_changeImageAct->setEnabled(index.isValid());
0566 
0567     menu.exec(ui->m_antogonistView->mapToGlobal(pos));
0568 }
0569 
0570 void AntagonistBoard::updateImage(const QByteArray& data)
0571 {
0572     QPixmap pix;
0573     pix.loadFromData(data);
0574     ui->m_avatarDisplay->setPixmap(pix);
0575 }
0576 
0577 void AntagonistBoard::hideColumn()
0578 {
0579     auto act= qobject_cast<QAction*>(sender());
0580     auto i= act->data().toInt();
0581 
0582     if(act->isChecked())
0583         ui->m_antogonistView->showColumn(i);
0584     else
0585         ui->m_antogonistView->hideColumn(i);
0586 }
0587 
0588 bool AntagonistBoard::eventFilter(QObject* obj, QEvent* event)
0589 {
0590     if(obj == ui->m_antogonistView)
0591     {
0592         /*if(event->type() == QEvent::MouseMove)
0593         {
0594             auto e= dynamic_cast<QMouseEvent*>(event);
0595             if(e)
0596             {
0597                 auto index= ui->m_antogonistView->indexAt(e->pos());
0598             }
0599         }*/
0600     }
0601 
0602     return QWidget::eventFilter(obj, event);
0603 }
0604 
0605 bool AntagonistBoard::fullMode() const
0606 {
0607     return m_fullModeAct->isChecked();
0608 }
0609 
0610 void AntagonistBoard::setFullMode(bool newFullMode)
0611 {
0612     if(fullMode() == newFullMode)
0613         return;
0614     m_fullModeAct->setChecked(newFullMode);
0615     emit fullModeChanged();
0616 }
0617 
0618 bool AntagonistBoard::minimalMode() const
0619 {
0620     return m_minimalModeAct->isChecked();
0621 }
0622 
0623 void AntagonistBoard::setMinimalMode(bool newMinimalMode)
0624 {
0625     if(minimalMode() == newMinimalMode)
0626         return;
0627     m_minimalModeAct->setChecked(newMinimalMode);
0628     emit minimalModeChanged();
0629 }
0630 
0631 } // namespace campaign