Added dvd menu window

Added support for modification callbacks in the interface_manager class

Added support for ColorButton widgets in the interface_manager class
This commit is contained in:
Sergio Costas 2014-07-19 01:50:07 +02:00
parent cc395dcbd8
commit 7e49cf9146
7 changed files with 1271 additions and 43 deletions

View file

@ -602,7 +602,7 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkFrame" id="frame3"> <object class="GtkFrame" id="frame_menu">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="label_xalign">0</property> <property name="label_xalign">0</property>
@ -624,6 +624,7 @@
<property name="receives_default">False</property> <property name="receives_default">False</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="draw_indicator">True</property> <property name="draw_indicator">True</property>
<signal name="toggled" handler="on_create_menu_toggled" swapped="no"/>
</object> </object>
<packing> <packing>
<property name="left_attach">0</property> <property name="left_attach">0</property>
@ -633,11 +634,12 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkButton" id="button2"> <object class="GtkButton" id="menu_options">
<property name="label" translatable="yes">Menu options</property> <property name="label" translatable="yes">Menu options</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">True</property> <property name="receives_default">True</property>
<signal name="clicked" handler="on_menu_options_clicked" swapped="no"/>
</object> </object>
<packing> <packing>
<property name="left_attach">0</property> <property name="left_attach">0</property>
@ -647,7 +649,7 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkButton" id="button3"> <object class="GtkButton" id="preview_menu">
<property name="label" translatable="yes">Preview menu</property> <property name="label" translatable="yes">Preview menu</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>

1048
data/interface/wmenu.ui Normal file

File diff suppressed because it is too large Load diff

View file

@ -88,6 +88,7 @@ class configuration(GObject.GObject):
self.subtitles_font_size = 28 self.subtitles_font_size = 28
self.sub_language = None self.sub_language = None
self.sub_codepage = None self.sub_codepage = None
self.menu_dynamic_preview = False
config_path = os.path.join(os.environ.get("HOME"),".devede") config_path = os.path.join(os.environ.get("HOME"),".devede")
try: try:
@ -136,6 +137,11 @@ class configuration(GObject.GObject):
continue continue
if linea[:19]=="subtitle_font_size:": if linea[:19]=="subtitle_font_size:":
self.subtitles_font_size = int(linea[19:].strip()) self.subtitles_font_size = int(linea[19:].strip())
if linea[:21]=="menu_dynamic_preview:":
if linea[21] == '0':
self.menu_dynamic_preview = False
else:
self.menu_dynamic_preview = True
config_data.close() config_data.close()
except: except:
pass pass
@ -182,6 +188,11 @@ class configuration(GObject.GObject):
config_data.write("sub_codepage:"+str(self.sub_codepage)+"\n") config_data.write("sub_codepage:"+str(self.sub_codepage)+"\n")
if (self.sub_language != None): if (self.sub_language != None):
config_data.write("sub_language:"+str(self.sub_language)+"\n") config_data.write("sub_language:"+str(self.sub_language)+"\n")
config_data.write("menu_dynamic_preview:")
if (self.menu_dynamic_preview):
config_data.write("1\n")
else:
config_data.write("0\n")
config_data.write("subtitle_font_size:"+str(self.subtitles_font_size)+"\n") config_data.write("subtitle_font_size:"+str(self.subtitles_font_size)+"\n")
config_data.close() config_data.close()
except: except:

85
src/devede/dvd_menu.py Normal file
View file

@ -0,0 +1,85 @@
# 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
import devede.interface_manager
class dvd_menu(devede.interface_manager.interface_manager):
def __init__(self):
devede.interface_manager.interface_manager.__init__(self)
self.config = devede.configuration_data.configuration.get_config()
self.add_toggle("dynamic_preview", self.config.menu_dynamic_preview)
self.add_colorbutton("title_color", (0,0,0,1), self.update_preview)
self.add_colorbutton("title_shadow", (0,0,0,0), self.update_preview)
self.add_colorbutton("unselected_color", (1,1,1,1), self.update_preview)
self.add_colorbutton("shadow_color", (0,0,0,0), self.update_preview)
self.add_colorbutton("selected_color", (0,1,1,1), self.update_preview)
self.add_colorbutton("background_color", (0,0,0,0.75), self.update_preview)
self.add_text("title_text", None, self.update_preview)
self.add_group("position_vertical", ["top", "middle", "bottom"], "middle", self.update_preview)
self.add_group("position_horizontal", ["left", "center", "right"], "center", self.update_preview)
self.add_float_adjustment("margin_left", 10.0, self.update_preview)
self.add_float_adjustment("margin_top", 12.5, self.update_preview)
self.add_float_adjustment("margin_right", 10.0, self.update_preview)
self.add_float_adjustment("margin_bottom", 12.5, self.update_preview)
self.add_group("at_startup", ["menu_show_at_startup", "play_first_title_at_startup"], "menu_show_at_startup")
def update_preview(self,b=None):
print("Cambiado algo")
def on_dynamic_preview_toggled(self,b):
self.config.menu_dynamic_preview = self.wdynamic_preview.get_active()
if (self.config.menu_dynamic_preview):
self.wframe_preview.show_all()
else:
self.wframe_preview.hide()
def show_configuration(self):
self.builder = Gtk.Builder()
self.builder.set_translation_domain(self.config.gettext_domain)
self.builder.add_from_file(os.path.join(self.config.glade,"wmenu.ui"))
self.builder.connect_signals(self)
self.wdynamic_preview = self.builder.get_object("dynamic_preview")
self.wframe_preview = self.builder.get_object("frame_preview")
self.wmenu = self.builder.get_object("menu")
self.wmenu.show_all()
self.update_ui(self.builder)
self.on_dynamic_preview_toggled(None)
def on_accept_clicked(self,b):
self.store_ui(self.builder)
self.wmenu.destroy()

View file

@ -29,7 +29,6 @@ class file_movie(devede.interface_manager.interface_manager):
def __init__(self,file_name): def __init__(self,file_name):
GObject.GObject.__init__(self)
devede.interface_manager.interface_manager.__init__(self) devede.interface_manager.interface_manager.__init__(self)
self.wfile_properties = None self.wfile_properties = None

View file

@ -15,7 +15,7 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/> # along with this program. If not, see <http://www.gnu.org/licenses/>
from gi.repository import GObject from gi.repository import GObject,Gdk
class interface_manager(GObject.GObject): class interface_manager(GObject.GObject):
""" This class allows to automatically generate variables for a GLADE interface, """ This class allows to automatically generate variables for a GLADE interface,
@ -24,6 +24,7 @@ class interface_manager(GObject.GObject):
def __init__(self): def __init__(self):
GObject.GObject.__init__(self)
self.interface_groups = {} self.interface_groups = {}
self.interface_toggles = [] self.interface_toggles = []
self.interface_labels = [] self.interface_labels = []
@ -33,8 +34,9 @@ class interface_manager(GObject.GObject):
self.interface_float_adjustments = [] self.interface_float_adjustments = []
self.interface_integer_adjustments = [] self.interface_integer_adjustments = []
self.interface_lists = [] self.interface_lists = []
self.interface_colorbuttons = []
def add_group(self,group_name,radiobutton_list,default_value): def add_group(self,group_name,radiobutton_list,default_value,callback = None):
""" Adds a group of radiobuttons and creates an internal variable with """ Adds a group of radiobuttons and creates an internal variable with
the name group_name, setting it to default_value. The the name group_name, setting it to default_value. The
value for the variable will be the name of the active value for the variable will be the name of the active
@ -44,17 +46,17 @@ class interface_manager(GObject.GObject):
exec('self.'+group_name+' = "'+str(default_value)+'"') exec('self.'+group_name+' = "'+str(default_value)+'"')
else: else:
exec('self.'+group_name+' = None') exec('self.'+group_name+' = None')
self.interface_groups[group_name] = radiobutton_list self.interface_groups[group_name] = ( radiobutton_list, callback )
def add_toggle(self,toggle_name,default_value): def add_toggle(self,toggle_name,default_value,callback = None):
""" Adds an internal variable with the name toggle_name, linked to a widget """ Adds an internal variable with the name toggle_name, linked to a widget
element with the same name (must be or inherint from Gtk.ToogleButton). element with the same name (must be or inherint from Gtk.ToogleButton).
The default value can be True of False """ The default value can be True of False """
exec('self.'+toggle_name+' = '+str(default_value)) exec('self.'+toggle_name+' = '+str(default_value))
self.interface_toggles.append(toggle_name) self.interface_toggles.append( (toggle_name, callback) )
def add_text(self,text_name,default_value): def add_text(self,text_name,default_value,callback = None):
""" Adds an internal variable with the name text_name, linked to an """ Adds an internal variable with the name text_name, linked to an
element with the same name (must be a Gtk.TextEntry or a Gtk.Label). element with the same name (must be a Gtk.TextEntry or a Gtk.Label).
The default value can be a text or None """ The default value can be a text or None """
@ -63,7 +65,7 @@ class interface_manager(GObject.GObject):
exec('self.'+text_name+' = "'+str(default_value)+'"') exec('self.'+text_name+' = "'+str(default_value)+'"')
else: else:
exec('self.'+text_name+' = None') exec('self.'+text_name+' = None')
self.interface_text.append(text_name) self.interface_text.append( (text_name, callback) )
def add_label(self,text_name,default_value): def add_label(self,text_name,default_value):
""" Adds an internal variable with the name text_name, linked to an """ Adds an internal variable with the name text_name, linked to an
@ -74,26 +76,36 @@ class interface_manager(GObject.GObject):
exec('self.'+text_name+' = default_value') exec('self.'+text_name+' = default_value')
self.interface_labels.append(text_name) self.interface_labels.append(text_name)
def add_integer_adjustment(self,adjustment_name,default_value): def add_integer_adjustment(self,adjustment_name,default_value,callback = None):
""" Adds an internal variable with the name text_name, linked to an """ Adds an internal variable with the name text_name, linked to an
element with the same name (must be a Gtk.Adjustment). element with the same name (must be a Gtk.Adjustment).
The default value must be an integer """ The default value must be an integer """
exec('self.'+adjustment_name+' = '+str(default_value)) exec('self.'+adjustment_name+' = '+str(default_value))
self.interface_integer_adjustments.append(adjustment_name) self.interface_integer_adjustments.append( (adjustment_name, callback) )
def add_float_adjustment(self,adjustment_name,default_value): def add_float_adjustment(self,adjustment_name,default_value,callback = None):
""" Adds an internal variable with the name text_name, linked to an """ Adds an internal variable with the name text_name, linked to an
element with the same name (must be a Gtk.Adjustment). element with the same name (must be a Gtk.Adjustment).
The default value must be an float """ The default value must be an float """
exec('self.'+adjustment_name+' = '+str(default_value)) exec('self.'+adjustment_name+' = '+str(default_value))
self.interface_float_adjustments.append(adjustment_name) self.interface_float_adjustments.append( (adjustment_name, callback))
def add_list(self,liststore_name): def add_list(self,liststore_name,callback = None):
""" Adds an internal variable with the name liststore_name, linked to
an element with the same name (must be a Gtk.ListStore). """
exec('self.'+liststore_name+' = []') exec('self.'+liststore_name+' = []')
self.interface_lists.append(liststore_name) self.interface_lists.append( (liststore_name, callback ))
def add_colorbutton(self,colorbutton_name, default_value,callback = None):
""" Adds an internal variable with the name text_name, linked to an
element with the same name (must be a Gtk.ColorButton).
The default value must be a set with RGBA values """
exec('self.'+colorbutton_name+' = default_value')
self.interface_colorbuttons.append( (colorbutton_name, callback ))
def add_show_hide(self,element_name,to_show,to_hide): def add_show_hide(self,element_name,to_show,to_hide):
""" Adds an element that can be active or inactive, and two lists of elements. """ Adds an element that can be active or inactive, and two lists of elements.
@ -119,17 +131,30 @@ class interface_manager(GObject.GObject):
for key in self.interface_groups: for key in self.interface_groups:
obj = eval('self.'+key) obj = eval('self.'+key)
builder.get_object(obj).set_active(True) builder.get_object(obj).set_active(True)
callback = self.interface_groups[key][1]
if (callback != None):
for element in self.interface_groups[key][0]:
obj = builder.get_object(element)
obj.connect("toggled",callback)
for element in self.interface_toggles: for element in self.interface_toggles:
value = eval('self.'+element) value = eval('self.'+element[0])
builder.get_object(element).set_active(value) obj = builder.get_object(element[0])
obj.set_active(value)
callback = element[1]
if (callback != None):
obj.connect("toggled",callback)
for element in self.interface_text: for element in self.interface_text:
value = eval('self.'+element) value = eval('self.'+element[0])
obj = builder.get_object(element[0])
if (value != None): if (value != None):
builder.get_object(element).set_text(value) obj.set_text(value)
else: else:
builder.get_object(element).set_text("") obj.set_text("")
callback = element[1]
if (callback != None):
obj.connect("changed",callback)
for element in self.interface_labels: for element in self.interface_labels:
value = eval('self.'+element) value = eval('self.'+element)
@ -139,19 +164,43 @@ class interface_manager(GObject.GObject):
builder.get_object(element).set_text("") builder.get_object(element).set_text("")
for element in self.interface_integer_adjustments: for element in self.interface_integer_adjustments:
value = eval('self.'+element) value = eval('self.'+element[0])
builder.get_object(element).set_value(float(value)) obj = builder.get_object(element[0])
obj.set_value(float(value))
callback = element[1]
if (callback != None):
obj.connect("value_changed",callback)
for element in self.interface_float_adjustments: for element in self.interface_float_adjustments:
value = eval('self.'+element) value = eval('self.'+element[0])
builder.get_object(element).set_value(value) obj = builder.get_object(element[0])
obj.set_value(value)
callback = element[1]
if (callback != None):
obj.connect("value_changed",callback)
for element in self.interface_lists: for element in self.interface_lists:
obj = eval('self.'+element) obj = eval('self.'+element[0])
the_liststore = builder.get_object(element) the_liststore = builder.get_object(element[0])
the_liststore.clear() the_liststore.clear()
for item in obj: for item in obj:
the_liststore.append(item) the_liststore.append(item)
callback = element[1]
if (callback != None):
the_liststore.connect("row_changed",callback)
the_liststore.connect("row_deleted",callback)
the_liststore.connect("row_inserted",callback)
the_liststore.connect("row_reordered",callback)
for element in self.interface_colorbuttons:
value = eval('self.'+element[0])
colorbtn = builder.get_object(element[0])
objcolor = Gdk.Color(int(value[0]*65535.0),int(value[1]*65535.0),int(value[2]*65535.0))
colorbtn.set_color(objcolor)
colorbtn.set_alpha(int(value[3]*65535.0))
callback = element[1]
if (callback != None):
colorbtn.connect("color_set",callback)
self.interface_show_hide_obj = {} self.interface_show_hide_obj = {}
for element in self.interface_show_hide: for element in self.interface_show_hide:
@ -250,39 +299,46 @@ class interface_manager(GObject.GObject):
""" Takes the values of the widgets and stores them in the internal variables """ """ Takes the values of the widgets and stores them in the internal variables """
for key in self.interface_groups: for key in self.interface_groups:
for element in self.interface_groups[key]: for element in self.interface_groups[key][0]:
obj = builder.get_object(element) obj = builder.get_object(element)
if obj.get_active(): if obj.get_active():
exec('self.'+key+' = "'+element+'"') exec('self.'+key+' = "'+element+'"')
break break
for element in self.interface_toggles: for element in self.interface_toggles:
obj = builder.get_object(element) obj = builder.get_object(element[0])
if obj.get_active(): if obj.get_active():
exec('self.'+element+' = True') exec('self.'+element[0]+' = True')
else: else:
exec('self.'+element+' = False') exec('self.'+element[0]+' = False')
for element in self.interface_text: for element in self.interface_text:
obj = builder.get_object(element) obj = builder.get_object(element[0])
exec('self.'+element+' = obj.get_text()') exec('self.'+element[0]+' = obj.get_text()')
for element in self.interface_integer_adjustments: for element in self.interface_integer_adjustments:
obj = builder.get_object(element) obj = builder.get_object(element[0])
exec('self.'+element+' = int(obj.get_value())') exec('self.'+element[0]+' = int(obj.get_value())')
for element in self.interface_float_adjustments: for element in self.interface_float_adjustments:
obj = builder.get_object(element) obj = builder.get_object(element[0])
exec('self.'+element+' = obj.get_value()') exec('self.'+element[0]+' = obj.get_value()')
for element in self.interface_colorbuttons:
colorbtn = builder.get_object(element[0])
objcolor = colorbtn.get_color()
alpha = colorbtn.get_alpha()
exec('self.'+element[0]+' = ((float(objcolor.red))/65535.0, (float(objcolor.green))/65535.0, (float(objcolor.blue))/65535.0, (float(alpha))/65535.0)')
for element in self.interface_lists: for element in self.interface_lists:
exec('self.'+element+' = []') exec('self.'+element[0]+' = []')
the_liststore = builder.get_object(element) the_liststore = builder.get_object(element[0])
ncolumns = the_liststore.get_n_columns() ncolumns = the_liststore.get_n_columns()
for row in the_liststore: for row in the_liststore:
final_row = [] final_row = []
for c in range(0,ncolumns): for c in range(0,ncolumns):
final_row.append(row.model[row.iter][c]) final_row.append(row.model[row.iter][c])
print (final_row) print (final_row)
exec('self.'+element+'.append(final_row)') exec('self.'+element[0]+'.append(final_row)')

View file

@ -22,6 +22,7 @@ import devede.file_movie
import devede.ask import devede.ask
import devede.add_files import devede.add_files
import devede.message import devede.message
import devede.dvd_menu
class devede_project: class devede_project:
@ -30,6 +31,7 @@ class devede_project:
self.config = devede.configuration_data.configuration.get_config() self.config = devede.configuration_data.configuration.get_config()
self.disc_type = self.config.disc_type self.disc_type = self.config.disc_type
self.menu = devede.dvd_menu.dvd_menu()
self.current_title = None self.current_title = None
@ -47,9 +49,14 @@ class devede_project:
self.wdisc_fill_level = builder.get_object("disc_fill_level") self.wdisc_fill_level = builder.get_object("disc_fill_level")
self.wuse_pal = builder.get_object("use_pal") self.wuse_pal = builder.get_object("use_pal")
self.wuse_ntsc = builder.get_object("use_ntsc") self.wuse_ntsc = builder.get_object("use_ntsc")
self.wcreate_menu = builder.get_object("create_menu")
self.wframe_titles = builder.get_object("frame_titles") self.wframe_titles = builder.get_object("frame_titles")
self.wframe_menu = builder.get_object("frame_menu")
self.wcreate_menu = builder.get_object("create_menu")
self.wmenu_options = builder.get_object("menu_options")
self.wpreview_menu = builder.get_object("preview_menu")
self.wadd_file = builder.get_object("add_file") self.wadd_file = builder.get_object("add_file")
self.wdelete_file = builder.get_object("delete_file") self.wdelete_file = builder.get_object("delete_file")
self.wup_file = builder.get_object("up_file") self.wup_file = builder.get_object("up_file")
@ -67,6 +74,8 @@ class devede_project:
else: else:
self.wuse_ntsc.set_active(True) self.wuse_ntsc.set_active(True)
self.wcreate_menu.set_active(True)
self.config.connect('disc_type',self.set_type) self.config.connect('disc_type',self.set_type)
if (self.disc_type != None): if (self.disc_type != None):
self.set_type(None, self.disc_type) self.set_type(None, self.disc_type)
@ -88,6 +97,11 @@ class devede_project:
else: else:
self.wdisc_size.set_active(3) # 700 MB CD self.wdisc_size.set_active(3) # 700 MB CD
if (self.disc_type == "dvd"):
self.wframe_menu.show_all()
else:
self.wframe_menu.hide()
def get_current_file(self): def get_current_file(self):
@ -119,6 +133,12 @@ class devede_project:
self.wproperties_file.set_sensitive(True) self.wproperties_file.set_sensitive(True)
self.wpreview_file.set_sensitive(True) self.wpreview_file.set_sensitive(True)
self.config.PAL = self.wuse_pal.get_active()
status = self.wcreate_menu.get_active()
self.wmenu_options.set_sensitive(status)
self.wpreview_menu.set_sensitive(status)
(element, position, model, treeiter) = self.get_current_file() (element, position, model, treeiter) = self.get_current_file()
if (element == None): if (element == None):
self.wdelete_file.set_sensitive(False) self.wdelete_file.set_sensitive(False)
@ -138,7 +158,9 @@ class devede_project:
def on_use_pal_toggled(self,b): def on_use_pal_toggled(self,b):
self.config.PAL = self.wuse_pal.get_active() self.set_interface_status(None)
def on_wmain_window_delete_event(self,b,e=None): def on_wmain_window_delete_event(self,b,e=None):
@ -210,8 +232,13 @@ class devede_project:
return return
element.properties() element.properties()
def on_create_menu_toggled(self,b):
self.set_interface_status(None)
def on_adjust_disc_usage_clicked(self,b): def on_adjust_disc_usage_clicked(self,b):
pass pass
def on_menu_options_clicked(self,b):
self.menu.show_configuration()