Added drag and drop support

Fixed the size estimation
This commit is contained in:
Sergio Costas 2014-08-05 18:19:18 +02:00
parent 9739d859b7
commit 2cd17b8f45
3 changed files with 93 additions and 47 deletions

View file

@ -44,6 +44,9 @@
<property name="window_position">center</property>
<property name="icon">devede.svg</property>
<signal name="delete-event" handler="on_wmain_window_delete_event" swapped="no"/>
<signal name="drag-data-received" handler="on_wmain_window_drag_data_received" swapped="no"/>
<signal name="drag-drop" handler="on_wmain_window_drag_drop" swapped="no"/>
<signal name="drag-motion" handler="on_wmain_window_drag_motion" swapped="no"/>
<child>
<object class="GtkBox" id="box1">
<property name="visible">True</property>
@ -70,6 +73,7 @@
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_new_activate" swapped="no"/>
</object>
</child>
<child>
@ -112,6 +116,7 @@
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_wmain_window_delete_event" swapped="no"/>
</object>
</child>
</object>

View file

@ -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()

View file

@ -15,10 +15,11 @@
# 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
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()
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);