From d0f180fdc5bb2b498f6b7e45b5b27f839dfc321c Mon Sep 17 00:00:00 2001 From: Miguel Jacq Date: Thu, 8 Feb 2018 16:02:00 +1100 Subject: [PATCH 01/12] set MinimumSize on the word-wrapped QLabels in the SettingsDialog, which prevents them getting squished when parent is resized smaller --- onionshare_gui/settings_dialog.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/onionshare_gui/settings_dialog.py b/onionshare_gui/settings_dialog.py index d105ea42..ba9b26ed 100644 --- a/onionshare_gui/settings_dialog.py +++ b/onionshare_gui/settings_dialog.py @@ -86,12 +86,14 @@ class SettingsDialog(QtWidgets.QDialog): stealth_details.setWordWrap(True) stealth_details.setTextInteractionFlags(QtCore.Qt.TextBrowserInteraction) stealth_details.setOpenExternalLinks(True) + stealth_details.setMinimumSize(stealth_details.sizeHint()) self.stealth_checkbox = QtWidgets.QCheckBox() self.stealth_checkbox.setCheckState(QtCore.Qt.Unchecked) self.stealth_checkbox.setText(strings._("gui_settings_stealth_option", True)) hidservauth_details = QtWidgets.QLabel(strings._('gui_settings_stealth_hidservauth_string', True)) hidservauth_details.setWordWrap(True) + hidservauth_details.setMinimumSize(hidservauth_details.sizeHint()) hidservauth_details.hide() self.hidservauth_copy_button = QtWidgets.QPushButton(strings._('gui_copy_hidservauth', True)) From bc2417c65e2a51012b5fa0e441e2998d7c6c2a7f Mon Sep 17 00:00:00 2001 From: Miguel Jacq Date: Fri, 9 Feb 2018 07:55:22 +1100 Subject: [PATCH 02/12] Set the URL label to explicitly mention when persistent. Remove older Persistence warning to save clutter. Add ToolTip to explain what Persistence means --- onionshare_gui/onionshare_gui.py | 10 ---------- onionshare_gui/server_status.py | 7 ++++++- share/locale/en.json | 3 ++- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/onionshare_gui/onionshare_gui.py b/onionshare_gui/onionshare_gui.py index 7fdc3491..75baf3d5 100644 --- a/onionshare_gui/onionshare_gui.py +++ b/onionshare_gui/onionshare_gui.py @@ -140,16 +140,10 @@ class OnionShareGui(QtWidgets.QMainWindow): # Status bar, zip progress bar self._zip_progress_bar = None - # Persistent URL notification - self.persistent_url_label = QtWidgets.QLabel(strings._('persistent_url_in_use', True)) - self.persistent_url_label.setStyleSheet('font-weight: bold; color: #333333;') - self.persistent_url_label.hide() - # Primary action layout primary_action_layout = QtWidgets.QVBoxLayout() primary_action_layout.addWidget(self.server_status) primary_action_layout.addWidget(self.filesize_warning) - primary_action_layout.addWidget(self.persistent_url_label) primary_action_layout.addWidget(self.downloads_container) self.primary_action = QtWidgets.QWidget() self.primary_action.setLayout(primary_action_layout) @@ -409,9 +403,6 @@ class OnionShareGui(QtWidgets.QMainWindow): self.stop_server() self.start_server_error(strings._('gui_server_started_after_timeout')) - if self.settings.get('save_private_key'): - self.persistent_url_label.show() - def start_server_error(self, error): """ If there's an error when trying to start the onion service @@ -443,7 +434,6 @@ class OnionShareGui(QtWidgets.QMainWindow): # Remove ephemeral service, but don't disconnect from Tor self.onion.cleanup(stop_tor=False) self.filesize_warning.hide() - self.persistent_url_label.hide() self.stop_server_finished.emit() self.set_server_active(False) diff --git a/onionshare_gui/server_status.py b/onionshare_gui/server_status.py index 786deb64..ec046fa6 100644 --- a/onionshare_gui/server_status.py +++ b/onionshare_gui/server_status.py @@ -145,10 +145,15 @@ class ServerStatus(QtWidgets.QWidget): if self.status == self.STATUS_STARTED: self.url_description.show() - if self.settings.get('close_after_first_download'): + if self.settings.get('save_private_key'): + self.url_label.setText(strings._('gui_url_label_persistent', True)) + self.url_label.setToolTip(strings._('gui_url_persistence_warning', True)) + elif self.settings.get('close_after_first_download'): self.url_label.setText(strings._('gui_url_label_one_time', True)) + self.url_label.setToolTip('') else: self.url_label.setText(strings._('gui_url_label', True)) + self.url_label.setToolTip('') self.url_label.show() self.url.setText('http://{0:s}/{1:s}'.format(self.app.onion_host, self.web.slug)) diff --git a/share/locale/en.json b/share/locale/en.json index 5473a88f..4644d21e 100644 --- a/share/locale/en.json +++ b/share/locale/en.json @@ -133,10 +133,11 @@ "gui_server_timeout_expired": "The chosen timeout has already expired.\nPlease update the timeout and then you may start sharing.", "share_via_onionshare": "Share via OnionShare", "gui_save_private_key_checkbox": "Use a persistent address\n(unchecking will delete any saved address)", - "persistent_url_in_use": "This share is using a persistent address", "gui_url_description": "Anyone with this link can download your files using Tor Browser:", "gui_url_label": "Your Download Address", + "gui_url_label_persistent": "Your Persistent Download Address (what's this?)", "gui_url_label_one_time": "Your One-Time Download Address", + "gui_url_persistence_warning": "Every share will have the same URL.

If you want to go back to using one-time URLs, turn off persistence in the Settings.", "gui_status_indicator_stopped": "Ready to Share", "gui_status_indicator_working": "Starting...", "gui_status_indicator_started": "Sharing" From 532d5d5cf0c1650b3bc931090ec269a23882c6dd Mon Sep 17 00:00:00 2001 From: Micah Lee Date: Sat, 10 Feb 2018 10:59:01 -0800 Subject: [PATCH 03/12] Instead of disabling the settings button when share is active, hide it, and show it again when the share stops --- install/onionshare.nsi | 2 -- onionshare_gui/onionshare_gui.py | 5 ++--- share/images/settings_inactive.png | Bin 513 -> 0 bytes 3 files changed, 2 insertions(+), 5 deletions(-) delete mode 100644 share/images/settings_inactive.png diff --git a/install/onionshare.nsi b/install/onionshare.nsi index e5f989bb..151d36d4 100644 --- a/install/onionshare.nsi +++ b/install/onionshare.nsi @@ -209,7 +209,6 @@ Section "install" File "${BINPATH}\share\images\server_stopped.png" File "${BINPATH}\share\images\server_working.png" File "${BINPATH}\share\images\settings.png" - File "${BINPATH}\share\images\settings_inactive.png" SetOutPath "$INSTDIR\share\locale" File "${BINPATH}\share\locale\cs.json" @@ -388,7 +387,6 @@ FunctionEnd Delete "$INSTDIR\share\images\server_stopped.png" Delete "$INSTDIR\share\images\server_working.png" Delete "$INSTDIR\share\images\settings.png" - Delete "$INSTDIR\share\images\settings_inactive.png" Delete "$INSTDIR\share\license.txt" Delete "$INSTDIR\share\locale\cs.json" Delete "$INSTDIR\share\locale\de.json" diff --git a/onionshare_gui/onionshare_gui.py b/onionshare_gui/onionshare_gui.py index 75baf3d5..05e01530 100644 --- a/onionshare_gui/onionshare_gui.py +++ b/onionshare_gui/onionshare_gui.py @@ -569,11 +569,10 @@ class OnionShareGui(QtWidgets.QMainWindow): """ Disable the Settings button while an OnionShare server is active. """ - self.settings_button.setEnabled(not active) if active: - self.settings_button.setIcon( QtGui.QIcon(common.get_resource_path('images/settings_inactive.png')) ) + self.settings_button.hide() else: - self.settings_button.setIcon( QtGui.QIcon(common.get_resource_path('images/settings.png')) ) + self.settings_button.show() # Disable settings menu action when server is active self.settingsAction.setEnabled(not active) diff --git a/share/images/settings_inactive.png b/share/images/settings_inactive.png deleted file mode 100644 index 1b35201b804dd4bd20d3272419403735d88c983b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 513 zcmV+c0{;DpP)K z;Kz6j_tlq>CO8tqefA{;k?WlT&%iQJ1IoZcLf&6s6Zit`18hzU#(HdUAc(-oij$nv88`-M|kg zsN@k?cg}yzYz!bUvnk*xVQVUqR-FD-fMUXrerJJE&k8P^*&`G-3N`((veg{^cpby}R+Vgu;0bUW?rGyj$G(JjSOI6ktl}3l00000NkvXXu0mjf Dza!DZ From fe24c543cc1709bca43d57356eb4298dcdf2fd36 Mon Sep 17 00:00:00 2001 From: Micah Lee Date: Sat, 10 Feb 2018 11:48:14 -0800 Subject: [PATCH 04/12] Added an info label to file selection, to show the total count and size --- onionshare_gui/file_selection.py | 37 ++++++++++++++++++++++++++------ onionshare_gui/onionshare_gui.py | 1 - share/locale/en.json | 3 ++- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/onionshare_gui/file_selection.py b/onionshare_gui/file_selection.py index d52fd017..317edc1a 100644 --- a/onionshare_gui/file_selection.py +++ b/onionshare_gui/file_selection.py @@ -207,15 +207,18 @@ class FileList(QtWidgets.QListWidget): icon = ip.icon(fileinfo) if os.path.isfile(filename): - size = common.human_readable_filesize(fileinfo.size()) + size_bytes = fileinfo.size() + size_readable = common.human_readable_filesize(size_bytes) else: - size = common.human_readable_filesize(common.dir_size(filename)) - item_name = '{0:s} ({1:s})'.format(basename, size) + size_bytes = common.dir_size(filename) + size_readable = common.human_readable_filesize(size_bytes) + item_name = '{0:s} ({1:s})'.format(basename, size_readable) # Create a new item item = QtWidgets.QListWidgetItem(item_name) - item.setToolTip(size) + item.setToolTip(size_readable) item.setIcon(icon) + item.size_bytes = size_bytes # Item's delete button def delete_item(): @@ -252,12 +255,17 @@ class FileSelection(QtWidgets.QVBoxLayout): super(FileSelection, self).__init__() self.server_on = False - # file list + # Info label + self.info_label = QtWidgets.QLabel() + self.info_label.setStyleSheet('QLabel { font-size: 12px; color: #666666; }') + + # File list self.file_list = FileList() self.file_list.currentItemChanged.connect(self.update) self.file_list.files_dropped.connect(self.update) + self.file_list.files_updated.connect(self.update) - # buttons + # Buttons self.add_button = QtWidgets.QPushButton(strings._('gui_add', True)) self.add_button.clicked.connect(self.add) self.delete_button = QtWidgets.QPushButton(strings._('gui_delete', True)) @@ -267,7 +275,8 @@ class FileSelection(QtWidgets.QVBoxLayout): button_layout.addWidget(self.add_button) button_layout.addWidget(self.delete_button) - # add the widgets + # Add the widgets + self.addWidget(self.info_label) self.addWidget(self.file_list) self.addLayout(button_layout) @@ -277,6 +286,20 @@ class FileSelection(QtWidgets.QVBoxLayout): """ Update the GUI elements based on the current state. """ + # Update the info label + file_count = self.file_list.count() + if file_count == 0: + self.info_label.hide() + else: + total_size_bytes = 0 + for index in range(self.file_list.count()): + item = self.file_list.item(index) + total_size_bytes += item.size_bytes + total_size_readable = common.human_readable_filesize(total_size_bytes) + + self.info_label.setText(strings._('gui_file_info', True).format(file_count, total_size_readable)) + self.info_label.show() + # All buttons should be hidden if the server is on if self.server_on: self.add_button.hide() diff --git a/onionshare_gui/onionshare_gui.py b/onionshare_gui/onionshare_gui.py index 05e01530..5d0999b2 100644 --- a/onionshare_gui/onionshare_gui.py +++ b/onionshare_gui/onionshare_gui.py @@ -182,7 +182,6 @@ class OnionShareGui(QtWidgets.QMainWindow): self.check_for_updates() def update_primary_action(self): - common.log('OnionShareGui', 'update_primary_action') # Resize window self.adjustSize() diff --git a/share/locale/en.json b/share/locale/en.json index 4644d21e..2daff998 100644 --- a/share/locale/en.json +++ b/share/locale/en.json @@ -140,5 +140,6 @@ "gui_url_persistence_warning": "Every share will have the same URL.

If you want to go back to using one-time URLs, turn off persistence in the Settings.", "gui_status_indicator_stopped": "Ready to Share", "gui_status_indicator_working": "Starting...", - "gui_status_indicator_started": "Sharing" + "gui_status_indicator_started": "Sharing", + "gui_file_info": "{} Files, {}" } From 0d40d7c3b2f3bcf0af4e42d3ee278763dc4263f8 Mon Sep 17 00:00:00 2001 From: Micah Lee Date: Sat, 10 Feb 2018 12:19:55 -0800 Subject: [PATCH 05/12] Add onionshare favicon to index page --- share/html/index.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/share/html/index.html b/share/html/index.html index aa91174e..1d795908 100644 --- a/share/html/index.html +++ b/share/html/index.html @@ -2,6 +2,8 @@ OnionShare + + -

{{ filename }} ▼

-

{{ filesize_human }} (compressed)

-

This zip file contains the following contents:

+ +
+
+ +
+ +

OnionShare

+
+ - - + + + {% for info in file_info.dirs %} - - + + + {% endfor %} {% for info in file_info.files %} - - + + + {% endfor %}
TypeNameFilename Size
{{ info.basename }} + + {{ info.basename }} + {{ info.size_human }}
{{ info.basename }} + + {{ info.basename }} + {{ info.size_human }}
diff --git a/share/images/web_file.png b/share/images/web_file.png new file mode 100644 index 0000000000000000000000000000000000000000..1931aff0cb734d2182bbe14533f7dac1b1389987 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3Y)RhkE)4%caKYZ?lYt_f1s;*b z3=DinK$vl=HlH+5kiEpy*OmPd6E_2o;Ga3Gw*iGZJY5_^JdVGeev#{d0*CAAwEen& z%L3l)6bwu&=6N6O_`SuPd2aBe`n)3&n$P#VnjFUOu$ke3LuA&0t=D4hlNwuHq8?~k z$n;Fya=_VQ&xZz2?mJgi-=b^3?EKbL4AQ5OB5c(23}j zTVDQ3lq3D6XjO0ALFI;Q<&E02uWgyOO4;{y{6Usa32b%@yX#_eWKL{4(;{%puth*e z^oGm1$W%s~(p6{MKj&zDSdw&(h0{XK`efD~)*FBB_U-4^xyP$<`qQI1*7>~K&h3m| zuF;iz*`%sh+pM(zEsuPBOmff)fk&D%M7S7YuSfplIwi4qQ{e9jS!+vew=A8q?0t36 z{bvjlo?GtuuFkMx)vF8JbblrvOxj!eR=g|Nd1}z-IoX|Cu6+$SS`)z4*}Q$iB}W2K31 literal 0 HcmV?d00001 From b41b89add8d607045a26149468bcdd691dc49a22 Mon Sep 17 00:00:00 2001 From: Micah Lee Date: Sat, 10 Feb 2018 18:15:44 -0800 Subject: [PATCH 09/12] Designed file list items to look better, prevent scrolling horizintally, and ensuring the delete button does not overlap the filename --- onionshare_gui/file_selection.py | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/onionshare_gui/file_selection.py b/onionshare_gui/file_selection.py index 317edc1a..72ab9c3b 100644 --- a/onionshare_gui/file_selection.py +++ b/onionshare_gui/file_selection.py @@ -212,14 +212,20 @@ class FileList(QtWidgets.QListWidget): else: size_bytes = common.dir_size(filename) size_readable = common.human_readable_filesize(size_bytes) - item_name = '{0:s} ({1:s})'.format(basename, size_readable) # Create a new item - item = QtWidgets.QListWidgetItem(item_name) - item.setToolTip(size_readable) + item = QtWidgets.QListWidgetItem() item.setIcon(icon) item.size_bytes = size_bytes + # Item's name and size labels + item_name = QtWidgets.QLabel(basename) + item_name.setWordWrap(False) + item_name.setSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Fixed) + item_name.setStyleSheet('QLabel { color: #000000; font-size: 13px; }') + item_size = QtWidgets.QLabel(size_readable) + item_size.setStyleSheet('QLabel { color: #666666; font-size: 11px; }') + # Item's delete button def delete_item(): itemrow = self.row(item) @@ -232,16 +238,22 @@ class FileList(QtWidgets.QListWidget): item.item_button.setFlat(True) item.item_button.setIcon( QtGui.QIcon(common.get_resource_path('images/file_delete.png')) ) item.item_button.clicked.connect(delete_item) + item.item_button.setSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) - # Create an item widget to display on the item - item_widget_layout = QtWidgets.QHBoxLayout() - item_widget_layout.addStretch() - item_widget_layout.addWidget(item.item_button) - item_widget = QtWidgets.QWidget() - item_widget.setLayout(item_widget_layout) + # Create the item's widget and layouts + item_vlayout = QtWidgets.QVBoxLayout() + item_vlayout.addWidget(item_name) + item_vlayout.addWidget(item_size) + item_hlayout = QtWidgets.QHBoxLayout() + item_hlayout.addLayout(item_vlayout) + item_hlayout.addWidget(item.item_button) + widget = QtWidgets.QWidget() + widget.setLayout(item_hlayout) + + item.setSizeHint(widget.sizeHint()) self.addItem(item) - self.setItemWidget(item, item_widget) + self.setItemWidget(item, widget) self.files_updated.emit() From feeb1d75757bdb809b352bc4100274314aed8e6f Mon Sep 17 00:00:00 2001 From: Micah Lee Date: Sat, 10 Feb 2018 18:25:31 -0800 Subject: [PATCH 10/12] Left-align the client-side file list --- share/html/index.html | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/share/html/index.html b/share/html/index.html index ad5f342d..3b4d5e70 100644 --- a/share/html/index.html +++ b/share/html/index.html @@ -89,8 +89,8 @@ margin-right: 0.5rem; } - table.file-list td:first-child, table.file-list td:last-child { - width: 50%; + table.file-list td:last-child { + width: 100%; } @@ -111,14 +111,12 @@ - {% for info in file_info.dirs %} - -
Filename Size
{{ info.basename }} @@ -129,7 +127,6 @@ {% endfor %} {% for info in file_info.files %}
{{ info.basename }} From dbe0210104163de0f28f0cadd8b89d20e666d71f Mon Sep 17 00:00:00 2001 From: Micah Lee Date: Sat, 10 Feb 2018 18:36:38 -0800 Subject: [PATCH 11/12] Make the drop count adjust size based on its sizeHint --- onionshare_gui/file_selection.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/onionshare_gui/file_selection.py b/onionshare_gui/file_selection.py index 72ab9c3b..b097e501 100644 --- a/onionshare_gui/file_selection.py +++ b/onionshare_gui/file_selection.py @@ -145,7 +145,8 @@ class FileList(QtWidgets.QListWidget): count = len(event.mimeData().urls()) self.drop_count.setText('+{}'.format(count)) - self.drop_count.setGeometry(self.width() - 60, self.height() - 40, 50, 30) + size_hint = self.drop_count.sizeHint() + self.drop_count.setGeometry(self.width() - size_hint.width() - 10, self.height() - size_hint.height() - 10, size_hint.width(), size_hint.height()) self.drop_count.show() event.accept() else: From 2fb8d1f836db234d41e5d131c1f62518db425d05 Mon Sep 17 00:00:00 2001 From: Micah Lee Date: Sat, 10 Feb 2018 21:27:45 -0800 Subject: [PATCH 12/12] Tweak css --- share/html/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/html/index.html b/share/html/index.html index 3b4d5e70..b274d003 100644 --- a/share/html/index.html +++ b/share/html/index.html @@ -81,7 +81,7 @@ table.file-list td { white-space: nowrap; - padding: 0.5rem 10rem 0.5rem 0.5rem; + padding: 0.5rem 10rem 0.5rem 0.8rem; } table.file-list td img {