diff --git a/data/interface/wmain.ui b/data/interface/wmain.ui
index 98a03d0..ed76b57 100644
--- a/data/interface/wmain.ui
+++ b/data/interface/wmain.ui
@@ -83,6 +83,7 @@
FalseTrueTrue
+
@@ -92,6 +93,7 @@
FalseTrueTrue
+
@@ -101,6 +103,7 @@
FalseTrueTrue
+
diff --git a/data/interface/wopen_project.ui b/data/interface/wopen_project.ui
new file mode 100644
index 0000000..e3008f4
--- /dev/null
+++ b/data/interface/wopen_project.ui
@@ -0,0 +1,69 @@
+
+
+
+
+
+
diff --git a/data/interface/wsave_project.ui b/data/interface/wsave_project.ui
new file mode 100644
index 0000000..fd3c2b7
--- /dev/null
+++ b/data/interface/wsave_project.ui
@@ -0,0 +1,67 @@
+
+
+
+
+
+ False
+ True
+ center
+ devede.svg
+ normal
+ save
+
+
+ False
+ vertical
+ 2
+
+
+ False
+ end
+
+
+ gtk-cancel
+ True
+ True
+ True
+ True
+
+
+ False
+ True
+ 0
+
+
+
+
+ gtk-ok
+ True
+ True
+ True
+ True
+
+
+ False
+ True
+ 1
+
+
+
+
+ False
+ True
+ end
+ 0
+
+
+
+
+
+
+
+
+ button1
+ button2
+
+
+
diff --git a/src/devede/dvd_menu.py b/src/devede/dvd_menu.py
index 82f7f51..25e63df 100644
--- a/src/devede/dvd_menu.py
+++ b/src/devede/dvd_menu.py
@@ -599,4 +599,14 @@ class dvd_menu(devede.interface_manager.interface_manager):
processes.append(converter)
n_page += 1
- return processes,menu_entries
\ No newline at end of file
+ return processes,menu_entries
+
+
+ def store_menu(self):
+
+ return self.serialize()
+
+
+ def restore_menu(self,data):
+
+ self.unserialize(data)
\ No newline at end of file
diff --git a/src/devede/file_movie.py b/src/devede/file_movie.py
index 3a476b9..9132e23 100644
--- a/src/devede/file_movie.py
+++ b/src/devede/file_movie.py
@@ -634,4 +634,14 @@ class file_movie(devede.interface_manager.interface_manager):
if (retval == 0):
cv = devede.converter.converter.get_converter()
disc_player = (cv.get_film_player())()
- disc_player.play_film(os.path.join(self.config.tmp_folder,"movie_preview.mpg"))
\ No newline at end of file
+ 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)
diff --git a/src/devede/interface_manager.py b/src/devede/interface_manager.py
index 0b08531..eedd378 100644
--- a/src/devede/interface_manager.py
+++ b/src/devede/interface_manager.py
@@ -462,3 +462,69 @@ class interface_manager(GObject.GObject):
exec('self.'+element[0]+' = self.'+element[0]+'_backup')
for element in self.interface_comboboxes:
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]+'"]')
diff --git a/src/devede/opensave.py b/src/devede/opensave.py
new file mode 100644
index 0000000..95bc941
--- /dev/null
+++ b/src/devede/opensave.py
@@ -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
+
+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
\ No newline at end of file
diff --git a/src/devede/project.py b/src/devede/project.py
index fe29a42..3beb4ab 100644
--- a/src/devede/project.py
+++ b/src/devede/project.py
@@ -20,6 +20,7 @@ import os
import time
import shutil
import urllib.parse
+import pickle
import devede.file_movie
import devede.ask
@@ -35,6 +36,7 @@ import devede.end_job
import devede.vcdimager_converter
import devede.shutdown
import devede.about
+import devede.opensave
class devede_project:
@@ -46,6 +48,7 @@ class devede_project:
self.menu = devede.dvd_menu.dvd_menu()
self.current_title = None
+ self.project_file = None
builder = Gtk.Builder()
builder.set_translation_domain(self.config.gettext_domain)
@@ -240,6 +243,8 @@ class devede_project:
element.delete_file()
model.remove(treeiter)
self.set_interface_status(None)
+ self.refresh_disc_usage()
+
def on_up_file_clicked(self,b):
@@ -251,6 +256,7 @@ class devede_project:
self.wfiles.get_model().swap(last_element.iter,treeiter)
self.set_interface_status(None)
+
def on_down_file_clicked(self,b):
(element, position, model, treeiter) = self.get_current_file()
@@ -482,10 +488,12 @@ class devede_project:
self.wmain_window.show()
+
def disc_done2(self,object, value):
self.wmain_window.show()
+
def on_preview_file_clicked(self,b):
(element, position, model, treeiter) = self.get_current_file()
@@ -493,31 +501,115 @@ class devede_project:
return
element.do_preview()
+
def on_settings_activate(self,b):
w = devede.settings.settings_window()
+
def on_about_activate(self,b):
w = devede.about.about_window()
+
def on_new_activate(self,b):
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.project_file = None
self.wmain_window.hide()
devede.choose_disc_type.choose_disc_type()
+
def on_wmain_window_drag_motion(self,wid, context, x, y, time):
Gdk.drag_status(context, Gdk.DragAction.COPY, time)
return True
+
def on_wmain_window_drag_drop(self, wid, context, x, y, time):
# Used with windows drag and drop
return True
+
def on_wmain_window_drag_data_received(self, widget, drag_context, x,y, data, info, time):
uris = data.get_uris()
self.add_several_files(uris)
- Gtk.drag_finish (drag_context, True, Gdk.DragAction.COPY, time);
\ No newline at end of file
+ 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()
\ No newline at end of file