From 4c0ce1146a59b430007296237bf9f4a68a4e0151 Mon Sep 17 00:00:00 2001 From: Jaye Evins Date: Mon, 26 May 2025 19:23:36 -0400 Subject: [PATCH] Improvements to SelectTemplateDialog (#109 and #142) - Added side pane for product preview and information - Product selection is done with a separate pushbutton, so that user gets a chance to preview the complete product information before committing to the selection - Supports two view modes: Grid View and List View - View mode is automatically stored in Settings, so it will default to the user's prefered mode - Should address most concerns in #109 and #142 --- glabels/Icons.h | 20 + glabels/PropertiesView.cpp | 20 +- glabels/SelectProductDialog.cpp | 103 ++- glabels/SelectProductDialog.h | 17 +- glabels/SimplePreview.cpp | 18 +- glabels/SimplePreview.h | 8 +- glabels/TemplatePicker.cpp | 191 ++++- glabels/TemplatePicker.h | 14 +- glabels/TemplatePickerItem.cpp | 41 +- glabels/TemplatePickerItem.h | 12 +- glabels/icons.qrc | 2 + .../icons/flat/22x22/glabels-view-grid.svg | 15 + .../icons/flat/22x22/glabels-view-list.svg | 21 + glabels/ui/SelectProductDialog.ui | 772 ++++++++++++------ model/Settings.cpp | 23 + model/Settings.h | 6 +- model/Template.cpp | 26 + model/Template.h | 1 + templates/avery-other-templates.xml | 2 +- templates/canon-other-templates.xml | 2 +- templates/dymo-other-templates.xml | 32 +- templates/felga-templates.xml | 4 +- templates/hisago-templates.xml | 26 +- templates/jac-iso-templates.xml | 24 +- templates/misc-other-templates.xml | 2 +- translations/glabels_C.ts | 47 ++ 26 files changed, 1073 insertions(+), 376 deletions(-) create mode 100644 glabels/icons/flat/22x22/glabels-view-grid.svg create mode 100644 glabels/icons/flat/22x22/glabels-view-list.svg diff --git a/glabels/Icons.h b/glabels/Icons.h index 07e95ba..4222d56 100644 --- a/glabels/Icons.h +++ b/glabels/Icons.h @@ -541,6 +541,26 @@ namespace glabels } }; + + class ViewGrid : public QIcon + { + public: + ViewGrid() + { + addPixmap( QPixmap( ":icons/flat/22x22/glabels-view-grid.svg" ) ); + } + }; + + + class ViewList : public QIcon + { + public: + ViewList() + { + addPixmap( QPixmap( ":icons/flat/22x22/glabels-view-list.svg" ) ); + } + }; + } } diff --git a/glabels/PropertiesView.cpp b/glabels/PropertiesView.cpp index dce1cd4..3203ccb 100644 --- a/glabels/PropertiesView.cpp +++ b/glabels/PropertiesView.cpp @@ -18,6 +18,7 @@ * along with gLabels-qt. If not, see . */ + #include "PropertiesView.h" #include "SelectProductDialog.h" @@ -100,11 +101,12 @@ namespace glabels /// void PropertiesView::onLabelSizeChanged() { - const model::Template* tmplate = mModel->tmplate(); - const model::Frame* frame = tmplate->frames().first(); - bool isRotated = mModel->rotate(); + auto* tmplate = mModel->tmplate(); + auto* frame = tmplate->frames().first(); + bool isRotated = mModel->rotate(); preview->setTemplate( tmplate ); + preview->setShowArrow( true ); preview->setRotate( isRotated ); const model::Vendor* vendor = model::Db::lookupVendorFromName( tmplate->brand() ); @@ -129,15 +131,9 @@ namespace glabels } descriptionLabel->setText( tmplate->description() ); - - QString pgSizeString = model::Db::lookupPaperNameFromId( tmplate->paperId() ); - pageSizeLabel->setText( pgSizeString ); - - QString labelSizeString = frame->sizeDescription( mUnits ); - labelSizeLabel->setText( labelSizeString ); - - QString layoutString = frame->layoutDescription(); - layoutLabel->setText( layoutString ); + pageSizeLabel->setText( tmplate->paperDescription( mUnits ) ); + labelSizeLabel->setText( frame->sizeDescription( mUnits ) ); + layoutLabel->setText( frame->layoutDescription() ); QStringList list = model::Db::getNameListOfSimilarTemplates( tmplate->name() ); if ( list.isEmpty() ) diff --git a/glabels/SelectProductDialog.cpp b/glabels/SelectProductDialog.cpp index aa12356..2d9a261 100644 --- a/glabels/SelectProductDialog.cpp +++ b/glabels/SelectProductDialog.cpp @@ -18,8 +18,10 @@ * along with gLabels-qt. If not, see . */ + #include "SelectProductDialog.h" +#include "Icons.h" #include "NotebookUtil.h" #include "TemplatePickerItem.h" @@ -36,9 +38,10 @@ namespace glabels /// Constructor /// SelectProductDialog::SelectProductDialog( QWidget *parent ) - : QDialog(parent), mCanceled(false) + : QDialog(parent) { setupUi( this ); + productInfoWidget->setVisible( false ); pageSizeIsoCheck->setChecked( model::Settings::searchIsoPaperSizes() ); pageSizeUsCheck->setChecked( model::Settings::searchUsPaperSizes() ); @@ -65,6 +68,17 @@ namespace glabels NotebookUtil::establishSize( modeNotebook ); + if ( templatePicker->mode() == QListView::IconMode ) + { + viewModeButton->setIcon( Icons::ViewList() ); + viewModeButton->setToolTip( tr( "List View" ) ); + } + else + { + viewModeButton->setIcon( Icons::ViewGrid() ); + viewModeButton->setToolTip( tr( "Grid View" ) ); + } + QList tmplates = model::Db::templates(); templatePicker->setTemplates( tmplates ); @@ -82,7 +96,7 @@ namespace glabels /// const model::Template* SelectProductDialog::tmplate() const { - if ( !mCanceled ) + if ( mHasSelection ) { return templatePicker->selectedTemplate(); } @@ -189,13 +203,83 @@ namespace glabels } + /// + /// View Mode Button Clicked Slot + /// + void SelectProductDialog::onViewModeButtonClicked() + { + if ( templatePicker->mode() == QListView::IconMode ) + { + templatePicker->setMode( QListView::ListMode ); + + viewModeButton->setIcon( Icons::ViewList() ); + viewModeButton->setToolTip( tr( "List View" ) ); + } + else + { + templatePicker->setMode( QListView::IconMode ); + + viewModeButton->setIcon( Icons::ViewGrid() ); + viewModeButton->setToolTip( tr( "Grid View" ) ); + } + } + + /// /// Template Picker Selection Changed Slot /// void SelectProductDialog::onTemplatePickerSelectionChanged() { - // Delay close. This should make the selection more apparent to the user. - mTimer.start( 125, this ); + auto* tmplate = templatePicker->selectedTemplate(); + if ( !tmplate ) + { + productInfoWidget->setVisible( false ); + selectButton->setEnabled( false ); + return; + } + + auto* frame = tmplate->frames().first(); + + preview->setTemplate( tmplate ); + + const model::Vendor* vendor = model::Db::lookupVendorFromName( tmplate->brand() ); + if ( (vendor != nullptr) && (vendor->url() != nullptr) ) + { + QString markup = QString( "%2" ).arg( vendor->url(), vendor->name() ); + vendorLabel->setText( markup ); + } + else + { + vendorLabel->setText( tmplate->brand() ); + } + + if ( tmplate->productUrl() != nullptr ) + { + QString markup = QString( "%2" ).arg( tmplate->productUrl(), tmplate->part() ); + partLabel->setText( markup ); + } + else + { + partLabel->setText( tmplate->part() ); + } + + descriptionLabel->setText( tmplate->description() ); + pageSizeLabel->setText( tmplate->paperDescription( model::Settings::units() ) ); + labelSizeLabel->setText( frame->sizeDescription( model::Settings::units() ) ); + layoutLabel->setText( frame->layoutDescription() ); + + productInfoWidget->setVisible( true ); + selectButton->setEnabled( true ); + } + + + /// + /// Select Button Clicked Slot + /// + void SelectProductDialog::onSelectButtonClicked() + { + mHasSelection = true; + close(); } @@ -204,17 +288,6 @@ namespace glabels /// void SelectProductDialog::onCancelButtonClicked() { - mCanceled = true; - close(); - } - - - /// - /// Cancel Button Clicked Slot - /// - void SelectProductDialog::timerEvent( QTimerEvent *event ) - { - mTimer.stop(); close(); } diff --git a/glabels/SelectProductDialog.h b/glabels/SelectProductDialog.h index 524d574..dbcf89e 100644 --- a/glabels/SelectProductDialog.h +++ b/glabels/SelectProductDialog.h @@ -24,8 +24,6 @@ #include "ui_SelectProductDialog.h" -#include - namespace glabels { @@ -60,17 +58,12 @@ namespace glabels void onPageSizeCheckClicked(); void onCategoryRadioClicked(); void onCategoryCheckClicked(); + void onViewModeButtonClicked(); void onTemplatePickerSelectionChanged(); + void onSelectButtonClicked(); void onCancelButtonClicked(); - ///////////////////////////////// - // Events - ///////////////////////////////// - protected: - void timerEvent(QTimerEvent *event) override; - - ///////////////////////////////// // Private methods ///////////////////////////////// @@ -82,14 +75,12 @@ namespace glabels // Private data ///////////////////////////////// private: - QBasicTimer mTimer; - QMap mCheckToCategoryMap; QList mCheckList; QStringList mCategoryIdList; - bool mCanceled; - + bool mHasSelection { false }; + }; } diff --git a/glabels/SimplePreview.cpp b/glabels/SimplePreview.cpp index eb0d941..b108e1d 100644 --- a/glabels/SimplePreview.cpp +++ b/glabels/SimplePreview.cpp @@ -18,6 +18,7 @@ * along with gLabels-qt. If not, see . */ + #include "SimplePreview.h" #include "RollTemplatePath.h" @@ -61,7 +62,7 @@ namespace glabels /// Constructor /// SimplePreview::SimplePreview( QWidget *parent ) - : QGraphicsView(parent), mTmplate(nullptr), mRotateFlag(false) + : QGraphicsView(parent) { mScene = new QGraphicsScene(); setScene( mScene ); @@ -84,6 +85,16 @@ namespace glabels } + /// + /// Show Arrow Property Setter + /// + void SimplePreview::setShowArrow( bool showArrow ) + { + mShowArrow = showArrow; + update(); + } + + /// /// Rotate Property Setter /// @@ -132,7 +143,10 @@ namespace glabels drawPaper(); drawLabels(); - drawArrow(); + if ( mShowArrow ) + { + drawArrow(); + } } } diff --git a/glabels/SimplePreview.h b/glabels/SimplePreview.h index b8ca7dd..9d29924 100644 --- a/glabels/SimplePreview.h +++ b/glabels/SimplePreview.h @@ -52,6 +52,7 @@ namespace glabels ///////////////////////////////// public: void setTemplate( const model::Template *tmplate ); + void setShowArrow( bool showArrow ); void setRotate( bool rotateFlag ); @@ -77,10 +78,11 @@ namespace glabels // Private Data ///////////////////////////////// private: - const model::Template* mTmplate; - bool mRotateFlag; + const model::Template* mTmplate { nullptr }; + bool mShowArrow { false }; + bool mRotateFlag { false }; - QGraphicsScene* mScene; + QGraphicsScene* mScene { nullptr }; }; diff --git a/glabels/TemplatePicker.cpp b/glabels/TemplatePicker.cpp index cfe1017..d47f6e1 100644 --- a/glabels/TemplatePicker.cpp +++ b/glabels/TemplatePicker.cpp @@ -18,11 +18,78 @@ * along with gLabels-qt. If not, see . */ + #include "TemplatePicker.h" #include "TemplatePickerItem.h" +#include "model/Settings.h" + +#include +#include #include +#include +#include + +#include + + +namespace +{ + + // + // Custom item delegate to render text as HTML in List View + // + // Based on solutions at + // https://stackoverflow.com/questions/1956542/how-to-make-item-view-render-rich-html-text-in-qt/1956781#1956781 + // Note: assumes that the text rectangle does not need to be resized, so does not reimplement sizeHint(). + // This delegate does not work correctly in IconMode, and may not work correctly in other applications, + // for instance, when the height is not dominated by the icon. + // + class HtmlDelegate : public QStyledItemDelegate + { + protected: + void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const override; + }; + + + void HtmlDelegate::paint( QPainter* painter, + const QStyleOptionViewItem& option, + const QModelIndex& index) const + { + auto opt = option; + initStyleOption( &opt, index ); + + QStyle *style = opt.widget? opt.widget->style() : QApplication::style(); + + QTextDocument doc; + doc.setHtml( opt.text ); + + /// Painting everything other than text + opt.text = QString(); + style->drawControl( QStyle::CE_ItemViewItem, &opt, painter ); + + QAbstractTextDocumentLayout::PaintContext ctx; + + // Highlighting text if item is selected + if ( opt.state & QStyle::State_Selected ) + { + ctx.palette.setColor( QPalette::Text, opt.palette.color( QPalette::Active, QPalette::HighlightedText ) ); + } + else + { + ctx.palette.setColor( QPalette::Text, opt.palette.color( QPalette::Active, QPalette::Text ) ); + } + + QRect textRect = style->subElementRect( QStyle::SE_ItemViewItemText, &opt ); + painter->save(); + painter->translate( textRect.topLeft() ); + painter->setClipRect( textRect.translated( -textRect.topLeft() ) ); + doc.documentLayout()->draw( painter, ctx ); + painter->restore(); + } + +} namespace glabels @@ -31,29 +98,83 @@ namespace glabels /// /// Constructor /// - TemplatePicker::TemplatePicker( QWidget *parent ) : QListWidget(parent) + TemplatePicker::TemplatePicker( QWidget* parent ) : QListWidget(parent) { - setViewMode( QListView::IconMode ); setResizeMode( QListView::Adjust ); - setSpacing( 24 ); - setWordWrap( true ); setUniformItemSizes( true ); - setIconSize( QSize(TemplatePickerItem::SIZE, TemplatePickerItem::SIZE) ); + setWordWrap( true ); + setIconSize( QSize( TemplatePickerItem::SIZE, TemplatePickerItem::SIZE ) ); + + setMode( model::Settings::templatePickerMode() ); } /// /// Set List of Templates to Pick From /// - void TemplatePicker::setTemplates( const QList &tmplates ) + void TemplatePicker::setTemplates( const QList& tmplates ) { + auto mode = model::Settings::templatePickerMode(); + foreach (model::Template *tmplate, tmplates) { - new TemplatePickerItem( tmplate, this ); + new TemplatePickerItem( tmplate, mode, this ); } } + /// + /// Set View Mode + /// + void TemplatePicker::setMode( QListView::ViewMode mode ) + { + model::Settings::setTemplatePickerMode( mode ); + + for ( unsigned int i = 0; i < count(); i++ ) + { + if (auto* tItem = dynamic_cast(item(i))) + { + tItem->setMode( mode ); + } + } + + switch ( mode ) + { + + case QListView::IconMode: + setItemDelegate( new QStyledItemDelegate() ); // Use default delegate + setViewMode( QListView::IconMode ); + setSpacing( 24 ); + break; + + case QListView::ListMode: + setItemDelegate( new HtmlDelegate() ); + setViewMode( QListView::ListMode ); + setSpacing( 8 ); + break; + + default: + qWarning() << "TemplatePicker: unknown mode!"; + break; + + } + + if ( auto* selected = selectedItem() ) + { + scrollToItem( selected, QAbstractItemView::PositionAtCenter ); + } + } + + + /// + /// Get current View Mode + /// + QListView::ViewMode TemplatePicker::mode() const + { + return model::Settings::templatePickerMode(); + } + + /// /// Apply Filter to Narrow Template Choices by search criteria /// @@ -61,9 +182,9 @@ namespace glabels bool isoMask, bool usMask, bool otherMask, bool anyCategory, const QStringList& categoryIds ) { - foreach ( QListWidgetItem *item, findItems( "*", Qt::MatchWildcard ) ) + for ( unsigned int i = 0; i < count(); i++ ) { - if (auto *tItem = dynamic_cast(item)) + if (auto* tItem = dynamic_cast(item(i))) { bool nameMask = tItem->tmplate()->name().contains( searchString, Qt::CaseInsensitive ); @@ -89,15 +210,20 @@ namespace glabels if ( nameMask && sizeMask && categoryMask ) { - item->setHidden( false ); + tItem->setHidden( false ); } else { - item->setHidden( true ); - item->setSelected( false ); + tItem->setHidden( true ); + tItem->setSelected( false ); } } } + + if ( auto* selected = selectedItem() ) + { + scrollToItem( selected, QAbstractItemView::PositionAtCenter ); + } } @@ -106,9 +232,9 @@ namespace glabels /// void TemplatePicker::applyFilter( const QStringList& names ) { - foreach ( QListWidgetItem *item, findItems( "*", Qt::MatchWildcard ) ) + for ( unsigned int i = 0; i < count(); i++ ) { - if (auto *tItem = dynamic_cast(item)) + if (auto *tItem = dynamic_cast(item(i))) { bool match = false; foreach ( QString name, names ) @@ -122,33 +248,50 @@ namespace glabels if ( match ) { - item->setHidden( false ); + tItem->setHidden( false ); } else { - item->setHidden( true ); - item->setSelected( false ); + tItem->setHidden( true ); + tItem->setSelected( false ); } } } + + if ( auto* selected = selectedItem() ) + { + scrollToItem( selected, QAbstractItemView::PositionAtCenter ); + } } /// /// Get Currently Selected Template /// - const model::Template *TemplatePicker::selectedTemplate() + const model::Template* TemplatePicker::selectedTemplate() const { - QList items = selectedItems(); - if ( !items.isEmpty() ) + if ( auto* tItem = selectedItem() ) { - if (auto *tItem = dynamic_cast(items.first())) - { - return tItem->tmplate(); - } + return tItem->tmplate(); } return nullptr; } + + /// + /// Get Currently Selected Item + /// + TemplatePickerItem* TemplatePicker::selectedItem() const + { + QList items = selectedItems(); + if ( !items.isEmpty() ) + { + return dynamic_cast( items.first() ); + } + + return nullptr; + } + + } // namespace glabels diff --git a/glabels/TemplatePicker.h b/glabels/TemplatePicker.h index 99428a4..78186f0 100644 --- a/glabels/TemplatePicker.h +++ b/glabels/TemplatePicker.h @@ -22,6 +22,8 @@ #define TemplatePicker_h +#include "TemplatePickerItem.h" + #include "model/Template.h" #include @@ -38,19 +40,21 @@ namespace glabels { Q_OBJECT - ///////////////////////////////// // Life Cycle ///////////////////////////////// public: - TemplatePicker( QWidget *parent = nullptr ); + TemplatePicker( QWidget* parent = nullptr ); ///////////////////////////////// // Properties ///////////////////////////////// public: - void setTemplates( const QList &tmplates ); + void setTemplates( const QList& tmplates ); + + void setMode( QListView::ViewMode mode ); + QListView::ViewMode mode() const; ///////////////////////////////// @@ -62,7 +66,9 @@ namespace glabels void applyFilter( const QStringList& names ); - const model::Template *selectedTemplate(); + const model::Template* selectedTemplate() const; + TemplatePickerItem* selectedItem() const; + }; diff --git a/glabels/TemplatePickerItem.cpp b/glabels/TemplatePickerItem.cpp index 7c695d3..43ec4c7 100644 --- a/glabels/TemplatePickerItem.cpp +++ b/glabels/TemplatePickerItem.cpp @@ -18,10 +18,13 @@ * along with gLabels-qt. If not, see . */ + #include "TemplatePickerItem.h" #include "MiniPreviewPixmap.h" +#include "model/Settings.h" + #include #include #include @@ -33,19 +36,49 @@ namespace glabels /// /// Constructor /// - TemplatePickerItem::TemplatePickerItem( model::Template *tmplate, QListWidget *parent ) - : QListWidgetItem(parent) + TemplatePickerItem::TemplatePickerItem( model::Template* tmplate, + QListView::ViewMode mode, + QListWidget* parent ) + : QListWidgetItem( parent ) { mTmplate = tmplate; setIcon( QIcon( MiniPreviewPixmap( tmplate, SIZE, SIZE ) ) ); - setText( tmplate->name() ); - setToolTip( tmplate->name() ); + setMode( mode ); setFlags( Qt::ItemIsSelectable | Qt::ItemIsEnabled ); } + /// + /// Configure for given View Mode + /// + void TemplatePickerItem::setMode( QListView::ViewMode mode ) + { + auto* frame = mTmplate->frames().first(); + + switch ( mode ) + { + + case QListView::IconMode: + setText( mTmplate->name() ); + break; + + case QListView::ListMode: + setText( "" + mTmplate->name() + "
" + + mTmplate->description() + "
" + + frame->sizeDescription( model::Settings::units() ) + "
" + + frame->layoutDescription() ); + break; + + default: + qWarning() << "TemplatePickerItem: unknown mode!"; + break; + + } + } + + /// /// Template Property Getter /// diff --git a/glabels/TemplatePickerItem.h b/glabels/TemplatePickerItem.h index 67b63d8..a67b3de 100644 --- a/glabels/TemplatePickerItem.h +++ b/glabels/TemplatePickerItem.h @@ -39,11 +39,21 @@ namespace glabels public: static const int SIZE = 80; + ///////////////////////////////// // Life Cycle ///////////////////////////////// public: - TemplatePickerItem( model::Template *tmplate, QListWidget *parent = nullptr ); + TemplatePickerItem( model::Template* tmplate, + QListView::ViewMode mode, + QListWidget* parent = nullptr ); + + + ///////////////////////////////// + // Manipulate widget + ///////////////////////////////// + public: + void setMode( QListView::ViewMode mode ); ///////////////////////////////// diff --git a/glabels/icons.qrc b/glabels/icons.qrc index 7baf897..0d14373 100644 --- a/glabels/icons.qrc +++ b/glabels/icons.qrc @@ -63,6 +63,8 @@ icons/flat/22x22/glabels-valign-text-bottom.svg icons/flat/22x22/glabels-valign-text-middle.svg icons/flat/22x22/glabels-valign-text-top.svg + icons/flat/22x22/glabels-view-grid.svg + icons/flat/22x22/glabels-view-list.svg icons/flat/22x22/glabels-zoom-in.svg icons/flat/22x22/glabels-zoom-one-to-one.svg icons/flat/22x22/glabels-zoom-out.svg diff --git a/glabels/icons/flat/22x22/glabels-view-grid.svg b/glabels/icons/flat/22x22/glabels-view-grid.svg new file mode 100644 index 0000000..84ce781 --- /dev/null +++ b/glabels/icons/flat/22x22/glabels-view-grid.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + diff --git a/glabels/icons/flat/22x22/glabels-view-list.svg b/glabels/icons/flat/22x22/glabels-view-list.svg new file mode 100644 index 0000000..fac51e7 --- /dev/null +++ b/glabels/icons/flat/22x22/glabels-view-list.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + diff --git a/glabels/ui/SelectProductDialog.ui b/glabels/ui/SelectProductDialog.ui index b7f8c48..798cb5b 100644 --- a/glabels/ui/SelectProductDialog.ui +++ b/glabels/ui/SelectProductDialog.ui @@ -6,8 +6,8 @@ 0 0 - 997 - 823 + 1078 + 796 @@ -22,273 +22,505 @@ true - + - + - - - - - - 0 - 0 - - - - 0 - - - - Search all - - - - + + + + 0 + 0 + + + + 0 + + + + Search all + + + + + + + + 6 + + + 6 + - - - 6 - - - 6 - - - - - - 0 - 0 - - - - - 220 - 0 - - - - Search - - - true - - - - - - - + - + 0 0 - 0 + 220 0 - - false + + Search - - Filter by paper size + + true - - false - - - false - - - - - - 3 - - - - - ISO sizes - - - - - - - US sizes - - - - - - - Other - - - - - - - - - - - - Filter by category - - - - 3 - - - - - All - - - - - - - Selected - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 3 - - - 20 - - - - - - - - - - - Qt::Vertical + + + + + 0 + 0 + - + - 20 - 3 + 0 + 0 - + + false + + + Filter by paper size + + + false + + + false + + + + + + 3 + + + + + ISO sizes + + + + + + + US sizes + + + + + + + Other + + + + + + + - - - - Search entire product database. - - - true + + + + Filter by category + + + 3 + + + + + All + + + + + + + Selected + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 3 + + + 20 + + + + + + + - - - - Recent - - - - - - Select from recently used products. - - - true - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - 140 - 0 - - - - false - - - - + + + + + Qt::Vertical + + + + 20 + 3 + + + + + + + + Search entire product database. + + + true + + + + + + + + Recent + + + + + + Select from recently used products. + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - &Cancel - - - - + + + + 500 + 0 + + + + false + + + + + + + + 0 + 0 + + + + + 300 + 0 + + + + Product information + + + + + + + + + + + + 0 + 0 + + + + Vendor: + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + 0 + 0 + + + + Part #: + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + 0 + 0 + + + + Description: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + + 0 + 0 + + + + TextLabel + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + true + + + + + + + + 0 + 0 + + + + Page size: + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + 0 + 0 + + + + Label size: + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + 0 + 0 + + + + Layout: + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + :/icons/flat/22x22/glabels-view-grid.svg:/icons/flat/22x22/glabels-view-grid.svg + + + + 22 + 22 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + &Cancel + + + false + + + + + + + false + + + Select + + @@ -300,6 +532,11 @@ QListWidget
TemplatePicker.h
+ + glabels::SimplePreview + QGraphicsView +
SimplePreview.h
+
@@ -312,8 +549,8 @@ onPageSizeCheckClicked() - 78 - 184 + 130 + 196 4 @@ -344,8 +581,8 @@ onPageSizeCheckClicked() - 80 - 161 + 132 + 170 2 @@ -360,8 +597,8 @@ onCancelButtonClicked() - 955 - 648 + 981 + 783 689 @@ -376,8 +613,8 @@ onSearchEntryTextChanged() - 93 - 104 + 107 + 102 2 @@ -392,8 +629,8 @@ onCategoryRadioClicked() - 76 - 270 + 126 + 296 0 @@ -408,8 +645,8 @@ onCategoryRadioClicked() - 72 - 294 + 122 + 322 1 @@ -433,6 +670,38 @@ + + selectButton + clicked() + SelectProductDialog + onSelectButtonClicked() + + + 1022 + 769 + + + 1067 + 682 + + + + + viewModeButton + clicked() + SelectProductDialog + onViewModeButtonClicked() + + + 20 + 760 + + + -2 + 762 + + + onSearchClearButtonClicked() @@ -444,5 +713,6 @@ onPageSizeCheckClicked() onCategoryRadioClicked() onModeTabChanged() + onViewModeButtonClicked() diff --git a/model/Settings.cpp b/model/Settings.cpp index a90bce8..481941b 100644 --- a/model/Settings.cpp +++ b/model/Settings.cpp @@ -18,6 +18,7 @@ * along with gLabels-qt. If not, see . */ + #include "Settings.h" #include @@ -262,6 +263,28 @@ namespace glabels } + QListView::ViewMode Settings::templatePickerMode() + { + QString defaultMode = "icon"; + + mInstance->beginGroup( "TemplatePicker" ); + QString returnMode = mInstance->value( "viewMode", defaultMode ).toString(); + mInstance->endGroup(); + + return returnMode == "icon" ? QListView::IconMode : QListView::ListMode; + } + + + void Settings::setTemplatePickerMode( QListView::ViewMode viewMode ) + { + mInstance->beginGroup( "TemplatePicker" ); + mInstance->setValue( "viewMode", viewMode == QListView::IconMode ? "icon" : "list" ); + mInstance->endGroup(); + + emit mInstance->changed(); + } + + QStringList Settings::recentTemplateList() { QStringList defaultList; diff --git a/model/Settings.h b/model/Settings.h index 38034bc..a797f26 100644 --- a/model/Settings.h +++ b/model/Settings.h @@ -24,6 +24,7 @@ #include "Distance.h" +#include #include #include @@ -87,6 +88,9 @@ namespace glabels static QStringList searchCategoryList(); static void setSearchCategoryList( const QStringList& searchCategoryList ); + static QListView::ViewMode templatePickerMode(); + static void setTemplatePickerMode( QListView::ViewMode viewMode ); + static QStringList recentTemplateList(); static void addToRecentTemplateList( const QString& name ); @@ -94,7 +98,7 @@ namespace glabels static QStringList recentFileList(); static void addToRecentFileList( const QString& filePath ); - + private: static Settings* mInstance; static const int mMaxRecentFiles{5}; diff --git a/model/Template.cpp b/model/Template.cpp index d434d58..28dfe18 100644 --- a/model/Template.cpp +++ b/model/Template.cpp @@ -18,10 +18,12 @@ * along with gLabels-qt. If not, see . */ + #include "Template.h" #include "Db.h" #include "FrameContinuous.h" +#include "StrUtil.h" #include @@ -190,6 +192,30 @@ namespace glabels } + QString Template::paperDescription( const Units& units ) const + { + if ( mPaperId == "other" ) + { + if ( units.toEnum() == Units::IN ) + { + QString wStr = StrUtil::formatFraction( mPageWidth.in() ); + QString hStr = StrUtil::formatFraction( mPageHeight.in() ); + + return QString("%1 x %2 %3").arg(wStr).arg(hStr).arg(units.toTrName()); + } + else + { + return QString("%1 x %2 %3") + .arg(mPageWidth.inUnits(units), 0, 'g', 5) + .arg(mPageHeight.inUnits(units), 0, 'g', 5) + .arg(units.toTrName()); + } + } + + return Db::lookupPaperNameFromId( mPaperId ); + } + + QString Template::paperId() const { return mPaperId; diff --git a/model/Template.h b/model/Template.h index 2f90509..3decf5b 100644 --- a/model/Template.h +++ b/model/Template.h @@ -73,6 +73,7 @@ namespace glabels QString part() const; QString description() const; + QString paperDescription( const Units& units ) const; QString paperId() const; Distance pageWidth() const; Distance pageHeight() const; diff --git a/templates/avery-other-templates.xml b/templates/avery-other-templates.xml index 25ccfbd..0dbd27d 100644 --- a/templates/avery-other-templates.xml +++ b/templates/avery-other-templates.xml @@ -10,7 +10,7 @@ -