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 )
{
SelectProductDialog dialog;
SelectProductDialog dialog( window );
dialog.exec();
auto tmplate = dialog.tmplate();
+44 -33
View File
@@ -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<model::Template>& 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 );
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 );
}
@@ -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<TemplatePickerItem *>(item(i)))
if ( auto* tItem = dynamic_cast<TemplatePickerItem *>( 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<TemplatePickerItem *>(item(i)))
if ( auto* tItem = dynamic_cast<TemplatePickerItem *>( 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,9 +282,14 @@ 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<TemplatePickerItem *>( mModel->item( i, 0 ) ) )
{
return tItem->tmplate();
}
}
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();
if ( !items.isEmpty() )
{
return dynamic_cast<TemplatePickerItem*>( items.first() );
}
return nullptr;
emit selectionChanged();
}
+25 -6
View File
@@ -22,12 +22,11 @@
#define TemplatePicker_h
#include "TemplatePickerItem.h"
#include "model/Template.h"
#include <QList>
#include <QListWidget>
#include <QListView>
#include <QStandardItemModel>
namespace glabels
@@ -36,7 +35,7 @@ namespace glabels
///
/// Template Picker Widget
///
class TemplatePicker : public QListWidget
class TemplatePicker : public QListView
{
Q_OBJECT
@@ -60,16 +59,36 @@ 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;
};
}
+4 -5
View File
@@ -25,9 +25,8 @@
#include "model/Settings.h"
#include <QHBoxLayout>
#include <QDebug>
#include <QIcon>
#include <QListWidgetItem>
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
+4 -4
View File
@@ -25,7 +25,8 @@
#include "model/Template.h"
#include <QLabel>
#include <QListWidget>
#include <QListView>
#include <QStandardItem>
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 );
/////////////////////////////////
+29 -12
View File
@@ -478,7 +478,8 @@
<string/>
</property>
<property name="icon">
<iconset theme="glabels-view-grid"/>
<iconset theme="glabels-view-grid">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="iconSize">
<size>
@@ -548,8 +549,8 @@
<slot>onPageSizeCheckClicked()</slot>
<hints>
<hint type="sourcelabel">
<x>130</x>
<y>196</y>
<x>156</x>
<y>246</y>
</hint>
<hint type="destinationlabel">
<x>4</x>
@@ -559,7 +560,7 @@
</connection>
<connection>
<sender>templatePicker</sender>
<signal>itemSelectionChanged()</signal>
<signal>selectionChanged()</signal>
<receiver>SelectProductDialog</receiver>
<slot>onTemplatePickerSelectionChanged()</slot>
<hints>
@@ -580,8 +581,8 @@
<slot>onPageSizeCheckClicked()</slot>
<hints>
<hint type="sourcelabel">
<x>132</x>
<y>170</y>
<x>158</x>
<y>215</y>
</hint>
<hint type="destinationlabel">
<x>2</x>
@@ -612,8 +613,8 @@
<slot>onSearchEntryTextChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>107</x>
<y>102</y>
<x>121</x>
<y>137</y>
</hint>
<hint type="destinationlabel">
<x>2</x>
@@ -628,8 +629,8 @@
<slot>onCategoryRadioClicked()</slot>
<hints>
<hint type="sourcelabel">
<x>126</x>
<y>296</y>
<x>151</x>
<y>361</y>
</hint>
<hint type="destinationlabel">
<x>0</x>
@@ -644,8 +645,8 @@
<slot>onCategoryRadioClicked()</slot>
<hints>
<hint type="sourcelabel">
<x>122</x>
<y>322</y>
<x>147</x>
<y>392</y>
</hint>
<hint type="destinationlabel">
<x>1</x>
@@ -701,6 +702,22 @@
</hint>
</hints>
</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>
<slots>
<slot>onSearchClearButtonClicked()</slot>