From 2cd17b8f4577df91de68a59945385526211e608c Mon Sep 17 00:00:00 2001 From: Sergio Costas Date: Tue, 5 Aug 2014 18:19:18 +0200 Subject: [PATCH] Added drag and drop support Fixed the size estimation --- data/interface/wmain.ui | 5 ++ src/devede/file_movie.py | 14 +++-- src/devede/project.py | 121 +++++++++++++++++++++++++-------------- 3 files changed, 93 insertions(+), 47 deletions(-) diff --git a/data/interface/wmain.ui b/data/interface/wmain.ui index 8643c35..98a03d0 100644 --- a/data/interface/wmain.ui +++ b/data/interface/wmain.ui @@ -44,6 +44,9 @@ center devede.svg + + + True @@ -70,6 +73,7 @@ False True True + @@ -112,6 +116,7 @@ False True True + diff --git a/src/devede/file_movie.py b/src/devede/file_movie.py index c906f95..3a476b9 100644 --- a/src/devede/file_movie.py +++ b/src/devede/file_movie.py @@ -45,6 +45,8 @@ class file_movie(devede.interface_manager.interface_manager): self.add_text("title_name", os.path.splitext(os.path.basename(file_name))[0]) self.add_label("original_size",None) self.add_label("original_length",None) + self.add_label("original_videorate",None) + self.add_label("original_audiorate",None) self.add_label("original_aspect_ratio",None) self.add_label("original_fps",None) @@ -188,12 +190,13 @@ class file_movie(devede.interface_manager.interface_manager): # let's asume 8kbps for each subtitle sub_rate = 8 * len(self.subtitles_list) - return estimated_size, videorate_fixed_size, self.audio_rate_final, sub_rate, self.width_final, self.height_final, self.original_length, self.audio_streams + return estimated_size, videorate_fixed_size, self.audio_rate_final * self.audio_streams, sub_rate, self.width_final, self.height_final, self.original_length - def set_auto_video_rate(self, new_video_rate): + def set_auto_video_audio_rate(self, new_video_rate, new_audio_rate): - self.video_rate_auto = new_video_rate + self.video_rate_auto = int(new_video_rate) + self.audio_rate_auto = int(new_audio_rate) def get_max_resolution(self,rx,ry,aspect): @@ -376,7 +379,8 @@ class file_movie(devede.interface_manager.interface_manager): def delete_file(self): - print("Deleted file "+self.file_name) + return + def properties(self): @@ -488,8 +492,8 @@ class file_movie(devede.interface_manager.interface_manager): self.on_aspect_classic_toggled(None) self.on_treeview_subtitles_cursor_changed(None) - def on_aspect_classic_toggled(self,b): + def on_aspect_classic_toggled(self,b): status1 = self.waspect_classic.get_active() status2 = self.waspect_wide.get_active() diff --git a/src/devede/project.py b/src/devede/project.py index 243dbb1..fe29a42 100644 --- a/src/devede/project.py +++ b/src/devede/project.py @@ -15,10 +15,11 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see -from gi.repository import Gtk +from gi.repository import Gtk, Gdk import os import time import shutil +import urllib.parse import devede.file_movie import devede.ask @@ -92,6 +93,11 @@ class devede_project: if (self.disc_type != None): self.set_type(None, self.disc_type) + self.wmain_window.drag_dest_set(Gtk.DestDefaults.ALL,[],Gdk.DragAction.COPY) + targets = Gtk.TargetList.new([]) + targets.add(Gdk.Atom.intern("text/uri-list", False),0,0) + self.wmain_window.drag_dest_set_target_list(targets) + def set_type(self,obj=None,disc_type=None): """ this method sets the disk type to the specified one and adapts the interface @@ -111,8 +117,10 @@ class devede_project: if (self.disc_type == "dvd"): self.wframe_menu.show_all() + self.wcreate_menu.set_active(True) else: self.wframe_menu.hide() + self.wcreate_menu.set_active(False) def get_current_file(self): @@ -199,16 +207,22 @@ class devede_project: def on_add_file_clicked(self,b): - error_list = [] ask_files = devede.add_files.add_files() if (ask_files.run()): - for efile in ask_files.files: - new_file = devede.file_movie.file_movie(efile) - if (new_file.error): - error_list.append(os.path.basename(efile)) - else: - new_file.connect('title_changed',self.title_changed) - self.wliststore_files.append([new_file, new_file.title_name]) + self.add_several_files(ask_files.files) + + + def add_several_files(self,file_list): + error_list = [] + for efile in file_list: + if efile.startswith("file://"): + efile = urllib.parse.unquote(efile[7:]) + new_file = devede.file_movie.file_movie(efile) + if (new_file.error): + error_list.append(os.path.basename(efile)) + else: + 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 could not be added:"),_("Error while adding files"),error_list) self.set_interface_status(None) @@ -266,30 +280,57 @@ class devede_project: fixed_size = 0 to_adjust = [] for f in self.get_all_files(): - estimated_size, videorate_fixed_size, audio_rate, sub_rate, width, height, time_length, n_audio_streams = f.get_size_data() + estimated_size, videorate_fixed_size, audio_rate, sub_rate, width, height, time_length = f.get_size_data() if videorate_fixed_size: fixed_size += estimated_size else: - fixed_size += (((audio_rate * n_audio_streams) + sub_rate) * time_length) / 8 + fixed_size += ((audio_rate + sub_rate) * time_length) # 76800 = 320x240, which is the smallest resolution - surface = ((width * height) / 76800.0) * time_length - to_adjust.append( (f, surface, time_length) ) + surface = ((float(width) * float(height)) / 76800.0) * float(time_length) + to_adjust.append( (f, surface, time_length, audio_rate) ) total_resolution += surface if (self.disc_type == "dvd") and (self.wcreate_menu.get_active()): - fixed_size += self.menu.get_estimated_size() + fixed_size += self.menu.get_estimated_size() * 8.0 if (total_resolution != 0): - remaining_disc_size = ((1000 * self.get_dvd_size()[0]) - fixed_size) * 8 # in kbits + remaining_disc_size = ((8000.0 * self.get_dvd_size()[0]) - fixed_size) # in kbits for l in to_adjust: f = l[0] surface = l[1] length = l[2] - f.set_auto_video_rate((remaining_disc_size * surface) / (total_resolution * length)) + audio_rate = l[3] + f.set_auto_video_audio_rate((remaining_disc_size * surface) / ( length * total_resolution), audio_rate) self.refresh_disc_usage() + def refresh_disc_usage(self): + + used = 0.0 + + for f in self.get_all_files(): + estimated_size = f.get_estimated_size() + used += float(estimated_size) + + if self.wcreate_menu.get_active(): + used += float(self.menu.get_estimated_size()) + + used /= 1000.0 + + disc_size,minvrate,maxvrate = self.get_dvd_size() + + if used > disc_size: + self.wdisc_fill_level.set_fraction(1.0) + addv=1 + else: + self.wdisc_fill_level.set_fraction(used / disc_size) + addv=0 + + self.wdisc_fill_level.set_text(str(addv+int((used / disc_size)*100))+"%") + self.wdisc_fill_level.set_show_text(True) + + def on_menu_options_clicked(self,b): self.menu.show_configuration(self.get_all_files()) @@ -339,31 +380,6 @@ class devede_project: return size,minvrate,maxvrate - def refresh_disc_usage(self): - - used = 0.0 - - for f in self.get_all_files(): - estimated_size = f.get_estimated_size() - used += float(estimated_size) - - if self.wcreate_menu.get_active(): - used += float(self.menu.get_estimated_size()) - - used /= 1000.0 - - disc_size,minvrate,maxvrate = self.get_dvd_size() - - if used > disc_size: - self.wdisc_fill_level.set_fraction(1.0) - addv=1 - else: - self.wdisc_fill_level.set_fraction(used / disc_size) - addv=0 - self.wdisc_fill_level.set_text(str(addv+int((used / disc_size)*100))+"%") - self.wdisc_fill_level.set_show_text(True) - - def on_disc_size_changed(self,c): self.refresh_disc_usage() @@ -483,4 +499,25 @@ class devede_project: def on_about_activate(self,b): - w = devede.about.about_window() \ No newline at end of file + 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")): + self.wliststore_files.clear() + 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