#include #include #include #include #include #include #include #include #include #include #include #include #include #include class ControlInterface { public: ControlInterface ®isterListOfCardsWidget(std::shared_ptr &iListOfCards) { _listOfCardsWidget = iListOfCards; return *this; } ControlInterface ®isterMainWindow(std::shared_ptr &iMainWindow) { _mainWindow = iMainWindow; return *this; } ControlInterface ®isterMainMenuBar(std::shared_ptr &iMenuBar) { _mainMenuBar = iMenuBar; return *this; } ControlInterface ®isterRightView(std::shared_ptr &iRightView) { _rightView = iRightView; return *this; } std::shared_ptr listOfCardsWidget() { return _listOfCardsWidget; } std::shared_ptr mainWindow() { return _mainWindow; } std::shared_ptr mainMenuBar() { return _mainMenuBar; } std::shared_ptr rightView() { return _rightView; } ControlInterface &configure() { configureListOfCardsWidget().configureMainMenuBar().configureRightGraphicsView(); return *this; } private: std::shared_ptr _listOfCardsWidget; std::shared_ptr _mainWindow; std::shared_ptr _mainMenuBar; std::shared_ptr _rightView; std::shared_ptr _rightScene; ControlInterface &fillListOfCards(const std::string &iCardsJsonPath) { std::ifstream aCardsJsonFile{iCardsJsonPath}; uint64_t aCardIndex{0}; _listOfCardsWidget->clear(); for (auto &aCard : nlohmann::json::parse(aCardsJsonFile)) { _listOfCardsWidget->insertItem(aCardIndex++, std::format("{} ({})", aCard["name"].get(), aCard["id"].get()) .c_str()); } _listOfCardsWidget->setVisible(true); _listOfCardsWidget->setFixedWidth(_listOfCardsWidget->sizeHintForColumn(0) + 2 * _listOfCardsWidget->frameWidth() + 20); _mainWindow->resize(1500, 1000); return *this; } ControlInterface &configureListOfCardsWidget() { _listOfCardsWidget->hide(); return *this; } ControlInterface &configureMainMenuBar() { QMenu *aOpenMenu = _mainMenuBar->addMenu("File"); aOpenMenu->addAction("Open JSON file", [this] { QFileDialog aFileDialog; aFileDialog.setWindowTitle("Choose JSON file"); QDir aCurrentDir{QDir::currentPath()}; aFileDialog.setDirectory(aCurrentDir); aFileDialog.setFileMode(QFileDialog::ExistingFile); aFileDialog.setOption(QFileDialog::ShowDirsOnly, false); aFileDialog.setNameFilter("*.json"); aFileDialog.exec(); const QStringList kFilePaths{aFileDialog.selectedFiles()}; if (kFilePaths.size() > 0) { fillListOfCards(kFilePaths[0].toStdString()); _rightView->setVisible(true); } }); aOpenMenu->addAction("Quit", [this] { _mainWindow->close(); }); return *this; } ControlInterface &configureRightGraphicsView() { _rightScene = std::make_shared(); QGraphicsRectItem *rect = _rightScene->addRect(QRectF(0, 0, 100, 100)); QGraphicsItem *item = _rightScene->itemAt(50, 50, QTransform()); _rightView->setScene(_rightScene.get()); _rightView->hide(); return *this; } }; int main(int argc, char *argv[]) { QApplication aApplication(argc, argv); auto aWindow = std::make_shared(); aWindow->resize(400, 50); // Set Dialog flag for i3 users aWindow->setWindowFlag(Qt::WindowType::Dialog); QGridLayout aLayout(aWindow.get()); QHBoxLayout aHLayout(aLayout.widget()); auto aMenuBar = std::make_shared(); aLayout.addWidget(aMenuBar.get(), 0, 0); auto aListOfCards = std::make_shared(); aLayout.addLayout(&aHLayout, 1, 0); aHLayout.addWidget(aListOfCards.get()); auto aRightView = std::make_shared(); aHLayout.addWidget(aRightView.get()); ControlInterface aControlInterface; aControlInterface.registerListOfCardsWidget(aListOfCards) .registerMainWindow(aWindow) .registerMainMenuBar(aMenuBar) .registerRightView(aRightView) .configure(); aWindow->show(); aWindow->setWindowTitle("Hearthstone simulator"); return aApplication.exec(); }