~tomasgroth/openlp/portable-path

« back to all changes in this revision

Viewing changes to openlp/core/ui/media/playertab.py

  • Committer: Tomas Groth
  • Date: 2019-04-30 19:02:42 UTC
  • mfrom: (2829.2.32 openlp)
  • Revision ID: tomasgroth@yahoo.dk-20190430190242-6zwjk8724tyux70m
trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# -*- coding: utf-8 -*-
2
 
# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
3
 
 
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.                              #
12
 
#                                                                             #
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    #
16
 
# more details.                                                               #
17
 
#                                                                             #
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
 
###############################################################################
22
 
"""
23
 
The :mod:`~openlp.core.ui.media.playertab` module holds the configuration tab for the media stuff.
24
 
"""
25
 
import platform
26
 
 
27
 
from PyQt5 import QtCore, QtWidgets
28
 
 
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
37
 
 
38
 
 
39
 
class MediaQCheckBox(QtWidgets.QCheckBox):
40
 
    """
41
 
    MediaQCheckBox adds an extra property, player_name to the QCheckBox class.
42
 
    """
43
 
    def set_player_name(self, name):
44
 
        """
45
 
        Set the player name
46
 
        """
47
 
        self.player_name = name
48
 
 
49
 
 
50
 
class PlayerTab(SettingsTab):
51
 
    """
52
 
    MediaTab is the Media settings tab in the settings dialog.
53
 
    """
54
 
    def __init__(self, parent):
55
 
        """
56
 
        Constructor
57
 
        """
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)
63
 
 
64
 
    def setupUi(self):
65
 
        """
66
 
        Set up the UI
67
 
        """
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()
123
 
        # Signals and slots
124
 
        self.background_color_button.colorChanged.connect(self.on_background_color_changed)
125
 
 
126
 
    def retranslateUi(self):
127
 
        """
128
 
        Translate the UI on the fly
129
 
        """
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()
137
 
 
138
 
    def on_background_color_changed(self, color):
139
 
        """
140
 
        Set the background color
141
 
 
142
 
        :param color: The color to be set.
143
 
        """
144
 
        self.background_color = color
145
 
 
146
 
    def on_player_check_box_changed(self, check_state):
147
 
        """
148
 
        Add or remove players depending on their status
149
 
 
150
 
        :param check_state: The requested status.
151
 
        """
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)
156
 
        else:
157
 
            if player in self.used_players:
158
 
                self.used_players.remove(player)
159
 
        self.update_player_list()
160
 
 
161
 
    def update_player_list(self):
162
 
        """
163
 
        Update the list of media players
164
 
        """
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)
171
 
                else:
172
 
                    self.player_check_boxes['%s' % player].setEnabled(True)
173
 
                self.player_order_list_widget.addItem(self.media_players[str(player)].original_name)
174
 
 
175
 
    def on_up_button_clicked(self):
176
 
        """
177
 
        Move a media player up in the order
178
 
        """
179
 
        row = self.player_order_list_widget.currentRow()
180
 
        if row <= 0:
181
 
            return
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))
186
 
 
187
 
    def on_down_button_clicked(self):
188
 
        """
189
 
        Move a media player down in the order
190
 
        """
191
 
        row = self.player_order_list_widget.currentRow()
192
 
        if row == -1 or row > self.player_order_list_widget.count() - 1:
193
 
            return
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))
198
 
 
199
 
    def load(self):
200
 
        """
201
 
        Load the settings
202
 
        """
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
212
 
        settings.endGroup()
213
 
        self.background_color_button.color = self.background_color
214
 
 
215
 
    def save(self):
216
 
        """
217
 
        Save the settings
218
 
        """
219
 
        settings = Settings()
220
 
        settings.beginGroup(self.settings_section)
221
 
        settings.setValue('background color', self.background_color)
222
 
        settings.endGroup()
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')
230
 
 
231
 
    def post_set_up(self, post_update=False):
232
 
        """
233
 
        Late setup for players as the MediaController has to be initialised first.
234
 
 
235
 
        :param post_update: Indicates if called before or after updates.
236
 
        """
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)
249
 
            else:
250
 
                checkbox.setChecked(False)
251
 
        self.update_player_list()
252
 
        self.retranslate_players()
253
 
 
254
 
    def retranslate_players(self):
255
 
        """
256
 
        Translations for players is dependent on  their setup as well
257
 
         """
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)
262
 
            if player.available:
263
 
                checkbox.setText(player.display_name)
264
 
            else:
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)