From 8155b301bb9abee0c772898c007eb790edde743f Mon Sep 17 00:00:00 2001 From: Jens Persson Date: Sat, 18 Jun 2011 17:08:04 +0200 Subject: [PATCH] huge update to qml --- data/panucci-all.conf | 1 + data/panucci.conf | 1 + data/ui/qml/AboutDialog.qml | 2 +- data/ui/qml/ContextMenu.qml | 27 ++- data/ui/qml/Filechooser.qml | 219 ++++++++++++++++++++++ data/ui/qml/FilechooserItem.qml | 20 ++ data/ui/qml/Playlist.qml | 183 ++++++++++++++++++ data/ui/qml/PlaylistItem.qml | 20 ++ data/ui/qml/SelectableItem.qml | 10 +- data/ui/qml/Settings.qml | 375 +++++++++++++++++++++++++++++++++++++ data/ui/qml/ShadowText.qml | 1 - data/ui/qml/config.js | 24 --- data/ui/qml/main.qml | 222 ++++++++++++++++++---- icons/add.png | Bin 0 -> 596 bytes icons/apply.png | Bin 0 -> 1553 bytes icons/cancel.png | Bin 0 -> 2026 bytes icons/clear.png | Bin 0 -> 1729 bytes icons/{gtk-close.png => close.png} | Bin icons/delete.png | Bin 0 -> 1754 bytes icons/file.png | Bin 0 -> 863 bytes icons/folder.png | Bin 0 -> 779 bytes icons/home.png | Bin 0 -> 1078 bytes icons/information.png | Bin 0 -> 1921 bytes icons/jump-to.png | Bin 0 -> 1331 bytes icons/left.png | Bin 0 -> 1157 bytes icons/remove.png | Bin 0 -> 335 bytes icons/right.png | Bin 0 -> 1132 bytes icons/up.png | Bin 0 -> 1042 bytes src/panucci/__init__.py | 2 +- src/panucci/playlist.py | 2 +- src/panucci/qmlui/qmlmain.py | 323 +++++++++++++++++++------------- 31 files changed, 1224 insertions(+), 208 deletions(-) create mode 100644 data/ui/qml/Filechooser.qml create mode 100644 data/ui/qml/FilechooserItem.qml create mode 100644 data/ui/qml/Playlist.qml create mode 100644 data/ui/qml/PlaylistItem.qml create mode 100644 data/ui/qml/Settings.qml delete mode 100644 data/ui/qml/config.js create mode 100644 icons/add.png create mode 100644 icons/apply.png create mode 100644 icons/cancel.png create mode 100644 icons/clear.png rename icons/{gtk-close.png => close.png} (100%) create mode 100644 icons/delete.png create mode 100644 icons/file.png create mode 100644 icons/folder.png create mode 100644 icons/home.png create mode 100644 icons/information.png create mode 100644 icons/jump-to.png create mode 100644 icons/left.png create mode 100644 icons/remove.png create mode 100644 icons/right.png create mode 100644 icons/up.png diff --git a/data/panucci-all.conf b/data/panucci-all.conf index 0b5f5fa..4f4a32e 100644 --- a/data/panucci-all.conf +++ b/data/panucci-all.conf @@ -27,6 +27,7 @@ main_height = 285 button_color = 633 button_border_color = 559 button_border_width = 6 +button_radius = 10 progress_color = 559 progress_background_color = 222 font_size = 14 diff --git a/data/panucci.conf b/data/panucci.conf index bae268e..e11f043 100644 --- a/data/panucci.conf +++ b/data/panucci.conf @@ -20,6 +20,7 @@ main_height = 285 button_color = 633 button_border_color = 559 button_border_width = 6 +button_radius = 10 progress_color = 559 progress_background_color = 222 font_size = 14 diff --git a/data/ui/qml/AboutDialog.qml b/data/ui/qml/AboutDialog.qml index d93a4dc..28101ce 100644 --- a/data/ui/qml/AboutDialog.qml +++ b/data/ui/qml/AboutDialog.qml @@ -70,7 +70,7 @@ Item { Image { anchors.centerIn: parent smooth: true - source: "gtk-close.png" + source: "close.png" } MouseArea { anchors.fill: parent diff --git a/data/ui/qml/ContextMenu.qml b/data/ui/qml/ContextMenu.qml index abdb6ab..6202846 100644 --- a/data/ui/qml/ContextMenu.qml +++ b/data/ui/qml/ContextMenu.qml @@ -1,8 +1,6 @@ import Qt 4.7 -import 'config.js' as Config - Item { id: contextMenuArea property variant items: [] @@ -13,32 +11,41 @@ Item { anchors.fill: parent } Rectangle { - color: "black" + color: "#" + config.background anchors.fill: parent opacity: .9 } ListView { model: contextMenuArea.items anchors.fill: parent - header: Item { height: Config.headerHeight * 2 } - footer: Item { height: Config.headerHeight } + header: Item { height: config.font_size * 5 + width: parent.width + MouseArea { anchors.fill: parent + onClicked: contextMenuArea.close() + } + } + footer: Item { height: config.font_size * 5 + width: parent.width + MouseArea { anchors.fill: parent + onClicked: contextMenuArea.close() + } + } delegate: SelectableItem { ShadowText { - anchors.leftMargin: Config.switcherWidth anchors { left: parent.left right: parent.right verticalCenter: parent.verticalCenter + leftMargin: config.font_size * 5 } - color: "white" + color: "#" + config.foreground font.pixelSize: parent.height * .3 - text: items[index].text + text: modelData.text } onSelected: { - contextMenuArea.response(index) contextMenuArea.close() - items[index].trigger() + modelData.trigger() } } } diff --git a/data/ui/qml/Filechooser.qml b/data/ui/qml/Filechooser.qml new file mode 100644 index 0000000..d80c817 --- /dev/null +++ b/data/ui/qml/Filechooser.qml @@ -0,0 +1,219 @@ + +import Qt 4.7 + +Item { + id: filechooserArea + signal close + property variant items: [] + property variant path: "" + property variant action: "" + + MouseArea { + anchors.fill: parent + } + Rectangle { + color: "#" + config.background + anchors.fill: parent + opacity: .9 + } + ListView { + id: filechooserView + width: root.width + height: root.height - config.button_height - config.button_border_width - config.font_size + 4 + model: filechooserArea.items + clip: true + currentIndex: -1 + header: Item { height: config.font_size } + footer: Item { height: config.font_size } + + highlight: Rectangle { color: "#" + config.progress_color + width: filechooserView.width + height: config.font_size * 3 + y: filechooserView.currentItem?filechooserView.currentItem.y:root.height + } + highlightFollowsCurrentItem: false + + delegate: FilechooserItem { + property variant item: modelData + Image { + x: 10 + source: modelData.directory ? "folder.png" : "file.png" + anchors { + verticalCenter: parent.verticalCenter + } + } + Text { + anchors { + left: parent.left + right: parent.right + verticalCenter: parent.verticalCenter + leftMargin: 40 + } + color: "#" + config.foreground + font.pixelSize: config.font_size + text: modelData.caption + } + onSelected: { + filechooserView.currentIndex = index + filechooserArea.path = modelData.path + "/" + modelData.caption + if (modelData.directory == true) { + filechooserView.currentIndex = -1 + main.filechooser_callback("open", filechooserArea.path) + + } + } + } + } + Rectangle { + width: root.width + height: config.font_size * 1.1 + x: 0 + y: root.height - config.button_height - textinput.height - config.button_border_width + color: "#" + config.progress_bg_color + } + TextInput { + id: textinput + width: root.width + x: 5 + y: root.height - config.button_height - textinput.height - config.button_border_width + color: "#" + config.foreground + font.pixelSize: config.font_size + text: filechooserArea.path + } + Rectangle { + x: 0 + y: root.height - config.button_height + color: "#" + config.button_color + width: config.button_width + height: config.button_height + border.color: "#" + config.button_border_color + border.width: config.button_border_width + radius: config.button_radius + smooth: true + + Image { + anchors.centerIn: parent + smooth: true + source: "home.png" + } + MouseArea { + anchors.fill: parent + onClicked: { filechooserView.currentIndex = -1 + main.filechooser_callback("open", "~") + } + } + } + Rectangle { + x: (config.button_width + config.button_border_width + 2) + y: root.height - config.button_height + color: "#" + config.button_color + width: config.button_width + height: config.button_height + border.color: "#" + config.button_border_color + border.width: config.button_border_width + radius: config.button_radius + smooth: true + + Image { + anchors.centerIn: parent + smooth: true + source: "left.png" + } + MouseArea { + anchors.fill: parent + } + } + Rectangle { + x: (config.button_width + config.button_border_width + 2) * 2 + y: root.height - config.button_height + color: "#" + config.button_color + width: config.button_width + height: config.button_height + border.color: "#" + config.button_border_color + border.width: config.button_border_width + radius: config.button_radius + smooth: true + + Image { + anchors.centerIn: parent + smooth: true + source: "right.png" + } + MouseArea { + anchors.fill: parent + } + } + Rectangle { + x: (config.button_width + config.button_border_width + 2) * 3 + y: root.height - config.button_height + color: "#" + config.button_color + width: config.button_width + height: config.button_height + border.color: "#" + config.button_border_color + border.width: config.button_border_width + radius: config.button_radius + smooth: true + + Image { + anchors.centerIn: parent + smooth: true + source: "up.png" + } + MouseArea { + anchors.fill: parent + onClicked: { filechooserView.currentIndex = -1 + if (filechooserView.currentItem) + main.filechooser_callback("up", filechooserView.currentItem.item.path) + else + main.filechooser_callback("up", filechooserArea.path) + } + } + } + Rectangle { + x: (config.button_width + config.button_border_width + 2) * 4 + y: root.height - config.button_height + color: "#" + config.button_color + width: config.button_width + height: config.button_height + border.color: "#" + config.button_border_color + border.width: config.button_border_width + radius: config.button_radius + smooth: true + + Image { + anchors.centerIn: parent + smooth: true + source: "cancel.png" + } + MouseArea { + anchors.fill: parent + onClicked: { filechooserView.currentIndex = -1 + filechooserArea.close() + } + } + } + Rectangle { + x: (config.button_width + config.button_border_width + 2) * 5 + y: root.height - config.button_height + color: "#" + config.button_color + width: config.button_width + height: config.button_height + border.color: "#" + config.button_border_color + border.width: config.button_border_width + radius: config.button_radius + smooth: true + + Image { + anchors.centerIn: parent + smooth: true + source: "apply.png" + } + MouseArea { + anchors.fill: parent + onClicked: { filechooserArea.close() + filechooserView.currentIndex = -1 + main.filechooser_callback(filechooserArea.action, textinput.text) + } + } + } +} diff --git a/data/ui/qml/FilechooserItem.qml b/data/ui/qml/FilechooserItem.qml new file mode 100644 index 0000000..806963b --- /dev/null +++ b/data/ui/qml/FilechooserItem.qml @@ -0,0 +1,20 @@ + +import Qt 4.7 + +Item { + id: filechooserItem + height: config.font_size * 3 + width: parent.width + signal selected() + + MouseArea { + id: mouseArea + acceptedButtons: Qt.LeftButton | Qt.RightButton + anchors.fill: parent + onClicked: { + if (mouse.button == Qt.LeftButton) { + filechooserItem.selected() + } + } + } +} diff --git a/data/ui/qml/Playlist.qml b/data/ui/qml/Playlist.qml new file mode 100644 index 0000000..6bcf154 --- /dev/null +++ b/data/ui/qml/Playlist.qml @@ -0,0 +1,183 @@ + +import Qt 4.7 + +Item { + id: playlistArea + signal close + property variant items: [] + + MouseArea { + anchors.fill: parent + } + Rectangle { + color: "#" + config.background + anchors.fill: parent + opacity: .9 + } + ListView { + id: playlistView + width: root.width + height: root.height - config.button_height - config.button_border_width + model: playlistArea.items + clip: true + header: Item { height: config.font_size } + footer: Item { height: config.font_size } + + highlight: Rectangle { color: "#" + config.progress_color + width: playlistView.width + height: config.font_size * 3 + y: playlistView.currentItem.y + } + highlightFollowsCurrentItem: false + + delegate: PlaylistItem { + property variant item: modelData + Text { + anchors { + left: parent.left + right: parent.right + verticalCenter: parent.verticalCenter + leftMargin: modelData.bookmark_id == "" ? config.font_size : config.font_size * 2 + } + color: "#" + config.foreground + font.pixelSize: config.font_size + text: modelData.caption + } + onSelected: { + playlistView.currentIndex = index + } + } + } + Rectangle { + x: 0 + y: root.height - config.button_height + color: "#" + config.button_color + width: config.button_width + height: config.button_height + border.color: "#" + config.button_border_color + border.width: config.button_border_width + radius: config.button_radius + smooth: true + + Image { + anchors.centerIn: parent + smooth: true + source: "add.png" + } + MouseArea { + anchors.fill: parent + onClicked: {action_add_media.trigger()} + } + } + Rectangle { + x: (config.button_width + config.button_border_width + 2) + y: root.height - config.button_height + color: "#" + config.button_color + width: config.button_width + height: config.button_height + border.color: "#" + config.button_border_color + border.width: config.button_border_width + radius: config.button_radius + smooth: true + + Image { + anchors.centerIn: parent + smooth: true + source: "remove.png" + } + MouseArea { + anchors.fill: parent + onClicked: { if (playlistView.currentItem) + main.remove_callback(playlistView.currentItem.item.item_id, playlistView.currentItem.item.bookmark_id) + } + } + } + Rectangle { + x: (config.button_width + config.button_border_width + 2) * 2 + y: root.height - config.button_height + color: "#" + config.button_color + width: config.button_width + height: config.button_height + border.color: "#" + config.button_border_color + border.width: config.button_border_width + radius: config.button_radius + smooth: true + + Image { + anchors.centerIn: parent + smooth: true + source: "jump-to.png" + } + MouseArea { + anchors.fill: parent + onClicked: { if (playlistView.currentItem) + main.jump_to_callback(playlistView.currentItem.item.item_id, playlistView.currentItem.item.bookmark_id) + } + } + } + Rectangle { + x: (config.button_width + config.button_border_width + 2) * 3 + y: root.height - config.button_height + color: "#" + config.button_color + width: config.button_width + height: config.button_height + border.color: "#" + config.button_border_color + border.width: config.button_border_width + radius: config.button_radius + smooth: true + + Image { + anchors.centerIn: parent + smooth: true + source: "information.png" + } + MouseArea { + anchors.fill: parent + onClicked: {playlistArea.close()} + } + } + Rectangle { + x: (config.button_width + config.button_border_width + 2) * 4 + y: root.height - config.button_height + color: "#" + config.button_color + width: config.button_width + height: config.button_height + border.color: "#" + config.button_border_color + border.width: config.button_border_width + radius: config.button_radius + smooth: true + + Image { + anchors.centerIn: parent + smooth: true + source: "clear.png" + } + MouseArea { + anchors.fill: parent + onClicked: { action_clear_playlist.trigger() + playlist.items = [] + } + } + } + Rectangle { + x: (config.button_width + config.button_border_width + 2) * 5 + y: root.height - config.button_height + color: "#" + config.button_color + width: config.button_width + height: config.button_height + border.color: "#" + config.button_border_color + border.width: config.button_border_width + radius: config.button_radius + smooth: true + + Image { + anchors.centerIn: parent + smooth: true + source: "close.png" + } + MouseArea { + anchors.fill: parent + onClicked: {playlistArea.close()} + } + } +} diff --git a/data/ui/qml/PlaylistItem.qml b/data/ui/qml/PlaylistItem.qml new file mode 100644 index 0000000..230d2b3 --- /dev/null +++ b/data/ui/qml/PlaylistItem.qml @@ -0,0 +1,20 @@ + +import Qt 4.7 + +Item { + id: playlistItem + height: config.font_size * 3 + width: parent.width + signal selected() + + MouseArea { + id: mouseArea + acceptedButtons: Qt.LeftButton | Qt.RightButton + anchors.fill: parent + onClicked: { + if (mouse.button == Qt.LeftButton) { + playlistItem.selected() + } + } + } +} diff --git a/data/ui/qml/SelectableItem.qml b/data/ui/qml/SelectableItem.qml index 4e50f6a..d7dbd4b 100644 --- a/data/ui/qml/SelectableItem.qml +++ b/data/ui/qml/SelectableItem.qml @@ -1,23 +1,21 @@ import Qt 4.7 -import 'config.js' as Config - Item { id: selectableItem signal selected(variant item) signal contextMenu(variant item) - height: Config.listItemHeight + height: config.font_size * 5 width: parent.width Rectangle { id: highlight - opacity: mouseArea.pressed?.2:0 - color: "white" + opacity: mouseArea.pressed?.5:0 + color: "#" + config.progress_color anchors.fill: parent - Behavior on opacity { NumberAnimation { duration: Config.slowTransition } } + Behavior on opacity { NumberAnimation { duration: 150 } } } MouseArea { diff --git a/data/ui/qml/Settings.qml b/data/ui/qml/Settings.qml new file mode 100644 index 0000000..32db7eb --- /dev/null +++ b/data/ui/qml/Settings.qml @@ -0,0 +1,375 @@ + +import Qt 4.7 + +Item { + id: settingsArea + signal close + + MouseArea { + anchors.fill: parent + onClicked: settingsArea.close() + } + Rectangle { + color: "#" + config.background + anchors.fill: parent + opacity: .9 + } + Flickable { + width: root.width - config.button_width - config.button_border_width + height: root.height + contentWidth: root.width - config.button_width - config.button_border_width + contentHeight: config.font_size * 44.5 + clip: true + + MouseArea { + anchors.fill: parent + onClicked: settingsArea.close() + } + Text { + y: config.font_size + anchors.horizontalCenter: parent.horizontalCenter + text: main_window_str + font.pixelSize: config.font_size * 1.5 + color: "#" + config.foreground + } + Rectangle { + id: action_scrolling_labels_button + property bool checked + checked: action_scrolling_labels.checked + y: config.font_size * 3.5 + anchors.horizontalCenter: parent.horizontalCenter + color: checked ? "#" + config.progress_color : "#" + config.progress_bg_color + width: config.font_size * 14 + height: config.font_size * 4 + radius: config.button_radius + smooth: true + + Text { + anchors.centerIn: parent + text: action_scrolling_labels.text + font.pixelSize: config.font_size + color: "#" + config.foreground + } + MouseArea { + anchors.fill: parent + onClicked: { if (action_scrolling_labels_button.checked) { + action_scrolling_labels_button.checked = false + } + else { + action_scrolling_labels_button.checked = true + } + } + } + } + Rectangle { + id: action_lock_progress_button + property bool checked + checked: action_lock_progress.checked + y: config.font_size * 8.5 + anchors.horizontalCenter: parent.horizontalCenter + color: checked ? "#" + config.progress_color : "#" + config.progress_bg_color + width: config.font_size * 14 + height: config.font_size * 4 + radius: config.button_radius + smooth: true + + Text { + anchors.centerIn: parent + text: action_lock_progress.text + font.pixelSize: config.font_size + color: "#" + config.foreground + } + MouseArea { + anchors.fill: parent + onClicked: { if (action_lock_progress_button.checked) { + action_lock_progress_button.checked = false + } + else { + action_lock_progress_button.checked = true + } + } + } + } + Rectangle { + id: action_dual_action_button + property bool checked + checked: action_dual_action.checked + y: config.font_size * 13.5 + anchors.horizontalCenter: parent.horizontalCenter + color: checked ? "#" + config.progress_color : "#" + config.progress_bg_color + width: config.font_size * 14 + height: config.font_size * 4 + radius: config.button_radius + smooth: true + + Text { + anchors.centerIn: parent + text: action_dual_action.text + font.pixelSize: config.font_size + color: "#" + config.foreground + } + MouseArea { + anchors.fill: parent + onClicked: { if (action_dual_action_button.checked) { + action_dual_action_button.checked = false + } + else { + action_dual_action_button.checked = true + } + } + } + } + Text { + y: config.font_size * 19 + anchors.horizontalCenter: parent.horizontalCenter + text: playback_str + font.pixelSize: config.font_size * 1.5 + color: "#" + config.foreground + } + + Rectangle { + id: action_stay_at_end_button + property bool checked + checked: action_stay_at_end.checked + y: config.font_size * 21.5 + anchors.horizontalCenter: parent.horizontalCenter + color: checked ? "#" + config.progress_color : "#" + config.progress_bg_color + width: config.font_size * 14 + height: config.font_size * 4 + radius: config.button_radius + smooth: true + + Text { + anchors.centerIn: parent + text: action_stay_at_end.text + font.pixelSize: config.font_size + color: "#" + config.foreground + } + MouseArea { + anchors.fill: parent + onClicked: { if (action_stay_at_end_button.checked) { + action_stay_at_end_button.checked = false + } + else { + action_stay_at_end_button.checked = true + } + } + } + } + Rectangle { + id: action_seek_back_button + property bool checked + checked: action_seek_back.checked + y: config.font_size * 26.5 + anchors.horizontalCenter: parent.horizontalCenter + color: checked ? "#" + config.progress_color : "#" + config.progress_bg_color + width: config.font_size * 14 + height: config.font_size * 4 + radius: config.button_radius + smooth: true + + Text { + anchors.centerIn: parent + text: action_seek_back.text + font.pixelSize: config.font_size + color: "#" + config.foreground + } + MouseArea { + anchors.fill: parent + onClicked: { if (action_seek_back_button.checked) { + action_seek_back_button.checked = false + } + else { + action_seek_back_button.checked = true + } + } + } + } + Rectangle { + id: action_resume_all_button + property bool checked + checked: action_resume_all.checked + y: config.font_size * 31.5 + anchors.horizontalCenter: parent.horizontalCenter + color: checked ? "#" + config.progress_color : "#" + config.progress_bg_color + width: config.font_size * 14 + height: config.font_size * 4 + radius: config.button_radius + smooth: true + + Text { + anchors.centerIn: parent + text: action_resume_all.text + font.pixelSize: config.font_size + color: "#" + config.foreground + } + MouseArea { + anchors.fill: parent + onClicked: { if (action_resume_all_button.checked) { + action_resume_all_button.checked = false + } + else { + action_resume_all_button.checked = true + } + } + } + } + Text { + y: config.font_size * 37 + anchors.horizontalCenter: parent.horizontalCenter + text: play_mode_str + font.pixelSize: config.font_size * 1.5 + color: "#" + config.foreground + } + Rectangle { + id: action_play_mode_all_button + property bool checked + checked: action_play_mode_all.checked + y: config.font_size * 39.5 + x: parent.width / 25 + color: checked ? "#" + config.progress_color : "#" + config.progress_bg_color + width: parent.width / 5 + height: config.font_size * 4 + radius: config.button_radius + smooth: true + + Text { + anchors.centerIn: parent + text: action_play_mode_all.text + font.pixelSize: config.font_size + color: "#" + config.foreground + } + MouseArea { + anchors.fill: parent + onClicked: { action_play_mode_all_button.checked = true + action_play_mode_single_button.checked = false + action_play_mode_random_button.checked = false + action_play_mode_repeat_button.checked = false + } + } + } + Rectangle { + id: action_play_mode_single_button + property bool checked + checked: action_play_mode_single.checked + width: parent.width / 5 + height: config.font_size * 4 + y: config.font_size * 39.5 + x: (parent.width / 25 * 2) + width + color: checked ? "#" + config.progress_color : "#" + config.progress_bg_color + radius: config.button_radius + smooth: true + + Text { + anchors.centerIn: parent + text: action_play_mode_single.text + font.pixelSize: config.font_size + color: "#" + config.foreground + } + MouseArea { + anchors.fill: parent + onClicked: { action_play_mode_all_button.checked = false + action_play_mode_single_button.checked = true + action_play_mode_random_button.checked = false + action_play_mode_repeat_button.checked = false + } + } + } + Rectangle { + id: action_play_mode_random_button + property bool checked + checked: action_play_mode_random.checked + width: parent.width / 5 + height: config.font_size * 4 + y: config.font_size * 39.5 + x: (parent.width / 25 * 3) + (width * 2) + color: checked ? "#" + config.progress_color : "#" + config.progress_bg_color + radius: config.button_radius + smooth: true + + Text { + anchors.centerIn: parent + text: action_play_mode_random.text + font.pixelSize: config.font_size + color: "#" + config.foreground + } + MouseArea { + anchors.fill: parent + onClicked: { action_play_mode_all_button.checked = false + action_play_mode_single_button.checked = false + action_play_mode_random_button.checked = true + action_play_mode_repeat_button.checked = false + } + } + } + Rectangle { + id: action_play_mode_repeat_button + property bool checked + checked: action_play_mode_repeat.checked + width: parent.width / 5 + height: config.font_size * 4 + y: config.font_size * 39.5 + x: (parent.width / 25 * 4) + (width * 3) + color: checked ? "#" + config.progress_color : "#" + config.progress_bg_color + radius: config.button_radius + smooth: true + + Text { + anchors.centerIn: parent + text: action_play_mode_repeat.text + font.pixelSize: config.font_size + color: "#" + config.foreground + } + MouseArea { + anchors.fill: parent + onClicked: { action_play_mode_all_button.checked = false + action_play_mode_single_button.checked = false + action_play_mode_random_button.checked = false + action_play_mode_repeat_button.checked = true + } + } + } + } + Rectangle { + x: root.width - config.button_width - config.button_border_width + y: root.height - config.button_height + width: config.button_width + height: config.button_height + color: "#" + config.button_color + border.color: "#" + config.button_border_color + border.width: config.button_border_width + radius: config.button_radius + smooth: true + + Image { + anchors.centerIn: parent + smooth: true + source: "apply.png" + } + MouseArea { + anchors.fill: parent + onClicked: { var i=0 + for (i=0;iOugAF8Zv-@?+OXe-qs-qr``MG^I>42VMaqZ=)1Z9c{e z7j3uO-8EU7n>`RnAT#F&nK?;lW~frGQujFk04-X$zR`-3G+icX0L-cT{O;((%8db} zS=M~Hw@-jHGweKnx?H4Bxko^v(``evc$?BQPuh!aXGTiIpaH`6ew@2?Uh1E!aBu!Rc?Z3X@4H)dt zDFHLU(ZLC!s&L}4^K93jv&j~IC9AK@{k<2v;W*>4b|>4~+zvg@gQtpvHwWMQ@rh2eOwgbz4G@Yye{C0Y3zVBNQ1Qy4! z1wml7TFs&;N~Z!iJUl!Da5fI0wYCaz4yp iK1rPan#}>K2KWtUKc8m0j#Od*00004m1)B$SF?VINpJ*%?Q=YoJdFg~gPo%YM|$D8(S%E_7+ z&+$AW?Kqnpx7Vb{YMd?s`;y0n#_3`kB`VcKBLH)o5>zSIxdGCKbeoR{L z{eB|`aOTpXsqMW@A7)u*$@+p0MDa2Rk^*&&hcCX6{pR{9lk(dl`Hcv`4R=?}!MdM5 zot{xJF-&fOfkMG)(a?ONduG~8ALXVOo*l|}SOACnnyTmKKkDJCCW(rusNS(ut2MkH z7oUJzVINdcacF2h=}y#6ESjIY>>$taL;6Pq5T!6`FC3iy?cNV|m6WaB)!2G`GNn?) z30gW%rFYnyH%!TxE%%0;P|NhNS{nm8MZ%UPbJzVU@KG4f9ypFY{SHNWRq3*eT{T6P zw5()~2q>%iW>Tl!x@ke~@(M+?>JEv==aBC|_2b5@v}Y}p4?zwUY**VPugAT8)vKSC zDCMyd9%2tztX7U0uL1r0KT}m_?`}<-eiv!lx?-=D$|wGv19Za zBe}&qFejxeogRC^>E;8^7`3MQ>o+^%jy3KsnU!6b#CQq)o_;i)udZA&XZ_mbv6JnO z5*z?XB!N*Xp{3*W#Ca_sj5$YG=blQ?b2L27C$)9G|z0|ukf$c#oKIF5tCV1P^}1J4g+i?p}5qq4G+oIih_w6?Z# zHk*z2dc9mQ801|p7snXm2_YO~j1xtX1HjaAyxA~bmV4bAI2!b`J`7YE3;+edc%G*m z$4LMvV~ncRYDukDQ$Y|Uv)N3|W;4yq%%u7G`HYm6m0|1Ft=yF>S9q7p#WTiu3~W$* zgvQ;z4wg2;eZeUJX}CrRk+fQ^l#q}htz5ZMB9bJ*=d_H2c**M17VDLyaCL@F}lgY$XDiytbPg7D-s8*|G8jXggrKK^G$;9I0 z<6$ruh8E$VCI&4K2*BZR;9;UAgdi?14syBtPM;tM;JC==-oLa&gAc-RNO=GN03v!+ zSaefwW^{L9a%BJjc-kv3FW1Y=%Pvk%EJ)SMFG>dhHrNJO5L3!r00000NkvXXu0mjf D!*uBK literal 0 HcwPel00001 diff --git a/icons/cancel.png b/icons/cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..bcf56b9cc61e73a18887c574ad49450d99ed3e3c GIT binary patch literal 2026 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 literal 0 HcwPel00001 diff --git a/icons/file.png b/icons/file.png new file mode 100644 index 0000000000000000000000000000000000000000..d106ca3c3e768df2c71825073c0ea24934951cac GIT binary patch literal 863 zcwPZt1EBngP)QM zgajy&&qPBEL88I1aHUI)3lpOF5&wff!@ZFhKcL`81pEOk+_`e22nsBS2?;?0n6?P_ z-g8{cOz&{%tu@AJCv)evd7pFUJ!gRbJjmU=e3S1=B-F#e53UN3&~L?lK}01*v??MW z1LpUDM61R;P7#Q30B75ZXgs!!LWy}ca)b21)aOa@s& zG7YDd5BHwk9ImdikCgz{gM?B})ZrSHMg@dO6@aBHQbyQB?yi+6;sUq|z|fTn0rpOc zuF+uw=c*YPI+4<)=y*U*CT=dFoYd}tD_)*98|UakT`6Z@lLv9)dMYO~gdI;7P=g0i z^MoQV#r6uq=ki5aB?CYL5q)KgNV(6*X*{uJN8%um4KRoUqz^oAer0v}N^ehJY_-G< z5y8spGJM~k2apD^?*bHn=KRETzEs@HX0w@Lk?c-CT>(L9JrUccg~z=-uIk);eQ{6Y%(%B zd- zo;}C0qrKF=ZBLGj4o`N-`Cw*x_Qsw7fQ^lM+m3~W*Ic-Gq2pWdKcHUU z+VNbiZnC^wWnp3QcbwVVqTM4)K6LpKgM;U3IESfXW|%5!hN@zwG~70&VwrpQAMOvB zn0V9%xpwsm0|Vz+S^da%qk)Q|s)#Bog7<=o(Da^4|H)q~xP9v;eSL?(3^fB&45La~1l4Fk?!+RBT2PUx@gk@wpq*LZ`DPEMOb9f1DnYt-jBpQ?+pawoEXn}$P?>(Xx0YQa$MJyCK z_SFFuNKCAnfUfD&hn3c2;X}9W-=^uWS}c|*6iO5e!TXXK8hgLoRStzTP-`i%lsPHr z0UCM0;cTT`?gk@$Lopx@4JD1;6(JV813rqjm^<(-M<0mP8L9y6ZkT3uM002ov JPDHLkV1fehQ?&p9 literal 0 HcwPel00001 diff --git a/icons/home.png b/icons/home.png new file mode 100644 index 0000000000000000000000000000000000000000..19450e1c2548352028a09c57c98a01fcff1a3bce GIT binary patch literal 1078 zcwPZE1j+k}P)Wwg3PF*hxe|R9J<@mtAZWRTRhnv%531Gu>rd zu!?PMw_gS+25X=Mr~+NlmhQ%&w4_-dOo$j0dBT`fALt9MrM{^Tkm!pV4ZIi((4=T0 zz9_~RB?R4m6KR38%+mdwnS1B@vTe8Bsh!!~gnx1#?#`KWe)pW2b9aD(#kj&__aExtCAx)+Z-);`s^P@UgA`_!6jFr4@iz`iZeI9m(f60g zyrr0y0sNupK5Mq1sjE+rIC;3GxuLOTdxLOe zN`a9_EbV zy5P{M#~<^)(;eC^NA4`(VL}6AEH6`aifBT^p6C4h^vqn1>&YLgl*q`XH34cnKRQub zDxc~(yjPyQAIE$w4TG_QEUgp7(mGn3>-dSO*(R}izf*~f{FDPw9UMGTA_<>$zq&`h z8&z>Xn#z0Ut1YDxq%{LA+iUr;$(dbJ^}bki^y>8`fSQhhHn-@!5PtndS&~F3aSaPe zt>E2fTbW0IPZqGXp_0EfHnY!Dzke(mxq6eUYaiHYIBpGe zAhfuq6KV=(ItLafUNNQVb^r(kDK>ze3h0D@8s<0TE1eMQ0FS%{s!l*?aVwzeHYz}f z0mH_*Z$*TdS2X)IlmKi70Ak^fgl&N3n42@X04!HP1W*cKBLGm!P`SxdQ~*jD9B?oQ zLOC>z17HA9OJU6cU$0C)j-GHbp_iFE)e0C4~@01q>3 w(=Q_z05<>u1$;ZM5(S_ENCPl`9Uhhb1J!51n=E+9;Q#;t07*qoM6N<$f`f(h@c;k- literal 0 HcwPel00001 diff --git a/icons/information.png b/icons/information.png new file mode 100644 index 0000000000000000000000000000000000000000..c3c07e15de54e222cbee38e5151b1d36a3f13760 GIT binary patch literal 1921 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 yvd!iG1_c literal 0 HcwPel00001 diff --git a/icons/up.png b/icons/up.png new file mode 100644 index 0000000000000000000000000000000000000000..0b86ba283e1f1aa6eaf8bd7b40630255f022d13f GIT binary patch literal 1042 zcwPY#1nv8YP)#UvH3vnYxn#-Hf z`+jfc?b{(C1oqOTJyrkT13b5w>N~vnrM4#k)6*&0C~H@gvi0-C#5c-g1)x+)`ip6o zhllo09Xv4jLVl?5BQ0L`Jr)2WQ2bZzyMs>-&Q6XW)sBuGQU?bDCu8N6?}H!UNNWQL%A5 zTf*2_R0{^!nfOBHLQen^dL}h67<~8SiDPW_Zv&;W)rc9Ug|(c4(a|W=RR7ztWO`{= z0b&c8kM@Q7Kb(2#7`u}*P&BG7IfiK=d*8(9XoRVL{|9kB^XaYtB=mFdg@Ww!*QTCl zYk3oeQf0?n!?chuSx6iiVM?F;SzOP&|DOPk=*w>f`nB_?rpEi%^Ct4eoyD6Wil&2T zY($e~Ig`-S@BAx(_+0vorn0YQr^i`#vx1FHv!i%3gjwYni5}8O@?D6{pMS#>Kvd5p zwSfQI(=+2NSE?dgD0eO1fT-B0I>1vS!y3urVj{V$cLflcTbf~h<0CEEY2ZSD^O`$cplle(-d#5w&S!63{p5NJKq7f=!Xf^PL|_smt9e6NmZgQ$ z$CY*f_crbWu9+qr(s1+U9}Wp&H?wgFg@6ZwNZ#nfJ#LEt^Hc`WcLCQ`2aNBsTLIgkcbd@A_y)797i;sT5t=F zEx-kb!ym@BOxZf5gxdQ?L}Uvg_>KVW%;CcK)3xhuW6hoEqDum= 0 and dur_int >= 0: self.set_progress_callback( pos_int, dur_int ) - self.on_set_progress.emit() return True def get_play_pause_icon_path(self): @@ -423,19 +441,19 @@ class PanucciGUI(QtCore.QObject, ObservableService): def get_artist_str(self): if self.metadata: - return self.metadata.get('artist', 0) + return self.metadata.get('artist', 0).decode('utf-8') else: return "" def get_album_str(self): if self.metadata: - return self.metadata.get('album', 0) + return self.metadata.get('album', 0).decode('utf-8') else: return "" def get_title_str(self): if self.metadata: - return self.metadata.get('title', 0) + return self.metadata.get('title', 0).decode('utf-8') else: return "" @@ -445,7 +463,7 @@ class PanucciGUI(QtCore.QObject, ObservableService): def get_cover_str(self): if self.metadata and self.metadata.has_key('image') and self.metadata['image']: - return "image://cover" + return "image://cover/" + os.urandom(10) else: return "" @@ -473,7 +491,6 @@ class PanucciGUI(QtCore.QObject, ObservableService): if self.metadata: estimated_length = self.metadata.get('length', 0) self.set_progress_callback( 0, estimated_length ) - self.on_set_progress.emit() #self.set_controls_sensitivity(False) def on_player_playing(self): @@ -493,14 +510,12 @@ class PanucciGUI(QtCore.QObject, ObservableService): self.time_str = "00:00 / 00:00" self.progress_fraction = 0 self.metadata = None - #self.label_cover.hide() self.on_set_progress.emit() self.on_set_metadata.emit() self.main_window.setWindowTitle("Panucci") def on_player_new_metadata(self): self.metadata = self.playlist.get_file_metadata() - #self.set_metadata(self.metadata) position = self.playlist.get_current_position() estimated_length = self.metadata.get('length', 0) self.set_progress_callback(position, estimated_length) @@ -510,7 +525,7 @@ class PanucciGUI(QtCore.QObject, ObservableService): _title = self.metadata["title"] if len(_title) > 25: _title = _title[:24] + '...' - self.main_window.setWindowTitle(_title) + self.main_window.setWindowTitle(_title.decode('utf-8')) def on_player_end_of_playlist(self, loop): if not loop: @@ -520,8 +535,6 @@ class PanucciGUI(QtCore.QObject, ObservableService): def on_player_reset_playlist(self): self.on_player_stopped() self.on_player_new_track() - self.reset_progress() - self.main_window.setWindowTitle("Panucci") @QtCore.Slot(str) def open_external_url(self, url): @@ -538,3 +551,59 @@ class ImageProvider(QtDeclarative.QDeclarativeImageProvider): pixmap.loadFromData(self.__main.metadata['image']) pixmap = pixmap.scaled(size, size, mode=QtCore.Qt.SmoothTransformation) return pixmap + +class PlaylistItem(QtCore.QObject): + def __init__(self, _id, _caption, _bookmark, _position): + QtCore.QObject.__init__(self) + if isinstance(_caption, str): + _caption = _caption.decode('utf-8') + self._caption = _caption + self._id = _id + self._bookmark = _bookmark + self._position = _position + + changed = QtCore.Signal() + + def _get_id(self): + return self._id + + def _get_caption(self): + return self._caption + + def _get_bookmark(self): + return self._bookmark + + def _get_position(self): + return self._position + + item_id = QtCore.Property(str, _get_id, notify=changed) + caption = QtCore.Property(unicode, _get_caption, notify=changed) + bookmark_id = QtCore.Property(str, _get_bookmark, notify=changed) + position = QtCore.Property(str, _get_position, notify=changed) + +class FilechooserItem(QtCore.QObject): + def __init__(self, _caption, _path, _directory): + QtCore.QObject.__init__(self) + if isinstance(_caption, str): + _caption = _caption.decode('utf-8') + if isinstance(_path, str): + _path = _path.decode('utf-8') + + self._caption = _caption + self._path = _path + self._directory = _directory + + changed = QtCore.Signal() + + def _get_caption(self): + return self._caption + + def _get_path(self): + return self._path + + def _get_directory(self): + return self._directory + + caption = QtCore.Property(unicode, _get_caption, notify=changed) + path = QtCore.Property(unicode, _get_path, notify=changed) + directory = QtCore.Property(bool, _get_directory, notify=changed) -- 2.11.4.GIT