summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--share/templates/A4.svg5
-rw-r--r--share/templates/A4_landscape.svg5
-rw-r--r--share/templates/CD_cover_300dpi.svg5
-rw-r--r--share/templates/CD_label_120x120.svg7
-rw-r--r--share/templates/DVD_cover_regular_300dpi.svg7
-rw-r--r--share/templates/DVD_cover_slim_300dpi.svg7
-rw-r--r--share/templates/DVD_cover_superslim_300dpi.svg7
-rw-r--r--share/templates/DVD_cover_ultraslim_300dpi.svg7
-rw-r--r--share/templates/LaTeX_Beamer.svg7
-rw-r--r--share/templates/Letter.svg5
-rw-r--r--share/templates/Letter_landscape.svg5
-rw-r--r--share/templates/Typography_Canvas.svg7
-rw-r--r--share/templates/black_opaque.svg5
-rw-r--r--share/templates/business_card_85x54mm.svg5
-rw-r--r--share/templates/business_card_90x50mm.svg5
-rw-r--r--share/templates/desktop_1024x768.svg5
-rw-r--r--share/templates/desktop_1600x1200.svg5
-rw-r--r--share/templates/desktop_640x480.svg5
-rw-r--r--share/templates/desktop_800x600.svg5
-rw-r--r--share/templates/fontforge_glyph.svg6
-rw-r--r--share/templates/icon_16x16.svg5
-rw-r--r--share/templates/icon_32x32.svg5
-rw-r--r--share/templates/icon_48x48.svg5
-rw-r--r--share/templates/icon_64x64.svg5
-rw-r--r--share/templates/no_borders.svg5
-rw-r--r--share/templates/no_layers.svg5
-rw-r--r--share/templates/video_HDTV_1920x1080.svg7
-rw-r--r--share/templates/video_NTSC_720x486.svg7
-rw-r--r--share/templates/video_PAL_720x576.svg7
-rw-r--r--share/templates/web_banner_468x60.svg5
-rw-r--r--share/templates/web_banner_728x90.svg5
-rw-r--r--share/templates/web_banners.svg7
-rw-r--r--share/templates/white_opaque.svg5
-rw-r--r--src/file.cpp46
-rw-r--r--src/file.h1
-rw-r--r--src/interface.cpp97
-rw-r--r--src/menus-skeleton.h2
-rw-r--r--src/ui/dialog/Makefile_insert6
-rw-r--r--src/ui/dialog/new-from-template.cpp59
-rw-r--r--src/ui/dialog/new-from-template.h39
-rw-r--r--src/ui/dialog/template-load-tab.cpp277
-rw-r--r--src/ui/dialog/template-load-tab.h102
-rw-r--r--src/ui/dialog/template-widget.cpp119
-rw-r--r--src/ui/dialog/template-widget.h47
-rw-r--r--src/verbs.cpp6
-rw-r--r--src/verbs.h1
46 files changed, 884 insertions, 106 deletions
diff --git a/share/templates/A4.svg b/share/templates/A4.svg
index 63991a8f9..34df9310a 100644
--- a/share/templates/A4.svg
+++ b/share/templates/A4.svg
@@ -35,5 +35,10 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>A4 Page</inkscape:_name>
+ <inkscape:_short>Empty A4 sheet</inkscape:_short>
+ <inkscape:_keywords>A4 paper sheet empty</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" />
</svg>
diff --git a/share/templates/A4_landscape.svg b/share/templates/A4_landscape.svg
index 934c99f6d..c95cf1642 100644
--- a/share/templates/A4_landscape.svg
+++ b/share/templates/A4_landscape.svg
@@ -32,5 +32,10 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>A4 Landscape Page</inkscape:_name>
+ <inkscape:_short>Empty A4 landscape sheet</inkscape:_short>
+ <inkscape:_keywords>A4 paper sheet empty landscape</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" />
</svg>
diff --git a/share/templates/CD_cover_300dpi.svg b/share/templates/CD_cover_300dpi.svg
index 330ccf2dc..9030aae8b 100644
--- a/share/templates/CD_cover_300dpi.svg
+++ b/share/templates/CD_cover_300dpi.svg
@@ -32,5 +32,10 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>CD Cover 300dpi</inkscape:_name>
+ <inkscape:_short>Empty CD box cover.</inkscape:_short>
+ <inkscape:_keywords>CD cover disc disk 300dpi box</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" />
</svg>
diff --git a/share/templates/CD_label_120x120.svg b/share/templates/CD_label_120x120.svg
index c5c74a656..cc0029e15 100644
--- a/share/templates/CD_label_120x120.svg
+++ b/share/templates/CD_label_120x120.svg
@@ -78,6 +78,13 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>CD Label 120x120 </inkscape:_name>
+ <inkscape:author>JazzyNico</inkscape:author>
+ <inkscape:_short>Simple CD Label template with disc's pattern.</inkscape:_short>
+ <inkscape:date>2010-11-15</inkscape:date>
+ <inkscape:_keywords>CD label 120x120 disc disk</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
diff --git a/share/templates/DVD_cover_regular_300dpi.svg b/share/templates/DVD_cover_regular_300dpi.svg
index 8b1b854e4..66465b8ae 100644
--- a/share/templates/DVD_cover_regular_300dpi.svg
+++ b/share/templates/DVD_cover_regular_300dpi.svg
@@ -75,6 +75,13 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>DVD Cover Regular 300dpi </inkscape:_name>
+ <inkscape:author>cmarqu</inkscape:author>
+ <inkscape:_short>Template for both-sides DVD covers.</inkscape:_short>
+ <inkscape:date>2006-06-21</inkscape:date>
+ <inkscape:_keywords>DVD cover regular 300dpi</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
diff --git a/share/templates/DVD_cover_slim_300dpi.svg b/share/templates/DVD_cover_slim_300dpi.svg
index 517c095d0..e9402b39a 100644
--- a/share/templates/DVD_cover_slim_300dpi.svg
+++ b/share/templates/DVD_cover_slim_300dpi.svg
@@ -75,6 +75,13 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>DVD Cover Slim 300dpi </inkscape:_name>
+ <inkscape:author>cmarqu</inkscape:author>
+ <inkscape:_short>Template for both-sides DVD slim covers.</inkscape:_short>
+ <inkscape:date>2006-06-21</inkscape:date>
+ <inkscape:_keywords>DVD cover slim 300dpi</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
diff --git a/share/templates/DVD_cover_superslim_300dpi.svg b/share/templates/DVD_cover_superslim_300dpi.svg
index eed521534..842b951c1 100644
--- a/share/templates/DVD_cover_superslim_300dpi.svg
+++ b/share/templates/DVD_cover_superslim_300dpi.svg
@@ -75,6 +75,13 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>DVD Cover Superslim 300dpi </inkscape:_name>
+ <inkscape:author>cmarqu</inkscape:author>
+ <inkscape:_short>Template for both-sides DVD superslim covers.</inkscape:_short>
+ <inkscape:date>2006-06-21</inkscape:date>
+ <inkscape:_keywords>DVD cover superslim 300dpi</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
diff --git a/share/templates/DVD_cover_ultraslim_300dpi.svg b/share/templates/DVD_cover_ultraslim_300dpi.svg
index 0f2a2ccdd..0f0ead540 100644
--- a/share/templates/DVD_cover_ultraslim_300dpi.svg
+++ b/share/templates/DVD_cover_ultraslim_300dpi.svg
@@ -75,6 +75,13 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>DVD Cover Ultraslim 300dpi </inkscape:_name>
+ <inkscape:author>cmarqu</inkscape:author>
+ <inkscape:_short>Template for both-sides DVD ultraslim covers.</inkscape:_short>
+ <inkscape:date>2006-06-21</inkscape:date>
+ <inkscape:_keywords>DVD cover ultraslim 300dpi</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
diff --git a/share/templates/LaTeX_Beamer.svg b/share/templates/LaTeX_Beamer.svg
index 43e49ea29..50e50143f 100644
--- a/share/templates/LaTeX_Beamer.svg
+++ b/share/templates/LaTeX_Beamer.svg
@@ -79,6 +79,13 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>LaTeX Beamer</inkscape:_name>
+ <inkscape:author>jiho-sf</inkscape:author>
+ <inkscape:_short>LaTeX beamer template with helping grid.</inkscape:_short>
+ <inkscape:date>2007-05-20</inkscape:date>
+ <inkscape:_keywords>LaTex LaTeX latex grid beamer</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
diff --git a/share/templates/Letter.svg b/share/templates/Letter.svg
index 9f14fdcd5..76333107d 100644
--- a/share/templates/Letter.svg
+++ b/share/templates/Letter.svg
@@ -32,5 +32,10 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>Letter</inkscape:_name>
+ <inkscape:_short>Standard letter sheet - 612x792</inkscape:_short>
+ <inkscape:_keywords>letter 612x792 empty</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" />
</svg>
diff --git a/share/templates/Letter_landscape.svg b/share/templates/Letter_landscape.svg
index 564f4bcf6..76f434d20 100644
--- a/share/templates/Letter_landscape.svg
+++ b/share/templates/Letter_landscape.svg
@@ -32,5 +32,10 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>Letter Landscape</inkscape:_name>
+ <inkscape:_short>Standard letter landscape sheet - 792x612</inkscape:_short>
+ <inkscape:_keywords>letter landscape 792x612 empty</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" />
</svg>
diff --git a/share/templates/Typography_Canvas.svg b/share/templates/Typography_Canvas.svg
index 76dd48e6f..2b9773807 100644
--- a/share/templates/Typography_Canvas.svg
+++ b/share/templates/Typography_Canvas.svg
@@ -75,6 +75,13 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>Typography Canvas</inkscape:_name>
+ <inkscape:author>Felipe C. da S. Sanc...</inkscape:author>
+ <inkscape:_short>Empty typography canvas with helping guidelines.</inkscape:_short>
+ <inkscape:date>2011-05-26</inkscape:date>
+ <inkscape:_keywords>guidelines typography canvas</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g
id="layer1"
inkscape:groupmode="layer"
diff --git a/share/templates/black_opaque.svg b/share/templates/black_opaque.svg
index 065494f90..1b6cbbc69 100644
--- a/share/templates/black_opaque.svg
+++ b/share/templates/black_opaque.svg
@@ -32,5 +32,10 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>Black Opaque</inkscape:_name>
+ <inkscape:_short>Empty black page</inkscape:_short>
+ <inkscape:_keywords>black opaque empty</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" />
</svg>
diff --git a/share/templates/business_card_85x54mm.svg b/share/templates/business_card_85x54mm.svg
index 5febfd884..8afd13a10 100644
--- a/share/templates/business_card_85x54mm.svg
+++ b/share/templates/business_card_85x54mm.svg
@@ -34,5 +34,10 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>Business Card 85x54mm</inkscape:_name>
+ <inkscape:_short>Empty business card template.</inkscape:_short>
+ <inkscape:_keywords>business card empty 85x54</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" />
</svg>
diff --git a/share/templates/business_card_90x50mm.svg b/share/templates/business_card_90x50mm.svg
index 14e3d20d0..7b9de3640 100644
--- a/share/templates/business_card_90x50mm.svg
+++ b/share/templates/business_card_90x50mm.svg
@@ -34,5 +34,10 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>Business Card 90x50mm</inkscape:_name>
+ <inkscape:_short>Empty business card template.</inkscape:_short>
+ <inkscape:_keywords>business card empty 90x50</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" />
</svg>
diff --git a/share/templates/desktop_1024x768.svg b/share/templates/desktop_1024x768.svg
index bda4f7ae7..84d0bd097 100644
--- a/share/templates/desktop_1024x768.svg
+++ b/share/templates/desktop_1024x768.svg
@@ -33,5 +33,10 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>Desktop 1024x768</inkscape:_name>
+ <inkscape:_short>Empty desktop size sheet</inkscape:_short>
+ <inkscape:_keywords>desktop 1024x768 wallpaper</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer" />
</svg>
diff --git a/share/templates/desktop_1600x1200.svg b/share/templates/desktop_1600x1200.svg
index 6e98ce580..77fa49379 100644
--- a/share/templates/desktop_1600x1200.svg
+++ b/share/templates/desktop_1600x1200.svg
@@ -33,5 +33,10 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>Desktop 1600x1200</inkscape:_name>
+ <inkscape:_short>Empty desktop size sheet</inkscape:_short>
+ <inkscape:_keywords>desktop 1600x1200 wallpaper</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer" />
</svg>
diff --git a/share/templates/desktop_640x480.svg b/share/templates/desktop_640x480.svg
index f6f338015..9fee0812c 100644
--- a/share/templates/desktop_640x480.svg
+++ b/share/templates/desktop_640x480.svg
@@ -33,5 +33,10 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>Desktop 640x480</inkscape:_name>
+ <inkscape:_short>Empty desktop size sheet</inkscape:_short>
+ <inkscape:_keywords>desktop 640x480 wallpaper</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer" />
</svg>
diff --git a/share/templates/desktop_800x600.svg b/share/templates/desktop_800x600.svg
index b06632cf5..61b250b4b 100644
--- a/share/templates/desktop_800x600.svg
+++ b/share/templates/desktop_800x600.svg
@@ -34,5 +34,10 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>Desktop 800x600</inkscape:_name>
+ <inkscape:_short>Empty desktop size sheet</inkscape:_short>
+ <inkscape:_keywords>desktop 800x600 wallpaper</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer" />
</svg>
diff --git a/share/templates/fontforge_glyph.svg b/share/templates/fontforge_glyph.svg
index 6d007f0d0..84ea05753 100644
--- a/share/templates/fontforge_glyph.svg
+++ b/share/templates/fontforge_glyph.svg
@@ -46,6 +46,12 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>Fontforge Glyph</inkscape:_name>
+ <inkscape:author>prokoudine</inkscape:author>
+ <inkscape:date>2007-11-11</inkscape:date>
+ <inkscape:_keywords>font fontforge glyph 1000x1000</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
diff --git a/share/templates/icon_16x16.svg b/share/templates/icon_16x16.svg
index f90bc0a5b..c21c5c1a1 100644
--- a/share/templates/icon_16x16.svg
+++ b/share/templates/icon_16x16.svg
@@ -35,6 +35,11 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>Icon 16x16</inkscape:_name>
+ <inkscape:_short>Small 16x16 icon template.</inkscape:_short>
+ <inkscape:_keywords>icon 16x16 empty</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g
id="layer1"
inkscape:label="Layer 1"
diff --git a/share/templates/icon_32x32.svg b/share/templates/icon_32x32.svg
index d332dbe5d..1ad51df05 100644
--- a/share/templates/icon_32x32.svg
+++ b/share/templates/icon_32x32.svg
@@ -35,6 +35,11 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>Icon 32x32</inkscape:_name>
+ <inkscape:_short>32x32 icon template.</inkscape:_short>
+ <inkscape:_keywords>icon 32x32 empty</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g
id="layer1"
inkscape:label="Layer 1"
diff --git a/share/templates/icon_48x48.svg b/share/templates/icon_48x48.svg
index d3946ff2d..ff4c0fb76 100644
--- a/share/templates/icon_48x48.svg
+++ b/share/templates/icon_48x48.svg
@@ -35,6 +35,11 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>Icon 48x48</inkscape:_name>
+ <inkscape:_short>48x48 icon template.</inkscape:_short>
+ <inkscape:_keywords>icon 48x48 empty</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g
id="layer1"
inkscape:label="Layer 1"
diff --git a/share/templates/icon_64x64.svg b/share/templates/icon_64x64.svg
index e777e9dde..aac328323 100644
--- a/share/templates/icon_64x64.svg
+++ b/share/templates/icon_64x64.svg
@@ -36,6 +36,11 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>Icon 64x64</inkscape:_name>
+ <inkscape:_short>64x64 icon template.</inkscape:_short>
+ <inkscape:_keywords>icon 64x64 empty</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g
id="layer1"
inkscape:label="Layer 1"
diff --git a/share/templates/no_borders.svg b/share/templates/no_borders.svg
index 874b21c11..70b5e4b32 100644
--- a/share/templates/no_borders.svg
+++ b/share/templates/no_borders.svg
@@ -33,5 +33,10 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>No Borders</inkscape:_name>
+ <inkscape:_short>Empty sheet with no borders</inkscape:_short>
+ <inkscape:_keywords>no borders empty</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" />
</svg>
diff --git a/share/templates/no_layers.svg b/share/templates/no_layers.svg
index adb50f8e8..e887ad508 100644
--- a/share/templates/no_layers.svg
+++ b/share/templates/no_layers.svg
@@ -32,4 +32,9 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>No Layers</inkscape:_name>
+ <inkscape:_short>Empty sheet with no layers</inkscape:_short>
+ <inkscape:_keywords>no layers empty</inkscape:_keywords>
+ </inkscape:_templateinfo>
</svg>
diff --git a/share/templates/video_HDTV_1920x1080.svg b/share/templates/video_HDTV_1920x1080.svg
index 050679aa7..c28082139 100644
--- a/share/templates/video_HDTV_1920x1080.svg
+++ b/share/templates/video_HDTV_1920x1080.svg
@@ -33,5 +33,12 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>Video HDTV 1920x1080</inkscape:_name>
+ <inkscape:author>popolon2</inkscape:author>
+ <inkscape:_short>HDTV video template for 1920x1080 resolution.</inkscape:_short>
+ <inkscape:date>2006-10-14</inkscape:date>
+ <inkscape:_keywords>HDTV video empty 1920x1080</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer" />
</svg>
diff --git a/share/templates/video_NTSC_720x486.svg b/share/templates/video_NTSC_720x486.svg
index f3ebe670b..22ee28205 100644
--- a/share/templates/video_NTSC_720x486.svg
+++ b/share/templates/video_NTSC_720x486.svg
@@ -33,5 +33,12 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>Video NTSC 720x486</inkscape:_name>
+ <inkscape:author>popolon2</inkscape:author>
+ <inkscape:_short>NTSC video template for 720x486 resolution.</inkscape:_short>
+ <inkscape:date>2006-10-14</inkscape:date>
+ <inkscape:_keywords>NTSC video empty 720x486</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer" />
</svg>
diff --git a/share/templates/video_PAL_720x576.svg b/share/templates/video_PAL_720x576.svg
index ee861b2fb..548176adf 100644
--- a/share/templates/video_PAL_720x576.svg
+++ b/share/templates/video_PAL_720x576.svg
@@ -33,5 +33,12 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>Video PAL 728x576</inkscape:_name>
+ <inkscape:author>popolon2</inkscape:author>
+ <inkscape:_short>PAL video template for 728x576 resolution.</inkscape:_short>
+ <inkscape:date>2006-10-14</inkscape:date>
+ <inkscape:_keywords>PAL video empty 728x576</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer" />
</svg>
diff --git a/share/templates/web_banner_468x60.svg b/share/templates/web_banner_468x60.svg
index 90fceb7de..9ca37f075 100644
--- a/share/templates/web_banner_468x60.svg
+++ b/share/templates/web_banner_468x60.svg
@@ -33,5 +33,10 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>Web Banner 468x60</inkscape:_name>
+ <inkscape:_short>Empty 468x60 web banner template.</inkscape:_short>
+ <inkscape:_keywords>web banner 468x60 empty</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer" />
</svg>
diff --git a/share/templates/web_banner_728x90.svg b/share/templates/web_banner_728x90.svg
index dc35b21bf..48f7237a4 100644
--- a/share/templates/web_banner_728x90.svg
+++ b/share/templates/web_banner_728x90.svg
@@ -33,5 +33,10 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>Web Banner 728x90</inkscape:_name>
+ <inkscape:_short>Empty 728x90 web banner template.</inkscape:_short>
+ <inkscape:_keywords>web banner 728x90 empty</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer" />
</svg>
diff --git a/share/templates/web_banners.svg b/share/templates/web_banners.svg
index 20fd9c41d..b074ac597 100644
--- a/share/templates/web_banners.svg
+++ b/share/templates/web_banners.svg
@@ -57,6 +57,13 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>Web Banners Collection</inkscape:_name>
+ <inkscape:author>Aurélio A. Heckert</inkscape:author>
+ <inkscape:_short>A collection of standard web banners</inkscape:_short>
+ <inkscape:date>2010-05-27</inkscape:date>
+ <inkscape:_keywords>web banners collection</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g
inkscape:label="Camada 1"
inkscape:groupmode="layer"
diff --git a/share/templates/white_opaque.svg b/share/templates/white_opaque.svg
index 8f2022b0b..d9f99d1ab 100644
--- a/share/templates/white_opaque.svg
+++ b/share/templates/white_opaque.svg
@@ -33,5 +33,10 @@
</cc:Work>
</rdf:RDF>
</metadata>
+ <inkscape:_templateinfo>
+ <inkscape:_name>White Opaque</inkscape:_name>
+ <inkscape:_short>Empty white page</inkscape:_short>
+ <inkscape:_keywords>white opaque empty</inkscape:_keywords>
+ </inkscape:_templateinfo>
<g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" />
</svg>
diff --git a/src/file.cpp b/src/file.cpp
index 5007cd901..eb917f169 100644
--- a/src/file.cpp
+++ b/src/file.cpp
@@ -128,21 +128,46 @@ SPDesktop *sp_file_new(const Glib::ustring &templ)
{
SPDocument *doc = SPDocument::createNewDoc( !templ.empty() ? templ.c_str() : 0 , TRUE, true );
g_return_val_if_fail(doc != NULL, NULL);
+
+ // Remove all the template info from xml tree
+ Inkscape::XML::Node *myRoot = doc->getReprRoot();
+ Inkscape::XML::Node *nodeToRemove = sp_repr_lookup_name(myRoot, "inkscape:_templateinfo");
+ if (nodeToRemove != NULL){
+ sp_repr_unparent(nodeToRemove);
+ delete nodeToRemove;
+ DocumentUndo::clearUndo(doc);
+ }
+
+ SPDesktop *desktop = SP_ACTIVE_DESKTOP;
+ if (desktop) {
+ desktop->setWaitingCursor();
+ }
+
+ SPDocument *existing = desktop ? sp_desktop_document(desktop) : NULL;
+
+ if (existing && existing->virgin) {
+ // If the current desktop is empty, open the document there
+ doc->ensureUpToDate(); // TODO this will trigger broken link warnings, etc.
+ desktop->change_document(doc);
+ doc->emitResizedSignal(doc->getWidth(), doc->getHeight());
+ } else {
+ // create a whole new desktop and window
+ SPViewWidget *dtw = sp_desktop_widget_new(sp_document_namedview(doc, NULL)); // TODO this will trigger broken link warnings, etc.
+ g_return_val_if_fail(dtw != NULL, NULL);
+ sp_create_window(dtw, TRUE);
+ desktop = static_cast<SPDesktop *>(dtw->view);
+ }
- SPViewWidget *dtw = sp_desktop_widget_new(sp_document_namedview(doc, NULL));
- g_return_val_if_fail(dtw != NULL, NULL);
doc->doUnref();
- sp_create_window(dtw, TRUE);
- SPDesktop *dt = static_cast<SPDesktop *>(dtw->view);
- sp_namedview_window_from_document(dt);
- sp_namedview_update_layers_from_document(dt);
+ sp_namedview_window_from_document(desktop);
+ sp_namedview_update_layers_from_document(desktop);
#ifdef WITH_DBUS
Inkscape::Extension::Dbus::dbus_init_desktop_interface(dt);
#endif
- return dt;
+ return desktop;
}
Glib::ustring sp_file_default_template_uri()
@@ -200,6 +225,7 @@ SPDesktop* sp_file_new_default()
return desk;
}
+
/*######################
## D E L E T E
######################*/
@@ -232,7 +258,8 @@ sp_file_exit()
*/
bool sp_file_open(const Glib::ustring &uri,
Inkscape::Extension::Extension *key,
- bool add_to_recent, bool replace_empty)
+ bool add_to_recent,
+ bool replace_empty)
{
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
if (desktop) {
@@ -257,6 +284,7 @@ bool sp_file_open(const Glib::ustring &uri,
}
if (doc) {
+
SPDocument *existing = desktop ? sp_desktop_document(desktop) : NULL;
if (existing && existing->virgin && replace_empty) {
@@ -273,7 +301,7 @@ bool sp_file_open(const Glib::ustring &uri,
doc->virgin = FALSE;
- // everyone who cares now has a reference, get rid of ours
+ // everyone who cares now has a reference, get rid of our`s
doc->doUnref();
// resize the window to match the document properties
diff --git a/src/file.h b/src/file.h
index eeb4c6fc5..682ca422e 100644
--- a/src/file.h
+++ b/src/file.h
@@ -62,6 +62,7 @@ void sp_file_exit (void);
/**
* Opens a new file and window from the given URI
*/
+
bool sp_file_open(
const Glib::ustring &uri,
Inkscape::Extension::Extension *key,
diff --git a/src/interface.cpp b/src/interface.cpp
index 98c30bf3c..026890c67 100644
--- a/src/interface.cpp
+++ b/src/interface.cpp
@@ -717,13 +717,6 @@ sp_recent_open(GtkRecentChooser *recent_menu, gpointer /*user_data*/)
g_free(uri);
}
-static void
-sp_file_new_from_template(GtkWidget */*widget*/, gchar const *uri)
-{
- sp_file_new(uri);
-}
-
-
static bool
compare_file_basenames(gchar const *a, gchar const *b) {
bool rc;
@@ -752,91 +745,6 @@ compare_file_basenames(gchar const *a, gchar const *b) {
}
static void
-sp_menu_get_svg_filenames_from_dir(gchar const *dirname, std::list<gchar const*> *files)
-{
- if ( Inkscape::IO::file_test( dirname, (GFileTest)(G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR) ) ) {
- GError *err = 0;
- GDir *dir = g_dir_open(dirname, 0, &err);
-
- if (dir) {
- for (gchar const *file = g_dir_read_name(dir); file != NULL; file = g_dir_read_name(dir)) {
- if (!g_str_has_suffix(file, ".svg") && !g_str_has_suffix(file, ".svgz")) {
- continue; // skip non-svg files
- }
-
- {
- gchar *basename = g_path_get_basename(file);
- if (g_str_has_suffix(basename, ".svg") && g_str_has_prefix(basename, "default.")) {
- g_free(basename);
- basename = 0;
- continue; // skip default.*.svg (i.e. default.svg and translations) - it's in the menu already
- }
- g_free(basename);
- basename = 0;
- }
-
- gchar const *filepath = g_build_filename(dirname, file, NULL);
- files->push_front(filepath);
- }
- g_dir_close(dir);
- }
- }
-
- files->sort(compare_file_basenames);
-}
-
-static void
-sp_menu_add_filenames_to_menu(GtkWidget *menu, Inkscape::UI::View::View *view, std::list<gchar const*> *files)
-{
- if (!files->empty()) {
- GtkWidget *sep = gtk_separator_menu_item_new();
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), sep);
- }
-
- for(std::list<gchar const*>::iterator it=files->begin(); it != files->end(); ++it) {
- gchar const *filepath = *it;
- gchar const *file = g_path_get_basename(filepath);
- gchar *dupfile = g_strndup(file, strlen(file) - 4);
- gchar *filename = g_filename_to_utf8(dupfile, -1, NULL, NULL, NULL);
- g_free(dupfile);
-
- GtkWidget *item = gtk_menu_item_new_with_label(filename);
- g_free(filename);
-
- gtk_widget_show(item);
- // how does "filepath" ever get freed?
- g_signal_connect(G_OBJECT(item),
- "activate",
- G_CALLBACK(sp_file_new_from_template),
- (gpointer) filepath);
-
- if (view) {
- // set null tip for now; later use a description from the template file
- g_object_set_data(G_OBJECT(item), "view", (gpointer) view);
- g_signal_connect( G_OBJECT(item), "select", G_CALLBACK(sp_ui_menu_select), (gpointer) NULL );
- g_signal_connect( G_OBJECT(item), "deselect", G_CALLBACK(sp_ui_menu_deselect), NULL);
- }
-
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
- }
-
-}
-static void
-sp_menu_append_new_templates(GtkWidget *menu, Inkscape::UI::View::View *view)
-{
- // user's local dir
- std::list<gchar const*> userfiles;
- sp_menu_get_svg_filenames_from_dir(profile_path("templates"), &userfiles);
- sp_menu_add_filenames_to_menu(menu, view, &userfiles);
-
- // system templates dir
- std::list<gchar const*> templatefiles;
- sp_menu_get_svg_filenames_from_dir(INKSCAPE_TEMPLATESDIR, &templatefiles);
- sp_menu_add_filenames_to_menu(menu, view, &templatefiles);
-
-}
-
-static void
sp_ui_checkboxes_menus(GtkMenu *m, Inkscape::UI::View::View *view)
{
//sp_ui_menu_append_check_item_from_verb(m, view, _("_Menu"), _("Show or hide the menu bar"), "menu",
@@ -996,10 +904,7 @@ static void sp_ui_build_dyn_menus(Inkscape::XML::Node *menus, GtkWidget *menu, I
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
continue;
}
- if (!strcmp(menu_pntr->name(), "template-list")) {
- sp_menu_append_new_templates(menu, view);
- continue;
- }
+
if (!strcmp(menu_pntr->name(), "recent-file-list")) {
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
diff --git a/src/menus-skeleton.h b/src/menus-skeleton.h
index d01e3e38c..5b141902b 100644
--- a/src/menus-skeleton.h
+++ b/src/menus-skeleton.h
@@ -16,7 +16,7 @@ static char const menus_skeleton[] =
" <submenu name=\"" N_("_File") "\">\n"
" <submenu name=\"" N_("_New") "\">\n"
" <verb verb-id=\"FileNew\" />\n"
-" <template-list/>\n"
+" <verb verb-id=\"FileTemplates\" />\n"
" </submenu>\n"
" <verb verb-id=\"FileOpen\" />\n"
" <recent-file-list/>\n"
diff --git a/src/ui/dialog/Makefile_insert b/src/ui/dialog/Makefile_insert
index bbede9df1..09a7ef573 100644
--- a/src/ui/dialog/Makefile_insert
+++ b/src/ui/dialog/Makefile_insert
@@ -70,6 +70,8 @@ ink_common_sources += \
ui/dialog/memory.h \
ui/dialog/messages.cpp \
ui/dialog/messages.h \
+ ui/dialog/new-from-template.cpp \
+ ui/dialog/new-from-template.h \
ui/dialog/ocaldialogs.cpp \
ui/dialog/ocaldialogs.h \
ui/dialog/object-attributes.cpp \
@@ -89,6 +91,10 @@ ink_common_sources += \
ui/dialog/swatches.h \
ui/dialog/symbols.cpp \
ui/dialog/symbols.h \
+ ui/dialog/template-load-tab.cpp \
+ ui/dialog/template-load-tab.h \
+ ui/dialog/template-widget.cpp \
+ ui/dialog/template-widget.h \
ui/dialog/text-edit.cpp \
ui/dialog/text-edit.h \
ui/dialog/tile.cpp \
diff --git a/src/ui/dialog/new-from-template.cpp b/src/ui/dialog/new-from-template.cpp
new file mode 100644
index 000000000..2595e2cf5
--- /dev/null
+++ b/src/ui/dialog/new-from-template.cpp
@@ -0,0 +1,59 @@
+/** @file
+ * @brief New From Template main dialog - implementation
+ */
+/* Authors:
+ * Jan Darowski <jan.darowski@gmail.com>, supervised by Krzysztof Kosiński
+ *
+ * Copyright (C) 2013 Authors
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+
+#include "new-from-template.h"
+#include "file.h"
+
+#include <gtkmm/alignment.h>
+#include <glibmm/i18n.h>
+
+
+namespace Inkscape {
+namespace UI {
+
+
+NewFromTemplate::NewFromTemplate()
+ : _create_template_button(_("Create from template"))
+{
+ set_title(_("New From Template"));
+ resize(400, 400);
+
+ get_vbox()->pack_start(_main_widget);
+
+ Gtk::Alignment *align;
+ align = manage(new Gtk::Alignment(Gtk::ALIGN_END, Gtk::ALIGN_CENTER, 0.0, 0.0));
+ get_vbox()->pack_end(*align, Gtk::PACK_SHRINK);
+ align->set_padding(0, 0, 0, 15);
+ align->add(_create_template_button);
+
+ _create_template_button.signal_pressed().connect(
+ sigc::mem_fun(*this, &NewFromTemplate::_createFromTemplate));
+
+ show_all();
+}
+
+
+void NewFromTemplate::_createFromTemplate()
+{
+ _main_widget.createTemplate();
+
+ response(0);
+}
+
+
+void NewFromTemplate::load_new_from_template()
+{
+ NewFromTemplate dl;
+ dl.run();
+}
+
+}
+}
diff --git a/src/ui/dialog/new-from-template.h b/src/ui/dialog/new-from-template.h
new file mode 100644
index 000000000..8ebcb2863
--- /dev/null
+++ b/src/ui/dialog/new-from-template.h
@@ -0,0 +1,39 @@
+/** @file
+ * @brief New From Template main dialog
+ */
+/* Authors:
+ * Jan Darowski <jan.darowski@gmail.com>, supervised by Krzysztof Kosiński
+ *
+ * Copyright (C) 2013 Authors
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifndef INKSCAPE_SEEN_UI_DIALOG_NEW_FROM_TEMPLATE_H
+#define INKSCAPE_SEEN_UI_DIALOG_NEW_FROM_TEMPLATE_H
+
+#include <gtkmm/dialog.h>
+#include <gtkmm/button.h>
+
+#include "template-load-tab.h"
+
+
+namespace Inkscape {
+namespace UI {
+
+
+class NewFromTemplate : public Gtk::Dialog
+{
+public:
+ static void load_new_from_template();
+
+private:
+ NewFromTemplate();
+ Gtk::Button _create_template_button;
+ TemplateLoadTab _main_widget;
+
+ void _createFromTemplate();
+};
+
+}
+}
+#endif
diff --git a/src/ui/dialog/template-load-tab.cpp b/src/ui/dialog/template-load-tab.cpp
new file mode 100644
index 000000000..4fee4c5e7
--- /dev/null
+++ b/src/ui/dialog/template-load-tab.cpp
@@ -0,0 +1,277 @@
+/** @file
+ * @brief New From Template abstract tab implementation
+ */
+/* Authors:
+ * Jan Darowski <jan.darowski@gmail.com>, supervised by Krzysztof Kosiński
+ *
+ * Copyright (C) 2013 Authors
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "template-load-tab.h"
+#include "template-widget.h"
+
+#include <gtkmm/messagedialog.h>
+#include <gtkmm/scrolledwindow.h>
+#include <glibmm/i18n.h>
+
+#include "interface.h"
+#include "file.h"
+#include "path-prefix.h"
+#include "preferences.h"
+#include "inkscape.h"
+#include "xml/repr.h"
+#include "xml/document.h"
+#include "xml/node.h"
+
+
+namespace Inkscape {
+namespace UI {
+
+
+TemplateLoadTab::TemplateLoadTab()
+ : _current_keyword("")
+ , _keywords_combo(true)
+ , _current_search_type(ALL)
+{
+ set_border_width(10);
+
+ _info_widget = manage(new TemplateWidget());
+
+ Gtk::Label *title;
+ title = manage(new Gtk::Label(_("Search:")));
+ _search_box.pack_start(*title, Gtk::PACK_SHRINK);
+ _search_box.pack_start(_keywords_combo, Gtk::PACK_SHRINK, 5);
+
+ _tlist_box.pack_start(_search_box, Gtk::PACK_SHRINK, 10);
+
+ pack_start(_tlist_box, Gtk::PACK_SHRINK);
+ pack_start(*_info_widget, Gtk::PACK_EXPAND_WIDGET, 5);
+
+ Gtk::ScrolledWindow *scrolled;
+ scrolled = manage(new Gtk::ScrolledWindow());
+ scrolled->set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
+ scrolled->add(_tlist_view);
+ _tlist_box.pack_start(*scrolled, Gtk::PACK_EXPAND_WIDGET, 5);
+
+ _keywords_combo.signal_changed().connect(
+ sigc::mem_fun(*this, &TemplateLoadTab::_keywordSelected));
+ this->show_all();
+
+ _loading_path = "";
+ _loadTemplates();
+ _initLists();
+}
+
+
+TemplateLoadTab::~TemplateLoadTab()
+{
+}
+
+
+void TemplateLoadTab::createTemplate()
+{
+ _info_widget->create();
+}
+
+
+void TemplateLoadTab::_displayTemplateInfo()
+{
+ Glib::RefPtr<Gtk::TreeSelection> templateSelectionRef = _tlist_view.get_selection();
+ if (templateSelectionRef->get_selected()) {
+ _current_template = (*templateSelectionRef->get_selected())[_columns.textValue];
+
+ _info_widget->display(_tdata[_current_template]);
+ }
+
+}
+
+
+void TemplateLoadTab::_initKeywordsList()
+{
+ _keywords_combo.append(_("All"));
+
+ for (std::set<Glib::ustring>::iterator it = _keywords.begin() ; it != _keywords.end() ; ++it){
+ _keywords_combo.append(*it);
+ }
+}
+
+
+void TemplateLoadTab::_initLists()
+{
+ _tlist_store = Gtk::ListStore::create(_columns);
+ _tlist_view.set_model(_tlist_store);
+ _tlist_view.append_column("", _columns.textValue);
+ _tlist_view.set_headers_visible(false);
+
+ _initKeywordsList();
+ _refreshTemplatesList();
+
+ Glib::RefPtr<Gtk::TreeSelection> templateSelectionRef =
+ _tlist_view.get_selection();
+ templateSelectionRef->signal_changed().connect(
+ sigc::mem_fun(*this, &TemplateLoadTab::_displayTemplateInfo));
+}
+
+
+void TemplateLoadTab::_keywordSelected()
+{
+ _current_keyword = _keywords_combo.get_active_text();
+ if (_current_keyword == ""){
+ _current_keyword = _keywords_combo.get_entry_text();
+ _current_search_type = USER_SPECIFIED;
+ }
+ else
+ _current_search_type = LIST_KEYWORD;
+
+ if (_current_keyword == "" || _current_keyword == _("All"))
+ _current_search_type = ALL;
+
+ _refreshTemplatesList();
+}
+
+
+void TemplateLoadTab::_refreshTemplatesList()
+{
+ _tlist_store->clear();
+
+ switch (_current_search_type){
+ case ALL :{
+
+ for (std::map<Glib::ustring, TemplateData>::iterator it = _tdata.begin() ; it != _tdata.end() ; ++it) {
+ Gtk::TreeModel::iterator iter = _tlist_store->append();
+ Gtk::TreeModel::Row row = *iter;
+ row[_columns.textValue] = it->first;
+ }
+ break;
+ }
+
+ case LIST_KEYWORD: {
+ for (std::map<Glib::ustring, TemplateData>::iterator it = _tdata.begin() ; it != _tdata.end() ; ++it) {
+ if (it->second.keywords.count(_current_keyword) != 0){
+ Gtk::TreeModel::iterator iter = _tlist_store->append();
+ Gtk::TreeModel::Row row = *iter;
+ row[_columns.textValue] = it->first;
+ }
+ }
+ break;
+ }
+
+ case USER_SPECIFIED : {
+ for (std::map<Glib::ustring, TemplateData>::iterator it = _tdata.begin() ; it != _tdata.end() ; ++it) {
+ if (it->second.keywords.count(_current_keyword) != 0 ||
+ it->second.display_name.find(_current_keyword) != Glib::ustring::npos ||
+ it->second.author.find(_current_keyword) != Glib::ustring::npos ||
+ it->second.short_description.find(_current_keyword) != Glib::ustring::npos ||
+ it->second.long_description.find(_current_keyword) != Glib::ustring::npos )
+ {
+ Gtk::TreeModel::iterator iter = _tlist_store->append();
+ Gtk::TreeModel::Row row = *iter;
+ row[_columns.textValue] = it->first;
+ }
+ }
+ break;
+ }
+ }
+}
+
+
+void TemplateLoadTab::_loadTemplates()
+{
+ // user's local dir
+ _getTemplatesFromDir(profile_path("templates") + _loading_path);
+
+ // system templates dir
+ _getTemplatesFromDir(INKSCAPE_TEMPLATESDIR + _loading_path);
+}
+
+
+TemplateLoadTab::TemplateData TemplateLoadTab::_processTemplateFile(const Glib::ustring &path)
+{
+ TemplateData result;
+ result.path = path;
+ result.is_procedural = false;
+ result.preview_name = "";
+
+ // convert path into valid template name
+ result.display_name = Glib::path_get_basename(path);
+ gsize n = 0;
+ while ((n = result.display_name.find_first_of("_", 0)) < Glib::ustring::npos){
+ result.display_name.replace(n, 1, 1, ' ');
+ }
+ n = result.display_name.rfind(".svg");
+ result.display_name.replace(n, 4, 1, ' ');
+
+ Inkscape::XML::Document *rdoc;
+ rdoc = sp_repr_read_file(path.data(), SP_SVG_NS_URI);
+ Inkscape::XML::Node *myRoot;
+ Inkscape::XML::Node *dataNode;
+
+ if (rdoc){
+ myRoot = rdoc->root();
+ if (strcmp(myRoot->name(), "svg:svg") != 0){ // Wrong file format
+ return result;
+ }
+
+ myRoot = sp_repr_lookup_name(myRoot, "inkscape:_templateinfo");
+
+ if (myRoot == NULL) // No template info
+ return result;
+
+ if ((dataNode = sp_repr_lookup_name(myRoot, "inkscape:_name")) != NULL)
+ result.display_name = dgettext("Document template name", dataNode->firstChild()->content());
+ if ((dataNode = sp_repr_lookup_name(myRoot, "inkscape:author")) != NULL)
+ result.author = dataNode->firstChild()->content();
+ if ((dataNode = sp_repr_lookup_name(myRoot, "inkscape:_short")) != NULL)
+ result.short_description = dgettext("Document template short description", dataNode->firstChild()->content());
+ if ((dataNode = sp_repr_lookup_name(myRoot, "inkscape:_long") )!= NULL)
+ result.long_description = dgettext("Document template long description", dataNode->firstChild()->content());
+ if ((dataNode = sp_repr_lookup_name(myRoot, "inkscape:preview")) != NULL)
+ result.preview_name = dataNode->firstChild()->content();
+ if ((dataNode = sp_repr_lookup_name(myRoot, "inkscape:date")) != NULL){
+ result.creation_date = dataNode->firstChild()->content();
+ }
+
+ if ((dataNode = sp_repr_lookup_name(myRoot, "inkscape:_keywords")) != NULL){
+ Glib::ustring data = dataNode->firstChild()->content();
+ while (!data.empty()){
+ int pos = data.find_first_of(" ");
+ if (pos == Glib::ustring::npos)
+ pos = data.size();
+
+ Glib::ustring keyword = dgettext("Document template keyword", data.substr(0, pos).data());
+ result.keywords.insert(keyword);
+ _keywords.insert(keyword);
+
+ if (pos == data.size())
+ break;
+ data.erase(0, pos+1);
+ }
+ }
+ }
+
+ return result;
+}
+
+
+void TemplateLoadTab::_getTemplatesFromDir(const Glib::ustring &path)
+{
+ if ( !Glib::file_test(path, Glib::FILE_TEST_EXISTS) ||
+ !Glib::file_test(path, Glib::FILE_TEST_IS_DIR))
+ return;
+
+ Glib::Dir dir(path);
+
+ Glib::ustring file = Glib::build_filename(path, dir.read_name());
+ while (file != path){
+ if (Glib::str_has_suffix(file, ".svg") && !Glib::str_has_prefix(Glib::path_get_basename(file), "default")){
+ TemplateData tmp = _processTemplateFile(file);
+ if (tmp.display_name != "")
+ _tdata[tmp.display_name] = tmp;
+ }
+ file = Glib::build_filename(path, dir.read_name());
+ }
+}
+
+}
+}
diff --git a/src/ui/dialog/template-load-tab.h b/src/ui/dialog/template-load-tab.h
new file mode 100644
index 000000000..50f3e0be2
--- /dev/null
+++ b/src/ui/dialog/template-load-tab.h
@@ -0,0 +1,102 @@
+/** @file
+ * @brief New From Template abstract tab class
+ */
+/* Authors:
+ * Jan Darowski <jan.darowski@gmail.com>, supervised by Krzysztof Kosiński
+ *
+ * Copyright (C) 2013 Authors
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifndef INKSCAPE_SEEN_UI_DIALOG_TEMPLATE_LOAD_TAB_H
+#define INKSCAPE_SEEN_UI_DIALOG_TEMPLATE_LOAD_TAB_H
+
+#include <gtkmm/box.h>
+#include <gtkmm/comboboxtext.h>
+#include <gtkmm/frame.h>
+#include <gtkmm/liststore.h>
+#include <gtkmm/treeview.h>
+#include <map>
+#include <set>
+
+
+namespace Inkscape {
+namespace UI {
+
+class TemplateWidget;
+
+class TemplateLoadTab : public Gtk::HBox
+{
+
+public:
+ struct TemplateData
+ {
+ bool is_procedural;
+ Glib::ustring path;
+ Glib::ustring display_name;
+ Glib::ustring author;
+ Glib::ustring short_description;
+ Glib::ustring long_description;
+ Glib::ustring preview_name;
+ Glib::ustring creation_date;
+ std::set<Glib::ustring> keywords;
+ };
+
+ TemplateLoadTab();
+ virtual ~TemplateLoadTab();
+ virtual void createTemplate();
+
+protected:
+ class StringModelColumns : public Gtk::TreeModelColumnRecord
+ {
+ public:
+ StringModelColumns()
+ {
+ add(textValue);
+ }
+
+ Gtk::TreeModelColumn<Glib::ustring> textValue;
+ };
+
+ Glib::ustring _current_keyword;
+ Glib::ustring _current_template;
+ Glib::ustring _loading_path;
+ std::map<Glib::ustring, TemplateData> _tdata;
+ std::set<Glib::ustring> _keywords;
+
+
+ virtual void _displayTemplateInfo();
+ virtual void _initKeywordsList();
+ virtual void _refreshTemplatesList();
+ void _loadTemplates();
+ void _initLists();
+
+ Gtk::VBox _tlist_box;
+ Gtk::HBox _search_box;
+ TemplateWidget *_info_widget;
+
+ Gtk::ComboBoxText _keywords_combo;
+
+ Gtk::TreeView _tlist_view;
+ Glib::RefPtr<Gtk::ListStore> _tlist_store;
+ StringModelColumns _columns;
+
+private:
+ enum SearchType
+ {
+ LIST_KEYWORD,
+ USER_SPECIFIED,
+ ALL
+ };
+
+ SearchType _current_search_type;
+
+ void _getTemplatesFromDir(const Glib::ustring &);
+ void _keywordSelected();
+ TemplateData _processTemplateFile(const Glib::ustring &);
+};
+
+}
+}
+
+#endif
diff --git a/src/ui/dialog/template-widget.cpp b/src/ui/dialog/template-widget.cpp
new file mode 100644
index 000000000..0e05f292c
--- /dev/null
+++ b/src/ui/dialog/template-widget.cpp
@@ -0,0 +1,119 @@
+
+
+/** @file
+ * @brief New From Template - templates widget - implementation
+ */
+/* Authors:
+ * Jan Darowski <jan.darowski@gmail.com>, supervised by Krzysztof Kosiński
+ *
+ * Copyright (C) 2013 Authors
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "template-widget.h"
+#include "template-load-tab.h"
+#include "file.h"
+
+#include <gtkmm/alignment.h>
+#include <gtkmm/button.h>
+#include <gtkmm/label.h>
+#include <gtkmm/messagedialog.h>
+#include <glibmm/i18n.h>
+
+
+namespace Inkscape {
+namespace UI {
+
+
+TemplateWidget::TemplateWidget()
+ : _more_info_button(_("More info"))
+ , _short_description_label(_(" "))
+ , _template_author_label(_(" "))
+ , _template_name_label(_("no template selected"))
+ , _preview_image()
+ , _preview_render()
+{
+ pack_start(_template_name_label, Gtk::PACK_SHRINK, 10);
+ pack_start(_template_author_label, Gtk::PACK_SHRINK, 0);
+ pack_start(_preview_box, Gtk::PACK_SHRINK, 0);
+
+ _preview_box.pack_start(_preview_image, Gtk::PACK_EXPAND_PADDING, 15);
+ _preview_box.pack_start(_preview_render, Gtk::PACK_EXPAND_PADDING, 10);
+
+ _short_description_label.set_line_wrap(true);
+ //_short_description_label.set_size_request(200);
+
+ Gtk::Alignment *align;
+ align = manage(new Gtk::Alignment(Gtk::ALIGN_END, Gtk::ALIGN_CENTER, 0.0, 0.0));
+ pack_end(*align, Gtk::PACK_SHRINK);
+ align->add(_more_info_button);
+
+ pack_end(_short_description_label, Gtk::PACK_SHRINK, 5);
+
+ _more_info_button.signal_pressed().connect(
+ sigc::mem_fun(*this, &TemplateWidget::_displayTemplateDetails));
+}
+
+
+void TemplateWidget::create()
+{
+ if (_current_template.path == "")
+ return;
+
+ if (_current_template.is_procedural) {}
+ else {
+ sp_file_new(_current_template.path);
+ }
+}
+
+
+void TemplateWidget::display(TemplateLoadTab::TemplateData data)
+{
+ _current_template = data;
+ if (data.is_procedural){}
+ else{
+ _template_name_label.set_text(_current_template.display_name);
+ _template_author_label.set_text(_current_template.author);
+ _short_description_label.set_text(_current_template.short_description);
+
+ Glib::ustring imagePath = Glib::build_filename(Glib::path_get_dirname(_current_template.path), _current_template.preview_name);
+ if (data.preview_name != ""){
+ _preview_image.set(imagePath);
+ _preview_image.show();
+ _preview_render.hide();
+ }
+ else{
+ _preview_render.showImage(data.path);
+ _preview_render.show();
+ _preview_image.hide();
+ }
+ }
+}
+
+
+void TemplateWidget::_displayTemplateDetails()
+{
+ if (_current_template.path == "")
+ return;
+
+ Glib::ustring message = _current_template.display_name + "\n\n" +
+ _("Path: ") + _current_template.path + "\n\n";
+
+ if (_current_template.long_description != "")
+ message += _("Description: ") + _current_template.long_description + "\n\n";
+ if (_current_template.keywords.size() > 0){
+ message += _("Keywords: ");
+ for (std::set<Glib::ustring>::iterator it = _current_template.keywords.begin(); it != _current_template.keywords.end(); ++it)
+ message += *it + " ";
+ message += "\n\n";
+ }
+
+ if (_current_template.author != "")
+ message += _("By: ") + _current_template.author + " " + _current_template.creation_date + "\n\n";
+
+ Gtk::MessageDialog dl(message, false, Gtk::MESSAGE_OTHER);
+ dl.run();
+}
+
+}
+}
diff --git a/src/ui/dialog/template-widget.h b/src/ui/dialog/template-widget.h
new file mode 100644
index 000000000..c7847460f
--- /dev/null
+++ b/src/ui/dialog/template-widget.h
@@ -0,0 +1,47 @@
+/** @file
+ * @brief New From Template - template widget
+ */
+/* Authors:
+ * Jan Darowski <jan.darowski@gmail.com>, supervised by Krzysztof Kosiński
+ *
+ * Copyright (C) 2013 Authors
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifndef INKSCAPE_SEEN_UI_DIALOG_TEMPLATE_WIDGET_H
+#define INKSCAPE_SEEN_UI_DIALOG_TEMPLATE_WIDGET_H
+
+#include "template-load-tab.h"
+#include "filedialogimpl-gtkmm.h"
+#include <gtkmm/box.h>
+
+
+namespace Inkscape {
+namespace UI {
+
+
+class TemplateWidget : public Gtk::VBox
+{
+public:
+ TemplateWidget ();
+ void create();
+ void display(TemplateLoadTab::TemplateData);
+
+private:
+ TemplateLoadTab::TemplateData _current_template;
+
+ Gtk::Button _more_info_button;
+ Gtk::HBox _preview_box;
+ Gtk::Image _preview_image;
+ Dialog::SVGPreview _preview_render;
+ Gtk::Label _short_description_label;
+ Gtk::Label _template_author_label;
+ Gtk::Label _template_name_label;
+
+ void _displayTemplateDetails();
+};
+
+}
+}
+
+#endif
diff --git a/src/verbs.cpp b/src/verbs.cpp
index baac07d60..737d9e150 100644
--- a/src/verbs.cpp
+++ b/src/verbs.cpp
@@ -80,6 +80,7 @@
#include "ui/dialog/inkscape-preferences.h"
#include "ui/dialog/layer-properties.h"
#include "ui/dialog/layers.h"
+#include "ui/dialog/new-from-template.h"
#include "ui/dialog/object-properties.h"
#include "ui/dialog/swatches.h"
#include "ui/dialog/symbols.h"
@@ -880,6 +881,9 @@ void FileVerb::perform(SPAction *action, void *data)
case SP_VERB_FILE_CLOSE_VIEW:
sp_ui_close_view(NULL);
break;
+ case SP_VERB_FILE_TEMPLATES:
+ Inkscape::UI::NewFromTemplate::load_new_from_template();
+ break;
default:
break;
}
@@ -2372,6 +2376,8 @@ Verb *Verb::_base_verbs[] = {
new FileVerb(SP_VERB_FILE_CLOSE_VIEW, "FileClose", N_("_Close"),
N_("Close this document window"), GTK_STOCK_CLOSE),
new FileVerb(SP_VERB_FILE_QUIT, "FileQuit", N_("_Quit"), N_("Quit Inkscape"), GTK_STOCK_QUIT),
+ new FileVerb(SP_VERB_FILE_TEMPLATES, "FileTemplates", N_("_Templates..."),
+ N_("Create new project from template"), INKSCAPE_ICON("dialog-templates")),
// Edit
new EditVerb(SP_VERB_EDIT_UNDO, "EditUndo", N_("_Undo"), N_("Undo last action"),
diff --git a/src/verbs.h b/src/verbs.h
index 5cc2ad12e..c4b01dfbf 100644
--- a/src/verbs.h
+++ b/src/verbs.h
@@ -59,6 +59,7 @@ enum {
SP_VERB_FILE_PREV_DESKTOP,
SP_VERB_FILE_CLOSE_VIEW,
SP_VERB_FILE_QUIT,
+ SP_VERB_FILE_TEMPLATES,
/* Edit */
SP_VERB_EDIT_UNDO,
SP_VERB_EDIT_REDO,