Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Mario Blättermann
2019-09-06 15:59:21 +02:00
138 changed files with 7361 additions and 1389 deletions
+1
View File
@@ -27,6 +27,7 @@ install:
- set PATH=%PATH%;%QTDIR%/bin
build_script:
- git checkout master # re-attach to master to satisfy auto version tooling
- mkdir build
- cd build
- cmake -G "Visual Studio 15 2017 Win64" -DCMAKE_PREFIX_PATH=%QTDIR% ..
+3
View File
@@ -34,3 +34,6 @@ core
*.sav*
.directory
TEST-DATA
SAV*
OLD*
+4 -1
View File
@@ -10,9 +10,12 @@ before_install:
install:
- sudo apt-get -y install qt59base qt59svg qt59tools qt59translations zlib1g-dev xvfb
- sudo apt-get -y install barcode libqrencode-dev
- wget https://downloads.sourceforge.net/project/zint/zint/2.6.3/zint-2.6.3_final.tar.gz && tar xzf zint-2.6.3_final.tar.gz && cd zint-2.6.3.src && mkdir build && cd build && cmake .. && make && sudo make install && cd ../..
- source /opt/qt5*/bin/qt5*-env.sh
script:
- git fetch --unshallow # restore repository depth to properly count commits in auto versioning
- git checkout master # re-attach to master to satisfy auto versioning
- mkdir build
- cd build
- cmake .. -DCMAKE_INSTALL_PREFIX=/usr
@@ -24,7 +27,7 @@ after_success:
- wget -c "https://github.com/jimevins/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage"
- chmod a+x linuxdeployqt*.AppImage
- unset QTDIR; unset QT_PLUGIN_PATH ; unset LD_LIBRARY_PATH
- export LD_LIBRARY_PATH=/opt/qt*/lib/:$LD_LIBRARY_PATH
- export LD_LIBRARY_PATH=/opt/qt*/lib/:/usr/local/lib:$LD_LIBRARY_PATH
- ./linuxdeployqt*.AppImage ./appdir/usr/share/applications/*.desktop -bundle-non-qt-libs
- ./linuxdeployqt*.AppImage ./appdir/usr/share/applications/*.desktop -appimage
- find ./appdir -executable -type f -exec ldd {} \; | grep " => /usr" | cut -d " " -f 2-3 | sort | uniq
+1
View File
@@ -0,0 +1 @@
@VERSION_STRING@
+27 -2
View File
@@ -17,6 +17,26 @@ set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/"
set (WEBSITE "glabels.org")
set (BUG_WEBSITE "https://github.com/jimevins/glabels-qt/issues")
execute_process(
COMMAND git symbolic-ref --short HEAD
RESULT_VARIABLE BRANCH_VALID
OUTPUT_VARIABLE BRANCH
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if (NOT ${BRANCH_VALID} STREQUAL "0")
set (BRANCH "Unkonwn")
endif ()
execute_process(
COMMAND git rev-list --count ${BRANCH}
RESULT_VARIABLE COMMIT_COUNT_VALID
OUTPUT_VARIABLE COMMIT_COUNT
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if (NOT ${COMMIT_COUNT_VALID} STREQUAL "0")
set (COMMIT_COUNT "?")
endif ()
execute_process(
COMMAND git log -1 --format=%h
RESULT_VARIABLE COMMIT_HASH_VALID
@@ -38,11 +58,16 @@ if (NOT ${COMMIT_DATE_VALID} STREQUAL "0")
endif ()
# Uncomment for snapshots, comment for releases
set(VERSION_STRING "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}-snapshot (${COMMIT_HASH} ${COMMIT_DATE})")
set(VERSION_STRING "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}-${BRANCH}${COMMIT_COUNT}")
# Uncomment for releases, comment for snapshots
#set(VERSION_STRING "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
set(LONG_VERSION_STRING "${VERSION_STRING} (${COMMIT_HASH} ${COMMIT_DATE})")
# Auto-generate version file
configure_file (.version.in VERSION @ONLY)
#=======================================
# Packaging Information
@@ -147,7 +172,7 @@ add_subdirectory (data)
#=======================================
message (STATUS "")
message (STATUS "Project name ............ " ${CMAKE_PROJECT_NAME})
message (STATUS "Project version ......... " ${VERSION_STRING})
message (STATUS "Project version ......... " ${LONG_VERSION_STRING})
message (STATUS "Installation prefix ..... " ${CMAKE_INSTALL_PREFIX})
message (STATUS "Source code location .... " ${glabels_SOURCE_DIR})
message (STATUS "CMake version ........... " ${CMAKE_VERSION})
+1 -1
View File
@@ -205,7 +205,7 @@ namespace glabels
glbarcode::Factory::registerType( "zint::kix", Zint::Kix::create );
glbarcode::Factory::registerType( "zint::ean", Zint::Ean::create );
glbarcode::Factory::registerType( "zint::gmtx", Zint::Gmtx::create );
glbarcode::Factory::registerType( "zint::gs1128", Zint::Gs1128::create );
glbarcode::Factory::registerType( "zint::gs1-128", Zint::Gs1128::create );
glbarcode::Factory::registerType( "zint::rss14", Zint::Rss14::create );
glbarcode::Factory::registerType( "zint::rssltd", Zint::Rssltd::create );
glbarcode::Factory::registerType( "zint::rssexp", Zint::Rssexp::create );
-1
View File
@@ -80,7 +80,6 @@ namespace glabels
QRcode_free( qrcode );
QRcode_clearCache();
return true;
}
+1 -1
View File
@@ -31,7 +31,7 @@ namespace glabels
///
/// Constructor
///
Merge::Merge( const Merge* merge ) : mSource(merge->mSource)
Merge::Merge( const Merge* merge ) : mId(merge->mId), mSource(merge->mSource)
{
foreach ( Record* record, merge->mRecordList )
{
+1 -1
View File
@@ -45,7 +45,7 @@ namespace glabels
Text::Text( const Text* merge )
: Merge( merge ),
mDelimeter(merge->mDelimeter), mLine1HasKeys(merge->mLine1HasKeys),
mNFieldsMax(merge->mNFieldsMax)
mKeys(merge->mKeys), mNFieldsMax(merge->mNFieldsMax)
{
}
+1 -1
View File
@@ -11,7 +11,7 @@ set (LIBZINT_DEFINITIONS "")
find_path (LIBZINT_INCLUDE_DIR NAMES zint.h)
find_library (LIBZINT_LIBRARIES NAMES zint )
find_library (LIBZINT_LIBRARY NAMES zint )
if (LIBZINT_LIBRARY AND LIBZINT_INCLUDE_DIR)
+45 -2
View File
@@ -1,7 +1,8 @@
gLabels Linux Build Instructions
================================
## Prerequisites
## General
### Prerequisites
- g++
- CMake 2.8.12+
@@ -12,7 +13,7 @@ gLabels Linux Build Instructions
> may also need to be installed. Development packages are usually named something like
> libraryName-dev or libraryName-devel.
## Compile and Install
### Compile and Install
gLabels uses the CMake meta build system. Use the following commands to build and install gLabels:
@@ -24,3 +25,45 @@ $ cmake ..
$ make
$ sudo make install
</pre>
## Example: Ubuntu 19.04
### Installing Prerequisites
```
sudo apt install cmake
sudo apt install qtbase5-dev libqt5svg5-dev qttools5-dev zlib1g-dev
```
_QREncode (Optional)_
```
sudo apt install pkgconf libqrencode-dev
```
_Zint (Optional)_
Install zint from source:
```
wget https://downloads.sourceforge.net/project/zint/zint/2.6.3/zint-2.6.3_final.tar.gz
tar xzf zint-2.6.3_final.tar.gz
cd zint-2.6.3.src/
mkdir build && cd build && cmake .. && make
sudo make install
```
_GNU Barcode (Optional)_
As of version 0.99, GNU Barcode no longer installs its library. So install 0.98 from source:
```
wget https://ftp.gnu.org/gnu/barcode/barcode-0.98.tar.gz
tar xzf barcode-0.98.tar.gz
cd barcode-0.98/
./configure && make
sudo make install
```
### Compile and Install gLabels
```
$ cd glabels-qt
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install
```
+20
View File
@@ -0,0 +1,20 @@
gLabels MacOS Build Instructions
================================
## Prerequisites
```
brew install cmake
brew install qt
```
## Compile and Install
<pre>
cd <i>glabels_source_directory</i>
mkdir build
cd build
cmake -D CMAKE_PREFIX_PATH=/usr/local/opt/qt ..
make
sudo make install
</pre>
+22 -17
View File
@@ -17,6 +17,28 @@ modifiers = modifier [ ":" modifiers ] ;
modifier = format-modifier | default-value-modifier | new-line-modifier;
```
Field Names
-----------
Field names can refer to either [Document Merge Fields](#document-merge-fields) or [User Variables](#user-variables). If a document merge field and a user variable share the same name, the document merge field takes precidence. Its syntax is simply:
```ebnf
field-name = merge-field-name | user-variable-name ;
```
### Document Merge Fields
Document merge fields are the primary source of substitution fields. A document merge field represents a field from an external data source, such as a CSV file. The valid syntax for a document merge field name is determined by the merge source, with the following exception. Merge field names cannot contain either a colon (":") or closing curly bracket ("}").
### User Variables
Substitution fields can also refer to user variables. The syntax for valid user variable names is
```ebnf
letter = "a" | "b" | ... | "z" | "A" | ... | "Z";
digit = "0" | "1" | "2" | ... | "9";
user-variable-name = ( letter | "_" ) , { letter | digit | "_" } ;
```
Modifiers
---------
### Format-Modifier (`%`)
@@ -89,20 +111,3 @@ ${CITY} ${STATE} ${ZIP}
`${ADDR2}` would be printed on its own line, only if it is set and non-empty.
Document Merge Fields
---------------------
Document merge fields are the primary source of substitution fields. A document merge field represents a field from an external data source, such as a CSV file.
User Defined Variables
----------------------
Alternatively, merge fields can refer to user defined variables.
Built-In Variables
------------------
Potentially, merge fields may also refer to built-in variables. Candidates include:
- LABEL_NUMBER
- PAGE_NUMBER
- DATE
- TIME
- FILE_NAME
+12
View File
@@ -29,3 +29,15 @@ Add support for "Continuous Roll" labels
Write help documentation
------------------------
To Do List for gLabels 4.1 -- 2019-03-17
========================================
Create a "built-in" merge source
--------------------------------
As an alternative to external merge sources, let the user edit the merge source
in situ. The user can add fields. The user can add records using those fields.
The user created database will become part of the glabels project file.
For simple databases, such as a small address list, this would be much easier
to deal with than creating it externally.
+2 -2
View File
@@ -60,7 +60,7 @@ int main( int argc, char **argv )
QCoreApplication::setOrganizationName( "glabels.org" );
QCoreApplication::setOrganizationDomain( "glabels.org" );
QCoreApplication::setApplicationName( "glabels-batch-qt" );
QCoreApplication::setApplicationVersion( glabels::model::Version::STRING );
QCoreApplication::setApplicationVersion( glabels::model::Version::LONG_STRING );
//
// Setup translators
@@ -175,7 +175,7 @@ int main( int argc, char **argv )
}
glabels::model::PageRenderer renderer( model );
renderer.setNCopies( 1 );
renderer.setNCopies( parser.value( "copies" ).toInt() );
renderer.setStartLabel( parser.value( "first" ).toInt() - 1 );
renderer.setPrintOutlines( parser.isSet( "outlines" ) );
renderer.setPrintCropMarks( parser.isSet( "crop-marks" ) );
+1 -1
View File
@@ -38,7 +38,7 @@ namespace glabels
{
setupUi( this );
QString version = tr("Version") + " " + model::Version::STRING;
QString version = tr("Version") + " " + model::Version::LONG_STRING;
QString description = tr("A program to create labels and business cards.");
+6 -2
View File
@@ -13,9 +13,9 @@ set (glabels_sources
ColorHistory.cpp
ColorPaletteDialog.cpp
ColorPaletteItem.cpp
ColorPaletteButtonItem.cpp
ColorSwatch.cpp
Cursors.cpp
EditVariableDialog.cpp
FieldButton.cpp
File.cpp
Help.cpp
@@ -40,6 +40,7 @@ set (glabels_sources
TemplatePicker.cpp
TemplatePickerItem.cpp
UndoRedoModel.cpp
VariablesView.cpp
)
set (glabels_qobject_headers
@@ -51,7 +52,7 @@ set (glabels_qobject_headers
ColorHistory.h
ColorPaletteDialog.h
ColorPaletteItem.h
ColorPaletteButtonItem.h
EditVariableDialog.h
FieldButton.h
File.h
LabelEditor.h
@@ -69,10 +70,12 @@ set (glabels_qobject_headers
TemplateDesigner.h
TemplatePicker.h
UndoRedoModel.h
VariablesView.h
)
set (glabels_forms
ui/AboutDialog.ui
ui/EditVariableDialog.ui
ui/MergeView.ui
ui/ObjectEditor.ui
ui/PreferencesDialog.ui
@@ -95,6 +98,7 @@ set (glabels_forms
ui/TemplateDesignerOneLayoutPage.ui
ui/TemplateDesignerTwoLayoutPage.ui
ui/TemplateDesignerApplyPage.ui
ui/VariablesView.ui
)
set (glabels_resource_files
+10 -11
View File
@@ -48,8 +48,9 @@ namespace glabels
void ColorButton::init( const QString& defaultLabel,
const QColor& defaultColor,
const QColor& color )
const QColor& defaultColor,
const QColor& color,
bool showUseFieldButton )
{
mDefaultColor = defaultColor;
mColorNode = model::ColorNode( color );
@@ -61,7 +62,10 @@ namespace glabels
setText( "" );
setCheckable( true );
mDialog = new ColorPaletteDialog( defaultLabel, defaultColor, color );
mDialog = new ColorPaletteDialog( defaultLabel,
defaultColor,
color,
showUseFieldButton );
connect( this, SIGNAL(toggled(bool)), this, SLOT(onButtonToggled(bool)) );
connect( mDialog, SIGNAL(colorChanged(model::ColorNode,bool)),
@@ -124,15 +128,10 @@ namespace glabels
}
void ColorButton::setKeys( const QList<QString> keyList )
void ColorButton::setKeys( const merge::Merge* merge,
const model::Variables* variables )
{
mDialog->setKeys( keyList );
}
void ColorButton::clearKeys()
{
mDialog->clearKeys();
mDialog->setKeys( merge, variables );
}
+8 -3
View File
@@ -58,13 +58,18 @@ namespace glabels
// Public Methods
/////////////////////////////////
public:
void init( const QString& defaultLabel, const QColor& defaultColor, const QColor& color );
void init( const QString& defaultLabel,
const QColor& defaultColor,
const QColor& color,
bool showUseFieldButton = true );
void setColorNode( model::ColorNode colorNode );
void setColor( QColor color );
void setToDefault();
model::ColorNode colorNode();
void setKeys( const QList<QString> keyList );
void clearKeys();
void setKeys( const merge::Merge* merge,
const model::Variables* variables );
/////////////////////////////////
+71 -41
View File
@@ -46,23 +46,25 @@ namespace glabels
}
void ColorHistory::addColor( const QColor &color )
void ColorHistory::addColor( const QColor &color, const QString& name )
{
QList<QColor> colorList = readColorList();
QString nameColor = name + ":" + color.name();
QStringList nameColorList = readNameColorList();
// Remove any occurrences of this color already in list
colorList.removeAll( color );
nameColorList.removeAll( nameColor );
// Now add to list
colorList.append( color );
nameColorList.append( nameColor );
// Remove oldest colors, if size exceeds current max
while ( colorList.size() > MAX_COLORS )
while ( nameColorList.size() > MAX_COLORS )
{
colorList.removeFirst();
nameColorList.removeFirst();
}
writeColorList( colorList );
writeNameColorList( nameColorList );
emit changed();
}
@@ -70,55 +72,83 @@ namespace glabels
QList<QColor> ColorHistory::getColors()
{
return readColorList();
}
QColor ColorHistory::getColor( int id )
{
QList<QColor> colors = readColorList();
return colors[id];
}
QList<QColor> ColorHistory::readColorList()
{
QStringList defaultList;
QSettings settings;
settings.beginGroup( "ColorHistory" );
QStringList colorNameList = settings.value( "colors", defaultList ).toStringList();
settings.endGroup();
QList<QColor> colorList;
foreach ( QString colorName, colorNameList )
for ( QString& nameColor : readNameColorList() )
{
colorList << QColor( colorName );
}
// Remove oldest colors, if size exceeds current max
while ( colorList.size() > MAX_COLORS )
{
colorList.removeFirst();
QStringList v = nameColor.split( ':' );
if ( v.size() == 2 )
{
colorList << QColor( v[1] );
}
else if ( v.size() == 1 )
{
// Old-style, no name
colorList << QColor( v[0] );
}
else
{
// Should not happen
qWarning() << "Invalid color history.";
}
}
return colorList;
}
void ColorHistory::writeColorList( const QList<QColor>& colorList )
QStringList ColorHistory::getNames()
{
// Build name list
QStringList colorNameList;
foreach ( QColor color, colorList )
QStringList nameList;
for ( QString& nameColor : readNameColorList() )
{
colorNameList << color.name();
QStringList v = nameColor.split( ':' );
if ( v.size() == 2 )
{
nameList << v[0];
}
else if ( v.size() == 1 )
{
// Old-style, no name
nameList << QString(tr("color %1")).arg( v[0] );
}
else
{
// Should not happen
qWarning() << "Invalid color history.";
}
}
return nameList;
}
QStringList ColorHistory::readNameColorList()
{
QStringList defaultList;
QSettings settings;
settings.beginGroup( "ColorHistory" );
QStringList nameColorList = settings.value( "colors", defaultList ).toStringList();
settings.endGroup();
// Remove oldest colors, if size exceeds current max
while ( nameColorList.size() > MAX_COLORS )
{
nameColorList.removeFirst();
}
return nameColorList;
}
void ColorHistory::writeNameColorList( const QStringList& nameColorList )
{
// Save
QSettings settings;
settings.beginGroup( "ColorHistory" );
settings.setValue( "colors", colorNameList );
settings.setValue( "colors", nameColorList );
settings.endGroup();
}
+4 -4
View File
@@ -60,17 +60,17 @@ namespace glabels
// Public Methods
/////////////////////////////////
public:
void addColor( const QColor &color );
void addColor( const QColor& color, const QString& name );
QList<QColor> getColors();
QColor getColor( int id );
QStringList getNames();
/////////////////////////////////
// Private Methods
/////////////////////////////////
private:
QList<QColor> readColorList();
void writeColorList( const QList<QColor>& colorList );
QStringList readNameColorList();
void writeNameColorList( const QStringList& nameColorList );
/////////////////////////////////
-124
View File
@@ -1,124 +0,0 @@
/* ColorPaletteButtonItem.cpp
*
* Copyright (C) 2014 Jim Evins <evins@snaught.com>
*
* This file is part of gLabels-qt.
*
* gLabels-qt is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* gLabels-qt is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with gLabels-qt. If not, see <http://www.gnu.org/licenses/>.
*/
#include "ColorPaletteButtonItem.h"
#include <QMouseEvent>
#include <QPainter>
namespace glabels
{
//
// Private
//
namespace
{
const int border = 4;
const int hBox = 25;
const int outlineWidthPixels = 1;
}
///
/// Constructor From Data
///
ColorPaletteButtonItem::ColorPaletteButtonItem( const QString& text, QWidget* parent )
: QWidget(parent), mText(text), mHover(false)
{
setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed ) );
setMinimumSize( hBox+2*border+1, hBox+2*border+1 );
}
///
/// Paint Event
///
void ColorPaletteButtonItem::paintEvent( QPaintEvent* event )
{
QPainter painter(this);
//
// Draw background
//
if ( isEnabled() && mHover )
{
QLinearGradient gradient( 0, 0, 0, height() );
gradient.setColorAt( 0, palette().color( QPalette::Highlight ).lighter() );
gradient.setColorAt( 1, palette().color( QPalette::Highlight ) );
painter.setBrush( QBrush( gradient ) );
QPen pen( palette().color( QPalette::Text ) );
pen.setWidth( outlineWidthPixels );
painter.setPen( pen );
painter.drawRect( 0, 0, width()-1, height()-1 );
}
//
// Draw text
//
painter.setBrush( QBrush( Qt::NoBrush ) );
if ( isEnabled() && mHover )
{
painter.setPen( QPen( palette().color( QPalette::HighlightedText ) ) );
}
else
{
painter.setPen( QPen( palette().color( QPalette::Text ) ) );
}
QRect textRect( border, border, width()-2*border, hBox );
painter.drawText( textRect, Qt::AlignLeft|Qt::AlignVCenter, mText );
}
///
/// Enter Event
///
void ColorPaletteButtonItem::enterEvent( QEvent* event )
{
mHover = true;
update();
}
///
/// Leave Event
///
void ColorPaletteButtonItem::leaveEvent( QEvent* event )
{
mHover = false;
update();
}
///
/// Mouse Press Event
///
void ColorPaletteButtonItem::mousePressEvent( QMouseEvent* event )
{
emit activated();
}
} // namespace glabels
+98 -108
View File
@@ -18,14 +18,16 @@
* along with gLabels-qt. If not, see <http://www.gnu.org/licenses/>.
*/
#include "ColorPaletteDialog.h"
#include <QColorDialog>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QFrame>
#include <QGridLayout>
#include <QGroupBox>
#include <QHBoxLayout>
#include <QPushButton>
#include <QStandardItemModel>
#include <QVBoxLayout>
#include <QtDebug>
@@ -83,6 +85,7 @@ namespace glabels
ColorPaletteDialog::ColorPaletteDialog( const QString& defaultLabel,
const QColor& defaultColor,
const QColor& color,
bool showUseFieldButton,
QWidget* parent )
: QDialog( parent )
{
@@ -99,14 +102,12 @@ namespace glabels
vLayout->setContentsMargins( 0, 0, 0, 0 );
vLayout->setSpacing( 0 );
auto* defaultButton = new ColorPaletteButtonItem( defaultLabel );
connect( defaultButton, SIGNAL(activated()), this, SLOT(onDefaultItemActivated()) );
vLayout->addWidget( defaultButton );
QFrame* hline1 = new QFrame;
hline1->setFrameStyle( QFrame::HLine | QFrame::Plain );
hline1->setLineWidth( 1 );
vLayout->addWidget( hline1 );
//
// Construct Standard Colors Grid
//
auto* standardColorsGroup = new QGroupBox( tr("Standard Colors") );
standardColorsGroup->setAlignment( Qt::AlignHCenter );
vLayout->addWidget( standardColorsGroup );
auto* mainPaletteLayout = new QGridLayout();
mainPaletteLayout->setSpacing( 0 );
@@ -119,17 +120,20 @@ namespace glabels
ColorPaletteItem* item = new ColorPaletteItem( i,
QColor( mColorTable[i].colorSpec ),
tr(mColorTable[i].trname) );
connect( item, SIGNAL(activated(int)), this, SLOT(onPaletteItemActivated(int)) );
connect( item, SIGNAL(activated(int)),
this, SLOT(onPaletteItemActivated(int)) );
mainPaletteLayout->addWidget( item, iRow, iCol );
}
}
vLayout->addLayout( mainPaletteLayout );
standardColorsGroup->setLayout( mainPaletteLayout );
QFrame* hline2 = new QFrame;
hline2->setFrameStyle( QFrame::HLine | QFrame::Plain );
hline2->setLineWidth( 1 );
vLayout->addWidget( hline2 );
//
// Construct Recent Colors Grid
//
auto* recentColorsGroup = new QGroupBox( tr("Recent Colors") );
recentColorsGroup->setAlignment( Qt::AlignHCenter );
vLayout->addWidget( recentColorsGroup );
auto* customPaletteLayout = new QHBoxLayout();
customPaletteLayout->setSpacing( 0 );
@@ -137,40 +141,49 @@ namespace glabels
{
mHistoryItem[iCol] = new ColorPaletteItem( iCol, QColor(0,0,0,0), "" );
mHistoryItem[iCol]->setEnabled( false );
connect( mHistoryItem[iCol], SIGNAL(activated(int)), this, SLOT(onHistoryItemActivated(int)) );
connect( mHistoryItem[iCol], SIGNAL(activated(int)),
this, SLOT(onHistoryItemActivated(int)) );
customPaletteLayout->addWidget( mHistoryItem[iCol] );
}
vLayout->addLayout( customPaletteLayout );
recentColorsGroup->setLayout( customPaletteLayout );
QFrame* hline3 = new QFrame;
hline3->setFrameStyle( QFrame::HLine | QFrame::Plain );
hline3->setLineWidth( 1 );
vLayout->addWidget( hline3 );
ColorPaletteButtonItem* customColorButton = new ColorPaletteButtonItem( tr("Custom color...") );
connect( customColorButton, SIGNAL(activated()), this, SLOT(onCustomColorItemActivated()) );
//
// Construct Default (e.g. "No Fill") Button
//
auto* defaultColorButton = new QPushButton( defaultLabel );
defaultColorButton->setAutoDefault( false );
defaultColorButton->setDefault( false );
connect( defaultColorButton, SIGNAL(clicked()), this, SLOT(onDefaultButtonClicked()) );
vLayout->addWidget( defaultColorButton );
//
// Construct Custom Color Button
//
auto* customColorButton = new QPushButton( tr("Custom color...") );
customColorButton->setAutoDefault( false );
customColorButton->setDefault( false );
connect( customColorButton, SIGNAL(clicked()), this, SLOT(onCustomColorButtonClicked()) );
vLayout->addWidget( customColorButton );
QFrame* hline4 = new QFrame;
hline4->setFrameStyle( QFrame::HLine | QFrame::Plain );
hline4->setLineWidth( 1 );
vLayout->addWidget( hline4 );
//
// Construct "Use field" Button
//
if ( showUseFieldButton )
{
mFieldButton = new FieldButton();
mFieldButton->setText( tr("Use substitution field") );
mFieldButton->setAutoDefault( false );
mFieldButton->setDefault( false );
connect( mFieldButton, SIGNAL(keySelected(QString)), this, SLOT(onKeySelected(QString)) );
vLayout->addWidget( mFieldButton );
}
else
{
mFieldButton = nullptr;
}
mMergeFieldCombo = new QComboBox();
mMergeFieldCombo->addItem( tr("Merge key...") );
mMergeFieldCombo->setMinimumSize( 34, 34 );
mMergeFieldCombo->setFrame( false );
mMergeFieldCombo->setEnabled( false );
connect( mMergeFieldCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onComboIndexChanged(int)) );
vLayout->addWidget( mMergeFieldCombo );
// Item 0 is the ComboBox title, not an item intended for selection. So disable it.
const auto* model = qobject_cast<const QStandardItemModel*>(mMergeFieldCombo->model());
QStandardItem* item = model->item(0);
item->setFlags( item->flags() & ~(Qt::ItemIsSelectable|Qt::ItemIsEnabled) );
setLayout( vLayout );
loadCustomColorHistory();
@@ -183,41 +196,47 @@ namespace glabels
}
void ColorPaletteDialog::setKeys( const QStringList& keyList )
void ColorPaletteDialog::setKeys( const merge::Merge* merge,
const model::Variables* variables )
{
mKeys = keyList;
// Clear old keys, (all entries, except item 0)
for ( int index = mMergeFieldCombo->count()-1; index > 0; index-- )
if (mFieldButton)
{
mMergeFieldCombo->removeItem( index );
}
// Add new keys
if ( keyList.size() > 0 )
{
mMergeFieldCombo->addItems( keyList );
mMergeFieldCombo->setEnabled( true );
}
else
{
mMergeFieldCombo->setEnabled( false );
mFieldButton->setKeys( merge, variables );
}
}
void ColorPaletteDialog::clearKeys()
void ColorPaletteDialog::onPaletteItemActivated( int id )
{
for ( int index = mMergeFieldCombo->count()-1; index > 0; index-- )
model::ColorNode newColorNode;
newColorNode.setField( false );
newColorNode.setColor( QColor( mColorTable[id].colorSpec ) );
newColorNode.setKey( "" );
if ( newColorNode != mColorNode )
{
mMergeFieldCombo->removeItem( index );
mColorNode = newColorNode;
mColorHistory->addColor( mColorNode.color(), mColorTable[id].trname );
emit colorChanged( mColorNode, false );
accept();
}
mMergeFieldCombo->setEnabled( false );
}
void ColorPaletteDialog::onDefaultItemActivated()
void ColorPaletteDialog::onHistoryItemActivated( int id )
{
mColorNode.setField( false );
mColorNode.setColor( mColorHistory->getColors()[id] );
mColorNode.setKey( "" );
emit colorChanged( mColorNode, false );
accept();
}
void ColorPaletteDialog::onDefaultButtonClicked()
{
mColorNode.setField( false );
mColorNode.setColor( mDefaultColor );
@@ -228,29 +247,7 @@ namespace glabels
}
void ColorPaletteDialog::onPaletteItemActivated( int id )
{
mColorNode.setField( false );
mColorNode.setColor( QColor( mColorTable[id].colorSpec ) );
mColorNode.setKey( "" );
emit colorChanged( mColorNode, false );
accept();
}
void ColorPaletteDialog::onHistoryItemActivated( int id )
{
mColorNode.setField( false );
mColorNode.setColor( mColorHistory->getColor(id) );
mColorNode.setKey( "" );
emit colorChanged( mColorNode, false );
accept();
}
void ColorPaletteDialog::onCustomColorItemActivated()
void ColorPaletteDialog::onCustomColorButtonClicked()
{
QColorDialog dlg( mColorNode.color(), this );
dlg.setWindowTitle( tr("Custom Color") );
@@ -267,7 +264,10 @@ namespace glabels
{
mColorNode = newColorNode;
mColorHistory->addColor( mColorNode.color() );
// TRANSLATORS
//: %1 = color specification in hex. String must not contain a colon (:).
mColorHistory->addColor( mColorNode.color(),
QString(tr("Custom Color %1")).arg(mColorNode.color().name()) );
emit colorChanged( mColorNode, false );
accept();
@@ -284,12 +284,13 @@ namespace glabels
void ColorPaletteDialog::loadCustomColorHistory()
{
QStringList nameList = mColorHistory->getNames();
QList<QColor> colorList = mColorHistory->getColors();
int id = 0;
foreach ( QColor color, colorList )
{
mHistoryItem[id]->setColor( id, color, QString(tr("Custom color #%1").arg(id+1) ) );
mHistoryItem[id]->setColor( id, color, nameList[id] );
mHistoryItem[id]->setEnabled( true );
id++;
}
@@ -302,25 +303,14 @@ namespace glabels
}
void ColorPaletteDialog::onComboIndexChanged( int index )
void ColorPaletteDialog::onKeySelected( QString key )
{
if ( index != 0 )
{
mColorNode.setField( true );
mColorNode.setColor( QColor( 0xee, 0xee, 0xec ) );
mColorNode.setKey( mKeys[index-1] );
mColorNode.setField( true );
mColorNode.setColor( QColor( 0xee, 0xee, 0xec ) );
mColorNode.setKey( key );
emit colorChanged( mColorNode, false );
accept();
}
}
void ColorPaletteDialog::showEvent( QShowEvent* event )
{
mMergeFieldCombo->setCurrentIndex( 0 );
QDialog::showEvent( event );
emit colorChanged( mColorNode, false );
accept();
}
} // namespace glabels
+10 -13
View File
@@ -24,11 +24,10 @@
#include "ColorHistory.h"
#include "ColorPaletteItem.h"
#include "ColorPaletteButtonItem.h"
#include "FieldButton.h"
#include "model/ColorNode.h"
#include <QComboBox>
#include <QDialog>
@@ -50,6 +49,7 @@ namespace glabels
ColorPaletteDialog( const QString& defaultLabel,
const QColor& defaultColor,
const QColor& color,
bool showUseFieldButton = true,
QWidget* parent = nullptr );
@@ -64,25 +64,23 @@ namespace glabels
// Public Methods
/////////////////////////////////
public:
void setColorNode( const model::ColorNode& colorNode );
void setKeys( const QStringList& keyList );
void clearKeys();
void setColorNode( const model::ColorNode& colorNode );
void setKeys( const merge::Merge* merge,
const model::Variables* variables );
/////////////////////////////////
// Slots
/////////////////////////////////
private slots:
void onDefaultItemActivated();
void onPaletteItemActivated( int id );
void onHistoryItemActivated( int id );
void onCustomColorItemActivated();
void onDefaultButtonClicked();
void onCustomColorButtonClicked();
void onKeySelected( QString key );
void onColorHistoryChanged();
void onComboIndexChanged( int index );
protected:
void showEvent( QShowEvent* event ) override;
/////////////////////////////////
// Private Methods
@@ -111,8 +109,7 @@ namespace glabels
ColorHistory* mColorHistory;
ColorPaletteItem* mHistoryItem[PALETTE_COLS];
QComboBox* mMergeFieldCombo;
QStringList mKeys;
FieldButton* mFieldButton;
};
+220
View File
@@ -0,0 +1,220 @@
/* EditVariableDialog.cpp
*
* Copyright (C) 2019 Jim Evins <evins@snaught.com>
*
* This file is part of gLabels-qt.
*
* gLabels-qt is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* gLabels-qt is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with gLabels-qt. If not, see <http://www.gnu.org/licenses/>.
*/
#include "EditVariableDialog.h"
#include "model/Settings.h"
#include <QPushButton>
namespace
{
// All variable types. (must be in sorted order)
const QVector<glabels::model::Variable::Type> allTypes = {
glabels::model::Variable::Type::STRING,
glabels::model::Variable::Type::INTEGER,
glabels::model::Variable::Type::FLOATING_POINT,
glabels::model::Variable::Type::COLOR
};
// All variable increments. (must be in sorted order)
const QVector<glabels::model::Variable::Increment> allIncrements = {
glabels::model::Variable::Increment::NEVER,
glabels::model::Variable::Increment::PER_ITEM,
glabels::model::Variable::Increment::PER_COPY,
glabels::model::Variable::Increment::PER_PAGE
};
}
namespace glabels
{
///
/// Constructor
///
EditVariableDialog::EditVariableDialog( QWidget *parent )
: QDialog(parent)
{
setupUi( this );
QRegularExpression reIdentifier( "[a-zA-Z_][a-zA-Z_0-9]*" );
nameEdit->setValidator( new QRegularExpressionValidator( reIdentifier ) );
colorValueButton->init( tr("Default"),
QColor(0,0,0,255),
QColor(0,0,0,255),
false );
for ( auto type : allTypes )
{
typeCombo->addItem( model::Variable::typeToI18nString( type ) );
}
for ( auto type : allIncrements )
{
incrementCombo->addItem( model::Variable::incrementToI18nString( type ) );
}
stepSizeEdit->setText( "1" );
}
///
/// Set variable
///
void EditVariableDialog::setVariable( const model::Variable& variable )
{
typeCombo->setCurrentIndex( static_cast<int>(variable.type()) );
nameEdit->setText( variable.name() );
valueEdit->setText( variable.initialValue() );
colorValueButton->setColor( QColor( variable.initialValue() ) );
incrementCombo->setCurrentIndex( static_cast<int>(variable.increment()) );
stepSizeEdit->setText( variable.stepSize() );
updateControls();
}
///
/// Get variable
///
model::Variable EditVariableDialog::variable() const
{
return model::Variable( static_cast<model::Variable::Type>(typeCombo->currentIndex()),
nameEdit->text(),
valueEdit->text(),
static_cast<model::Variable::Increment>(incrementCombo->currentIndex()),
stepSizeEdit->text() );
}
///
/// nameEdit Changed
///
void EditVariableDialog::onNameEditChanged()
{
validateCurrentInputs();
}
///
/// typeCombo Changed
///
void EditVariableDialog::onTypeComboChanged()
{
updateControls();
}
///
/// valueEdit Changed
///
void EditVariableDialog::onValueEditChanged()
{
validateCurrentInputs();
}
///
/// colorValueButton Changed
///
void EditVariableDialog::onColorValueButtonChanged()
{
valueEdit->setText( colorValueButton->colorNode().color().name() );
validateCurrentInputs();
}
///
/// incrementCombo Changed
///
void EditVariableDialog::onIncrementComboChanged()
{
updateControls();
}
///
/// stepSizeEdit Changed
///
void EditVariableDialog::onStepSizeEditChanged()
{
validateCurrentInputs();
}
///
/// update controls
///
void EditVariableDialog::updateControls()
{
auto type = static_cast<model::Variable::Type>(typeCombo->currentIndex());
auto increment = static_cast<model::Variable::Increment>(incrementCombo->currentIndex());
switch (type)
{
case model::Variable::Type::INTEGER:
valueEdit->setValidator( new QIntValidator() );
stepSizeEdit->setValidator( new QIntValidator() );
break;
case model::Variable::Type::FLOATING_POINT:
valueEdit->setValidator( new QDoubleValidator() );
stepSizeEdit->setValidator( new QDoubleValidator() );
break;
default:
valueEdit->setValidator( nullptr );
stepSizeEdit->setValidator( nullptr );
break;
}
colorValueButton->setVisible( type == model::Variable::Type::COLOR );
bool isNumeric = ( type == model::Variable::Type::INTEGER ) ||
( type == model::Variable::Type::FLOATING_POINT );
incrementGroup->setVisible( isNumeric );
stepSizeLabel->setEnabled( isNumeric && (increment != model::Variable::Increment::NEVER) );
stepSizeEdit->setEnabled( isNumeric && (increment != model::Variable::Increment::NEVER) );
validateCurrentInputs();
}
///
/// validate current inputs
///
void EditVariableDialog::validateCurrentInputs()
{
bool hasValidIdentifier = nameEdit->hasAcceptableInput();
bool hasValidValue = valueEdit->hasAcceptableInput();
bool hasValidStepSize = stepSizeEdit->hasAcceptableInput();
bool isValid = hasValidIdentifier && hasValidValue && hasValidStepSize;
buttonBox->button(QDialogButtonBox::Ok)->setEnabled( isValid );
}
} // namespace glabels
@@ -1,6 +1,6 @@
/* ColorPaletteButtonItem.h
/* EditVariableDialog.h
*
* Copyright (C) 2014 Jim Evins <evins@snaught.com>
* Copyright (C) 2019 Jim Evins <evins@snaught.com>
*
* This file is part of gLabels-qt.
*
@@ -18,21 +18,21 @@
* along with gLabels-qt. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef ColorPaletteButtonItem_h
#define ColorPaletteButtonItem_h
#ifndef EditVariableDialog_h
#define EditVariableDialog_h
#include <QColor>
#include <QWidget>
#include "ui_EditVariableDialog.h"
#include "model/Variable.h"
namespace glabels
{
///
/// Color Palette Item
/// New Label Dialog Widget
///
class ColorPaletteButtonItem : public QWidget
class EditVariableDialog : public QDialog, public Ui_EditVariableDialog
{
Q_OBJECT
@@ -40,36 +40,37 @@ namespace glabels
// Life Cycle
/////////////////////////////////
public:
ColorPaletteButtonItem( const QString& text, QWidget* parent = nullptr );
EditVariableDialog( QWidget *parent = nullptr );
/////////////////////////////////
// Signals
// Public methods
/////////////////////////////////
signals:
void activated();
void setVariable( const model::Variable& variable );
model::Variable variable() const;
/////////////////////////////////
// Event handlers
// Slots
/////////////////////////////////
protected:
void paintEvent( QPaintEvent* event ) override;
void enterEvent( QEvent* event ) override;
void leaveEvent( QEvent* event ) override;
void mousePressEvent( QMouseEvent* event ) override;
private slots:
void onNameEditChanged();
void onTypeComboChanged();
void onValueEditChanged();
void onColorValueButtonChanged();
void onIncrementComboChanged();
void onStepSizeEditChanged();
/////////////////////////////////
// Private Data
// Private methods
/////////////////////////////////
private:
QString mText;
void updateControls();
void validateCurrentInputs();
bool mHover;
};
}
#endif // ColorPaletteButtonItem_h
#endif // EditVariableDialog_h
+38 -56
View File
@@ -1,6 +1,6 @@
/* FieldButton.cpp
*
* Copyright (C) 2014-2016 Jim Evins <evins@snaught.com>
* Copyright (C) 2019 Jim Evins <evins@snaught.com>
*
* This file is part of gLabels-qt.
*
@@ -30,79 +30,61 @@ namespace glabels
///
/// Constructor
///
FieldButton::FieldButton( QWidget* parent )
: QComboBox(parent)
FieldButton::FieldButton( QWidget* parent ) : QPushButton(parent)
{
setEnabled( false );
connect( this, SIGNAL(currentIndexChanged(int)), this, SLOT(onIndexChanged(int)) );
setMenu( &mMenu );
connect( &mMenu, SIGNAL(triggered(QAction*)),
this, SLOT(onMenuActionTriggered(QAction*)) );
}
void FieldButton::setName( const QString& name )
{
mName = name;
if ( count() == 0 )
{
addItem( mName );
}
else
{
setItemText( 0, mName );
}
// Item 0 is the ComboBox title, not an item intended for selection. So disable it.
const auto* itemModel = qobject_cast<const QStandardItemModel*>(model());
QStandardItem* item = itemModel->item(0);
item->setFlags( item->flags() & ~(Qt::ItemIsSelectable|Qt::ItemIsEnabled) );
}
void FieldButton::setKeys( const QStringList& keyList )
///
/// Set Keys
///
void FieldButton::setKeys( const merge::Merge* merge,
const model::Variables* variables )
{
// Clear old keys
clear();
addItem( mName );
mMenu.clear();
// Add merge keys, if any
mMenu.addSection( tr("Merge fields") );
for ( auto& key : merge->keys() )
{
auto* action = mMenu.addAction( QString( "${%1}" ).arg( key ) );
action->setData( key );
}
if ( merge->keys().empty() )
{
auto* action = mMenu.addAction( "None" );
action->setEnabled( false );
}
// Item 0 is the ComboBox title, not an item intended for selection. So disable it.
const auto* itemModel = qobject_cast<const QStandardItemModel*>(model());
QStandardItem* item = itemModel->item(0);
item->setFlags( item->flags() & ~(Qt::ItemIsSelectable|Qt::ItemIsEnabled) );
// Add new keys
if ( keyList.size() > 0 )
// Add variable keys, if any
mMenu.addSection( tr("Variables") );
for ( auto& key : variables->keys() )
{
addItems( keyList );
setEnabled( true );
auto* action = mMenu.addAction( QString( "${%1}" ).arg( key ) );
action->setData( key );
}
else
if ( variables->keys().empty() )
{
setEnabled( false );
auto* action = mMenu.addAction( "None" );
action->setEnabled( false );
}
setEnabled( !merge->keys().empty() || !variables->keys().empty() );
}
void FieldButton::clearKeys()
{
clear();
addItem( mName );
setEnabled( false );
}
///
/// onMenuKeySelected slot
/// onMenuActionTriggered slot
///
void FieldButton::onIndexChanged( int index )
void FieldButton::onMenuActionTriggered( QAction* action )
{
if ( index > 0 )
{
emit keySelected( itemText(index) );
setCurrentIndex( 0 );
}
emit keySelected( action->data().toString() );
}
} // namespace glabels
+13 -9
View File
@@ -1,6 +1,6 @@
/* FieldButton.h
*
* Copyright (C) 2014-2016 Jim Evins <evins@snaught.com>
* Copyright (C) 2019 Jim Evins <evins@snaught.com>
*
* This file is part of gLabels-qt.
*
@@ -22,8 +22,13 @@
#define FieldButton_h
#include <QComboBox>
#include <QString>
#include "model/Variables.h"
#include "merge/Merge.h"
#include <QAction>
#include <QPushButton>
#include <QMenu>
#include <QStringList>
namespace glabels
@@ -32,7 +37,7 @@ namespace glabels
///
/// Field Button
///
class FieldButton : public QComboBox
class FieldButton : public QPushButton
{
Q_OBJECT
@@ -54,23 +59,22 @@ namespace glabels
// Public Methods
/////////////////////////////////
public:
void setName( const QString& name = "" );
void setKeys( const QStringList& keyList );
void clearKeys();
void setKeys( const merge::Merge* merge,
const model::Variables* variables );
/////////////////////////////////
// Slots
/////////////////////////////////
private slots:
void onIndexChanged( int index );
void onMenuActionTriggered( QAction* action );
/////////////////////////////////
// Private Data
/////////////////////////////////
private:
QString mName;
QMenu mMenu;
};
+2 -5
View File
@@ -112,8 +112,6 @@ namespace glabels
model::Model *model = model::XmlLabelParser::readFile( fileName );
if ( model )
{
model->setFileName( fileName );
// Either apply to current window or open a new one
if ( window->isEmpty() )
{
@@ -152,8 +150,6 @@ namespace glabels
model::Model *model = model::XmlLabelParser::readFile( fileName );
if ( model )
{
model->setFileName( fileName );
// Either apply to current window or open a new one
if ( window->isEmpty() )
{
@@ -213,7 +209,8 @@ namespace glabels
///
bool File::saveAs( MainWindow *window )
{
// Either use the saved CWD from a previous open/save or grab it from the path of the current file
// Either use the saved CWD from a previous open/save or grab it from the path
// of the current file.
QString cwd = mCwd;
if ( window->model() && !window->model()->fileName().isEmpty() )
{
+10
View File
@@ -473,6 +473,16 @@ namespace glabels
};
class Variables : public QIcon
{
public:
Variables()
{
addPixmap( QPixmap( ":icons/flat/48x48/glabels-variables.svg" ) );
}
};
class ZoomBestFit : public QIcon
{
public:
+6 -1
View File
@@ -469,6 +469,10 @@ namespace glabels
mResizeObject = handle->owner();
mResizeHandle = handle;
mResizeHonorAspect = event->modifiers() & Qt::ControlModifier;
if ( mResizeObject->lockAspectRatio() )
{
mResizeHonorAspect = !mResizeHonorAspect;
}
mState = ArrowResize;
}
@@ -657,6 +661,7 @@ namespace glabels
break;
case ArrowResize:
mUndoRedoModel->checkpoint( tr("Resize") );
handleResizeMotion( xWorld, yWorld );
break;
@@ -1157,7 +1162,7 @@ namespace glabels
void
LabelEditor::drawObjectsLayer( QPainter* painter )
{
mModel->draw( painter );
mModel->draw( painter, true, nullptr, nullptr );
}
+96 -7
View File
@@ -31,6 +31,7 @@
#include "PropertiesView.h"
#include "StartupView.h"
#include "UndoRedoModel.h"
#include "VariablesView.h"
#include "model/Db.h"
#include "model/Model.h"
@@ -51,7 +52,8 @@ namespace
EDITOR_PAGE_INDEX = 1,
PROPERTIES_PAGE_INDEX = 2,
MERGE_PAGE_INDEX = 3,
PRINT_PAGE_INDEX = 4,
VARIABLES_PAGE_INDEX = 4,
PRINT_PAGE_INDEX = 5,
};
}
@@ -62,7 +64,7 @@ namespace glabels
///
/// Constructor
///
MainWindow::MainWindow() : mModel(nullptr)
MainWindow::MainWindow() : mModel(nullptr), mUndoRedoModel(nullptr)
{
setWindowIcon( Icons::Glabels() );
@@ -76,6 +78,7 @@ namespace glabels
QWidget* editorPage = createEditorPage();
QWidget* propertiesPage = createPropertiesPage();
QWidget* mergePage = createMergePage();
QWidget* variablesPage = createVariablesPage();
QWidget* printPage = createPrintPage();
// Table of contents widget
@@ -141,6 +144,18 @@ namespace glabels
mMergeAction = mContents->addWidget( mMergeButton );
group->addButton( mMergeButton );
// Add "Variables" page
mPages->addWidget( variablesPage );
mVariablesButton = new QToolButton( this );
mVariablesButton->setIcon( Icons::Variables() );
mVariablesButton->setText( tr("Variables") );
mVariablesButton->setToolButtonStyle( Qt::ToolButtonTextUnderIcon );
mVariablesButton->setCheckable( true );
mVariablesButton->setSizePolicy( QSizePolicy::MinimumExpanding,
QSizePolicy::Preferred );
mVariablesAction = mContents->addWidget( mVariablesButton );
group->addButton( mVariablesButton );
// Add "Print" page
mPages->addWidget( printPage );
mPrintButton = new QToolButton( this );
@@ -175,6 +190,7 @@ namespace glabels
connect( mEditorButton, SIGNAL(toggled(bool)), this, SLOT(changePage(bool)));
connect( mPropertiesButton, SIGNAL(toggled(bool)), this, SLOT(changePage(bool)));
connect( mMergeButton, SIGNAL(toggled(bool)), this, SLOT(changePage(bool)));
connect( mVariablesButton, SIGNAL(toggled(bool)), this, SLOT(changePage(bool)));
connect( mPrintButton, SIGNAL(toggled(bool)), this, SLOT(changePage(bool)));
connect( mLabelEditor, SIGNAL(zoomChanged()), this, SLOT(onZoomChanged()) );
connect( model::Settings::instance(), SIGNAL(changed()), this, SLOT(onSettingsChanged()) );
@@ -194,7 +210,16 @@ namespace glabels
///
MainWindow::~MainWindow()
{
// empty
if ( mUndoRedoModel )
{
delete mUndoRedoModel;
}
if ( mModel )
{
delete mModel->merge(); // Ownership of final Merge instance is ours
delete mModel->variables(); // Ownership of Variables instance is ours
delete mModel;
}
}
@@ -212,13 +237,14 @@ namespace glabels
///
void MainWindow::setModel( model::Model* model )
{
mModel = model;
mModel = model; // Ownership passes to us
mUndoRedoModel = new UndoRedoModel( mModel );
mPropertiesView->setModel( mModel, mUndoRedoModel );
mLabelEditor->setModel( mModel, mUndoRedoModel );
mObjectEditor->setModel( mModel, mUndoRedoModel );
mMergeView->setModel( mModel , mUndoRedoModel );
mMergeView->setModel( mModel, mUndoRedoModel );
mVariablesView->setModel( mModel, mUndoRedoModel );
mPrintView->setModel( mModel );
mEditorButton->setChecked( true );
@@ -315,6 +341,11 @@ namespace glabels
fileShowMergePageAction->setStatusTip( tr("Select project Merge mode") );
connect( fileShowMergePageAction, SIGNAL(triggered()), this, SLOT(fileShowMergePage()) );
fileShowVariablesPageAction = new QAction( tr("&Variables") , this );
fileShowVariablesPageAction->setShortcut( QKeySequence( Qt::CTRL + Qt::Key_4 ) );
fileShowVariablesPageAction->setStatusTip( tr("Select project Variables mode") );
connect( fileShowVariablesPageAction, SIGNAL(triggered()), this, SLOT(fileShowVariablesPage()) );
fileShowPrintPageAction = new QAction( tr("&Print") , this );
fileShowPrintPageAction->setShortcut( QKeySequence::Print );
fileShowPrintPageAction->setStatusTip( tr("Select project Print mode") );
@@ -603,6 +634,7 @@ namespace glabels
fileMenu->addAction( fileShowEditorPageAction );
fileMenu->addAction( fileShowPropertiesPageAction );
fileMenu->addAction( fileShowMergePageAction );
fileMenu->addAction( fileShowVariablesPageAction );
fileMenu->addAction( fileShowPrintPageAction );
fileMenu->addSeparator();
fileMenu->addAction( fileTemplateDesignerAction );
@@ -815,6 +847,17 @@ namespace glabels
}
///
/// Create Variables Page
///
QWidget* MainWindow::createVariablesPage()
{
mVariablesView = new VariablesView();
return mVariablesView;
}
///
/// Create Print Page
///
@@ -839,6 +882,7 @@ namespace glabels
bool isEditorPage = mEditorButton->isChecked();
bool isPropertiesPage = mPropertiesButton->isChecked();
bool isMergePage = mMergeButton->isChecked();
bool isVariablesPage = mVariablesButton->isChecked();
bool isPrintPage = mPrintButton->isChecked();
// What is the current selection state?
@@ -851,6 +895,7 @@ namespace glabels
mEditorAction->setVisible( !isWelcomePage );
mPropertiesAction->setVisible( !isWelcomePage );
mMergeAction->setVisible( !isWelcomePage );
mVariablesAction->setVisible( !isWelcomePage );
mPrintAction->setVisible( !isWelcomePage );
// Recent file actions
@@ -876,14 +921,45 @@ namespace glabels
fileShowEditorPageAction->setEnabled( !isWelcomePage && !isEditorPage );
fileShowPropertiesPageAction->setEnabled( !isWelcomePage && !isPropertiesPage );
fileShowMergePageAction->setEnabled( !isWelcomePage && !isMergePage );
fileShowVariablesPageAction->setEnabled( !isWelcomePage && !isVariablesPage );
fileShowPrintPageAction->setEnabled( !isWelcomePage && !isPrintPage );
fileTemplateDesignerAction->setEnabled( true );
fileCloseAction->setEnabled( true );
fileExitAction->setEnabled( true );
// Edit actions
editUndoAction->setEnabled( hasModel && mUndoRedoModel->canUndo() );
editRedoAction->setEnabled( hasModel && mUndoRedoModel->canRedo() );
if ( hasModel )
{
if ( mUndoRedoModel->canUndo() )
{
editUndoAction->setEnabled( true );
/* Translators: %1 is the action description to undo. */
editUndoAction->setText( QString( tr("Undo %1") ).arg( mUndoRedoModel->undoDescription() ) );
}
else
{
editUndoAction->setEnabled( false );
editUndoAction->setText( tr("Undo") );
}
if ( mUndoRedoModel->canRedo() )
{
editRedoAction->setEnabled( true );
/* Translators: %1 is the action description to redo. */
editRedoAction->setText( QString( tr("Redo %1") ).arg( mUndoRedoModel->redoDescription() ) );
}
else
{
editRedoAction->setEnabled( false );
editRedoAction->setText( tr("Redo") );
}
}
else
{
editUndoAction->setEnabled( false );
editUndoAction->setText( tr("Undo") );
editRedoAction->setEnabled( false );
editRedoAction->setText( tr("Redo") );
}
editCutAction->setEnabled( isEditorPage && hasSelection );
editCopyAction->setEnabled( isEditorPage && hasSelection );
editPasteAction->setEnabled( isEditorPage && canPaste );
@@ -1072,6 +1148,10 @@ namespace glabels
{
mPages->setCurrentIndex( MERGE_PAGE_INDEX );
}
else if ( mVariablesButton->isChecked() )
{
mPages->setCurrentIndex( VARIABLES_PAGE_INDEX );
}
else if ( mPrintButton->isChecked() )
{
mPages->setCurrentIndex( PRINT_PAGE_INDEX );
@@ -1168,6 +1248,15 @@ namespace glabels
}
///
/// File->Show Variables Page
///
void MainWindow::fileShowVariablesPage()
{
mVariablesButton->setChecked( true );
}
///
/// File->Show Print Page
///
+7
View File
@@ -47,6 +47,7 @@ namespace glabels
class PropertiesView;
class StartupView;
class UndoRedoModel;
class VariablesView;
///
@@ -97,6 +98,7 @@ namespace glabels
void fileShowEditorPage();
void fileShowPropertiesPage();
void fileShowMergePage();
void fileShowVariablesPage();
void fileShowPrintPage();
void fileTemplateDesigner();
void fileClose();
@@ -175,6 +177,7 @@ namespace glabels
QWidget* createEditorPage();
QWidget* createPropertiesPage();
QWidget* createMergePage();
QWidget* createVariablesPage();
QWidget* createPrintPage();
void manageActions();
@@ -222,12 +225,14 @@ namespace glabels
QToolButton* mEditorButton;
QToolButton* mPropertiesButton;
QToolButton* mMergeButton;
QToolButton* mVariablesButton;
QToolButton* mPrintButton;
QAction* mWelcomeAction;
QAction* mEditorAction;
QAction* mPropertiesAction;
QAction* mMergeAction;
QAction* mVariablesAction;
QAction* mPrintAction;
QStackedWidget* mPages;
@@ -237,6 +242,7 @@ namespace glabels
ObjectEditor* mObjectEditor;
PropertiesView* mPropertiesView;
MergeView* mMergeView;
VariablesView* mVariablesView;
PrintView* mPrintView;
QLabel* zoomInfoLabel;
@@ -249,6 +255,7 @@ namespace glabels
QAction* fileShowEditorPageAction;
QAction* fileShowPropertiesPageAction;
QAction* fileShowMergePageAction;
QAction* fileShowVariablesPageAction;
QAction* fileShowPrintPageAction;
QAction* fileTemplateDesignerAction;
QAction* fileCloseAction;
+13 -21
View File
@@ -22,6 +22,8 @@
#include "merge/Factory.h"
#include "model/FileUtil.h"
#include <QFileDialog>
#include <QFileInfo>
#include <QtDebug>
@@ -63,14 +65,7 @@ namespace glabels
mUndoRedoModel = undoRedoModel;
// Initialize CWD
if ( model->fileName().isEmpty() )
{
mCwd = ".";
}
else
{
mCwd = QFileInfo( model->fileName() ).absolutePath();
}
mCwd = mModel->dirPath();
onMergeChanged();
connect( mModel, SIGNAL(mergeChanged()), this, SLOT(onMergeChanged()) );
@@ -87,26 +82,22 @@ namespace glabels
mOldFormatComboIndex = index;
formatCombo->setCurrentIndex( index );
QString fn;
switch ( merge::Factory::idToType( mModel->merge()->id() ) )
{
case merge::Factory::NONE:
case merge::Factory::FIXED:
locationLabel->setEnabled( false );
locationButton->setEnabled( false );
locationButton->setText( "" );
locationLineEdit->setText( "" );
locationBrowseButton->setVisible( false );
break;
case merge::Factory::FILE:
locationLabel->setEnabled( true );
locationButton->setEnabled( true );
if ( mModel->merge()->source().isEmpty() )
{
locationButton->setText( "Select file..." );
}
else
{
locationButton->setText( mModel->merge()->source() );
}
fn = model::FileUtil::makeRelativeIfInDir( mModel->dir(), mModel->merge()->source() );
locationLineEdit->setText( fn );
locationBrowseButton->setVisible( true );
break;
default:
@@ -135,7 +126,8 @@ namespace glabels
///
void MergeView::onMergeSourceChanged()
{
locationButton->setText( mModel->merge()->source() );
QString fn = model::FileUtil::makeRelativeIfInDir( mModel->dir(), mModel->merge()->source() );
locationLineEdit->setText( fn );
recordsTable->clear();
recordsTable->setColumnCount( 0 );
@@ -185,7 +177,7 @@ namespace glabels
///
/// Location button clicked handler
///
void MergeView::onLocationButtonClicked()
void MergeView::onLocationBrowseButtonClicked()
{
QString fileName =
QFileDialog::getOpenFileName( this,
+1 -1
View File
@@ -67,7 +67,7 @@ namespace glabels
void onMergeSelectionChanged();
void onFormatComboActivated();
void onLocationButtonClicked();
void onLocationBrowseButtonClicked();
void onSelectAllButtonClicked();
void onUnselectAllButtonClicked();
void onCellChanged( int iRow, int iCol );
+38 -20
View File
@@ -30,12 +30,14 @@
#include "model/ModelImageObject.h"
#include "model/ModelLineObject.h"
#include "model/ModelTextObject.h"
#include "model/FileUtil.h"
#include "model/Settings.h"
#include "model/Size.h"
#include "merge/Merge.h"
#include <QFileDialog>
#include <QDir>
#include <QtMath>
#include <QtDebug>
@@ -67,9 +69,9 @@ namespace glabels
barcodeColorButton->init( tr("Default"), QColor(0,0,0,255), QColor(0,0,0,255) );
shadowColorButton->init( tr("Default"), QColor(0,0,0,255), QColor(0,0,0,255) );
textInsertFieldCombo->setName( tr("Insert Field") );
barcodeInsertFieldCombo->setName( tr("Insert Field") );
imageFieldCombo->setName( tr("Key") );
textInsertFieldButton->setText( tr("Insert substitution field") );
barcodeInsertFieldButton->setText( tr("Insert substitution field") );
imageFieldButton->setText( tr("Use substitution field") );
setEnabled( false );
hidePages();
@@ -93,11 +95,14 @@ namespace glabels
this, SLOT(onSelectionChanged()) );
connect( mModel, SIGNAL(mergeSourceChanged()),
this, SLOT(onMergeSourceChanged()) );
this, SLOT(onFieldsAvailableChanged()) );
connect( mModel, SIGNAL(variablesChanged()),
this, SLOT(onFieldsAvailableChanged()) );
onLabelSizeChanged();
onSelectionChanged();
onMergeSourceChanged();
onFieldsAvailableChanged();
}
@@ -122,12 +127,12 @@ namespace glabels
if ( filenameNode.isField() )
{
QString field = QString("${%1}").arg( filenameNode.data() );
imageFilenameLineEdit->setText( field );
imageFilenameLineEdit->setText( QString("${%1}").arg(filenameNode.data()) );
}
else
{
imageFilenameLineEdit->setText( filenameNode.data() );
QString fn = model::FileUtil::makeRelativeIfInDir( mModel->dir(), filenameNode.data() );
imageFilenameLineEdit->setText( fn );
}
mBlocked = false;
@@ -188,6 +193,7 @@ namespace glabels
sizeWSpin->setValue( mObject->w().inUnits(mUnits) );
sizeHSpin->setValue( mObject->h().inUnits(mUnits) );
sizeAspectCheck->setChecked( mObject->lockAspectRatio() );
model::Size originalSize = mObject->naturalSize();
QString originalSizeString = QString( "%1: %2 x %3 %4" )
@@ -454,8 +460,8 @@ namespace glabels
loadTextPage();
loadPositionPage();
loadRectSizePage();
loadShadowPage();
loadRectSizePage();
setEnabled( true );
}
@@ -473,6 +479,7 @@ namespace glabels
loadBarcodePage();
loadPositionPage();
loadRectSizePage();
setEnabled( true );
}
@@ -497,17 +504,19 @@ namespace glabels
}
void ObjectEditor::onMergeSourceChanged()
void ObjectEditor::onFieldsAvailableChanged()
{
if ( !mBlocked )
{
QStringList keys = mModel->merge()->keys();
lineColorButton->setKeys( keys );
fillColorButton->setKeys( keys );
textInsertFieldCombo->setKeys( keys );
barcodeInsertFieldCombo->setKeys( keys );
imageFieldCombo->setKeys( keys );
shadowColorButton->setKeys( keys );
lineColorButton->setKeys( mModel->merge(), mModel->variables() );
fillColorButton->setKeys( mModel->merge(), mModel->variables() );
textColorButton->setKeys( mModel->merge(), mModel->variables() );
barcodeColorButton->setKeys( mModel->merge(), mModel->variables() );
shadowColorButton->setKeys( mModel->merge(), mModel->variables() );
textInsertFieldButton->setKeys( mModel->merge(), mModel->variables() );
barcodeInsertFieldButton->setKeys( mModel->merge(), mModel->variables() );
imageFieldButton->setKeys( mModel->merge(), mModel->variables() );
}
}
@@ -618,8 +627,11 @@ namespace glabels
void ObjectEditor::onImageKeySelected( QString key )
{
mUndoRedoModel->checkpoint( tr("Set image") );
mObject->setFilenameNode( model::TextNode( true, key ) );
if ( mObject )
{
mUndoRedoModel->checkpoint( tr("Set image") );
mObject->setFilenameNode( model::TextNode( true, key ) );
}
}
@@ -629,7 +641,7 @@ namespace glabels
{
mBlocked = true;
mUndoRedoModel->checkpoint( tr("Move") );
mUndoRedoModel->checkpoint( tr("Position") );
model::Distance x = model::Distance(posXSpin->value(), mUnits);
model::Distance y = model::Distance(posYSpin->value(), mUnits);
@@ -654,6 +666,7 @@ namespace glabels
if ( sizeAspectCheck->isChecked() )
{
mObject->setLockAspectRatio( true );
if ( fabs(spinW - mObject->w()) > fabs(spinH - mObject->h()) )
{
mObject->setWHonorAspect( spinW );
@@ -667,6 +680,7 @@ namespace glabels
}
else
{
mObject->setLockAspectRatio( false );
mObject->setSize( spinW, spinH );
}
@@ -740,6 +754,8 @@ namespace glabels
{
mBlocked = true;
mUndoRedoModel->checkpoint( tr("Barcode") );
barcode::Style bcStyle = barcodeStyleButton->bcStyle();
barcodeShowTextCheck->setEnabled( bcStyle.textOptional() );
@@ -774,6 +790,8 @@ namespace glabels
void ObjectEditor::onResetImageSize()
{
mUndoRedoModel->checkpoint( tr("Reset") );
mObject->setSize( mObject->naturalSize() );
}
+1 -1
View File
@@ -80,7 +80,7 @@ namespace glabels
void onSettingsChanged();
void onLabelSizeChanged();
void onSelectionChanged();
void onMergeSourceChanged();
void onFieldsAvailableChanged();
void onObjectChanged();
void onObjectMoved();
void onObjectDestroyed();
+6 -2
View File
@@ -70,6 +70,9 @@ namespace glabels
connect( mModel, SIGNAL(changed()), this, SLOT(onModelChanged()) );
copiesSpin->setRange( 1, 100*mModel->frame()->nLabels() );
copiesStartSpin->setRange( 1, mModel->frame()->nLabels() );
onFormChanged();
}
@@ -79,6 +82,9 @@ namespace glabels
///
void PrintView::onModelChanged()
{
copiesSpin->setRange( 1, 100*mModel->frame()->nLabels() );
copiesStartSpin->setRange( 1, mModel->frame()->nLabels() );
updateView();
}
@@ -88,8 +94,6 @@ namespace glabels
///
void PrintView::updateView()
{
copiesStartSpin->setRange( 1, mModel->frame()->nLabels() );
if ( mRenderer.nPages() == 1 )
{
if ( mRenderer.nItems() == 1 )
+254
View File
@@ -0,0 +1,254 @@
/* VariablesView.cpp
*
* Copyright (C) 2016 Jim Evins <evins@snaught.com>
*
* This file is part of gLabels-qt.
*
* gLabels-qt is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* gLabels-qt is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with gLabels-qt. If not, see <http://www.gnu.org/licenses/>.
*/
#include "VariablesView.h"
#include "EditVariableDialog.h"
#include <QTableWidgetItem>
#include <QtDebug>
namespace
{
enum ICol {
I_COL_NAME,
I_COL_TYPE,
I_COL_VALUE,
I_COL_INCREMENT,
I_COL_STEP_SIZE,
I_COL_DUMMY,
N_COLS
};
}
namespace glabels
{
///
/// Constructor
///
VariablesView::VariablesView( QWidget *parent )
: QWidget(parent), mModel(nullptr), mUndoRedoModel(nullptr)
{
setupUi( this );
titleLabel->setText( QString( "<span style='font-size:18pt;'>%1</span>" ).arg( tr("Variables") ) );
table->setColumnCount( N_COLS );
auto* nameHeaderItem = new QTableWidgetItem( tr("Name") );
nameHeaderItem->setFlags( nameHeaderItem->flags() ^ Qt::ItemIsEditable );
table->setHorizontalHeaderItem( I_COL_NAME, nameHeaderItem );
auto* typeHeaderItem = new QTableWidgetItem( tr("Type") );
typeHeaderItem->setFlags( typeHeaderItem->flags() ^ Qt::ItemIsEditable );
table->setHorizontalHeaderItem( I_COL_TYPE, typeHeaderItem );
auto* valueHeaderItem = new QTableWidgetItem( tr("Value") );
valueHeaderItem->setFlags( valueHeaderItem->flags() ^ Qt::ItemIsEditable );
table->setHorizontalHeaderItem( I_COL_VALUE, valueHeaderItem );
auto* incrementHeaderItem = new QTableWidgetItem( tr("Increment") );
incrementHeaderItem->setFlags( incrementHeaderItem->flags() ^ Qt::ItemIsEditable );
table->setHorizontalHeaderItem( I_COL_INCREMENT, incrementHeaderItem );
auto* stepSizeHeaderItem = new QTableWidgetItem( tr("Step Size") );
stepSizeHeaderItem->setFlags( stepSizeHeaderItem->flags() ^ Qt::ItemIsEditable );
table->setHorizontalHeaderItem( I_COL_STEP_SIZE, stepSizeHeaderItem );
auto* dummyHeaderItem = new QTableWidgetItem();
dummyHeaderItem->setFlags( Qt::NoItemFlags );
table->setHorizontalHeaderItem( I_COL_DUMMY, dummyHeaderItem );
table->horizontalHeader()->setStretchLastSection( true );
}
///
/// Destructor
///
VariablesView::~VariablesView()
{
// empty
}
///
/// Set Model
///
void VariablesView::setModel( model::Model* model, UndoRedoModel* undoRedoModel )
{
mModel = model;
mUndoRedoModel = undoRedoModel;
updateControls();
loadTable();
connect( mModel, SIGNAL(variablesChanged()), this, SLOT(onVariablesChanged()) );
}
///
/// table Selection Changed
///
void VariablesView::onTableSelectionChanged()
{
updateControls();
}
///
/// addButton Clicked
///
void VariablesView::onAddButtonClicked()
{
EditVariableDialog dialog( this );
model::Variable v( model::Variable::Type::INTEGER,
"x",
"0",
model::Variable::Increment::NEVER,
"1" );
dialog.setVariable( v );
dialog.setWindowTitle( tr("Add Variable") );
if ( dialog.exec() == QDialog::Accepted )
{
mModel->variables()->addVariable( dialog.variable() );
selectVariable( dialog.variable().name() );
}
}
///
/// editButton Clicked
///
void VariablesView::onEditButtonClicked()
{
int iRow = table->selectedItems()[0]->row();
QString name = table->item( iRow, I_COL_NAME )->text();
if ( mModel->variables()->hasVariable( name ) )
{
model::Variable v = mModel->variables()->value( name );
EditVariableDialog dialog( this );
dialog.setVariable( v );
dialog.setWindowTitle( tr("Edit Variable") );
if ( dialog.exec() == QDialog::Accepted )
{
mModel->variables()->replaceVariable( name, dialog.variable() );
selectVariable( dialog.variable().name() );
}
}
}
///
/// deleteButton Clicked
///
void VariablesView::onDeleteButtonClicked()
{
int iRow = table->selectedItems()[0]->row();
QString name = table->item( iRow, I_COL_NAME )->text();
mModel->variables()->deleteVariable( name );
}
///
/// Variables Changed
///
void VariablesView::onVariablesChanged()
{
// Reload table from variables
loadTable();
}
///
/// update controls
///
void VariablesView::updateControls()
{
bool hasSelection = !table->selectedItems().isEmpty();
editButton->setEnabled( hasSelection );
deleteButton->setEnabled( hasSelection );
}
///
/// load table from variables
///
void VariablesView::loadTable()
{
table->clearContents();
table->setRowCount( mModel->variables()->size() );
int iRow = 0;
for( const auto& v : *mModel->variables() )
{
auto* typeItem = new QTableWidgetItem( model::Variable::typeToI18nString(v.type()) );
typeItem->setFlags( typeItem->flags() ^ Qt::ItemIsEditable );
table->setItem( iRow, I_COL_TYPE, typeItem );
auto* nameItem = new QTableWidgetItem( v.name() );
nameItem->setFlags( nameItem->flags() ^ Qt::ItemIsEditable );
table->setItem( iRow, I_COL_NAME, nameItem );
auto* valueItem = new QTableWidgetItem( v.initialValue() );
valueItem->setFlags( valueItem->flags() ^ Qt::ItemIsEditable );
table->setItem( iRow, I_COL_VALUE, valueItem );
auto* incrementItem = new QTableWidgetItem( model::Variable::incrementToI18nString(v.increment()) );
incrementItem->setFlags( incrementItem->flags() ^ Qt::ItemIsEditable );
table->setItem( iRow, I_COL_INCREMENT, incrementItem );
auto* stepSizeItem = new QTableWidgetItem( v.stepSize() );
stepSizeItem->setFlags( stepSizeItem->flags() ^ Qt::ItemIsEditable );
table->setItem( iRow, I_COL_STEP_SIZE, stepSizeItem );
table->showRow( iRow );
iRow++;
}
}
void VariablesView::selectVariable( const QString& name )
{
int iRow = 0;
for( const auto& v : *mModel->variables() )
{
if ( v.name() == name )
{
table->setCurrentCell( iRow, 0,
(QItemSelectionModel::Select|QItemSelectionModel::Rows) );
break;
}
iRow++;
}
}
} // namespace glabels
+91
View File
@@ -0,0 +1,91 @@
/* VariablesView.h
*
* Copyright (C) 2016 Jim Evins <evins@snaught.com>
*
* This file is part of gLabels-qt.
*
* gLabels-qt is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* gLabels-qt is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with gLabels-qt. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef VariablesView_h
#define VariablesView_h
#include "ui_VariablesView.h"
#include "model/Model.h"
namespace glabels
{
// Forward references
class UndoRedoModel;
///
/// Variables Property Editor Widget
///
class VariablesView : public QWidget, public Ui_VariablesView
{
Q_OBJECT
/////////////////////////////////
// Life Cycle
/////////////////////////////////
public:
VariablesView( QWidget *parent = nullptr );
~VariablesView() override;
/////////////////////////////////
// Public methods
/////////////////////////////////
void setModel( model::Model* model, UndoRedoModel* undoRedoModel );
/////////////////////////////////
// Slots
/////////////////////////////////
private slots:
void onTableSelectionChanged();
void onAddButtonClicked();
void onEditButtonClicked();
void onDeleteButtonClicked();
void onVariablesChanged();
/////////////////////////////////
// Private methods
/////////////////////////////////
private:
void updateControls();
void loadTable();
void selectVariable( const QString& name );
/////////////////////////////////
// Private Data
/////////////////////////////////
private:
model::Model* mModel;
UndoRedoModel* mUndoRedoModel;
};
}
#endif // VariablesView_h
+1
View File
@@ -102,6 +102,7 @@
<file>icons/flat/48x48/glabels-merge.svg</file>
<file>icons/flat/48x48/glabels-print.svg</file>
<file>icons/flat/48x48/glabels-properties.svg</file>
<file>icons/flat/48x48/glabels-variables.svg</file>
<file>icons/apps/48x48/glabels.svg</file>
<file>icons/apps/128x128/glabels.svg</file>
@@ -0,0 +1,15 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="48" height="48" >
<g transform="translate(0,-282.3)" >
<g style="fill:#333333;fill-opacity:1;stroke:none" transform="scale(0.87836138,1.1384836)" >
<path
d="M 7.9978635,276.23327 Q 6.4616456,276.08696 5.5106536,275.74558 4.584046,275.4042 4.1207422,275.13597 l 0.9266076,-2.38967 q 0.7803012,0.36576 1.8288308,0.68276 1.0485297,0.29261 2.2189814,0.29261 1.365527,0 1.901984,-0.34138 0.536457,-0.36576 0.536457,-1.12168 0,-0.43892 -0.21946,-0.75592 -0.195075,-0.31699 -0.60961,-0.56084 -0.39015,-0.26823 -0.9753763,-0.4633 -0.5852259,-0.21946 -1.3167582,-0.48769 -0.7071479,-0.24384 -1.3899114,-0.56084 -0.6827635,-0.317 -1.2192206,-0.75592 -0.536457,-0.4633 -0.8778387,-1.0973 -0.3169974,-0.65838 -0.3169974,-1.60937 0,-0.68276 0.1706909,-1.31676 0.1950753,-0.63399 0.5852259,-1.17045 0.4145349,-0.53646 1.072914,-0.92661 0.6583791,-0.41453 1.6093711,-0.63399 v -2.36529 h 2.7798227 v 2.24337 q 1.121683,0.0975 1.975137,0.34138 0.877839,0.24384 1.365527,0.43892 l -0.682763,2.51159 q -0.707148,-0.29261 -1.682524,-0.51207 -0.950992,-0.24384 -1.9751377,-0.24384 -1.1704517,0 -1.6337555,0.41453 -0.4389194,0.41454 -0.4389194,0.97538 0,0.39015 0.1463065,0.65838 0.1706909,0.24384 0.4876882,0.43892 0.3413818,0.19507 0.8046856,0.39015 0.4633038,0.17069 1.0972983,0.39015 0.950992,0.36576 1.755678,0.7803 0.804685,0.39015 1.389911,0.92661 0.585226,0.51207 0.902223,1.21922 0.341382,0.70714 0.341382,1.65814 0,0.65838 -0.195075,1.31675 -0.195075,0.634 -0.658379,1.19484 -0.43892,0.53646 -1.194836,0.95099 -0.731533,0.39015 -1.853216,0.56084 v 2.60914 H 7.9978635 Z" />
<path
d="m 20.043762,269.96647 q 1.316759,0.24385 1.8776,1.07292 0.585226,0.82907 0.585226,2.38967 v 2.75544 q 0,1.02415 0.292613,1.48745 0.292613,0.4633 1.072914,0.4633 h 2.26775 v 2.34091 h -2.535979 q -2.194597,0 -3.048051,-0.951 -0.82907,-0.95099 -0.82907,-2.75543 v -3.58451 q 0,-1.02415 -0.316997,-1.53622 -0.316998,-0.53646 -1.072914,-0.53646 h -1.316758 v -2.3409 h 1.316758 q 0.755916,0 1.072914,-0.51207 0.316997,-0.53646 0.316997,-1.53622 v -3.60889 q 0,-1.80445 0.82907,-2.75544 0.853454,-0.95099 3.048051,-0.95099 h 2.535979 v 2.3409 h -2.26775 q -0.780301,0 -1.072914,0.4633 -0.292613,0.43892 -0.292613,1.48745 v 2.75544 q 0,1.5606 -0.585226,2.38967 -0.560841,0.82907 -1.8776,1.12168 z" />
<path
d="m 33.869723,268.57656 2.340904,-3.5845 h 3.048051 l -3.70643,5.51087 q 0.585226,0.70715 1.146067,1.51184 0.560842,0.7803 1.072914,1.58498 0.512073,0.80469 0.926608,1.53622 0.414535,0.73153 0.707148,1.31676 H 36.28378 q -0.658379,-1.24361 -1.316758,-2.21898 -0.658379,-0.97538 -1.243605,-1.75568 -0.731532,0.97538 -1.316758,1.90198 -0.585226,0.92661 -1.194836,2.07268 h -3.048052 q 0.365766,-0.68277 0.82907,-1.4143 0.487688,-0.75591 0.999761,-1.51183 0.536457,-0.7803 1.097299,-1.53622 0.585225,-0.75592 1.121683,-1.43868 l -4.023428,-5.55964 h 3.145589 z" />
<path
d="m 47.500607,269.91771 q -1.316758,-0.24385 -1.901984,-1.07292 -0.585226,-0.82907 -0.585226,-2.38967 v -2.75544 q 0,-1.02414 -0.292613,-1.48745 -0.292613,-0.4633 -1.072914,-0.4633 h -2.243366 v -2.3409 h 2.511595 q 1.097298,0 1.828831,0.24384 0.755916,0.24384 1.194836,0.70715 0.463304,0.4633 0.658379,1.17045 0.195075,0.68276 0.195075,1.58499 v 3.5845 q 0,1.02415 0.316997,1.56061 0.316998,0.51207 1.072915,0.51207 h 1.341142 v 2.3409 h -1.341142 q -0.755917,0 -1.072915,0.53646 -0.316997,0.51207 -0.316997,1.51183 v 3.6089 q 0,0.90222 -0.195075,1.58498 -0.195075,0.70715 -0.658379,1.17045 -0.43892,0.46331 -1.194836,0.70715 -0.731533,0.24385 -1.828831,0.24385 h -2.511595 v -2.34091 h 2.243366 q 0.780301,0 1.072914,-0.4633 0.292613,-0.43892 0.292613,-1.48745 v -2.75544 q 0,-1.5606 0.585226,-2.38967 0.585226,-0.82907 1.901984,-1.12168 z" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 177 B

After

Width:  |  Height:  |  Size: 2.8 KiB

+1 -1
View File
@@ -45,7 +45,7 @@ int main( int argc, char **argv )
QCoreApplication::setOrganizationName( "glabels.org" );
QCoreApplication::setOrganizationDomain( "glabels.org" );
QCoreApplication::setApplicationName( "glabels-qt" );
QCoreApplication::setApplicationVersion( glabels::model::Version::STRING );
QCoreApplication::setApplicationVersion( glabels::model::Version::LONG_STRING );
//
// Setup translators
+274
View File
@@ -0,0 +1,274 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>EditVariableDialog</class>
<widget class="QDialog" name="EditVariableDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>469</width>
<height>297</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<property name="verticalSpacing">
<number>12</number>
</property>
<item row="1" column="0">
<widget class="QGroupBox" name="incrementGroup">
<property name="title">
<string>Increment</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QComboBox" name="incrementCombo"/>
</item>
<item>
<widget class="QLabel" name="stepSizeLabel">
<property name="text">
<string>Step size:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="stepSizeEdit"/>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item row="2" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0">
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Variable</string>
</property>
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="1">
<widget class="QLineEdit" name="nameEdit"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Value:</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Name:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="typeCombo"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Type:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLineEdit" name="valueEdit"/>
</item>
<item>
<widget class="glabels::ColorButton" name="colorValueButton">
<property name="text">
<string notr="true"/>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>glabels::ColorButton</class>
<extends>QPushButton</extends>
<header>ColorButton.h</header>
<slots>
<signal>colorChanged()</signal>
</slots>
</customwidget>
</customwidgets>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>EditVariableDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>236</x>
<y>287</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>236</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>EditVariableDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>304</x>
<y>287</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>236</y>
</hint>
</hints>
</connection>
<connection>
<sender>typeCombo</sender>
<signal>currentIndexChanged(int)</signal>
<receiver>EditVariableDialog</receiver>
<slot>onTypeComboChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>252</x>
<y>70</y>
</hint>
<hint type="destinationlabel">
<x>33</x>
<y>161</y>
</hint>
</hints>
</connection>
<connection>
<sender>incrementCombo</sender>
<signal>currentIndexChanged(int)</signal>
<receiver>EditVariableDialog</receiver>
<slot>onIncrementComboChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>100</x>
<y>223</y>
</hint>
<hint type="destinationlabel">
<x>97</x>
<y>176</y>
</hint>
</hints>
</connection>
<connection>
<sender>stepSizeEdit</sender>
<signal>textChanged(QString)</signal>
<receiver>EditVariableDialog</receiver>
<slot>onStepSizeEditChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>440</x>
<y>223</y>
</hint>
<hint type="destinationlabel">
<x>333</x>
<y>166</y>
</hint>
</hints>
</connection>
<connection>
<sender>nameEdit</sender>
<signal>textChanged(QString)</signal>
<receiver>EditVariableDialog</receiver>
<slot>onNameEditChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>440</x>
<y>103</y>
</hint>
<hint type="destinationlabel">
<x>393</x>
<y>165</y>
</hint>
</hints>
</connection>
<connection>
<sender>valueEdit</sender>
<signal>textChanged(QString)</signal>
<receiver>EditVariableDialog</receiver>
<slot>onValueEditChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>318</x>
<y>129</y>
</hint>
<hint type="destinationlabel">
<x>459</x>
<y>157</y>
</hint>
</hints>
</connection>
<connection>
<sender>colorValueButton</sender>
<signal>colorChanged()</signal>
<receiver>EditVariableDialog</receiver>
<slot>onColorValueButtonChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>406</x>
<y>114</y>
</hint>
<hint type="destinationlabel">
<x>458</x>
<y>122</y>
</hint>
</hints>
</connection>
</connections>
<slots>
<slot>onTypeComboChanged()</slot>
<slot>onValueEditChanged()</slot>
<slot>onIncrementComboChanged()</slot>
<slot>onStepSizeEditChanged()</slot>
<slot>onNameEditChanged()</slot>
<slot>onColorValueButtonChanged()</slot>
</slots>
</ui>
+60 -49
View File
@@ -11,12 +11,21 @@
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
<string notr="true">Form</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout">
<property name="margin">
<property name="leftMargin">
<number>12</number>
</property>
<property name="topMargin">
<number>12</number>
</property>
<property name="rightMargin">
<number>12</number>
</property>
<property name="bottomMargin">
<number>12</number>
</property>
<item>
@@ -37,16 +46,9 @@
<property name="title">
<string>Source</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_3" stretch="1">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="1">
<widget class="QPushButton" name="locationButton">
<property name="text">
<string>Location</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
@@ -54,6 +56,27 @@
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="formatCombo"/>
</item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLineEdit" name="locationLineEdit">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="locationBrowseButton">
<property name="text">
<string>Browse...</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QLabel" name="locationLabel">
<property name="text">
@@ -61,24 +84,8 @@
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="formatCombo"/>
</item>
</layout>
</item>
<item row="0" column="1">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>360</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
@@ -89,7 +96,11 @@
</property>
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">
<widget class="QTableWidget" name="recordsTable"/>
<widget class="QTableWidget" name="recordsTable">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
</widget>
</item>
<item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
@@ -138,8 +149,8 @@
<slot>onSelectAllButtonClicked()</slot>
<hints>
<hint type="sourcelabel">
<x>63</x>
<y>571</y>
<x>97</x>
<y>570</y>
</hint>
<hint type="destinationlabel">
<x>69</x>
@@ -163,22 +174,6 @@
</hint>
</hints>
</connection>
<connection>
<sender>locationButton</sender>
<signal>clicked()</signal>
<receiver>MergeView</receiver>
<slot>onLocationButtonClicked()</slot>
<hints>
<hint type="sourcelabel">
<x>174</x>
<y>93</y>
</hint>
<hint type="destinationlabel">
<x>570</x>
<y>75</y>
</hint>
</hints>
</connection>
<connection>
<sender>formatCombo</sender>
<signal>activated(int)</signal>
@@ -186,8 +181,8 @@
<slot>onFormatComboActivated()</slot>
<hints>
<hint type="sourcelabel">
<x>162</x>
<y>48</y>
<x>257</x>
<y>109</y>
</hint>
<hint type="destinationlabel">
<x>563</x>
@@ -195,11 +190,27 @@
</hint>
</hints>
</connection>
<connection>
<sender>locationBrowseButton</sender>
<signal>clicked()</signal>
<receiver>MergeView</receiver>
<slot>onLocationBrowseButtonClicked()</slot>
<hints>
<hint type="sourcelabel">
<x>296</x>
<y>130</y>
</hint>
<hint type="destinationlabel">
<x>565</x>
<y>149</y>
</hint>
</hints>
</connection>
</connections>
<slots>
<slot>onSelectAllButtonClicked()</slot>
<slot>onUnselectAllButtonClicked()</slot>
<slot>onLocationButtonClicked()</slot>
<slot>onFormatComboActivated()</slot>
<slot>onLocationBrowseButtonClicked()</slot>
</slots>
</ui>
+188 -180
View File
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>400</width>
<height>640</height>
<height>648</height>
</rect>
</property>
<property name="sizePolicy">
@@ -29,9 +29,9 @@
</size>
</property>
<property name="windowTitle">
<string>Form</string>
<string notr="true">Form</string>
</property>
<layout class="QGridLayout" name="gridLayout_5">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
@@ -579,7 +579,11 @@
</spacer>
</item>
<item>
<widget class="glabels::FieldButton" name="textInsertFieldCombo"/>
<widget class="glabels::FieldButton" name="textInsertFieldButton">
<property name="text">
<string notr="true">Insert field</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
@@ -729,7 +733,11 @@
</spacer>
</item>
<item>
<widget class="glabels::FieldButton" name="barcodeInsertFieldCombo"/>
<widget class="glabels::FieldButton" name="barcodeInsertFieldButton">
<property name="text">
<string notr="true">Insert field</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_12">
@@ -758,14 +766,27 @@
<string>Image</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_13">
<item row="0" column="0">
<item row="2" column="0">
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>646</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0">
<widget class="QGroupBox" name="groupBox_9">
<property name="title">
<string>File</string>
</property>
<layout class="QGridLayout" name="gridLayout_12">
<layout class="QGridLayout" name="gridLayout_5">
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout_5">
<layout class="QHBoxLayout" name="horizontalLayout_17">
<item>
<widget class="QLineEdit" name="imageFilenameLineEdit">
<property name="sizePolicy">
@@ -789,68 +810,47 @@
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_17" stretch="1,0,1">
<item>
<widget class="QPushButton" name="imageFileButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Select File...</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>or</string>
</property>
</widget>
</item>
<item>
<widget class="glabels::FieldButton" name="imageFieldCombo">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>Select Merge Field...</string>
</property>
</item>
</widget>
</item>
</layout>
<widget class="QPushButton" name="imageBrowseButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Browse...</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_27">
<item>
<spacer name="horizontalSpacer_13">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="glabels::FieldButton" name="imageFieldButton">
<property name="text">
<string notr="true">Use field</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item row="2" column="0">
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>646</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="lineFillPage">
@@ -1202,16 +1202,7 @@
<property name="spacing">
<number>15</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<property name="margin">
<number>0</number>
</property>
<item>
@@ -1529,14 +1520,6 @@
<signal>colorChanged()</signal>
</slots>
</customwidget>
<customwidget>
<class>glabels::FieldButton</class>
<extends>QComboBox</extends>
<header>FieldButton.h</header>
<slots>
<signal>keySelected(QString)</signal>
</slots>
</customwidget>
<customwidget>
<class>glabels::BarcodeMenuButton</class>
<extends>QPushButton</extends>
@@ -1545,6 +1528,14 @@
<signal>selectionChanged()</signal>
</slots>
</customwidget>
<customwidget>
<class>glabels::FieldButton</class>
<extends>QPushButton</extends>
<header>FieldButton.h</header>
<slots>
<signal>keySelected(QString)</signal>
</slots>
</customwidget>
</customwidgets>
<resources>
<include location="../icons.qrc"/>
@@ -1653,8 +1644,8 @@
<slot>onTextControlsChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>157</x>
<y>333</y>
<x>160</x>
<y>332</y>
</hint>
<hint type="destinationlabel">
<x>396</x>
@@ -1669,8 +1660,8 @@
<slot>onTextControlsChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>198</x>
<y>333</y>
<x>200</x>
<y>332</y>
</hint>
<hint type="destinationlabel">
<x>398</x>
@@ -1685,8 +1676,8 @@
<slot>onTextControlsChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>238</x>
<y>333</y>
<x>240</x>
<y>332</y>
</hint>
<hint type="destinationlabel">
<x>395</x>
@@ -1701,8 +1692,8 @@
<slot>onTextControlsChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>284</x>
<y>333</y>
<x>286</x>
<y>332</y>
</hint>
<hint type="destinationlabel">
<x>393</x>
@@ -1717,8 +1708,8 @@
<slot>onTextControlsChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>325</x>
<y>333</y>
<x>326</x>
<y>332</y>
</hint>
<hint type="destinationlabel">
<x>396</x>
@@ -1734,7 +1725,7 @@
<hints>
<hint type="sourcelabel">
<x>365</x>
<y>333</y>
<y>332</y>
</hint>
<hint type="destinationlabel">
<x>397</x>
@@ -1749,8 +1740,8 @@
<slot>onTextControlsChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>184</x>
<y>407</y>
<x>189</x>
<y>404</y>
</hint>
<hint type="destinationlabel">
<x>394</x>
@@ -1766,7 +1757,7 @@
<hints>
<hint type="sourcelabel">
<x>178</x>
<y>143</y>
<y>139</y>
</hint>
<hint type="destinationlabel">
<x>392</x>
@@ -1781,8 +1772,8 @@
<slot>onLineControlsChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>137</x>
<y>179</y>
<x>136</x>
<y>174</y>
</hint>
<hint type="destinationlabel">
<x>1</x>
@@ -1797,8 +1788,8 @@
<slot>onFillControlsChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>136</x>
<y>263</y>
<x>135</x>
<y>256</y>
</hint>
<hint type="destinationlabel">
<x>6</x>
@@ -1813,8 +1804,8 @@
<slot>onPositionControlsChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>159</x>
<y>142</y>
<x>160</x>
<y>138</y>
</hint>
<hint type="destinationlabel">
<x>399</x>
@@ -1829,8 +1820,8 @@
<slot>onPositionControlsChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>159</x>
<y>179</y>
<x>160</x>
<y>174</y>
</hint>
<hint type="destinationlabel">
<x>325</x>
@@ -1845,8 +1836,8 @@
<slot>onRectSizeControlsChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>159</x>
<y>265</y>
<x>160</x>
<y>258</y>
</hint>
<hint type="destinationlabel">
<x>3</x>
@@ -1861,8 +1852,8 @@
<slot>onRectSizeControlsChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>159</x>
<y>302</y>
<x>160</x>
<y>294</y>
</hint>
<hint type="destinationlabel">
<x>0</x>
@@ -1877,8 +1868,8 @@
<slot>onResetImageSize()</slot>
<hints>
<hint type="sourcelabel">
<x>210</x>
<y>372</y>
<x>213</x>
<y>362</y>
</hint>
<hint type="destinationlabel">
<x>4</x>
@@ -1909,8 +1900,8 @@
<slot>onShadowControlsChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>165</x>
<y>142</y>
<x>166</x>
<y>138</y>
</hint>
<hint type="destinationlabel">
<x>398</x>
@@ -1925,8 +1916,8 @@
<slot>onShadowControlsChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>165</x>
<y>179</y>
<x>166</x>
<y>174</y>
</hint>
<hint type="destinationlabel">
<x>294</x>
@@ -1941,8 +1932,8 @@
<slot>onShadowControlsChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>142</x>
<y>215</y>
<x>141</x>
<y>209</y>
</hint>
<hint type="destinationlabel">
<x>399</x>
@@ -1957,8 +1948,8 @@
<slot>onShadowControlsChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>159</x>
<y>252</y>
<x>162</x>
<y>245</y>
</hint>
<hint type="destinationlabel">
<x>399</x>
@@ -1973,8 +1964,8 @@
<slot>onLineSizeControlsChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>174</x>
<y>456</y>
<x>177</x>
<y>444</y>
</hint>
<hint type="destinationlabel">
<x>5</x>
@@ -1989,8 +1980,8 @@
<slot>onLineSizeControlsChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>174</x>
<y>493</y>
<x>177</x>
<y>480</y>
</hint>
<hint type="destinationlabel">
<x>1</x>
@@ -1999,14 +1990,14 @@
</hints>
</connection>
<connection>
<sender>imageFileButton</sender>
<sender>imageBrowseButton</sender>
<signal>clicked()</signal>
<receiver>ObjectEditor</receiver>
<slot>onImageFileButtonClicked()</slot>
<hints>
<hint type="sourcelabel">
<x>133</x>
<y>175</y>
<x>367</x>
<y>135</y>
</hint>
<hint type="destinationlabel">
<x>394</x>
@@ -2014,22 +2005,6 @@
</hint>
</hints>
</connection>
<connection>
<sender>imageFieldCombo</sender>
<signal>keySelected(QString)</signal>
<receiver>ObjectEditor</receiver>
<slot>onImageKeySelected(QString)</slot>
<hints>
<hint type="sourcelabel">
<x>302</x>
<y>175</y>
</hint>
<hint type="destinationlabel">
<x>397</x>
<y>32</y>
</hint>
</hints>
</connection>
<connection>
<sender>textEdit</sender>
<signal>textChanged()</signal>
@@ -2046,22 +2021,6 @@
</hint>
</hints>
</connection>
<connection>
<sender>textInsertFieldCombo</sender>
<signal>keySelected(QString)</signal>
<receiver>ObjectEditor</receiver>
<slot>onTextInsertFieldKeySelected(QString)</slot>
<hints>
<hint type="sourcelabel">
<x>239</x>
<y>599</y>
</hint>
<hint type="destinationlabel">
<x>395</x>
<y>645</y>
</hint>
</hints>
</connection>
<connection>
<sender>barcodeShowTextCheck</sender>
<signal>toggled(bool)</signal>
@@ -2069,8 +2028,8 @@
<slot>onBarcodeControlsChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>178</x>
<y>172</y>
<x>195</x>
<y>167</y>
</hint>
<hint type="destinationlabel">
<x>4</x>
@@ -2085,8 +2044,8 @@
<slot>onBarcodeControlsChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>164</x>
<y>204</y>
<x>195</x>
<y>198</y>
</hint>
<hint type="destinationlabel">
<x>1</x>
@@ -2102,7 +2061,7 @@
<hints>
<hint type="sourcelabel">
<x>126</x>
<y>239</y>
<y>232</y>
</hint>
<hint type="destinationlabel">
<x>1</x>
@@ -2126,22 +2085,6 @@
</hint>
</hints>
</connection>
<connection>
<sender>barcodeInsertFieldCombo</sender>
<signal>keySelected(QString)</signal>
<receiver>ObjectEditor</receiver>
<slot>onBarcodeInsertFieldKeySelected(QString)</slot>
<hints>
<hint type="sourcelabel">
<x>239</x>
<y>400</y>
</hint>
<hint type="destinationlabel">
<x>403</x>
<y>625</y>
</hint>
</hints>
</connection>
<connection>
<sender>barcodeStyleButton</sender>
<signal>selectionChanged()</signal>
@@ -2149,8 +2092,8 @@
<slot>onBarcodeControlsChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>178</x>
<y>140</y>
<x>195</x>
<y>136</y>
</hint>
<hint type="destinationlabel">
<x>5</x>
@@ -2190,6 +2133,70 @@
</hint>
</hints>
</connection>
<connection>
<sender>sizeAspectCheck</sender>
<signal>toggled(bool)</signal>
<receiver>ObjectEditor</receiver>
<slot>onRectSizeControlsChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>231</x>
<y>289</y>
</hint>
<hint type="destinationlabel">
<x>199</x>
<y>319</y>
</hint>
</hints>
</connection>
<connection>
<sender>textInsertFieldButton</sender>
<signal>keySelected(QString)</signal>
<receiver>ObjectEditor</receiver>
<slot>onTextInsertFieldKeySelected(QString)</slot>
<hints>
<hint type="sourcelabel">
<x>191</x>
<y>589</y>
</hint>
<hint type="destinationlabel">
<x>227</x>
<y>642</y>
</hint>
</hints>
</connection>
<connection>
<sender>barcodeInsertFieldButton</sender>
<signal>keySelected(QString)</signal>
<receiver>ObjectEditor</receiver>
<slot>onBarcodeInsertFieldKeySelected(QString)</slot>
<hints>
<hint type="sourcelabel">
<x>208</x>
<y>379</y>
</hint>
<hint type="destinationlabel">
<x>205</x>
<y>649</y>
</hint>
</hints>
</connection>
<connection>
<sender>imageFieldButton</sender>
<signal>keySelected(QString)</signal>
<receiver>ObjectEditor</receiver>
<slot>onImageKeySelected(QString)</slot>
<hints>
<hint type="sourcelabel">
<x>317</x>
<y>160</y>
</hint>
<hint type="destinationlabel">
<x>331</x>
<y>-12</y>
</hint>
</hints>
</connection>
</connections>
<slots>
<slot>onChanged()</slot>
@@ -2206,5 +2213,6 @@
<slot>onTextInsertFieldKeySelected(QString)</slot>
<slot>onBarcodeControlsChanged()</slot>
<slot>onBarcodeInsertFieldKeySelected(QString)</slot>
<slot>onImageComboChanged()</slot>
</slots>
</ui>
+35 -19
View File
@@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>759</width>
<width>852</width>
<height>792</height>
</rect>
</property>
@@ -17,7 +17,7 @@
</sizepolicy>
</property>
<property name="windowTitle">
<string>Form</string>
<string notr="true">Form</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0,1">
<item>
@@ -73,21 +73,8 @@
<property name="title">
<string>Copies</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="5" column="0">
<widget class="QLabel" name="copiesDescriptionLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string notr="true">(Will print a total of xx items on nn pages.)</string>
</property>
</widget>
</item>
<item row="1" column="0">
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QLabel" name="label_4">
@@ -104,11 +91,17 @@
</item>
<item>
<widget class="QSpinBox" name="copiesSpin">
<property name="buttonSymbols">
<enum>QAbstractSpinBox::UpDownArrows</enum>
</property>
<property name="accelerated">
<bool>true</bool>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>96</number>
<number>9999</number>
</property>
</widget>
</item>
@@ -127,7 +120,7 @@
</item>
</layout>
</item>
<item row="2" column="0">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_2">
@@ -183,6 +176,29 @@
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QLabel" name="copiesDescriptionLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>330</width>
<height>0</height>
</size>
</property>
<property name="text">
<string notr="true">(Will print a total of xxxx items on nnn pages.) </string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
+7 -1
View File
@@ -23,7 +23,7 @@
</size>
</property>
<property name="windowTitle">
<string>Form</string>
<string notr="true">Form</string>
</property>
<layout class="QGridLayout" name="gridLayout_5" columnstretch="0,0,0,0,1">
<item row="0" column="4">
@@ -241,6 +241,12 @@
</item>
<item row="1" column="0">
<widget class="QPushButton" name="changeProductButton">
<property name="minimumSize">
<size>
<width>330</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Select another product for this gLabels project.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
+1 -1
View File
@@ -11,7 +11,7 @@
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
<string notr="true">Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
+1 -1
View File
@@ -23,7 +23,7 @@
</size>
</property>
<property name="windowTitle">
<string>Form</string>
<string notr="true">Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
+1 -1
View File
@@ -23,7 +23,7 @@
</size>
</property>
<property name="windowTitle">
<string>Form</string>
<string notr="true">Form</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
+1 -1
View File
@@ -23,7 +23,7 @@
</size>
</property>
<property name="windowTitle">
<string>Form</string>
<string notr="true">Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
+1 -1
View File
@@ -23,7 +23,7 @@
</size>
</property>
<property name="windowTitle">
<string>Form</string>
<string notr="true">Form</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
+1 -1
View File
@@ -23,7 +23,7 @@
</size>
</property>
<property name="windowTitle">
<string>Form</string>
<string notr="true">Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="verticalSpacing">
+1 -1
View File
@@ -23,7 +23,7 @@
</size>
</property>
<property name="windowTitle">
<string>Form</string>
<string notr="true">Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="sizeConstraint">
+1 -1
View File
@@ -23,7 +23,7 @@
</size>
</property>
<property name="windowTitle">
<string>Form</string>
<string notr="true">Form</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<property name="verticalSpacing">
+1 -1
View File
@@ -23,7 +23,7 @@
</size>
</property>
<property name="windowTitle">
<string>Form</string>
<string notr="true">Form</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
+1 -1
View File
@@ -23,7 +23,7 @@
</size>
</property>
<property name="windowTitle">
<string>Form</string>
<string notr="true">Form</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="1" column="0">
+1 -1
View File
@@ -23,7 +23,7 @@
</size>
</property>
<property name="windowTitle">
<string>Form</string>
<string notr="true">Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
+1 -1
View File
@@ -23,7 +23,7 @@
</size>
</property>
<property name="windowTitle">
<string>Form</string>
<string notr="true">Form</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
+1 -1
View File
@@ -23,7 +23,7 @@
</size>
</property>
<property name="windowTitle">
<string>Form</string>
<string notr="true">Form</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
+1 -1
View File
@@ -23,7 +23,7 @@
</size>
</property>
<property name="windowTitle">
<string>Form</string>
<string notr="true">Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
+1 -1
View File
@@ -23,7 +23,7 @@
</size>
</property>
<property name="windowTitle">
<string>Form</string>
<string notr="true">Form</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
+190
View File
@@ -0,0 +1,190 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>VariablesView</class>
<widget class="QWidget" name="VariablesView">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1105</width>
<height>605</height>
</rect>
</property>
<property name="windowTitle">
<string notr="true">Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="leftMargin">
<number>21</number>
</property>
<property name="topMargin">
<number>21</number>
</property>
<property name="rightMargin">
<number>21</number>
</property>
<property name="bottomMargin">
<number>21</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="titleLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string notr="true">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:18pt;&quot;&gt;Variables&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QTableWidget" name="table">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="columnCount">
<number>0</number>
</property>
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderHighlightSections">
<bool>true</bool>
</attribute>
</widget>
</item>
<item row="2" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="addButton">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Add variable&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Add</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="editButton">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Edit selected variable&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Edit</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="deleteButton">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Delete selected variable&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Delete</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>addButton</sender>
<signal>clicked()</signal>
<receiver>VariablesView</receiver>
<slot>onAddButtonClicked()</slot>
<hints>
<hint type="sourcelabel">
<x>63</x>
<y>586</y>
</hint>
<hint type="destinationlabel">
<x>98</x>
<y>598</y>
</hint>
</hints>
</connection>
<connection>
<sender>editButton</sender>
<signal>clicked()</signal>
<receiver>VariablesView</receiver>
<slot>onEditButtonClicked()</slot>
<hints>
<hint type="sourcelabel">
<x>167</x>
<y>576</y>
</hint>
<hint type="destinationlabel">
<x>317</x>
<y>608</y>
</hint>
</hints>
</connection>
<connection>
<sender>deleteButton</sender>
<signal>clicked()</signal>
<receiver>VariablesView</receiver>
<slot>onDeleteButtonClicked()</slot>
<hints>
<hint type="sourcelabel">
<x>245</x>
<y>575</y>
</hint>
<hint type="destinationlabel">
<x>508</x>
<y>613</y>
</hint>
</hints>
</connection>
<connection>
<sender>table</sender>
<signal>itemSelectionChanged()</signal>
<receiver>VariablesView</receiver>
<slot>onTableSelectionChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>380</x>
<y>258</y>
</hint>
<hint type="destinationlabel">
<x>787</x>
<y>610</y>
</hint>
</hints>
</connection>
</connections>
<slots>
<slot>onSelectAllButtonClicked()</slot>
<slot>onUnselectAllButtonClicked()</slot>
<slot>onLocationButtonClicked()</slot>
<slot>onFormatComboActivated()</slot>
<slot>onAddButtonClicked()</slot>
<slot>onEditButtonClicked()</slot>
<slot>onDeleteButtonClicked()</slot>
<slot>onTableSelectionChanged()</slot>
</slots>
</ui>
+3
View File
@@ -56,6 +56,8 @@ set (Model_sources
Template.cpp
TextNode.cpp
Units.cpp
Variable.cpp
Variables.cpp
Vendor.cpp
XmlCategoryParser.cpp
XmlLabelCreator.cpp
@@ -80,6 +82,7 @@ set (Model_qobject_headers
ModelTextObject.h
PageRenderer.h
Settings.h
Variables.h
)
qt5_wrap_cpp (Model_moc_sources ${Model_qobject_headers})
+21 -19
View File
@@ -175,30 +175,32 @@ namespace glabels
///
/// Get color, expand if necessary
///
QColor ColorNode::color( merge::Record* record ) const
QColor ColorNode::color( const merge::Record* record,
const Variables* variables ) const
{
if ( mIsField )
QColor value = QColor( 192, 192, 192, 128 );
bool haveRecordField = mIsField && record &&
record->contains(mKey) &&
!record->value(mKey).isEmpty();
bool haveVariable = mIsField && variables &&
variables->contains(mKey) &&
!(*variables)[mKey].value().isEmpty();
if ( haveRecordField )
{
if ( record == nullptr )
{
return mColor;
}
else
{
if ( record->contains( mKey ) )
{
return QColor( (*record)[ mKey ] );
}
else
{
return mColor;
}
}
value = QColor( record->value(mKey) );
}
else
else if ( haveVariable )
{
return mColor;
value = QColor( (*variables)[mKey].value() );
}
else if ( !mIsField )
{
value = mColor;
}
return value;
}
}
+3 -1
View File
@@ -22,6 +22,7 @@
#define model_ColorNode_h
#include "Variables.h"
#include "merge/Record.h"
#include <QString>
@@ -95,7 +96,8 @@ namespace glabels
/////////////////////////////////
public:
uint32_t rgba() const;
QColor color( merge::Record* record ) const;
QColor color( const merge::Record* record,
const Variables* variables ) const;
/////////////////////////////////
+12
View File
@@ -108,5 +108,17 @@ namespace glabels
return QDir("/");
}
QString FileUtil::makeRelativeIfInDir( const QDir& dir,
const QString& filename )
{
QString relativeFilePath = dir.relativeFilePath( filename ); // Note: directory separators canonicalized to slash by Qt path methods
if ( !relativeFilePath.startsWith( "../" ) )
{
return relativeFilePath;
}
return filename;
}
}
}
+3
View File
@@ -41,6 +41,9 @@ namespace glabels
QDir userTemplatesDir();
QDir translationsDir();
QString makeRelativeIfInDir( const QDir& dir,
const QString& filename );
}
}
+76 -12
View File
@@ -57,7 +57,18 @@ namespace glabels
Model::Model()
: mUntitledInstance(0), mModified(true), mRotate(false)
{
mVariables = new Variables();
mMerge = new merge::None();
connect( mVariables, SIGNAL(changed()), this, SLOT(onVariablesChanged()) );
}
Model::Model( merge::Merge* merge, Variables* variables )
: mUntitledInstance(0), mModified(true), mRotate(false)
{
mVariables = variables; // Shared
mMerge = merge; // Shared
}
@@ -66,7 +77,8 @@ namespace glabels
///
Model::~Model()
{
delete mMerge;
qDeleteAll( mObjectList );
// Final instance of mMerge and mVariables to be deleted by Model owner
}
@@ -75,7 +87,13 @@ namespace glabels
///
Model* Model::save() const
{
auto* savedModel = new Model;
auto* savedModel = new Model( mMerge, mVariables ); // mMerge and mVariables shared between models
if ( mFileName.isEmpty() && mUntitledInstance == 0 )
{
qDebug() << "Model::save: Warning: called before mUntitledInstance has been initialized: untitled names will differ";
}
savedModel->restore( this );
return savedModel;
@@ -112,18 +130,12 @@ namespace glabels
connect( object, SIGNAL(moved()), this, SLOT(onObjectMoved()) );
}
delete mMerge;
mMerge = savedModel->mMerge->clone();
// Emit signals based on potential changes
emit changed();
emit selectionChanged();
emit modifiedChanged();
emit nameChanged();
emit sizeChanged();
emit mergeChanged();
emit mergeSourceChanged();
emit mergeSelectionChanged();
}
@@ -276,6 +288,38 @@ namespace glabels
}
///
/// Get directory as a QDir.
///
QDir Model::dir() const
{
if ( mFileName.isEmpty() )
{
return QDir::current();
}
else
{
return QFileInfo( mFileName ).absoluteDir();
}
}
///
/// Get directory as a path.
///
QString Model::dirPath() const
{
if ( mFileName.isEmpty() )
{
return QDir::currentPath();
}
else
{
return QFileInfo( mFileName ).absolutePath();
}
}
///
/// Get short name.
///
@@ -302,6 +346,15 @@ namespace glabels
}
///
/// Get variables object
///
Variables* Model::variables() const
{
return mVariables;
}
///
/// Get merge object
///
@@ -451,6 +504,17 @@ namespace glabels
}
///
/// Variables Changed Slot
///
void Model::onVariablesChanged()
{
setModified();
emit changed();
emit variablesChanged();
}
///
/// Merge Source Changed Slot
///
@@ -1359,7 +1423,7 @@ namespace glabels
QClipboard *clipboard = QApplication::clipboard();
QByteArray buffer;
XmlLabelCreator::serializeObjects( getSelection(), buffer );
XmlLabelCreator::serializeObjects( getSelection(), this, buffer );
auto *mimeData = new QMimeData;
mimeData->setData( MIME_TYPE, buffer );
@@ -1415,7 +1479,7 @@ namespace glabels
{
// Native objects
QByteArray buffer = mimeData->data( MIME_TYPE );
QList <ModelObject*> objects = XmlLabelParser::deserializeObjects( buffer );
QList <ModelObject*> objects = XmlLabelParser::deserializeObjects( buffer, this );
unselectAll();
foreach ( ModelObject* object, objects )
@@ -1452,11 +1516,11 @@ namespace glabels
///
/// Draw label objects
///
void Model::draw( QPainter* painter, bool inEditor, merge::Record* record ) const
void Model::draw( QPainter* painter, bool inEditor, merge::Record* record, Variables* variables ) const
{
foreach ( ModelObject* object, mObjectList )
{
object->draw( painter, inEditor, record );
object->draw( painter, inEditor, record, variables );
}
}
+14 -1
View File
@@ -24,10 +24,12 @@
#include "Settings.h"
#include "Template.h"
#include "Variables.h"
#include "merge/Merge.h"
#include "merge/Record.h"
#include <QDir>
#include <QList>
#include <QObject>
#include <QPainter>
@@ -57,6 +59,7 @@ namespace glabels
/////////////////////////////////
public:
Model();
Model( merge::Merge* merge, Variables* variables );
~Model();
@@ -76,6 +79,7 @@ namespace glabels
void sizeChanged();
void selectionChanged();
void modifiedChanged();
void variablesChanged();
void mergeChanged();
void mergeSourceChanged();
void mergeSelectionChanged();
@@ -89,6 +93,8 @@ namespace glabels
void setModified();
void clearModified();
QDir dir() const;
QString dirPath() const;
QString shortName();
const QString& fileName() const;
void setFileName( const QString &fileName );
@@ -107,6 +113,8 @@ namespace glabels
const QList<ModelObject*>& objectList() const;
Variables* variables() const;
merge::Merge* merge() const;
void setMerge( merge::Merge* merge );
@@ -204,7 +212,10 @@ namespace glabels
// Drawing operations
/////////////////////////////////
public:
void draw( QPainter* painter, bool inEditor = true, merge::Record* record = nullptr ) const;
void draw( QPainter* painter,
bool inEditor,
merge::Record* record,
Variables* variables ) const;
/////////////////////////////////
@@ -213,6 +224,7 @@ namespace glabels
private slots:
void onObjectChanged();
void onObjectMoved();
void onVariablesChanged();
void onMergeSourceChanged();
void onMergeSelectionChanged();
@@ -229,6 +241,7 @@ namespace glabels
QList<ModelObject*> mObjectList;
Variables* mVariables;
merge::Merge* mMerge;
};
+11 -7
View File
@@ -89,13 +89,14 @@ namespace glabels
const Distance& y0,
const Distance& w,
const Distance& h,
bool lockAspectRatio,
const barcode::Style& bcStyle,
bool bcTextFlag,
bool bcChecksumFlag,
QString bcData,
const ColorNode& bcColorNode,
const QMatrix& matrix )
: ModelObject( x0, y0, w, h, matrix )
: ModelObject( x0, y0, w, h, lockAspectRatio, matrix )
{
mOutline = new Outline( this );
@@ -311,7 +312,8 @@ namespace glabels
///
void ModelBarcodeObject::drawShadow( QPainter* painter,
bool inEditor,
merge::Record* record ) const
merge::Record* record,
Variables* variables ) const
{
// Barcodes don't support shadows.
}
@@ -322,9 +324,10 @@ namespace glabels
///
void ModelBarcodeObject::drawObject( QPainter* painter,
bool inEditor,
merge::Record* record ) const
merge::Record* record,
Variables* variables ) const
{
QColor bcColor = mBcColorNode.color( record );
QColor bcColor = mBcColorNode.color( record, variables );
if ( inEditor )
{
@@ -332,7 +335,7 @@ namespace glabels
}
else
{
drawBc( painter, bcColor, record );
drawBc( painter, bcColor, record, variables );
}
}
@@ -450,7 +453,8 @@ namespace glabels
void
ModelBarcodeObject::drawBc( QPainter* painter,
const QColor& color,
merge::Record* record ) const
merge::Record* record,
Variables* variables ) const
{
painter->setPen( QPen( color ) );
@@ -458,7 +462,7 @@ namespace glabels
bc->setChecksum(mBcChecksumFlag);
bc->setShowText(mBcTextFlag);
bc->build( mBcData.expand( record ).toStdString(), mW.pt(), mH.pt() );
bc->build( mBcData.expand( record, variables ).toStdString(), mW.pt(), mH.pt() );
glbarcode::QtRenderer renderer(painter);
bc->render( renderer );
+17 -3
View File
@@ -51,6 +51,7 @@ namespace glabels
const Distance& y0,
const Distance& w,
const Distance& h,
bool lockAspectRatio,
const barcode::Style& bcStyle,
bool bcTextFlag,
bool bcChecksumFlag,
@@ -126,8 +127,16 @@ namespace glabels
// Drawing operations
///////////////////////////////////////////////////////////////
protected:
void drawShadow( QPainter* painter, bool inEditor, merge::Record* record ) const override;
void drawObject( QPainter* painter, bool inEditor, merge::Record* record ) const override;
void drawShadow( QPainter* painter,
bool inEditor,
merge::Record* record,
Variables* variables ) const override;
void drawObject( QPainter* painter,
bool inEditor,
merge::Record* record,
Variables* variables ) const override;
QPainterPath hoverPath( double scale ) const override;
@@ -139,7 +148,12 @@ namespace glabels
void update();
void drawBcInEditor( QPainter* painter, const QColor& color ) const;
void drawBc( QPainter* painter, const QColor& color, merge::Record* record ) const;
void drawBc( QPainter* painter,
const QColor& color,
merge::Record* record,
Variables* variables ) const;
void drawPlaceHolder( QPainter* painter, const QColor& color, const QString& text ) const;
+15 -8
View File
@@ -54,6 +54,7 @@ namespace glabels
const Distance& y0,
const Distance& w,
const Distance& h,
bool lockAspectRatio,
const Distance& lineWidth,
const ColorNode& lineColorNode,
const ColorNode& fillColorNode,
@@ -63,7 +64,7 @@ namespace glabels
const Distance& shadowY,
double shadowOpacity,
const ColorNode& shadowColorNode )
: ModelShapeObject( x0, y0, w, h,
: ModelShapeObject( x0, y0, w, h, lockAspectRatio,
lineWidth, lineColorNode, fillColorNode,
matrix,
shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode )
@@ -103,11 +104,14 @@ namespace glabels
///
/// Draw shadow of object
///
void ModelBoxObject::drawShadow( QPainter* painter, bool inEditor, merge::Record* record ) const
void ModelBoxObject::drawShadow( QPainter* painter,
bool inEditor,
merge::Record* record,
Variables* variables ) const
{
QColor lineColor = mLineColorNode.color( record );
QColor fillColor = mFillColorNode.color( record );
QColor shadowColor = mShadowColorNode.color( record );
QColor lineColor = mLineColorNode.color( record, variables );
QColor fillColor = mFillColorNode.color( record, variables );
QColor shadowColor = mShadowColorNode.color( record, variables );
shadowColor.setAlphaF( mShadowOpacity );
@@ -148,10 +152,13 @@ namespace glabels
///
/// Draw object itself
///
void ModelBoxObject::drawObject( QPainter* painter, bool inEditor, merge::Record* record ) const
void ModelBoxObject::drawObject( QPainter* painter,
bool inEditor,
merge::Record* record,
Variables* variables ) const
{
QColor lineColor = mLineColorNode.color( record );
QColor fillColor = mFillColorNode.color( record );
QColor lineColor = mLineColorNode.color( record, variables );
QColor fillColor = mFillColorNode.color( record, variables );
painter->setPen( QPen( lineColor, mLineWidth.pt() ) );
painter->setBrush( fillColor );
+11 -2
View File
@@ -47,6 +47,7 @@ namespace glabels
const Distance& y0,
const Distance& w,
const Distance& h,
bool lockAspectRatio,
const Distance& lineWidth,
const ColorNode& lineColorNode,
const ColorNode& fillColorNode,
@@ -72,8 +73,16 @@ namespace glabels
// Drawing operations
///////////////////////////////////////////////////////////////
protected:
void drawShadow( QPainter* painter, bool inEditor, merge::Record* record ) const override;
void drawObject( QPainter* painter, bool inEditor, merge::Record* record ) const override;
void drawShadow( QPainter* painter,
bool inEditor,
merge::Record* record,
Variables* variables ) const override;
void drawObject( QPainter* painter,
bool inEditor,
merge::Record* record,
Variables* variables ) const override;
QPainterPath hoverPath( double scale ) const override;
};
+15 -8
View File
@@ -54,6 +54,7 @@ namespace glabels
const Distance& y0,
const Distance& w,
const Distance& h,
bool lockAspectRatio,
const Distance& lineWidth,
const ColorNode& lineColorNode,
const ColorNode& fillColorNode,
@@ -63,7 +64,7 @@ namespace glabels
const Distance& shadowY,
double shadowOpacity,
const ColorNode& shadowColorNode )
: ModelShapeObject( x0, y0, w, h,
: ModelShapeObject( x0, y0, w, h, lockAspectRatio,
lineWidth, lineColorNode, fillColorNode,
matrix,
shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode )
@@ -103,11 +104,14 @@ namespace glabels
///
/// Draw shadow of object
///
void ModelEllipseObject::drawShadow( QPainter* painter, bool inEditor, merge::Record* record ) const
void ModelEllipseObject::drawShadow( QPainter* painter,
bool inEditor,
merge::Record* record,
Variables* variables ) const
{
QColor lineColor = mLineColorNode.color( record );
QColor fillColor = mFillColorNode.color( record );
QColor shadowColor = mShadowColorNode.color( record );
QColor lineColor = mLineColorNode.color( record, variables );
QColor fillColor = mFillColorNode.color( record, variables );
QColor shadowColor = mShadowColorNode.color( record, variables );
shadowColor.setAlphaF( mShadowOpacity );
@@ -148,10 +152,13 @@ namespace glabels
///
/// Draw object itself
///
void ModelEllipseObject::drawObject( QPainter* painter, bool inEditor, merge::Record* record ) const
void ModelEllipseObject::drawObject( QPainter* painter,
bool inEditor,
merge::Record* record,
Variables* variables ) const
{
QColor lineColor = mLineColorNode.color( record );
QColor fillColor = mFillColorNode.color( record );
QColor lineColor = mLineColorNode.color( record, variables );
QColor fillColor = mFillColorNode.color( record, variables );
painter->setPen( QPen( lineColor, mLineWidth.pt() ) );
painter->setBrush( fillColor );
+11 -2
View File
@@ -47,6 +47,7 @@ namespace glabels
const Distance& y0,
const Distance& w,
const Distance& h,
bool lockAspectRatio,
const Distance& lineWidth,
const ColorNode& lineColorNode,
const ColorNode& fillColorNode,
@@ -72,8 +73,16 @@ namespace glabels
// Drawing operations
///////////////////////////////////////////////////////////////
protected:
void drawShadow( QPainter* painter, bool inEditor, merge::Record* record ) const override;
void drawObject( QPainter* painter, bool inEditor, merge::Record* record ) const override;
void drawShadow( QPainter* painter,
bool inEditor,
merge::Record* record,
Variables* variables ) const override;
void drawObject( QPainter* painter,
bool inEditor,
merge::Record* record,
Variables* variables ) const override;
QPainterPath hoverPath( double scale ) const override;
};
+208 -58
View File
@@ -20,9 +20,11 @@
#include "ModelImageObject.h"
#include "Model.h"
#include "Size.h"
#include <QBrush>
#include <QDir>
#include <QFileInfo>
#include <QImage>
#include <QPen>
@@ -40,6 +42,17 @@ namespace glabels
QImage* ModelImageObject::smDefaultImage = nullptr;
//
// Private
//
namespace
{
const QColor fillColor = QColor( 224, 224, 224, 255 );
const QColor labelColor = QColor( 102, 102, 102, 255 );
const Distance pad = Distance::pt(2);
}
///
/// Constructor
///
@@ -70,6 +83,7 @@ namespace glabels
const Distance& y0,
const Distance& w,
const Distance& h,
bool lockAspectRatio,
const TextNode& filenameNode,
const QMatrix& matrix,
bool shadowState,
@@ -77,7 +91,7 @@ namespace glabels
const Distance& shadowY,
double shadowOpacity,
const ColorNode& shadowColorNode )
: ModelObject( x0, y0, w, h,
: ModelObject( x0, y0, w, h, lockAspectRatio,
matrix,
shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode )
{
@@ -101,6 +115,8 @@ namespace glabels
mImage = nullptr;
mSvgRenderer = nullptr;
loadImage();
}
@@ -111,6 +127,7 @@ namespace glabels
const Distance& y0,
const Distance& w,
const Distance& h,
bool lockAspectRatio,
const QString& filename,
const QImage& image,
const QMatrix& matrix,
@@ -119,7 +136,7 @@ namespace glabels
const Distance& shadowY,
double shadowOpacity,
const ColorNode& shadowColorNode )
: ModelObject( x0, y0, w, h,
: ModelObject( x0, y0, w, h, lockAspectRatio,
matrix,
shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode )
{
@@ -152,6 +169,7 @@ namespace glabels
const Distance& y0,
const Distance& w,
const Distance& h,
bool lockAspectRatio,
const QString& filename,
const QByteArray& svg,
const QMatrix& matrix,
@@ -160,7 +178,7 @@ namespace glabels
const Distance& shadowY,
double shadowOpacity,
const ColorNode& shadowColorNode )
: ModelObject( x0, y0, w, h,
: ModelObject( x0, y0, w, h, lockAspectRatio,
matrix,
shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode )
{
@@ -395,27 +413,58 @@ namespace glabels
///
/// Draw shadow of object
///
void ModelImageObject::drawShadow( QPainter* painter, bool inEditor, merge::Record* record ) const
void ModelImageObject::drawShadow( QPainter* painter,
bool inEditor,
merge::Record* record,
Variables* variables ) const
{
QRectF destRect( 0, 0, mW.pt(), mH.pt() );
QColor shadowColor = mShadowColorNode.color( record );
QColor shadowColor = mShadowColorNode.color( record, variables );
shadowColor.setAlphaF( mShadowOpacity );
if ( mImage && mImage->hasAlphaChannel() && (mImage->depth() == 32) )
{
QImage* shadowImage = createShadowImage( shadowColor );
QImage* shadowImage = createShadowImage( *mImage, shadowColor );
painter->drawImage( destRect, *shadowImage );
delete shadowImage;
}
else if ( mImage || mSvgRenderer || inEditor )
{
painter->setBrush( shadowColor );
painter->setPen( QPen( Qt::NoPen ) );
painter->drawRect( destRect );
}
else
{
if ( mImage || inEditor )
QString filename = mFilenameNode.text( record, variables );
QImage* image;
QSvgRenderer* svgRenderer;
QByteArray svg;
if ( readImageFile( filename, image, svgRenderer, svg ) )
{
painter->setBrush( shadowColor );
painter->setPen( QPen( Qt::NoPen ) );
if ( image && image->hasAlphaChannel() && (image->depth() == 32) )
{
QImage* shadowImage = createShadowImage( *image, shadowColor );
painter->drawImage( destRect, *shadowImage );
delete shadowImage;
}
else
{
painter->setBrush( shadowColor );
painter->setPen( QPen( Qt::NoPen ) );
painter->drawRect( destRect );
painter->drawRect( destRect );
}
if ( image )
{
delete image;
}
else
{
delete svgRenderer;
}
}
}
}
@@ -424,16 +473,70 @@ namespace glabels
///
/// Draw object itself
///
void ModelImageObject::drawObject( QPainter* painter, bool inEditor, merge::Record* record ) const
void ModelImageObject::drawObject( QPainter* painter,
bool inEditor,
merge::Record* record,
Variables* variables ) const
{
QRectF destRect( 0, 0, mW.pt(), mH.pt() );
if ( inEditor && (mFilenameNode.isField() || (!mImage && !mSvgRenderer) ) )
{
//
// Render default place holder image
//
painter->save();
painter->setRenderHint( QPainter::SmoothPixmapTransform, false );
painter->drawImage( destRect, *smDefaultImage );
painter->restore();
//
// Print label on top of place holder image, if we have room
//
if ( (mW > 6*pad) && (mH > 4*pad) )
{
QString labelText = tr("No image");
if ( mFilenameNode.isField() )
{
labelText = QString( "${%1}" ).arg( mFilenameNode.data() );
}
// Determine font size for labelText
QFont font( "Sans" );
font.setPointSizeF( 6 );
QFontMetricsF fm( font );
QRectF textRect = fm.boundingRect( labelText );
double wPts = (mW - 2*pad).pt();
double hPts = (mH - 2*pad).pt();
if ( (wPts < textRect.width()) || (hPts < textRect.height()) )
{
double scaleX = wPts / textRect.width();
double scaleY = hPts / textRect.height();
font.setPointSizeF( 6 * std::min( scaleX, scaleY ) );
}
// Render hole for text (font size may have changed above)
fm = QFontMetricsF( font );
textRect = fm.boundingRect( labelText );
QRectF holeRect( (mW.pt() - textRect.width())/2 - pad.pt(),
(mH.pt() - textRect.height())/2 - pad.pt(),
textRect.width() + 2*pad.pt(),
textRect.height() + 2*pad.pt() );
painter->setPen( Qt::NoPen );
painter->setBrush( QBrush( fillColor ) );
painter->drawRect( holeRect );
// Render text
painter->setFont( font );
painter->setPen( QPen( labelColor ) );
painter->drawText( QRectF( 0, 0, mW.pt(), mH.pt() ),
Qt::AlignCenter,
labelText );
}
}
else if ( mImage )
{
@@ -445,7 +548,23 @@ namespace glabels
}
else if ( mFilenameNode.isField() )
{
// TODO
QString filename = mFilenameNode.text( record, variables );
QImage* image;
QSvgRenderer* svgRenderer;
QByteArray svg;
if ( readImageFile( filename, image, svgRenderer, svg ) )
{
if ( image )
{
painter->drawImage( destRect, *image );
delete image;
}
else
{
svgRenderer->render( painter, destRect );
delete svgRenderer;
}
}
}
}
@@ -481,59 +600,32 @@ namespace glabels
if ( !mFilenameNode.isField() )
{
QString filename = mFilenameNode.data();
QFileInfo fileInfo( filename );
if ( fileInfo.isReadable() )
if ( readImageFile( filename, mImage, mSvgRenderer, mSvg ) )
{
if ( (fileInfo.suffix() == "svg") || (fileInfo.suffix() == "SVG") )
double aspectRatio = 0;
if ( mSvgRenderer )
{
QFile file( filename );
if ( file.open( QFile::ReadOnly ) )
{
mSvg = file.readAll();
file.close();
mSvgRenderer = new QSvgRenderer( mSvg );
if ( !mSvgRenderer->isValid() )
{
mSvgRenderer = nullptr;
}
else
{
// Adjust size based on aspect ratio of SVG image
QRectF rect = mSvgRenderer->viewBoxF();
double aspectRatio = rect.height() / rect.width();
if ( mH > mW*aspectRatio )
{
mH = mW*aspectRatio;
}
else
{
mW = mH/aspectRatio;
}
}
}
// Adjust size based on aspect ratio of SVG image
QRectF rect = mSvgRenderer->viewBoxF();
aspectRatio = rect.width() ? rect.height() / rect.width() : 0;
}
else
{
mImage = new QImage( filename );
if ( mImage->isNull() )
// Adjust size based on aspect ratio of image
double imageW = mImage->width();
double imageH = mImage->height();
aspectRatio = imageW ? imageH / imageW : 0;
}
if ( aspectRatio )
{
if ( mH > mW*aspectRatio )
{
mImage = nullptr;
mH = mW*aspectRatio;
}
else
{
// Adjust size based on aspect ratio of image
double imageW = mImage->width();
double imageH = mImage->height();
double aspectRatio = imageH / imageW;
if ( mH > mW*aspectRatio )
{
mH = mW*aspectRatio;
}
else
{
mW = mH/aspectRatio;
}
mW = mH/aspectRatio;
}
}
}
@@ -541,17 +633,75 @@ namespace glabels
}
///
/// Read an image or svg file
///
bool ModelImageObject::readImageFile( const QString& fileName,
QImage*& image,
QSvgRenderer*& svgRenderer,
QByteArray& svg ) const
{
image = nullptr;
svgRenderer = nullptr;
svg.clear();
if ( !fileName.isEmpty() )
{
QFileInfo fileInfo( fileName );
if ( fileInfo.isRelative() )
{
// Look for image file relative to project file 1st then CWD 2nd
auto* model = dynamic_cast<Model*>( parent() );
QDir::setSearchPaths( "images", {model ? model->dirPath() : "", QDir::currentPath()} );
fileInfo.setFile( QString("images:") + fileName );
}
if ( fileInfo.isReadable() )
{
if ( fileInfo.suffix().toLower() == "svg" )
{
QFile file( fileInfo.filePath() );
if ( file.open( QFile::ReadOnly ) )
{
svg = file.readAll();
file.close();
svgRenderer = new QSvgRenderer( svg );
if ( !svgRenderer->isValid() )
{
delete svgRenderer;
svgRenderer = nullptr;
svg.clear();
}
}
}
else
{
image = new QImage( fileInfo.filePath() );
if ( image->isNull() )
{
delete image;
image = nullptr;
}
}
}
}
return image != nullptr || svgRenderer != nullptr;
}
///
/// Create shadow image
///
QImage* ModelImageObject::createShadowImage( const QColor& color ) const
QImage* ModelImageObject::createShadowImage( const QImage& image,
const QColor& color ) const
{
int r = color.red();
int g = color.green();
int b = color.blue();
int a = color.alpha();
auto* shadow = new QImage( *mImage );
auto* shadow = new QImage( image );
for ( int iy = 0; iy < shadow->height(); iy++ )
{
auto* scanLine = (QRgb*)shadow->scanLine( iy );
+21 -3
View File
@@ -49,6 +49,7 @@ namespace glabels
const Distance& y0,
const Distance& w,
const Distance& h,
bool lockAspectRatio,
const TextNode& filenameNode,
const QMatrix& matrix = QMatrix(),
bool shadowState = false,
@@ -61,6 +62,7 @@ namespace glabels
const Distance& y0,
const Distance& w,
const Distance& h,
bool lockAspectRatio,
const QString& filename,
const QImage& image,
const QMatrix& matrix = QMatrix(),
@@ -74,6 +76,7 @@ namespace glabels
const Distance& y0,
const Distance& w,
const Distance& h,
bool lockAspectRatio,
const QString& filename,
const QByteArray& svg,
const QMatrix& matrix = QMatrix(),
@@ -132,8 +135,16 @@ namespace glabels
// Drawing operations
///////////////////////////////////////////////////////////////
protected:
void drawShadow( QPainter* painter, bool inEditor, merge::Record* record ) const override;
void drawObject( QPainter* painter, bool inEditor, merge::Record* record ) const override;
void drawShadow( QPainter* painter,
bool inEditor,
merge::Record* record,
Variables* variables ) const override;
void drawObject( QPainter* painter,
bool inEditor,
merge::Record* record,
Variables* variables ) const override;
QPainterPath hoverPath( double scale ) const override;
@@ -141,7 +152,14 @@ namespace glabels
// Private
///////////////////////////////////////////////////////////////
void loadImage();
QImage* createShadowImage( const QColor& color ) const;
bool readImageFile( const QString& fileName,
QImage*& image,
QSvgRenderer*& svgRenderer,
QByteArray& svg ) const;
QImage* createShadowImage( const QImage& image,
const QColor& color ) const;
///////////////////////////////////////////////////////////////
+12 -6
View File
@@ -68,7 +68,7 @@ namespace glabels
const Distance& shadowY,
double shadowOpacity,
const ColorNode& shadowColorNode )
: ModelObject( x0, y0, dx, dy,
: ModelObject( x0, y0, dx, dy, false /*lockAspectRatio*/,
matrix,
shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode )
{
@@ -186,10 +186,13 @@ namespace glabels
///
/// Draw shadow of object
///
void ModelLineObject::drawShadow( QPainter* painter, bool inEditor, merge::Record* record ) const
void ModelLineObject::drawShadow( QPainter* painter,
bool inEditor,
merge::Record* record,
Variables* variables ) const
{
QColor lineColor = mLineColorNode.color( record );
QColor shadowColor = mShadowColorNode.color( record );
QColor lineColor = mLineColorNode.color( record, variables );
QColor shadowColor = mShadowColorNode.color( record, variables );
shadowColor.setAlphaF( mShadowOpacity );
@@ -204,9 +207,12 @@ namespace glabels
///
/// Draw object itself
///
void ModelLineObject::drawObject( QPainter* painter, bool inEditor, merge::Record* record ) const
void ModelLineObject::drawObject( QPainter* painter,
bool inEditor,
merge::Record* record,
Variables* variables ) const
{
QColor lineColor = mLineColorNode.color( record );
QColor lineColor = mLineColorNode.color( record, variables );
painter->setPen( QPen( lineColor, mLineWidth.pt() ) );
painter->drawLine( 0, 0, mW.pt(), mH.pt() );
+10 -2
View File
@@ -97,8 +97,16 @@ namespace glabels
// Drawing operations
///////////////////////////////////////////////////////////////
protected:
void drawShadow( QPainter* painter, bool inEditor, merge::Record* record ) const override;
void drawObject( QPainter* painter, bool inEditor, merge::Record* record ) const override;
void drawShadow( QPainter* painter,
bool inEditor,
merge::Record* record,
Variables* variables ) const override;
void drawObject( QPainter* painter,
bool inEditor,
merge::Record* record,
Variables* variables ) const override;
QPainterPath hoverPath( double scale ) const override;
+32 -3
View File
@@ -51,6 +51,7 @@ namespace glabels
mY0 = 0;
mW = 0;
mH = 0;
mLockAspectRatio = false;
mMatrix = QMatrix();
mShadowState = false;
@@ -72,6 +73,7 @@ namespace glabels
const Distance& y0,
const Distance& w,
const Distance& h,
bool lockAspectRatio,
const QMatrix& matrix,
bool shadowState,
const Distance& shadowX,
@@ -85,6 +87,7 @@ namespace glabels
mY0 = y0;
mW = w;
mH = h;
mLockAspectRatio = lockAspectRatio;
mMatrix = matrix;
mShadowState = shadowState;
@@ -112,6 +115,7 @@ namespace glabels
mY0 = object->mY0;
mW = object->mW;
mH = object->mH;
mLockAspectRatio = object->mLockAspectRatio;
mShadowState = object->mShadowState;
mShadowX = object->mShadowX;
@@ -272,6 +276,28 @@ namespace glabels
}
///
/// Lock Aspect Ratio Property Getter
///
bool ModelObject::lockAspectRatio() const
{
return mLockAspectRatio;
}
///
/// Lock Aspect Ratio Property Setter
///
void ModelObject::setLockAspectRatio( bool value )
{
if ( mLockAspectRatio != value )
{
mLockAspectRatio = value;
emit changed();
}
}
///
/// Matrix Property Getter
///
@@ -1200,7 +1226,10 @@ namespace glabels
///
/// Draw object + shadow
///
void ModelObject::draw( QPainter* painter, bool inEditor, merge::Record* record ) const
void ModelObject::draw( QPainter* painter,
bool inEditor,
merge::Record* record,
Variables* variables ) const
{
painter->save();
painter->translate( mX0.pt(), mY0.pt() );
@@ -1210,12 +1239,12 @@ namespace glabels
painter->save();
painter->translate( mShadowX.pt(), mShadowY.pt() );
painter->setMatrix( mMatrix, true );
drawShadow( painter, inEditor, record );
drawShadow( painter, inEditor, record, variables );
painter->restore();
}
painter->setMatrix( mMatrix, true );
drawObject( painter, inEditor, record );
drawObject( painter, inEditor, record, variables );
painter->restore();
}
+25 -3
View File
@@ -27,6 +27,7 @@
#include "Handles.h"
#include "Outline.h"
#include "TextNode.h"
#include "Variables.h"
#include "barcode/Style.h"
#include "merge/Record.h"
@@ -64,6 +65,7 @@ namespace glabels
const Distance& y0,
const Distance& w,
const Distance& h,
bool lockAspectRatio = false,
const QMatrix& matrix = QMatrix(),
bool shadowState = false,
const Distance& shadowX = 0,
@@ -136,6 +138,13 @@ namespace glabels
void setH( const Distance& value );
//
// Lock Aspect Ratio Property
//
bool lockAspectRatio() const;
void setLockAspectRatio( bool value );
//
// Transformation Matrix Property
//
@@ -403,12 +412,24 @@ namespace glabels
// Drawing operations
///////////////////////////////////////////////////////////////
public:
void draw( QPainter* painter, bool inEditor, merge::Record* record ) const;
void draw( QPainter* painter,
bool inEditor,
merge::Record* record,
Variables* variables ) const;
void drawSelectionHighlight( QPainter* painter, double scale ) const;
protected:
virtual void drawShadow( QPainter* painter, bool inEditor, merge::Record* record ) const = 0;
virtual void drawObject( QPainter* painter, bool inEditor, merge::Record* record ) const = 0;
virtual void drawShadow( QPainter* painter,
bool inEditor,
merge::Record* record,
Variables* variables ) const = 0;
virtual void drawObject( QPainter* painter,
bool inEditor,
merge::Record* record,
Variables* variables ) const = 0;
virtual QPainterPath hoverPath( double scale ) const = 0;
virtual void sizeUpdated();
@@ -424,6 +445,7 @@ namespace glabels
Distance mY0;
Distance mW;
Distance mH;
bool mLockAspectRatio;
bool mShadowState;
Distance mShadowX;
+2 -1
View File
@@ -58,6 +58,7 @@ namespace glabels
const Distance& y0,
const Distance& w,
const Distance& h,
bool lockAspectRatio,
const Distance& lineWidth,
const ColorNode& lineColorNode,
const ColorNode& fillColorNode,
@@ -67,7 +68,7 @@ namespace glabels
const Distance& shadowY,
double shadowOpacity,
const ColorNode& shadowColorNode )
: ModelObject( x0, y0, w, h,
: ModelObject( x0, y0, w, h, lockAspectRatio,
matrix,
shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode )
{
+1
View File
@@ -47,6 +47,7 @@ namespace glabels
const Distance& y0,
const Distance& w,
const Distance& h,
bool lockAspectRatio,
const Distance& lineWidth,
const ColorNode& lineColorNode,
const ColorNode& fillColorNode,
+17 -13
View File
@@ -82,6 +82,7 @@ namespace glabels
const Distance& y0,
const Distance& w,
const Distance& h,
bool lockAspectRatio,
const QString& text,
const QString& fontFamily,
double fontSize,
@@ -100,7 +101,7 @@ namespace glabels
const Distance& shadowY,
double shadowOpacity,
const ColorNode& shadowColorNode )
: ModelObject( x0, y0, w, h,
: ModelObject( x0, y0, w, h, lockAspectRatio,
matrix,
shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode )
{
@@ -518,13 +519,14 @@ namespace glabels
///
void ModelTextObject::drawShadow( QPainter* painter,
bool inEditor,
merge::Record* record ) const
merge::Record* record,
Variables* variables ) const
{
QColor textColor = mTextColorNode.color( record );
QColor textColor = mTextColorNode.color( record, variables );
if ( textColor.alpha() )
{
QColor shadowColor = mShadowColorNode.color( record );
QColor shadowColor = mShadowColorNode.color( record, variables );
shadowColor.setAlphaF( mShadowOpacity );
if ( inEditor )
@@ -533,7 +535,7 @@ namespace glabels
}
else
{
drawText( painter, shadowColor, record );
drawText( painter, shadowColor, record, variables );
}
}
}
@@ -544,9 +546,10 @@ namespace glabels
///
void ModelTextObject::drawObject( QPainter* painter,
bool inEditor,
merge::Record* record ) const
merge::Record* record,
Variables* variables ) const
{
QColor textColor = mTextColorNode.color( record );
QColor textColor = mTextColorNode.color( record, variables );
if ( inEditor )
{
@@ -554,7 +557,7 @@ namespace glabels
}
else
{
drawText( painter, textColor, record );
drawText( painter, textColor, record, variables );
}
}
@@ -696,7 +699,8 @@ namespace glabels
void
ModelTextObject::drawText( QPainter* painter,
const QColor& color,
merge::Record* record ) const
merge::Record* record,
Variables* variables ) const
{
painter->save();
@@ -704,7 +708,7 @@ namespace glabels
QFont font;
font.setFamily( mFontFamily );
font.setPointSizeF( mTextAutoShrink ? autoShrinkFontSize( record ) : mFontSize );
font.setPointSizeF( mTextAutoShrink ? autoShrinkFontSize( record, variables ) : mFontSize );
font.setWeight( mFontWeight );
font.setItalic( mFontItalicFlag );
font.setUnderline( mFontUnderlineFlag );
@@ -716,7 +720,7 @@ namespace glabels
QFontMetricsF fontMetrics( font );
double dy = fontMetrics.lineSpacing() * mTextLineSpacing;
QTextDocument document( mText.expand( record ) );
QTextDocument document( mText.expand( record, variables ) );
QList<QTextLayout*> layouts;
@@ -790,7 +794,7 @@ namespace glabels
/// Determine auto shrink font size
///
double
ModelTextObject::autoShrinkFontSize( merge::Record* record ) const
ModelTextObject::autoShrinkFontSize( merge::Record* record, Variables* variables ) const
{
QFont font;
font.setFamily( mFontFamily );
@@ -802,7 +806,7 @@ namespace glabels
textOption.setAlignment( mTextHAlign );
textOption.setWrapMode( mTextWrapMode );
QTextDocument document( mText.expand( record ) );
QTextDocument document( mText.expand( record, variables ) );
double candidateSize = mFontSize;
while ( candidateSize > 1.0 )
+22 -6
View File
@@ -50,6 +50,7 @@ namespace glabels
const Distance& y0,
const Distance& w,
const Distance& h,
bool lockAspectRatio,
const QString& text,
const QString& fontFamily,
double fontSize,
@@ -185,8 +186,16 @@ namespace glabels
// Drawing operations
///////////////////////////////////////////////////////////////
protected:
void drawShadow( QPainter* painter, bool inEditor, merge::Record* record ) const override;
void drawObject( QPainter* painter, bool inEditor, merge::Record* record ) const override;
void drawShadow( QPainter* painter,
bool inEditor,
merge::Record* record,
Variables* variables ) const override;
void drawObject( QPainter* painter,
bool inEditor,
merge::Record* record,
Variables* variables ) const override;
QPainterPath hoverPath( double scale ) const override;
@@ -196,10 +205,17 @@ namespace glabels
private:
void sizeUpdated() override;
void update();
void drawTextInEditor( QPainter* painter, const QColor& color ) const;
void drawText( QPainter* painter, const QColor&color, merge::Record* record ) const;
QString expandText( QString text, merge::Record* record ) const;
double autoShrinkFontSize( merge::Record* record ) const;
void drawTextInEditor( QPainter* painter,
const QColor& color ) const;
void drawText( QPainter* painter,
const QColor& color,
merge::Record* record,
Variables* variables ) const;
double autoShrinkFontSize( merge::Record* record,
Variables* variables ) const;
///////////////////////////////////////////////////////////////
+84 -57
View File
@@ -47,7 +47,7 @@ namespace glabels
PageRenderer::PageRenderer( const Model* model )
: mModel(nullptr), mMerge(nullptr), mNCopies(0), mStartLabel(0), mLastLabel(0),
: mModel(nullptr), mMerge(nullptr), mVariables(nullptr), mNCopies(0), mStartLabel(0), mLastLabel(0),
mPrintOutlines(false), mPrintCropMarks(false), mPrintReverse(false),
mIPage(0), mIsMerge(false), mNPages(0), mNLabelsPerPage(0)
{
@@ -65,6 +65,7 @@ namespace glabels
connect( mModel, SIGNAL(changed()), this, SLOT(onModelChanged()) );
onModelChanged();
mVariables = mModel->variables();
}
@@ -246,83 +247,107 @@ namespace glabels
void PageRenderer::printSimplePage( QPainter* painter, int iPage ) const
{
int iStart = 0;
int iEnd = mNLabelsPerPage;
if ( iPage == 0 )
{
iStart = mStartLabel;
}
if ( (mLastLabel / mNLabelsPerPage) == iPage )
{
iEnd = mLastLabel % mNLabelsPerPage;
}
printCropMarks( painter );
for ( int i = iStart; i < iEnd; i++ )
int iCopy = 0;
int iLabel = mStartLabel;
int iCurrentPage = 0;
mVariables->resetVariables();
while ( (iCopy < mNCopies) && (iCurrentPage <= iPage) )
{
painter->save();
if ( iCurrentPage == iPage )
{
int i = iLabel % mNLabelsPerPage;
painter->save();
painter->translate( mOrigins[i].x().pt(), mOrigins[i].y().pt() );
painter->translate( mOrigins[i].x().pt(), mOrigins[i].y().pt() );
painter->save();
painter->save();
clipLabel( painter );
printLabel( painter, nullptr );
clipLabel( painter );
printLabel( painter, nullptr, mVariables );
painter->restore(); // From before clip
painter->restore(); // From before clip
printOutline( painter );
printOutline( painter );
painter->restore(); // From before translation
painter->restore(); // From before translation
}
iCopy++;
iLabel++;
iCurrentPage = iLabel / mNLabelsPerPage;
mVariables->incrementVariablesOnItem();
mVariables->incrementVariablesOnCopy();
if ( (iLabel % mNLabelsPerPage) == 0 /* starting a new page */ )
{
mVariables->incrementVariablesOnPage();
}
}
}
void PageRenderer::printMergePage( QPainter* painter, int iPage ) const
{
int iRecord = 0;
int iStart = 0;
int iEnd = mNLabelsPerPage;
if ( iPage == 0 )
{
iStart = mStartLabel;
}
if ( (mLastLabel / mNLabelsPerPage) == iPage )
{
iEnd = mLastLabel % mNLabelsPerPage;
}
const QList<merge::Record*> records = mMerge->selectedRecords();
if ( records.size() )
{
iRecord = (iPage*mNLabelsPerPage + iStart - mStartLabel) % records.size();
}
printCropMarks( painter );
for ( int i = iStart; i < iEnd; i++ )
int iCopy = 0;
int iLabel = mStartLabel;
int iCurrentPage = 0;
const QList<merge::Record*> records = mMerge->selectedRecords();
int iRecord = 0;
int nRecords = records.size();
if ( nRecords == 0 )
{
painter->save();
painter->translate( mOrigins[i].x().pt(), mOrigins[i].y().pt() );
return;
}
painter->save();
mVariables->resetVariables();
clipLabel( painter );
printLabel( painter, records[iRecord] );
while ( (iCopy < mNCopies) && (iCurrentPage <= iPage) )
{
if ( iCurrentPage == iPage )
{
int i = iLabel % mNLabelsPerPage;
painter->save();
painter->restore(); // From before clip
printOutline( painter );
painter->translate( mOrigins[i].x().pt(), mOrigins[i].y().pt() );
painter->restore(); // From before translation
painter->save();
iRecord = (iRecord + 1) % records.size();
clipLabel( painter );
printLabel( painter, records[iRecord], mVariables );
painter->restore(); // From before clip
printOutline( painter );
painter->restore(); // From before translation
}
iRecord = (iRecord + 1) % nRecords;
if ( iRecord == 0 )
{
iCopy++;
}
iLabel++;
iCurrentPage = iLabel / mNLabelsPerPage;
mVariables->incrementVariablesOnItem();
if ( iRecord == 0 )
{
mVariables->incrementVariablesOnCopy();
}
if ( (iLabel % mNLabelsPerPage) == 0 /* starting a new page */ )
{
mVariables->incrementVariablesOnPage();
}
}
}
@@ -408,7 +433,9 @@ namespace glabels
}
void PageRenderer::printLabel( QPainter* painter, merge::Record* record ) const
void PageRenderer::printLabel( QPainter* painter,
merge::Record* record,
Variables* variables ) const
{
painter->save();
@@ -424,7 +451,7 @@ namespace glabels
painter->scale( -1, 1 );
}
mModel->draw( painter, false, record );
mModel->draw( painter, false, record, variables );
painter->restore();
}
+3 -1
View File
@@ -23,6 +23,7 @@
#include "Point.h"
#include "Variables.h"
#include "merge/Merge.h"
#include "merge/Record.h"
@@ -100,7 +101,7 @@ namespace glabels
void printCropMarks( QPainter* painter ) const;
void printOutline( QPainter* painter ) const;
void clipLabel( QPainter* painter ) const;
void printLabel( QPainter* painter, merge::Record* record ) const;
void printLabel( QPainter* painter, merge::Record* record, Variables* variables ) const;
/////////////////////////////////
@@ -109,6 +110,7 @@ namespace glabels
private:
const Model* mModel;
const merge::Merge* mMerge;
Variables* mVariables;
int mNCopies;
int mStartLabel;
+2 -2
View File
@@ -66,7 +66,7 @@ namespace glabels
///
/// Expand all place holders
///
QString RawText::expand( merge::Record* record ) const
QString RawText::expand( merge::Record* record, Variables* variables ) const
{
QString text;
@@ -74,7 +74,7 @@ namespace glabels
{
if ( token.isField )
{
text += token.field.evaluate( record );
text += token.field.evaluate( record, variables );
}
else
{
+1 -1
View File
@@ -52,7 +52,7 @@ namespace glabels
/////////////////////////////////
QString toString() const;
std::string toStdString() const;
QString expand( merge::Record* record ) const;
QString expand( merge::Record* record, Variables* variables ) const;
bool hasPlaceHolders() const;
bool isEmpty() const;
+15 -3
View File
@@ -42,21 +42,33 @@ namespace glabels
}
QString SubstitutionField::evaluate( const merge::Record* record ) const
QString SubstitutionField::evaluate( const merge::Record* record,
const Variables* variables ) const
{
QString value = mDefaultValue;
if ( record && record->contains(mFieldName) && !record->value(mFieldName).isEmpty() )
bool haveRecordField = record &&
record->contains(mFieldName) &&
!record->value(mFieldName).isEmpty();
bool haveVariable = variables &&
variables->contains(mFieldName) &&
!(*variables)[mFieldName].value().isEmpty();
if ( haveRecordField )
{
value = record->value(mFieldName);
}
else if ( haveVariable )
{
value = (*variables)[mFieldName].value();
}
if ( !mFormatType.isNull() )
{
value = formatValue( value );
}
if ( record && record->contains(mFieldName) && !record->value(mFieldName).isEmpty() && mNewLine )
if ( mNewLine && (haveRecordField || haveVariable) )
{
value = "\n" + value;
}
+2 -1
View File
@@ -21,6 +21,7 @@
#ifndef model_SubstitutionField_h
#define model_SubstitutionField_h
#include "Variables.h"
#include "merge/Record.h"
@@ -39,7 +40,7 @@ namespace glabels
SubstitutionField();
SubstitutionField( const QString& string );
QString evaluate( const merge::Record* record ) const;
QString evaluate( const merge::Record* record, const Variables* variables ) const;
QString fieldName() const;
QString defaultValue() const;
+21 -35
View File
@@ -105,48 +105,34 @@ namespace glabels
///
/// Get text, expand if necessary
///
QString TextNode::text( merge::Record* record ) const
QString TextNode::text( const merge::Record* record,
const Variables* variables ) const
{
if ( mIsField )
QString value("");
bool haveRecordField = mIsField && record &&
record->contains(mData) &&
!record->value(mData).isEmpty();
bool haveVariable = mIsField && variables &&
variables->contains(mData) &&
!(*variables)[mData].value().isEmpty();
if ( haveRecordField )
{
if ( !record )
{
return QString("${%1}").arg( mData );
}
else
{
if ( record->contains( mData ) )
{
return (*record)[ mData ];
}
else
{
return "";
}
}
value = record->value(mData);
}
else
else if ( haveVariable )
{
return mData;
value = (*variables)[mData].value();
}
else if ( !mIsField )
{
value = mData;
}
return value;
}
///
/// Is it an empty field
///
bool TextNode::isEmptyField( merge::Record* record ) const
{
if ( record && mIsField )
{
if ( record->contains( mData ) )
{
return (*record)[mData].isEmpty();
}
}
return false;
}
}
}
+3 -2
View File
@@ -22,6 +22,7 @@
#define model_TextNode_h
#include "Variables.h"
#include "merge/Record.h"
#include <QString>
@@ -76,8 +77,8 @@ namespace glabels
/////////////////////////////////
// Misc. Methods
/////////////////////////////////
QString text( merge::Record* record ) const;
bool isEmptyField( merge::Record* record ) const;
QString text( const merge::Record* record,
const Variables* variables ) const;
/////////////////////////////////
+323
View File
@@ -0,0 +1,323 @@
/* Variable.cpp
*
* Copyright (C) 2013-2016 Jim Evins <evins@snaught.com>
*
* This file is part of gLabels-qt.
*
* gLabels-qt is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* gLabels-qt is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with gLabels-qt. If not, see <http://www.gnu.org/licenses/>.
*/
#include "Variable.h"
namespace glabels
{
namespace model
{
Variable::Variable()
: mType(Type::STRING),
mIncrement(Increment::NEVER),
mStepSize("0"),
mIntegerValue(0),
mIntegerStep(0),
mFloatingPointValue(0),
mFloatingPointStep(0)
{
// empty
}
Variable::Variable( Variable::Type type,
const QString& name,
const QString& initialValue,
Variable::Increment increment,
const QString& stepSize )
: mType(type),
mName(name),
mInitialValue(initialValue),
mIncrement(increment),
mStepSize(stepSize),
mIntegerValue(0),
mIntegerStep(0),
mFloatingPointValue(0),
mFloatingPointStep(0)
{
resetValue();
}
Variable::Type Variable::type() const
{
return mType;
}
QString Variable::name() const
{
return mName;
}
QString Variable::initialValue() const
{
return mInitialValue;
}
Variable::Increment Variable::increment() const
{
return mIncrement;
}
QString Variable::stepSize() const
{
return mStepSize;
}
void Variable::resetValue()
{
switch (mType)
{
case Type::STRING:
// do nothing
break;
case Type::INTEGER:
mIntegerValue = mInitialValue.toLongLong();
mIntegerStep = mStepSize.toLongLong();
break;
case Type::FLOATING_POINT:
mFloatingPointValue = mInitialValue.toDouble();
mFloatingPointStep = mStepSize.toDouble();
break;
case Type::COLOR:
// do nothing
break;
}
}
void Variable::incrementValueOnItem()
{
if ( mIncrement == Increment::PER_ITEM )
{
switch (mType)
{
case Type::STRING:
// do nothing
break;
case Type::INTEGER:
mIntegerValue += mIntegerStep;
break;
case Type::FLOATING_POINT:
mFloatingPointValue += mFloatingPointStep;
break;
case Type::COLOR:
// do nothing
break;
}
}
}
void Variable::incrementValueOnCopy()
{
if ( mIncrement == Increment::PER_COPY )
{
switch (mType)
{
case Type::STRING:
// do nothing
break;
case Type::INTEGER:
mIntegerValue += mIntegerStep;
break;
case Type::FLOATING_POINT:
mFloatingPointValue += mFloatingPointStep;
break;
case Type::COLOR:
// do nothing
break;
}
}
}
void Variable::incrementValueOnPage()
{
if ( mIncrement == Increment::PER_PAGE )
{
switch (mType)
{
case Type::STRING:
// do nothing
break;
case Type::INTEGER:
mIntegerValue += mIntegerStep;
break;
case Type::FLOATING_POINT:
mFloatingPointValue += mFloatingPointStep;
break;
case Type::COLOR:
// do nothing
break;
}
}
}
QString Variable::value() const
{
switch (mType)
{
case Type::STRING:
return mInitialValue;
case Type::INTEGER:
return QString::number( mIntegerValue );
case Type::FLOATING_POINT:
return QString::number( mFloatingPointValue, 'g', 15 );
case Type::COLOR:
return mInitialValue;
default:
return mInitialValue;
}
}
QString Variable::typeToI18nString( Type type )
{
switch (type)
{
case Type::STRING:
return tr("String");
case Type::INTEGER:
return tr("Integer");
case Type::FLOATING_POINT:
return tr("Floating Point");
case Type::COLOR:
return tr("Color");
default:
return tr("String");
}
}
QString Variable::typeToIdString( Type type )
{
switch (type)
{
case Type::STRING:
return "string";
case Type::INTEGER:
return "integer";
case Type::FLOATING_POINT:
return "float";
case Type::COLOR:
return "color";
default:
return "string";
}
}
Variable::Type Variable::idStringToType( const QString& id )
{
if ( id == "string" )
{
return Type::STRING;
}
else if ( id == "integer" )
{
return Type::INTEGER;
}
else if ( id == "float" )
{
return Type::FLOATING_POINT;
}
if ( id == "color" )
{
return Type::COLOR;
}
else
{
return Type::STRING; // Default
}
}
QString Variable::incrementToI18nString( Increment increment )
{
switch (increment)
{
case Increment::NEVER:
return tr("Never");
case Increment::PER_ITEM:
return tr("Per item");
case Increment::PER_COPY:
return tr("Per copy");
case Increment::PER_PAGE:
return tr("Per page");
default:
return tr("Never");
}
}
QString Variable::incrementToIdString( Increment increment )
{
switch (increment)
{
case Increment::NEVER:
return "never";
case Increment::PER_ITEM:
return "per_item";
case Increment::PER_COPY:
return "per_copy";
case Increment::PER_PAGE:
return "per_page";
default:
return "never";
}
}
Variable::Increment Variable::idStringToIncrement( const QString& id )
{
if ( id == "never" )
{
return Increment::NEVER;
}
else if ( id == "per_item" )
{
return Increment::PER_ITEM;
}
else if ( id == "per_copy" )
{
return Increment::PER_COPY;
}
else if ( id == "per_page" )
{
return Increment::PER_PAGE;
}
else
{
return Increment::NEVER; // Default
}
}
}
}
+107
View File
@@ -0,0 +1,107 @@
/* Variable.h
*
* Copyright (C) 2019 Jim Evins <evins@snaught.com>
*
* This file is part of gLabels-qt.
*
* gLabels-qt is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* gLabels-qt is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with gLabels-qt. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef model_Variable_h
#define model_Variable_h
#include <QCoreApplication>
#include <QString>
namespace glabels
{
namespace model
{
class Variable
{
Q_DECLARE_TR_FUNCTIONS(Variable)
public:
enum class Type
{
STRING,
INTEGER,
FLOATING_POINT,
COLOR
};
enum class Increment
{
NEVER,
PER_ITEM,
PER_COPY,
PER_PAGE
};
public:
Variable();
Variable( Type type,
const QString& name,
const QString& initialValue,
Increment increment = Increment::NEVER,
const QString& stepSize = "0" );
virtual ~Variable() = default;
Type type() const;
QString name() const;
QString initialValue() const;
Increment increment() const;
QString stepSize() const;
void resetValue();
void incrementValueOnItem();
void incrementValueOnCopy();
void incrementValueOnPage();
QString value() const;
static QString typeToI18nString( Type type );
static QString typeToIdString( Type type );
static Type idStringToType( const QString& string );
static QString incrementToI18nString( Increment increment );
static QString incrementToIdString( Increment increment );
static Increment idStringToIncrement( const QString& string );
private:
Type mType;
QString mName;
QString mInitialValue;
Increment mIncrement;
QString mStepSize;
long long mIntegerValue;
long long mIntegerStep;
double mFloatingPointValue;
double mFloatingPointStep;
};
}
}
#endif // model_Variable_h
+138
View File
@@ -0,0 +1,138 @@
/* Variables.cpp
*
* Copyright (C) 2013-2016 Jim Evins <evins@snaught.com>
*
* This file is part of gLabels-qt.
*
* gLabels-qt is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* gLabels-qt is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with gLabels-qt. If not, see <http://www.gnu.org/licenses/>.
*/
#include "Variables.h"
#include <QtDebug>
namespace glabels
{
namespace model
{
///
/// Copy constructor
///
Variables::Variables( const Variables* variables )
: QMap<QString,Variable>(*variables)
{
}
///
/// Clone
///
Variables* Variables::clone() const
{
return new Variables( this );
}
///
/// Do we have variable?
///
bool Variables::hasVariable( const QString& name ) const
{
return contains(name);
}
///
/// Add variable ( will replace if name is the same )
///
void Variables::addVariable( const Variable& variable )
{
insert( variable.name(), variable );
emit changed();
}
///
/// Delete variable
///
void Variables::deleteVariable( const QString& name )
{
remove( name );
emit changed();
}
///
/// Replace variable
///
void Variables::replaceVariable( const QString& origName, const Variable& variable )
{
remove( origName );
insert( variable.name(), variable );
emit changed();
}
///
/// Reset variables to their initial values
///
void Variables::resetVariables()
{
for ( auto& v : *this )
{
v.resetValue();
}
}
///
/// Increment variables on item
///
void Variables::incrementVariablesOnItem()
{
for ( auto& v : *this )
{
v.incrementValueOnItem();
}
}
///
/// Increment variables on copy
///
void Variables::incrementVariablesOnCopy()
{
for ( auto& v : *this )
{
v.incrementValueOnCopy();
}
}
///
/// Increment variables on page
///
void Variables::incrementVariablesOnPage()
{
for ( auto& v : *this )
{
v.incrementValueOnPage();
}
}
} // namespace model
} // namespace glabels
+90
View File
@@ -0,0 +1,90 @@
/* Variables.h
*
* Copyright (C) 2013-2016 Jim Evins <evins@snaught.com>
*
* This file is part of gLabels-qt.
*
* gLabels-qt is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* gLabels-qt is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with gLabels-qt. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef model_Variables_h
#define model_Variables_h
#include "Variable.h"
#include <QMap>
#include <QObject>
#include <QString>
namespace glabels
{
namespace model
{
///
/// Variables Collection
///
class Variables : public QObject, public QMap<QString,Variable>
{
Q_OBJECT
/////////////////////////////////
// Life Cycle
/////////////////////////////////
public:
Variables() = default;
Variables( const Variables* variables );
/////////////////////////////////
// Object duplication
/////////////////////////////////
Variables* clone() const;
/////////////////////////////////
// Methods
/////////////////////////////////
bool hasVariable( const QString& name ) const;
void addVariable( const Variable& variable );
void deleteVariable( const QString& name );
void replaceVariable( const QString& name, const Variable& variable );
void resetVariables();
void incrementVariablesOnItem();
void incrementVariablesOnCopy();
void incrementVariablesOnPage();
/////////////////////////////////
// Signals
/////////////////////////////////
signals:
void changed();
/////////////////////////////////
// Private data
/////////////////////////////////
private:
};
}
}
#endif // model_Variables_h

Some files were not shown because too many files have changed in this diff Show More