Base TemplatePicker on QListView instead of QListWidget (#276)

This commit is contained in:
Jaye Evins
2026-01-05 14:09:00 -05:00
committed by GitHub
parent 742b80fc47
commit 45a92eda89
6 changed files with 110 additions and 64 deletions
+1 -1
View File
@@ -49,7 +49,7 @@ namespace glabels
/// ///
bool File::newLabel( MainWindow *window ) bool File::newLabel( MainWindow *window )
{ {
SelectProductDialog dialog; SelectProductDialog dialog( window );
dialog.exec(); dialog.exec();
auto tmplate = dialog.tmplate(); auto tmplate = dialog.tmplate();
+44 -33
View File
@@ -21,6 +21,7 @@
#include "TemplatePicker.h" #include "TemplatePicker.h"
#include "MiniPreviewPixmap.h"
#include "TemplatePickerItem.h" #include "TemplatePickerItem.h"
#include "model/Settings.h" #include "model/Settings.h"
@@ -98,14 +99,22 @@ namespace glabels
/// ///
/// Constructor /// Constructor
/// ///
TemplatePicker::TemplatePicker( QWidget* parent ) : QListWidget(parent) TemplatePicker::TemplatePicker( QWidget* parent )
: QListView(parent)
{ {
mModel = new QStandardItemModel( this );
setModel( mModel );
setResizeMode( QListView::Adjust ); setResizeMode( QListView::Adjust );
setUniformItemSizes( true ); setUniformItemSizes( true );
setWordWrap( true ); setWordWrap( true );
setIconSize( QSize( TemplatePickerItem::SIZE, TemplatePickerItem::SIZE ) ); setIconSize( QSize( TemplatePickerItem::SIZE, TemplatePickerItem::SIZE ) );
setSpacing( 24 );
setMode( model::Settings::templatePickerMode() ); 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<model::Template>& tmplates ) void TemplatePicker::setTemplates( const QList<model::Template>& tmplates )
{ {
auto mode = model::Settings::templatePickerMode(); auto mode = model::Settings::templatePickerMode();
for ( auto& tmplate : tmplates )
foreach (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 ) void TemplatePicker::setMode( QListView::ViewMode mode )
{ {
model::Settings::setTemplatePickerMode( mode ); model::Settings::setTemplatePickerMode( mode );
setViewMode( mode );
for ( int i = 0; i < count(); i++ ) for ( int i = 0; i < mModel->rowCount(); i++ )
{ {
if (auto* tItem = dynamic_cast<TemplatePickerItem *>(item(i))) if ( auto* tItem = dynamic_cast<TemplatePickerItem *>( mModel->item( i, 0 ) ) )
{ {
tItem->setMode( mode ); 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 isoMask, bool usMask, bool otherMask,
bool anyCategory, const QStringList& categoryIds ) 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<TemplatePickerItem *>(item(i))) if ( auto* tItem = dynamic_cast<TemplatePickerItem *>( mModel->item( i, 0 ) ) )
{ {
bool nameMask = tItem->tmplate().name().contains( searchString, Qt::CaseInsensitive ); bool nameMask = tItem->tmplate().name().contains( searchString, Qt::CaseInsensitive );
@@ -210,19 +220,20 @@ namespace glabels
if ( nameMask && sizeMask && categoryMask ) if ( nameMask && sizeMask && categoryMask )
{ {
tItem->setHidden( false ); setRowHidden( i, false );
} }
else else
{ {
tItem->setHidden( true ); setRowHidden( i, true );
tItem->setSelected( false ); 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 ) 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<TemplatePickerItem *>(item(i))) if ( auto* tItem = dynamic_cast<TemplatePickerItem *>( mModel->item( i, 0 ) ) )
{ {
bool match = false; bool match = false;
foreach ( QString name, names ) foreach ( QString name, names )
@@ -248,19 +259,20 @@ namespace glabels
if ( match ) if ( match )
{ {
tItem->setHidden( false ); setRowHidden( i, false );
} }
else else
{ {
tItem->setHidden( true ); setRowHidden( i, true );
tItem->setSelected( false ); 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,9 +282,14 @@ namespace glabels
/// ///
model::Template TemplatePicker::selectedTemplate() const 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<TemplatePickerItem *>( mModel->item( i, 0 ) ) )
{
return tItem->tmplate();
}
} }
return model::Template(); return model::Template();
@@ -280,17 +297,11 @@ namespace glabels
/// ///
/// Get Currently Selected Item /// Handle selection changed from selection model
/// ///
TemplatePickerItem* TemplatePicker::selectedItem() const void TemplatePicker::onSelectionChanged()
{ {
QList<QListWidgetItem*> items = selectedItems(); emit selectionChanged();
if ( !items.isEmpty() )
{
return dynamic_cast<TemplatePickerItem*>( items.first() );
}
return nullptr;
} }
+25 -6
View File
@@ -22,12 +22,11 @@
#define TemplatePicker_h #define TemplatePicker_h
#include "TemplatePickerItem.h"
#include "model/Template.h" #include "model/Template.h"
#include <QList> #include <QList>
#include <QListWidget> #include <QListView>
#include <QStandardItemModel>
namespace glabels namespace glabels
@@ -36,7 +35,7 @@ namespace glabels
/// ///
/// Template Picker Widget /// Template Picker Widget
/// ///
class TemplatePicker : public QListWidget class TemplatePicker : public QListView
{ {
Q_OBJECT Q_OBJECT
@@ -60,16 +59,36 @@ namespace glabels
///////////////////////////////// /////////////////////////////////
// Methods // Methods
///////////////////////////////// /////////////////////////////////
public:
void applyFilter( const QString& searchString, void applyFilter( const QString& searchString,
bool isoMask, bool usMask, bool otherMask, bool isoMask, bool usMask, bool otherMask,
bool anyCategory, const QStringList& categoryIds ); bool anyCategory, const QStringList& categoryIds );
void applyFilter( const QStringList& names ); void applyFilter( const QStringList& names );
model::Template selectedTemplate() const; model::Template selectedTemplate() const;
TemplatePickerItem* selectedItem() const;
/////////////////////////////////
// Signals
/////////////////////////////////
signals:
void selectionChanged();
/////////////////////////////////
// Private slots
/////////////////////////////////
private slots:
void onSelectionChanged();
/////////////////////////////////
// Private data
/////////////////////////////////
private:
QStandardItemModel* mModel;
}; };
} }
+4 -5
View File
@@ -25,9 +25,8 @@
#include "model/Settings.h" #include "model/Settings.h"
#include <QHBoxLayout> #include <QDebug>
#include <QIcon> #include <QIcon>
#include <QListWidgetItem>
namespace glabels namespace glabels
@@ -37,9 +36,8 @@ namespace glabels
/// Constructor /// Constructor
/// ///
TemplatePickerItem::TemplatePickerItem( const model::Template& tmplate, TemplatePickerItem::TemplatePickerItem( const model::Template& tmplate,
QListView::ViewMode mode, QListView::ViewMode mode )
QListWidget* parent ) : QStandardItem()
: QListWidgetItem( parent )
{ {
mTmplate = tmplate; mTmplate = tmplate;
@@ -87,4 +85,5 @@ namespace glabels
return mTmplate; return mTmplate;
} }
} // namespace glabels } // namespace glabels
+4 -4
View File
@@ -25,7 +25,8 @@
#include "model/Template.h" #include "model/Template.h"
#include <QLabel> #include <QLabel>
#include <QListWidget> #include <QListView>
#include <QStandardItem>
namespace glabels namespace glabels
@@ -34,7 +35,7 @@ namespace glabels
/// ///
/// Template Picker Item Widget /// Template Picker Item Widget
/// ///
class TemplatePickerItem : public QListWidgetItem class TemplatePickerItem : public QStandardItem
{ {
public: public:
static const int SIZE = 80; static const int SIZE = 80;
@@ -45,8 +46,7 @@ namespace glabels
///////////////////////////////// /////////////////////////////////
public: public:
TemplatePickerItem( const model::Template& tmplate, TemplatePickerItem( const model::Template& tmplate,
QListView::ViewMode mode, QListView::ViewMode mode );
QListWidget* parent = nullptr );
///////////////////////////////// /////////////////////////////////
+29 -12
View File
@@ -478,7 +478,8 @@
<string/> <string/>
</property> </property>
<property name="icon"> <property name="icon">
<iconset theme="glabels-view-grid"/> <iconset theme="glabels-view-grid">
<normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="iconSize"> <property name="iconSize">
<size> <size>
@@ -548,8 +549,8 @@
<slot>onPageSizeCheckClicked()</slot> <slot>onPageSizeCheckClicked()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>130</x> <x>156</x>
<y>196</y> <y>246</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>4</x> <x>4</x>
@@ -559,7 +560,7 @@
</connection> </connection>
<connection> <connection>
<sender>templatePicker</sender> <sender>templatePicker</sender>
<signal>itemSelectionChanged()</signal> <signal>selectionChanged()</signal>
<receiver>SelectProductDialog</receiver> <receiver>SelectProductDialog</receiver>
<slot>onTemplatePickerSelectionChanged()</slot> <slot>onTemplatePickerSelectionChanged()</slot>
<hints> <hints>
@@ -580,8 +581,8 @@
<slot>onPageSizeCheckClicked()</slot> <slot>onPageSizeCheckClicked()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>132</x> <x>158</x>
<y>170</y> <y>215</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>2</x> <x>2</x>
@@ -612,8 +613,8 @@
<slot>onSearchEntryTextChanged()</slot> <slot>onSearchEntryTextChanged()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>107</x> <x>121</x>
<y>102</y> <y>137</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>2</x> <x>2</x>
@@ -628,8 +629,8 @@
<slot>onCategoryRadioClicked()</slot> <slot>onCategoryRadioClicked()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>126</x> <x>151</x>
<y>296</y> <y>361</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>0</x> <x>0</x>
@@ -644,8 +645,8 @@
<slot>onCategoryRadioClicked()</slot> <slot>onCategoryRadioClicked()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>122</x> <x>147</x>
<y>322</y> <y>392</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>1</x> <x>1</x>
@@ -701,6 +702,22 @@
</hint> </hint>
</hints> </hints>
</connection> </connection>
<connection>
<sender>pageSizeOtherCheck</sender>
<signal>clicked()</signal>
<receiver>SelectProductDialog</receiver>
<slot>onPageSizeCheckClicked()</slot>
<hints>
<hint type="sourcelabel">
<x>90</x>
<y>265</y>
</hint>
<hint type="destinationlabel">
<x>6</x>
<y>290</y>
</hint>
</hints>
</connection>
</connections> </connections>
<slots> <slots>
<slot>onSearchClearButtonClicked()</slot> <slot>onSearchClearButtonClicked()</slot>