From 4b7d3c9a2ffcba5ec4f6479dccb09d6b16988773 Mon Sep 17 00:00:00 2001 From: Muki Date: Tue, 15 May 2012 23:03:35 +0200 Subject: [PATCH 1/1] New GUI --- graphics/back-old.svg | 72 ++++++++ graphics/back.svg | 67 ++++--- graphics/close_stop.svg | 84 +++++++++ graphics/delete.svg | 30 +++ graphics/document-big.svg | 81 ++++++++ graphics/document.svg | 105 ++++++++--- graphics/download.svg | 84 +++++++++ graphics/folder-big.svg | 86 +++++++++ graphics/folder.svg | 2 +- graphics/music-big.svg | 81 ++++++++ graphics/music.svg | 76 ++++++++ graphics/options.svg | 81 ++++++++ graphics/photos-big.svg | 81 ++++++++ graphics/photos.svg | 6 +- graphics/qtg_fr_pushbutton_disabled.svg | 112 ++++++++++++ graphics/qtg_fr_pushbutton_normal.svg | 110 +++++++++++ graphics/qtg_fr_pushbutton_pressed.svg | 15 ++ graphics/qtg_fr_tab_passive_normal.svg | 19 ++ graphics/qtg_fr_tooltip_inverse.svg | 12 ++ graphics/qtg_graf_magnifier_mask.svg | 6 + graphics/qtg_graf_switchbutton_track.svg | 36 ++++ graphics/qtg_graf_switchbutton_track_inverse.svg | 36 ++++ graphics/refresh.svg | 76 ++++++++ graphics/sync.svg | 35 ++++ graphics/up.svg | 91 +++++++++ graphics/upload.svg | 84 +++++++++ graphics/video-big.svg | 81 ++++++++ graphics/video.svg | 76 ++++++++ qml/ubi/AccountPage.qml | 24 ++- qml/ubi/DownloadArea.qml | 42 ++++- qml/ubi/FileDialog.qml | 185 +++++++++++++++++++ qml/ubi/FilesPage.qml | 213 ++++++++++++++++------ qml/ubi/InitPage.qml | 137 +++++++------- qml/ubi/LoginPage.qml | 29 ++- qml/ubi/Page.qml | 76 ++++++++ qml/ubi/PageStack.qml | 5 +- qml/ubi/PropertiesPage.qml | 114 +++++++++++- qml/ubi/SettingsPage.qml | 26 ++- qml/ubi/Shadow.qml | 3 +- qml/ubi/StartPage.qml | 6 + qml/ubi/SystemBar.qml | 125 ++++++++++--- qml/ubi/TaskMenu.qml | 71 ++++++++ qml/ubi/TopBar.qml | 100 ++++++++++ qml/ubi/UIConstants.js | 3 +- qml/ubi/components/Bar.qml | 114 +++++++----- qml/ubi/components/BusyIndicator.qml | 37 ++++ qml/ubi/components/Button.qml | 11 +- qml/ubi/components/ButtonGlass.qml | 113 ++++++++++++ qml/ubi/components/ButtonResizable.qml | 91 +++++++++ qml/ubi/components/DialogBlank.qml | 32 ++++ qml/ubi/components/DialogBox.qml | 38 ++-- qml/ubi/components/File.qml | 17 +- qml/ubi/components/FileOld.qml | 89 --------- qml/ubi/components/FileSmall.qml | 67 +++++++ qml/ubi/components/Mask.qml | 24 +-- qml/ubi/components/Notification.qml | 11 ++ qml/ubi/components/NotificationNew.qml | 104 +++++++++++ qml/ubi/components/Showable.qml | 58 ++++++ qml/ubi/components/ToolIcon.qml | 23 ++- qml/ubi/images/back-old.png | Bin 0 -> 285 bytes qml/ubi/images/back.png | Bin 285 -> 503 bytes qml/ubi/images/bg.png | Bin 0 -> 165 bytes qml/ubi/images/close-old.png | Bin 0 -> 369 bytes qml/ubi/images/close.png | Bin 369 -> 626 bytes qml/ubi/images/document-small.png | Bin 0 -> 389 bytes qml/ubi/images/document.png | Bin 1007 -> 1390 bytes qml/ubi/images/download-old.png | Bin 0 -> 282 bytes qml/ubi/images/download.png | Bin 282 -> 675 bytes qml/ubi/images/folder-small.png | Bin 0 -> 534 bytes qml/ubi/images/folder.png | Bin 615 -> 1081 bytes qml/ubi/images/minimize-old.png | Bin 0 -> 371 bytes qml/ubi/images/minimize.png | Bin 371 -> 357 bytes qml/ubi/images/music-small.png | Bin 0 -> 1258 bytes qml/ubi/images/music.png | Bin 0 -> 1707 bytes qml/ubi/images/options.png | Bin 0 -> 317 bytes qml/ubi/images/photo-small.png | Bin 0 -> 823 bytes qml/ubi/images/photo.png | Bin 1068 -> 1418 bytes qml/ubi/images/pushbutton_disabled.png | Bin 0 -> 1173 bytes qml/ubi/images/pushbutton_normal.png | Bin 0 -> 1072 bytes qml/ubi/images/refresh.png | Bin 722 -> 1251 bytes qml/ubi/images/up-old.png | Bin 0 -> 343 bytes qml/ubi/images/up.png | Bin 343 -> 449 bytes qml/ubi/images/upload-old.png | Bin 0 -> 273 bytes qml/ubi/images/upload.png | Bin 273 -> 625 bytes qml/ubi/images/video-small.png | Bin 0 -> 1282 bytes qml/ubi/images/video.png | Bin 0 -> 2138 bytes qml/ubi/main.qml | 104 +++++++++-- qml/ubi/u1.js | 33 ++-- translation.pri | 7 + translations/ubi.pl.qm | Bin 7087 -> 10329 bytes translations/ubi.pl.ts | 168 +++++++++++++++-- ubi.pro | 6 +- ubi.pro.user | 8 +- ubi.zip | Bin 128944 -> 129200 bytes utils.cpp | 79 ++++++-- utils.h | 4 + 96 files changed, 3604 insertions(+), 518 deletions(-) create mode 100644 graphics/back-old.svg create mode 100644 graphics/close_stop.svg create mode 100644 graphics/delete.svg create mode 100644 graphics/document-big.svg create mode 100644 graphics/download.svg create mode 100644 graphics/folder-big.svg create mode 100644 graphics/music-big.svg create mode 100644 graphics/music.svg create mode 100644 graphics/options.svg create mode 100644 graphics/photos-big.svg create mode 100644 graphics/qtg_fr_pushbutton_disabled.svg create mode 100644 graphics/qtg_fr_pushbutton_normal.svg create mode 100644 graphics/qtg_fr_pushbutton_pressed.svg create mode 100644 graphics/qtg_fr_tab_passive_normal.svg create mode 100644 graphics/qtg_fr_tooltip_inverse.svg create mode 100644 graphics/qtg_graf_magnifier_mask.svg create mode 100644 graphics/qtg_graf_switchbutton_track.svg create mode 100644 graphics/qtg_graf_switchbutton_track_inverse.svg create mode 100644 graphics/refresh.svg create mode 100644 graphics/sync.svg create mode 100644 graphics/up.svg create mode 100644 graphics/upload.svg create mode 100644 graphics/video-big.svg create mode 100644 graphics/video.svg create mode 100644 qml/ubi/FileDialog.qml create mode 100644 qml/ubi/Page.qml create mode 100644 qml/ubi/TaskMenu.qml create mode 100644 qml/ubi/TopBar.qml create mode 100644 qml/ubi/components/BusyIndicator.qml create mode 100644 qml/ubi/components/ButtonGlass.qml create mode 100644 qml/ubi/components/ButtonResizable.qml create mode 100644 qml/ubi/components/DialogBlank.qml delete mode 100644 qml/ubi/components/FileOld.qml create mode 100644 qml/ubi/components/FileSmall.qml create mode 100644 qml/ubi/components/NotificationNew.qml create mode 100644 qml/ubi/components/Showable.qml create mode 100644 qml/ubi/images/back-old.png create mode 100644 qml/ubi/images/bg.png create mode 100644 qml/ubi/images/close-old.png create mode 100644 qml/ubi/images/document-small.png create mode 100644 qml/ubi/images/download-old.png create mode 100644 qml/ubi/images/folder-small.png create mode 100644 qml/ubi/images/minimize-old.png create mode 100644 qml/ubi/images/music-small.png create mode 100644 qml/ubi/images/music.png create mode 100644 qml/ubi/images/options.png create mode 100644 qml/ubi/images/photo-small.png create mode 100644 qml/ubi/images/pushbutton_disabled.png create mode 100644 qml/ubi/images/pushbutton_normal.png create mode 100644 qml/ubi/images/up-old.png create mode 100644 qml/ubi/images/upload-old.png create mode 100644 qml/ubi/images/video-small.png create mode 100644 qml/ubi/images/video.png diff --git a/graphics/back-old.svg b/graphics/back-old.svg new file mode 100644 index 0000000..e9d2170 --- /dev/null +++ b/graphics/back-old.svg @@ -0,0 +1,72 @@ + + + +image/svg+xml + + + + + + + + + + + \ No newline at end of file diff --git a/graphics/back.svg b/graphics/back.svg index e9d2170..90d973e 100644 --- a/graphics/back.svg +++ b/graphics/back.svg @@ -19,17 +19,14 @@ xml:space="preserve" id="svg2" inkscape:version="0.48.3.1 r9886" - sodipodi:docname="back.svg">image/svg+xml - - - - - - - + id="DO_NOT_EDIT_-_BOUNDING_BOX"> + + + + + + + - + width="30" + height="30" + id="rect15" /> + \ No newline at end of file diff --git a/graphics/close_stop.svg b/graphics/close_stop.svg new file mode 100644 index 0000000..b8ba5a5 --- /dev/null +++ b/graphics/close_stop.svg @@ -0,0 +1,84 @@ + + + +image/svg+xml + + + + + + + + + + + + + \ No newline at end of file diff --git a/graphics/delete.svg b/graphics/delete.svg new file mode 100644 index 0000000..2421502 --- /dev/null +++ b/graphics/delete.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + diff --git a/graphics/document-big.svg b/graphics/document-big.svg new file mode 100644 index 0000000..62e500d --- /dev/null +++ b/graphics/document-big.svg @@ -0,0 +1,81 @@ + + + +image/svg+xml + + + + + \ No newline at end of file diff --git a/graphics/document.svg b/graphics/document.svg index d3b8296..bb628e9 100644 --- a/graphics/document.svg +++ b/graphics/document.svg @@ -1,29 +1,76 @@ - - - - - - - - - - - - - - + + + +image/svg+xml + + + + + + + + + + \ No newline at end of file diff --git a/graphics/download.svg b/graphics/download.svg new file mode 100644 index 0000000..81b23d1 --- /dev/null +++ b/graphics/download.svg @@ -0,0 +1,84 @@ + + + +image/svg+xml + + + + + + + + + + + + + \ No newline at end of file diff --git a/graphics/folder-big.svg b/graphics/folder-big.svg new file mode 100644 index 0000000..d237210 --- /dev/null +++ b/graphics/folder-big.svg @@ -0,0 +1,86 @@ + + + +image/svg+xml + + + + + + + + + + \ No newline at end of file diff --git a/graphics/folder.svg b/graphics/folder.svg index 960a178..913fc55 100644 --- a/graphics/folder.svg +++ b/graphics/folder.svg @@ -20,7 +20,7 @@ id="svg2" inkscape:version="0.48.3.1 r9886" sodipodi:docname="folder.svg" - inkscape:export-filename="/home/mkiol/dev/Qt/ubi/qml/ubi/images/files.png" + inkscape:export-filename="/home/mkiol/dev/Qt/ubi/qml/ubi/images/folder-small.png" inkscape:export-xdpi="120" inkscape:export-ydpi="120"> + + +image/svg+xml + + + + + \ No newline at end of file diff --git a/graphics/music.svg b/graphics/music.svg new file mode 100644 index 0000000..51b72b6 --- /dev/null +++ b/graphics/music.svg @@ -0,0 +1,76 @@ + + + +image/svg+xml + + + + + + + + + + \ No newline at end of file diff --git a/graphics/options.svg b/graphics/options.svg new file mode 100644 index 0000000..e34f2bd --- /dev/null +++ b/graphics/options.svg @@ -0,0 +1,81 @@ + + + +image/svg+xml + + + + + + + + + + + \ No newline at end of file diff --git a/graphics/photos-big.svg b/graphics/photos-big.svg new file mode 100644 index 0000000..c6a0d9f --- /dev/null +++ b/graphics/photos-big.svg @@ -0,0 +1,81 @@ + + + +image/svg+xml + + + + + \ No newline at end of file diff --git a/graphics/photos.svg b/graphics/photos.svg index 3d8f26c..3c1caa5 100644 --- a/graphics/photos.svg +++ b/graphics/photos.svg @@ -20,9 +20,9 @@ id="svg2" inkscape:version="0.48.3.1 r9886" sodipodi:docname="photos.svg" - inkscape:export-filename="/home/mkiol/dev/Qt/ubi/qml/ubi/images/photo.png" - inkscape:export-xdpi="150" - inkscape:export-ydpi="150">image/svg+xml + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + diff --git a/graphics/qtg_fr_pushbutton_normal.svg b/graphics/qtg_fr_pushbutton_normal.svg new file mode 100644 index 0000000..7af33d6 --- /dev/null +++ b/graphics/qtg_fr_pushbutton_normal.svg @@ -0,0 +1,110 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + diff --git a/graphics/qtg_fr_pushbutton_pressed.svg b/graphics/qtg_fr_pushbutton_pressed.svg new file mode 100644 index 0000000..d2a1a18 --- /dev/null +++ b/graphics/qtg_fr_pushbutton_pressed.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/graphics/qtg_fr_tab_passive_normal.svg b/graphics/qtg_fr_tab_passive_normal.svg new file mode 100644 index 0000000..2fa2661 --- /dev/null +++ b/graphics/qtg_fr_tab_passive_normal.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/graphics/qtg_fr_tooltip_inverse.svg b/graphics/qtg_fr_tooltip_inverse.svg new file mode 100644 index 0000000..da242fa --- /dev/null +++ b/graphics/qtg_fr_tooltip_inverse.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/graphics/qtg_graf_magnifier_mask.svg b/graphics/qtg_graf_magnifier_mask.svg new file mode 100644 index 0000000..f1641e0 --- /dev/null +++ b/graphics/qtg_graf_magnifier_mask.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/graphics/qtg_graf_switchbutton_track.svg b/graphics/qtg_graf_switchbutton_track.svg new file mode 100644 index 0000000..61335e5 --- /dev/null +++ b/graphics/qtg_graf_switchbutton_track.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/graphics/qtg_graf_switchbutton_track_inverse.svg b/graphics/qtg_graf_switchbutton_track_inverse.svg new file mode 100644 index 0000000..a41075b --- /dev/null +++ b/graphics/qtg_graf_switchbutton_track_inverse.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/graphics/refresh.svg b/graphics/refresh.svg new file mode 100644 index 0000000..3121a23 --- /dev/null +++ b/graphics/refresh.svg @@ -0,0 +1,76 @@ + + + +image/svg+xml + + + + + + + + + + \ No newline at end of file diff --git a/graphics/sync.svg b/graphics/sync.svg new file mode 100644 index 0000000..a59f9f5 --- /dev/null +++ b/graphics/sync.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + diff --git a/graphics/up.svg b/graphics/up.svg new file mode 100644 index 0000000..e474a1e --- /dev/null +++ b/graphics/up.svg @@ -0,0 +1,91 @@ + + + +image/svg+xml + + + + + + + + + + + \ No newline at end of file diff --git a/graphics/upload.svg b/graphics/upload.svg new file mode 100644 index 0000000..af5814b --- /dev/null +++ b/graphics/upload.svg @@ -0,0 +1,84 @@ + + + +image/svg+xml + + + + + + + + + + + + + \ No newline at end of file diff --git a/graphics/video-big.svg b/graphics/video-big.svg new file mode 100644 index 0000000..f410b07 --- /dev/null +++ b/graphics/video-big.svg @@ -0,0 +1,81 @@ + + + +image/svg+xml + + + + + \ No newline at end of file diff --git a/graphics/video.svg b/graphics/video.svg new file mode 100644 index 0000000..1f7f36e --- /dev/null +++ b/graphics/video.svg @@ -0,0 +1,76 @@ + + + +image/svg+xml + + + + + + + + + + \ No newline at end of file diff --git a/qml/ubi/AccountPage.qml b/qml/ubi/AccountPage.qml index b5901b8..6065bb7 100644 --- a/qml/ubi/AccountPage.qml +++ b/qml/ubi/AccountPage.qml @@ -9,6 +9,7 @@ Page { title: qsTr("Account") property variant secrets + property alias taskMenu: taskMenu Component.onCompleted: init() @@ -52,11 +53,11 @@ Page { //console.log("onErr"); mask.state = "idle"; if(status==401) { - tip.show(qsTr("Authorization failed!")); + tip.show(qsTr("Ubuntu One authorization has failed. Try once again or check login settings.")); } else if(status==0) { - tip.show(qsTr("Unable to connect!")); + tip.show(qsTr("Unable to connect. Check internet connection.")); } else { - tip.show(qsTr("Error: ")+status); + tip.show(qsTr("Unknown error: ")+status); } pageStack.pop(); } @@ -64,8 +65,9 @@ Page { Flickable { width: root.width height: root.height - contentHeight: content.height+Const.SYSTEM_BAR_HEIGHT+Const.TEXT_MARGIN - y: Const.SYSTEM_BAR_HEIGHT+Const.TEXT_MARGIN + + contentHeight: content.height+Const.TOP_BAR_HEIGHT+Const.SYSTEM_BAR_HEIGHT+Const.TEXT_MARGIN + y: Const.TOP_BAR_HEIGHT Column { id: content @@ -156,4 +158,16 @@ Page { Spacer{} } } + + TaskMenu { + z: 200 + id: taskMenu + menuHeight: menuFixed.height+4*Const.DEFAULT_MARGIN + + menuDynamic: _menuDyn + Flow { + y: root.height-taskMenu.menuHeight-Const.SYSTEM_BAR_HEIGHT+1*Const.DEFAULT_MARGIN + id: _menuDyn + } + } } diff --git a/qml/ubi/DownloadArea.qml b/qml/ubi/DownloadArea.qml index 79fabca..62554a6 100644 --- a/qml/ubi/DownloadArea.qml +++ b/qml/ubi/DownloadArea.qml @@ -7,25 +7,38 @@ Item { property int count: 0 - height: taskView.height + /*Rectangle { + anchors.fill: parent + color: "red" + }*/ + + height: taskView.height+Const.DEFAULT_MARGIN function addTask(type,filename) { //emptyLabel.visible = Utils.emptyQuee(); //emptyLabel.visible = false; + //console.log("1. taskView.childrens.length: "+taskView.children.length); + //console.log("1. taskView.height: "+taskView.height); var comp = Qt.createComponent("components/Bar.qml"); + //var obj = comp.createObject(taskView,{"width": root.width}); var obj = comp.createObject(taskView); if (obj==null) { console.log("Error creating object"); } else { root.count++; - obj.width = root.width + //obj.width = root.width obj.label = filename; + obj.cancel.connect(function(file) { + Utils.cancelFile(file); + }); if(type=="download") obj.isDownload = true; if(type=="upload") obj.isUpload = true; } + //console.log("2. taskView.childrens.length: "+taskView.children.length); + //console.log("2. taskView.height: "+taskView.height); } function setProgress(filename, progress) @@ -33,8 +46,10 @@ Item { var l = taskView.children.length; for(var i=0;i=0) { + path = path.substr(ind+1); + } + if(path=="") path = "/"; + + return path; + } + + MouseArea { + anchors.fill: parent + } + + Rectangle { + id: fileSelector + + anchors.left: root.left; anchors.right: root.right + anchors.top: root.top + + height: parent.height + + property string currentFilePath: folderModel.folder + property bool load: true + property string folder: folderModel.folder + + color: Const.DEFAULT_DIALOG_BACKGROUND_COLOR + + function setFolder(folder) { + folderAnimation.folderToChange = folder; + folderAnimation.start(); + } + + Rectangle { + id: pathController + width: parent.width + height: currentFolderButton.height+2*Const.DEFAULT_MARGIN + anchors.top: parent.top + z: 1 + color: Const.LIGHT_AUBERGINE_COLOR + + ButtonResizable { + id: currentFolderButton + anchors.margins: Const.DEFAULT_MARGIN + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + text: fixPath(folderModel.folder) + width: pathController.width-folderUpButton.width-cancelButton.width-4*Const.DEFAULT_MARGIN + height: folderUpButton.height + onClicked: root.folderSelected(folderModel.folder) + disabled: !root.folderOnly + } + Button { + id: folderUpButton + anchors.margins: Const.DEFAULT_MARGIN + anchors.right: cancelButton.left + anchors.verticalCenter: parent.verticalCenter + label: "up" + iconSource: "images/up.png" + onButtonClicked: fileSelector.setFolder(folderModel.parentFolder); + + } + Button { + id: cancelButton + anchors.margins: Const.DEFAULT_MARGIN + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + label: "cancel" + iconSource: "images/close.png" + onButtonClicked: { + root.close(); + mask.state = "idle"; + } + } + + } + + Shadow { + y: pathController.height + z: 1 + } + + Rectangle { + id: folderModelContainer + width: parent.width + anchors.top: pathController.bottom; + anchors.bottom: parent.bottom + color: Const.TRANSPARENT + + FolderListModel { + id: folderModel + //folder: "/" + nameFilters: root.folderOnly ? [""] : ["*"] + } + + Component { + id: folderModelDelegate + + FileSmall { + id: file + width: root.width + visible: root.folderOnly? folderModel.isFolder(index) : true + text: fileName + isDirectory: folderModel.isFolder(index) + onClicked: { + if(isDirectory) + fileSelector.setFolder(filePath); + else + root.fileSelected(folderModel.folder,text) + } + + Component.onCompleted: { + var ind = text.lastIndexOf("."); + var ext = ""; + if(ind>=0) ext = text.substr(ind+1); + if(ext=="jpg" || ext=="JPG" || ext=="Jpg" || + ext=="jpeg" || ext=="JPEG" || ext=="Jpeg" || + ext=="gif" || ext=="GIF" || ext=="Gif" || + ext=="svg" || ext=="SVG" || ext=="Svg" || + ext=="png" || ext=="PNG" || ext=="Png") { + isPhoto = true; + } + if(ext=="mp3" || ext=="MP3" || ext=="Mp3" || + ext=="wma" || ext=="WMA" || ext=="Wma" || + ext=="wav" || ext=="WAV" || ext=="Wav" || + ext=="ogg" || ext=="OGG" || ext=="Ogg" || + ext=="acc" || ext=="ACC" || ext=="Acc" || + ext=="flac" || ext=="FLAC" || ext=="Flac") { + isMusic = true; + } + if(ext=="avi" || ext=="AVI" || ext=="Avi" || + ext=="mp4" || ext=="MP4" || ext=="Mp4" || + ext=="mpg" || ext=="MPG" || ext=="Mpg" || + ext=="mkv" || ext=="MKV" || ext=="Mkv" || + ext=="flv" || ext=="FLV" || ext=="Flv" || + ext=="3gp" || ext=="3GP") { + isVideo = true; + } + } + } + } + + ListView { + id: folderModelView + + anchors { + fill: parent; + } + + model: folderModel + delegate: folderModelDelegate + + SequentialAnimation { + id: folderAnimation + + property string folderToChange + + PropertyAnimation { target: folderModelView; property: "opacity"; to: 0; duration: 100 } + PropertyAction { target: folderModel; property: "folder"; value: folderAnimation.folderToChange } + PropertyAnimation { target: folderModelView; property: "opacity"; to: 1.0; duration: 100 } + } + } + + } + } +} + diff --git a/qml/ubi/FilesPage.qml b/qml/ubi/FilesPage.qml index 72f1f42..ebbf02e 100644 --- a/qml/ubi/FilesPage.qml +++ b/qml/ubi/FilesPage.qml @@ -16,44 +16,11 @@ Page { property string path property string name - menu: [ - [qsTr("Upload file"),false], - [qsTr("Rename"),false], - [qsTr("Delete"),false], - [qsTr("New folder"),false], - [qsTr("Refresh"),false] - ] - - function menuFun(id) { - if(id==qsTr("Upload file")) { - mask.state = "dialog"; - fileSelector.open(); - } - if(id==qsTr("Refresh")) { - init(root.properties); - } - if(id==qsTr("Rename")) { - if(root.path=="/") { - tip.show(qsTr("Root folder can't be renamed!")); - } else { - dialogRename.open(); - } - } - if(id==qsTr("Delete")) { - if(root.path=="/") { - tip.show(qsTr("Root folder can't be deleted!")); - } else { - dialogDelete.open(); - } - } - if(id==qsTr("New folder")) { - dialogNew.open(); - } - } + property alias taskMenu: taskMenu function init(prop) { - if(mask.state!="defocused") { + if(mask.state!="defocused" && mask.state!="dialog") { mask.state = "busy"; } if(root.properties && !prop) { @@ -90,13 +57,14 @@ Page { //console.log("onErr"); mask.state = "idle"; if(status==401) { - tip.show(qsTr("Authorization failed!")); + tip.show(qsTr("Ubuntu One authorization has failed. Try once again or check login settings.")); } else if(status==0) { - tip.show(qsTr("Unable to connect!")); + tip.show(qsTr("Unable to connect. Check internet connection.")); } else { - tip.show(qsTr("Error: ")+status); + tip.show(qsTr("Unknown error: ")+status); } pageStack.pop(); + initPage.hide() } @@ -113,9 +81,9 @@ Page { //console.log("onErrRenamed"); mask.state = "idle"; if(status==401) { - tip.show(qsTr("Authorization failed!")); + tip.show(qsTr("Ubuntu One authorization has failed. Try once again or check login settings.")); } else { - tip.show(qsTr("Error: ")+status); + tip.show(qsTr("Unknown error: ")+status); } } @@ -156,7 +124,7 @@ Page { } object.isDirectory = nodes[i].kind == "directory"; object.properties = nodes[i]; - object.width = root.width; + //object.width = root.width; //object.height = 50; if(object.isDirectory) { /*if(!nodes[i].has_children) { @@ -175,26 +143,54 @@ Page { pageStack.currentPage.init(prop); }); + // extension ind = object.name.lastIndexOf("."); var ext = ""; if(ind>=0) ext = object.name.substr(ind+1); if(ext=="jpg" || ext=="JPG" || ext=="Jpg" || ext=="jpeg" || ext=="JPEG" || ext=="Jpeg" || ext=="gif" || ext=="GIF" || ext=="Gif" || + ext=="svg" || ext=="SVG" || ext=="Svg" || ext=="png" || ext=="PNG" || ext=="Png") { object.isPhoto = true; } + if(ext=="mp3" || ext=="MP3" || ext=="Mp3" || + ext=="wma" || ext=="WMA" || ext=="Wma" || + ext=="wav" || ext=="WAV" || ext=="Wav" || + ext=="ogg" || ext=="OGG" || ext=="Ogg" || + ext=="acc" || ext=="ACC" || ext=="Acc" || + ext=="m4a" || ext=="M4A" || ext=="M4a" || + ext=="flac" || ext=="FLAC" || ext=="Flac") { + object.isMusic = true; + } + if(ext=="avi" || ext=="AVI" || ext=="Avi" || + ext=="mp4" || ext=="MP4" || ext=="Mp4" || + ext=="mpg" || ext=="MPG" || ext=="Mpg" || + ext=="mkv" || ext=="MKV" || ext=="Mkv" || + ext=="flv" || ext=="FLV" || ext=="Flv" || + ext=="m4v" || ext=="M4V" || ext=="M4v" || + ext=="3gp" || ext=="3GP") { + object.isVideo = true; + } } } - if(mask.state!="defocused") { + if(mask.state!="defocused" && mask.state!="dialog") { mask.state = "idle"; } - if(files.children.length==0) { + /*if(files.children.length==0) { + empty.visible = true; + } else { + empty.visible = false; + }*/ + + if(l==0) { empty.visible = true; } else { empty.visible = false; } + + initPage.hide() } Connections { @@ -206,15 +202,12 @@ Page { id: flickable width: parent.width height: parent.height - contentHeight: files.height+Const.SYSTEM_BAR_HEIGHT+2*Const.TEXT_MARGIN - //y: Const.SYSTEM_BAR_HEIGHT+Const.TEXT_MARGIN - y: Const.SYSTEM_BAR_HEIGHT+Const.DEFAULT_MARGIN + contentHeight: files.height+Const.TOP_BAR_HEIGHT+Const.SYSTEM_BAR_HEIGHT+Const.TEXT_MARGIN + y: Const.TOP_BAR_HEIGHT contentWidth: parent.width Column { id: files - //spacing: Const.DEFAULT_MARGIN - //x: Const.TEXT_MARGIN add: Transition { NumberAnimation { properties: "opacity"; easing.type: Easing.InOutQuad } } @@ -231,7 +224,7 @@ Page { visible: false } - FileSelector { + /*FileSelector { id: fileSelector z: 200 folder: Utils.lastFolder()=="" ? Const.DEFAULT_FOLDER : Utils.lastFolder() @@ -246,6 +239,21 @@ Page { U1.uploadFile(secrets,root,path,file,folder,Utils); } + }*/ + + FileDialog { + id: fileSelector + z: 200 + hidden: true + folder: Utils.lastFolder()=="" ? Const.DEFAULT_FOLDER : Utils.lastFolder() + folderOnly: false + onFileSelected: { + mask.state = "idle"; + fileSelector.close(); + Utils.setLastFolder(folder); + var path = content_path+"/"+file; + U1.uploadFile(secrets,root,path,file,folder,Utils); + } } function getParentPath(path) { @@ -298,13 +306,11 @@ Page { text: qsTr("Delete folder?") onOpened: mask.state = "dialog" onClosed: { - mask.state = "idle"; if(ok) { mask.state = "busy"; U1.deleteFile(secrets,properties.resource_path,root,Utils); } } - onCanceled: mask.state = "idle" } DialogInput { @@ -316,7 +322,6 @@ Page { onOpened: { reset(); Utils.setOrientation("auto"); - mask.state = "dialog"; } onClosed: { mask.state = "idle"; @@ -334,7 +339,6 @@ Page { } onCanceled: { Utils.setOrientation(root.orientation); - mask.state = "idle"; } } @@ -347,10 +351,8 @@ Page { onOpened: { reset(); Utils.setOrientation("auto"); - mask.state = "dialog"; } onClosed: { - mask.state = "idle"; Utils.setOrientation(root.orientation); var r = trim(resp); if(r!="") { @@ -369,7 +371,106 @@ Page { } onCanceled: { Utils.setOrientation(root.orientation); - mask.state = "idle"; + } + } + + /*[qsTr("Upload file"),false], + [qsTr("Rename"),false], + [qsTr("Delete"),false], + [qsTr("New folder"),false], + [qsTr("Refresh"),false] + function menuFun(id) { + if(id==qsTr("Upload file")) { + mask.state = "dialog"; + fileSelector.open(); + } + if(id==qsTr("Refresh")) { + init(root.properties); + } + if(id==qsTr("Rename")) { + if(root.path=="/") { + tip.show(qsTr("Root folder can't be renamed!")); + } else { + dialogRename.open(); + } + } + if(id==qsTr("Delete")) { + if(root.path=="/") { + tip.show(qsTr("Root folder can't be deleted!")); + } else { + dialogDelete.open(); + } + } + if(id==qsTr("New folder")) { + dialogNew.open(); + } + } +*/ + + TaskMenu { + z: 200 + id: taskMenu + + contexMenu: true + menuDynamic: _menuDyn + menuHeight: menuDynamic.height+menuFixed.height+7*Const.DEFAULT_MARGIN + + Flow { + id: _menuDyn + + y: root.height-taskMenu.menuHeight-Const.SYSTEM_BAR_HEIGHT+2*Const.DEFAULT_MARGIN + x: Const.DEFAULT_MARGIN + + width: parent.width-2*Const.DEFAULT_MARGIN + spacing: Const.DEFAULT_MARGIN + + Button { + label: qsTr("Upload file"); + onButtonClicked: { + taskMenu.close(); + fileSelector.open(); + } + } + + Button { + label: qsTr("Rename"); + onButtonClicked: { + taskMenu.close(); + if(root.path=="/") { + tip.show(qsTr("Root folder cannot be renamed.")); + } else { + dialogRename.open(); + } + } + } + + Button { + label: qsTr("Delete"); + onButtonClicked: { + taskMenu.close(); + if(root.path=="/") { + tip.show(qsTr("Root folder cannot be deleted.")); + } else { + dialogDelete.open(); + } + } + } + + Button { + label: qsTr("New folder"); + onButtonClicked: { + taskMenu.close(); + dialogNew.open(); + } + } + + Button { + label: qsTr("Refresh"); + onButtonClicked: { + taskMenu.close(); + init(root.properties); + } + } } } } diff --git a/qml/ubi/InitPage.qml b/qml/ubi/InitPage.qml index 755df06..9803d27 100644 --- a/qml/ubi/InitPage.qml +++ b/qml/ubi/InitPage.qml @@ -3,22 +3,17 @@ import "UIConstants.js" as Const import "u1.js" as U1 import "components" -Rectangle { +Showable { id: root - color: Const.DEFAULT_BACKGROUND_COLOR - state: "opened" - - function hide() { - root.state = "closed"; - } + hidden: false Component.onCompleted: init() function init() { if(Utils.isAuthorized()) { //title = "Hi, "+Utils.name(); - login(); + //login(); } else { pageStack.initialPage = "LoginPage.qml"; hide(); @@ -26,13 +21,15 @@ Rectangle { } function login() { - var secrets = { + /*var secrets = { token: Utils.token(), secret: Utils.tokenSecret(), consumer_key : Utils.customerKey(), consumer_secret: Utils.customerSecret() }; U1.getRootNode(secrets,root); + */ + pageStack.currentPage.init(); } function onRespRootNode(resp) { @@ -42,84 +39,72 @@ Rectangle { function onErr(status) { hide() if(status==401) { - tip.show(qsTr("Authorization failed!")); + tip.show(qsTr("Ubuntu One authorization has failed. Try once again or check login settings.")); } else if(status==0) { - tip.show(qsTr("Unable to connect!")); + tip.show(qsTr("Unable to connect. Check internet connection.")); } else { - tip.show(qsTr("Error: ")+status); + tip.show(qsTr("Unknown error: ")+status); } } - Image { - id: pic - source: "images/ubi100.png" - width: 104; height: 70 - anchors.horizontalCenter: parent.horizontalCenter - y: (root.height-height)/3 - } - - Text { - id: loading - anchors.top: pic.bottom - anchors.margins: Const.TEXT_MARGIN - anchors.horizontalCenter: parent.horizontalCenter - font.pixelSize: 25 - color: "white" - text: "Loading..." + MouseArea { + anchors.fill: parent } - Image { - id: icon - width: 64 - height: 64 - anchors.top: loading.bottom - anchors.margins: 2*Const.TEXT_MARGIN - source: "images/progress.png" - sourceSize.width: width - sourceSize.height: height - anchors.horizontalCenter: parent.horizontalCenter - Component.onCompleted: animationIcon.start() - - NumberAnimation { - id: animationIcon - target: icon - properties: "rotation" - from: 0 - to: 360 - duration: 500 - loops: Animation.Infinite + Rectangle { + id: box + + width: root.width; height: root.height + color: Const.DEFAULT_BACKGROUND_COLOR + + Column { + spacing: Const.TEXT_MARGIN + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + + Image { + id: pic + source: "images/ubi100.png" + width: 104; height: 70 + anchors.horizontalCenter: parent.horizontalCenter + //y: (box.height-height)/3 + } + + Text { + id: loading + //anchors.top: pic.bottom + //anchors.margins: Const.TEXT_MARGIN + anchors.horizontalCenter: parent.horizontalCenter + font.pixelSize: 25 + color: "white" + text: qsTr("Connecting...") + } + + BusyIndicator { + //anchors.top: loading.bottom + //anchors.margins: 2*Const.TEXT_MARGIN + anchors.horizontalCenter: parent.horizontalCenter + running: true + } } - } - Text { - anchors.bottom: root.bottom - anchors.bottomMargin: Const.TEXT_MARGIN - anchors.horizontalCenter: parent.horizontalCenter - font.pixelSize: 18 - color: "white" - text: "ver. 0.9.2-2" - } - - MouseArea { - anchors.fill: parent - } + Text { + anchors.bottom: ver.top + anchors.horizontalCenter: parent.horizontalCenter + font.pixelSize: 20 + color: "white" + text: "v0.9.3-1 © 2012 Michal Kosciesza" + } - states: [ - State { - name: "opened" - //PropertyChanges { target: root; opacity: 1 } - PropertyChanges { target: root; y: 0} - }, - State { - name: "closed" - //PropertyChanges { target: root; opacity: 0 } - PropertyChanges { target: root; y: root.height } + Text { + id: ver + anchors.bottom: box.bottom + anchors.bottomMargin: 2*Const.TEXT_MARGIN + anchors.horizontalCenter: parent.horizontalCenter + font.pixelSize: 20 + color: "white" + text: "http://ubi.garage.maemo.org" } - ] - transitions: Transition { - //NumberAnimation { properties: "opacity"; easing.type: Easing.InOutQuad } - NumberAnimation { properties: "y"; easing.type: Easing.InOutQuad } } - } diff --git a/qml/ubi/LoginPage.qml b/qml/ubi/LoginPage.qml index deee992..0b8b3d6 100644 --- a/qml/ubi/LoginPage.qml +++ b/qml/ubi/LoginPage.qml @@ -8,6 +8,8 @@ Page { title: qsTr("Login") orientation: "auto" + //property alias taskMenu: taskMenu + function getToken() { mask.state = "busy"; U1.getToken(user.text,pass.text,root) @@ -22,26 +24,29 @@ Page { Utils.setName(account.username); tip.show(qsTr("Logged in!")); - pageStack.initialPage = "StartPage.qml"; + //pageStack.initialPage = "StartPage.qml"; + pageStack.initialPage = "FilesPage.qml"; + pageStack.currentPage.init(); } function onErr(status) { mask.state = "idle"; //console.log("onErr"); if(status==401) { - tip.show(qsTr("Authorization failed!")); + tip.show(qsTr("Ubuntu One authorization has failed. Try once again or check login settings.")); } else if(status==0) { - tip.show(qsTr("Unable to connect!")); + tip.show(qsTr("Unable to connect. Check internet connection.")); } else { - tip.show(qsTr("Error: ")+status); + tip.show(qsTr("Unknown error: ")+status); } } Flickable { width: root.width height: root.height - contentHeight: content.height+Const.SYSTEM_BAR_HEIGHT+Const.TEXT_MARGIN - y: Const.SYSTEM_BAR_HEIGHT+2*Const.TEXT_MARGIN + + contentHeight: content.height+Const.TOP_BAR_HEIGHT+Const.SYSTEM_BAR_HEIGHT+Const.TEXT_MARGIN + y: Const.TOP_BAR_HEIGHT Column { id: content @@ -77,4 +82,16 @@ Page { } } } + + /*TaskMenu { + z: 200 + id: taskMenu + menuHeight: menuFixed.height+4*Const.DEFAULT_MARGIN + + menuDynamic: _menuDyn + Flow { + y: root.height-taskMenu.menuHeight-Const.SYSTEM_BAR_HEIGHT+1*Const.DEFAULT_MARGIN + id: _menuDyn + } + }*/ } diff --git a/qml/ubi/Page.qml b/qml/ubi/Page.qml new file mode 100644 index 0000000..b0d3a81 --- /dev/null +++ b/qml/ubi/Page.qml @@ -0,0 +1,76 @@ +import QtQuick 1.0 // to target S60 5th Edition or Maemo 5 +import "UIConstants.js" as Const +import "components" + +Item { + id: root + property string title: "" + property string orientation: Const.DEFAULT_ORIENTATION + property variant menu + property alias mask: _mask + + anchors.fill: parent + + Rectangle { + anchors.right: parent.right + anchors.left: parent.left + height: parent.height + y: Const.SYSTEM_BAR_HEIGHT + color: Const.DEFAULT_BACKGROUND_COLOR + } + + Mask { + id: _mask + z: 100 + anchors.fill: parent + onClicked: taskBar.close() + } + + Component.onCompleted: { + Utils.setOrientation(orientation); + //reloadMenu(); + } + + /*function reloadMenu() { + var buttons = root.menu; + + var menu = taskBar.getMenu(); + var comp = Qt.createComponent("components/Button.qml"); + + var i,l; + if(menu.children.length>0) { + l = menu.children.length; + for(i=0;i0) { + l = buttons.length; + for(i=0;i 0 ? "images/back.png" : "images/close.png" + anchors { verticalCenter: parent.verticalCenter; left: parent.left; margins: Const.DEFAULT_MARGIN } + onButtonClicked: pageStack.index > 0 ? pageStack.pop() : Qt.quit() } - ToolIcon { - id: backButton + /*Button { + id: switchButton + label: "s" + anchors { verticalCenter: parent.verticalCenter; left: minimizeButton.right; margins: Const.DEFAULT_MARGIN } + onButtonClicked: { + tip.show("ala ma kota, a kot ma Ale bardzo czesto i bardzo dobrze, oooo, tralalal!"); + } + }*/ - width: 80 - anchors { verticalCenter: parent.verticalCenter; right: parent.right } - iconSource: pageStack.index > 0 ? "images/back.png" : "images/close.png" - onClicked: pageStack.index > 0 ? pageStack.pop() : Qt.quit() - onPressAndHold: if (pageStack.index > 0) pageStack.clear() + Button { + id: downloadButton + iconSource: "images/upload.png" + anchors { verticalCenter: parent.verticalCenter; right: menuButton.left; margins: Const.DEFAULT_MARGIN } + onButtonClicked: downloadDialog.open() + opacity: downloadDialog.isActiveDownloads ? 1 : 0 + + transitions: Transition { + NumberAnimation { properties: "opacity"; duration: 600; easing.type: Easing.InOutQuad } + } + } + + Button { + id: menuButton + iconSource: "images/options.png" + anchors { verticalCenter: parent.verticalCenter; right: parent.right; margins: Const.DEFAULT_MARGIN } + onButtonClicked: pageStack.currentPage.taskMenu.open() + visible: pageStack.currentPage.taskMenu!=undefined } MouseArea { @@ -116,6 +171,32 @@ Item { z: -1 } + Rectangle { + id: mask + anchors.fill: parent + color: "black" + + MouseArea { + anchors.fill: parent + onClicked: root.clickedOnMask() + } + } + + states: [ + State { + name: "active" + PropertyChanges { target: mask; opacity: 0 } + }, + State { + name: "inactive" + PropertyChanges { target: mask; opacity: 0.6 } + } + ] + + transitions: Transition { + NumberAnimation { properties: "opacity"; easing.type: Easing.InOutQuad } + } + } diff --git a/qml/ubi/TaskMenu.qml b/qml/ubi/TaskMenu.qml new file mode 100644 index 0000000..1808156 --- /dev/null +++ b/qml/ubi/TaskMenu.qml @@ -0,0 +1,71 @@ +import QtQuick 1.0 // to target S60 5th Edition or Maemo 5 +import "components" +import "UIConstants.js" as Const + +DialogBlank { + id: root + + property alias menuHeight: root.boxHeight + + property alias menuFixed: _menuFixed + property Flow menuDynamic + + property bool contexMenu: false + + onOpened: { + mask.state = "dialog"; + } + onCanceled: { + mask.state = "idle"; + } + + Line { + id: line + anchors.top: root.menuDynamic.bottom + anchors.topMargin: Const.DEFAULT_MARGIN + width: root.width + visible: root.contexMenu + } + + Flow { + id: _menuFixed + + //y: root.height-root.menuHeight+1*Const.DEFAULT_MARGIN + + anchors.top: root.contexMenu ? line.bottom : root.menuDynamic.bottom + anchors.topMargin: Const.DEFAULT_MARGIN + + x: Const.DEFAULT_MARGIN + + width: root.width-2*Const.DEFAULT_MARGIN + spacing: Const.DEFAULT_MARGIN + + Button { + label: qsTr("Account"); + onButtonClicked: { + taskMenu.close(); + if(pageStack.currentPage.title!=qsTr("Account")) { + pageStack.push("AccountPage.qml"); + } + } + } + + Button { + label: qsTr("Settings"); + onButtonClicked: { + taskMenu.close(); + if(pageStack.currentPage.title!=qsTr("Settings")) { + pageStack.push("SettingsPage.qml"); + } + } + } + + Button { + label: qsTr("About Ubi"); + onButtonClicked: { + taskMenu.close(); + aboutDialog.open(); + } + } + } +} diff --git a/qml/ubi/TopBar.qml b/qml/ubi/TopBar.qml new file mode 100644 index 0000000..24e4b7e --- /dev/null +++ b/qml/ubi/TopBar.qml @@ -0,0 +1,100 @@ +import QtQuick 1.0 // to target S60 5th Edition or Maemo 5 +import "components" +import "UIConstants.js" as Const + +Item { + id: root + + height: Const.TOP_BAR_HEIGHT + anchors { left: parent.left; right: parent.right; top: top.bottom } + + function hide() { + visible = false; + } + + function show() { + visible = true; + } + + Rectangle { + id: box + width: 50 + height: width + radius: 5 + color: mouseArea.pressed ? "white" : "black" + opacity: 0.2 + x: -width/2 + y: -width/2 + + MouseArea { + id: mouseArea + anchors.fill: parent + onClicked: Utils.minimizeWindow() + } + } + + Rectangle { + width: box.width/2-16 + height: 2 + color: "white" + x: 8 + y: (box.width/4)-1 + } + + /*Rectangle { + width: parent.width + height: root.height + color: Const.TRANSPARENT + //color: "black" + } + + Item { + id: minimizeButton + width: 80; + height: 60 + anchors { verticalCenter: parent.verticalCenter; left: parent.left; margins: 5 } + + Rectangle { + id: background + anchors { fill: parent; margins: 6 } + color: "black" + opacity: 0.2 + radius: 10 + } + + Rectangle { + anchors { fill: parent; margins: 6 } + color: "white" + opacity: 0.5 + radius: 10 + visible: mouseArea.pressed + } + + Image { + id: icon + anchors.centerIn: parent + source: "images/minimize.png" + sourceSize.width: width + sourceSize.height: height + } + + MouseArea { + id: mouseArea + anchors.fill: parent + onClicked: Utils.minimizeWindow() + } + }*/ + + /*ToolIcon { + id: backButton + width: 80 + anchors { verticalCenter: parent.verticalCenter; right: parent.right; margins: 5 } + iconSource: "images/close.png" + onClicked: Qt.quit() + }*/ + +} + + + + diff --git a/qml/ubi/UIConstants.js b/qml/ubi/UIConstants.js index 1e99bf7..072ea3b 100644 --- a/qml/ubi/UIConstants.js +++ b/qml/ubi/UIConstants.js @@ -36,7 +36,8 @@ var DEFAULT_TEXT_COLOR = DEFAULT_FOREGROUND_COLOR; var DEFAULT_FOLDER = "file:///home/user/MyDocs"; -var SYSTEM_BAR_HEIGHT = 60; +var SYSTEM_BAR_HEIGHT = 70; +var TOP_BAR_HEIGHT = 10; var TEXT_MARGIN = 25; // images diff --git a/qml/ubi/components/Bar.qml b/qml/ubi/components/Bar.qml index 0b07274..ff0df97 100644 --- a/qml/ubi/components/Bar.qml +++ b/qml/ubi/components/Bar.qml @@ -7,64 +7,82 @@ Item { property string label property bool isDownload: false property bool isUpload: false - height: 32 - - Image { - id: icon - width: root.height - height: root.height - source: isDownload? "../"+Const.ICON_DOWN : (isUpload? "../"+Const.ICON_UP : "") - sourceSize.width: width - sourceSize.height: height - visible: isDownload || isUpload - } + height: button.height + //width: parent.width - Rectangle { - id: bbar + width: mainWindow.width-3*Const.DEFAULT_MARGIN - color: Const.TRANSPARENT - border.width: 2 - radius: 5 - border.color: Const.DEFAULT_FOREGROUND_COLOR - height: root.height - width: icon.visible? root.width-icon.width-5 : root.width - x: icon.visible? icon.width+5 : 0 + signal cancel(string file); - Rectangle { - id: bar - height: parent.height - width: 0 - x:0 - radius: 5 - color: Const.DEFAULT_FOREGROUND_COLOR - state: "right" - - states: [ - State { - name: "right" - }, - State { - name: "left" - }, - State { - name: "progress" - } - ] + Row { + spacing: Const.DEFAULT_MARGIN + anchors.verticalCenter: parent.verticalCenter + + Image { + id: icon + source: isDownload? "../images/download.png" : + isUpload? "../images/upload.png" : "" + visible: isDownload || isUpload + anchors.verticalCenter: parent.verticalCenter } - Text { - id: caption - font.pixelSize: 25 - anchors.centerIn: parent - //color: Const.DEFAULT_FOREGROUND_COLOR - text: root.label.length>28 ? root.label.substring(0,25)+"..." : root.label - color: "black" + Rectangle { + id: bbar + anchors.verticalCenter: parent.verticalCenter + color: Const.TRANSPARENT + border.width: 2 + //radius: 5 + border.color: Const.DEFAULT_FOREGROUND_COLOR + height: 40 + width: icon.visible? + root.width-icon.width-button.width-2*Const.DEFAULT_MARGIN : + root.width-button.width-1*Const.DEFAULT_MARGIN + //x: icon.visible? icon.width+5 : 0 + + Rectangle { + id: bar + height: parent.height + width: 0 + x:0 + color: Const.DEFAULT_FOREGROUND_COLOR + state: "right" + + states: [ + State { + name: "right" + }, + State { + name: "left" + }, + State { + name: "progress" + } + ] + } + + Text { + id: caption + font.pixelSize: 25 + anchors.centerIn: parent + //color: Const.DEFAULT_FOREGROUND_COLOR + text: root.label + width: bbar.width + elide: Text.ElideRight + horizontalAlignment: Text.AlignHCenter + color: "black" + } } + Button { + id: button + anchors.verticalCenter: parent.verticalCenter + iconSource: "images/close.png" + onButtonClicked: root.cancel(root.label) + } } function setProgres(progress) { - console.log("proggress = "+progress); + //console.log("proggress = "+progress); if(bar.state!="progress") { time.stop(); bar.state = "progress" diff --git a/qml/ubi/components/BusyIndicator.qml b/qml/ubi/components/BusyIndicator.qml new file mode 100644 index 0000000..27a2a7d --- /dev/null +++ b/qml/ubi/components/BusyIndicator.qml @@ -0,0 +1,37 @@ +import QtQuick 1.0 // to target S60 5th Edition or Maemo 5 +//import "../UIConstants.js" as Const + +Image { + id: icon + + property bool running: false + + width: 64 + height: 64 + + source: "../images/progress.png" + sourceSize.width: width + sourceSize.height: height + + Component.onCompleted: { + if(running) animation.start(); + } + + onRunningChanged: { + if(running) { + animation.start(); + } else { + animation.stop(); + } + } + + NumberAnimation { + id: animation + target: icon + properties: "rotation" + from: 0 + to: 360 + duration: 500 + loops: Animation.Infinite + } +} diff --git a/qml/ubi/components/Button.qml b/qml/ubi/components/Button.qml index fd947ef..3eb5ad8 100644 --- a/qml/ubi/components/Button.qml +++ b/qml/ubi/components/Button.qml @@ -27,8 +27,9 @@ Item { Rectangle { id: box color: root.disabled ? Const.COOL_GREY_COLOR : "black" - height: textbox.height+20 - width: textbox.width<100 ? 120 : textbox.width+20 + height: root.iconSource=="" ? textbox.height+20 : icon.height+20 + //width: textbox.width<100 ? 120 : textbox.width+20 + width: root.iconSource=="" ? textbox.width+30 : icon.width+30 radius: 10 } @@ -46,8 +47,8 @@ Item { Image { id: icon - width: 40 - height: 40 + //width: 30 + //height: 30 anchors.centerIn: box source: root.iconSource == "" ? "" : "../" + root.iconSource sourceSize.width: width @@ -67,8 +68,6 @@ Item { Text { id: textbox - //x: 10 - //y: 10 font.pixelSize: root.fontSize color: root.disabled ? "gray" : "white" anchors.centerIn: box diff --git a/qml/ubi/components/ButtonGlass.qml b/qml/ubi/components/ButtonGlass.qml new file mode 100644 index 0000000..acce2c6 --- /dev/null +++ b/qml/ubi/components/ButtonGlass.qml @@ -0,0 +1,113 @@ +import QtQuick 1.0 // to target S60 5th Edition or Maemo 5 +import "../UIConstants.js" as Const + +Item { + id: root + property string label + property bool disabled: false + property int fontSize: 30 + property int maxSize: 27 + property string iconSource + + state: mouseArea.pressed && !root.disabled ? "pressed" : "unpressed" + + width: box.width + height: box.height + + signal buttonClicked(string label) + + Rectangle { + id: shadow + width: box.width + height: box.height + color: Const.SHADOW_COLOR; + radius: 10 + visible: false + } + + Rectangle { + id: box + color: root.disabled ? Const.COOL_GREY_COLOR : "black" + height: root.iconSource=="" ? textbox.height+20 : icon.height+20 + //width: textbox.width<100 ? 120 : textbox.width+20 + width: root.iconSource=="" ? textbox.width+30 : icon.width+30 + radius: 10 + visible: false + } + + Image { + source: root.state != "pressed" ? + "../images/pushbutton_normal.png" : + "../images/pushbutton_disabled.png" + } + + Rectangle { + width: box.width + height: box.height + x: box.x + y: box.y + color: Const.WARM_GREY_COLOR + radius: 10 + //visible: root.state == "pressed" + visible: false + //border.color: "black" + //border.width: Const.SHADOW_OFFSET + } + + Image { + id: icon + //width: 30 + //height: 30 + anchors.centerIn: box + source: root.iconSource == "" ? "" : "../" + root.iconSource + sourceSize.width: width + sourceSize.height: height + } + + onLabelChanged: { + if(root.label.length>root.maxSize) { + //console.log("root.label: "+root.label) + //console.log("root.label.length: "+root.label.length) + //console.log("root.maxSize: "+root.maxSize) + textbox.text = root.label.substring(0,root.maxSize-3)+"..."; + } else { + textbox.text = root.label; + } + } + + Text { + id: textbox + font.pixelSize: root.fontSize + color: root.disabled ? "gray" : "white" + anchors.centerIn: box + visible: root.iconSource == "" + } + + MouseArea { + id: mouseArea + width: box.width + height: box.height + onClicked: root.buttonClicked(root.label) + enabled: !root.disabled + } + + states: [ + State { + name: "unpressed" + PropertyChanges {target: shadow; x: Const.SHADOW_OFFSET} + PropertyChanges {target: shadow; y: Const.SHADOW_OFFSET} + PropertyChanges {target: box; x: 0} + PropertyChanges {target: box; y: 0} + }, + State { + name: "pressed" + PropertyChanges {target: shadow; x: Const.SHADOW_OFFSET} + PropertyChanges {target: shadow; y: Const.SHADOW_OFFSET} + PropertyChanges {target: box; x: Const.SHADOW_OFFSET} + PropertyChanges {target: box; y: Const.SHADOW_OFFSET} + } + ] +} + + + diff --git a/qml/ubi/components/ButtonResizable.qml b/qml/ubi/components/ButtonResizable.qml new file mode 100644 index 0000000..e9c0270 --- /dev/null +++ b/qml/ubi/components/ButtonResizable.qml @@ -0,0 +1,91 @@ +import QtQuick 1.0 // to target S60 5th Edition or Maemo 5 +import "../UIConstants.js" as Const + +Item { + id: root + property alias text: textbox.text + property bool disabled: false + property int fontSize: 30 + property string iconSource + + state: mouseArea.pressed && !root.disabled ? "pressed" : "unpressed" + + signal clicked(string label) + + Rectangle { + id: shadow + width: box.width + height: box.height + color: Const.SHADOW_COLOR; + radius: 10 + } + + Rectangle { + id: box + color: root.disabled ? Const.COOL_GREY_COLOR : "black" + height: root.height + width: root.width + radius: 10 + } + + Rectangle { + width: box.width + height: box.height + x: box.x + y: box.y + color: Const.WARM_GREY_COLOR + radius: 10 + visible: root.state == "pressed" + //border.color: "black" + //border.width: Const.SHADOW_OFFSET + } + + Image { + id: icon + width: 40 + height: 40 + anchors.centerIn: box + source: root.iconSource == "" ? "" : "../" + root.iconSource + sourceSize.width: width + sourceSize.height: height + } + + Text { + id: textbox + font.pixelSize: root.fontSize + elide: Text.ElideRight + color: root.disabled ? "gray" : "white" + anchors.left: box.left; anchors.right: box.right + anchors.margins: Const.DEFAULT_MARGIN + anchors.verticalCenter: box.verticalCenter + //visible: root.iconSource == "" + } + + MouseArea { + id: mouseArea + width: box.width + height: box.height + onClicked: root.clicked(root.label) + enabled: !root.disabled + } + + states: [ + State { + name: "unpressed" + PropertyChanges {target: shadow; x: Const.SHADOW_OFFSET} + PropertyChanges {target: shadow; y: Const.SHADOW_OFFSET} + PropertyChanges {target: box; x: 0} + PropertyChanges {target: box; y: 0} + }, + State { + name: "pressed" + PropertyChanges {target: shadow; x: Const.SHADOW_OFFSET} + PropertyChanges {target: shadow; y: Const.SHADOW_OFFSET} + PropertyChanges {target: box; x: Const.SHADOW_OFFSET} + PropertyChanges {target: box; y: Const.SHADOW_OFFSET} + } + ] +} + + + diff --git a/qml/ubi/components/DialogBlank.qml b/qml/ubi/components/DialogBlank.qml new file mode 100644 index 0000000..6765671 --- /dev/null +++ b/qml/ubi/components/DialogBlank.qml @@ -0,0 +1,32 @@ +import QtQuick 1.0 // to target S60 5th Edition or Maemo 5 +import "../UIConstants.js" as Const + +DialogBox { + id: root + + property alias boxHeight: _box.height + property alias box: _box + + Rectangle { + id: _box + anchors.left: root.left; anchors.right: root.right + anchors.bottom: root.bottom + color: Const.LIGHT_AUBERGINE_COLOR + + MouseArea { + anchors.fill: parent + onClicked: { + root.canceled(); + root.close(); + } + } + } + + Rectangle { + anchors.right: root.right; anchors.left: root.left + anchors.bottom: box.top + height: Const.SHADOW_OFFSET + color: "black" + opacity: 0.5 + } +} diff --git a/qml/ubi/components/DialogBox.qml b/qml/ubi/components/DialogBox.qml index 571aaf2..b72d8aa 100644 --- a/qml/ubi/components/DialogBox.qml +++ b/qml/ubi/components/DialogBox.qml @@ -1,24 +1,34 @@ import QtQuick 1.0 // to target S60 5th Edition or Maemo 5 import "../UIConstants.js" as Const -Item { +Showable { id: root + hidden: true + //easingType: Easing.InOutBounce + anchors.left: parent.left; anchors.right: parent.right - height: parent.height - state: "closed" + height: parent.height-Const.SYSTEM_BAR_HEIGHT+Const.SHADOW_OFFSET signal opened() signal canceled() function open() { root.forceActiveFocus(); - root.state = "opened"; + root.show(); root.opened(); + topbar.hide(); + systemBar.state = "inactive"; + pageStack.currentPage.mask.state = "dialog"; } function close() { - root.state = "closed"; + if(state!="closed") { + root.hide(); + topbar.show(); + systemBar.state = "active"; + pageStack.currentPage.mask.state = "idle"; + } } MouseArea { @@ -28,23 +38,5 @@ Item { root.close(); } } - - states: [ - State { - name: "opened" - PropertyChanges { target: root; opacity: 1 } - PropertyChanges { target: root; y: 0} - }, - State { - name: "closed" - PropertyChanges { target: root; opacity: 0 } - PropertyChanges { target: root; y: root.height } - } - ] - - transitions: Transition { - NumberAnimation { properties: "opacity"; easing.type: Easing.InOutQuad } - NumberAnimation { properties: "y"; easing.type: Easing.InOutQuad } - } } diff --git a/qml/ubi/components/File.qml b/qml/ubi/components/File.qml index cfeace7..55a3bd2 100644 --- a/qml/ubi/components/File.qml +++ b/qml/ubi/components/File.qml @@ -7,6 +7,8 @@ Item { property alias description: details.text property bool isDirectory: false property bool isPhoto: false + property bool isMusic: false + property bool isVideo: false property bool isPublic: false property variant properties: null property string filename: "" @@ -14,7 +16,7 @@ Item { state: mouseArea.pressed && !root.disabled ? "pressed" : "unpressed" - //width: parent.width + width: mainWindow.width height: box.height signal clicked(variant prop) @@ -68,12 +70,13 @@ Item { Image { id: icon - width: 50 - height: 50 + width: 60 + height: 60 x: Const.TEXT_MARGIN-5 source: root.isDirectory ? "../images/folder.png" : - root.isPhoto ? "../images/photo.png" : - "../images/document.png" + root.isPhoto ? "../images/photo.png" : + root.isMusic ? "../images/music.png" : + root.isVideo ? "../images/video.png" : "../images/document.png" sourceSize.width: width sourceSize.height: height anchors.verticalCenter: box.verticalCenter @@ -85,7 +88,7 @@ Item { font.pixelSize: 30 color: Const.DEFAULT_FOREGROUND_COLOR elide: Text.ElideRight - wrapMode: Text.Wrap + //wrapMode: Text.Wrap width: root.isPublic ? root.width-x-Const.TEXT_MARGIN-3*Const.DEFAULT_MARGIN-arrow.width-publicIcon.width : root.width-x-Const.TEXT_MARGIN-1*Const.DEFAULT_MARGIN-arrow.width @@ -122,7 +125,7 @@ Item { width: 30 height: 30 anchors.right: box.right - anchors.margins: Const.TEXT_MARGIN + anchors.margins: Const.DEFAULT_MARGIN source: "../images/next.png" sourceSize.width: width sourceSize.height: height diff --git a/qml/ubi/components/FileOld.qml b/qml/ubi/components/FileOld.qml deleted file mode 100644 index 8dff818..0000000 --- a/qml/ubi/components/FileOld.qml +++ /dev/null @@ -1,89 +0,0 @@ -import QtQuick 1.0 // to target S60 5th Edition or Maemo 5 -import "../UIConstants.js" as Const - - -Item { - id: root - property alias name: label.text - property bool isDirectory: false - property variant properties: null - property string filename: "" - property int textMax: 27 - - state: mouseArea.pressed && !root.disabled ? "pressed" : "unpressed" - - width: box.width - height: box.height - - signal clicked(variant prop) - - Rectangle { - id: shadow - width: box.width - height: box.height - color: Const.SHADOW_COLOR; - radius: 10 - x: Const.SHADOW_OFFSET; - y: Const.SHADOW_OFFSET; - } - - Rectangle { - id: box - color: root.isDirectory ? "black" : "white" - height: label.height+20 - width: label.width<=100 ? 120 : label.width+20 - radius: 10 - } - - Rectangle { - width: box.width - height: box.height - x: box.x - y: box.y - color: root.isDirectory ? "white" : "black" - opacity: 0.5 - radius: 10 - visible: mouseArea.pressed - } - - Text { - id: label - x: 10 - y: 10 - font.pixelSize: 30 - color: root.isDirectory ? "white" : "black" - elide: Text.ElideLeft - anchors.centerIn: box - wrapMode: Text.Wrap - onTextChanged: { - if(text.length>root.textMax) - root.name = text.substring(0,root.textMax-3)+"..."; - } - } - - MouseArea { - id: mouseArea - width: box.width - height: box.height - onClicked: { - root.clicked(root.properties); - } - } - - states: [ - State { - name: "unpressed" - PropertyChanges {target: shadow; x: Const.SHADOW_OFFSET} - PropertyChanges {target: shadow; y: Const.SHADOW_OFFSET} - PropertyChanges {target: box; x: 0} - PropertyChanges {target: box; y: 0} - }, - State { - name: "pressed" - PropertyChanges {target: shadow; x: Const.SHADOW_OFFSET} - PropertyChanges {target: shadow; y: Const.SHADOW_OFFSET} - PropertyChanges {target: box; x: Const.SHADOW_OFFSET} - PropertyChanges {target: box; y: Const.SHADOW_OFFSET} - } - ] -} diff --git a/qml/ubi/components/FileSmall.qml b/qml/ubi/components/FileSmall.qml new file mode 100644 index 0000000..d8be3f7 --- /dev/null +++ b/qml/ubi/components/FileSmall.qml @@ -0,0 +1,67 @@ +import QtQuick 1.0 // to target S60 5th Edition or Maemo 5 +import "../UIConstants.js" as Const + + +Item { + id: root + property alias text: label.text + property bool isDirectory: false + property bool isPhoto: false + property bool isMusic: false + property bool isVideo: false + + signal clicked() + + height: box.height + + Rectangle { + id: box + color: Const.TRANSPARENT + height: 70 + width: root.width + } + + Rectangle { + width: box.width + height: box.height + x: box.x; y: box.y + color: Const.DEFAULT_DIALOG_FOREGROUND_COLOR + opacity: 0.4 + visible: mouseArea.pressed + } + + Image { + id: icon + width: 40 + height: 40 + source: root.isDirectory ? "../images/folder-small.png" : + root.isPhoto ? "../images/photo-small.png" : + root.isMusic ? "../images/music-small.png" : + root.isVideo ? "../images/video-small.png" : "../images/document-small.png" + sourceSize.width: width + sourceSize.height: height + anchors.left: box.left; + anchors.verticalCenter: box.verticalCenter + anchors.margins: Const.TEXT_MARGIN + } + + Text { + id: label + x: 10; y: 10 + font.pixelSize: 30 + color: Const.DEFAULT_DIALOG_FOREGROUND_COLOR + elide: Text.ElideRight + anchors.left: icon.right; anchors.right: box.right + anchors.verticalCenter: box.verticalCenter + anchors.margins: Const.TEXT_MARGIN + } + + MouseArea { + id: mouseArea + width: box.width + height: box.height + onClicked: { + root.clicked(root.properties); + } + } +} diff --git a/qml/ubi/components/Mask.qml b/qml/ubi/components/Mask.qml index f34eab0..b9f68a7 100644 --- a/qml/ubi/components/Mask.qml +++ b/qml/ubi/components/Mask.qml @@ -10,9 +10,9 @@ Item { onStateChanged: { if(root.state=="busy") { - animationIcon.start(); + busy.running = true; } else { - animationIcon.stop(); + busy.running = false; } } @@ -29,25 +29,11 @@ Item { font.pixelSize: Const.DEFAULT_FONT_PIXEL_SIZE } - Image { - id: icon - width: 64 - height: 64 + BusyIndicator { + id: busy anchors.centerIn: parent - source: "../images/progress.png" - sourceSize.width: width - sourceSize.height: height + running: true visible: root.state=="busy" - - NumberAnimation { - id: animationIcon - target: icon - properties: "rotation" - from: 0 - to: 360 - duration: 500 - loops: Animation.Infinite - } } MouseArea { diff --git a/qml/ubi/components/Notification.qml b/qml/ubi/components/Notification.qml index b84c4cf..aec3d22 100644 --- a/qml/ubi/components/Notification.qml +++ b/qml/ubi/components/Notification.qml @@ -30,6 +30,7 @@ Item { anchors.centerIn: parent id: text color: Const.DEFAULT_BACKGROUND_COLOR + wrapMode: Text.WordWrap font.pixelSize: Const.DEFAULT_FONT_PIXEL_SIZE } @@ -42,6 +43,16 @@ Item { function show(_text) { text.text= _text; + time.interval = 3000; + state = "visible" + //sound.play(); + time.restart(); + } + + function show2(_text,interval) + { + text.text= _text; + time.interval = interval; state = "visible" //sound.play(); time.restart(); diff --git a/qml/ubi/components/NotificationNew.qml b/qml/ubi/components/NotificationNew.qml new file mode 100644 index 0000000..56baecb --- /dev/null +++ b/qml/ubi/components/NotificationNew.qml @@ -0,0 +1,104 @@ +import QtQuick 1.0 // to target S60 5th Edition or Maemo 5 +import "../UIConstants.js" as Const + +Item { + id: root + + state: "invisible" + + //width: box.width + height: box.height + + Rectangle { + width: box.width + height: box.height + color: Const.SHADOW_COLOR; + radius: 5 + x: 2*Const.SHADOW_OFFSET; + y: 2*Const.SHADOW_OFFSET; + } + + Rectangle { + id: box + height: text.height+4*Const.DEFAULT_MARGIN + width: root.width + //color: Const.DEFAULT_DIALOG_FOREGROUND_COLOR + color: Const.COOL_GREY_COLOR + radius: 5 + + border.color: Const.WARM_GREY_COLOR + border.width: 1 + + Text { + id: text + anchors.centerIn: parent + anchors.margins: Const.DEFAULT_MARGIN + color: Const.DEFAULT_FOREGROUND_COLOR + wrapMode: Text.WordWrap + font.pixelSize: Const.DEFAULT_FONT_PIXEL_SIZE + width: parent.width-2*Const.DEFAULT_MARGIN + horizontalAlignment: Text.Center + } + + MouseArea { + anchors.fill: parent + onClicked: tip.state = "invisible" + } + } + + function show(_text) + { + text.text= _text; + if(_text.length > 40) { + time.interval = _text.length*100; + } else { + time.interval = 3000; + } + state = "visible" + time.restart(); + } + + function show2(_text,interval) + { + text.text= _text; + time.interval = interval; + state = "visible" + time.restart(); + } + + function hide() + { + text.text=""; + state="invisible"; + } + + Timer { + id: time + interval: 3000 + onTriggered: { + tip.state = "invisible"; + } + } + + states: [ + State { + name: "visible" + PropertyChanges { target: root; opacity: 1 } + PropertyChanges { target: root; width: mainWindow.width-2*Const.TEXT_MARGIN } + PropertyChanges { target: text; font.pixelSize: Const.DEFAULT_FONT_PIXEL_SIZE } + }, + State { + name: "invisible" + PropertyChanges { target: root; width: 0 } + PropertyChanges { target: text; font.pixelSize: 1 } + PropertyChanges { target: root; opacity: 0 } + } + ] + + transitions: Transition { + NumberAnimation { properties: "opacity"; easing.type: Easing.InOutBack } + NumberAnimation { properties: "width"; easing.type: Easing.InOutBack} + NumberAnimation { properties: "font.pixelSize"; easing.type: Easing.InOutBack} + } + +} diff --git a/qml/ubi/components/Showable.qml b/qml/ubi/components/Showable.qml new file mode 100644 index 0000000..69c7390 --- /dev/null +++ b/qml/ubi/components/Showable.qml @@ -0,0 +1,58 @@ +import QtQuick 1.0 // to target S60 5th Edition or Maemo 5 +//import "../UIConstants.js" as Const + +Item { + id: root + + property bool hidden: false + property int easingType: Easing.InOutCubic + property int speed: 1 + + state: hidden ? "closed" : "opened" + //visible: !hidden + + Component.onCompleted: { + if(hidden) state = "closed"; + } + + function show() { + root.state = "opened"; + } + + function hide() { + root.state = "closed"; + } + + states: [ + State { + name: "opened" + PropertyChanges { target: root; y: 0} + PropertyChanges { target: root; visible: true } + }, + State { + name: "closed" + PropertyChanges { target: root; y: root.height } + //PropertyChanges { target: root; visible: false } + } + ] + + transitions: Transition { + NumberAnimation { properties: "y"; easing.type: root.easingType; + duration: root.speed*root.height/2; + } + } + + onStateChanged: { + if(state=="closed") time.start() + } + + Timer { + id: time + interval: root.speed*root.height/2 + onTriggered: { + //console.log("aaa"); + root.visible = false; + } + } + +} diff --git a/qml/ubi/components/ToolIcon.qml b/qml/ubi/components/ToolIcon.qml index bfc50b3..6632be4 100644 --- a/qml/ubi/components/ToolIcon.qml +++ b/qml/ubi/components/ToolIcon.qml @@ -1,22 +1,31 @@ -import QtQuick 1.0 +import QtQuick 1.0 // to target S60 5th Edition or Maemo 5 +import "../UIConstants.js" as Const Item { id: root property string iconSource - property bool enabled: true property bool pressed: mouseArea.pressed + property string color: Const.TRANSPARENT signal clicked signal pressAndHold width: 56 height: 56 - opacity: enabled ? 1 : 0.3 Rectangle { - anchors { fill: parent; margins: 5 } - color: "gray" + id: background + anchors { fill: parent; margins: 6 } + //color: root.color + color: "black" + opacity: 0.1 + radius: 10 + } + + Rectangle { + anchors { fill: parent; margins: 6 } + color: "white" opacity: 0.5 radius: 10 visible: mouseArea.pressed @@ -24,8 +33,8 @@ Item { Image { id: icon - width: 40 - height: 40 + width: 30 + height: 30 anchors.centerIn: parent source: iconSource == "" ? "" : "../" + iconSource sourceSize.width: width diff --git a/qml/ubi/images/back-old.png b/qml/ubi/images/back-old.png new file mode 100644 index 0000000000000000000000000000000000000000..e98f7fda20a984f67916e9677ab8b172150ea11e GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfzuQ z{U9%sArH&(kOJ8jzICi#JB3~}T+?9G+Oe4FMM7nP{De=POhy|%pE<4^{qa;nkKr;& z&&5k3`O`dAXWt1uFH?2>=9W{8?g=NXu3bNuS*tzssoUwub48s`yjIXoBb!Hcyya6_Z{1FmwCD0-w35gpQ`O|PMY>7=;WkWqvO6pg6RqDcWTO{lF!U9 aX8+@Q^~{y?Nv1%DGI+ZBxvXFF literal 0 HcmV?d00001 diff --git a/qml/ubi/images/back.png b/qml/ubi/images/back.png index e98f7fda20a984f67916e9677ab8b172150ea11e..31f7b7725251cad2004d3a984eb554f8477d1598 100644 GIT binary patch literal 503 zcmVrIfB51_a zzQ9OOh#GQ}gDM=l6`Nl|Wa)PG#cFlFCy|~Ocs&70&swy)_N|nwAOQ=nEJx5h)56wH>HD%pkWwJfp)2-Hh?;&(4F9_p_$;nfQm@k$B9q1*4M+~ zaIkH?*=+XYdETS3XE%BSo<-y{Ncl1X{mJ4K#e;A6EfQ1auN!s!24P z&3DT(noH89Ziitwts>j?di|PNYWex1cf#Ylc>r`Qq6M5}f(_t34zyF=1yU)z=*p}N zp1-*tyqbPo1h?(Sg~Og~#+sGuy0=jj-EHq%dw=iJWMqCwKeie6&VnGg1nBqs55P(+ thCL&23|GKuy!;T;2iStk(*OH~`37uh;E3=9k?sHh002ovPDHLkV1k8D-<|*f literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgfzuQ z{U9%sArH&(kOJ8jzICi#JB3~}T+?9G+Oe4FMM7nP{De=POhy|%pE<4^{qa;nkKr;& z&&5k3`O`dAXWt1uFH?2>=9W{8?g=NXu3bNuS*tzssoUwub48s`yjIXoBb!Hcyya6_Z{1FmwCD0-w35gpQ`O|PMY>7=;WkWqvO6pg6RqDcWTO{lF!U9 aX8+@Q^~{y?Nv1%DGI+ZBxvXFF diff --git a/qml/ubi/images/bg.png b/qml/ubi/images/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..fd6520960b5406460e48df823c4ea9d37853b630 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^j6m$n!3HE_Tl3$61d4;)ofy`glX(f`uqAoByDx`7I;J!Gca%qgD@k*tT_@uLG}_)Usv`!to*_nie~@4_<=&Io-U3d5|@)# z=xP5r|L5)T_iW4l|Nn1nU}#|Az{w&mogKm%CdQCp9Qiv%Pu35pfx*+&&t;ucLK6Va CYAk{P literal 0 HcmV?d00001 diff --git a/qml/ubi/images/close-old.png b/qml/ubi/images/close-old.png new file mode 100644 index 0000000000000000000000000000000000000000..3ab86ac3e859640c64d7b167d89453e85bb456a5 GIT binary patch literal 369 zcmV-%0gnEOP)@GsGL!dYS2FV3>1dcGo5C}ptiFrIo31WZR*F9Rn`;srqk~aBmN&AvSB9Tb` zJBqRx04DgDo7b~a>PFZ*!p8zT#9nc4$@(QP95#b*G6QzPVb|Eo?A>E$+`tXgV?{RL zJ~?s&D`-wDvIF-HH!z3x)Q~nD=FSZqV^1zf7aUfzA9+XQGzyM@+(p9?knwPy$gnsf zvKMa9)A+z{Eo%?-8929N-WI-KY2AP`=OB0DiB9TafM!*M@7A? P00000NkvXXu0mjfRL+lx literal 0 HcmV?d00001 diff --git a/qml/ubi/images/close.png b/qml/ubi/images/close.png index 3ab86ac3e859640c64d7b167d89453e85bb456a5..18617167b5736566b81415887e73889825a9e714 100644 GIT binary patch literal 626 zcmV-&0*(ENP)j+6KJ9`=D?vm!M0`1j z3gD=JK?pGh@B_dUKte=?OJO0zcK~MqUIF|hqIN5Rh&~2@vFCXgNs>HNRaJ#ycnx6D z&EX6Hi!cnYtE#G!Bzf>W?*hPhE2on@@_qk2%d$sWN87eP1Aeog$-^(H<704J%E`Bo;OYN+@HY3hfpG-rfHr5%uVn_O1acpD_eXYs9 z$|ZowCwN_8YKvQ-(=E&J^laP}HNrNyE4mZr;;!f*%)wpJy|69LMOp9$kK_1q*VYof zZ+#rcmmHLc*k7lU)oQiam$c3~VO3 z7nFnNd47u>N1ss;1gB+L-npPdcv+TrK@gn6blB_SMN!-+rJiijKCYB{DvIK!j}j5Y zI`Jcf5F-HJ02~9TiRd@0_x3^vF#+%ufCli3i2iKd@5BEq4)*W#7tJFA!&@GsGL!dYS2FV3>1dcGo5C}ptiFrIo31WZR*F9Rn`;srqk~aBmN&AvSB9Tb` zJBqRx04DgDo7b~a>PFZ*!p8zT#9nc4$@(QP95#b*G6QzPVb|Eo?A>E$+`tXgV?{RL zJ~?s&D`-wDvIF-HH!z3x)Q~nD=FSZqV^1zf7aUfzA9+XQGzyM@+(p9?knwPy$gnsf zvKMa9)A+z{Eo%?-8929N-WI-KY2AP`=OB0DiB9TafM!*M@7A? P00000NkvXXu0mjfRL+lx diff --git a/qml/ubi/images/document-small.png b/qml/ubi/images/document-small.png new file mode 100644 index 0000000000000000000000000000000000000000..f715053035b02b2b82be7a62bca25e805fe6df65 GIT binary patch literal 389 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3EX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4&qL}{{_lx(&`egEM95( zYF%IAk)HE&pZ9=Zb=J8b|5NAqFz$3S{*m@zmCot@jf(8&wf1G_eP!Cg{?08e{J``j f@8b{FuaxIfHhXsc8;3A3$QV3b{an^LB{Ts5eGjF? literal 0 HcmV?d00001 diff --git a/qml/ubi/images/document.png b/qml/ubi/images/document.png index 2fb06f206336a4dc6eba9d9c9e270daaa6da9a7b..b1643881fd16fcad6fe7a8774c207778b4e0859e 100644 GIT binary patch delta 1348 zcmV-K1-tt12kr_XiBL{Q4GJ0x0000DNk~Le0000y0000y2nGNE06P5Ha*-h#3mdNh z02{9XUK)`ckwzzf1nWseK~!jg?VC?bB4-%JpKti1gR&NvsAX~6xY=}L$sP<%yTNLj z*uBWOeQoVc9c<`zzVm)|oIC`+&nzS*c2}iZ3O}ZPUYeLr`ErTF_J<1VU!sc^RV1aseO(^$$4XoF}ygs@kw<#clw00Bu@Ntdny9 zaR6_sZT*T3GsY|c`T%qRVAU$D5gb4Qz-!KVs*(dLGRzq31>ivA7%hbZh;hzO{%yxQ z4Kv1!0N#Ut+N#Y!0>Deo`NeHJ+-g{K;YR>Wwb52HvH)J(*2SfAKZ=%ZMzesb`H}E& zgR+L9cH?F=o5uvz!wqg2786vnjM=;B5?+cZGAzceqi&LFk3)F6qO^tk(72Z#EikB_ zuDCKRR#0z4S1zSXcmq(p_U(qY*6jxH5r7Vz!U{=$0QeQaUj(rjRE;M!fPJ)p4fa^(1CJ0DQ ziD|umbA$|B8@AlB<9|wl>1WVq+5!NQn6hh?sUV@i^kV>8hmesmW|GjL-MJL6*E_Vl zyzGX)R+fz*Hhg+|`e!s6{VAKx>PozsOeT}t?H;k&Z1?lOb#`{@O)1GnsM$p_mX?-& zSX*2B5o#7f4{UyZ{_oY*)vqXY3EGXgPMMN_;P?C8kx1k$nM~fAb*KcZ)oS$n{cb8< z0t30>k&%%nkw}DeAwq~DpBQfyB=QzMIy!o_v$M0EPNy?^;Krm?q0s-6l`ucMUT>^>R@a*jDr;IVPq9{2%ab#IG%*@PuOr=YI zK;NZZF4x0gFi6=ADKWItgatrdL+3!amOeZ@+~3;T`aYFP=~`)7EEdz$)YO-QgM%(A zZ2)pcsLy1{2nK`u8yg!bg1A{lQT9Wj5T)Tua>EM?3!l4OuHH;0qidyQHk*w;pYJJ^ zF2QBKOOxSrI`0PpfzK#o5|WcZ+`2*YX0h>MGhUyO~74P-JIU4Nw6 zY&HxJ4}UgbU7jHoumCuBhav z$w>j%w}zU#wIoS(yN>HTmjYZHKGPV4=W@A(4iQx$&ZYHocLo%cEiuMEMD#CnDfTY-} z$9QYL!<2igs+JmpqCNXqDG^${ySbFKXQxtO;Jl`v)(k#5lHln%Mvg0000Sl0e2K@eT` z;H`_D8Wm0LDD2rw7zAs3kPf29y>#=?C5RA&AT)IIwu}^Em{7!|Ypwh1u=bOShBs+-+mCvqvBPCu%q#4fp9F4y1RzbkXbi3AZr`Nwz1U!$t3 zno6Y}4h#%`Tmf)f2ywI_V#uSHm^%% z-?jEbM3l{DpD!&fy(V(!ZBqy#!r|~OP1EiQA%xR^97|+*d3iY$3OxnzmEDlXyG$l? zIT#EEod#GUQp#fhLhM=>v-2N48ziOJ=4+Aam{IlC8F#4MZe#Fesy)# z$FJuczu$jM*Y%5>3`?Y?rKM$MW#zGHnjhfeGt$=9c3w)UazgBfT}r9yx*p)>+~)tC zem6HazpSsXzjgDUy|uOVN@HW=X-L)Z0zRL)KsS6(!Hf9iqg~56N<%RVNQ-E z;`MrEB9XYCNF;des=$$%wT_HPea+5p$fLeycSL>7UImWKtW_7OHR>X@hOLN{GGEPq zB2FmR$yTJfxp~8#I+atdlbuL@c6N3F?(LLR0_}7vIVyJFqWA!uoSB)4Ma1WV; zw0(QeUHGlxdw|6Uh!%J_l-V)p86IC*>M`eW`HY^H@bVKetV>+V{%mRJb_nv63+CpO ztytKi_s3}wug%vdvkujZ_f08RTol+SI-^ocu;Eso^8N4OW{Vdb;VOF^KT}lBIe7Xd T;RkL&S2B3I`njxgN@xNAcSvD1 literal 0 HcmV?d00001 diff --git a/qml/ubi/images/download.png b/qml/ubi/images/download.png index 234ba2800101d780539cdb79e7da25439707e3f4..6dcf6d3a1ff29f4af3c959ccf338377523d13274 100644 GIT binary patch literal 675 zcmV;U0$lxxP)4jH^5 zWzK()ks0QUkuo!+e*o(0h{A}&B_ zm7p}622aN0@$XfEV(m$Cy*A~$sn_e@o6TmeR4S?0gho*$-EP+bZjyWdzA=DON&)Xu zG~V-6`JZO)-vFn;pOn25nT91*mS+Lmj^hkxE7ozGA+TLYs~~uHUc1D;+*)s%7=@yM3UPO8oc0PZ0^`if8q07>2jmv*)>mVR%bM zUuV7QhtX*CDz)9cg|rHS zD~(2DPiuXbK(*F)jYeZHt9_ON$MC9USw{)jvaF*#?eiMovSAptAP6pkAh^ieKC>%z zNX)5;N2SzNr_*Txc%FA9B9BFNp8aJO+Ne||eh|IT{zbvd+FwDd2Qrwxq*ed`002ov JPDHLkV1l(qHU$6x literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Y)RhkE)4%c zaKYZ?lYt_f1s;*b3=G`DAk4@xYmNj^kiEpy*OmP?2d|g{$JfKln1DjFJY5_^A`ZWu zc9FM1frm9(+(EtIf2M@1Sw&rjk1s=KM8M_m?oK-vJ8)eLXFibJ{ho2YV$f!>a1WV; zw0(QeUHGlxdw|6Uh!%J_l-V)p86IC*>M`eW`HY^H@bVKetV>+V{%mRJb_nv63+CpO ztytKi_s3}wug%vdvkujZ_f08RTol+SI-^ocu;Eso^8N4OW{Vdb;VOF^KT}lBIe7Xd T;RkL&S2B3I`njxgN@xNAcSvD1 diff --git a/qml/ubi/images/folder-small.png b/qml/ubi/images/folder-small.png new file mode 100644 index 0000000000000000000000000000000000000000..f95e411ae08c26068cfbce36e072c201c12b7917 GIT binary patch literal 534 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEEX7WqAsj$Z!;#Vf4nJ z2$g^^KcT`W z$+BHbW=Dpn;>zYAj}wAlUly@DMJw&=+CKKI>fTb~o>P`pOV1mTjR^BkfPx?|4&r?^v;&#`M#PT znpnO$YKKbtrxW*o?)$&*ZeIP$5G`#bquk591#4Dq|KOzHuruZ!_u&t>3oK;(df8eM zD`Hn){iRg2Y}Li?Muwj?b=6TDmLzT5ar^yu|5smsseaI&`aEHe{Iop(1XJX1{GVm7kVC@#?BBJ>T;ws_Pg`)%a$K(-aob} z+#C0PPt;mD*T9mct0t<1A5i+l7Qr0$oRh`vz}!{;+A3Ht-+A=r(Uxgd59E6{J$)=;l8_J*+~LmcU0h^kNFZ{#N^T6L7ZBU>xHxA@UuOo|89N<*$)tpw zbNc*yo|!o>|D!~NPN9^tfsDEOfRwqcs!#WCfHH7yu5#6XXBqeboC2pJQtVia?Fd#% z-3A8H0{ekId!t zLx8$$gdrh79{4IECqXI%60DTE3uNgYq4fx`FCyRk3VI4wN~M9v=w6Kjd0Df4n1s(GfqoIMOg3)OlN3kw8T0;X3g3SXeF88b# zLqY za3hz?Jq*%vE|+_>w6yekdV2Z~;3=)&_fawk7b%_Tbn62H1AWWO%de-VrV4v|d&B4< zU#IzhAJ`^X24&zvaKA^vE0fJ;@2sz{zj7SsLm2IEZf+j#?CjhIKA~4gyyyo=n@4t7 zD-}#mPCi~+TYDQu+oe*eJU>7GZgFvO7k|NNrIc+ELOMr9I-O3<%*;#@Ttg<-f&o&g zlp^@(Fk_)t7n4F?^^$24NF`EmHw+4*!n*E%;U33Iq~OG*bfU1(Ta!tlY|$OdFi~-y zNWs@B-NPiahZ85*Z)v2L_+g=)F-hSxd4i4YryF(#!loo5MRzP6$nq0&PT*o{7$~i6 z+YV#*pe-&D(w}6K6H|~^>k*h82N5YKrOxoS5*8fCc|STjIx;?g zK7PObP}}F=;NV}!aoz)d-pe!BpIPx~83V`zk4hGLL;M!qvr2Lf90P}V50U?IU3%4f zO5gFe7oM9khjh;>iEBCbLeOyoRf0vNsFcd1d(jKm-y9e6)sEZx)clJ6MS2B6YpPHq z*!UCoql_qI_Uk>D4G$l4bLS%qDLnF1&FsXjp0>M$V^N5TB3eTOO$8gj@iy@k?b?T% z&JV5);!O)BsHu>YV?0eOC*h!$XJauqiuVglBxzkHSM~b<0000sa3VW{m}E_yJK=sXaGE>( zAKY_h;9gNxc7a0H0XBsdF^!!OaTkS%6oBi%0dQ%_x*x!QG4MuJKW;DH>bR%sec(>D zS}l8?ck6G9rqk)SPN(yBGMVg)$RRLN)!9~)E+Zbldq61&0$)|KIF8Gj)M~Z+tyb#+a3CUA|8awy znYDxeiF&<%{%|}VAGh1>%ObLgS1#i-a0q-*)j4cP#Bm(g_x&g3a`|Z#MO**p84L#R z`u+Y1zozFAknEAsX!L5`9?6J#5ClF@0`@fBBRN7m&$}1b=OD*l_Vi%Ntw zb9T~M7b4#Q!Z3Ue|}LwN1%{oiEBiObAE1a zYF-J0b5UwyNotBhd1gt5g1e`0KzJjcI8f0!PZ!6KjC*fq?BzXVAmDaie1XSdk11~s z=uJr!l~P-{aA9Ig4g<%9ivpUWj)6%>A5|~ajsCvo^H263!($T3YVG?<-HtHLQ0;lH zr^zYn^~*(Zu(=7R59uf5_N+HL}yC zMJ3c>YH3#Qr`ZqB<_UJEe7%yJVRt#mwsgKkGSEFwj!NfEnV=IOd0-;YXAGXMelF{r G5}E*@B!)Qv literal 0 HcmV?d00001 diff --git a/qml/ubi/images/minimize.png b/qml/ubi/images/minimize.png index 80be69bb75ae4a70576b45be7d84a541f6f03387..ebbe718ac77f82d5da7785a754ee7d2d36a39541 100644 GIT binary patch delta 269 zcmV+o0rLLy0_6fBiBL{Q4GJ0x0000DNk~Le0000g0000Y2nGNE04b15HjyDd2?YrQ z3^sj<(!!BwD1X37L_t(o!|j+c4#F@DMc;2>=)#d0xdV4$ELUOSBrGf}Jwk5)2#{GA zqE1cKrV;hu93}EgoY-=}wNNQE%xn#m3H?7MS@bG1J6l?9`?3`s`<^(WpP``H>Tf`8 zV*jhLCJJbQ9k7`I@;c^@9+GZzhrSP}eyM8@oDyY*3RXBsI!51-pb%7Z9HOTu2X#;f zb}8U z2_2IsH$jnTD1XjLL_t(&-tCyZ4Z<)GM&B2pNW(~!?7%LRVHFxCp`oE+glqr^(9sYn z6+uyA#o~LVEnD}j^Z5siF~%5UCWpRtM#KV`C5-1TDF&Z4A`X$3Ro_^Pj{a-n40(+u zk_~?=5+lbmPc=|L4XlCX2ok51D{zx^o?2@45z(hKZ)AXdqRLhRTS>dYbFy_%mQz@C zmtTum#3B~4h(&%7DRPnTx}scwBk*Xo)me!|gd|l!m33;3@|)q!ZV`)Q_0(->KGRY? hb)Ohxj4{UK#T#yvkStIcz>xp|002ovPDHLkV1i;JZ}9*C diff --git a/qml/ubi/images/music-small.png b/qml/ubi/images/music-small.png new file mode 100644 index 0000000000000000000000000000000000000000..ea57709c828316cc293ba6745830ef8ccf0850ba GIT binary patch literal 1258 zcmV1LIH{&qQ^y$78h?_pnMSCK8pA-f z$T*Ni6c+|72?%aP+MON0eotTmVWIs1(2(TCFzEYPHrhG&J0+si~=!NF2w-}LQz5pA?JO~&CU1icKc6UYo-OrZd8o_ zqx3ezFrv=RPIXI5OO0Ny*Or%;tAs*f%KM~jB!ox-JOof=GMN-+vsqVHSEs3}s;ZDk zB$BKASp_77hymQ6oSd|@wzhsOlgaWk1$0rVMli3xzh7sw*;+G7!=Y5`pjfZht20WH zK(DP(^Ho;s;6+6u5#RCg@iUjp^)ws~%Z)~3*HxaZ0#ZsNCnqP*-EQ~Ojg5_!fq{Vy zkH-@MKxbxVY<$+pG$1`aJ^jPu@%*~Ex%p&dWaP=}>Z%Vw1c2|{kn>$IBY+172hX;* zx4)U1n)=z{aQp=z3c!B`L@5oOpMT*Z$v)u9%F6d09UWf*c*z0k^${wY9bN0zjDaBc=4x08p$_se1PJ_YWu!&CSgX0w`gCbM2ZKQ$rPRkOf&dhQgM*LxMj#f8#d>;r9sqcg^_MLzEnVsNdcB){eSIGRPy-Ni zMUPU-38-FMTU+1@xVyXiEr2QjIjldAVHl0e<@%0mel!{l?dyV$t>W^)CQaBmT@rIM&HUyn8DHPzgYV zcpa4j5G0G*RVfw&P|wfLf9mu3JQvavJUl%7#p!ffS-4^@xJ(YtCt&vWPy!H*jg8e7 z6cpt9{r;fS>3qJty!;YCfK88|&rwK63E!yMV$C4_j?4fEA>Qi-X(H2g0^St;3$y-6 Uavi+TWB>pF07*qoM6N<$g7RKITmS$7 literal 0 HcmV?d00001 diff --git a/qml/ubi/images/music.png b/qml/ubi/images/music.png new file mode 100644 index 0000000000000000000000000000000000000000..dda386cac16b56ce9f561bfcc20aaba2d3ad1b14 GIT binary patch literal 1707 zcmV;c22}ZpP)2a#{?XcuQG~-({~r= z6k2FY={e;?_DfDm==<^f`+h&~bA*%f)ww|I}J`BZ>vp<^oN_62b~b?Zz8X zYyc~&h9xW!tW8iGWz0syp=k*rM6fn)ovUV2;&E!4=2_gr*{t8CCmsZ8ALQ}kLN0|NDz&H{D-sVGbK- z1&0nD+U<6`cV%W~rbf&xgx=wn0?Z4x>nvFF0}HM0o=1 zhy{xf!fGP%-Pz=Fxwa>`j##m;hTypI`Ft}TkLO`s7|^WAlcyh z%&RVVa&mI4udna7Cr_Sqx3skU{OHl6QB*I*Owbc>!x+7Km@Pzh0wjbB7cP8%`}XZ# zLIoi@%C26$T7L56 z$>Nfdl02)`nus%cLRxqWs(@@%_o``ZY%DWMdgtD~dyllXwti7wUcNh0A|Zqk!6=H+ zf_DKWhYug#Szlkjr>v|j*XQ#o$;ru)x}`lUE334lqvLE|US3o;u@EBSo$m@zEUetI z9S$?_iQDb2Y;JC@-nVaG*qggW2w+ERYisRtVgdU4`hI00;wN5aEU1w&ddaJ+tNXmU zxw+nMw{MA-&|5?(WMtS59z3`wmI_*0TJE8qll9;=p9FAoV>%G0b zT|GTL9>53qy1Ke1M@B~eij>~(_bY8}Z9lo)?jKRZlzckuoRd<{2KLf1h5SUox_|%v z{8$pUx3}LzoipaN$8+Y)neT>&hhGJ!^ZWgC{r&yFT)A@Pn^UJwwV~b%>9LVO{=i!2 zCI0IczsKVl0&*iIn4O*VH8nLgUb}YfF)$kR)#!r<5BxbfIbYS**6u1QD$1Omp7!0n zd-spt-rfn#t}%?+D|o?}%e1s}=gt*3Ha321v)Mja{N?!g_}`Z=U;g3Nty|AfuROyI z9}{X+-xe0)ER9%(f_WjO^vs7X2_cGzFO*OK>Bo;BFSvN|;*r9_!jBb2nHwJ;e|!J_ z{m0j@U+lwc-;BW@SFc!pWKah3=qs-}5D1Z(k$gR5y# zf*D*KbGgKcrw#7+p=(cs3nz}`wS2|e&#ZcwMb)r`u!6OC<9;@#=s@^z*p18o0pej3 zZI)L6LK1GKmpno;Y?jw}!e-tKFKR_CYy-TC_a6h%MC(YG4g&xH002ovPDHLkV1k}( BESmrT literal 0 HcmV?d00001 diff --git a/qml/ubi/images/options.png b/qml/ubi/images/options.png new file mode 100644 index 0000000000000000000000000000000000000000..2e28b6eccc6adb751a40dd1c1599d6077847bb4a GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3EX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4`?r6MurTJwcfnt4y7t3dL{hRcy z*0Z-`gS+4E6|DD+p6@X@Cb57~?m+C#N=E+!-t*D~71w5G=f2)6?`nDP_r<8&OkdyV zK2U2h$XINt*ut2xX?xYwAw$R6mbl_o+O;B>UXqQr5f! zt~dXwe9`5c^KfnOtB_YqCIzW$lxmd*d94(d`B+_T^Mn0W^3%!7ueQAg`hvmJ)z4*} HQ$iB})Q){< literal 0 HcmV?d00001 diff --git a/qml/ubi/images/photo-small.png b/qml/ubi/images/photo-small.png new file mode 100644 index 0000000000000000000000000000000000000000..e92715db54163600ef0d47942c55d6e3690b0093 GIT binary patch literal 823 zcmV-71IYY|P)DZ~1q^2EGA)yVJR#N$Q&_@p6?xNAN z;CJ#)5Y!uvr)zxW2@ml?*`EdY-I zFpXe50+1%6FO{tdaNOl`&E@m?L(;f>K7Z(Px#j?j6HyIlP9zdht#Q0WA`t~(CZgIo z$OJ(U_#77sh0o{b=imByTt`MmtR|D`4ggdw45(WqymUJKerajxUH^DMGMRiD2n1f% z?;rTf%n;aZ{Q%klJOD7+$&Y&tvBW19RN3g`=}f`RX6~!TCLVhCiBAKa6AMs(F>ps zfO~s;J9vD2{5l*CKW>3+!0~K0n{{t*Z&i|{X|+hTKpg=0&d$y=zu&)LG#an3udjzg zq0mAdvL%iuNs=v_&8kMK0oHJfi;MGoryvO8#>PfuWo3mU6>&18q!y{PNSfm0$XF~E zDVNIx0BUe@WG0hY_4$0S_V@Qcb_%@N3da*gQH;mqk?LnvIG){Zmo_&ypL@OD&VXB6 zTY+{s8S+9fc?N^Q(C+)T=b+Q+yxr-*m(}oI+-+@vdcFQ{uK`M9v;~fhjs3n{&c(-Q zx{A-v&aMJ5SuB<)favA38ZuSKY^W*l&H!ADwSFT zFhxYQbFf@27QgptvJ|UY%0Tti2V+bWMbVzi z%}fBehRVNXE&BuDClQ?jvX@7L+W&ng8H5HN_z$u7c*5YP2crN0002ovPDHLkV1hI} BbZ!6u literal 0 HcmV?d00001 diff --git a/qml/ubi/images/photo.png b/qml/ubi/images/photo.png index 60f3c8b76fc8002717af0b531239dc126cb666a0..cf949ae41d8dd97084caabfbfcc21b7f402677d3 100644 GIT binary patch delta 1376 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 diff --git a/qml/ubi/images/pushbutton_disabled.png b/qml/ubi/images/pushbutton_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..bf15a8c008b9bb3d66b69876b9792c74a922a743 GIT binary patch literal 1173 zcmV;G1Zw+k9$*_V%jY`<;HjUq3xPy)v_<%&z|m5#f!E zjY_><@5dNlzkK;}c=!5e0`BeYRhjv>v$He3yu8eRc(e=5+S*#WzP|1N{Bc)AfAfZ! zx!rE>oS&cT#l=M_-rqPsKhIS)ee~$j4m1CG^K-tfn!CHZ+k?TNUW)f^E-o(e!C+9| z-QC^38Djv{Znu*V!qa!}-VK+vqW&nHbNu-6<7$#5zaJbN1R)}tOeULImRTv@_fb`3 zS!R>TWRs{^149T~-EKEm)%ixZBy_voe06noi-_L3larH52;tX{A3t8tJFsOTgkX(E zqw(t1s}tYv_ggVWjq#`Ilm9it;ZVKzEfJAc2%%JOMnVWtL|Ps|b2J)hx&F<@Xf)CX z4<0l{RjcFi*ybJ3vN0ZyO;xKt#^@)LiJ6re&H@0$7`-sFBcihZn;kH-lNe+2v!A%! z2Qx#AF%eaD^A2WNQB~(-j8gW1_anwAQnoMmM^#Axl;!uH05A`rY@+W802NgY&N-fU zFw2H>j#V{Cj8OrU0?r5kjxnkS5LMNcJCWG{zyP9{*-%85#Zj;@h{z}Hn7LPM=SpUP znH@9tr0|0H?|-D^E+XO!?W9{~;OsE76OpbQ9UWbnS;ov|7ETE>do#<9j*hN85s{g_ zC!$|sxhbBCBuP>;drMR}6Kb_u2Y?V!*$;jn1|YRstwU4@czAdinE6;lD)WtP@ez>< zGanxw9tNU2-k46O^9DelnbY}&x7aXq3ZUQVbl%*I-3kZ*qtWO!09T6mC53pd(CGFA z{|kfV!-o&6X`1dZbDf#5sC-_+04f0bd7i)i@ZrO^4VJfq%)GI&u^nT4LPX}A%bEG7 zs?Y$us-{FF-uvUz)6?lJzMoxWPS)1eHof;-02+m}Jr=JdrHw-DQUTCxSE_m@ zBBuib11Gz?yVvauB(DivSy>qdunu5DRc9KF1{#e9thG>8kbG|ah=@El$8lhcf$O?( zT^EkyoCDYfu(P+fcmKCzyma%$V$qC@jBJwp7{_rC$1$w6|KhFm9>y5>z7OB`Ya+5$ zE|)(Y9UXlm;TwU=%gd7hzSQgWLbY1$+wA(M5D{dvS$Ljz3}AJCfB*6?{jGwQmX;(ZaPVubRx8AD+^sl!8sGO3 z1i|s+|TUDP8f!89H$Tj!6txTfFuJK7Z-;;&%1kgcnIG6 zocBFM1VckZwR*iidU$wvZ<34aVHgIDMx)#D^#x%V2F93m0G|y2klcu(=-scl?Gi;1 zT-V(I@L3iX7V_5Gt4gKP?YR1iTrLM=%!IMl&NrVdQrahZu$VWEMq|!eo0e~fSZg67 zb4FEX(+un!Yb{*Yoi!vUQh}Xgt%dLV6Gl~Y%{MD4?W3wt)tn)j>*rTe-GpTBIRjHV zgXB{Ns%kdPzPF*OS);06D)4Qns%O&q@9mI;QPn!he)$;GQ>bd)kgSp%?shQ!2+68Z z)k-SxZK!I+kgNbm=fMsU5s-Wmm@Xu5gJi|1>J@+=Q-Pf!B2d*UL-LH|&#A!9NUHYC z0dOiJ-Hxa4NSvJ-&+|^gFihvb4j~E8^G<{$rl+TWSJjzRVtXW;kQ=g#e4pg+%T}pWx(8Y|7m0|;=ks3y z6uKE;A8>qqef@!?1^z5ykhF0euL3A{EwtXJ9LMo$Qy%cb2FuaW(Me;>7XXE{q@PF} z9b0Qx@9yp{Tl-$z;wvI%e0+Qpz()YVdli|usR7u!xw-k&nt4rL-DEyBH8mW^@jA&3 zk~6I$|8G)TJ&=TmoQue|@B2H=1>+@N71+wy*jOIGJb*a>vm_@(B!}dv1N!io1Ck>S qBr76v1>g+8DS(sP+uOE|Is5^d$TgSZNSG-A00001 zg4gSP-{o?>rNjSwvPCU_No;#IT6SsZ*!E0ebCr z`#UF3o*cV+_3Bh45{V>}$z&ptNL;&i?YhU~Id}N*;V;_T+usGcfOX~kE@PB|>bttS z_9v6cq=-l=mAdEi`F>8P(`l)pTrQXOcs%EfM&s*1>w|*ZE?>SJs0FE}Xf*oAzJ2>X z1Udj+O)$`S@ZiCZ9|l@fE|<$5KYn}!u$KehFD|9jx~8V4&cVUK{gvt=kx0xU=9T^$< zzS=2Y|XWo>LO7wX*Y+qXm7ZFhHfI{^I}PK<~|MC4Y9MT+xU zaOTdPJJ+=zTdmgT0mE9rwWR$Y{}T>}1Hc=_fsT%jPP5tkl2Ymi5y_Nupp-HJJAsX> z;LQU*5s7MZQtx)Vcja=qtTxZ%R6VIPI&Q|hEO7z`dOS-*7X z(4o(P-GIIf*f2OaxI2@{q^dzPnM~@yfdkzX+HI+mI*Y}!Jr;|FO5x+<;}=?5THXXY z0UP<;>wzbMmq$lOzpVxi1OlI->3FID)aI;VXlTeeFfedNr_cG&D5yT09>A^0Du~aH`S41S0O8wp6-``cXD64@B@H(K??RM`P8ykCjYHI4sxw*N?WHR|z zCX=}vkH>F?!{MJUUApv%)9HK>uuV=*ek3B|_xq0kEoJ@I0&6x<4>SQ=04uPqU>5Ry zxruy3(ix3LdngndH5!d}N}fDLTT#`ILP{wEunG86L>9}g`7gk$(Z2v)XJ$5ENw5F_ N002ovPDHLkV1it2Rfqrp literal 722 zcmV;@0xkWCP)Iy4i<>_Hf5F}qDJQP9&ayW-2nU7Ba==B=BWg?IH}$D8&Aj*Ky?Kkg zuYOHC&3x}SGr#%f`_^$%`>)0r%K*(k&BN7@>q0XKya3m(>pu7_qzz3gz!#ID?mF-R zykYLERf4o@Ye0#*Ht>-Jd3Vw9MRWqgKptqPK5h?Rivx~$EcjjF){nyS=218kDc zRK_)SMy*5I9H3TZT%Ys6K6LqRV+VCwI|Pb8zKS$Pr_Cv2O=<|r_Cz~v;`2#!+Eirda}(Yn9wWoNxpiGC<_5&9 z9-swygo9htw2kt_-Vnp@fs-(?RQ$lA@CH{*wZda#QnB>w19ECrGMsNER5khOLi$~z z`lF%dM{rO2&5NjMgY;-6=@^yMI$l7hWzT7C?v}YKbOFm$#GL!Hb!%qO@jPg zu4#6XYclV5yJ>!&#(GgMi5r4sKjnw2`r-uG0S*AUw%`GJ0+=QJs_K|;J`o4qNH0kM zNk=HsMau^iS>se_`4TjJ*lQNb&KfP)iLF76rphtMl|{{3Cn$xWEls7SssQ=eT+nNi zNH#-7ma0hSI;%of=YEN?5YSgJb~XLuGquzV?NfjO0JjJEGQIwd+5i9m07*qoM6N<$ Ef?`%ogsv{%{$%)ERmkzi{cEE1 z)o0rZ@B5c-I>aDxjXBRN$FIYdQCx^Y?e#-VM(3m~#e{WpR3}Wz*vmZo_B`bc%7J^B z?=rT343Ay5%8nss-}BF(ilw9WN-clEF2xnlz$CJOfmP!}Khyaa+?(@uua*tj)y21X hx7kbqCytNDxIMQk`BazOe+Tp;gQu&X%Q~loCIIYae7FDr literal 0 HcmV?d00001 diff --git a/qml/ubi/images/up.png b/qml/ubi/images/up.png index 98280301861efae1547172e7519d607c507fc7a1..495bab37bf62358364bfcfc4d328dfdfd834289e 100644 GIT binary patch literal 449 zcmV;y0Y3hTP);BQtAK(QfDb`ju{CjA4#)FpCNt4ha$w0Zyvs zw;8Z(-ZK`F065cH-zlXc;Hv8LE5;b-3IxD;mSqp7DoK*;fDI6Mr%J(scXij<9s+Rbu(CN9Vw-@z;*L*^uaFi zop593tEx)tSubphuj}6Lah2@LX|D#x&-Mqhzze*<0Ka8fzSfPRDBge%-y~AqH0}W+ r$G|CYR1XCBG{*e=D?C-1ZIAx|c2r!hlW{(p00000NkvXXu0mjfX}-ai literal 343 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}Y)RhkE)4%c zaKYZ?lYt_f1s;*b3=G`DAk4@xYmNj^kiEpy*OmPaE3<$ON5n?4HlWaTPZ!6KjC*gV zU*v5z;Bk4|WoyNBm%;5NTkJ~hQl?WZJq3SPUg2__vp{Xr>gsv{%{$%)ERmkzi{cEE1 z)o0rZ@B5c-I>aDxjXBRN$FIYdQCx^Y?e#-VM(3m~#e{WpR3}Wz*vmZo_B`bc%7J^B z?=rT343Ay5%8nss-}BF(ilw9WN-clEF2xnlz$CJOfmP!}Khyaa+?(@uua*tj)y21X hx7kbqCytNDxIMQk`BazOe+Tp;gQu&X%Q~loCIIYae7FDr diff --git a/qml/ubi/images/upload-old.png b/qml/ubi/images/upload-old.png new file mode 100644 index 0000000000000000000000000000000000000000..e66dfb7bce743724fd0f36e72d13ea278b8b416d GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Y)RhkE)4%c zaKYZ?lYt_f1s;*b3=G`DAk4@xYmNj^kiEpy*OmP?C!?T_X8NwSM;9-fjZ}|5=@R#t)?EGd#;ow10`UpD@In_T zWStx60$KG0(kf9;U@(oc>IH;*0n2Jy3I&Y`$iE9q!3aCDWSe%82LjD#=D*RP|3^wh z_!l(lPE<;Dlv16#^WW5zz8{T7pR)VUBJ#U(5D}?#0Zqd&F6Z-kJfF{F!!Ry^X5~0F z#68z_ZzaQZ-CLk{R58#pP18=2B+11|k|d^S+Cb}=;=yDxd5{8=$>aeT97PPA+O~b2 zrfFIfr)iqnwtWqp9#jk{;35peX;GRJhT#;r0MsGHZO3tLwn=jw$GHL82NCD#6UT8} zCXVBH=k(e|eCB!HU70k;^SnFYY%ej;vMkHiS|=ME8_`-PmSvTuSDCmM1i}5T(wra& z?#qfwnfP35{a973wSEN7_YoVw2cQr1ec!*@Ci8v&Dj%24F=~r9ETq3poITq)R_*h6 zUtYzp;v!FR9DgfzW_?dp0;w!bRt=?^K>LO9CqReQF}aQaKLP#1++QM+=8fmSOr_Mj zZnyh!I2;ZdjYcu>UM!bO8IQ+PrPLP@`LkN;T6v73DB7(kRws(0h_y2MywysnzKBc@ z`KCpbQUekB4*$tly_n5rUymiqVlVRc`c|I+UEuAJ+za4`h-iSn`AB>msG)UY00000 LNkvXXu0mjfB+U|U literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Y)RhkE)4%c zaKYZ?lYt_f1s;*b3=G`DAk4@xYmNj^kiEpy*OmP?C!?T_X8NwSM;9-fjZ}|5=@R#t)?EGd#^5z>+t}%QOl`GGX>|`R(t_J1 zP?y4X@gloDMLmct$bw!g2oe?+1P|gxFT&zVuSyR~OGSHVF2&*@R6>gECX>*bw8@y7 zCNa+*X0pDuHq)fmgFl$#|39C3d1jvHk%SO@%CYPZ`0?XS z0|NuC9UUF@t*x!~O-)Vv6h(1391e%oYW<=ZQ6`hwh{xmcm6ervG#ZVC!{O&kOH0pv zK3{lhYAOnZ0G|*d{$8;V;;jQX1f21Dy|;qF;F8$o1cSjPuh)AEI0JMQZrcBzcX2M4 z>-@sP!js*Gy_pXC1Qy{QUQIu1vs;VCwSBR>rs-h^TfPHTP(MRLp%*@Q} zUf~LvnVFdd1_A4vK*i(nTogj&_t+4l}f!Z+vx7yyT1cnw{PF}tgWp*Ef+AAO1%IM163BF((QIP*lf1y zV!mmc<@D*(KBv=pVs>`+N+y$8-D#gfY&Ki9+wE=uDlLHA-{0>nwW+3Q`JthqJENnc zKP)aT-pS|lxl;NWCfNd1x?HZdQh|j`O-&`cySuMkzI^$|NF?%Tr+o~Qeh2I8>s!hN zEX3>eK5J=dIXf{iaaPl`CA0O0Nwxs8!{KNwH?WYgv9U)74jdTu`Fww5v)N>^b%sfQ z#EPQS?G_Lq7K^TNs7#<$} zuA-u%!b}6hl#_v6JRT312_^&W7K_Ds{rdIqJs!_bH8nLgJ85K?ax#z&hr|Dr2$O(j zpyS-Rb3NnZ<3Br{&XT^ZhDm?Kb8~Z{oiy3l*s!9%XPw869c#aK?b^xy{{C+ba7i&t zInXByUFmc>VfLqffxeoQEJ6qYX!q~mzXO=ssIlAa_EKg+TSOR^q!6#yBUa#0AP_Kp7t5VM zATWWxvV1+|7dq0>+uM62kw^sg3YSPE0=>PxM*xS|V%gc|cDwsRq0obmjSGcB58Q5d zAJ8g3ur8K>2B2$la`Hkf7JIzguvjeicye;`0{W;`-t-6|w%q!tM*qH5UAlCsy|1tD zo95^Va8bxtHtf>uM^MQZ-Ert*)+yB9X|y^Yimh zy|jUiT`!P9-|@-<>q3b1mWB@jH!YAPiPzX- s{}}lKNSHjKY2e4sC%?n`8CYum15Aw}R@v;uqW}N^07*qoM6N<$f-`$%C;$Ke literal 0 HcmV?d00001 diff --git a/qml/ubi/images/video.png b/qml/ubi/images/video.png new file mode 100644 index 0000000000000000000000000000000000000000..1451eaf9262a9f640adf9949f18572c43a36cf33 GIT binary patch literal 2138 zcmV-g2&MOlP)02x4-Qu?i)6Lc9S zgj4{i#Oq^pB@{r2QX0`JnAI>Lga@znD*#_* zYU12l|74L}k7fZ?^A6@=6>A!X+Kktu*%U=kJ*;AtVfKJpFZXOVMCN4~%M7#ow(oEg?>S>83!)yfgV`$1N5t%mt%g4Spn2&BT)G@UcKncE|Kx_mc z7_2J}HfdnTHvr}V%(3rAAyBxWDxlQbL-$HvFUryo9iI5RRbG9$}!`dE1mz}EmKpw6iDVn@1RHtR7m5vTz0 zF3 zrijPmiQ3xQkAuPBZ2&VG#m70QePuQXfRfJ6&JWC*4F-dc5{X3I%(+?!g1~onc76c0 z|JUjsHgZr`7qjse0RHgd!wqHxMWfLfkH_=-Lx&D^K6vopOQ@?8d4*}?p~Fl1l4&M3 zSS%L7?RGoNh>6GJ2>`fp<3`l$_5Shn>C>Nt!{Mi9>dJ)M?RHo!76IC035y=XLPJAC zInVQ%=FW!b?d^S3RaJHR>eZ`%j>TfL`KXiUd9IhtF^ujc18RqmvnDcl%rkb-B!C-K)xw-i-M~)o%aBOVs zPA+vZjatFej4%g)R903Romd!RU|=A$d-v{hXV0EJCrQ$CGj%YH1R8#{3=;rwI2<-J zB8<}A-F>IJy83t5u3h`<;^LyAsbHGMY+aLPljZ=x>2#JExp*!tEG#6C9zFUGuh;vh znVA{grqeWL3!p{UK!W2qJ+qN~Pz0a~fUT{q?d`I%GOd1f3B4M5s1xZ-#*+Z>;>C+; zy%#nKfjT{PwYIjpdV70+RbO9UZKQ%UjoFMVyhZ^E0Foq48M(MYHUZeWZQC~S(xpqk zJb3V+m*Y6YeSVt8Y$Lg(mf<7-8VZF9VR$2eYC#an&YwU3UPnjA&r3>5OmDw3jT9Pw zQcXG=$%%=HNwY%MfQP#FUEa~rv7@`YyS1vS>LP5(a=+i-x_|$Et!b%lm`1G`nXU-Ohlht}6-7}j7K_%XY!#GJ0$>Y(O-`p%yl~;d zFWTGN-{pDUa9x>D6h#>x9-f7^VMUMOmx`j$P$=|l>(;GqqhhR9Yq8B{t3Gq)jQ8Zp zlTD&17Hgknj8G`_Oi>gHH5DQo3J*0~CL4eo;`c^RNlXT{|e9ZMt2elN+OYnd%fNhfj}Sxol86mI_ixD0)hGd z{{GK%mzZDr`};o+1OoE_VmgX17+Izj0c?8w`0*z@ckVQ`+>>vfJb5y@YuBznK#lC2 zMsanSmi?h8FDU_P%c9A!RYAdP*YRWr%>-(Ewcdgm@=%VSp&dSBodiz zY;63judna2EX$G!tvMmfveehtce$~#@v}%IG7CWO7-0cmSv+hrZKr|jiU6#FAXs{O zdfsnoY5AGmZg+^HSYBFMYDNAw)oCmio0DaEN|L1L;NajtySlpm9goKqs4Y%UWK%p@ z+DrogLdZKXwu8t4Csk{yVvFMc${{--DYIFRFb6Wr%#`T@7=pM zIXE~t8Hq&F2NMaXd&M#6+dxb4l2ZBzNXye=2_RbxRFX~+)CIH+P|dH*o;AYC?Aip> z0mV!9-3-rDS$gSD=4qHuFMP!gGduK!hC=lQAnn&@S*cn(aO)8{J>zy|a|@#YTOt2L zC{#~NEHljV6GK0wq5>0InRB`7fx>R?A4AiY*GebO^aP!N`Vd;Lyn^as6>A!1`Nm&i zeVR_C53kvU{Xao`%|dU=D*($1zDX~6EIZ*%d5veyli!3FwX#;W4qnCk4kG6VYY6UC Q#sB~S07*qoM6N<$g0zD1TmS$7 literal 0 HcmV?d00001 diff --git a/qml/ubi/main.qml b/qml/ubi/main.qml index 8684481..80d0160 100644 --- a/qml/ubi/main.qml +++ b/qml/ubi/main.qml @@ -1,6 +1,5 @@ import QtQuick 1.0 // to target S60 5th Edition or Maemo 5 import "components" -import Qt 4.7 import "UIConstants.js" as Const Rectangle { @@ -13,41 +12,104 @@ Rectangle { PageStack { id: pageStack - initialPage: Qt.resolvedUrl("StartPage.qml") + //initialPage: Qt.resolvedUrl("StartPage.qml") + initialPage: Qt.resolvedUrl("FilesPage.qml") } - SystemBar { - id: systemBar - onClicked: { - var mask = pageStack.currentPage.mask; - if(mask.state=="idle") { - taskBar.open(); - } + TopBar { + id: topbar + Component.onCompleted: { + visible = Utils.isMaemo(); + } + onVisibleChanged: { + if(visible) + visible = Utils.isMaemo(); } } - Notification { + NotificationNew { id: tip - x: (mainWindow.width-width)/2 - y: 120 + anchors.horizontalCenter: mainWindow.horizontalCenter + y: mainWindow.height-height-Const.SYSTEM_BAR_HEIGHT-Const.TEXT_MARGIN } - TaskBar { + /*TaskBar { id: taskBar - } + }*/ Connections { target: Utils - onFileDownloaded: tip.show(qsTr("File downloaded!")) - onFileUploaded: tip.show(qsTr("File uploaded!")) - onDownloadError: tip.show(qsTr("Error while downloading!")) - onUploadError: tip.show(qsTr("Error while uploading!")) - onDownloadAdded: tip.show(qsTr("File added to the queue!")) - onUploadAdded: tip.show(qsTr("File added to the queue!")) + onFileDownloaded: tip.show(qsTr("File downloaded.")) + onFileUploaded: tip.show(qsTr("File uploaded.")) + onDownloadError: tip.show(qsTr("Error while downloading.")) + onUploadError: tip.show(qsTr("Error while uploading.")) + onDownloadAdded: tip.show(qsTr("File added to the queue.")) + onUploadAdded: tip.show(qsTr("File added to the queue.")) + onOperationCanceled: tip.show(qsTr("File operation canceled.")) + } + + DialogBlank { + id: downloadDialog + z: 200 + + property bool isActiveDownloads: progressArea.count>0 + + boxHeight: progressArea.height + 3*Const.DEFAULT_MARGIN + + Connections { + target: Utils + onFileDownloadProgress: progressArea.setProgress(filename,progress) + onFileUploadProgress: progressArea.setProgress(filename,progress) + onDownloadAdded: progressArea.addTask("download",filename) + onUploadAdded: progressArea.addTask("upload",filename) + onDownloadStarted: progressArea.start(filename) + onUploadStarted: progressArea.start(filename) + onFileDownloaded: progressArea.stop(filename) + onFileUploaded: progressArea.stop(filename) + onDownloadError: progressArea.stop(filename) + onUploadError: progressArea.stop(filename) + onOperationCanceled: progressArea.stop(filename) + onFileRemovedFromQuee: progressArea.stop(filename) + } + + DownloadArea { + anchors.top: parent.box.top + anchors.topMargin: 2*Const.DEFAULT_MARGIN + anchors.margins: Const.DEFAULT_MARGIN + anchors.horizontalCenter: parent.horizontalCenter + id: progressArea + width: parent.width-3*Const.DEFAULT_MARGIN + + //onHeightChanged: console.log("height: "+height); + } + } + + DialogInfo { + id: aboutDialog + z: 200 + fontSize: 28 + iconSource: "images/ubi50.png" + textHeader: qsTr("Ubi") + + text: qsTr("

An unofficial Ubuntu One app for Maemo 5 " + +"and other Qt-enabled platforms.

" + +"

http://ubi.garage.maemo.org

" + +"

© 2012 Michal Kosciesza

") + } + + SystemBar { + id: systemBar + z: 201 + onClickedOnMask: { + aboutDialog.close(); + downloadDialog.close(); + pageStack.currentPage.taskMenu.close(); + } } Rectangle { color: "black" + z: 300 width: 1 anchors.left: parent.left anchors.top: parent.top @@ -55,6 +117,8 @@ Rectangle { } InitPage { + id: initPage + z: 301 height: mainWindow.height; width: mainWindow.width; } diff --git a/qml/ubi/u1.js b/qml/ubi/u1.js index 91bdd0e..a118cb7 100644 --- a/qml/ubi/u1.js +++ b/qml/ubi/u1.js @@ -139,6 +139,8 @@ function getFiles(secrets,rootNode,root) root.onErr(xhr.status); } else { //console.log(xhr.responseText); + //console.log(""); + //console.log(xhr.getAllResponseHeaders()); var resp = eval('('+xhr.responseText+')'); var nodes = resp.children; root.onResp(nodes); @@ -268,15 +270,15 @@ function startPublishing(secrets,resourcePath,root) function newFolder(secrets,resourcePath,root) { var url = "https://one.ubuntu.com/api/file_storage/v1"+encodeURI(resourcePath); - console.log("url: "+url); + //console.log("url: "+url); var xhr = oAuthRequest(url,secrets,"PUT"); xhr.setRequestHeader("Content-Type","application/json"); var body = '{"kind": "directory"}'; - console.log("body: "+body); + //console.log("body: "+body); xhr.onreadystatechange = function() { if(xhr.readyState===4) { if(xhr.status>=400||xhr.status===0) { - console.log("status: "+xhr.status); + //console.log("status: "+xhr.status); //console.log(xhr.responseText); root.onErrNew(xhr.status); } else { @@ -292,9 +294,10 @@ function newFolder(secrets,resourcePath,root) function deleteFile(secrets,resourcePath,root,utils) { - var url = "https://one.ubuntu.com/api/file_storage/v1"+encodeURI(resourcePath); - //console.log("url: "+url); - var auth = oAuthHeader(url,secrets,"DELETE"); + var urlA = "https://one.ubuntu.com/api/file_storage/v1"+encodeURI(resourcePath); + var url = "https://one.ubuntu.com/api/file_storage/v1"+resourcePath; + //console.log("u1.js:delete url="+url); + var auth = oAuthHeader(urlA,secrets,"DELETE"); utils.deleteFile(url,auth); } @@ -352,12 +355,15 @@ function fixFolder(path) { function getFileContent(secrets,root,path,folder,size,utils) { //var url = "https://one.ubuntu.com/api/file_storage/v1"+encodeURI(path); - var url = "https://files.one.ubuntu.com"+encodeURI(path); + + var url = "https://files.one.ubuntu.com"+path; + var urlA = "https://files.one.ubuntu.com"+encodeURI(path); + var filename = fixFilename(path); var ffolder = fixFolder(folder); //console.log("url: "+url); //console.log("ffolder: "+ffolder); - var auth = oAuthHeader(url,secrets,"GET"); + var auth = oAuthHeader(urlA,secrets,"GET"); //console.log("auth: "+auth); utils.downloadFile(ffolder,filename,url,size,auth); } @@ -366,10 +372,15 @@ function uploadFile(secrets,root,path,filename,folder,utils) { //var url = "https://one.ubuntu.com/api/file_storage/v1"+encodeURI(path); //var url = "https://files.one.ubuntu.com"+path; - var url = "https://files.one.ubuntu.com"+encodeURI(path); - //console.log(url); + + var url = "https://files.one.ubuntu.com"+path; + var urlA = "https://files.one.ubuntu.com"+encodeURI(path); + + //console.log("u1.js:uploadFile path=" + path); + //console.log("u1.js:uploadFile url=" + url); + var ffolder = fixFolder(folder); - var auth = oAuthHeader(url,secrets,"PUT"); + var auth = oAuthHeader(urlA,secrets,"PUT"); utils.uploadFile(ffolder,filename,url,auth); } diff --git a/translation.pri b/translation.pri index 03b9331..b9766d9 100644 --- a/translation.pri +++ b/translation.pri @@ -4,7 +4,9 @@ evil_hack_to_fool_lupdate { qml/ubi/DownloadArea.qml \ qml/ubi/FileSelector.qml \ qml/ubi/FilesPage.qml \ + qml/ubi/FileDialog.qml \ qml/ubi/LoginPage.qml \ + qml/ubi/InitPage.qml \ qml/ubi/main.qml \ qml/ubi/PageStack.qml \ qml/ubi/PropertiesPage.qml \ @@ -13,15 +15,20 @@ evil_hack_to_fool_lupdate { qml/ubi/StartPage.qml \ qml/ubi/SystemBar.qml \ qml/ubi/TaskBar.qml \ + qml/ubi/TopBar.qml \ + qml/ubi/TaskMenu.qml \ qml/ubi/DownloadProgressBar.qml \ qml/ubi/components/Bar.qml \ qml/ubi/components/DialogCombo.qml \ qml/ubi/components/FileOld.qml \ qml/ubi/components/Notification.qml \ + qml/ubi/components/NotificationNew.qml \ qml/ubi/components/ToolIcon.qml \ qml/ubi/components/ButtonNew.qml \ + qml/ubi/components/DialogBlank.qml \ qml/ubi/components/DialogInfo.qml \ qml/ubi/components/File.qml \ + qml/ubi/components/FileSmall.qml \ qml/ubi/components/Page.qml \ qml/ubi/components/Button.qml \ qml/ubi/components/DialogInput.qml \ diff --git a/translations/ubi.pl.qm b/translations/ubi.pl.qm index 79b90dffff6cd44c689c8dcf9eff68c1f52214f2..ccdebe2f8833f104c4790db1a208eac52b7e57a2 100644 GIT binary patch literal 10329 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 diff --git a/translations/ubi.pl.ts b/translations/ubi.pl.ts index 97a8925..e43e3bb 100644 --- a/translations/ubi.pl.ts +++ b/translations/ubi.pl.ts @@ -5,11 +5,11 @@ AccountPage Authorization failed! - Autoryzacja nie powiodła się! + Autoryzacja nie powiodła się! Error: - Błąd: + Błąd: User name: @@ -29,12 +29,24 @@ Unable to connect! - Błąd połączenia! + Błąd połączenia! Used: Wykorzystano: + + Ubuntu One authorization has failed. Try once again or check login settings. + Autoryzacja w Ubuntu One nie powiodła się. Spróbuj jeszcze raz lub sprawdź ustawienia logowania. + + + Unable to connect. Check internet connection. + Nie można połączyć z siecią. Sprawadź połączenie z Internetem. + + + Unknown error: + Nieznany błąd: + DialogYesNo @@ -51,8 +63,16 @@ DownloadArea No active downloads + Brak aktywnych pobrań + + + No active downloads or uploads Brak aktywnych pobrań + + Active downloads and uploads + Aktywne pobrania + FilesPage @@ -78,11 +98,11 @@ Root folder can't be renamed! - Nie można zmienić nazwy! + Nie można zmienić nazwy! Root folder can't be deleted! - Nie można zmienić nazwy! + Nie można zmienić nazwy! Authorization failed! @@ -122,7 +142,7 @@ Unable to connect! - Błąd połączenia! + Błąd połączenia! Enter new folder name: @@ -136,6 +156,45 @@ Empty Pusty + + Root folder cannot be renamed. + Nie można zmienić nazwy głównego foldera. + + + Root folder cannot be deleted. + Nie można usunąć głównego foldera. + + + Ubuntu One authorization has failed. Try once again or check login settings. + Autoryzacja w Ubuntu One nie powiodła się. Spróbuj jeszcze raz lub sprawdź ustawienia logowania. + + + Unable to connect. Check internet connection. + Nie można połączyć z siecią. Sprawadź połączenie z Internetem. + + + Unknown error: + Nieznany błąd: + + + + InitPage + + Ubuntu One authorization has failed. Try once again or check login settings. + Autoryzacja w Ubuntu One nie powiodła się. Spróbuj jeszcze raz lub sprawdź ustawienia logowania. + + + Unable to connect. Check internet connection. + Nie można połączyć z siecią. Sprawadź połączenie z Internetem. + + + Unknown error: + Nieznany błąd: + + + Connecting... + Łączenie... + LoginPage @@ -157,11 +216,11 @@ Authorization failed! - Autoryzacja nie powiodła się! + Autoryzacja nie powiodła się! Error: - Błąd: + Błąd: Login @@ -173,7 +232,19 @@ Unable to connect! - Błąd połączenia! + Błąd połączenia! + + + Ubuntu One authorization has failed. Try once again or check login settings. + Autoryzacja w Ubuntu One nie powiodła się. Spróbuj jeszcze raz lub sprawdź ustawienia logowania. + + + Unable to connect. Check internet connection. + Nie można połączyć z siecią. Sprawadź połączenie z Internetem. + + + Unknown error: + Nieznany błąd: @@ -192,11 +263,11 @@ Authorization failed! - Autoryzacja nie powiodła się! + Autoryzacja nie powiodła się! Error: - Błąd: + Błąd: Internal error! @@ -244,7 +315,7 @@ Unable to connect! - Błąd połączenia! + Błąd połączenia! Enter new file name: @@ -282,6 +353,18 @@ Copy Skopiuj + + Ubuntu One authorization has failed. Try once again or check login settings. + Autoryzacja w Ubuntu One nie powiodła się. Spróbuj jeszcze raz lub sprawdź ustawienia logowania. + + + Unknown error: + Nieznany błąd: + + + Unable to connect. Check internet connection. + Nie można połączyć z siecią. Sprawadź połączenie z Internetem. + SettingsPage @@ -366,26 +449,77 @@ + TaskMenu + + Account + Konto + + + Settings + Ustawienia + + + About Ubi + O Ubi + + + main Error while downloading! - Błąd podczas pobierania! + Błąd podczas pobierania! Error while uploading! - Błąd podczas wysyłania! + Błąd podczas wysyłania! File downloaded! - Plik został pobrany! + Plik został pobrany! File uploaded! - Plik został wysłany! + Plik został wysłany! File added to the queue! - Plik dodany do kolejki! + Plik dodany do kolejki! + + + File operation canceled! + Operacja anulowana! + + + <b>Ubi</b> + <b>Ubi</b> + + + <p>An unofficial Ubuntu One app for Maemo 5 and other Qt-enabled platforms.</p><p><small>http://ubi.garage.maemo.org</small></p><p><small>© 2012 Michal Kosciesza</small></p> + <p>Nieoficjalna aplikacja Ubuntu One dla Maemo 5 i innych platform obsługujących Qt.</p><p><small>http://ubi.garage.maemo.org</small></p><p><small>© 2012 Michal Kosciesza</small></p> + + + File downloaded. + Plik został pobrany. + + + File uploaded. + Plik został wysłany. + + + Error while downloading. + Błąd podczas pobierania. + + + Error while uploading. + Błąd podczas wysyłania. + + + File added to the queue. + Plik dodany do kolejki. + + + File operation canceled. + Operacja anulowana. diff --git a/ubi.pro b/ubi.pro index 620d29c..c399160 100644 --- a/ubi.pro +++ b/ubi.pro @@ -43,7 +43,7 @@ SOURCES += main.cpp \ utils.cpp # evil_hack_to_fool_lupdate -#include(translation.pri) +include(translation.pri) # Please do not modify the following two lines. Required for deployment. include(qmlapplicationviewer/qmlapplicationviewer.pri) @@ -70,5 +70,5 @@ HEADERS += \ TRANSLATIONS += translations/ubi.pl.ts -RESOURCES += \ - ubi.qrc +#RESOURCES += \ +# ubi.qrc diff --git a/ubi.pro.user b/ubi.pro.user index 20ef615..af67d63 100644 --- a/ubi.pro.user +++ b/ubi.pro.user @@ -1,6 +1,6 @@ - + ProjectExplorer.Project.ActiveTarget @@ -477,7 +477,7 @@ 2012-04-28T10:41:48 2012-05-03T18:56:53 2012-05-05T14:55:15 - 2012-05-06T15:26:36 + 2012-05-15T22:51:39 3 @@ -1064,8 +1064,8 @@ 0 1 4_7_2_m1_1_1 - 0 - s60_5_0 + 1 + s60_5_0_n97 1 Build diff --git a/ubi.zip b/ubi.zip index 229e53b0f27d203a5297b4838a175af86905803f..e2c24bb3e40ea62db0575e19355ac57383381912 100644 GIT binary patch delta 40480 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 GME?V#N7# zcdWX5$hup|#PO_6gt@dr0YqpoNNQjppf!+0zb59?y#ruWK=!<@`~V{s_}=?xgj4xL ze2o#rh4>JzFq)CbK{3@PENhCZCJ*$N=OpQ`072Gs(aaVu`5A3lv>1)f)fnv$tYim0 zIo9laYBS@8<=~b{N)S1FdFiq#9QE80QF^}PHf+QJm&)M$i4l@6JBuT)O`F6zo! zT06`)6!#2ufNUL@a65<@llT^D70C+~P817<=rRV%ZE%$Cn9ELzqnLuJVL`I$X z&q-?&-hth>Ym(!mrKvtSCe;kQhy*-r{cld0FBy-x-*yioMKYw>_+0PB1G5VXXQ`n) zFG@J2-+Ne+yI{8k`boIr0*@jYAA4bl4sZjkM6xl+v?iG#y%Qf4;Vz;YRGVbi;JS&a zm*ZVjS_CP)P2{8$o5nLD84-*n5Rt3ngpCrp)aVFH|L;nQ0sjB4p)BD4?;4sg{14Vp zK^hb+)$14-C-F3kw$Y%a53^B!oz4Uyup&_)Z)KZB9TW&C95&T(0hj>bY+>z0Z(glt zW4FPG^p&G;*u1br#LaH833(Rh*Rml^Wt8;C$T%U;lg-tV$40aHn}4%j7)2>V@(^}> z`_Rkd#=Bj(!I+75{^MeDnDzq??*en+2LKTPI?@~mlsjDxqxXl>XMs6{6mm-f**;gk z0ty@l42000tfVLOg?}VqQxMHR$!O{hMg*D>v+1S}u}xaA!c$dfQf`Ek3bHCF<~cxR zCe{UN<2&x>lk9|a(mWEO?BJy)CqY&;#eV4OFly^!il}a(b62D^7}2pg&IgaR3#mCAT3e%oe4* zPRfU}hA6&B2R+k77E3d6*IqX5WG3^<**gptZ@UIeUX%Ag1=kg*Hb$xZ1!st3jkh#I zkW@gmIbs*25`E79Bw>o}XA3O(Uqh(db zO=uZy#YO=@2uJczvcT!!(y?XHNVwbD*t?znrpO#V!PpLFHo9>wrlBJW zC+H9{b#PuUCN?&ZPUhTXh%!(l&Z{af^SlV9{Hv(L<`|78D#tNrOZ7RhH0+`MStlVasaG&;n^&!~f7Nys?L6s66U5NqW`Qx3D0KcN@zYb-w4Am! ztJ>9}e#$QE3VlN)BYF5SoQQ7|#%8ob^qt{9#}N$(2nq_w^6zU+luX@w3j_%09Rdi5 z5Ge5h20Jz892hFqSLpAT;vzGMQg~5oUI8Ytq?~y?SI!mD7Ioq7Ksp*uj`LuZ)lM$E@-hc$%89%h zI3o_8)w~lKt4JK!vPq5C>#QxDXxjdJoD{Akw3?o8#(>TtN`>B7+BU*;c(i5YW+_r5Yh$JjKE2!LeH}-=y$x7L;6;W~T*Jatrg-Vg!;LXPa4`{iAU#BD z99%B4*|Y(i#>6X0zboVxY6j3{h5L-wG=sK1K2Fhg+@0op&4c~B)pHV*w5{q5F`PJA zJ*q4!rv9kC0n+!bJPk3M8*$ZiU~s26b*LePPSroE-?y%3rnG?yLU?4GocVK7rhyN3 z1j3v+ixeMyy5ptf%k@-^#z$WBR>ep8C#RU?^wTy}CN)BChj?v6PB}*W!HfpQ@zDLJ zD$}b)-@ZIf;({&IcoM^5q7QW(0@V#yIXb`VH|bF0<-EI0xn;GACU@$Z@^3i`A{>Do z;kEb@_h5u%xot=J&YiayD6&_v)gSJ)2RwE>64(Z-wyefp7egY(NUJ-N1<}q#!oBnN zp$C?}7T#c6V^x6`(1q zFhPjW=u}DDk{j6VQWRE`F�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 X$k3i{Xl@t!tzbYvSo{pFJ0tu*^meRz diff --git a/utils.cpp b/utils.cpp index 5a458f2..fef0803 100644 --- a/utils.cpp +++ b/utils.cpp @@ -14,15 +14,15 @@ Utils::Utils(QmlApplicationViewer *viewer, QSettings *settings, QObject *parent) void Utils::minimizeWindow() { - #if defined(Q_WS_MAEMO_5) - // This is needed for Maemo5 to recognize minimization - QDBusConnection connection = QDBusConnection::sessionBus(); - QDBusMessage message = QDBusMessage::createSignal( - "/","com.nokia.hildon_desktop","exit_app_view"); - connection.send(message); - #else - _viewer->setWindowState(Qt::WindowMinimized); - #endif +#if defined(Q_WS_MAEMO_5) + // This is needed for Maemo5 to recognize minimization + QDBusConnection connection = QDBusConnection::sessionBus(); + QDBusMessage message = QDBusMessage::createSignal( + "/","com.nokia.hildon_desktop","exit_app_view"); + connection.send(message); +#else + _viewer->setWindowState(Qt::WindowMinimized); +#endif } void Utils::setOrientation(const QString &orientation) @@ -243,9 +243,13 @@ void Utils::downloadFinished() emit downloadError(cur_filename); } } + else if (cur_reply->error() == QNetworkReply::OperationCanceledError) + { + emit operationCanceled(cur_filename); + } else { - qDebug() << "download error"; + //qDebug() << "download error"; emit downloadError(cur_filename); } @@ -284,6 +288,8 @@ void Utils::uploadFile(const QString &folder, const QString &filename, emit uploadAdded(filename); + //qDebug() << "utils.cpp:uploadFile url=" << url; + if(isFinished){ start(); } @@ -306,12 +312,16 @@ void Utils::uploadFinished() { emit fileUploaded(cur_filename); } + else if (cur_reply->error() == QNetworkReply::OperationCanceledError) + { + emit operationCanceled(cur_filename); + } else { int httpStatus = cur_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + //QString httpStatusMessage = cur_reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(); //QByteArray bytes = cur_reply->readAll(); - //qDebug() << "status: " << httpStatus << " " << httpStatusMessage; //qDebug() << "bytes: " << bytes; @@ -319,10 +329,9 @@ void Utils::uploadFinished() { emit fileUploaded(cur_filename); } else { - qDebug() << "upload error"; + //qDebug() << "upload error: " << httpStatus << " " << cur_reply->error() << " " << cur_reply->errorString(); emit uploadError(cur_filename); } - } cur_file->close(); @@ -351,8 +360,22 @@ void Utils::deleteFile(const QString &url, const QString &auth) QUrl _url(url); QNetworkRequest req(_url); + + /*qDebug() << "url1=" << url; + qDebug() << "url2=" << req.url().toString(); + qDebug() << "url3=" << req.url().path();*/ + //qDebug() << "auth: " << auth; req.setRawHeader("Authorization", auth.toAscii()); + + //qDebug() << "utils.cpp:uploadFile _nam=" << _nam->; + + /*QList l = req.rawHeaderList(); + QList::iterator i; + for(i=l.begin(); i!=l.end(); ++i) + qDebug() << "header=" << *i; + */ + temp_reply = _nam->deleteResource(req); connect(temp_reply,SIGNAL(finished()),this,SLOT(deleteFinished())); connect(temp_reply,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(error(QNetworkReply::NetworkError))); @@ -387,3 +410,33 @@ void Utils::setClipboardText(const QString &text) _clipboard->setText(text, QClipboard::Clipboard); _clipboard->setText(text, QClipboard::Selection); } + +bool Utils::isMaemo() +{ +#if defined(Q_WS_MAEMO_5) + return true; +#endif + return false; +} + +void Utils::cancelFile(const QString & filename) +{ + //qDebug() << "Utils::cancelFile"; + if(!isFinished && cur_filename==filename) + { + cur_reply->abort(); + } + else + { + int l = quee.size(); + for(int i=0;i