webgen 0.3.6 → 0.3.7
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +1523 -97
- data/Rakefile +11 -24
- data/TODO +22 -9
- data/VERSION +1 -1
- data/bin/webgen +2 -2
- data/bin/webgen-gallery-editor +654 -0
- data/bin/webgen-gui +10 -0
- data/data/webgen/data/ISO-639-2_values_8bits.txt +492 -0
- data/data/webgen/gallery-creator/default.png +0 -0
- data/data/webgen/icon_mapping.yaml +27 -0
- data/data/webgen/resources/emoticons/bigeyes/angry.png +0 -0
- data/data/webgen/resources/emoticons/bigeyes/cool.png +0 -0
- data/data/webgen/resources/emoticons/bigeyes/cry.png +0 -0
- data/data/webgen/resources/emoticons/bigeyes/drunk.png +0 -0
- data/data/webgen/resources/emoticons/bigeyes/lol.png +0 -0
- data/data/webgen/resources/emoticons/bigeyes/oops.png +0 -0
- data/data/webgen/resources/emoticons/bigeyes/sad.png +0 -0
- data/data/webgen/resources/emoticons/bigeyes/sleep.png +0 -0
- data/data/webgen/resources/emoticons/bigeyes/smile.png +0 -0
- data/data/webgen/resources/emoticons/bigeyes/tongue.png +0 -0
- data/data/webgen/resources/emoticons/bigeyes/wink.png +0 -0
- data/data/webgen/resources/emoticons/crystal/angry.png +0 -0
- data/data/webgen/resources/emoticons/crystal/cool.png +0 -0
- data/data/webgen/resources/emoticons/crystal/cry.png +0 -0
- data/data/webgen/resources/emoticons/crystal/drunk.png +0 -0
- data/data/webgen/resources/emoticons/crystal/lol.png +0 -0
- data/data/webgen/resources/emoticons/crystal/oops.png +0 -0
- data/data/webgen/resources/emoticons/crystal/sad.png +0 -0
- data/data/webgen/resources/emoticons/crystal/sleep.png +0 -0
- data/data/webgen/resources/emoticons/crystal/smile.png +0 -0
- data/data/webgen/resources/emoticons/crystal/tongue.png +0 -0
- data/data/webgen/resources/emoticons/crystal/wink.png +0 -0
- data/data/webgen/resources/emoticons/cyclops/angry.png +0 -0
- data/data/webgen/resources/emoticons/cyclops/cool.png +0 -0
- data/data/webgen/resources/emoticons/cyclops/cry.png +0 -0
- data/data/webgen/resources/emoticons/cyclops/drunk.png +0 -0
- data/data/webgen/resources/emoticons/cyclops/lol.png +0 -0
- data/data/webgen/resources/emoticons/cyclops/oops.png +0 -0
- data/data/webgen/resources/emoticons/cyclops/sad.png +0 -0
- data/data/webgen/resources/emoticons/cyclops/sleep.png +0 -0
- data/data/webgen/resources/emoticons/cyclops/smile.png +0 -0
- data/data/webgen/resources/emoticons/cyclops/tongue.png +0 -0
- data/data/webgen/resources/emoticons/cyclops/wink.png +0 -0
- data/data/webgen/resources/emoticons/glass/angry.png +0 -0
- data/data/webgen/resources/emoticons/glass/cool.png +0 -0
- data/data/webgen/resources/emoticons/glass/cry.png +0 -0
- data/data/webgen/resources/emoticons/glass/drunk.png +0 -0
- data/data/webgen/resources/emoticons/glass/lol.png +0 -0
- data/data/webgen/resources/emoticons/glass/oops.png +0 -0
- data/data/webgen/resources/emoticons/glass/sad.png +0 -0
- data/data/webgen/resources/emoticons/glass/sleep.png +0 -0
- data/data/webgen/resources/emoticons/glass/smile.png +0 -0
- data/data/webgen/resources/emoticons/glass/tongue.png +0 -0
- data/data/webgen/resources/emoticons/glass/wink.png +0 -0
- data/data/webgen/resources/emoticons/icqstyle/angry.png +0 -0
- data/data/webgen/resources/emoticons/icqstyle/cool.png +0 -0
- data/data/webgen/resources/emoticons/icqstyle/cry.png +0 -0
- data/data/webgen/resources/emoticons/icqstyle/drunk.png +0 -0
- data/data/webgen/resources/emoticons/icqstyle/lol.png +0 -0
- data/data/webgen/resources/emoticons/icqstyle/oops.png +0 -0
- data/data/webgen/resources/emoticons/icqstyle/sad.png +0 -0
- data/data/webgen/resources/emoticons/icqstyle/sleep.png +0 -0
- data/data/webgen/resources/emoticons/icqstyle/smile.png +0 -0
- data/data/webgen/resources/emoticons/icqstyle/tongue.png +0 -0
- data/data/webgen/resources/emoticons/icqstyle/wink.png +0 -0
- data/data/webgen/resources/emoticons/matrix/angry.gif +0 -0
- data/data/webgen/resources/emoticons/matrix/cool.gif +0 -0
- data/data/webgen/resources/emoticons/matrix/cry.gif +0 -0
- data/data/webgen/resources/emoticons/matrix/drunk.gif +0 -0
- data/data/webgen/resources/emoticons/matrix/lol.gif +0 -0
- data/data/webgen/resources/emoticons/matrix/oops.gif +0 -0
- data/data/webgen/resources/emoticons/matrix/sad.gif +0 -0
- data/data/webgen/resources/emoticons/matrix/sleep.gif +0 -0
- data/data/webgen/resources/emoticons/matrix/smile.gif +0 -0
- data/data/webgen/resources/emoticons/matrix/tongue.gif +0 -0
- data/data/webgen/resources/emoticons/matrix/wink.gif +0 -0
- data/data/webgen/resources/emoticons/smellies/angry.gif +0 -0
- data/data/webgen/resources/emoticons/smellies/cool.gif +0 -0
- data/data/webgen/resources/emoticons/smellies/cry.gif +0 -0
- data/data/webgen/resources/emoticons/smellies/drunk.gif +0 -0
- data/data/webgen/resources/emoticons/smellies/lol.gif +0 -0
- data/data/webgen/resources/emoticons/smellies/oops.gif +0 -0
- data/data/webgen/resources/emoticons/smellies/sad.gif +0 -0
- data/data/webgen/resources/emoticons/smellies/sleep.gif +0 -0
- data/data/webgen/resources/emoticons/smellies/smile.gif +0 -0
- data/data/webgen/resources/emoticons/smellies/tongue.gif +0 -0
- data/data/webgen/resources/emoticons/smellies/wink.gif +0 -0
- data/data/webgen/resources/icons/compressed.png +0 -0
- data/data/webgen/resources/icons/document.png +0 -0
- data/data/webgen/resources/icons/download.png +0 -0
- data/data/webgen/resources/icons/image.png +0 -0
- data/data/webgen/resources/icons/linux.png +0 -0
- data/data/webgen/resources/icons/mac.png +0 -0
- data/data/webgen/resources/icons/pdf.png +0 -0
- data/data/webgen/resources/icons/penguin.png +0 -0
- data/data/webgen/resources/icons/quicktime.png +0 -0
- data/data/webgen/resources/icons/real.png +0 -0
- data/data/webgen/resources/icons/rpm.png +0 -0
- data/data/webgen/resources/icons/sound.png +0 -0
- data/data/webgen/resources/icons/source.png +0 -0
- data/data/webgen/resources/icons/spreadsheet.png +0 -0
- data/data/webgen/resources/icons/text.png +0 -0
- data/data/webgen/resources/icons/vcard.png +0 -0
- data/data/webgen/resources/icons/video.png +0 -0
- data/data/webgen/resources/icons/win.png +0 -0
- data/data/webgen/{images → resources/images}/generated_by_webgen.png +0 -0
- data/data/webgen/{images → resources/images}/valid-css.gif +0 -0
- data/data/webgen/{images → resources/images}/valid-xhtml11.png +0 -0
- data/data/webgen/{images → resources/images}/webgen_logo.png +0 -0
- data/data/webgen/{example/src → website_styles/default}/default.css +0 -0
- data/data/webgen/{example/src → website_styles/default}/default.template +2 -2
- data/data/webgen/website_templates/default/README +6 -0
- data/data/webgen/{example → website_templates/default}/config.yaml +0 -0
- data/data/webgen/{example → website_templates/default}/src/index.page +0 -0
- data/data/webgen/website_templates/personal_hp/README +6 -0
- data/data/webgen/website_templates/personal_hp/src/about.page +12 -0
- data/data/webgen/website_templates/personal_hp/src/index.page +9 -0
- data/data/webgen/website_templates/personal_hp/src/links.page +22 -0
- data/data/webgen/website_templates/personal_hp/src/projects.page +20 -0
- data/data/webgen/website_templates/project/README +7 -0
- data/data/webgen/website_templates/project/src/about.page +12 -0
- data/data/webgen/website_templates/project/src/download.page +15 -0
- data/data/webgen/website_templates/project/src/features.page +8 -0
- data/data/webgen/website_templates/project/src/index.page +9 -0
- data/data/webgen/website_templates/project/src/screenshots.page +18 -0
- data/doc/config.yaml +3 -0
- data/doc/plugin/clidesc.rb +18 -7
- data/doc/plugin/emoticon.rb +29 -0
- data/doc/plugin/extension.rb +15 -16
- data/doc/plugin/listpluginparameters.rb +39 -0
- data/doc/plugin/resources.rb +4 -4
- data/doc/plugin/source.rb +21 -0
- data/doc/src/default.css +7 -4
- data/doc/src/default.template +4 -2
- data/doc/src/documentation/cli.page +1 -1
- data/doc/src/documentation/extending_webgen.page +102 -0
- data/doc/src/documentation/gettingstarted.page +3 -6
- data/doc/src/documentation/index.page +1 -1
- data/doc/src/documentation/plugins/{contenthandler → contenthandlers}/html.page +0 -0
- data/doc/src/documentation/plugins/{contenthandler → contenthandlers}/index.page +0 -0
- data/doc/src/documentation/plugins/{contenthandler → contenthandlers}/markdown.page +0 -0
- data/doc/src/documentation/plugins/{contenthandler → contenthandlers}/rdoc.page +0 -0
- data/doc/src/documentation/plugins/{contenthandler → contenthandlers}/textile.page +0 -0
- data/doc/src/documentation/plugins/{system → coreplugins}/configuration.page +0 -0
- data/doc/src/documentation/plugins/coreplugins/index.page +7 -0
- data/doc/src/documentation/plugins/{system → coreplugins}/logging.page +0 -0
- data/doc/src/documentation/plugins/{resourcemanager.page → coreplugins/resourcemanager.page} +5 -1
- data/doc/src/documentation/plugins/{filehandler → filehandlers}/backing.page +1 -1
- data/doc/src/documentation/plugins/{filehandler → filehandlers}/copy.page +1 -1
- data/doc/src/documentation/plugins/{filehandler/directory.page → filehandlers/directoryhandler.page} +11 -2
- data/doc/src/documentation/plugins/{filehandler/galleryhandler.page → filehandlers/gallery.page} +20 -13
- data/doc/src/documentation/plugins/{filehandler → filehandlers}/index.page +0 -0
- data/doc/src/documentation/plugins/{filehandler/pagehandler.page → filehandlers/page.page} +6 -4
- data/doc/src/documentation/plugins/{filehandler → filehandlers}/template.page +0 -0
- data/doc/src/documentation/plugins/{gallerylayouter → gallerylayouters}/index.page +7 -3
- data/doc/src/documentation/plugins/{htmlvalidator → htmlvalidators}/index.page +0 -0
- data/doc/src/documentation/plugins/{htmlvalidator → htmlvalidators}/xmllint.page +0 -0
- data/doc/src/documentation/plugins/index.page +4 -0
- data/doc/src/documentation/plugins/menustyles/{horizontal-dropdown.page → horizontaldropdown.page} +0 -0
- data/doc/src/documentation/plugins/menustyles/{vertical-dropdown.page → verticaldropdown.page} +1 -1
- data/doc/src/documentation/plugins/miscplugins/index.page +7 -0
- data/doc/src/documentation/plugins/miscplugins/smileyreplacer.page +38 -0
- data/doc/src/documentation/plugins/tags/breadcrumbtrail.page +20 -0
- data/doc/src/documentation/plugins/tags/download.page +23 -0
- data/doc/src/documentation/plugins/tags/resource.page +1 -1
- data/doc/src/documentation/plugins/tags/sitemap.page +1 -2
- data/doc/src/documentation/references/index.page +8 -0
- data/doc/src/documentation/{meta_info_reference.page → references/meta_info_reference.page} +1 -0
- data/doc/src/documentation/references/parameter_reference.page +12 -0
- data/doc/src/documentation/webgen_gallery_editor.page +82 -0
- data/doc/src/download.page +2 -2
- data/doc/src/features.page +3 -2
- data/doc/src/images/screenshots/wge-image.png +0 -0
- data/doc/src/images/screenshots/wge-layout-preview.png +0 -0
- data/doc/src/images/screenshots/wge-main-disabled.png +0 -0
- data/doc/src/images/screenshots/wge-main.png +0 -0
- data/doc/src/index.page +30 -11
- data/doc/src/meta.info +7 -7
- data/doc/src/screenshots.gallery +33 -0
- data/install.rb +1 -1
- data/lib/webgen.rb +275 -0
- data/lib/webgen/composite.rb +1 -1
- data/lib/webgen/gui/common.rb +38 -0
- data/lib/webgen/gui/main.rb +219 -0
- data/lib/webgen/gui/new_website_dlg.rb +125 -0
- data/lib/webgen/listener.rb +1 -1
- data/lib/webgen/node.rb +4 -2
- data/lib/webgen/plugin.rb +167 -100
- data/lib/webgen/plugins/{contenthandler/defaultcontenthandler.rb → contenthandlers/default.rb} +1 -1
- data/lib/webgen/plugins/{contenthandler → contenthandlers}/html.rb +2 -2
- data/lib/webgen/plugins/{contenthandler → contenthandlers}/markdown.rb +2 -2
- data/lib/webgen/plugins/{contenthandler → contenthandlers}/rdoc.rb +2 -2
- data/lib/webgen/plugins/{contenthandler → contenthandlers}/textile.rb +2 -2
- data/lib/webgen/{configuration.rb → plugins/coreplugins/configuration.rb} +34 -14
- data/lib/webgen/{logging.rb → plugins/coreplugins/logging.rb} +4 -4
- data/lib/webgen/plugins/{resourcemanager.rb → coreplugins/resourcemanager.rb} +44 -22
- data/lib/webgen/plugins/{filehandler → filehandlers}/backing.rb +11 -11
- data/lib/webgen/plugins/{filehandler/filecopy.rb → filehandlers/copy.rb} +3 -3
- data/lib/webgen/plugins/{filehandler → filehandlers}/directory.rb +15 -10
- data/lib/webgen/plugins/{filehandler → filehandlers}/filehandler.rb +9 -7
- data/lib/webgen/plugins/{filehandler/picturegallery.rb → filehandlers/gallery.rb} +35 -28
- data/lib/webgen/plugins/{filehandler → filehandlers}/page.rb +30 -15
- data/lib/webgen/plugins/{filehandler → filehandlers}/template.rb +3 -3
- data/lib/webgen/plugins/{gallerylayouter/defaultgallerylayouter.rb → gallerylayouters/default.rb} +11 -11
- data/lib/webgen/plugins/{htmlvalidator/defaulthtmlvalidator.rb → htmlvalidators/default.rb} +1 -1
- data/lib/webgen/plugins/{htmlvalidator → htmlvalidators}/xmllint.rb +2 -2
- data/lib/webgen/plugins/menustyles/{defaultmenustyle.rb → default.rb} +2 -2
- data/lib/webgen/plugins/menustyles/horizontal.rb +2 -2
- data/lib/webgen/plugins/menustyles/horizontal_dropdown.rb +2 -2
- data/lib/webgen/plugins/menustyles/partial.rb +2 -2
- data/lib/webgen/plugins/menustyles/vertical.rb +2 -2
- data/lib/webgen/plugins/menustyles/vertical_dropdown.rb +2 -2
- data/lib/webgen/plugins/miscplugins/smileyreplacer.rb +84 -0
- data/lib/webgen/plugins/{treewalker.rb → miscplugins/treewalker.rb} +1 -1
- data/lib/webgen/plugins/tags/{navbar.rb → breadcrumbtrail.rb} +5 -9
- data/lib/webgen/plugins/tags/date.rb +2 -6
- data/lib/webgen/plugins/tags/download.rb +155 -0
- data/lib/webgen/plugins/tags/executecommand.rb +2 -6
- data/lib/webgen/plugins/tags/includefile.rb +4 -8
- data/lib/webgen/plugins/tags/langbar.rb +2 -6
- data/lib/webgen/plugins/tags/menu.rb +2 -7
- data/lib/webgen/plugins/tags/meta.rb +2 -6
- data/lib/webgen/plugins/tags/relocatable.rb +2 -6
- data/lib/webgen/plugins/tags/sitemap.rb +14 -10
- data/lib/webgen/plugins/tags/tags.rb +25 -18
- data/lib/webgen/plugins/tags/wikilink.rb +2 -6
- metadata +311 -195
- data/doc/src/design.gallery +0 -18
- data/doc/src/designs/curdesign.png +0 -0
- data/doc/src/designs/nostyle.png +0 -0
- data/doc/src/designs/old.png +0 -0
- data/doc/src/documentation/plugins/gallerylayouter/defaultlayouter.page +0 -12
- data/doc/src/documentation/plugins/system/index.page +0 -7
- data/doc/src/documentation/plugins/tags/navbar.page +0 -20
- data/lib/webgen/webgen.rb +0 -271
- data/testsite/config.yaml +0 -7
- data/testsite/src/bghack.png +0 -0
- data/testsite/src/bluecloth.page +0 -102
- data/testsite/src/default.css +0 -146
- data/testsite/src/default.template +0 -33
- data/testsite/src/home.en.page +0 -22
- data/testsite/src/home.page +0 -22
- data/testsite/src/images/bghack.png +0 -0
- data/testsite/src/index.page +0 -21
- data/testsite/src/meta.info +0 -12
- data/testsite/src/news.page +0 -20
- data/testsite/src/news_are_so-cool.de.page +0 -19
- data/testsite/src/noindex/noindex.page +0 -20
- data/testsite/src/pictures/index.page +0 -20
- data/testsite/src/projects.de.page +0 -11
- data/testsite/src/projects.es.page +0 -11
- data/testsite/src/projects.page +0 -17
- data/testsite/src/projects/00.index.de.page +0 -10
- data/testsite/src/projects/01.project2.page +0 -20
- data/testsite/src/projects/02.project1.page +0 -20
- data/testsite/src/projects/05.project3.page +0 -22
- data/testsite/src/projects/index.page +0 -20
- data/testsite/src/projects/subproj/index.page +0 -22
- data/testsite/src/projects/subproj/project3.page +0 -21
- data/testsite/src/rdoc.page +0 -12
- data/testsite/src/redcloth.page +0 -106
data/Rakefile
CHANGED
@@ -32,7 +32,7 @@ require 'rake/testtask'
|
|
32
32
|
# General actions ##############################################################
|
33
33
|
|
34
34
|
$:.push 'lib'
|
35
|
-
require 'webgen/configuration'
|
35
|
+
require 'webgen/plugins/coreplugins/configuration'
|
36
36
|
|
37
37
|
PKG_NAME = "webgen"
|
38
38
|
PKG_VERSION = Webgen::VERSION.join( '.' )
|
@@ -117,12 +117,19 @@ PKG_FILES = FileList.new( [
|
|
117
117
|
fl.exclude( 'doc/output' )
|
118
118
|
end
|
119
119
|
|
120
|
-
task :package => [:gen_files] do
|
120
|
+
task :package => [:gen_files, :create_gal_layout_pics] do
|
121
121
|
chdir 'pkg' do
|
122
122
|
sh "rpaadmin packport #{PKG_NAME}-#{PKG_VERSION}"
|
123
123
|
end
|
124
124
|
end
|
125
125
|
|
126
|
+
CLOBBER << "otherdata/web-for-gallery-pics/output"
|
127
|
+
task :create_gal_layout_pics do
|
128
|
+
chdir 'otherdata/web-for-gallery-pics' do
|
129
|
+
ruby "-I../../lib create_pictures.rb"
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
126
133
|
task :gen_changelog do
|
127
134
|
sh "svn log -r HEAD:1 -v > ChangeLog"
|
128
135
|
end
|
@@ -182,7 +189,7 @@ else
|
|
182
189
|
#### Dependencies, requirements and files
|
183
190
|
|
184
191
|
s.files = PKG_FILES.to_a
|
185
|
-
s.add_dependency( 'cmdparse', '~>
|
192
|
+
s.add_dependency( 'cmdparse', '~> 2.0.0' )
|
186
193
|
|
187
194
|
s.require_path = 'lib'
|
188
195
|
s.autorequire = nil
|
@@ -194,7 +201,7 @@ else
|
|
194
201
|
|
195
202
|
s.has_rdoc = true
|
196
203
|
s.extra_rdoc_files = rd.rdoc_files.reject do |fn| fn =~ /\.rb$/ end.to_a
|
197
|
-
s.rdoc_options = ['--line-numbers', '-m README']
|
204
|
+
s.rdoc_options = ['--line-numbers', '-m', 'README']
|
198
205
|
|
199
206
|
#### Author and project details
|
200
207
|
|
@@ -263,23 +270,3 @@ task :statistics do
|
|
263
270
|
end
|
264
271
|
show_line( "Total", total_lines, total_code )
|
265
272
|
end
|
266
|
-
|
267
|
-
|
268
|
-
def run_testsite( arguments = '' )
|
269
|
-
Dir.chdir("testsite")
|
270
|
-
ruby %{-I../lib #{arguments} ../bin/webgen -V 3 }
|
271
|
-
end
|
272
|
-
|
273
|
-
|
274
|
-
CLOBBER << "testsite/output" << "testsite/webgen.log"
|
275
|
-
desc "Build the test site"
|
276
|
-
task :testsite do
|
277
|
-
run_testsite
|
278
|
-
end
|
279
|
-
|
280
|
-
|
281
|
-
CLOBBER << "testsite/coverage"
|
282
|
-
desc "Run the code coverage tool on the testsite"
|
283
|
-
task :coverage do
|
284
|
-
run_testsite '-rcoverage'
|
285
|
-
end
|
data/TODO
CHANGED
@@ -1,28 +1,28 @@
|
|
1
1
|
---- CURRENT ----
|
2
2
|
|
3
|
-
*
|
3
|
+
* show available styles and templates in docu and in online help (webgen help create)
|
4
|
+
* think about plugin system, @@config etc - should work from within webgen-gui, not only once from webgen
|
5
|
+
* make webgen source installation work with correct cmdparse version
|
6
|
+
* FileCopyHandler#initialize not reentrant
|
4
7
|
* make menu generation faster (for webgen: 5.2s without menus in template, 9.2s with menus!)
|
5
|
-
* modify tags system sothat tags can be specified via a tag directive (like extension with file handlers)
|
6
8
|
* create tests for methods in webgen.rb
|
7
|
-
* webgen -c => output same info as on docu pages
|
8
9
|
* check if duplicate nodes are created??? by using a tag in a template
|
9
10
|
* allow a template to use another template (templates as page description files?) (template2 uses template1)
|
10
11
|
* use code generator to create test file with all tags and all tag parameter configurations
|
11
12
|
|
12
13
|
---- DOCU ----
|
13
14
|
|
14
|
-
*
|
15
|
-
* add keywords to default.template
|
16
|
-
* document which meta info can be used in gallery file for gallery itself, gallery pages and picture pages
|
15
|
+
* examples for each type of plugins in extending webgen section
|
17
16
|
|
18
17
|
---- FUTURE ----
|
19
18
|
|
19
|
+
* Configuration:outDirectory should support FTP and SFTP protocols
|
20
|
+
* refactor code sothat one source file can be used by 0..n processors
|
21
|
+
* tag 'link' which provides a link to the file optionally showing an icon
|
22
|
+
* parameter for including page icons in menus
|
20
23
|
* parameter for setting the orderInfo of index pages so that they always appear as first entry
|
21
|
-
* custom commands provided by plugins
|
22
24
|
* implement plugin which creates nodes for fragment identifiers (#info) in html
|
23
|
-
* convert smiley characters to smileys
|
24
25
|
* include spell checker (ispell, aspell, MS Word OLE on Win32,...)
|
25
|
-
* tag 'download' which links to a download file and appends its size and ev. an image (PDF, ...)
|
26
26
|
* tag 'resume', uses xmlresume2x to provide HTML version of xml resume
|
27
27
|
* multi-lingual picture/gallery files
|
28
28
|
* include exif info for pictures
|
@@ -197,3 +197,16 @@ W do not allow two or more page files in the same language, print warn
|
|
197
197
|
* better docu for backing file handler
|
198
198
|
* make dropdown menus "look" nice in IE
|
199
199
|
* make dropdown menus work in IE -> rather hard to do in a general way
|
200
|
+
* convert smiley characters to smileys
|
201
|
+
* add keywords to default.template
|
202
|
+
* document which meta info can be used in gallery file for gallery itself, gallery pages and picture pages
|
203
|
+
* summary page of all parameters
|
204
|
+
* add note that smellies emoticon pack is from ... -> see temp/smileys dir
|
205
|
+
* docu for webgen-gallery-editor
|
206
|
+
* docu on how to extend webgen
|
207
|
+
* custom commands provided by plugins
|
208
|
+
* tag 'download' which links to a download file and appends its size and ev. an image (PDF, ...)
|
209
|
+
* modify tags system sothat tags can be specified via a tag directive (like extension with file handlers)
|
210
|
+
* adapt clidesc to cmdparse 2.0.0
|
211
|
+
* webgen show config => output same info as on docu pages
|
212
|
+
* test usage for en, deu, eng (ISO-639-2 codes)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.7
|
data/bin/webgen
CHANGED
@@ -0,0 +1,654 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'yaml'
|
5
|
+
require 'ostruct'
|
6
|
+
require 'webgen/plugin'
|
7
|
+
require 'webgen/plugins/coreplugins/configuration'
|
8
|
+
require 'webgen/plugins/filehandlers/gallery'
|
9
|
+
require 'Qt'
|
10
|
+
# Error when loading Qt before RMagick -> error in RMagick undefined method `display' for class `Magick::Image'
|
11
|
+
# report that to qtruby team and RMagick team
|
12
|
+
|
13
|
+
class Gallery
|
14
|
+
|
15
|
+
attr_accessor :meta
|
16
|
+
attr_accessor :relpath
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
set_default_values
|
20
|
+
@relpath = '.'
|
21
|
+
end
|
22
|
+
|
23
|
+
def []( name )
|
24
|
+
@meta[name]
|
25
|
+
end
|
26
|
+
|
27
|
+
def []=( name, value )
|
28
|
+
@meta[name] = value
|
29
|
+
end
|
30
|
+
|
31
|
+
def set_default_values
|
32
|
+
@meta = {}
|
33
|
+
Webgen::Plugin.config[FileHandlers::GalleryFileHandler].params.each do |name, data|
|
34
|
+
@meta[name] = data.value
|
35
|
+
end
|
36
|
+
@meta['mainPage'] = nil
|
37
|
+
@meta['galleryPages'] = nil
|
38
|
+
@meta['thumbnailSize'] = nil
|
39
|
+
end
|
40
|
+
|
41
|
+
def read_file( filename )
|
42
|
+
filedata = YAML::load( File.read( filename ) )
|
43
|
+
|
44
|
+
set_default_values
|
45
|
+
filedata.each {|name, data| @meta[name] = data }
|
46
|
+
@relpath = File.dirname( filename )
|
47
|
+
end
|
48
|
+
|
49
|
+
def write_file( filename )
|
50
|
+
File.open( filename, 'w+' ) {|file| file.write( @meta.to_yaml ) }
|
51
|
+
@relpath= File.dirname( filename )
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
class ImageViewer < Qt::Frame
|
58
|
+
|
59
|
+
def initialize( p )
|
60
|
+
super( p )
|
61
|
+
setFrameStyle( Qt::Frame::StyledPanel | Qt::Frame::Sunken )
|
62
|
+
set_image
|
63
|
+
end
|
64
|
+
|
65
|
+
def set_image( filename = nil)
|
66
|
+
filename = File.join( CorePlugins::Configuration.data_dir, 'resources/images/webgen_logo.png' ) if filename.nil?
|
67
|
+
@image = Qt::Image.new( filename )
|
68
|
+
update
|
69
|
+
end
|
70
|
+
|
71
|
+
def drawContents( painter )
|
72
|
+
return if @image.nil?
|
73
|
+
width = contentsRect.width
|
74
|
+
height = contentsRect.height
|
75
|
+
image = ( width > @image.width && height > @image.height ? @image : @image.smoothScale( width, height, Qt::Image::ScaleMin ) )
|
76
|
+
painter.drawImage( contentsRect.left + (width - image.width) / 2, contentsRect.top + (height - image.height) / 2, image )
|
77
|
+
end
|
78
|
+
|
79
|
+
def sizeHint
|
80
|
+
Qt::Size.new( 320, 200 )
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
class MetaTableNameItem < Qt::TableItem
|
87
|
+
|
88
|
+
def initialize( table, text = '' )
|
89
|
+
super( table, Qt::TableItem::OnTyping )
|
90
|
+
setReplaceable( false )
|
91
|
+
setText( text )
|
92
|
+
add_text_to_list( text )
|
93
|
+
end
|
94
|
+
|
95
|
+
def createEditor
|
96
|
+
cb = Qt::ComboBox.new( table.viewport )
|
97
|
+
cb.setEditable( true )
|
98
|
+
cb.setAutoCompletion( true )
|
99
|
+
cb.insertStringList( table.meta_items )
|
100
|
+
cb.setCurrentText( text )
|
101
|
+
cb
|
102
|
+
end
|
103
|
+
|
104
|
+
def setContentFromEditor( widget )
|
105
|
+
setText( widget.currentText )
|
106
|
+
add_text_to_list( widget.currentText )
|
107
|
+
end
|
108
|
+
|
109
|
+
def add_text_to_list( text )
|
110
|
+
unless text.nil? || text.empty? || table.meta_items.include?( text )
|
111
|
+
table.meta_items << text
|
112
|
+
table.meta_items.sort!
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
class MetaTableValueItem < Qt::TableItem
|
119
|
+
|
120
|
+
def initialize( table, text = '' )
|
121
|
+
super( table, Qt::TableItem::OnTyping )
|
122
|
+
setContent( text )
|
123
|
+
end
|
124
|
+
|
125
|
+
def setContent( content )
|
126
|
+
setText( content.to_s )
|
127
|
+
end
|
128
|
+
|
129
|
+
def getContent
|
130
|
+
case text
|
131
|
+
when 'true' then true
|
132
|
+
when 'false' then false
|
133
|
+
when 'nil' then nil
|
134
|
+
when /\d+/ then text.to_i
|
135
|
+
else text
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
140
|
+
|
141
|
+
|
142
|
+
class MetaDataTable < Qt::Table
|
143
|
+
|
144
|
+
slots 'value_changed(int, int)'
|
145
|
+
|
146
|
+
attr_reader :meta_items
|
147
|
+
|
148
|
+
def initialize( p, meta_items = [], exclude_items = [] )
|
149
|
+
super( 1, 2, p )
|
150
|
+
@meta_items = meta_items.sort!
|
151
|
+
@exclude_items = exclude_items
|
152
|
+
horizontalHeader.setLabel( 0, 'Name' )
|
153
|
+
horizontalHeader.setLabel( 1, 'Value' )
|
154
|
+
setSelectionMode( Qt::Table::Single )
|
155
|
+
setItem( 0, 0, MetaTableNameItem.new( self ) )
|
156
|
+
setItem( 0, 1, MetaTableValueItem.new( self ) )
|
157
|
+
|
158
|
+
connect( horizontalHeader, SIGNAL('clicked(int)'), self, SLOT('setFocus()') )
|
159
|
+
connect( verticalHeader, SIGNAL('clicked(int)'), self, SLOT('setFocus()') )
|
160
|
+
connect( self, SIGNAL('valueChanged(int, int)'), self, SLOT('value_changed( int, int )') )
|
161
|
+
end
|
162
|
+
|
163
|
+
def activateNextCell
|
164
|
+
activate = endEdit( currentRow, currentColumn, true, false )
|
165
|
+
oldRow = currentRow
|
166
|
+
oldCol = currentColumn
|
167
|
+
|
168
|
+
setCurrentCell( currentColumn == 1 ? (currentRow == numRows - 1 ? 0 : currentRow + 1) : currentRow,
|
169
|
+
(currentColumn + 1) % 2 )
|
170
|
+
setCurrentCell( oldRow, oldCol ) if !activate
|
171
|
+
end
|
172
|
+
|
173
|
+
def endEdit( row, col, accept, replace )
|
174
|
+
activate_next_cell = true
|
175
|
+
w = cellWidget( row, col )
|
176
|
+
if col == 0 && !w.nil?
|
177
|
+
if keys( (0...row).to_a + (row+1..numRows-1).to_a ).find {|t| t == w.currentText && t != '' }
|
178
|
+
msg = "You can't add duplicate entries!"
|
179
|
+
elsif @exclude_items.include?( w.currentText )
|
180
|
+
msg = "This meta information can only be defined via other controls!"
|
181
|
+
end
|
182
|
+
if msg
|
183
|
+
Qt::MessageBox.information( self, "Error adding entry", msg )
|
184
|
+
accept = false
|
185
|
+
activate_next_cell = false
|
186
|
+
end
|
187
|
+
end
|
188
|
+
super( row, col, accept, replace )
|
189
|
+
activate_next_cell
|
190
|
+
end
|
191
|
+
|
192
|
+
def fill( items )
|
193
|
+
setNumRows( items.length + 1 )
|
194
|
+
items.each_with_index do |data, index|
|
195
|
+
setItem( index, 0, MetaTableNameItem.new( self, data[0] ) )
|
196
|
+
setItem( index, 1, MetaTableValueItem.new( self, data[1] ) )
|
197
|
+
end
|
198
|
+
setItem( items.length, 0, MetaTableNameItem.new( self ) )
|
199
|
+
setItem( items.length, 1, MetaTableValueItem.new( self ) )
|
200
|
+
end
|
201
|
+
|
202
|
+
def keys( rows = (0..(numRows-1)).to_a )
|
203
|
+
retval = []
|
204
|
+
rows.each do |i|
|
205
|
+
retval << text( i, 0 )
|
206
|
+
end
|
207
|
+
retval
|
208
|
+
end
|
209
|
+
|
210
|
+
def meta_info
|
211
|
+
retval = {}
|
212
|
+
0.upto( numRows - 2 ) do |i|
|
213
|
+
retval[text( i, 0 )] = item( i, 1 ).getContent
|
214
|
+
end
|
215
|
+
retval
|
216
|
+
end
|
217
|
+
|
218
|
+
def value_changed( row, col )
|
219
|
+
col0empty = text( row, 0 ).nil? || text( row, 0).empty?
|
220
|
+
col1empty = text( row, 1 ).nil? || text( row, 1).empty?
|
221
|
+
if row == numRows - 1 && (!col0empty || !col1empty)
|
222
|
+
setNumRows( numRows + 1 )
|
223
|
+
setItem( numRows - 1, 0, MetaTableNameItem.new( self ) )
|
224
|
+
setItem( numRows - 1, 1, MetaTableValueItem.new( self ) )
|
225
|
+
elsif !(row == numRows - 1) && col0empty && col1empty
|
226
|
+
removeRow( row )
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
def keyReleaseEvent( event )
|
231
|
+
if event.key == Qt::Key_Delete
|
232
|
+
if currentSelection == -1
|
233
|
+
setText( currentRow, currentColumn, '' )
|
234
|
+
emit valueChanged( currentRow, currentColumn )
|
235
|
+
else
|
236
|
+
sel = selection( currentSelection )
|
237
|
+
sel.topRow.upto( sel.bottomRow ) do |row|
|
238
|
+
sel.leftCol.upto( sel.rightCol) do |col|
|
239
|
+
setText( row, col, '' )
|
240
|
+
emit valueChanged( row, col )
|
241
|
+
end
|
242
|
+
end
|
243
|
+
end
|
244
|
+
else
|
245
|
+
event.ignore
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
end
|
250
|
+
|
251
|
+
|
252
|
+
class MyTextEdit < Qt::TextEdit
|
253
|
+
|
254
|
+
signals 'myReturnPressed()'
|
255
|
+
|
256
|
+
def keyPressEvent( event )
|
257
|
+
if (event.key == Qt::Key_Return || event.key == Qt::Key_Enter) && (event.state & Qt::ControlButton == Qt::ControlButton)
|
258
|
+
emit myReturnPressed()
|
259
|
+
else
|
260
|
+
super
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
end
|
265
|
+
|
266
|
+
|
267
|
+
class ImageFileDrag < Qt::DragObject
|
268
|
+
|
269
|
+
def initialize( text, parent )
|
270
|
+
super( parent )
|
271
|
+
@text = text
|
272
|
+
end
|
273
|
+
|
274
|
+
def format( param )
|
275
|
+
if param == 0
|
276
|
+
"app/webgen-image-file" #how to define a user mime type correctly?
|
277
|
+
else
|
278
|
+
nil
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
def encodedData( format )
|
283
|
+
@text
|
284
|
+
end
|
285
|
+
|
286
|
+
end
|
287
|
+
|
288
|
+
class ImageFileList < Qt::ListBox
|
289
|
+
|
290
|
+
def initialize( parent, mainWindow )
|
291
|
+
super( parent )
|
292
|
+
setAcceptDrops( true )
|
293
|
+
@dragPos = nil
|
294
|
+
@mainWindow = mainWindow
|
295
|
+
Qt::ToolTip.add( self, "You can order the images by dragging and dropping the image names (sets the <b>orderInfo</b> meta information)" )
|
296
|
+
end
|
297
|
+
|
298
|
+
def fill_list( items )
|
299
|
+
items.sort do |a,b|
|
300
|
+
aoi = (@mainWindow.gallery[a].nil? ? 0 : @mainWindow.gallery[a]['orderInfo'].to_s.to_i)
|
301
|
+
boi = (@mainWindow.gallery[b].nil? ? 0 : @mainWindow.gallery[b]['orderInfo'].to_s.to_i)
|
302
|
+
aoi <=> boi
|
303
|
+
end.each {|image| insertItem( image )}
|
304
|
+
end
|
305
|
+
|
306
|
+
def dragEnterEvent( event )
|
307
|
+
event.accept if event.provides( "app/webgen-image-file" )
|
308
|
+
end
|
309
|
+
|
310
|
+
def dropEvent( event )
|
311
|
+
text = event.encodedData( "app/webgen-image-file" ).to_s
|
312
|
+
dropIndex = index( itemAt( event.pos ) )
|
313
|
+
|
314
|
+
blockSignals( true )
|
315
|
+
@mainWindow.save_image_meta_info
|
316
|
+
removeItem( currentItem )
|
317
|
+
insertItem( text, dropIndex )
|
318
|
+
@mainWindow.save_image_meta_info
|
319
|
+
blockSignals( false )
|
320
|
+
|
321
|
+
0.upto( count - 1 ) {|i| (@mainWindow.gallery[text( i )] ||= {})['orderInfo'] = i }
|
322
|
+
|
323
|
+
setCurrentItem( dropIndex )
|
324
|
+
end
|
325
|
+
|
326
|
+
def mousePressEvent( event )
|
327
|
+
super
|
328
|
+
@dragPos = event.pos
|
329
|
+
end
|
330
|
+
|
331
|
+
def mouseReleaseEvent( event )
|
332
|
+
super
|
333
|
+
@dragPos = nil
|
334
|
+
end
|
335
|
+
|
336
|
+
def mouseMoveEvent( event )
|
337
|
+
if @dragPos && (@dragPos - event.pos).manhattanLength > Qt::Application.startDragDistance
|
338
|
+
d = ImageFileDrag.new( currentText, self )
|
339
|
+
d.dragMove
|
340
|
+
@dragPos = nil
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
344
|
+
end
|
345
|
+
|
346
|
+
|
347
|
+
class GalleryWindow < Qt::MainWindow
|
348
|
+
|
349
|
+
slots 'new()', 'open()', 'save()', 'save_as()', 'image_selected(const QString &)',
|
350
|
+
'init_image_list()', 'select_next_image()', "assign_pic_names()"
|
351
|
+
|
352
|
+
attr_reader :gallery
|
353
|
+
|
354
|
+
def initialize
|
355
|
+
super
|
356
|
+
setCaption( "Webgen Gallery Editor" )
|
357
|
+
|
358
|
+
@gallery = nil
|
359
|
+
@curfile = nil
|
360
|
+
setup_menus
|
361
|
+
setup_window
|
362
|
+
centralWidget.setEnabled( false )
|
363
|
+
end
|
364
|
+
|
365
|
+
def new
|
366
|
+
gallery = Gallery.new
|
367
|
+
if save_as( gallery )
|
368
|
+
@gallery = gallery
|
369
|
+
init_widgets
|
370
|
+
end
|
371
|
+
end
|
372
|
+
|
373
|
+
def open
|
374
|
+
openDialog = Qt::FileDialog.new( '.', 'Gallery files (*.gallery)', self, 'Open file...', true )
|
375
|
+
openDialog.setMode( Qt::FileDialog::ExistingFile )
|
376
|
+
open_file( openDialog.selectedFile ) if openDialog.exec == Qt::Dialog::Accepted
|
377
|
+
end
|
378
|
+
|
379
|
+
def open_file( file )
|
380
|
+
@curfile = file
|
381
|
+
@gallery = Gallery.new
|
382
|
+
@gallery.read_file( file )
|
383
|
+
init_widgets
|
384
|
+
end
|
385
|
+
|
386
|
+
def save
|
387
|
+
update_gallery
|
388
|
+
@gallery.write_file( @curfile )
|
389
|
+
end
|
390
|
+
|
391
|
+
def save_as( gallery = @gallery )
|
392
|
+
ret_val = false
|
393
|
+
saveDialog = Qt::FileDialog.new( '.', 'Gallery files (*.gallery)', self, 'Select new file...', true )
|
394
|
+
saveDialog.setMode( Qt::FileDialog::AnyFile )
|
395
|
+
if saveDialog.exec == Qt::Dialog::Accepted
|
396
|
+
fname = saveDialog.selectedFile
|
397
|
+
fname += '.gallery' if File.extname( fname ) == ''
|
398
|
+
gallery.write_file( fname )
|
399
|
+
@curfile = fname
|
400
|
+
ret_val = true
|
401
|
+
end
|
402
|
+
ret_val
|
403
|
+
end
|
404
|
+
|
405
|
+
def image_selected( name )
|
406
|
+
save_image_meta_info
|
407
|
+
@last_selected_image = name
|
408
|
+
|
409
|
+
if @gallery[name]
|
410
|
+
@imageTitle.setText( @gallery[name].delete( 'title' ) )
|
411
|
+
@imageDescription.setText( @gallery[name].delete( 'description' ) )
|
412
|
+
@picMetaTable.fill( @gallery[name] )
|
413
|
+
end
|
414
|
+
@image.set_image( File.join( @gallery.relpath, name ) )
|
415
|
+
end
|
416
|
+
|
417
|
+
def select_next_image
|
418
|
+
if @imageList.currentItem == @imageList.count - 1
|
419
|
+
@imageList.setCurrentItem( 0 ) if @imageList.count > 0
|
420
|
+
else
|
421
|
+
@imageList.setCurrentItem( @imageList.currentItem + 1 )
|
422
|
+
end
|
423
|
+
end
|
424
|
+
|
425
|
+
def assign_pic_names
|
426
|
+
0.upto( @imageList.count - 1 ) do |i|
|
427
|
+
@gallery[@imageList.text( i )] ||= {}
|
428
|
+
if @gallery[@imageList.text( i )]['title'].to_s.empty?
|
429
|
+
@gallery[@imageList.text( i )]['title'] = @imageList.text( i )
|
430
|
+
end
|
431
|
+
end
|
432
|
+
end
|
433
|
+
|
434
|
+
def save_image_meta_info
|
435
|
+
if @last_selected_image
|
436
|
+
@gallery[@last_selected_image] = @picMetaTable.meta_info
|
437
|
+
@gallery[@last_selected_image]['title'] = @imageTitle.text
|
438
|
+
@gallery[@last_selected_image]['description'] = @imageDescription.text
|
439
|
+
@last_selected_image = nil
|
440
|
+
end
|
441
|
+
end
|
442
|
+
|
443
|
+
#######
|
444
|
+
private
|
445
|
+
#######
|
446
|
+
|
447
|
+
def page_meta_items
|
448
|
+
['title', 'description', 'orderInfo', 'template', 'inMenu']
|
449
|
+
end
|
450
|
+
|
451
|
+
def gallery_items
|
452
|
+
['title', 'layout', 'files', 'imagesPerPage',
|
453
|
+
'imagePageInMenu', 'galleryPageInMenu', 'mainPageInMenu',
|
454
|
+
'imagePageTemplate', 'galleryPageTemplate', 'mainPageTemplate',
|
455
|
+
'galleryPages', 'mainPage', 'galleryOrderInfo', 'thumbnailSize' ]
|
456
|
+
end
|
457
|
+
|
458
|
+
def init_widgets
|
459
|
+
return if @gallery.nil?
|
460
|
+
|
461
|
+
gallery_items.each do |t|
|
462
|
+
case @widgets[t]
|
463
|
+
when Qt::LineEdit then @widgets[t].setText( @gallery[t] )
|
464
|
+
when Qt::SpinBox then @widgets[t].setValue( @gallery[t] )
|
465
|
+
when Qt::CheckBox then @widgets[t].setChecked( @gallery[t] )
|
466
|
+
when Qt::ComboBox then @widgets[t].setCurrentText( @gallery[t] )
|
467
|
+
when MetaDataTable then @widgets[t].fill( @gallery[t] ) if @gallery[t]
|
468
|
+
end
|
469
|
+
end
|
470
|
+
@picMetaTable.fill( [] )
|
471
|
+
init_image_list
|
472
|
+
@image.set_image
|
473
|
+
centralWidget.setEnabled( true )
|
474
|
+
end
|
475
|
+
|
476
|
+
def update_gallery
|
477
|
+
items = gallery_items
|
478
|
+
items.each do |t|
|
479
|
+
case @widgets[t]
|
480
|
+
when Qt::LineEdit then @gallery[t] = @widgets[t].text
|
481
|
+
when Qt::SpinBox then @gallery[t] = @widgets[t].value
|
482
|
+
when Qt::CheckBox then @gallery[t] = @widgets[t].checked?
|
483
|
+
when Qt::ComboBox then @gallery[t] = @widgets[t].currentText
|
484
|
+
when MetaDataTable then @gallery[t] = @widgets[t].meta_info
|
485
|
+
end
|
486
|
+
end
|
487
|
+
images = []
|
488
|
+
0.upto( @imageList.numRows ) {|i| images << @imageList.text( i ) }
|
489
|
+
|
490
|
+
save_image_meta_info
|
491
|
+
@gallery.meta.delete_if do |name, data|
|
492
|
+
!images.include?( name ) && !items.include?( name )
|
493
|
+
end
|
494
|
+
end
|
495
|
+
|
496
|
+
def init_image_list
|
497
|
+
@imageList.clear
|
498
|
+
images = Dir[File.join( @gallery.relpath, @widgets['files'].text)].collect {|i| i.sub( /#{@gallery.relpath + File::SEPARATOR}/, '' ) }
|
499
|
+
@imageList.fill_list( images )
|
500
|
+
@last_selected_image = nil
|
501
|
+
end
|
502
|
+
|
503
|
+
def setup_menus
|
504
|
+
filemenu = Qt::PopupMenu.new( self )
|
505
|
+
filemenu.insertItem( "&New...", self, SLOT("new()"), Qt::KeySequence.new( CTRL+Key_N ) )
|
506
|
+
filemenu.insertItem( "&Open...", self, SLOT("open()"), Qt::KeySequence.new( CTRL+Key_O ) )
|
507
|
+
filemenu.insertItem( "&Save", self, SLOT("save()"), Qt::KeySequence.new( CTRL+Key_S ) )
|
508
|
+
filemenu.insertItem( "&Save as...", self, SLOT("save_as()") )
|
509
|
+
filemenu.insertItem( "&Quit", $app, SLOT("quit()"), Qt::KeySequence.new( CTRL+Key_Q ) )
|
510
|
+
|
511
|
+
picmenu = Qt::PopupMenu.new( self )
|
512
|
+
picmenu.insertItem( "&Assign default names", self, SLOT("assign_pic_names()") )
|
513
|
+
|
514
|
+
menubar = Qt::MenuBar.new( self )
|
515
|
+
menubar.insertItem( "&File", filemenu )
|
516
|
+
menubar.insertItem( "&Images", picmenu )
|
517
|
+
end
|
518
|
+
|
519
|
+
def setup_window
|
520
|
+
mainFrame = Qt::Widget.new( self )
|
521
|
+
|
522
|
+
@widgets = {}
|
523
|
+
labels = {}
|
524
|
+
@widgets['title'] = Qt::LineEdit.new( mainFrame )
|
525
|
+
labels['title'] = [0, Qt::Label.new( @widgets['title'], "Gallery title:", mainFrame )]
|
526
|
+
|
527
|
+
@widgets['files'] = Qt::LineEdit.new( mainFrame )
|
528
|
+
connect( @widgets['files'], SIGNAL('textChanged(const QString&)'), self, SLOT('init_image_list()') )
|
529
|
+
labels['files'] = [1, Qt::Label.new( @widgets['files'], "File pattern:", mainFrame )]
|
530
|
+
|
531
|
+
@widgets['layout'] = Qt::ComboBox.new( true, mainFrame )
|
532
|
+
@widgets['layout'].setMaximumWidth( 200 )
|
533
|
+
Webgen::Plugin.config[GalleryLayouters::DefaultGalleryLayouter].layouts.keys.each do |name|
|
534
|
+
@widgets['layout'].insertItem( Qt::Pixmap.new( File.join( CorePlugins::Configuration.data_dir, 'gallery-creator', "#{name}.png" ) ), \
|
535
|
+
name )
|
536
|
+
end
|
537
|
+
@widgets['layout'].listBox.setMinimumWidth( @widgets['layout'].listBox.maxItemWidth + 20 )
|
538
|
+
labels['layout'] = [2, Qt::Label.new( @widgets['layout'], "Gallery layout:", mainFrame )]
|
539
|
+
|
540
|
+
@widgets['imagesPerPage'] = Qt::SpinBox.new( 0, 1000, 1, mainFrame )
|
541
|
+
labels['imagesPerPage'] = [3, Qt::Label.new( @widgets['imagesPerPage'], "Images per page:", mainFrame )]
|
542
|
+
|
543
|
+
@widgets['galleryOrderInfo'] = Qt::SpinBox.new( 0, 1000, 1, mainFrame )
|
544
|
+
labels['galleryOrderInfo'] = [4, Qt::Label.new( @widgets['galleryOrderInfo'], "Start <orderInfo> for gallery pages:", mainFrame )]
|
545
|
+
|
546
|
+
@widgets['thumbnailSize'] = Qt::LineEdit.new( mainFrame )
|
547
|
+
@widgets['thumbnailSize'].setValidator( Qt::RegExpValidator.new( Qt::RegExp.new( "\\d+x\\d+" ), mainFrame ) )
|
548
|
+
labels['thumbnailSize'] = [5, Qt::Label.new( @widgets['thumbnailSize'], "Thumbnail size:", mainFrame )]
|
549
|
+
|
550
|
+
@widgets['mainPageTemplate'] = Qt::LineEdit.new( mainFrame )
|
551
|
+
labels['mainPageTemplate'] = [6, Qt::Label.new( @widgets['mainPageTemplate'], "Template for main page:", mainFrame )]
|
552
|
+
|
553
|
+
@widgets['galleryPageTemplate'] = Qt::LineEdit.new( mainFrame )
|
554
|
+
labels['galleryPageTemplate'] = [7, Qt::Label.new( @widgets['galleryPageTemplate'], "Template for gallery pages:", mainFrame )]
|
555
|
+
|
556
|
+
@widgets['imagePageTemplate'] = Qt::LineEdit.new( mainFrame )
|
557
|
+
labels['imagePageTemplate'] = [8, Qt::Label.new( @widgets['imagePageTemplate'], "Template for image pages:", mainFrame )]
|
558
|
+
|
559
|
+
@widgets['mainPageInMenu'] = Qt::CheckBox.new( "Main page in menu?", mainFrame )
|
560
|
+
labels['mainPageInMenu'] = [9, nil]
|
561
|
+
|
562
|
+
@widgets['galleryPageInMenu'] = Qt::CheckBox.new( "Gallery pages in menu?", mainFrame )
|
563
|
+
labels['galleryPageInMenu'] = [10, nil]
|
564
|
+
|
565
|
+
@widgets['imagePageInMenu'] = Qt::CheckBox.new( "Image pages in menu?", mainFrame )
|
566
|
+
labels['imagePageInMenu'] = [11, nil]
|
567
|
+
|
568
|
+
layout = Qt::GridLayout.new( @widgets.length, 2 )
|
569
|
+
layout.setSpacing( 5 )
|
570
|
+
labels.each_with_index do |data, index|
|
571
|
+
layout.addWidget( data[1][1], data[1][0], 0 ) if data[1][1]
|
572
|
+
layout.addWidget( @widgets[data[0]], data[1][0], 1 )
|
573
|
+
end
|
574
|
+
|
575
|
+
leftLayout = Qt::VBoxLayout.new
|
576
|
+
leftLayout.setSpacing( 5 )
|
577
|
+
leftLayout.addLayout( layout )
|
578
|
+
leftLayout.addStretch
|
579
|
+
|
580
|
+
@widgets['mainPage'] = MetaDataTable.new( mainFrame, page_meta_items )
|
581
|
+
@widgets['mainPage'].setColumnWidth( 0, 150 )
|
582
|
+
@widgets['mainPage'].setColumnWidth( 1, 150 )
|
583
|
+
@widgets['mainPage'].setMinimumWidth( 350 )
|
584
|
+
@widgets['galleryPages'] = MetaDataTable.new( mainFrame, page_meta_items )
|
585
|
+
@widgets['galleryPages'].setColumnWidth( 0, 150 )
|
586
|
+
@widgets['galleryPages'].setColumnWidth( 1, 150 )
|
587
|
+
|
588
|
+
rightLayout = Qt::VBoxLayout.new
|
589
|
+
rightLayout.setSpacing( 5 )
|
590
|
+
rightLayout.addWidget( Qt::Label.new( 'Meta information for main page:', mainFrame ) )
|
591
|
+
rightLayout.addWidget( @widgets['mainPage'] )
|
592
|
+
rightLayout.addWidget( Qt::Label.new( 'Meta information for gallery pages:', mainFrame ) )
|
593
|
+
rightLayout.addWidget( @widgets['galleryPages'] )
|
594
|
+
|
595
|
+
galLayout = Qt::HBoxLayout.new
|
596
|
+
galLayout.setSpacing( 20 )
|
597
|
+
galLayout.addLayout( leftLayout )
|
598
|
+
galLayout.addLayout( rightLayout )
|
599
|
+
galLayout.setStretchFactor( rightLayout, 1 )
|
600
|
+
|
601
|
+
|
602
|
+
@image = ImageViewer.new( mainFrame )
|
603
|
+
@image.setSizePolicy( Qt::SizePolicy::Expanding, Qt::SizePolicy::Expanding )
|
604
|
+
@image.setMinimumSize( 320, 200 )
|
605
|
+
|
606
|
+
@imageTitle = Qt::LineEdit.new( mainFrame )
|
607
|
+
imageTitle = Qt::Label.new( @imageTitle, "Title:", mainFrame )
|
608
|
+
@imageDescription = MyTextEdit.new( mainFrame )
|
609
|
+
@imageDescription.setTextFormat( Qt::PlainText )
|
610
|
+
imageDescription = Qt::Label.new( @imageDescription, "Description:", mainFrame )
|
611
|
+
connect( @imageTitle, SIGNAL('returnPressed()'), @imageDescription, SLOT('setFocus()') )
|
612
|
+
connect( @imageDescription, SIGNAL('myReturnPressed()'), self, SLOT('select_next_image()') )
|
613
|
+
connect( @imageDescription, SIGNAL('myReturnPressed()'), @imageTitle, SLOT('setFocus()') )
|
614
|
+
|
615
|
+
@imageList = ImageFileList.new( mainFrame, self )
|
616
|
+
@imageList.setMaximumWidth( 300 )
|
617
|
+
connect( @imageList, SIGNAL('highlighted(const QString &)'), self, SLOT('image_selected( const QString &)') )
|
618
|
+
@picMetaTable = MetaDataTable.new( mainFrame, page_meta_items - ['title', 'description'], ['title', 'description'] )
|
619
|
+
@picMetaTable.setColumnWidth( 0, 100 )
|
620
|
+
@picMetaTable.setColumnWidth( 1, 100 )
|
621
|
+
@picMetaTable.setMaximumWidth( 300 )
|
622
|
+
|
623
|
+
imageLayout = Qt::GridLayout.new( 3, 3 )
|
624
|
+
imageLayout.setSpacing( 6 )
|
625
|
+
imageLayout.addWidget( @imageList, 0, 0 )
|
626
|
+
imageLayout.addMultiCellWidget( @picMetaTable, 1, 2, 0, 0 )
|
627
|
+
imageLayout.addMultiCellWidget( @image, 0, 0, 1, 2 )
|
628
|
+
imageLayout.addWidget( imageTitle, 1, 1 )
|
629
|
+
imageLayout.addWidget( @imageTitle, 1, 2 )
|
630
|
+
imageLayout.addWidget( imageDescription, 2, 1, Qt::AlignTop )
|
631
|
+
imageLayout.addWidget( @imageDescription, 2, 2 )
|
632
|
+
imageLayout.setRowStretch( 0, 1 )
|
633
|
+
|
634
|
+
mainLayout = Qt::VBoxLayout.new( mainFrame )
|
635
|
+
mainLayout.setMargin( 10 )
|
636
|
+
mainLayout.setSpacing( 20 )
|
637
|
+
mainLayout.addLayout( galLayout )
|
638
|
+
mainLayout.addLayout( imageLayout )
|
639
|
+
mainLayout.setStretchFactor( imageLayout, 1 )
|
640
|
+
|
641
|
+
setCentralWidget( mainFrame )
|
642
|
+
end
|
643
|
+
|
644
|
+
end
|
645
|
+
|
646
|
+
Webgen::Plugin['Configuration'].init_all
|
647
|
+
|
648
|
+
$app = Qt::Application.new( ARGV )
|
649
|
+
mainWindow = GalleryWindow.new
|
650
|
+
$app.setMainWidget( mainWindow )
|
651
|
+
mainWindow.show
|
652
|
+
mainWindow.open_file( ARGV[0] ) if ARGV.length > 0
|
653
|
+
$app.exec
|
654
|
+
|