Updated minifig dialog widgets to match the property widget.

This commit is contained in:
Leonardo Zide
2025-06-30 19:23:51 -07:00
parent b1e2465e35
commit e4a38cb23b
10 changed files with 304 additions and 820 deletions
+69 -19
View File
@@ -5,6 +5,7 @@
#include "lc_model.h"
#include "pieceinf.h"
#include "lc_partselectionwidget.h"
#include "lc_mainwindow.h"
QString lcFormatValue(float Value, int Precision)
{
@@ -183,7 +184,7 @@ lcPieceIdPickerPopup::lcPieceIdPickerPopup(PieceInfo* Current, QWidget* Parent)
connect(mPartSelectionWidget, &lcPartSelectionWidget::PartPicked, this, &lcPieceIdPickerPopup::PartPicked);
QDialogButtonBox* ButtonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel, this);
QDialogButtonBox* ButtonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this);
Layout->addWidget(ButtonBox);
QObject::connect(ButtonBox, &QDialogButtonBox::accepted, this, &lcPieceIdPickerPopup::Accept);
@@ -229,50 +230,59 @@ void lcPieceIdPickerPopup::Close()
Menu->close();
}
lcTrainTrackPickerPopup::lcTrainTrackPickerPopup(QWidget* Parent, const lcTrainTrackConnectionType& ConnectionType)
: QWidget(Parent)
lcPieceListPickerPopup::lcPieceListPickerPopup(QWidget* Parent, PieceInfo* InitialPart, const std::vector<std::pair<PieceInfo*, std::string>>& Parts, int ColorIndex, bool Sort, bool ShowFilter)
: QWidget(Parent), mInitialPart(InitialPart)
{
QVBoxLayout* Layout = new QVBoxLayout(this);
if (ShowFilter)
{
mFilterWidget = new QLineEdit(this);
mFilterWidget->setPlaceholderText(tr("Filter Parts"));
Layout->addWidget(mFilterWidget);
connect(mFilterWidget, &QLineEdit::textChanged, this, &lcPieceListPickerPopup::FilterChanged);
}
mPartSelectionListView = new lcPartSelectionListView(this, nullptr);
Layout->addWidget(mPartSelectionListView);
mPartSelectionListView->setMinimumWidth(450);
mPartSelectionListView->setDragEnabled(false);
std::vector<PieceInfo*> Parts = lcGetPiecesLibrary()->GetVisibleTrainTrackParts(ConnectionType);
mPartSelectionListView->SetCustomParts(Parts, ColorIndex, Sort);
mPartSelectionListView->SetCustomParts(Parts);
connect(mPartSelectionListView, &lcPartSelectionListView::PartPicked, this, &lcPieceListPickerPopup::Accept);
connect(mPartSelectionListView, &lcPartSelectionListView::PartPicked, this, &lcTrainTrackPickerPopup::Accept);
QDialogButtonBox* ButtonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel, this);
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);
QObject::connect(ButtonBox, &QDialogButtonBox::accepted, this, &lcPieceListPickerPopup::Accept);
QObject::connect(ButtonBox, &QDialogButtonBox::rejected, this, &lcPieceListPickerPopup::Reject);
}
void lcTrainTrackPickerPopup::showEvent(QShowEvent* ShowEvent)
void lcPieceListPickerPopup::showEvent(QShowEvent* ShowEvent)
{
QWidget::showEvent(ShowEvent);
mPartSelectionListView->SetCurrentPart(mInitialPart);
mPartSelectionListView->setFocus();
}
void lcTrainTrackPickerPopup::Accept()
void lcPieceListPickerPopup::Accept()
{
mPickedTrainTrack = mPartSelectionListView->GetCurrentPart();
mPickedPiece = mPartSelectionListView->GetCurrentPart();
mAccepted = true;
Close();
}
void lcTrainTrackPickerPopup::Reject()
void lcPieceListPickerPopup::Reject()
{
Close();
}
void lcTrainTrackPickerPopup::Close()
void lcPieceListPickerPopup::Close()
{
QMenu* Menu = qobject_cast<QMenu*>(parent());
@@ -280,18 +290,58 @@ void lcTrainTrackPickerPopup::Close()
Menu->close();
}
PieceInfo* lcShowTrainTrackPopup(QWidget* Parent, const lcTrainTrackConnectionType& ConnectionType)
void lcPieceListPickerPopup::FilterChanged(const QString& Text)
{
if (mFilterAction)
{
if (Text.isEmpty())
{
delete mFilterAction;
mFilterAction = nullptr;
}
}
else
{
if (!Text.isEmpty())
{
mFilterAction = mFilterWidget->addAction(QIcon(":/stylesheet/close.svg"), QLineEdit::TrailingPosition);
connect(mFilterAction, &QAction::triggered, this, &lcPieceListPickerPopup::FilterTriggered);
}
}
mPartSelectionListView->GetListModel()->SetFilter(Text);
}
void lcPieceListPickerPopup::FilterTriggered()
{
mFilterWidget->clear();
}
std::optional<PieceInfo*> lcShowPieceListPopup(QWidget* Parent, PieceInfo* InitialPart, const std::vector<std::pair<PieceInfo*, std::string>>& Parts, int ColorIndex, bool Sort, bool ShowFilter, QPoint Position)
{
std::unique_ptr<QMenu> Menu(new QMenu(Parent));
QWidgetAction* Action = new QWidgetAction(Menu.get());
lcTrainTrackPickerPopup* Popup = new lcTrainTrackPickerPopup(Menu.get(), ConnectionType);
lcPieceListPickerPopup* Popup = new lcPieceListPickerPopup(Menu.get(), InitialPart, Parts, ColorIndex, Sort, ShowFilter);
Action->setDefaultWidget(Popup);
Menu->addAction(Action);
Menu->exec(QCursor::pos());
Menu->exec(Position);
return Popup->GetPickedTrainTrack();
return Popup->GetPickedPiece();
}
std::optional<PieceInfo*> lcShowTrainTrackPopup(QWidget* Parent, const lcTrainTrackConnectionType& ConnectionType)
{
std::vector<PieceInfo*> TrainTrackParts = lcGetPiecesLibrary()->GetVisibleTrainTrackParts(ConnectionType);
std::vector<std::pair<PieceInfo*, std::string>> Parts;
Parts.reserve(TrainTrackParts.size());
for (PieceInfo* Info : TrainTrackParts)
Parts.emplace_back(Info, std::string());
return lcShowPieceListPopup(Parent, nullptr, Parts, gMainWindow->mColorIndex, true, false, QCursor::pos());
}
lcColorDialogPopup::lcColorDialogPopup(const QColor& InitialColor, QWidget* Parent)
+14 -6
View File
@@ -192,31 +192,39 @@ protected:
PieceInfo* mInitialPart = nullptr;
};
class lcTrainTrackPickerPopup : public QWidget
class lcPieceListPickerPopup : public QWidget
{
Q_OBJECT
public:
lcTrainTrackPickerPopup(QWidget* Parent, const lcTrainTrackConnectionType& ConnectionType);
lcPieceListPickerPopup(QWidget* Parent, PieceInfo* InitialPart, const std::vector<std::pair<PieceInfo*, std::string>>& Parts, int ColorIndex, bool Sort, bool ShowFilter);
virtual ~lcPieceListPickerPopup() = default;
PieceInfo* GetPickedTrainTrack() const
std::optional<PieceInfo*> GetPickedPiece() const
{
return mPickedTrainTrack;
return mAccepted ? std::optional<PieceInfo*>(mPickedPiece) : std::nullopt;
}
protected slots:
void Accept();
void Reject();
void FilterChanged(const QString& Text);
void FilterTriggered();
protected:
void showEvent(QShowEvent* ShowEvent) override;
void Close();
lcPartSelectionListView* mPartSelectionListView = nullptr;
PieceInfo* mPickedTrainTrack = nullptr;
QLineEdit* mFilterWidget = nullptr;
QAction* mFilterAction = nullptr;
PieceInfo* mInitialPart = nullptr;
PieceInfo* mPickedPiece = nullptr;
bool mAccepted = false;
};
PieceInfo* lcShowTrainTrackPopup(QWidget* Parent, const lcTrainTrackConnectionType& ConnectionType);
std::optional<PieceInfo*> lcShowPieceListPopup(QWidget* Parent, PieceInfo* InitialPart, const std::vector<std::pair<PieceInfo*, std::string>>& Parts, int ColorIndex, bool Sort, bool ShowFilter, QPoint Position);
std::optional<PieceInfo*> lcShowTrainTrackPopup(QWidget* Parent, const lcTrainTrackConnectionType& ConnectionType);
class lcColorDialogPopup : public QWidget
{