1
# -*- coding: utf-8 -*-
2
# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
4
###############################################################################
5
# OpenLP - Open Source Lyrics Projection #
6
# --------------------------------------------------------------------------- #
7
# Copyright (c) 2008-2018 OpenLP Developers #
8
# --------------------------------------------------------------------------- #
9
# This program is free software; you can redistribute it and/or modify it #
10
# under the terms of the GNU General Public License as published by the Free #
11
# Software Foundation; version 2 of the License. #
13
# This program is distributed in the hope that it will be useful, but WITHOUT #
14
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
15
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
18
# You should have received a copy of the GNU General Public License along #
19
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
20
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
21
###############################################################################
23
The :mod:`~openlp.core.ui.media.playertab` module holds the configuration tab for the media stuff.
27
from PyQt5 import QtCore, QtWidgets
29
from openlp.core.common.i18n import UiStrings, translate
30
from openlp.core.common.registry import Registry
31
from openlp.core.common.settings import Settings
32
from openlp.core.lib import SettingsTab
33
from openlp.core.lib.ui import create_button
34
from openlp.core.ui.icons import UiIcons
35
from openlp.core.ui.media import get_media_players, set_media_players
36
from openlp.core.widgets.buttons import ColorButton
39
class MediaQCheckBox(QtWidgets.QCheckBox):
41
MediaQCheckBox adds an extra property, player_name to the QCheckBox class.
43
def set_player_name(self, name):
47
self.player_name = name
50
class PlayerTab(SettingsTab):
52
MediaTab is the Media settings tab in the settings dialog.
54
def __init__(self, parent):
58
self.media_players = Registry().get('media_controller').media_players
59
self.saved_used_players = None
60
self.icon_path = UiIcons().player
61
player_translated = translate('OpenLP.PlayerTab', 'Players')
62
super(PlayerTab, self).__init__(parent, 'Players', player_translated)
68
self.setObjectName('MediaTab')
69
super(PlayerTab, self).setupUi()
70
self.background_color_group_box = QtWidgets.QGroupBox(self.left_column)
71
self.background_color_group_box.setObjectName('background_color_group_box')
72
self.form_layout = QtWidgets.QFormLayout(self.background_color_group_box)
73
self.form_layout.setObjectName('form_layout')
74
self.color_layout = QtWidgets.QHBoxLayout()
75
self.background_color_label = QtWidgets.QLabel(self.background_color_group_box)
76
self.background_color_label.setObjectName('background_color_label')
77
self.color_layout.addWidget(self.background_color_label)
78
self.background_color_button = ColorButton(self.background_color_group_box)
79
self.background_color_button.setObjectName('background_color_button')
80
self.color_layout.addWidget(self.background_color_button)
81
self.form_layout.addRow(self.color_layout)
82
self.information_label = QtWidgets.QLabel(self.background_color_group_box)
83
self.information_label.setObjectName('information_label')
84
self.information_label.setWordWrap(True)
85
self.form_layout.addRow(self.information_label)
86
self.left_layout.addWidget(self.background_color_group_box)
87
self.right_column.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
88
self.media_player_group_box = QtWidgets.QGroupBox(self.left_column)
89
self.media_player_group_box.setObjectName('media_player_group_box')
90
self.media_player_layout = QtWidgets.QVBoxLayout(self.media_player_group_box)
91
self.media_player_layout.setObjectName('media_player_layout')
92
self.player_check_boxes = {}
93
self.left_layout.addWidget(self.media_player_group_box)
94
self.player_order_group_box = QtWidgets.QGroupBox(self.left_column)
95
self.player_order_group_box.setObjectName('player_order_group_box')
96
self.player_order_layout = QtWidgets.QHBoxLayout(self.player_order_group_box)
97
self.player_order_layout.setObjectName('player_order_layout')
98
self.player_order_list_widget = QtWidgets.QListWidget(self.player_order_group_box)
99
size_policy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
100
size_policy.setHorizontalStretch(0)
101
size_policy.setVerticalStretch(0)
102
size_policy.setHeightForWidth(self.player_order_list_widget.sizePolicy().hasHeightForWidth())
103
self.player_order_list_widget.setSizePolicy(size_policy)
104
self.player_order_list_widget.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
105
self.player_order_list_widget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
106
self.player_order_list_widget.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
107
self.player_order_list_widget.setObjectName('player_order_list_widget')
108
self.player_order_layout.addWidget(self.player_order_list_widget)
109
self.ordering_button_layout = QtWidgets.QVBoxLayout()
110
self.ordering_button_layout.setObjectName('ordering_button_layout')
111
self.ordering_button_layout.addStretch(1)
112
self.ordering_up_button = create_button(self, 'ordering_up_button', role='up',
113
click=self.on_up_button_clicked)
114
self.ordering_down_button = create_button(self, 'ordering_down_button', role='down',
115
click=self.on_down_button_clicked)
116
self.ordering_button_layout.addWidget(self.ordering_up_button)
117
self.ordering_button_layout.addWidget(self.ordering_down_button)
118
self.ordering_button_layout.addStretch(1)
119
self.player_order_layout.addLayout(self.ordering_button_layout)
120
self.left_layout.addWidget(self.player_order_group_box)
121
self.left_layout.addStretch()
122
self.right_layout.addStretch()
124
self.background_color_button.colorChanged.connect(self.on_background_color_changed)
126
def retranslateUi(self):
128
Translate the UI on the fly
130
self.media_player_group_box.setTitle(translate('OpenLP.PlayerTab', 'Available Media Players'))
131
self.player_order_group_box.setTitle(translate('OpenLP.PlayerTab', 'Player Search Order'))
132
self.background_color_group_box.setTitle(UiStrings().BackgroundColor)
133
self.background_color_label.setText(UiStrings().BackgroundColorColon)
134
self.information_label.setText(translate('OpenLP.PlayerTab',
135
'Visible background for videos with aspect ratio different to screen.'))
136
self.retranslate_players()
138
def on_background_color_changed(self, color):
140
Set the background color
142
:param color: The color to be set.
144
self.background_color = color
146
def on_player_check_box_changed(self, check_state):
148
Add or remove players depending on their status
150
:param check_state: The requested status.
152
player = self.sender().player_name
153
if check_state == QtCore.Qt.Checked:
154
if player not in self.used_players:
155
self.used_players.append(player)
157
if player in self.used_players:
158
self.used_players.remove(player)
159
self.update_player_list()
161
def update_player_list(self):
163
Update the list of media players
165
self.player_order_list_widget.clear()
166
for player in self.used_players:
167
if player in list(self.player_check_boxes.keys()):
168
if len(self.used_players) == 1:
169
# At least one media player has to stay active
170
self.player_check_boxes['%s' % player].setEnabled(False)
172
self.player_check_boxes['%s' % player].setEnabled(True)
173
self.player_order_list_widget.addItem(self.media_players[str(player)].original_name)
175
def on_up_button_clicked(self):
177
Move a media player up in the order
179
row = self.player_order_list_widget.currentRow()
182
item = self.player_order_list_widget.takeItem(row)
183
self.player_order_list_widget.insertItem(row - 1, item)
184
self.player_order_list_widget.setCurrentRow(row - 1)
185
self.used_players.insert(row - 1, self.used_players.pop(row))
187
def on_down_button_clicked(self):
189
Move a media player down in the order
191
row = self.player_order_list_widget.currentRow()
192
if row == -1 or row > self.player_order_list_widget.count() - 1:
194
item = self.player_order_list_widget.takeItem(row)
195
self.player_order_list_widget.insertItem(row + 1, item)
196
self.player_order_list_widget.setCurrentRow(row + 1)
197
self.used_players.insert(row + 1, self.used_players.pop(row))
203
if self.saved_used_players:
204
self.used_players = self.saved_used_players
205
self.used_players = get_media_players()[0]
206
self.saved_used_players = self.used_players
207
settings = Settings()
208
settings.beginGroup(self.settings_section)
209
self.update_player_list()
210
self.background_color = settings.value('background color')
211
self.initial_color = self.background_color
213
self.background_color_button.color = self.background_color
219
settings = Settings()
220
settings.beginGroup(self.settings_section)
221
settings.setValue('background color', self.background_color)
223
old_players, override_player = get_media_players()
224
if self.used_players != old_players:
225
# clean old Media stuff
226
set_media_players(self.used_players, override_player)
227
self.settings_form.register_post_process('mediaitem_suffix_reset')
228
self.settings_form.register_post_process('mediaitem_media_rebuild')
229
self.settings_form.register_post_process('config_screen_changed')
231
def post_set_up(self, post_update=False):
233
Late setup for players as the MediaController has to be initialised first.
235
:param post_update: Indicates if called before or after updates.
237
for key, player in self.media_players.items():
238
player = self.media_players[key]
239
checkbox = MediaQCheckBox(self.media_player_group_box)
240
checkbox.setEnabled(player.available)
241
checkbox.setObjectName(player.name + '_check_box')
242
checkbox.setToolTip(player.get_info())
243
checkbox.set_player_name(player.name)
244
self.player_check_boxes[player.name] = checkbox
245
checkbox.stateChanged.connect(self.on_player_check_box_changed)
246
self.media_player_layout.addWidget(checkbox)
247
if player.available and player.name in self.used_players:
248
checkbox.setChecked(True)
250
checkbox.setChecked(False)
251
self.update_player_list()
252
self.retranslate_players()
254
def retranslate_players(self):
256
Translations for players is dependent on their setup as well
258
for key in self.media_players and self.player_check_boxes:
259
player = self.media_players[key]
260
checkbox = self.player_check_boxes[player.name]
261
checkbox.set_player_name(player.name)
263
checkbox.setText(player.display_name)
265
checkbox_text = translate('OpenLP.PlayerTab', '%s (unavailable)') % player.display_name
266
if player.name == 'vlc':
267
checkbox_text += ' ' + translate('OpenLP.PlayerTab',
268
'NOTE: To use VLC you must install the %s version',
269
'Will insert "32bit" or "64bit"') % platform.architecture()[0]
270
checkbox.setText(checkbox_text)