In macOS, split "Add" button into "Add Files" and "Add Folder" buttons

This commit is contained in:
Micah Lee 2018-11-27 12:10:16 -08:00
parent 942f4f6bac
commit 3a0c8dc323
No known key found for this signature in database
GPG key ID: 403C2657CD994F73
4 changed files with 52 additions and 7 deletions

View file

@ -47,7 +47,7 @@ class ShareMode(Mode):
self.web = Web(self.common, True, 'share') self.web = Web(self.common, True, 'share')
# File selection # File selection
self.file_selection = FileSelection(self.common) self.file_selection = FileSelection(self.common, self)
if self.filenames: if self.filenames:
for filename in self.filenames: for filename in self.filenames:
self.file_selection.file_list.add_file(filename) self.file_selection.file_list.add_file(filename)

View file

@ -288,10 +288,11 @@ class FileSelection(QtWidgets.QVBoxLayout):
The list of files and folders in the GUI, as well as buttons to add and The list of files and folders in the GUI, as well as buttons to add and
delete the files and folders. delete the files and folders.
""" """
def __init__(self, common): def __init__(self, common, parent):
super(FileSelection, self).__init__() super(FileSelection, self).__init__()
self.common = common self.common = common
self.parent = parent
self.server_on = False self.server_on = False
@ -302,13 +303,25 @@ class FileSelection(QtWidgets.QVBoxLayout):
self.file_list.files_updated.connect(self.update) self.file_list.files_updated.connect(self.update)
# Buttons # Buttons
self.add_button = QtWidgets.QPushButton(strings._('gui_add')) if self.common.platform == 'Darwin':
self.add_button.clicked.connect(self.add) # The macOS sandbox makes it so the Mac version needs separate add files
# and folders buttons, in order to use native file selection dialogs
self.add_files_button = QtWidgets.QPushButton(strings._('gui_add_files'))
self.add_files_button.clicked.connect(self.add_files)
self.add_folder_button = QtWidgets.QPushButton(strings._('gui_add_folder'))
self.add_folder_button.clicked.connect(self.add_folder)
else:
self.add_button = QtWidgets.QPushButton(strings._('gui_add'))
self.add_button.clicked.connect(self.add)
self.delete_button = QtWidgets.QPushButton(strings._('gui_delete')) self.delete_button = QtWidgets.QPushButton(strings._('gui_delete'))
self.delete_button.clicked.connect(self.delete) self.delete_button.clicked.connect(self.delete)
button_layout = QtWidgets.QHBoxLayout() button_layout = QtWidgets.QHBoxLayout()
button_layout.addStretch() button_layout.addStretch()
button_layout.addWidget(self.add_button) if self.common.platform == 'Darwin':
button_layout.addWidget(self.add_files_button)
button_layout.addWidget(self.add_folder_button)
else:
button_layout.addWidget(self.add_button)
button_layout.addWidget(self.delete_button) button_layout.addWidget(self.delete_button)
# Add the widgets # Add the widgets
@ -323,10 +336,18 @@ class FileSelection(QtWidgets.QVBoxLayout):
""" """
# All buttons should be hidden if the server is on # All buttons should be hidden if the server is on
if self.server_on: if self.server_on:
self.add_button.hide() if self.common.platform == 'Darwin':
self.add_files_button.hide()
self.add_folder_button.hide()
else:
self.add_button.hide()
self.delete_button.hide() self.delete_button.hide()
else: else:
self.add_button.show() if self.common.platform == 'Darwin':
self.add_files_button.show()
self.add_folder_button.show()
else:
self.add_button.show()
# Delete button should be hidden if item isn't selected # Delete button should be hidden if item isn't selected
if len(self.file_list.selectedItems()) == 0: if len(self.file_list.selectedItems()) == 0:
@ -349,6 +370,24 @@ class FileSelection(QtWidgets.QVBoxLayout):
self.file_list.setCurrentItem(None) self.file_list.setCurrentItem(None)
self.update() self.update()
def add_files(self):
"""
Add files button clicked.
"""
files = QtWidgets.QFileDialog.getOpenFileNames(self.parent, caption=strings._('gui_choose_items'))
filenames = files[0]
for filename in filenames:
self.file_list.add_file(filename)
def add_folder(self):
"""
Add folder button clicked.
"""
filename = QtWidgets.QFileDialog.getExistingDirectory(self.parent,
caption=strings._('gui_choose_items'),
options=QtWidgets.QFileDialog.ShowDirsOnly)
self.file_list.add_file(filename)
def delete(self): def delete(self):
""" """
Delete button clicked Delete button clicked

View file

@ -44,6 +44,10 @@ class AddFileDialog(QtWidgets.QFileDialog):
""" """
Overridden version of QFileDialog which allows us to select folders as well Overridden version of QFileDialog which allows us to select folders as well
as, or instead of, files. For adding files/folders to share. as, or instead of, files. For adding files/folders to share.
Note that this dialog can't be used in macOS, only in Windows, Linux, and BSD.
This is because the macOS sandbox requires native dialogs, and this is a Qt5
dialog.
""" """
def __init__(self, common, *args, **kwargs): def __init__(self, common, *args, **kwargs):
QtWidgets.QFileDialog.__init__(self, *args, **kwargs) QtWidgets.QFileDialog.__init__(self, *args, **kwargs)

View file

@ -33,6 +33,8 @@
"help_config": "Custom JSON config file location (optional)", "help_config": "Custom JSON config file location (optional)",
"gui_drag_and_drop": "Drag and drop files and folders\nto start sharing", "gui_drag_and_drop": "Drag and drop files and folders\nto start sharing",
"gui_add": "Add", "gui_add": "Add",
"gui_add_files": "Add Files",
"gui_add_folder": "Add Folder",
"gui_delete": "Delete", "gui_delete": "Delete",
"gui_choose_items": "Choose", "gui_choose_items": "Choose",
"gui_share_start_server": "Start sharing", "gui_share_start_server": "Start sharing",