~tomasgroth/openlp/portable-path

« back to all changes in this revision

Viewing changes to openlp/core/widgets/views.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:
4
4
###############################################################################
5
5
# OpenLP - Open Source Lyrics Projection                                      #
6
6
# --------------------------------------------------------------------------- #
7
 
# Copyright (c) 2008-2018 OpenLP Developers                                   #
 
7
# Copyright (c) 2008-2019 OpenLP Developers                                   #
8
8
# --------------------------------------------------------------------------- #
9
9
# This program is free software; you can redistribute it and/or modify it     #
10
10
# under the terms of the GNU General Public License as published by the Free  #
31
31
from openlp.core.common.path import Path
32
32
from openlp.core.common.registry import Registry
33
33
from openlp.core.common.settings import Settings
34
 
from openlp.core.lib import ImageSource, ItemCapabilities, ServiceItem
 
34
from openlp.core.lib.serviceitem import ItemCapabilities, ServiceItem
 
35
from openlp.core.widgets.layouts import AspectRatioLayout
35
36
 
36
37
 
37
38
def handle_mime_data_urls(mime_data):
53
54
    return file_paths
54
55
 
55
56
 
 
57
def remove_url_prefix(filename):
 
58
    """
 
59
    Remove the "file://" URL prefix
 
60
 
 
61
    :param str filename: The filename that may have a file URL prefix
 
62
    :returns str: The file name without the file URL prefix
 
63
    """
 
64
    return filename.replace('file://', '')
 
65
 
 
66
 
56
67
class ListPreviewWidget(QtWidgets.QTableWidget, RegistryProperties):
57
68
    """
58
69
    A special type of QTableWidget which lists the slides in the slide controller
120
131
                        self.auto_row_height = max(self.viewport().height() / (-1 * max_img_row_height), 100)
121
132
                        height = min(height, self.auto_row_height)
122
133
                # Apply new height to slides
123
 
                for frame_number in range(len(self.service_item.get_frames())):
124
 
                    self.setRowHeight(frame_number, height)
 
134
                for slide_index in range(len(self.service_item.slides)):
 
135
                    self.setRowHeight(slide_index, height)
125
136
 
126
137
    def row_resized(self, row, old_height, new_height):
127
138
        """
134
145
        # Get and validate label widget containing slide & adjust max width
135
146
        try:
136
147
            self.cellWidget(row, 0).children()[1].setMaximumWidth(new_height * self.screen_ratio)
137
 
        except:
 
148
        except Exception:
138
149
            return
139
150
 
140
151
    def screen_size_changed(self, screen_ratio):
167
178
        self.clear_list()
168
179
        row = 0
169
180
        text = []
170
 
        for frame_number, frame in enumerate(self.service_item.get_frames()):
 
181
        slides = self.service_item.display_slides if self.service_item.is_text() else self.service_item.slides
 
182
        for slide_index, slide in enumerate(slides):
171
183
            self.setRowCount(self.slide_count() + 1)
172
184
            item = QtWidgets.QTableWidgetItem()
173
185
            slide_height = 0
174
186
            if self.service_item.is_text():
175
 
                if frame['verseTag']:
 
187
                if slide['verse']:
176
188
                    # These tags are already translated.
177
 
                    verse_def = frame['verseTag']
 
189
                    verse_def = slide['verse']
178
190
                    verse_def = '%s%s' % (verse_def[0], verse_def[1:])
179
191
                    two_line_def = '%s\n%s' % (verse_def[0], verse_def[1:])
180
192
                    row = two_line_def
181
193
                else:
182
194
                    row += 1
183
 
                item.setText(frame['text'])
 
195
                item.setText(slide['text'])
184
196
            else:
185
197
                label = QtWidgets.QLabel()
186
198
                label.setContentsMargins(4, 4, 4, 4)
187
 
                if self.service_item.is_media():
188
 
                    label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter)
189
 
                else:
 
199
                label.setAlignment(QtCore.Qt.AlignCenter)
 
200
                if not self.service_item.is_media():
190
201
                    label.setScaledContents(True)
191
202
                if self.service_item.is_command():
192
203
                    if self.service_item.is_capable(ItemCapabilities.HasThumbnails):
193
 
                        image = self.image_manager.get_image(frame['image'], ImageSource.CommandPlugins)
194
 
                        pixmap = QtGui.QPixmap.fromImage(image)
 
204
                        pixmap = QtGui.QPixmap(remove_url_prefix(slide['thumbnail']))
195
205
                    else:
196
 
                        pixmap = QtGui.QPixmap(frame['image'])
 
206
                        if isinstance(slide['image'], QtGui.QIcon):
 
207
                            pixmap = slide['image'].pixmap(QtCore.QSize(32, 32))
 
208
                        else:
 
209
                            pixmap = QtGui.QPixmap(remove_url_prefix(slide['image']))
197
210
                else:
198
 
                    image = self.image_manager.get_image(frame['path'], ImageSource.ImagePlugin)
199
 
                    pixmap = QtGui.QPixmap.fromImage(image)
200
 
                pixmap.setDevicePixelRatio(label.devicePixelRatio())
 
211
                    pixmap = QtGui.QPixmap(remove_url_prefix(slide['path']))
201
212
                label.setPixmap(pixmap)
 
213
                container = QtWidgets.QWidget()
 
214
                layout = AspectRatioLayout(container, self.screen_ratio)
 
215
                layout.setContentsMargins(0, 0, 0, 0)
 
216
                layout.addWidget(label)
 
217
                container.setLayout(layout)
202
218
                slide_height = width // self.screen_ratio
203
 
                # Setup and validate row height cap if in use.
204
219
                max_img_row_height = Settings().value('advanced/slide max height')
205
 
                if isinstance(max_img_row_height, int) and max_img_row_height != 0:
 
220
                if isinstance(max_img_row_height, int):
206
221
                    if max_img_row_height > 0 and slide_height > max_img_row_height:
207
 
                        # Manual Setting
208
222
                        slide_height = max_img_row_height
209
 
                    elif max_img_row_height < 0 and slide_height > self.auto_row_height:
210
 
                        # Auto Setting
211
 
                        slide_height = self.auto_row_height
212
 
                    label.setMaximumWidth(slide_height * self.screen_ratio)
213
 
                    label.resize(slide_height * self.screen_ratio, slide_height)
214
 
                    # Build widget with stretch padding
215
 
                    container = QtWidgets.QWidget()
216
 
                    hbox = QtWidgets.QHBoxLayout()
217
 
                    hbox.setContentsMargins(0, 0, 0, 0)
218
 
                    hbox.addWidget(label, stretch=1)
219
 
                    hbox.addStretch(0)
220
 
                    container.setLayout(hbox)
221
 
                    # Add to table
222
 
                    self.setCellWidget(frame_number, 0, container)
223
 
                else:
224
 
                    # Add to table
225
 
                    self.setCellWidget(frame_number, 0, label)
 
223
                    elif max_img_row_height < 0:
 
224
                        # If auto setting, show that number of slides, or if the resulting slides too small, 100px.
 
225
                        # E.g. If setting is -4, 4 slides will be visible, unless those slides are < 100px high.
 
226
                        self.auto_row_height = max(self.viewport().height() / (-1 * max_img_row_height), 100)
 
227
                        slide_height = min(slide_height, self.auto_row_height)
 
228
                self.setCellWidget(slide_index, 0, container)
226
229
                row += 1
227
230
            text.append(str(row))
228
 
            self.setItem(frame_number, 0, item)
 
231
            self.setItem(slide_index, 0, item)
229
232
            if slide_height:
230
 
                self.setRowHeight(frame_number, slide_height)
 
233
                # First set the height to 1 and then to the right height. This makes the item display correctly.
 
234
                # If this is not done, sometimes the image item is displayed as blank.
 
235
                self.setRowHeight(slide_index, 1)
 
236
                self.setRowHeight(slide_index, slide_height)
231
237
        self.setVerticalHeaderLabels(text)
232
238
        if self.service_item.is_text():
233
239
            self.resizeRowsToContents()