openlp/openlp/core/ui/media/playertab.py

260 lines
13 KiB
Python
Raw Normal View History

2012-09-15 14:27:09 +00:00
# -*- coding: utf-8 -*-
2012-12-11 19:55:47 +00:00
# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
2012-09-15 14:27:09 +00:00
###############################################################################
# OpenLP - Open Source Lyrics Projection #
# --------------------------------------------------------------------------- #
2016-12-31 11:05:48 +00:00
# Copyright (c) 2008-2017 OpenLP Developers #
2012-09-15 14:27:09 +00:00
# --------------------------------------------------------------------------- #
# 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; version 2 of the License. #
# #
# 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, write to the Free Software Foundation, Inc., 59 #
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
"""
The :mod:`~openlp.core.ui.media.playertab` module holds the configuration tab for the media stuff.
"""
2015-12-26 14:25:09 +00:00
import platform
2015-11-07 00:49:40 +00:00
from PyQt5 import QtCore, QtWidgets
2012-09-15 14:27:09 +00:00
2013-12-13 17:44:05 +00:00
from openlp.core.common import Registry, Settings, UiStrings, translate
from openlp.core.lib import ColorButton, SettingsTab
from openlp.core.lib.ui import create_button
2012-09-15 14:27:09 +00:00
from openlp.core.ui.media import get_media_players, set_media_players
2012-10-15 17:35:14 +00:00
2015-11-07 00:49:40 +00:00
class MediaQCheckBox(QtWidgets.QCheckBox):
2012-09-15 14:27:09 +00:00
"""
2013-12-31 20:29:03 +00:00
MediaQCheckBox adds an extra property, player_name to the QCheckBox class.
2012-09-15 14:27:09 +00:00
"""
2013-03-17 20:00:39 +00:00
def set_player_name(self, name):
"""
Set the player name
"""
2013-12-31 20:29:03 +00:00
self.player_name = name
2012-09-15 14:27:09 +00:00
class PlayerTab(SettingsTab):
"""
MediaTab is the Media settings tab in the settings dialog.
"""
2013-02-01 20:09:47 +00:00
def __init__(self, parent):
"""
Constructor
"""
2013-04-03 10:19:15 +00:00
self.media_players = Registry().get('media_controller').media_players
2013-03-16 19:57:15 +00:00
self.saved_used_players = None
2013-08-31 18:17:38 +00:00
self.icon_path = ':/media/multimedia-player.png'
2012-09-15 14:27:09 +00:00
player_translated = translate('OpenLP.PlayerTab', 'Players')
2013-08-31 18:17:38 +00:00
super(PlayerTab, self).__init__(parent, 'Players', player_translated)
2012-09-15 14:27:09 +00:00
def setupUi(self):
"""
Set up the UI
"""
2013-08-31 18:17:38 +00:00
self.setObjectName('MediaTab')
2013-07-18 19:10:19 +00:00
super(PlayerTab, self).setupUi()
2015-11-07 00:49:40 +00:00
self.background_color_group_box = QtWidgets.QGroupBox(self.left_column)
2013-08-31 18:17:38 +00:00
self.background_color_group_box.setObjectName('background_color_group_box')
2015-11-07 00:49:40 +00:00
self.form_layout = QtWidgets.QFormLayout(self.background_color_group_box)
2013-08-31 18:17:38 +00:00
self.form_layout.setObjectName('form_layout')
2015-11-07 00:49:40 +00:00
self.color_layout = QtWidgets.QHBoxLayout()
self.background_color_label = QtWidgets.QLabel(self.background_color_group_box)
2013-08-31 18:17:38 +00:00
self.background_color_label.setObjectName('background_color_label')
2013-03-16 19:57:15 +00:00
self.color_layout.addWidget(self.background_color_label)
self.background_color_button = ColorButton(self.background_color_group_box)
2013-08-31 18:17:38 +00:00
self.background_color_button.setObjectName('background_color_button')
2013-03-16 19:57:15 +00:00
self.color_layout.addWidget(self.background_color_button)
self.form_layout.addRow(self.color_layout)
2015-11-07 00:49:40 +00:00
self.information_label = QtWidgets.QLabel(self.background_color_group_box)
2013-08-31 18:17:38 +00:00
self.information_label.setObjectName('information_label')
2013-03-07 08:05:43 +00:00
self.information_label.setWordWrap(True)
2013-03-16 19:57:15 +00:00
self.form_layout.addRow(self.information_label)
2013-03-16 21:18:05 +00:00
self.left_layout.addWidget(self.background_color_group_box)
2015-11-07 00:49:40 +00:00
self.right_column.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
self.media_player_group_box = QtWidgets.QGroupBox(self.left_column)
2013-08-31 18:17:38 +00:00
self.media_player_group_box.setObjectName('media_player_group_box')
2015-11-07 00:49:40 +00:00
self.media_player_layout = QtWidgets.QVBoxLayout(self.media_player_group_box)
2013-08-31 18:17:38 +00:00
self.media_player_layout.setObjectName('media_player_layout')
2013-03-16 19:57:15 +00:00
self.player_check_boxes = {}
self.left_layout.addWidget(self.media_player_group_box)
2015-11-07 00:49:40 +00:00
self.player_order_group_box = QtWidgets.QGroupBox(self.left_column)
2013-08-31 18:17:38 +00:00
self.player_order_group_box.setObjectName('player_order_group_box')
2015-11-07 00:49:40 +00:00
self.player_order_layout = QtWidgets.QHBoxLayout(self.player_order_group_box)
2013-08-31 18:17:38 +00:00
self.player_order_layout.setObjectName('player_order_layout')
2015-11-07 00:49:40 +00:00
self.player_order_list_widget = QtWidgets.QListWidget(self.player_order_group_box)
size_policy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
2014-03-17 19:05:55 +00:00
size_policy.setHorizontalStretch(0)
size_policy.setVerticalStretch(0)
size_policy.setHeightForWidth(self.player_order_list_widget.sizePolicy().hasHeightForWidth())
self.player_order_list_widget.setSizePolicy(size_policy)
2013-03-16 19:57:15 +00:00
self.player_order_list_widget.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
self.player_order_list_widget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
2015-11-07 00:49:40 +00:00
self.player_order_list_widget.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
2013-08-31 18:17:38 +00:00
self.player_order_list_widget.setObjectName('player_order_list_widget')
2013-03-16 19:57:15 +00:00
self.player_order_layout.addWidget(self.player_order_list_widget)
2015-11-07 00:49:40 +00:00
self.ordering_button_layout = QtWidgets.QVBoxLayout()
2013-08-31 18:17:38 +00:00
self.ordering_button_layout.setObjectName('ordering_button_layout')
2013-03-16 19:57:15 +00:00
self.ordering_button_layout.addStretch(1)
2013-08-31 18:17:38 +00:00
self.ordering_up_button = create_button(self, 'ordering_up_button', role='up',
2013-12-31 20:29:03 +00:00
click=self.on_up_button_clicked)
2013-08-31 18:17:38 +00:00
self.ordering_down_button = create_button(self, 'ordering_down_button', role='down',
2013-12-31 20:29:03 +00:00
click=self.on_down_button_clicked)
2013-03-16 19:57:15 +00:00
self.ordering_button_layout.addWidget(self.ordering_up_button)
self.ordering_button_layout.addWidget(self.ordering_down_button)
self.ordering_button_layout.addStretch(1)
2013-03-16 21:18:05 +00:00
self.player_order_layout.addLayout(self.ordering_button_layout)
2013-03-16 19:57:15 +00:00
self.left_layout.addWidget(self.player_order_group_box)
self.left_layout.addStretch()
self.right_layout.addStretch()
2012-09-29 18:36:30 +00:00
# Signals and slots
2014-11-02 19:32:40 +00:00
self.background_color_button.colorChanged.connect(self.on_background_color_changed)
2012-09-15 14:27:09 +00:00
def retranslateUi(self):
"""
Translate the UI on the fly
"""
2013-03-16 19:57:15 +00:00
self.media_player_group_box.setTitle(translate('OpenLP.PlayerTab', 'Available Media Players'))
self.player_order_group_box.setTitle(translate('OpenLP.PlayerTab', 'Player Search Order'))
2013-03-16 21:18:05 +00:00
self.background_color_group_box.setTitle(UiStrings().BackgroundColor)
2013-03-16 19:57:15 +00:00
self.background_color_label.setText(UiStrings().DefaultColor)
2013-03-07 08:05:43 +00:00
self.information_label.setText(translate('OpenLP.PlayerTab',
2013-12-31 20:29:03 +00:00
'Visible background for videos with aspect ratio different to screen.'))
self.retranslate_players()
2012-09-29 18:36:30 +00:00
2014-11-02 19:32:40 +00:00
def on_background_color_changed(self, color):
"""
Set the background color
"""
self.background_color = color
2012-09-15 14:27:09 +00:00
2013-03-16 19:57:15 +00:00
def on_player_check_box_changed(self, check_state):
"""
Add or remove players depending on their status
"""
2013-12-31 20:29:03 +00:00
player = self.sender().player_name
2012-09-15 14:27:09 +00:00
if check_state == QtCore.Qt.Checked:
2013-03-16 19:57:15 +00:00
if player not in self.used_players:
self.used_players.append(player)
2012-09-15 14:27:09 +00:00
else:
2013-03-16 19:57:15 +00:00
if player in self.used_players:
self.used_players.remove(player)
self.update_player_list()
2012-09-15 14:27:09 +00:00
2013-03-16 19:57:15 +00:00
def update_player_list(self):
"""
Update the list of media players
"""
2013-03-16 19:57:15 +00:00
self.player_order_list_widget.clear()
for player in self.used_players:
2013-08-31 18:17:38 +00:00
if player in list(self.player_check_boxes.keys()):
2013-03-16 19:57:15 +00:00
if len(self.used_players) == 1:
2012-09-15 14:27:09 +00:00
# At least one media player has to stay active
2013-08-31 18:17:38 +00:00
self.player_check_boxes['%s' % player].setEnabled(False)
2012-09-15 14:27:09 +00:00
else:
2013-08-31 18:17:38 +00:00
self.player_check_boxes['%s' % player].setEnabled(True)
self.player_order_list_widget.addItem(self.media_players[str(player)].original_name)
2012-09-15 14:27:09 +00:00
2013-03-16 19:57:15 +00:00
def on_up_button_clicked(self):
"""
Move a media player up in the order
"""
2013-03-16 19:57:15 +00:00
row = self.player_order_list_widget.currentRow()
2012-09-15 14:27:09 +00:00
if row <= 0:
return
2013-03-16 19:57:15 +00:00
item = self.player_order_list_widget.takeItem(row)
self.player_order_list_widget.insertItem(row - 1, item)
self.player_order_list_widget.setCurrentRow(row - 1)
self.used_players.insert(row - 1, self.used_players.pop(row))
2012-09-15 14:27:09 +00:00
2013-03-16 19:57:15 +00:00
def on_down_button_clicked(self):
"""
Move a media player down in the order
"""
2013-03-16 19:57:15 +00:00
row = self.player_order_list_widget.currentRow()
if row == -1 or row > self.player_order_list_widget.count() - 1:
2012-09-15 14:27:09 +00:00
return
2013-03-16 19:57:15 +00:00
item = self.player_order_list_widget.takeItem(row)
self.player_order_list_widget.insertItem(row + 1, item)
self.player_order_list_widget.setCurrentRow(row + 1)
self.used_players.insert(row + 1, self.used_players.pop(row))
2012-09-15 14:27:09 +00:00
def load(self):
"""
Load the settings
"""
2013-03-16 19:57:15 +00:00
if self.saved_used_players:
self.used_players = self.saved_used_players
self.used_players = get_media_players()[0]
self.saved_used_players = self.used_players
2012-09-29 18:36:30 +00:00
settings = Settings()
2013-03-16 21:18:05 +00:00
settings.beginGroup(self.settings_section)
2013-03-16 19:57:15 +00:00
self.update_player_list()
2013-08-31 18:17:38 +00:00
self.background_color = settings.value('background color')
2013-03-16 19:57:15 +00:00
self.initial_color = self.background_color
2012-09-29 18:36:30 +00:00
settings.endGroup()
self.background_color_button.color = self.background_color
2012-09-15 14:27:09 +00:00
def save(self):
"""
Save the settings
"""
2012-09-29 18:36:30 +00:00
settings = Settings()
2013-03-16 21:18:05 +00:00
settings.beginGroup(self.settings_section)
2013-08-31 18:17:38 +00:00
settings.setValue('background color', self.background_color)
2012-09-29 18:36:30 +00:00
settings.endGroup()
2012-09-15 14:27:09 +00:00
old_players, override_player = get_media_players()
2013-03-16 19:57:15 +00:00
if self.used_players != old_players:
2012-09-15 14:27:09 +00:00
# clean old Media stuff
2013-03-16 19:57:15 +00:00
set_media_players(self.used_players, override_player)
2013-08-31 18:17:38 +00:00
self.settings_form.register_post_process('mediaitem_suffix_reset')
self.settings_form.register_post_process('mediaitem_media_rebuild')
self.settings_form.register_post_process('config_screen_changed')
2012-09-15 14:27:09 +00:00
2013-02-19 19:50:14 +00:00
def post_set_up(self):
"""
2013-03-10 20:19:42 +00:00
Late setup for players as the MediaController has to be initialised first.
"""
2013-08-31 18:17:38 +00:00
for key, player in self.media_players.items():
2013-03-06 17:46:19 +00:00
player = self.media_players[key]
2013-03-16 21:18:05 +00:00
checkbox = MediaQCheckBox(self.media_player_group_box)
checkbox.setEnabled(player.available)
2013-08-31 18:17:38 +00:00
checkbox.setObjectName(player.name + '_check_box')
2012-10-15 17:35:14 +00:00
checkbox.setToolTip(player.get_info())
2013-03-17 20:00:39 +00:00
checkbox.set_player_name(player.name)
2013-03-16 19:57:15 +00:00
self.player_check_boxes[player.name] = checkbox
checkbox.stateChanged.connect(self.on_player_check_box_changed)
self.media_player_layout.addWidget(checkbox)
if player.available and player.name in self.used_players:
checkbox.setChecked(True)
else:
checkbox.setChecked(False)
2013-03-16 19:57:15 +00:00
self.update_player_list()
2013-12-31 20:29:03 +00:00
self.retranslate_players()
2013-12-31 20:29:03 +00:00
def retranslate_players(self):
"""
Translations for players is dependent on their setup as well
"""
2013-03-16 19:57:15 +00:00
for key in self.media_players and self.player_check_boxes:
2013-03-06 17:46:19 +00:00
player = self.media_players[key]
2013-03-16 19:57:15 +00:00
checkbox = self.player_check_boxes[player.name]
2013-03-17 20:00:39 +00:00
checkbox.set_player_name(player.name)
if player.available:
checkbox.setText(player.display_name)
else:
2015-12-26 14:25:09 +00:00
checkbox_text = translate('OpenLP.PlayerTab', '%s (unavailable)') % player.display_name
if player.name == 'vlc':
checkbox_text += ' ' + translate('OpenLP.PlayerTab',
'NOTE: To use VLC you must install the %s version',
'Will insert "32bit" or "64bit"') % platform.architecture()[0]
checkbox.setText(checkbox_text)