Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix mathematical mistake in the progress bar drawing #7317

Merged
merged 1 commit into from
Mar 13, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 17 additions & 16 deletions src/tribler/gui/widgets/downloadprogressbar.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@ def update_with_download(self, download):
if download["status"] in ("DLSTATUS_SEEDING", "DLSTATUS_CIRCUITS"):
self.set_fraction(download["progress"])
elif download["status"] in (
"DLSTATUS_HASHCHECKING",
"DLSTATUS_DOWNLOADING",
"DLSTATUS_STOPPED",
"DLSTATUS_STOPPED_ON_ERROR",
"DLSTATUS_HASHCHECKING",
"DLSTATUS_DOWNLOADING",
"DLSTATUS_STOPPED",
"DLSTATUS_STOPPED_ON_ERROR",
):
self.set_pieces()
else:
Expand Down Expand Up @@ -64,22 +64,23 @@ def paintEvent(self, _):

if len(self.pieces) <= self.width(): # We have less pieces than pixels
piece_width = self.width() / float(len(self.pieces))
for i in range(len(self.pieces)):
if self.pieces[i]:
for pixel in range(len(self.pieces)):
if self.pieces[pixel]:
painter.fillRect(
QRect(int(float(i) * piece_width), 0, math.ceil(piece_width), self.height()),
QRect(int(float(pixel) * piece_width), 0, math.ceil(piece_width), self.height()),
QColor(230, 115, 0),
)
else: # We have more pieces than pixels, group pieces
pieces_per_pixel = len(self.pieces) / float(self.width())
for i in range(self.width()):
begin_piece = int(pieces_per_pixel * i)
end_piece = int(begin_piece + pieces_per_pixel)
piece_sum = 0
for j in range(begin_piece, end_piece):
piece_sum += self.pieces[j]
qt_color = QColor()
qt_color.setHsl(26, 255, 128 + int(127 * (1 - piece_sum // pieces_per_pixel)))
painter.fillRect(QRect(i, 0, 10, self.height()), qt_color)
for pixel in range(self.width()):
start = int(pieces_per_pixel * pixel)
stop = int(start + pieces_per_pixel)

downloaded_pieces = sum(self.pieces[start:stop])
qt_color = QColor(230, 115, 0)
decimal_percentage = 1 - downloaded_pieces / pieces_per_pixel
fill_size = 128 + int(127 * decimal_percentage)
qt_color.setHsl(26, 255, fill_size)
painter.fillRect(QRect(pixel, 0, 10, self.height()), qt_color)
else:
painter.fillRect(QRect(0, 0, int(self.width() * self.fraction), self.height()), QColor(230, 115, 0))
33 changes: 16 additions & 17 deletions src/tribler/gui/widgets/downloadspage.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ def initialize_downloads_page(self):
connect(self.window().stop_download_button.clicked, self.on_stop_download_clicked)
connect(self.window().remove_download_button.clicked, self.on_remove_download_clicked)

connect(self.window().downloads_list.itemSelectionChanged, self.on_download_item_clicked)
connect(self.window().downloads_list.itemSelectionChanged, self.update_downloads)

connect(self.window().downloads_list.customContextMenuRequested, self.on_right_click_item)

Expand Down Expand Up @@ -226,7 +226,7 @@ def on_received_downloads(self, downloads):

# Update the top download management button if we have a row selected
if len(self.window().downloads_list.selectedItems()) > 0:
self.on_download_item_clicked()
self.update_downloads()

self.received_downloads.emit(downloads)

Expand Down Expand Up @@ -279,26 +279,25 @@ def force_recheck_download_enabled(download_widgets):
]
)

def on_download_item_clicked(self):
selected_count = len(self.window().downloads_list.selectedItems())
def update_downloads(self):
selected = self.window().downloads_list.selectedItems()
selected_count = len(selected)
if selected_count == 0:
self.window().remove_download_button.setEnabled(False)
self.window().start_download_button.setEnabled(False)
self.window().stop_download_button.setEnabled(False)
self.window().download_details_widget.hide()
elif selected_count == 1:
self.selected_items = self.window().downloads_list.selectedItems()
self.window().remove_download_button.setEnabled(True)
self.window().start_download_button.setEnabled(DownloadsPage.start_download_enabled(self.selected_items))
self.window().stop_download_button.setEnabled(DownloadsPage.stop_download_enabled(self.selected_items))
return

self.selected_items = selected
self.window().remove_download_button.setEnabled(True)
self.window().start_download_button.setEnabled(DownloadsPage.start_download_enabled(self.selected_items))
self.window().stop_download_button.setEnabled(DownloadsPage.stop_download_enabled(self.selected_items))

self.window().download_details_widget.update_with_download(self.selected_items[0].download_info)
if selected_count == 1:
self.window().download_details_widget.update_with_download(selected[0].download_info)
self.window().download_details_widget.show()
else:
self.selected_items = self.window().downloads_list.selectedItems()
self.window().remove_download_button.setEnabled(True)
self.window().start_download_button.setEnabled(DownloadsPage.start_download_enabled(self.selected_items))
self.window().stop_download_button.setEnabled(DownloadsPage.stop_download_enabled(self.selected_items))
self.window().download_details_widget.hide()

def on_start_download_clicked(self, checked):
Expand All @@ -312,7 +311,7 @@ def on_download_resumed(self, json_result):
if selected_item.download_info["infohash"] == json_result["infohash"]:
selected_item.download_info['status'] = "DLSTATUS_DOWNLOADING"
selected_item.update_item()
self.on_download_item_clicked()
self.update_downloads()

def on_stop_download_clicked(self, checked):
for selected_item in self.selected_items:
Expand All @@ -325,7 +324,7 @@ def on_download_stopped(self, json_result):
if selected_item.download_info["infohash"] == json_result["infohash"]:
selected_item.download_info['status'] = "DLSTATUS_STOPPED"
selected_item.update_item()
self.on_download_item_clicked()
self.update_downloads()

def on_remove_download_clicked(self, checked):
self.dialog = ConfirmationDialog(
Expand Down Expand Up @@ -374,7 +373,7 @@ def on_forced_recheck(self, result):
if selected_item.download_info["infohash"] == result["infohash"]:
selected_item.download_info['status'] = "DLSTATUS_HASHCHECKING"
selected_item.update_item()
self.on_download_item_clicked()
self.update_downloads()

def on_change_anonymity(self, result):
pass
Expand Down