Merge lp:~nico-inattendu/luciole/bp_cinelerra_export into lp:luciole/0.8

Proposed by NicoInattendu
Status: Merged
Merged at revision: not available
Proposed branch: lp:~nico-inattendu/luciole/bp_cinelerra_export
Merge into: lp:luciole/0.8
Prerequisite: lp:~nico-inattendu/luciole/bp-libglade-to-gtkbuilder
Diff against target: 1159 lines (+967/-21)
12 files modified
Makefile (+20/-3)
RELEASE (+19/-0)
_version.py (+5/-10)
lucioLib/gui/gui_controller.py (+12/-1)
lucioLib/gui/luciole_export_tool_window.py (+183/-0)
lucioLib/lucioExport/__init__.py (+1/-0)
lucioLib/lucioExport/luciole_export_tool.py (+281/-0)
lucioLib/luciole_controller.py (+12/-4)
lucioLib/luciole_et.py (+60/-0)
templates/cinelerra_template.xml (+104/-0)
ui/export_file.glade (+254/-0)
ui/luciole.glade (+16/-3)
To merge this branch: bzr merge lp:~nico-inattendu/luciole/bp_cinelerra_export
Reviewer Review Type Date Requested Status
NicoInattendu Approve
Review via email: mp+15734@code.launchpad.net
To post a comment you must log in.
Revision history for this message
NicoInattendu (nico-inattendu) wrote :

Approved .
Specification wiki shall be updated.
Translation needed

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'Makefile'
--- Makefile 2009-12-07 07:25:24 +0000
+++ Makefile 2009-12-07 07:25:24 +0000
@@ -44,6 +44,8 @@
44SOURCE_DIR=./44SOURCE_DIR=./
45PREFIX ?= /usr45PREFIX ?= /usr
46LIBDIR ?= /lib46LIBDIR ?= /lib
47BASEDIR= `basename $(PWD)`
48
47all: compile49all: compile
48 @echo "Done"50 @echo "Done"
49 @echo "Type: 'make install' now"51 @echo "Type: 'make install' now"
@@ -91,7 +93,7 @@
91install: make-install-dirs93install: make-install-dirs
92 install -m 644 $(CURDIR)/$(SOURCE_DIR)luciole.py $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole94 install -m 644 $(CURDIR)/$(SOURCE_DIR)luciole.py $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole
93 install -m 644 $(CURDIR)/$(SOURCE_DIR)_version.py $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole95 install -m 644 $(CURDIR)/$(SOURCE_DIR)_version.py $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole
94 install -m 644 $(CURDIR)/$(SOURCE_DIR)ui/luciole.glade $(DESTDIR)$(PREFIX)/share/luciole/ui96 install -m 644 $(CURDIR)/$(SOURCE_DIR)ui/*.glade $(DESTDIR)$(PREFIX)/share/luciole/ui
95 install -m 644 $(CURDIR)/$(SOURCE_DIR)images/*.png $(DESTDIR)$(PREFIX)/share/luciole/images97 install -m 644 $(CURDIR)/$(SOURCE_DIR)images/*.png $(DESTDIR)$(PREFIX)/share/luciole/images
96 install -m 644 $(CURDIR)/$(SOURCE_DIR)sounds/*.ogg $(DESTDIR)$(PREFIX)/share/luciole/sounds98 install -m 644 $(CURDIR)/$(SOURCE_DIR)sounds/*.ogg $(DESTDIR)$(PREFIX)/share/luciole/sounds
97 install -m 644 $(CURDIR)/$(SOURCE_DIR)lucioLib/*.py $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole/lucioLib/99 install -m 644 $(CURDIR)/$(SOURCE_DIR)lucioLib/*.py $(DESTDIR)$(PREFIX)$(LIBDIR)/luciole/lucioLib/
@@ -127,8 +129,12 @@
127 `echo $$f | sed "s|^po|$(DESTDIR)$(PREFIX)/share/luciole/po|"` ; \129 `echo $$f | sed "s|^po|$(DESTDIR)$(PREFIX)/share/luciole/po|"` ; \
128 done130 done
129tarball: clean131tarball: clean
130 tar --exclude .bzr -czvf ../luciole.tar.gz ../luciole132 @echo "Creating debian $(BASEDIR).tar.gz archive in parent dir "
133 @cd .. && tar --exclude .bzr --exclude .bzrignore -czf $(BASEDIR).tar.gz $(BASEDIR)
131134
135debian-orig: clean cleanbzr
136 @echo "Creating debian $(BASEDIR).orig.tar.gz archive in parent dir"
137 @cd .. && tar --exclude .bzr --exclude .bzrignore --exclude debian -czf $(BASEDIR).orig.tar.gz $(BASEDIR)
132 138
133uninstall:139uninstall:
134 rm -rf $(DESTDIR)$(PREFIX)/share/luciole140 rm -rf $(DESTDIR)$(PREFIX)/share/luciole
@@ -136,5 +142,16 @@
136 rm -rf $(DESTDIR)$(PREFIX)/bin/luciole142 rm -rf $(DESTDIR)$(PREFIX)/bin/luciole
137 rm -f $(DESTDIR)$(PREFIX)/share/applications/luciole.desktop143 rm -f $(DESTDIR)$(PREFIX)/share/applications/luciole.desktop
138 rm -f $(DESTDIR)$(PREFIX)/share/pixmaps/luciole.xpm144 rm -f $(DESTDIR)$(PREFIX)/share/pixmaps/luciole.xpm
145
139clean :146clean :
140 find . -name "*.py[co]" -exec rm -f {} \;147 @echo "Removing temporary files"
148 @find . -name "*.py[co]" -exec rm -f {} \;
149 @find . -name "*~" -exec rm -f {} \;
150 @find . -name "*.swp" -exec rm -f {} \;
151
152cleanbzr :
153 rm -rf .bzr
154 rm -f .bzrignore
155
156
157
141158
=== modified file 'RELEASE'
--- RELEASE 2009-11-26 05:39:02 +0000
+++ RELEASE 2009-12-07 07:25:24 +0000
@@ -1,3 +1,22 @@
10.8.1_alpha1 Release : Thu, 03 Dec 2009
2-------------------------------------------------------------------------------
3The Luciole team is proud to announce the release 0.8.1_alpha1 of luciole.
4
5This Release Version is a testing issue. It can not be considered as a final issue
6The goal of this version is to test the conversion from libglade to gtk builder and the export to cinelerra
7
8Warning the translations are not uptodate
9
10List of implemented blueprints :
11------------------------------
12libglade-to-gtkbuilder : Replace Libglade by gtk.builder
13cinelerra-export : Add export to cinelerra file format
14
15
16
17
18
19
10.7.4 Release : Thu, 26 Nov 2009 200.7.4 Release : Thu, 26 Nov 2009
2-------------------------------------------------------------------------------21-------------------------------------------------------------------------------
3The Luciole team is proud to announce the release 0.7.4 of luciole.22The Luciole team is proud to announce the release 0.7.4 of luciole.
423
=== modified file '_version.py'
--- _version.py 2009-12-07 07:25:24 +0000
+++ _version.py 2009-12-07 07:25:24 +0000
@@ -4,17 +4,12 @@
4So don't edit it. :)4So don't edit it. :)
5"""5"""
66
7<<<<<<< TREE7version_info = {'branch_nick': u'bp_cinelerra_export',
8version_info = {'branch_nick': u'luciole-0.7.4',8 'build_date': '2009-12-03 21:33:50 +0400',
9 'build_date': '2009-11-26 09:27:13 +0400',
10=======
11version_info = {'branch_nick': u'bp-libglade-to-gtkbuilder',
12 'build_date': '2009-12-02 11:56:49 +0400',
13>>>>>>> MERGE-SOURCE
14 'clean': None,9 'clean': None,
15 'date': '2009-11-24 09:07:36 +0400',10 'date': '2009-12-03 12:11:32 +0400',
16 'revision_id': 'nico@inattendu.org-20091124050736-eophoqby83atw8tq',11 'revision_id': 'nico@inattendu.org-20091203081132-bifpk3e9t4fn23zp',
17 'revno': 34}12 'revno': 37}
1813
19revisions = {}14revisions = {}
2015
2116
=== modified file 'lucioLib/gui/gui_controller.py'
--- lucioLib/gui/gui_controller.py 2009-12-07 07:25:24 +0000
+++ lucioLib/gui/gui_controller.py 2009-12-07 07:25:24 +0000
@@ -36,7 +36,6 @@
36import time36import time
37import gc37import gc
3838
39from .. import luciole_exceptions as M_EXCEP
4039
41import luciole_drawaera as GLD40import luciole_drawaera as GLD
42import montage_tree as GMT41import montage_tree as GMT
@@ -45,6 +44,8 @@
45import dialog as GDIALOG44import dialog as GDIALOG
46import open_project as GOF45import open_project as GOF
47import luciole_export_window as GEXPORT46import luciole_export_window as GEXPORT
47import luciole_export_tool_window as GEXPORT_TOOL
48
48import open_project_widget as GOPEN49import open_project_widget as GOPEN
49import dialog_project_properties as GDIALOG_PROJ50import dialog_project_properties as GDIALOG_PROJ
50import dialog_preferences as GPREF51import dialog_preferences as GPREF
@@ -245,6 +246,7 @@
245 'on_file_open_activate' : self.on_file_open_activate,246 'on_file_open_activate' : self.on_file_open_activate,
246 'on_file_import_activate' : self.on_file_import_activate,247 'on_file_import_activate' : self.on_file_import_activate,
247 'on_file_export_activate' : self.on_file_export_activate, 248 'on_file_export_activate' : self.on_file_export_activate,
249 'on_file_export_tool_activate' :self.on_file_export_tool_activate,
248 'on_file_quit_activate' : self.on_file_quit_activate,250 'on_file_quit_activate' : self.on_file_quit_activate,
249 'on_file_close_activate' : self.on_file_close_activate,251 'on_file_close_activate' : self.on_file_close_activate,
250 'on_view_project_activate' : self.on_view_project_activate,252 'on_view_project_activate' : self.on_view_project_activate,
@@ -539,6 +541,11 @@
539 """ Display export window """541 """ Display export window """
540 self._exportObj.gui_export(project_data)542 self._exportObj.gui_export(project_data)
541543
544 def export_tool_dialog(self,project_data) :
545 """ Display export tool window """
546 X = GEXPORT_TOOL.dialog_export_file(project=project_data)
547 X.run()
548
542 def update_play_button(self,is_active = False) :549 def update_play_button(self,is_active = False) :
543 """ 550 """
544 update pressed state and icon image for play pause551 update pressed state and icon image for play pause
@@ -703,6 +710,10 @@
703 """file export activate """710 """file export activate """
704 self.ctrl_obj.export()711 self.ctrl_obj.export()
705712
713 def on_file_export_tool_activate(self,widget):
714 """file export activate """
715 self.ctrl_obj.export_tool()
716
706 def on_file_quit_activate(self,widget):717 def on_file_quit_activate(self,widget):
707 """ file quit actovated"""718 """ file quit actovated"""
708 self.ctrl_obj.quit() 719 self.ctrl_obj.quit()
709720
=== added file 'lucioLib/gui/luciole_export_tool_window.py'
--- lucioLib/gui/luciole_export_tool_window.py 1970-01-01 00:00:00 +0000
+++ lucioLib/gui/luciole_export_tool_window.py 2009-12-07 07:25:24 +0000
@@ -0,0 +1,183 @@
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3# -*- Mode: Python -*-
4# vi:si:ai:et:sw=4:sts=4:ts=4
5#
6#
7# Copyright Nicolas Bertrand (nico@inattendu.org), 2009
8#
9# This file is part of Luciole.
10#
11# Luciole is free software: you can redistribute it and/or modify
12# it under the terms of the GNU General Public License as published by
13# the Free Software Foundation, either version 3 of the License, or
14# (at your option) any later version.
15#
16# Luciole is distributed in the hope that it will be useful,
17# but WITHOUT ANY WARRANTY; without even the implied warranty of
18# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19# GNU General Public License for more details.
20#
21# You should have received a copy of the GNU General Public License
22# along with Luciole. If not, see <http://www.gnu.org/licenses/>.
23#
24#
25
26
27
28# for i18n
29from gettext import gettext as _
30
31import gtk
32import os.path
33
34from .. import lucioExport as LEF
35import dialog as G_DIALOG
36
37BASE_DIR = './'
38
39class SimpleBuilderApp(gtk.Builder):
40 def __init__(self):
41 self.GLADE_DIR = os.path.join(BASE_DIR,'ui')
42 gtk.Builder.__init__(self)
43
44
45
46
47class dialog_export_file(SimpleBuilderApp):
48
49
50 def __init__(self, path="export_file.glade", root="dialog_export_file", domain="", form=None, project=None, **kwargs):
51
52 # set export template dir
53 self.TEMPLATE_DIR = os.path.join(BASE_DIR,'templates')
54 self.templates = dict()
55 self.project=project
56 self.templates = {
57 "cinelerra" : os.path.join(self.TEMPLATE_DIR, "cinelerra_template.xml") ,
58 "pitivi" : os.path.join(self.TEMPLATE_DIR, "pitivi_template") ,
59 "kdenlive" : os.path.join(self.TEMPLATE_DIR, "kdenlive_template") ,
60 "openshot" : os.path.join(self.TEMPLATE_DIR, "openshot_template") }
61
62 SimpleBuilderApp.__init__(self)
63 self.add_from_file(os.path.join(self.GLADE_DIR,path))
64 self.connect_signals(self)
65
66 self.window = self.get_object(root)
67 # Default Export type
68 self.export_type = "cinelerra"
69 self.extension=".xml"
70 print __file__
71 self.BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
72 print self.BASE_DIR
73 #
74 # widgets configuration
75 #
76 self._fn_widget = self.get_object("entry_fn")
77 self._fn_widget.set_text("export.xml")
78
79 initial_folder = os.path.expandvars('$HOME')
80 self._filechooser = self.get_object("filechooserbutton1")
81 self._filechooser.set_current_folder(initial_folder)
82
83 self._status_bar_widget = self.get_object("statusbar1")
84 #self._status_bar_widget_cid = self._status_bar_widget.get_context_id()
85 self._status_bar_widget_cid = 1
86 msg = _("Select an application and a file name name for export")
87 self._status_bar_widget.push(self._status_bar_widget_cid,msg)
88
89 self.window.show()
90 def on_dialog_export_file_destroy(self, widget, data=None):
91 self.window.destroy()
92
93 def on_dialog_export_file_close(self, widget, data=None):
94 self.window.destroy()
95
96 def on_dialog_export_file_response(self, widget, data=None):
97 pass
98
99
100 def on_filechooserbutton1_file_set(self, widget, data=None):
101 self.export_folder = widget.get_filename()
102
103
104 def on_radio_cine_toggled(self, widget, data=None):
105 self.export_type ="cinelerra"
106 self.extension=".xml"
107
108
109 def on_radio_kdenlive_toggled(self, widget, data=None):
110 self.export_type ="kdenlive"
111
112 def on_radio_pitivi_toggled(self, widget, data=None):
113 self.export_type ="pitivi"
114
115 def on_radio_openshot_toggled(self, widget, data=None):
116 self.export_type ="openshot"
117
118 def on_entry_fn_activate(self, widget, data=None):
119 print __file__,"DEBUG : on_entry_fn_activate",data
120 self.filename = "filename"
121
122
123 def make_export(self) :
124 self._status_bar_widget.pop(self._status_bar_widget_cid)
125
126 #get filename form entry object
127 (self.filename, self.extension)=os.path.splitext(self._fn_widget.get_text())
128
129 # get folder
130 self.export_folder = self._filechooser.get_filename()
131
132 self.full_export_path = os.path.join(self.export_folder,self.filename+self.extension)
133 print __file__," DEBUG :", self.full_export_path
134
135 ForceExport = False # by default overide of export filename is not allowed
136
137 if os.path.exists(self.full_export_path):
138 # add message display
139 msg =_("File %s already exists. Replace file ?") % self.full_export_path
140 ForceExport = G_DIALOG.Dialog.QuestionMessage(self.window,msg)
141
142 if ForceExport == True :
143 if self.export_type == "cinelerra" :
144 if self.extension == ".xml" :
145 self.make_export_cinelerra()
146 else :
147 print "Not a valid extension"
148 else :
149 print "Nothing (yet !) to export"
150
151 def make_export_cinelerra(self):
152
153 X = LEF.luciole_export_tool_cinelerra(
154 lcl_project = self.project,
155 template= self.templates["cinelerra"],
156 export_file = self.full_export_path)
157 X.generate()
158
159 msg = _("Export Done")
160 self._status_bar_widget.push(self._status_bar_widget_cid,msg)
161
162
163 def run(self) :
164 exit_loop = False
165 while (exit_loop == False) :
166 response = self.window.run() #wait for a reponse
167 if response == 2 :
168 # export button
169 self.make_export()
170 else :
171 # exit
172 exit_loop = True
173
174 self.window.destroy()
175
176def main():
177
178 frmExportVideo1 = dialog_export_file()
179
180 frmExportVideo1.run()
181
182if __name__ == "__main__":
183 main()
0184
=== modified file 'lucioLib/lucioExport/__init__.py'
--- lucioLib/lucioExport/__init__.py 2009-03-08 18:06:41 +0000
+++ lucioLib/lucioExport/__init__.py 2009-12-07 07:25:24 +0000
@@ -23,3 +23,4 @@
23#23#
24#24#
25from luciole_export import *25from luciole_export import *
26from luciole_export_tool import *
2627
=== added file 'lucioLib/lucioExport/luciole_export_tool.py'
--- lucioLib/lucioExport/luciole_export_tool.py 1970-01-01 00:00:00 +0000
+++ lucioLib/lucioExport/luciole_export_tool.py 2009-12-07 07:25:24 +0000
@@ -0,0 +1,281 @@
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3# -*- Mode: Python -*-
4# vi:si:ai:et:sw=4:sts=4:ts=4
5#
6#
7# Copyright Nicolas Bertrand (nico@inattendu.org), 2009
8#
9# This file is part of Luciole.
10#
11# Luciole is free software: you can redistribute it and/or modify
12# it under the terms of the GNU General Public License as published by
13# the Free Software Foundation, either version 3 of the License, or
14# (at your option) any later version.
15#
16# Luciole is distributed in the hope that it will be useful,
17# but WITHOUT ANY WARRANTY; without even the implied warranty of
18# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19# GNU General Public License for more details.
20#
21# You should have received a copy of the GNU General Public License
22# along with Luciole. If not, see <http://www.gnu.org/licenses/>.
23#
24#
25
26# for i18n
27from gettext import gettext as _
28
29import os.path
30from .. import luciole_et as LE
31
32from .. import luciole_exceptions as LEXCEP
33from .. import luciole_project as LPROJECT
34class luciole_export_tool(object) :
35 """
36 :version:
37 :author:
38 """
39
40
41 """
42 ATTRIBUTES
43 export_file : Path to file to export
44 template : Path to template
45 lcl_project : The luciole project a file or a dict
46 _lcl_project_data :
47 _export_template : File to update with export data
48 _template_xml :
49 """
50
51
52
53 def __init__(self, lcl_project = "./luciole_project.xml", template="./template.xml", export_file = "./export.xml"):
54 """
55 @param lcl_project : Type de projet
56 @param template : Path to template
57 @param export_file : Path to export_file
58 """
59 #
60 # Atributes init
61 #
62 self.lcl_project = lcl_project
63 self.template = template
64 self.export_file = export_file
65 self._lcl_project_data = {}
66 self._lcl_project_data['resources_images'] = []
67 self._lcl_project_data['timelines_images'] = []
68
69 self._export_template = None
70 self._template_xml = None
71
72 if (type(lcl_project) == str) :
73 # test file type
74 if os.path.exists(lcl_project) :
75 #filetype exits load it
76 self.__load_lcl_file()
77 else :
78 #Raise Error
79 excep_message = "%s is ot a file",lcl_project
80 raise LEXCEP.LucioException,excep_message
81 elif (type(lcl_project) == LPROJECT.project_dico) :
82 # input is a dictionary
83 self.__load_lcl_dict()
84 else :
85 # template does not exists : raise an exception
86 excep_message = "Invalid projetc type nor file nor luciole_project"
87 raise LEXCEP.LucioException,excep_message
88
89 #
90 # Test template
91 #
92 if os.path.exists(self.template) :
93 self._load_template()
94 else :
95 # template does not exists : raise an exception
96 excep_message = " Template file %s does not exist"%self.template
97 raise LEXCEP.LucioException,excep_message
98
99
100
101
102 def generate(self):
103 """
104
105
106 @return :
107 @author
108 """
109 self._gen_ressources()
110 self._gen_timeline()
111 self.__write_export_file()
112
113 def _load_template(self):
114 """
115
116
117 @return :
118 @author
119 """
120 pass
121
122 def _gen_ressources(self):
123 """
124 generate date for resources
125
126 @return :
127 @author
128 """
129 pass
130
131 def _gen_timeline(self):
132 """
133 Generate data for timeline
134
135 @return :
136 @author
137 """
138 pass
139
140 def __load_lcl_file(self):
141 """
142 Load a Luciole project from a file dictionary
143
144 @return :
145 @author
146 """
147 try :
148 _lcl_project_xml = LE.lcl_et(self.lcl_project)
149 except :
150 pass
151 else :
152 self._lcl_project_data['image_path'] = os.path.join(_lcl_project_xml.findtext("metas/projectPath").strip() ,
153 _lcl_project_xml.findtext("metas/rush_dir").strip() )
154 self._lcl_project_data['fpi'] = int(_lcl_project_xml.findtext("metas/fpi").strip())
155
156 # get resources images from project capture data
157 list_image = _lcl_project_xml.find("captureData").getiterator('image')
158 [ self._lcl_project_data['resources_images'].append(image.text.strip()) for image in list_image]
159
160 # get timelines images from project chrono data
161 list_image = _lcl_project_xml.find("chronoData").getiterator('image')
162 [self._lcl_project_data['timelines_images'].append(image.text.strip()) for image in list_image]
163
164
165 def __load_lcl_dict(self):
166 """
167 Load a Luciole project from a dictionary
168
169 @return :
170 @author
171 """
172
173 self._lcl_project_data['image_path'] = os.path.join(self.lcl_project['project_dir'], self.lcl_project['rush_dir'])
174 self._lcl_project_data['fpi'] = int(self.lcl_project['fpi'])
175 self._lcl_project_data['resources_images'] = self.lcl_project['capture_images']
176 self._lcl_project_data['timelines_images'] = self.lcl_project['chrono_images']
177
178
179 def __write_export_file(self):
180 """
181
182
183 @return :
184 @author
185 """
186 self._template_xml.write(self.export_file)
187
188class luciole_export_tool_cinelerra (luciole_export_tool):
189
190 """
191
192
193 :version:
194 :author:
195 """
196
197 """ ATTRIBUTES
198
199
200
201 _export_template (private)
202
203 """
204
205 def __init__(self, lcl_project = "./luciole_project.xml", template="./template.xml", export_file = "./export.xml"):
206 """
207
208
209 @param luciole_export_tool lcl_project_type : type of luciole project : "file" or "project"
210 @param object lcl_project : Type de projet
211 @param string template : Path to template
212 @param string export_file : Path to export_file
213 @return :
214 @author
215 """
216 super(luciole_export_tool_cinelerra, self).__init__(lcl_project,template,export_file )
217
218 def _load_template(self):
219 """
220 """
221 self._template_xml = LE.lcl_et(self.template)
222
223
224 def _gen_ressources(self):
225 """
226 ressource is called asset in cinelerra template
227 """
228 resources_tag = self._template_xml.find("//ASSETS")
229 resource_elem_tpl = self._template_xml.find("//ASSET")
230
231 for image in self._lcl_project_data['resources_images'] :
232 # build image_path
233 image_p = os.path.join(self._lcl_project_data['image_path'], image)
234 # create a resouce element --> i.e an ASSET element
235 new_element = self._template_xml.SubElement(resources_tag,"ASSET",{"SRC":image_p})
236 # copy subelement od ASSET template tag in new element
237 for elem_tpl in resource_elem_tpl.getchildren() :
238 new_element.append(elem_tpl)
239
240 #remove template tag
241 resources_tag.remove(resource_elem_tpl)
242
243
244 def __get_timeline_tags(self) :
245 """
246 in cinelerra timeline tags is TRACK with type video, and EDITS/EDIT tag
247 """
248 video_track = None
249 tracks = self._template_xml.findall("//TRACK")
250 for track in tracks :
251 if track.get("TYPE") == "VIDEO" :
252 # video tak is found
253 video_track = track
254 break
255 # get EDIT tag
256 return ( video_track.find("EDITS"), video_track.find("EDITS/EDIT"))
257
258
259 def _gen_timeline(self):
260 """
261 generate timeline
262 """
263 (timeline_tag, timeline_item_tpl) = self.__get_timeline_tags()
264 for image in self._lcl_project_data['timelines_images'] :
265 # build image_path
266 image_p = os.path.join(self._lcl_project_data['image_path'], image)
267
268 # create New EDIT element per image
269 for frame in range(self._lcl_project_data['fpi']):
270 framerate = str(self._lcl_project_data['fpi'])
271 new_element = self._template_xml.SubElement(timeline_tag,"EDIT",{"STARTSOURCE":"0","CHANNEL":"0", "LENGTH":"1"})
272 # create FILE subElement of EDIT
273 self._template_xml.SubElement(new_element,"FILE",{"SRC":image_p})
274
275 # remove EDIT template tag
276 timeline_tag.remove(timeline_item_tpl)
277
278if __name__ == '__main__' :
279 X = luciole_export_tool_cinelerra( lcl_project = "/home/nico/temp/testLuciole/luciole_project_isight/luciole_project_isight.xml",template="./cinelerra_template.xml",export_file = "./cine_export.xml" )
280 X.generate()
281
0282
=== modified file 'lucioLib/luciole_controller.py'
--- lucioLib/luciole_controller.py 2009-12-07 07:25:24 +0000
+++ lucioLib/luciole_controller.py 2009-12-07 07:25:24 +0000
@@ -145,6 +145,7 @@
145 # 3. load project in application145 # 3. load project in application
146 self.__load_project_in_app()146 self.__load_project_in_app()
147147
148
148 def save_project(self):149 def save_project(self):
149 """ save the current project """150 """ save the current project """
150 self.project_ctrller.save(self.project)151 self.project_ctrller.save(self.project)
@@ -258,10 +259,17 @@
258 if self.project != None :259 if self.project != None :
259 self.gui.export_dialog(self.project)260 self.gui.export_dialog(self.project)
260 else :261 else :
261 # nbd@grape to transform as error message262 msg = _("Nothing to export. No project loaded")
262 msg = _("Nothing to export. No project loaded")263 LTK.Dialog.ErrorMessage(self.gui.window, msg)
263 LTK.Dialog.ErrorMessage(self.gui.window, msg)264
264265 def export_tool(self) :
266 """ Manage tool exports """
267 if self.project != None :
268 self.gui.export_tool_dialog(self.project)
269 else :
270 msg = _("Nothing to export. No project loaded")
271 LTK.Dialog.ErrorMessage(self.gui.window, msg)
272
265 def play(self,index_chrono) :273 def play(self,index_chrono) :
266 """ play video """274 """ play video """
267 # Test if project exists275 # Test if project exists
268276
=== added file 'lucioLib/luciole_et.py'
--- lucioLib/luciole_et.py 1970-01-01 00:00:00 +0000
+++ lucioLib/luciole_et.py 2009-12-07 07:25:24 +0000
@@ -0,0 +1,60 @@
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3# -*- Mode: Python -*-
4# vi:si:ai:et:sw=4:sts=4:ts=4
5#
6#
7# Copyright Nicolas Bertrand (nico@inattendu.org), 2009
8#
9# This file is part of Luciole.
10#
11# Luciole is free software: you can redistribute it and/or modify
12# it under the terms of the GNU General Public License as published by
13# the Free Software Foundation, either version 3 of the License, or
14# (at your option) any later version.
15#
16# Luciole is distributed in the hope that it will be useful,
17# but WITHOUT ANY WARRANTY; without even the implied warranty of
18# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19# GNU General Public License for more details.
20#
21# You should have received a copy of the GNU General Public License
22# along with Luciole. If not, see <http://www.gnu.org/licenses/>.
23#
24#
25
26# for i18n
27from gettext import gettext as _
28import xml.etree.ElementTree as ET #python 2.5
29from xml.parsers.expat import ParserCreate, ExpatError
30
31
32class lcl_et(object) :
33 def __init__(self,xml_file) :
34 self.xml_file = xml_file
35 #parse XML tempalte file
36 try :
37 self.xml_obj = ET.parse(self.xml_file)
38 except ExpatError , err_value :
39 # Raise Error
40 print "XML parse error in ",self.xml_file, "\nerror :",err_value
41 self.xml_obj = None
42
43 def findtext(self,condition) :
44 return self.xml_obj.findtext(condition)
45
46 def find(self,match) :
47 return self.xml_obj.find(match)
48
49 def findall(self,match) :
50 return self.xml_obj.findall(match)
51
52 def SubElement(self,parent,tag,attrib) :
53 return ET.SubElement(parent,tag,attrib)
54
55 def tostring(self,element) :
56 return ET.tostring(element)
57
58 def write(self,file) :
59 return self.xml_obj.write(file,"UTF-8")
60
061
=== added file 'templates/cinelerra_template.xml'
--- templates/cinelerra_template.xml 1970-01-01 00:00:00 +0000
+++ templates/cinelerra_template.xml 2009-12-07 07:25:24 +0000
@@ -0,0 +1,104 @@
1<?xml version="1.0"?>
2<EDL VERSION="2.1CV" PROJECT_PATH="/home/nico/temp/testLuciole/luciole_project_isight/cinelerra_export.xml">
3<LOCALSESSION IN_POINT="-1" LOOP_PLAYBACK="0" LOOP_START="0" LOOP_END="0" OUT_POINT="-1" SELECTION_START="0" SELECTION_END="0" CLIP_TITLE="Program" CLIP_NOTES="Hello world" FOLDER="Clips" TRACK_START="0" VIEW_START="0" ZOOM_SAMPLE="128" ZOOMY="64" ZOOM_TRACK="64" PREVIEW_START="0" PREVIEW_END="1.6799999999999999e+00" RED="0" GREEN="0" BLUE="0" AUTOGROUPTYPE_AUDIO_FADE_MIN="-80" AUTOGROUPTYPE_AUDIO_FADE_MAX="6" AUTOGROUPTYPE_VIDEO_FADE_MIN="0" AUTOGROUPTYPE_VIDEO_FADE_MAX="100" AUTOGROUPTYPE_ZOOM_MIN="1.000000e-03" AUTOGROUPTYPE_ZOOM_MAX="4" AUTOGROUPTYPE_X_MIN="-100" AUTOGROUPTYPE_X_MAX="100" AUTOGROUPTYPE_Y_MIN="-100" AUTOGROUPTYPE_Y_MAX="100"></LOCALSESSION>
4
5<SESSION ASSETLIST_FORMAT="1" ASSET_COLUMN0="100" ASSET_COLUMN1="100" SHOW_MUTE="0" SHOW_CAMERA_X="0" SHOW_CAMERA_Y="0" SHOW_CAMERA_Z="0" SHOW_PROJECTOR_X="0" SHOW_PROJECTOR_Y="0" SHOW_PROJECTOR_Z="0" SHOW_FADE="1" SHOW_PAN="0" SHOW_MODE="0" SHOW_MASK="0" SHOW_TRANSITIONS="1" SHOW_PLUGINS="1" AUTO_KEYFRAMES="0" AUTOS_FOLLOW_EDITS="1" BRENDER_START="0" CROP_X1="0" CROP_Y1="0" CROP_X2="320" CROP_Y2="240" CURRENT_FOLDER="Media" CURSOR_ON_FRAMES="1" CWINDOW_DEST="0" CWINDOW_MASK="0" CWINDOW_METER="1" CWINDOW_OPERATION="0" CWINDOW_SCROLLBARS="1" CWINDOW_XSCROLL="0" CWINDOW_YSCROLL="0" CWINDOW_ZOOM="1" DEFAULT_ATRANSITION="Crossfade" DEFAULT_VTRANSITION="Dissolve" DEFAULT_TRANSITION_LENGTH="1" EDITING_MODE="1" FOLDERLIST_FORMAT="1" HIGHLIGHTED_TRACK="0" LABELS_FOLLOW_EDITS="1" MPEG4_DEBLOCK="1" PLUGINS_FOLLOW_EDITS="1" PLAYBACK_PRELOAD="0" SAFE_REGIONS="1" SHOW_ASSETS="1" SHOW_TITLES="1" TEST_PLAYBACK_EDITS="1" TIME_FORMAT="0" TIMECODE_OFFSET_0="0" TIMECODE_OFFSET_1="0" TIMECODE_OFFSET_2="0" TIMECODE_OFFSET_3="0" NUDGE_SECONDS="1" TOOL_WINDOW="0" VWINDOW_METER="1" VWINDOW_FOLDER="" VWINDOW_SOURCE="4294967295" VWINDOW_ZOOM="1" DECODE_SUBTITLES="0" subtitle_number="0"></SESSION>
6
7<VIDEO INTERPOLATION_TYPE="2" INTERPOLATE_RAW="1" WHITE_BALANCE_RAW="1" COLORMODEL="RGBA-8 Bit" INTERLACE_MODE="BOTTOM_FIELD_FIRST" CHANNELS="1" VCHANNEL_X_0="0" VCHANNEL_Y_0="0" FRAMERATE="25" FRAMES_PER_FOOT="16" OUTPUTW="720" OUTPUTH="576" ASPECTW="4" ASPECTH="3"></VIDEO>
8
9<AUDIO SAMPLERATE="48000" CHANNELS="2" ACHANNEL_ANGLE_0="180" ACHANNEL_ANGLE_1="0"></AUDIO>
10
11<FOLDER>Clips</FOLDER>
12<FOLDER>Media</FOLDER>
13<ASSETS>
14<ASSET SRC="/home/nico/temp/testLuciole/luciole_project_isight/rush/rush_00000.jpeg">
15<FOLDER>Media</FOLDER>
16<FORMAT TYPE="JPEG" USE_HEADER="1"></FORMAT>
17<AUDIO_OMIT CHANNELS="0" RATE="0" BITS="0" BYTE_ORDER="0" SIGNED="0" HEADER="0" DITHER="0" ACODEC="twos" AUDIO_LENGTH="0"></AUDIO_OMIT>
18<VIDEO HEIGHT="576" WIDTH="720" LAYERS="1" FRAMERATE="1" VCODEC="yuv2" VIDEO_LENGTH="-1" INTERLACE_AUTOFIX="1" INTERLACE_MODE="NOTINTERLACED" INTERLACE_FIXMETHOD="DO_NOTHING" REEL_NAME="cin0000" REEL_NUMBER="0" TCSTART="0" TCEND="0" TCFORMAT="0"></VIDEO>
19</ASSET>
20</ASSETS>
21
22
23
24<LABELS>
25</LABELS>
26
27<TRACK RECORD="1" NUDGE="0" PLAY="1" GANG="1" DRAW="1" EXPAND="0" TRACK_W="720" TRACK_H="576" TYPE="VIDEO">
28<TITLE>Video 1</TITLE>
29<EDITS>
30<EDIT STARTSOURCE="0" CHANNEL="0" LENGTH="7"><FILE SRC="/home/nico/temp/testLuciole/luciole_project_isight/rush/rush_00000.jpeg"></FILE></EDIT>
31</EDITS>
32<MUTEAUTOS>
33<AUTO POSITION="0" VALUE="0"></AUTO>
34</MUTEAUTOS>
35<CAMERA_X>
36<AUTO POSITION="0" VALUE="0" CONTROL_IN_VALUE="0" CONTROL_OUT_VALUE="0" CONTROL_IN_POSITION="0" CONTROL_OUT_POSITION="0"></AUTO>
37</CAMERA_X>
38<CAMERA_Y>
39<AUTO POSITION="0" VALUE="0" CONTROL_IN_VALUE="0" CONTROL_OUT_VALUE="0" CONTROL_IN_POSITION="0" CONTROL_OUT_POSITION="0"></AUTO>
40</CAMERA_Y>
41<CAMERA_Z>
42<AUTO POSITION="0" VALUE="1" CONTROL_IN_VALUE="0" CONTROL_OUT_VALUE="0" CONTROL_IN_POSITION="0" CONTROL_OUT_POSITION="0"></AUTO>
43</CAMERA_Z>
44<PROJECTOR_X>
45<AUTO POSITION="0" VALUE="0" CONTROL_IN_VALUE="0" CONTROL_OUT_VALUE="0" CONTROL_IN_POSITION="0" CONTROL_OUT_POSITION="0"></AUTO>
46</PROJECTOR_X>
47<PROJECTOR_Y>
48<AUTO POSITION="0" VALUE="0" CONTROL_IN_VALUE="0" CONTROL_OUT_VALUE="0" CONTROL_IN_POSITION="0" CONTROL_OUT_POSITION="0"></AUTO>
49</PROJECTOR_Y>
50<PROJECTOR_Z>
51<AUTO POSITION="0" VALUE="1" CONTROL_IN_VALUE="0" CONTROL_OUT_VALUE="0" CONTROL_IN_POSITION="0" CONTROL_OUT_POSITION="0"></AUTO>
52</PROJECTOR_Z>
53<FADEAUTOS>
54<AUTO POSITION="0" VALUE="100" CONTROL_IN_VALUE="0" CONTROL_OUT_VALUE="0" CONTROL_IN_POSITION="0" CONTROL_OUT_POSITION="0"></AUTO>
55</FADEAUTOS>
56<MODEAUTOS>
57<AUTO POSITION="0" VALUE="0"></AUTO>
58</MODEAUTOS>
59<MASKAUTOS>
60<AUTO MODE="1" VALUE="100" FEATHER="0" APPLY_BEFORE_PLUGINS="0" POSITION="0">
61
62</AUTO>
63</MASKAUTOS>
64</TRACK>
65
66
67
68<TRACK RECORD="1" NUDGE="0" PLAY="1" GANG="1" DRAW="1" EXPAND="0" TRACK_W="720" TRACK_H="576" TYPE="AUDIO">
69
70<TITLE>Audio 1</TITLE>
71<EDITS>
72<EDIT STARTSOURCE="0" CHANNEL="0" LENGTH="80640"></EDIT>
73</EDITS>
74<MUTEAUTOS>
75<AUTO POSITION="0" VALUE="0"></AUTO>
76</MUTEAUTOS>
77<FADEAUTOS>
78<AUTO POSITION="0" VALUE="0" CONTROL_IN_VALUE="0" CONTROL_OUT_VALUE="0" CONTROL_IN_POSITION="0" CONTROL_OUT_POSITION="0"></AUTO>
79</FADEAUTOS>
80<PANAUTOS>
81<AUTO POSITION="0" HANDLE_X="1" HANDLE_Y="50" VALUE0="1" VALUE1="0"></AUTO></PANAUTOS>
82</TRACK>
83
84
85
86<TRACK RECORD="1" NUDGE="0" PLAY="1" GANG="1" DRAW="1" EXPAND="0" TRACK_W="720" TRACK_H="576" TYPE="AUDIO">
87
88<TITLE>Audio 2</TITLE>
89<EDITS>
90<EDIT STARTSOURCE="0" CHANNEL="0" LENGTH="80640"></EDIT>
91</EDITS>
92<MUTEAUTOS>
93<AUTO POSITION="0" VALUE="0"></AUTO>
94</MUTEAUTOS>
95<FADEAUTOS>
96<AUTO POSITION="0" VALUE="0" CONTROL_IN_VALUE="0" CONTROL_OUT_VALUE="0" CONTROL_IN_POSITION="0" CONTROL_OUT_POSITION="0"></AUTO>
97</FADEAUTOS>
98<PANAUTOS>
99<AUTO POSITION="0" HANDLE_X="100" HANDLE_Y="50" VALUE0="0" VALUE1="1"></AUTO></PANAUTOS>
100</TRACK>
101
102
103
104</EDL>
0105
=== added file 'ui/export_file.glade'
--- ui/export_file.glade 1970-01-01 00:00:00 +0000
+++ ui/export_file.glade 2009-12-07 07:25:24 +0000
@@ -0,0 +1,254 @@
1<?xml version="1.0"?>
2<interface>
3 <requires lib="gtk+" version="2.16"/>
4 <!-- interface-naming-policy project-wide -->
5 <object class="GtkDialog" id="dialog_export_file">
6 <property name="border_width">5</property>
7 <property name="type_hint">normal</property>
8 <property name="has_separator">False</property>
9 <signal name="destroy" handler="on_dialog_export_file_destroy"/>
10 <signal name="close" handler="on_dialog_export_file_close"/>
11 <signal name="response" handler="on_dialog_export_file_response"/>
12 <child internal-child="vbox">
13 <object class="GtkVBox" id="dialog-vbox1">
14 <property name="visible">True</property>
15 <property name="orientation">vertical</property>
16 <property name="spacing">2</property>
17 <child>
18 <object class="GtkLabel" id="label1">
19 <property name="visible">True</property>
20 <property name="yalign">0.25</property>
21 <property name="ypad">8</property>
22 <property name="label" translatable="yes">Export to another application</property>
23 <attributes>
24 <attribute name="style" value="normal"/>
25 <attribute name="weight" value="semibold"/>
26 <attribute name="underline" value="True"/>
27 </attributes>
28 </object>
29 <packing>
30 <property name="expand">False</property>
31 <property name="fill">False</property>
32 <property name="padding">5</property>
33 <property name="position">1</property>
34 </packing>
35 </child>
36 <child>
37 <object class="GtkVBox" id="vbox1">
38 <property name="visible">True</property>
39 <property name="orientation">vertical</property>
40 <child>
41 <object class="GtkTable" id="table1">
42 <property name="visible">True</property>
43 <property name="n_rows">2</property>
44 <property name="n_columns">2</property>
45 <child>
46 <object class="GtkRadioButton" id="radio_cine">
47 <property name="label" translatable="yes">Cinelerra</property>
48 <property name="visible">True</property>
49 <property name="can_focus">True</property>
50 <property name="receives_default">False</property>
51 <property name="active">True</property>
52 <property name="draw_indicator">True</property>
53 <signal name="toggled" handler="on_radio_cine_toggled"/>
54 </object>
55 </child>
56 <child>
57 <object class="GtkRadioButton" id="radio_kdenlive">
58 <property name="label" translatable="yes">Kdenlive</property>
59 <property name="visible">True</property>
60 <property name="can_focus">True</property>
61 <property name="receives_default">False</property>
62 <property name="draw_indicator">True</property>
63 <property name="group">radio_cine</property>
64 <signal name="toggled" handler="on_radio_kdenlive_toggled"/>
65 </object>
66 <packing>
67 <property name="top_attach">1</property>
68 <property name="bottom_attach">2</property>
69 </packing>
70 </child>
71 <child>
72 <object class="GtkRadioButton" id="radio_pitivi">
73 <property name="label" translatable="yes">Pitivi</property>
74 <property name="visible">True</property>
75 <property name="can_focus">True</property>
76 <property name="receives_default">False</property>
77 <property name="draw_indicator">True</property>
78 <property name="group">radio_cine</property>
79 <signal name="toggled" handler="on_radio_pitivi_toggled"/>
80 </object>
81 <packing>
82 <property name="left_attach">1</property>
83 <property name="right_attach">2</property>
84 </packing>
85 </child>
86 <child>
87 <object class="GtkRadioButton" id="radio_openshot">
88 <property name="label" translatable="yes">Openshot</property>
89 <property name="visible">True</property>
90 <property name="can_focus">True</property>
91 <property name="receives_default">False</property>
92 <property name="draw_indicator">True</property>
93 <property name="group">radio_cine</property>
94 <signal name="toggled" handler="on_radio_openshot_toggled"/>
95 </object>
96 <packing>
97 <property name="left_attach">1</property>
98 <property name="right_attach">2</property>
99 <property name="top_attach">1</property>
100 <property name="bottom_attach">2</property>
101 </packing>
102 </child>
103 </object>
104 <packing>
105 <property name="padding">10</property>
106 <property name="position">0</property>
107 </packing>
108 </child>
109 <child>
110 <object class="GtkHBox" id="hbox1">
111 <property name="visible">True</property>
112 <child>
113 <object class="GtkLabel" id="label2">
114 <property name="width_request">250</property>
115 <property name="visible">True</property>
116 <property name="label" translatable="yes">Select an export directory</property>
117 </object>
118 <packing>
119 <property name="expand">False</property>
120 <property name="fill">False</property>
121 <property name="position">0</property>
122 </packing>
123 </child>
124 <child>
125 <object class="GtkFileChooserButton" id="filechooserbutton1">
126 <property name="visible">True</property>
127 <property name="action">select-folder</property>
128 <property name="title" translatable="yes">Select a folder</property>
129 <signal name="file_set" handler="on_filechooserbutton1_file_set"/>
130 </object>
131 <packing>
132 <property name="expand">False</property>
133 <property name="fill">False</property>
134 <property name="padding">1</property>
135 <property name="position">1</property>
136 </packing>
137 </child>
138 </object>
139 <packing>
140 <property name="padding">10</property>
141 <property name="position">1</property>
142 </packing>
143 </child>
144 <child>
145 <object class="GtkHBox" id="hbox2">
146 <property name="visible">True</property>
147 <child>
148 <object class="GtkLabel" id="label3">
149 <property name="width_request">250</property>
150 <property name="visible">True</property>
151 <property name="label" translatable="yes">Select a filename</property>
152 </object>
153 <packing>
154 <property name="expand">False</property>
155 <property name="fill">False</property>
156 <property name="position">0</property>
157 </packing>
158 </child>
159 <child>
160 <object class="GtkEntry" id="entry_fn">
161 <property name="visible">True</property>
162 <property name="can_focus">True</property>
163 <property name="invisible_char">&#x25CF;</property>
164 </object>
165 <packing>
166 <property name="position">1</property>
167 </packing>
168 </child>
169 </object>
170 <packing>
171 <property name="padding">10</property>
172 <property name="position">2</property>
173 </packing>
174 </child>
175 <child>
176 <object class="GtkStatusbar" id="statusbar1">
177 <property name="visible">True</property>
178 <property name="spacing">2</property>
179 <property name="has_resize_grip">False</property>
180 </object>
181 <packing>
182 <property name="expand">False</property>
183 <property name="padding">3</property>
184 <property name="position">3</property>
185 </packing>
186 </child>
187 </object>
188 <packing>
189 <property name="position">2</property>
190 </packing>
191 </child>
192 <child internal-child="action_area">
193 <object class="GtkHButtonBox" id="dialog-action_area1">
194 <property name="visible">True</property>
195 <property name="layout_style">end</property>
196 <child>
197 <object class="GtkButton" id="button1">
198 <property name="label">gtk-cancel</property>
199 <property name="visible">True</property>
200 <property name="can_focus">True</property>
201 <property name="receives_default">True</property>
202 <property name="use_stock">True</property>
203 </object>
204 <packing>
205 <property name="expand">False</property>
206 <property name="fill">False</property>
207 <property name="position">0</property>
208 </packing>
209 </child>
210 <child>
211 <object class="GtkButton" id="button2">
212 <property name="label">gtk-convert</property>
213 <property name="visible">True</property>
214 <property name="can_focus">True</property>
215 <property name="receives_default">True</property>
216 <property name="use_stock">True</property>
217 </object>
218 <packing>
219 <property name="expand">False</property>
220 <property name="fill">False</property>
221 <property name="position">1</property>
222 </packing>
223 </child>
224 <child>
225 <object class="GtkButton" id="button3">
226 <property name="label">gtk-close</property>
227 <property name="visible">True</property>
228 <property name="can_focus">True</property>
229 <property name="receives_default">True</property>
230 <property name="use_stock">True</property>
231 <signal name="activate" handler="on_dialog_export_file_close"/>
232 </object>
233 <packing>
234 <property name="expand">False</property>
235 <property name="fill">False</property>
236 <property name="position">2</property>
237 </packing>
238 </child>
239 </object>
240 <packing>
241 <property name="expand">False</property>
242 <property name="pack_type">end</property>
243 <property name="position">0</property>
244 </packing>
245 </child>
246 </object>
247 </child>
248 <action-widgets>
249 <action-widget response="1">button1</action-widget>
250 <action-widget response="2">button2</action-widget>
251 <action-widget response="3">button3</action-widget>
252 </action-widgets>
253 </object>
254</interface>
0255
=== modified file 'ui/luciole.glade'
--- ui/luciole.glade 2009-12-07 07:25:24 +0000
+++ ui/luciole.glade 2009-12-07 07:25:24 +0000
@@ -172,6 +172,15 @@
172 </object>172 </object>
173 </child>173 </child>
174 <child>174 <child>
175 <object class="GtkImageMenuItem" id="file_export_tool">
176 <property name="label" translatable="yes">Tool Export</property>
177 <property name="visible">True</property>
178 <property name="image">image5</property>
179 <property name="use_stock">False</property>
180 <signal name="activate" handler="on_file_export_tool_activate"/>
181 </object>
182 </child>
183 <child>
175 <object class="GtkSeparatorMenuItem" id="separatormenuitem2">184 <object class="GtkSeparatorMenuItem" id="separatormenuitem2">
176 <property name="visible">True</property>185 <property name="visible">True</property>
177 </object>186 </object>
@@ -368,7 +377,7 @@
368 <accelerator key="c" signal="clicked"/>377 <accelerator key="c" signal="clicked"/>
369 <signal name="clicked" handler="on_button_capture_clicked"/>378 <signal name="clicked" handler="on_button_capture_clicked"/>
370 <child>379 <child>
371 <object class="GtkImage" id="image5">380 <object class="GtkImage" id="image_snapshot_button">
372 <property name="visible">True</property>381 <property name="visible">True</property>
373 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>382 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
374 <property name="tooltip_text" translatable="yes">make a snapshot</property>383 <property name="tooltip_text" translatable="yes">make a snapshot</property>
@@ -1386,9 +1395,9 @@
1386 <object class="GtkFileChooserButton" id="filechooserbutton1">1395 <object class="GtkFileChooserButton" id="filechooserbutton1">
1387 <property name="visible">True</property>1396 <property name="visible">True</property>
1388 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>1397 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
1398 <property name="do_overwrite_confirmation">True</property>
1399 <property name="action">select-folder</property>
1389 <property name="use_preview_label">False</property>1400 <property name="use_preview_label">False</property>
1390 <property name="action">select-folder</property>
1391 <property name="do_overwrite_confirmation">True</property>
1392 <property name="title" translatable="yes">Select a folder</property>1401 <property name="title" translatable="yes">Select a folder</property>
1393 </object>1402 </object>
1394 <packing>1403 <packing>
@@ -1772,4 +1781,8 @@
1772 <property name="visible">True</property>1781 <property name="visible">True</property>
1773 <property name="stock">gtk-preferences</property>1782 <property name="stock">gtk-preferences</property>
1774 </object>1783 </object>
1784 <object class="GtkImage" id="image5">
1785 <property name="visible">True</property>
1786 <property name="stock">gtk-connect</property>
1787 </object>
1775</interface>1788</interface>

Subscribers

People subscribed via source and target branches

to all changes: