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 - set PATH=%PATH%;%QTDIR%/bin
build_script: build_script:
- git checkout master # re-attach to master to satisfy auto version tooling
- mkdir build - mkdir build
- cd build - cd build
- cmake -G "Visual Studio 15 2017 Win64" -DCMAKE_PREFIX_PATH=%QTDIR% .. - cmake -G "Visual Studio 15 2017 Win64" -DCMAKE_PREFIX_PATH=%QTDIR% ..
+3
View File
@@ -34,3 +34,6 @@ core
*.sav* *.sav*
.directory .directory
TEST-DATA TEST-DATA
SAV*
OLD*
+4 -1
View File
@@ -10,9 +10,12 @@ before_install:
install: install:
- sudo apt-get -y install qt59base qt59svg qt59tools qt59translations zlib1g-dev xvfb - sudo apt-get -y install qt59base qt59svg qt59tools qt59translations zlib1g-dev xvfb
- sudo apt-get -y install barcode libqrencode-dev - 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 - source /opt/qt5*/bin/qt5*-env.sh
script: 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 - mkdir build
- cd build - cd build
- cmake .. -DCMAKE_INSTALL_PREFIX=/usr - 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" - wget -c "https://github.com/jimevins/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage"
- chmod a+x linuxdeployqt*.AppImage - chmod a+x linuxdeployqt*.AppImage
- unset QTDIR; unset QT_PLUGIN_PATH ; unset LD_LIBRARY_PATH - 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 -bundle-non-qt-libs
- ./linuxdeployqt*.AppImage ./appdir/usr/share/applications/*.desktop -appimage - ./linuxdeployqt*.AppImage ./appdir/usr/share/applications/*.desktop -appimage
- find ./appdir -executable -type f -exec ldd {} \; | grep " => /usr" | cut -d " " -f 2-3 | sort | uniq - 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 (WEBSITE "glabels.org")
set (BUG_WEBSITE "https://github.com/jimevins/glabels-qt/issues") 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( execute_process(
COMMAND git log -1 --format=%h COMMAND git log -1 --format=%h
RESULT_VARIABLE COMMIT_HASH_VALID RESULT_VARIABLE COMMIT_HASH_VALID
@@ -38,11 +58,16 @@ if (NOT ${COMMIT_DATE_VALID} STREQUAL "0")
endif () endif ()
# Uncomment for snapshots, comment for releases # 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 # Uncomment for releases, comment for snapshots
#set(VERSION_STRING "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") #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 # Packaging Information
@@ -147,7 +172,7 @@ add_subdirectory (data)
#======================================= #=======================================
message (STATUS "") message (STATUS "")
message (STATUS "Project name ............ " ${CMAKE_PROJECT_NAME}) 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 "Installation prefix ..... " ${CMAKE_INSTALL_PREFIX})
message (STATUS "Source code location .... " ${glabels_SOURCE_DIR}) message (STATUS "Source code location .... " ${glabels_SOURCE_DIR})
message (STATUS "CMake version ........... " ${CMAKE_VERSION}) 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::kix", Zint::Kix::create );
glbarcode::Factory::registerType( "zint::ean", Zint::Ean::create ); glbarcode::Factory::registerType( "zint::ean", Zint::Ean::create );
glbarcode::Factory::registerType( "zint::gmtx", Zint::Gmtx::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::rss14", Zint::Rss14::create );
glbarcode::Factory::registerType( "zint::rssltd", Zint::Rssltd::create ); glbarcode::Factory::registerType( "zint::rssltd", Zint::Rssltd::create );
glbarcode::Factory::registerType( "zint::rssexp", Zint::Rssexp::create ); glbarcode::Factory::registerType( "zint::rssexp", Zint::Rssexp::create );
-1
View File
@@ -80,7 +80,6 @@ namespace glabels
QRcode_free( qrcode ); QRcode_free( qrcode );
QRcode_clearCache();
return true; return true;
} }
+1 -1
View File
@@ -31,7 +31,7 @@ namespace glabels
/// ///
/// Constructor /// 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 ) foreach ( Record* record, merge->mRecordList )
{ {
+1 -1
View File
@@ -45,7 +45,7 @@ namespace glabels
Text::Text( const Text* merge ) Text::Text( const Text* merge )
: Merge( merge ), : Merge( merge ),
mDelimeter(merge->mDelimeter), mLine1HasKeys(merge->mLine1HasKeys), 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_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) if (LIBZINT_LIBRARY AND LIBZINT_INCLUDE_DIR)
+45 -2
View File
@@ -1,7 +1,8 @@
gLabels Linux Build Instructions gLabels Linux Build Instructions
================================ ================================
## Prerequisites ## General
### Prerequisites
- g++ - g++
- CMake 2.8.12+ - 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 > may also need to be installed. Development packages are usually named something like
> libraryName-dev or libraryName-devel. > 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: gLabels uses the CMake meta build system. Use the following commands to build and install gLabels:
@@ -24,3 +25,45 @@ $ cmake ..
$ make $ make
$ sudo make install $ sudo make install
</pre> </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; 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 Modifiers
--------- ---------
### Format-Modifier (`%`) ### 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. `${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 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::setOrganizationName( "glabels.org" );
QCoreApplication::setOrganizationDomain( "glabels.org" ); QCoreApplication::setOrganizationDomain( "glabels.org" );
QCoreApplication::setApplicationName( "glabels-batch-qt" ); QCoreApplication::setApplicationName( "glabels-batch-qt" );
QCoreApplication::setApplicationVersion( glabels::model::Version::STRING ); QCoreApplication::setApplicationVersion( glabels::model::Version::LONG_STRING );
// //
// Setup translators // Setup translators
@@ -175,7 +175,7 @@ int main( int argc, char **argv )
} }
glabels::model::PageRenderer renderer( model ); glabels::model::PageRenderer renderer( model );
renderer.setNCopies( 1 ); renderer.setNCopies( parser.value( "copies" ).toInt() );
renderer.setStartLabel( parser.value( "first" ).toInt() - 1 ); renderer.setStartLabel( parser.value( "first" ).toInt() - 1 );
renderer.setPrintOutlines( parser.isSet( "outlines" ) ); renderer.setPrintOutlines( parser.isSet( "outlines" ) );
renderer.setPrintCropMarks( parser.isSet( "crop-marks" ) ); renderer.setPrintCropMarks( parser.isSet( "crop-marks" ) );
+1 -1
View File
@@ -38,7 +38,7 @@ namespace glabels
{ {
setupUi( this ); 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."); QString description = tr("A program to create labels and business cards.");
+6 -2
View File
@@ -13,9 +13,9 @@ set (glabels_sources
ColorHistory.cpp ColorHistory.cpp
ColorPaletteDialog.cpp ColorPaletteDialog.cpp
ColorPaletteItem.cpp ColorPaletteItem.cpp
ColorPaletteButtonItem.cpp
ColorSwatch.cpp ColorSwatch.cpp
Cursors.cpp Cursors.cpp
EditVariableDialog.cpp
FieldButton.cpp FieldButton.cpp
File.cpp File.cpp
Help.cpp Help.cpp
@@ -40,6 +40,7 @@ set (glabels_sources
TemplatePicker.cpp TemplatePicker.cpp
TemplatePickerItem.cpp TemplatePickerItem.cpp
UndoRedoModel.cpp UndoRedoModel.cpp
VariablesView.cpp
) )
set (glabels_qobject_headers set (glabels_qobject_headers
@@ -51,7 +52,7 @@ set (glabels_qobject_headers
ColorHistory.h ColorHistory.h
ColorPaletteDialog.h ColorPaletteDialog.h
ColorPaletteItem.h ColorPaletteItem.h
ColorPaletteButtonItem.h EditVariableDialog.h
FieldButton.h FieldButton.h
File.h File.h
LabelEditor.h LabelEditor.h
@@ -69,10 +70,12 @@ set (glabels_qobject_headers
TemplateDesigner.h TemplateDesigner.h
TemplatePicker.h TemplatePicker.h
UndoRedoModel.h UndoRedoModel.h
VariablesView.h
) )
set (glabels_forms set (glabels_forms
ui/AboutDialog.ui ui/AboutDialog.ui
ui/EditVariableDialog.ui
ui/MergeView.ui ui/MergeView.ui
ui/ObjectEditor.ui ui/ObjectEditor.ui
ui/PreferencesDialog.ui ui/PreferencesDialog.ui
@@ -95,6 +98,7 @@ set (glabels_forms
ui/TemplateDesignerOneLayoutPage.ui ui/TemplateDesignerOneLayoutPage.ui
ui/TemplateDesignerTwoLayoutPage.ui ui/TemplateDesignerTwoLayoutPage.ui
ui/TemplateDesignerApplyPage.ui ui/TemplateDesignerApplyPage.ui
ui/VariablesView.ui
) )
set (glabels_resource_files set (glabels_resource_files
+10 -11
View File
@@ -48,8 +48,9 @@ namespace glabels
void ColorButton::init( const QString& defaultLabel, void ColorButton::init( const QString& defaultLabel,
const QColor& defaultColor, const QColor& defaultColor,
const QColor& color ) const QColor& color,
bool showUseFieldButton )
{ {
mDefaultColor = defaultColor; mDefaultColor = defaultColor;
mColorNode = model::ColorNode( color ); mColorNode = model::ColorNode( color );
@@ -61,7 +62,10 @@ namespace glabels
setText( "" ); setText( "" );
setCheckable( true ); 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( this, SIGNAL(toggled(bool)), this, SLOT(onButtonToggled(bool)) );
connect( mDialog, SIGNAL(colorChanged(model::ColorNode,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 ); mDialog->setKeys( merge, variables );
}
void ColorButton::clearKeys()
{
mDialog->clearKeys();
} }
+8 -3
View File
@@ -58,13 +58,18 @@ namespace glabels
// Public Methods // Public Methods
///////////////////////////////// /////////////////////////////////
public: 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 setColorNode( model::ColorNode colorNode );
void setColor( QColor color ); void setColor( QColor color );
void setToDefault(); void setToDefault();
model::ColorNode colorNode(); 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 // Remove any occurrences of this color already in list
colorList.removeAll( color ); nameColorList.removeAll( nameColor );
// Now add to list // Now add to list
colorList.append( color ); nameColorList.append( nameColor );
// Remove oldest colors, if size exceeds current max // 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(); emit changed();
} }
@@ -70,55 +72,83 @@ namespace glabels
QList<QColor> ColorHistory::getColors() 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; QList<QColor> colorList;
foreach ( QString colorName, colorNameList )
for ( QString& nameColor : readNameColorList() )
{ {
colorList << QColor( colorName ); QStringList v = nameColor.split( ':' );
} if ( v.size() == 2 )
{
// Remove oldest colors, if size exceeds current max colorList << QColor( v[1] );
while ( colorList.size() > MAX_COLORS ) }
{ else if ( v.size() == 1 )
colorList.removeFirst(); {
// Old-style, no name
colorList << QColor( v[0] );
}
else
{
// Should not happen
qWarning() << "Invalid color history.";
}
} }
return colorList; return colorList;
} }
void ColorHistory::writeColorList( const QList<QColor>& colorList ) QStringList ColorHistory::getNames()
{ {
// Build name list QStringList nameList;
QStringList colorNameList;
foreach ( QColor color, colorList ) 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 // Save
QSettings settings; QSettings settings;
settings.beginGroup( "ColorHistory" ); settings.beginGroup( "ColorHistory" );
settings.setValue( "colors", colorNameList ); settings.setValue( "colors", nameColorList );
settings.endGroup(); settings.endGroup();
} }
+4 -4
View File
@@ -60,17 +60,17 @@ namespace glabels
// Public Methods // Public Methods
///////////////////////////////// /////////////////////////////////
public: public:
void addColor( const QColor &color ); void addColor( const QColor& color, const QString& name );
QList<QColor> getColors(); QList<QColor> getColors();
QColor getColor( int id ); QStringList getNames();
///////////////////////////////// /////////////////////////////////
// Private Methods // Private Methods
///////////////////////////////// /////////////////////////////////
private: private:
QList<QColor> readColorList(); QStringList readNameColorList();
void writeColorList( const QList<QColor>& colorList ); 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/>. * along with gLabels-qt. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "ColorPaletteDialog.h" #include "ColorPaletteDialog.h"
#include <QColorDialog> #include <QColorDialog>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QFrame>
#include <QGridLayout> #include <QGridLayout>
#include <QGroupBox>
#include <QHBoxLayout>
#include <QPushButton>
#include <QStandardItemModel> #include <QStandardItemModel>
#include <QVBoxLayout>
#include <QtDebug> #include <QtDebug>
@@ -83,6 +85,7 @@ namespace glabels
ColorPaletteDialog::ColorPaletteDialog( const QString& defaultLabel, ColorPaletteDialog::ColorPaletteDialog( const QString& defaultLabel,
const QColor& defaultColor, const QColor& defaultColor,
const QColor& color, const QColor& color,
bool showUseFieldButton,
QWidget* parent ) QWidget* parent )
: QDialog( parent ) : QDialog( parent )
{ {
@@ -99,14 +102,12 @@ namespace glabels
vLayout->setContentsMargins( 0, 0, 0, 0 ); vLayout->setContentsMargins( 0, 0, 0, 0 );
vLayout->setSpacing( 0 ); vLayout->setSpacing( 0 );
auto* defaultButton = new ColorPaletteButtonItem( defaultLabel ); //
connect( defaultButton, SIGNAL(activated()), this, SLOT(onDefaultItemActivated()) ); // Construct Standard Colors Grid
vLayout->addWidget( defaultButton ); //
auto* standardColorsGroup = new QGroupBox( tr("Standard Colors") );
QFrame* hline1 = new QFrame; standardColorsGroup->setAlignment( Qt::AlignHCenter );
hline1->setFrameStyle( QFrame::HLine | QFrame::Plain ); vLayout->addWidget( standardColorsGroup );
hline1->setLineWidth( 1 );
vLayout->addWidget( hline1 );
auto* mainPaletteLayout = new QGridLayout(); auto* mainPaletteLayout = new QGridLayout();
mainPaletteLayout->setSpacing( 0 ); mainPaletteLayout->setSpacing( 0 );
@@ -119,17 +120,20 @@ namespace glabels
ColorPaletteItem* item = new ColorPaletteItem( i, ColorPaletteItem* item = new ColorPaletteItem( i,
QColor( mColorTable[i].colorSpec ), QColor( mColorTable[i].colorSpec ),
tr(mColorTable[i].trname) ); 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 ); mainPaletteLayout->addWidget( item, iRow, iCol );
} }
} }
vLayout->addLayout( mainPaletteLayout ); standardColorsGroup->setLayout( mainPaletteLayout );
QFrame* hline2 = new QFrame; //
hline2->setFrameStyle( QFrame::HLine | QFrame::Plain ); // Construct Recent Colors Grid
hline2->setLineWidth( 1 ); //
vLayout->addWidget( hline2 ); auto* recentColorsGroup = new QGroupBox( tr("Recent Colors") );
recentColorsGroup->setAlignment( Qt::AlignHCenter );
vLayout->addWidget( recentColorsGroup );
auto* customPaletteLayout = new QHBoxLayout(); auto* customPaletteLayout = new QHBoxLayout();
customPaletteLayout->setSpacing( 0 ); customPaletteLayout->setSpacing( 0 );
@@ -137,40 +141,49 @@ namespace glabels
{ {
mHistoryItem[iCol] = new ColorPaletteItem( iCol, QColor(0,0,0,0), "" ); mHistoryItem[iCol] = new ColorPaletteItem( iCol, QColor(0,0,0,0), "" );
mHistoryItem[iCol]->setEnabled( false ); 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] ); customPaletteLayout->addWidget( mHistoryItem[iCol] );
} }
vLayout->addLayout( customPaletteLayout ); recentColorsGroup->setLayout( customPaletteLayout );
QFrame* hline3 = new QFrame; //
hline3->setFrameStyle( QFrame::HLine | QFrame::Plain ); // Construct Default (e.g. "No Fill") Button
hline3->setLineWidth( 1 ); //
vLayout->addWidget( hline3 ); auto* defaultColorButton = new QPushButton( defaultLabel );
defaultColorButton->setAutoDefault( false );
ColorPaletteButtonItem* customColorButton = new ColorPaletteButtonItem( tr("Custom color...") ); defaultColorButton->setDefault( false );
connect( customColorButton, SIGNAL(activated()), this, SLOT(onCustomColorItemActivated()) ); 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 ); vLayout->addWidget( customColorButton );
QFrame* hline4 = new QFrame; //
hline4->setFrameStyle( QFrame::HLine | QFrame::Plain ); // Construct "Use field" Button
hline4->setLineWidth( 1 ); //
vLayout->addWidget( hline4 ); 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 ); setLayout( vLayout );
loadCustomColorHistory(); 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; if (mFieldButton)
// Clear old keys, (all entries, except item 0)
for ( int index = mMergeFieldCombo->count()-1; index > 0; index-- )
{ {
mMergeFieldCombo->removeItem( index ); mFieldButton->setKeys( merge, variables );
}
// Add new keys
if ( keyList.size() > 0 )
{
mMergeFieldCombo->addItems( keyList );
mMergeFieldCombo->setEnabled( true );
}
else
{
mMergeFieldCombo->setEnabled( false );
} }
} }
void ColorPaletteDialog::clearKeys() void ColorPaletteDialog::onPaletteItemActivated( int id )
{ {
model::ColorNode newColorNode;
for ( int index = mMergeFieldCombo->count()-1; index > 0; index-- ) 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.setField( false );
mColorNode.setColor( mDefaultColor ); mColorNode.setColor( mDefaultColor );
@@ -228,29 +247,7 @@ namespace glabels
} }
void ColorPaletteDialog::onPaletteItemActivated( int id ) void ColorPaletteDialog::onCustomColorButtonClicked()
{
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()
{ {
QColorDialog dlg( mColorNode.color(), this ); QColorDialog dlg( mColorNode.color(), this );
dlg.setWindowTitle( tr("Custom Color") ); dlg.setWindowTitle( tr("Custom Color") );
@@ -267,7 +264,10 @@ namespace glabels
{ {
mColorNode = newColorNode; 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 ); emit colorChanged( mColorNode, false );
accept(); accept();
@@ -284,12 +284,13 @@ namespace glabels
void ColorPaletteDialog::loadCustomColorHistory() void ColorPaletteDialog::loadCustomColorHistory()
{ {
QStringList nameList = mColorHistory->getNames();
QList<QColor> colorList = mColorHistory->getColors(); QList<QColor> colorList = mColorHistory->getColors();
int id = 0; int id = 0;
foreach ( QColor color, colorList ) 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 ); mHistoryItem[id]->setEnabled( true );
id++; 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.setField( true ); mColorNode.setKey( key );
mColorNode.setColor( QColor( 0xee, 0xee, 0xec ) );
mColorNode.setKey( mKeys[index-1] );
emit colorChanged( mColorNode, false ); emit colorChanged( mColorNode, false );
accept(); accept();
}
}
void ColorPaletteDialog::showEvent( QShowEvent* event )
{
mMergeFieldCombo->setCurrentIndex( 0 );
QDialog::showEvent( event );
} }
} // namespace glabels } // namespace glabels
+10 -13
View File
@@ -24,11 +24,10 @@
#include "ColorHistory.h" #include "ColorHistory.h"
#include "ColorPaletteItem.h" #include "ColorPaletteItem.h"
#include "ColorPaletteButtonItem.h" #include "FieldButton.h"
#include "model/ColorNode.h" #include "model/ColorNode.h"
#include <QComboBox>
#include <QDialog> #include <QDialog>
@@ -50,6 +49,7 @@ namespace glabels
ColorPaletteDialog( const QString& defaultLabel, ColorPaletteDialog( const QString& defaultLabel,
const QColor& defaultColor, const QColor& defaultColor,
const QColor& color, const QColor& color,
bool showUseFieldButton = true,
QWidget* parent = nullptr ); QWidget* parent = nullptr );
@@ -64,25 +64,23 @@ namespace glabels
// Public Methods // Public Methods
///////////////////////////////// /////////////////////////////////
public: public:
void setColorNode( const model::ColorNode& colorNode ); void setColorNode( const model::ColorNode& colorNode );
void setKeys( const QStringList& keyList );
void clearKeys(); void setKeys( const merge::Merge* merge,
const model::Variables* variables );
///////////////////////////////// /////////////////////////////////
// Slots // Slots
///////////////////////////////// /////////////////////////////////
private slots: private slots:
void onDefaultItemActivated();
void onPaletteItemActivated( int id ); void onPaletteItemActivated( int id );
void onHistoryItemActivated( int id ); void onHistoryItemActivated( int id );
void onCustomColorItemActivated(); void onDefaultButtonClicked();
void onCustomColorButtonClicked();
void onKeySelected( QString key );
void onColorHistoryChanged(); void onColorHistoryChanged();
void onComboIndexChanged( int index );
protected:
void showEvent( QShowEvent* event ) override;
///////////////////////////////// /////////////////////////////////
// Private Methods // Private Methods
@@ -111,8 +109,7 @@ namespace glabels
ColorHistory* mColorHistory; ColorHistory* mColorHistory;
ColorPaletteItem* mHistoryItem[PALETTE_COLS]; ColorPaletteItem* mHistoryItem[PALETTE_COLS];
QComboBox* mMergeFieldCombo; FieldButton* mFieldButton;
QStringList mKeys;
}; };
+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. * This file is part of gLabels-qt.
* *
@@ -18,21 +18,21 @@
* along with gLabels-qt. If not, see <http://www.gnu.org/licenses/>. * along with gLabels-qt. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef ColorPaletteButtonItem_h #ifndef EditVariableDialog_h
#define ColorPaletteButtonItem_h #define EditVariableDialog_h
#include <QColor> #include "ui_EditVariableDialog.h"
#include <QWidget> #include "model/Variable.h"
namespace glabels namespace glabels
{ {
/// ///
/// Color Palette Item /// New Label Dialog Widget
/// ///
class ColorPaletteButtonItem : public QWidget class EditVariableDialog : public QDialog, public Ui_EditVariableDialog
{ {
Q_OBJECT Q_OBJECT
@@ -40,36 +40,37 @@ namespace glabels
// Life Cycle // Life Cycle
///////////////////////////////// /////////////////////////////////
public: public:
ColorPaletteButtonItem( const QString& text, QWidget* parent = nullptr ); EditVariableDialog( QWidget *parent = nullptr );
///////////////////////////////// /////////////////////////////////
// Signals // Public methods
///////////////////////////////// /////////////////////////////////
signals: void setVariable( const model::Variable& variable );
void activated(); model::Variable variable() const;
///////////////////////////////// /////////////////////////////////
// Event handlers // Slots
///////////////////////////////// /////////////////////////////////
protected: private slots:
void paintEvent( QPaintEvent* event ) override; void onNameEditChanged();
void enterEvent( QEvent* event ) override; void onTypeComboChanged();
void leaveEvent( QEvent* event ) override; void onValueEditChanged();
void mousePressEvent( QMouseEvent* event ) override; void onColorValueButtonChanged();
void onIncrementComboChanged();
void onStepSizeEditChanged();
///////////////////////////////// /////////////////////////////////
// Private Data // Private methods
///////////////////////////////// /////////////////////////////////
private: void updateControls();
QString mText; void validateCurrentInputs();
bool mHover;
}; };
} }
#endif // ColorPaletteButtonItem_h #endif // EditVariableDialog_h
+38 -56
View File
@@ -1,6 +1,6 @@
/* FieldButton.cpp /* 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. * This file is part of gLabels-qt.
* *
@@ -30,79 +30,61 @@ namespace glabels
/// ///
/// Constructor /// Constructor
/// ///
FieldButton::FieldButton( QWidget* parent ) FieldButton::FieldButton( QWidget* parent ) : QPushButton(parent)
: QComboBox(parent)
{ {
setEnabled( false ); setEnabled( false );
setMenu( &mMenu );
connect( this, SIGNAL(currentIndexChanged(int)), this, SLOT(onIndexChanged(int)) );
connect( &mMenu, SIGNAL(triggered(QAction*)),
this, SLOT(onMenuActionTriggered(QAction*)) );
} }
void FieldButton::setName( const QString& name ) ///
{ /// Set Keys
mName = name; ///
if ( count() == 0 ) void FieldButton::setKeys( const merge::Merge* merge,
{ const model::Variables* variables )
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 )
{ {
// Clear old keys // Clear old keys
clear(); mMenu.clear();
addItem( mName );
// 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. // Add variable keys, if any
const auto* itemModel = qobject_cast<const QStandardItemModel*>(model()); mMenu.addSection( tr("Variables") );
QStandardItem* item = itemModel->item(0); for ( auto& key : variables->keys() )
item->setFlags( item->flags() & ~(Qt::ItemIsSelectable|Qt::ItemIsEnabled) );
// Add new keys
if ( keyList.size() > 0 )
{ {
addItems( keyList ); auto* action = mMenu.addAction( QString( "${%1}" ).arg( key ) );
setEnabled( true ); 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( action->data().toString() );
{
emit keySelected( itemText(index) );
setCurrentIndex( 0 );
}
} }
} // namespace glabels } // namespace glabels
+13 -9
View File
@@ -1,6 +1,6 @@
/* FieldButton.h /* 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. * This file is part of gLabels-qt.
* *
@@ -22,8 +22,13 @@
#define FieldButton_h #define FieldButton_h
#include <QComboBox> #include "model/Variables.h"
#include <QString> #include "merge/Merge.h"
#include <QAction>
#include <QPushButton>
#include <QMenu>
#include <QStringList>
namespace glabels namespace glabels
@@ -32,7 +37,7 @@ namespace glabels
/// ///
/// Field Button /// Field Button
/// ///
class FieldButton : public QComboBox class FieldButton : public QPushButton
{ {
Q_OBJECT Q_OBJECT
@@ -54,23 +59,22 @@ namespace glabels
// Public Methods // Public Methods
///////////////////////////////// /////////////////////////////////
public: public:
void setName( const QString& name = "" ); void setKeys( const merge::Merge* merge,
void setKeys( const QStringList& keyList ); const model::Variables* variables );
void clearKeys();
///////////////////////////////// /////////////////////////////////
// Slots // Slots
///////////////////////////////// /////////////////////////////////
private slots: private slots:
void onIndexChanged( int index ); void onMenuActionTriggered( QAction* action );
///////////////////////////////// /////////////////////////////////
// Private Data // Private Data
///////////////////////////////// /////////////////////////////////
private: private:
QString mName; QMenu mMenu;
}; };
+2 -5
View File
@@ -112,8 +112,6 @@ namespace glabels
model::Model *model = model::XmlLabelParser::readFile( fileName ); model::Model *model = model::XmlLabelParser::readFile( fileName );
if ( model ) if ( model )
{ {
model->setFileName( fileName );
// Either apply to current window or open a new one // Either apply to current window or open a new one
if ( window->isEmpty() ) if ( window->isEmpty() )
{ {
@@ -152,8 +150,6 @@ namespace glabels
model::Model *model = model::XmlLabelParser::readFile( fileName ); model::Model *model = model::XmlLabelParser::readFile( fileName );
if ( model ) if ( model )
{ {
model->setFileName( fileName );
// Either apply to current window or open a new one // Either apply to current window or open a new one
if ( window->isEmpty() ) if ( window->isEmpty() )
{ {
@@ -213,7 +209,8 @@ namespace glabels
/// ///
bool File::saveAs( MainWindow *window ) 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; QString cwd = mCwd;
if ( window->model() && !window->model()->fileName().isEmpty() ) 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 class ZoomBestFit : public QIcon
{ {
public: public:
+6 -1
View File
@@ -469,6 +469,10 @@ namespace glabels
mResizeObject = handle->owner(); mResizeObject = handle->owner();
mResizeHandle = handle; mResizeHandle = handle;
mResizeHonorAspect = event->modifiers() & Qt::ControlModifier; mResizeHonorAspect = event->modifiers() & Qt::ControlModifier;
if ( mResizeObject->lockAspectRatio() )
{
mResizeHonorAspect = !mResizeHonorAspect;
}
mState = ArrowResize; mState = ArrowResize;
} }
@@ -657,6 +661,7 @@ namespace glabels
break; break;
case ArrowResize: case ArrowResize:
mUndoRedoModel->checkpoint( tr("Resize") );
handleResizeMotion( xWorld, yWorld ); handleResizeMotion( xWorld, yWorld );
break; break;
@@ -1157,7 +1162,7 @@ namespace glabels
void void
LabelEditor::drawObjectsLayer( QPainter* painter ) 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 "PropertiesView.h"
#include "StartupView.h" #include "StartupView.h"
#include "UndoRedoModel.h" #include "UndoRedoModel.h"
#include "VariablesView.h"
#include "model/Db.h" #include "model/Db.h"
#include "model/Model.h" #include "model/Model.h"
@@ -51,7 +52,8 @@ namespace
EDITOR_PAGE_INDEX = 1, EDITOR_PAGE_INDEX = 1,
PROPERTIES_PAGE_INDEX = 2, PROPERTIES_PAGE_INDEX = 2,
MERGE_PAGE_INDEX = 3, MERGE_PAGE_INDEX = 3,
PRINT_PAGE_INDEX = 4, VARIABLES_PAGE_INDEX = 4,
PRINT_PAGE_INDEX = 5,
}; };
} }
@@ -62,7 +64,7 @@ namespace glabels
/// ///
/// Constructor /// Constructor
/// ///
MainWindow::MainWindow() : mModel(nullptr) MainWindow::MainWindow() : mModel(nullptr), mUndoRedoModel(nullptr)
{ {
setWindowIcon( Icons::Glabels() ); setWindowIcon( Icons::Glabels() );
@@ -76,6 +78,7 @@ namespace glabels
QWidget* editorPage = createEditorPage(); QWidget* editorPage = createEditorPage();
QWidget* propertiesPage = createPropertiesPage(); QWidget* propertiesPage = createPropertiesPage();
QWidget* mergePage = createMergePage(); QWidget* mergePage = createMergePage();
QWidget* variablesPage = createVariablesPage();
QWidget* printPage = createPrintPage(); QWidget* printPage = createPrintPage();
// Table of contents widget // Table of contents widget
@@ -141,6 +144,18 @@ namespace glabels
mMergeAction = mContents->addWidget( mMergeButton ); mMergeAction = mContents->addWidget( mMergeButton );
group->addButton( 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 // Add "Print" page
mPages->addWidget( printPage ); mPages->addWidget( printPage );
mPrintButton = new QToolButton( this ); mPrintButton = new QToolButton( this );
@@ -175,6 +190,7 @@ namespace glabels
connect( mEditorButton, SIGNAL(toggled(bool)), this, SLOT(changePage(bool))); connect( mEditorButton, SIGNAL(toggled(bool)), this, SLOT(changePage(bool)));
connect( mPropertiesButton, 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( 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( mPrintButton, SIGNAL(toggled(bool)), this, SLOT(changePage(bool)));
connect( mLabelEditor, SIGNAL(zoomChanged()), this, SLOT(onZoomChanged()) ); connect( mLabelEditor, SIGNAL(zoomChanged()), this, SLOT(onZoomChanged()) );
connect( model::Settings::instance(), SIGNAL(changed()), this, SLOT(onSettingsChanged()) ); connect( model::Settings::instance(), SIGNAL(changed()), this, SLOT(onSettingsChanged()) );
@@ -194,7 +210,16 @@ namespace glabels
/// ///
MainWindow::~MainWindow() 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 ) void MainWindow::setModel( model::Model* model )
{ {
mModel = model; mModel = model; // Ownership passes to us
mUndoRedoModel = new UndoRedoModel( mModel ); mUndoRedoModel = new UndoRedoModel( mModel );
mPropertiesView->setModel( mModel, mUndoRedoModel ); mPropertiesView->setModel( mModel, mUndoRedoModel );
mLabelEditor->setModel( mModel, mUndoRedoModel ); mLabelEditor->setModel( mModel, mUndoRedoModel );
mObjectEditor->setModel( mModel, mUndoRedoModel ); mObjectEditor->setModel( mModel, mUndoRedoModel );
mMergeView->setModel( mModel , mUndoRedoModel ); mMergeView->setModel( mModel, mUndoRedoModel );
mVariablesView->setModel( mModel, mUndoRedoModel );
mPrintView->setModel( mModel ); mPrintView->setModel( mModel );
mEditorButton->setChecked( true ); mEditorButton->setChecked( true );
@@ -315,6 +341,11 @@ namespace glabels
fileShowMergePageAction->setStatusTip( tr("Select project Merge mode") ); fileShowMergePageAction->setStatusTip( tr("Select project Merge mode") );
connect( fileShowMergePageAction, SIGNAL(triggered()), this, SLOT(fileShowMergePage()) ); 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 = new QAction( tr("&Print") , this );
fileShowPrintPageAction->setShortcut( QKeySequence::Print ); fileShowPrintPageAction->setShortcut( QKeySequence::Print );
fileShowPrintPageAction->setStatusTip( tr("Select project Print mode") ); fileShowPrintPageAction->setStatusTip( tr("Select project Print mode") );
@@ -603,6 +634,7 @@ namespace glabels
fileMenu->addAction( fileShowEditorPageAction ); fileMenu->addAction( fileShowEditorPageAction );
fileMenu->addAction( fileShowPropertiesPageAction ); fileMenu->addAction( fileShowPropertiesPageAction );
fileMenu->addAction( fileShowMergePageAction ); fileMenu->addAction( fileShowMergePageAction );
fileMenu->addAction( fileShowVariablesPageAction );
fileMenu->addAction( fileShowPrintPageAction ); fileMenu->addAction( fileShowPrintPageAction );
fileMenu->addSeparator(); fileMenu->addSeparator();
fileMenu->addAction( fileTemplateDesignerAction ); fileMenu->addAction( fileTemplateDesignerAction );
@@ -815,6 +847,17 @@ namespace glabels
} }
///
/// Create Variables Page
///
QWidget* MainWindow::createVariablesPage()
{
mVariablesView = new VariablesView();
return mVariablesView;
}
/// ///
/// Create Print Page /// Create Print Page
/// ///
@@ -839,6 +882,7 @@ namespace glabels
bool isEditorPage = mEditorButton->isChecked(); bool isEditorPage = mEditorButton->isChecked();
bool isPropertiesPage = mPropertiesButton->isChecked(); bool isPropertiesPage = mPropertiesButton->isChecked();
bool isMergePage = mMergeButton->isChecked(); bool isMergePage = mMergeButton->isChecked();
bool isVariablesPage = mVariablesButton->isChecked();
bool isPrintPage = mPrintButton->isChecked(); bool isPrintPage = mPrintButton->isChecked();
// What is the current selection state? // What is the current selection state?
@@ -851,6 +895,7 @@ namespace glabels
mEditorAction->setVisible( !isWelcomePage ); mEditorAction->setVisible( !isWelcomePage );
mPropertiesAction->setVisible( !isWelcomePage ); mPropertiesAction->setVisible( !isWelcomePage );
mMergeAction->setVisible( !isWelcomePage ); mMergeAction->setVisible( !isWelcomePage );
mVariablesAction->setVisible( !isWelcomePage );
mPrintAction->setVisible( !isWelcomePage ); mPrintAction->setVisible( !isWelcomePage );
// Recent file actions // Recent file actions
@@ -876,14 +921,45 @@ namespace glabels
fileShowEditorPageAction->setEnabled( !isWelcomePage && !isEditorPage ); fileShowEditorPageAction->setEnabled( !isWelcomePage && !isEditorPage );
fileShowPropertiesPageAction->setEnabled( !isWelcomePage && !isPropertiesPage ); fileShowPropertiesPageAction->setEnabled( !isWelcomePage && !isPropertiesPage );
fileShowMergePageAction->setEnabled( !isWelcomePage && !isMergePage ); fileShowMergePageAction->setEnabled( !isWelcomePage && !isMergePage );
fileShowVariablesPageAction->setEnabled( !isWelcomePage && !isVariablesPage );
fileShowPrintPageAction->setEnabled( !isWelcomePage && !isPrintPage ); fileShowPrintPageAction->setEnabled( !isWelcomePage && !isPrintPage );
fileTemplateDesignerAction->setEnabled( true ); fileTemplateDesignerAction->setEnabled( true );
fileCloseAction->setEnabled( true ); fileCloseAction->setEnabled( true );
fileExitAction->setEnabled( true ); fileExitAction->setEnabled( true );
// Edit actions // Edit actions
editUndoAction->setEnabled( hasModel && mUndoRedoModel->canUndo() ); if ( hasModel )
editRedoAction->setEnabled( hasModel && mUndoRedoModel->canRedo() ); {
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 ); editCutAction->setEnabled( isEditorPage && hasSelection );
editCopyAction->setEnabled( isEditorPage && hasSelection ); editCopyAction->setEnabled( isEditorPage && hasSelection );
editPasteAction->setEnabled( isEditorPage && canPaste ); editPasteAction->setEnabled( isEditorPage && canPaste );
@@ -1072,6 +1148,10 @@ namespace glabels
{ {
mPages->setCurrentIndex( MERGE_PAGE_INDEX ); mPages->setCurrentIndex( MERGE_PAGE_INDEX );
} }
else if ( mVariablesButton->isChecked() )
{
mPages->setCurrentIndex( VARIABLES_PAGE_INDEX );
}
else if ( mPrintButton->isChecked() ) else if ( mPrintButton->isChecked() )
{ {
mPages->setCurrentIndex( PRINT_PAGE_INDEX ); 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 /// File->Show Print Page
/// ///
+7
View File
@@ -47,6 +47,7 @@ namespace glabels
class PropertiesView; class PropertiesView;
class StartupView; class StartupView;
class UndoRedoModel; class UndoRedoModel;
class VariablesView;
/// ///
@@ -97,6 +98,7 @@ namespace glabels
void fileShowEditorPage(); void fileShowEditorPage();
void fileShowPropertiesPage(); void fileShowPropertiesPage();
void fileShowMergePage(); void fileShowMergePage();
void fileShowVariablesPage();
void fileShowPrintPage(); void fileShowPrintPage();
void fileTemplateDesigner(); void fileTemplateDesigner();
void fileClose(); void fileClose();
@@ -175,6 +177,7 @@ namespace glabels
QWidget* createEditorPage(); QWidget* createEditorPage();
QWidget* createPropertiesPage(); QWidget* createPropertiesPage();
QWidget* createMergePage(); QWidget* createMergePage();
QWidget* createVariablesPage();
QWidget* createPrintPage(); QWidget* createPrintPage();
void manageActions(); void manageActions();
@@ -222,12 +225,14 @@ namespace glabels
QToolButton* mEditorButton; QToolButton* mEditorButton;
QToolButton* mPropertiesButton; QToolButton* mPropertiesButton;
QToolButton* mMergeButton; QToolButton* mMergeButton;
QToolButton* mVariablesButton;
QToolButton* mPrintButton; QToolButton* mPrintButton;
QAction* mWelcomeAction; QAction* mWelcomeAction;
QAction* mEditorAction; QAction* mEditorAction;
QAction* mPropertiesAction; QAction* mPropertiesAction;
QAction* mMergeAction; QAction* mMergeAction;
QAction* mVariablesAction;
QAction* mPrintAction; QAction* mPrintAction;
QStackedWidget* mPages; QStackedWidget* mPages;
@@ -237,6 +242,7 @@ namespace glabels
ObjectEditor* mObjectEditor; ObjectEditor* mObjectEditor;
PropertiesView* mPropertiesView; PropertiesView* mPropertiesView;
MergeView* mMergeView; MergeView* mMergeView;
VariablesView* mVariablesView;
PrintView* mPrintView; PrintView* mPrintView;
QLabel* zoomInfoLabel; QLabel* zoomInfoLabel;
@@ -249,6 +255,7 @@ namespace glabels
QAction* fileShowEditorPageAction; QAction* fileShowEditorPageAction;
QAction* fileShowPropertiesPageAction; QAction* fileShowPropertiesPageAction;
QAction* fileShowMergePageAction; QAction* fileShowMergePageAction;
QAction* fileShowVariablesPageAction;
QAction* fileShowPrintPageAction; QAction* fileShowPrintPageAction;
QAction* fileTemplateDesignerAction; QAction* fileTemplateDesignerAction;
QAction* fileCloseAction; QAction* fileCloseAction;
+13 -21
View File
@@ -22,6 +22,8 @@
#include "merge/Factory.h" #include "merge/Factory.h"
#include "model/FileUtil.h"
#include <QFileDialog> #include <QFileDialog>
#include <QFileInfo> #include <QFileInfo>
#include <QtDebug> #include <QtDebug>
@@ -63,14 +65,7 @@ namespace glabels
mUndoRedoModel = undoRedoModel; mUndoRedoModel = undoRedoModel;
// Initialize CWD // Initialize CWD
if ( model->fileName().isEmpty() ) mCwd = mModel->dirPath();
{
mCwd = ".";
}
else
{
mCwd = QFileInfo( model->fileName() ).absolutePath();
}
onMergeChanged(); onMergeChanged();
connect( mModel, SIGNAL(mergeChanged()), this, SLOT(onMergeChanged()) ); connect( mModel, SIGNAL(mergeChanged()), this, SLOT(onMergeChanged()) );
@@ -87,26 +82,22 @@ namespace glabels
mOldFormatComboIndex = index; mOldFormatComboIndex = index;
formatCombo->setCurrentIndex( index ); formatCombo->setCurrentIndex( index );
QString fn;
switch ( merge::Factory::idToType( mModel->merge()->id() ) ) switch ( merge::Factory::idToType( mModel->merge()->id() ) )
{ {
case merge::Factory::NONE: case merge::Factory::NONE:
case merge::Factory::FIXED: case merge::Factory::FIXED:
locationLabel->setEnabled( false ); locationLabel->setEnabled( false );
locationButton->setEnabled( false ); locationLineEdit->setText( "" );
locationButton->setText( "" ); locationBrowseButton->setVisible( false );
break; break;
case merge::Factory::FILE: case merge::Factory::FILE:
locationLabel->setEnabled( true ); locationLabel->setEnabled( true );
locationButton->setEnabled( true ); fn = model::FileUtil::makeRelativeIfInDir( mModel->dir(), mModel->merge()->source() );
if ( mModel->merge()->source().isEmpty() ) locationLineEdit->setText( fn );
{ locationBrowseButton->setVisible( true );
locationButton->setText( "Select file..." );
}
else
{
locationButton->setText( mModel->merge()->source() );
}
break; break;
default: default:
@@ -135,7 +126,8 @@ namespace glabels
/// ///
void MergeView::onMergeSourceChanged() void MergeView::onMergeSourceChanged()
{ {
locationButton->setText( mModel->merge()->source() ); QString fn = model::FileUtil::makeRelativeIfInDir( mModel->dir(), mModel->merge()->source() );
locationLineEdit->setText( fn );
recordsTable->clear(); recordsTable->clear();
recordsTable->setColumnCount( 0 ); recordsTable->setColumnCount( 0 );
@@ -185,7 +177,7 @@ namespace glabels
/// ///
/// Location button clicked handler /// Location button clicked handler
/// ///
void MergeView::onLocationButtonClicked() void MergeView::onLocationBrowseButtonClicked()
{ {
QString fileName = QString fileName =
QFileDialog::getOpenFileName( this, QFileDialog::getOpenFileName( this,
+1 -1
View File
@@ -67,7 +67,7 @@ namespace glabels
void onMergeSelectionChanged(); void onMergeSelectionChanged();
void onFormatComboActivated(); void onFormatComboActivated();
void onLocationButtonClicked(); void onLocationBrowseButtonClicked();
void onSelectAllButtonClicked(); void onSelectAllButtonClicked();
void onUnselectAllButtonClicked(); void onUnselectAllButtonClicked();
void onCellChanged( int iRow, int iCol ); void onCellChanged( int iRow, int iCol );
+38 -20
View File
@@ -30,12 +30,14 @@
#include "model/ModelImageObject.h" #include "model/ModelImageObject.h"
#include "model/ModelLineObject.h" #include "model/ModelLineObject.h"
#include "model/ModelTextObject.h" #include "model/ModelTextObject.h"
#include "model/FileUtil.h"
#include "model/Settings.h" #include "model/Settings.h"
#include "model/Size.h" #include "model/Size.h"
#include "merge/Merge.h" #include "merge/Merge.h"
#include <QFileDialog> #include <QFileDialog>
#include <QDir>
#include <QtMath> #include <QtMath>
#include <QtDebug> #include <QtDebug>
@@ -67,9 +69,9 @@ namespace glabels
barcodeColorButton->init( tr("Default"), QColor(0,0,0,255), QColor(0,0,0,255) ); 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) ); shadowColorButton->init( tr("Default"), QColor(0,0,0,255), QColor(0,0,0,255) );
textInsertFieldCombo->setName( tr("Insert Field") ); textInsertFieldButton->setText( tr("Insert substitution field") );
barcodeInsertFieldCombo->setName( tr("Insert Field") ); barcodeInsertFieldButton->setText( tr("Insert substitution field") );
imageFieldCombo->setName( tr("Key") ); imageFieldButton->setText( tr("Use substitution field") );
setEnabled( false ); setEnabled( false );
hidePages(); hidePages();
@@ -93,11 +95,14 @@ namespace glabels
this, SLOT(onSelectionChanged()) ); this, SLOT(onSelectionChanged()) );
connect( mModel, SIGNAL(mergeSourceChanged()), connect( mModel, SIGNAL(mergeSourceChanged()),
this, SLOT(onMergeSourceChanged()) ); this, SLOT(onFieldsAvailableChanged()) );
connect( mModel, SIGNAL(variablesChanged()),
this, SLOT(onFieldsAvailableChanged()) );
onLabelSizeChanged(); onLabelSizeChanged();
onSelectionChanged(); onSelectionChanged();
onMergeSourceChanged(); onFieldsAvailableChanged();
} }
@@ -122,12 +127,12 @@ namespace glabels
if ( filenameNode.isField() ) if ( filenameNode.isField() )
{ {
QString field = QString("${%1}").arg( filenameNode.data() ); imageFilenameLineEdit->setText( QString("${%1}").arg(filenameNode.data()) );
imageFilenameLineEdit->setText( field );
} }
else else
{ {
imageFilenameLineEdit->setText( filenameNode.data() ); QString fn = model::FileUtil::makeRelativeIfInDir( mModel->dir(), filenameNode.data() );
imageFilenameLineEdit->setText( fn );
} }
mBlocked = false; mBlocked = false;
@@ -188,6 +193,7 @@ namespace glabels
sizeWSpin->setValue( mObject->w().inUnits(mUnits) ); sizeWSpin->setValue( mObject->w().inUnits(mUnits) );
sizeHSpin->setValue( mObject->h().inUnits(mUnits) ); sizeHSpin->setValue( mObject->h().inUnits(mUnits) );
sizeAspectCheck->setChecked( mObject->lockAspectRatio() );
model::Size originalSize = mObject->naturalSize(); model::Size originalSize = mObject->naturalSize();
QString originalSizeString = QString( "%1: %2 x %3 %4" ) QString originalSizeString = QString( "%1: %2 x %3 %4" )
@@ -454,8 +460,8 @@ namespace glabels
loadTextPage(); loadTextPage();
loadPositionPage(); loadPositionPage();
loadRectSizePage();
loadShadowPage(); loadShadowPage();
loadRectSizePage();
setEnabled( true ); setEnabled( true );
} }
@@ -473,6 +479,7 @@ namespace glabels
loadBarcodePage(); loadBarcodePage();
loadPositionPage(); loadPositionPage();
loadRectSizePage();
setEnabled( true ); setEnabled( true );
} }
@@ -497,17 +504,19 @@ namespace glabels
} }
void ObjectEditor::onMergeSourceChanged() void ObjectEditor::onFieldsAvailableChanged()
{ {
if ( !mBlocked ) if ( !mBlocked )
{ {
QStringList keys = mModel->merge()->keys(); lineColorButton->setKeys( mModel->merge(), mModel->variables() );
lineColorButton->setKeys( keys ); fillColorButton->setKeys( mModel->merge(), mModel->variables() );
fillColorButton->setKeys( keys ); textColorButton->setKeys( mModel->merge(), mModel->variables() );
textInsertFieldCombo->setKeys( keys ); barcodeColorButton->setKeys( mModel->merge(), mModel->variables() );
barcodeInsertFieldCombo->setKeys( keys ); shadowColorButton->setKeys( mModel->merge(), mModel->variables() );
imageFieldCombo->setKeys( keys );
shadowColorButton->setKeys( keys ); 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 ) void ObjectEditor::onImageKeySelected( QString key )
{ {
mUndoRedoModel->checkpoint( tr("Set image") ); if ( mObject )
mObject->setFilenameNode( model::TextNode( true, key ) ); {
mUndoRedoModel->checkpoint( tr("Set image") );
mObject->setFilenameNode( model::TextNode( true, key ) );
}
} }
@@ -629,7 +641,7 @@ namespace glabels
{ {
mBlocked = true; mBlocked = true;
mUndoRedoModel->checkpoint( tr("Move") ); mUndoRedoModel->checkpoint( tr("Position") );
model::Distance x = model::Distance(posXSpin->value(), mUnits); model::Distance x = model::Distance(posXSpin->value(), mUnits);
model::Distance y = model::Distance(posYSpin->value(), mUnits); model::Distance y = model::Distance(posYSpin->value(), mUnits);
@@ -654,6 +666,7 @@ namespace glabels
if ( sizeAspectCheck->isChecked() ) if ( sizeAspectCheck->isChecked() )
{ {
mObject->setLockAspectRatio( true );
if ( fabs(spinW - mObject->w()) > fabs(spinH - mObject->h()) ) if ( fabs(spinW - mObject->w()) > fabs(spinH - mObject->h()) )
{ {
mObject->setWHonorAspect( spinW ); mObject->setWHonorAspect( spinW );
@@ -667,6 +680,7 @@ namespace glabels
} }
else else
{ {
mObject->setLockAspectRatio( false );
mObject->setSize( spinW, spinH ); mObject->setSize( spinW, spinH );
} }
@@ -740,6 +754,8 @@ namespace glabels
{ {
mBlocked = true; mBlocked = true;
mUndoRedoModel->checkpoint( tr("Barcode") );
barcode::Style bcStyle = barcodeStyleButton->bcStyle(); barcode::Style bcStyle = barcodeStyleButton->bcStyle();
barcodeShowTextCheck->setEnabled( bcStyle.textOptional() ); barcodeShowTextCheck->setEnabled( bcStyle.textOptional() );
@@ -774,6 +790,8 @@ namespace glabels
void ObjectEditor::onResetImageSize() void ObjectEditor::onResetImageSize()
{ {
mUndoRedoModel->checkpoint( tr("Reset") );
mObject->setSize( mObject->naturalSize() ); mObject->setSize( mObject->naturalSize() );
} }
+1 -1
View File
@@ -80,7 +80,7 @@ namespace glabels
void onSettingsChanged(); void onSettingsChanged();
void onLabelSizeChanged(); void onLabelSizeChanged();
void onSelectionChanged(); void onSelectionChanged();
void onMergeSourceChanged(); void onFieldsAvailableChanged();
void onObjectChanged(); void onObjectChanged();
void onObjectMoved(); void onObjectMoved();
void onObjectDestroyed(); void onObjectDestroyed();
+6 -2
View File
@@ -70,6 +70,9 @@ namespace glabels
connect( mModel, SIGNAL(changed()), this, SLOT(onModelChanged()) ); connect( mModel, SIGNAL(changed()), this, SLOT(onModelChanged()) );
copiesSpin->setRange( 1, 100*mModel->frame()->nLabels() );
copiesStartSpin->setRange( 1, mModel->frame()->nLabels() );
onFormChanged(); onFormChanged();
} }
@@ -79,6 +82,9 @@ namespace glabels
/// ///
void PrintView::onModelChanged() void PrintView::onModelChanged()
{ {
copiesSpin->setRange( 1, 100*mModel->frame()->nLabels() );
copiesStartSpin->setRange( 1, mModel->frame()->nLabels() );
updateView(); updateView();
} }
@@ -88,8 +94,6 @@ namespace glabels
/// ///
void PrintView::updateView() void PrintView::updateView()
{ {
copiesStartSpin->setRange( 1, mModel->frame()->nLabels() );
if ( mRenderer.nPages() == 1 ) if ( mRenderer.nPages() == 1 )
{ {
if ( mRenderer.nItems() == 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-merge.svg</file>
<file>icons/flat/48x48/glabels-print.svg</file> <file>icons/flat/48x48/glabels-print.svg</file>
<file>icons/flat/48x48/glabels-properties.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/48x48/glabels.svg</file>
<file>icons/apps/128x128/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::setOrganizationName( "glabels.org" );
QCoreApplication::setOrganizationDomain( "glabels.org" ); QCoreApplication::setOrganizationDomain( "glabels.org" );
QCoreApplication::setApplicationName( "glabels-qt" ); QCoreApplication::setApplicationName( "glabels-qt" );
QCoreApplication::setApplicationVersion( glabels::model::Version::STRING ); QCoreApplication::setApplicationVersion( glabels::model::Version::LONG_STRING );
// //
// Setup translators // 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> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string notr="true">Form</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0"> <item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout"> <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> <number>12</number>
</property> </property>
<item> <item>
@@ -37,16 +46,9 @@
<property name="title"> <property name="title">
<string>Source</string> <string>Source</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_3"> <layout class="QHBoxLayout" name="horizontalLayout_3" stretch="1">
<item row="0" column="0"> <item>
<layout class="QGridLayout" name="gridLayout"> <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"> <item row="0" column="0">
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
@@ -54,6 +56,27 @@
</property> </property>
</widget> </widget>
</item> </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"> <item row="1" column="0">
<widget class="QLabel" name="locationLabel"> <widget class="QLabel" name="locationLabel">
<property name="text"> <property name="text">
@@ -61,24 +84,8 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1">
<widget class="QComboBox" name="formatCombo"/>
</item>
</layout> </layout>
</item> </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> </layout>
</widget> </widget>
</item> </item>
@@ -89,7 +96,11 @@
</property> </property>
<layout class="QGridLayout" name="gridLayout_4"> <layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0"> <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>
<item row="1" column="0"> <item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
@@ -138,8 +149,8 @@
<slot>onSelectAllButtonClicked()</slot> <slot>onSelectAllButtonClicked()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>63</x> <x>97</x>
<y>571</y> <y>570</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>69</x> <x>69</x>
@@ -163,22 +174,6 @@
</hint> </hint>
</hints> </hints>
</connection> </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> <connection>
<sender>formatCombo</sender> <sender>formatCombo</sender>
<signal>activated(int)</signal> <signal>activated(int)</signal>
@@ -186,8 +181,8 @@
<slot>onFormatComboActivated()</slot> <slot>onFormatComboActivated()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>162</x> <x>257</x>
<y>48</y> <y>109</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>563</x> <x>563</x>
@@ -195,11 +190,27 @@
</hint> </hint>
</hints> </hints>
</connection> </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> </connections>
<slots> <slots>
<slot>onSelectAllButtonClicked()</slot> <slot>onSelectAllButtonClicked()</slot>
<slot>onUnselectAllButtonClicked()</slot> <slot>onUnselectAllButtonClicked()</slot>
<slot>onLocationButtonClicked()</slot>
<slot>onFormatComboActivated()</slot> <slot>onFormatComboActivated()</slot>
<slot>onLocationBrowseButtonClicked()</slot>
</slots> </slots>
</ui> </ui>
+188 -180
View File
@@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>400</width> <width>400</width>
<height>640</height> <height>648</height>
</rect> </rect>
</property> </property>
<property name="sizePolicy"> <property name="sizePolicy">
@@ -29,9 +29,9 @@
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string notr="true">Form</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_5"> <layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0"> <item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_5"> <layout class="QHBoxLayout" name="horizontalLayout_5">
<item> <item>
@@ -579,7 +579,11 @@
</spacer> </spacer>
</item> </item>
<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>
<item> <item>
<spacer name="horizontalSpacer_2"> <spacer name="horizontalSpacer_2">
@@ -729,7 +733,11 @@
</spacer> </spacer>
</item> </item>
<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>
<item> <item>
<spacer name="horizontalSpacer_12"> <spacer name="horizontalSpacer_12">
@@ -758,14 +766,27 @@
<string>Image</string> <string>Image</string>
</attribute> </attribute>
<layout class="QGridLayout" name="gridLayout_13"> <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"> <widget class="QGroupBox" name="groupBox_9">
<property name="title"> <property name="title">
<string>File</string> <string>File</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_12"> <layout class="QGridLayout" name="gridLayout_5">
<item row="0" column="0"> <item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout_5"> <layout class="QHBoxLayout" name="horizontalLayout_17">
<item> <item>
<widget class="QLineEdit" name="imageFilenameLineEdit"> <widget class="QLineEdit" name="imageFilenameLineEdit">
<property name="sizePolicy"> <property name="sizePolicy">
@@ -789,68 +810,47 @@
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_17" stretch="1,0,1"> <widget class="QPushButton" name="imageBrowseButton">
<item> <property name="sizePolicy">
<widget class="QPushButton" name="imageFileButton"> <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<property name="sizePolicy"> <horstretch>0</horstretch>
<sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <verstretch>0</verstretch>
<horstretch>0</horstretch> </sizepolicy>
<verstretch>0</verstretch> </property>
</sizepolicy> <property name="text">
</property> <string>Browse...</string>
<property name="text"> </property>
<string>Select File...</string> </widget>
</property> </item>
</widget> </layout>
</item> </item>
<item> <item row="1" column="0">
<widget class="QLabel" name="label"> <layout class="QHBoxLayout" name="horizontalLayout_27">
<property name="sizePolicy"> <item>
<sizepolicy hsizetype="Minimum" vsizetype="Preferred"> <spacer name="horizontalSpacer_13">
<horstretch>0</horstretch> <property name="orientation">
<verstretch>0</verstretch> <enum>Qt::Horizontal</enum>
</sizepolicy> </property>
</property> <property name="sizeHint" stdset="0">
<property name="text"> <size>
<string>or</string> <width>40</width>
</property> <height>20</height>
</widget> </size>
</item> </property>
<item> </spacer>
<widget class="glabels::FieldButton" name="imageFieldCombo"> </item>
<property name="sizePolicy"> <item>
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <widget class="glabels::FieldButton" name="imageFieldButton">
<horstretch>0</horstretch> <property name="text">
<verstretch>0</verstretch> <string notr="true">Use field</string>
</sizepolicy> </property>
</property> </widget>
<item>
<property name="text">
<string>Select Merge Field...</string>
</property>
</item>
</widget>
</item>
</layout>
</item> </item>
</layout> </layout>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </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> </layout>
</widget> </widget>
<widget class="QWidget" name="lineFillPage"> <widget class="QWidget" name="lineFillPage">
@@ -1202,16 +1202,7 @@
<property name="spacing"> <property name="spacing">
<number>15</number> <number>15</number>
</property> </property>
<property name="leftMargin"> <property name="margin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number> <number>0</number>
</property> </property>
<item> <item>
@@ -1529,14 +1520,6 @@
<signal>colorChanged()</signal> <signal>colorChanged()</signal>
</slots> </slots>
</customwidget> </customwidget>
<customwidget>
<class>glabels::FieldButton</class>
<extends>QComboBox</extends>
<header>FieldButton.h</header>
<slots>
<signal>keySelected(QString)</signal>
</slots>
</customwidget>
<customwidget> <customwidget>
<class>glabels::BarcodeMenuButton</class> <class>glabels::BarcodeMenuButton</class>
<extends>QPushButton</extends> <extends>QPushButton</extends>
@@ -1545,6 +1528,14 @@
<signal>selectionChanged()</signal> <signal>selectionChanged()</signal>
</slots> </slots>
</customwidget> </customwidget>
<customwidget>
<class>glabels::FieldButton</class>
<extends>QPushButton</extends>
<header>FieldButton.h</header>
<slots>
<signal>keySelected(QString)</signal>
</slots>
</customwidget>
</customwidgets> </customwidgets>
<resources> <resources>
<include location="../icons.qrc"/> <include location="../icons.qrc"/>
@@ -1653,8 +1644,8 @@
<slot>onTextControlsChanged()</slot> <slot>onTextControlsChanged()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>157</x> <x>160</x>
<y>333</y> <y>332</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>396</x> <x>396</x>
@@ -1669,8 +1660,8 @@
<slot>onTextControlsChanged()</slot> <slot>onTextControlsChanged()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>198</x> <x>200</x>
<y>333</y> <y>332</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>398</x> <x>398</x>
@@ -1685,8 +1676,8 @@
<slot>onTextControlsChanged()</slot> <slot>onTextControlsChanged()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>238</x> <x>240</x>
<y>333</y> <y>332</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>395</x> <x>395</x>
@@ -1701,8 +1692,8 @@
<slot>onTextControlsChanged()</slot> <slot>onTextControlsChanged()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>284</x> <x>286</x>
<y>333</y> <y>332</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>393</x> <x>393</x>
@@ -1717,8 +1708,8 @@
<slot>onTextControlsChanged()</slot> <slot>onTextControlsChanged()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>325</x> <x>326</x>
<y>333</y> <y>332</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>396</x> <x>396</x>
@@ -1734,7 +1725,7 @@
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>365</x> <x>365</x>
<y>333</y> <y>332</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>397</x> <x>397</x>
@@ -1749,8 +1740,8 @@
<slot>onTextControlsChanged()</slot> <slot>onTextControlsChanged()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>184</x> <x>189</x>
<y>407</y> <y>404</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>394</x> <x>394</x>
@@ -1766,7 +1757,7 @@
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>178</x> <x>178</x>
<y>143</y> <y>139</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>392</x> <x>392</x>
@@ -1781,8 +1772,8 @@
<slot>onLineControlsChanged()</slot> <slot>onLineControlsChanged()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>137</x> <x>136</x>
<y>179</y> <y>174</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>1</x> <x>1</x>
@@ -1797,8 +1788,8 @@
<slot>onFillControlsChanged()</slot> <slot>onFillControlsChanged()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>136</x> <x>135</x>
<y>263</y> <y>256</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>6</x> <x>6</x>
@@ -1813,8 +1804,8 @@
<slot>onPositionControlsChanged()</slot> <slot>onPositionControlsChanged()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>159</x> <x>160</x>
<y>142</y> <y>138</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>399</x> <x>399</x>
@@ -1829,8 +1820,8 @@
<slot>onPositionControlsChanged()</slot> <slot>onPositionControlsChanged()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>159</x> <x>160</x>
<y>179</y> <y>174</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>325</x> <x>325</x>
@@ -1845,8 +1836,8 @@
<slot>onRectSizeControlsChanged()</slot> <slot>onRectSizeControlsChanged()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>159</x> <x>160</x>
<y>265</y> <y>258</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>3</x> <x>3</x>
@@ -1861,8 +1852,8 @@
<slot>onRectSizeControlsChanged()</slot> <slot>onRectSizeControlsChanged()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>159</x> <x>160</x>
<y>302</y> <y>294</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>0</x> <x>0</x>
@@ -1877,8 +1868,8 @@
<slot>onResetImageSize()</slot> <slot>onResetImageSize()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>210</x> <x>213</x>
<y>372</y> <y>362</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>4</x> <x>4</x>
@@ -1909,8 +1900,8 @@
<slot>onShadowControlsChanged()</slot> <slot>onShadowControlsChanged()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>165</x> <x>166</x>
<y>142</y> <y>138</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>398</x> <x>398</x>
@@ -1925,8 +1916,8 @@
<slot>onShadowControlsChanged()</slot> <slot>onShadowControlsChanged()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>165</x> <x>166</x>
<y>179</y> <y>174</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>294</x> <x>294</x>
@@ -1941,8 +1932,8 @@
<slot>onShadowControlsChanged()</slot> <slot>onShadowControlsChanged()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>142</x> <x>141</x>
<y>215</y> <y>209</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>399</x> <x>399</x>
@@ -1957,8 +1948,8 @@
<slot>onShadowControlsChanged()</slot> <slot>onShadowControlsChanged()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>159</x> <x>162</x>
<y>252</y> <y>245</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>399</x> <x>399</x>
@@ -1973,8 +1964,8 @@
<slot>onLineSizeControlsChanged()</slot> <slot>onLineSizeControlsChanged()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>174</x> <x>177</x>
<y>456</y> <y>444</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>5</x> <x>5</x>
@@ -1989,8 +1980,8 @@
<slot>onLineSizeControlsChanged()</slot> <slot>onLineSizeControlsChanged()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>174</x> <x>177</x>
<y>493</y> <y>480</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>1</x> <x>1</x>
@@ -1999,14 +1990,14 @@
</hints> </hints>
</connection> </connection>
<connection> <connection>
<sender>imageFileButton</sender> <sender>imageBrowseButton</sender>
<signal>clicked()</signal> <signal>clicked()</signal>
<receiver>ObjectEditor</receiver> <receiver>ObjectEditor</receiver>
<slot>onImageFileButtonClicked()</slot> <slot>onImageFileButtonClicked()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>133</x> <x>367</x>
<y>175</y> <y>135</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>394</x> <x>394</x>
@@ -2014,22 +2005,6 @@
</hint> </hint>
</hints> </hints>
</connection> </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> <connection>
<sender>textEdit</sender> <sender>textEdit</sender>
<signal>textChanged()</signal> <signal>textChanged()</signal>
@@ -2046,22 +2021,6 @@
</hint> </hint>
</hints> </hints>
</connection> </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> <connection>
<sender>barcodeShowTextCheck</sender> <sender>barcodeShowTextCheck</sender>
<signal>toggled(bool)</signal> <signal>toggled(bool)</signal>
@@ -2069,8 +2028,8 @@
<slot>onBarcodeControlsChanged()</slot> <slot>onBarcodeControlsChanged()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>178</x> <x>195</x>
<y>172</y> <y>167</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>4</x> <x>4</x>
@@ -2085,8 +2044,8 @@
<slot>onBarcodeControlsChanged()</slot> <slot>onBarcodeControlsChanged()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>164</x> <x>195</x>
<y>204</y> <y>198</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>1</x> <x>1</x>
@@ -2102,7 +2061,7 @@
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>126</x> <x>126</x>
<y>239</y> <y>232</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>1</x> <x>1</x>
@@ -2126,22 +2085,6 @@
</hint> </hint>
</hints> </hints>
</connection> </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> <connection>
<sender>barcodeStyleButton</sender> <sender>barcodeStyleButton</sender>
<signal>selectionChanged()</signal> <signal>selectionChanged()</signal>
@@ -2149,8 +2092,8 @@
<slot>onBarcodeControlsChanged()</slot> <slot>onBarcodeControlsChanged()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>178</x> <x>195</x>
<y>140</y> <y>136</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>5</x> <x>5</x>
@@ -2190,6 +2133,70 @@
</hint> </hint>
</hints> </hints>
</connection> </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> </connections>
<slots> <slots>
<slot>onChanged()</slot> <slot>onChanged()</slot>
@@ -2206,5 +2213,6 @@
<slot>onTextInsertFieldKeySelected(QString)</slot> <slot>onTextInsertFieldKeySelected(QString)</slot>
<slot>onBarcodeControlsChanged()</slot> <slot>onBarcodeControlsChanged()</slot>
<slot>onBarcodeInsertFieldKeySelected(QString)</slot> <slot>onBarcodeInsertFieldKeySelected(QString)</slot>
<slot>onImageComboChanged()</slot>
</slots> </slots>
</ui> </ui>
+35 -19
View File
@@ -6,7 +6,7 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>759</width> <width>852</width>
<height>792</height> <height>792</height>
</rect> </rect>
</property> </property>
@@ -17,7 +17,7 @@
</sizepolicy> </sizepolicy>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string notr="true">Form</string>
</property> </property>
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0,1"> <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0,1">
<item> <item>
@@ -73,21 +73,8 @@
<property name="title"> <property name="title">
<string>Copies</string> <string>Copies</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_3"> <layout class="QVBoxLayout" name="verticalLayout_4">
<item row="5" column="0"> <item>
<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="QHBoxLayout" name="horizontalLayout_5"> <layout class="QHBoxLayout" name="horizontalLayout_5">
<item> <item>
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="label_4">
@@ -104,11 +91,17 @@
</item> </item>
<item> <item>
<widget class="QSpinBox" name="copiesSpin"> <widget class="QSpinBox" name="copiesSpin">
<property name="buttonSymbols">
<enum>QAbstractSpinBox::UpDownArrows</enum>
</property>
<property name="accelerated">
<bool>true</bool>
</property>
<property name="minimum"> <property name="minimum">
<number>1</number> <number>1</number>
</property> </property>
<property name="maximum"> <property name="maximum">
<number>96</number> <number>9999</number>
</property> </property>
</widget> </widget>
</item> </item>
@@ -127,7 +120,7 @@
</item> </item>
</layout> </layout>
</item> </item>
<item row="2" column="0"> <item>
<layout class="QHBoxLayout" name="horizontalLayout_4"> <layout class="QHBoxLayout" name="horizontalLayout_4">
<item> <item>
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">
@@ -183,6 +176,29 @@
</item> </item>
</layout> </layout>
</item> </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> </layout>
</widget> </widget>
</item> </item>
+7 -1
View File
@@ -23,7 +23,7 @@
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string notr="true">Form</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_5" columnstretch="0,0,0,0,1"> <layout class="QGridLayout" name="gridLayout_5" columnstretch="0,0,0,0,1">
<item row="0" column="4"> <item row="0" column="4">
@@ -241,6 +241,12 @@
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QPushButton" name="changeProductButton"> <widget class="QPushButton" name="changeProductButton">
<property name="minimumSize">
<size>
<width>330</width>
<height>0</height>
</size>
</property>
<property name="toolTip"> <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> <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> </property>
+1 -1
View File
@@ -11,7 +11,7 @@
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string notr="true">Form</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="0" column="0"> <item row="0" column="0">
+1 -1
View File
@@ -23,7 +23,7 @@
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string notr="true">Form</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing"> <property name="spacing">
+1 -1
View File
@@ -23,7 +23,7 @@
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string notr="true">Form</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0"> <item row="0" column="0">
+1 -1
View File
@@ -23,7 +23,7 @@
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string notr="true">Form</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing"> <property name="spacing">
+1 -1
View File
@@ -23,7 +23,7 @@
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string notr="true">Form</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0"> <item row="0" column="0">
+1 -1
View File
@@ -23,7 +23,7 @@
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string notr="true">Form</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<property name="verticalSpacing"> <property name="verticalSpacing">
+1 -1
View File
@@ -23,7 +23,7 @@
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string notr="true">Form</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<property name="sizeConstraint"> <property name="sizeConstraint">
+1 -1
View File
@@ -23,7 +23,7 @@
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string notr="true">Form</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
<property name="verticalSpacing"> <property name="verticalSpacing">
+1 -1
View File
@@ -23,7 +23,7 @@
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string notr="true">Form</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0"> <item row="0" column="0">
+1 -1
View File
@@ -23,7 +23,7 @@
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string notr="true">Form</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_3"> <layout class="QGridLayout" name="gridLayout_3">
<item row="1" column="0"> <item row="1" column="0">
+1 -1
View File
@@ -23,7 +23,7 @@
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string notr="true">Form</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing"> <property name="spacing">
+1 -1
View File
@@ -23,7 +23,7 @@
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string notr="true">Form</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0"> <item row="0" column="0">
+1 -1
View File
@@ -23,7 +23,7 @@
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string notr="true">Form</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0"> <item row="0" column="0">
+1 -1
View File
@@ -23,7 +23,7 @@
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string notr="true">Form</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="0" column="0"> <item row="0" column="0">
+1 -1
View File
@@ -23,7 +23,7 @@
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string notr="true">Form</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0"> <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 Template.cpp
TextNode.cpp TextNode.cpp
Units.cpp Units.cpp
Variable.cpp
Variables.cpp
Vendor.cpp Vendor.cpp
XmlCategoryParser.cpp XmlCategoryParser.cpp
XmlLabelCreator.cpp XmlLabelCreator.cpp
@@ -80,6 +82,7 @@ set (Model_qobject_headers
ModelTextObject.h ModelTextObject.h
PageRenderer.h PageRenderer.h
Settings.h Settings.h
Variables.h
) )
qt5_wrap_cpp (Model_moc_sources ${Model_qobject_headers}) qt5_wrap_cpp (Model_moc_sources ${Model_qobject_headers})
+21 -19
View File
@@ -175,30 +175,32 @@ namespace glabels
/// ///
/// Get color, expand if necessary /// 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 ) value = QColor( record->value(mKey) );
{
return mColor;
}
else
{
if ( record->contains( mKey ) )
{
return QColor( (*record)[ mKey ] );
}
else
{
return mColor;
}
}
} }
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 #define model_ColorNode_h
#include "Variables.h"
#include "merge/Record.h" #include "merge/Record.h"
#include <QString> #include <QString>
@@ -95,7 +96,8 @@ namespace glabels
///////////////////////////////// /////////////////////////////////
public: public:
uint32_t rgba() const; 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("/"); 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 userTemplatesDir();
QDir translationsDir(); QDir translationsDir();
QString makeRelativeIfInDir( const QDir& dir,
const QString& filename );
} }
} }
+76 -12
View File
@@ -57,7 +57,18 @@ namespace glabels
Model::Model() Model::Model()
: mUntitledInstance(0), mModified(true), mRotate(false) : mUntitledInstance(0), mModified(true), mRotate(false)
{ {
mVariables = new Variables();
mMerge = new merge::None(); 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() 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 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 ); savedModel->restore( this );
return savedModel; return savedModel;
@@ -112,18 +130,12 @@ namespace glabels
connect( object, SIGNAL(moved()), this, SLOT(onObjectMoved()) ); connect( object, SIGNAL(moved()), this, SLOT(onObjectMoved()) );
} }
delete mMerge;
mMerge = savedModel->mMerge->clone();
// Emit signals based on potential changes // Emit signals based on potential changes
emit changed(); emit changed();
emit selectionChanged(); emit selectionChanged();
emit modifiedChanged(); emit modifiedChanged();
emit nameChanged(); emit nameChanged();
emit sizeChanged(); 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. /// Get short name.
/// ///
@@ -302,6 +346,15 @@ namespace glabels
} }
///
/// Get variables object
///
Variables* Model::variables() const
{
return mVariables;
}
/// ///
/// Get merge object /// Get merge object
/// ///
@@ -451,6 +504,17 @@ namespace glabels
} }
///
/// Variables Changed Slot
///
void Model::onVariablesChanged()
{
setModified();
emit changed();
emit variablesChanged();
}
/// ///
/// Merge Source Changed Slot /// Merge Source Changed Slot
/// ///
@@ -1359,7 +1423,7 @@ namespace glabels
QClipboard *clipboard = QApplication::clipboard(); QClipboard *clipboard = QApplication::clipboard();
QByteArray buffer; QByteArray buffer;
XmlLabelCreator::serializeObjects( getSelection(), buffer ); XmlLabelCreator::serializeObjects( getSelection(), this, buffer );
auto *mimeData = new QMimeData; auto *mimeData = new QMimeData;
mimeData->setData( MIME_TYPE, buffer ); mimeData->setData( MIME_TYPE, buffer );
@@ -1415,7 +1479,7 @@ namespace glabels
{ {
// Native objects // Native objects
QByteArray buffer = mimeData->data( MIME_TYPE ); QByteArray buffer = mimeData->data( MIME_TYPE );
QList <ModelObject*> objects = XmlLabelParser::deserializeObjects( buffer ); QList <ModelObject*> objects = XmlLabelParser::deserializeObjects( buffer, this );
unselectAll(); unselectAll();
foreach ( ModelObject* object, objects ) foreach ( ModelObject* object, objects )
@@ -1452,11 +1516,11 @@ namespace glabels
/// ///
/// Draw label objects /// 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 ) 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 "Settings.h"
#include "Template.h" #include "Template.h"
#include "Variables.h"
#include "merge/Merge.h" #include "merge/Merge.h"
#include "merge/Record.h" #include "merge/Record.h"
#include <QDir>
#include <QList> #include <QList>
#include <QObject> #include <QObject>
#include <QPainter> #include <QPainter>
@@ -57,6 +59,7 @@ namespace glabels
///////////////////////////////// /////////////////////////////////
public: public:
Model(); Model();
Model( merge::Merge* merge, Variables* variables );
~Model(); ~Model();
@@ -76,6 +79,7 @@ namespace glabels
void sizeChanged(); void sizeChanged();
void selectionChanged(); void selectionChanged();
void modifiedChanged(); void modifiedChanged();
void variablesChanged();
void mergeChanged(); void mergeChanged();
void mergeSourceChanged(); void mergeSourceChanged();
void mergeSelectionChanged(); void mergeSelectionChanged();
@@ -89,6 +93,8 @@ namespace glabels
void setModified(); void setModified();
void clearModified(); void clearModified();
QDir dir() const;
QString dirPath() const;
QString shortName(); QString shortName();
const QString& fileName() const; const QString& fileName() const;
void setFileName( const QString &fileName ); void setFileName( const QString &fileName );
@@ -107,6 +113,8 @@ namespace glabels
const QList<ModelObject*>& objectList() const; const QList<ModelObject*>& objectList() const;
Variables* variables() const;
merge::Merge* merge() const; merge::Merge* merge() const;
void setMerge( merge::Merge* merge ); void setMerge( merge::Merge* merge );
@@ -204,7 +212,10 @@ namespace glabels
// Drawing operations // Drawing operations
///////////////////////////////// /////////////////////////////////
public: 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: private slots:
void onObjectChanged(); void onObjectChanged();
void onObjectMoved(); void onObjectMoved();
void onVariablesChanged();
void onMergeSourceChanged(); void onMergeSourceChanged();
void onMergeSelectionChanged(); void onMergeSelectionChanged();
@@ -229,6 +241,7 @@ namespace glabels
QList<ModelObject*> mObjectList; QList<ModelObject*> mObjectList;
Variables* mVariables;
merge::Merge* mMerge; merge::Merge* mMerge;
}; };
+11 -7
View File
@@ -89,13 +89,14 @@ namespace glabels
const Distance& y0, const Distance& y0,
const Distance& w, const Distance& w,
const Distance& h, const Distance& h,
bool lockAspectRatio,
const barcode::Style& bcStyle, const barcode::Style& bcStyle,
bool bcTextFlag, bool bcTextFlag,
bool bcChecksumFlag, bool bcChecksumFlag,
QString bcData, QString bcData,
const ColorNode& bcColorNode, const ColorNode& bcColorNode,
const QMatrix& matrix ) const QMatrix& matrix )
: ModelObject( x0, y0, w, h, matrix ) : ModelObject( x0, y0, w, h, lockAspectRatio, matrix )
{ {
mOutline = new Outline( this ); mOutline = new Outline( this );
@@ -311,7 +312,8 @@ namespace glabels
/// ///
void ModelBarcodeObject::drawShadow( QPainter* painter, void ModelBarcodeObject::drawShadow( QPainter* painter,
bool inEditor, bool inEditor,
merge::Record* record ) const merge::Record* record,
Variables* variables ) const
{ {
// Barcodes don't support shadows. // Barcodes don't support shadows.
} }
@@ -322,9 +324,10 @@ namespace glabels
/// ///
void ModelBarcodeObject::drawObject( QPainter* painter, void ModelBarcodeObject::drawObject( QPainter* painter,
bool inEditor, 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 ) if ( inEditor )
{ {
@@ -332,7 +335,7 @@ namespace glabels
} }
else else
{ {
drawBc( painter, bcColor, record ); drawBc( painter, bcColor, record, variables );
} }
} }
@@ -450,7 +453,8 @@ namespace glabels
void void
ModelBarcodeObject::drawBc( QPainter* painter, ModelBarcodeObject::drawBc( QPainter* painter,
const QColor& color, const QColor& color,
merge::Record* record ) const merge::Record* record,
Variables* variables ) const
{ {
painter->setPen( QPen( color ) ); painter->setPen( QPen( color ) );
@@ -458,7 +462,7 @@ namespace glabels
bc->setChecksum(mBcChecksumFlag); bc->setChecksum(mBcChecksumFlag);
bc->setShowText(mBcTextFlag); 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); glbarcode::QtRenderer renderer(painter);
bc->render( renderer ); bc->render( renderer );
+17 -3
View File
@@ -51,6 +51,7 @@ namespace glabels
const Distance& y0, const Distance& y0,
const Distance& w, const Distance& w,
const Distance& h, const Distance& h,
bool lockAspectRatio,
const barcode::Style& bcStyle, const barcode::Style& bcStyle,
bool bcTextFlag, bool bcTextFlag,
bool bcChecksumFlag, bool bcChecksumFlag,
@@ -126,8 +127,16 @@ namespace glabels
// Drawing operations // Drawing operations
/////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////
protected: protected:
void drawShadow( QPainter* painter, bool inEditor, merge::Record* record ) const override; void drawShadow( QPainter* painter,
void drawObject( QPainter* painter, bool inEditor, merge::Record* record ) const override; 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; QPainterPath hoverPath( double scale ) const override;
@@ -139,7 +148,12 @@ namespace glabels
void update(); void update();
void drawBcInEditor( QPainter* painter, const QColor& color ) const; 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; 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& y0,
const Distance& w, const Distance& w,
const Distance& h, const Distance& h,
bool lockAspectRatio,
const Distance& lineWidth, const Distance& lineWidth,
const ColorNode& lineColorNode, const ColorNode& lineColorNode,
const ColorNode& fillColorNode, const ColorNode& fillColorNode,
@@ -63,7 +64,7 @@ namespace glabels
const Distance& shadowY, const Distance& shadowY,
double shadowOpacity, double shadowOpacity,
const ColorNode& shadowColorNode ) const ColorNode& shadowColorNode )
: ModelShapeObject( x0, y0, w, h, : ModelShapeObject( x0, y0, w, h, lockAspectRatio,
lineWidth, lineColorNode, fillColorNode, lineWidth, lineColorNode, fillColorNode,
matrix, matrix,
shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode ) shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode )
@@ -103,11 +104,14 @@ namespace glabels
/// ///
/// Draw shadow of object /// 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 lineColor = mLineColorNode.color( record, variables );
QColor fillColor = mFillColorNode.color( record ); QColor fillColor = mFillColorNode.color( record, variables );
QColor shadowColor = mShadowColorNode.color( record ); QColor shadowColor = mShadowColorNode.color( record, variables );
shadowColor.setAlphaF( mShadowOpacity ); shadowColor.setAlphaF( mShadowOpacity );
@@ -148,10 +152,13 @@ namespace glabels
/// ///
/// Draw object itself /// 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 lineColor = mLineColorNode.color( record, variables );
QColor fillColor = mFillColorNode.color( record ); QColor fillColor = mFillColorNode.color( record, variables );
painter->setPen( QPen( lineColor, mLineWidth.pt() ) ); painter->setPen( QPen( lineColor, mLineWidth.pt() ) );
painter->setBrush( fillColor ); painter->setBrush( fillColor );
+11 -2
View File
@@ -47,6 +47,7 @@ namespace glabels
const Distance& y0, const Distance& y0,
const Distance& w, const Distance& w,
const Distance& h, const Distance& h,
bool lockAspectRatio,
const Distance& lineWidth, const Distance& lineWidth,
const ColorNode& lineColorNode, const ColorNode& lineColorNode,
const ColorNode& fillColorNode, const ColorNode& fillColorNode,
@@ -72,8 +73,16 @@ namespace glabels
// Drawing operations // Drawing operations
/////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////
protected: protected:
void drawShadow( QPainter* painter, bool inEditor, merge::Record* record ) const override; void drawShadow( QPainter* painter,
void drawObject( QPainter* painter, bool inEditor, merge::Record* record ) const override; 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; QPainterPath hoverPath( double scale ) const override;
}; };
+15 -8
View File
@@ -54,6 +54,7 @@ namespace glabels
const Distance& y0, const Distance& y0,
const Distance& w, const Distance& w,
const Distance& h, const Distance& h,
bool lockAspectRatio,
const Distance& lineWidth, const Distance& lineWidth,
const ColorNode& lineColorNode, const ColorNode& lineColorNode,
const ColorNode& fillColorNode, const ColorNode& fillColorNode,
@@ -63,7 +64,7 @@ namespace glabels
const Distance& shadowY, const Distance& shadowY,
double shadowOpacity, double shadowOpacity,
const ColorNode& shadowColorNode ) const ColorNode& shadowColorNode )
: ModelShapeObject( x0, y0, w, h, : ModelShapeObject( x0, y0, w, h, lockAspectRatio,
lineWidth, lineColorNode, fillColorNode, lineWidth, lineColorNode, fillColorNode,
matrix, matrix,
shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode ) shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode )
@@ -103,11 +104,14 @@ namespace glabels
/// ///
/// Draw shadow of object /// 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 lineColor = mLineColorNode.color( record, variables );
QColor fillColor = mFillColorNode.color( record ); QColor fillColor = mFillColorNode.color( record, variables );
QColor shadowColor = mShadowColorNode.color( record ); QColor shadowColor = mShadowColorNode.color( record, variables );
shadowColor.setAlphaF( mShadowOpacity ); shadowColor.setAlphaF( mShadowOpacity );
@@ -148,10 +152,13 @@ namespace glabels
/// ///
/// Draw object itself /// 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 lineColor = mLineColorNode.color( record, variables );
QColor fillColor = mFillColorNode.color( record ); QColor fillColor = mFillColorNode.color( record, variables );
painter->setPen( QPen( lineColor, mLineWidth.pt() ) ); painter->setPen( QPen( lineColor, mLineWidth.pt() ) );
painter->setBrush( fillColor ); painter->setBrush( fillColor );
+11 -2
View File
@@ -47,6 +47,7 @@ namespace glabels
const Distance& y0, const Distance& y0,
const Distance& w, const Distance& w,
const Distance& h, const Distance& h,
bool lockAspectRatio,
const Distance& lineWidth, const Distance& lineWidth,
const ColorNode& lineColorNode, const ColorNode& lineColorNode,
const ColorNode& fillColorNode, const ColorNode& fillColorNode,
@@ -72,8 +73,16 @@ namespace glabels
// Drawing operations // Drawing operations
/////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////
protected: protected:
void drawShadow( QPainter* painter, bool inEditor, merge::Record* record ) const override; void drawShadow( QPainter* painter,
void drawObject( QPainter* painter, bool inEditor, merge::Record* record ) const override; 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; QPainterPath hoverPath( double scale ) const override;
}; };
+208 -58
View File
@@ -20,9 +20,11 @@
#include "ModelImageObject.h" #include "ModelImageObject.h"
#include "Model.h"
#include "Size.h" #include "Size.h"
#include <QBrush> #include <QBrush>
#include <QDir>
#include <QFileInfo> #include <QFileInfo>
#include <QImage> #include <QImage>
#include <QPen> #include <QPen>
@@ -40,6 +42,17 @@ namespace glabels
QImage* ModelImageObject::smDefaultImage = nullptr; 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 /// Constructor
/// ///
@@ -70,6 +83,7 @@ namespace glabels
const Distance& y0, const Distance& y0,
const Distance& w, const Distance& w,
const Distance& h, const Distance& h,
bool lockAspectRatio,
const TextNode& filenameNode, const TextNode& filenameNode,
const QMatrix& matrix, const QMatrix& matrix,
bool shadowState, bool shadowState,
@@ -77,7 +91,7 @@ namespace glabels
const Distance& shadowY, const Distance& shadowY,
double shadowOpacity, double shadowOpacity,
const ColorNode& shadowColorNode ) const ColorNode& shadowColorNode )
: ModelObject( x0, y0, w, h, : ModelObject( x0, y0, w, h, lockAspectRatio,
matrix, matrix,
shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode ) shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode )
{ {
@@ -101,6 +115,8 @@ namespace glabels
mImage = nullptr; mImage = nullptr;
mSvgRenderer = nullptr; mSvgRenderer = nullptr;
loadImage();
} }
@@ -111,6 +127,7 @@ namespace glabels
const Distance& y0, const Distance& y0,
const Distance& w, const Distance& w,
const Distance& h, const Distance& h,
bool lockAspectRatio,
const QString& filename, const QString& filename,
const QImage& image, const QImage& image,
const QMatrix& matrix, const QMatrix& matrix,
@@ -119,7 +136,7 @@ namespace glabels
const Distance& shadowY, const Distance& shadowY,
double shadowOpacity, double shadowOpacity,
const ColorNode& shadowColorNode ) const ColorNode& shadowColorNode )
: ModelObject( x0, y0, w, h, : ModelObject( x0, y0, w, h, lockAspectRatio,
matrix, matrix,
shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode ) shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode )
{ {
@@ -152,6 +169,7 @@ namespace glabels
const Distance& y0, const Distance& y0,
const Distance& w, const Distance& w,
const Distance& h, const Distance& h,
bool lockAspectRatio,
const QString& filename, const QString& filename,
const QByteArray& svg, const QByteArray& svg,
const QMatrix& matrix, const QMatrix& matrix,
@@ -160,7 +178,7 @@ namespace glabels
const Distance& shadowY, const Distance& shadowY,
double shadowOpacity, double shadowOpacity,
const ColorNode& shadowColorNode ) const ColorNode& shadowColorNode )
: ModelObject( x0, y0, w, h, : ModelObject( x0, y0, w, h, lockAspectRatio,
matrix, matrix,
shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode ) shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode )
{ {
@@ -395,27 +413,58 @@ namespace glabels
/// ///
/// Draw shadow of object /// 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() ); QRectF destRect( 0, 0, mW.pt(), mH.pt() );
QColor shadowColor = mShadowColorNode.color( record ); QColor shadowColor = mShadowColorNode.color( record, variables );
shadowColor.setAlphaF( mShadowOpacity ); shadowColor.setAlphaF( mShadowOpacity );
if ( mImage && mImage->hasAlphaChannel() && (mImage->depth() == 32) ) if ( mImage && mImage->hasAlphaChannel() && (mImage->depth() == 32) )
{ {
QImage* shadowImage = createShadowImage( shadowColor ); QImage* shadowImage = createShadowImage( *mImage, shadowColor );
painter->drawImage( destRect, *shadowImage ); painter->drawImage( destRect, *shadowImage );
delete shadowImage; delete shadowImage;
} }
else if ( mImage || mSvgRenderer || inEditor )
{
painter->setBrush( shadowColor );
painter->setPen( QPen( Qt::NoPen ) );
painter->drawRect( destRect );
}
else 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 ); if ( image && image->hasAlphaChannel() && (image->depth() == 32) )
painter->setPen( QPen( Qt::NoPen ) ); {
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 /// 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() ); QRectF destRect( 0, 0, mW.pt(), mH.pt() );
if ( inEditor && (mFilenameNode.isField() || (!mImage && !mSvgRenderer) ) ) if ( inEditor && (mFilenameNode.isField() || (!mImage && !mSvgRenderer) ) )
{ {
//
// Render default place holder image
//
painter->save(); painter->save();
painter->setRenderHint( QPainter::SmoothPixmapTransform, false ); painter->setRenderHint( QPainter::SmoothPixmapTransform, false );
painter->drawImage( destRect, *smDefaultImage ); painter->drawImage( destRect, *smDefaultImage );
painter->restore(); 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 ) else if ( mImage )
{ {
@@ -445,7 +548,23 @@ namespace glabels
} }
else if ( mFilenameNode.isField() ) 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() ) if ( !mFilenameNode.isField() )
{ {
QString filename = mFilenameNode.data(); QString filename = mFilenameNode.data();
QFileInfo fileInfo( filename ); if ( readImageFile( filename, mImage, mSvgRenderer, mSvg ) )
if ( fileInfo.isReadable() )
{ {
if ( (fileInfo.suffix() == "svg") || (fileInfo.suffix() == "SVG") ) double aspectRatio = 0;
if ( mSvgRenderer )
{ {
QFile file( filename ); // Adjust size based on aspect ratio of SVG image
if ( file.open( QFile::ReadOnly ) ) QRectF rect = mSvgRenderer->viewBoxF();
{ aspectRatio = rect.width() ? rect.height() / rect.width() : 0;
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;
}
}
}
} }
else else
{ {
mImage = new QImage( filename ); // Adjust size based on aspect ratio of image
if ( mImage->isNull() ) 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 else
{ {
// Adjust size based on aspect ratio of image mW = mH/aspectRatio;
double imageW = mImage->width();
double imageH = mImage->height();
double aspectRatio = imageH / imageW;
if ( mH > mW*aspectRatio )
{
mH = mW*aspectRatio;
}
else
{
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 /// 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 r = color.red();
int g = color.green(); int g = color.green();
int b = color.blue(); int b = color.blue();
int a = color.alpha(); int a = color.alpha();
auto* shadow = new QImage( *mImage ); auto* shadow = new QImage( image );
for ( int iy = 0; iy < shadow->height(); iy++ ) for ( int iy = 0; iy < shadow->height(); iy++ )
{ {
auto* scanLine = (QRgb*)shadow->scanLine( iy ); auto* scanLine = (QRgb*)shadow->scanLine( iy );
+21 -3
View File
@@ -49,6 +49,7 @@ namespace glabels
const Distance& y0, const Distance& y0,
const Distance& w, const Distance& w,
const Distance& h, const Distance& h,
bool lockAspectRatio,
const TextNode& filenameNode, const TextNode& filenameNode,
const QMatrix& matrix = QMatrix(), const QMatrix& matrix = QMatrix(),
bool shadowState = false, bool shadowState = false,
@@ -61,6 +62,7 @@ namespace glabels
const Distance& y0, const Distance& y0,
const Distance& w, const Distance& w,
const Distance& h, const Distance& h,
bool lockAspectRatio,
const QString& filename, const QString& filename,
const QImage& image, const QImage& image,
const QMatrix& matrix = QMatrix(), const QMatrix& matrix = QMatrix(),
@@ -74,6 +76,7 @@ namespace glabels
const Distance& y0, const Distance& y0,
const Distance& w, const Distance& w,
const Distance& h, const Distance& h,
bool lockAspectRatio,
const QString& filename, const QString& filename,
const QByteArray& svg, const QByteArray& svg,
const QMatrix& matrix = QMatrix(), const QMatrix& matrix = QMatrix(),
@@ -132,8 +135,16 @@ namespace glabels
// Drawing operations // Drawing operations
/////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////
protected: protected:
void drawShadow( QPainter* painter, bool inEditor, merge::Record* record ) const override; void drawShadow( QPainter* painter,
void drawObject( QPainter* painter, bool inEditor, merge::Record* record ) const override; 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; QPainterPath hoverPath( double scale ) const override;
@@ -141,7 +152,14 @@ namespace glabels
// Private // Private
/////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////
void loadImage(); 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, const Distance& shadowY,
double shadowOpacity, double shadowOpacity,
const ColorNode& shadowColorNode ) const ColorNode& shadowColorNode )
: ModelObject( x0, y0, dx, dy, : ModelObject( x0, y0, dx, dy, false /*lockAspectRatio*/,
matrix, matrix,
shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode ) shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode )
{ {
@@ -186,10 +186,13 @@ namespace glabels
/// ///
/// Draw shadow of object /// 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 lineColor = mLineColorNode.color( record, variables );
QColor shadowColor = mShadowColorNode.color( record ); QColor shadowColor = mShadowColorNode.color( record, variables );
shadowColor.setAlphaF( mShadowOpacity ); shadowColor.setAlphaF( mShadowOpacity );
@@ -204,9 +207,12 @@ namespace glabels
/// ///
/// Draw object itself /// 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->setPen( QPen( lineColor, mLineWidth.pt() ) );
painter->drawLine( 0, 0, mW.pt(), mH.pt() ); painter->drawLine( 0, 0, mW.pt(), mH.pt() );
+10 -2
View File
@@ -97,8 +97,16 @@ namespace glabels
// Drawing operations // Drawing operations
/////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////
protected: protected:
void drawShadow( QPainter* painter, bool inEditor, merge::Record* record ) const override; void drawShadow( QPainter* painter,
void drawObject( QPainter* painter, bool inEditor, merge::Record* record ) const override; 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; QPainterPath hoverPath( double scale ) const override;
+32 -3
View File
@@ -51,6 +51,7 @@ namespace glabels
mY0 = 0; mY0 = 0;
mW = 0; mW = 0;
mH = 0; mH = 0;
mLockAspectRatio = false;
mMatrix = QMatrix(); mMatrix = QMatrix();
mShadowState = false; mShadowState = false;
@@ -72,6 +73,7 @@ namespace glabels
const Distance& y0, const Distance& y0,
const Distance& w, const Distance& w,
const Distance& h, const Distance& h,
bool lockAspectRatio,
const QMatrix& matrix, const QMatrix& matrix,
bool shadowState, bool shadowState,
const Distance& shadowX, const Distance& shadowX,
@@ -85,6 +87,7 @@ namespace glabels
mY0 = y0; mY0 = y0;
mW = w; mW = w;
mH = h; mH = h;
mLockAspectRatio = lockAspectRatio;
mMatrix = matrix; mMatrix = matrix;
mShadowState = shadowState; mShadowState = shadowState;
@@ -112,6 +115,7 @@ namespace glabels
mY0 = object->mY0; mY0 = object->mY0;
mW = object->mW; mW = object->mW;
mH = object->mH; mH = object->mH;
mLockAspectRatio = object->mLockAspectRatio;
mShadowState = object->mShadowState; mShadowState = object->mShadowState;
mShadowX = object->mShadowX; 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 /// Matrix Property Getter
/// ///
@@ -1200,7 +1226,10 @@ namespace glabels
/// ///
/// Draw object + shadow /// 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->save();
painter->translate( mX0.pt(), mY0.pt() ); painter->translate( mX0.pt(), mY0.pt() );
@@ -1210,12 +1239,12 @@ namespace glabels
painter->save(); painter->save();
painter->translate( mShadowX.pt(), mShadowY.pt() ); painter->translate( mShadowX.pt(), mShadowY.pt() );
painter->setMatrix( mMatrix, true ); painter->setMatrix( mMatrix, true );
drawShadow( painter, inEditor, record ); drawShadow( painter, inEditor, record, variables );
painter->restore(); painter->restore();
} }
painter->setMatrix( mMatrix, true ); painter->setMatrix( mMatrix, true );
drawObject( painter, inEditor, record ); drawObject( painter, inEditor, record, variables );
painter->restore(); painter->restore();
} }
+25 -3
View File
@@ -27,6 +27,7 @@
#include "Handles.h" #include "Handles.h"
#include "Outline.h" #include "Outline.h"
#include "TextNode.h" #include "TextNode.h"
#include "Variables.h"
#include "barcode/Style.h" #include "barcode/Style.h"
#include "merge/Record.h" #include "merge/Record.h"
@@ -64,6 +65,7 @@ namespace glabels
const Distance& y0, const Distance& y0,
const Distance& w, const Distance& w,
const Distance& h, const Distance& h,
bool lockAspectRatio = false,
const QMatrix& matrix = QMatrix(), const QMatrix& matrix = QMatrix(),
bool shadowState = false, bool shadowState = false,
const Distance& shadowX = 0, const Distance& shadowX = 0,
@@ -136,6 +138,13 @@ namespace glabels
void setH( const Distance& value ); void setH( const Distance& value );
//
// Lock Aspect Ratio Property
//
bool lockAspectRatio() const;
void setLockAspectRatio( bool value );
// //
// Transformation Matrix Property // Transformation Matrix Property
// //
@@ -403,12 +412,24 @@ namespace glabels
// Drawing operations // Drawing operations
/////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////
public: 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; void drawSelectionHighlight( QPainter* painter, double scale ) const;
protected: protected:
virtual void drawShadow( QPainter* painter, bool inEditor, merge::Record* record ) const = 0; virtual void drawShadow( QPainter* painter,
virtual void drawObject( QPainter* painter, bool inEditor, merge::Record* record ) const = 0; 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 QPainterPath hoverPath( double scale ) const = 0;
virtual void sizeUpdated(); virtual void sizeUpdated();
@@ -424,6 +445,7 @@ namespace glabels
Distance mY0; Distance mY0;
Distance mW; Distance mW;
Distance mH; Distance mH;
bool mLockAspectRatio;
bool mShadowState; bool mShadowState;
Distance mShadowX; Distance mShadowX;
+2 -1
View File
@@ -58,6 +58,7 @@ namespace glabels
const Distance& y0, const Distance& y0,
const Distance& w, const Distance& w,
const Distance& h, const Distance& h,
bool lockAspectRatio,
const Distance& lineWidth, const Distance& lineWidth,
const ColorNode& lineColorNode, const ColorNode& lineColorNode,
const ColorNode& fillColorNode, const ColorNode& fillColorNode,
@@ -67,7 +68,7 @@ namespace glabels
const Distance& shadowY, const Distance& shadowY,
double shadowOpacity, double shadowOpacity,
const ColorNode& shadowColorNode ) const ColorNode& shadowColorNode )
: ModelObject( x0, y0, w, h, : ModelObject( x0, y0, w, h, lockAspectRatio,
matrix, matrix,
shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode ) shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode )
{ {
+1
View File
@@ -47,6 +47,7 @@ namespace glabels
const Distance& y0, const Distance& y0,
const Distance& w, const Distance& w,
const Distance& h, const Distance& h,
bool lockAspectRatio,
const Distance& lineWidth, const Distance& lineWidth,
const ColorNode& lineColorNode, const ColorNode& lineColorNode,
const ColorNode& fillColorNode, const ColorNode& fillColorNode,
+17 -13
View File
@@ -82,6 +82,7 @@ namespace glabels
const Distance& y0, const Distance& y0,
const Distance& w, const Distance& w,
const Distance& h, const Distance& h,
bool lockAspectRatio,
const QString& text, const QString& text,
const QString& fontFamily, const QString& fontFamily,
double fontSize, double fontSize,
@@ -100,7 +101,7 @@ namespace glabels
const Distance& shadowY, const Distance& shadowY,
double shadowOpacity, double shadowOpacity,
const ColorNode& shadowColorNode ) const ColorNode& shadowColorNode )
: ModelObject( x0, y0, w, h, : ModelObject( x0, y0, w, h, lockAspectRatio,
matrix, matrix,
shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode ) shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode )
{ {
@@ -518,13 +519,14 @@ namespace glabels
/// ///
void ModelTextObject::drawShadow( QPainter* painter, void ModelTextObject::drawShadow( QPainter* painter,
bool inEditor, 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() ) if ( textColor.alpha() )
{ {
QColor shadowColor = mShadowColorNode.color( record ); QColor shadowColor = mShadowColorNode.color( record, variables );
shadowColor.setAlphaF( mShadowOpacity ); shadowColor.setAlphaF( mShadowOpacity );
if ( inEditor ) if ( inEditor )
@@ -533,7 +535,7 @@ namespace glabels
} }
else else
{ {
drawText( painter, shadowColor, record ); drawText( painter, shadowColor, record, variables );
} }
} }
} }
@@ -544,9 +546,10 @@ namespace glabels
/// ///
void ModelTextObject::drawObject( QPainter* painter, void ModelTextObject::drawObject( QPainter* painter,
bool inEditor, 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 ) if ( inEditor )
{ {
@@ -554,7 +557,7 @@ namespace glabels
} }
else else
{ {
drawText( painter, textColor, record ); drawText( painter, textColor, record, variables );
} }
} }
@@ -696,7 +699,8 @@ namespace glabels
void void
ModelTextObject::drawText( QPainter* painter, ModelTextObject::drawText( QPainter* painter,
const QColor& color, const QColor& color,
merge::Record* record ) const merge::Record* record,
Variables* variables ) const
{ {
painter->save(); painter->save();
@@ -704,7 +708,7 @@ namespace glabels
QFont font; QFont font;
font.setFamily( mFontFamily ); font.setFamily( mFontFamily );
font.setPointSizeF( mTextAutoShrink ? autoShrinkFontSize( record ) : mFontSize ); font.setPointSizeF( mTextAutoShrink ? autoShrinkFontSize( record, variables ) : mFontSize );
font.setWeight( mFontWeight ); font.setWeight( mFontWeight );
font.setItalic( mFontItalicFlag ); font.setItalic( mFontItalicFlag );
font.setUnderline( mFontUnderlineFlag ); font.setUnderline( mFontUnderlineFlag );
@@ -716,7 +720,7 @@ namespace glabels
QFontMetricsF fontMetrics( font ); QFontMetricsF fontMetrics( font );
double dy = fontMetrics.lineSpacing() * mTextLineSpacing; double dy = fontMetrics.lineSpacing() * mTextLineSpacing;
QTextDocument document( mText.expand( record ) ); QTextDocument document( mText.expand( record, variables ) );
QList<QTextLayout*> layouts; QList<QTextLayout*> layouts;
@@ -790,7 +794,7 @@ namespace glabels
/// Determine auto shrink font size /// Determine auto shrink font size
/// ///
double double
ModelTextObject::autoShrinkFontSize( merge::Record* record ) const ModelTextObject::autoShrinkFontSize( merge::Record* record, Variables* variables ) const
{ {
QFont font; QFont font;
font.setFamily( mFontFamily ); font.setFamily( mFontFamily );
@@ -802,7 +806,7 @@ namespace glabels
textOption.setAlignment( mTextHAlign ); textOption.setAlignment( mTextHAlign );
textOption.setWrapMode( mTextWrapMode ); textOption.setWrapMode( mTextWrapMode );
QTextDocument document( mText.expand( record ) ); QTextDocument document( mText.expand( record, variables ) );
double candidateSize = mFontSize; double candidateSize = mFontSize;
while ( candidateSize > 1.0 ) while ( candidateSize > 1.0 )
+22 -6
View File
@@ -50,6 +50,7 @@ namespace glabels
const Distance& y0, const Distance& y0,
const Distance& w, const Distance& w,
const Distance& h, const Distance& h,
bool lockAspectRatio,
const QString& text, const QString& text,
const QString& fontFamily, const QString& fontFamily,
double fontSize, double fontSize,
@@ -185,8 +186,16 @@ namespace glabels
// Drawing operations // Drawing operations
/////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////
protected: protected:
void drawShadow( QPainter* painter, bool inEditor, merge::Record* record ) const override; void drawShadow( QPainter* painter,
void drawObject( QPainter* painter, bool inEditor, merge::Record* record ) const override; 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; QPainterPath hoverPath( double scale ) const override;
@@ -196,10 +205,17 @@ namespace glabels
private: private:
void sizeUpdated() override; void sizeUpdated() override;
void update(); void update();
void drawTextInEditor( QPainter* painter, const QColor& color ) const;
void drawText( QPainter* painter, const QColor&color, merge::Record* record ) const; void drawTextInEditor( QPainter* painter,
QString expandText( QString text, merge::Record* record ) const; const QColor& color ) const;
double autoShrinkFontSize( merge::Record* record ) 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 ) 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), mPrintOutlines(false), mPrintCropMarks(false), mPrintReverse(false),
mIPage(0), mIsMerge(false), mNPages(0), mNLabelsPerPage(0) mIPage(0), mIsMerge(false), mNPages(0), mNLabelsPerPage(0)
{ {
@@ -65,6 +65,7 @@ namespace glabels
connect( mModel, SIGNAL(changed()), this, SLOT(onModelChanged()) ); connect( mModel, SIGNAL(changed()), this, SLOT(onModelChanged()) );
onModelChanged(); onModelChanged();
mVariables = mModel->variables();
} }
@@ -246,83 +247,107 @@ namespace glabels
void PageRenderer::printSimplePage( QPainter* painter, int iPage ) const 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 ); 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 ); clipLabel( painter );
printLabel( painter, nullptr ); 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 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 ); 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(); return;
}
painter->translate( mOrigins[i].x().pt(), mOrigins[i].y().pt() );
painter->save(); mVariables->resetVariables();
clipLabel( painter ); while ( (iCopy < mNCopies) && (iCurrentPage <= iPage) )
printLabel( painter, records[iRecord] ); {
if ( iCurrentPage == iPage )
{
int i = iLabel % mNLabelsPerPage;
painter->save();
painter->restore(); // From before clip painter->translate( mOrigins[i].x().pt(), mOrigins[i].y().pt() );
printOutline( painter );
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(); painter->save();
@@ -424,7 +451,7 @@ namespace glabels
painter->scale( -1, 1 ); painter->scale( -1, 1 );
} }
mModel->draw( painter, false, record ); mModel->draw( painter, false, record, variables );
painter->restore(); painter->restore();
} }
+3 -1
View File
@@ -23,6 +23,7 @@
#include "Point.h" #include "Point.h"
#include "Variables.h"
#include "merge/Merge.h" #include "merge/Merge.h"
#include "merge/Record.h" #include "merge/Record.h"
@@ -100,7 +101,7 @@ namespace glabels
void printCropMarks( QPainter* painter ) const; void printCropMarks( QPainter* painter ) const;
void printOutline( QPainter* painter ) const; void printOutline( QPainter* painter ) const;
void clipLabel( 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: private:
const Model* mModel; const Model* mModel;
const merge::Merge* mMerge; const merge::Merge* mMerge;
Variables* mVariables;
int mNCopies; int mNCopies;
int mStartLabel; int mStartLabel;
+2 -2
View File
@@ -66,7 +66,7 @@ namespace glabels
/// ///
/// Expand all place holders /// Expand all place holders
/// ///
QString RawText::expand( merge::Record* record ) const QString RawText::expand( merge::Record* record, Variables* variables ) const
{ {
QString text; QString text;
@@ -74,7 +74,7 @@ namespace glabels
{ {
if ( token.isField ) if ( token.isField )
{ {
text += token.field.evaluate( record ); text += token.field.evaluate( record, variables );
} }
else else
{ {
+1 -1
View File
@@ -52,7 +52,7 @@ namespace glabels
///////////////////////////////// /////////////////////////////////
QString toString() const; QString toString() const;
std::string toStdString() const; std::string toStdString() const;
QString expand( merge::Record* record ) const; QString expand( merge::Record* record, Variables* variables ) const;
bool hasPlaceHolders() const; bool hasPlaceHolders() const;
bool isEmpty() 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; 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); value = record->value(mFieldName);
} }
else if ( haveVariable )
{
value = (*variables)[mFieldName].value();
}
if ( !mFormatType.isNull() ) if ( !mFormatType.isNull() )
{ {
value = formatValue( value ); value = formatValue( value );
} }
if ( record && record->contains(mFieldName) && !record->value(mFieldName).isEmpty() && mNewLine ) if ( mNewLine && (haveRecordField || haveVariable) )
{ {
value = "\n" + value; value = "\n" + value;
} }
+2 -1
View File
@@ -21,6 +21,7 @@
#ifndef model_SubstitutionField_h #ifndef model_SubstitutionField_h
#define model_SubstitutionField_h #define model_SubstitutionField_h
#include "Variables.h"
#include "merge/Record.h" #include "merge/Record.h"
@@ -39,7 +40,7 @@ namespace glabels
SubstitutionField(); SubstitutionField();
SubstitutionField( const QString& string ); 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 fieldName() const;
QString defaultValue() const; QString defaultValue() const;
+21 -35
View File
@@ -105,48 +105,34 @@ namespace glabels
/// ///
/// Get text, expand if necessary /// 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 ) value = record->value(mData);
{
return QString("${%1}").arg( mData );
}
else
{
if ( record->contains( mData ) )
{
return (*record)[ mData ];
}
else
{
return "";
}
}
} }
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 #define model_TextNode_h
#include "Variables.h"
#include "merge/Record.h" #include "merge/Record.h"
#include <QString> #include <QString>
@@ -76,8 +77,8 @@ namespace glabels
///////////////////////////////// /////////////////////////////////
// Misc. Methods // Misc. Methods
///////////////////////////////// /////////////////////////////////
QString text( merge::Record* record ) const; QString text( const merge::Record* record,
bool isEmptyField( merge::Record* record ) const; 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