From 3ddeb8cfbd3393241983d87b7f6efd46282aaff9 Mon Sep 17 00:00:00 2001 From: Leonardo Zide Date: Mon, 16 Feb 2026 15:19:56 -0800 Subject: [PATCH] Use the part picker widget on the replace widget. --- common/lc_findreplacewidget.cpp | 45 ++++++++++++++++++++----------- common/lc_findreplacewidget.h | 6 +++-- common/lc_model.cpp | 15 ++++++++--- common/lc_partselectionwidget.cpp | 20 +++++++++++++- 4 files changed, 64 insertions(+), 22 deletions(-) diff --git a/common/lc_findreplacewidget.cpp b/common/lc_findreplacewidget.cpp index 8e4cefc6..a260fcf8 100644 --- a/common/lc_findreplacewidget.cpp +++ b/common/lc_findreplacewidget.cpp @@ -2,6 +2,7 @@ #include "lc_findreplacewidget.h" #include "lc_colorpicker.h" #include "lc_mainwindow.h" +#include "lc_partselectionpopup.h" #include "pieceinf.h" #include "piece.h" #include "lc_model.h" @@ -37,8 +38,8 @@ lcFindReplaceWidget::lcFindReplaceWidget(QWidget* Parent, lcModel* Model, bool R Layout->addWidget(FindNextButton, 0, 3); QToolButton* FindAllButton = new QToolButton(this); - FindAllButton ->setAutoRaise(true); - FindAllButton ->setDefaultAction(gMainWindow->mActions[LC_EDIT_FIND_ALL]); + FindAllButton->setAutoRaise(true); + FindAllButton->setDefaultAction(gMainWindow->mActions[LC_EDIT_FIND_ALL]); Layout->addWidget(FindAllButton, 0, 4); connect(FindColorPicker, &lcColorPicker::ColorChanged, this, &lcFindReplaceWidget::FindColorIndexChanged); @@ -55,10 +56,22 @@ lcFindReplaceWidget::lcFindReplaceWidget(QWidget* Parent, lcModel* Model, bool R ReplaceColorPicker = new lcColorPicker(this, true); ReplaceColorPicker->setToolTip(tr("Replacement Color")); Layout->addWidget(ReplaceColorPicker, 1, 1); - - mReplacePartComboBox = new QComboBox(this); - mReplacePartComboBox->setToolTip(tr("Replacement Part")); - Layout->addWidget(mReplacePartComboBox, 1, 2); + + QPixmap Pixmap(1, 1); + Pixmap.fill(QColor::fromRgba64(0, 0, 0, 0)); + + mReplacePartButton = new lcElidableToolButton(this); + mReplacePartButton->setToolTip(tr("Replacement Part")); + + QSizePolicy PieceButtonSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + PieceButtonSizePolicy.setHorizontalStretch(2); + PieceButtonSizePolicy.setVerticalStretch(0); + mReplacePartButton->setSizePolicy(PieceButtonSizePolicy); + + mReplacePartButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + mReplacePartButton->setIcon(Pixmap); + + Layout->addWidget(mReplacePartButton, 1, 2); QToolButton* ReplaceNextButton = new QToolButton(this); ReplaceNextButton->setAutoRaise(true); @@ -71,15 +84,10 @@ lcFindReplaceWidget::lcFindReplaceWidget(QWidget* Parent, lcModel* Model, bool R Layout->addWidget(ReplaceAllButton, 1, 4); connect(ReplaceColorPicker, &lcColorPicker::ColorChanged, this, &lcFindReplaceWidget::ReplaceColorIndexChanged); - connect(mReplacePartComboBox, static_cast(&QComboBox::activated), this, &lcFindReplaceWidget::ReplaceActivated); - - mReplacePartComboBox->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLengthWithIcon); - mReplacePartComboBox->setMinimumContentsLength(1); - - mReplacePartComboBox->setModel(new lcPieceIdStringModel(gMainWindow->GetActiveModel(), mReplacePartComboBox)); + connect(mReplacePartButton, &lcElidableToolButton::clicked, this, &lcFindReplaceWidget::ReplaceButtonClicked); ReplaceColorPicker->SetCurrentColor(lcGetColorIndex(LC_COLOR_NOCOLOR)); - mReplacePartComboBox->setCurrentIndex(0); + mReplacePartButton->setText(tr("None")); } QToolButton* CloseButton = new QToolButton(this); @@ -152,9 +160,16 @@ void lcFindReplaceWidget::ReplaceColorIndexChanged(int ColorIndex) Params.ReplaceColorIndex = ColorIndex; } -void lcFindReplaceWidget::ReplaceActivated(int Index) +void lcFindReplaceWidget::ReplaceButtonClicked() { lcFindReplaceParams& Params = lcView::GetFindReplaceParams(); - Params.ReplacePieceInfo = (PieceInfo*)mReplacePartComboBox->itemData(Index).value(); + std::optional Result = lcShowPartSelectionPopup(Params.ReplacePieceInfo, std::vector>(), + gDefaultColor, mReplacePartButton, mReplacePartButton->mapToGlobal(mReplacePartButton->rect().bottomLeft())); + + if (!Result.has_value()) + return; + + Params.ReplacePieceInfo = Result.value(); + mReplacePartButton->setText(Result.value()->m_strDescription); } diff --git a/common/lc_findreplacewidget.h b/common/lc_findreplacewidget.h index 19b5bdd9..20be54bd 100644 --- a/common/lc_findreplacewidget.h +++ b/common/lc_findreplacewidget.h @@ -1,5 +1,7 @@ #pragma once +class lcElidableToolButton; + class lcFindReplaceWidget : public QWidget { Q_OBJECT @@ -12,9 +14,9 @@ protected slots: void FindTextEdited(const QString& Text); void FindActivated(int Index); void ReplaceColorIndexChanged(int ColorIndex); - void ReplaceActivated(int Index); + void ReplaceButtonClicked(); protected: QComboBox* mFindPartComboBox = nullptr; - QComboBox* mReplacePartComboBox = nullptr; + lcElidableToolButton* mReplacePartButton = nullptr; }; diff --git a/common/lc_model.cpp b/common/lc_model.cpp index 6e1eb532..52a5ada6 100644 --- a/common/lc_model.cpp +++ b/common/lc_model.cpp @@ -4667,7 +4667,10 @@ void lcModel::FindReplacePiece(bool SearchForward, bool FindAll, bool Replace) size_t StartIndex = mPieces.size() - 1; int ReplacedCount = 0; - + + BeginActionSequence(); + BeginObjectEditAction(); + if (!FindAll) { // We have to find the currently focused piece, in order to find next/prev match and (optionally) to replace it @@ -4736,7 +4739,9 @@ void lcModel::FindReplacePiece(bool SearchForward, bool FindAll, bool Replace) if (CurrentIndex == StartIndex) break; } - + + EndObjectEditAction(); + if (FindAll) RecordSetSelectionAndFocusAction(Selection, nullptr, 0, lcSelectionMode::Single); else @@ -4744,11 +4749,13 @@ void lcModel::FindReplacePiece(bool SearchForward, bool FindAll, bool Replace) if (ReplacedCount) { - SaveCheckpoint(tr("Replacing Piece(s)", "", ReplacedCount)); + EndActionSequence(tr("Replace Piece(s)", "", ReplacedCount)); + gMainWindow->UpdateSelectedObjects(false); - UpdateAllViews(); gMainWindow->UpdateTimeline(false, true); } + else + EndActionSequence(tr("Selection")); } void lcModel::UndoAction() diff --git a/common/lc_partselectionwidget.cpp b/common/lc_partselectionwidget.cpp index cecb3d09..267094a5 100644 --- a/common/lc_partselectionwidget.cpp +++ b/common/lc_partselectionwidget.cpp @@ -986,7 +986,25 @@ void lcPartSelectionWidget::SetCurrentPart(PieceInfo* Info) void lcPartSelectionWidget::SetCategory(lcPartCategoryType Type, int Index) { - mPartsWidget->SetCategory(Type, Index); + for (int Row = 0; Row < mCategoriesWidget->topLevelItemCount(); Row++) + { + QTreeWidgetItem* Item = mCategoriesWidget->topLevelItem(Row); + lcPartCategoryType ItemType = static_cast(Item->data(0, static_cast(lcPartCategoryRole::Type)).toInt()); + + if (ItemType != Type) + continue; + + if (Type == lcPartCategoryType::Palette || Type == lcPartCategoryType::Category) + { + int ItemIndex = Item->data(0, static_cast(lcPartCategoryRole::Index)).toInt(); + + if (ItemIndex != Index) + continue; + } + + mCategoriesWidget->setCurrentItem(Item); + break; + } } void lcPartSelectionWidget::SetCustomParts(const std::vector>& Parts, int ColorIndex)