Use the part picker widget on the replace widget.

This commit is contained in:
Leonardo Zide
2026-02-16 15:19:56 -08:00
parent 069ed47ee9
commit 3ddeb8cfbd
4 changed files with 64 additions and 22 deletions
+30 -15
View File
@@ -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<void (QComboBox::*)(int)>(&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<void*>();
std::optional<PieceInfo*> Result = lcShowPartSelectionPopup(Params.ReplacePieceInfo, std::vector<std::pair<PieceInfo*, std::string>>(),
gDefaultColor, mReplacePartButton, mReplacePartButton->mapToGlobal(mReplacePartButton->rect().bottomLeft()));
if (!Result.has_value())
return;
Params.ReplacePieceInfo = Result.value();
mReplacePartButton->setText(Result.value()->m_strDescription);
}
+4 -2
View File
@@ -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;
};
+11 -4
View File
@@ -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()
+19 -1
View File
@@ -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<lcPartCategoryType>(Item->data(0, static_cast<int>(lcPartCategoryRole::Type)).toInt());
if (ItemType != Type)
continue;
if (Type == lcPartCategoryType::Palette || Type == lcPartCategoryType::Category)
{
int ItemIndex = Item->data(0, static_cast<int>(lcPartCategoryRole::Index)).toInt();
if (ItemIndex != Index)
continue;
}
mCategoriesWidget->setCurrentItem(Item);
break;
}
}
void lcPartSelectionWidget::SetCustomParts(const std::vector<std::pair<PieceInfo*, std::string>>& Parts, int ColorIndex)