Skip to content

Commit 73cc61a

Browse files
authored
Merge pull request #549 from opengisch/drop
Allow source file (transfer or ili) drop
2 parents b2ac3cd + ae05d30 commit 73cc61a

File tree

6 files changed

+116
-46
lines changed

6 files changed

+116
-46
lines changed

QgisModelBaker/gui/drop_message.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
* *
1818
***************************************************************************/
1919
"""
20+
import os
2021

22+
from PyQt5.QtCore import QSize
2123
from qgis.gui import QgsGui
2224
from qgis.PyQt.QtCore import QSettings
2325
from qgis.PyQt.QtWidgets import QDialog
@@ -29,14 +31,26 @@
2931

3032

3133
class DropMessageDialog(QDialog, DIALOG_UI):
32-
def __init__(self, file_name, parent=None):
34+
def __init__(self, dropped_files, parent=None):
3335
QDialog.__init__(self, parent)
3436
self.setupUi(self)
37+
self.setFixedSize(QSize())
3538
QgsGui.instance().enableAutoGeometryRestore(self)
39+
file_list = "\n- ".join(
40+
os.path.basename(path)
41+
for path in dropped_files
42+
if dropped_files.index(path) < 10
43+
)
3644
self.info_label.setText(
3745
self.tr(
38-
"Do you want to use the Model Baker plugin to handle file {}?"
39-
).format(file_name)
46+
"Do you want to use the Model Baker plugin to handle the following {}?\n- {} {}"
47+
).format(
48+
self.tr("files") if len(dropped_files) > 1 else self.tr("file"),
49+
file_list,
50+
self.tr("\nand {} more...").format(len(dropped_files) - 10)
51+
if len(dropped_files) > 10
52+
else "",
53+
)
4054
)
4155
self.accepted.connect(lambda: self.handle_dropped_file_configuration(True))
4256
self.rejected.connect(lambda: self.handle_dropped_file_configuration(False))

QgisModelBaker/gui/options.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
* *
1818
***************************************************************************/
1919
"""
20+
import pathlib
2021
import webbrowser
2122

2223
from qgis.PyQt.QtCore import QLocale, QModelIndex, QSettings, Qt, pyqtSignal
@@ -203,3 +204,34 @@ def keyPressEvent(self, e):
203204
_selected_indexes = self.selectedIndexes()
204205
self.space_pressed.emit(_selected_indexes[0])
205206
super(ModelListView, self).keyPressEvent(e)
207+
208+
209+
class FileDropListView(QListView):
210+
211+
ValidExtenstions = ["xtf", "XTF", "itf", "ITF", "ili"]
212+
213+
files_dropped = pyqtSignal(list)
214+
215+
def __init__(self, parent=None):
216+
super(FileDropListView, self).__init__(parent)
217+
self.setAcceptDrops(True)
218+
self.setDragDropMode(QListView.InternalMove)
219+
220+
def dragEnterEvent(self, event):
221+
for url in event.mimeData().urls():
222+
if (
223+
pathlib.Path(url.toLocalFile()).suffix[1:]
224+
in FileDropListView.ValidExtenstions
225+
):
226+
event.acceptProposedAction()
227+
break
228+
229+
def dropEvent(self, event):
230+
dropped_files = [
231+
url.toLocalFile()
232+
for url in event.mimeData().urls()
233+
if pathlib.Path(url.toLocalFile()).suffix[1:]
234+
in FileDropListView.ValidExtenstions
235+
]
236+
self.files_dropped.emit(dropped_files)
237+
event.acceptProposedAction()

QgisModelBaker/gui/workflow_wizard/import_source_selection_page.py

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
***************************************************************************/
1919
"""
2020

21-
import os
22-
import pathlib
2321

2422
from qgis.core import QgsApplication
2523
from qgis.PyQt.QtCore import Qt
@@ -87,6 +85,9 @@ def __init__(self, parent, title):
8785
)
8886
self.add_button.setIcon(QgsApplication.getThemeIcon("/symbologyAdd.svg"))
8987
self.remove_button.setIcon(QgsApplication.getThemeIcon("/symbologyRemove.svg"))
88+
self.source_list_view.files_dropped.connect(
89+
self.workflow_wizard.append_dropped_files
90+
)
9091

9192
def nextId(self):
9293
self._disconnect_punch_slots()
@@ -168,15 +169,7 @@ def update_models_completer(self):
168169

169170
def _add_row(self):
170171
source = self.input_line_edit.text()
171-
if os.path.isfile(source):
172-
name = pathlib.Path(source).name
173-
type = pathlib.Path(source).suffix[1:]
174-
path = source
175-
else:
176-
name = source
177-
type = "model"
178-
path = None
179-
self.source_list_view.model().add_source(name, type, path)
172+
self.workflow_wizard.add_source(source)
180173
self.input_line_edit.clearFocus()
181174
self.input_line_edit.clear()
182175

QgisModelBaker/gui/workflow_wizard/workflow_wizard.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
* *
1818
***************************************************************************/
1919
"""
20+
import os
21+
import pathlib
2022

2123
from qgis.PyQt.QtCore import QEventLoop, Qt, QTimer
2224
from qgis.PyQt.QtWidgets import QDialog, QSplitter, QVBoxLayout, QWizard
@@ -428,9 +430,25 @@ def get_topping_file_model(self, id_list, log_panel):
428430

429431
return topping_file_cache.model
430432

433+
def add_source(self, source):
434+
if os.path.isfile(source):
435+
name = pathlib.Path(source).name
436+
type = pathlib.Path(source).suffix[1:]
437+
path = source
438+
else:
439+
name = source
440+
type = "model"
441+
path = None
442+
self.source_model.add_source(name, type, path)
443+
444+
def append_dropped_files(self, dropped_files):
445+
if dropped_files:
446+
for dropped_file in dropped_files:
447+
self.add_source(dropped_file)
448+
431449

432450
class WorkflowWizardDialog(QDialog):
433-
def __init__(self, iface, base_config, parent=None):
451+
def __init__(self, iface, base_config):
434452
QDialog.__init__(self)
435453
self.iface = iface
436454
self.base_config = base_config
@@ -451,3 +469,11 @@ def __init__(self, iface, base_config, parent=None):
451469
splitter.addWidget(self.log_panel)
452470
layout.addWidget(splitter)
453471
self.setLayout(layout)
472+
473+
def append_dropped_files(self, dropped_files):
474+
"""
475+
Appends the files, restarts the wizard and jumps to the next page (what is ImportSourceSelection)
476+
"""
477+
self.workflow_wizard.append_dropped_files(dropped_files)
478+
self.workflow_wizard.restart()
479+
self.workflow_wizard.next()

QgisModelBaker/qgismodelbaker.py

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -456,20 +456,18 @@ def create_project(
456456
qgis_project = QgsProject.instance()
457457
project.create(None, qgis_project)
458458

459-
def handle_dropped_file(self, file_path):
460-
if pathlib.Path(file_path).suffix[1:] in ["xtf", "XTF", "itf", "ITF"]:
461-
if not self.importdata_dlg:
462-
self.set_dropped_file_configuration(file_path)
463-
self.show_importdata_dialog()
464-
return True
465-
return False
466-
467-
def set_dropped_file_configuration(self, file_path):
459+
def handle_dropped_files(self, dropped_files):
460+
if not self.workflow_wizard_dlg:
461+
self._set_dropped_file_configuration()
462+
self.show_workflow_wizard_dialog()
463+
self.workflow_wizard_dlg.append_dropped_files(dropped_files)
464+
return True
465+
466+
def _set_dropped_file_configuration(self):
468467
settings = QSettings()
469-
settings.setValue("QgisModelBaker/ili2pg/xtffile_import", file_path)
470468
settings.setValue("QgisModelBaker/importtype", "gpkg")
471-
output_file_name = "{}_{:%Y%m%d%H%M%S%f}.gpkg".format(
472-
os.path.splitext(os.path.basename(file_path))[0], datetime.datetime.now()
469+
output_file_name = "temp_db_{:%Y%m%d%H%M%S%f}.gpkg".format(
470+
datetime.datetime.now()
473471
)
474472
settings.setValue(
475473
"QgisModelBaker/ili2gpkg/dbfile",
@@ -485,28 +483,29 @@ def __init__(self, parent=None):
485483
super(DropFileFilter, self).__init__(parent.iface.mainWindow())
486484
self.parent = parent
487485

488-
def is_handling_requested(self, file_path):
489-
if pathlib.Path(file_path).suffix[1:] in ["xtf", "XTF", "itf", "ITF"]:
490-
settings = QSettings()
491-
drop_mode = DropMode[
492-
settings.value("QgisModelBaker/drop_mode", DropMode.ASK.name, str)
493-
]
494-
if drop_mode == DropMode.ASK:
495-
drop_message_dialog = DropMessageDialog(os.path.basename(file_path))
496-
return drop_message_dialog.exec_()
497-
return drop_mode == DropMode.YES
498-
return False
486+
def _is_handling_requested(self, dropped_files):
487+
settings = QSettings()
488+
drop_mode = DropMode[
489+
settings.value("QgisModelBaker/drop_mode", DropMode.ASK.name, str)
490+
]
491+
if drop_mode == DropMode.ASK:
492+
drop_message_dialog = DropMessageDialog(dropped_files)
493+
return drop_message_dialog.exec_()
494+
return drop_mode == DropMode.YES
499495

500496
def eventFilter(self, obj, event):
501497
"""
502-
When exactly one valid import file is dropped, then ask to use it in import dialog.
498+
When files are dropped, then ask to use it in the model baker.
503499
"""
504500
if event.type() == QEvent.Drop:
505-
if len(event.mimeData().urls()) == 1:
506-
if self.is_handling_requested(event.mimeData().urls()[0].toLocalFile()):
507-
if self.parent.handle_dropped_file(
508-
event.mimeData().urls()[0].toLocalFile()
509-
):
501+
dropped_files = [
502+
url.toLocalFile()
503+
for url in event.mimeData().urls()
504+
if pathlib.Path(url.toLocalFile()).suffix[1:]
505+
in ["xtf", "XTF", "itf", "ITF", "ili"]
506+
]
507+
if dropped_files:
508+
if self._is_handling_requested(dropped_files):
509+
if self.parent.handle_dropped_files(dropped_files):
510510
return True
511-
512511
return False

QgisModelBaker/ui/workflow_wizard/import_source_selection.ui

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@
9090
<widget class="CompletionLineEdit" name="input_line_edit" native="true"/>
9191
</item>
9292
<item row="2" column="0" colspan="3">
93-
<widget class="QListView" name="source_list_view"/>
93+
<widget class="FileDropListView" name="source_list_view"/>
9494
</item>
9595
<item row="0" column="2">
9696
<widget class="QToolButton" name="file_browse_button">
@@ -114,6 +114,12 @@
114114
<header>QgisModelBaker.gui.options</header>
115115
<container>1</container>
116116
</customwidget>
117+
<customwidget>
118+
<class>FileDropListView</class>
119+
<extends></extends>
120+
<header>QgisModelBaker.gui.options</header>
121+
<container>1</container>
122+
</customwidget>
117123
</customwidgets>
118124
<tabstops>
119125
<tabstop>file_browse_button</tabstop>

0 commit comments

Comments
 (0)