From a468b3727df1bb667349321eee7007e5a512617d Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 17 Jun 2019 16:05:51 -0700 Subject: [PATCH] further development on rewrite --- app/CMakeLists.txt | 16 +- app/core.cpp | 74 ++++++ app/core.h | 27 ++ app/main.cpp | 12 +- app/panel/CMakeLists.txt | 2 + app/panel/project/CMakeLists.txt | 22 ++ app/panel/project/project.cpp | 41 ++++ app/panel/project/project.h | 20 ++ app/panel/timeline/CMakeLists.txt | 22 ++ app/panel/timeline/timeline.cpp | 21 ++ app/panel/timeline/timeline.h | 19 ++ app/panel/viewer/viewer.cpp | 17 ++ app/panel/viewer/viewer.h | 5 + app/render/CMakeLists.txt | 5 +- app/render/gl/CMakeLists.txt | 25 ++ app/render/{ => gl}/glfunc.cpp | 20 +- app/render/{ => gl}/glfunc.h | 5 +- app/render/gl/shadergenerators.cpp | 230 ++++++++++++++++++ app/render/gl/shadergenerators.h | 34 +++ .../shaderptr.h} | 2 +- app/ui/CMakeLists.txt | 30 +++ {cursors => app/ui/cursors}/1_left.svg | 0 {cursors => app/ui/cursors}/1_right.svg | 0 {cursors => app/ui/cursors}/2.svg | 0 {cursors => app/ui/cursors}/3_left.svg | 0 {cursors => app/ui/cursors}/3_right.svg | 0 {cursors => app/ui/cursors}/4.svg | 0 {cursors => app/ui/cursors}/5.svg | 0 {cursors => app/ui/cursors}/5b.svg | 0 {cursors => app/ui/cursors}/5c.svg | 0 app/ui/cursors/CMakeLists.txt | 21 ++ {cursors => app/ui/cursors}/cursors.qrc | 0 app/ui/graphics/CMakeLists.txt | 21 ++ app/ui/graphics/graphics.qrc | 6 + {icons => app/ui/graphics}/olive-splash.png | Bin {icons => app/ui/graphics}/throbber.png | Bin app/ui/icons/CMakeLists.txt | 28 +++ app/ui/icons/add-button.128.png | Bin 0 -> 1454 bytes app/ui/icons/add-button.16.png | Bin 0 -> 412 bytes app/ui/icons/add-button.32.png | Bin 0 -> 510 bytes app/ui/icons/add-button.64.png | Bin 0 -> 806 bytes app/ui/icons/add-effect.128.png | Bin 0 -> 1855 bytes app/ui/icons/add-effect.16.png | Bin 0 -> 431 bytes app/ui/icons/add-effect.32.png | Bin 0 -> 573 bytes app/ui/icons/add-effect.64.png | Bin 0 -> 1023 bytes app/ui/icons/add-transition.128.png | Bin 0 -> 1904 bytes app/ui/icons/add-transition.16.png | Bin 0 -> 465 bytes app/ui/icons/add-transition.32.png | Bin 0 -> 641 bytes app/ui/icons/add-transition.64.png | Bin 0 -> 1104 bytes app/ui/icons/align-center.128.png | Bin 0 -> 375 bytes app/ui/icons/align-center.16.png | Bin 0 -> 176 bytes app/ui/icons/align-center.32.png | Bin 0 -> 192 bytes app/ui/icons/align-center.64.png | Bin 0 -> 256 bytes app/ui/icons/align-left.128.png | Bin 0 -> 364 bytes app/ui/icons/align-left.16.png | Bin 0 -> 173 bytes app/ui/icons/align-left.32.png | Bin 0 -> 193 bytes app/ui/icons/align-left.64.png | Bin 0 -> 252 bytes app/ui/icons/align-right.128.png | Bin 0 -> 361 bytes app/ui/icons/align-right.16.png | Bin 0 -> 170 bytes app/ui/icons/align-right.32.png | Bin 0 -> 189 bytes app/ui/icons/align-right.64.png | Bin 0 -> 248 bytes app/ui/icons/arrow.128.png | Bin 0 -> 1815 bytes app/ui/icons/arrow.16.png | Bin 0 -> 429 bytes app/ui/icons/arrow.32.png | Bin 0 -> 625 bytes app/ui/icons/arrow.64.png | Bin 0 -> 1080 bytes app/ui/icons/audiosource.128.png | Bin 0 -> 1571 bytes app/ui/icons/audiosource.16.png | Bin 0 -> 371 bytes app/ui/icons/audiosource.32.png | Bin 0 -> 506 bytes app/ui/icons/audiosource.64.png | Bin 0 -> 872 bytes app/ui/icons/beam.128.png | Bin 0 -> 1216 bytes app/ui/icons/beam.16.png | Bin 0 -> 349 bytes app/ui/icons/beam.32.png | Bin 0 -> 422 bytes app/ui/icons/beam.64.png | Bin 0 -> 658 bytes app/ui/icons/bold.128.png | Bin 0 -> 217 bytes app/ui/icons/bold.16.png | Bin 0 -> 149 bytes app/ui/icons/bold.32.png | Bin 0 -> 157 bytes app/ui/icons/bold.64.png | Bin 0 -> 170 bytes app/ui/icons/clock.128.png | Bin 0 -> 3684 bytes app/ui/icons/clock.16.png | Bin 0 -> 584 bytes app/ui/icons/clock.32.png | Bin 0 -> 969 bytes app/ui/icons/clock.64.png | Bin 0 -> 1840 bytes app/ui/icons/diamond.128.png | Bin 0 -> 1421 bytes app/ui/icons/diamond.16.png | Bin 0 -> 380 bytes app/ui/icons/diamond.32.png | Bin 0 -> 498 bytes app/ui/icons/diamond.64.png | Bin 0 -> 777 bytes app/ui/icons/dirup.128.png | Bin 0 -> 1452 bytes app/ui/icons/dirup.16.png | Bin 0 -> 423 bytes app/ui/icons/dirup.32.png | Bin 0 -> 530 bytes app/ui/icons/dirup.64.png | Bin 0 -> 813 bytes app/ui/icons/error.128.png | Bin 0 -> 3607 bytes app/ui/icons/error.16.png | Bin 0 -> 614 bytes app/ui/icons/error.32.png | Bin 0 -> 1039 bytes app/ui/icons/error.64.png | Bin 0 -> 1873 bytes app/ui/icons/ff.128.png | Bin 0 -> 1451 bytes app/ui/icons/ff.16.png | Bin 0 -> 383 bytes app/ui/icons/ff.32.png | Bin 0 -> 569 bytes app/ui/icons/ff.64.png | Bin 0 -> 820 bytes app/ui/icons/folder.128.png | Bin 0 -> 818 bytes app/ui/icons/folder.16.png | Bin 0 -> 349 bytes app/ui/icons/folder.32.png | Bin 0 -> 388 bytes app/ui/icons/folder.64.png | Bin 0 -> 525 bytes app/ui/icons/genicons.sh | 63 +++++ app/ui/icons/hand.128.png | Bin 0 -> 3383 bytes app/ui/icons/hand.16.png | Bin 0 -> 541 bytes app/ui/icons/hand.32.png | Bin 0 -> 934 bytes app/ui/icons/hand.64.png | Bin 0 -> 1709 bytes app/ui/icons/icons.cpp | 59 +++++ app/ui/icons/icons.h | 33 +++ app/ui/icons/icons.qrc | 204 ++++++++++++++++ app/ui/icons/iconview.128.png | Bin 0 -> 916 bytes app/ui/icons/iconview.16.png | Bin 0 -> 398 bytes app/ui/icons/iconview.32.png | Bin 0 -> 537 bytes app/ui/icons/iconview.64.png | Bin 0 -> 534 bytes app/ui/icons/imagesource.128.png | Bin 0 -> 1845 bytes app/ui/icons/imagesource.16.png | Bin 0 -> 454 bytes app/ui/icons/imagesource.32.png | Bin 0 -> 678 bytes app/ui/icons/imagesource.64.png | Bin 0 -> 1074 bytes app/ui/icons/italic.128.png | Bin 0 -> 1227 bytes app/ui/icons/italic.16.png | Bin 0 -> 268 bytes app/ui/icons/italic.32.png | Bin 0 -> 385 bytes app/ui/icons/italic.64.png | Bin 0 -> 633 bytes app/ui/icons/justify-center.128.png | Bin 0 -> 364 bytes app/ui/icons/justify-center.16.png | Bin 0 -> 176 bytes app/ui/icons/justify-center.32.png | Bin 0 -> 190 bytes app/ui/icons/justify-center.64.png | Bin 0 -> 247 bytes app/ui/icons/listview.128.png | Bin 0 -> 831 bytes app/ui/icons/listview.16.png | Bin 0 -> 333 bytes app/ui/icons/listview.32.png | Bin 0 -> 422 bytes app/ui/icons/listview.64.png | Bin 0 -> 516 bytes app/ui/icons/magnet.128.png | Bin 0 -> 2716 bytes app/ui/icons/magnet.16.png | Bin 0 -> 521 bytes app/ui/icons/magnet.32.png | Bin 0 -> 739 bytes app/ui/icons/magnet.64.png | Bin 0 -> 1415 bytes app/ui/icons/new.128.png | Bin 0 -> 1053 bytes app/ui/icons/new.16.png | Bin 0 -> 419 bytes app/ui/icons/new.32.png | Bin 0 -> 504 bytes app/ui/icons/new.64.png | Bin 0 -> 667 bytes app/ui/icons/next.128.png | Bin 0 -> 1529 bytes app/ui/icons/next.16.png | Bin 0 -> 402 bytes app/ui/icons/next.32.png | Bin 0 -> 579 bytes app/ui/icons/next.64.png | Bin 0 -> 855 bytes app/ui/icons/open.128.png | Bin 0 -> 1334 bytes app/ui/icons/open.16.png | Bin 0 -> 479 bytes app/ui/icons/open.32.png | Bin 0 -> 618 bytes app/ui/icons/open.64.png | Bin 0 -> 826 bytes app/ui/icons/pause.128.png | Bin 0 -> 791 bytes app/ui/icons/pause.16.png | Bin 0 -> 311 bytes app/ui/icons/pause.32.png | Bin 0 -> 336 bytes app/ui/icons/pause.64.png | Bin 0 -> 484 bytes app/ui/icons/play.128.png | Bin 0 -> 1307 bytes app/ui/icons/play.16.png | Bin 0 -> 371 bytes app/ui/icons/play.32.png | Bin 0 -> 530 bytes app/ui/icons/play.64.png | Bin 0 -> 795 bytes app/ui/icons/prev.128.png | Bin 0 -> 1553 bytes app/ui/icons/prev.16.png | Bin 0 -> 409 bytes app/ui/icons/prev.32.png | Bin 0 -> 578 bytes app/ui/icons/prev.64.png | Bin 0 -> 881 bytes app/ui/icons/razor.128.png | Bin 0 -> 1404 bytes app/ui/icons/razor.16.png | Bin 0 -> 391 bytes app/ui/icons/razor.32.png | Bin 0 -> 497 bytes app/ui/icons/razor.64.png | Bin 0 -> 779 bytes app/ui/icons/record.128.png | Bin 0 -> 1449 bytes app/ui/icons/record.16.png | Bin 0 -> 361 bytes app/ui/icons/record.32.png | Bin 0 -> 491 bytes app/ui/icons/record.64.png | Bin 0 -> 814 bytes app/ui/icons/redo.128.png | Bin 0 -> 1573 bytes app/ui/icons/redo.16.png | Bin 0 -> 360 bytes app/ui/icons/redo.32.png | Bin 0 -> 529 bytes app/ui/icons/redo.64.png | Bin 0 -> 885 bytes app/ui/icons/rew.128.png | Bin 0 -> 1577 bytes app/ui/icons/rew.16.png | Bin 0 -> 389 bytes app/ui/icons/rew.32.png | Bin 0 -> 553 bytes app/ui/icons/rew.64.png | Bin 0 -> 848 bytes app/ui/icons/ripple.128.png | Bin 0 -> 1768 bytes app/ui/icons/ripple.16.png | Bin 0 -> 445 bytes app/ui/icons/ripple.32.png | Bin 0 -> 629 bytes app/ui/icons/ripple.64.png | Bin 0 -> 986 bytes app/ui/icons/rolling.128.png | Bin 0 -> 2554 bytes app/ui/icons/rolling.16.png | Bin 0 -> 450 bytes app/ui/icons/rolling.32.png | Bin 0 -> 710 bytes app/ui/icons/rolling.64.png | Bin 0 -> 1070 bytes app/ui/icons/save.128.png | Bin 0 -> 1228 bytes app/ui/icons/save.16.png | Bin 0 -> 452 bytes app/ui/icons/save.32.png | Bin 0 -> 578 bytes app/ui/icons/save.64.png | Bin 0 -> 759 bytes app/ui/icons/sequence.128.png | Bin 0 -> 928 bytes app/ui/icons/sequence.16.png | Bin 0 -> 358 bytes app/ui/icons/sequence.32.png | Bin 0 -> 366 bytes app/ui/icons/sequence.64.png | Bin 0 -> 545 bytes app/ui/icons/slide.128.png | Bin 0 -> 1781 bytes app/ui/icons/slide.16.png | Bin 0 -> 429 bytes app/ui/icons/slide.32.png | Bin 0 -> 610 bytes app/ui/icons/slide.64.png | Bin 0 -> 996 bytes app/ui/icons/slip.128.png | Bin 0 -> 1818 bytes app/ui/icons/slip.16.png | Bin 0 -> 462 bytes app/ui/icons/slip.32.png | Bin 0 -> 631 bytes app/ui/icons/slip.64.png | Bin 0 -> 997 bytes {icons => app/ui/icons/svg}/add-button.svg | 0 {icons => app/ui/icons/svg}/add-effect.svg | 0 .../ui/icons/svg}/add-transition.svg | 0 {icons => app/ui/icons/svg}/align-center.svg | 0 {icons => app/ui/icons/svg}/align-left.svg | 0 {icons => app/ui/icons/svg}/align-right.svg | 0 {icons => app/ui/icons/svg}/arrow.svg | 0 {icons => app/ui/icons/svg}/audiosource.svg | 0 {icons => app/ui/icons/svg}/beam.svg | 0 {icons => app/ui/icons/svg}/bold.svg | 0 {icons => app/ui/icons/svg}/clock.svg | 0 {icons => app/ui/icons/svg}/diamond.svg | 0 {icons => app/ui/icons/svg}/dirup.svg | 0 {icons => app/ui/icons/svg}/error.svg | 0 {icons => app/ui/icons/svg}/ff.svg | 0 {icons => app/ui/icons/svg}/folder.svg | 0 {icons => app/ui/icons/svg}/hand.svg | 0 {icons => app/ui/icons/svg}/iconview.svg | 0 {icons => app/ui/icons/svg}/imagesource.svg | 0 {icons => app/ui/icons/svg}/italic.svg | 0 .../ui/icons/svg}/justify-center.svg | 0 {icons => app/ui/icons/svg}/listview.svg | 0 {icons => app/ui/icons/svg}/magnet.svg | 0 {icons => app/ui/icons/svg}/new.svg | 0 {icons => app/ui/icons/svg}/next.svg | 0 {icons => app/ui/icons/svg}/open.svg | 0 {icons => app/ui/icons/svg}/pause.svg | 0 {icons => app/ui/icons/svg}/play.svg | 0 {icons => app/ui/icons/svg}/prev.svg | 0 {icons => app/ui/icons/svg}/razor.svg | 0 {icons => app/ui/icons/svg}/record.svg | 0 {icons => app/ui/icons/svg}/redo.svg | 0 {icons => app/ui/icons/svg}/rew.svg | 0 {icons => app/ui/icons/svg}/ripple.svg | 0 {icons => app/ui/icons/svg}/rolling.svg | 0 {icons => app/ui/icons/svg}/save.svg | 0 {icons => app/ui/icons/svg}/sequence.svg | 0 {icons => app/ui/icons/svg}/slide.svg | 0 {icons => app/ui/icons/svg}/slip.svg | 0 .../ui/icons/svg}/transition-tool.svg | 0 {icons => app/ui/icons/svg}/treeview.svg | 0 {icons => app/ui/icons/svg}/tri-down.svg | 0 {icons => app/ui/icons/svg}/tri-left.svg | 0 {icons => app/ui/icons/svg}/tri-right.svg | 0 {icons => app/ui/icons/svg}/tri-up.svg | 0 {icons => app/ui/icons/svg}/underline.svg | 0 {icons => app/ui/icons/svg}/undo.svg | 0 {icons => app/ui/icons/svg}/videosource.svg | 0 {icons => app/ui/icons/svg}/zoomin.svg | 0 {icons => app/ui/icons/svg}/zoomout.svg | 0 app/ui/icons/transition-tool.128.png | Bin 0 -> 1152 bytes app/ui/icons/transition-tool.16.png | Bin 0 -> 370 bytes app/ui/icons/transition-tool.32.png | Bin 0 -> 440 bytes app/ui/icons/transition-tool.64.png | Bin 0 -> 662 bytes app/ui/icons/treeview.128.png | Bin 0 -> 920 bytes app/ui/icons/treeview.16.png | Bin 0 -> 332 bytes app/ui/icons/treeview.32.png | Bin 0 -> 379 bytes app/ui/icons/treeview.64.png | Bin 0 -> 538 bytes app/ui/icons/tri-down.128.png | Bin 0 -> 1457 bytes app/ui/icons/tri-down.16.png | Bin 0 -> 399 bytes app/ui/icons/tri-down.32.png | Bin 0 -> 563 bytes app/ui/icons/tri-down.64.png | Bin 0 -> 837 bytes app/ui/icons/tri-left.128.png | Bin 0 -> 1422 bytes app/ui/icons/tri-left.16.png | Bin 0 -> 357 bytes app/ui/icons/tri-left.32.png | Bin 0 -> 503 bytes app/ui/icons/tri-left.64.png | Bin 0 -> 776 bytes app/ui/icons/tri-right.128.png | Bin 0 -> 1451 bytes app/ui/icons/tri-right.16.png | Bin 0 -> 363 bytes app/ui/icons/tri-right.32.png | Bin 0 -> 505 bytes app/ui/icons/tri-right.64.png | Bin 0 -> 796 bytes app/ui/icons/tri-up.128.png | Bin 0 -> 1381 bytes app/ui/icons/tri-up.16.png | Bin 0 -> 392 bytes app/ui/icons/tri-up.32.png | Bin 0 -> 537 bytes app/ui/icons/tri-up.64.png | Bin 0 -> 832 bytes app/ui/icons/underline.128.png | Bin 0 -> 1303 bytes app/ui/icons/underline.16.png | Bin 0 -> 252 bytes app/ui/icons/underline.32.png | Bin 0 -> 353 bytes app/ui/icons/underline.64.png | Bin 0 -> 641 bytes app/ui/icons/undo.128.png | Bin 0 -> 1604 bytes app/ui/icons/undo.16.png | Bin 0 -> 360 bytes app/ui/icons/undo.32.png | Bin 0 -> 523 bytes app/ui/icons/undo.64.png | Bin 0 -> 905 bytes app/ui/icons/videosource.128.png | Bin 0 -> 1281 bytes app/ui/icons/videosource.16.png | Bin 0 -> 412 bytes app/ui/icons/videosource.32.png | Bin 0 -> 496 bytes app/ui/icons/videosource.64.png | Bin 0 -> 780 bytes app/ui/icons/zoomin.128.png | Bin 0 -> 3775 bytes app/ui/icons/zoomin.16.png | Bin 0 -> 581 bytes app/ui/icons/zoomin.32.png | Bin 0 -> 1021 bytes app/ui/icons/zoomin.64.png | Bin 0 -> 1921 bytes app/ui/icons/zoomout.128.png | Bin 0 -> 3580 bytes app/ui/icons/zoomout.16.png | Bin 0 -> 557 bytes app/ui/icons/zoomout.32.png | Bin 0 -> 996 bytes app/ui/icons/zoomout.64.png | Bin 0 -> 1828 bytes app/ui/style/CMakeLists.txt | 22 ++ app/ui/style/style.cpp | 44 ++++ app/ui/style/style.h | 12 + app/widget/CMakeLists.txt | 2 + app/widget/panel/panel.cpp | 4 +- app/widget/panel/panel.h | 1 + app/widget/playbackcontrols/CMakeLists.txt | 22 ++ .../playbackcontrols/playbackcontrols.cpp | 89 +++++++ .../playbackcontrols/playbackcontrols.h | 29 +++ .../projectexplorer/projectexplorer.cpp | 4 +- app/widget/projectexplorer/projectexplorer.h | 6 +- app/widget/projecttoolbar/CMakeLists.txt | 22 ++ app/widget/projecttoolbar/projecttoolbar.cpp | 95 ++++++++ app/widget/projecttoolbar/projecttoolbar.h | 44 ++++ app/widget/viewer/viewer.cpp | 56 +---- app/widget/viewer/viewer.h | 6 +- app/widget/viewer/viewerglwidget.cpp | 23 +- app/widget/viewer/viewerglwidget.h | 2 +- app/window/mainwindow/mainmenu.cpp | 6 + app/window/mainwindow/mainmenu.h | 11 + app/window/mainwindow/mainwindow.cpp | 10 +- icons/icons.qrc | 57 ----- icons/olive64.png | Bin 8354 -> 0 bytes 314 files changed, 1504 insertions(+), 147 deletions(-) create mode 100644 app/core.cpp create mode 100644 app/core.h create mode 100644 app/panel/project/CMakeLists.txt create mode 100644 app/panel/project/project.cpp create mode 100644 app/panel/project/project.h create mode 100644 app/panel/timeline/CMakeLists.txt create mode 100644 app/panel/timeline/timeline.cpp create mode 100644 app/panel/timeline/timeline.h create mode 100644 app/render/gl/CMakeLists.txt rename app/render/{ => gl}/glfunc.cpp (75%) rename app/render/{ => gl}/glfunc.h (75%) create mode 100644 app/render/gl/shadergenerators.cpp create mode 100644 app/render/gl/shadergenerators.h rename app/render/{qopenglshaderprogramptr.h => gl/shaderptr.h} (92%) create mode 100644 app/ui/CMakeLists.txt rename {cursors => app/ui/cursors}/1_left.svg (100%) rename {cursors => app/ui/cursors}/1_right.svg (100%) rename {cursors => app/ui/cursors}/2.svg (100%) rename {cursors => app/ui/cursors}/3_left.svg (100%) rename {cursors => app/ui/cursors}/3_right.svg (100%) rename {cursors => app/ui/cursors}/4.svg (100%) rename {cursors => app/ui/cursors}/5.svg (100%) rename {cursors => app/ui/cursors}/5b.svg (100%) rename {cursors => app/ui/cursors}/5c.svg (100%) create mode 100644 app/ui/cursors/CMakeLists.txt rename {cursors => app/ui/cursors}/cursors.qrc (100%) create mode 100644 app/ui/graphics/CMakeLists.txt create mode 100644 app/ui/graphics/graphics.qrc rename {icons => app/ui/graphics}/olive-splash.png (100%) rename {icons => app/ui/graphics}/throbber.png (100%) create mode 100644 app/ui/icons/CMakeLists.txt create mode 100644 app/ui/icons/add-button.128.png create mode 100644 app/ui/icons/add-button.16.png create mode 100644 app/ui/icons/add-button.32.png create mode 100644 app/ui/icons/add-button.64.png create mode 100644 app/ui/icons/add-effect.128.png create mode 100644 app/ui/icons/add-effect.16.png create mode 100644 app/ui/icons/add-effect.32.png create mode 100644 app/ui/icons/add-effect.64.png create mode 100644 app/ui/icons/add-transition.128.png create mode 100644 app/ui/icons/add-transition.16.png create mode 100644 app/ui/icons/add-transition.32.png create mode 100644 app/ui/icons/add-transition.64.png create mode 100644 app/ui/icons/align-center.128.png create mode 100644 app/ui/icons/align-center.16.png create mode 100644 app/ui/icons/align-center.32.png create mode 100644 app/ui/icons/align-center.64.png create mode 100644 app/ui/icons/align-left.128.png create mode 100644 app/ui/icons/align-left.16.png create mode 100644 app/ui/icons/align-left.32.png create mode 100644 app/ui/icons/align-left.64.png create mode 100644 app/ui/icons/align-right.128.png create mode 100644 app/ui/icons/align-right.16.png create mode 100644 app/ui/icons/align-right.32.png create mode 100644 app/ui/icons/align-right.64.png create mode 100644 app/ui/icons/arrow.128.png create mode 100644 app/ui/icons/arrow.16.png create mode 100644 app/ui/icons/arrow.32.png create mode 100644 app/ui/icons/arrow.64.png create mode 100644 app/ui/icons/audiosource.128.png create mode 100644 app/ui/icons/audiosource.16.png create mode 100644 app/ui/icons/audiosource.32.png create mode 100644 app/ui/icons/audiosource.64.png create mode 100644 app/ui/icons/beam.128.png create mode 100644 app/ui/icons/beam.16.png create mode 100644 app/ui/icons/beam.32.png create mode 100644 app/ui/icons/beam.64.png create mode 100644 app/ui/icons/bold.128.png create mode 100644 app/ui/icons/bold.16.png create mode 100644 app/ui/icons/bold.32.png create mode 100644 app/ui/icons/bold.64.png create mode 100644 app/ui/icons/clock.128.png create mode 100644 app/ui/icons/clock.16.png create mode 100644 app/ui/icons/clock.32.png create mode 100644 app/ui/icons/clock.64.png create mode 100644 app/ui/icons/diamond.128.png create mode 100644 app/ui/icons/diamond.16.png create mode 100644 app/ui/icons/diamond.32.png create mode 100644 app/ui/icons/diamond.64.png create mode 100644 app/ui/icons/dirup.128.png create mode 100644 app/ui/icons/dirup.16.png create mode 100644 app/ui/icons/dirup.32.png create mode 100644 app/ui/icons/dirup.64.png create mode 100644 app/ui/icons/error.128.png create mode 100644 app/ui/icons/error.16.png create mode 100644 app/ui/icons/error.32.png create mode 100644 app/ui/icons/error.64.png create mode 100644 app/ui/icons/ff.128.png create mode 100644 app/ui/icons/ff.16.png create mode 100644 app/ui/icons/ff.32.png create mode 100644 app/ui/icons/ff.64.png create mode 100644 app/ui/icons/folder.128.png create mode 100644 app/ui/icons/folder.16.png create mode 100644 app/ui/icons/folder.32.png create mode 100644 app/ui/icons/folder.64.png create mode 100755 app/ui/icons/genicons.sh create mode 100644 app/ui/icons/hand.128.png create mode 100644 app/ui/icons/hand.16.png create mode 100644 app/ui/icons/hand.32.png create mode 100644 app/ui/icons/hand.64.png create mode 100644 app/ui/icons/icons.cpp create mode 100644 app/ui/icons/icons.h create mode 100644 app/ui/icons/icons.qrc create mode 100644 app/ui/icons/iconview.128.png create mode 100644 app/ui/icons/iconview.16.png create mode 100644 app/ui/icons/iconview.32.png create mode 100644 app/ui/icons/iconview.64.png create mode 100644 app/ui/icons/imagesource.128.png create mode 100644 app/ui/icons/imagesource.16.png create mode 100644 app/ui/icons/imagesource.32.png create mode 100644 app/ui/icons/imagesource.64.png create mode 100644 app/ui/icons/italic.128.png create mode 100644 app/ui/icons/italic.16.png create mode 100644 app/ui/icons/italic.32.png create mode 100644 app/ui/icons/italic.64.png create mode 100644 app/ui/icons/justify-center.128.png create mode 100644 app/ui/icons/justify-center.16.png create mode 100644 app/ui/icons/justify-center.32.png create mode 100644 app/ui/icons/justify-center.64.png create mode 100644 app/ui/icons/listview.128.png create mode 100644 app/ui/icons/listview.16.png create mode 100644 app/ui/icons/listview.32.png create mode 100644 app/ui/icons/listview.64.png create mode 100644 app/ui/icons/magnet.128.png create mode 100644 app/ui/icons/magnet.16.png create mode 100644 app/ui/icons/magnet.32.png create mode 100644 app/ui/icons/magnet.64.png create mode 100644 app/ui/icons/new.128.png create mode 100644 app/ui/icons/new.16.png create mode 100644 app/ui/icons/new.32.png create mode 100644 app/ui/icons/new.64.png create mode 100644 app/ui/icons/next.128.png create mode 100644 app/ui/icons/next.16.png create mode 100644 app/ui/icons/next.32.png create mode 100644 app/ui/icons/next.64.png create mode 100644 app/ui/icons/open.128.png create mode 100644 app/ui/icons/open.16.png create mode 100644 app/ui/icons/open.32.png create mode 100644 app/ui/icons/open.64.png create mode 100644 app/ui/icons/pause.128.png create mode 100644 app/ui/icons/pause.16.png create mode 100644 app/ui/icons/pause.32.png create mode 100644 app/ui/icons/pause.64.png create mode 100644 app/ui/icons/play.128.png create mode 100644 app/ui/icons/play.16.png create mode 100644 app/ui/icons/play.32.png create mode 100644 app/ui/icons/play.64.png create mode 100644 app/ui/icons/prev.128.png create mode 100644 app/ui/icons/prev.16.png create mode 100644 app/ui/icons/prev.32.png create mode 100644 app/ui/icons/prev.64.png create mode 100644 app/ui/icons/razor.128.png create mode 100644 app/ui/icons/razor.16.png create mode 100644 app/ui/icons/razor.32.png create mode 100644 app/ui/icons/razor.64.png create mode 100644 app/ui/icons/record.128.png create mode 100644 app/ui/icons/record.16.png create mode 100644 app/ui/icons/record.32.png create mode 100644 app/ui/icons/record.64.png create mode 100644 app/ui/icons/redo.128.png create mode 100644 app/ui/icons/redo.16.png create mode 100644 app/ui/icons/redo.32.png create mode 100644 app/ui/icons/redo.64.png create mode 100644 app/ui/icons/rew.128.png create mode 100644 app/ui/icons/rew.16.png create mode 100644 app/ui/icons/rew.32.png create mode 100644 app/ui/icons/rew.64.png create mode 100644 app/ui/icons/ripple.128.png create mode 100644 app/ui/icons/ripple.16.png create mode 100644 app/ui/icons/ripple.32.png create mode 100644 app/ui/icons/ripple.64.png create mode 100644 app/ui/icons/rolling.128.png create mode 100644 app/ui/icons/rolling.16.png create mode 100644 app/ui/icons/rolling.32.png create mode 100644 app/ui/icons/rolling.64.png create mode 100644 app/ui/icons/save.128.png create mode 100644 app/ui/icons/save.16.png create mode 100644 app/ui/icons/save.32.png create mode 100644 app/ui/icons/save.64.png create mode 100644 app/ui/icons/sequence.128.png create mode 100644 app/ui/icons/sequence.16.png create mode 100644 app/ui/icons/sequence.32.png create mode 100644 app/ui/icons/sequence.64.png create mode 100644 app/ui/icons/slide.128.png create mode 100644 app/ui/icons/slide.16.png create mode 100644 app/ui/icons/slide.32.png create mode 100644 app/ui/icons/slide.64.png create mode 100644 app/ui/icons/slip.128.png create mode 100644 app/ui/icons/slip.16.png create mode 100644 app/ui/icons/slip.32.png create mode 100644 app/ui/icons/slip.64.png rename {icons => app/ui/icons/svg}/add-button.svg (100%) rename {icons => app/ui/icons/svg}/add-effect.svg (100%) rename {icons => app/ui/icons/svg}/add-transition.svg (100%) rename {icons => app/ui/icons/svg}/align-center.svg (100%) rename {icons => app/ui/icons/svg}/align-left.svg (100%) rename {icons => app/ui/icons/svg}/align-right.svg (100%) rename {icons => app/ui/icons/svg}/arrow.svg (100%) rename {icons => app/ui/icons/svg}/audiosource.svg (100%) rename {icons => app/ui/icons/svg}/beam.svg (100%) rename {icons => app/ui/icons/svg}/bold.svg (100%) rename {icons => app/ui/icons/svg}/clock.svg (100%) rename {icons => app/ui/icons/svg}/diamond.svg (100%) rename {icons => app/ui/icons/svg}/dirup.svg (100%) rename {icons => app/ui/icons/svg}/error.svg (100%) rename {icons => app/ui/icons/svg}/ff.svg (100%) rename {icons => app/ui/icons/svg}/folder.svg (100%) rename {icons => app/ui/icons/svg}/hand.svg (100%) rename {icons => app/ui/icons/svg}/iconview.svg (100%) rename {icons => app/ui/icons/svg}/imagesource.svg (100%) rename {icons => app/ui/icons/svg}/italic.svg (100%) rename {icons => app/ui/icons/svg}/justify-center.svg (100%) rename {icons => app/ui/icons/svg}/listview.svg (100%) rename {icons => app/ui/icons/svg}/magnet.svg (100%) rename {icons => app/ui/icons/svg}/new.svg (100%) rename {icons => app/ui/icons/svg}/next.svg (100%) rename {icons => app/ui/icons/svg}/open.svg (100%) rename {icons => app/ui/icons/svg}/pause.svg (100%) rename {icons => app/ui/icons/svg}/play.svg (100%) rename {icons => app/ui/icons/svg}/prev.svg (100%) rename {icons => app/ui/icons/svg}/razor.svg (100%) rename {icons => app/ui/icons/svg}/record.svg (100%) rename {icons => app/ui/icons/svg}/redo.svg (100%) rename {icons => app/ui/icons/svg}/rew.svg (100%) rename {icons => app/ui/icons/svg}/ripple.svg (100%) rename {icons => app/ui/icons/svg}/rolling.svg (100%) rename {icons => app/ui/icons/svg}/save.svg (100%) rename {icons => app/ui/icons/svg}/sequence.svg (100%) rename {icons => app/ui/icons/svg}/slide.svg (100%) rename {icons => app/ui/icons/svg}/slip.svg (100%) rename {icons => app/ui/icons/svg}/transition-tool.svg (100%) rename {icons => app/ui/icons/svg}/treeview.svg (100%) rename {icons => app/ui/icons/svg}/tri-down.svg (100%) rename {icons => app/ui/icons/svg}/tri-left.svg (100%) rename {icons => app/ui/icons/svg}/tri-right.svg (100%) rename {icons => app/ui/icons/svg}/tri-up.svg (100%) rename {icons => app/ui/icons/svg}/underline.svg (100%) rename {icons => app/ui/icons/svg}/undo.svg (100%) rename {icons => app/ui/icons/svg}/videosource.svg (100%) rename {icons => app/ui/icons/svg}/zoomin.svg (100%) rename {icons => app/ui/icons/svg}/zoomout.svg (100%) create mode 100644 app/ui/icons/transition-tool.128.png create mode 100644 app/ui/icons/transition-tool.16.png create mode 100644 app/ui/icons/transition-tool.32.png create mode 100644 app/ui/icons/transition-tool.64.png create mode 100644 app/ui/icons/treeview.128.png create mode 100644 app/ui/icons/treeview.16.png create mode 100644 app/ui/icons/treeview.32.png create mode 100644 app/ui/icons/treeview.64.png create mode 100644 app/ui/icons/tri-down.128.png create mode 100644 app/ui/icons/tri-down.16.png create mode 100644 app/ui/icons/tri-down.32.png create mode 100644 app/ui/icons/tri-down.64.png create mode 100644 app/ui/icons/tri-left.128.png create mode 100644 app/ui/icons/tri-left.16.png create mode 100644 app/ui/icons/tri-left.32.png create mode 100644 app/ui/icons/tri-left.64.png create mode 100644 app/ui/icons/tri-right.128.png create mode 100644 app/ui/icons/tri-right.16.png create mode 100644 app/ui/icons/tri-right.32.png create mode 100644 app/ui/icons/tri-right.64.png create mode 100644 app/ui/icons/tri-up.128.png create mode 100644 app/ui/icons/tri-up.16.png create mode 100644 app/ui/icons/tri-up.32.png create mode 100644 app/ui/icons/tri-up.64.png create mode 100644 app/ui/icons/underline.128.png create mode 100644 app/ui/icons/underline.16.png create mode 100644 app/ui/icons/underline.32.png create mode 100644 app/ui/icons/underline.64.png create mode 100644 app/ui/icons/undo.128.png create mode 100644 app/ui/icons/undo.16.png create mode 100644 app/ui/icons/undo.32.png create mode 100644 app/ui/icons/undo.64.png create mode 100644 app/ui/icons/videosource.128.png create mode 100644 app/ui/icons/videosource.16.png create mode 100644 app/ui/icons/videosource.32.png create mode 100644 app/ui/icons/videosource.64.png create mode 100644 app/ui/icons/zoomin.128.png create mode 100644 app/ui/icons/zoomin.16.png create mode 100644 app/ui/icons/zoomin.32.png create mode 100644 app/ui/icons/zoomin.64.png create mode 100644 app/ui/icons/zoomout.128.png create mode 100644 app/ui/icons/zoomout.16.png create mode 100644 app/ui/icons/zoomout.32.png create mode 100644 app/ui/icons/zoomout.64.png create mode 100644 app/ui/style/CMakeLists.txt create mode 100644 app/ui/style/style.cpp create mode 100644 app/ui/style/style.h create mode 100644 app/widget/playbackcontrols/CMakeLists.txt create mode 100644 app/widget/playbackcontrols/playbackcontrols.cpp create mode 100644 app/widget/playbackcontrols/playbackcontrols.h create mode 100644 app/widget/projecttoolbar/CMakeLists.txt create mode 100644 app/widget/projecttoolbar/projecttoolbar.cpp create mode 100644 app/widget/projecttoolbar/projecttoolbar.h create mode 100644 app/window/mainwindow/mainmenu.cpp create mode 100644 app/window/mainwindow/mainmenu.h delete mode 100644 icons/icons.qrc delete mode 100644 icons/olive64.png diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 8287b07d0..4f5ca956a 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -16,12 +16,15 @@ set(OLIVE_SOURCES ${OLIVE_SOURCES} + core.h + core.cpp main.cpp ) add_subdirectory(panel) add_subdirectory(project) add_subdirectory(render) +add_subdirectory(ui) add_subdirectory(widget) add_subdirectory(window) @@ -30,6 +33,11 @@ if(APPLE) set(OLIVE_TARGET "Olive") endif() +set(OLIVE_RESOURCES + ${OLIVE_RESOURCES} + #effects/internal/internalshaders.qrc +) + add_executable(${OLIVE_TARGET} ${OLIVE_SOURCES} ${OLIVE_RESOURCES} @@ -39,7 +47,7 @@ add_executable(${OLIVE_TARGET} target_compile_definitions(${OLIVE_TARGET} PRIVATE ${OLIVE_DEFINITIONS}) -target_compile_options(${OLIVE_TARGET} PRIVATE $<$:-Wno-reorder>) +target_compile_options(${OLIVE_TARGET} PRIVATE $<$:-Werror -pedantic-errors -Wall -Wextra -Wconversion -Wsign-conversion>) target_link_libraries(${OLIVE_TARGET} PRIVATE @@ -59,12 +67,6 @@ target_link_libraries(${OLIVE_TARGET} OpenColorIO ) -set(OLIVE_RESOURCES - cursors/cursors.qrc - effects/internal/internalshaders.qrc - icons/icons.qrc -) - set(OLIVE_EFFECTS effects/internal/cornerpin.frag effects/internal/dropshadow.frag diff --git a/app/core.cpp b/app/core.cpp new file mode 100644 index 000000000..898a91aad --- /dev/null +++ b/app/core.cpp @@ -0,0 +1,74 @@ +#include "core.h" + +#include +#include +#include + +#include "ui/icons/icons.h" +#include "ui/style/style.h" + +Core olive::core; + +Core::Core() : + main_window_(nullptr) +{ +} + +void Core::Start() +{ + // + // Parse command line arguments + // + + QCommandLineParser parser; + parser.addHelpOption(); + parser.addVersionOption(); + + // Project from command line option + // FIXME: What's the correct way to make an "optional" positional argument? + parser.addPositionalArgument("[project]", tr("Project to open on startup")); + + // Create fullscreen option + QCommandLineOption fullscreen_option({"f", "fullscreen"}, tr("Start in full screen mode")); + parser.addOption(fullscreen_option); + + // Parse options + parser.process(*QApplication::instance()); + + QStringList args = parser.positionalArguments(); + + // Detect project to load on startup + if (!args.isEmpty()) { + startup_project_ = args.first(); + } + + + + // + // Start GUI + // + + // Load all icons + olive::icon::LoadAll(); + + // Set UI style + olive::style::SetDefault(); + + // Create main window and open it + main_window_ = new olive::MainWindow(); + if (parser.isSet(fullscreen_option)) { + main_window_->showFullScreen(); + } else { + main_window_->showMaximized(); + } +} + +void Core::Stop() +{ + delete main_window_; +} + +olive::MainWindow *Core::main_window() +{ + return main_window_; +} diff --git a/app/core.h b/app/core.h new file mode 100644 index 000000000..1e1cd6bd0 --- /dev/null +++ b/app/core.h @@ -0,0 +1,27 @@ +#ifndef CORE_H +#define CORE_H + +#include "window/mainwindow/mainwindow.h" + +class Core : public QObject +{ + Q_OBJECT +public: + Core(); + + void Start(); + void StartGUI(); + void Stop(); + + olive::MainWindow* main_window(); +private: + olive::MainWindow* main_window_; + + QString startup_project_; +}; + +namespace olive { +extern Core core; +} + +#endif // CORE_H diff --git a/app/main.cpp b/app/main.cpp index 5232a3dae..21d275c1c 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -21,7 +21,7 @@ #include #include -#include "window/mainwindow/mainwindow.h" +#include "core.h" int main(int argc, char *argv[]) { // Create application instance @@ -43,11 +43,11 @@ int main(int argc, char *argv[]) { format.setProfile(QSurfaceFormat::CoreProfile); QSurfaceFormat::setDefaultFormat(format); - // Create main window instance - olive::MainWindow w; + olive::core.Start(); - // Show main window - w.showMaximized(); + int exit_code = a.exec(); - return a.exec(); + olive::core.Stop(); + + return exit_code; } diff --git a/app/panel/CMakeLists.txt b/app/panel/CMakeLists.txt index 1af491378..f07698e31 100644 --- a/app/panel/CMakeLists.txt +++ b/app/panel/CMakeLists.txt @@ -14,6 +14,8 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . +add_subdirectory(project) +add_subdirectory(timeline) add_subdirectory(viewer) set(OLIVE_SOURCES diff --git a/app/panel/project/CMakeLists.txt b/app/panel/project/CMakeLists.txt new file mode 100644 index 000000000..fcb7ad98a --- /dev/null +++ b/app/panel/project/CMakeLists.txt @@ -0,0 +1,22 @@ +# Olive - Non-Linear Video Editor +# Copyright (C) 2019 Olive Team +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +set(OLIVE_SOURCES + ${OLIVE_SOURCES} + panel/project/project.h + panel/project/project.cpp + PARENT_SCOPE +) diff --git a/app/panel/project/project.cpp b/app/panel/project/project.cpp new file mode 100644 index 000000000..a423485d8 --- /dev/null +++ b/app/panel/project/project.cpp @@ -0,0 +1,41 @@ +#include "project.h" + +#include + +#include "widget/projecttoolbar/projecttoolbar.h" + +ProjectPanel::ProjectPanel(QWidget *parent) : + PanelWidget(parent) +{ + // Create main widget and its layout + QWidget* central_widget = new QWidget(this); + QVBoxLayout* layout = new QVBoxLayout(central_widget); + layout->setMargin(0); + layout->setSpacing(0); + setWidget(central_widget); + + // Set up project toolbar + ProjectToolbar* toolbar = new ProjectToolbar(this); + layout->addWidget(toolbar); + + // Set up main explorer object + ProjectExplorer* explorer = new ProjectExplorer(this); + layout->addWidget(explorer); + + // Set strings + Retranslate(); +} + +void ProjectPanel::changeEvent(QEvent *e) +{ + if (e->type() == QEvent::LanguageChange) { + Retranslate(); + } + QDockWidget::changeEvent(e); +} + +void ProjectPanel::Retranslate() +{ + SetTitle(tr("Project")); + SetSubtitle(tr("(untitled)")); +} diff --git a/app/panel/project/project.h b/app/panel/project/project.h new file mode 100644 index 000000000..3bea6f785 --- /dev/null +++ b/app/panel/project/project.h @@ -0,0 +1,20 @@ +#ifndef PROJECT_H +#define PROJECT_H + +#include "widget/panel/panel.h" +#include "widget/projectexplorer/projectexplorer.h" + +class ProjectPanel : public PanelWidget +{ + Q_OBJECT +public: + ProjectPanel(QWidget* parent); + +protected: + virtual void changeEvent(QEvent* e) override; + +private: + void Retranslate(); +}; + +#endif // PROJECT_H diff --git a/app/panel/timeline/CMakeLists.txt b/app/panel/timeline/CMakeLists.txt new file mode 100644 index 000000000..bb7eefaf7 --- /dev/null +++ b/app/panel/timeline/CMakeLists.txt @@ -0,0 +1,22 @@ +# Olive - Non-Linear Video Editor +# Copyright (C) 2019 Olive Team +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +set(OLIVE_SOURCES + ${OLIVE_SOURCES} + panel/timeline/timeline.h + panel/timeline/timeline.cpp + PARENT_SCOPE +) diff --git a/app/panel/timeline/timeline.cpp b/app/panel/timeline/timeline.cpp new file mode 100644 index 000000000..c2f8083a9 --- /dev/null +++ b/app/panel/timeline/timeline.cpp @@ -0,0 +1,21 @@ +#include "timeline.h" + +TimelinePanel::TimelinePanel(QWidget *parent) : + PanelWidget(parent) +{ + Retranslate(); +} + +void TimelinePanel::changeEvent(QEvent *e) +{ + if (e->type() == QEvent::LanguageChange) { + Retranslate(); + } + QDockWidget::changeEvent(e); +} + +void TimelinePanel::Retranslate() +{ + SetTitle(tr("Timeline")); + SetSubtitle(tr("(none)")); +} diff --git a/app/panel/timeline/timeline.h b/app/panel/timeline/timeline.h new file mode 100644 index 000000000..58ce03afe --- /dev/null +++ b/app/panel/timeline/timeline.h @@ -0,0 +1,19 @@ +#ifndef TIMELINE_H +#define TIMELINE_H + +#include "widget/panel/panel.h" + +class TimelinePanel : public PanelWidget +{ + Q_OBJECT +public: + TimelinePanel(QWidget* parent); + +protected: + virtual void changeEvent(QEvent* e) override; + +private: + void Retranslate(); +}; + +#endif // TIMELINE_H diff --git a/app/panel/viewer/viewer.cpp b/app/panel/viewer/viewer.cpp index 6e367b9cf..87b7ed4e2 100644 --- a/app/panel/viewer/viewer.cpp +++ b/app/panel/viewer/viewer.cpp @@ -13,4 +13,21 @@ ViewerPanel::ViewerPanel(QWidget *parent) : // Set ViewerWidget as the central widget setWidget(viewer); + + // Set strings + Retranslate(); +} + +void ViewerPanel::changeEvent(QEvent *e) +{ + if (e->type() == QEvent::LanguageChange) { + Retranslate(); + } + QDockWidget::changeEvent(e); +} + +void ViewerPanel::Retranslate() +{ + SetTitle(tr("Viewer")); + SetSubtitle(tr("(none)")); } diff --git a/app/panel/viewer/viewer.h b/app/panel/viewer/viewer.h index 5a0a9c946..61a53d9a0 100644 --- a/app/panel/viewer/viewer.h +++ b/app/panel/viewer/viewer.h @@ -12,7 +12,12 @@ class ViewerPanel : public PanelWidget { Q_OBJECT public: ViewerPanel(QWidget* parent); + +protected: + virtual void changeEvent(QEvent* e) override; + private: + void Retranslate(); }; #endif // VIEWER_PANEL_H diff --git a/app/render/CMakeLists.txt b/app/render/CMakeLists.txt index 4c826af41..d782b3964 100644 --- a/app/render/CMakeLists.txt +++ b/app/render/CMakeLists.txt @@ -14,10 +14,9 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . +add_subdirectory(gl) + set(OLIVE_SOURCES ${OLIVE_SOURCES} - render/glfunc.h - render/glfunc.cpp - render/qopenglshaderprogramptr.h PARENT_SCOPE ) diff --git a/app/render/gl/CMakeLists.txt b/app/render/gl/CMakeLists.txt new file mode 100644 index 000000000..743401cdf --- /dev/null +++ b/app/render/gl/CMakeLists.txt @@ -0,0 +1,25 @@ +# Olive - Non-Linear Video Editor +# Copyright (C) 2019 Olive Team +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +set(OLIVE_SOURCES + ${OLIVE_SOURCES} + render/gl/glfunc.h + render/gl/glfunc.cpp + render/gl/shadergenerators.h + render/gl/shadergenerators.cpp + render/gl/shaderptr.h + PARENT_SCOPE +) diff --git a/app/render/glfunc.cpp b/app/render/gl/glfunc.cpp similarity index 75% rename from app/render/glfunc.cpp rename to app/render/gl/glfunc.cpp index 6f4e2f05d..a600ecd42 100644 --- a/app/render/glfunc.cpp +++ b/app/render/gl/glfunc.cpp @@ -35,8 +35,13 @@ const GLfloat flipped_blit_texcoords[] = { }; /** - * @brief Set up texture mipmaps + * @brief Set up texture parameters and mipmap for drawing + * + * Internal function used just before drawing to allow mipmapped bilinear filtering when drawing textures small. + * * @param f + * + * Currently active QOpenGLFunctions object (use context()->functions() if unsure). */ void PrepareToDraw(QOpenGLFunctions* f) { f->glGenerateMipmap(GL_TEXTURE_2D); @@ -46,9 +51,10 @@ void PrepareToDraw(QOpenGLFunctions* f) { f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); } -void olive::gl::Blit(QOpenGLShaderProgram* pipeline, bool flipped, QMatrix4x4 matrix) { - +void olive::gl::Blit(ShaderPtr pipeline, bool flipped, QMatrix4x4 matrix) { + // FIXME: is currentContext() reliable here? QOpenGLFunctions* func = QOpenGLContext::currentContext()->functions(); + PrepareToDraw(func); QOpenGLVertexArrayObject m_vao; @@ -72,16 +78,16 @@ void olive::gl::Blit(QOpenGLShaderProgram* pipeline, bool flipped, QMatrix4x4 ma pipeline->setUniformValue("mvp_matrix", matrix); pipeline->setUniformValue("texture", 0); - GLuint vertex_location = pipeline->attributeLocation("a_position"); + GLuint vertex_location = static_cast(pipeline->attributeLocation("a_position")); m_vbo.bind(); func->glEnableVertexAttribArray(vertex_location); - func->glVertexAttribPointer(vertex_location, 3, GL_FLOAT, GL_FALSE, 0, 0); + func->glVertexAttribPointer(vertex_location, 3, GL_FLOAT, GL_FALSE, 0, nullptr); m_vbo.release(); - GLuint tex_location = pipeline->attributeLocation("a_texcoord"); + GLuint tex_location = static_cast(pipeline->attributeLocation("a_texcoord")); m_vbo2.bind(); func->glEnableVertexAttribArray(tex_location); - func->glVertexAttribPointer(tex_location, 2, GL_FLOAT, GL_FALSE, 0, 0); + func->glVertexAttribPointer(tex_location, 2, GL_FLOAT, GL_FALSE, 0, nullptr); m_vbo2.release(); func->glDrawArrays(GL_TRIANGLES, 0, 6); diff --git a/app/render/glfunc.h b/app/render/gl/glfunc.h similarity index 75% rename from app/render/glfunc.h rename to app/render/gl/glfunc.h index 4e607ed64..6e516339d 100644 --- a/app/render/glfunc.h +++ b/app/render/gl/glfunc.h @@ -1,9 +1,10 @@ #ifndef GLFUNC_H #define GLFUNC_H -#include #include +#include "shaderptr.h" + namespace olive { namespace gl { @@ -22,7 +23,7 @@ namespace gl { * * Transformation matrix to use when drawing (defaults to no transform) */ -void Blit(QOpenGLShaderProgram* pipeline, bool flipped = false, QMatrix4x4 matrix = QMatrix4x4()); +void Blit(ShaderPtr pipeline, bool flipped = false, QMatrix4x4 matrix = QMatrix4x4()); } } diff --git a/app/render/gl/shadergenerators.cpp b/app/render/gl/shadergenerators.cpp new file mode 100644 index 000000000..b86f2f780 --- /dev/null +++ b/app/render/gl/shadergenerators.cpp @@ -0,0 +1,230 @@ +#include "shadergenerators.h" + +#include + +ShaderPtr olive::gl::GetDefaultPipeline(const QString& function_name, const QString& shader_code) +{ + ShaderPtr program = std::make_shared(); + + // Generate vertex shader + QString vert_shader = "#version 110\n" + "\n" + "#ifdef GL_ES\n" + "precision mediump int;\n" + "precision mediump float;\n" + "#endif\n" + "\n" + "uniform mat4 mvp_matrix;\n" + "\n" + "attribute vec4 a_position;\n" + "attribute vec2 a_texcoord;\n" + "\n" + "varying vec2 v_texcoord;\n" + "\n" + "void main() {\n" + " gl_Position = mvp_matrix * a_position;\n" + " v_texcoord = a_texcoord;\n" + "}\n"; + + // Generate fragment shader + QString frag_shader = "#version 110\n" + "\n" + "#ifdef GL_ES\n" + "precision mediump int;\n" + "precision mediump float;\n" + "#endif\n" + "\n" + "uniform sampler2D texture;\n" + "uniform float opacity;\n" + "uniform bool color_only;\n" + "uniform vec4 color_only_color;\n" + "varying vec2 v_texcoord;\n" + "\n"; + + // Finish the function with the main function + + // Check if additional code was passed to this function, add it here + if (shader_code.isEmpty()) { + + // If not, just add a pure main() function + + frag_shader.append("\n" + "void main() {\n" + " if (color_only) {\n" + " gl_FragColor = color_only_color;" + " } else {\n" + " vec4 color = texture2D(texture, v_texcoord)*opacity;\n" + " gl_FragColor = color;\n" + " }\n" + "}\n"); + + } else { + + // If additional code was passed, add it and reference it in main(). + // + // The function in the additional code is expected to be `vec4 function_name(vec4 color)`. The texture coordinate can be + // acquired through `v_texcoord`. + + frag_shader.append(shader_code); + + frag_shader.append(QString("\n" + "void main() {\n" + " vec4 color = %1(texture2D(texture, v_texcoord))*opacity;\n" + " gl_FragColor = color;\n" + "}\n").arg(function_name)); + + } + + + + + // Add shaders to program + program->addShaderFromSourceCode(QOpenGLShader::Vertex, vert_shader); + program->addShaderFromSourceCode(QOpenGLShader::Fragment, frag_shader); + program->link(); + + // Set opacity default to 100% + program->bind(); + program->setUniformValue("opacity", 1.0f); + program->release(); + + return program; +} + +QString olive::gl::GetAlphaDisassociateFunction(const QString &function_name) +{ + return QString("vec4 %1(vec4 col) {\n" + " if (col.a > 0.0) {\n" + " return vec4(col.rgb / col.a, col.a);" + " }\n" + " return col;\n" + "}\n").arg(function_name); +} + +QString olive::gl::GetAlphaReassociateFunction(const QString &function_name) +{ + return QString("vec4 %1(vec4 col) {\n" + " if (col.a > 0.0) {\n" + " return vec4(col.rgb * col.a, col.a);" + " }\n" + " return col;\n" + "}\n").arg(function_name); +} + +QString olive::gl::GetAlphaAssociateFunction(const QString &function_name) +{ + return QString("vec4 %1(vec4 col) {\n" + " return vec4(col.rgb * col.a, col.a);\n" + "}\n").arg(function_name); +} + +// copied from source code to OCIODisplay +const int OCIO_LUT3D_EDGE_SIZE = 32; + +// copied from source code to OCIODisplay, expanded from 3*LUT3D_EDGE_SIZE*LUT3D_EDGE_SIZE*LUT3D_EDGE_SIZE +const int OCIO_NUM_3D_ENTRIES = 98304; + +ShaderPtr olive::gl::GetOCIOPipeline(QOpenGLContext* ctx, + GLuint& lut_texture, + OCIO::ConstProcessorRcPtr processor, + bool alpha_is_associated) +{ + + QOpenGLExtraFunctions* xf = ctx->extraFunctions(); + + // Create LUT texture + xf->glGenTextures(1, &lut_texture); + + // Bind LUT + xf->glBindTexture(GL_TEXTURE_3D, lut_texture); + + // Set texture parameters + xf->glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + xf->glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + xf->glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + xf->glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + xf->glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); + + // Allocate storage for texture + xf->glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB16F_ARB, + OCIO_LUT3D_EDGE_SIZE, OCIO_LUT3D_EDGE_SIZE, OCIO_LUT3D_EDGE_SIZE, + 0, GL_RGB,GL_FLOAT, nullptr); + + // + // SET UP GLSL SHADER + // + + OCIO::GpuShaderDesc shaderDesc; + const char* ocio_func_name = "OCIODisplay"; + shaderDesc.setLanguage(OCIO::GPU_LANGUAGE_GLSL_1_0); + shaderDesc.setFunctionName(ocio_func_name); + shaderDesc.setLut3DEdgeLen(OCIO_LUT3D_EDGE_SIZE); + + // + // COMPUTE 3D LUT + // + + GLfloat* ocio_lut_data = new GLfloat[OCIO_NUM_3D_ENTRIES]; + processor->getGpuLut3D(ocio_lut_data, shaderDesc); + + // Upload LUT data to texture + xf->glTexSubImage3D(GL_TEXTURE_3D, 0, + 0, 0, 0, + OCIO_LUT3D_EDGE_SIZE, OCIO_LUT3D_EDGE_SIZE, OCIO_LUT3D_EDGE_SIZE, + GL_RGB, GL_FLOAT, ocio_lut_data); + + delete [] ocio_lut_data; + + // Create OCIO shader code + QString shader_text(processor->getGpuShaderText(shaderDesc)); + + QString shader_call; + + // Enforce alpha association + if (alpha_is_associated) { + + // If alpha is already associated, we'll need to disassociate and reassociate + shader_text.append("\n"); + + QString disassociate_func_name = "disassoc"; + shader_text.append(GetAlphaDisassociateFunction(disassociate_func_name)); + + QString reassociate_func_name = "reassoc"; + shader_text.append(GetAlphaReassociateFunction(reassociate_func_name)); + + // Make OCIO call pass through disassociate and reassociate function + shader_call = QString("%3(%1(%2(col), tex2));").arg(ocio_func_name, + disassociate_func_name, + reassociate_func_name); + + } else { + + // If alpha is not already associated, we can just associate after OCIO + + // Add associate function + QString associate_func_name = "assoc"; + shader_text.append(GetAlphaAssociateFunction(associate_func_name)); + + // Make OCIO call pass through associate function + shader_call = QString("%2(%1(col, tex2));").arg(ocio_func_name, associate_func_name); + + } + + // Add process() function, which GetPipeline() will call if specified + QString process_function_name = "process"; + shader_text.append(QString("\n" + "uniform sampler3D tex2;\n" + "\n" + "vec4 %2(vec4 col) {\n" + " return %1\n" + "}\n").arg(shader_call, process_function_name)); + + + // Get pipeline-based shader to inject OCIO shader into + ShaderPtr shader = olive::gl::GetDefaultPipeline(process_function_name, shader_text); + + // Release LUT + xf->glBindTexture(GL_TEXTURE_3D, 0); + + return shader; +} diff --git a/app/render/gl/shadergenerators.h b/app/render/gl/shadergenerators.h new file mode 100644 index 000000000..3849af85a --- /dev/null +++ b/app/render/gl/shadergenerators.h @@ -0,0 +1,34 @@ +#ifndef SHADERGENERATORS_H +#define SHADERGENERATORS_H + +#include +namespace OCIO = OCIO_NAMESPACE::v1; + +#include "shaderptr.h" + +/** + * + * Olive standardizes on OpenGL 3.2 Core which has no fixed pipeline. Instead, the pipeline is provided by the + * programmer in the form of a shader. This is a collection of OpenGL shader pipeline generators for use throughout + * Olive. + * + */ + +namespace olive { +namespace gl { + +ShaderPtr GetDefaultPipeline(const QString &function_name = QString(), const QString &shader_code = QString()); + +ShaderPtr GetOCIOPipeline(QOpenGLContext *ctx, + GLuint &lut_texture, + OCIO::ConstProcessorRcPtr processor, + bool alpha_is_associated); + +QString GetAlphaDisassociateFunction(const QString& function_name); +QString GetAlphaReassociateFunction(const QString& function_name); +QString GetAlphaAssociateFunction(const QString& function_name); + +} +} + +#endif // SHADERGENERATORS_H diff --git a/app/render/qopenglshaderprogramptr.h b/app/render/gl/shaderptr.h similarity index 92% rename from app/render/qopenglshaderprogramptr.h rename to app/render/gl/shaderptr.h index a89993ffd..c9cddc9d2 100644 --- a/app/render/qopenglshaderprogramptr.h +++ b/app/render/gl/shaderptr.h @@ -24,6 +24,6 @@ #include #include -using QOpenGLShaderProgramPtr = std::shared_ptr; +using ShaderPtr = std::shared_ptr; #endif // QOPENGLSHADERPROGRAMPTR_H diff --git a/app/ui/CMakeLists.txt b/app/ui/CMakeLists.txt new file mode 100644 index 000000000..55ba82947 --- /dev/null +++ b/app/ui/CMakeLists.txt @@ -0,0 +1,30 @@ +# Olive - Non-Linear Video Editor +# Copyright (C) 2019 Olive Team +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +add_subdirectory(cursors) +add_subdirectory(graphics) +add_subdirectory(icons) +add_subdirectory(style) + +set(OLIVE_RESOURCES + ${OLIVE_RESOURCES} + PARENT_SCOPE +) + +set(OLIVE_SOURCES + ${OLIVE_SOURCES} + PARENT_SCOPE +) diff --git a/cursors/1_left.svg b/app/ui/cursors/1_left.svg similarity index 100% rename from cursors/1_left.svg rename to app/ui/cursors/1_left.svg diff --git a/cursors/1_right.svg b/app/ui/cursors/1_right.svg similarity index 100% rename from cursors/1_right.svg rename to app/ui/cursors/1_right.svg diff --git a/cursors/2.svg b/app/ui/cursors/2.svg similarity index 100% rename from cursors/2.svg rename to app/ui/cursors/2.svg diff --git a/cursors/3_left.svg b/app/ui/cursors/3_left.svg similarity index 100% rename from cursors/3_left.svg rename to app/ui/cursors/3_left.svg diff --git a/cursors/3_right.svg b/app/ui/cursors/3_right.svg similarity index 100% rename from cursors/3_right.svg rename to app/ui/cursors/3_right.svg diff --git a/cursors/4.svg b/app/ui/cursors/4.svg similarity index 100% rename from cursors/4.svg rename to app/ui/cursors/4.svg diff --git a/cursors/5.svg b/app/ui/cursors/5.svg similarity index 100% rename from cursors/5.svg rename to app/ui/cursors/5.svg diff --git a/cursors/5b.svg b/app/ui/cursors/5b.svg similarity index 100% rename from cursors/5b.svg rename to app/ui/cursors/5b.svg diff --git a/cursors/5c.svg b/app/ui/cursors/5c.svg similarity index 100% rename from cursors/5c.svg rename to app/ui/cursors/5c.svg diff --git a/app/ui/cursors/CMakeLists.txt b/app/ui/cursors/CMakeLists.txt new file mode 100644 index 000000000..2f77372f9 --- /dev/null +++ b/app/ui/cursors/CMakeLists.txt @@ -0,0 +1,21 @@ +# Olive - Non-Linear Video Editor +# Copyright (C) 2019 Olive Team +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +set(OLIVE_RESOURCES + ${OLIVE_RESOURCES} + ui/cursors/cursors.qrc + PARENT_SCOPE +) diff --git a/cursors/cursors.qrc b/app/ui/cursors/cursors.qrc similarity index 100% rename from cursors/cursors.qrc rename to app/ui/cursors/cursors.qrc diff --git a/app/ui/graphics/CMakeLists.txt b/app/ui/graphics/CMakeLists.txt new file mode 100644 index 000000000..c1cde3598 --- /dev/null +++ b/app/ui/graphics/CMakeLists.txt @@ -0,0 +1,21 @@ +# Olive - Non-Linear Video Editor +# Copyright (C) 2019 Olive Team +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +set(OLIVE_RESOURCES + ${OLIVE_RESOURCES} + ui/graphics/graphics.qrc + PARENT_SCOPE +) diff --git a/app/ui/graphics/graphics.qrc b/app/ui/graphics/graphics.qrc new file mode 100644 index 000000000..893c0a9d9 --- /dev/null +++ b/app/ui/graphics/graphics.qrc @@ -0,0 +1,6 @@ + + + throbber.png + olive-splash.png + + diff --git a/icons/olive-splash.png b/app/ui/graphics/olive-splash.png similarity index 100% rename from icons/olive-splash.png rename to app/ui/graphics/olive-splash.png diff --git a/icons/throbber.png b/app/ui/graphics/throbber.png similarity index 100% rename from icons/throbber.png rename to app/ui/graphics/throbber.png diff --git a/app/ui/icons/CMakeLists.txt b/app/ui/icons/CMakeLists.txt new file mode 100644 index 000000000..dd87ffcba --- /dev/null +++ b/app/ui/icons/CMakeLists.txt @@ -0,0 +1,28 @@ +# Olive - Non-Linear Video Editor +# Copyright (C) 2019 Olive Team +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +set(OLIVE_SOURCES + ${OLIVE_SOURCES} + ui/icons/icons.h + ui/icons/icons.cpp + PARENT_SCOPE +) + +set(OLIVE_RESOURCES + ${OLIVE_RESOURCES} + ui/icons/icons.qrc + PARENT_SCOPE +) diff --git a/app/ui/icons/add-button.128.png b/app/ui/icons/add-button.128.png new file mode 100644 index 0000000000000000000000000000000000000000..8800e818630e902fd53564cd34c4d15e9985e544 GIT binary patch literal 1454 zcmbW1iBpqT5Wrs&!le{!0STy}Bjt)o5S1H51PqoVK%s!x#1KN{NJxMW6>0)vP#D7? zh>%!B$EL^#2o{JGiCXa>36*BFV1j4`wOj##6av@}JJUbFo!Q;l{q5|$w{PB_i3|@h zF}5}a0GJRD?2m#ycTElTVSC??(g!;|&OTy{AuRcZ$t7@X#5xeq0bnzKO%a0885*3# zWCwkh9nDP1hA3Zb!2-Bvor*UXci7$JKlWMy4F;x79jA*7hejRP;{E)R5{0Ab&J=VN+Xr z3cfneH@b2u-ql^Tf?2}bk{_$g`k4$M%f;g*!-_+BM1Sm$12AdjoJ$F`Y2`feTBxEg6E$D(P4?u35s9XGc zf^^GDs_?wzd)5-wNe%x*w)2pN;Rro3D2xVoowy_Bds)VI9%wVsXQboiEM3)d%olDt zi^&r_Z-z$uUcX)c5b6iS9i&1yXnO7RMkA@(mYkb-;lBOY;~ke!ipowpX&R^sHsql@ zZ%ku}tqN=*q+9>qg4@+&jGeF9+C6_;Kv~$xn_AtJuxgH#=-MRwwqb;71!y)b;f^@3 zA}!?;LS>O;U4H$;cqgWfCJG9fds9SIt=P5r&x>L@O!GYEBNg( zeh+ffdCf;oeSBM&vVbzIIh~W@O}t>SR~s#M=O{ugm=^~-JPq1TUU{B$rd4#}@Y(o1 zZCZ}$cty+N?p1q=&Fw~B1c<1tb#fn--5K&veEs*xKy~pn&GK$9?Unaa+N**ah&Wyy zZ=KZBP1m5*jQJ(1S02`Wkf$@{i-CX8l0NfM36OsiC}eB@;v!2@sf(9SBJWAE7B7Q+ zgTLlS0?P99*#N{TR@-P1GIjXl4%?yioi zIh2*_nwaEw3nQ)Ocy*Ojjs^-5BC%pJy<6xT-_Xa`N4?7wMo~#F_R}&_f?~G*F7TrB z#?fz+42GROntxV}2402d4oTC{AwN1Vc0Q|E!rEG!0IAIHvaDczwS3|}l5=*vD?e59 zHAyJZxx)X@civHRuBJO_ImjaN$fB7Y0MN_+iFm$2d)}LEEHCXs<1bYSetJgaqAve? z6HkxwxxT{He|Bon8lobpgCE6SG{bUjB)TtFk4XorlnxnX^>edZS>VG@z3|;-#R+`| zXu`4G)uzVefund^b7`{4O?WitcPU}~jiP)FI|Y6MWuE}y84SuYWuvHN6G{I86G35B QI=mJEF(`b0(>`+HzYyAnoB#j- literal 0 HcmV?d00001 diff --git a/app/ui/icons/add-button.16.png b/app/ui/icons/add-button.16.png new file mode 100644 index 0000000000000000000000000000000000000000..bcf4d7aac0e8f0d37b1f7fea9ebe17ab28140e2c GIT binary patch literal 412 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fcd^o-U3d7QII&Z{%e%D{#isTP*(156!kR?~L)3pcfT94Ta-repc@-1hyG9o#p|C}=W>USO~`&W_W?3Og@HZ&eqvzxZ1?6vg<^UcfT&9xGOHB7qSt!2-d zFLY(o=M*;2LoyQ9Ij6jjaavft;gRXecMf`c&vEYQ-|tPmR(Z3Si^to`vTeFFK}03= l;$i7&&nExvUAnFIDSLu$Oka#wMlH}644$rjF6*2UngE3YrtPu#`>uHtC)!YiZ&thCQBEOV+je>)-ePG3W8#Eu02rU-H;4%&2OR zTTsm4E%wo5w(#5H^|_&olsB-NrIqP1MKE1%Yrg!;WOFE+!z4!Qgp%Y2;SVWkO?lT2 zMWsI;v!?ye*{LG?sm8c^&8^j+EiW+N zF>hEBna(gNt-<_&;c@QOZO#AnZ&+0=eK=um%eq?(&JRr2?f3Atm|pN4nJ z@ErkR#;MwT(m+AU64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1SHfYNX4ADvwg#a9Yx&U7rRuq@N#IJ z$ojyMjTVZ<~3*WSDwiZo*4b4|&Z zdeWz1l^uH>(`!?2{f2U-qS-bgAI>~dQT=^oI(r509)IbljNXj5JFjg!6m-C?d29Zp zr4=np8g7Zy$0 z%)dvKNBhjam1j@r8nE~^t}mUu)QfS|F2)+BxKgq6)3_4?Op|+n?n-@Nz2RD|Ua;GN zzK%b0OE$c+eZc%VUha_0CxfyLUI+5NN8Y*7EjvTQA(Z>k=HHbmy4#pVtJyLR8TfZ~ zGPykA`;k0HRdw;E%k?39+2^QmJ$BsU{ZFFj?&>>BZ53jC&S*P7PzaM-wp&Dxqq_8V zi|p*m9U}jD=P=%nisdTrT=g$&Q=H4Tpj64_-|w?+W_ZtV56yGSt}}&vU9lZVaJ*RF z@cYw+!_yB`RBjNx@MQabb4?~2J^pP>=Y-eJ?ectjFzi5N^Va3D^DM&Ta@dtvKQwPR z7jT|XZR0a%eM9o0__RgLXWE{x z)aB=6I=1uvx~|-)EfsfGo@(CQAY!7)&#kr~vob<~ar2aRRzZX8$_NI=+*8bdm~B?B Vu8HPT{R&Ku44$rjF6*2UngGzzOT7R9 literal 0 HcmV?d00001 diff --git a/app/ui/icons/add-effect.128.png b/app/ui/icons/add-effect.128.png new file mode 100644 index 0000000000000000000000000000000000000000..88c0b58b5a7ec7c81d03709e457591781c89cbe3 GIT binary patch literal 1855 zcmZXVc{tnY7RP^CED32%E@NvgL3Kt;HAY4)S2akgMM>JYrKngUBq1Rf%TI4DEvhcp zQni$>VKmcH>m|mFrApmuYzZ=!8evGQmbU1`?O*ra_j%6wJm)>LeP5Fp@x1(~xGNSNZH;Gn=r7qf8&ewQ{rSN(=@6@|z^@JX~Be ziCFogC8jCqK9gG}4L{bc6*S{5G$qBH8;&a8HQrF-NwWmX$5fASET(~E#cpRRCbr^! zTNt8}=LRMT+-yqA6*e+^8z@Po@2ZSJ+ZQP+wQnPiD@17K=~{lo&97sU1{bzg6Tt?- z6d|b;=#)3=g1FOGlU2N>Q=f2wmk&Uu%*Ne8F6KQG`U?Tffkfh*f1ieD<^gW73G>{c z4uqN!M34UP$7=>7WRO^3;@IN@<=p-+h+#rUa?;mvnsIs*m$gx8BUmGdmlS7iONR;M zP1s|yHU-0gq(Jip=e}y@td>5NpF*XNm%tp+xfJyv^`|zkCvJ1I>sJf1X%c1r1^f!= z29W)hrzj%dh_o}1>iGQAq;;i$V0%N8`2(^$nc@-~r7_nNw)#&f9kQ{N9v+PN`cQys zd;sVG$632a+6oP?4IylV~1UMb@5_!;L8y?clw<=K7Tl-Muk$o+{XA}p8-+~YFy{E1>n(I z^l5Os=2jVe1W(pia8PtvOqojx7%cBum>>p-n#)qu;wn0)Kd8wdEKjojBO_}!Fd@;& zx^9LZJ9tTW*;w!+_zY+CemZ;w_gAKLqHCEXB>yzq?4J#9n(!2nvOQOR(2I^V(=dVz zD%IO--ue7YrG)MCA#p$p!K$U&Dzs+}rHJe`hGL!T4}Vm42QJ*U@vB<=X8LFMnRjoF zoEMI`)z*NP*9T0CF}B#1D;>~@OV_@3)<1_9Og^+h-hMl_t;(-HwFJ+2(OjF@9-`6z z>;8Pd4OJNSC9=tVqrzs!GKYTYoKQ&3r=%mT%M_nw_6qXahw=o!HvqUE7Br;jrYn9o zXVT+a{ML(S+JFnQHk&$6Gl;eFCvn$S4ivF>yN3? z1iZu1u|qaFpW&*?67ys1osO#xLHptnlH@fHukEn!P;Dld4$X+7g6 zCJRPL9{0|@qPiFzg>08S3=_HdK(};FTL)jV^R`2^8`4ccQ{2yurJclMSha!|ku+;{ zUog{`ENtvM?>OEq9^YjOHmRpN`<4^=cO-M;o_xe*#86Zra4_@>Mz_cyt?(e^#2~tI z_Q?Oj+y%;+@6%uV_qrBB?MZqrZRDR?h=3*8T{^}ETHx2!V@22bUT3yBHF#8JIdI|# zrl{J^qVgAP)S0It6-4!==G1ojR&j_uKix~?C8{k2RnZf)8Hj8qW{i3smp|*-mjCZs aW>T`Xr?yWxaMR@f6hL%#$JaRpT=^4wWL0PY literal 0 HcmV?d00001 diff --git a/app/ui/icons/add-effect.16.png b/app/ui/icons/add-effect.16.png new file mode 100644 index 0000000000000000000000000000000000000000..fbf7994cb0f921ae4080d6dd2b70934a2fa11cf3 GIT binary patch literal 431 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fce_o-U3d7QI_1`SLM3inQ!kcYdT`woPfH zh`qZ&*|g1titY~t_!PukCOnWkkBrysp_Bcyhb-qX8-sF{3YI8Io{{~Gs@?PhX{Do90ElIgQu&X%Q~lo FCIB|Oo9zGq literal 0 HcmV?d00001 diff --git a/app/ui/icons/add-effect.32.png b/app/ui/icons/add-effect.32.png new file mode 100644 index 0000000000000000000000000000000000000000..ea10f402da5bf1328847012a549723a49b68c6b0 GIT binary patch literal 573 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq z*pon*(V}YRZJ?lJiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0u_AVrR) zB^mie48Dm)C7F2&L8Zmn`DNQrpP31iH-;EeT9lm1kWo@nV5P60oS&PUpI59`o|&DQ zo0^iD2r^C|#M2K+%uCOY&rHtGi<_@8fq{WB+SA1`B%<~0G+RGrLxI-)of-?=xGofT zcyKT=or>wu;Jr}9!sobRC5OktC4T!or&!x`SxhqjRgk>8DjjAEnW5jV}y%N+>Wgbwy*ZvwwO&c zIjw78ov##l@!!e3#wF68@srfnWj1pNMpS*CaY^K1=hnVCOy^TMdK#umFP37t)w*P# z^*?{l@Okym`WGE=HeY93AL6Ur@sz{mK9i^LwXZBE&b-;A#dtsOZ*)N0feBmd((~?d zNC_)>$|gKGvvDTt)2izK%@*?lB^dPQ{S_0wQpIml$&~zEbP0l+XkK$zR?N literal 0 HcmV?d00001 diff --git a/app/ui/icons/add-effect.64.png b/app/ui/icons/add-effect.64.png new file mode 100644 index 0000000000000000000000000000000000000000..7b16cb66f76b744df7ecbed43053e23953514c10 GIT binary patch literal 1023 zcmVVJ>fSXD@eYYiTc3VQyz{Uuk1+ZeE`# zkN^M!9Z5t%RCt{2n!jrlQ4q&Jb1{WKAhuVDVq`Ts6`4vJDW&QI~z4BK`SjI=3*7U7P}YE&1LWH-Fv%x-hN;?^4{Leyt%hC^JW7T z?noMuG*Yx3xg+VQqz95dN?McjP|}H_?ec+jyFt(`w8adE)ul(|#B3@Hj12kcLoJLt=hqHuA*e@*3pq75h-1Bi3_EKyKPd*)sE z1-t_8nAwN+2}w)9$v)-xOA}ZH7R+qjB#i@)=zrl!wtz`9`_dYaGzHx9tfyCg0F4?j zhyTSxR43d>jJ*k+Ig_*ogsShifpIh2hUhE-ybGu=E1Sa}1P|2+yDe8+zkW=e z^8EThlm>4S1uWk**&PE)S31|s>^(3Iyugnmnz5{DGy9sDoADsuD=x?3~;j{7sm zKi%vf_8>Tz4va=UNp+$Q)#0|`v%rL;hM9fKBF|+9qy@%i z7G<88=ikM*7$d4`GvVTZ*FDaK;!KZo9dU8MZ94CQCa{oIVPKT?3tb%$cYP;;mqfMw zHn2i;()*NEp$Aq|=2o%_>skl2(|ReAC~tEmj`mN8p80k*fQFfUPu%aX4luLrA{QUq zunshU=fGxsJ)^_oo#gp7FCtD=^ZX4;I~|x1`nuSXUdcKLSOOjsof=y?whl}H7tHKp z;{Hx~8sZL2);!%WJ{-_4ptb#Xj+#cedo7t6aI(^d30a+_Sm$SUrJRO?6 z&jOkAbZA02z-yikO$Y}p5Cyy>8${iwQsLbJzVmcws*X@zhGap~sHE$XR^#iMq|p$% z%GwaQ3S4UY`*Qs0{q$MN9RQr~Fg6uJQCS_(iQgfFmem2vj$?gO));U%{%k!8%fP)5 zimEi2mmy_k=pE4aBQWR;{SK%cP_zL>5*r}e3$y?L002ovPDHLkV1l`x#<>6h literal 0 HcmV?d00001 diff --git a/app/ui/icons/add-transition.128.png b/app/ui/icons/add-transition.128.png new file mode 100644 index 0000000000000000000000000000000000000000..ae2933b1dbb2ee1b374b4a34ba6dc7c3668b6cb5 GIT binary patch literal 1904 zcmZWqc{H1O7k*!PiKUv)Qc6mv)HZ4>9V%!`v{4NuqFOYGT`dubCb4`HqfLye+G}Z1 zbO;lS(pE6(RMAnTMH$=Z*oxM^e&|e``D@PiJLlf#KKDN7x##!SO}gxKK~`E-8UO%U z2MpR(gslCLln~{YHl$7wKvY`?H%ZZpmGt9^xKsq@Dir|KIQs#nPA&V3nkqDV4;qdf zK%*?q!QtPyMo~k^H=lOC z$ra5_|1pV*^z{dVXtW4RBO_mOSQt5+YDfYnGozt4!>Tg zdk+94?mD2)xiJd9jE*KN;|~j$7gs$6OJy|)>1+HGFJ$ziO_fhol$SQvm}yC;e+BFW z_iQE62HBr3>MG5OKk5JElU2U4<)+b=tY_Dr~x**pyaC+No zfjs>Nwi>ZvMSYtK`ra{VJA;2v$)nn~lftpF=H)znR{hyC#;Cnjt#M^yA@|6792Qsb z6uR7xVu9nickEJueEZ3S>X7_Dn~t9y>WY`K%3RHKAwJ-Gtx)1{UhOy(sv~|CR04;s zy@xF#oB(_r#HbZkRN|wO=GRk@N3DhP;@t|w6wW*nZX-YLz@g?uKWm|kYk~_D3;M%< z+Qfh&Y6`rC2Po({va;)-pws_?=YMrc@aA3$LxebCb7FOWH88`P5dK$g+o0Ql*N9~B z-v~7*;ubPTV7JkeeevL)fW^3|fMarLNfjnSV0k1KOA#*f5+(H+=OTTABpgDdCM^bEtl5dn;gI1^Hqj4eQ|s}qGRsZwVz4S^nM6PH25r~|KV5ZV@#^^-Jw9?+`C(t6m6OLg2Mofd8GYJvAvp>S<}9#e5J zed5`D$B~OP;61y~a-29AaZ=Ct($CdPJ_9g(VbRksH-4hk&5mnba)x)8sQ12zPrC#^ z`iW%8_>YH601-QGW$WH=>I8DF##LXYyx;r5&P*U?fe3}!LfYEcf_=rd-8H>e7^ATw=su53 z17;%|yoEBwzItpi0w_THjnF6F>9BZw4V4332sKBkHrA%SUul&LIv3zYBWvUt$_%qm zvoaNlhNO<|lSZyP5QcE}l*}^(D!V=nXn!x4Qm z(`9(`*8wk~d$gysv2<+D7uJ(L&joomtZar=JAHd#HYEqbnBU;T56)QZ8ZVu{y9rg7 zUM(AA5;M4=--?XwRjQL0b$+ky?OxOUs_|OvZS(1D3bwuu!FWTDWoNpNopx^Dk)8~A z{9V{u-tz3kXt$#j@7h@4Vz}Epq^l9PLg#K3eknYj+l;z8ZSSQ}2oT)`2Yz8uQ8_M^(NWjShO5Na?#Eb^y#!A2R9BgKo#h znlCBV3|OnSLW8cHQys*N@57&c^KDfW!Zv9<#rK_BpL9-U~4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fcf!o-U3d7QI_9Z1iFd6mWa^-mB+_!Z$On zvZO7dIyEdCFP{tBvVDVKQ)_=h;zMPYH7y6&Olzxjk8nuNmcF5rJ&ohv*#l?h6t{c( zxx8_8IUX-8*xaEZ_B2XxW3#DF`bEQgA9@b6{WEoSkzYOapt{+`e1V?n1zmY7Zyx2` z_N+mF=eEmRgaw&dt`#=ct_eB7`L3Xq=~R=S*p`Ce&#ySrHJ8TSlRtI(@|#D}?4}=> z&jowEzv}q2DUtU_F_C`_8f{YM&q6XX)Q5=jtMC|Cycj rR_~FVeW#job96K+q6+@Ye_}qkJak^b`5VuGUT5%h^>bP0l+XkKVqUnt literal 0 HcmV?d00001 diff --git a/app/ui/icons/add-transition.32.png b/app/ui/icons/add-transition.32.png new file mode 100644 index 0000000000000000000000000000000000000000..bc4cbf03115b4f142bf4e36262e81ab3c9e7f43e GIT binary patch literal 641 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq z*pon*(V}YRZJ?lJiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0u_AVrR) zB^mie48Dm)C7F2&L8Zmn`DNQrpP31iH-;EeT9lm1kWo@nV5P60oS&PUpI59`o|&DQ zo0^iD2r^C|#M2K+%uCOY&rHtGi<_@8fq{W>zNd?0NJQ(~X|~?Xjsk7-%{vkn_6ls= zE|9ZDfQ6fTtB~OTt`)69EnghhxHiq5aOlvXQ`aQ8xupf)>T`-MitXxgHJk84>bDN zov!4Z!N-}$tla=>&ZmjTZirrUxK7&mCIl)3cp`Fe#Wz0A^6*W=vm z-4xpHHSSsR*<$i!tAJ&qpA_CP70PBXxF0B7&*gu*Q9Z%?lCw}jbYPtu+Z-n8zfI0R zI9Lw!Ety@{c$-VO(L2GG*W$}|{v(&x&*!Y=3t>O;UGC&J_9re6BL4rn{{9uSAbVqV U^rmg`z?f$6boFyt=akR{0A@7&s{jB1 literal 0 HcmV?d00001 diff --git a/app/ui/icons/add-transition.64.png b/app/ui/icons/add-transition.64.png new file mode 100644 index 0000000000000000000000000000000000000000..0f2b1ba3d93827e7f7c4999a81af9bac7dde03ab GIT binary patch literal 1104 zcmV-W1h4yvP)VJ>fSXD@eYYiTc3VQyz{Uuk1+ZeE`# zkN^M!Zb?KzRCt{2n!T@7MHt3^&t4jpKqyo?17ZP61Gy1Esp&^3 zlG>zaK7@aPYrt2M{$hDj~<=za~x~?Fcbs`%U0npkFb#3w#8eo;0YHBxw63;CLIhN)~~=k}g*bOd0^& zvb~3*(AtvHR>>;x1@Mlfe#j4^XJp%(fUUqAz<%K6*ft)*67YWA8>)~1tg!x#5EKdT ze{63Ceyig^1Ppu)9GA3O_s1cRz%MoWp0DdbL;ApBNuN%$cnAx?Db|dXlC;=llF9&-&(uEPXNuZ>2wbH&>D?HOv#oMmYVHE>NqSe(?WU7e)&ci3dMPqi z-j4eA0B4&zRKX(fL1>1D>N=*D3aq#A(#VUzXLaVP$trLLI4@}}=ERL)pO-a={oZtzj(iT_Hh3qWoMauX7OLG_SFmU|%qSV-4nJ zys-db#zO5=Kn8mY-s=h literal 0 HcmV?d00001 diff --git a/app/ui/icons/align-center.16.png b/app/ui/icons/align-center.16.png new file mode 100644 index 0000000000000000000000000000000000000000..87bcdc7ee6d3ec52c8c663b10c4ad9567a68b0c5 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ z$hLzpWB=2SsX#%=64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1TaJzX3_ zEP9jw{Qv*Io{ft^SalXVdqRt$2QRl95U{m96l7ccGQmXFz`%fk!I4LR_1haaE1*UO MPgg&ebxsLQ0Ij4imH+?% literal 0 HcmV?d00001 diff --git a/app/ui/icons/align-center.32.png b/app/ui/icons/align-center.32.png new file mode 100644 index 0000000000000000000000000000000000000000..c9d4a75f0cd301158ee64ce0b74f7ca1766b277f GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq ztocBg@yxb`%|JoP64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1TSJzX3_ zB3j>GQxsxQ;9))}^Z$SGg$Faa@=|@1Z*k_%cFZo?$+$%2q1>K-+y^!m|KZ|MNR4nJ zl*xcF9gP2NC6eqdb&7< zRLpsMYa?%qfe5Rk-QVvyRt*o9L{CUhYI^E=Ea_U*>l-&B*{|>fz%c_u$g`J?>+g%7 zIrG*!uU^Q+K{mh`f*BYBX0ES)|3B;Zm&Pyhe` literal 0 HcmV?d00001 diff --git a/app/ui/icons/align-left.128.png b/app/ui/icons/align-left.128.png new file mode 100644 index 0000000000000000000000000000000000000000..9e1a0d2adad68b2b31e97d74023eda4785522175 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEX7WqAsj$Z!;#Vf4nJ zys-db#zO5=Kn8kLD3ID2}opOjeZ^FQDFSvR4Z{^qZdl|N~2&gw$FdpGl@M9=s>JWCA z!|(`22xt%(RGj(2Uyz;ltY}~N0(|PhM!+=5J+^n4Lz?;n8)wcu{Zp?A)fIRh#@@D0 UpwuSGkOgF|r>mdKI;Vst08e~oH2?qr literal 0 HcmV?d00001 diff --git a/app/ui/icons/align-left.16.png b/app/ui/icons/align-left.16.png new file mode 100644 index 0000000000000000000000000000000000000000..e3e67ed53785b9ecf410509d5af8d3024aac9cb5 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ z$hLzpWB=2SsX#%=64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1UFJY5_^ zEP9jw{Qv*Io{ft^SalXVdxDB7kA$S8G+bGE3z`^AB<6reLzCR}vclz?G9K7hcXwmf;KL&?MHMQ(H)w8chJ1{)>!}sS3 gkZ!1NU^u{V{;`1Qsu>M3K$93eUHx3vIVCg!02PNkp#T5? literal 0 HcmV?d00001 diff --git a/app/ui/icons/align-left.64.png b/app/ui/icons/align-left.64.png new file mode 100644 index 0000000000000000000000000000000000000000..57382910a4c938ba6803be3d8c9e827944a3365b GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=EX7WqAsj$Z!;#Vf4nJ zl*xcF9gP2NC6d9db&7< zRLpsM>mcV50|AzUw@=$YFBPaVaSE+>HrC%*QC42h|NAj@}!PC{xWt~$( F69AJ5PwD^w literal 0 HcmV?d00001 diff --git a/app/ui/icons/align-right.128.png b/app/ui/icons/align-right.128.png new file mode 100644 index 0000000000000000000000000000000000000000..0bf940ad507b7f18dfc45624e7a70d094097dbd9 GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEX7WqAsj$Z!;#Vf4nJ zys-db#zO5=Kn8bP0l+XkKG;3y) literal 0 HcmV?d00001 diff --git a/app/ui/icons/align-right.16.png b/app/ui/icons/align-right.16.png new file mode 100644 index 0000000000000000000000000000000000000000..14ae24b4136fd3a7aa3e56ea152fdd1530fc91b0 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ z$hLzpWB=2SsX#%=64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1UlJzX3_ zEP9jw{Qv*Io{ft^SalXVdxDF&f~ilNvqaCb=8Gi<4jf=$_;iu~@B7$2e}P&UJYD@< J);T3K0Ra7fGdTbN literal 0 HcmV?d00001 diff --git a/app/ui/icons/align-right.32.png b/app/ui/icons/align-right.32.png new file mode 100644 index 0000000000000000000000000000000000000000..a7f1bbe0d19566a9a77f6d237938c388afc25178 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq ztocBg@yxb`%|JoP64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1U7JY5_^ zB3j>G+sMmc$ieLJ`S<%bJriEJPTVcUX|CXZJMH53oiPj^lXmj{`Kx|yy#s?p?Sr2T d3-~!0*e7QQ@Omazlmks+@O1TaS?83{1OOzjIpY8T literal 0 HcmV?d00001 diff --git a/app/ui/icons/align-right.64.png b/app/ui/icons/align-right.64.png new file mode 100644 index 0000000000000000000000000000000000000000..c9c0b0e02ab97a2eb7e5e3cbef462d2a1235017b GIT binary patch literal 248 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 CUi&xz literal 0 HcmV?d00001 diff --git a/app/ui/icons/arrow.64.png b/app/ui/icons/arrow.64.png new file mode 100644 index 0000000000000000000000000000000000000000..3d352903c34769f318cc364c23c007229ad0ddf0 GIT binary patch literal 1080 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 literal 0 HcmV?d00001 diff --git a/app/ui/icons/audiosource.32.png b/app/ui/icons/audiosource.32.png new file mode 100644 index 0000000000000000000000000000000000000000..f838435656b5e5a9abb473cd0f175906d40cff64 GIT binary patch literal 506 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq z*pon*(V}YRZJ?lJiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0u_AVrR) zB^mie48Dm)C7F2&L8Zmn`DNQrpP31iH-;EeT9lm1kWo@nV5P60oS&PUpI59`o|&DQ zo0^iD2r^C|#M2K+%uCOY&rHtGi<_@8fq{Wh!qdeuB%<~0bz6NFN15Xv-!E9~uKMwV zmWX)xi;#QFf=itiUiI7(vxhC;;bE8XdZtdlEiNxt@6a_9H!s}0dH2LO_BYeg)9dEf z&YIi0E=#M_zc$1@YyHUwm0v?@wQ?6{9@kIdi)Yen{O58x>n%g6><%Wgw3p`7HTUq} zIVZ&@y1qfGf%!qpk;$HHE4mM`ZkTQ5X5M!dj6nU2u&h=~al#>M8w!r$S_;--zB|e;4#CoK2)d z|G|upvmWd&bZ9haF<{_p>_5h+dSb#y-O4=H0EIZNBemKMOdmOA7|n%!-&+>{3t1Y! hdEu_R77y-U;g1bTbKA1j&K?-V44$rjF6*2UngC#;zf=GK literal 0 HcmV?d00001 diff --git a/app/ui/icons/audiosource.64.png b/app/ui/icons/audiosource.64.png new file mode 100644 index 0000000000000000000000000000000000000000..5a778967a680f05583c9f8489a5826919f3dbcae GIT binary patch literal 872 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=EX7WqAsj$Z!;#Vf4nJ z@ErkR#;MwT(m+AU64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1SakGJP`ofL3o zO3sv^O&4?4=!m5L@kq*4l%8@_W0T2Iro;Ex0#gpgEBLzU=;Tajoixi$kt@Et`l`t? z>+iMC_dd5Yo_qe)HCx;B-)r7gpZk5yR$qjx^^nftviWbbx4Gx;-(s7yd%d5osqDJz zH|}x9uub#*^@`g-;brX9s?W2yu4U(({>J%0?Z3ZVf@Q(7th=nnywjL&dpCF=SeM!M zZbg)JHRCq(3%{a z&0ndi2fj%qNZgpTD&5Tcz&Eo8jGXHHGdX5#xEH?ko$M}_9DOD|2KGfpEu0(nO6}mw z={?2Z$dr@MmdEf~>6gFCPq~C@{(^QMHGaF9986ptN*Xe{8eTA5ydwBv?MIPDAhiWd8MwT5xHMb<;J#|#<%xgHG+rte2>h6_>w8Fx4ZBAb z?;BP(kSE?adR&qy;MpNPmC?vj`;MJbv0Q}3<*1u^O>-xdNLw(~_}#VUW@MP;mid-@ zebBeFZVU}e{0}5Ps9QBJl9OS=m*7j04`e>9zW#TU@Q40y`wB!PUZ>8_VP)`;Vq|MD z-}`FfRt5%7`G&s-ChN8Jhp(N#7s$QeIQf9+1ON7g=e4e{lh*3u)A#MYT$TB%_EW&h u%>8ENSHE%JK7V`ub@%65B3zsM_e*9i{>Xha literal 0 HcmV?d00001 diff --git a/app/ui/icons/beam.128.png b/app/ui/icons/beam.128.png new file mode 100644 index 0000000000000000000000000000000000000000..296e433433130326f9c4c86a2fde3e56e7916281 GIT binary patch literal 1216 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEX7WqAsj$Z!;#Vf4nJ z$hLzpWB=2SsX#%=64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1S?Mkcv5P@A&3jaS&*GcwW%y30Fs| z$~u8U_HQY(vs30~Z*WdLFB`C~VTx{yqEPn?R=z{?I`7s$T{o|8zUsoa{&OesUNu%_ z1UiMGA&zGw_p!nn{g;!M@K3tuW!1mu$l@jOllFQ4vf?@1e}m`P&uM#}pFJfW!|>Q* z-?S3tmtL15&-jMfc)mX zXbPxY*>QPR(4Oaa|J=P=QNHfyP9QJpboGH~#yjt~ESqxeliY_8hV!v&BFZn{+Pihy zcMX5mg6Wsi=U-d$N2v(J*Jmxze`%KdckQ>@E!(DjciqbU!1I!L>X)mknNiiYv8O+M zycKottxj}(qRjF3L*KvD?b&rD>fX#m3B9oTeWi_em~L=2lwSKC|68=-lt#n3K!&;8 znhnQ$UO!)RG=AA{`5*?%z1iWl@7-p;tM_1hVxkjcVl9=v>%SuFgj>7)-cC(ESMuMS zTVZke+$-A0=Y0JaU8`gBI{EU9&3FDU_|N9{WnK4|Q-C}t zL4$-0o9VJI|EA9qj>zegd$#7=eEt@b1;5yxMC`BYl>YP3W@U=eIXoyEB&bF};vsyzeg3M?y|qjqKIJ#u z+1z|1u5#VAPy0@IGkRRQ`o*rtXzj|2MR~gK1Ltume0_7^i|npNTlcu{kIlU{<&kavS0FR!U1+h`!tZ;oK4&@RwKM!|WXrwJ zVRMBgv`g1Lhy&%9wRY+TVV7bK%6`_ZJRe=^m#`)+YPInD%GGB%dqPvzElAv_3gn#O p?6KXK^S0t@b=>6|aQHkZ`NQ~7&}2>DG%FU6fTydU%Q~loCIAkBH?#l% literal 0 HcmV?d00001 diff --git a/app/ui/icons/beam.16.png b/app/ui/icons/beam.16.png new file mode 100644 index 0000000000000000000000000000000000000000..2ddebafa9bdd9251d8aab6c9348428b05751ba7d GIT binary patch literal 349 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fce6PZ!4!i{7=9t@#=h1YFFIv~b^iTxlcO zzERce&eNM4GIUy8m(AJp*ViGXt$`!u0n4`O(;Fl9tTnh=y!5!0!S{8HLKAqT!|OEf z<;}@^dRyC-_voqDoYw@j-|t%?_mZuB7da0b@VNL#F5)if{+GJG z=eo~C)=R4E><^w;D|-CMqQ+N_3L5PyGKD7`HaHfkSWb?)Vmw)f|3%c6nSN7#a6Slo zkt;g!IAd(L*-JLjEt9GyWbsyOG3YZ~cF(!>D18g(U+!sdnosP#6eAo~SIe~e` zf3lMHFWbp}?`QMpKUr)#>Stuu1~VW1GflW^N0MRvSmb xJjP2@?t9a#pjW=DmP%{9{Q%@lde>jce1DP4cX5}?Z9xApc)I$ztaD0e0suZqq%;5k literal 0 HcmV?d00001 diff --git a/app/ui/icons/beam.64.png b/app/ui/icons/beam.64.png new file mode 100644 index 0000000000000000000000000000000000000000..a1563674fccba4e1373efcf439e93ad552e4c17c GIT binary patch literal 658 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=EX7WqAsj$Z!;#Vf4nJ z@ErkR#;MwT(m+AU64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1Sr9|#^ed*mMD0qzF7mJbuFPB`t2+U2=7ka5uq;fCFki|@~2lv#cz?Zwqgpo&LA|0u>)^Y=_O{CScZ-r3(FG~cp${$@|9@@qTk-l7jW_j-c#>3gUeVnO>0j@-^v14WxXBS@_v-^ zpZDJHAoSVQlU4sO6T_>RDPJz>FW7WV^1;&hgceibFMfq;7Om6k8W;H#Z~;}Uy0?O% mt@=mYFIKUaf=+sq^@UF7{=M|}{(WH7GkCiCxvXc^5 literal 0 HcmV?d00001 diff --git a/app/ui/icons/bold.128.png b/app/ui/icons/bold.128.png new file mode 100644 index 0000000000000000000000000000000000000000..80d9818cc3b02af0d295ab9c15788602157e54c0 GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEX7WqAsj$Z!;#Vf4nJ zys-db#zO5=Kn84nJ z$hLzpWB=2SsX#%=64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1TqJY5_^ lEP9g@Bv=4nJ zl*xcF9gP2NC6e8d%8G= uRLpsMkdYV2JG9`te=eW-0w5C^G?X(tI505we>xcm683cUb6Mw<&;$S{jw)*a literal 0 HcmV?d00001 diff --git a/app/ui/icons/clock.128.png b/app/ui/icons/clock.128.png new file mode 100644 index 0000000000000000000000000000000000000000..2cd73d9f7917152eb8d935165682b2baa7652d95 GIT binary patch literal 3684 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 Mp00i_>zopr02Zg|A^-pY literal 0 HcmV?d00001 diff --git a/app/ui/icons/clock.32.png b/app/ui/icons/clock.32.png new file mode 100644 index 0000000000000000000000000000000000000000..361e1031a8383e2a8bcc012897c7733f597765df GIT binary patch literal 969 zcmV;)12+7LP)VJ>fSXD@eYYiTc3VQyz{Uuk1+ZeE`# zkN^Mz=Sf6CR9J=0mpe?9K@i7(bC^gY6cP{Ud~_m-l-j{v0$SP&N+L8C8mx?!So)}l zLC~m$Hd1LqcvWHv5w!wi$4fMd4HPmKy9aa2-raZSCHhakR>cHVwF|fjG$u?O zVgYL3iyIsdw^!(7|;P^f%=H= z8{k?w(Y9= z&VTI@eT%Bj2C)`ZwbR;(aj3;jt=({|zy%RmizJu@(q3E>k+Tt-G%#lDz%5%=M79A^ zM$sK4-vat#$vx5qe(%Ej_5<5yxEZ*Z6H=aO4X(~D9*fAQ0?89YL_Xm5k43NF?7K72 zM*bo519md1OLL)Gys;4SQ-Wo}+z+f(U9sy5c9C#SSN&_!db--_?QifkHNA zKym%R-9&A9K%^7*Flj1gR|LzrHJ>PCkmPB05ZA-?;yRfm*Z@X==XS$YM8FV9;o7L& rVJ>fSXD@eYYiTc3VQyz{Uuk1+ZeE`# zkN^M%PDw;TRCt{2n_Z|?MHGO)Rch(=7IoF0LbNgrqaVE*Syu>CxupH*Lu4x2#s@fA61`GiP+D{A63^ZA>0?-MZ1y0$|G2ozxT&$;k zb#Z{I_642*#sc>P-BPN$415cG1#A$J-?FjrUov%os*V7r0BykaS?UJ<26h4~L}Y(f zN;7eQsy+<72|SpEJ`WB7OGIQ(t%_=LfU5Qb-U6Pg)sU2I2j+^%&uJB;c7Upm2i^yI zr`3@Woxp4n*_@_wume=}24D{GY?=n^$ZBALh+GP(6yyL^?FB3c9to+JBm00?MWoZW zg0}-ywGXfo7@Wee3%~(jKX3x*z|8ptTiyip0r~@jfZ>?6L$4HV9S2?zk+VL+UJg*z zW?&6romXH7unyQBIyCKH?J-~?Fv{0f%W>d25&6?4=u~PAS&8{oeAx_qEFwP!)Jd}8 zZeS`fE}+^T;3b#ieH`!s{tvtkU``hEa}`@g0`oC{6(3fM$lN4>>l_WX`%80rtPv?qSCw5n1CQ7iDD1vI<0GHL%!2biAs@KE$hyfHyppZVLS6izJPz;AOQP z317IxFn^Z{DjZ<9v_l;VJAj!U_T|O9z)udDR#j~+zZo|IruZ}{A{Trt%L5T90EyF` z<>m4lT^wMSyKN37n?>XsfAjJ|M0Q~!M@h7)YD@G+`3RUmawJEAW#Q)K#!`}Jg>INo zU5RoBjBzxuLqvW^VOTDR$oIh44zaP(FC_=q=42VuPwnMLHp{ojaIm%BJFQOyB<>iWKN&_>(QC{k6)B#5wm0Im7QA4AuH{uTI z9V=c$9dHmx+U)egoYgftj{`ju$}bbyER`H!v$2jiluxY5w0wBRQGPg@c~-sdj} z*@Mc4L{$gl&Ry6N{Zj6L4VY}KY6#|(wo#cz@=@6pU{mx)7YEopyq%6l#@UmjhC)@_ zfYA=Io#lxWaeILk9_`In)vT7rHDePv=6Q%#^sT}HHVN^dLs5U=Loe&{VIFY1LuQ|d zR7AC^?FK*cXtdoPQD0S5bt>jOBT)=k5?2uG0Gs5n(WCw8syf+2t}dwR^Oy&pi}i88 zJ|rhd^uugMnq78a(pGalF|xnBPv_5L5+u&V6;=(1*o=x<9t{X)BrI3en>^%eLRFho zbqRi*2bfi@^WcaGiO83j3``%!0H3RB-I6HnRJW0`^SuOCiO7~D0iP_f9>8b7L!OO- zSy3*vXLU7WS9sHK&+}1s15-rga*~j5qGWGOqU1dR1}NsBaviYEp4j+THoLmfn6>?* zzP4J90h4XsKq4WjvMrc|$q*+LxrkX?6jNnSQ<*B;f;q6b6SJQmO7gC*8s7mgW|}Hn zTSvRzczOT6RY@C zL|nU7Z|e2pWD8wioa~WO)g|CCW>2zFL|mu7!Q}Po>`+Wv$^hUFl3$%Yi8{RE;nq8&f6h^A#_0{oERRAmIBT?jADC9bV>;Tl*;AC)J|Hm(aTlR z$YkkmagJ0jD9#3Qxtt*s6_jKOB-spcac<-EW)doLSr)Nn(mZi7h!+$~g(4bPR#G7T zx@+j(cPPK{lZmW2GaKYdrIH|D-%N2)kyup1kP8chMcG+G!Lpt2GVOkNlTKbzA*=$d!@o6ztD;Wz0syxv$xZND`!A6k#$k&Us{G>X#J z%wJDv#*Ro7-W0VT2s$cm;nZQn43-W*xF5HY*?R)Z&I33@SHB1BsMA{$^B_8gMKU^6 z)5xIG%%>A7u%=RlH(AXD*rVcu90VJtwRAAyaU9I*b;YU*fXdJ{?jdoc>8%X~5Ch{$ zG8R|sD9Q>mpF!xx)|D!TDA)jy$n2eTP&oo`ls=HbQo0@!Uk_ut=&B4|hdfr=hMCg? zT=WPaeLR1N{^GMR^L>Aaodihxb0-K=oYpem>8)k}za_mae1xnV2))68HP{jB+J|KJ zMnLLIjVJhFw3haVPHY(pQ{oYxjn>kbL}712AwPk@L)o4rXZ>B&<8m8~Wv?8dKDi4Y zv(;KAq(t?3kf)GSYD^h`WGsrJvtZ?b+^C1&qV#PkqP_+479~?Prh(3YLPKAKIqIdI zXvo&lWbR|PqFU;&wglW;TCJ`Bca_9Ov1ftT zRxqPnC~*_`d~lZFYtEi~TqufN$ch8gywEDr*sF#(&?}Z8n_6d{?M=qcMjkkDaYK3F zd_Ph7n~9dc?JA#vv0l)#M^7!CDHGW19^2aO%G690+v^(tKV2$ha1*bT+1=EXef7ES z?fzqo)#T{8cHkBl>YBEgqI>Hw_x#$9mK$@0npR`Olgsya;LZZymrYT!S2nZKhmCJk zbxl(rR7kn!m+5n%#2kCo!lUwaqeN`iwU5c&UeNT*`8!A)JU;rdUC@9yiN{Zd`_NZD zuwJU#?vf25EDUJpm~s>n2qda>V^)(BXx?fPDI_r9x=R8>ST^8$q?|9d8!d}I06s{_9+V;0kDcTYDJtt_f|xtfMJm44hM!nHlP!! zpir?m;0AMQ@p_DIC-l@%34sh)?P3lmf)Q7?#zH567i!v=way9nMb?QF(J;`^q60%b zZ9oE{nL;JvlwZKyTKrv%Zj-vi|76C@!gHTO#-KGD{mmW2&(6I8KTP>Ns{LcUrDv3? zo9t}#|M4dhkd%A8U)9(n?XwYy(%(B;DW%Rg2N#oiKjlgO)Cc^z<5hdt8B-$A)B`b* L+ao$T8S4K4`f5xc literal 0 HcmV?d00001 diff --git a/app/ui/icons/diamond.16.png b/app/ui/icons/diamond.16.png new file mode 100644 index 0000000000000000000000000000000000000000..26cf33d5d471a1c8c92513d49a9d3ab2a609f762 GIT binary patch literal 380 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fcd=o-U3d7QJgH@8)GP6mYp8l7HVc^^iWj;m*HFv+=LGKzs{_3cqOCl|6Xy18 zo!Pi{$?JN(jgCQe$GAMpCT_}%eCqM(cY4*tFWY{vC}y7<(eW?gUq=Gal?1;4r4tR3xtcWjUfY%I&@p1k3~`umgBrfB-aB-I9nK0k14uAIw~KIc!| z@he{ihWfv=SoP|ZQP>Bb6|aPDFrMy@HeVn#vDnDLe~08l-VYq+ihCFsA0F&*Y*4h} zxX3Lb_^$T_iwnnhr#~z%Jn}9zj6yBnm7*G29?tC$S8)E}-?HNa(+%eCBM;B-Vp`g9 z#khRo8Hv8rw;0Z_$@xV7;=A#A#4nJ z@ErkR#;MwT(m+AU64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1ShDUt50s=xEC4yBRTvB`=C+8$v|GPQ!@4@@Ii>DgB4;Hy;z4^eIGd-qCMT$!I zl{Se_oZC^;c|yrW_uQw`E=L$67$dgjRI+|}G)H*#tTQYk59JwSWN+?b{E(u0(B(kG zha)~syBY)^c6PFaG729OF6GQ(vT0FYB^1I^!Q+2Lr9ymxz`PY6AG90{Z9eK9oXybu z;mB$heI}m6!udjK+#CY)Dkd6uIvn_rvZ>`FlM;u&nx}-S!lDl;TUrh>De?Hbc}l1# zJo=Ebq2(Tv5QjgT=L=PZg&&q|Z&}PF#N%J(`9fquK}AuB)9MDELzDeDdzp;5{G(L= z2u?_>xTNuLN#bL!pRMc--ZGm)S8!oR zXLuL2ZAScT?xqf%uG5qDSp3vfdcN@WteHRC|1j~$NAf@BD5?ggI0jEwKbLh*2~7Z! Cu_x02 literal 0 HcmV?d00001 diff --git a/app/ui/icons/dirup.128.png b/app/ui/icons/dirup.128.png new file mode 100644 index 0000000000000000000000000000000000000000..d0f3f6acb92269faa1778cd3c8c996ce049f4793 GIT binary patch literal 1452 zcmZvcdo7+|Ytd#QNgOgsCqFMq)i%g$YEizY+Bw?C00kY2O}!pCd!yp&zG5XqnhEw>D*pv zDOp2nkIl--S1tnOPDR-C*g%IHxh`kN*b;hC534X#HHke-bL_TPZjs$ddK7fTXf}}q z4A_r$v#pR`E^Q5L=%#%HGA8VP@rUfolc5qYAOgww#dhRI4{*q6>`f{l0fn6?z<=;8 zFqnEBml`WSvc7Q+$>`gE`&0F* z>w-RCo6&cG#b28bFw_{V%}`{`Tr@dU6{{ot70DQ)%;@D9Q0Z$!l?rA0f|bmfg~_s9 zwo^uZ{p2bO}Qwk2QKSP zq!J3EkU?I8)_WiYq%vWnNU{W!!Ha8Piau^sB{j8ebQR8asZ&ZM&wwKH&S(z$p2pEJ zm6T%F=palGDPNoUI3bL^1+DkN6i`w*nd9nzln=btn`qu%a2eH@xg4u!bk*X}Vwaj! zB6$i_!U#6HUSkkOknMIk2x%haH8URv#6B3&4w68smb*A%nYQGso!W0*e-E3e4?Zl~vM}gF;>nr#un=kiJZCX5S$_1f5aJ?pR(?HA2wC zGP&DmYcLUFieMogR8q%rMAY&KkxtmQuWdTNB#4t;bzE^vEH&o*`GvS_|FJS+N>|Zb zQG79Q`h?<-iqG;GgjXnQ#{=VRDYXN+JWf=fyw$x0yV6#7UAvkyoNsyOO_gmlkk>G5If zk~OEoXv)3lKc80tkSgCl6 z(uH!}gwerSQzEZ14S-q4@Y>)zT)ny$$uA$3pJ1o;OY9 z8sNkZLizU-rj1+OX0|;>)mqkoR&`lfmUp%;v%44cuXq>lZ$rr}b<202zA+mozxwqUi*!)ts?aIy>(MfZ^ZS4O avt$6dNROGE6YYaPMIhKe+^@x#TJRr7XLJ_; literal 0 HcmV?d00001 diff --git a/app/ui/icons/dirup.16.png b/app/ui/icons/dirup.16.png new file mode 100644 index 0000000000000000000000000000000000000000..9929522d13b028ab6f52436d98a0b598c8e8aec1 GIT binary patch literal 423 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fce#o-U3d7QJ^T8uBqZinQ(DUh+-iwm_@P zLoO}#0*=;&?W_tq+gi+q968>+SBfgWP;boFyt=akR{0EYvj AJOBUy literal 0 HcmV?d00001 diff --git a/app/ui/icons/dirup.32.png b/app/ui/icons/dirup.32.png new file mode 100644 index 0000000000000000000000000000000000000000..37f658fd1cfdf5e628e0377d2b1bd468548cd579 GIT binary patch literal 530 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq z*pon*(V}YRZJ?lJiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0u_AVrR) zB^mie48Dm)C7F2&L8Zmn`DNQrpP31iH-;EeT9lm1kWo@nV5P60oS&PUpI59`o|&DQ zo0^iD2r^C|#M2K+%uCOY&rHtGi<_@8fq{Y1z|+MsB%<~0HAk<*4iZN{{#OqY@cPK| zmXYP4a7lWh?z*L{+vSeWbt#OFeWlp4t0>>LIY8ve&I}=^Ick$`7n1J_S(tBr9&sS-;lC4`WfE9oyl-U-U&!83F1};pmiuA~D$EbG z*fz>?o)9RXRP#K(apg>1#eckemWEH}iJWhq#Hjs%X9kbRf zExLq`=R9)IX}B$M;Cb7peaYM2J58B?QKUdAQ)i`mW>8?9o6NH6V+RUD9q%5`VBfK3 zW}%{9O?!9#f=?T^%-OS=qaxw&>aUk88Q;|}T<$&Hev4nJ z@ErkR#;MwT(m+AU64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1S2G^j_XtkZZnK@#$*EC#>-Y}NJ@cAcW;96oI5~MU8ZdIMWpzmA z3>IMERXtM2=AV^+L}2g#8{CS2_Uy2jYJ6Z4@4q{jZQe%j;bEFmT|0R#t4!%)w(Gyt zqPZ;C8Gfo?q7qtDg@=r*61+Ii2^$SC>D7G@n>T-wf7=%)lM1Ugfpz?A)xY?? zntZD|HD@BD*gv^#Z!Z5j=uw=+?)hxYJ`nePXYb$NPS@t_ lpLe}Vx$m(B82Pjt*JM9dpSt+uQDCZM@O1TaS?83{1OQA+O=SQ8 literal 0 HcmV?d00001 diff --git a/app/ui/icons/error.128.png b/app/ui/icons/error.128.png new file mode 100644 index 0000000000000000000000000000000000000000..0b3ff459b77192ebebc21617da5e892f0442bbba GIT binary patch literal 3607 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 aZqH>|-qgOT>pK_y7r;p0Opl=JobVsZNyr}n literal 0 HcmV?d00001 diff --git a/app/ui/icons/error.16.png b/app/ui/icons/error.16.png new file mode 100644 index 0000000000000000000000000000000000000000..30b9aea3667394d266f280e729dcd7e0839a3444 GIT binary patch literal 614 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1O^7i7Ec$)5R2Z{%ZAw@jv}lN^6$CztPRv* zGHYZtys!ZEiXmn8K?+>1WSXCyx5=ZHFT?2ubneaq5=Ewy=4t_NAx^gK;k*n07e zH1~5|;X50)&zf0%Zs&KocP#Bktkjp!l-*>W@?FUO*h8nf&K9}w!u1b)rrqk#VYzl| zkG%GVlN;Ik3!iRS7Z7R_`5^Ldz?G@XBj!4^Eqd_JI!{jEMv~#C8AsNM$8_^-y2#e} z^gwS({f)<0JQ7ZLg+2A}?r-!nsZtj)1Eh%GdJ=|pLyu&CT7WdRPYhYW21A8D;8Ls+CD>da^?1@oarXs zv&4Tk-QKyeaecs?$JTaNI-9J2o|%~Ex%sSL^X{1kX16Rq_<7BGxA{MBZ8+ewkSGp literal 0 HcmV?d00001 diff --git a/app/ui/icons/error.32.png b/app/ui/icons/error.32.png new file mode 100644 index 0000000000000000000000000000000000000000..f4d9554840179ca195e4f98052cb9ce60f806b24 GIT binary patch literal 1039 zcmV+q1n~QbP)VJ>fSXD@eYYiTc3VQyz{Uuk1+ZeE`# zkN^M!ElET{R9J<@*FR`oWgN!w&zqZs7_3%|anS}`+!P_rO{_~16Cs0xnvS|S=p-2m zqOGxN2El+r>mm-~R4~#ZL{dUPD>iAQD0EP8unyXaq7<4Y&AqR~IY~}V&i$7J`V5zQ z-t&9k=llNsotHbT&}xNmc%YL*_OM3=bp#3gh!0UmYW*W@syEY~d^Yg9%E^}~|Gl78?jW-opi@Y_&bV~r=@<=D2 z;i27{=RiIg1TS5khy39q?ThC1o5GMfP?MJAW&$bltVpsSmCJeV<$D;z$`zv**nk*UCFk#l6G z%y>x8f}gl=CAS>|69as)V+6W*K5L!^hx;>-fl8V2$V?-1SSeUzRbHFOlxP187xn5U z??p=WAd1XmGUTW7?FD*Alf!Ha-~tC?jr|@NS>&TU#8t*|uF7oQ{4Av{`5BR z&q8dQjtymoy{>txd$s{2P|Yc}5L-uU+W@Nk)l97_vx7-y+>!IgsQkupoNLrh8`rl1 zgiJv#MP~Bm=~mmEjxj0&94|U2a&2vPxDD3161iQgLcOh4Z;RFexV#PEDQ*OoYQ)bK z_52W1crNhlB2z^pp+@c~B}e`iK-$Z>0@8>RjrMuEJErm@vCi8C{?}&saRJ7a&?8_ zqZzPm0B0%nC7)tP8kn@Kn2h90gIvs(?>K>%xwn#hME2$1?NO)7e4a1dk+1vtZ;e+X zzwd`@x{yy7nbY92e2vp6@4YQ@w|g6XP%(Jn70c)!dq^@5tZnk{g5capz{ z@q`*zv&i3=4@{R?Zl>*)FQ?1&RCo*zqbn`G9{F`Qm(x40{{a+v3J6Kq;Q;^u002ov JPDHLkV1gTB)p!5^ literal 0 HcmV?d00001 diff --git a/app/ui/icons/error.64.png b/app/ui/icons/error.64.png new file mode 100644 index 0000000000000000000000000000000000000000..31d1673356a2c7a97f1d667889a0b9f1f49eff1e GIT binary patch literal 1873 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 Oi6AmOHmp9BR`d@DnWwY> literal 0 HcmV?d00001 diff --git a/app/ui/icons/ff.16.png b/app/ui/icons/ff.16.png new file mode 100644 index 0000000000000000000000000000000000000000..f12b6345c6bc25f44a11b086aca92fe4e792ac13 GIT binary patch literal 383 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fcf0o-U3d7QII=ZscS#lxTZs-ahvcOIVae zPwQUas1?#_L`rH231#f?)r5-Fh6Ut+|`!> z{8^VR_czpXJiMoQqDoX$uc3QaaI$xmjib3~LB{pC^P&tkjiu*;lli>XEnwTGI$z}h z@0`Y9j)#lWZ1sNpTsA5Ez~Z~{jlPeH?p>X^>rLgx7muHF7h4s2cs4$=0y>nz)78&q Iol`;+06OT9D*ylh literal 0 HcmV?d00001 diff --git a/app/ui/icons/ff.32.png b/app/ui/icons/ff.32.png new file mode 100644 index 0000000000000000000000000000000000000000..17d5ef0147877866f3afca8b357a2eca58149b54 GIT binary patch literal 569 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq z*pon*(V}YRZJ?lJiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0u_AVrR) zB^mie48Dm)C7F2&L8Zmn`DNQrpP31iH-;EeT9lm1kWo@nV5P60oS&PUpI59`o|&DQ zo0^iD2r^C|#M2K+%uCOY&rHtGi<_@8fq{WB+|$J|B%<~0w1r+Qfg)}Djn`$~X47Sp zcR2EhZL)uYaLzB5?xq_#Zj0F>1#+8Q53(ER&TzT2!|~vvgK5F_hc|5K+iYBZj&=JP z{@`;T=KkOR{2sS>*40@XcpNSnZQ%HF_RYGi$r^E&rY$*mqFiI;&-gu_uNaMI{^H({ zoc5iOanTPIcD5PJdMc$Vs;ah&ek__F?7(g@c}jZFGKGCPr3~5!dY6Q{cLdp~FgS3( z@VYhKUiyK}wC`*`7|PDRF`4#V=8)Zn+%$i`&+#==IXg<8y!QJXV^_lT z{=mGMcddH3e@4nJ z@ErkR#;MwT(m+AU64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1SP(BUVW8VrezJA514IW)0uHI zsMBH5pKaRnS@X(!BpLY6wjHL2c3eIn?Rj~U z)N=`^ziOGH7PAV@8yRG$+1oI6d^7JXYWRGh+Ed&X$a%kgjvs@+>fPxjN0cXM{I~dg zvcdDg)+NS|Sp;8xj|fm}*gh%G%4YSB`zp1iJZXYE($n_4?Nz+>{_Z6`=JzUdi|g{t z_Lnm;_%W_GdMkP7?@lHg79VDPmAPl06nuRCuXWFNo_GI*RByeubzW(C>$a`)OV_L$ zo7aneEBmD!_A>c^v!^lRJKKMU9UU3&Oxz;$wtq!K{mia!)%mT#KY3;Pzqp4tEc$zq zv%vnb_g8oI2a#LsjTrmSyb0c7zlb;Q;=IrNOn0jPEEV41SH185+6~(;$7gYIRB*=d zSN-&>@8tTyd1mI#<4o&P>ff>Ks5^4v;rXcz_6L%0O)XQOeE8^mWybrBlE%O1JiPg? z?!9Y);0~!DpH9}T=Xw#E?|)F4aqsK5nmxv>Rkv>k-^geEvTOVD3kLfQggA)78&qol`;+01stlWdHyG literal 0 HcmV?d00001 diff --git a/app/ui/icons/folder.128.png b/app/ui/icons/folder.128.png new file mode 100644 index 0000000000000000000000000000000000000000..ace4b1bcd007314df82ab6a3d1109164e2e68f7b GIT binary patch literal 818 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEX7WqAsj$Z!;#Vf4nJ z$hLzpWB=2SsX#%=64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1SG;V6DWOVd> z=@h4?X?kN_{?xD-?(QE(-bq%DTc)!l8H(-x=iD;0^!>fFf6uL-H@n6_eYdNg$0QX` z1X`l0v6uf!lsv=o1BM37a(UHP>US~fH55O{)qGm^#I|~^c0<%_M7*T}f$h+6`~eitB7-_?D9;h&hO*7O z2@IDvu{>KkMSm^-4^abM_X9V7-R)IlGq80(@cG(dHUnSvwd}kJv(muitowHj8VcA1 z&M_R4bg*FNNN0G+qcDfD#duH%eq|}Jy}^}x`}(zJTgI9j2_44@uU2hPZ}`mHmLYSt z{HpK)rigF(7yEQ0?}ko(#^9y7{eX<}jdbsXIIo}AemT7S%e(d3?*rTqSY|M?@3nW1 tF6E73c;D!H{;4-2+JQ-6$;%&nac}b8)Z9Gr7nn2|JYD@<);T3K0RR>pJNp0t literal 0 HcmV?d00001 diff --git a/app/ui/icons/folder.16.png b/app/ui/icons/folder.16.png new file mode 100644 index 0000000000000000000000000000000000000000..80933c6de57495bc0d01f6f983e1dcf4493a87b9 GIT binary patch literal 349 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fce6PZ!4!i{7`Byty0#L>$f^ZJWZQbL>FV zo5q!@24SZhZg%^W_)gg)_fti9d0crx)pI|+nqGz#tN2^mq#K=F+Kd}zI&}82PFmct z-KYFGyTh_oQ;(V|U8)pIe58MV30u;0mjr(C2c8Y~8+d)p|M_i@3*!1B&iu4@slEYo YdW`tX#uIE_KxZ&`y85}Sb4q9e0LX%P@&Et; literal 0 HcmV?d00001 diff --git a/app/ui/icons/folder.32.png b/app/ui/icons/folder.32.png new file mode 100644 index 0000000000000000000000000000000000000000..f0f819ded3cc6eb2af3742ac2b2eaafc06a7f9e7 GIT binary patch literal 388 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq z*pon*(V}YRZJ?lJiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0u_AVrR) zB^mie48Dm)C7F2&L8Zmn`DNQrpP31iH-;EeT9lm1kWo@nV5P60oS&PUpI59`o|&DQ zo0^iD2r^C|#M2K+%uCOY&rHtGi<_@80jPbEr;B4qMC;pY8+i{Ih`3(-Ex5?VX97>d z5xJg&Olw#=<_W1SRPS;8tg*;N&sS#Bv%9BS*Vd=(G_Wu)zNo8m^#JDzqjRPQ43*|B zZE)RmFP)ElMPv7pw=){9_NSX42)&f2b6~=?13OtZ>adh_%wBTmZ~g-TLEb6%4@}Uy z_5D~3gU7wwF%5RiJO&3Cn0Y)H=W{;)wmIlP^S8}E-^U%OZL&P~^ed~Ag6zt74^#z! Pu4V9a^>bP0l+XkK+E$T6 literal 0 HcmV?d00001 diff --git a/app/ui/icons/folder.64.png b/app/ui/icons/folder.64.png new file mode 100644 index 0000000000000000000000000000000000000000..a6dcda3a068a6b0cca9c7d40ce1f6a3bddebb23d GIT binary patch literal 525 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=EX7WqAsj$Z!;#Vf4nJ z@ErkR#;MwT(m+AU64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1STtT*^O%9h>tL?!Q+$)Ajq0z!!xXGiT1cX|wcF z;<=xKH<;ERC|Xi2+hF@)V$d(?m!|KPE{czK%MdN_Ttd0dd47@G@>S&!iO-cIl&FjFFl;YBx2c6)i8^B1^Wu}7_N+blh@5SmjBX#Yr}dA zm!&`Ei5;B$`*X7U-~T+<%6@jQtLgyyapu-19Jx1*>-whsmIQ`6gQu&X%Q~loCIC6> B)jI$H literal 0 HcmV?d00001 diff --git a/app/ui/icons/genicons.sh b/app/ui/icons/genicons.sh new file mode 100755 index 000000000..66b6008e9 --- /dev/null +++ b/app/ui/icons/genicons.sh @@ -0,0 +1,63 @@ +# Olive - Non-Linear Video Editor +# Copyright (C) 2019 Olive Team +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# genicons.sh +# +# A simple script that uses Inkscape to generate multiple PNG sizes from SVGs. +# It also generates a Qt resource file including all of them for usage in +# Olive. +# +# While Qt (and therefore Olive) can load SVG files into icons during runtime, +# this is slow and lags startup. This script is intended to mitigate that, and +# while it adds an extra step if an SVG is modified, it immensely benefits +# the end user. + +OUTPUT_SIZES=( 16 32 64 128 ) + +if [ $# -ne 2 ] +then + echo Usage: $0 path-to-svgs qrc-file + echo + echo Example: $0 svg icons.qrc + exit 1 +fi + +SVGDIR=$1 +QRCFILE=$2 + +truncate -s 0 $QRCFILE + +echo "" >> $QRCFILE +echo " " >> $QRCFILE + +for f in $1/*.svg +do + FNBASE=$(basename -s .svg $f) + + for s in "${OUTPUT_SIZES[@]}" + do + OUTPUTFN=$FNBASE.$s.png + + echo Creating $OUTPUTFN... + + echo " $OUTPUTFN" >> $QRCFILE + + inkscape -z -e $(pwd)/$OUTPUTFN -w $s -h $s $f + done +done + +echo " " >> $QRCFILE +echo "" >> $QRCFILE diff --git a/app/ui/icons/hand.128.png b/app/ui/icons/hand.128.png new file mode 100644 index 0000000000000000000000000000000000000000..b06108fd3d2702ac3cfbe7e1e11554a9c66e9966 GIT binary patch literal 3383 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 literal 0 HcmV?d00001 diff --git a/app/ui/icons/hand.16.png b/app/ui/icons/hand.16.png new file mode 100644 index 0000000000000000000000000000000000000000..6ebfd1c1551b5959fef88946e622ecdfa1e3460e GIT binary patch literal 541 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1O^61Yfl%)5R2ZWmo|Ef6o{~YIBzYg<~@v==#amPx-6$>A0@F@wfEAqCy5~$|; zH|6oWL)O0zJ+|HVe((GDd+)y&|D|BOK0)gGhPW5$7Eanq|K?op`?q*!o0s5Cjg`4u zKA0O%S6;MMq;zptvW+{leYYuBdC&5hJEzQ4wiQm`c`LNt`iI{;xo3r|=O0j5A-exY zeruw@f9(suxnge|taIm?KR5Q3NKe``nQaD5R^O~x_I>Moebj%h{|AZnA9>3^2(%ww zbKwB9$;W*+6gW~?^*^#|OUQpo@p<5`s^q7X#GAjd>oqgioukLQ(|bC?Z|EqQ>u1h8 zntNrD_2ik~KQhh#z_|NI@9G^7-$;jlR8g8`%jB9O)W4x&=B8_m`yR{Qb2*}K!Fu;) WaD9T~1a4p~FnGH9xvXVJ>fSXD@eYYiTc3VQyz{Uuk1+ZeE`# zkN^Mz#7RU!R9J=W*E@`rRS*a8->mE6YE%rdP+T=p8}VJB0Usb%c3Nm5vC%>-Bw`{y z5-Es{F`zUi7TQ@rWu+nkjIsudFB+mT@fjarM2U)q-8&ZNT>V(?F5i0hZerpjU(Pvm z=Fa@@oH;XdLLZcw3$Y%zRMu`h6A?eR)e*BacmbBz%0Nhv=y@^*E{M*oJtS9QYqlerwY@MpOl?QNc9lvkzzMDb5m)w1s`9@~Go|)@2 zbCmWTmUS(N-%+aIKxh~%s`1aU8IyIr6xU+qpp16`jMe#jN?oU%+dhoq za;3Yu%JIQ9X8=B}^OblPha3Ax@qYaVLPJVN^R`m+pTc>AGS;AOyVemh~cHtas zz-0plaC#ko9fF8BiU+U_r{OVNH$VX0{_yL+GhswbM#SUTf>ZDiZXJN}Q%f_3nF4G)+o2&cHD1n`p5HekMeGKffy7c7$3tUN>+V2BF1Uq+RVIIN!1rBIbs_=#&0bRk1DZrhvLOuSQ8NwtpHRI zi|{ONs;o(Tgah~rKPqMTPvsw;g~hlAHz;SGcoCZ-VzR4ywvW>lxEnY7=Z$zW>L^|C z=7=~jb@N|EcV?cc#Ko0L;aaRDv9pzWatNO&^<{fR9Gp(qUr^<}6c0a~NB{r;07*qo IM6N<$g6kTdUH||9 literal 0 HcmV?d00001 diff --git a/app/ui/icons/hand.64.png b/app/ui/icons/hand.64.png new file mode 100644 index 0000000000000000000000000000000000000000..42134e130790cc966e46245d1c0315a815bd46a5 GIT binary patch literal 1709 zcmV;e22%NnP)VJ>fSXD@eYYiTc3VQyz{Uuk1+ZeE`# zkN^M$%Sl8*RCt{2n`>-UMG(h-Q%Y!wAZVx{#!?glkpzq)iiwsO(8P#ZX?zPrqA`Mg zz*mBgM2#BM55&|bMCF4C=m#+-tuMrYrcpqvC3&fT8dd(OS* z+|!o+lTGfY6J@Rf~9q_h@97wW%NwV>LP}S>zr+~^F zEUmy25&0k~8B$Y#s@4HZ!>|Gmipcv($dQ-=RCPEuw66eaus^a3_zd_2co(P$*<347 z4_uj}y_F*JcOh~nq5xH$iGAH6xmcXOTY(ioi&vil+)1{A+;{vqgpHE5QDu!?0p6c) z0Lmh~whZ{zpxoY+P(56@MaP1hiT81 zp!UyM@`&Qpr_+ZV5O=~&k#;F1po{LmZ|Dc=$lgj zYzci2*oaMui-0;#eDLAea@o*VN5ES^Bd{OX2Yd*uba-Y$-<<-@0kp52dNuS-1%zHM zp>HZ668aU8wg73PUjb*4xWFTZmkX1y+^_76g4&Z@8UhJX(FH|%i zJ9L=j@$AB4@E-x+iHH^~Y7aw}0#tQ2umm{W;hX4{1;AcaZ33Er%_4HV6oMv&P6c?e z^k>L#7e)f}ys}SKKgPmO8S*9`q8r63;5M)P6|ZQeL1qNZBRfr{6$>o3 z0LL&ZI~BNu-03XtwCNSdDByC3{wmqW(_6jr4sZ^3c0V02uGX88QNU>q{ihuK$AF)` zvI-c>31tj*coXs5;zmXRt$;tVppyKDm>t;qy93Mj8G|Wf8s-Eok5ka3kWs*Iz$hPm z2CybVI~~AIudI$ow9+867g*)cuLovx66_W;f3OkQ<2lbRJb=(_vD~!j%GN zJN0eQ%`)d1#{027fgb~b#hCZkn=s9(Z-G4PyoekZk*Be&D}N9~fV+Te^0m=JFpBIE z&<1RPkiv_|3M_HC&3SYKHdT6hXl<5LUoRs6K!mR+B28Ed`w{2SWtguJHut~O7=_8` zN2li-Y50mrGjKETr}JnE@DRE02c(5^ER5%Og0^5;qd)=kS46fE>?@1~9;4^@3T42p zWG~wayxHn@xhLsbU>F9KINkJ^D( z=z0sJ6sW)q^TiH*J5Vno|N4nVpA4yL85T;P8}N7?7FRe}Y(F6}0W;L@G~5Tw@kVYI z;yfB#06ZMfW(V*EupUcWPvRV*2Dlb8#xC{%^F?G=(2KENno`xPF{jDhcx132+hhEI z-3~okM0X>A$-t$U0)ns!SSTVnbT{oD16~FiL?r0$Q74kRHz?Qzh5LZl-hw$f#o6+bOkRbN_KZxRm-uw{aP%1ejdf`A&z2(wFy`&BCd-b3Ta-RuE6H< zc;H-YZdU + +/// Works in conjunction with `genicons.sh` to generate and utilize icons of specific sizes +const int ICON_SIZE_COUNT = 4; +const int ICON_SIZES[] = { + 16, + 32, + 64, + 128 +}; + +/// Internal icon library for use throughout Olive without having to regenerate constantly +QIcon olive::icon::GoToStart; +QIcon olive::icon::PrevFrame; +QIcon olive::icon::Play; +QIcon olive::icon::Pause; +QIcon olive::icon::NextFrame; +QIcon olive::icon::GoToEnd; +QIcon olive::icon::New; +QIcon olive::icon::Open; +QIcon olive::icon::Save; +QIcon olive::icon::Undo; +QIcon olive::icon::Redo; +QIcon olive::icon::TreeView; +QIcon olive::icon::ListView; +QIcon olive::icon::IconView; + +void olive::icon::LoadAll() +{ + GoToStart = Create("prev"); + PrevFrame = Create("rew"); + Play = Create("play"); + Pause = Create("pause"); + NextFrame = Create("ff"); + GoToEnd = Create("next"); + + New = Create("new"); + Open = Create("open"); + Save = Create("save"); + Undo = Create("undo"); + Redo = Create("redo"); + TreeView = Create("treeview"); + ListView = Create("listview"); + IconView = Create("iconview"); +} + +QIcon olive::icon::Create(const QString &name) +{ + QIcon icon; + + for (int i=0;i + +namespace olive { +namespace icon { + +// Playback Icons +extern QIcon GoToStart; +extern QIcon PrevFrame; +extern QIcon Play; +extern QIcon Pause; +extern QIcon NextFrame; +extern QIcon GoToEnd; + +// Project Management Toolbar Icons +extern QIcon New; +extern QIcon Open; +extern QIcon Save; +extern QIcon Undo; +extern QIcon Redo; +extern QIcon TreeView; +extern QIcon ListView; +extern QIcon IconView; + +QIcon Create(const QString& name); +void LoadAll(); + +} +} + +#endif // ICONS_H diff --git a/app/ui/icons/icons.qrc b/app/ui/icons/icons.qrc new file mode 100644 index 000000000..b4dc04827 --- /dev/null +++ b/app/ui/icons/icons.qrc @@ -0,0 +1,204 @@ + + + add-button.16.png + add-button.32.png + add-button.64.png + add-button.128.png + add-effect.16.png + add-effect.32.png + add-effect.64.png + add-effect.128.png + add-transition.16.png + add-transition.32.png + add-transition.64.png + add-transition.128.png + align-center.16.png + align-center.32.png + align-center.64.png + align-center.128.png + align-left.16.png + align-left.32.png + align-left.64.png + align-left.128.png + align-right.16.png + align-right.32.png + align-right.64.png + align-right.128.png + arrow.16.png + arrow.32.png + arrow.64.png + arrow.128.png + audiosource.16.png + audiosource.32.png + audiosource.64.png + audiosource.128.png + beam.16.png + beam.32.png + beam.64.png + beam.128.png + bold.16.png + bold.32.png + bold.64.png + bold.128.png + clock.16.png + clock.32.png + clock.64.png + clock.128.png + diamond.16.png + diamond.32.png + diamond.64.png + diamond.128.png + dirup.16.png + dirup.32.png + dirup.64.png + dirup.128.png + error.16.png + error.32.png + error.64.png + error.128.png + ff.16.png + ff.32.png + ff.64.png + ff.128.png + folder.16.png + folder.32.png + folder.64.png + folder.128.png + hand.16.png + hand.32.png + hand.64.png + hand.128.png + iconview.16.png + iconview.32.png + iconview.64.png + iconview.128.png + imagesource.16.png + imagesource.32.png + imagesource.64.png + imagesource.128.png + italic.16.png + italic.32.png + italic.64.png + italic.128.png + justify-center.16.png + justify-center.32.png + justify-center.64.png + justify-center.128.png + listview.16.png + listview.32.png + listview.64.png + listview.128.png + magnet.16.png + magnet.32.png + magnet.64.png + magnet.128.png + new.16.png + new.32.png + new.64.png + new.128.png + next.16.png + next.32.png + next.64.png + next.128.png + open.16.png + open.32.png + open.64.png + open.128.png + pause.16.png + pause.32.png + pause.64.png + pause.128.png + play.16.png + play.32.png + play.64.png + play.128.png + prev.16.png + prev.32.png + prev.64.png + prev.128.png + razor.16.png + razor.32.png + razor.64.png + razor.128.png + record.16.png + record.32.png + record.64.png + record.128.png + redo.16.png + redo.32.png + redo.64.png + redo.128.png + rew.16.png + rew.32.png + rew.64.png + rew.128.png + ripple.16.png + ripple.32.png + ripple.64.png + ripple.128.png + rolling.16.png + rolling.32.png + rolling.64.png + rolling.128.png + save.16.png + save.32.png + save.64.png + save.128.png + sequence.16.png + sequence.32.png + sequence.64.png + sequence.128.png + slide.16.png + slide.32.png + slide.64.png + slide.128.png + slip.16.png + slip.32.png + slip.64.png + slip.128.png + transition-tool.16.png + transition-tool.32.png + transition-tool.64.png + transition-tool.128.png + treeview.16.png + treeview.32.png + treeview.64.png + treeview.128.png + tri-down.16.png + tri-down.32.png + tri-down.64.png + tri-down.128.png + tri-left.16.png + tri-left.32.png + tri-left.64.png + tri-left.128.png + tri-right.16.png + tri-right.32.png + tri-right.64.png + tri-right.128.png + tri-up.16.png + tri-up.32.png + tri-up.64.png + tri-up.128.png + underline.16.png + underline.32.png + underline.64.png + underline.128.png + undo.16.png + undo.32.png + undo.64.png + undo.128.png + videosource.16.png + videosource.32.png + videosource.64.png + videosource.128.png + zoomin.16.png + zoomin.32.png + zoomin.64.png + zoomin.128.png + zoomout.16.png + zoomout.32.png + zoomout.64.png + zoomout.128.png + + diff --git a/app/ui/icons/iconview.128.png b/app/ui/icons/iconview.128.png new file mode 100644 index 0000000000000000000000000000000000000000..086a769ce33c18a646704b76e93710428d5ad9c1 GIT binary patch literal 916 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEX7WqAsj$Z!;#Vf4nJ z$hLzpWB=2SsX#%=64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1S>T{EKo=@XtJWUuC&x+_a!N`A@yu?8-wK?sk8$I@x?NeD?9@D#w$R70$#)fAPHb zT}kESVHJHoi~T=$e&5GjGQaly=0Dr_+fDbJHzjBvpQX#p-Dx}0r^as&xqkWIM>CP6 zce5DfW$UKjlp0Qi4!CE*bB`-P6;Y_UXfwi1^M%!;IpHp}i_c?uzS^`4>8$&wv zh;ZQpN2lI@^y;rnA)8^jFN3|>juUr|ooN6$gCEHmmABF_th<_eOR~-B%wF?`cP}q5 z55AM3_TEeLew*B)Gqz6>FRs62*Iednx3o6n(|p5r&f@UD(l=~Ne_5Qoy(M4QyL{#o zU%nqt)q8dx*Xh|Y{hQ<#_e^nhou`dm;y?FWJj^+B`=8#GovNUy0isL0cG~W_6!yHV z`iETf{M&CIS_?b_vh!wx*tQzQyKVQ#C*^H#|L%O|?Y9q^=XH8-AGXfpf4}kBc?;hI z3=eo1&QXzg`|z&-(8`)y#@>&=edxP=xOxZ7{skcWWjR2y?1%2;@vnE88x8hC?s5Az Xi*JcOKRCjHiJ!sK)z4*}Q$iB}vLJl) literal 0 HcmV?d00001 diff --git a/app/ui/icons/iconview.16.png b/app/ui/icons/iconview.16.png new file mode 100644 index 0000000000000000000000000000000000000000..a73ee1d9ee9f2fad852d08712a57800ae7184017 GIT binary patch literal 398 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fcdco-U3d7QJUD8S))6;Bme0KBs}pP+5_W zfjK=P;aOj-b|Ht0{{_Zps~&Q_Y|w7uoEk8#s_0YBbNBlbB$+x4ryV%Akzvl7WlUmy z*C(ATw*HaUz!VYvZZ_jLhRy$7>yMSNwXk%T{oiuOojqSX?7%V6Et8}kM<=|jP+lqf zyUA^Zkv33N3FePB1+X;=nkk>%^6fxd|L!8lN)QGqNcaSxY})jPT~DS5unaXUnE1 zbR)=R7X$BQA4B$tc$V8gUar0$z&C;U34@u#)DwQsuXwKE4N%efz;|cnN814P59a$e zxEFF;u$VD@kPhfLu{n3uE4BIMj_L>YGbq>hr`*)dU}ity)v&VBU9fVKZ|Gg7ZH;LS z^+$6KPMRsf^t*89%FwST+6$hA3qFgpKEPS?pZnKDgL5m=kKJV{Zm^BN!LV@pnKeDz-kjH1MH4&{#JjB|0w`t OfWgz%&t;ucLK6VNCeMWc literal 0 HcmV?d00001 diff --git a/app/ui/icons/iconview.64.png b/app/ui/icons/iconview.64.png new file mode 100644 index 0000000000000000000000000000000000000000..9a81cf3eb9cb2b7d5919a46f1e83219746f72ff7 GIT binary patch literal 534 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=EX7WqAsj$Z!;#Vf4nJ z@ErkR#;MwT(m+AU64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1S5bI1tDBV>XCGp^!g?j5VON6`cYt_6GUF?zEFFhfhhEkd+$%OR zlrox%3C!VbHLf?_{Oab!hIIv<>(8vIDl5_c!!<{v*s_wDPjhLuNl1!)4ddmlh1@X> zbqhbpS-7)ao0QvQnATlkYZrXr^+zVw1Fs8#X#MfM8 jm79O?bz!nk?mvdoOXd03mrwKo20w$RtDnm{r-UW|BUQ-` literal 0 HcmV?d00001 diff --git a/app/ui/icons/imagesource.128.png b/app/ui/icons/imagesource.128.png new file mode 100644 index 0000000000000000000000000000000000000000..77d2344b5e6a3c08ec6c46416b35ab5c39cd1810 GIT binary patch literal 1845 zcma)-Yc$*G7RLX%H3>o-wCd8v-BAsSic3k|nz)UiqhTQ$w+s>^QLRh!XIkSDMJPdB zrqR=yR%oWhnxZM4R+~~(k5PS}4m;!!mB>tG zB{1kLW_+7%H3002B>NwYIxSohK4I++Fnr(xJ0Am~=y#T&3=Ya6x~N+keLI6u)cEJ-vhsWE5X(y{D9;-QgJf@4Iqh==n6-hm&bt_yP`0~Ohb>NWFabdOui zD$k=4Ato#^yH)MSfbFriyB^#L0pcIg7vSmH_<_=#Eu5s`I;)|^MjEB+HN;Fl?K=bI z%}iiLd-J{={t9Sb(!n1oY_7T^dbn>xz z#Zv}W8zdOz=z}zbH4&}q@fq8GvVQhCJY?fUB^_EvhZ! zwqHl3rFtVwFA%`9#t$m3eiaq@{+8xfNu)zbF`6bY?H<+WteKoaJK$)xXe|F&e_iy- zQil3EPDg2~?9F5U_;l1l+I=n#(EcpYlWnHzN!`hnKH`CM&PmU_H?#K$7-bWcV~}xx zZY6$&5b~z$BM1whAkhzpeo0=3DIdGfC_lb3zom&=L~WV|4kk>sPAn}VUlp~%5-1rb z`{mu6H$$Hh!&gm+Q%pJOJobv^=4=V8djBws^ra|+V$*HA_LU@hFg8=L{Fc%T@OvSt z2TJyu zX!`|Sxyy34T;M0Awgo%dVUGho^IVGvB}Lvsx>0M^1VB<$0fM@17TjusDXk!Q5BGhb)+~uyIp+z_6 zYo_ydt;e3E4nwshK)sc{6sM_{0`tm0G_MvF^53on)t?D=^r9j~_afvr6?x03MiJ<)t9lGQ_pkC5Q0rgK(-t8b` zUw#vC@f)<&5+DxWlwK9_PaWs!o|}e)-s)!8%C(j~XtuZt=AAau6i^N&mZ=@aq~9lX zzO@Nmd*rAkWPRxwjY8PgS*^+D8j6-`W^W(_eEo>)5gm4bmvyi$gEWPfn_xGLJ$4Nk zukX9YmjKm~!SCB-4OjniTp*J-6#{X{2dI=ELv>^7m$GL*&iA=jxROtT>DPgN?GI=%B<=$1~ z!klD2GvmMFP3Q&LH~pK22%i_W@1Y*gpW)&pz3E zU8(zD)e2%#EiFrc5G#k`?*I6*!m`W8)8veXp^azQ*n4fA(Rb{bqVzK@teuz-{8@!8 Xueq(5ttg9EUnhVZ5auuTr4|1R=zkTE literal 0 HcmV?d00001 diff --git a/app/ui/icons/imagesource.16.png b/app/ui/icons/imagesource.16.png new file mode 100644 index 0000000000000000000000000000000000000000..716aa7a189305b369adb7a6b4b2d2189f86aa9a6 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fcdOo-U3d7QIU+ZOn2C6mU6zMA|TZg4^x} zL0|QVn;ji$0v!LELTA;?j9_*86|&7q=MRH4=T8R7*}o^X|9J8=ZPxD78#Wuinfli1 zgM(BY^9PnaDqJDV3Jjj+^)t8ZWh|Mv<0t#VC)@Z8n8GIA`y3O=?z@0%%XzB}wd_2N z=AQE{Un%ctr~hSsrM4s> zz(cU}M|+6o;*Mp394W##4k?v>VyW!eV|ILRSjWWhc;P?89(lO z_x0SQyK^&(W<9+3bKmFe6mQ&ldeM>$?ws`uzg4bP>bx`&`p5l)*T(O7>;w0S4QIOY z&nOxz-R?eMU8Q%Eai5n}KgT-8>;p0dS}%13io3OMFx@U)a5A@h9+Q-&XNBpdcu)07 zb!{h{UudUQ8>!X{bi}j7@dQ-_w1iz|n5JYIy)F5DyVwRRhjY@mFE1AOu-@$pM+K+M zbM?#l>HSB9ZyhlAoLk7jP?5J=cjeSc_Kb0p=P)#sP6{rQ&^B5lxOdav3*Yn#CMciZ zkXCIRmT+Ttg4mCMfb`qn=I1Pbmn0GvvxQ^gkK>1Su<$fxF37B2ro}j6&K$R?ObV9s zrgFV-e#-P~-Q%E>#n%h3=pAq2`x5n`^$Gtnos!^luL^lvPSyVRWy;(POb!g5u6{1- HoD!M<+Yl9f literal 0 HcmV?d00001 diff --git a/app/ui/icons/imagesource.64.png b/app/ui/icons/imagesource.64.png new file mode 100644 index 0000000000000000000000000000000000000000..794e91b69ae044aa8947f3df8ae93b6405b6a28d GIT binary patch literal 1074 zcmV-21kL-2P)VJ>fSXD@eYYiTc3VQyz{Uuk1+ZeE`# zkN^M!P)S5VRCt{2n>|kyQ51%s1IlL*{E9}60WlZ}1qDVLqr?w15ecB3A@NVxSljR) zh>1TyYC8%ODNKmHC?>{6qd=rUgRjM%B?Do1X7>(z$K8FJ-Rz!w?>X<>nS0Ki8E8=7 zSmBGL!@yHu8t4w@(ZR9~yaMLT><{b~;2H2FkYm;6g_%8v-2%J=dV;xBUDnKO1fVJQ zW4#0qu~?f*S=9q|FTkNB12el=4Mz?NNgqo6U-vVhAwXycLemf+v;(1O2oTzV&?M#o zA(7Mri~{{YC$I^u083`Jmcfk8yvVBn{TbU8C9eW>q_pew9Vo8?Y^JpPAyhPr+}m; zT#{017x@%$4OpzqEr*${1FwDhNTQM%a0fV_!tSc1G;)+l8)n6 zpR>4&@G9`e%zk9yP>5=J}X&Cp^$^fqR@4yvFv(d`rO{j9XWR@tYRnjDIm;GmH z8}KMvp}YtsK+!Bw(iz-QPs$y-aYdI`3?Vl}c4di@ELtTVlYZIl1;%`w2z_5*NYV=M z1(+aRk+qjAlD?bS`$`-LEdancAlyDerQDYE&CI@*+b|D%f^GN(5AHzDNa`xLVIBm? zicXveWzFhZ5&+;dZs|--tqB0`!kW6~s6_z)Zbln8iPWk920V~-G|8}51pv3YOeY!D zvH$>yrFX3hkVr#-&<=#AAwXycLKA;ysN{3?wMOARh`OHv4FO``GkNs%KVc`(^b literal 0 HcmV?d00001 diff --git a/app/ui/icons/italic.128.png b/app/ui/icons/italic.128.png new file mode 100644 index 0000000000000000000000000000000000000000..20a0541415e4af05fecc4481f2657bf7fc1a1f59 GIT binary patch literal 1227 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEX7WqAsj$Z!;#Vf4nJ zys-db#zO5=Kn8_@`LlruHE}NYNTwBcdbtQ=Kn>Y-*^wh0oDgIUnnxL z@9UI%=bO_zFZpPB+P8FwNCJC>SyhLq=5>3XKT0R=)+-O`H;m!tloac&Al%a%?#%-X#C?l5+L~E-Ld`if9;jE<=()( zCpC?KG5gIU8PX3-Ec5IRgx}1!>rr=@_T#to51?JS5^fDCAIs04`PU(rB;6+15c9EI zwW=XkQjJM?@6X-5du|^7EYEh6;pDwPu`i!KJFLL8;D@!zUG4=xqTRj&+0icF1y=ys z*QFgkZlAM`6-ds=V-5H-bzwAPz#q|tw>d(9?9;pperUT-2ddY0D`(R9ck0qypi{dp z#jX&PS)GwE26sa$L;l?0RANoR#NfgLVV%GTg>S8NU{i=y^3`gT*FL5_K zTCep|IpAaX^eaGX!{=WC8ob&s3aB;LLz|&%zuJ;shokY*L3u#s)e*JF z4)cEe4*dANJ}Rf7_(>-y`coEHvF!S-e_;34^_y9{_M3*>1*S4NV9aX#yB73Yuwdh- zpSKtNxZRw^wBxtogUM0P=Yt>Sp_ zZaw4j>^Zd@BK6WMwldnOADlmT;g8$X9{~*!d{FbUn7{K;zI;|r1An8i=s8=SuKl$u z6dk7B|C`Tf@6JDQ?joQ%?*lU@rRzPIG_&%Hz)i#Q{d{`@U+j6_Fr9nu)+yEpn%S=Z zJaDE=I%YYSKl6Hq_3r#Zjp5R<&odUk4pIE|pSdFed(OnnvgecqO*6Z@;!bP_7Ca1| Lu6{1-oD!M<1rHN< literal 0 HcmV?d00001 diff --git a/app/ui/icons/italic.16.png b/app/ui/icons/italic.16.png new file mode 100644 index 0000000000000000000000000000000000000000..2e2418c266df8abdf7ebb12216bb8420493c3be4 GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ z$hLzpWB=2SsX#%=64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1S#JzX3_ zEPAg_Hsm_wAmI96Jj91DY3}I=jfe_`)iD}V%O{Gg6s<86vufLrtQBv$`TyHbiE9}g z=JY1sp0q{7(&p&&1NthtDqj<8Yi|29zxkQMu0oM*ahh4nsVpdu0Rs#F{J~>=?vhVu| zWrd##%}?&m`CZO&yN&A>XV?jvM9;Uxa2XzH^1-o2iAmqlK8wf$Rs#iAbDTuqBNP< z+4>WV8V}aYoux0ZyXm=cyh0jN^Utms`VZDVs5~p4G27w&v)h(;|1(_l>fV1R?Y(wgdCkM0&Q4nJ zl*xcF9gP2NHH)le)Dv3 z45^s&cJ^K`W=E0M^SnulPD;0;S>L>QoBNhUI`_}ZT7~(J8^YpMrbciIvTXF2D6=|R zLSYFYZds(Wz@(mY9-T99t~$@YQ!Fw(i(#p_hA;1eFHB2UGERwG zP(Hy%WoJT<3E#nLThbczp3p982*hry`f$KYmwtKg~K| z`RLPZrV4>KpPFMBS3EHnK68@W^i%W%ndLY1-I+x`RU2*YOz?|avHR!Ar_Yz@3i8sQZuk8Ze4zm-Fw5)#&w;WJXSPn5f7zrV?(}&T<3l>T=-&pc;n2y+~@vH z4nJ zys-db#zO5=Kn8@bJn5sQF&g9YOe zP6a=PLKGpOQD6|0c85JH8{@HuxcieMKjrXTzC~KfQ18zRl du`p{IPS4nJ z$hLzpWB=2SsX#%=64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1TaJzX3_ zEP9jw{Qv*Io{ft^SalXVdx8va^F@OMAZRi4;N^A$0=Bk9K{kfaWde*HSKh1wYGm+q L^>bP0l+XkK!)h?F literal 0 HcmV?d00001 diff --git a/app/ui/icons/justify-center.32.png b/app/ui/icons/justify-center.32.png new file mode 100644 index 0000000000000000000000000000000000000000..e430894058e1ccee8e964fef00c117a02d47d60f GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq ztocBg@yxb`%|JoP64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1U7JzX3_ zB3j>GQ50fO;9))}^Z$SGg$Faa@=|@1q;8otUrX7+x4nJ zl*xcF9gP2NC6dU<^lmqQ&@O1Ta JS?83{1OSqFO-=v+ literal 0 HcmV?d00001 diff --git a/app/ui/icons/listview.128.png b/app/ui/icons/listview.128.png new file mode 100644 index 0000000000000000000000000000000000000000..fb5f2547787a1fabc994ac21a5ee8678ba80f4ef GIT binary patch literal 831 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEX7WqAsj$Z!;#Vf4nJ z$hLzpWB=2SsX#%=64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1SLeAjsGXrlaZ4yU%Pc&lYct1MBBrtNsm?h zC&kSCU4yvok%hifxu+o@QtatZkBZ`aqp-~XLzWmM#i zTIMzOpYI>L{%>ETYUPcn-&-;Rp9aW_U(ehgbM{AS?c!4h@BRP2H$$;~FY8o>ymK1_ zbr)Bc0a<5&tj7zsA2?rT!Q5cXKt*DQ7sK=E`?zDL<%6u;2eUd6LAeoR_|*`J2Jx104F3Vy;#G4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fce8PZ!4!i{7&n4Fwwv1X#XLU|?li)WD`$ z;lkxC(!kV~!4cZF<$q?;-*o+QNo*l)mm zP-BORt*-itxB`a7ffH2LrZ$SQ%~-J9+>Cosvu*Tg#vcsJmx*o6*Yr;TTFc<+>gTe~ HDWM4f5*%-M literal 0 HcmV?d00001 diff --git a/app/ui/icons/listview.32.png b/app/ui/icons/listview.32.png new file mode 100644 index 0000000000000000000000000000000000000000..26c84123ab2df7c0dd18fd2160dbf51f65b679fc GIT binary patch literal 422 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq z*pon*(V}YRZJ?lJiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0u_AVrR) zB^mie48Dm)C7F2&L8Zmn`DNQrpP31iH-;EeT9lm1kWo@nV5P60oS&PUpI59`o|&DQ zo0^iD2r^C|#M2K+%uCOY&rHtGi<_@80jT|mr;B4qMC;orx_pNm1l;al|M1wb;cyX$ zQ-H+|4)+x<#o~Mnjs@&G>q2D~h#uW=a+*MZwc^W~tWDM@t8bp$!y;;U5`p zFl|2a!Mb2d$lt6tZjS_c8hH)8&eRC>E)b8EX(&yqI3aYy@i%Lp!+nnh(@fgGnQv*@ x9#OxQGxh*$%mR}qV)I#wlsg|C{lxHrrR1IJXA>iCQJ{YqJYD@<);T3K0RV?Pm`VTu literal 0 HcmV?d00001 diff --git a/app/ui/icons/listview.64.png b/app/ui/icons/listview.64.png new file mode 100644 index 0000000000000000000000000000000000000000..13bca5463d8681fafa735b2a6c26f3a481c5e2fb GIT binary patch literal 516 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 literal 0 HcmV?d00001 diff --git a/app/ui/icons/magnet.16.png b/app/ui/icons/magnet.16.png new file mode 100644 index 0000000000000000000000000000000000000000..0994379eab3ff8ff75d90bb1f7e816eea097f43f GIT binary patch literal 521 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1O^61bx#+^5R2ZmllJPl1d6y_PZT*JFtfwO z%}qsUvE*8H1re^+O0HHvC#6N-6}b8pR7$v7=PN|bby|4nQclsFn7|E_C+~j$YhV8R zIkRW4&?uFd!G4Uf(fxtW(l0Sp!Gbvq(g(BxwD+t(z_?+4P}QniR%_?22!FNhR^ac) zB~7s_kH0FB%yan>GI!;!uphS`T86n7CHn6TxozKS{C-W<+IMwLieKICYV|m0nfvX% zP?qE&TN=1G+}ibr#*f-BUw!6t@4LWk(tJPFds-uB0`CjA{Zn3U|Cn>Ffw5uACGRu| z-ZD99#$$Fzft(Eo=iRrvmH+kY<`u6c^Fu45Tc7`CP!QMGV)J3rR{ir?^j~U&=pN=h y>F?hkJhh2UhN;#eU(qh*ubM&Vi~Iu**^mD^e|NjzG<#r(GkCiCxvXVJ>fSXD@eYYiTc3VQyz{Uuk1+ZeE`# zkN^Mz0ZBwbR9J=Wm%nQiQ51#0J8Kb>N`=+npI{V>#L6l}k<`&z640Q9qIL;Z))oqC zge@#mO4@({6-~etDQrz6;$}cdDT3&+m^XTP?)=zfahts`aCz^X^S*gA^I)LQWp#y; z8o)Sk9ykdc0Y<}g8`uRt0BgXOnf>eufTSVd3NQy8s>!A`1@!81S|m$%Dx3AxUqY_{n}2k06#@?z*IdorLqzGw*uaOCUxhZMgiav7jMo(+OsJwYXd3vde#; zztH&>j{}E8-v(AH!X_j=3wN~<`iTmL7i8xGWT)t94{*T=UzQ!Cl5POYWZ!%EG~>zhRYUrPeUT)${$shOp~q8mR|;!j>I4|{;V z)c~OH00-g$N!$Ak?Ixq|J1_tk01NmcW literal 0 HcmV?d00001 diff --git a/app/ui/icons/magnet.64.png b/app/ui/icons/magnet.64.png new file mode 100644 index 0000000000000000000000000000000000000000..d4760acea2dff21432047dd8b09f8031ef017538 GIT binary patch literal 1415 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=EX7WqAsj$Z!;#Vf4nJ z@ErkR#;MwT(m+AU64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1SS@+^|9Q&R%0guW#BJ#7A# z$a2;}AY!IZR`P^nuO7bHId^CAwVyYh-`Ty?vVO;znR~Ctz25)7eE!z&aWN|lH!8m6 zTd*p)q4fY$f}R2Y4w)S+GhUrJ$FRIX_`rnUHS97%6ZhXbxn7rP#Vel#)(gBQ4cs=d zbD8;=s~c^VK2@9Y{C8doluJs`-5~N})g|)}{2weg1iS28bt+R8D8BXp+k<0Tf1Vyt ze2^+AsquQn6oyq++&4JZ=y)Fyp3fNV`eep>=6uGGQp*jzGoHO(tTcyhTgM4?yJl|g z1*^mv{h3#D@mTZ8u=FuBA2@%&z~GUEkLoSSX990U%o(;b7;_z|kgo7^`KM>FYzEL^ z*$UAemhC?cJ_v4zcG;&Xq%O9e@eb=3hUrfwj2PAkPqhDh?1XN^s&fqY7}lLO_$zvY zaZmJBxp(J;RyV{Ygth$)eBdZ(Iq`V89?(Hj7looHB$b`Jxkp7wx$=)#tMDT62zDPo z!@rCXx=PD8)ueGfxcBpV<5A5t=L5+~pK7P=*IKaZbEDmZSt6Sm6MVz`W=v7O7rey3 zPQRdhxf;KMl6&X2dw(_4yc^Uv*DU2)u&SJCb+FGp_G{a-PcA>Gy34&WRx|DU>MZ|N z@~fRg(}inyU$fiq?K1DA(k;#vugu=${xrFutF&LWblKVl-5Znti&U7IAO4oC{q41Z z?2Qy&pBTn>Isc~_rg21QDy4TBp|T4xo+Qc^ZIySiaWyZjcH~r>n`5*>Qi;US5>iJ@ZaJRE+Fc@ zTp+gfxnSpg_BX}b?iIw?o9#M&W}{}q?hKP2NBLiq0I zZQM(_#h$m#);1_()lu15RW0*l8_PuX4Z_({*O>aJclKYB`EgoeJ}>eKo-N7Q%r^*7s=aQ#_T)pPHui`9LTVm;pgP^g6=O01@k+A9_{%3 zhWXu5wKv)gM{A$GaE@Vk{cL(9+PR5w1qd%wEDTbr*!=!b%sGVgQlekoz5|4gDidh@1U&)fto?-)E? L{an^LB{Ts5zOZDX literal 0 HcmV?d00001 diff --git a/app/ui/icons/new.128.png b/app/ui/icons/new.128.png new file mode 100644 index 0000000000000000000000000000000000000000..68cf532970f244733a47fafce419f4e60cf5af11 GIT binary patch literal 1053 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEX7WqAsj$Z!;#Vf4nJ z$hLzpWB=2SsX#%=64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1S=%AbOH8mB1i5o4X19((s8}BcER&$?O z^ZWe7^RsV0(b=7lwkzlhljZa716&(;beN_ux~}tt;Rcgg<8{rYhfn?H6qIr}_tWSD zQ$$zHbNd+#{Xt&$v-6j1*}$-D|Ihr4|BvKDSHt%Y{tj9a9*R&AT{c z9PH1!KVbNkZN)NqM>M3kHROv2j6=5DsJCD*%SLfGxeU=zMwSkR%51+`G7hg@agc8TZ{qwdWeksG8Z6iq{0tkKZ%IoC9c8e) ze(%5p4Ym*KzOl8r7&h=9IDTuk1lLi9I>z$_EDi70KCs4aj2qhqMjximX@x5t}zcuPU(A^+d`SI)-An>`EpI&@BI&YPI RCNLK=c)I$ztaD0e0swQLohbkS literal 0 HcmV?d00001 diff --git a/app/ui/icons/new.16.png b/app/ui/icons/new.16.png new file mode 100644 index 0000000000000000000000000000000000000000..08465e682ebe7dedcb82a4fbad142ce5da32c88a GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fceVo-U3d7QJsT8hWuf3ba04AIie)c*7%+ z-FUNYgM^esCCAZj30;YkkKz&zMz1LkU^{cRC)QbavYf=ybA=tkXOthU;lJ=guG~^?Q~2X;ESij7vmP2cpZm{b zam?7RP*^auc;i*$A6@)0e?ENwXv7lmcvEQjjy!XoTBqgL8tNIQ>?`a!+xM^eKEwN; vd!#m0Tvb{5*6j$(Zrj88noE~2`@vLoNOL>4o!NV!XBa$P{an^LB{Ts5gY%vy literal 0 HcmV?d00001 diff --git a/app/ui/icons/new.32.png b/app/ui/icons/new.32.png new file mode 100644 index 0000000000000000000000000000000000000000..da2c2927dbee7e63df04e13060a76c5eda40836d GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq z*pon*(V}YRZJ?lJiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0u_AVrR) zB^mie48Dm)C7F2&L8Zmn`DNQrpP31iH-;EeT9lm1kWo@nV5P60oS&PUpI59`o|&DQ zo0^iD2r^C|#M2K+%uCOY&rHtGi<_@8fq{Wh%+tj&B%<~0bi-^XLxJPZz`bGs@3?28y1svn$`c+Jo=r&#**qNs#@xp!m~nB!cZT-&r_ z-G@r{ZH%`!800Yt3kIe;F>hcC<7!YYI2^7Pw?$x~(3FeGe2i^HM_6u%E6h6ZMZaSP z!%~GL<{IZ7ZUJGzkN0%WDqhK|IyjB7_QB4K6|)*AAKd*KMIM2-YY29P!ELm~-x8IVp gzopr057?~ng9R* literal 0 HcmV?d00001 diff --git a/app/ui/icons/new.64.png b/app/ui/icons/new.64.png new file mode 100644 index 0000000000000000000000000000000000000000..ddb69f86fe23cd1cef0dc23a01ccb025e7947293 GIT binary patch literal 667 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=EX7WqAsj$Z!;#Vf4nJ z@ErkR#;MwT(m+AU64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1Sp6*pRa3y{f07 zr}&N@!*xsZQbZ>ty;**dQ7_1Q16RhZCqhNy44tYG<_E89dha&=qSy1)|3Dqb!{oNO z;LO7;eIoWZsgAB{GhFfbL(C{ORfes)hAjE zQj;cZX2@`GddH-&vBiv|L7sEF$`6-qt_%mn3w(FB=oMsCzW8L*DHM3-=Wp2uOR@@Q zt1ZxaJ?+tdjRP$~2X=4xF0r(MJ@LKaDc=uuCHD{gxOc5H=zzcu>DbLdXQU6AJC-t- z>N&_d^l}HV2RvrF!gyr|1L;D+*DD*>a46=4t&RP`S-^Pgm*XUnubacXboFyt=akR{0FNmC1ONa4 literal 0 HcmV?d00001 diff --git a/app/ui/icons/next.128.png b/app/ui/icons/next.128.png new file mode 100644 index 0000000000000000000000000000000000000000..54addef3259a0d2f94b5d36b47fcd0e8dafce3c2 GIT binary patch literal 1529 zcmZuxX;70_6n#lZfB+I|Si%H}xPfBW)Pl<9Kn1NBS%eN-(m)V_BqkxB?7`N8B8yuA zK?Fn;7l@Xnio&PJ6iN`3ov@^cv!owmNs&-Z?X64IZM{q(TnH+Y=4f7lT zu!f#)uD+)W{~dNs_wytF@o{?e&E}2fW-aFj2TDtYW<=~pV|_M0_zI=w>KR+cBLfRk z_x8Z>(hQ@L%*YaNS9;6T`RKRQ=hbCHI_ECWa!yS*ZOxBUJcT+Ori+wHIGQ!$pm64= z@a2wc3^_*cYw>qYzv)Ov9ZF_Y08!C$^OL&>QE%n>Lyps++ zTgG$hM|)l*R#?WihyM8}KHArUiaLr>)Y*^jmEEa#9vLgNIcvERlNGbs9rPZ|oAr{3 z>ZkAf=XnY_3h6iGDkBReu!t^u;yT6apj5m;gPzPT1~eK1nTBiLS{1R;wHWn%y>=dz z-9Y<3rh%u}#y7OBIHU_;6Zp2g;U32Er|~5MxD$^H%wH~Y zK9D-6Rpgm2n0p#g41)UFic-;H+H^b)4`;^r*wKJNUxrGm9!tRCUF@3YwTYsM^HU_^ zZ02U~pbi(5(GeR*43;i%pF^CFf(E2ZHM7&M|4Mxh4eye09A)}Mxi5Hdi=e!7U0lA~ znsgM0rDQ#jue!<2uF=3)Tvf7BubU4Td#s+f;OBx$pBxy%YTpDeKhx#tUygyXC;K2& zlQ}qbWVuU16#Y(}pwf-7l*+P>6_c}QLf^wL)%*?iSL@RmM3FuDv{bU%8r))ycOk2{ zPo)jH?+3_(G}Yw|JWJ9DMzgyY5qto&^dHvgmVh9C$%xa>Xqs%q$!!!v z8%N*<2c0o2P5b99p0=z~(VZF3lF}Q3(D5~Oy06ppi=hN1;g))Ft_pC)eF$v96)RM1 zSnVXo)Vvwb#RiZTjRvLJ$bQCue6fSJ(mOexO>qaW+^+SduD}^AAr%?E8R*MM*6B?= z)qZ-CmCzndeX$&~wDbR&l&Q@e%$U87E_zR6Mr=i-Qgv8T2~4Z4d&pwLeikdG);e^1 z7i|74eGz#Fp0%kgA#ow`g2k(2!IO%DftSv4lZ}!o%bV9*-Xp$&5@0@W>V{BO*maHv zYMKjT8t?8JO2TqMfRx*!-E#=q9pZO23}wVs==f&)n9dWLGhnveK2qb|g%5=9QGo%8 z?@TO}3EqW?Ed(H1auoLVnP!7~lU6J1mbDWx*%}JPM3=|Et$40TO8ubgpXOt! fH2Ye3UrIsM^h4(Ym)BoJepuk??&Vf_fPUsbG3l-B literal 0 HcmV?d00001 diff --git a/app/ui/icons/next.16.png b/app/ui/icons/next.16.png new file mode 100644 index 0000000000000000000000000000000000000000..7cc0433410f6ae75bf72e1816d698702d4114cfc GIT binary patch literal 402 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fcc}o-U3d7QJUD8S*hYinQ%_bPw4yl}r4> zuBKz6F%FO9yt2HOx;A|tPVf<^~R);5mVp(^ZJm& zptE0a%BOV+{5{=Gx4I8XZ(w+)*s}ZA#0N}1&K$>YaQ_tbd%2UbjrH*LEnR`qS?ZIH d@Bidq!Engj=ewPsaShPz44$rjF6*2UngG&ynOXn< literal 0 HcmV?d00001 diff --git a/app/ui/icons/next.32.png b/app/ui/icons/next.32.png new file mode 100644 index 0000000000000000000000000000000000000000..c7e65548be2fb662e688e424cadaa1ac9ef065b7 GIT binary patch literal 579 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq z*pon*(V}YRZJ?lJiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0u_AVrR) zB^mie48Dm)C7F2&L8Zmn`DNQrpP31iH-;EeT9lm1kWo@nV5P60oS&PUpI59`o|&DQ zo0^iD2r^C|#M2K+%uCOY&rHtGi<_@8fq{WB(bL5-B%<~0G<)yE0V3|_zw&e3m6;?sJ=8Ulkr+* zd4zrA4TZNmukd+fF&cNCmOrp=rtLF<3P!bEr!Sm&_S@Ec+C=3@nFO&N6Ru2{BI>=S z;*-sG2dT#n%odZc_+RQ&VzLcujP}gl$HK6zQP|VhbFv+ag47e=2SJzS@HfhFAK1Et zclv@WFLgY4Eed|d@oZ);+*ZrovXAv#EoTj5bz0dh^Mo1BH`vO~yg93yAt5Uec=~#5 zxARZFl7?F2-TJc@^f+|CsI8xNBGBUjJ4b`E@o(MWnh6f=FVcmd&&{|nulNaH^3UM? z+>y=|b0Xpyzs@t~KgoX5U*>7O1-#_h6^DSUpF?hQAxvX4nJ z@ErkR#;MwT(m+AU64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1SUSgcD~5{G~fBSihvWjbNkAx4H9sk(gpgyUuvVwK_%eR(&cMs@#hO6ZEK8fs(V00*b1W?m@@&4t6v479?VIkjL_Nko zY*iuUzw8Zri#Z->8)T>D2hCW%kJFCTZ&{ShlG}`q=gY){SOos$lq)_{6?hAzuJLtL zZQK1|Gjp9qUp$N7lN}WwxE~~+E!^Mm`asFy-n0JaZ+X-(?TAi3BmSUg=3TSR%jQ4Y z^JPu%5laT+YPYLfdl&ncZZrS)CGCLBRrSKvk#biaDZG5~;PHv@Nz-oqT9^V(1i-ZL cVg4s^ZTS!8#ont7fa#aP)78&qol`;+0PSmTP5=M^ literal 0 HcmV?d00001 diff --git a/app/ui/icons/open.128.png b/app/ui/icons/open.128.png new file mode 100644 index 0000000000000000000000000000000000000000..04927db6b71630b1bdf8e3f0e6dab0be053176de GIT binary patch literal 1334 zcmcJP3sX}^6oB_W3EF{fKYH$3fdMB1i6f;Z3(Dj%cClZP>D{0#zHd)VtQ$RLwDxvdF*%2?3}Z+U+svC zrr5aK001a4Te-UktymOm60zUeoYGGyR2mVJXicnR)~Q8=PZn?8D+R!#a8aN$FW#mR zK{pw1k1PR8m&sEkX+SQQGlf|qDL+M=#>6Coi?2i73CMX73eS;cU=pxBMIsYsdF{%P zim=@FeoZBD9{69890@-SWXNRVO)M54%gn^Gq)fR`B+N`p6{akfV=a2D#FQ)nc0kC- zvXW~2&l2}cjNyhS9L^Z-f#|UsCp~86bf}==Vq>Y^#C1+ws*sy4$xt%fVgP~w&Lx#DjZTjI)qYd zt5*6HbvYjXc-q^OtKr)jdMC8CJzva9O(%*?Zna&FgDBN2Dv-!wZ|CX&HJ9JVkB40@ zzaLd1?2-F;MX>DL2O|#Aj6o*y1iix8uS8ta+X()7x|jdOc1k4O~+5z#vr zc_=lxYSKpxCN_8|5&!y80@%1cN(X*D$b_wSBqb1(Yr8U@F}?FINhM=y0P5@D<*#&g z>a{Vw8!sR7rg54a9h#sw7b*wqRa{D_kD+xH$Fj{(;(*LAeRz7fj+6^Bt>+tB5qmx8 z+X%9Yp+m#fxZ0m2?lz;1+_j1pQG9Z&Gcvnu_O{u#F=DO4Ll;PcYV#PgtU1vP24M*6 z@gRMOcZCENDs>m{9-tV`o9DsZa`41&eyRP<50=V^2_wjdd*B`ycWK)Xa7OBa<+5_3 zq-V>^;W_PriBsh!Y#gpWmi^$ zL!q&&;TIS>rFRu~ntgMh=vRF5WJZfU1QCq_K!VDX_1@;Z`gsV-eNa_~fnJA0jCpOSx#oX7M*_8@KW{oOZ~ zbgkHMI1Y5QL~fgrYb9u5JI_L!9D6qP=F;*>)D$`C3sguyF300%zj|(GI5qdFPr| P;(G!yyf|)iL~_ADSpqOl literal 0 HcmV?d00001 diff --git a/app/ui/icons/open.16.png b/app/ui/icons/open.16.png new file mode 100644 index 0000000000000000000000000000000000000000..9b86b59b4544c77d6da1724c8a25f207d2794bd9 GIT binary patch literal 479 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fcf6o-U3d7QII=o!36%C~^Gbb@88p+S)?X zbBha0rWX}XXf7%W`J?W4%JY$YK-PM`yg%GQUY5HowbYM3{xJ9Ew0*nppFO&KUfQ#n zGr!x|FPk7D=qr2g%jufoIM&|^XS3!dQSaV2bVXA%DH+;Mti^Y9G=&$EAw?y z5sUSySI*8i8E1q(`*%_Q$Sx7J4PD!}Qw}5dw#x3hM(L$jHZQN$d&+Qwv5)!tFNSYZgZLG@wfa6Tb$HIe z`@qNLnv{e3%a7ss>TQhFrIDc_)1@S5=h=b4M$M^@^$XtTPO%y4vYuu5Xu zBP~$6z?er#%|Wr_219L!GV>x`rEB)5p9}n2Wt^~%F^5V0*^w23KR7qc-OAg?RUpUl z(Z7z-67|VhVx3-Rt(#sC;>@`kYwd!`~3C0g>FG`0Mxs6$i!l-WenSNqr3{{~elF{r5}E)|V)d^8 literal 0 HcmV?d00001 diff --git a/app/ui/icons/open.64.png b/app/ui/icons/open.64.png new file mode 100644 index 0000000000000000000000000000000000000000..e68a7ad8bf0fbef0c7ca57dff7bca1687311b592 GIT binary patch literal 826 zcmV-A1I7G_P)VJ>fSXD@eYYiTc3VQyz{Uuk1+ZeE`# zkN^MzSV=@dRCt{2o4-yJK^(_FV^BjuafSB+Vs!;C0HNRofG4n0sly9*7+Ns7Jq z4}mwpI?z_ga}M-?J?Gq|!uIbV6|e)mRLXLj&%jm{5*`TaH&jyGWfeH|-apnJNGd>M z+J{&H4zwjm1yqf?gxCduvIOZ)@Moawd4aLJ!ul`3E9cxrfw6+rVFrv)nF%op_?FYR z0_=P5AC)y&i~^2;uQ~mt9wK8Da1Fd8UqWd=hZqGwg%V;F02N7ySpZZZA$9?vETIkp zU?AZ=3WvzL2mtsG9Fs3$6?iS#=-e!cl<3a*`Ay*Mw8eFr0n_qCQhXl;h_Dp!$8hX1 zmI6K*jy=Y5C-`yrzJ~C3TPBtQu7MB3S5dmNhR769VEuo2ikg4GDR4G*x(W!*fNkJK z$z#m}Pk{yC2jENIej!3TLCy95Ht-DLdZZR10ov>T(MYg73`QZr`k$b=1Zx3cEFlH~ zU??G`)8RHH?R+P$V2$oM*mcfbP1eRT12kzfxTj$|tFs9LMr>v^Hc3F{30IQ@WRe6} z2e2jyunu5N5?~#`nk2wFfHg^gbpUIU0P6tOBmvd|tVsf_16b2|0h!CtInM>u8t2^N zWLx8BKoTIV@2jLJm%ox?seoU?dJBF_ibDd<1MMB)J8{m0K7(wXK!4_U3JK^1+UI~J zpe2e{4J`)QLf1P_vKm9hyTkVls(o5igYg5|) literal 0 HcmV?d00001 diff --git a/app/ui/icons/pause.128.png b/app/ui/icons/pause.128.png new file mode 100644 index 0000000000000000000000000000000000000000..cb511437bcfa328432b121d5bfd8ebd540583039 GIT binary patch literal 791 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEX7WqAsj$Z!;#Vf4nJ z$hLzpWB=2SsX#%=64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1S9;of^A+@w*Kk7AG@=D|2w;ZVOi!bma+rk50Vxp`yY_| zaV@Gk`i0Med;8=~RT_S#+A(d{?zLdx_uhLY>-V>aRZrrquT{@Hlm1@JX8o;w^4os$ z8q_=2Z>XzLe{g!|{To0vQiaSqKY9O7?ykJHbJg41wk6rwaZ9t$tlE}8U68Rx&usOr zeX(vVA6DL2ll8ky@~ilQ`WD6(rJtr;sf8F}$kLv2UwKiLT>5swF)z4*}Q$iB}`Vc#0 literal 0 HcmV?d00001 diff --git a/app/ui/icons/pause.16.png b/app/ui/icons/pause.16.png new file mode 100644 index 0000000000000000000000000000000000000000..8308a3144bb945366d0a81bc380dc459a6b8d094 GIT binary patch literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fcd%PZ!4!i{7_AhFlE>0xaT+_cwlGtjv>3 zo~qVs?`dczZP6l9CUhrD;+aTaH#N);~R2 zD~DlLgnpZVvVG_Fxh<#naY{OH1U4>Fe(5>y=4X|=J+qU08<-FLD&k7pR$E#;Ez05H z;Y)Up%Gm$(F^Mc-VAXJ7g_TYmbRKspz>cb$gIE^Et@(44$rj JF6*2UngHlibwvOG literal 0 HcmV?d00001 diff --git a/app/ui/icons/pause.64.png b/app/ui/icons/pause.64.png new file mode 100644 index 0000000000000000000000000000000000000000..b055c92e9061946659208522eb3aac9b6f18d712 GIT binary patch literal 484 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=EX7WqAsj$Z!;#Vf4nJ z@ErkR#;MwT(m+AU64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1SJ7RJBqYCv<#ZCqS4An zQt#=h0?oVznO6(gyvu4>?j1Nd&*JW@m(w5oe^k5p;*r@NlT#`Z&N z*UD3Gr6eCr`OUs`t=`+VQ*UqCI{cnm>ho#h@9A4jw|`5!?7wbRj3>|!RbQCHeNFGb TW7yUM3`_=3S3j3^P6WX6u_SsL=bf8q#VwYWG$@*I`e3WOHKSL%Oj-L5s|4NVnBjYruCX>W_8j& z&cr@QTBB*MvQ;JwIhvcBnz@=niqdjv8EAFV)Tw(}|8~#0_dfUD-@VWM<2ldK_-#>6 zcy~Miz$qp=A_4KRO>y>!ZTp7Xi8woHcnk}NNFgqx9Elwy(L1F8EI(pX=;S}IGm#`o z#z>Yi#XOmuo0|#bayeBX5=zs#l1!>Nmw(PmcSj(i4GPPXWr=e^95+`c5Rnt|q(X82 z-OerrQuqHbBri8T6J*I`l8rQ4x_I|)u}Dgl3xtB*nHd7EZ5+)O(O6s&U(6Ati$$qQ z?@DCP4KWd6ti9(grtMdE>>&R3dZJNvsmdj6v7@%6q6W_hE02sg-CA|Xz{0n#FnD^c zEG-L&Z7ui8dedkQxk>h|S!VnqtCFlelk1FYtxqhGaz;9*`J5h|aB-$cUo}+Jrx_j9 z?Qg(N!{r~7$K5JI(=vIBi@}Nh3EeISBeJKWhS41881IfpVg{vx0Ba^tsrFWrSxJSW zx?Zss>YnV_3I>Y^zSvjW3t!MDn-%O8Ep=08iSP!q{tRu?5^WZ5_(XDo+noqEuqc{) zG*k%hhfkX3VU3&XOZUSqJFN#?Z{P+4|2#E}qA85+Rei!;4#9fY-kpQ>bH4ytk#v2 zqoh<36qLg|*fm+hSj)v$Uokmi?;p8L@L`A{n9G|ys_{I()l<_q{<#D#aSnQFz1Kr# zj0b?V`GC_jm)=_%@gf9(yU@hFx%!X?jzqW^nj4ewE`gK=jUr4eg^BDg$Dh&H8jdN7 zQ8#qY`Sx)O@f2YJLgb{L_D5sLaZ;OQGZC9s5ZC3n9{X9;ZGW@{JiD5YP{-AOD8d3t z6IIQ~fXb)<8?0Qzv&V;~w)Y_S8Iu(xx+}XQ8?S#gh}T-I*Uvs)MPx=tO`(olK9*by z?i)s}CnMb;eCYRqt2t#$W1(_sptFwP4Q^hnpoT)_w?mo%hTM0d7lWke|DO|N2!2he zBE*Ali&n5N4hBV z^<;M(^Z~bCQzj27=08Pto5gi>lJ5M=-=dwlw4AKoqF?Dhx3RhMoj2IWdixNMNlQ5h zO`s;Kjl;d|Ib|r{i)%bnu5303ErZoU4boyRSZW+l$Ace|a>UATPv}L(goT-fjb<{C z5He`93+9M;{jYW77N$2CuW!7&y>_$tNu9+8y>EHB-&XyrX3WAIqoh4#Aw9vNCBGC^ z451%ph?S~-u--JF9`gg;(^EbL!FKt*18Q$Bwh1+OYQ~-YZptUt03GPjF6=B@eAhhF zA0G}L@OJeVKhsNj`P2^&OV@Sd`6}~1|KMz1C#g>y=>R3$QI9tbk<7oRVuOEdMW^wS z;B?Bm+m0TXsdGj#4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fcebo-U3d7QJUD8uBqF3b@^0pzJlZD|$y$ z@Qwp&?-nju7NRxRVfB@qmr^#oohQ!cmvhG%&pcU^-_^L^`R(e*YE65iR&j5geY?M9 zK~2{A12#&1?^)KKX;j=0%5A!HwlKq%My4Apnys4Hg%j?&Ojy$OfZK w>+ck4?_H*64*%DV20D(x)78&qol`;+0EY#L6951J literal 0 HcmV?d00001 diff --git a/app/ui/icons/play.32.png b/app/ui/icons/play.32.png new file mode 100644 index 0000000000000000000000000000000000000000..b581e17e8052faf590153f1e9d62c85eb358690f GIT binary patch literal 530 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq z*pon*(V}YRZJ?lJiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0u_AVrR) zB^mie48Dm)C7F2&L8Zmn`DNQrpP31iH-;EeT9lm1kWo@nV5P60oS&PUpI59`o|&DQ zo0^iD2r^C|#M2K+%uCOY&rHtGi<_@8fq{Y1z|+MsB%<~0G+l3&Knb_=kKJ#j8A$$N zR1)Jg``_Rzz%z@tyX(d_PPN%=zOzJpxc@O+ZgLGUlM?Z1%QgFIsKb1E#hcP+ecR78 zMz?+6cm83Wfp}Jy(BcV7w?7}yxiGaPdhMm}A9!!~Ge5pirX2Qvp?1Pzopr0P}m%)&Kwi literal 0 HcmV?d00001 diff --git a/app/ui/icons/play.64.png b/app/ui/icons/play.64.png new file mode 100644 index 0000000000000000000000000000000000000000..cd069a7963b7a2930734991fd54b9b92a5e4916e GIT binary patch literal 795 zcmV+$1LXXPP)VJ>fSXD@eYYiTc3VQyz{Uuk1+ZeE`# zkN^MzIY~r8RCt{2n!jsRK@f$%(b#BbVHMCnAPTl=6tM}2*eG^EE3pVhf=v)x3rmGS zfCfh9Bh=oO<4Tnvyj2i)4@=K=7*%r-q@d6R9x&X-^KPqQ`P zj+w3I#`ETogT~Df+MEPlOPZ175z`Hi4EO>ZZSa>BV9v}oa$|eo@im$Z9$*r9C+WOH z>}>i<$K$}Fr2CSN^wbBSKLa35ziHr=q*Hx$qJ#x$0(c|odLO|(7Qycx9obdnk!JV0guh>L$1h}Lr1!1lXTB8@DQubfUl(cg&$smwM+p4FMz9_gNHgY z;3sg;W4`Z3=?1iZiBhTo+rSgjN}pZq>_>?PtOK)V_Nj|tr7eQXz~!z659MTl>)zgk z5)5$P+ndnm6liU4Z$e)g(CXga1dj~()v)~vaH)jBgO35??cIRq*K}n(&GA=3LZ)ZK@bE%5Cp*i Zit=*pBCl6-d-1k~)hgTC*d%Il^`?`Q9ONy> zBF7aIrg>SX+)I8+H`SJx{gfij;^Zykx^p`Bzxz4od7krmp3n0<=RAKrS3-k*v3eWz z003BjKc6s76s(%Aw#Gl%N9)l9Ev~meMOTAV-MGsdzJ~30mpTJ93*^t>@O|PrXPPSC89zA{Az5M&0c$^ zm{5+`dX4O?uS@s7_0N%sGVA2l!=YGCUd{tudtIBQR}t9fE#H^8D@A8t>{F}S&XgSNoU3`T>d{)^ge1YlRVHi$Gkx~eDNRxuGEU;Hk=f6w?(aAXD&7s;SAndCpXL zRG&YX=u{Zim`&d}LydT5#h%|Fb&!6#cu9qx%aa-0Bk=uC*`pKPbjh0@$i^ z4pYv(rWS}llF4(JATAh$D!zFL&&W*Db;1?{5tX((bCt| z|F}hcO~R^N6r7C`1k|i$KhKK9FQTNoa;{^a4IPA7Xueh}>5hJs%x^K)N;3z;Ace}vH=QGHTHq#Jghn)Y&&dM2?tF7XB= z_shY|i0Wi|b5(mwPacZBhTox=teu>PV&>>cjq$T{2eznx&#rzle6AYTf%X}ntla++ z>S}Cem3KvWs@l@lcTR#WGjl<>4T7)~we3}1PlhHb*C~5C+deFjN9<)2a3V3u9ERWf1Aq_vosXx!|JiUfGfu_>O zs!H1L8)iU(X#l{d3>GYT_}%-hL1VErT}B?YEdcrQ@`ASgvv#wu>c4c8cR=IL4cP+q z{c|VCwz-j-9_7Jm1^!*YtOT{=o(&pM=_`fuXsW}M?9PU-7Av9!6{JLWE9WawG&z5FL@5&l0EG0m*nn4YriL|WK7gTV=$ z`$-v>1Qw{62@3L!Z!GW++q8stB9Po5ca(DTphxXRgF{;(SF_JD1XdOmOlq5Ng<<57 zfE!(r1z_JjO{7_vx_&Alt8y9Z`tJSr+NvzDDXz7C;%M3_V_1o+!^(o(NEt4$GH~sf znO(BxIIbTYM;|ZB;xwDnD5cooKz22n&Jzno+9Cqsy{adDSz2ghSfJBXAeXblGj}}> zdE2Jb%A^;&8wqa#>55f8rm64z*yjYbBrJMKIJmqI*>cfiiUTG0!WYg@MN~I{8L|3A z^@GT_|2>(z{Y}fi_J_DDKnGO;*JwU3 N@FxfR)Ou4d{0k0V#j^ka literal 0 HcmV?d00001 diff --git a/app/ui/icons/prev.16.png b/app/ui/icons/prev.16.png new file mode 100644 index 0000000000000000000000000000000000000000..5f56db5af7300b5304f26aee3d29b06ca8fa0b42 GIT binary patch literal 409 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fcfqo-U3d7QJUDDRMD6O0@2e&*5g9cy>|8 zQRfQg$$=XxgeObbG$m}gvF4a#Es`#GMxe2U2 z&PO#EZZICsPwlW#3{^b9V{w&j#!co32JZ)v>5OS=#b{tf(sO9<1mVBrD&F;Co zi}+>s$iM$ybN>Ck$2*#1b{b9lDK$y0fp`0w**C*a9Gn!^Q2F5G8M)?@DpyrZ?}l=J z@by~trDFD^ZMDB2t9@V+xw9!Zt(dt*pJDldocPtLX-75AN1Ul-^_LaRndEgK)Wzb! z7X`&ml}s)Rwy?=R+L=0*)Vf1Gy8#bH3q&%ZRf-{P2_B7u3+BQp!LDJ zh=KiMa$4vDmMw047nqCq*D#mQWU%PqPvEy;+IN{HqxzKw$IP3o8#wp4g z*kRtwJ*wAh*BY-se%<5Y@)F4i7OAvv0*}s4&0g}0ne|@P-~Jiqy1=Mn@O1TaS?83{ F1OSUH;0^!) literal 0 HcmV?d00001 diff --git a/app/ui/icons/prev.64.png b/app/ui/icons/prev.64.png new file mode 100644 index 0000000000000000000000000000000000000000..c56efc0cf9d1efa1d42eb22d395546bba52abc18 GIT binary patch literal 881 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=EX7WqAsj$Z!;#Vf4nJ z@ErkR#;MwT(m+AU64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1Sdm`L?g}RLzF7=Vn)@ojdntud&UF5Ur_ROM_O1X#Gv9zVU6#Tl2f;x4eDWw&nZH zd0YQp`WAh=JXiiy@A4i-9%lYVUF}(7jlz@cp75pd-c@{{WpL~9#OO(CL67rJNSwA< zt?vJQ_s5=!?4)Xz3YYgMndfY-H83sfW2`p5J!zxv?c@Ws3GVW-=ayvUc)exFIhW&o z=v&wWwgQEPw>?(*^)WuYagW)D;kM9jzNJ}PPchtwWW_3h!3e@~_7+K9w4);{@G&?T8rEnXmeBQlF8Ac0%w^jm%no63v|)|6-80;G%+ zWOv$5DPZ<`@=e5vS7Yk!V2;PuwI9W*GtF9u8(PrldB(!~=61W+d|5Ves^CeCc?+S80jBBooi)T{W6Y z{}eb^v#6eBbZ-a`lxkM^QlRwGxIk(KQ=NO(Q=vMm$zQxLi5RfebYAmby7BSKCC?88 zChXHZTbJ>rM(?F|f!GeVKRH3W#e3reJT@(fe4z4SW9HwfBD)t({K99!cSqZlO{2zD zHPiEw=mVh-dyhy&6}qdxVLeWjHpo6YGQ?`6@(ci8+G=l^SPgg&ebxsLQ E0Cx6n#Q*>R literal 0 HcmV?d00001 diff --git a/app/ui/icons/razor.128.png b/app/ui/icons/razor.128.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0731538a17b29eb3813879ec151a17bdff1a0b GIT binary patch literal 1404 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEX7WqAsj$Z!;#Vf4nJ z$hLzpWB=2SsX#%=64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1S`Y3ABFY^`s`ueKY`!BZGWxnsB6D&m)inSb`g*2R5$uKjR(P%kSiXU8peU_XcVdKoT(<>Lxv@AG#x4iM{jl`|) z)4wysPo4WGF>RaMM)8+R)`>lkE6_D~&z+F|Wc9LuaPES;Xa4nYc}K>(J>BXl&b=Wy zZT7{5X=TzsOs%$OvY&a={5S5wJ9f>yDKe~L4VMpWc1?D+Y5tyuGcD=>_xhWgfDuGu8qH&bzR;i7BjIbGE4RYs;A()i2tsT;DVLu|Gc< zr|;J0D*nKy;NFc(zgkzGmOGr35)r|8De6~UNE~Z>_L;oHKYi_UUkfO*7L+qjQ{KdM z#y9hu#k9+2>vgjDH?W*xPYvB_u=M8R8SM8uI9A0ll<#NQBV{m6qjX-oNnM}ulcZbU zrcTjo*!}%ZZD-k9HYST{*L2#7zPsMqu26FI?)|dwmp(^idCu59e`y5&jcZpAPQO!Y z{OV@Imd5!06RQq-AK0_|zQN|+!uvL#T$Eyeoe9$6ejogX?e@3HA58AgxS1~K_--H5 z9+`=uo8vX6wf=Y5*zon>iPVSh{{2&NyEfrex7y{xZMp3`4PtAIGH$Hey+8EZq?32! z7ayL?f4AO7=7H#g%JTiQ=KYq}yqgiZ%y#;=ttS^U1o%9uez%XchW(Cbceq^f_r)Ue zg2mIy?p&PH5ySOid)=?*-TXhEJN8E!{nbs&W0f##{D^WviX osmdKI;Vst0FjS-h5!Hn literal 0 HcmV?d00001 diff --git a/app/ui/icons/razor.16.png b/app/ui/icons/razor.16.png new file mode 100644 index 0000000000000000000000000000000000000000..e9c021a6ae99afcbf74f59506830a4607a6a318e GIT binary patch literal 391 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fce%o-U3d7QII&7;+tQ5OKNhzl|%ZGd8Fl@i(B-io&>nFU3f-rmSbh%KC&Gcohufiv^({xmT0xg;^;%bop}3Ctn3%=282 z896)^TGYU1knr?5yG#Lt+W{k^xo2|N6;^U{9zO5z`b^GyU#3?FzHt1ot=jSOP`69# zC+_<73Yoks^TcaPFt$+Au@bM}v;{xg<%`#HQ~t3SvXDcW|N`*?tkVySJG QDbT?Tp00i_>zopr0IS%I+5i9m literal 0 HcmV?d00001 diff --git a/app/ui/icons/razor.32.png b/app/ui/icons/razor.32.png new file mode 100644 index 0000000000000000000000000000000000000000..8fb76172dbf3234469e363fa0c80b8d96865e882 GIT binary patch literal 497 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq z*pon*(V}YRZJ?lJiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0u_AVrR) zB^mie48Dm)C7F2&L8Zmn`DNQrpP31iH-;EeT9lm1kWo@nV5P60oS&PUpI59`o|&DQ zo0^iD2r^C|#M2K+%uCOY&rHtGi<_@8fq{XM-_yl0B%<~0R71bR4g#+CE%KCVxI{QL z7q(7w5mYsQ$Z)6mx5`Vw5Ka>rW|!oT!8hEloqCYU8|iv0e(ipf&-d4*U7s*TBvMV2 zJ?+4c12^Rln6c+IY-VmZw>sP4xul@MldVUIsb^EiLk1q!3jqx_8`iOe9pE!q6}^Sy zr8w6H!_CXDeP6tUC*t3>iKg71>IX!2d}7#bzWMt$#gz}`jd$GoQQ@WV zj(-zxajxHMzOq~;?A*yxzK7e^pJuS#?Izw(TJe9GUc={oi>l&c)_*uLyOvvF<%AN> zGqzH`wzlEip5kwLXDqSqcM4bCu&j!Gfz?(^#_Luh56-7dic4ma`Fmc2QO4dOD5&Hu Z=>{yHNlD literal 0 HcmV?d00001 diff --git a/app/ui/icons/razor.64.png b/app/ui/icons/razor.64.png new file mode 100644 index 0000000000000000000000000000000000000000..7234af9e13c30461bfe698d045708429a34ef218 GIT binary patch literal 779 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=EX7WqAsj$Z!;#Vf4nJ z@ErkR#;MwT(m+AU64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1S2zF@Np&c=WU|qAvgh5>-vX~SZ1m;s=56jUQg8|F zzVT>L~-1D+kYb`L%F?hQAxvXc~H`682$kQif1iqo@A}-)ntokpV_5P2I9a_nxP(PhH*Li+DI4@Ed~IG?Dc?L82b>fzqFB% z4oe~hY>A91iU(ve*>*0UCuT8)@!JI=&J7*GR!>5&lZaADfGer_Ee=}7o<_VG? zbg7H^M-O=4>5hJ)yBEF& znC68MDFyX*x1&nka<;hUR%LovACGmf2;&KC-|ZJ2SxG;{x*IMK&&Y9?$6xQt*x2M~!+Z|J+zcHqySc-E)k3`gJCj0l*Rom@4k4xfsH z4FAh#Sl@>YbiNdnN9N923j5V94iS$C_((w3>NsFZFiLdPbjcz4u$dnRpKf@#PZ>i8 zWEkWE&`Z9y@QoT43~pt6kM{BMgLuYT9fE*30P#USoq$wBg1ZxUx<0O~s{wTBb~|9h zUlo^rLZoQa>A7au3aJKy7}J?UFqb&vuwi4lWHGoT%cOFb2iRP#+_u{wG z*%(97JF)T&T1t3@s8yxomT~xw{r%Po-O8)e$V{cllvsOa+BxKu3Hic2z3kL(jF!kK zYmt^-#oG%lQV94b?$gkP;Oqu@9bCAW{VYQzb6#jlea$Mo(ylk=A1{QOGh1ax@>tjhGCzA#|P2Npo9$$ z3gST$aw3cZo-`e;pRhN5{ijYw$_BrNE573_o#kTjz*{%fDGdZVonr`qS)_3Lrzuy>YIp82rarK2HLgzz5I{oBP@(02`DrRRRXM10$=t z3}=c@-O9InA#G8sS9?&S$(Ea=KGt(wL4!^*h%P5({UB&YS$L!k;n3PN{ZK0j*+B*| zN|?cC?(c)2<=pWBisu>#7R|`V=JD=D-%3oan1#OZOZ#KZ2-4zHI}6j!LTU71q+!9a z8?|VLH$DJF56MdaDRevrzlp$NkA8k&g@2A&pF*aD&6hS>^^UZIo|CI1#HL--)G5r{ z1W7)^zNco+NrM8kx_535va{)KxGk+zzBxU|tiO;A2P(1(IVIxreUh?b^JgfsL%I6R z`|Ez4!%7zxgAPFx6}o@RAw$Ldp`tNqWJeaPsy zQk;aR?9s1>n!4{z>D9kCG2CRWh?J~_ZsS#xfpVti4s8wWh0TySHY%f-`*Szp9s%^? znx&2ReehlJzOz<4SnPWZ9i_YA6XL~UmDf^_&5D`5SM3G;9+ybrfN(L^^`J#jP7k%4 z;%NI%n52OCOARnv-QMP)IG{b>r?el#@VYLw9^o1Hjq7}L(+0%v5op45eOwk K1XTqxGXDc;Hhpyf literal 0 HcmV?d00001 diff --git a/app/ui/icons/record.16.png b/app/ui/icons/record.16.png new file mode 100644 index 0000000000000000000000000000000000000000..112d842d3d68f54d78f2260d6c430775993eebda GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fceIPZ!4!i{7^rH}W2G5MX(p$>8L1x7~Vy z(hH^u8iy8oZ*b{ZZJ-!pz_M+^S1Y+9iIfBI`>H?(&i$M_M3{EPbo50q@;*LS{I17+&(!uO lUwhrZT3vOFtvC6n;lHcX^0$JwjwsMc44$rjF6*2UngELrf|39L literal 0 HcmV?d00001 diff --git a/app/ui/icons/record.32.png b/app/ui/icons/record.32.png new file mode 100644 index 0000000000000000000000000000000000000000..bf749e5b4274ccb0a83fa2f8da6d66187c1687cd GIT binary patch literal 491 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq z*pon*(V}YRZJ?lJiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0u_AVrR) zB^mie48Dm)C7F2&L8Zmn`DNQrpP31iH-;EeT9lm1kWo@nV5P60oS&PUpI59`o|&DQ zo0^iD2r^C|#M2K+%uCOY&rHtGi<_@8fq{XM)6>NrOAUTfcjzR)>qyf7z3> z7p(GKz+cj^>vs)X*?}k*zIvqvtKJ`AkzmNzKO~gEddB6+audeue}pq4A2r$4nJ z@ErkR#;MwT(m+AU64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1SyLbdPN@&vXWd1>*k z?cdmYSsuJ=Z-_o1IPnv2!Ob&buKVIoFc*AJe4w|%e@z^N+L@d<&8ch?&i$$V(*6G= zQ^Bz_(?SmAYE9hzo+akHMB7cb)Oc~aKXrJd08sayT3%|z`$76Yw< zEn(4u2PPc27?tbF(9GnXy;YR)3%5+^&B@vUW={WAx){P(`*y8)!X?63BVZA=dM!tS z--C>`+mssm4g^l0zLUw7!GGngOP5L-#dl76!*C|2H>)9Xmix*wu~pX}h+JjZEb{t5 zZmWlogH-H!jTl>_+_XvC`*YN0xFvmWc&znY?F>`;**CMDmdSPTG4MAqd%e%s3F39N zU)^#k%%XRNUVv}@)f%RA+T#4YHQY;f{>^-_HNcv?XZB6&g~AzS**WY5oHG{uJCY$g zgDr2xyPx|tH(FXbm>!Tx&z`-Qf2Enb^xtb5J8kc|o7&4Tw%x3#{-gVWt72V75h8*W cILscg@6@huQC;fk3rv;_p00i_>zopr0Hz#C)&Kwi literal 0 HcmV?d00001 diff --git a/app/ui/icons/redo.128.png b/app/ui/icons/redo.128.png new file mode 100644 index 0000000000000000000000000000000000000000..77f6007ca81f799c8d9e8e4ad624923ccd7cf5ae GIT binary patch literal 1573 zcmZ{kdr;C@6vyum5Rvfhnv(CDG&jQ}v#dx2^3mqIt+j_3il8AVC{|{mmYSw%4^1ky ztgX#f%SRR|xMjJ?hLxqJC=K>9MRGDyYulf*e|KiiJ@@-L-#K^g{o@vdg#;L5@mK(W zaZn&N0QKCA88 z@O>>WOFuqDBqsP#e-yJ1m#W0=Df-uPoTqUeC`K46#vc}>FF%gxDU;Tt9Do-6_*>s0 z0&oP%ih-IGy~hzmPqs7$jH6$8X9}SHSSEkwz$qBYRZ7%uxQ8=mZt zk(-=j>iI$2xYqYXB~xTRcJ=!~^+~x!rxH~OZIYhSb>ulHP*^!@kwveY@BAjg^^eHC z7%S0}tS#GaqYqN$Q8w4he%`lC^T~^EaBTA--w>uK9bRyq48G+1EF{HeCIIWi;sp6 z0~D+nVa9TUfeX$Vh4rg#&+~%yws^`clrk2N>78c0n<$r?={*;B~2CObsBDB)%(>gvm^WmDMQ~&)n;+V zB58fi{W0UPgv+l#1T`#-(Q8BnNuL>XJwmduP&7*hhhT=`{&QVNL zEds8#&<9NI(8Z8UGN3FdA%;)8zwaKsjmNijP_M!7fTlAP;t-v^Zi(*nnSB>3Y3>Jg zHQ#W&gmH1ABchS{dGm$+on!aZl)^O8tbx(omq~}2UG}Kek^ydM+R?u9j=XeN@uC99 zuLkOHksCD&}%^`@!J#*gw+ds;*IbqAh=q7aa zzjHFul+9$tz>O|E?SsbWQ1~-kgY|aXeMQ?`1{YqhANfk#0#y{(eRtKR#2wo+JtL7_ zSq36Yr}dHn$5QX3Cud6QZ*ZIktwi3X)3W@%F}3ZXbFPV4zwt%HVrmN^WF+gY4;z*o zO%7JxgLbS$nn@|2^`#SqD|0Q|FRe0A59Yr#$+UdZZbMo7YDaJ+7`}+_GRsqpv*?3+ zTIUYSH{*D^8fP%wZ840gYg^Z_i+!G1&0Qc)??a?VsM?-&?*1z$5+@u%?L1K+%pFP;Et`QGS@DCiR?8K3p?k?+9m>`8fiQIT@lo10BiVY0~s*Ro37@<+U zYD)hJa`#oONqcUhzCBw)vv7v+BI``*6+#PK;nPDJ0MPDddDDK9S z?tpR6#@k=pf+-N|>aY!C5s%Q2SWuE_vObnsRn*KVwGtH%eZ$c$c?LYZ4yiNe(VebU fx%?<1?#iI`YpDUo`>zcC1+g;4+Wr)U2Mh`+TU literal 0 HcmV?d00001 diff --git a/app/ui/icons/redo.16.png b/app/ui/icons/redo.16.png new file mode 100644 index 0000000000000000000000000000000000000000..51c8e4cd8e3ab5f667e83f07ab64b45e90975f91 GIT binary patch literal 360 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fcddPZ!4!i{7Ubt+@^x2)MZaoN(y+heW1z zF-weI^0JlMxmwLt+g>2rbg;ZK&uoDbQ*;*7&7v8V)^EK28#b`#?R?1nfl2JZb0?_; zz1A4z6F)A-?r{y$UpcMh-T|I-I}0`yXuq5odX~X|^)<%hEzf_;Hk>-bY4L{3z3s{T k+=IKnFf$jN=lcI|&58WJ;tKx)kcSyOUHx3vIVCg!04gJdM*si- literal 0 HcmV?d00001 diff --git a/app/ui/icons/redo.32.png b/app/ui/icons/redo.32.png new file mode 100644 index 0000000000000000000000000000000000000000..5f2b78dd620269220310e0d8c5dc78d7cc727a8c GIT binary patch literal 529 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq z*pon*(V}YRZJ?lJiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0u_AVrR) zB^mie48Dm)C7F2&L8Zmn`DNQrpP31iH-;EeT9lm1kWo@nV5P60oS&PUpI59`o|&DQ zo0^iD2r^C|#M2K+%uCOY&rHtGi<_@8fq{Wh-_yl0B%<~0w2gW!ff8=#Ws{mSL_(CL zIyvGRy%aCLG|}qKS^kO1>!#Prt1Ct1925^R3+T3bxHy)ZY&NnsG}^q=TKZ(oNt6Fi z_CG&!$GTk4B=eF=&=tc{=U6E=o51r|-M>28u82-hY)xNZHuIj!q{GG^X06_O+QUVV zL$QYO_W^f%p^J<3R&U?$b39QwP(_f7Z3b&uV`+lijE)!AITcH|Sg+_lkdWx-(4F$) zC)X9(2Pp?W%=@#4v6OGe8peCZtczz#S6lv&E?~LSB5-fDz!lR6JTrcA&&%I+Ztab? zS{HO;_Ui98RnNR^Vla7SJyZDK11o<#x$Ao4)YbWy-j*)-u;u`F!St2!Auaw)%R?Xj zblk<>bye%bmhz4F?-x#4q3mosVTq7#X>jaH*?UV)?muUKtwQDCp5PotV8}Cgy85}S Ib4q9e0F%YgT>t<8 literal 0 HcmV?d00001 diff --git a/app/ui/icons/redo.64.png b/app/ui/icons/redo.64.png new file mode 100644 index 0000000000000000000000000000000000000000..5ca9146d232b14b28fd2ed170e4b5de83616c777 GIT binary patch literal 885 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=EX7WqAsj$Z!;#Vf4nJ z@ErkR#;MwT(m+AU64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1SdB5f7R;pebwi_zrJ^Q@AJ3Ve_W$1BAT=spnLkdek+x{7CEXQX48@SG(TpEn~+1Gn_ z{e191a>H7Mx_f8rrh5iV4LN+#kp&pi!av~qLD*UURs*>tqD<&`UK_)^* z=>LYSMM5!(7oR0MG|c?VpvMpy`)}J!+f|d-aCpi-C`hQ7Vt(}hU5=SI=PdDjpz`+zIgsF@>bo~uwwd30`nR!VW-aqM zrg*l0LIs-No-JHDd7gdwlGp_Pzs8UJ7Rf!a=z9!Cn~i?(nnu5oIX*v@8<@HoJYD@< J);T3K0RXgubcp}} literal 0 HcmV?d00001 diff --git a/app/ui/icons/rew.128.png b/app/ui/icons/rew.128.png new file mode 100644 index 0000000000000000000000000000000000000000..73fffbb176c3012938ef1700b584c614e6cb94a8 GIT binary patch literal 1577 zcmZ`(c~H`M6#pTHN8XvbmbzhCnu&>o8lKsjwd9ecWhEXjx!eWLcTz5guu6 z2hl-=(Wn|Ys;kvqdojqQyA z05A>T78H>aVmZWOgoq(fh*Uf&nMz5h zUUv=vmV||e2FGMqetH*}{}ayQ+4SVTcW#NR;Ks%_HpWIt>+^$OueM9dcp4J9I`ML& zYm8ykzNDc03D!x@Z}eaAjphs<@AkA2Pe)iA#cltQ=|0dfpWQILP&Zb|V|3@%2MyHC z#B&*g;{$;fA%?4t{kP*+#Mz!ZDxd&==bhjj;#A~y$ed)4WVW&!aC*<}*3(?2@OMZ| zR^XHst>dV6-ua#@oH!GU>v|6MY~lze^v*&~#Dec_Xd$7Ra6HcU=4X6${XMIgEcBEO z?U}t(pdM%{DSB}Ie6(uvWl2f3;FQ1-5|G$9)i@UOW!M{6a>1F6x&h!CEqx&4*ji8yPqwV-+vl_uyC~=#uZ@1HX~c={@%C{S3xGEOroF0~LPp zICH4etDw26+ET4lw}#C_%ZFSW=;O8J>;ndA9$=-*3=0s<1E$=`hn4v2=63Tdf9t8Y zb7sAwY0kDG(B&q956ieSELreJ_-Ry?6gu(1<4N2r_2$X}XMCg%gYFb~_A)hQbDi~u z$=I<;j??XLMC&&~$SLSOZkO)IUJH-q{OUcQ!v6v~aPo7Z65_rBUg=D?1~r8nD#ooc z^X9P?O;>K%hOTVtNB%{(EZR)ezT2zGjMYEcN*aoC5!#b>lGQB9o2bwuuuJ*_Fu@T~ zi{IXM>C|CJvef;c#@drQuC`5>z$|ccE#|xqq0G+sYhO}LqHvH)umt^04{$MWt~k`7 z{{U|tNz6cpc_@I!`=faESzAlBW41|l;9+0QnGM>SvLCQc=cepwTgvI}@mU5JQC#qs ziJWCc5u7dFUdZkhTQrZ+{$g+BVg1} zKg-KmSEw$i(o^N|csmxMjXFCgvL~vFB}%jcaM?tc?8eV?`jSw{cyy4kzbx!) zx~|KE_Q_O(i#S@UW>@I!{(zSD?JAZCDlhMn7edF7P9LIGU;3iGq#ZE8qG+jXnaoB_ zc`ILlCdA(aDJuXM*2Jk+mkZQ3DbeR?oe9}x7hHE`@3BPH7FnNB*}`(43R+_ZT_wB% z0Ya5lQ||YS_J!Y5euUF~ANy@pw&Sr-AV2?9tIY+*$Z^PyDyt&o$#yrFFpa>zW-WY- zmvQn&-`re-Y`S)NNr`TXLFnxe+*b%fG?!Osn>PagbG~3uz*Xr~2Dl!92?Q{D(X}-67Gzd|DS#tUe46&6@DVDUsD%xQK!g2_|~1FcS917{sSq{;lcm_ literal 0 HcmV?d00001 diff --git a/app/ui/icons/rew.16.png b/app/ui/icons/rew.16.png new file mode 100644 index 0000000000000000000000000000000000000000..44075c5a0b260605807bb0e7a8fd96b44ae0746c GIT binary patch literal 389 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fcfCo-U3d7QJUL8uBp)inKob@3%rNFrv|* z^O(|`16(b!H<~rxI4>4l>)PRxq`&`=N860!8b@B<`+H9JUiF9Vf$Uk!H?H2fD@gy< zzq!YS`x;Cy>^`rw$fGjMX+?2D@X=FAYqwv~+rV}LYuG4dZ=c$U>d$IX6 zIxm|1rQxe84i}oz<@iS9m_w zIxt2burr7%alho#lK-XQcq4Pd&gmyL;xi6>6Dr{FQ8Cj$``<93n&k##S)={3KZ*X(I5* z*z@@Txerr=6i%hTRWd&yb-~MI;+gVktxL=km@QcM3HzvgY)wqr%_$R@G*zrMP;_5G ztk*8~u*TbUtc(6!c)TM$!DG`B?gZHi-5sBR9#EaOB>j`-{#RC3-Je$4Fa7M`ed+Lm fpHW-?#o9;y-LjsW|Gp4nJ z@ErkR#;MwT(m+AU64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1SanIEu9Izc01Ap|y4D zg4U&uxkr_5bS_$X#7|K4NQu}rO_qrbLIOG}nXa=HI_7eUZCiBF-eH5-?2s<~qp^or zZ{B(H=FFagbK$WYi|;=++?=0w&uMAU$`GxoUQ0j4FS^5IY|Va$DXpRTfOtaWrQdhn z3Dj?6nQ_x(1H+lEHlJcHE!uAH&2%P*t%6HN`tysqGR6zL_j~G0n|YTZj`aj%Ue)i( zXBmvGd2HCyta)xvDLHl7eyT^ESOiO7iHz0Tx9_I{B^mB8KWkiadgT;*E5@`kkqV|c zoqzl7mV9zgJ$puvA^+E@WY3rHO_-UovcrmgGz%xBsY_nD_ITx!*b`6XceA)kiGA$_1Pe=Or7q*XN|4IKvXdE@$v!-7?+bdPcR$J@p#pWWlF z{7%hNJo%lmHmmH6kjG2^qPKSzr~Uu*O?`Ly^e@6Ycx{;K*!g}xd+UFzVnWKKIEL`X z_l(YAd;UgR=}$6~*t0Y|TFx-R^U|*E`=7K=THa{Sv+h8cO6`fa_xS&LL6br1{7tM! X6m*0_${Q8~6E1_NtDnm{r-UW|c}8lL literal 0 HcmV?d00001 diff --git a/app/ui/icons/ripple.128.png b/app/ui/icons/ripple.128.png new file mode 100644 index 0000000000000000000000000000000000000000..9ad2b7b08b4cf11570eebcd6f9cffb759afae0a4 GIT binary patch literal 1768 zcmbVNX;hO}8vYVOATX>VCKO7@fd(zhP!$MJ)&L2}5=bnIhENELNP>_Mrl46EO^OR9 zaHK+5syL)EO&NogMI@;j7a(p_q!=0%wWO8-%5DntG4rQC=gd9#z3+XV`!0X(dEPHm zljCiyT&w^9uptugX`ttAnI#-NZ-(a%gAP^^O(a`_tHv^41Y$%PA+rJi+=N>Osee6B z2T2qwHiMPUEMReR%jp1z!|^L-lvL#9meKu~<%KP?VJ={h(^gOvn^nXt2aPtIi& zGINUam<(#W_gMgd!-@DPa+UPA*2I&p6er%$w%Bb+qW-T=%g~PY8p0`rXf>-(oQY@M zN}@6(r-vd(5~70q4!riNLwaTA&!jy%-e5t3nq9PX@IY$tqByhpUfBmT#D7%FFYEd! z`jwjDw(M)V#kKXR+4s9F1?WF*+PYY2cK5V=3O)i+sZT5}V9H#BF__N=>b|wEbBv@E z@@myLW9oc>0sM6I4O#ysB;+x66M3_N+iFhB-s!86gXwo&KgPC`3v{@1Q>hX_l}yJr zOJL8s%f)g3xn;Z}S6DnylQMhkTas6o{1!u-r}$X-6} zQCzDHmj~sI{qdF`q^O*c8S7s)?hp%4&4!v?w+jo9Bj<44{wpUM6;PScO%0(Xjwb3L z6_|w<&7jKqtYi~amNT08hOfsgd^TAVa^FHA(XyE3)<)*;Gr+ z%;5cKX9!#})Teo!@{LjTy#xIP&TtPtUi#5R*etYX-v*l+Xobao*V7x=0#kzhTxb!$ zN$k4!?)_$4R2^HYWZ(kL+~vkrxQET{B(RT}dVj6)shN`b_kdsdZ1~b)sBLwE0TX$s z-!`wo^mqd1x@fc=G5@RacjmN2bRbaiV7o&f%#@pPX_5m?he#!Mb61ZX#jR?4!*?J? zU}gJmK;2Q}=WFZTjC-2Yc;L>ond^4(6WgVJ33y;xTWCzuB3!I#rqIo}WJqZ2bc(QF1^yzQewFa> z3u%WK5S!+IQNi-8?e8(;a=egNB2xcvCF-efM`>^hw-8-DkJK692EE12f zaVsrRAco=>ux;DDkh>y1xrdNDHCI5Q>&(}V&po$@%>4qdEuyW(b2SGn7~muB*wGSG ztMHj%q7Fu8KHu}wB?mg3JMm(96_o*xd7Je)x@aARd*mFWc`{n3QUsv(430H_UO!`) z>0Dl~`ze&s>LvS>t8Y}E5uqFtna<;5A6gnG6V4GYrQ8z+#6x2Qm5aV>4{6@Po<(u) z4R$tfq0xf*UrH9fzMY>+NUaaYx@YO&A0en+A^IoHN$L$&_cZ>3{91acbcwJ*{L3-i z)i&E?q08*8c!95a(st?1OSiao`=1&c$nB=5775J?3j+V0x-0Z6%8!MvMs_Tv-Ga)J ztvhuO8~2b@<{mn|hAIphoOqSmMN~zIX6n#)W@#7YQ}hE}AIQJ3o0A>6S}?kSev|lv zw7)hR`L7YZvd?{TM>^->gv!Q+hPwPWFnjVss&LjIC4GuposfOlRKT?# zr)W;-HJJ`;dUU5xr|^JJk3#z`n0hp`m&BR-k`#<9u1M}EQAH5W9fkM~)b3uDUVA$l zU>Jap_XWML&7VYmg4URjO|2HoqPs)kq%{xBxJ(Px)gPG%Lp9i)=fE#<4~LdrkDK4E z4!kUkWAjC(grzb?h_B`dty(u7W07JrknA$0w+_>$IXp;PTD#*Dv3Af8k^UovjJXaE z`(&=GgnWUE#^hw`nXVyRE1`VK=DD>3er#d=`=6Wk@{1eiq6|z!6RW4DkQLsG!R+9l zJa|WZ(zA+r?6G#%@PFwKs99Z}5alUS;IH?e`+-V!JK+9?!8!JUH<1@o?aB81$uBB#)$cyOQq#MorKGMXm%H`A67BLDyZ literal 0 HcmV?d00001 diff --git a/app/ui/icons/ripple.16.png b/app/ui/icons/ripple.16.png new file mode 100644 index 0000000000000000000000000000000000000000..1222fd0a54b3377b1f3bb8f9d9c2453d684a7238 GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fcfYo-U3d7QI_1+IBHH3bgK*;%VL6!qL>Y z{YJ*;s}3ys%Nna2d%uYZ>tq;&8yNrh$#OY!0wepjf+0A+~bw zcmB({&@Ihex~Oi|MbTALt-{q^)k~LM%evfkW$v!sM)^U;yH_g6n;j7N!N%7r)BdFG zz%o6gt>hwGaq+IFuFgO@w~8T`WwN(a0bCZ=G7{8 z4MEG7pNwsKFLLu`rS-9MB2KX-$1Qg3b2%b+WBNZSL8ka}TaC{72N$&euQYYkKexZW V%0%6Nn+MRF44$rjF6*2UngG<4tlvZsq`abLRKw>J zGd{Qc<9x6y)WXHDvH3<3^CB&#RL|yprze}R$XxgnZ`xwcV9{X};MFjLEez;L)90Cz z_gE${PUL5h_`vDU(&0GgW2KW`!(xU8=LeT6&tE#U@aU>JiP1s#&crbvGTiK*aQFD^ zpK=_${9pgwXZMsp;LNZ2RiSmx+Z}#CcOF?Kd*<@vUku-Vt~uBA#MBoUy9}PLelF{r G5}E)IUjDuS literal 0 HcmV?d00001 diff --git a/app/ui/icons/ripple.64.png b/app/ui/icons/ripple.64.png new file mode 100644 index 0000000000000000000000000000000000000000..f41c08c580d4c7fd62ed0940e4c674c6740d391a GIT binary patch literal 986 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 QiU0rr07*qoM6N<$f+ZG+^Z)<= literal 0 HcmV?d00001 diff --git a/app/ui/icons/rolling.16.png b/app/ui/icons/rolling.16.png new file mode 100644 index 0000000000000000000000000000000000000000..1a3784a8198dc674166ee0a6b62e06e3e8a84348 GIT binary patch literal 450 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fcc@o-U3d7QJ^T8)hAL5OBS}g71mYv4o_i z{E1q%a}G(=7%u<7StBT_8T5kd-KG5|o0B$2N>4J9Z<+SD-feUJ{sm3Dg5s|%XtY`p zU3#_1bwi+gsg_dd@^`DA1!tKp&C@t~KyU~1xdZN>{C`fUett#9dvd__1JVWeC38-F zUv#*Z>G#6wdGQGy9pw)u$euKuF1V3F?||y{(@&nQcRymm;BtiH&EyKUD!=uUXLr|Y zTzZ+i)9ve$c}23Xva5S-`S%pv*>N!TtfTG0`9%Sb_diQ`cV)(p3DsZEf4O1&QTmpQ dNsKvre3Ij%E1RAr@&f(J;OXk;vd$@?2>^K2w`u?Y literal 0 HcmV?d00001 diff --git a/app/ui/icons/rolling.32.png b/app/ui/icons/rolling.32.png new file mode 100644 index 0000000000000000000000000000000000000000..2e91f35aca05ce9e9bf9310a496fc85d07fd4886 GIT binary patch literal 710 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq z*pon*(V}YRZJ?lJiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0u_AVrR) zB^mie48Dm)C7F2&L8Zmn`DNQrpP31iH-;EeT9lm1kWo@nV5P60oS&PUpI59`o|&DQ zo0^iD2r^C|#M2K+%uCOY&rHtGi<_@8fq{YXiKmNWNJQ(~>4x4ijxtB<{~vZSscQ?# zY>rciy`;9(bwdD0m7tTI&n*_kg6Yi(#bTXXdlP1H$dxsP)wL;W&DbO2cW&p+n|o&p z^S4$T80`LE`TO3vH}Cee?&k6=o@D23HR;MEli3GrRbH-sTsO(YysN_fQs?!1Y{@>C z7G;ZFxyF>Y{LGOMADIlsuM57ITg0*0?b^q9fA6jN2|2PEo>?;@&+A_iI?CU$_Q9RU zlk6Oh7bdB(r7g;LxWw~8Rp}n@ z?nOWF*;CG3bER?FlJ=F`)ib3sf@{{X9bxCO5Vl<)X!wyQ!q1dpjfLORih~CPgj?6A zvC1v!aOY)FE89`!{H@_E5A*$o`F*>C)%ZlqpK{2n_|CkU+GdgVO*+E&p^;Z4T($PZ3Fg+j7tT~ok`l4^cz8oT#(vLjM_o()DTi|1q$l;=J!Uld;M}QK n%I@^OnSc2~lBK7{?BD!1kCjectM(C;5E(pO{an^LB{Ts5c77vh literal 0 HcmV?d00001 diff --git a/app/ui/icons/rolling.64.png b/app/ui/icons/rolling.64.png new file mode 100644 index 0000000000000000000000000000000000000000..ffc6f510946b5317cf323dbac978ad1d0a09fbd6 GIT binary patch literal 1070 zcmV+}1kwA6P)VJ>fSXD@eYYiTc3VQyz{Uuk1+ZeE`# zkN^M!Oi4sRRCt{2n!ipJQ4q#|gHl+4#8-f53>u9w`WzahGeUd@H4!_p@d>B^B~c3v z@1UJVgE2%CskAmxD2$Dt1?OJ5_wL=Db9O^uIbX8P+1Z&hU(Vmz4>IaOk{#yQBQ=6g zN?HOwNZOS2RMNS+9dg7yFKJEEW{ABcX)@Jc5`&U104ucuiteJgI?NCMBY2XEL zqVLrI)$B4AJQV|%19_A;GiboL6am5tg4a8A0~9B z=*Hg09s*jNd90g29nWzJo3aokdXLIZ6=pPJwB5M}g-+a+uMxYxOUJ zZ6{%1%P!gm+e$*=d8P1n6-h$j{#ph}TSe_=HWlHck;7WyNwDeTX47c$q&oC2a8OBT z`j}pN8w@1e4vwlY1}sZ*593%!It{GR;2ov19uOSN;Ui%jc<8W8#UlQzx$A=Fst84r za9L90CrU}DfJ+Y3sN1Q#CKy42kyvhb_^m?p)jX;y>?C2s%sdNc6wK@g@TtTksV))y zUtkXjMYXv^kbXEqD<1Su@Gn$c*p-s)CO?f%)X@fbjJM*%mAH41-u1r zq*kPA&s9m|z(~xnZ|EdA0sJ*HPnCEmj@S7Zpl%0h#BF4qN&Y+B7Stvn>jSbrpa(8} zK>k@W#&eL&U+WPLy)vOa*U4*;@00Lc0PAnOCN zJ^;x2fUFP5`ha0y9aIvsKAmHWTaD8G9W#Kjd}R2kd8221!$ro=f^FX-m>eNoV#U?paB%Ld>s{p4Is^ o)4nJ z$hLzpWB=2SsX#%=64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1S%I zG8Edd<*W9Qprgl>>e#;uuUNV?f~84 zXMX>Cuyp%o=HDs#H&4H9nE5g*=>3A++sy|=6ZmE@@-4rYt|EOvJ3+GIj>*~YXFhu> zWisU6mSdM=*sS^ev-}!{>$8{roKmf{QI$L4%k=*(pZNbx`+nf+vP`>Y^E`Zh3-#5u zR`J;#F!`_{_x9wS>O#S%7@i6B&Gjx7T*C9f=g`LDS!{A!bE~z!yCiu?9+=pY{M^j7 zTusBSX$s?&bzK}X2U5EF4>0&Aam610mCCrqoyh4O!wLHigb_Klx>_)@h5bb zb(_4N&vJvQm$UU0~fRpv4udIu9`RtjFO7psMgfpspWX zT?ZJKY-GEmdM^B=`Xisraz2H*`X%X2o=P*=-u2gI&TV1#&~{_ld|;`?<(rxHs~WX8 zO{iun*}o;u$8f`WhE$8$Sqba`Z7KV=lrcP#X|P~d@H1@ay(26kbd=%V(|HFbXs~_I z`OebjV%RYK!0S7cCAf|dj5TCulw-djQI{r-?Moq0$O93r~LZ!U-JQ5UqZMdfJx^0~!B7f?@?a z-(A{NR2rn_{jYC&H|v04kH$Ur0+!nvYz%!5#IG_O5M;Q;*q}UtpW%pd0fX#KV3_7l z0tT7=N!JGqWs|xVe4pi*yoNF5|8cgv*YBM^5Omq(zOz{wLun-AGhm{+Q_ft^awS!) zLg15&AbY_41?pWE4OX#le!H;;ET6eAzl5Rm)!+Tnd=7J%1)eh;v1BM57-lQW2h*E6 zI@`YP%je;Ia8^QiqfOQN4`M4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fcduo-U3d7QJsTZPac}6gmF!eDQA0(su31 zPt$_SG$nbL%|4s(dAY z@%ztNda5byx^Za7dX{g&Ug=sHQ$I=SBnl;4F5B3#w<97?NWK@5Fn0(&$!;=kfB|obf1cbhy{DE-?bDk}OU4z(5&pE%Gb_5x8_Ze|;c(_kx zc+ch{EaBI@LMTD4V-=&Cz;U)C4xww!PcP@FHPzX;wUOn;?6w=iKX`8J&WP?|wcv00 zvDk*y?f?5p_v#z?E*Sqgc7VBHF7I@+##;RbogHicueYvQ@8SPox6T0*(O`jF|F<{9 zDqWU{X7*wfGv2W|a27DC7(8A5T-G@y GGywoTIO2!^ literal 0 HcmV?d00001 diff --git a/app/ui/icons/save.64.png b/app/ui/icons/save.64.png new file mode 100644 index 0000000000000000000000000000000000000000..ab4b3f22a9d4b7482392e9b04883e77491610ec5 GIT binary patch literal 759 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=EX7WqAsj$Z!;#Vf4nJ z@ErkR#;MwT(m+AU64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1Su;FDu#Sm$ z(G6|}QB~f0(SSFa+Zx##9SqDDxH^e&C>C<)G0bVOuk1e4BXHzmg<5=E`$y$orK9tH zoK-$PvrtB&IL0US{a=v{>^h8_*(&EXa6dR;`8})PPyP|EAKW=osXx!~Zn)dh5hQ2v>$wG3QEdhGfo-%@3RxWaM^iv!3`hzft%3 zoznujteMXIFA^^a2ZYKyzg83z;%$#w`KF~qLi}C!SZND{GW4Ld>TP(w}e%Eb#m$>bvi$p#!#+2C~z9ebt zva&((*?)G2edZu`CO^EGm(RH!<_%~mrt18(lUYJ z_0Rv7LK7G4;Z;*~{OcW{=cvnYL?}pr!HILJf1B1khOHCt&1$ZFe&_b}Lm^cSs+&c! zrOHlo9d~r-pSo%8W0eJ8_^(@VYN&Dtum?8wSPa;MAMSYjmD0t2i37KSGMzWdhb>^|Kr$N#N4r4v+s Z^7EC~X`7rDw*aOu22WQ%mvv4FO#rTLB4nJ z$hLzpWB=2SsX#%=64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1SFPWB}=W7iAz;KR>Ehs=Uh0~E^xnaru*7N_T=6Sr3o5*&enq`uT z=EYC%<-h&@>;Ay_1LqHhJ?rgOn!n@x!TN_~pZ@7j2A@;>7;n7){=UKb0h`3-a~h|) z-Zbc+-t=c)ArtqUw*R6#W)%uOlG`y?u<5b+U%qzx%cAX)Q=;d+|7rhWll^V3nDGDp z1|R0#KUygEl>O_a`|dw=*a{+R1NN?{5o6x5!fr)eh#mL)zYlpFESLq(F|-&n;A7?$ zRQSi*PC1{%(0`TvYWJyhLyJ9=*U5qCoMmgSvR^w^=)K}fMIHa%KL>8zID135#B@#j z&ee(M+4r&Td-!(2rBe@$=Nr`&*w(a#y?!`J#S@HP=H9m9d3CHkc>TBg?f$vU3FRLn zb9Qw`vmFo*Irr`hlh^h9X?Kr4FMXw!SI)X&_l`4MG39?I?0tS+;(+gQ{#)Mlb658< z0>#gz9%r}_8}ocoGDFA-LSBLR)r#%FyGK_3vOqfv=N^ZcQVTXEnYHXK6Hs*K-Ay|D zZ^fJsT;0I5H~jD$J-gYy=7p!V58RL8uQ%P@sS5FfC)YE6_iNc-3!aHE?5GEd zE(;`Di+6YBZKUuo`|P**<-4`dsw(z^!(H>T{N=4Xl-F0a R?FVKA22WQ%mvv4FO#m7+lwtq? literal 0 HcmV?d00001 diff --git a/app/ui/icons/sequence.16.png b/app/ui/icons/sequence.16.png new file mode 100644 index 0000000000000000000000000000000000000000..fc8d3b0f3c9951919c4843bfdf45c25d28854fa5 GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fcd7PZ!4!i{7`FthtyBC0HKlA3PqqX3dc> z|CQBD*7=*Js&Cx*fpO!7sS4a`OGK67ZKiYJGXZ6Mgtsd4n1^QpU juVt^f_hWw1;VJXQ4y&2oowaTy&^-*Eu6{1-oD!MlIvS zUCb@T;maa8;lONZrMlc1yN%!2{OOq*wm!KZ>)$+c-;lPXFolbyk3?0oMGy^&E*I5G}xsC19?6yxK#R$ qFW`lh$z8TW(c_^q%#XDG%@ua2Gjh1FC*mg1T@0SCelF{r5}E*tf`gj? literal 0 HcmV?d00001 diff --git a/app/ui/icons/sequence.64.png b/app/ui/icons/sequence.64.png new file mode 100644 index 0000000000000000000000000000000000000000..6585a67622f44c9dc9638f9549b1dd3e852d53ef GIT binary patch literal 545 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=EX7WqAsj$Z!;#Vf4nJ z@ErkR#;MwT(m+AU64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1S*>77KtpwY zgzb31e@1zq=&|jG_KAL5TOh)|Ky1M=MwkIL+CFE^z6;*xa+m+Mc0;6Px#s`Kt9?h@ R_5)*r!PC{xWt~$(697Lp)p-B_ literal 0 HcmV?d00001 diff --git a/app/ui/icons/slide.128.png b/app/ui/icons/slide.128.png new file mode 100644 index 0000000000000000000000000000000000000000..7f6882bdef0bf70f384b4540af8750a5e3b828e7 GIT binary patch literal 1781 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 literal 0 HcmV?d00001 diff --git a/app/ui/icons/slide.32.png b/app/ui/icons/slide.32.png new file mode 100644 index 0000000000000000000000000000000000000000..3c16de54afa9fc841a467cdf2142d557a8e94467 GIT binary patch literal 610 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq z*pon*(V}YRZJ?lJiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0u_AVrR) zB^mie48Dm)C7F2&L8Zmn`DNQrpP31iH-;EeT9lm1kWo@nV5P60oS&PUpI59`o|&DQ zo0^iD2r^C|#M2K+%uCOY&rHtGi<_@8fq{Xs!PCVtB%<~0^o?GJ10-7aPkynk*{;#z zhaA_U{)Y;#f>s?Of`tKv0*>Mbr@v76!LrN3`iGG2F3ztOU&1b#WfnV&9-L?R^MA2j z(dYY54%JUj>dHOOd|LSz&mOO=zaj_B49u6UQGK~>O}Y?sfRapt-7y2Pgh#WOd>D%u zbJpLi+w?c5dhe>8Z_hsXm{Gk|q~R^^1F47w)@ACVhgoIV`&}QXRfsdUGfZ$YI4J*DApE@b!VK4i)p>d9mg9?!3?VP1Q7A>5%$L zksTX+o&H<>-6iD7e?abU_Seh5;+j|#9Ig~ASULD!nzUr;rgt-cMKz|!1_>JlE4;L0 zS7Pr&;q#t{D_6Da{9dFS`bD&$kly|F6{-)t_=xI#2QpFe({5UHx3vIVCg!0HGiAMgRZ+ literal 0 HcmV?d00001 diff --git a/app/ui/icons/slide.64.png b/app/ui/icons/slide.64.png new file mode 100644 index 0000000000000000000000000000000000000000..2c5425ae7c277f6402a26987ed7a5aae878ac1c2 GIT binary patch literal 996 zcmVVJ>fSXD@eYYiTc3VQyz{Uuk1+ZeE`# zkN^M!0!c(cRCt{2o6TwzK@^3*I|?E?qxcFDK}=9Y`~$&-Pax_}jOZ(fBJPafBV-{l zF`$dQgqV#eNW=`f*0mr>HZII@Qxm&0o$l&R^^`jGK^95woO{nnr@N{$fkYya7-Ot0 zVM%*{OTZ*>u%XNbunH`j*{@KuWoa{j%fR_Sa&OJ-bs()Aoi;=rlL57+0&3-GGk~U- zeGvx&YUOA%fPaD%KXa3C;t(f^Y8!?)x?j$UWD4J3V0DH-yRnGUmG_WoJiuUvQ^Q=SoVt zc!p3KfTwu?nVG7Z1!R-z(=4wLb_}3~d4Oe)nqauF-*}W(hENzlP4jEO6OX#k%(&iF zl!h=AfP1XX;b(pwxNTh|K?tXYbh4i~^9#VC05d)dppoTn0FA*9 zY-R9;tt%j~`M;Ge@H~4ZbYN`E56Fek88h<(wnFFtav$S}I%d`fZsB(~{a;uIrp@eQ z2Vl%X*fI~9r@)wmkTVYj>uI;mTmTMx3g(`x8J!2a7<33Tds@(=&JBFXJQS=1-IZ|1 zy`YLNFemA#M{Q6f9Rn8Gg?ZRvFW?HN@e82`Jocyy%?$p_^+NMdvKy=!!Wl^;TSrJb z0-W|JEj14n=K(cBFj{=K$qxOhs5B2ACqkYfteDxzo*riQ9r#pI;$QWk{jHZJy(lf1F#l$7msv<>i7)d2AiAIo9N(fP^B2-7C zM5}6+T57fGGN_=Y#=Ui1Y8;~IRY{qWS&h>ZYyO<`@2s=e-tV)Xz4yEKTJMkN%?t4N z(b3wY1pt5!*_RZkLf%e5nyRzcJ#tV5V4^2E7*bgpM7^Tohy>rTL;%>EyAv?s@+X=q zX~OXe3cPgIwY3+ryaK>tKEc7RdrmWTuiG2;YFqTj&L<;bYfiKO|n|HB=>_#wny z>e48`f1Cl5^ZNVB_mDC;zD!j&Uon~Ae25F1s(ZUPj&<4kb;bvy96G~R9;@8U1 zl4fsA$NI{}4?rX;ZD!Bk zwL+KAcR^`7W=N5FVnKW$iITDT-eR3z-@WS96N}EJ{vEoVW3Uvg@{#Mhr1(GBWcc8L?h0l z?V!id_sKeq&K?zqWdR5jb+`0*PA+8duO>&hS%0S))xcs*+*LM+Wm`vdT9TH&lZQx) zUkVWqA$?pLkEK3k+Lw~~fmUkK1|WMwWaH9_7bIlq4%86)%}HNe{Q_7NX$fG0J|Cgfj+vcTtH*=PBeW9{Hc@MmkK`?xJJ z0T!d(HQIDkpW_$0B-c5lzGA!uFN*go%aLTuoQV1`TjgD_wCWLHm~NOw9wP(VN4_Om z(d~FS;b4U|-CBj{3M;vxv$$gR5RQ=iH#VIEqIRIVZFKjul zb}S3~HZA_{xFe5TRBB=LtFt*M2E(9a3ZcIiD6zm1@pb9wfB_qf&{x@Q$hWS@3nMbSf|v{Y8vV= zy1g3MF}kjo7uSmucPa0yUeW4ZIY>iuIWE91n>A~8;TNbu(DJ$0R7@m>5BkX%pRp4yaFc#*ptrZn=|M2h^RHM5JMS~k>^f&QMN zXMnf!|07JQJMUmqt}{k$k0y+Jz8%FR%vJZEsN_4oSX8OvZ<}*lpBS-A-Kv7aDD`_+ z`_^Xfm)zx-2BHtr2AZ?o*zEI5Zc^ad6~$}ZcF1hhWHYQhGih~sgAg>(k#po+Xytz? dcjWA=3_L%dXZq)3tm+E_$X@=W2G5ABe*>2uAI|^) literal 0 HcmV?d00001 diff --git a/app/ui/icons/slip.16.png b/app/ui/icons/slip.16.png new file mode 100644 index 0000000000000000000000000000000000000000..2fcaac045aacaed31fb9fdbf9c3c527a5cf5b4ca GIT binary patch literal 462 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fcdeo-U3d7QIU+?aw_FAaJa{eML}XhQxtS zYfVV5%s;%!eq?L7`NSC|g_Q-y z55jI8ICJhm)1zyJ2Dwfj&A6{K9hJW0taA459?li|57=+ax~ckQ3X{zfCLQe?Tf6>- ozMg-B)vnQ*`8}h=w%CSvi-NE%*MAxB0Q#H3)78&qol`;+0Enlvn*aa+ literal 0 HcmV?d00001 diff --git a/app/ui/icons/slip.32.png b/app/ui/icons/slip.32.png new file mode 100644 index 0000000000000000000000000000000000000000..2e20cf5e2131fc681b68b5ab948b912833d349d1 GIT binary patch literal 631 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq z*pon*(V}YRZJ?lJiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0u_AVrR) zB^mie48Dm)C7F2&L8Zmn`DNQrpP31iH-;EeT9lm1kWo@nV5P60oS&PUpI59`o|&DQ zo0^iD2r^C|#M2K+%uCOY&rHtGi<_@8fq{W>s;7%%NJQ(~>9&4{9RynU7Zx$-HC!rS z<#TXUVG(Ly!0PJdD5&T)A;_g*iipR;Ma@io4%3+%7Wm1r3O~NFyKF+!;rrQ-eD0n5 z{w8+4?2pfru1qRXSh6s;N83F$p>)aSTb3Mx^ z$*H`Z^5ff`V(rZ8iTBiA8vae%CYZ5{o2Q{|`n)qa#t)1i$VGg<#PVX+&Cmn0jl9=8 zFz^}h&g-1Xkm|*o@W6Ia7hA^x^#hrn`-Q*j$S6r1cy7sJZ?^e$gz^8i!kioBWhTcn z^X)%zaQecVoIIP)q+R>iTCgWQ{!)ygJ?o;hv#bW21&>wZW%D`GI5wV^vyM#FDtzjO*Xou4y{V#J_mvpTx;64=m%EXZ+f%_>42( zWvS9BkALK#2*lGIn(Z+GBE|MApgs;`@OzS^HwYPf&>JqDMyC(AcQE(N6|22WQ% Jmvv4FO#rAJ|L6b! literal 0 HcmV?d00001 diff --git a/app/ui/icons/slip.64.png b/app/ui/icons/slip.64.png new file mode 100644 index 0000000000000000000000000000000000000000..044de026a479314d317f421d7b7f1127bfb1c3c9 GIT binary patch literal 997 zcmVVJ>fSXD@eYYiTc3VQyz{Uuk1+ZeE`# zkN^M!14%?dRCt{2o6SxXK@^3*JHo;RNPGp18#Nk3^gWESGeCR>H4%5>JFo(jjXU2# zcm4%qCa`d&YZC$sXt$R*-x^CT`fkYyaIL}C$m9#GD zvwN*envI=T(-i5P0iFPBV`H=TFS}2(RdRKjq)))Y#Nb0STk0yaE-2DD$T>*CvA&b5 zbI^GjXN+V(>;z(y42YdTY?1-76NpVRppBrCtPe4vVFM&BO4`F)=NjHIQV1DA%Z(!NX_5!SeuvZIVI<&bg|Lq~Egm<=j+?VKwG9{(KR0FAosjRaqzk~^DMRLH$b?!3c!~#* znJFOj2~cKOBPLWfAV568`;geqtalzmYnxEXfI#s_RO>EnxX+eR%Y9X+9&J~k zL3@F&P3WTh4&Dtq6CSw<%a{YUBn9;s0VG`oc4>LvNBou022%gfaoiLwl7G#a*4R;?Bx0MvhVPh z3C6{YF!y8pN9OtigDVqjcN`!31*D&Ubua07`k|-^Yf=if_F7E1xi^|*+$g*esB=0@B4nFtKkg>n#BTWLoD9iJWY{9clZ_h@y?c?JVeKR^ zw}|ClJlF0xF|wt!o&>dT2Gj(fgUBwAR3aOP_Y@hfmAKiZ;;^VB9b-_R#doxh?hLk$v5wb=N|*!`8mZxR@ES z@-B^JBGO4hR0?wcZbtDn(K_kWS>n|N>>6vtp}4Ensa1N_rbj(CNn-1Q zeq1wL&=R4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fcc_o-U3d7QJ&X@8)eb5NUn*U&(Eux8p?B zO`cY59}NQAHcpYfwDhEBGLw@{-@=d1zy95xG2sh~)vJ9ng60j|9*BQ1E98!O#?JMQ zch0F_{3g#r8bky$D_^pOZIr%o#4kZyo|W%o+<`;UjMD2_SA8%F=uNEZjDMi~GH=G~ w9TQEC+?>x@!Qi}fwwm{;NkwxGem-eG)!xwin8?&lpxYQcUHx3vIVCg!0Pcl|2LJ#7 literal 0 HcmV?d00001 diff --git a/app/ui/icons/transition-tool.32.png b/app/ui/icons/transition-tool.32.png new file mode 100644 index 0000000000000000000000000000000000000000..793cc01420b13c275b3df60c2352412bdb24ed4a GIT binary patch literal 440 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq z*pon*(V}YRZJ?lJiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0u_AVrR) zB^mie48Dm)C7F2&L8Zmn`DNQrpP31iH-;EeT9lm1kWo@nV5P60oS&PUpI59`o|&DQ zo0^iD2r^C|#M2K+%uCOY&rHtGi<_@80jT|&r;B4qMC;M(wtP(v0&Ne=J-(=f#hspa zD*Hx2vA(oF)6oclGi@I>pFYdpq`ATD;Vn9k($@e)Jv9+d;E=Xnbb7c<3tT+C2jqp!enpNr%0btb36&|KG0`#^<; zjyq{G8Pdz_r>)@CgTe~DWM4fD+Zs( literal 0 HcmV?d00001 diff --git a/app/ui/icons/transition-tool.64.png b/app/ui/icons/transition-tool.64.png new file mode 100644 index 0000000000000000000000000000000000000000..81b6efe82fc31775c2f85be09a9123112fa8a6b5 GIT binary patch literal 662 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=EX7WqAsj$Z!;#Vf4nJ z@ErkR#;MwT(m+AU64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1SIV!eZm~;n`QK(Z{4i5I!NVq(iKlycUBkkUS9lF<=2bB+I}ogXz@*|7`wTAsn+%s9 zYKkX#*`zZ0bf?!gto*o!+rW0-Q%0u;kzxuw^DZ;D94d}#D5&V;7Z5sM$av_HrHq1! z-Se8w`VJK~c|qrX`oB-j^7DH6=Kl$fwY)#8^ z-2>a6y7i`?eqLd5`0xJL+J*n*Z~Zm4nJ z$hLzpWB=2SsX#%=64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1SOcK8;ZC+yzi>h$fy_xR?L=y!>C2PEA^W$!uF63(y$~ z(@M^D7oXEtU8{1}vr7AA*d^}f(!_oHCzVaw=UFvni?8P2nZKXiWS&s`PvK?UrPsyb z9O3pVwo9hiov-|OlJSJ){ft{bzP55VukT&vSg~sFi?n0>NuQ5zxwfS|^eW?x`Zt?@ zK8||-eZz_$+6n*J?=N0rzBimT+}g8TbLsu#a@Xt_!;(I)Ke%?;|66^lcn|#kmwnJF zY$^Lz#)|X}0y>L#Ob4=3VXPBu+y{-i?z3KDd$9bV(}tdSkis8XFzFvjKvr^eRe*HE z+9mJ*US~?T_Kklb8!FTAcj6=UZqb8Rk6+r}aH(@Mh`;Rjqz9?RuOceWWj<(@XcEjd zc^fM#?zGPTKDT1~4xw-HyIy!n0K*3icI2hYvQ<9*kSR9buED%-{_LBw?9~h0FZgZ; za?SSlpZ?8o?}cE=^?U3e-1-mr6w4owwq=q&Tg#CDh2xFMSH?XTl{Z|z0+#d(21{D| z;*pfj1xudU@*Sk}#X4`0mL|Jj-x&84DlWNsL)?k4P&G&F7tDDK3px%j_;`{1fN`=s z`(^eQZFUX?Ul<+a8NM(cTFlSzi{au$c8)%{HU-L0{d4}^nwK6{P3#5NB9K6WRP|I+Eoul85;RUmcJJ4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fcdTPZ!4!i{7^rHu5$Y@UXmB6k6kOnvLh6 z*qTErZzh>(FERGzQqf3i85R5j1ECe zL7cA}StYW94js;A-^OJ=`=+;aOkqgJq@d62|Jml>c)-HKYgDcEpd%P)D}$%2pUXO@ GgeCxvnQn;y literal 0 HcmV?d00001 diff --git a/app/ui/icons/treeview.32.png b/app/ui/icons/treeview.32.png new file mode 100644 index 0000000000000000000000000000000000000000..bb3e1b9fc01e822533d866e03defe9a82578c6da GIT binary patch literal 379 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq z*pon*(V}YRZJ?lJiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0u_AVrR) zB^mie48Dm)C7F2&L8Zmn`DNQrpP31iH-;EeT9lm1kWo@nV5P60oS&PUpI59`o|&DQ zo0^iD2r^C|#M2K+%uCOY&rHtGi<_@80jPbZr;B4qMC;orhJ4Ki0xZv0Xs(#7zVk$M z@CTI@nwP9yb3{^7f_^9*^-GOZ?@gV{rg!X<;xP*b#uszv>L-|NPOWvAWZ$@ZvyCw$ zzj5@g5<$NylVcbcSWA?s+b2BvtebAA`uv^Hy*W>f{l2|9~9l2yeUF8TBJM;=tu@nS3j3^P64nJ z@ErkR#;MwT(m+AU64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1S#Jde#)W)vf;=B~^QV-L=K)j5@x%z8gIMqm-$iss8e& z>BS1YN&8e}gT3azedfztbS{5VoNUwC1aHl~)A?7i#oYhXo~=^P_jLM)D>?7x9zL_c zD*1N9+~f(7A?Z2N6J(puJlY+zh1bH8ZRXLPAchs&OxMz5s~E5EfBa19`1G}NS*OXj zFfb&fzKd%Pll$`P&wTz3LPwOp)HX~_kX!hgd5y~_j#&8w)k*FzelciIv~jx59?|(k zaF^WyFO~ieyMc;NDE~PN6tm!9WH@k2r=Ir_vs=hf_6N)#7=JW4mf9R(pTb>p;KVCI zc0~q;h?!5I?nk5i~?KjiDqxKGdc|-!Jf@wymmW5VpdE7(H?RlUv1ZLc672B08iC4aK$fPr`wD3C6Qc7 zyf8x|9P06YA2w5^|MeSsnxTZ!(Cerd} zvHmxyzul$U$6v|I@a=24qYGVmR#04NuB@Ty9&? zq)qWCX`TAn>Tl4pP|{;4B`|xyvr*Bg6JNV6uc-FD$WRQK-ukD$V)PY=M>q85Q8FK5 z3*MSlFUebky_!;!vOnT*|D_8vt~!)H95TIj2pQ8ruE~KPi=G8^lLO8Hf3fMfNj%g2 z&TIedQ-h}BvQV77!>>YSS)4trYwo3vOVOlch8%4-xaJCqZ!vyx4O@PnoHF0}1C*P2 z)**PgrxUko#P-1QH^UUSWG?Qu$5k4%23KpM)DyRG(Q zZ@29YFusE^DayLZ%n4RMn6SxLOdH6%&MAu8-4`^ zQ26tpYh8Ofo35$y(s~K|2#+^6o~YpOU#~IgdUq8r>LxdwpK%$;JFRa{bNEdskds&! zy0St%@cWFY`;PS9Fx-$@p$1yK~|s{JB~@D!K1Ene4tVpFYpK4dZorM9>wLTg)oQ zQ70|*nK6Lzdd~Ci#cB3fv-JRhV~NxZB6t_eiM9I11H%TTwnc@9(A{+AQaLvoFjJK- zW)&WfioBUCCW-^6Hops9r}9i%Am=r|pW#tW>o!a*)_eO({xr>V)yPd*i0Mc?XPrZzo+ zuRdcstl3zB1bp}DO~@%2Xi-al1Rtm04xds{U?ND2)v&D^HQ*eDZsk*87$in(60Dk1 zz^R9B9iYG@5E-lCTQvrtx!ZcGiQR1RKXATL)kZ)0efNOxp!-NE{ShwM?}W29)3#ST z7Z{Hqg&55hhb)1OFxAfm7&S-@M)SuZ0@yf{>gNWuN04@m7LP-!hM<`JoxPF9`?#DE zi&Xi1^}v|dBj-D_cLiG-Mka5i0JT^6?EVOv!x|1;08>dWKpD+RuyRU4T{YBtfPyE1 znrIH+$}xaC1Jrtuf}aTrqd5{Q=Q8k(Q$97TND!JwH+abnZ15mXxxGbI0HHB133I{{ z7J;2d^;fW(){df%;Shh@*{SzE9m`s48Hz`j)kpAx%`O>(s@-yzmrFO)n SJk-hl89_|sdUh@AN9BKn=58GT literal 0 HcmV?d00001 diff --git a/app/ui/icons/tri-down.16.png b/app/ui/icons/tri-down.16.png new file mode 100644 index 0000000000000000000000000000000000000000..231eabdca7b4aa0d29313cfaa6ec2064d8627e03 GIT binary patch literal 399 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fce{o-U3d7QI&|9OOLYAmDm`1uF}WnZO&> zH;x~2M8h5(6}!~bWLxoJ*#g-cPCw$*HsqKck@=jcZ~Xb+AK4lERYWJ9`*+Iz+3AdZ z5scLfzWockbnwhRXM+n2Q>VY4o z&77WhVph+=X){QmNQIM}37|p9GXNngokD9tUyE=U$yGk+#cv?u%nT6B4SH?Y{Rq zscwPq?EiAy>XXVE7V^J8^QLs}f{a>EX3u0#Vf$l~+O|$T_2BTVU(6r)Ja(~f(|(p1Kg+#I$SWhbRo%gX0mUGtVnS${*`k2#Vo^Q5yxyj30)rwQy}SoV6-i3b0< zKXnt*@(&1pm^Z=VOv8Ki2l5A28rR1;$KPRI*Lb$=sPTh4XY!OjoM!oR$Eq<#Lm*HcoI+pLXk~*TgH6zijwWUq5Bb s@7E95I`_Bhdwlu3Gvo3y-@<(iUGpCr{M@$F2^cpFp00i_>zopr08M}7TL1t6 literal 0 HcmV?d00001 diff --git a/app/ui/icons/tri-down.64.png b/app/ui/icons/tri-down.64.png new file mode 100644 index 0000000000000000000000000000000000000000..d088299a6636139b5111fe4f64f4b1fb9c753cba GIT binary patch literal 837 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=EX7WqAsj$Z!;#Vf4nJ z@ErkR#;MwT(m+AU64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1SD9Yq}OFHdCTaJvp=pZN9R(HkjtQ3(vb4CgR8+WxTs~^rWb^iIem(c6akA!r zPt84LW&f&oZ#%|zyif*=)+rU;6kb&&dxMLAf9Hw$R?0Uwy!#{0wBnWR1JMsGFAhB{ ze!x+ot91YE@vX_P{%rbk{(Iy118=?0{pY?RIx+b4!nFZc*$-H^J)hrs;`zS=N)4;- zG4eI;R(}15ZC-v9OK2_28%A^YxL?c_T1xhe>s^qp> z_(T*ZEBQ=$AGzZgFp1s%@>g`O%F^)k;_ZQwfWpP&XbL@l2nu4d(7y5Pu1j)7S=QZmOh>~MtYGIt^ zxLC>F7^W_-Mylat}w7$kaj3GlxFv`FnDvUqiasr-TyrFCjaG&#bHI&t%Y$Iv69z#nPZ8*ma`$V)_B2WAizez5kio zb%)WGt=ws&_WfWJh7?x~J$_LphoBa%PXU??K3xI6a$0N+Ta`klwx425FmNjUnYJQp z`KsTmewqG}UGb{-T5+gqSHagO)lMyWf2Q_5wt%2*f0*a06*Ql_b^9+cwK90R`njxg HN@xNABH>iM literal 0 HcmV?d00001 diff --git a/app/ui/icons/tri-left.128.png b/app/ui/icons/tri-left.128.png new file mode 100644 index 0000000000000000000000000000000000000000..41a1c0ab4221b3806652f6b4e9618638d2edc144 GIT binary patch literal 1422 zcmYL}dr(tH6vj8dA&5K!8Y7@2NN_+35&}q2p$J$BB1swvM92e3gcb@HG(a5{ zjZ};XWLl|MpKU7Q@Csnj3PohBjubH&QSpI9Q6?6UZrVS3XU^Gk?*6{-?w#4)Zxa(@ z?Fg;}0DxT_Cprm^s3mYqVD8%_7=Qy(z>Z77!KVbbryBNnIfq*SfJc=jFf~u#X2O>) zikMVIvP`5X6y#@u!ootjSejEH6v#8_viz+2H({<2B3qzHr6OCF58?&+3bE8HNm-C1 z+jnhXPy^?g|CuQBg_$5*p^%3%7($suB9j)-3&lBNN#-80z+%U+bc_^%G)u-43uV%b zCZD5lofqPwBU6e_Pc{7fQ_4P6m>k7-HRFm4Uf~-qbrX=TgP>C~|AdmKTWJDg<=Bd8@9|doYVr z6hgP7K*RBEz?52dQB3cu^bFA~Z+y2T7Q4r*`Mtl~-YmKic&EJSkJpmM-5;W`hp5d8 zjCp^lf0^6o<-0_)-hFAE=G*6o-MN)zO<_i>^d-`)wDZm{fz|KxL(}g(+xCiNftTBt zD^U!2DaAm&!s9=>%0WGRhi4z;g*Q)(G_2MW6}=J3ZTGl_5~C}MOvay`sw0;D7E`m5 zq_s(qEc%=cKgdD-Ls}OYTZ+jKXM6&85O`CvzNgWN9)=ZuR~P72o-tItt6%Ga(`9Z+ zZo2znbXAIUZms7@&A0o8^JIabr}UhnN21_`x0K#rrWb?35$RSeB5C^_gdgHv?67BMnJ3 z-((hJ$e%f-QP(+txELoRipL6{L+1WPX4R%;q?`~s+^qc|9H7sUuIyAF_8 z#yLm02ws%~7AcNy*O$VQEY&tK2Qut*d95$LdDU;+vPD!EX=_t8N?kAuh} z*sW=R=sv*-2u%*;LTI>(3%|g3(>X(kcFFQGh{Y^YbJcWlGDd*2FaYfQ?2F+}3qZN-;<--u+D&v>e+`t=HG%LXF-Yw|JR z))GccD2BzZmJnk4Ctf7>y>=u-zHwPC2tOAq`4kbz9kjMrPMcb+4$%tM6cNS(b@ndzU#dd&oD&TOo8`_@VG+^2sM4O~ zWh4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fce2PZ!4!i{8DHPxBsf;9*VoWVT%J#Zg=^ zbP220Lnqyd3xt%GiW==)7gl}aEc<<(>Us4>BD1Q3*|+MZCjD6F_iD|)M>m$Tu+4MW zy#3RfeOI$J@2G!pfBTQ=eb#O%zx5j!-0Ds|nPcIka%uH_UvHbJCld;TChm&oQ0zIt i{3A5Dr^^fR35*2X5V@1*BjaWd?$%bnx|Up z{cA!=WcT)j&)g3LEq;Hl;EtJn^LoAI=9J9$`n49uEFu2e3UX#J^bLh%{ z1|NjIqL};-R380v?@V0w`$$yy3iL+M=JFXWt0#V6Ed)EPmj4=`7IYZdYRadcy9o zPArw!sc6)nEbj8HbqS|oiEjUmMTd(Ug_ZL4ZhY^wP6*~WIiFibz_r!aO|;`xjKI2k e55K&)#W?rU&h!>xM*(2?GI+ZBxvXVJ>fSXD@eYYiTc3VQyz{Uuk1+ZeE`# zkN^MzCP_p=RCt{2n>$J^K@f(&Qb93r33mx5CZY?_zy%n}^_ja5a}9JIEzo0-GSdKrL+!g0*k;La0i?NXCm@X z8`nL6l+rA41gw4W$OCX7BDb3Ot^uT!=71Am<%dWA0~;c8pWDWirej?w!#uzOaHwg= zWd>xLf71Y15|QVew%ldFtNCN{%)@YE{FB?BD*z4itJ)B`FU%+#GM6&#n;J0uG-k;~ z1{jzJIL{sb;9wFoG9U9ZXk`8o*wL7W9sv~0_Dwwjdm?h94baOFFqrLOXnt2ju1fmS zIRH=Qp<@8v%tMC&Jer4&0C+VI9RTob9$E(A-8{4iAcA>l2|yI{&;o!+=D`?1H1l8x zAfkCN0ua?a7yvL_(r$~$b!mTcRkR#7Ueb1M9ttuba@seg0x&M-K>;B8m>-pP4#?hr zACUmlg)vN2hk*9Qae+|uA21FO>W@%q01+7gd%#6On0eqdrLcNP0z|Z6vLOmR{3iKO!gitR?lm^hq6NKKb$$5d$>pelkrSz8e zrdYiwSnNK6(h*=M}C1zy}Dqb3)vDfl(G@tU97re|1rmuA7&i%37go(HD ztBRU8QmpCo_34IJFy~-gk-IWeWy7~tq;PqrX`NBE1eInE-J>iwb83X2pi|tHMLD@u zVvA9%$&?YQsl5g3u(q@Q-nOhrA(4jmSYry{U*Fyy+NZr%??vWDE)#d7Jv@v%`WWlr zjxBKRlwsQ<9LaslG}l9`&{1WhX5+Q@y9ibkj{nh7^#wmpb$!wx$K)AIbIDtEUPKBN zYv$CpW1cn`MGrg|=y3JSExXX|Dmq{A$}$k0-r?ikgwQQGb9jFEjMOU>W3{CPYl&-+ z5S1nK3r%OnYVF~y;`s&t8L3_<#*@(U*l#9I&j#Z#vd~REosU$N53tg(v&Kqoc!#{>1TimhOXLD~UaZ<2Nbq>*$Rx=4Ef?jtz@ zj37Ay{3O?H7?cMhId)NSkG05L`$1IkH5 zNEl3k%_epiAy0j)=8%X6>>bqsin#syUR9l(S=<(&44$Q`Sbi=B-uKich@6opk3pZ` z7gy-9S2J5k-s)Z%114>VIXk?oa9*wQS<0!UkkN?qE>G){+(eP|V)JMb27VBM6qVZH>R6Je4xH*n5J}KW0>lbff7iQuKY*xO)z^ZmdU}$^npJSV)=*o-DJiU{|5>@TGRjl literal 0 HcmV?d00001 diff --git a/app/ui/icons/tri-right.16.png b/app/ui/icons/tri-right.16.png new file mode 100644 index 0000000000000000000000000000000000000000..733d49734d654f5cbd3a5a8a1bfb328293b51a3a GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fcd#PZ!4!i{7J?5Aq%|;Bl?jU{+{#-NnWp zu~55YQk<2yz+#1sT(vQaPIXN&YhCdpFVdQ&MBb@0EhI0)c^nh literal 0 HcmV?d00001 diff --git a/app/ui/icons/tri-right.32.png b/app/ui/icons/tri-right.32.png new file mode 100644 index 0000000000000000000000000000000000000000..16646f1c94b6b417e6f3586f6d5ae75ee8f2ff7a GIT binary patch literal 505 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq z*pon*(V}YRZJ?lJiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0u_AVrR) zB^mie48Dm)C7F2&L8Zmn`DNQrpP31iH-;EeT9lm1kWo@nV5P60oS&PUpI59`o|&DQ zo0^iD2r^C|#M2K+%uCOY&rHtGi<_@8fq{Wh+|$J|B%<}~^xeM9fda1Q9da(R7C8v} zIUbUgxXhCJfNz4w9A}171xtfeiJ%LriK;1I_E{(Ic$imk?p*ceORfK9JdHiiPl{7r zt2(#JSciE&6aRsa{l~2zoH}C`$K*b?TVW%fFv%7@wH#$ocp*4;W_*44$rjF6*2UngFl4!fyZo literal 0 HcmV?d00001 diff --git a/app/ui/icons/tri-right.64.png b/app/ui/icons/tri-right.64.png new file mode 100644 index 0000000000000000000000000000000000000000..789a7cca320f273c72cec4b1ac292f83b03797a8 GIT binary patch literal 796 zcmV+%1LOROP)VJ>fSXD@eYYiTc3VQyz{Uuk1+ZeE`# zkN^MzI!Q!9RCt{2+rMg5K@`XF&j_L@2!fR$zJegz_yRshqL^M^CJ34~4`88rfHWbE zk6>YCt+8<|k_8ED;?CTeduFr0dS+*T-+S(vJAV#a-E5_r&N=6Y*uhIY!5O~dFs1al z{_nL{F@T)&GwkEhiY7;Rn^HO}9ixYe0OXt>;}afS)ASf`B15=U*zcX|&BF`4&pF>M z9H+U~j)0u=9h_nvQ(+^aBm$mV&phXmaFBDpS1?{vl>o?vV=eF@8iW!6-<(f(C0bxV zQchSKKuYO1zEq4EDlxX62Cq_x#8@;9rj)*84?io$4iO2ppTf`a5%(*8<^-=&N;NQx zRRw_YAyflkYzUJ8U|a~30booBlLBBo2$KU~EC@{iFb;%f02l*8Qvk$=&>R4wzJed0+xyr39|tp283AwFh7LuIpDJ9&Iz*v zxX>Tv=M78URuIvf^a|{zlzy$-aZ{3Dk$E;_8Z0)?OgSLuyug7v^T*h!G0)ha!c|Xx zsZke0lbC1BmQuBFicF aUVi}x+EFhtLNXu#0000# z0Dw(+*uEH3m74=;Y07dviF3?B2ADXQ_D;oB?wE%1^^d@IUwg|KX6Ptn^l95Vv6?7Omwe3)m7y8a#qoxWIn=B93Nun;O=b+AZ+D0vG9Gg-IGRFxwTLG(+ zh6X=M4m=(&i{qdge0s|DopTYiD2PXip}~jZ058L78|z^Gj_wqrrW|9>l$Yo`XCi5t zkPa{e>hI|~3jxck@@l0O4^)xCJ>)j>0$pM2O_DL@@{49315T=c>+Rc}?GMS%^hx?F z)t906c3R&C7}Z{_2ASUw9%=#jNkci2@(fN4l3mI}wfcqbpL*lw^Y$$)AqnyD-SWy_ zPTo)Moup8B{p!~V{)hwz^$f@q6CTz9HYJ8u9|{(Jj3~Plh5Er!-3v0Ygs?>U$v(-W zNM#d%UQZ5>RQ?P&F<)@0PO)HE@CY@87yZ|69+jVoULNcj z7|w?v@w?Goh~3qq2G|hgF7(xAZN@#=L9{a0sOiTvCCOuSlIF^kap(oCHscno(Lp^1 zGJOg0H-H-oLn5(v27Z$ui_1k}{X(?g*IXOn*$@GD6QZFECzvju!S}?Dj};MyT|= z*{jiXnQa4qtTMRa ze0%sCEsu|s8Zdr{;!KmwE}^LPAhT$8TCrBx0+oHmQoin!oWE3TSV9b-!Oy?%C9c$z z4fVQDm_+zw5*H{9!Rv$qM`K5UfCiAPdM13W)!>smABEt>s@0bvK}&t^q-E>-Ez_rc zSE>#tZs3WkHYD@sobV+Js!Yor{~&Pa0$Zzj@B96a>XcK1uBsLOOow--yc*GEjGAuH zO)(d1n6uzw0m*?pJh91W2YP{)3%44nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fce1o-U3d7QJ^T9OOLYAmDm`78?_r^oE9p z(3Th*?^PRw^tUOLO=zCWvV}Q%!t>PD4W2y}mmAL?I`_xE-tJHN%B@lL-s`UDCH+48 z%x|w-NwD7`2}uiv$V*iWzXhDEH4U8h9WDRs_r!Ib&~5S3rFvJ*EYp7r?z}!;@ifsbt zCtOqdW>&>Idx>xEW6?j1*^ez*1X+}CR5m5Z#?9`W*>e*Jt}49YJ}vh7v(4wTbvj!z zFE4Xb`Kt1D8|!^RhM(loP z-z+U`JaO`H$SRjf4u?)2RtaAevH(PfDrrq9_|#hcUaV(&Sdu!^d!}&J4~7NrI$K^c zY~Lt$H=?m+lYYa-nRj>pbU&babgIUlK6$3lhxc~rbecBCRLFMbH}3in!&%(@t4nJ z@ErkR#;MwT(m+AU64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1S_3vzu7-AO!Er(WO7Z*W#gu8n>L6mDpWG8zS1O6AiO$xVs-mw;mx~?|Ie{*{CrT% z`t+RYy8Ck^-@R*kY|#fnhDw{1m8|#ve&NLPKhVXl^TgVFe`hQ@^uK3)o>0@*rot!p znfTr1Wf^}fwk%DxU&eH;#easkf$#>`A1y0cgc*eosh?3X5uYGvm#DOGWkb`4&Sye- zTeM^j?^m|BIiUAp+0(R@Cs{&vd`h0>>r~3fdq{nj#|o_li9cLQIj_!RocivkZ%Dmb z$V`T2ZTn@nR7AL62-pR>I!$codnkNVXw!U6!- zLCGOE-@B~h^o|RGj=kO;C-e$9ru=FC(%a4b*<4m4zct?Y@CSyC&+Jm~%ZkOM$Vjks zoDhBx==d@1q3~1{o4&}#tDF^K0b446xTtbEhv`13OEcX3p_5CfZB3NJx$>;fA3B}D z;wecJ^BxMbg2WG8=Vaa0?w{f%v5D_DgWyi)8pd~d7L{fXO@+U4?r&JG*m8e?nu44K zgWvTzHK%wEA2#4TfAh|NM=t)wy#X8#C2la=F+YE`_;W>0J}?LsTjX=z{jYdBXLVQS t3Eu~CHPwr@_g`;(eQ!T30p$Kij literal 0 HcmV?d00001 diff --git a/app/ui/icons/underline.128.png b/app/ui/icons/underline.128.png new file mode 100644 index 0000000000000000000000000000000000000000..67ad4981b5aad1cf566a523bb0844b02bfaafc82 GIT binary patch literal 1303 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEX7WqAsj$Z!;#Vf4nJ zys-db#zO5=Kn8Ic)B=- zRLpsM+qOeCRN~mj|EniC2rUwbkuL32IL3d4MO@UR)l4gCrrVtbt|1$QlNGg+5*JQQ zP+TOYq|wy6NXV6C?H`8g{Q^pl+!IR@g;^HwIQV4ajHx=>d3UPMo!Pnj{paQ>-)+;= z|LweEZEUWg;FO$^Y{M09Hp1{*0SM=j6)Hhf+hQeIm{mC7*(D#Oe$tL zIf#YBl^g7}&q&N%Qp$ThF5V((-zhh)D;y85a~XT(l0BEAQ&v`b@~?c5HgU<=xX<|9#G$iKSw9eV4v1nLaIl z;qC(=xBU-n>#(?W_|3!+eg=n2R}Zv1Y_9&AoE7e}=USC;_t#G@0WLK@ypL&ZbziontzP1s@Jkm`nPCz?C*&C*}V(Xl^=b)Hao&^{d~r0leVx|NNLp0Dl@GR z-C?WLxBcFUA~s&2bCw>^K9K6X-gbd_qb>LQy5!ss@@+0h>K;Vx;%}F#`a6%aLPhCa z6tB9x)E;IXwM?!Gwi#JF`@Nnu+!g#-_PTeC)}(V2O6D(dwv8#5KV|3ne4E|0)w7nA zPFki~d;43=x)X|?m)G{+owZ1>CHB?7@ZQsFpDs;PeH+?*{9<4nJ z$hLzpWB=2SsX#%=64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1SlJzX3_ zEPCHw-pG5%fv5GMF{>%FitO)={$VFLd>D2w&|v-Qp1kC;C+EZ~wMgRZ+ literal 0 HcmV?d00001 diff --git a/app/ui/icons/underline.32.png b/app/ui/icons/underline.32.png new file mode 100644 index 0000000000000000000000000000000000000000..1c5e4cdef6ac996ba7906470e93acafd9ede7148 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq ztocBg@yxb`%|JoP64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1U`46?H&uw1@x7kh&<9PV&y(RQR{|^;#!4{hzOh6y3q`NX}92LzAlAhV@h5eQ2|sXQivRvy0_Y n`N4DCi+4ZT|3^Ab`~k~ym3GbP0l+XkK`0Iq= literal 0 HcmV?d00001 diff --git a/app/ui/icons/underline.64.png b/app/ui/icons/underline.64.png new file mode 100644 index 0000000000000000000000000000000000000000..2c0bfb5e51012f7e106d3aa7e67734eeaa5eecf9 GIT binary patch literal 641 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=EX7WqAsj$Z!;#Vf4nJ zl*xcF9gP2NHH)l{_}Kk z45^s&cJ_WhkwB65`f!fkUA=8B5=%A+I-O<~Q2uDU#rVjN=d533pK#{nzBQ5BGL4O! zyF)+0q^09_jTpCAM?w0xGjIA|{G7D*+q~+!=d(TY%&db$7#D1NrsJil8WjIp{_cOL zB|qX7Sa&e*@ML_)kQdZo-7s6^0p9~Pa)i{F>fEFlrZaDCJ~b)8Y~{>`^#|pySFiai zcOyE;nDO>Ox$MSU)>Ge?GgW(MsXcJsaNIUwRj#0c?#sN?o7XBP{=49E;B-R2s^|CP zE25{DY~J+jtHkeZ>=oWUiUqq}_isHsYx50ey>FJ^KRT>-WONsjGuXA&|Fto%O^$)h zfnzRh_G0f`*@YOkHM$=#DtP%}Gmj0Mo#~y&3=uQ7G%$YHsmvKTugo-jbvsX^^dvLY zv!$X5JomhJg?dRw?PB&mAbxr3eb#kRZ1#$YeLqfKm?oQW(e`(KgXROy#gA9y-z$_` z_vb#tI>z&j^0qv63^vSZcZ$Op(YT&(wH#m`KJ&y&Jb*Lp-v*`n~W zYf0mh$@{t6ChhaQHT6s2C27y~UYfsaQ@kgscurEWT;%X(?}5*LZ}%ShlYT<>fG<}8 ld%6+@;OXk;vd$@?2>@-83daBd literal 0 HcmV?d00001 diff --git a/app/ui/icons/undo.128.png b/app/ui/icons/undo.128.png new file mode 100644 index 0000000000000000000000000000000000000000..8fbe34362c576c16709c4c7a374f340289d30a83 GIT binary patch literal 1604 zcmZ{ke>Bs37{|Z+WoC3uLVo01+}5aIiE8J82b$L%=G{O zFz};$2g4a!4P71hZ1-S2gA+Q%%P&M1)~~upPQx`$K#xcP0IS^9K%ATSz=oUag+AfJ zLwt@<%t~ehVzHRWOG-$IV+q(qeloXAz1ti%8LygXslucDWFU~0EaWAD!Ko<;d{NUg zr39Xn|A(X|$FYHSqE1y#Z-Y^X{>-sPs=j+Fu91qK{+=T2e2@7UAZOJq7_00#5Z$4=vUb~)E zd(kKV?8s^FlzzOi8G%OfeIX5uXf?L;zn0qG;=_qo)pRcNI|8SumO==i`JO9m5P%oMDH~d9FamUy)R#Y7M9@;D|{vlAZ z+;S%p@XyGIbObh2gKio_#TE5$F_mwpoOlR(tu`PG9#U-`fX!{xDpRO#Kq|7Qk$hq?cXcMZ*ZATqp=?$~yOa z)_WS|wgtwm%gy=;a^kpMmO;1X(b=)hq3WORkM1FI0gOymV9-gjLQ~7lNTN_`hQV(kZC45mmhbZkrrX&SIE* zyJ@zP{;V3+*J&wYIvQPv*${sm^qbagc%p2*In=PAtb9R#@2x`79eb^3%J-BVc|`-A~jUpt36f7 z8zYj3ia-%}_{2tmoq*UGFLi`w_GNZ0NF=HlcGvJ>oW&7>azecbS=e8cKLmpZ%W9WL ztF{`lI2QC2N;vwMNOK(*%WYS3l(SaM?Vb3IF0$W+vve%V)u_Yyere{q=B>^zjT_>J zv947_LUj>XF0sOFxY~Rj?}CVSNve65fG)@bJJ+`RC``oG%dgw2i_{-=uhyA2?Jf4H zG8)-LM7yn6`y$62@+Q=KqurBokJO&z+3J#y6P9um&d-J)E-h00O3(Du4QKBvKH;JK zry_bQqtZ7UtT0;f>OIA_h>Eb^_D@g`J}Ypq6Oz1(;Sy)xp@rK~4k0x;PeeL$YW=ae z+JMe!cbW|rIYc534StS%v?cp>hVHS$m)|f<@&`__oTykiHAH@^@vp~G&356%pvd$S zMm~C2eye{TW9wnn@>YG_)bj+BgN0NEWqrWVQ_;KS^Del2W_Ikh3B#7b2GzjN*3aLy z03eSb6KXNWSo8yCAoi8pHR6 zBGj!$;e9wsl)sX94NGh%v3CcTFrym(bGWfFw{CpVRbzaQu{{RmvxW51Z literal 0 HcmV?d00001 diff --git a/app/ui/icons/undo.16.png b/app/ui/icons/undo.16.png new file mode 100644 index 0000000000000000000000000000000000000000..8933a8c69b4cde487ed6e7e0ae0135048e10c77a GIT binary patch literal 360 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fcddPZ!4!i{87F4EdS@1X!OZ8(f@SAjX}s z#W3!G3t#eM-=6IY6cttO97)RAV8Hn4VBht3XHMsB+Hh`#``2wDdRP6{UVR(1GnD`T ziOMzN`-}qIKIAW8mQ!p|cQDHK^=RbTvHIwFm1lLOi|19pGi5n4MJ4NM@$Z$B-0t>H lnWOgKW$%jXfeEoc85)8o%=56F)BN@&KcYMamiThF}?R@@h z&j0gwiq*uWq@=hOtXuK=)s_5?_p7eI>aAMjHuurn#)40gT8qCOv3TTQEn3GWr)@q# z`5)68mm|@VY;9fXHQ%(ihOYduU--X~mu31t;kZWY2TT@y9m`{wMLU+iWULk}oW|29 zb6995Bj1&`DH~oXpIF46<94L>S>8`rUhrQdezi4*IdyhNhh4#JE`NSggF{CaT16jWDVSC9o{2v>{n?izMUKoX zbW45b>dcy5s<`sA{HM&MQiHIs@h7FE{^`7bt{lQLbMJ-%V3;#_y85}Sb4q9e0GAKW A4*&oF literal 0 HcmV?d00001 diff --git a/app/ui/icons/undo.64.png b/app/ui/icons/undo.64.png new file mode 100644 index 0000000000000000000000000000000000000000..e043e73c7a5bb34f37ca3e57df4042e2a94f5fdd GIT binary patch literal 905 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=EX7WqAsj$Z!;#Vf4nJ z@ErkR#;MwT(m+AU64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1Skcv5PXYI|t79eu0zF&mJJaeV% zA7&O=mzXO%OA87G=dhFpuvl{(y%~C8;cSjrmckbcCMOGW#jcWNvER_uwPMQxu}s#j za_w6L?yrBMX1+et#=fHc$sBX_^N07IJn4I&Q06!oJ-2rWmA!F>k16>;-UHqO_e;xH zy}HU}ygMUJ|7?!o*XSDtOT%2`8Pm-8ddfNXv%9JO?TOv4aXU#)$Jyq9+yjR*vr;?L z9QZ!Ye$x|b%ofPQA;AAZ$?a^!6f=c@Kee9ur?2&RuIx@&@T2lU&yx44S;v-r;NTGX z&tVa6{xP6{MMR)J>{8ams8Hb?hsj5r7clw?^E0xU1ll|?S+MevVmqU+7{4SNOV@kz z`wi<=`fqU`ShM8#LiU$g4rh;+KNdA$_3@56|GB-7Ehq3}<~(NMN%K-wx0N>W3h-|b zpJBFHII=VFI&;>svInzf&V4iWN-ozNcC}R&tLqO~oh&|)vpnIlUenzOrO2-A-L~a( znI@?6mYOr}VE^+@P~L3w#4mjh+*X`Z^Z3QI=bXpwsrNLla9+E~@*vi&#$a#Y z4$*ZRIV1BIgkO?gI**lWM!{a6y>rfd>Ck2Nzhv!Y&%-*)AS-R^KAEW|%y-@jL@}@P z`1LWoZp|UavzJ0Wwvx9Ir>0;?A+@icDE5uTQO^-b#%%LF}b z{Z~~EeJ?*SR!D44i(I7Nku#%!dBd~|Tm?Jx-m|a%IrO72d^#p08H@=p00i_>zopr04|nuSpWb4 literal 0 HcmV?d00001 diff --git a/app/ui/icons/videosource.128.png b/app/ui/icons/videosource.128.png new file mode 100644 index 0000000000000000000000000000000000000000..b0747ba1a83fb17f8db9b4e32e241c2376474065 GIT binary patch literal 1281 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEX7WqAsj$Z!;#Vf4nJ z$hLzpWB=2SsX#%=64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1SPM9G zoxjm%)O0qzS@(UOv9bB*zf(@nE&g}sb8^~@|Mx5vJSVAOpk2OJ-wT;}8_AM#yy->9IXGJ2+P zEb0|C^&dXEzCpNR;WL(*m9_;PXZ7t&rhk9VnDlhkf6jT|vLl(kxg6QPl>OY9$Oq03 zjv4aBGrg0)c;~~;A7678{_N{Mb!K+M;-2k4E?oI~pyOFyV5#WeKI6}2vu2->R+D-4 zPSC)(((~4VoRy76pZy*v6y!EOOmjOB%F1@>*S4t=D#q_w?HJbS8Om)qoBe;vi8Hnb ztPf08J#NYntY9q9c8^I<+qUc@V`x~~JN9|0y~n?)N;J$nb%tRc^Sm{d{fsXbp1H%c zhs!3ST95gH@ytrg4{8PR(w`+8J2N_D1CAjA+u`OV3 zwXPC2WYArG;o|HL#*DzVefLy&9K5s2zNiUKwtMiw@j}UG9)kk5gagvDdxdC1$`dx1(cygL`BA?sZ2QN>r5gExdW}>2kf-1`M)Y9q%*lvHqwHH%@7CRVqqijeifM=bp`E zs7g!iKe#+IPCk4tFoZiI7TrAk(c$e*9tVF{7q=s?4@f&)n{}MwON`4N?mbRR{T4CK zU^2DtWJ~b6@=B$z!QPv1h3VhGqzPPej~o@0HCJX!T6o2w)w+{g`9U`mb7t*vZ@#b% zlPii?&Rot>U1v3I#fO0OrIUB`f3)sAec)oC%baDE`FmekNC<}h(iQxue0FBS9KT03 zE_1kc>h?#8z}_Wnux%Q|Q2&Xx1lm)^SXk@jxE yPMtR_X_;bw*&nbJ4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1fcd^o-U3d7QI&|+43<4inQ)O++yqFyH;p! zM_fApX2#8&VF`>%WzLI(q7Q`B9SS_taq`58%Z0Ok7v1~)ZuidbhwgiCJMLiqAeSvi z+Jil#Z*v+juM6ait7A}i;MtP9+#%?P?oB%ek5^YNZVNxaaD#F0 zrUzS&eKEBP8|I6&)x-6IT&KGZ59d(_<>>TH-!ld_PvIn!4g?H4Ab0>~hOnNJL nfxn^uz^*MG$`8a2{M{w@UBpsb=A>f|&=(Azu6{1-oD!Mff5Z5pGRMNAiCnN zw4vl4#@ubW++D7J7>}kI+|J=rYo3u4*H-)2Q|(~uUmh*J$LCL3wd;O9R=jWK_f&~< zJiNTT!fHmvjO;U3zMNMZlWeOLw`%sxogJ|}8)RozHs74}kX6|fOx0gA3 zH2zS>i4Kb+il25j>~?w=r~2f^^ZEnq-*t1Y%3M4ys<%p7u<+H}=C2*>IoDt0W@Je8 ahxcT=l-=HX|06J989ZJ6T-G@yGywpMlgbwW literal 0 HcmV?d00001 diff --git a/app/ui/icons/videosource.64.png b/app/ui/icons/videosource.64.png new file mode 100644 index 0000000000000000000000000000000000000000..d96e9eee232884a8b77820a5e5d7e91ced4ce304 GIT binary patch literal 780 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=EX7WqAsj$Z!;#Vf4nJ z@ErkR#;MwT(m+AU64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1SV{35F1QK2jnx+A2@BiEchD(tL)^wqonq58b^fk)6>yQ3)(*7JO_~xL_~CiP89fd) zYvbL@`uTg~Yv0YRK5vuOX3pQFzyU@7`5ABAKVYx&2rP<4lZu`zC z-l%-woBf`9Sq6V>6Uw`J|7+VZ%X+?lEq23>=MGca^^aDu0r!5&w6Wh{jaj9=tyX5o z;roaA_fAXstvb8-X1+`OrGr`%-|`j6-mp5gT4DV|#vCd z${EZXlOI>5NH@HVd|+0PAv9lydBfiJPt4B`EQyO`V_3sboGT%kJ40o`)Q5`q8KRV# zJnlMVDK%W-U807>yv`t%-<$8Uj`0lh`dbF4fVQnZVEN!E*a(G{>~q-V{2xuuWnh@J zk4e0N{c%;uJ9d+s^Sv9Fyx%6?D3_emmA03u&Epqm4CA!f*Zf?83UyX;moQ#mJ9`#G zn@1GeI;Q=vUT~kPe{XqlwU9>?qgbQ7=%uYqpEfx7*{oEaR5Je)@5kJhH#2k2GnQ-q zpPpZ47brL3N5J-kBaEG<4}1(QiY_tAG5+0Vl{?e!!-TfO%pO&IbC%3`ue`zPgO%#b j*weLajsh$Y6!}4#by>@-i3hwu$(g~^)z4*}Q$iB}1Jp8z literal 0 HcmV?d00001 diff --git a/app/ui/icons/zoomin.128.png b/app/ui/icons/zoomin.128.png new file mode 100644 index 0000000000000000000000000000000000000000..d9df8ee670723e28d0d6cb595d923775b3488b89 GIT binary patch literal 3775 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 literal 0 HcmV?d00001 diff --git a/app/ui/icons/zoomin.16.png b/app/ui/icons/zoomin.16.png new file mode 100644 index 0000000000000000000000000000000000000000..da94f7761a879097d5e25431ef3ff88b06747e90 GIT binary patch literal 581 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFmD85#;?t9J%NIfC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NC6dzfD}2F zmSp4?G597Hm1O2A1eF$N=a+3ieP$+5-WXy?X;E@2Lq5KliOF)uwoJ~KH#FK)iZ1O^7iWKS2z5R2Zalg?`&E|fSPe|}bMZ*#K{ zyL#5rB{63$w6(vbd+41j3i`+FmD@E%+1f(m>2X%m=~q2ubRKo>k^NTl>hQKlEA!8v z|Ni^u$G;M}E|(-GF#obGVV9Y8voa=Kx54&+l)=5W-z*U(o0qFGvA<{9d%!q=Wu5I@ zMlJ{Q4;*LMCe29j4hjtl3|fA?Xws&<<*HNnq;1Yj_n*VI;ds7EsFJ=?Z zDmm@-fq)lp7W2DZ*4Yu+t!_~eJ7G%SBl(LZ6?ymW8U-pTzC2N`%PQm<=_$;plX*Ma z?9e_BF9vM~yH|gl9^ZPHpnO2)0;|o13Xjrk=6&qHGIWn0m^Ab1!onjn;~&T-NJ_9R z%lvasB!Kx;TG_{Dzo2{NtGuGVcK*}xOgR76KjHqFegB+4@M=}u+rB&T@(EyUF?hQA KxvXVJ>fSXD@eYYiTc3VQyz{Uuk1+ZeE`# zkN^M!8%ab#R9J<*m&;36K@`V7N7LRERGLtWpccKP7Hy(@^uRwrkp6=#3xXn0D2R$S zy*8zbcCC7@qG%yymXeqXLInvyMPUyji72hUE$+QGzj5yGq2(7Y%sF%BobSw>IWyOo zBqYrQDuD`MQLO$1yafi$>_LSKLeGkfR-*(s?<(ql>6-99tx1R8)5M_mH6j`!jb?=CsR024?mExEqQwfk0g0syuaDO7KE((UYqsm4;TJlFSPC zDlOX!ftfu8-Z-kc!1@q@rJg*HG$ift_I$`6?Co=xmze#Yc}0kTzmM;o_DM4LJQvF1 zF(F?7nAvyWfv0YoDgj`hC*L=-(X>i< z#gpqK`Nb)Lo7utqkW>Tg^wc*Yy%gWWIsZi2dtOp#e~$nkpm#~Y&Z`Z1Q1C)u(T`&KhM<0{4pNGbs?0Ne5mUI@m3qwdTT6vx3!iLTt* zEKa(J9-sbYl?&a#elzO`btaYYAla9_1K2|}lNzFDRt@RT^shv<PQ zH?vV!DQOn44p;#!1b!0bLh@@i>O0CtpdXkQ=2REw(~EdJrWJnxe?f!oP~fn700000NkvXXu0mjflgPa0 literal 0 HcmV?d00001 diff --git a/app/ui/icons/zoomin.64.png b/app/ui/icons/zoomin.64.png new file mode 100644 index 0000000000000000000000000000000000000000..f0a5f979cc46aa01d13939a90b16fe79371de67d GIT binary patch literal 1921 zcmV-{2Y&d8P)VJ>fSXD@eYYiTc3VQyz{Uuk1+ZeE`# zkN^M%pGibPRCt{2n`?+wRTRg6D@V!)zUZZC>G&%9P=;v=eF&}WB{nLdeUOwUGe}D* zvLXw!!USIt27(b|FExeAGBc#`1*JjS_*NXvq}QaQf!gZB-q*Qv=ge9AoO|z#kNz;s z%vo!%z1RQlv-eti?F$zSFcbaTs_*L_SN?xZnh+YG+_3FsRVB4SWZ@AR<*s8WofPRlO5<9k-x01&#yL zMC9|(1_dF&FLF--6ANK4PbjcJMCOJl=S_gBHUnM(9?I8Nf$=^tT|~~rDV5~Yga72y zI=>Cr0Bpsr=tqDWFKdO14Y~q-fq_7ug!V`K-!H}~dzKLsoT7K+HRw0-)1+W-@QafHoa1s)fXHBrJ;1gL5k zU?tEdKz#==SwwcF=__Uoy@0v6aN0sOFib=a^4+81H-c)1QX!*{6`J7Q^1pcYKCH9jBG%t z5#Q%z;IyGy?tKB0&47N`Dea;Zt9{g`pFyi6hD4+iSZt`30=H!TNkTxGAwQ1G&zl-= z;R3EWoP7;~2=G&8u%T8VB7cY2D<*uP^?{)_B=Z`C&Vb(7$5_h(Z8Zj#8uBZE?hsBu ze?z`aMD_;SDmp}D4^U~S-3H+V^fKh@1MM^>HW>1r5S|WqGvq%;J@nDs6x?-3{cf!BC_8aQw};q z_$y%L-@isYn?~`R&qhmNdc^Z1M!VJ!PJk7V)MWposwKd!fwl{Qfe~3`O{8WmT0uAg zvFB>%GeQZdHsp0?h|jh*ry5Z@tdBVS44So}1pH~puZnm!6PMB!8#P3)0an&}911rB z>TQ!E@-yxbb1lUoqQ=`EDIy0##*~992;T;G6Q7#iOvKTYKej55GaR$eXKeHc8DIqZ z8uGmmJ_EKG^2V+MhQJ!rP6#Jpt0C{Bs@(%^6&-#oy$!XE5Kh1W;5S2OM4+w4z$in0 zlq9c!zlmYh-^ci(MUz5R+fiE3e z9_K4INf5V1TH$OR`0R76p|*#tMLp@U_+mp|0?bv_BuUVwl(IVTea-=_%F@E@%T-AU z_yl+EABUd6tk4n{@Fvl-paz%~V!-z`8-L6dgDSG7KO`i;$J-%;8Vbw^A;DLEhT-n` zobf;3;);zN*T@p0gjVq5^3uq$v1#b@avc3W5np>3jyKaSQ0%B4Q<0 z);QYXwz{#{3m&)&5|4?<+9+WV0eL!~jT&mN$m~hdP*r>2vdhsVE1As^kp^$Fm;@Bi z`CL@uj;?pQIFFrIV4jG~ z4^fUJKvg^9oWHh!18WQ%1D+F+kb6TwL?Glp`6cA%ym>FE2v`T)m&AFc?)M>0iR4P!!Crz;UMsEW*|PY8;+~dU7v^DDC_|i0xLr! z$0%eIFadYbC@tzZp9^0rECcQbE>GFVQD6NY>s{>1h00000NkvXX Hu0mjfy(&qw literal 0 HcmV?d00001 diff --git a/app/ui/icons/zoomout.128.png b/app/ui/icons/zoomout.128.png new file mode 100644 index 0000000000000000000000000000000000000000..a2526d460714e573b2bc82b81663e6bc858f675e GIT binary patch literal 3580 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. + +set(OLIVE_SOURCES + ${OLIVE_SOURCES} + ui/style/style.h + ui/style/style.cpp + PARENT_SCOPE +) diff --git a/app/ui/style/style.cpp b/app/ui/style/style.cpp new file mode 100644 index 000000000..777a8c8ca --- /dev/null +++ b/app/ui/style/style.cpp @@ -0,0 +1,44 @@ +#include "style.h" + +#include +#include +#include + +void olive::style::SetDefault() +{ + qApp->setStyle(QStyleFactory::create("Fusion")); + + // Set palette for Fusion + QPalette palette; + + palette.setColor(QPalette::Window, QColor(53,53,53)); + palette.setColor(QPalette::WindowText, Qt::white); + palette.setColor(QPalette::Base, QColor(25,25,25)); + palette.setColor(QPalette::AlternateBase, QColor(53,53,53)); + palette.setColor(QPalette::ToolTipBase, QColor(25,25,25)); + palette.setColor(QPalette::ToolTipText, Qt::white); + palette.setColor(QPalette::Text, Qt::white); + palette.setColor(QPalette::Button, QColor(53,53,53)); + palette.setColor(QPalette::ButtonText, Qt::white); + palette.setColor(QPalette::BrightText, Qt::red); + palette.setColor(QPalette::Disabled, QPalette::ButtonText, QColor(128, 128, 128)); + palette.setColor(QPalette::Link, QColor(42, 130, 218)); + palette.setColor(QPalette::Highlight, QColor(42, 130, 218)); + palette.setColor(QPalette::HighlightedText, Qt::white); + + qApp->setPalette(palette); + + // set default CSS + QString stylesheet = "QPushButton::checked { background: rgb(25, 25, 25); }"; + + // Windows menus have the option of being native, so we may not need this CSS + bool set_separator_color = false; +#ifndef Q_OS_WIN + //set_separator_color = !olive::config.use_native_menu_styling; +#endif + if (set_separator_color) { + stylesheet.append("QMenu::separator { background: #404040; }"); + } + + qApp->setStyleSheet(stylesheet); +} diff --git a/app/ui/style/style.h b/app/ui/style/style.h new file mode 100644 index 000000000..8d5ad6c7c --- /dev/null +++ b/app/ui/style/style.h @@ -0,0 +1,12 @@ +#ifndef STYLEMANAGER_H +#define STYLEMANAGER_H + +namespace olive { +namespace style { + +void SetDefault(); + +} +} + +#endif // STYLEMANAGER_H diff --git a/app/widget/CMakeLists.txt b/app/widget/CMakeLists.txt index 6d5ad3314..51ff1d46e 100644 --- a/app/widget/CMakeLists.txt +++ b/app/widget/CMakeLists.txt @@ -16,7 +16,9 @@ add_subdirectory(viewer) add_subdirectory(panel) +add_subdirectory(playbackcontrols) add_subdirectory(projectexplorer) +add_subdirectory(projecttoolbar) set(OLIVE_SOURCES ${OLIVE_SOURCES} diff --git a/app/widget/panel/panel.cpp b/app/widget/panel/panel.cpp index 89849394b..ad8250f2c 100644 --- a/app/widget/panel/panel.cpp +++ b/app/widget/panel/panel.cpp @@ -1,6 +1,8 @@ #include "panel.h" -PanelWidget::PanelWidget(QWidget *parent) { +PanelWidget::PanelWidget(QWidget *parent) : + QDockWidget(parent) +{ } void PanelWidget::SetTitle(const QString &t) diff --git a/app/widget/panel/panel.h b/app/widget/panel/panel.h index db1d76b71..6a6472955 100644 --- a/app/widget/panel/panel.h +++ b/app/widget/panel/panel.h @@ -2,6 +2,7 @@ #define PANEL_WIDGET_H #include +#include /** * @brief The PanelWidget class diff --git a/app/widget/playbackcontrols/CMakeLists.txt b/app/widget/playbackcontrols/CMakeLists.txt new file mode 100644 index 000000000..3506c7f6d --- /dev/null +++ b/app/widget/playbackcontrols/CMakeLists.txt @@ -0,0 +1,22 @@ +# Olive - Non-Linear Video Editor +# Copyright (C) 2019 Olive Team +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +set(OLIVE_SOURCES + ${OLIVE_SOURCES} + widget/playbackcontrols/playbackcontrols.h + widget/playbackcontrols/playbackcontrols.cpp + PARENT_SCOPE +) diff --git a/app/widget/playbackcontrols/playbackcontrols.cpp b/app/widget/playbackcontrols/playbackcontrols.cpp new file mode 100644 index 000000000..3ebd7e160 --- /dev/null +++ b/app/widget/playbackcontrols/playbackcontrols.cpp @@ -0,0 +1,89 @@ +#include "playbackcontrols.h" + +#include +#include + +#include "ui/icons/icons.h" + +PlaybackControls::PlaybackControls(QWidget *parent) : + QWidget(parent) +{ + // Create lower controls + QHBoxLayout* lower_control_layout = new QHBoxLayout(this); + lower_control_layout->setSpacing(0); + lower_control_layout->setMargin(0); + + QSizePolicy lower_container_size_policy = QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding); + + // In the lower-left, we create a current timecode label wrapped in a QWidget for fixed sizing + lower_left_container_ = new QWidget(); + lower_left_container_->setVisible(false); + lower_left_container_->setSizePolicy(lower_container_size_policy); + lower_control_layout->addWidget(lower_left_container_); + + QHBoxLayout* lower_left_layout = new QHBoxLayout(lower_left_container_); + lower_left_layout->setSpacing(0); + lower_left_layout->setMargin(0); + + cur_tc_lbl_ = new QLabel("00:00:00;00"); + lower_left_layout->addWidget(cur_tc_lbl_); + lower_left_layout->addStretch(); + + // In the lower-middle, we create playback control buttons + QWidget* lower_middle_container = new QWidget(); + lower_middle_container->setSizePolicy(lower_container_size_policy); + lower_control_layout->addWidget(lower_middle_container); + + QHBoxLayout* lower_middle_layout = new QHBoxLayout(lower_middle_container); + lower_middle_layout->setSpacing(0); + lower_middle_layout->setMargin(0); + + lower_middle_layout->addStretch(); + + // Go To Start Button + QPushButton* go_to_start_btn = new QPushButton(); + go_to_start_btn->setIcon(olive::icon::GoToStart); + lower_middle_layout->addWidget(go_to_start_btn); + + // Prev Frame Button + QPushButton* prev_frame_btn = new QPushButton(); + prev_frame_btn->setIcon(olive::icon::PrevFrame); + lower_middle_layout->addWidget(prev_frame_btn); + + // Play/Pause Button + QPushButton* play_btn = new QPushButton(); + play_btn->setIcon(olive::icon::Play); + lower_middle_layout->addWidget(play_btn); + + // Next Frame Button + QPushButton* next_frame_btn = new QPushButton(); + next_frame_btn->setIcon(olive::icon::NextFrame); + lower_middle_layout->addWidget(next_frame_btn); + + // Go To End Button + QPushButton* go_to_end_btn = new QPushButton(); + go_to_end_btn->setIcon(olive::icon::GoToEnd); + lower_middle_layout->addWidget(go_to_end_btn); + + lower_middle_layout->addStretch(); + + // The lower-right, we create another timecode label, this time to show the end timecode + lower_right_container_ = new QWidget(); + lower_right_container_->setVisible(false); + lower_right_container_->setSizePolicy(lower_container_size_policy); + lower_control_layout->addWidget(lower_right_container_); + + QHBoxLayout* lower_right_layout = new QHBoxLayout(lower_right_container_); + lower_right_layout->setSpacing(0); + lower_right_layout->setMargin(0); + + lower_right_layout->addStretch(); + end_tc_lbl_ = new QLabel("00:00:00;00"); + lower_right_layout->addWidget(end_tc_lbl_); +} + +void PlaybackControls::SetTimecodeEnabled(bool enabled) +{ + lower_left_container_->setVisible(enabled); + lower_right_container_->setVisible(enabled); +} diff --git a/app/widget/playbackcontrols/playbackcontrols.h b/app/widget/playbackcontrols/playbackcontrols.h new file mode 100644 index 000000000..9a3feb051 --- /dev/null +++ b/app/widget/playbackcontrols/playbackcontrols.h @@ -0,0 +1,29 @@ +#ifndef PLAYBACKCONTROLS_H +#define PLAYBACKCONTROLS_H + +#include +#include + +class PlaybackControls : public QWidget +{ +public: + PlaybackControls(QWidget* parent); + + void SetTimecodeEnabled(bool enabled); + +signals: + void BeginClicked(); + void PrevFrameClicked(); + void PlayClicked(); + void NextFrameClicked(); + void EndClicked(); + +private: + QWidget* lower_left_container_; + QWidget* lower_right_container_; + + QLabel* cur_tc_lbl_; + QLabel* end_tc_lbl_; +}; + +#endif // PLAYBACKCONTROLS_H diff --git a/app/widget/projectexplorer/projectexplorer.cpp b/app/widget/projectexplorer/projectexplorer.cpp index 7436ea75c..2db91fdc2 100644 --- a/app/widget/projectexplorer/projectexplorer.cpp +++ b/app/widget/projectexplorer/projectexplorer.cpp @@ -1,9 +1,11 @@ #include "projectexplorer.h" ProjectExplorer::ProjectExplorer(QWidget *parent) : - QWidget(parent), + QStackedWidget(parent), view_type_(TreeView) { + tree_view_ = new QTreeView(this); + addWidget(tree_view_); } const ProjectExplorer::ViewType &ProjectExplorer::view_type() diff --git a/app/widget/projectexplorer/projectexplorer.h b/app/widget/projectexplorer/projectexplorer.h index 5a5d5cefb..ef1f7f5ac 100644 --- a/app/widget/projectexplorer/projectexplorer.h +++ b/app/widget/projectexplorer/projectexplorer.h @@ -1,9 +1,10 @@ #ifndef PROJECTEXPLORER_H #define PROJECTEXPLORER_H -#include +#include +#include -class ProjectExplorer : public QWidget +class ProjectExplorer : public QStackedWidget { public: enum ViewType { @@ -20,6 +21,7 @@ public: private: ViewType view_type_; + QTreeView* tree_view_; }; #endif // PROJECTEXPLORER_H diff --git a/app/widget/projecttoolbar/CMakeLists.txt b/app/widget/projecttoolbar/CMakeLists.txt new file mode 100644 index 000000000..79846cee3 --- /dev/null +++ b/app/widget/projecttoolbar/CMakeLists.txt @@ -0,0 +1,22 @@ +# Olive - Non-Linear Video Editor +# Copyright (C) 2019 Olive Team +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +set(OLIVE_SOURCES + ${OLIVE_SOURCES} + widget/projecttoolbar/projecttoolbar.h + widget/projecttoolbar/projecttoolbar.cpp + PARENT_SCOPE +) diff --git a/app/widget/projecttoolbar/projecttoolbar.cpp b/app/widget/projecttoolbar/projecttoolbar.cpp new file mode 100644 index 000000000..6002a727f --- /dev/null +++ b/app/widget/projecttoolbar/projecttoolbar.cpp @@ -0,0 +1,95 @@ +#include "projecttoolbar.h" + +#include +#include +#include + +#include "ui/icons/icons.h" + +ProjectToolbar::ProjectToolbar(QWidget *parent) : + QWidget(parent) +{ + QHBoxLayout* layout = new QHBoxLayout(this); + layout->setSpacing(0); + layout->setMargin(0); + + new_button_ = new QPushButton(); + new_button_->setIcon(olive::icon::New); + connect(new_button_, SIGNAL(clicked(bool)), this, SIGNAL(NewClicked())); + layout->addWidget(new_button_); + + open_button_ = new QPushButton(); + open_button_->setIcon(olive::icon::Open); + connect(open_button_, SIGNAL(clicked(bool)), this, SIGNAL(OpenClicked())); + layout->addWidget(open_button_); + + save_button_ = new QPushButton(); + save_button_->setIcon(olive::icon::Save); + connect(save_button_, SIGNAL(clicked(bool)), this, SIGNAL(SaveClicked())); + layout->addWidget(save_button_); + + undo_button_ = new QPushButton(); + undo_button_->setIcon(olive::icon::Undo); + connect(undo_button_, SIGNAL(clicked(bool)), this, SIGNAL(UndoClicked())); + layout->addWidget(undo_button_); + + redo_button_ = new QPushButton(); + redo_button_->setIcon(olive::icon::Redo); + connect(redo_button_, SIGNAL(clicked(bool)), this, SIGNAL(RedoClicked())); + layout->addWidget(redo_button_); + + search_field_ = new QLineEdit(); + search_field_->setClearButtonEnabled(true); + connect(search_field_, SIGNAL(textChanged(const QString &)), this, SIGNAL(SearchChanged(const QString&))); + layout->addWidget(search_field_); + + tree_button_ = new QPushButton(); + tree_button_->setIcon(olive::icon::TreeView); + tree_button_->setCheckable(true); + connect(tree_button_, SIGNAL(clicked(bool)), this, SIGNAL(TreeViewClicked())); + layout->addWidget(tree_button_); + + list_button_ = new QPushButton(); + list_button_->setIcon(olive::icon::ListView); + list_button_->setCheckable(true); + connect(list_button_, SIGNAL(clicked(bool)), this, SIGNAL(ListViewClicked())); + layout->addWidget(list_button_); + + icon_button_ = new QPushButton(); + icon_button_->setIcon(olive::icon::IconView); + icon_button_->setCheckable(true); + connect(icon_button_, SIGNAL(clicked(bool)), this, SIGNAL(IconViewClicked())); + layout->addWidget(icon_button_); + + // Group Tree/List/Icon view buttons into a button group for easy exclusive-buttons + QButtonGroup* view_button_group = new QButtonGroup(this); + view_button_group->setExclusive(true); + view_button_group->addButton(tree_button_); + view_button_group->addButton(list_button_); + view_button_group->addButton(icon_button_); + + Retranslate(); +} + +void ProjectToolbar::changeEvent(QEvent *e) +{ + if (e->type() == QEvent::LanguageChange) { + Retranslate(); + } + QWidget::changeEvent(e); +} + +void ProjectToolbar::Retranslate() +{ + new_button_->setToolTip(tr("New...")); + open_button_->setToolTip(tr("Open Project")); + save_button_->setToolTip(tr("Save Project")); + undo_button_->setToolTip(tr("Undo")); + redo_button_->setToolTip(tr("Redo")); + + search_field_->setPlaceholderText(tr("Search media, markers, etc.")); + + tree_button_->setToolTip(tr("Switch to Tree View")); + list_button_->setToolTip(tr("Switch to List View")); + icon_button_->setToolTip(tr("Switch to Icon View")); +} diff --git a/app/widget/projecttoolbar/projecttoolbar.h b/app/widget/projecttoolbar/projecttoolbar.h new file mode 100644 index 000000000..f5bd9cdcc --- /dev/null +++ b/app/widget/projecttoolbar/projecttoolbar.h @@ -0,0 +1,44 @@ +#ifndef PROJECTTOOLBAR_H +#define PROJECTTOOLBAR_H + +#include +#include +#include + +class ProjectToolbar : public QWidget +{ + Q_OBJECT +public: + ProjectToolbar(QWidget* parent); +protected: + void changeEvent(QEvent *) override; +signals: + void NewClicked(); + void OpenClicked(); + void SaveClicked(); + + void UndoClicked(); + void RedoClicked(); + + void SearchChanged(const QString&); + + void TreeViewClicked(); + void IconViewClicked(); + void ListViewClicked(); +private: + void Retranslate(); + + QPushButton* new_button_; + QPushButton* open_button_; + QPushButton* save_button_; + QPushButton* undo_button_; + QPushButton* redo_button_; + + QLineEdit* search_field_; + + QPushButton* tree_button_; + QPushButton* list_button_; + QPushButton* icon_button_; +}; + +#endif // PROJECTTOOLBAR_H diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index 1d57cc034..9006e67a8 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -12,58 +12,12 @@ ViewerWidget::ViewerWidget(QWidget *parent) : layout->setMargin(0); // Create main OpenGL-based view - gl_widget_ = new ViewerGLWidget(); + gl_widget_ = new ViewerGLWidget(this); layout->addWidget(gl_widget_); // Create lower controls - QWidget* lower_control_container = new QWidget(); - lower_control_container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); - QHBoxLayout* lower_control_layout = new QHBoxLayout(lower_control_container); - lower_control_layout->setSpacing(0); - lower_control_layout->setMargin(0); - layout->addWidget(lower_control_container); - - QSizePolicy lower_container_size_policy = QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding); - - // In the lower-left, we create a current timecode label wrapped in a QWidget for fixed sizing - QWidget* lower_left_container = new QWidget(); - lower_left_container->setSizePolicy(lower_container_size_policy); - lower_control_layout->addWidget(lower_left_container); - - QHBoxLayout* lower_left_layout = new QHBoxLayout(lower_left_container); - lower_left_layout->setSpacing(0); - lower_left_layout->setMargin(0); - - cur_tc_lbl_ = new QLabel("00:00:00;00"); - lower_left_layout->addWidget(cur_tc_lbl_); - lower_left_layout->addStretch(); - - // In the lower-middle, we create playback control buttons - QWidget* lower_middle_container = new QWidget(); - lower_left_container->setSizePolicy(lower_container_size_policy); - lower_control_layout->addWidget(lower_middle_container); - - QHBoxLayout* lower_middle_layout = new QHBoxLayout(lower_middle_container); - lower_middle_layout->setSpacing(0); - lower_middle_layout->setMargin(0); - - lower_middle_layout->addStretch(); - - QPushButton* play_button = new QPushButton("Play"); - lower_middle_layout->addWidget(play_button); - - lower_middle_layout->addStretch(); - - // The lower-right, we create another timecode label, this time to show the end timecode - QWidget* lower_right_container = new QWidget(); - lower_left_container->setSizePolicy(lower_container_size_policy); - lower_control_layout->addWidget(lower_right_container); - - QHBoxLayout* lower_right_layout = new QHBoxLayout(lower_right_container); - lower_right_layout->setSpacing(0); - lower_right_layout->setMargin(0); - - lower_right_layout->addStretch(); - end_tc_lbl_ = new QLabel("00:00:00;00"); - lower_right_layout->addWidget(end_tc_lbl_); + controls_ = new PlaybackControls(this); + controls_->SetTimecodeEnabled(true); + controls_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); + layout->addWidget(controls_); } diff --git a/app/widget/viewer/viewer.h b/app/widget/viewer/viewer.h index 82cd007bd..28e129180 100644 --- a/app/widget/viewer/viewer.h +++ b/app/widget/viewer/viewer.h @@ -6,6 +6,7 @@ #include #include "viewerglwidget.h" +#include "widget/playbackcontrols/playbackcontrols.h" /** * @brief The ViewerWidget class @@ -18,11 +19,12 @@ class ViewerWidget : public QWidget public: ViewerWidget(QWidget* parent); + void SetPlaybackControlsEnabled(bool enabled); + private: ViewerGLWidget* gl_widget_; + PlaybackControls* controls_; - QLabel* cur_tc_lbl_; - QLabel* end_tc_lbl_; }; #endif // VIEWER_WIDGET_H diff --git a/app/widget/viewer/viewerglwidget.cpp b/app/widget/viewer/viewerglwidget.cpp index 5b6936b0c..be1b52315 100644 --- a/app/widget/viewer/viewerglwidget.cpp +++ b/app/widget/viewer/viewerglwidget.cpp @@ -2,10 +2,17 @@ #include #include +#include -ViewerGLWidget::ViewerGLWidget() +#include "render/gl/glfunc.h" +#include "render/gl/shadergenerators.h" + +QImage img; + +ViewerGLWidget::ViewerGLWidget(QWidget *parent) : + QOpenGLWidget(parent) { - + img.load("/home/matt/Pictures/heck.png"); } void ViewerGLWidget::paintGL() @@ -14,4 +21,16 @@ void ViewerGLWidget::paintGL() f->glClearColor(1.0f, 0.0f, 0.0f, 1.0f); f->glClear(GL_COLOR_BUFFER_BIT); + + QOpenGLTexture* tex = new QOpenGLTexture(img); + + ShaderPtr pipeline = olive::gl::GetDefaultPipeline(); + + tex->bind(); + + olive::gl::Blit(pipeline, true); + + tex->release(); + + delete tex; } diff --git a/app/widget/viewer/viewerglwidget.h b/app/widget/viewer/viewerglwidget.h index 9349d5307..ae84cc68b 100644 --- a/app/widget/viewer/viewerglwidget.h +++ b/app/widget/viewer/viewerglwidget.h @@ -6,7 +6,7 @@ class ViewerGLWidget : public QOpenGLWidget { public: - ViewerGLWidget(); + ViewerGLWidget(QWidget* parent); void SetTexture(GLuint tex); protected: diff --git a/app/window/mainwindow/mainmenu.cpp b/app/window/mainwindow/mainmenu.cpp new file mode 100644 index 000000000..efc25829c --- /dev/null +++ b/app/window/mainwindow/mainmenu.cpp @@ -0,0 +1,6 @@ +#include "mainmenu.h" + +MainMenu::MainMenu() +{ + +} diff --git a/app/window/mainwindow/mainmenu.h b/app/window/mainwindow/mainmenu.h new file mode 100644 index 000000000..dbf9ea9fa --- /dev/null +++ b/app/window/mainwindow/mainmenu.h @@ -0,0 +1,11 @@ +#ifndef MAINMENU_H +#define MAINMENU_H + + +class MainMenu +{ +public: + MainMenu(); +}; + +#endif // MAINMENU_H diff --git a/app/window/mainwindow/mainwindow.cpp b/app/window/mainwindow/mainwindow.cpp index f5ae11b18..4f7eb2d30 100644 --- a/app/window/mainwindow/mainwindow.cpp +++ b/app/window/mainwindow/mainwindow.cpp @@ -1,7 +1,9 @@ #include "mainwindow.h" // Panel objects +#include "panel/project/project.h" #include "panel/viewer/viewer.h" +#include "panel/timeline/timeline.h" olive::MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) @@ -19,12 +21,12 @@ olive::MainWindow::MainWindow(QWidget *parent) : setDockNestingEnabled(true); // TODO Use settings data to create panels and restore state if they exist - ViewerPanel* viewer_panel = new ViewerPanel(this); + ProjectPanel* viewer_panel = new ProjectPanel(this); addDockWidget(Qt::TopDockWidgetArea, viewer_panel); ViewerPanel* viewer_panel2 = new ViewerPanel(this); addDockWidget(Qt::TopDockWidgetArea, viewer_panel2); - ViewerPanel* viewer_panel3 = new ViewerPanel(this); - addDockWidget(Qt::BottomDockWidgetArea, viewer_panel3); ViewerPanel* viewer_panel4 = new ViewerPanel(this); - addDockWidget(Qt::BottomDockWidgetArea, viewer_panel4); + addDockWidget(Qt::TopDockWidgetArea, viewer_panel4); + TimelinePanel* viewer_panel3 = new TimelinePanel(this); + addDockWidget(Qt::BottomDockWidgetArea, viewer_panel3); } diff --git a/icons/icons.qrc b/icons/icons.qrc deleted file mode 100644 index 341bbf1b1..000000000 --- a/icons/icons.qrc +++ /dev/null @@ -1,57 +0,0 @@ - - - throbber.png - olive-splash.png - olive64.png - add-button.svg - add-effect.svg - add-transition.svg - arrow.svg - audiosource.svg - beam.svg - clock.svg - diamond.svg - dirup.svg - error.svg - ff.svg - folder.svg - hand.svg - iconview.svg - imagesource.svg - magnet.svg - new.svg - next.svg - open.svg - pause.svg - play.svg - prev.svg - razor.svg - record.svg - redo.svg - rew.svg - ripple.svg - rolling.svg - save.svg - sequence.svg - slide.svg - slip.svg - transition-tool.svg - treeview.svg - tri-down.svg - tri-left.svg - tri-right.svg - tri-up.svg - undo.svg - videosource.svg - zoomin.svg - zoomout.svg - italic.svg - underline.svg - align-center.svg - align-left.svg - align-right.svg - justify-center.svg - bold.svg - listview.svg - - diff --git a/icons/olive64.png b/icons/olive64.png deleted file mode 100644 index d5e31af4e462737d289fccd5754bf226192ffea8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8354 zcmV;TAYI>yP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000%uNkl8`4K@BUHU z)jh*RhKDit^En@Ss;H`ae)pW;J?Gqe#mg_h%n7!cz)ipupb97e3_x&ln+6n+1P%dP zfTw|1PUNN5aXxoG@F*~?tgI|hQBgrO8YK`2U>F8MoNV0z5L#fiM)SAz`m6w-OUS3XHTid8Z&4*s^ z?&^LExEkm@830@X{8vp)P2|*5Pd(yhM{fu92kU9T%vak$`!cZZlg{9P#)^KLcnUoil9|6QCpL{aCv9Yl!1Hzh5wW_0#;61?OW5w|w-x*dtjBq&YUpyE;$XmPKVsHCi zLa`8$ScE_%fEBhd115&$k)ReD!!S+?2udo@AeBVA632FMQV!`vnq*g!WLJ_g6=S%3 z+~o`}9_~MvPN!*XYNVyP<#FJ?V*%ja%Au7%I`x!OF-_CIxPISy*6&(RxF}4dBtkeA zCRh-}44GI#%O80m1PFYBJdx4Qx&Yd<1gRv-Rk)6eowP|MQY5>QB-#=rJCl5A{Fk_N z%%!I8<-;B;3sZoB zKl)kLMuRxckRS`3p$*>^gcfL}F{FVJHZTiJ%&}tO(g6D^Uj$EKqwSq%$PA^=gytWfnoWx zLw^8PR99C=@(FK6!wPnG?j%|nB~l(C7z<*BEwI2fT(4tF=M=|NTyyfL$NulsXq2HK z2v(s*Km;fd1t_JcKUB~2??2DnNpk@xEiGl(uwjv=rlwbbiv|MVl2}n}#_-|8{gHoj z-Cp6;H@vcXb508dp8sq~dU&~t!wd)HA|SxBHHfEBeM=#6?- z(Ifu-BP&0kHH5&5S%lmW1$F_ewy&bLqLvY*BLJuzQb|vD&y&E&d;rcbj24b4EiLt5 z_{P3BFpEqA#Q}^$0~J&_!r^NLU!&A0znj2m0isn=49ocZ6we1hdDfV<1f$R(P!yoPv7Qf_KVV|zL;!|V3?beV{~<8V zw}6t85+8s~O`9;ICPu`704Sl5N}|zh>)b|DV-t-B8mX?TCal5;DL!B2vjFIfJE|Nx zngu3S)Z)!OZ!%%X1OQ4(N&uz;h6Q}3xVSiw4O&`zTiM>eoxLgx!g2!`roo>?%L74a zg+ieNAi@GsAlP`|_gpjX8UV`5%INCqy2%2jL?RI%fPLM2A*j)oLJAkH6ixyrOs=T*!et=wE~qHIHBn1?eO)?a9)8082MG5q)HMJAsif( zQvUQNwe&4Oqag@e?X46w6>-{P4#--CQVOlSDO?IkTBiF~u!PmWtd&+NgaV;J zDHEkK!DgNd_;G(ov$p#UCM3VWBNHEC;r}hfs1O*zT&KrJ#&d4;JjNG}XLNKlAtQ7| zze_`nFoOM0FcVF;QlqtBkBRJmbh9Xw2P@tf5fvc&>sK< z=&0s}y)QDoY&t(Z@1OXv`$I0Oxrm?JWTu*CHD~WW1sHsS{R&w*$n|W;2V=TCA0SkY#kTvhGVPwfjW}iKq zE2mt^*<;Qo-WzAlwl%D5Sjnc=O>Er15w%;PdKI!)f(En1q|53;*aF?`eakAgkV+ms z=+b@36O}2YN$Ewi16e>H7f=#MIUqquucGs5E&!lijdUcxY4{D7f8la&`uR;f^{uBE zUp=0G`M-Z*$+jgdd3OodopBwDu3E(0bLTSiteH5a+8LO{aO#OZlYh6JGt~RhI8x zPSQ+z6(0eZ^eMF94&DM#-f!h9pVRsSVEBcMj7TLtH~0hM*ba8wCf%LJ>2+{j4_T=t z9dxi_#|r8u*U?EQH~;s|?C;pmirFg|6&Zz5WU#ttHFqt)iMf_9Yr4(QF&S=)kW2;Xjs95XBIFbHiDsrLm5{yj=Qe9 zi(jt!C5?@Z*rrV&5;(T?N1fx1tQ%w#IjIN10ZJ*9t00+I{?gh<@Mr)W=sv)>@^JuE z#47lkbN_~W*WAnED;87tqdFGPUCe1Er*X&fJD7CZBo^JUh>J&DOl@T?&E3ts_TFo( z{$Mpbot*?v4I-sHVwGu70A&0hiNC6()F3!Or4=$EaeG~qo5=*F8nisR@lkKO%Cs4^ zGw5vWL;@jlX+?8_vA} zEi$pZJTb}YkWHG7;DA0PXiJoo;3pO8m}FhcT5f*!8*Ke#D~a9&OJ84#N=er3UdK)6 z-Gnq<{(k-6v0?A;cebKa2i_>1SiNlSN2&MXa!A6)qZoMs!9lE>VKoMKT zQa=EWZ~?6pN*M^H{8E>n4iCZwFkxNSI@bLA8r&8aZG%;5($Mu0Bg#iGYuwfR_n}u< z*6=JXU9J3L?k~7!`Cl>p$J4p(i??z0Syxk2QNyy=m*KRym=z|3I4&3PLt>>-Iy0C@ z3x$=^2&ue4$jAX82MYi|7|dZ7qQvlmn4n#%cS9x7*#cjsl%sY2m@Q%RK_Yv zI!O-p9Axvs&1`7e!1{yhIbVsqDK9(er$ru<+EZ+!4ZpN@|# zAIYK_i`X)M3%|PLSJVb-aeG~)+ppi*Swty+8vJw;%*4)yYoLvO%U|mFEuj8TJ(rEX z%-hORR8Duin`?f44cgV1v5wlA}qjyXZJnJ z(!XDd>Qv~I_VyzL1tKIciVTbr!&7u105W>@Z%4R*&zKq0$*-)Oh`h2Rx1Z5*9q+o( zh=@Q$1Up)Hcw7-HL1qh4{V2!dcPct!w z7!YRQ{$|1GS1cJ2083kb2${{Nvq+wZeBAXh8$aHd+wzjf*eG~x-D5sLe>U~cC^Cvz zyLBxK&RxKrlkQ|*?L2OqbQ=x#H1Ou_Z&LS#Iz&WZL=B8W0}&D)5$3%UnMt2BdIUwV zKLFYQRQ|<)2zUvQEj@9h|F?3~@rzPC@%9q{^rm~gk#em|4H;@4lKAW`6Pg6oZVz6JYM;CfTBpYwPn|D*vlOPNbvh87I< zM_;+hmp(q_9;XP+H=q6{8+L3!goSSf+V%XjLw0cEFK(o#w}+Y`HK?TGD-*xMtTSiv z?zVUNk6ZtPEqk_b=a27X>8ndQ)OLsq$6v^juPi~eE3}AOa#F{Cc1t4rhQES3S<} zyKUP5n+@PUdwY9*#ioy%j<7|}kMc*~)hFxr-R#{zMa!= zKAk%szmqKuTX^`IhtcgCQeGdibEA%(krd3FG_(KczYD1BR@oVWKww?|{=f%UKFHe# z-u5;Z1VrDg>yNk>K&LgjC$pj(69`Lq*OD4DZBiO8rPXdl6nppbV-Ia>w5^#od>RkU zc__D$x}zP(b}j|hW<%jO9mm<1PNz=`g}my+*U$Mn@9cWV3tAL?Q%`ZkvhQct1W=f_ z45u^%Ktu&HC^_sN_6jC4R}A&ZFRjrj&D<}}?X!W}v7NoZ+Wuwn`SC>DH7tpAGXbp3k=~`&J)|NhA_TDZhhv z&XA)40I)$y8Iww$Z5g}^uX&$eKkz&F2h4K7d&eXB?{o7iJr0~d z`h4!2bsv{ZxTMc2S3D8NPTNa>2L_yEj&f+~K45V)8Wq7{u+NS6_Poc+Eh~BFqj!)( z=B7!JcS1y*M3c`hk>>$wD1!^eT|nJgb(}rw>^_e=jzdpRj|LXu9rEOO0D#P~xro<} zTnlVF!1@o@({P}Hrj91s;%%heG-)S&Qr$mfg$P+8%A@5}l~gghdNdbLyqHrePC4TL z_V)JD+uNH0W&^7}HOv^~+2Io470a?N42Q$?w}wBJX4^KYR0`L1H)Pnpa}diHgKC|? zMXu{!5s%0J)v~P9L!r>03=p<$lTN2`U3V|u(b?Y)_Ss`SJG=%M>ALPEuIoOSNF=5O z0s$)&3Xvtt&-yH}zkVSlwrykEwu^Uo`fs!0?Xk4uJw3iQBZlKRvmD3yb6_$s6o`CA sVN!N3=mnaA4}j-^=Q6Z-T(^b07*qoM6N<$f*8L7;Q#;t