Jelajahi Sumber

setup a basic ui

olinox 4 tahun lalu
induk
melakukan
977d2cbc3b
20 mengubah file dengan 1240 tambahan dan 694 penghapusan
  1. 25 18
      core/youtube.py
  2. 2 2
      main.py
  3. 2 0
      ui/qt/gen.cmd
  4. 130 4
      ui/qt/main.ui
  5. 94 21
      ui/qt/main_ui.py
  6. 7 9
      ui/qt/rsc.qrc
  7. TEMPAT SAMPAH
      ui/qt/rsc/calendar.png
  8. TEMPAT SAMPAH
      ui/qt/rsc/dancing.png
  9. 0 0
      ui/qt/rsc/email.png
  10. 0 0
      ui/qt/rsc/folder.png
  11. 0 0
      ui/qt/rsc/hourglass.png
  12. TEMPAT SAMPAH
      ui/qt/rsc/map.png
  13. 0 0
      ui/qt/rsc/pdf.png
  14. 0 0
      ui/qt/rsc/question.png
  15. 0 0
      ui/qt/rsc/save.png
  16. TEMPAT SAMPAH
      ui/qt/rsc/settings.png
  17. TEMPAT SAMPAH
      ui/qt/rsc/writing-tool.png
  18. 954 635
      ui/qt/rsc_rc.py
  19. TEMPAT SAMPAH
      ui/rsc/settings.png
  20. 26 5
      ui/window.py

+ 25 - 18
core/youtube.py

@@ -12,7 +12,8 @@ logger = logging_.get("mew")
 
 
 class YoutubeDownloader:
-    output_dir = constants.APP_ROOT / 'data' / 'youtube'
+    MAX_ATTEMPTS = 5
+    OUTPUT_DIR = constants.APP_ROOT / 'data' / 'youtube'
 
     @staticmethod
     def get_audio_stream(yt):
@@ -29,38 +30,44 @@ class YoutubeDownloader:
                 return stream
 
     @staticmethod
-    def get_stream(url):
-        for i in range(1, MAX_ATTEMPTS + 1):
-            logger.info(f"download {url} - attempt {i}/{MAX_ATTEMPTS}")
+    def get_stream(url, progress_callback=None, complete_callback=None):
+        for i in range(1, YoutubeDownloader.MAX_ATTEMPTS + 1):
+            logger.info(f"download {url} - attempt {i}/{YoutubeDownloader.MAX_ATTEMPTS}")
             try:
-                yt = YouTube(url)
+                yt = YouTube(url, progress_callback, complete_callback)
+
                 return YoutubeDownloader.get_audio_stream(yt)
+
             except urllib.error.HTTPError:
                 time.sleep(500)
                 continue
+        raise YoutubeStreamNotFound('Stream not found')
 
     @staticmethod
-    def download(url):
-        logger.info(f"** Download {url} into {YoutubeDownloader.output_dir}")
-
-        stream = YoutubeDownloader.get_stream(url)
+    def download(url, progress_callback=None, complete_callback=None):
+        logger.info(f"** Download {url} into {YoutubeDownloader.OUTPUT_DIR}")
 
-        if stream is None:
-            raise YoutubeStreamNotFound('Stream not found')
+        stream = YoutubeDownloader.get_stream(
+            url,
+            progress_callback,
+            complete_callback
+        )
 
         logger.info(f"stream found - start downloading")
 
         stream.download(
-            output_path=YoutubeDownloader.output_dir,
-            timeout=3,
-            max_retries=5
+            output_path=YoutubeDownloader.OUTPUT_DIR,
+            timeout=5,
+            max_retries=3
         )
-        fname = stream.title
-        logger.info(f"> file downloaded as {YoutubeDownloader.output_dir}/{fname}")
-        return fname
+
+        output_path = YoutubeDownloader.OUTPUT_DIR / stream.title
+        logger.info(f"> file downloaded as {output_path}")
+        return output_path
 
 
 if __name__ == "__main__":
+
     YoutubeDownloader.download(
-        'https://www.youtube.com/watch?v=nOWjX4BpC24XXXXXX'
+        'https://www.youtube.com/watch?v=nOWjX4BpC24XXXXXX',
     )

+ 2 - 2
main.py

@@ -22,8 +22,7 @@ try:
 except:
     pass
 
-logger = logging.getLogger("mew")
-logging_.start("mew", level=10)
+logger = logging_.get("mew", level=10)
 
 # Configure how errors are processed
 sys_err = sys.excepthook
@@ -34,6 +33,7 @@ def err_handler(typ, value, trace):
     sys_err(typ, value, trace)
 sys.excepthook = err_handler
 
+
 # Start UI
 app = QApplication(sys.argv)
 mainw = MainWindow()

+ 2 - 0
ui/qt/gen.cmd

@@ -0,0 +1,2 @@
+pyrcc5 rsc.qrc -o rsc_rc.py
+pyuic5 main.ui -o main_ui.py --from-imports

+ 130 - 4
ui/qt/main.ui

@@ -6,10 +6,16 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>838</width>
-    <height>601</height>
+    <width>804</width>
+    <height>618</height>
    </rect>
   </property>
+  <property name="minimumSize">
+   <size>
+    <width>804</width>
+    <height>618</height>
+   </size>
+  </property>
   <property name="font">
    <font>
     <family>Verdana</family>
@@ -17,11 +23,11 @@
    </font>
   </property>
   <property name="windowTitle">
-   <string>Hello world!</string>
+   <string>Mew~</string>
   </property>
   <property name="windowIcon">
    <iconset resource="rsc.qrc">
-    <normaloff>:/img/rsc/settings.png</normaloff>:/img/rsc/settings.png</iconset>
+    <normaloff>:/img/rsc/dancing.png</normaloff>:/img/rsc/dancing.png</iconset>
   </property>
   <widget class="QWidget" name="centralwidget">
    <layout class="QVBoxLayout" name="verticalLayout">
@@ -40,6 +46,126 @@
     <property name="bottomMargin">
      <number>3</number>
     </property>
+    <item>
+     <layout class="QHBoxLayout" name="mainLayout" stretch="0,6">
+      <property name="spacing">
+       <number>0</number>
+      </property>
+      <item>
+       <widget class="QListWidget" name="menu">
+        <property name="font">
+         <font>
+          <family>Verdana</family>
+          <pointsize>12</pointsize>
+         </font>
+        </property>
+        <property name="horizontalScrollBarPolicy">
+         <enum>Qt::ScrollBarAlwaysOff</enum>
+        </property>
+        <property name="editTriggers">
+         <set>QAbstractItemView::NoEditTriggers</set>
+        </property>
+        <property name="showDropIndicator" stdset="0">
+         <bool>false</bool>
+        </property>
+        <property name="defaultDropAction">
+         <enum>Qt::CopyAction</enum>
+        </property>
+        <property name="alternatingRowColors">
+         <bool>true</bool>
+        </property>
+        <property name="iconSize">
+         <size>
+          <width>24</width>
+          <height>24</height>
+         </size>
+        </property>
+        <property name="currentRow">
+         <number>-1</number>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QStackedWidget" name="stack">
+        <widget class="QWidget" name="page_1">
+         <layout class="QHBoxLayout" name="horizontalLayout_2">
+          <item>
+           <layout class="QVBoxLayout" name="verticalLayout_3">
+            <item>
+             <widget class="QLabel" name="label_2">
+              <property name="text">
+               <string>Page 1</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </widget>
+        <widget class="QWidget" name="page_2">
+         <layout class="QHBoxLayout" name="horizontalLayout_3">
+          <item>
+           <layout class="QVBoxLayout" name="verticalLayout_4">
+            <item>
+             <widget class="QLabel" name="label_3">
+              <property name="text">
+               <string>Page 2</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </widget>
+        <widget class="QWidget" name="page_3">
+         <layout class="QHBoxLayout" name="horizontalLayout_4">
+          <item>
+           <layout class="QVBoxLayout" name="verticalLayout_5">
+            <item>
+             <widget class="QLabel" name="label_4">
+              <property name="text">
+               <string>Page 3</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </widget>
+        <widget class="QWidget" name="page_4">
+         <layout class="QHBoxLayout" name="horizontalLayout">
+          <item>
+           <layout class="QVBoxLayout" name="verticalLayout_2">
+            <item>
+             <widget class="QLabel" name="label">
+              <property name="text">
+               <string>Page 4</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </widget>
+        <widget class="QWidget" name="page_5">
+         <layout class="QHBoxLayout" name="horizontalLayout_5">
+          <item>
+           <layout class="QVBoxLayout" name="verticalLayout_6">
+            <item>
+             <widget class="QLabel" name="label_5">
+              <property name="text">
+               <string>Page 5</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </widget>
+       </widget>
+      </item>
+     </layout>
+    </item>
    </layout>
   </widget>
   <widget class="QStatusBar" name="statusbar"/>

+ 94 - 21
ui/qt/main_ui.py

@@ -1,52 +1,125 @@
 # -*- coding: utf-8 -*-
 
-# Form implementation generated from reading ui file 'C:\dev\veille\python_3.6.1\hello_world\ui\qt\main.ui'
+# Form implementation generated from reading ui file 'main.ui'
 #
-# Created by: PyQt5 UI code generator 5.8.2
+# Created by: PyQt5 UI code generator 5.15.4
 #
-# WARNING! All changes made in this file will be lost!
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
+
 
 from PyQt5 import QtCore, QtGui, QtWidgets
 
+
 class Ui_mainWindow(object):
     def setupUi(self, mainWindow):
         mainWindow.setObjectName("mainWindow")
-        mainWindow.resize(521, 196)
-        mainWindow.setMinimumSize(QtCore.QSize(521, 196))
-        mainWindow.setMaximumSize(QtCore.QSize(521, 196))
+        mainWindow.resize(804, 618)
+        mainWindow.setMinimumSize(QtCore.QSize(804, 618))
         font = QtGui.QFont()
         font.setFamily("Verdana")
         font.setPointSize(8)
         mainWindow.setFont(font)
+        icon = QtGui.QIcon()
+        icon.addPixmap(QtGui.QPixmap(":/img/rsc/dancing.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        mainWindow.setWindowIcon(icon)
         self.centralwidget = QtWidgets.QWidget(mainWindow)
         self.centralwidget.setObjectName("centralwidget")
         self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
         self.verticalLayout.setContentsMargins(3, 3, 3, 3)
         self.verticalLayout.setSpacing(3)
         self.verticalLayout.setObjectName("verticalLayout")
-        self.btnGet = QtWidgets.QPushButton(self.centralwidget)
-        self.btnGet.setMinimumSize(QtCore.QSize(0, 36))
-        self.btnGet.setMaximumSize(QtCore.QSize(16777215, 36))
-        self.btnGet.setObjectName("btnGet")
-        self.verticalLayout.addWidget(self.btnGet)
-        self.lblResult = QtWidgets.QLabel(self.centralwidget)
-        self.lblResult.setMinimumSize(QtCore.QSize(0, 36))
-        self.lblResult.setMaximumSize(QtCore.QSize(16777215, 36))
-        self.lblResult.setAlignment(QtCore.Qt.AlignCenter)
-        self.lblResult.setObjectName("lblResult")
-        self.verticalLayout.addWidget(self.lblResult)
+        self.mainLayout = QtWidgets.QHBoxLayout()
+        self.mainLayout.setSpacing(0)
+        self.mainLayout.setObjectName("mainLayout")
+        self.menu = QtWidgets.QListWidget(self.centralwidget)
+        font = QtGui.QFont()
+        font.setFamily("Verdana")
+        font.setPointSize(12)
+        self.menu.setFont(font)
+        self.menu.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+        self.menu.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+        self.menu.setProperty("showDropIndicator", False)
+        self.menu.setDefaultDropAction(QtCore.Qt.CopyAction)
+        self.menu.setAlternatingRowColors(True)
+        self.menu.setIconSize(QtCore.QSize(24, 24))
+        self.menu.setObjectName("menu")
+        self.mainLayout.addWidget(self.menu)
+        self.stack = QtWidgets.QStackedWidget(self.centralwidget)
+        self.stack.setObjectName("stack")
+        self.page_1 = QtWidgets.QWidget()
+        self.page_1.setObjectName("page_1")
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.page_1)
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        self.verticalLayout_3 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_3.setObjectName("verticalLayout_3")
+        self.label_2 = QtWidgets.QLabel(self.page_1)
+        self.label_2.setObjectName("label_2")
+        self.verticalLayout_3.addWidget(self.label_2)
+        self.horizontalLayout_2.addLayout(self.verticalLayout_3)
+        self.stack.addWidget(self.page_1)
+        self.page_2 = QtWidgets.QWidget()
+        self.page_2.setObjectName("page_2")
+        self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.page_2)
+        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+        self.verticalLayout_4 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_4.setObjectName("verticalLayout_4")
+        self.label_3 = QtWidgets.QLabel(self.page_2)
+        self.label_3.setObjectName("label_3")
+        self.verticalLayout_4.addWidget(self.label_3)
+        self.horizontalLayout_3.addLayout(self.verticalLayout_4)
+        self.stack.addWidget(self.page_2)
+        self.page_3 = QtWidgets.QWidget()
+        self.page_3.setObjectName("page_3")
+        self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.page_3)
+        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
+        self.verticalLayout_5 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_5.setObjectName("verticalLayout_5")
+        self.label_4 = QtWidgets.QLabel(self.page_3)
+        self.label_4.setObjectName("label_4")
+        self.verticalLayout_5.addWidget(self.label_4)
+        self.horizontalLayout_4.addLayout(self.verticalLayout_5)
+        self.stack.addWidget(self.page_3)
+        self.page_4 = QtWidgets.QWidget()
+        self.page_4.setObjectName("page_4")
+        self.horizontalLayout = QtWidgets.QHBoxLayout(self.page_4)
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        self.label = QtWidgets.QLabel(self.page_4)
+        self.label.setObjectName("label")
+        self.verticalLayout_2.addWidget(self.label)
+        self.horizontalLayout.addLayout(self.verticalLayout_2)
+        self.stack.addWidget(self.page_4)
+        self.page_5 = QtWidgets.QWidget()
+        self.page_5.setObjectName("page_5")
+        self.horizontalLayout_5 = QtWidgets.QHBoxLayout(self.page_5)
+        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
+        self.verticalLayout_6 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_6.setObjectName("verticalLayout_6")
+        self.label_5 = QtWidgets.QLabel(self.page_5)
+        self.label_5.setObjectName("label_5")
+        self.verticalLayout_6.addWidget(self.label_5)
+        self.horizontalLayout_5.addLayout(self.verticalLayout_6)
+        self.stack.addWidget(self.page_5)
+        self.mainLayout.addWidget(self.stack)
+        self.mainLayout.setStretch(1, 6)
+        self.verticalLayout.addLayout(self.mainLayout)
         mainWindow.setCentralWidget(self.centralwidget)
         self.statusbar = QtWidgets.QStatusBar(mainWindow)
         self.statusbar.setObjectName("statusbar")
         mainWindow.setStatusBar(self.statusbar)
 
         self.retranslateUi(mainWindow)
+        self.menu.setCurrentRow(-1)
         QtCore.QMetaObject.connectSlotsByName(mainWindow)
 
     def retranslateUi(self, mainWindow):
         _translate = QtCore.QCoreApplication.translate
-        mainWindow.setWindowTitle(_translate("mainWindow", "Hello world!"))
-        self.btnGet.setText(_translate("mainWindow", "Get message"))
-        self.lblResult.setText(_translate("mainWindow", "[message here]"))
-
+        mainWindow.setWindowTitle(_translate("mainWindow", "Mew~"))
+        self.label_2.setText(_translate("mainWindow", "Page 1"))
+        self.label_3.setText(_translate("mainWindow", "Page 2"))
+        self.label_4.setText(_translate("mainWindow", "Page 3"))
+        self.label.setText(_translate("mainWindow", "Page 4"))
+        self.label_5.setText(_translate("mainWindow", "Page 5"))
 from . import rsc_rc

+ 7 - 9
ui/qt/rsc.qrc

@@ -1,11 +1,9 @@
 <RCC>
-  <qresource prefix="img">
-    <file>../rsc/email.png</file>
-    <file>../rsc/folder.png</file>
-    <file>../rsc/hourglass.png</file>
-    <file>../rsc/pdf.png</file>
-    <file>../rsc/question.png</file>
-    <file>../rsc/save.png</file>
-    <file>../rsc/settings.png</file>
-  </qresource>
+    <qresource prefix="/img">
+        <file>rsc/calendar.png</file>
+        <file>rsc/dancing.png</file>
+        <file>rsc/map.png</file>
+        <file>rsc/settings.png</file>
+        <file>rsc/writing-tool.png</file>
+    </qresource>
 </RCC>

TEMPAT SAMPAH
ui/qt/rsc/calendar.png


TEMPAT SAMPAH
ui/qt/rsc/dancing.png


+ 0 - 0
ui/rsc/email.png → ui/qt/rsc/email.png


+ 0 - 0
ui/rsc/folder.png → ui/qt/rsc/folder.png


+ 0 - 0
ui/rsc/hourglass.png → ui/qt/rsc/hourglass.png


TEMPAT SAMPAH
ui/qt/rsc/map.png


+ 0 - 0
ui/rsc/pdf.png → ui/qt/rsc/pdf.png


+ 0 - 0
ui/rsc/question.png → ui/qt/rsc/question.png


+ 0 - 0
ui/rsc/save.png → ui/qt/rsc/save.png


TEMPAT SAMPAH
ui/qt/rsc/settings.png


TEMPAT SAMPAH
ui/qt/rsc/writing-tool.png


File diff ditekan karena terlalu besar
+ 954 - 635
ui/qt/rsc_rc.py


TEMPAT SAMPAH
ui/rsc/settings.png


+ 26 - 5
ui/window.py

@@ -4,8 +4,8 @@
 
     @author:[author], [year]
 """
-
-from PyQt5.QtWidgets import QMainWindow
+from PyQt5.QtGui import QIcon
+from PyQt5.QtWidgets import QMainWindow, QListWidgetItem
 
 from core import discography
 from ui.qt.main_ui import Ui_mainWindow
@@ -19,8 +19,29 @@ class MainWindow(QMainWindow):
     def createWidgets(self):
         self.ui = Ui_mainWindow()
         self.ui.setupUi(self)
-        self.ui.btnGet.clicked.connect(self.run)
+
+        self.ui.stack.setCurrentIndex(0)
+
+        menu_items = [
+            (':/img/rsc/dancing.png', 'Ma séance'),
+            (':/img/rsc/writing-tool.png', 'Préparer'),
+            (':/img/rsc/map.png', 'Explorer'),
+            (':/img/rsc/calendar.png', 'Agenda'),
+            (':/img/rsc/settings.png', 'Paramètres'),
+        ]
+
+        for i, item in enumerate(menu_items):
+            icon, lbl = item
+            item = QListWidgetItem(QIcon(icon), lbl)
+            item.index = i
+            self.ui.menu.addItem(item)
+
+        # Menu item clicked
+        self.ui.menu.itemClicked.connect(self.menuItemSelected)
+
+
+    def menuItemSelected(self, e):
+        self.ui.stack.setCurrentIndex(e.index)
 
     def run(self):
-        message = hello_world.hello_message()
-        self.ui.lblResult.setText(message)
+        pass

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini