From 79dbf992bfec34cd3c041a93bd8478f497c4ea83 Mon Sep 17 00:00:00 2001 From: Leonardo Zide Date: Mon, 20 Jan 2025 16:42:08 -0800 Subject: [PATCH] Fixed enter key not working on the part picker. --- common/lc_model.cpp | 6 ++- common/lc_model.h | 2 +- common/lc_partselectionwidget.cpp | 31 ++++++++++++--- common/lc_partselectionwidget.h | 9 ++++- common/lc_view.cpp | 28 ++++--------- qt/lc_qutils.cpp | 65 +++++++++++++++++++++++++++++++ qt/lc_qutils.h | 28 +++++++++++++ 7 files changed, 139 insertions(+), 30 deletions(-) diff --git a/common/lc_model.cpp b/common/lc_model.cpp index d1b411e6..a4396947 100644 --- a/common/lc_model.cpp +++ b/common/lc_model.cpp @@ -2281,13 +2281,13 @@ lcMatrix33 lcModel::GetRelativeRotation() const return lcMatrix33Identity(); } -void lcModel::AddPiece(PieceInfo* PieceInfo, quint32 Section) +lcPiece* lcModel::AddPiece(PieceInfo* PieceInfo, quint32 Section) { if (!PieceInfo) PieceInfo = gMainWindow->GetCurrentPieceInfo(); if (!PieceInfo) - return; + return nullptr; lcPiece* Last = mPieces.empty() ? nullptr : mPieces.back().get(); @@ -2341,6 +2341,8 @@ void lcModel::AddPiece(PieceInfo* PieceInfo, quint32 Section) ClearSelectionAndSetFocus(Piece, LC_PIECE_SECTION_POSITION, false); SaveCheckpoint(tr("Adding Piece")); + + return Piece; } void lcModel::AddPiece(lcPiece* Piece) diff --git a/common/lc_model.h b/common/lc_model.h index ec8ff921..c321afa6 100644 --- a/common/lc_model.h +++ b/common/lc_model.h @@ -209,7 +209,7 @@ public: void InsertStep(lcStep Step); void RemoveStep(lcStep Step); - void AddPiece(PieceInfo* Info, quint32 Section); + lcPiece* AddPiece(PieceInfo* Info, quint32 Section); void DeleteAllCameras(); void DeleteSelectedObjects(); void ResetSelectedPiecesPivotPoint(); diff --git a/common/lc_partselectionwidget.cpp b/common/lc_partselectionwidget.cpp index a019fbe0..070d80b3 100644 --- a/common/lc_partselectionwidget.cpp +++ b/common/lc_partselectionwidget.cpp @@ -547,11 +547,34 @@ lcPartSelectionListView::lcPartSelectionListView(QWidget* Parent, lcPartSelectio lcPartSelectionItemDelegate* ItemDelegate = new lcPartSelectionItemDelegate(this, mListModel); setItemDelegate(ItemDelegate); - connect(this, SIGNAL(customContextMenuRequested(QPoint)), SLOT(CustomContextMenuRequested(QPoint))); + connect(this, &QListView::doubleClicked, this, &lcPartSelectionListView::DoubleClicked); + connect(this, &QListView::customContextMenuRequested, this, &lcPartSelectionListView::CustomContextMenuRequested); SetIconSize(lcGetProfileInt(LC_PROFILE_PARTS_LIST_ICONS)); } +void lcPartSelectionListView::keyPressEvent(QKeyEvent* KeyEvent) +{ + if (KeyEvent->key() == Qt::Key_Enter) + { + PieceInfo* Info = GetCurrentPart(); + + emit PartPicked(Info); + + return; + } + + return QListView::keyPressEvent(KeyEvent); +} + +void lcPartSelectionListView::DoubleClicked(const QModelIndex& Index) +{ + PieceInfo* Info = GetListModel()->GetPieceInfo(Index.row()); + + if (Info) + emit PartPicked(Info); +} + void lcPartSelectionListView::CustomContextMenuRequested(QPoint Pos) { if (!mPartSelectionWidget) @@ -878,7 +901,7 @@ lcPartSelectionWidget::lcPartSelectionWidget(QWidget* Parent) Layout->addWidget(mSplitter); setLayout(Layout); - connect(mPartsWidget, &QListView::doubleClicked, this, &lcPartSelectionWidget::PartViewDoubleClicked); + connect(mPartsWidget, &lcPartSelectionListView::PartPicked, this, &lcPartSelectionWidget::PartViewPartPicked); connect(mPartsWidget->selectionModel(), &QItemSelectionModel::currentChanged, this, &lcPartSelectionWidget::PartViewSelectionChanged); connect(mFilterWidget, &QLineEdit::textChanged, this, &lcPartSelectionWidget::FilterChanged); connect(mCategoriesWidget, &QTreeWidget::currentItemChanged, this, &lcPartSelectionWidget::CategoryChanged); @@ -1079,10 +1102,8 @@ void lcPartSelectionWidget::PartViewSelectionChanged(const QModelIndex& Current, emit CurrentPartChanged(mPartsWidget->GetCurrentPart()); } -void lcPartSelectionWidget::PartViewDoubleClicked(const QModelIndex& Index) +void lcPartSelectionWidget::PartViewPartPicked(PieceInfo* Info) { - PieceInfo* Info = mPartsWidget->GetListModel()->GetPieceInfo(Index.row()); - if (Info) emit PartPicked(Info); } diff --git a/common/lc_partselectionwidget.h b/common/lc_partselectionwidget.h index d18ef91c..0e905fa7 100644 --- a/common/lc_partselectionwidget.h +++ b/common/lc_partselectionwidget.h @@ -219,6 +219,9 @@ public: void UpdateInUseCategory(); void UpdateViewMode(); +signals: + void PartPicked(PieceInfo* Info); + public slots: void CustomContextMenuRequested(QPoint Pos); void SetNoIcons(); @@ -238,9 +241,13 @@ public slots: void ToggleListMode(); void ToggleFixedColor(); +protected slots: + void DoubleClicked(const QModelIndex& Index); + protected: void SetIconSize(int Size); void SetPartFilterType(lcPartFilterType Option); + void keyPressEvent(QKeyEvent* KeyEvent) override; lcPartSelectionListModel* mListModel = nullptr; lcPartSelectionWidget* mPartSelectionWidget = nullptr; @@ -311,7 +318,7 @@ protected slots: void FilterCategoriesTriggered(); void CategoryChanged(QTreeWidgetItem* Current, QTreeWidgetItem* Previous); void PartViewSelectionChanged(const QModelIndex& Current, const QModelIndex& Previous); - void PartViewDoubleClicked(const QModelIndex& Index); + void PartViewPartPicked(PieceInfo* Info); void OptionsMenuAboutToShow(); void EditPartPalettes(); diff --git a/common/lc_view.cpp b/common/lc_view.cpp index 642acb75..da4da04d 100644 --- a/common/lc_view.cpp +++ b/common/lc_view.cpp @@ -17,7 +17,7 @@ #include "lc_viewsphere.h" #include "lc_findreplacewidget.h" #include "lc_library.h" -#include "lc_partselectionwidget.h" +#include "lc_qutils.h" lcFindReplaceParams lcView::mFindReplaceParams; QPointer lcView::mFindWidget; @@ -322,29 +322,15 @@ void lcView::ShowTrainTrackPopup() if (!TrainTrackInfo) return; - QMenu* Menu = new QMenu(mWidget); + PieceInfo* Info = lcShowTrainTrackPopup(mWidget, TrainTrackInfo); - QWidgetAction* Action = new QWidgetAction(Menu); - lcPartSelectionListView* ListView = new lcPartSelectionListView(mWidget, nullptr); - Action->setDefaultWidget(ListView); - Menu->addAction(Action); - - std::vector Parts = lcGetPiecesLibrary()->GetTrainTrackParts(TrainTrackInfo); - - ListView->SetCustomParts(Parts); - - connect(ListView, &QListView::doubleClicked, [this, Menu, ListView, ActiveModel]() + if (Info) { - ActiveModel->AddPiece(ListView->GetCurrentPart(), mTrackToolSection); - lcObject* Focus = ActiveModel->GetFocusObject(); - if (Focus && Focus->IsPiece()) - ActiveModel->UpdateTrainTrackConnections((lcPiece*)Focus); - Menu->close(); - }); + Piece = ActiveModel->AddPiece(Info, mTrackToolSection); - Menu->exec(QCursor::pos()); - - delete Menu; + if (Piece) + ActiveModel->UpdateTrainTrackConnections(Piece); + } } void lcView::ShowContextMenu() const diff --git a/qt/lc_qutils.cpp b/qt/lc_qutils.cpp index faf25154..044fdb8a 100644 --- a/qt/lc_qutils.cpp +++ b/qt/lc_qutils.cpp @@ -229,6 +229,71 @@ void lcPieceIdPickerPopup::Close() Menu->close(); } +lcTrainTrackPickerPopup::lcTrainTrackPickerPopup(QWidget* Parent, const lcTrainTrackInfo* TrainTrackInfo) + : QWidget(Parent) +{ + QVBoxLayout* Layout = new QVBoxLayout(this); + + mPartSelectionListView = new lcPartSelectionListView(this, nullptr); + Layout->addWidget(mPartSelectionListView); + + mPartSelectionListView->setMinimumWidth(450); + mPartSelectionListView->setDragEnabled(false); + + std::vector Parts = lcGetPiecesLibrary()->GetTrainTrackParts(TrainTrackInfo); + + mPartSelectionListView->SetCustomParts(Parts); + + connect(mPartSelectionListView, &lcPartSelectionListView::PartPicked, this, &lcTrainTrackPickerPopup::Accept); + + QDialogButtonBox* ButtonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel, this); + Layout->addWidget(ButtonBox); + + QObject::connect(ButtonBox, &QDialogButtonBox::accepted, this, &lcTrainTrackPickerPopup::Accept); + QObject::connect(ButtonBox, &QDialogButtonBox::rejected, this, &lcTrainTrackPickerPopup::Reject); +} + +void lcTrainTrackPickerPopup::showEvent(QShowEvent* ShowEvent) +{ + QWidget::showEvent(ShowEvent); + + mPartSelectionListView->setFocus(); +} + +void lcTrainTrackPickerPopup::Accept() +{ + mPickedTrainTrack = mPartSelectionListView->GetCurrentPart(); + + Close(); +} + +void lcTrainTrackPickerPopup::Reject() +{ + Close(); +} + +void lcTrainTrackPickerPopup::Close() +{ + QMenu* Menu = qobject_cast(parent()); + + if (Menu) + Menu->close(); +} + +PieceInfo* lcShowTrainTrackPopup(QWidget* Parent, const lcTrainTrackInfo* TrainTrackInfo) +{ + std::unique_ptr Menu(new QMenu(Parent)); + QWidgetAction* Action = new QWidgetAction(Menu.get()); + lcTrainTrackPickerPopup* Popup = new lcTrainTrackPickerPopup(Menu.get(), TrainTrackInfo); + + Action->setDefaultWidget(Popup); + Menu->addAction(Action); + + Menu->exec(QCursor::pos()); + + return Popup->GetPickedTrainTrack(); +} + lcColorDialogPopup::lcColorDialogPopup(const QColor& InitialColor, QWidget* Parent) : QWidget(Parent) { diff --git a/qt/lc_qutils.h b/qt/lc_qutils.h index 06911a44..b163c810 100644 --- a/qt/lc_qutils.h +++ b/qt/lc_qutils.h @@ -3,6 +3,8 @@ #include class lcPartSelectionWidget; +class lcPartSelectionListView; +class lcTrainTrackInfo; QString lcFormatValue(float Value, int Precision); QString lcFormatValueLocalized(float Value); @@ -190,6 +192,32 @@ protected: PieceInfo* mInitialPart = nullptr; }; +class lcTrainTrackPickerPopup : public QWidget +{ + Q_OBJECT + +public: + lcTrainTrackPickerPopup(QWidget* Parent, const lcTrainTrackInfo* TrainTrackInfo); + + PieceInfo* GetPickedTrainTrack() const + { + return mPickedTrainTrack; + } + +protected slots: + void Accept(); + void Reject(); + +protected: + void showEvent(QShowEvent* ShowEvent) override; + void Close(); + + lcPartSelectionListView* mPartSelectionListView = nullptr; + PieceInfo* mPickedTrainTrack = nullptr; +}; + +PieceInfo* lcShowTrainTrackPopup(QWidget* Parent, const lcTrainTrackInfo* TrainTrackInfo); + class lcColorDialogPopup : public QWidget { Q_OBJECT