summaryrefslogblamecommitdiffstats
path: root/heimdall-frontend/source/qml/DropFiles.qml
blob: 2745b4e648d202557573f96cdb3c09bf4c552d29 (plain) (tree)
1
2
3
4
5
6
7
8
9


                           
                          
                                              
                                  
                                     

               
                      
                                 
                                     




















                                                                 
                                                                






                                                                                                                    
                                                

                                                                                                            


                                                                       


















































                                                                                                                     
                                


                                                
                             
                                                        

                 
 
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Layouts 1.1
import QtQuick.Dialogs 1.2
import "ArrayExtensions.js" as ArrayExtensions
import "FileUtils.js" as FileUtils
import HeimdallFrontend 1.0 as Native

DropFilesForm {
	id: background
	property var fileUrls: []
	signal nextPressed(var files)

	ListModel {
		id: fileModel
	}

	function setFileGridVisible(visible) {
		if (fileGridContainer.visible !== visible) {
			dropFilesContainer.visible = !visible;
			bottomButtonsContainer.visible = visible;
			fileGridContainer.visible = visible;

			if (visible) {
				fileGridView.forceActiveFocus();
			}
		}
	}

	function addFiles(urls) {
		var count = urls.length;
		if (count > 0) {
			for (var i = 0; i < count; i++) {
				if (FileUtils.isFile(urls[i])) {
					if (FileUtils.isArchive(urls[i])) {
						var packageData = Native.Firmware.extractArchive(urls[i]);
						packageData.filePaths.forEach(function(path) {
							var filename = FileUtils.filenameFromPath(path);
							fileModel.append({ icon: "drop_zone.svg", text: filename });
						});
						fileUrls.extend(packageData.filePaths);
					} else {
						var filename = FileUtils.filenameFromUrl(urls[i]);
						fileModel.append({ icon: "drop_zone.svg", text: filename });
						fileUrls.push(urls[i]);
					}
				}
			}

			setFileGridVisible(true);
		}
	}

	function removeFile(index) {
		if (index >= 0) {
			fileModel.remove(index);
			fileUrls.splice(index, 1);

			if (fileUrls.length == 0) {
				setFileGridVisible(false);
			}
		}
	}

	onKeyPressed: {
		if (event.key === Qt.Key_Delete || event.key === Qt.Key_Backspace) {
			event.accepted = true;
			removeFile(fileGridView.currentIndex);
		}
	}

	dropFilesArea {
		onDropped: {
			if ((drop.action == Qt.CopyAction || drop.action == Qt.MoveAction) && drop.urls.length > 0) {
				addFiles(drop.urls);
				drop.acceptProposedAction();
				drop.accept(Qt.CopyAction);
			}
		}
	}

	browseButton.onClicked: {
		browseDialog.open()
	}

	bottomBrowseButton.onClicked: {
		browseDialog.open()
	}

	nextButton {
		onClicked: nextPressed(fileUrls)
	}

	fileGridView {
		model: fileModel
	}

	FileDialog {
		id: browseDialog
		title: "Select firmware file(s)"
		selectMultiple: true
		selectFolder: false
		onAccepted: {
			addFiles(browseDialog.fileUrls);
		}
	}
}