From dc350be634bd04966492ddf2524ef08c0ec237fe Mon Sep 17 00:00:00 2001 From: Sergio Costas Date: Tue, 5 Aug 2014 23:36:00 +0200 Subject: [PATCH] Now can load and save a project --- data/interface/wmain.ui | 3 ++ data/interface/wopen_project.ui | 69 ++++++++++++++++++++++++ data/interface/wsave_project.ui | 67 +++++++++++++++++++++++ src/devede/dvd_menu.py | 12 ++++- src/devede/file_movie.py | 12 ++++- src/devede/interface_manager.py | 66 +++++++++++++++++++++++ src/devede/opensave.py | 62 +++++++++++++++++++++ src/devede/project.py | 96 ++++++++++++++++++++++++++++++++- 8 files changed, 383 insertions(+), 4 deletions(-) create mode 100644 data/interface/wopen_project.ui create mode 100644 data/interface/wsave_project.ui create mode 100644 src/devede/opensave.py 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 @@ False True True + @@ -92,6 +93,7 @@ False True True + @@ -101,6 +103,7 @@ False True True + 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 @@ + + + + + + 680 + 420 + False + True + center + devede.svg + normal + False + + + 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/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