From 45a92eda8922e933999f95d6aad54f1007a5f20f Mon Sep 17 00:00:00 2001 From: Jaye Evins Date: Mon, 5 Jan 2026 14:09:00 -0500 Subject: [PATCH] Base TemplatePicker on QListView instead of QListWidget (#276) --- glabels/File.cpp | 2 +- glabels/TemplatePicker.cpp | 81 ++++++++++++++++++------------- glabels/TemplatePicker.h | 33 ++++++++++--- glabels/TemplatePickerItem.cpp | 9 ++-- glabels/TemplatePickerItem.h | 8 +-- glabels/ui/SelectProductDialog.ui | 41 +++++++++++----- 6 files changed, 110 insertions(+), 64 deletions(-) diff --git a/glabels/File.cpp b/glabels/File.cpp index 3ebe3f9..b213eaf 100644 --- a/glabels/File.cpp +++ b/glabels/File.cpp @@ -49,7 +49,7 @@ namespace glabels /// bool File::newLabel( MainWindow *window ) { - SelectProductDialog dialog; + SelectProductDialog dialog( window ); dialog.exec(); auto tmplate = dialog.tmplate(); diff --git a/glabels/TemplatePicker.cpp b/glabels/TemplatePicker.cpp index 4fa3791..b723e82 100644 --- a/glabels/TemplatePicker.cpp +++ b/glabels/TemplatePicker.cpp @@ -21,6 +21,7 @@ #include "TemplatePicker.h" +#include "MiniPreviewPixmap.h" #include "TemplatePickerItem.h" #include "model/Settings.h" @@ -98,14 +99,22 @@ namespace glabels /// /// Constructor /// - TemplatePicker::TemplatePicker( QWidget* parent ) : QListWidget(parent) + TemplatePicker::TemplatePicker( QWidget* parent ) + : QListView(parent) { + mModel = new QStandardItemModel( this ); + setModel( mModel ); + setResizeMode( QListView::Adjust ); setUniformItemSizes( true ); setWordWrap( true ); setIconSize( QSize( TemplatePickerItem::SIZE, TemplatePickerItem::SIZE ) ); + setSpacing( 24 ); setMode( model::Settings::templatePickerMode() ); + + connect( selectionModel(), SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), + this, SLOT(onSelectionChanged()) ); } @@ -115,10 +124,9 @@ namespace glabels void TemplatePicker::setTemplates( const QList& tmplates ) { auto mode = model::Settings::templatePickerMode(); - - foreach (auto& tmplate, tmplates) + for ( auto& tmplate : tmplates ) { - new TemplatePickerItem( tmplate, mode, this ); + mModel->appendRow( new TemplatePickerItem( tmplate, mode ) ); } } @@ -129,10 +137,11 @@ namespace glabels void TemplatePicker::setMode( QListView::ViewMode mode ) { model::Settings::setTemplatePickerMode( mode ); - - for ( int i = 0; i < count(); i++ ) + setViewMode( mode ); + + for ( int i = 0; i < mModel->rowCount(); i++ ) { - if (auto* tItem = dynamic_cast(item(i))) + if ( auto* tItem = dynamic_cast( mModel->item( i, 0 ) ) ) { tItem->setMode( mode ); } @@ -159,9 +168,10 @@ namespace glabels } - if ( auto* selected = selectedItem() ) + auto selection = selectedIndexes(); + if ( selection.size() ) { - scrollToItem( selected, QAbstractItemView::PositionAtCenter ); + scrollTo( selection[0], QAbstractItemView::PositionAtCenter ); } } @@ -182,9 +192,9 @@ namespace glabels bool isoMask, bool usMask, bool otherMask, bool anyCategory, const QStringList& categoryIds ) { - for ( int i = 0; i < count(); i++ ) + for ( int i = 0; i < mModel->rowCount(); i++ ) { - if (auto* tItem = dynamic_cast(item(i))) + if ( auto* tItem = dynamic_cast( mModel->item( i, 0 ) ) ) { bool nameMask = tItem->tmplate().name().contains( searchString, Qt::CaseInsensitive ); @@ -210,19 +220,20 @@ namespace glabels if ( nameMask && sizeMask && categoryMask ) { - tItem->setHidden( false ); + setRowHidden( i, false ); } else { - tItem->setHidden( true ); - tItem->setSelected( false ); + setRowHidden( i, true ); + selectionModel()->select( tItem->index(), QItemSelectionModel::Deselect ); } } } - if ( auto* selected = selectedItem() ) + auto selection = selectedIndexes(); + if ( selection.size() ) { - scrollToItem( selected, QAbstractItemView::PositionAtCenter ); + scrollTo( selection[0], QAbstractItemView::PositionAtCenter ); } } @@ -232,9 +243,9 @@ namespace glabels /// void TemplatePicker::applyFilter( const QStringList& names ) { - for ( int i = 0; i < count(); i++ ) + for ( int i = 0; i < mModel->rowCount(); i++ ) { - if (auto *tItem = dynamic_cast(item(i))) + if ( auto* tItem = dynamic_cast( mModel->item( i, 0 ) ) ) { bool match = false; foreach ( QString name, names ) @@ -248,19 +259,20 @@ namespace glabels if ( match ) { - tItem->setHidden( false ); + setRowHidden( i, false ); } else { - tItem->setHidden( true ); - tItem->setSelected( false ); + setRowHidden( i, true ); + selectionModel()->select( tItem->index(), QItemSelectionModel::Deselect ); } } } - if ( auto* selected = selectedItem() ) + auto selection = selectedIndexes(); + if ( selection.size() ) { - scrollToItem( selected, QAbstractItemView::PositionAtCenter ); + scrollTo( selection[0], QAbstractItemView::PositionAtCenter ); } } @@ -270,27 +282,26 @@ namespace glabels /// model::Template TemplatePicker::selectedTemplate() const { - if ( auto* tItem = selectedItem() ) + auto selectionList = selectedIndexes(); + if ( selectionList.size() ) { - return tItem->tmplate(); + int i = selectionList[0].row(); + if ( auto* tItem = dynamic_cast( mModel->item( i, 0 ) ) ) + { + return tItem->tmplate(); + } } - + return model::Template(); } /// - /// Get Currently Selected Item + /// Handle selection changed from selection model /// - TemplatePickerItem* TemplatePicker::selectedItem() const + void TemplatePicker::onSelectionChanged() { - QList items = selectedItems(); - if ( !items.isEmpty() ) - { - return dynamic_cast( items.first() ); - } - - return nullptr; + emit selectionChanged(); } diff --git a/glabels/TemplatePicker.h b/glabels/TemplatePicker.h index cebf02d..4d15200 100644 --- a/glabels/TemplatePicker.h +++ b/glabels/TemplatePicker.h @@ -22,12 +22,11 @@ #define TemplatePicker_h -#include "TemplatePickerItem.h" - #include "model/Template.h" #include -#include +#include +#include namespace glabels @@ -36,7 +35,7 @@ namespace glabels /// /// Template Picker Widget /// - class TemplatePicker : public QListWidget + class TemplatePicker : public QListView { Q_OBJECT @@ -60,15 +59,35 @@ namespace glabels ///////////////////////////////// // Methods ///////////////////////////////// + public: void applyFilter( const QString& searchString, bool isoMask, bool usMask, bool otherMask, bool anyCategory, const QStringList& categoryIds ); void applyFilter( const QStringList& names ); - model::Template selectedTemplate() const; - TemplatePickerItem* selectedItem() const; - + model::Template selectedTemplate() const; + + + ///////////////////////////////// + // Signals + ///////////////////////////////// + signals: + void selectionChanged(); + + + ///////////////////////////////// + // Private slots + ///////////////////////////////// + private slots: + void onSelectionChanged(); + + + ///////////////////////////////// + // Private data + ///////////////////////////////// + private: + QStandardItemModel* mModel; }; diff --git a/glabels/TemplatePickerItem.cpp b/glabels/TemplatePickerItem.cpp index 59de53e..c7554ba 100644 --- a/glabels/TemplatePickerItem.cpp +++ b/glabels/TemplatePickerItem.cpp @@ -25,9 +25,8 @@ #include "model/Settings.h" -#include +#include #include -#include namespace glabels @@ -37,9 +36,8 @@ namespace glabels /// Constructor /// TemplatePickerItem::TemplatePickerItem( const model::Template& tmplate, - QListView::ViewMode mode, - QListWidget* parent ) - : QListWidgetItem( parent ) + QListView::ViewMode mode ) + : QStandardItem() { mTmplate = tmplate; @@ -87,4 +85,5 @@ namespace glabels return mTmplate; } + } // namespace glabels diff --git a/glabels/TemplatePickerItem.h b/glabels/TemplatePickerItem.h index d43df26..f5ed6ec 100644 --- a/glabels/TemplatePickerItem.h +++ b/glabels/TemplatePickerItem.h @@ -25,7 +25,8 @@ #include "model/Template.h" #include -#include +#include +#include namespace glabels @@ -34,7 +35,7 @@ namespace glabels /// /// Template Picker Item Widget /// - class TemplatePickerItem : public QListWidgetItem + class TemplatePickerItem : public QStandardItem { public: static const int SIZE = 80; @@ -45,8 +46,7 @@ namespace glabels ///////////////////////////////// public: TemplatePickerItem( const model::Template& tmplate, - QListView::ViewMode mode, - QListWidget* parent = nullptr ); + QListView::ViewMode mode ); ///////////////////////////////// diff --git a/glabels/ui/SelectProductDialog.ui b/glabels/ui/SelectProductDialog.ui index 4bab450..75824ad 100644 --- a/glabels/ui/SelectProductDialog.ui +++ b/glabels/ui/SelectProductDialog.ui @@ -478,7 +478,8 @@ - + + .. @@ -548,8 +549,8 @@ onPageSizeCheckClicked() - 130 - 196 + 156 + 246 4 @@ -559,7 +560,7 @@ templatePicker - itemSelectionChanged() + selectionChanged() SelectProductDialog onTemplatePickerSelectionChanged() @@ -580,8 +581,8 @@ onPageSizeCheckClicked() - 132 - 170 + 158 + 215 2 @@ -612,8 +613,8 @@ onSearchEntryTextChanged() - 107 - 102 + 121 + 137 2 @@ -628,8 +629,8 @@ onCategoryRadioClicked() - 126 - 296 + 151 + 361 0 @@ -644,8 +645,8 @@ onCategoryRadioClicked() - 122 - 322 + 147 + 392 1 @@ -701,6 +702,22 @@ + + pageSizeOtherCheck + clicked() + SelectProductDialog + onPageSizeCheckClicked() + + + 90 + 265 + + + 6 + 290 + + + onSearchClearButtonClicked()