Now can load and save a project

This commit is contained in:
Sergio Costas 2014-08-05 23:36:00 +02:00
parent 2cd17b8f45
commit dc350be634
8 changed files with 383 additions and 4 deletions

View file

@ -83,6 +83,7 @@
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="use_underline">True</property> <property name="use_underline">True</property>
<property name="use_stock">True</property> <property name="use_stock">True</property>
<signal name="activate" handler="on_load_activate" swapped="no"/>
</object> </object>
</child> </child>
<child> <child>
@ -92,6 +93,7 @@
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="use_underline">True</property> <property name="use_underline">True</property>
<property name="use_stock">True</property> <property name="use_stock">True</property>
<signal name="activate" handler="on_save_activate" swapped="no"/>
</object> </object>
</child> </child>
<child> <child>
@ -101,6 +103,7 @@
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="use_underline">True</property> <property name="use_underline">True</property>
<property name="use_stock">True</property> <property name="use_stock">True</property>
<signal name="activate" handler="on_save_as_activate" swapped="no"/>
</object> </object>
</child> </child>
<child> <child>

View file

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.16.1 -->
<interface>
<requires lib="gtk+" version="3.10"/>
<object class="GtkFileChooserDialog" id="data_project">
<property name="width_request">680</property>
<property name="height_request">420</property>
<property name="can_focus">False</property>
<property name="modal">True</property>
<property name="window_position">center</property>
<property name="icon">devede.svg</property>
<property name="type_hint">normal</property>
<property name="create_folders">False</property>
<child internal-child="vbox">
<object class="GtkBox" id="filechooserdialog-vbox1">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkButtonBox" id="filechooserdialog-action_area1">
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="button1">
<property name="label">gtk-cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button2">
<property name="label">gtk-ok</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
<action-widgets>
<action-widget response="0">button1</action-widget>
<action-widget response="1">button2</action-widget>
</action-widgets>
</object>
</interface>

View file

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.16.1 -->
<interface>
<requires lib="gtk+" version="3.10"/>
<object class="GtkFileChooserDialog" id="data_project">
<property name="can_focus">False</property>
<property name="modal">True</property>
<property name="window_position">center</property>
<property name="icon">devede.svg</property>
<property name="type_hint">normal</property>
<property name="action">save</property>
<child internal-child="vbox">
<object class="GtkBox" id="filechooserdialog-vbox1">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkButtonBox" id="filechooserdialog-action_area1">
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="button1">
<property name="label">gtk-cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button2">
<property name="label">gtk-ok</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
<action-widgets>
<action-widget response="0">button1</action-widget>
<action-widget response="1">button2</action-widget>
</action-widgets>
</object>
</interface>

View file

@ -600,3 +600,13 @@ class dvd_menu(devede.interface_manager.interface_manager):
n_page += 1 n_page += 1
return processes,menu_entries return processes,menu_entries
def store_menu(self):
return self.serialize()
def restore_menu(self,data):
self.unserialize(data)

View file

@ -635,3 +635,13 @@ class file_movie(devede.interface_manager.interface_manager):
cv = devede.converter.converter.get_converter() cv = devede.converter.converter.get_converter()
disc_player = (cv.get_film_player())() disc_player = (cv.get_film_player())()
disc_player.play_film(os.path.join(self.config.tmp_folder,"movie_preview.mpg")) disc_player.play_film(os.path.join(self.config.tmp_folder,"movie_preview.mpg"))
def store_file(self):
return self.serialize()
def restore_file(self,data):
self.unserialize(data)

View file

@ -462,3 +462,69 @@ class interface_manager(GObject.GObject):
exec('self.'+element[0]+' = self.'+element[0]+'_backup') exec('self.'+element[0]+' = self.'+element[0]+'_backup')
for element in self.interface_comboboxes: for element in self.interface_comboboxes:
exec('self.'+element[0]+' = self.'+element[0]+'_backup') exec('self.'+element[0]+' = self.'+element[0]+'_backup')
def serialize(self):
""" Returns a dictionary with both the variables of the interface and its values,
which can be restored with unserialize
"""
output = {}
for element in self.interface_groups:
output[element] = eval('self.'+element)
for element in self.interface_toggles:
output[element[0]] = eval('self.'+element[0])
for element in self.interface_text:
output[element[0]] = eval('self.'+element[0])
for element in self.interface_integer_adjustments:
output[element[0]] = eval('self.'+element[0])
for element in self.interface_float_adjustments:
output[element[0]] = eval('self.'+element[0])
for element in self.interface_colorbuttons:
output[element[0]] = eval('self.'+element[0])
for element in self.interface_fontbuttons:
output[element[0]] = eval('self.'+element[0])
for element in self.interface_filebuttons:
output[element[0]] = eval('self.'+element[0])
for element in self.interface_lists:
output[element[0]] = eval('self.'+element[0])
for element in self.interface_comboboxes:
output[element[0]] = eval('self.'+element[0])
return output
def unserialize(self,data_list):
""" Takes a dictionary with the variables of the interface and its values,
and restores them into their variables
"""
for element in self.interface_groups:
if element in data_list:
exec('self.'+element+' = data_list["'+element+'"]')
for element in self.interface_toggles:
if element[0] in data_list:
exec('self.'+element[0]+' = data_list["'+element[0]+'"]')
for element in self.interface_text:
if element[0] in data_list:
exec('self.'+element[0]+' = data_list["'+element[0]+'"]')
for element in self.interface_integer_adjustments:
if element[0] in data_list:
exec('self.'+element[0]+' = data_list["'+element[0]+'"]')
for element in self.interface_float_adjustments:
if element[0] in data_list:
exec('self.'+element[0]+' = data_list["'+element[0]+'"]')
for element in self.interface_colorbuttons:
if element[0] in data_list:
exec('self.'+element[0]+' = data_list["'+element[0]+'"]')
for element in self.interface_fontbuttons:
if element[0] in data_list:
exec('self.'+element[0]+' = data_list["'+element[0]+'"]')
for element in self.interface_filebuttons:
if element[0] in data_list:
exec('self.'+element[0]+' = data_list["'+element[0]+'"]')
for element in self.interface_lists:
if element[0] in data_list:
exec('self.'+element[0]+' = data_list["'+element[0]+'"]')
for element in self.interface_comboboxes:
if element[0] in data_list:
exec('self.'+element[0]+' = data_list["'+element[0]+'"]')

62
src/devede/opensave.py Normal file
View file

@ -0,0 +1,62 @@
# Copyright 2014 (C) Raster Software Vigo (Sergio Costas)
#
# This file is part of DeVeDe-NG
#
# DeVeDe-NG is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# DeVeDe-NG is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>
from gi.repository import Gtk
import os
import devede.configuration_data
class opensave_window:
def __init__(self, save):
self.config = devede.configuration_data.configuration.get_config()
self.save = save
def run(self,current_file = None):
builder = Gtk.Builder()
builder.set_translation_domain(self.config.gettext_domain)
if self.save:
builder.add_from_file(os.path.join(self.config.glade,"wsave_project.ui"))
else:
builder.add_from_file(os.path.join(self.config.glade,"wopen_project.ui"))
builder.connect_signals(self)
w_window = builder.get_object("data_project")
if current_file != None:
w_window.set_filename(current_file)
file_filter_projects=Gtk.FileFilter()
file_filter_projects.set_name(_("DevedeNG projects"))
file_filter_projects.add_pattern("*.devedeng")
file_filter_all=Gtk.FileFilter()
file_filter_all.set_name(_("All files"))
file_filter_all.add_pattern("*")
w_window.add_filter(file_filter_projects)
w_window.add_filter(file_filter_all)
w_window.show_all()
retval = w_window.run()
self.final_filename = w_window.get_filename()
w_window.destroy()
if (retval == 1):
return self.final_filename
else:
return None

View file

@ -20,6 +20,7 @@ import os
import time import time
import shutil import shutil
import urllib.parse import urllib.parse
import pickle
import devede.file_movie import devede.file_movie
import devede.ask import devede.ask
@ -35,6 +36,7 @@ import devede.end_job
import devede.vcdimager_converter import devede.vcdimager_converter
import devede.shutdown import devede.shutdown
import devede.about import devede.about
import devede.opensave
class devede_project: class devede_project:
@ -46,6 +48,7 @@ class devede_project:
self.menu = devede.dvd_menu.dvd_menu() self.menu = devede.dvd_menu.dvd_menu()
self.current_title = None self.current_title = None
self.project_file = None
builder = Gtk.Builder() builder = Gtk.Builder()
builder.set_translation_domain(self.config.gettext_domain) builder.set_translation_domain(self.config.gettext_domain)
@ -240,6 +243,8 @@ class devede_project:
element.delete_file() element.delete_file()
model.remove(treeiter) model.remove(treeiter)
self.set_interface_status(None) self.set_interface_status(None)
self.refresh_disc_usage()
def on_up_file_clicked(self,b): def on_up_file_clicked(self,b):
@ -251,6 +256,7 @@ class devede_project:
self.wfiles.get_model().swap(last_element.iter,treeiter) self.wfiles.get_model().swap(last_element.iter,treeiter)
self.set_interface_status(None) self.set_interface_status(None)
def on_down_file_clicked(self,b): def on_down_file_clicked(self,b):
(element, position, model, treeiter) = self.get_current_file() (element, position, model, treeiter) = self.get_current_file()
@ -482,10 +488,12 @@ class devede_project:
self.wmain_window.show() self.wmain_window.show()
def disc_done2(self,object, value): def disc_done2(self,object, value):
self.wmain_window.show() self.wmain_window.show()
def on_preview_file_clicked(self,b): def on_preview_file_clicked(self,b):
(element, position, model, treeiter) = self.get_current_file() (element, position, model, treeiter) = self.get_current_file()
@ -493,31 +501,115 @@ class devede_project:
return return
element.do_preview() element.do_preview()
def on_settings_activate(self,b): def on_settings_activate(self,b):
w = devede.settings.settings_window() w = devede.settings.settings_window()
def on_about_activate(self,b): def on_about_activate(self,b):
w = devede.about.about_window() w = devede.about.about_window()
def on_new_activate(self,b): def on_new_activate(self,b):
w = devede.ask.ask_window() w = devede.ask.ask_window()
if w.run(_("Delete current project and start a fresh one?"), _("New project")): if w.run(_("Close current project and start a fresh one?"), _("New project")):
self.wliststore_files.clear() self.wliststore_files.clear()
self.project_file = None
self.wmain_window.hide() self.wmain_window.hide()
devede.choose_disc_type.choose_disc_type() devede.choose_disc_type.choose_disc_type()
def on_wmain_window_drag_motion(self,wid, context, x, y, time): def on_wmain_window_drag_motion(self,wid, context, x, y, time):
Gdk.drag_status(context, Gdk.DragAction.COPY, time) Gdk.drag_status(context, Gdk.DragAction.COPY, time)
return True return True
def on_wmain_window_drag_drop(self, wid, context, x, y, time): def on_wmain_window_drag_drop(self, wid, context, x, y, time):
# Used with windows drag and drop # Used with windows drag and drop
return True return True
def on_wmain_window_drag_data_received(self, widget, drag_context, x,y, data, info, time): def on_wmain_window_drag_data_received(self, widget, drag_context, x,y, data, info, time):
uris = data.get_uris() uris = data.get_uris()
self.add_several_files(uris) self.add_several_files(uris)
Gtk.drag_finish (drag_context, True, Gdk.DragAction.COPY, time); Gtk.drag_finish (drag_context, True, Gdk.DragAction.COPY, time);
def on_save_activate(self,b):
if self.project_file != None:
self.save_current_project()
else:
self.on_save_as_activate(None)
def on_save_as_activate(self,b):
w = devede.opensave.opensave_window(True)
retval = w.run(self.project_file)
if retval != None:
self.project_file = retval
self.save_current_project()
def on_load_activate(self,b):
w = devede.opensave.opensave_window(False)
retval = w.run()
if retval != None:
self.load_project(retval)
def save_current_project(self):
project = {}
if not self.project_file.endswith(".devedeng"):
self.project_file += ".devedeng"
project["PAL"] = self.wuse_pal.get_active()
project["create_menu"] = self.wcreate_menu.get_active()
project["disc_type"] = self.config.disc_type
project["disc_size"] = self.wdisc_size.get_active()
project["files"] = []
f = self.get_all_files()
for i in f:
project["files"].append(i.store_file())
if self.disc_type == "dvd":
project["menu"] = self.menu.store_menu()
with open(self.project_file, 'wb') as f:
pickle.dump(project, f, 3)
def load_project(self,project_file):
self.wliststore_files.clear()
self.project_file = project_file
with open(project_file, 'rb') as f:
project = pickle.load(f)
if "disc_type" in project:
self.config.set_disc_type(project["disc_type"])
if "PAL" in project:
self.wuse_pal.set_active(project["PAL"])
if "create_menu" in project:
self.wcreate_menu.set_active(project["create_menu"])
if "disc_size" in project:
self.wdisc_size.set_active(project["disc_size"])
if "menu" in project:
self.menu.restore_menu(project["menu"])
if "files" in project:
error_list = []
for efile in project["files"]:
new_file = devede.file_movie.file_movie(efile["file_name"])
if (new_file.error):
error_list.append(os.path.basename(efile["file_name"]))
else:
new_file.restore_file(efile)
new_file.connect('title_changed',self.title_changed)
self.wliststore_files.append([new_file, new_file.title_name])
if (len(error_list)!=0):
devede.message.message_window(_("The following files in the project could not be added again:"),_("Error while adding files"),error_list)
self.set_interface_status(None)
self.refresh_disc_usage()