laditools/laditools/gtk/menu.py

228 lines
10 KiB
Python

#!/usr/bin/python
# LADITools - Linux Audio Desktop Integration Tools
# Copyright (C) 2011-2012 Alessio Treglia <quadrispro@ubuntu.com>
# Copyright (C) 2007-2010:
# * Marc-Olivier Barre <marco@marcochapeau.org>
# * Nedko Arnaudov <nedko@arnaudov.name>
#
# This program 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.
#
# This program 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/>.
import os
import sys
import subprocess
from gi.repository import Gtk
from gi.repository import GObject
from .. import _gettext_domain
from .manager import LadiManagerGtk
class LadiMenu(LadiManagerGtk):
def __init__(self, jack_autostart, **kwargs):
LadiManagerGtk.__init__(self, jack_autostart)
self.handler = { 'quit' : Gtk.main_quit, }
if 'quit_handler' in kwargs:
self.handler['quit'] = kwargs['quit']
def on_menu_show_diagnose(self, widget, data=None):
dlg = Gtk.MessageDialog(None,
Gtk.DialogFlags.MODAL,
Gtk.MessageType.ERROR,
Gtk.ButtonsType.CLOSE,
self.diagnose_text)
dlg.set_title(_("Cannot communicate JACK D-Bus"))
dlg.run()
dlg.destroy()
def on_menu_command(self, widget, function):
try:
function()
except Exception as e:
error = Gtk.MessageDialog(None,
Gtk.DialogFlags.MODAL,
Gtk.MessageType.ERROR,
Gtk.ButtonsType.OK,
_("Error executing ") +
repr(function) +
_("Unexpected error\n\n") + repr(e))
error.run()
error.destroy()
def on_menu_launch_handler(self, widget, command, kill=True):
commandline = command.split()
commandline[0] = command = self._launcher_which(commandline[0])
if not command in self.proc_list:
LadiManagerGtk.launcher_exec(self, command=commandline)
elif kill:
LadiManagerGtk.launcher_kill(self, command=commandline)
def menu_clear(self, menu):
menu.foreach(lambda item,none: menu.remove(item), None)
def configure_list_fill(self, widget, function):
menu = widget.get_submenu()
self.menu_clear(menu)
try:
jack = self.get_jack_configure()
# 'engine' item
item = Gtk.MenuItem(_("JACK engine"))
item.show()
menu.append(item)
item.connect("activate", function, "engine")
# 'params' item
item = Gtk.MenuItem(_('JACK "%s" driver') % jack.get_selected_driver())
item.show()
menu.append(item)
item.connect("activate", function, "params")
for internal in jack.read_container(['internals']):
module = str(internal)
item = Gtk.MenuItem(_('JACK "%s"') % module)
item.show()
menu.append(item)
item.connect("activate", function, module)
except Exception as err:
sys.stderr.write(str(err))
sys.stderr.flush()
if not menu.get_children():
item = Gtk.MenuItem(_("Empty config list"))
item.set_sensitive(False)
item.show()
menu.append(item)
def studio_list_fill(self, widget, function):
menu = widget.get_submenu()
self.menu_clear(menu)
try:
for studio in self.studio_list():
item = Gtk.MenuItem(studio)
item.show()
menu.append(item)
item.connect("activate", function, studio)
except Exception as e:
self.menu_clear(menu)
item = Gtk.MenuItem(_("Error obtaining studio list"))
item.set_sensitive(False)
item.show()
menu.append(item)
if not menu.get_children():
item = Gtk.MenuItem(_("Empty studio list"))
item.set_sensitive(False)
item.show()
menu.append(item)
def tools_list_fill(self, widget, function):
menu = widget.get_submenu()
self.menu_clear(menu)
tools = [
(_("Logs"), "ladi-system-log"),
(_("Player"), "ladi-player")
]
for title, command in tools:
item = Gtk.MenuItem(title)
item.show()
menu.append(item)
item.connect("activate", function, command)
def create_menu(self):
menu_items = []
ladish_available = self.ladish_is_available()
jack_available = self.jack_is_available()
a2j_available = self.a2j_is_available()
if self.diagnose_text:
menu_items.append((Gtk.ImageMenuItem(_("Diagnose")), self.on_menu_show_diagnose, None))
menu_items.append((Gtk.SeparatorMenuItem.new(), None, None))
if ladish_available:
menu_items.append((Gtk.ImageMenuItem(_("Start gladish")), self.on_menu_launch_handler, "gladish"))
menu_items.append((Gtk.ImageMenuItem("Tools ..."), self.tools_list_fill, self.on_menu_launch_handler))
menu_items.append((Gtk.ImageMenuItem("Configure ..."), self.configure_list_fill, self.studio_configure))
menu = Gtk.Menu()
menu_items.append((Gtk.SeparatorMenuItem.new(),))
if ladish_available:
menu_items.append((Gtk.ImageMenuItem(_("New studio...")), self.on_menu_command, self.studio_new))
menu_items.append((Gtk.ImageMenuItem(_("Load studio")), self.studio_list_fill, self.studio_load))
menu_items.append((Gtk.SeparatorMenuItem.new(), None, None))
if self.studio_is_loaded():
if self.studio_is_started():
menu_items.append((Gtk.ImageMenuItem(_("Stop studio")), self.on_menu_command, self.studio_stop))
menu_items.append((Gtk.ImageMenuItem(_("Save studio")), self.on_menu_command, self.studio_save))
else:
menu_items.append((Gtk.ImageMenuItem(_("Start studio")), self.on_menu_command, self.studio_start))
menu_items.append((Gtk.ImageMenuItem(_("Rename studio")), self.on_menu_command, self.studio_rename))
menu_items.append((Gtk.ImageMenuItem(_("Unload studio")), self.on_menu_command, self.studio_unload))
else:
menu_items.append((Gtk.ImageMenuItem(_("Start automatic studio")), self.on_menu_command, self.jack_start))
menu_items.append((Gtk.SeparatorMenuItem.new(), None, None))
menu_items.append((Gtk.ImageMenuItem(_("Delete studio")), self.studio_list_fill, self.studio_delete))
menu_items.append((Gtk.ImageMenuItem(_("Reactivate ladishd")), self.on_menu_command, self.ladish_reactivate))
menu_items.append((Gtk.SeparatorMenuItem.new(), None, None))
if jack_available:
if not self.jack_is_started():
if not ladish_available:
menu_items.append((Gtk.ImageMenuItem(_("Start JACK server")), self.on_menu_command, self.jack_start))
else:
menu_items.append((Gtk.ImageMenuItem(_("Reset Xruns")), self.on_menu_command, self.jack_reset_xruns))
if not ladish_available:
menu_items.append((Gtk.ImageMenuItem(_("Stop JACK server")), self.on_menu_command, self.jack_stop))
menu_items.append((Gtk.ImageMenuItem(_("Reactivate JACK")), self.on_menu_command, self.jack_reactivate))
menu_items.append((Gtk.SeparatorMenuItem.new(), None, None))
if a2j_available:
# when a2jmidid is used in used with ladish, a2j script should be used
# for managing bridge "active" lifetime
if not ladish_available:
if not self.a2j_is_started():
menu_items.append((Gtk.ImageMenuItem(_("Start A2J bridge")), self.on_menu_command, self.a2j_start))
else:
menu_items.append((Gtk.ImageMenuItem(_("Stop A2J bridge")), self.on_menu_command, self.a2j_stop))
menu_items.append((Gtk.ImageMenuItem(_("Reactivate A2J")), self.on_menu_command, self.a2j_reactivate))
menu_items.append((Gtk.SeparatorMenuItem.new(), None, None))
if hasattr(self, 'on_about'):
menu_items.append((Gtk.ImageMenuItem(_("About")), self.on_about, None))
menu_items.append((Gtk.ImageMenuItem(_("Quit")), self.on_menu_command, self.handler['quit']))
for menu_tuple in menu_items:
item = menu_tuple[0]
if len(menu_tuple) > 1:
callback = menu_tuple[1]
exec_path = menu_tuple[2]
exec_args = menu_tuple[3:]
menu.append(item)
if type(item) is not Gtk.SeparatorMenuItem:
if callback in (self.tools_list_fill, self.studio_list_fill, self.configure_list_fill):
item.set_submenu(Gtk.Menu())
item.connect("activate", callback, exec_path, *exec_args)
menu.show_all()
return menu
def studio_load(self, item, studio):
LadiManagerGtk.studio_load(self, item=item, studio=studio)
def studio_delete(self, item, studio):
LadiManagerGtk.studio_delete(self, item=item, studio=studio)
def menu_activate(self):
menu = self.create_menu()
menu.popup(parent_menu_shell=None,
parent_menu_item=None,
func=None,
data=None,
button=3,
activate_time=0)
menu.reposition()