summaryrefslogtreecommitdiffstats
path: root/src/ui/widget/page-sizer.cpp
diff options
context:
space:
mode:
authorMarc Jeanmougin <marc@jeanmougin.fr>2018-10-19 15:51:03 +0000
committerMarc Jeanmougin <marc@jeanmougin.fr>2018-10-19 15:51:03 +0000
commit66cf65bc1b35c9d58a6a6af7c144e08ce685edd2 (patch)
treee1f0091806f8337bbd25eaf4edde85c6ea526775 /src/ui/widget/page-sizer.cpp
parentAdd some more const to SPFilter. (diff)
downloadinkscape-66cf65bc1b35c9d58a6a6af7c144e08ce685edd2.tar.gz
inkscape-66cf65bc1b35c9d58a6a6af7c144e08ce685edd2.zip
Makes page sizes in document properties customizable
Works similarly as prefs
Diffstat (limited to 'src/ui/widget/page-sizer.cpp')
-rw-r--r--src/ui/widget/page-sizer.cpp226
1 files changed, 38 insertions, 188 deletions
diff --git a/src/ui/widget/page-sizer.cpp b/src/ui/widget/page-sizer.cpp
index f1a253efc..9c03367ee 100644
--- a/src/ui/widget/page-sizer.cpp
+++ b/src/ui/widget/page-sizer.cpp
@@ -18,11 +18,14 @@
*/
#include "page-sizer.h"
+#include "pages-skeleton.h"
+#include <glib.h>
#include <glibmm/i18n.h>
#include "verbs.h"
#include "helper/action.h"
#include "object/sp-root.h"
#include "ui/widget/button.h"
+#include "io/resource.h"
using std::pair;
using Inkscape::Util::unit_table;
@@ -31,174 +34,6 @@ namespace Inkscape {
namespace UI {
namespace Widget {
- /** \note
- * The ISO page sizes in the table below differ from ghostscript's idea of page sizes (by
- * less than 1pt). Being off by <1pt should be OK for most purposes, but may cause fuzziness
- * (antialiasing) problems when printing to 72dpi or 144dpi printers or bitmap files due to
- * postscript's different coordinate system (y=0 meaning bottom of page in postscript and top
- * of page in SVG). I haven't looked into whether this does in fact cause fuzziness, I merely
- * note the possibility. Rounding done by extension/internal/ps.cpp (e.g. floor/ceil calls)
- * will also affect whether fuzziness occurs.
- *
- * The remainder of this comment discusses the origin of the numbers used for ISO page sizes in
- * this table and in ghostscript.
- *
- * The versions here, in mm, are the official sizes according to
- * <a href="http://en.wikipedia.org/wiki/Paper_sizes">http://en.wikipedia.org/wiki/Paper_sizes</a>
- * at 2005-01-25. (The ISO entries in the below table
- * were produced mechanically from the table on that page.)
- *
- * (The rule seems to be that A0, B0, ..., D0. sizes are rounded to the nearest number of mm
- * from the "theoretical size" (i.e. 1000 * sqrt(2) or pow(2.0, .25) or the like), whereas
- * going from e.g. A0 to A1 always take the floor of halving -- which by chance coincides
- * exactly with flooring the "theoretical size" for n != 0 instead of the rounding to nearest
- * done for n==0.)
- *
- * Ghostscript paper sizes are given in gs_statd.ps according to gs(1). gs_statd.ps always
- * uses an integer number of pt: sometimes gs_statd.ps rounds to nearest (e.g. a1), sometimes
- * floors (e.g. a10), sometimes ceils (e.g. a8).
- *
- * I'm not sure how ghostscript's gs_statd.ps was calculated: it isn't just rounding the
- * "theoretical size" of each page to pt (see a0), nor is it rounding the a0 size times an
- * appropriate power of two (see a1). Possibly it was prepared manually, with a human applying
- * inconsistent rounding rules when converting from mm to pt.
- */
- /** \todo
- * Should we include the JIS B series (used in Japan)
- * (JIS B0 is sometimes called JB0, and similarly for JB1 etc)?
- * Should we exclude B7--B10 and A7--10 to make the list smaller ?
- * Should we include any of the ISO C, D and E series (see below) ?
- */
-
-struct PaperSizeRec {
- char const * const name; //name
- double const smaller; //lesser dimension
- double const larger; //greater dimension
- Glib::ustring const unit; //units
-};
-
-// list of page formats that should be in landscape automatically
-static std::vector<std::string> lscape_papers;
-
-static void
-fill_landscape_papers() {
- lscape_papers.emplace_back("US #10 Envelope");
- lscape_papers.emplace_back("DL Envelope");
- lscape_papers.emplace_back("Banner 468x60");
- lscape_papers.emplace_back("Business Card (ISO 7810)");
- lscape_papers.emplace_back("Business Card (US)");
- lscape_papers.emplace_back("Business Card (Europe)");
- lscape_papers.emplace_back("Business Card (Aus/NZ)");
-}
-
-static PaperSizeRec const inkscape_papers[] = {
- { "A4", 210, 297, "mm" },
- { "US Letter", 8.5, 11, "in" },
- { "US Legal", 8.5, 14, "in" },
- { "US Executive", 7.25, 10.5, "in" },
- { "A0", 841, 1189, "mm" },
- { "A1", 594, 841, "mm" },
- { "A2", 420, 594, "mm" },
- { "A3", 297, 420, "mm" },
- { "A5", 148, 210, "mm" },
- { "A6", 105, 148, "mm" },
- { "A7", 74, 105, "mm" },
- { "A8", 52, 74, "mm" },
- { "A9", 37, 52, "mm" },
- { "A10", 26, 37, "mm" },
- { "B0", 1000, 1414, "mm" },
- { "B1", 707, 1000, "mm" },
- { "B2", 500, 707, "mm" },
- { "B3", 353, 500, "mm" },
- { "B4", 250, 353, "mm" },
- { "B5", 176, 250, "mm" },
- { "B6", 125, 176, "mm" },
- { "B7", 88, 125, "mm" },
- { "B8", 62, 88, "mm" },
- { "B9", 44, 62, "mm" },
- { "B10", 31, 44, "mm" },
-
-
-
-//#if 0
- /*
- Whether to include or exclude these depends on how
- big we mind our page size menu
- becoming. C series is used for envelopes;
- don't know what D and E series are used for.
- */
-
- { "C0", 917, 1297, "mm" },
- { "C1", 648, 917, "mm" },
- { "C2", 458, 648, "mm" },
- { "C3", 324, 458, "mm" },
- { "C4", 229, 324, "mm" },
- { "C5", 162, 229, "mm" },
- { "C6", 114, 162, "mm" },
- { "C7", 81, 114, "mm" },
- { "C8", 57, 81, "mm" },
- { "C9", 40, 57, "mm" },
- { "C10", 28, 40, "mm" },
- { "D1", 545, 771, "mm" },
- { "D2", 385, 545, "mm" },
- { "D3", 272, 385, "mm" },
- { "D4", 192, 272, "mm" },
- { "D5", 136, 192, "mm" },
- { "D6", 96, 136, "mm" },
- { "D7", 68, 96, "mm" },
- { "E3", 400, 560, "mm" },
- { "E4", 280, 400, "mm" },
- { "E5", 200, 280, "mm" },
- { "E6", 140, 200, "mm" },
-//#endif
-
-
-
- { "CSE", 462, 649, "pt" },
- { "US #10 Envelope", 4.125, 9.5, "in" },
- /* See http://www.hbp.com/content/PCR_envelopes.cfm for a much larger list of US envelope
- sizes. */
- { "DL Envelope", 110, 220, "mm" },
- { "Ledger/Tabloid", 11, 17, "in" },
- /* Note that `Folio' (used in QPrinter/KPrinter) is deliberately absent from this list, as it
- means different sizes to different people: different people may expect the width to be
- either 8, 8.25 or 8.5 inches, and the height to be either 13 or 13.5 inches, even
- restricting our interpretation to foolscap folio. If you wish to introduce a folio-like
- page size to the list, then please consider using a name more specific than just `Folio' or
- `Foolscap Folio'. */
- { "Banner 468x60", 60, 468, "px" },
- { "Icon 16x16", 16, 16, "px" },
- { "Icon 32x32", 32, 32, "px" },
- { "Icon 48x48", 48, 48, "px" },
- /* business cards */
- { "Business Card (ISO 7810)", 53.98, 85.60, "mm" },
- { "Business Card (US)", 2, 3.5, "in" },
- { "Business Card (Europe)", 55, 85, "mm" },
- { "Business Card (Aus/NZ)", 55, 90, "mm" },
-
- // Start Arch Series List
-
-
- { "Arch A", 9, 12, "in" }, // 229 x 305 mm
- { "Arch B", 12, 18, "in" }, // 305 x 457 mm
- { "Arch C", 18, 24, "in" }, // 457 x 610 mm
- { "Arch D", 24, 36, "in" }, // 610 x 914 mm
- { "Arch E", 36, 48, "in" }, // 914 x 1219 mm
- { "Arch E1", 30, 42, "in" }, // 762 x 1067 mm
-
- /*
- * The above list of Arch sizes were taken from the following site:
- * http://en.wikipedia.org/wiki/Paper_size
- * Further detail can be found at http://www.ansi.org
- * Sizes are assumed to be arbitrary rounding to MM unless shown to be otherwise
- * No conflicting information was found regarding sizes in MM
- * September 2009 - DAK
- */
-
- { nullptr, 0, 0, "px" },
-};
-
-
//########################################################################
//# P A G E S I Z E R
@@ -273,25 +108,40 @@ PageSizer::PageSizer(Registry & _wr)
_paperSizeListScroller.set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_ALWAYS);
_paperSizeListScroller.set_size_request(-1, 130);
- fill_landscape_papers();
-
- for (PaperSizeRec const *p = inkscape_papers; p->name; p++)
- {
- Glib::ustring name = p->name;
- char formatBuf[80];
- snprintf(formatBuf, 79, "%0.1f x %0.1f", p->smaller, p->larger);
- Glib::ustring desc = formatBuf;
- desc.append(" " + p->unit);
- PaperSize paper(name, p->smaller, p->larger, unit_table.getUnit(p->unit));
- _paperSizeTable[name] = paper;
- Gtk::TreeModel::Row row = *(_paperSizeListStore->append());
- row[_paperSizeListColumns.nameColumn] = name;
- row[_paperSizeListColumns.descColumn] = desc;
- }
- //Gtk::TreeModel::iterator iter = _paperSizeListStore->children().begin();
- //if (iter)
- // _paperSizeListSelection->select(iter);
+ char *path = Inkscape::IO::Resource::profile_path("pages.csv");
+ if (!g_file_test(path, G_FILE_TEST_EXISTS)) {
+ if (!g_file_set_contents(path, pages_skeleton,sizeof(pages_skeleton) , nullptr)) {
+ g_warning(_("Failed to create the page file."));
+ }
+ }
+
+ gchar *content = nullptr;
+ if (g_file_get_contents (path, &content, nullptr, NULL)) {
+
+ gchar **lines = g_strsplit_set (content, "\n", 0);
+
+ for (int i = 0; lines && lines[i]; ++i) {
+ gchar **line = g_strsplit_set (lines[i], ",", 5);
+ if(!line[0] || !line[1] || !line[2] || !line[3] ) continue;
+ //name, width, height, unit
+ double width = g_ascii_strtod (line[1], nullptr);
+ double height = g_ascii_strtod (line[2], nullptr);
+ Glib::ustring name = line[0];
+ char formatBuf[80];
+ snprintf(formatBuf, 79, "%0.1f x %0.1f", width, height);
+ Glib::ustring desc = formatBuf;
+ desc.append(" " + std::string(line[3]));
+ PaperSize paper(name, width, height, unit_table.getUnit(line[3]));
+ _paperSizeTable[name] = paper;
+ Gtk::TreeModel::Row row = *(_paperSizeListStore->append());
+ row[_paperSizeListColumns.nameColumn] = name;
+ row[_paperSizeListColumns.descColumn] = desc;
+ g_strfreev(line);
+ }
+ g_strfreev(lines);
+ g_free (content);
+ }
pack_start (_paperSizeListScroller, true, true, 0);
@@ -696,7 +546,7 @@ PageSizer::on_paper_size_list_changed()
Inkscape::Util::Quantity w = Inkscape::Util::Quantity(paper.smaller, paper.unit);
Inkscape::Util::Quantity h = Inkscape::Util::Quantity(paper.larger, paper.unit);
- if (std::find(lscape_papers.begin(), lscape_papers.end(), paper.name.c_str()) != lscape_papers.end()) {
+ if ( w > h ) {
// enforce landscape mode if this is desired for the given page format
_landscape = true;
} else {
@@ -704,7 +554,7 @@ PageSizer::on_paper_size_list_changed()
_landscape = _landscapeButton.get_active();
}
- if (_landscape)
+ if ((_landscape && (w < h)) || (!_landscape && (w > h)))
setDim (h, w, false);
else
setDim (w, h, false);