diff --git a/BetInputDialog.qml b/BetInputDialog.qml new file mode 100644 index 0000000..7b6e2d3 --- /dev/null +++ b/BetInputDialog.qml @@ -0,0 +1,62 @@ +import QtQuick +import QtQuick.Controls + +import roulette + +Dialog { + property alias input: input + required property int betType /* It wouldn't accept the type defined in PlayerAreaModel so I just used the int since that's what it is*/ + required property int n + required property int squareX + required property int squareY + + id: dialog + modal: true + height: 35 + width: 80 + + TextField { + id: input + focus: true + + anchors { + left: parent.left + right: gil.left + rightMargin: 5 + top: parent.top + bottom: parent.bottom + } + + onActiveFocusChanged: { + selectAll() + focus = true + } + onAccepted: { + dialog.accept() + } + } + + Text { + id: gil + text: "g" + + anchors { + right: parent.right + verticalCenter: input.verticalCenter + } + } + + onActiveFocusChanged: { + dialog.x = 120 + squareX + dialog.y = 60 + squareY + } + + onAccepted: { + PlayerAreaModel.bet(betType, n, input.text) + rouletteTable.numberOfBets += 1 + } + + onRejected: { + PlayerAreaModel.cancelBet(n) + } +} diff --git a/CMakeLists.txt b/CMakeLists.txt index 568bfea..edf13f7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,8 +17,6 @@ set(SOURCES MainWindow.h PlayerAreaModel.cpp PlayerAreaModel.h - StreetBetsModel.cpp - StreetBetsModel.h ${QRC}) qt_add_executable(roulette-payout @@ -31,6 +29,7 @@ qt_add_qml_module(roulette-payout RESOURCE_PREFIX "/" QML_FILES Root.qml + BetInputDialog.qml PlayerAreaView.qml Roulette.qml StreetBetsView.qml diff --git a/PlayerAreaModel.cpp b/PlayerAreaModel.cpp index 7dea37a..097ccc6 100644 --- a/PlayerAreaModel.cpp +++ b/PlayerAreaModel.cpp @@ -2,49 +2,65 @@ PlayerAreaModel::PlayerAreaModel(QObject *parent) { + Player defaultValues; + for(int i = 0; i < 7; i++){ - playerNames.append("N/A"); + players.append(defaultValues); } } -QString PlayerAreaModel::getPlayerName(int n) +uint PlayerAreaModel::focusedPlayer() { - return playerNames.at(n); -} - -void PlayerAreaModel::setPlayerName(QString s, int n) -{ - switch(n) { - case 0: - playerNames[n] = s; - break; - case 1: - playerNames[n] = s; - break; - case 2: - playerNames[n] = s; - break; - case 3: - playerNames[n] = s; - break; - case 4: - playerNames[n] = s; - break; - case 5: - playerNames[n] = s; - break; - case 6: - playerNames[n] = s; - break; - } + return focusedPlayer_; } void PlayerAreaModel::setFocusedPlayer(int n) { - focusedPlayer = n; + focusedPlayer_ = n; + Player player = players.at(n); + BetType b1 = player.bet1.betType; + BetType b2 = player.bet2.betType; + uint n1 = player.bet1.betSpot; + uint n2 = player.bet2.betSpot; + emit focusedPlayerChanged(b1, n1, b2, n2); +} + +QString PlayerAreaModel::getPlayerName(int n) +{ + return players.at(n).playerName; +} + +void PlayerAreaModel::setPlayerName(QString s, int n) +{ + this->players[n].playerName = s; } void PlayerAreaModel::bet(BetType b, int n, int bet) { - printf("Received %d-%d for player %s for %d gil\n", b, n, playerNames[focusedPlayer].toLocal8Bit().data(), bet); + Player *player = &players[focusedPlayer_]; + + if (player->bet1.betType == NONE) { + player->bet1.betType = b; + player->bet1.betValue = bet; + player->bet1.betSpot = n; + } else if (player->bet2.betType == NONE) { + player->bet2.betType = b; + player->bet2.betValue = bet; + player->bet2.betSpot = n; + } } + +void PlayerAreaModel::removeBet(BetType b, int n) +{ + Player *player = &players[focusedPlayer_]; + if (player->bet1.betType != NONE) { + player->bet1.betType = NONE; + } else { + player->bet2.betType = NONE; + } +} + +void PlayerAreaModel::cancelBet(int n) { + emit betCanceled(n); +} + diff --git a/PlayerAreaModel.h b/PlayerAreaModel.h index e24322a..fb5f14b 100644 --- a/PlayerAreaModel.h +++ b/PlayerAreaModel.h @@ -13,10 +13,16 @@ class PlayerAreaModel : public QObject QML_NAMED_ELEMENT(PlayerAreaModel) QML_SINGLETON + Q_PROPERTY(uint focusedPlayer READ focusedPlayer WRITE setFocusedPlayer NOTIFY focusedPlayerChanged) + public: explicit PlayerAreaModel(QObject *parent = nullptr); + uint focusedPlayer(); + void setFocusedPlayer(int n); + enum BetType { + NONE, RED, BLACK, ODD, @@ -30,31 +36,33 @@ public: }; Q_ENUM(BetType) +signals: + void focusedPlayerChanged(BetType b1, uint n1, BetType b2, uint n2); + void betCanceled(uint n); + public slots: void setPlayerName(QString s, int n); void bet(BetType b, int n, int bet); + void removeBet(BetType b, int n); QString getPlayerName(int n); - void setFocusedPlayer(int n); + void cancelBet(int n); private: - QList playerNames; + struct Bet { + uint betValue = 0; + BetType betType = NONE; + uint betSpot = 0; + }; - uint player1Bet1; - uint player1Bet2; - uint player2Bet1; - uint player2Bet2; - uint player3Bet1; - uint player3Bet2; - uint player4Bet1; - uint player4Bet2; - uint player5Bet1; - uint player5Bet2; - uint player6Bet1; - uint player6Bet2; - uint player7Bet1; - uint player7Bet2; + struct Player { + QString playerName = ""; + Bet bet1; + Bet bet2; + }; - int focusedPlayer; + QList players; + + int focusedPlayer_; }; diff --git a/PlayerAreaView.qml b/PlayerAreaView.qml index 3f185f6..579dea5 100644 --- a/PlayerAreaView.qml +++ b/PlayerAreaView.qml @@ -5,6 +5,11 @@ import QtQuick.Layouts import roulette Item { + anchors { + left: parent.left + leftMargin: 10 + } + Text { id: croupier text: "Croupier" @@ -27,12 +32,32 @@ Item { text: "Player " + (index + 1) } + Rectangle { + id: indicator + color: "red" + height: 10 + width: 10 + visible: PlayerAreaModel.focusedPlayer == index + opacity: 0.5 + + anchors { + verticalCenter: inputField.verticalCenter + right: inputField.left + rightMargin: 5 + } + } + TextField { + id: inputField anchors.top: label.bottom anchors.topMargin: 6 onTextEdited: PlayerAreaModel.setPlayerName(text, index) - onActiveFocusChanged: PlayerAreaModel.setFocusedPlayer(index) + onActiveFocusChanged: { + if (activeFocus && (focusReason == 0 || focusReason == 1 || focusReason == 2)) { + PlayerAreaModel.focusedPlayer = index + } + } } } } diff --git a/Roulette.qml b/Roulette.qml index 9a9e4fd..3be3f7d 100644 --- a/Roulette.qml +++ b/Roulette.qml @@ -4,6 +4,9 @@ import Qt5Compat.GraphicalEffects import roulette Item { + property int numberOfBets: 0 + + id: rouletteTable Image { source: "qrc:/roulette.png" @@ -20,4 +23,29 @@ Item { id: streetBets } } + + function destroyOnClose(obj) { + if (obj.closing != undefined) + obj.closing.connect(() => obj.destroy(1000)); + else if (obj.aboutToHide != undefined) + obj.aboutToHide.connect(() => obj.destroy(1000)); + } + + function showBetInputDialog(betType, n, squareX, squareY) + { + var component = Qt.createComponent("BetInputDialog.qml") + if (component.status == Component.Ready) { + var dialog = component.createObject(rouletteTable, { + "betType": betType, + "n": n, + "squareX": squareX, + "squareY": squareY + }) + + dialog.open() + destroyOnClose(dialog) + } else { + console.error("Something crapped out: " + component.errorString()); + } + } } diff --git a/StreetBetsView.qml b/StreetBetsView.qml index 52d49a7..841bbf6 100644 --- a/StreetBetsView.qml +++ b/StreetBetsView.qml @@ -1,15 +1,14 @@ import QtQuick import QtQuick.Layouts -import QtQuick.Controls import roulette +/* + * The very important id 'rouletteTable' + * comes from Roulette.qml + */ Item { - StreetBetsModel { - id: streetBetsModel - } - RowLayout { id: layout property int indexForDialog @@ -28,45 +27,82 @@ Item { model: 12 Item { - height: 45 - width: 35 property alias selected: selected + id: betButton + height: 45 + width: 35 + Rectangle { + id: selected visible: true - color: tapHandler1.pressed ? "#999999" : "#EEEEEE" - opacity: hoverHandler.hovered ? 0.4 : 0 height: parent.height width: parent.width + border.color: "blue" + border.width: 0 + + color: { + if (rouletteTable.numberOfBets < 2 || border.width == 2) { + if (tapHandler1.pressed) { + "#AA999999" + } else if (hoverHandler.hovered) { + "#AAEEEEEE" + } else { + "#00000000" + } + } else { + "#00000000" + } + } HoverHandler { id: hoverHandler } TapHandler { id: tapHandler1 - } - } - - Rectangle { - id: selected - - visible: true - color: "transparent" - height: parent.height - width: parent.width - border.color: "blue" - border.width: 0 - - TapHandler { onTapped: { - if (parent.border.width == 0) { + if (rouletteTable.numberOfBets < 2 && parent.border.width == 0) { parent.border.width = 2 layout.indexForDialog = index - - dialog.open() - } else { + roulette.showBetInputDialog(PlayerAreaModel.STREET, index, betButton.x, betButton.y) + } else if (parent.border.width == 2) { parent.border.width = 0 + PlayerAreaModel.removeBet(PlayerAreaModel.STREET, index) + rouletteTable.numberOfBets -= 1 + } + } + } + + Connections { + target: PlayerAreaModel + + function onFocusedPlayerChanged(b1, n1, b2, n2) { + if (b1 == PlayerAreaModel.STREET && n1 == index) { + if (selected.border.width != 0) { + rouletteTable.numberOfBets -=1 + } + + selected.border.width = 2; + rouletteTable.numberOfBets += 1 + } else if (b2 == PlayerAreaModel.STREET && n2 == index) { + if (selected.border.width != 0) { + rouletteTable.numberOfBets -=1 + } + + selected.border.width = 2; + rouletteTable.numberOfBets += 1 + } else { + if (selected.border.width != 0) { + rouletteTable.numberOfBets -=1 + } + selected.border.width = 0; + } + } + + function onBetCanceled(n) { + if (index == n) { + selected.border.width = 0 } } } @@ -74,37 +110,4 @@ Item { } } } - - Dialog { - property alias input: input - - id: dialog - height: 35 - width: 65 - - TextField { - id: input - focus: true - - anchors { - fill: parent - } - - onActiveFocusChanged: { - selectAll() - focus = true - } - onAccepted: { - dialog.accept() - } - } - - onActiveFocusChanged: { - dialog.x = 120 + repeater.itemAt(layout.indexForDialog).x - dialog.y = 60 + repeater.itemAt(layout.indexForDialog).y - } - - onAccepted: PlayerAreaModel.bet(PlayerAreaModel.STREET, layout.indexForDialog, input.text) - onRejected: repeater.itemAt(layout.indexForDialog).selected.border.width = 0 - } }