diff --git a/CREDITS.md b/CREDITS.md index a26dc4e..3dd3001 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -9,11 +9,14 @@ Acknowledgments gLabels includes contributions from -* [Chris Morgan](https://github.com/chmorgan) -* [hochwasser](https://github.com/hochwasser) * [Mario Blättermann](https://github.com/mariobl) * [probonopd](https://github.com/probonopd) - travis-ci setup, appImage +* [gitlost](https://github.com/gitlost) * [Yuri Chornoivan](https://github.com/yurchor) +* [nblock](https://github.com/nblock) +* [hochwasser](https://github.com/hochwasser) +* [Chris Morgan](https://github.com/chmorgan) +* [Brian K. White](https://github.com/aljex) Translations diff --git a/docs/PRODUCT-TEMPLATES.md b/docs/PRODUCT-TEMPLATES.md index daeed31..9c2a904 100644 --- a/docs/PRODUCT-TEMPLATES.md +++ b/docs/PRODUCT-TEMPLATES.md @@ -20,10 +20,6 @@ Assumptions/caveats A sheet contains only one size of label or card (if a sheet contains more than one size of item, it can be split into multiple templates for multiple pass printing). -Distances can be expressed in units of *pt*, *in*, *mm*, *cm*, or *pc*. For example: -`"1.0in"` or `"2.54cm"`. If no units are specified, computer points (*pt*) will -be assumed (1 *pt* = 1/72 *in* = 0.352778 *mm*). - Template Files -------------- @@ -57,22 +53,37 @@ An example template file containing a single *Template* node: ``` +*Distance* Attributes +--------------------- + +A distance attribute is expressed as a number followed by a unit identifier. +Valid unit identifiers are *pt*, *in*, *mm*, *cm*, or *pc*. These are a subset of +the SVG absolute length units. Examples: + +```xml + + +``` + +If no units are specified, computer points (*pt*) will be assumed (1 *pt* = 1/72 *in* = 0.352778 *mm*). + + *Template* Node --------------- A *Template* node describes a single stationery product. It must contain exactly one instance of a label node, either *Label-rectangle*, *Label-round*, *Label-ellipse* or *Label-cd*. -Property | Description ----------------|------------ -*brand* | Brand or manufacturer of stationery product. E.g. "Avery". -*part* | Part number or name of stationery product. E.g. "8160". -*size* | Paper size. Must match an ID defined in *paper-sizes.xml*, "roll" or "other". E.g. "A4". -*description* | Description of stationery product. E.g, "Mailing Labels". -*_description* | Translatable description of stationery product. Used in predefined labels instead of description. -*width* | Page width. Only valid if `size="other"` or `size="roll"`. -*height* | Page height. Only valid if `size="other"`. Value is ignored if `size="roll"`. -*equiv* | Equivalent part number. If this property is present, the template is a clone of another template of the same brand. The template will inherit all properties, except brand and name from the other template. This equiv property must refer to a previously defined template - *gLabels* does not currently support forward references. +Property | Type | Description +---------------|----------|------------ +*brand* | string | Brand or manufacturer of stationery product. E.g. "Avery". +*part* | string | Part number or name of stationery product. E.g. "8160". +*size* | string | Paper size. Must match an ID defined in *paper-sizes.xml*, "roll" or "other". E.g. "A4". +*description* | string | Description of stationery product. E.g, "Mailing Labels". +*_description* | string | Translatable description of stationery product. Used in predefined labels instead of description. +*width* | distance | Page width. Only valid if `size="other"` or `size="roll"`. +*height* | distance | Page height. Only valid if `size="other"`. Value is ignored if `size="roll"`. +*equiv* | string | Equivalent part number. If this property is present, the template is a clone of another template of the same brand. The template will inherit all properties, except brand and name from the other template. This equiv property must refer to a previously defined template - *gLabels* does not currently support forward references. ### Guidelines for Creating Product Descriptions @@ -90,10 +101,10 @@ If creating templates to be distributed with *gLabels*, please use the following A *Meta* node contains some additional information about the template. A *Template* node may contain zero or more *Meta* nodes. Only one property should be defined per *Meta* node. -Property | Description ---------------|------------ -*category* | A category for the template. A template can belong to multiple categories by simply adding multiple *Meta* nodes to the parent *Template* node. The category must match an existing ID defined in categories.xml. E.g. `category="media"` -*product_url* | A URL pointing to the vendor's webpage for the specific product, if available. +Property | Type | Description +---------------|----------|------------ +*category* | string | A category for the template. A template can belong to multiple categories by simply adding multiple *Meta* nodes to the parent *Template* node. The category must match an existing ID defined in categories.xml. E.g. `category="media"` +*product_url* | string | A URL pointing to the vendor's webpage for the specific product, if available. *Label-rectangle* Node @@ -102,14 +113,14 @@ Property | Description A *Label-rectangle* node describes the dimensions of a single label or business card that is rectangular in shape (may have rounded edges). -Property | Description ---------------|------------ -*id* | Reserved for future use. Should always be 0. -*width* | Width of label or card. E.g. `width="29mm"` -*height* | Height of label or card. E.g. `height="100mm"` -*round* | Radius of corners. For items with square edges (business cards), the radius should be 0. -*x_waste* | Amount of horizontal waste (over-print) to allow. This is useful for minimizing alignment problems when using non-white backgrounds (e.g. images). -*y_waste* | Amount of vertical waste (over-print) to allow. +Property | Type | Description +---------------|----------|------------ +*id* | integer | Reserved for future use. Should always be 0. +*width* | distance | Width of label or card. E.g. `width="29mm"` +*height* | distance | Height of label or card. E.g. `height="100mm"` +*round* | distance | Radius of corners. For items with square edges (business cards), the radius should be 0. +*x_waste* | distance | Amount of horizontal waste (over-print) to allow. This is useful for minimizing alignment problems when using non-white backgrounds (e.g. images). +*y_waste* | distance | Amount of vertical waste (over-print) to allow. ![Label-rectangle properties](images/glabels-template-rect-label.png) @@ -120,12 +131,12 @@ Property | Description A *Label-ellipse* node describes the dimensions of a single label or business card that is elliptical in shape. -Property | Description ---------------|------------ -*id* | Reserved for future use. Should always be 0. -*width* | Width of label or card. E.g. `width="29mm"` -*height* | Height of label or card. E.g. `height="100mm"` -*waste* | Amount of waste (over-print) to allow. This is useful for minimizing alignment problems when using non-white backgrounds (e.g. images). +Property | Type | Description +---------------|----------|------------ +*id* | integer | Reserved for future use. Should always be 0. +*width* | distance | Width of label or card. E.g. `width="29mm"` +*height* | distance | Height of label or card. E.g. `height="100mm"` +*waste* | distance | Amount of waste (over-print) to allow. This is useful for minimizing alignment problems when using non-white backgrounds (e.g. images). ![Label-ellipse properties](images/glabels-template-ellipse-label.png) @@ -135,11 +146,11 @@ Property | Description A *Label-round* node describes the dimensions of a simple round label (not a CD). -Property | Description ---------------|------------ -*id* | Reserved for future use. Should always be 0. -*radius* | Radius (1/2 diameter) of label or card. E.g. `radius="14.5mm"` -*waste* | Amount of waste (over-print) to allow. This is useful for minimizing alignment problems when using non-white backgrounds (e.g. images). +Property | Type | Description +---------------|----------|------------ +*id* | integer | Reserved for future use. Should always be 0. +*radius* | distance | Radius (1/2 diameter) of label or card. E.g. `radius="14.5mm"` +*waste* | distance | Amount of waste (over-print) to allow. This is useful for minimizing alignment problems when using non-white backgrounds (e.g. images). ![Label-round properties](images/glabels-template-round-label.png) @@ -149,14 +160,14 @@ Property | Description A *Label-cd* node describes the dimensions of a CD, DVD, or business card CD. -Property | Description ---------------|------------ -*id* | Reserved for future use. Should always be 0. -*radius* | Outer radius (1/2 diameter) of label. E.g. `radius="58.5mm"` -*hole* | Radius (1/2 diameter) of concentric hole. E.g. `hole="18mm"` -*width* | If present, the label is clipped to the given Width. (For use with business card CDs.) -*height* | If present, the label is clipped to the given height. (For use with business card CDs.) -*waste* | Amount of waste (over-print) to allow. This is useful for minimizing alignment problems when using non-white backgrounds (e.g. images). +Property | Type | Description +---------------|----------|------------ +*id* | integer | Reserved for future use. Should always be 0. +*radius* | distance | Outer radius (1/2 diameter) of label. E.g. `radius="58.5mm"` +*hole* | distance | Radius (1/2 diameter) of concentric hole. E.g. `hole="18mm"` +*width* | distance | If present, the label is clipped to the given Width. (For use with business card CDs.) +*height* | distance | If present, the label is clipped to the given height. (For use with business card CDs.) +*waste* | distance | Amount of waste (over-print) to allow. This is useful for minimizing alignment problems when using non-white backgrounds (e.g. images). ![Label-cd properties](images/glabels-template-cd-label.png) @@ -165,13 +176,13 @@ Property | Description A *Label-continuous* node describes the dimensions of a single section of a continuous label tape. -Property | Description ---------------|------------ -*id* | Reserved for future use. Should always be 0. -*width* | Width of label or card. E.g. `width="29mm"` -*min_height* | Minimum user defined height or length of label. -*max_height* | Maximum user defined height or length of label. -*derault_height* | Default user defined height or length of label. +Property | Type | Description +-----------------|----------|------------ +*id* | integer | Reserved for future use. Should always be 0. +*width* | distance | Width of label or card. E.g. `width="29mm"` +*min_height* | distance | Minimum user defined height or length of label. +*max_height* | distance | Maximum user defined height or length of label. +*default_height* | distance | Default user defined height or length of label. *Label-path* Node @@ -179,13 +190,13 @@ Property | Description A *Label-path* node describes the dimensions of a label with an outline defined by an arbitrary path. -Property | Description ---------------|------------ -*id* | Reserved for future use. Should always be 0. -*d_units* | Units used in path definition. (default = `"pt"`) -*d* | Path definition. This is a subset of of the SVG path "d" attribute. Commands include "M/m", "L/l", "H/h", "V/v", and "Z/z". Commands and data must be delimited by white space." -*x_waste* | Amount of horizontal waste (over-print) to allow. This is useful for minimizing alignment problems when using non-white backgrounds (e.g. images). -*y_waste* | Amount of vertical waste (over-print) to allow. +Property | Type | Description +---------------|----------|------------ +*id* | integer | Reserved for future use. Should always be 0. +*d_units* | string | Units used in path definition. Must be a supported distance unit identifier. (default = `"pt"`) +*d* | string | Path definition. This is a subset of of the SVG path "d" attribute. Commands include "M/m", "L/l", "H/h", "V/v", and "Z/z". Commands and data must be delimited by white space." +*x_waste* | distance | Amount of horizontal waste (over-print) to allow. This is useful for minimizing alignment problems when using non-white backgrounds (e.g. images). +*y_waste* | distance | Amount of vertical waste (over-print) to allow. *Markup* Nodes @@ -201,59 +212,59 @@ special areas, or other helpful hints to the user of a template. A *Markup-margin* describes a margin along all edges of a label. -Property | Description ---------------|------------ -*size* | Size of the margin. I.e. the distance of the margin line from the edge of the card/label. -*x_size* | Size of the margin in x dimension. I.e. the distance of the margin line from the edge of the card/label. -*y_size* | Size of the margin in y dimension. I.e. the distance of the margin line from the edge of the card/label. +Property | Type | Description +---------------|----------|------------ +*size* | distance | Size of the margin. I.e. the distance of the margin line from the edge of the card/label. +*x_size* | distance | Size of the margin in x dimension. I.e. the distance of the margin line from the edge of the card/label. +*y_size* | distance | Size of the margin in y dimension. I.e. the distance of the margin line from the edge of the card/label. ### *Markup-line* Node A *Markup-line* node describes a markup line. -Property | Description ---------------|------------ -*x1* | X coordinate of 1st endpoint of the line segment. -*y1* | Y coordinate of 1st endpoint of the line segment. -*x2* | X coordinate of 2nd endpoint of the line segment. -*y2* | Y coordinate of 2nd endpoint of the line segment. +Property | Type | Description +---------------|----------|------------ +*x1* | distance | X coordinate of 1st endpoint of the line segment. +*y1* | distance | Y coordinate of 1st endpoint of the line segment. +*x2* | distance | X coordinate of 2nd endpoint of the line segment. +*y2* | distance | Y coordinate of 2nd endpoint of the line segment. ### *Markup-circle* Node A *Markup-circle* describes a markup circle. -Property | Description ---------------|------------ -*x0* | X coordinate of circle origin (center). -*y0* | Y coordinate of circle origin (center). -*radius* | Radius of circle. +Property | Type | Description +---------------|----------|------------ +*x0* | distance | X coordinate of circle origin (center). +*y0* | distance | Y coordinate of circle origin (center). +*radius* | distance | Radius of circle. ### *Markup-rect* Node A *Markup-rect* describes a markup rectangle. -Property | Description ---------------|------------ -*x1* | X coordinate of upper left corner of rectangle. -*y1* | Y coordinate of upper left corner of rectangle. -*w* | Width of rectangle. -*h* | Height of rectangle. -*r* | Radius of rounded corners of rectangle. +Property | Type | Description +---------------|----------|------------ +*x1* | distance | X coordinate of upper left corner of rectangle. +*y1* | distance | Y coordinate of upper left corner of rectangle. +*w* | distance | Width of rectangle. +*h* | distance | Height of rectangle. +*r* | distance | Radius of rounded corners of rectangle. ### *Markup-ellipse* Node A *Markup-ellipse* describes a markup ellipse. -Property | Description ---------------|------------ -*x1* | X coordinate of upper left corner of ellipse bounding box. -*y1* | Y coordinate of upper left corner of ellipse bounding box. -*w* | Width of ellipse. -*h* | Height of ellipse. +Property | Type | Description +---------------|----------|------------ +*x1* | distance | X coordinate of upper left corner of ellipse bounding box. +*y1* | distance | Y coordinate of upper left corner of ellipse bounding box. +*w* | distance | Width of ellipse. +*h* | distance | Height of ellipse. *Layout* Node @@ -282,13 +293,13 @@ with unique coordinates for the top left corner of that label. > A single label can always be treated as a grid of one. -Property | Description ---------------|------------ -*nx* | Number of labels/cards in the grid in the X direction (horizontal). -*ny* | Number of labels/cards in the grid in the Y direction (vertical). -*x0* | Distance from left edge of sheet to the left edge of the left column of cards/labels in the layout. -*y0* | Distance from the top edge of sheet to the top edge of the top row of labels/cards in the layout. -*dx* | Horizontal pitch of grid. -*dy* | Vertical pitch of grid. +Property | Type | Description +---------------|----------|------------ +*nx* | integer | Number of labels/cards in the grid in the X direction (horizontal). +*ny* | integer | Number of labels/cards in the grid in the Y direction (vertical). +*x0* | distance | Distance from left edge of sheet to the left edge of the left column of cards/labels in the layout. +*y0* | distance | Distance from the top edge of sheet to the top edge of the top row of labels/cards in the layout. +*dx* | distance | Horizontal pitch of grid. +*dy* | distance | Vertical pitch of grid. ![Layout example](images/glabels-template-layout.png) diff --git a/docs/README.md b/docs/README.md index 7d0aa0d..988d667 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,4 +1,5 @@ Developer Documentation Directory ================================= -This directory contains developer documentation. For user documentation, see [user-docs/](../user-docs). +This directory contains developer and installation documentation primarily for developers, packagers and other contributors. +For user documentation, see [user-docs/](../user-docs/_build). diff --git a/docs/TODO.md b/docs/TODO.md index 4c72383..175aa41 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -1,80 +1,74 @@ To Do List for gLabels 4.0 -- 2019-10-07 ======================================== -Expose user variables to glabels-batch --------------------------------------- -There should be a way to set initial values of user variables from the glabels-batch -command line. Possibly even create them on the fly. +- [x] Expose user variables to glabels-batch -Add programmable margin to text objects ---------------------------------------- -The current built-in fixed margin seems to confuse people when dealing with -different horizontal and vertical alignments. + There should be a way to set initial values of user variables from the glabels-batch + command line. Possibly even create them on the fly. -Improve print copies UI ------------------------ -As with previous versions of glabels, there should be a way of selecting -the number of sheets to print. Merge printing should be able to be collated -or not, and if printing multiple copies, start on the same first label. +- [x] Improve print copies UI -Printer calibration tool ------------------------- -There desperately needs to be a printer calibration tool. At a minimum -the tool should allow adjusting horizontal and vertical offsets. The -adjustments should be unique to each printer. + As with previous versions of glabels, there should be a way of selecting + the number of sheets to print. Merge printing should be able to be collated + or not, and if printing multiple copies, start on the same first label. -I am thinking of a test page with a cross in the center. It would have a -grid around this cross, indicating how much to adjust x & y. The user -would fold the paper in quaters and use this grid to guestimate the offsets. +- [ ] Write help documentation -There should be warnings about how printers may drift from calibration or -even not have repeatable results. +- [x] Add "User Variables" feature -* A more sophisticated tool, could adjust for scaling and skew, but it would -be very difficult to interact with the user on these. + Add page to MainWindow to + + - Define variables, + - Set their initial values + - Control how they might increment (per item instance, per item copy, per page) + + Save as part of glabels project file -Write help documentation ------------------------- +- [x] Add support for arbitrary label shapes + + I.e. similar to an SVG path. -Completed List for gLabels 4.0 -- 2018-04-15 -============================================ +- [x] Add support for "Continuous Roll" labels -Add "User Variables" feature ----------------------------- + If product template is for a continuous roll, define a mininum and default length. + This determines h and dy -* Add page to MainWindow to - - Define variables - - Set their initial values - - Control how they might increment (per item instance, per item copy, per page) - -* Save as part of glabels project file - - -Add support for arbitrary label shapes --------------------------------------- - -* I.e. similar to an SVG path. - - -Add support for "Continuous Roll" labels ----------------------------------------- - -* If product template is for a continuous roll, define a mininum and default length - - This determines h and dy - -* Add option to Properties page to adjust this value + Add option to Properties page to adjust this value -To Do List for gLabels 4.1 -- 2019-03-17 -======================================== +To Do List for post gLabels 4.0 -- 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. + +- [ ] Printer calibration tool + + There desperately needs to be a printer calibration tool. At a minimum + the tool should allow adjusting horizontal and vertical offsets. The + adjustments should be unique to each printer. + + I am thinking of a test page with a cross in the center. It would have a + grid around this cross, indicating how much to adjust x & y. The user + would fold the paper in quaters and use this grid to guestimate the offsets. + + There should be warnings about how printers may drift from calibration or + even not have repeatable results. + + A more sophisticated tool, could adjust for scaling and skew, but it would + be very difficult to interact with the user on these. + +- [ ] Add programmable margin to text objects + + The current built-in fixed margin seems to confuse people when dealing with + different horizontal and vertical alignments. + -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. diff --git a/glabels-batch/main.cpp b/glabels-batch/main.cpp index b69afda..332ac62 100644 --- a/glabels-batch/main.cpp +++ b/glabels-batch/main.cpp @@ -31,12 +31,12 @@ #include #include +#include #include #include #include #include #include -#include namespace @@ -110,8 +110,14 @@ int main( int argc, char **argv ) QCoreApplication::translate( "main", "Set number of copies to . (Default=1)" ), "n", "1" }, + {{"a","collate"}, + QCoreApplication::translate( "main", "Collate merge copies." ) }, + + {{"g","group"}, + QCoreApplication::translate( "main", "Start each merge group on a new page." ) }, + {{"f","first"}, - QCoreApplication::translate( "main", "Set starting label on 1st page to . (Default=1)" ), + QCoreApplication::translate( "main", "Set starting position to . (Default=1)" ), "n", "1" }, {{"l","outlines"}, @@ -197,11 +203,58 @@ int main( int argc, char **argv ) } glabels::model::PageRenderer renderer( model ); - renderer.setNCopies( parser.value( "copies" ).toInt() ); - renderer.setStartLabel( parser.value( "first" ).toInt() - 1 ); + if ( model->merge()->keys().empty() ) + { + // Simple project (no merge) + if ( parser.isSet( "sheets" ) ) + { + // Full sheets of simple items + renderer.setNCopies( parser.value( "sheets" ).toInt() * model->frame()->nLabels() ); + renderer.setStartItem( 0 ); + } + else if ( parser.isSet( "copies" ) ) + { + // Partial sheet(s) of simple items + renderer.setNCopies( parser.value( "copies" ).toInt() ); + renderer.setStartItem( parser.value( "first" ).toInt() - 1 ); + } + else + { + // One full sheet of simple items + renderer.setNCopies( model->frame()->nLabels() ); + renderer.setStartItem( 0 ); + } + } + else + { + // Project with merge + renderer.setNCopies( parser.value( "copies" ).toInt() ); + renderer.setStartItem( parser.value( "first" ).toInt() - 1 ); + renderer.setIsCollated( parser.isSet( "collate" ) ); + renderer.setAreGroupsContiguous( !parser.isSet( "group" ) ); + } renderer.setPrintOutlines( parser.isSet( "outlines" ) ); renderer.setPrintCropMarks( parser.isSet( "crop-marks" ) ); renderer.setPrintReverse( parser.isSet( "reverse" ) ); + + // Item and page count summary + if ( renderer.nPages() == 1 ) + { + if ( renderer.nItems() == 1 ) + { + qDebug() << "Printing 1 item on 1 page."; + } + else + { + qDebug() << "Printing" << renderer.nItems() << "items on 1 page."; + } + } + else + { + qDebug() << "Printing" << renderer.nItems() << "items on" << renderer.nPages() << "pages."; + } + + // Do it! renderer.print( &printer ); } } diff --git a/glabels/PrintView.cpp b/glabels/PrintView.cpp index a6f3f7d..a2a3e43 100644 --- a/glabels/PrintView.cpp +++ b/glabels/PrintView.cpp @@ -70,10 +70,7 @@ namespace glabels connect( mModel, SIGNAL(changed()), this, SLOT(onModelChanged()) ); - copiesSpin->setRange( 1, 100*mModel->frame()->nLabels() ); - copiesStartSpin->setRange( 1, mModel->frame()->nLabels() ); - - onFormChanged(); + onModelChanged(); } @@ -82,10 +79,15 @@ namespace glabels /// void PrintView::onModelChanged() { - copiesSpin->setRange( 1, 100*mModel->frame()->nLabels() ); - copiesStartSpin->setRange( 1, mModel->frame()->nLabels() ); + printRangeStartPositionSpin->setRange( 1, mModel->frame()->nLabels() ); + printRangeLastPositionSpin->setRange( 1, mModel->frame()->nLabels() ); + mergeStartPositionSpin->setRange( 1, mModel->frame()->nLabels() ); - updateView(); + printRangeBox->setVisible( mModel->merge()->keys().empty() ); + mergeBox->setVisible( !mModel->merge()->keys().empty() ); + mergeOnlyOptions->setVisible( !mModel->merge()->keys().empty() ); + + onFormChanged(); } @@ -98,22 +100,24 @@ namespace glabels { if ( mRenderer.nItems() == 1 ) { - copiesDescriptionLabel->setText( tr("(Will print a total of 1 item on 1 page.)") ); + printDescriptionLabel->setText( tr("(Will print a total of 1 item on 1 page.)") ); } else { - copiesDescriptionLabel->setText( tr("(Will print a total of %1 items on 1 page.)") - .arg(mRenderer.nItems()) ); + printDescriptionLabel->setText( tr("(Will print a total of %1 items on 1 page.)") + .arg(mRenderer.nItems()) ); } } else { - copiesDescriptionLabel->setText( tr("(Will print a total of %1 items on %2 pages.)") - .arg(mRenderer.nItems()).arg(mRenderer.nPages()) ); + printDescriptionLabel->setText( tr("(Will print a total of %1 items on %2 pages.)") + .arg(mRenderer.nItems()).arg(mRenderer.nPages()) ); } pageSpin->setRange( 1, mRenderer.nPages() ); nPagesLabel->setText( QString::number( mRenderer.nPages() ) ); + + mRenderer.setIPage( pageSpin->value() - 1 ); // Update preview } @@ -126,15 +130,64 @@ namespace glabels { mBlocked = true; - mRenderer.setNCopies( copiesSpin->value() ); - mRenderer.setStartLabel( copiesStartSpin->value() - 1 ); + if ( mModel->merge()->keys().empty() ) + { + // Simple project (no merge) + if ( printRangePagesRadio->isChecked() ) + { + // Print full sheets of labels + int nItemsPerPage = mModel->frame()->nLabels(); + + printRangePagesSpin->setEnabled( true ); + + printRangeStartPositionSpin->setEnabled( false ); + printRangeLastPositionSpin->setEnabled( false ); + + printRangeStartPositionSpin->setMaximum( nItemsPerPage ); + printRangeLastPositionSpin->setMinimum( 1 ); + + printRangeStartPositionSpin->setValue( 1 ); + printRangeLastPositionSpin->setValue( nItemsPerPage ); + + mRenderer.setNCopies( printRangePagesSpin->value()*nItemsPerPage ); + mRenderer.setStartItem( 0 ); + } + else + { + // Print a partial sheet of labels + int iStart = printRangeStartPositionSpin->value(); + int iLast = printRangeLastPositionSpin->value(); + + printRangePagesSpin->setEnabled( false ); + + printRangeStartPositionSpin->setEnabled( true ); + printRangeLastPositionSpin->setEnabled( true ); + + printRangeStartPositionSpin->setMaximum( iLast ); + printRangeLastPositionSpin->setMinimum( iStart ); + + mRenderer.setNCopies( iLast - iStart + 1 ); + mRenderer.setStartItem( iStart - 1 ); + } + } + else + { + // Project with merge + bool isMultipleCopies = mergeCopiesSpin->value() > 1; + + mergeCollateCombo->setEnabled ( isMultipleCopies ); + mergeGroupCombo->setEnabled ( isMultipleCopies ); + + mRenderer.setNCopies( mergeCopiesSpin->value() ); + mRenderer.setIsCollated( mergeCollateCombo->currentIndex() == 1 ); + mRenderer.setAreGroupsContiguous( mergeGroupCombo->currentIndex() == 0 ); + mRenderer.setStartItem( mergeStartPositionSpin->value() - 1 ); + } mRenderer.setPrintOutlines( printOutlinesCheck->isChecked() ); mRenderer.setPrintCropMarks( printCropMarksCheck->isChecked() ); mRenderer.setPrintReverse( printReverseCheck->isChecked() ); - mRenderer.setIPage( pageSpin->value() - 1 ); - updateView(); mBlocked = false; diff --git a/glabels/TemplateDesigner.cpp b/glabels/TemplateDesigner.cpp index c025d08..b4529aa 100644 --- a/glabels/TemplateDesigner.cpp +++ b/glabels/TemplateDesigner.cpp @@ -473,7 +473,7 @@ namespace glabels model::PageRenderer renderer( sheet ); renderer.setNCopies( sheet->frame()->nLabels() ); - renderer.setStartLabel( 0 ); + renderer.setStartItem( 0 ); renderer.setPrintOutlines( true ); QPrinter printer( QPrinter::HighResolution ); diff --git a/glabels/icons.qrc b/glabels/icons.qrc index 12e2c7b..7baf897 100644 --- a/glabels/icons.qrc +++ b/glabels/icons.qrc @@ -95,13 +95,17 @@ icons/flat/24x24/glabels-valign-text-middle.svg icons/flat/24x24/glabels-valign-text-top.svg + icons/flat/32x32/glabels-collated.svg icons/flat/32x32/glabels-file-new.svg icons/flat/32x32/glabels-file-open.svg icons/flat/32x32/glabels-file-recent.svg icons/flat/32x32/glabels-label-orientation-horiz.svg icons/flat/32x32/glabels-label-orientation-vert.svg + icons/flat/32x32/glabels-merge-group-contiguous.svg + icons/flat/32x32/glabels-merge-group-page.svg icons/flat/32x32/glabels-print.svg icons/flat/32x32/glabels-select-product.svg + icons/flat/32x32/glabels-uncollated.svg icons/apps/32x32/glabels.svg icons/flat/48x48/glabels-edit.svg diff --git a/glabels/icons/flat/32x32/glabels-collated.svg b/glabels/icons/flat/32x32/glabels-collated.svg new file mode 100644 index 0000000..c943fcf --- /dev/null +++ b/glabels/icons/flat/32x32/glabels-collated.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + diff --git a/glabels/icons/flat/32x32/glabels-merge-group-contiguous.svg b/glabels/icons/flat/32x32/glabels-merge-group-contiguous.svg new file mode 100644 index 0000000..a69d689 --- /dev/null +++ b/glabels/icons/flat/32x32/glabels-merge-group-contiguous.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/glabels/icons/flat/32x32/glabels-merge-group-page.svg b/glabels/icons/flat/32x32/glabels-merge-group-page.svg new file mode 100644 index 0000000..7abe79d --- /dev/null +++ b/glabels/icons/flat/32x32/glabels-merge-group-page.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + diff --git a/glabels/icons/flat/32x32/glabels-uncollated.svg b/glabels/icons/flat/32x32/glabels-uncollated.svg new file mode 100644 index 0000000..255e165 --- /dev/null +++ b/glabels/icons/flat/32x32/glabels-uncollated.svg @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/glabels/ui/PrintView.ui b/glabels/ui/PrintView.ui index 348bada..f061177 100644 --- a/glabels/ui/PrintView.ui +++ b/glabels/ui/PrintView.ui @@ -7,7 +7,7 @@ 0 0 852 - 792 + 796 @@ -22,6 +22,9 @@ + + 9 + QLayout::SetDefaultConstraint @@ -51,7 +54,7 @@ - + 0 @@ -71,26 +74,29 @@ - Copies + Print range + + 9 + - - - - 0 - 0 - - + - Copies: + Pages + + true + + + buttonGroup + - + QAbstractSpinBox::UpDownArrows @@ -101,7 +107,7 @@ 1 - 9999 + 250 @@ -121,48 +127,67 @@ - + - - - - 0 - 0 - - + - Start on position: + Positions + + buttonGroup + - + - + 0 0 + + + 60 + 0 + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + 1 - - - - 0 - 0 - - + - on 1st page + to - + + + + 0 + 0 + + + + + 60 + 0 + + + + 1 + + + + + Qt::Horizontal @@ -176,29 +201,114 @@ - - + + + + + + + Merge control + + + + + + 9 + - - - - 0 - 0 - - - - - 330 - 0 - - + - (Will print a total of xxxx items on nnn pages.) + Copies: + + + + 1 + + + 9999 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + text-align:left; padding:3px; + + + + 32 + 32 + + + + + Uncollated (e.g. 1,1,1 2,2,2 3,3,3) + + + + :/icons/flat/32x32/glabels-uncollated.svg:/icons/flat/32x32/glabels-uncollated.svg + + + + + Collated (e.g. 1,2,3 1,2,3 1,2,3) + + + + :/icons/flat/32x32/glabels-collated.svg:/icons/flat/32x32/glabels-collated.svg + + + + + + + + text-align:left; padding:3px; + + + + 32 + 32 + + + + + Merge groups are contiguous + + + + :/icons/flat/32x32/glabels-merge-group-contiguous.svg:/icons/flat/32x32/glabels-merge-group-contiguous.svg + + + + + Merge groups start on a new page + + + + :/icons/flat/32x32/glabels-merge-group-page.svg:/icons/flat/32x32/glabels-merge-group-page.svg + + + + @@ -223,10 +333,10 @@ - Print options + Options - + @@ -249,11 +359,84 @@ + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Start groups at position: + + + + + + + + 0 + 0 + + + + 1 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 12 + + + + @@ -266,7 +449,7 @@ text-align:left; padding:3px; - Print + Print... @@ -278,8 +461,63 @@ 32 + + true + + + + + + + Qt::Horizontal + + + + 2 + 20 + + + + + + + + + 0 + 0 + + + + + 330 + 0 + + + + <html><head/><body><p>(Will print a total of xxxx items on nnn pages.)</p></body></html> + + + Qt::AlignCenter + + + + + + + Qt::Horizontal + + + + 2 + 20 + + + + + + @@ -401,30 +639,14 @@ - copiesStartSpin + printRangePagesSpin valueChanged(int) PrintView onFormChanged() - 221 - 124 - - - 4 - 309 - - - - - copiesSpin - valueChanged(int) - PrintView - onFormChanged() - - - 161 - 84 + 175 + 122 2 @@ -439,8 +661,8 @@ onFormChanged() - 114 - 220 + 182 + 444 2 @@ -455,8 +677,8 @@ onFormChanged() - 84 - 248 + 152 + 475 6 @@ -471,8 +693,8 @@ onFormChanged() - 88 - 276 + 156 + 506 6 @@ -487,8 +709,8 @@ onFormChanged() - 645 - 745 + 641 + 760 1 @@ -503,8 +725,8 @@ onPrintButtonClicked() - 249 - 325 + 291 + 589 5 @@ -512,10 +734,125 @@ + + mergeCopiesSpin + valueChanged(int) + PrintView + onFormChanged() + + + 159 + 243 + + + 7 + 218 + + + + + printRangePagesRadio + toggled(bool) + PrintView + onFormChanged() + + + 59 + 108 + + + 6 + 76 + + + + + printRangeStartPositionSpin + valueChanged(int) + PrintView + onFormChanged() + + + 142 + 149 + + + 5 + 123 + + + + + printRangeLastPositionSpin + valueChanged(int) + PrintView + onFormChanged() + + + 226 + 145 + + + 8 + 155 + + + + + mergeCollateCombo + currentIndexChanged(int) + PrintView + onFormChanged() + + + 52 + 261 + + + 3 + 192 + + + + + mergeGroupCombo + currentIndexChanged(int) + PrintView + onFormChanged() + + + 231 + 314 + + + 5 + 378 + + + + + mergeStartPositionSpin + valueChanged(int) + PrintView + onFormChanged() + + + 199 + 362 + + + 4 + 309 + + + onPrintButtonClicked() onFormChanged() onPrinterPropertiesButtonClicked() + + + diff --git a/model/PageRenderer.cpp b/model/PageRenderer.cpp index 78a3383..f4a992d 100644 --- a/model/PageRenderer.cpp +++ b/model/PageRenderer.cpp @@ -47,9 +47,9 @@ namespace glabels PageRenderer::PageRenderer( const Model* model ) - : mModel(nullptr), mMerge(nullptr), mVariables(nullptr), mNCopies(0), mStartLabel(0), mLastLabel(0), + : mModel(nullptr), mMerge(nullptr), mVariables(nullptr), mNCopies(0), mStartItem(0), mLastItem(0), mPrintOutlines(false), mPrintCropMarks(false), mPrintReverse(false), - mIPage(0), mIsMerge(false), mNPages(0), mNLabelsPerPage(0) + mIPage(0), mIsMerge(false), mNPages(0), mNItemsPerPage(0) { if ( model ) { @@ -79,7 +79,7 @@ namespace glabels { mMerge = mModel->merge(); mOrigins = mModel->frame()->getOrigins(); - mNLabelsPerPage = mModel->frame()->nLabels(); + mNItemsPerPage = mModel->frame()->nLabels(); mIsMerge = ( dynamic_cast(mMerge) == nullptr ); updateNPages(); @@ -96,15 +96,33 @@ namespace glabels } - void PageRenderer::setStartLabel( int startLabel ) + void PageRenderer::setStartItem( int startItem ) { - mStartLabel = startLabel; + mStartItem = startItem; updateNPages(); emit changed(); } + void PageRenderer::setIsCollated( bool isCollated ) + { + mIsCollated = isCollated; + updateNPages(); + + emit changed(); + } + + + void PageRenderer::setAreGroupsContiguous( bool areGroupsContiguous ) + { + mAreGroupsContiguous = areGroupsContiguous; + updateNPages(); + + emit changed(); + } + + void PageRenderer::setPrintOutlines( bool printOutlinesFlag ) { mPrintOutlines = printOutlinesFlag; @@ -139,7 +157,7 @@ namespace glabels int PageRenderer::nItems() const { - return mLastLabel - mStartLabel; + return mNItems; } @@ -166,25 +184,49 @@ namespace glabels { if ( mModel ) { - if ( mIsMerge ) + if ( !mIsMerge ) { - mLastLabel = mStartLabel + mNCopies*mMerge->nSelectedRecords(); + // Simple project + mLastItem = mStartItem + mNCopies - 1; + mNItems = mNCopies; + mNGroups = 1; + mNItemsPerGroup = mNItems; } else { - mLastLabel = mStartLabel + mNCopies; - } - - mNPages = mLastLabel / mNLabelsPerPage; - if ( mLastLabel % mNLabelsPerPage ) - { - mNPages++; + // Merge project + if ( mIsCollated ) + { + // Collated Merge project + mNItemsPerGroup = mMerge->nSelectedRecords(); + mNGroups = mNCopies; + } + else + { + // Un-Collated Merge project + mNItemsPerGroup = mNCopies; + mNGroups = mMerge->nSelectedRecords(); + } + if ( mAreGroupsContiguous ) + { + // Merge groups are contiguous + mLastItem = mStartItem + mNGroups*mNItemsPerGroup - 1; + } + else + { + // Merge groups start on new page + mNPagesPerGroup = (mStartItem + mNItemsPerGroup - 1)/mNItemsPerPage + 1; + mLastItem = (mNGroups-1)*mNPagesPerGroup*mNItemsPerPage + mStartItem + mNItemsPerGroup - 1; + } + mNItems = mNGroups*mNItemsPerGroup; } } else { mNPages = 0; } + + mNPages = mLastItem/mNItemsPerPage + 1; } @@ -233,13 +275,20 @@ namespace glabels { if ( mModel ) { - if ( mIsMerge ) + if ( !mIsMerge ) { - printMergePage( painter, iPage ); + printSimplePage( painter, iPage ); } else { - printSimplePage( painter, iPage ); + if ( mIsCollated ) + { + printCollatedMergePage( painter, iPage ); + } + else + { + printUnCollatedMergePage( painter, iPage ); + } } } } @@ -250,7 +299,7 @@ namespace glabels printCropMarks( painter ); int iCopy = 0; - int iLabel = mStartLabel; + int iItem = mStartItem; int iCurrentPage = 0; mVariables->resetVariables(); @@ -258,7 +307,7 @@ namespace glabels { if ( iCurrentPage == iPage ) { - int i = iLabel % mNLabelsPerPage; + int i = iItem % mNItemsPerPage; painter->save(); @@ -276,13 +325,15 @@ namespace glabels painter->restore(); // From before translation } + // Next copy iCopy++; - iLabel++; - iCurrentPage = iLabel / mNLabelsPerPage; + iItem++; + iCurrentPage = iItem / mNItemsPerPage; + // User variable book keeping mVariables->incrementVariablesOnItem(); mVariables->incrementVariablesOnCopy(); - if ( (iLabel % mNLabelsPerPage) == 0 /* starting a new page */ ) + if ( (iItem % mNItemsPerPage) == 0 /* starting a new page */ ) { mVariables->incrementVariablesOnPage(); } @@ -290,12 +341,12 @@ namespace glabels } - void PageRenderer::printMergePage( QPainter* painter, int iPage ) const + void PageRenderer::printCollatedMergePage( QPainter* painter, int iPage ) const { printCropMarks( painter ); int iCopy = 0; - int iLabel = mStartLabel; + int iItem = mStartItem; int iCurrentPage = 0; const QList records = mMerge->selectedRecords(); @@ -313,7 +364,7 @@ namespace glabels { if ( iCurrentPage == iPage ) { - int i = iLabel % mNLabelsPerPage; + int i = iItem % mNItemsPerPage; painter->save(); @@ -331,20 +382,109 @@ namespace glabels painter->restore(); // From before translation } + // Next record iRecord = (iRecord + 1) % nRecords; if ( iRecord == 0 ) { iCopy++; + if ( mAreGroupsContiguous ) + { + iItem++; + } + else + { + iItem = iCopy*mNPagesPerGroup*mNItemsPerPage + mStartItem; + } } - iLabel++; - iCurrentPage = iLabel / mNLabelsPerPage; + else + { + iItem++; + } + iCurrentPage = iItem / mNItemsPerPage; + // User variable book keeping mVariables->incrementVariablesOnItem(); if ( iRecord == 0 ) { mVariables->incrementVariablesOnCopy(); } - if ( (iLabel % mNLabelsPerPage) == 0 /* starting a new page */ ) + if ( (iItem % mNItemsPerPage) == 0 /* starting a new page */ ) + { + mVariables->incrementVariablesOnPage(); + } + } + } + + + void PageRenderer::printUnCollatedMergePage( QPainter* painter, int iPage ) const + { + printCropMarks( painter ); + + int iCopy = 0; + int iItem = mStartItem; + int iCurrentPage = 0; + + const QList records = mMerge->selectedRecords(); + int iRecord = 0; + int nRecords = records.size(); + + if ( nRecords == 0 ) + { + return; + } + + mVariables->resetVariables(); + + while ( (iRecord < nRecords) && (iCurrentPage <= iPage) ) + { + if ( iCurrentPage == iPage ) + { + int i = iItem % mNItemsPerPage; + + painter->save(); + + painter->translate( mOrigins[i].x().pt(), mOrigins[i].y().pt() ); + + painter->save(); + + clipLabel( painter ); + printLabel( painter, records[iRecord], mVariables ); + + painter->restore(); // From before clip + + printOutline( painter ); + + painter->restore(); // From before translation + } + + // Next copy + iCopy = (iCopy + 1) % mNCopies; + if ( iCopy == 0 ) + { + iRecord++; + if ( mAreGroupsContiguous ) + { + iItem++; + } + else + { + iItem = iRecord*mNPagesPerGroup*mNItemsPerPage + mStartItem; + } + } + else + { + iItem++; + } + iCurrentPage = iItem / mNItemsPerPage; + + // User variable book keeping + mVariables->incrementVariablesOnItem(); + mVariables->incrementVariablesOnCopy(); + if ( iCopy == 0 ) + { + mVariables->resetOnCopyVariables(); + } + if ( (iItem % mNItemsPerPage) == 0 /* starting a new page */ ) { mVariables->incrementVariablesOnPage(); } diff --git a/model/PageRenderer.h b/model/PageRenderer.h index 08c93a9..25133de 100644 --- a/model/PageRenderer.h +++ b/model/PageRenderer.h @@ -64,7 +64,9 @@ namespace glabels void setModel( const Model* model ); const Model* model() const; void setNCopies( int nCopies ); - void setStartLabel( int startLabel ); + void setStartItem( int startItem ); + void setIsCollated( bool isCollated ); + void setAreGroupsContiguous( bool areGroupscontiguous ); void setPrintOutlines( bool printOutlinesFlag ); void setPrintCropMarks( bool printCropMarksFlag ); void setPrintReverse( bool printReverseFlag ); @@ -97,7 +99,8 @@ namespace glabels private: void updateNPages(); void printSimplePage( QPainter* painter, int iPage ) const; - void printMergePage( QPainter* painter, int iPage ) const; + void printCollatedMergePage( QPainter* painter, int iPage ) const; + void printUnCollatedMergePage( QPainter* painter, int iPage ) const; void printCropMarks( QPainter* painter ) const; void printOutline( QPainter* painter ) const; void clipLabel( QPainter* painter ) const; @@ -113,16 +116,24 @@ namespace glabels Variables* mVariables; int mNCopies; - int mStartLabel; - int mLastLabel; - bool mPrintOutlines; - bool mPrintCropMarks; - bool mPrintReverse; + int mStartItem; + int mLastItem; + int mNGroups; + int mNItemsPerGroup; + int mNPagesPerGroup; int mIPage; bool mIsMerge; + + int mNItems; int mNPages; - int mNLabelsPerPage; + int mNItemsPerPage; + + bool mIsCollated; + bool mAreGroupsContiguous; + bool mPrintOutlines; + bool mPrintCropMarks; + bool mPrintReverse; QVector mOrigins; }; diff --git a/model/Variables.cpp b/model/Variables.cpp index 4d16822..4f80e45 100644 --- a/model/Variables.cpp +++ b/model/Variables.cpp @@ -118,6 +118,21 @@ namespace glabels } + /// + /// Reset "on copy" variables to their initial values + /// + void Variables::resetOnCopyVariables() + { + for ( auto& v : *this ) + { + if ( v.increment() == Variable::Increment::PER_COPY ) + { + v.resetValue(); + } + } + } + + /// /// Increment variables on item /// diff --git a/model/Variables.h b/model/Variables.h index b636f18..3808785 100644 --- a/model/Variables.h +++ b/model/Variables.h @@ -66,6 +66,7 @@ namespace glabels void setVariables( const QMap& definitions ); void resetVariables(); + void resetOnCopyVariables(); void incrementVariablesOnItem(); void incrementVariablesOnCopy(); void incrementVariablesOnPage(); diff --git a/translations/glabels_C.ts b/translations/glabels_C.ts index 4380651..a0e3af4 100644 --- a/translations/glabels_C.ts +++ b/translations/glabels_C.ts @@ -531,26 +531,10 @@ PrintView - - Copies - - Copies: - - Start on position: - - - - on 1st page - - - - Print options - - print outlines @@ -563,10 +547,6 @@ print in reverse (i.e. a mirror image) - - Print - - Page @@ -579,6 +559,54 @@ nn + + Pages + + + + Options + + + + Print range + + + + Positions + + + + to + + + + Merge control + + + + Uncollated (e.g. 1,1,1 2,2,2 3,3,3) + + + + Collated (e.g. 1,2,3 1,2,3 1,2,3) + + + + Merge groups are contiguous + + + + Merge groups start on a new page + + + + Print... + + + + Start groups at position: + + PropertiesView diff --git a/user-docs/_build/man/glabels-batch-qt.1 b/user-docs/_build/man/glabels-batch-qt.1 index 0cc1c18..99ddfc2 100644 --- a/user-docs/_build/man/glabels-batch-qt.1 +++ b/user-docs/_build/man/glabels-batch-qt.1 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "GLABELS-BATCH-QT" "1" "Nov 27, 2019" "" "gLabels" +.TH "GLABELS-BATCH-QT" "1" "Jan 01, 2020" "" "gLabels" .SH NAME glabels-batch-qt \- batch creation of labels and business cards . @@ -35,9 +35,8 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] \fBglabels\-batch\-qt\fP [\fIoptions\fP] [\fIfilename\fP] .SH DESCRIPTION .sp -\fBglabels\-batch\-qt\fP is a utility for printing files previously -prepared with \fBglabels\-qt\fP from the command line. It is suitable -for use with scripts. +\fBglabels\-batch\-qt\fP is a utility for printing a glabels project file +from the command line. It is suitable for use with scripts. .SH OPTIONS .INDENT 0.0 .TP @@ -57,13 +56,15 @@ Send output to . .INDENT 0.0 .TP .B \-o [], \-\-output [] -Set output filename to . Set to "\-" for stdout. -(Default="output.pdf") +.TP +.B Set output filename to . If filename is "\-", write to standard output. +.TP +.B (Default="output.pdf") .UNINDENT .INDENT 0.0 .TP .B \-s , \-\-sheets -Set number of sheets to . (Default=1) +For simple projects, sets number of full sheets to . (Default=1) .UNINDENT .INDENT 0.0 .TP @@ -72,8 +73,18 @@ Set number of copies to . (Default=1) .UNINDENT .INDENT 0.0 .TP +.B \-a, \-\-collate +Collate merge copies. +.UNINDENT +.INDENT 0.0 +.TP +.B \-g, \-\-group +Start each merge group on a new page. +.UNINDENT +.INDENT 0.0 +.TP .B \-f , \-\-first -Set starting label on 1st page to . (Default=1) +Set starting position to . (Default=1) .UNINDENT .INDENT 0.0 .TP @@ -113,7 +124,20 @@ templates here!\fP .B ${HOME}/.glabels/ Directory for manually created product templates. .UNINDENT -.SH BUGS +.SH KNOWN ISSUES +.sp +On GNU/Linux platforms, \fBglabels\-batch\-qt\fP must be run from within a windowing environment, such as X or Wayland. This is because Qt requires a suitable platform to obtain system font information. A work\-around is to run \fBglabels\-batch\-qt\fP using a virtual X server environment: +.INDENT 0.0 +.INDENT 3.5 +.sp +.nf +.ft C +xvfb\-run glabels\-batch\-qt \-o output.pdf myProject.glabels +.ft P +.fi +.UNINDENT +.UNINDENT +.SH REPORTING BUGS .sp On GNU/Linux platforms, \fBglabels\-batch\-qt\fP must be run from within a windowing environment, such as X or Wayland. This is because Qt requires a suitable platform to obtain system font information. A work\-around is to run \fBglabels\-batch\-qt\fP using a virtual X server environment: .INDENT 0.0 @@ -134,9 +158,7 @@ Bugs and feature requests can be reported via the gLabels issue tracking system \fBglabels\-qt(1)\fP .sp The gLabels homepage at <\fI\%http://glabels.org/\fP>. -.SH AUTHOR -Jim Evins .SH COPYRIGHT -2018, Jim Evins +2020, Jim Evins .\" Generated by docutils manpage writer. . diff --git a/user-docs/_build/man/glabels-qt.1 b/user-docs/_build/man/glabels-qt.1 index da9c43a..16e6057 100644 --- a/user-docs/_build/man/glabels-qt.1 +++ b/user-docs/_build/man/glabels-qt.1 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "GLABELS-QT" "1" "Nov 27, 2019" "" "gLabels" +.TH "GLABELS-QT" "1" "Jan 01, 2020" "" "gLabels" .SH NAME glabels-qt \- create labels and business cards . @@ -75,9 +75,7 @@ Bugs and feature requests can be reported via the gLabels issue tracking system \fBglabels\-batch\-qt(1)\fP .sp The gLabels homepage at <\fI\%http://glabels.org/\fP>. -.SH AUTHOR -Jim Evins .SH COPYRIGHT -2018, Jim Evins +2020, Jim Evins .\" Generated by docutils manpage writer. . diff --git a/user-docs/conf.py b/user-docs/conf.py index 8b957c5..00cd3b8 100644 --- a/user-docs/conf.py +++ b/user-docs/conf.py @@ -47,7 +47,7 @@ master_doc = 'index' # General information about the project. project = 'gLabels' -copyright = '2018, Jim Evins ' +copyright = '2020, Jim Evins ' author = 'Jim Evins' # The version info for the project you're documenting, acts as replacement for @@ -149,8 +149,8 @@ latex_documents = [ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - ('man/glabels-qt', 'glabels-qt', 'create labels and business cards', [author], 1), - ('man/glabels-batch-qt', 'glabels-batch-qt', 'batch creation of labels and business cards', [author], 1) + ('man/glabels-qt', 'glabels-qt', 'create labels and business cards', [], 1), + ('man/glabels-batch-qt', 'glabels-batch-qt', 'batch creation of labels and business cards', [], 1) ] diff --git a/user-docs/man/glabels-batch-qt.rst b/user-docs/man/glabels-batch-qt.rst index 4de7965..301cd32 100644 --- a/user-docs/man/glabels-batch-qt.rst +++ b/user-docs/man/glabels-batch-qt.rst @@ -9,55 +9,61 @@ SYNOPSIS DESCRIPTION ----------- -:program:`glabels-batch-qt` is a utility for printing files previously -prepared with :program:`glabels-qt` from the command line. It is suitable -for use with scripts. +:program:`glabels-batch-qt` is a utility for printing a glabels project file +from the command line. It is suitable for use with scripts. OPTIONS ------- .. program:: glabels-batch-qt - + .. option:: -h, --help - + Displays usage information and exits. - + .. option:: -v, --version - + Displays version information and exits. .. option:: -p , --printer - + Send output to . .. option:: -o [], --output [] - - Set output filename to . Set to "-" for stdout. + Set output filename to . If filename is "-", write to standard output. (Default="output.pdf") - + .. option:: -s , --sheets - - Set number of sheets to . (Default=1) - + + For simple projects, sets number of full sheets to . (Default=1) + .. option:: -c , --copies - + Set number of copies to . (Default=1) - + +.. option:: -a, --collate + + Collate merge copies. + +.. option:: -g, --group + + Start each merge group on a new page. + .. option:: -f , --first - - Set starting label on 1st page to . (Default=1) - + + Set starting position to . (Default=1) + .. option:: -l, --outlines - + Print label outlines. - + .. option:: -m, --crop-marks - + Print crop marks. - + .. option:: -r, --reverse - + Print in reverse (mirror image). .. option:: -D =, --define = @@ -68,21 +74,31 @@ FILES ----- .. describe:: ${prefix}/share/glabels-qt/templates/ - + Directory containing predefined product templates distributed with glabels. - + .. describe:: ${XDG_CONFIG_HOME}/glabels.org/glabels-qt/ - + Directory containing user defined product templates created with the gLabels Product Template Designer. **Do not place manually created templates here!** - + .. describe:: ${HOME}/.glabels/ - + Directory for manually created product templates. -BUGS ----- +KNOWN ISSUES +------------ + +On GNU/Linux platforms, :program:`glabels-batch-qt` must be run from within a windowing environment, such as X or Wayland. This is because Qt requires a suitable platform to obtain system font information. A work-around is to run :program:`glabels-batch-qt` using a virtual X server environment: + +.. code:: shell + + xvfb-run glabels-batch-qt -o output.pdf myProject.glabels + + +REPORTING BUGS +-------------- On GNU/Linux platforms, :program:`glabels-batch-qt` must be run from within a windowing environment, such as X or Wayland. This is because Qt requires a suitable platform to obtain system font information. A work-around is to run :program:`glabels-batch-qt` using a virtual X server environment: @@ -100,5 +116,5 @@ SEE ALSO -------- :manpage:`glabels-qt(1)` - + The gLabels homepage at . diff --git a/user-docs/man/glabels-qt.rst b/user-docs/man/glabels-qt.rst index 97f8d9c..b24f1f8 100644 --- a/user-docs/man/glabels-qt.rst +++ b/user-docs/man/glabels-qt.rst @@ -17,30 +17,30 @@ OPTIONS ------- .. program:: glabels-qt - + .. option:: -h, --help - + Displays usage information and exits. - + .. option:: -v, --version - + Displays version information and exits. FILES ----- .. describe:: ${prefix}/share/glabels-qt/templates/ - + Directory containing predefined product templates distributed with glabels. - + .. describe:: ${XDG_CONFIG_HOME}/glabels.org/glabels-qt/ - + Directory containing user defined product templates created with the gLabels Product Template Designer. **Do not place manually created templates here!** - + .. describe:: ${HOME}/.glabels/ - + Directory for manually created product templates. REPORTING BUGS @@ -53,5 +53,5 @@ SEE ALSO -------- :manpage:`glabels-batch-qt(1)` - + The gLabels homepage at .