first commit
17
.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Python: Current File",
|
||||
"type": "python",
|
||||
"request": "launch",
|
||||
"program": "${workspaceFolder}/main.py",
|
||||
"console": "integratedTerminal",
|
||||
"python": "${command:python.interpreterPath}",
|
||||
"pythonArgs": ["-B"]
|
||||
}
|
||||
]
|
||||
}
|
||||
11
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"files.exclude": {
|
||||
"**/.git": true,
|
||||
"**/.svn": true,
|
||||
"**/.hg": true,
|
||||
"**/CVS": true,
|
||||
"**/.DS_Store": true,
|
||||
"**/*.pyc": {"when": "$(basename).py"},
|
||||
"**/__pycache__": true
|
||||
},
|
||||
}
|
||||
36
app/modules/app_functions/functions.py
Normal file
@@ -0,0 +1,36 @@
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
#
|
||||
# BY: WANDERSON M.PIMENTA
|
||||
# PROJECT MADE WITH: Qt Designer and PySide6
|
||||
# V: 1.0.0
|
||||
#
|
||||
# This project can be used freely for all uses, as long as they maintain the
|
||||
# respective credits only in the Python scripts, any information in the visual
|
||||
# interface (GUI) can be modified without any implication.
|
||||
#
|
||||
# There are limitations on Qt licenses if you want to use your products
|
||||
# commercially, I recommend reading them on the official website:
|
||||
# https://doc.qt.io/qtforpython/licenses.html
|
||||
#
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
|
||||
# IMPORT
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
# Packages
|
||||
from app.packages.pyside_or_pyqt import *
|
||||
from app.packages.widgets import *
|
||||
# Modules
|
||||
import app.modules.app_settings.settings as app_settings
|
||||
|
||||
# APP FUNCTIONS
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
class AppFunctions:
|
||||
def __init__(self):
|
||||
# GET WIDGETS FROM "ui_main.py"
|
||||
# Load widgets inside App Functions
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.ui = Ui_MainWindow()
|
||||
self.ui.setupUi(self)
|
||||
|
||||
def change_placeholder(self):
|
||||
self.ui.search_line_edit.setPlaceholderText("teste")
|
||||
53
app/modules/app_settings/settings.py
Normal file
@@ -0,0 +1,53 @@
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
#
|
||||
# BY: WANDERSON M.PIMENTA
|
||||
# PROJECT MADE WITH: Qt Designer and PySide6
|
||||
# V: 1.0.0
|
||||
#
|
||||
# This project can be used freely for all uses, as long as they maintain the
|
||||
# respective credits only in the Python scripts, any information in the visual
|
||||
# interface (GUI) can be modified without any implication.
|
||||
#
|
||||
# There are limitations on Qt licenses if you want to use your products
|
||||
# commercially, I recommend reading them on the official website:
|
||||
# https://doc.qt.io/qtforpython/licenses.html
|
||||
#
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
|
||||
import json
|
||||
import os
|
||||
|
||||
# APP SETTINGS
|
||||
class Settings(object):
|
||||
# APP PATH
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
json_file = "settings.json"
|
||||
app_path = os.path.abspath(os.getcwd())
|
||||
settings_path = os.path.normpath(os.path.join(app_path, json_file))
|
||||
if not os.path.isfile(settings_path):
|
||||
print(f"WARNING: \"settings.json\" not found! check in the folder {settings_path}")
|
||||
|
||||
def __init__(self):
|
||||
super(Settings, self).__init__()
|
||||
|
||||
# DICTIONARY WITH SETTINGS
|
||||
# Just to have objects references
|
||||
self.items = {}
|
||||
|
||||
# DESERIALIZE
|
||||
self.deserialize()
|
||||
|
||||
# SERIALIZE JSON
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def serialize(self):
|
||||
# WRITE JSON FILE
|
||||
with open(self.settings_path, "w", encoding='utf-8') as write:
|
||||
json.dump(self.items, write, indent=4)
|
||||
|
||||
# DESERIALIZE JSON
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def deserialize(self):
|
||||
# READ JSON FILE
|
||||
with open(self.settings_path, "r", encoding='utf-8') as reader:
|
||||
settings = json.loads(reader.read())
|
||||
self.items = settings
|
||||
166
app/modules/ui_functions/functions.py
Normal file
@@ -0,0 +1,166 @@
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
#
|
||||
# BY: WANDERSON M.PIMENTA
|
||||
# PROJECT MADE WITH: Qt Designer and PySide6
|
||||
# V: 1.0.0
|
||||
#
|
||||
# This project can be used freely for all uses, as long as they maintain the
|
||||
# respective credits only in the Python scripts, any information in the visual
|
||||
# interface (GUI) can be modified without any implication.
|
||||
#
|
||||
# There are limitations on Qt licenses if you want to use your products
|
||||
# commercially, I recommend reading them on the official website:
|
||||
# https://doc.qt.io/qtforpython/licenses.html
|
||||
#
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
|
||||
# IMPORT
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
# Packages
|
||||
from app.packages.pyside_or_pyqt import *
|
||||
from app.packages.widgets import *
|
||||
# GUI
|
||||
from app.uis.main_window.ui_main import Ui_MainWindow # MainWindow
|
||||
from app.modules.app_settings.settings import *
|
||||
|
||||
# GLOBAL VARS
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
_is_maximized = False
|
||||
|
||||
# APP FUNCTIONS
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
class UiFunctions:
|
||||
|
||||
def __init__(self):
|
||||
super(UiFunctions, self).__init__()
|
||||
# GET WIDGETS FROM "ui_main.py"
|
||||
# Load widgets inside App Functions
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.ui = Ui_MainWindow()
|
||||
self.ui.setupUi(self)
|
||||
|
||||
# SET UI DEFINITIONS
|
||||
# Set ui definitions before "self.show()" in main.py
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def maximize_restore(self):
|
||||
global _is_maximized
|
||||
|
||||
# CHANGE UI AND RESIZE GRIP
|
||||
def change_ui():
|
||||
if not _is_maximized:
|
||||
self.resize(self.width()+1, self.height()+1)
|
||||
self.ui.margins_app.setContentsMargins(10, 10, 10, 10)
|
||||
self.ui.maximize_restore_app_btn.setToolTip("Restore")
|
||||
self.ui.maximize_restore_app_btn.setStyleSheet("background-image: url(:/icons_svg/images/icons_svg/icon_maximize.svg);")
|
||||
self.ui.bg_app.setStyleSheet("#bg_app { border-radius: 10px; border: 2px solid rgb(30, 32, 33); }")
|
||||
self.left_grip.show()
|
||||
self.right_grip.show()
|
||||
self.top_grip.show()
|
||||
self.bottom_grip.show()
|
||||
|
||||
else:
|
||||
self.ui.margins_app.setContentsMargins(0, 0, 0, 0)
|
||||
self.ui.maximize_restore_app_btn.setToolTip("Restore")
|
||||
self.ui.maximize_restore_app_btn.setStyleSheet("background-image: url(:/icons_svg/images/icons_svg/icon_restore.svg);")
|
||||
self.ui.bg_app.setStyleSheet("#bg_app { border-radius: 0px; border: none; }")
|
||||
self.left_grip.hide()
|
||||
self.right_grip.hide()
|
||||
self.top_grip.hide()
|
||||
self.bottom_grip.hide()
|
||||
|
||||
# CHECK EVENT
|
||||
if self.isMaximized():
|
||||
_is_maximized = False
|
||||
self.showNormal()
|
||||
change_ui()
|
||||
else:
|
||||
_is_maximized = True
|
||||
self.showMaximized()
|
||||
change_ui()
|
||||
|
||||
# START CHAT SELECTION
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def select_chat_message(self, widget):
|
||||
for w in self.ui.messages_frame.findChildren(QWidget):
|
||||
if w.objectName() == widget:
|
||||
w.set_active(True)
|
||||
|
||||
# RESET CHAT SELECTION
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def deselect_chat_message(self, widget):
|
||||
for w in self.ui.messages_frame.findChildren(QWidget):
|
||||
if w.objectName() != widget:
|
||||
if hasattr(w, 'set_active'):
|
||||
w.set_active(False)
|
||||
|
||||
# SET UI DEFINITIONS
|
||||
# Set ui definitions before "self.show()" in main.py
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def set_ui_definitions(self):
|
||||
|
||||
# GET SETTINGS FROM JSON DESERIALIZED
|
||||
settings = Settings()
|
||||
self.settings = settings.items
|
||||
|
||||
# REMOVE TITLE BAR
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.setWindowFlag(Qt.FramelessWindowHint)
|
||||
self.setAttribute(Qt.WA_TranslucentBackground)
|
||||
|
||||
# MOVE WINDOW / MAXIMIZE / RESTORE
|
||||
def moveWindow(event):
|
||||
# IF MAXIMIZED CHANGE TO NORMAL
|
||||
if self.isMaximized():
|
||||
UiFunctions.maximize_restore(self)
|
||||
curso_x = self.pos().x()
|
||||
curso_y = event.globalPos().y() - QCursor.pos().y()
|
||||
self.move(curso_x, curso_y)
|
||||
# MOVE WINDOW
|
||||
if event.buttons() == Qt.LeftButton:
|
||||
self.move(self.pos() + event.globalPos() - self.dragPos)
|
||||
self.dragPos = event.globalPos()
|
||||
event.accept()
|
||||
self.ui.logo_top.mouseMoveEvent = moveWindow
|
||||
self.ui.title_bar.mouseMoveEvent = moveWindow
|
||||
|
||||
# DOUBLE CLICK MAXIMIZE / RESTORE
|
||||
def maximize_restore(event):
|
||||
if event.type() == QEvent.MouseButtonDblClick:
|
||||
UiFunctions.maximize_restore(self)
|
||||
self.ui.title_bar.mouseDoubleClickEvent = maximize_restore
|
||||
|
||||
# TOP BTNS
|
||||
self.ui.minimize_app_btn.clicked.connect(lambda: self.showMinimized())
|
||||
self.ui.maximize_restore_app_btn.clicked.connect(lambda: UiFunctions.maximize_restore(self))
|
||||
self.ui.close_app_btn.clicked.connect(lambda: self.close())
|
||||
|
||||
|
||||
|
||||
# DEFAULT PARAMETERS
|
||||
self.setWindowTitle(self.settings["app_name"])
|
||||
self.resize(self.settings["startup_size"][0], self.settings["startup_size"][1])
|
||||
self.setMinimumSize(self.settings["minimum_size"][0], self.settings["minimum_size"][1])
|
||||
|
||||
# APPLY DROP SHADOW
|
||||
self.shadow = QGraphicsDropShadowEffect()
|
||||
self.shadow.setBlurRadius(25)
|
||||
self.shadow.setXOffset(0)
|
||||
self.shadow.setYOffset(0)
|
||||
self.shadow.setColor(QColor(0, 0, 0, 80))
|
||||
self.ui.stylesheet.setGraphicsEffect(self.shadow)
|
||||
|
||||
# CUSTOM GRIPS
|
||||
# Create grips to resize window
|
||||
self.left_grip = CustomGrip(self, Qt.LeftEdge, True)
|
||||
self.right_grip = CustomGrip(self, Qt.RightEdge, True)
|
||||
self.top_grip = CustomGrip(self, Qt.TopEdge, True)
|
||||
self.bottom_grip = CustomGrip(self, Qt.BottomEdge, True)
|
||||
|
||||
# RESIZE GRIPS
|
||||
# This function should be called whenever "MainWindow/main.py" has its window resized.
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def resize_grips(self):
|
||||
self.left_grip.setGeometry(0, 10, 10, self.height())
|
||||
self.right_grip.setGeometry(self.width() - 10, 10, 10, self.height())
|
||||
self.top_grip.setGeometry(0, 0, self.width(), 10)
|
||||
self.bottom_grip.setGeometry(0, self.height() - 10, self.width(), 10)
|
||||
21
app/packages/__init__.py
Normal file
@@ -0,0 +1,21 @@
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
#
|
||||
# BY: WANDERSON M.PIMENTA
|
||||
# PROJECT MADE WITH: Qt Designer and PySide6
|
||||
# V: 1.0.0
|
||||
#
|
||||
# This project can be used freely for all uses, as long as they maintain the
|
||||
# respective credits only in the Python scripts, any information in the visual
|
||||
# interface (GUI) can be modified without any implication.
|
||||
#
|
||||
# There are limitations on Qt licenses if you want to use your products
|
||||
# commercially, I recommend reading them on the official website:
|
||||
# https://doc.qt.io/qtforpython/licenses.html
|
||||
#
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
|
||||
# APP WIDGETS
|
||||
from . pyside_or_pyqt import *
|
||||
|
||||
# APP WIDGETS
|
||||
from . widgets import *
|
||||
18
app/packages/pyside_or_pyqt/__init__.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
#
|
||||
# BY: WANDERSON M.PIMENTA
|
||||
# PROJECT MADE WITH: Qt Designer and PySide6
|
||||
# V: 1.0.0
|
||||
#
|
||||
# This project can be used freely for all uses, as long as they maintain the
|
||||
# respective credits only in the Python scripts, any information in the visual
|
||||
# interface (GUI) can be modified without any implication.
|
||||
#
|
||||
# There are limitations on Qt licenses if you want to use your products
|
||||
# commercially, I recommend reading them on the official website:
|
||||
# https://doc.qt.io/qtforpython/licenses.html
|
||||
#
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
|
||||
# APP WIDGETS
|
||||
from . pyside_or_pyqt import *
|
||||
19
app/packages/pyside_or_pyqt/pyside_or_pyqt.py
Normal file
@@ -0,0 +1,19 @@
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
#
|
||||
# BY: WANDERSON M.PIMENTA
|
||||
# PROJECT MADE WITH: Qt Designer and PySide6
|
||||
# V: 1.0.0
|
||||
#
|
||||
# This project can be used freely for all uses, as long as they maintain the
|
||||
# respective credits only in the Python scripts, any information in the visual
|
||||
# interface (GUI) can be modified without any implication.
|
||||
#
|
||||
# There are limitations on Qt licenses if you want to use your products
|
||||
# commercially, I recommend reading them on the official website:
|
||||
# https://doc.qt.io/qtforpython/licenses.html
|
||||
#
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
|
||||
from PySide6.QtCore import *
|
||||
from PySide6.QtGui import *
|
||||
from PySide6.QtWidgets import *
|
||||
34
app/packages/widgets/__init__.py
Normal file
@@ -0,0 +1,34 @@
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
#
|
||||
# BY: WANDERSON M.PIMENTA
|
||||
# PROJECT MADE WITH: Qt Designer and PySide6
|
||||
# V: 1.0.0
|
||||
#
|
||||
# This project can be used freely for all uses, as long as they maintain the
|
||||
# respective credits only in the Python scripts, any information in the visual
|
||||
# interface (GUI) can be modified without any implication.
|
||||
#
|
||||
# There are limitations on Qt licenses if you want to use your products
|
||||
# commercially, I recommend reading them on the official website:
|
||||
# https://doc.qt.io/qtforpython/licenses.html
|
||||
#
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
|
||||
# CUSTOM GRIP
|
||||
# Resize window using application edges
|
||||
from . custom_grips import CustomGrip
|
||||
|
||||
# LEFT MENU BUTTON
|
||||
# Custom button with tooltip
|
||||
from . left_menu_button import LeftMenuButton
|
||||
|
||||
# TOP USER BOX
|
||||
# Top user information and status
|
||||
from . top_user_box import TopUserInfo
|
||||
|
||||
# FRIEND MENU MESSAGE / MESSAGE BUTTON
|
||||
# Friends messages with name and status
|
||||
from . friend_message_button import FriendMessageButton
|
||||
|
||||
# CIRCULAR PROGRESS BAR
|
||||
from . circular_progress import CircularProgress
|
||||
14
app/packages/widgets/circular_progress/__init__.py
Normal file
@@ -0,0 +1,14 @@
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
#
|
||||
# BY: WANDERSON M.PIMENTA
|
||||
# PROJECT MADE WITH: Qt Designer and PySide6
|
||||
# V: 1.0.0
|
||||
#
|
||||
# This project can be used freely for all uses, as long as they maintain the
|
||||
# respective credits only in the Python scripts, any information in the visual
|
||||
# interface (GUI) can be modified without any implication.
|
||||
#
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
|
||||
# CIRCULAR PROGRESS BAR
|
||||
from . circular_progress import CircularProgress
|
||||
106
app/packages/widgets/circular_progress/circular_progress.py
Normal file
@@ -0,0 +1,106 @@
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
#
|
||||
# BY: WANDERSON M.PIMENTA
|
||||
# PROJECT MADE WITH: Qt Designer and PySide6
|
||||
# V: 1.0.0
|
||||
#
|
||||
# This project can be used freely for all uses, as long as they maintain the
|
||||
# respective credits only in the Python scripts, any information in the visual
|
||||
# interface (GUI) can be modified without any implication.
|
||||
#
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
|
||||
from PySide6.QtCore import *
|
||||
from PySide6.QtGui import *
|
||||
from PySide6.QtWidgets import *
|
||||
|
||||
class CircularProgress(QWidget):
|
||||
def __init__(self):
|
||||
QWidget.__init__(self)
|
||||
|
||||
# CUSTOM PROPERTIES
|
||||
self.value = 0
|
||||
self.width = 200
|
||||
self.height = 200
|
||||
self.progress_width = 10
|
||||
self.progress_rounded_cap = True
|
||||
self.max_value = 100
|
||||
self.progress_color = 0xff79c6
|
||||
# Text
|
||||
self.enable_text = True
|
||||
self.font_family = "Segoe UI"
|
||||
self.font_size = 12
|
||||
self.suffix = "%"
|
||||
self.text_color = 0xff79c6
|
||||
# BG
|
||||
self.enable_bg = True
|
||||
self.bg_color = 0x44475a
|
||||
|
||||
# SET DEFAULT SIZE WITHOUT LAYOUT
|
||||
self.resize(self.width, self.height)
|
||||
|
||||
# ADD DROPSHADOW
|
||||
def add_shadow(self, enable):
|
||||
if enable:
|
||||
self.shadow = QGraphicsDropShadowEffect(self)
|
||||
self.shadow.setBlurRadius(15)
|
||||
self.shadow.setXOffset(0)
|
||||
self.shadow.setYOffset(0)
|
||||
self.shadow.setColor(QColor(0, 0, 0, 80))
|
||||
self.setGraphicsEffect(self.shadow)
|
||||
|
||||
# SET VALUE
|
||||
def set_value(self, value):
|
||||
self.value = value
|
||||
self.repaint() # Render progress bar after change value
|
||||
|
||||
|
||||
# PAINT EVENT (DESIGN YOUR CIRCULAR PROGRESS HERE)
|
||||
def paintEvent(self, e):
|
||||
# SET PROGRESS PARAMETERS
|
||||
width = self.width - self.progress_width
|
||||
height = self.height - self.progress_width
|
||||
margin = self.progress_width / 2
|
||||
value = self.value * 360 / self.max_value
|
||||
|
||||
# PAINTER
|
||||
paint = QPainter()
|
||||
paint.begin(self)
|
||||
paint.setRenderHint(QPainter.Antialiasing) # remove pixelated edges
|
||||
paint.setFont(QFont(self.font_family, self.font_size))
|
||||
|
||||
# CREATE RECTANGLE
|
||||
rect = QRect(0, 0, self.width, self.height)
|
||||
paint.setPen(Qt.NoPen)
|
||||
paint.drawRect(rect)
|
||||
|
||||
# PEN
|
||||
pen = QPen()
|
||||
pen.setWidth(self.progress_width)
|
||||
# Set Round Cap
|
||||
if self.progress_rounded_cap:
|
||||
pen.setCapStyle(Qt.RoundCap)
|
||||
|
||||
# ENABLE BG
|
||||
if self.enable_bg:
|
||||
pen.setColor(QColor(self.bg_color))
|
||||
paint.setPen(pen)
|
||||
paint.drawArc(margin, margin, width, height, 0, 360 * 16)
|
||||
|
||||
# CREATE ARC / CIRCULAR PROGRESS
|
||||
pen.setColor(QColor(self.progress_color))
|
||||
paint.setPen(pen)
|
||||
paint.drawArc(margin, margin, width, height, -90 * 16, -value * 16)
|
||||
|
||||
# CREATE TEXT
|
||||
if self.enable_text:
|
||||
pen.setColor(QColor(self.text_color))
|
||||
paint.setPen(pen)
|
||||
paint.drawText(rect, Qt.AlignCenter, f"{self.value}{self.suffix}")
|
||||
|
||||
# END
|
||||
paint.end()
|
||||
|
||||
if __name__ == "__main__":
|
||||
progress = CircularProgress()
|
||||
progress.__init__()
|
||||
17
app/packages/widgets/custom_grips/__init__.py
Normal file
@@ -0,0 +1,17 @@
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
#
|
||||
# BY: WANDERSON M.PIMENTA
|
||||
# PROJECT MADE WITH: Qt Designer and PySide6
|
||||
# V: 1.0.0
|
||||
#
|
||||
# This project can be used freely for all uses, as long as they maintain the
|
||||
# respective credits only in the Python scripts, any information in the visual
|
||||
# interface (GUI) can be modified without any implication.
|
||||
#
|
||||
# There are limitations on Qt licenses if you want to use your products
|
||||
# commercially, I recommend reading them on the official website:
|
||||
# https://doc.qt.io/qtforpython/licenses.html
|
||||
#
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
|
||||
from . custom_grips import CustomGrip
|
||||
238
app/packages/widgets/custom_grips/custom_grips.py
Normal file
@@ -0,0 +1,238 @@
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
#
|
||||
# BY: WANDERSON M.PIMENTA
|
||||
# PROJECT MADE WITH: Qt Designer and PySide6
|
||||
# V: 1.0.0
|
||||
#
|
||||
# This project can be used freely for all uses, as long as they maintain the
|
||||
# respective credits only in the Python scripts, any information in the visual
|
||||
# interface (GUI) can be modified without any implication.
|
||||
#
|
||||
# There are limitations on Qt licenses if you want to use your products
|
||||
# commercially, I recommend reading them on the official website:
|
||||
# https://doc.qt.io/qtforpython/licenses.html
|
||||
#
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
|
||||
from PySide6.QtCore import *
|
||||
from PySide6.QtGui import *
|
||||
from PySide6.QtWidgets import *
|
||||
|
||||
class CustomGrip(QWidget):
|
||||
def __init__(self, parent, position, disable_color = False):
|
||||
|
||||
# SETUP UI
|
||||
QWidget.__init__(self)
|
||||
self.parent = parent
|
||||
self.setParent(parent)
|
||||
self.wi = Widgets()
|
||||
|
||||
# SHOW TOP GRIP
|
||||
if position == Qt.TopEdge:
|
||||
self.wi.top(self)
|
||||
self.setGeometry(0, 0, self.parent.width(), 10)
|
||||
self.setMaximumHeight(10)
|
||||
|
||||
# GRIPS
|
||||
top_left = QSizeGrip(self.wi.top_left)
|
||||
top_right = QSizeGrip(self.wi.top_right)
|
||||
|
||||
# RESIZE TOP
|
||||
def resize_top(event):
|
||||
delta = event.pos()
|
||||
height = max(self.parent.minimumHeight(), self.parent.height() - delta.y())
|
||||
geo = self.parent.geometry()
|
||||
geo.setTop(geo.bottom() - height)
|
||||
self.parent.setGeometry(geo)
|
||||
event.accept()
|
||||
self.wi.top.mouseMoveEvent = resize_top
|
||||
|
||||
# ENABLE COLOR
|
||||
if disable_color:
|
||||
self.wi.top_left.setStyleSheet("background: transparent")
|
||||
self.wi.top_right.setStyleSheet("background: transparent")
|
||||
self.wi.top.setStyleSheet("background: transparent")
|
||||
|
||||
# SHOW BOTTOM GRIP
|
||||
elif position == Qt.BottomEdge:
|
||||
self.wi.bottom(self)
|
||||
self.setGeometry(0, self.parent.height() - 10, self.parent.width(), 10)
|
||||
self.setMaximumHeight(10)
|
||||
|
||||
# GRIPS
|
||||
self.bottom_left = QSizeGrip(self.wi.bottom_left)
|
||||
self.bottom_right = QSizeGrip(self.wi.bottom_right)
|
||||
|
||||
# RESIZE BOTTOM
|
||||
def resize_bottom(event):
|
||||
delta = event.pos()
|
||||
height = max(self.parent.minimumHeight(), self.parent.height() + delta.y())
|
||||
self.parent.resize(self.parent.width(), height)
|
||||
event.accept()
|
||||
self.wi.bottom.mouseMoveEvent = resize_bottom
|
||||
|
||||
# ENABLE COLOR
|
||||
if disable_color:
|
||||
self.wi.bottom_left.setStyleSheet("background: transparent")
|
||||
self.wi.bottom_right.setStyleSheet("background: transparent")
|
||||
self.wi.bottom.setStyleSheet("background: transparent")
|
||||
|
||||
# SHOW LEFT GRIP
|
||||
elif position == Qt.LeftEdge:
|
||||
self.wi.left(self)
|
||||
self.setGeometry(0, 10, 10, self.parent.height())
|
||||
self.setMaximumWidth(10)
|
||||
|
||||
# RESIZE LEFT
|
||||
def resize_left(event):
|
||||
delta = event.pos()
|
||||
width = max(self.parent.minimumWidth(), self.parent.width() - delta.x())
|
||||
geo = self.parent.geometry()
|
||||
geo.setLeft(geo.right() - width)
|
||||
self.parent.setGeometry(geo)
|
||||
event.accept()
|
||||
self.wi.leftgrip.mouseMoveEvent = resize_left
|
||||
|
||||
# ENABLE COLOR
|
||||
if disable_color:
|
||||
self.wi.leftgrip.setStyleSheet("background: transparent")
|
||||
|
||||
# RESIZE RIGHT
|
||||
elif position == Qt.RightEdge:
|
||||
self.wi.right(self)
|
||||
self.setGeometry(self.parent.width() - 10, 10, 10, self.parent.height())
|
||||
self.setMaximumWidth(10)
|
||||
|
||||
def resize_right(event):
|
||||
delta = event.pos()
|
||||
width = max(self.parent.minimumWidth(), self.parent.width() + delta.x())
|
||||
self.parent.resize(width, self.parent.height())
|
||||
event.accept()
|
||||
self.wi.rightgrip.mouseMoveEvent = resize_right
|
||||
|
||||
# ENABLE COLOR
|
||||
if disable_color:
|
||||
self.wi.rightgrip.setStyleSheet("background: transparent")
|
||||
|
||||
|
||||
def mouseReleaseEvent(self, event):
|
||||
self.mousePos = None
|
||||
|
||||
def resizeEvent(self, event):
|
||||
if hasattr(self.wi, 'container_top'):
|
||||
self.wi.container_top.setGeometry(0, 0, self.width(), 10)
|
||||
|
||||
elif hasattr(self.wi, 'container_bottom'):
|
||||
self.wi.container_bottom.setGeometry(0, 0, self.width(), 10)
|
||||
|
||||
elif hasattr(self.wi, 'leftgrip'):
|
||||
self.wi.leftgrip.setGeometry(0, 0, 10, self.height() - 20)
|
||||
|
||||
elif hasattr(self.wi, 'rightgrip'):
|
||||
self.wi.rightgrip.setGeometry(0, 0, 10, self.height() - 20)
|
||||
|
||||
class Widgets(object):
|
||||
def top(self, Form):
|
||||
if not Form.objectName():
|
||||
Form.setObjectName(u"Form")
|
||||
self.container_top = QFrame(Form)
|
||||
self.container_top.setObjectName(u"container_top")
|
||||
self.container_top.setGeometry(QRect(0, 0, 500, 10))
|
||||
self.container_top.setMinimumSize(QSize(0, 10))
|
||||
self.container_top.setMaximumSize(QSize(16777215, 10))
|
||||
self.container_top.setFrameShape(QFrame.NoFrame)
|
||||
self.container_top.setFrameShadow(QFrame.Raised)
|
||||
self.top_layout = QHBoxLayout(self.container_top)
|
||||
self.top_layout.setSpacing(0)
|
||||
self.top_layout.setObjectName(u"top_layout")
|
||||
self.top_layout.setContentsMargins(0, 0, 0, 0)
|
||||
self.top_left = QFrame(self.container_top)
|
||||
self.top_left.setObjectName(u"top_left")
|
||||
self.top_left.setMinimumSize(QSize(10, 10))
|
||||
self.top_left.setMaximumSize(QSize(10, 10))
|
||||
self.top_left.setCursor(QCursor(Qt.SizeFDiagCursor))
|
||||
self.top_left.setStyleSheet(u"background-color: rgb(33, 37, 43);")
|
||||
self.top_left.setFrameShape(QFrame.NoFrame)
|
||||
self.top_left.setFrameShadow(QFrame.Raised)
|
||||
self.top_layout.addWidget(self.top_left)
|
||||
self.top = QFrame(self.container_top)
|
||||
self.top.setObjectName(u"top")
|
||||
self.top.setCursor(QCursor(Qt.SizeVerCursor))
|
||||
self.top.setStyleSheet(u"background-color: rgb(85, 255, 255);")
|
||||
self.top.setFrameShape(QFrame.NoFrame)
|
||||
self.top.setFrameShadow(QFrame.Raised)
|
||||
self.top_layout.addWidget(self.top)
|
||||
self.top_right = QFrame(self.container_top)
|
||||
self.top_right.setObjectName(u"top_right")
|
||||
self.top_right.setMinimumSize(QSize(10, 10))
|
||||
self.top_right.setMaximumSize(QSize(10, 10))
|
||||
self.top_right.setCursor(QCursor(Qt.SizeBDiagCursor))
|
||||
self.top_right.setStyleSheet(u"background-color: rgb(33, 37, 43);")
|
||||
self.top_right.setFrameShape(QFrame.NoFrame)
|
||||
self.top_right.setFrameShadow(QFrame.Raised)
|
||||
self.top_layout.addWidget(self.top_right)
|
||||
|
||||
def bottom(self, Form):
|
||||
if not Form.objectName():
|
||||
Form.setObjectName(u"Form")
|
||||
self.container_bottom = QFrame(Form)
|
||||
self.container_bottom.setObjectName(u"container_bottom")
|
||||
self.container_bottom.setGeometry(QRect(0, 0, 500, 10))
|
||||
self.container_bottom.setMinimumSize(QSize(0, 10))
|
||||
self.container_bottom.setMaximumSize(QSize(16777215, 10))
|
||||
self.container_bottom.setFrameShape(QFrame.NoFrame)
|
||||
self.container_bottom.setFrameShadow(QFrame.Raised)
|
||||
self.bottom_layout = QHBoxLayout(self.container_bottom)
|
||||
self.bottom_layout.setSpacing(0)
|
||||
self.bottom_layout.setObjectName(u"bottom_layout")
|
||||
self.bottom_layout.setContentsMargins(0, 0, 0, 0)
|
||||
self.bottom_left = QFrame(self.container_bottom)
|
||||
self.bottom_left.setObjectName(u"bottom_left")
|
||||
self.bottom_left.setMinimumSize(QSize(10, 10))
|
||||
self.bottom_left.setMaximumSize(QSize(10, 10))
|
||||
self.bottom_left.setCursor(QCursor(Qt.SizeBDiagCursor))
|
||||
self.bottom_left.setStyleSheet(u"background-color: rgb(33, 37, 43);")
|
||||
self.bottom_left.setFrameShape(QFrame.NoFrame)
|
||||
self.bottom_left.setFrameShadow(QFrame.Raised)
|
||||
self.bottom_layout.addWidget(self.bottom_left)
|
||||
self.bottom = QFrame(self.container_bottom)
|
||||
self.bottom.setObjectName(u"bottom")
|
||||
self.bottom.setCursor(QCursor(Qt.SizeVerCursor))
|
||||
self.bottom.setStyleSheet(u"background-color: rgb(85, 170, 0);")
|
||||
self.bottom.setFrameShape(QFrame.NoFrame)
|
||||
self.bottom.setFrameShadow(QFrame.Raised)
|
||||
self.bottom_layout.addWidget(self.bottom)
|
||||
self.bottom_right = QFrame(self.container_bottom)
|
||||
self.bottom_right.setObjectName(u"bottom_right")
|
||||
self.bottom_right.setMinimumSize(QSize(10, 10))
|
||||
self.bottom_right.setMaximumSize(QSize(10, 10))
|
||||
self.bottom_right.setCursor(QCursor(Qt.SizeFDiagCursor))
|
||||
self.bottom_right.setStyleSheet(u"background-color: rgb(33, 37, 43);")
|
||||
self.bottom_right.setFrameShape(QFrame.NoFrame)
|
||||
self.bottom_right.setFrameShadow(QFrame.Raised)
|
||||
self.bottom_layout.addWidget(self.bottom_right)
|
||||
|
||||
def left(self, Form):
|
||||
if not Form.objectName():
|
||||
Form.setObjectName(u"Form")
|
||||
self.leftgrip = QFrame(Form)
|
||||
self.leftgrip.setObjectName(u"left")
|
||||
self.leftgrip.setGeometry(QRect(0, 10, 10, 480))
|
||||
self.leftgrip.setMinimumSize(QSize(10, 0))
|
||||
self.leftgrip.setCursor(QCursor(Qt.SizeHorCursor))
|
||||
self.leftgrip.setStyleSheet(u"background-color: rgb(255, 121, 198);")
|
||||
self.leftgrip.setFrameShape(QFrame.NoFrame)
|
||||
self.leftgrip.setFrameShadow(QFrame.Raised)
|
||||
|
||||
def right(self, Form):
|
||||
if not Form.objectName():
|
||||
Form.setObjectName(u"Form")
|
||||
Form.resize(500, 500)
|
||||
self.rightgrip = QFrame(Form)
|
||||
self.rightgrip.setObjectName(u"right")
|
||||
self.rightgrip.setGeometry(QRect(0, 0, 10, 500))
|
||||
self.rightgrip.setMinimumSize(QSize(10, 0))
|
||||
self.rightgrip.setCursor(QCursor(Qt.SizeHorCursor))
|
||||
self.rightgrip.setStyleSheet(u"background-color: rgb(255, 0, 127);")
|
||||
self.rightgrip.setFrameShape(QFrame.NoFrame)
|
||||
self.rightgrip.setFrameShadow(QFrame.Raised)
|
||||
19
app/packages/widgets/friend_message_button/__init__.py
Normal file
@@ -0,0 +1,19 @@
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
#
|
||||
# BY: WANDERSON M.PIMENTA
|
||||
# PROJECT MADE WITH: Qt Designer and PySide6
|
||||
# V: 1.0.0
|
||||
#
|
||||
# This project can be used freely for all uses, as long as they maintain the
|
||||
# respective credits only in the Python scripts, any information in the visual
|
||||
# interface (GUI) can be modified without any implication.
|
||||
#
|
||||
# There are limitations on Qt licenses if you want to use your products
|
||||
# commercially, I recommend reading them on the official website:
|
||||
# https://doc.qt.io/qtforpython/licenses.html
|
||||
#
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
|
||||
# FRIEND MENU MESSAGE / MESSAGE BUTTON
|
||||
# Friends messages with name and status
|
||||
from . friend_message_button import FriendMessageButton
|
||||
@@ -0,0 +1,230 @@
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
#
|
||||
# BY: WANDERSON M.PIMENTA
|
||||
# PROJECT MADE WITH: Qt Designer and PySide6
|
||||
# V: 1.0.0
|
||||
#
|
||||
# This project can be used freely for all uses, as long as they maintain the
|
||||
# respective credits only in the Python scripts, any information in the visual
|
||||
# interface (GUI) can be modified without any implication.
|
||||
#
|
||||
# There are limitations on Qt licenses if you want to use your products
|
||||
# commercially, I recommend reading them on the official website:
|
||||
# https://doc.qt.io/qtforpython/licenses.html
|
||||
#
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
|
||||
# IMPORT
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
# Packages
|
||||
from app.packages.pyside_or_pyqt import *
|
||||
# Modules
|
||||
import os
|
||||
|
||||
# FRIEND MENU MESSAGE / MESSAGE BUTTON
|
||||
# Friends messages with name and status
|
||||
class FriendMessageButton(QWidget):
|
||||
# SIGNALS
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
clicked = Signal()
|
||||
released = Signal()
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
id,
|
||||
user_image,
|
||||
user_name,
|
||||
user_descrition,
|
||||
user_status,
|
||||
unread_messages,
|
||||
is_active
|
||||
):
|
||||
QWidget.__init__(self)
|
||||
|
||||
# ICON PATH
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
image = user_image
|
||||
app_path = os.path.abspath(os.getcwd())
|
||||
image_path = os.path.join(app_path, image)
|
||||
|
||||
# CUSTOM PARAMETERS
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.user_image = image_path
|
||||
self.user_name = user_name
|
||||
self.user_description = user_descrition
|
||||
self.user_status = user_status
|
||||
self.unread_messages = unread_messages
|
||||
self.is_active = is_active
|
||||
self._status_color = "#46b946"
|
||||
self.bg_color_entered = "#22CCCCCC"
|
||||
self.bg_color_leave = "#00000000"
|
||||
self.bg_color_active = "#33CCCCCC"
|
||||
self._bg_color = self.bg_color_leave
|
||||
|
||||
|
||||
# SETUP
|
||||
self.setFixedSize(240, 50)
|
||||
self.setCursor(Qt.PointingHandCursor)
|
||||
self.setObjectName(str(id))
|
||||
self.setup_ui()
|
||||
|
||||
# SHOW UNREAD MESSAGES
|
||||
if self.unread_messages > 0:
|
||||
self.label_messages.show()
|
||||
self.label_messages.setText(str(self.unread_messages))
|
||||
|
||||
# CHANGE COLOR
|
||||
if self.user_status == "online":
|
||||
self._status_color = "#46b946"
|
||||
elif self.user_status == "ilde":
|
||||
self._status_color = "#ff9955"
|
||||
elif self.user_status == "busy":
|
||||
self._status_color = "#a02c2c"
|
||||
elif self.user_status == "invisible":
|
||||
self._status_color = "#808080"
|
||||
|
||||
# CHANGE OPACITY
|
||||
if self.user_status == "invisible":
|
||||
self.opacity = QGraphicsOpacityEffect()
|
||||
self.opacity.setOpacity(0.4)
|
||||
self.setGraphicsEffect(self.opacity)
|
||||
|
||||
def reset_unread_message(self):
|
||||
self.unread_messages = 0
|
||||
self.label_messages.hide()
|
||||
self.repaint()
|
||||
|
||||
# MOUSE PRESS
|
||||
# Event triggered when the left button is pressed
|
||||
def mousePressEvent(self, event):
|
||||
if event.button() == Qt.LeftButton:
|
||||
# EMIT SIGNAL
|
||||
self.clicked.emit()
|
||||
|
||||
# MOUSE RELEASE
|
||||
# Event fired when the mouse leaves the BTN
|
||||
def mouseReleaseEvent(self, event):
|
||||
if event.button() == Qt.LeftButton:
|
||||
self.released.emit()
|
||||
|
||||
# MOUSE ENTER
|
||||
# Event fired when the mouse enter
|
||||
def enterEvent(self, event):
|
||||
if not self.is_active:
|
||||
self._bg_color = self.bg_color_entered
|
||||
self.repaint()
|
||||
|
||||
# MOUSE LEAVE
|
||||
# Event fired when the mouse leave
|
||||
def leaveEvent(self, event):
|
||||
if not self.is_active:
|
||||
self._bg_color = self.bg_color_leave
|
||||
self.repaint()
|
||||
|
||||
def set_active(self, active):
|
||||
if active:
|
||||
self.is_active = active
|
||||
else:
|
||||
self.is_active = active
|
||||
self._bg_color = self.bg_color_leave
|
||||
self.repaint()
|
||||
|
||||
# SETUP WIDGETS
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def setup_ui(self):
|
||||
# FRAME TEXT
|
||||
self.text_frame = QFrame(self)
|
||||
self.text_frame.setGeometry(60, 0, 170, 50)
|
||||
|
||||
# USER NAME
|
||||
self.label_user = QLabel(self.text_frame)
|
||||
self.label_user.setGeometry(0, 8, self.text_frame.width(), 20)
|
||||
self.label_user.setAlignment(Qt.AlignVCenter)
|
||||
self.label_user.setText(self.user_name.capitalize())
|
||||
self.label_user.setStyleSheet("color: #e7e7e7; font: 700 10pt 'Segoe UI';")
|
||||
|
||||
# USER STATUS
|
||||
self.label_description = QLabel(self.text_frame)
|
||||
self.label_description.setGeometry(0, 22, self.text_frame.width(), 18)
|
||||
self.label_description.setAlignment(Qt.AlignVCenter)
|
||||
self.label_description.setText(self.user_description)
|
||||
self.label_description.setStyleSheet("color: #A6A6A6; font: 9pt 'Segoe UI';")
|
||||
|
||||
# USER STATUS
|
||||
self.label_messages = QLabel(self)
|
||||
self.label_messages.setFixedSize(35, 20)
|
||||
self.label_messages.setAlignment(Qt.AlignCenter)
|
||||
self.label_messages.setStyleSheet("""
|
||||
background-color: #1e2021;
|
||||
padding-left: 5px;
|
||||
padding-right: 5px;
|
||||
color: #bdff00;
|
||||
border-radius: 10px;
|
||||
border: 3px solid #333;
|
||||
font: 9pt 'Segoe UI';
|
||||
""")
|
||||
self.label_messages.move(self.width() - 45, 16)
|
||||
self.label_messages.hide()
|
||||
|
||||
# PAINT EVENT
|
||||
# PAINT USER IMAGE EVENTS
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def paintEvent(self, event):
|
||||
# PAINTER USER IMAGE
|
||||
painter = QPainter()
|
||||
painter.begin(self)
|
||||
painter.setRenderHint(QPainter.Antialiasing)
|
||||
painter.setPen(Qt.NoPen)
|
||||
|
||||
# RECT
|
||||
rect = QRect(10, 5, 40, 40)
|
||||
|
||||
# DRAW BG
|
||||
if self.is_active:
|
||||
painter.setBrush(QBrush(QColor(self.bg_color_active)))
|
||||
else:
|
||||
painter.setBrush(QBrush(QColor(self._bg_color)))
|
||||
painter.drawRoundedRect(5, 0, 230, 50, 25, 25)
|
||||
|
||||
# CIRCLE
|
||||
painter.setBrush(QBrush(QColor("#000000")))
|
||||
painter.drawEllipse(rect)
|
||||
|
||||
# DRAW USER IMAGE
|
||||
self.draw_user_image(painter, self.user_image, rect)
|
||||
|
||||
painter.end()
|
||||
|
||||
# DRAW USER IMAGE
|
||||
if self.user_status != "invisible":
|
||||
self.draw_status(self.user_image, rect)
|
||||
|
||||
# DRAW USER IMAGE
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def draw_user_image(self, qp, image, rect):
|
||||
user_image = QImage(image)
|
||||
path = QPainterPath()
|
||||
path.addEllipse(rect)
|
||||
qp.setClipPath(path)
|
||||
qp.drawImage(rect, user_image)
|
||||
|
||||
# DRAW STATUS
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def draw_status(self, status, rect):
|
||||
painter = QPainter()
|
||||
painter.begin(self)
|
||||
painter.setRenderHint(QPainter.Antialiasing)
|
||||
|
||||
# PEN
|
||||
pen = QPen()
|
||||
pen.setWidth(3)
|
||||
pen.setColor(QColor("#151617"))
|
||||
painter.setPen(pen)
|
||||
|
||||
# BRUSH/STATUS COLOR
|
||||
painter.setBrush(QBrush(QColor(self._status_color)))
|
||||
|
||||
# DRAW
|
||||
painter.drawEllipse(rect.x() + 27, rect.y() + 27, 13, 13)
|
||||
painter.end()
|
||||
|
||||
19
app/packages/widgets/left_menu_button/__init__.py
Normal file
@@ -0,0 +1,19 @@
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
#
|
||||
# BY: WANDERSON M.PIMENTA
|
||||
# PROJECT MADE WITH: Qt Designer and PySide6
|
||||
# V: 1.0.0
|
||||
#
|
||||
# This project can be used freely for all uses, as long as they maintain the
|
||||
# respective credits only in the Python scripts, any information in the visual
|
||||
# interface (GUI) can be modified without any implication.
|
||||
#
|
||||
# There are limitations on Qt licenses if you want to use your products
|
||||
# commercially, I recommend reading them on the official website:
|
||||
# https://doc.qt.io/qtforpython/licenses.html
|
||||
#
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
|
||||
# LEFT MENU BUTTON
|
||||
# Custom button with tooltip
|
||||
from . left_menu_button import LeftMenuButton
|
||||
226
app/packages/widgets/left_menu_button/left_menu_button.py
Normal file
@@ -0,0 +1,226 @@
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
#
|
||||
# BY: WANDERSON M.PIMENTA
|
||||
# PROJECT MADE WITH: Qt Designer and PySide6
|
||||
# V: 1.0.0
|
||||
#
|
||||
# This project can be used freely for all uses, as long as they maintain the
|
||||
# respective credits only in the Python scripts, any information in the visual
|
||||
# interface (GUI) can be modified without any implication.
|
||||
#
|
||||
# There are limitations on Qt licenses if you want to use your products
|
||||
# commercially, I recommend reading them on the official website:
|
||||
# https://doc.qt.io/qtforpython/licenses.html
|
||||
#
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
|
||||
# IMPORT
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
# Packages
|
||||
from app.packages.pyside_or_pyqt import *
|
||||
# Modules
|
||||
import app.modules.ui_functions.functions as ui_functions
|
||||
from app.modules.app_settings.settings import *
|
||||
import os
|
||||
|
||||
# TOOLTIP / LABEL StyleSheet
|
||||
style_tooltip = """
|
||||
QLabel {
|
||||
background-color: #0b0b0c;
|
||||
color: rgb(230, 230, 230);
|
||||
padding-left: 10px;
|
||||
padding-right: 10px;
|
||||
border-radius: 17px;
|
||||
border: 1px solid #2f3032;
|
||||
border-left: 3px solid #bdff00;
|
||||
font: 800 9pt "Segoe UI";
|
||||
}
|
||||
"""
|
||||
|
||||
# CUSTOM LEFT MENU
|
||||
class LeftMenuButton(QWidget):
|
||||
# SIGNALS
|
||||
clicked = Signal()
|
||||
released = Signal()
|
||||
|
||||
def __init__(self, parent, name, icon, tooltip):
|
||||
QWidget.__init__(self)
|
||||
# APP PATH
|
||||
app_path = os.path.abspath(os.getcwd())
|
||||
icon_path = os.path.join(app_path, icon)
|
||||
|
||||
# GET SETTINGS
|
||||
settings = Settings()
|
||||
self.settings = settings.items
|
||||
|
||||
# DEFAULT PARAMETERS
|
||||
self.width = 40
|
||||
self.height = 40
|
||||
self.pos_x = 0
|
||||
self.pos_y = 0
|
||||
self.border_radius = 10
|
||||
self.parent = parent
|
||||
self.setGeometry(0, 0, self.width, self.height)
|
||||
self.setMinimumSize(self.width, self.height)
|
||||
self.setCursor(Qt.PointingHandCursor)
|
||||
self.setObjectName(name)
|
||||
|
||||
# BG COLORS
|
||||
self.color_default = QColor(self.settings["left_menu"]["color"])
|
||||
self.color_hover = QColor(self.settings["left_menu"]["color_hover"])
|
||||
self.color_pressed = QColor(self.settings["left_menu"]["color_pressed"])
|
||||
self._set_color = self.color_default
|
||||
|
||||
# ICON
|
||||
self.icon_color = QColor(0xE6E6E6)
|
||||
self.icon_color_pressed = QColor(0x151617)
|
||||
self._set_icon_path = icon_path
|
||||
self._set_icon_color = self.icon_color
|
||||
|
||||
# TOOLTIP
|
||||
self.tooltip_text = tooltip
|
||||
self.tooltip = _ToolTip(parent, tooltip)
|
||||
self.tooltip.hide()
|
||||
|
||||
# PAINT EVENT
|
||||
# Responsible for painting the button, as well as the icon
|
||||
def paintEvent(self, event):
|
||||
# PAINTER
|
||||
paint = QPainter()
|
||||
paint.begin(self)
|
||||
paint.setRenderHint(QPainter.RenderHint.Antialiasing)
|
||||
|
||||
# BRUSH
|
||||
brush = QBrush(self._set_color)
|
||||
|
||||
# CREATE RECTANGLE
|
||||
rect = QRect(0, 0, self.width, self.height)
|
||||
paint.setPen(Qt.NoPen)
|
||||
paint.setBrush(brush)
|
||||
paint.drawRoundedRect(rect, self.border_radius, self.border_radius)
|
||||
|
||||
# DRAW ICONS
|
||||
self.icon_paint(paint, self._set_icon_path, rect)
|
||||
|
||||
# END PAINTER
|
||||
paint.end()
|
||||
|
||||
# DRAW ICON WITH COLORS
|
||||
def icon_paint(self, qp, image, rect):
|
||||
icon = QPixmap(image)
|
||||
painter = QPainter(icon)
|
||||
painter.setCompositionMode(QPainter.CompositionMode_SourceIn)
|
||||
painter.fillRect(icon.rect(), self._set_icon_color)
|
||||
qp.drawPixmap(
|
||||
(rect.width() - icon.width()) / 2,
|
||||
(rect.height() - icon.height()) / 2,
|
||||
icon
|
||||
)
|
||||
painter.end()
|
||||
|
||||
# REPAINT BTN
|
||||
# Reaload/Repaint BTN
|
||||
def repaint_btn(self, event):
|
||||
if event == QEvent.Enter:
|
||||
self.repaint()
|
||||
if event == QEvent.Leave:
|
||||
self.repaint()
|
||||
if event == QEvent.MouseButtonPress:
|
||||
self.repaint()
|
||||
if event == QEvent.MouseButtonRelease:
|
||||
self.repaint()
|
||||
|
||||
# CHANGE STYLES
|
||||
# Functions with custom styles
|
||||
def change_style(self, event):
|
||||
if event == QEvent.Enter:
|
||||
self._set_color = self.color_hover
|
||||
self.repaint_btn(event)
|
||||
elif event == QEvent.Leave:
|
||||
self._set_color = self.color_default
|
||||
self.repaint_btn(event)
|
||||
elif event == QEvent.MouseButtonPress:
|
||||
self._set_color = self.color_pressed
|
||||
self._set_icon_color = self.icon_color_pressed
|
||||
self.repaint_btn(event)
|
||||
elif event == QEvent.MouseButtonRelease:
|
||||
self._set_color = self.color_hover
|
||||
self._set_icon_color = self.icon_color
|
||||
self.repaint_btn(event)
|
||||
|
||||
# MOVE TOOLTIP
|
||||
def move_tooltip(self):
|
||||
# GET MAIN WINDOW PARENT
|
||||
gp = self.mapToGlobal(QPoint(0, 0))
|
||||
|
||||
# SET WIDGET TO GET POSTION
|
||||
# Return absolute position of widget inside app
|
||||
pos = self.parent.mapFromGlobal(gp)
|
||||
|
||||
# FORMAT POSITION
|
||||
# Adjust tooltip position with offset
|
||||
pos_x = pos.x() + self.width + 12
|
||||
pos_y = pos.y() + (self.width - self.tooltip.height()) // 2
|
||||
|
||||
# SET POSITION TO WIDGET
|
||||
# Move tooltip position
|
||||
self.tooltip.move(pos_x, pos_y)
|
||||
|
||||
# MOUSE OVER
|
||||
# Event triggered when the mouse is over the BTN
|
||||
def enterEvent(self, event):
|
||||
self.change_style(QEvent.Enter)
|
||||
self.move_tooltip()
|
||||
self.tooltip.show()
|
||||
|
||||
# MOUSE LEAVE
|
||||
# Event fired when the mouse leaves the BTN
|
||||
def leaveEvent(self, event):
|
||||
self.change_style(QEvent.Leave)
|
||||
self.move_tooltip()
|
||||
self.tooltip.hide()
|
||||
|
||||
# MOUSE PRESS
|
||||
# Event triggered when the left button is pressed
|
||||
def mousePressEvent(self, event):
|
||||
if event.button() == Qt.LeftButton:
|
||||
self.change_style(QEvent.MouseButtonPress)
|
||||
# EMIT SIGNAL
|
||||
self.clicked.emit()
|
||||
# SET FOCUS
|
||||
self.setFocus()
|
||||
|
||||
# MOUSE RELEASED
|
||||
# Event triggered after the mouse button is released
|
||||
def mouseReleaseEvent(self, event):
|
||||
if event.button() == Qt.LeftButton:
|
||||
self.change_style(QEvent.MouseButtonRelease)
|
||||
# EMIT SIGNAL
|
||||
self.released.emit()
|
||||
|
||||
class _ToolTip(QLabel):
|
||||
def __init__(self, parent, tooltip):
|
||||
QLabel.__init__(self)
|
||||
|
||||
# LABEL SETUP
|
||||
self.setObjectName(u"label_tooltip")
|
||||
self.setStyleSheet(style_tooltip)
|
||||
self.setMinimumHeight(36)
|
||||
self.setParent(parent)
|
||||
self.setText(tooltip)
|
||||
self.adjustSize()
|
||||
|
||||
# SET DROP SHADOW
|
||||
self.shadow = QGraphicsDropShadowEffect(self)
|
||||
self.shadow.setBlurRadius(15)
|
||||
self.shadow.setXOffset(0)
|
||||
self.shadow.setYOffset(0)
|
||||
self.shadow.setColor(QColor(0, 0, 0, 160))
|
||||
self.setGraphicsEffect(self.shadow)
|
||||
|
||||
# SET OPACITY
|
||||
self.opacity = QGraphicsOpacityEffect(self)
|
||||
self.opacity.setOpacity(0.85)
|
||||
self.setGraphicsEffect(self.opacity)
|
||||
|
||||
|
||||
58
app/packages/widgets/left_menu_button/tooltip.ui
Normal file
@@ -0,0 +1,58 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>Form</class>
|
||||
<widget class="QWidget" name="Form">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>220</width>
|
||||
<height>30</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>220</width>
|
||||
<height>30</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="label_layout">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="styleSheet">
|
||||
<string notr="true">QLabel {
|
||||
background-color: rgb(12, 12, 13);
|
||||
color: rgb(230, 230, 230);
|
||||
padding-left: 10px;
|
||||
padding-right: 10px;
|
||||
border-radius: 8px;
|
||||
}</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>ToolTip</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
20
app/packages/widgets/top_user_box/__init__.py
Normal file
@@ -0,0 +1,20 @@
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
#
|
||||
# BY: WANDERSON M.PIMENTA
|
||||
# PROJECT MADE WITH: Qt Designer and PySide6
|
||||
# V: 1.0.0
|
||||
#
|
||||
# This project can be used freely for all uses, as long as they maintain the
|
||||
# respective credits only in the Python scripts, any information in the visual
|
||||
# interface (GUI) can be modified without any implication.
|
||||
#
|
||||
# There are limitations on Qt licenses if you want to use your products
|
||||
# commercially, I recommend reading them on the official website:
|
||||
# https://doc.qt.io/qtforpython/licenses.html
|
||||
#
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
|
||||
# TOP USER BOX
|
||||
# Top user information and status
|
||||
from . top_user_box import TopUserInfo
|
||||
|
||||
362
app/packages/widgets/top_user_box/top_user_box.py
Normal file
@@ -0,0 +1,362 @@
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
#
|
||||
# BY: WANDERSON M.PIMENTA
|
||||
# PROJECT MADE WITH: Qt Designer and PySide6
|
||||
# V: 1.0.0
|
||||
#
|
||||
# This project can be used freely for all uses, as long as they maintain the
|
||||
# respective credits only in the Python scripts, any information in the visual
|
||||
# interface (GUI) can be modified without any implication.
|
||||
#
|
||||
# There are limitations on Qt licenses if you want to use your products
|
||||
# commercially, I recommend reading them on the official website:
|
||||
# https://doc.qt.io/qtforpython/licenses.html
|
||||
#
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
|
||||
# IMPORT
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
# Packages
|
||||
from app.packages.pyside_or_pyqt import *
|
||||
# Modules
|
||||
import os
|
||||
|
||||
# TOP USER BOX
|
||||
# Top box with name, description and status
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
class TopUserInfo(QWidget):
|
||||
status = Signal(str)
|
||||
def __init__(self, parent, left, top, my_name, my_description):
|
||||
QWidget.__init__(self)
|
||||
|
||||
# ICON PATH
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
image = "images/users/me.png"
|
||||
icon_settings = "images/icons_svg/icon_settings.svg"
|
||||
app_path = os.path.abspath(os.getcwd())
|
||||
image_path = os.path.join(app_path, image)
|
||||
icon_settings_path = os.path.join(app_path, icon_settings)
|
||||
|
||||
# INITIAL SETUP
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.setGeometry(0, 0, 240, 60)
|
||||
self.setObjectName("top_text_box")
|
||||
self.setStyleSheet("#top_text_box { background-color: #F00000 }")
|
||||
|
||||
# CUSTOM PARAMETERS
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.user_name = my_name
|
||||
self.user_description = my_description
|
||||
self.user_status = "online"
|
||||
self.user_image = image_path
|
||||
self.icon_settings = icon_settings
|
||||
self._status_color = "#46b946"
|
||||
|
||||
# DRAW BASE FRAME
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.setup_ui()
|
||||
|
||||
# IMAGE FRAME EVENTS
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.user_overlay.mousePressEvent = self.mouse_press
|
||||
self.user_overlay.enterEvent = self.mouse_enter
|
||||
self.user_overlay.leaveEvent = self.mouse_leave
|
||||
|
||||
# SETUP STATUS BOX
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.status_box = _ChangeStatus(parent)
|
||||
self.status_box.move(left, top)
|
||||
self.status_box.focusOutEvent = self.lost_focus_status_box
|
||||
self.status_box.line_edit.focusOutEvent = self.lost_focus_line_edit
|
||||
self.status_box.line_edit.keyReleaseEvent = self.change_description
|
||||
self.status_box.hide()
|
||||
self.status_box.status.connect(self.change_status)
|
||||
|
||||
# CHANGE USER STATUS
|
||||
# Change when is connected with status signal
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def change_status(self, status):
|
||||
# CHANGE STATUS
|
||||
if status == "online":
|
||||
self._status_color = "#46b946"
|
||||
self.repaint()
|
||||
elif status == "idle":
|
||||
self._status_color = "#ff9955"
|
||||
self.repaint()
|
||||
elif status == "busy":
|
||||
self._status_color = "#a02c2c"
|
||||
self.repaint()
|
||||
elif status == "invisible":
|
||||
self._status_color = "#808080"
|
||||
self.repaint()
|
||||
# EMIT SIGNAL
|
||||
self.status.emit(status)
|
||||
|
||||
# CHANGE TEXT DESCRIPTION
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def change_description(self, event):
|
||||
if event.key() == Qt.Key_Return or event.key() == Qt.Key_Enter:
|
||||
self.label_description.setText(self.status_box.line_edit.text())
|
||||
self.status_box.line_edit.setText("")
|
||||
self.status_box.hide()
|
||||
|
||||
# SHO HIDE DIALOP POPUP
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
# HIDE LINE EDIT WHEN LOST FOCUS
|
||||
def lost_focus_status_box(self, event):
|
||||
if not self.status_box.line_edit.hasFocus():
|
||||
self.status_box.hide()
|
||||
self.status_box.line_edit.setText("")
|
||||
|
||||
# HIDE WHEN LOST FOCUS
|
||||
def lost_focus_line_edit(self, event):
|
||||
if not self.status_box.hasFocus():
|
||||
self.status_box.hide()
|
||||
self.status_box.line_edit.setText("")
|
||||
|
||||
# OPEN STATUS BOX POPUP
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def mouse_press(self, event):
|
||||
if self.status_box.isVisible():
|
||||
self.status_box.hide()
|
||||
self.status_box.line_edit.setText("")
|
||||
else:
|
||||
self.status_box.show()
|
||||
self.status_box.line_edit.setFocus()
|
||||
|
||||
# SHOW ICON
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def mouse_enter(self, event):
|
||||
self.user_overlay.setPixmap(self.icon_settings)
|
||||
|
||||
# HIDE ICON
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def mouse_leave(self, event):
|
||||
self.user_overlay.setPixmap(None)
|
||||
|
||||
# SETUP WIDGETS
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def setup_ui(self):
|
||||
# LAYOUT AND BORDER
|
||||
self.layout = QVBoxLayout(self)
|
||||
self.layout.setContentsMargins(10,10,10,0)
|
||||
self.border = QFrame(self)
|
||||
self.layout.addWidget(self.border)
|
||||
|
||||
# FRAME IMAGE
|
||||
self.user_overlay = QLabel(self.border)
|
||||
self.user_overlay.setGeometry(0, 5, 40, 40)
|
||||
self.user_overlay.setCursor(QCursor(Qt.PointingHandCursor))
|
||||
self.user_overlay.setAlignment(Qt.AlignCenter)
|
||||
opacity = QGraphicsOpacityEffect(self)
|
||||
opacity.setOpacity(0.75)
|
||||
self.user_overlay.setGraphicsEffect(opacity)
|
||||
|
||||
# FRAME TEXT
|
||||
self.text_frame = QFrame(self.border)
|
||||
self.text_frame.setGeometry(50, 0, 170, 50)
|
||||
|
||||
# USER NAME
|
||||
self.label_user = QLabel(self.text_frame)
|
||||
self.label_user.setGeometry(0, 8, self.text_frame.width(), 20)
|
||||
self.label_user.setAlignment(Qt.AlignVCenter)
|
||||
self.label_user.setText(self.user_name.capitalize())
|
||||
self.label_user.setStyleSheet("color: #bdff00; font: 700 10pt 'Segoe UI';")
|
||||
|
||||
# USER STATUS
|
||||
self.label_description = QLabel(self.text_frame)
|
||||
self.label_description.setGeometry(0, 22, self.text_frame.width(), 18)
|
||||
self.label_description.setAlignment(Qt.AlignVCenter)
|
||||
self.label_description.setText(self.user_description)
|
||||
self.label_description.setStyleSheet("color: #A6A6A6; font: 9pt 'Segoe UI';")
|
||||
|
||||
# PAINT USER IMAGE EVENTS
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def paintEvent(self, event):
|
||||
# PAINTER USER IMAGE
|
||||
painter = QPainter()
|
||||
painter.begin(self)
|
||||
painter.setRenderHint(QPainter.Antialiasing)
|
||||
|
||||
# RECT
|
||||
rect = QRect(10, 15, 40, 40)
|
||||
|
||||
# CIRCLE
|
||||
painter.setPen(Qt.NoPen)
|
||||
painter.setBrush(QBrush(QColor("#000000")))
|
||||
painter.drawEllipse(rect)
|
||||
|
||||
# DRAW USER IMAGE
|
||||
self.draw_user_image(painter, self.user_image, rect)
|
||||
|
||||
# PAINT END
|
||||
painter.end()
|
||||
|
||||
# DRAW USER IMAGE
|
||||
self.draw_status(self.user_image, rect)
|
||||
|
||||
# DRAW USER IMAGE
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def draw_user_image(self, qp, image, rect):
|
||||
user_image = QImage(image)
|
||||
path = QPainterPath()
|
||||
path.addEllipse(rect)
|
||||
qp.setClipPath(path)
|
||||
qp.drawImage(rect, user_image)
|
||||
|
||||
# DRAW STATUS
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def draw_status(self, status, rect):
|
||||
painter = QPainter()
|
||||
painter.begin(self)
|
||||
painter.setRenderHint(QPainter.Antialiasing)
|
||||
|
||||
# PEN
|
||||
pen = QPen()
|
||||
pen.setWidth(3)
|
||||
pen.setColor(QColor("#151617"))
|
||||
painter.setPen(pen)
|
||||
|
||||
# BRUSH/STATUS COLOR
|
||||
painter.setBrush(QBrush(QColor(self._status_color)))
|
||||
|
||||
# DRAW
|
||||
painter.drawEllipse(rect.x() + 27, rect.y() + 27, 13, 13)
|
||||
painter.end()
|
||||
|
||||
# SET STYLE TO POPUP
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
style = """
|
||||
/* QFrame */
|
||||
QFrame {
|
||||
background: #333436; border-radius: 10px;
|
||||
}
|
||||
/* Search Message */
|
||||
.QLineEdit {
|
||||
border: 2px solid rgb(47, 48, 50);
|
||||
border-radius: 15px;
|
||||
background-color: rgb(47, 48, 50);
|
||||
color: rgb(121, 121, 121);
|
||||
padding-left: 10px;
|
||||
padding-right: 10px;
|
||||
}
|
||||
.QLineEdit:hover {
|
||||
color: rgb(230, 230, 230);
|
||||
border: 2px solid rgb(62, 63, 66);
|
||||
}
|
||||
.QLineEdit:focus {
|
||||
color: rgb(230, 230, 230);
|
||||
border: 2px solid rgb(53, 54, 56);
|
||||
background-color: rgb(14, 14, 15);
|
||||
}
|
||||
/* QPushButton */
|
||||
.QPushButton{
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
border-radius: 10px;
|
||||
background-repeat: no-repeat;
|
||||
background-position: left center;
|
||||
text-align: left;
|
||||
color: #999999;
|
||||
padding-left: 38px;
|
||||
}
|
||||
.QPushButton:hover{
|
||||
background-color: #151617;
|
||||
color: #CCCCCC;
|
||||
}
|
||||
|
||||
"""
|
||||
# CHAN STATUS POPUP
|
||||
# # ///////////////////////////////////////////////////////////////
|
||||
class _ChangeStatus(QFrame):
|
||||
status = Signal(str)
|
||||
def __init__(self, parent):
|
||||
QFrame.__init__(self)
|
||||
|
||||
# SETUP
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.setFixedSize(230, 205)
|
||||
self.setStyleSheet(style)
|
||||
self.setParent(parent)
|
||||
|
||||
# LAYOUT AND BORDER
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.layout = QVBoxLayout(self)
|
||||
self.layout.setContentsMargins(10,10,10,10)
|
||||
self.border = QFrame(self)
|
||||
self.layout.addWidget(self.border)
|
||||
|
||||
# LINEEDIT AND BTNS BOX
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.layout_content = QVBoxLayout(self.border)
|
||||
self.layout_content.setContentsMargins(0,0,0,0)
|
||||
self.layout_content.setSpacing(1)
|
||||
|
||||
# CHANGE DESCRIPTION
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.line_edit = QLineEdit()
|
||||
self.line_edit.setMinimumHeight(30)
|
||||
self.line_edit.setPlaceholderText("Write what you are doing...")
|
||||
|
||||
# TOP LABEL
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.label = QLabel("Change status:")
|
||||
self.label.setStyleSheet("padding-top: 5px; padding-bottom: 5px; color: rgb(121, 121, 121);")
|
||||
|
||||
# BTN ONLINE
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.btn_online = QPushButton()
|
||||
self.btn_online.setText("Online")
|
||||
self.btn_online.setMinimumHeight(30)
|
||||
self.btn_online.setStyleSheet("background-image: url(:/icons_svg/images/icons_svg/icon_online.svg)")
|
||||
self.btn_online.clicked.connect(lambda: self.send_signal("online"))
|
||||
self.btn_online.setCursor(Qt.PointingHandCursor)
|
||||
|
||||
# BTNL ILDE
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.btn_idle = QPushButton()
|
||||
self.btn_idle.setText("Idle")
|
||||
self.btn_idle.setMinimumHeight(30)
|
||||
self.btn_idle.setStyleSheet("background-image: url(:/icons_svg/images/icons_svg/icon_idle.svg)")
|
||||
self.btn_idle.clicked.connect(lambda: self.send_signal("idle"))
|
||||
self.btn_idle.setCursor(Qt.PointingHandCursor)
|
||||
|
||||
# BTN BUSE
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.btn_busy = QPushButton()
|
||||
self.btn_busy.setText("Do not disturb")
|
||||
self.btn_busy.setMinimumHeight(30)
|
||||
self.btn_busy.setStyleSheet("background-image: url(:/icons_svg/images/icons_svg/icon_busy.svg)")
|
||||
self.btn_busy.clicked.connect(lambda: self.send_signal("busy"))
|
||||
self.btn_busy.setCursor(Qt.PointingHandCursor)
|
||||
|
||||
# BTN INVISIBLE
|
||||
self.btn_invisible = QPushButton()
|
||||
self.btn_invisible.setText("Invisible")
|
||||
self.btn_invisible.setMinimumHeight(30)
|
||||
self.btn_invisible.setStyleSheet("background-image: url(:/icons_svg/images/icons_svg/icon_invisible.svg)")
|
||||
self.btn_invisible.clicked.connect(lambda: self.send_signal("invisible"))
|
||||
self.btn_invisible.setCursor(Qt.PointingHandCursor)
|
||||
|
||||
# ADD WIDGETS TO LAYOUT
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.layout_content.addWidget(self.line_edit)
|
||||
self.layout_content.addWidget(self.label)
|
||||
self.layout_content.addWidget(self.btn_online)
|
||||
self.layout_content.addWidget(self.btn_idle)
|
||||
self.layout_content.addWidget(self.btn_busy)
|
||||
self.layout_content.addWidget(self.btn_invisible)
|
||||
|
||||
# SET DROP SHADOW
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.shadow = QGraphicsDropShadowEffect(self)
|
||||
self.shadow.setBlurRadius(15)
|
||||
self.shadow.setXOffset(0)
|
||||
self.shadow.setYOffset(0)
|
||||
self.shadow.setColor(QColor(0, 0, 0, 160))
|
||||
self.setGraphicsEffect(self.shadow)
|
||||
|
||||
# SEND SIGNAL TO TOP USER WIDGET
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def send_signal(self, status):
|
||||
self.status.emit(status)
|
||||
110
app/uis/chat/message.py
Normal file
@@ -0,0 +1,110 @@
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
#
|
||||
# BY: WANDERSON M.PIMENTA
|
||||
# PROJECT MADE WITH: Qt Designer and PySide6
|
||||
# V: 1.0.0
|
||||
#
|
||||
# This project can be used freely for all uses, as long as they maintain the
|
||||
# respective credits only in the Python scripts, any information in the visual
|
||||
# interface (GUI) can be modified without any implication.
|
||||
#
|
||||
# There are limitations on Qt licenses if you want to use your products
|
||||
# commercially, I recommend reading them on the official website:
|
||||
# https://doc.qt.io/qtforpython/licenses.html
|
||||
#
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
|
||||
# DEFAULT PACKAGES
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
import os
|
||||
|
||||
# IMPORT / GUI, SETTINGS AND WIDGETS
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
# Packages
|
||||
from datetime import datetime
|
||||
from app.packages.pyside_or_pyqt import * # Qt
|
||||
|
||||
# GLOBALS
|
||||
send_by = None
|
||||
|
||||
# MAIN WINDOW
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
class Message(QWidget):
|
||||
def __init__(self, message, me_send):
|
||||
QWidget.__init__(self)
|
||||
global send_by
|
||||
send_by = me_send
|
||||
|
||||
self.setMinimumHeight(20)
|
||||
self.setup_ui()
|
||||
self.setFixedHeight(self.layout.sizeHint().height())
|
||||
|
||||
# SET MESSAGE
|
||||
self.message.setText(message)
|
||||
|
||||
# SET DATE TIME
|
||||
date_time = datetime.now()
|
||||
date_time_format = date_time.strftime("%m/%d/%Y %H:%M")
|
||||
self.data_message.setText(str(date_time_format))
|
||||
|
||||
def setup_ui(self):
|
||||
# LAYOUT
|
||||
self.layout = QHBoxLayout(self)
|
||||
self.layout.setContentsMargins(0,0,0,0)
|
||||
|
||||
# FRAME BG
|
||||
self.bg = QFrame()
|
||||
if send_by:
|
||||
self.bg.setStyleSheet("#bg {background-color: #0e0e0f; border-radius: 10px; margin-left: 150px; } #bg:hover { background-color: #252628; }")
|
||||
else:
|
||||
self.bg.setStyleSheet("#bg {background-color: #28282b; border-radius: 10px; margin-right: 150px; } #bg:hover { background-color: #252628; }")
|
||||
self.bg.setObjectName("bg")
|
||||
|
||||
# FRAME BG
|
||||
self.btn = QPushButton()
|
||||
self.btn.setMinimumSize(40, 40)
|
||||
self.btn.setMaximumSize(40, 40)
|
||||
self.btn.setStyleSheet("""
|
||||
QPushButton {
|
||||
background-color: transparent;
|
||||
border-radius: 20px;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
background-image: url(:/icons_svg/images/icons_svg/icon_more_options.svg);
|
||||
}
|
||||
QPushButton:hover {
|
||||
background-color: rgb(61, 62, 65);
|
||||
}
|
||||
QPushButton:pressed {
|
||||
background-color: rgb(16, 17, 18);
|
||||
}
|
||||
""")
|
||||
|
||||
if send_by:
|
||||
self.layout.addWidget(self.bg)
|
||||
self.layout.addWidget(self.btn)
|
||||
else:
|
||||
self.layout.addWidget(self.btn)
|
||||
self.layout.addWidget(self.bg)
|
||||
|
||||
# LAYOUT INSIDE
|
||||
self.layout_inside = QVBoxLayout(self.bg)
|
||||
self.layout.setContentsMargins(10,10,10,10)
|
||||
|
||||
# LABEL MESSAGE
|
||||
self.message = QLabel()
|
||||
self.message.setText("message test")
|
||||
self.message.setStyleSheet("font: 500 11pt 'Segoe UI'")
|
||||
self.message.setTextInteractionFlags(Qt.TextSelectableByMouse|Qt.TextSelectableByKeyboard)
|
||||
|
||||
# LABEL MESSAGE
|
||||
self.data_message = QLabel()
|
||||
self.data_message.setText("date")
|
||||
self.data_message.setStyleSheet("font: 8pt 'Segoe UI'; color: #4c5154")
|
||||
if send_by:
|
||||
self.data_message.setAlignment(Qt.AlignRight)
|
||||
else:
|
||||
self.data_message.setAlignment(Qt.AlignLeft)
|
||||
|
||||
self.layout_inside.addWidget(self.message)
|
||||
self.layout_inside.addWidget(self.data_message)
|
||||
109
app/uis/chat/page_messages.py
Normal file
@@ -0,0 +1,109 @@
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
#
|
||||
# BY: WANDERSON M.PIMENTA
|
||||
# PROJECT MADE WITH: Qt Designer and PySide6
|
||||
# V: 1.0.0
|
||||
#
|
||||
# This project can be used freely for all uses, as long as they maintain the
|
||||
# respective credits only in the Python scripts, any information in the visual
|
||||
# interface (GUI) can be modified without any implication.
|
||||
#
|
||||
# There are limitations on Qt licenses if you want to use your products
|
||||
# commercially, I recommend reading them on the official website:
|
||||
# https://doc.qt.io/qtforpython/licenses.html
|
||||
#
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
|
||||
# DEFAULT PACKAGES
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
import os
|
||||
import random
|
||||
|
||||
# IMPORT / GUI, SETTINGS AND WIDGETS
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
# Packages
|
||||
from app.packages.pyside_or_pyqt import * # Qt
|
||||
from app.packages.widgets import * # Widgets
|
||||
# GUI
|
||||
from app.uis.chat.ui_page_messages import Ui_chat_page # MainWindow
|
||||
from app.uis.chat.message import Message # MainWindow
|
||||
|
||||
|
||||
# MAIN WINDOW
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
class Chat(QWidget):
|
||||
def __init__(
|
||||
self,
|
||||
user_image,
|
||||
user_name,
|
||||
user_description,
|
||||
user_id,
|
||||
my_name,
|
||||
):
|
||||
QWidget.__init__(self)
|
||||
|
||||
self.page = Ui_chat_page()
|
||||
self.page.setupUi(self)
|
||||
|
||||
# UPDATE INFO
|
||||
self.page.user_image.setStyleSheet("#user_image { background-image: url(\"" + os.path.normpath(user_image).replace("\\", "/") + "\") }")
|
||||
self.page.user_name.setText(user_name)
|
||||
self.page.user_description.setText(user_description)
|
||||
|
||||
# CHANGE PLACEHOLDER TEXT
|
||||
format_user_name = user_name.replace(" ", "_").replace("-", "_")
|
||||
format_user_name = format_user_name.lower()
|
||||
self.page.line_edit_message.setPlaceholderText(f"Message #{str(format_user_name).lower()}")
|
||||
|
||||
# ENTER / RETURN PRESSED
|
||||
self.page.line_edit_message.keyReleaseEvent = self.enter_return_release
|
||||
|
||||
# ENTER / RETURN PRESSED
|
||||
self.page.btn_send_message.clicked.connect(self.send_message)
|
||||
|
||||
# MESSAGES
|
||||
self.messages = [
|
||||
f"Hi {my_name.capitalize()}, how are you?",
|
||||
f"Hello {my_name.capitalize()}, how are you today?",
|
||||
f"{my_name.capitalize()}, do you know if it is going to rain today?",
|
||||
f"{my_name.capitalize()}, how is your day?",
|
||||
f"{my_name.capitalize()}, do you remember that you owe me $100? Humm..."
|
||||
]
|
||||
|
||||
# SEND USER MESSAGE
|
||||
self.send_by_friend()
|
||||
|
||||
# ENTER / RETURN SEND MESSAGE
|
||||
def enter_return_release(self, event):
|
||||
if event.key() == Qt.Key_Return or event.key() == Qt.Key_Enter:
|
||||
self.send_message()
|
||||
|
||||
# SEND MESSAGE
|
||||
def send_message(self):
|
||||
if self.page.line_edit_message.text() != "":
|
||||
self.message = Message(self.page.line_edit_message.text(), True)
|
||||
self.page.chat_messages_layout.addWidget(self.message, Qt.AlignCenter, Qt.AlignBottom)
|
||||
self.page.line_edit_message.setText("")
|
||||
|
||||
# SCROLL TO END
|
||||
QTimer.singleShot(10, lambda: self.page.messages_frame.setFixedHeight(self.page.chat_messages_layout.sizeHint().height()))
|
||||
QTimer.singleShot(15, lambda: self.scroll_to_end())
|
||||
|
||||
# SEND USER MESSAGE
|
||||
QTimer.singleShot(1000, lambda: self.send_by_friend())
|
||||
|
||||
# SEND MESSAGE BY FRIEND
|
||||
def send_by_friend(self):
|
||||
self.message = Message(random.choice(self.messages), False)
|
||||
self.page.chat_messages_layout.addWidget(self.message, Qt.AlignCenter, Qt.AlignBottom)
|
||||
self.page.line_edit_message.setText("")
|
||||
|
||||
# SCROLL TO END
|
||||
QTimer.singleShot(10, lambda: self.page.messages_frame.setFixedHeight(self.page.chat_messages_layout.sizeHint().height()))
|
||||
QTimer.singleShot(15, lambda: self.scroll_to_end())
|
||||
|
||||
|
||||
def scroll_to_end(self):
|
||||
# SCROLL TO END
|
||||
self.scroll_bar = self.page.chat_messages.verticalScrollBar()
|
||||
self.scroll_bar.setValue(self.scroll_bar.maximum())
|
||||
290
app/uis/chat/ui_page_messages.py
Normal file
@@ -0,0 +1,290 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
################################################################################
|
||||
## Form generated from reading UI file 'page_messagesEjpDxJ.ui'
|
||||
##
|
||||
## Created by: Qt User Interface Compiler version 6.0.2
|
||||
##
|
||||
## WARNING! All changes made in this file will be lost when recompiling UI file!
|
||||
################################################################################
|
||||
|
||||
from PySide6.QtCore import *
|
||||
from PySide6.QtGui import *
|
||||
from PySide6.QtWidgets import *
|
||||
|
||||
class Ui_chat_page(object):
|
||||
def setupUi(self, chat_page):
|
||||
if not chat_page.objectName():
|
||||
chat_page.setObjectName(u"chat_page")
|
||||
chat_page.resize(880, 616)
|
||||
chat_page.setStyleSheet(u"QWidget { color: rgb(165, 165, 165); }\n"
|
||||
"#chat_page{\n"
|
||||
" background-color: rgb(0, 0, 0); \n"
|
||||
"}\n"
|
||||
"/* TOP */\n"
|
||||
"#top {\n"
|
||||
" background-color: rgb(30, 32, 33);\n"
|
||||
" border-radius: 10px;\n"
|
||||
"}\n"
|
||||
"#user_name { \n"
|
||||
" color: rgb(179, 179, 179);\n"
|
||||
" font: 600 12pt \"Segoe UI\";\n"
|
||||
"}\n"
|
||||
"#user_image {\n"
|
||||
" border: 1px solid rgb(30, 32, 33);\n"
|
||||
" background-color: rgb(47, 48, 50);\n"
|
||||
" border-radius: 20px;\n"
|
||||
"}\n"
|
||||
"#top QPushButton {\n"
|
||||
" background-color: rgb(47, 48, 50);\n"
|
||||
" border-radius: 20px;\n"
|
||||
" background-repeat: no-repeat;\n"
|
||||
" background-position: center;\n"
|
||||
"}\n"
|
||||
"#top QPushButton:hover {\n"
|
||||
" background-color: rgb(61, 62, 65);\n"
|
||||
"}\n"
|
||||
"#top QPushButton:pressed {\n"
|
||||
" background-color: rgb(16, 17, 18);\n"
|
||||
"}\n"
|
||||
"#btn_attachment_top { \n"
|
||||
" background-image: url(:/icons_svg/images/icons_svg/icon_attachment.svg);\n"
|
||||
"}\n"
|
||||
"#btn_more_top { \n"
|
||||
" background-image: url(:/icons_svg/images/icons_svg/icon_more_options.svg);\n"
|
||||
"}\n"
|
||||
"/* BOTTOM */\n"
|
||||
"#bottom QPushButton {\n"
|
||||
" background-color: rgb(47, 4"
|
||||
"8, 50);\n"
|
||||
" border-radius: 20px;\n"
|
||||
" background-repeat: no-repeat;\n"
|
||||
" background-position: center;\n"
|
||||
"}\n"
|
||||
"#bottom QPushButton:hover {\n"
|
||||
" background-color: rgb(61, 62, 65);\n"
|
||||
"}\n"
|
||||
"#bottom QPushButton:pressed {\n"
|
||||
" background-color: rgb(16, 17, 18);\n"
|
||||
"}\n"
|
||||
"#send_message_frame { \n"
|
||||
" background-color: rgb(47, 48, 50);\n"
|
||||
" border-radius: 20px;\n"
|
||||
"}\n"
|
||||
"#send_message_frame QPushButton {\n"
|
||||
" background-color: rgb(76, 77, 80);\n"
|
||||
" border-radius: 15px;\n"
|
||||
" background-repeat: no-repeat;\n"
|
||||
" background-position: center;\n"
|
||||
"}\n"
|
||||
"#send_message_frame QPushButton:hover {\n"
|
||||
" background-color: rgb(81, 82, 86);\n"
|
||||
"}\n"
|
||||
"#send_message_frame QPushButton:pressed {\n"
|
||||
" background-color: rgb(16, 17, 18);\n"
|
||||
"}\n"
|
||||
"#line_edit_message {\n"
|
||||
" background-color: transparent;\n"
|
||||
" selection-color: rgb(255, 255, 255);\n"
|
||||
" selection-background-color: rgb(149, 199, 0);\n"
|
||||
" border: none;\n"
|
||||
" padding-left: 15px;\n"
|
||||
" padding-right: 15px;\n"
|
||||
" background-repeat: none;\n"
|
||||
" background-position: left center;\n"
|
||||
" "
|
||||
"font: 10pt \"Segoe UI\";\n"
|
||||
" color: rgb(94, 96, 100);\n"
|
||||
"}\n"
|
||||
"#line_edit_message:focus {\n"
|
||||
" color: rgb(165, 165, 165);\n"
|
||||
"}\n"
|
||||
"#btn_emoticon{\n"
|
||||
" background-image: url(:/icons_svg/images/icons_svg/icon_emoticons.svg);\n"
|
||||
"}\n"
|
||||
"#btn_send_message{ \n"
|
||||
" background-image: url(:/icons_svg/images/icons_svg/icon_send.svg);\n"
|
||||
"}\n"
|
||||
"#btn_attachment_bottom{ \n"
|
||||
" \n"
|
||||
" background-image: url(:/icons_svg/images/icons_svg/icon_more_options.svg);\n"
|
||||
"}")
|
||||
self.verticalLayout = QVBoxLayout(chat_page)
|
||||
self.verticalLayout.setObjectName(u"verticalLayout")
|
||||
self.top = QFrame(chat_page)
|
||||
self.top.setObjectName(u"top")
|
||||
self.top.setMinimumSize(QSize(0, 60))
|
||||
self.top.setMaximumSize(QSize(16777215, 60))
|
||||
self.top.setFrameShape(QFrame.NoFrame)
|
||||
self.top.setFrameShadow(QFrame.Raised)
|
||||
self.horizontalLayout = QHBoxLayout(self.top)
|
||||
self.horizontalLayout.setObjectName(u"horizontalLayout")
|
||||
self.user_image = QLabel(self.top)
|
||||
self.user_image.setObjectName(u"user_image")
|
||||
self.user_image.setMinimumSize(QSize(40, 40))
|
||||
self.user_image.setMaximumSize(QSize(40, 40))
|
||||
self.user_image.setAlignment(Qt.AlignCenter)
|
||||
|
||||
self.horizontalLayout.addWidget(self.user_image)
|
||||
|
||||
self.user_information_frame = QFrame(self.top)
|
||||
self.user_information_frame.setObjectName(u"user_information_frame")
|
||||
self.user_information_frame.setFrameShape(QFrame.NoFrame)
|
||||
self.user_information_frame.setFrameShadow(QFrame.Raised)
|
||||
self.verticalLayout_2 = QVBoxLayout(self.user_information_frame)
|
||||
self.verticalLayout_2.setSpacing(0)
|
||||
self.verticalLayout_2.setObjectName(u"verticalLayout_2")
|
||||
self.verticalLayout_2.setContentsMargins(5, 5, 5, 5)
|
||||
self.user_name = QLabel(self.user_information_frame)
|
||||
self.user_name.setObjectName(u"user_name")
|
||||
self.user_name.setMinimumSize(QSize(0, 22))
|
||||
self.user_name.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignTop)
|
||||
|
||||
self.verticalLayout_2.addWidget(self.user_name)
|
||||
|
||||
self.user_description = QLabel(self.user_information_frame)
|
||||
self.user_description.setObjectName(u"user_description")
|
||||
self.user_description.setStyleSheet(u"background: transparent;")
|
||||
|
||||
self.verticalLayout_2.addWidget(self.user_description)
|
||||
|
||||
|
||||
self.horizontalLayout.addWidget(self.user_information_frame)
|
||||
|
||||
self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
|
||||
|
||||
self.horizontalLayout.addItem(self.horizontalSpacer)
|
||||
|
||||
self.last_time_connected = QLabel(self.top)
|
||||
self.last_time_connected.setObjectName(u"last_time_connected")
|
||||
|
||||
self.horizontalLayout.addWidget(self.last_time_connected)
|
||||
|
||||
self.btn_attachment_top = QPushButton(self.top)
|
||||
self.btn_attachment_top.setObjectName(u"btn_attachment_top")
|
||||
self.btn_attachment_top.setMinimumSize(QSize(40, 40))
|
||||
self.btn_attachment_top.setMaximumSize(QSize(40, 40))
|
||||
self.btn_attachment_top.setCursor(QCursor(Qt.PointingHandCursor))
|
||||
|
||||
self.horizontalLayout.addWidget(self.btn_attachment_top)
|
||||
|
||||
self.btn_more_top = QPushButton(self.top)
|
||||
self.btn_more_top.setObjectName(u"btn_more_top")
|
||||
self.btn_more_top.setMinimumSize(QSize(40, 40))
|
||||
self.btn_more_top.setMaximumSize(QSize(40, 40))
|
||||
self.btn_more_top.setCursor(QCursor(Qt.PointingHandCursor))
|
||||
|
||||
self.horizontalLayout.addWidget(self.btn_more_top)
|
||||
|
||||
|
||||
self.verticalLayout.addWidget(self.top)
|
||||
|
||||
self.chat_messages = QScrollArea(chat_page)
|
||||
self.chat_messages.setObjectName(u"chat_messages")
|
||||
self.chat_messages.setStyleSheet(u"background: transparent")
|
||||
self.chat_messages.setFrameShape(QFrame.NoFrame)
|
||||
self.chat_messages.setFrameShadow(QFrame.Raised)
|
||||
self.chat_messages.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
|
||||
self.chat_messages.setWidgetResizable(True)
|
||||
self.chat_messages.setAlignment(Qt.AlignBottom|Qt.AlignLeading|Qt.AlignLeft)
|
||||
self.messages_widget = QWidget()
|
||||
self.messages_widget.setObjectName(u"messages_widget")
|
||||
self.messages_widget.setGeometry(QRect(0, 0, 862, 486))
|
||||
self.messages_widget.setStyleSheet(u"background: transparent")
|
||||
self.chat_layout = QVBoxLayout(self.messages_widget)
|
||||
self.chat_layout.setSpacing(0)
|
||||
self.chat_layout.setObjectName(u"chat_layout")
|
||||
self.chat_layout.setContentsMargins(0, 0, 0, 0)
|
||||
self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
|
||||
|
||||
self.chat_layout.addItem(self.verticalSpacer)
|
||||
|
||||
self.messages_frame = QFrame(self.messages_widget)
|
||||
self.messages_frame.setObjectName(u"messages_frame")
|
||||
self.messages_frame.setFrameShape(QFrame.NoFrame)
|
||||
self.messages_frame.setFrameShadow(QFrame.Raised)
|
||||
self.chat_messages_layout = QVBoxLayout(self.messages_frame)
|
||||
self.chat_messages_layout.setSpacing(0)
|
||||
self.chat_messages_layout.setObjectName(u"chat_messages_layout")
|
||||
self.chat_messages_layout.setContentsMargins(0, 0, 0, 0)
|
||||
|
||||
self.chat_layout.addWidget(self.messages_frame)
|
||||
|
||||
self.chat_messages.setWidget(self.messages_widget)
|
||||
|
||||
self.verticalLayout.addWidget(self.chat_messages)
|
||||
|
||||
self.bottom = QFrame(chat_page)
|
||||
self.bottom.setObjectName(u"bottom")
|
||||
self.bottom.setMinimumSize(QSize(0, 40))
|
||||
self.bottom.setMaximumSize(QSize(16777215, 40))
|
||||
self.bottom.setFrameShape(QFrame.NoFrame)
|
||||
self.bottom.setFrameShadow(QFrame.Raised)
|
||||
self.horizontalLayout_2 = QHBoxLayout(self.bottom)
|
||||
self.horizontalLayout_2.setSpacing(10)
|
||||
self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
|
||||
self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
|
||||
self.send_message_frame = QFrame(self.bottom)
|
||||
self.send_message_frame.setObjectName(u"send_message_frame")
|
||||
self.send_message_frame.setFrameShape(QFrame.StyledPanel)
|
||||
self.send_message_frame.setFrameShadow(QFrame.Raised)
|
||||
self.horizontalLayout_3 = QHBoxLayout(self.send_message_frame)
|
||||
self.horizontalLayout_3.setSpacing(0)
|
||||
self.horizontalLayout_3.setObjectName(u"horizontalLayout_3")
|
||||
self.horizontalLayout_3.setContentsMargins(5, 0, 5, 0)
|
||||
self.btn_emoticon = QPushButton(self.send_message_frame)
|
||||
self.btn_emoticon.setObjectName(u"btn_emoticon")
|
||||
self.btn_emoticon.setMinimumSize(QSize(30, 30))
|
||||
self.btn_emoticon.setMaximumSize(QSize(30, 30))
|
||||
self.btn_emoticon.setCursor(QCursor(Qt.PointingHandCursor))
|
||||
|
||||
self.horizontalLayout_3.addWidget(self.btn_emoticon)
|
||||
|
||||
self.line_edit_message = QLineEdit(self.send_message_frame)
|
||||
self.line_edit_message.setObjectName(u"line_edit_message")
|
||||
self.line_edit_message.setMinimumSize(QSize(0, 40))
|
||||
|
||||
self.horizontalLayout_3.addWidget(self.line_edit_message)
|
||||
|
||||
self.btn_send_message = QPushButton(self.send_message_frame)
|
||||
self.btn_send_message.setObjectName(u"btn_send_message")
|
||||
self.btn_send_message.setMinimumSize(QSize(30, 30))
|
||||
self.btn_send_message.setMaximumSize(QSize(30, 30))
|
||||
self.btn_send_message.setCursor(QCursor(Qt.PointingHandCursor))
|
||||
|
||||
self.horizontalLayout_3.addWidget(self.btn_send_message)
|
||||
|
||||
|
||||
self.horizontalLayout_2.addWidget(self.send_message_frame)
|
||||
|
||||
self.btn_attachment_bottom = QPushButton(self.bottom)
|
||||
self.btn_attachment_bottom.setObjectName(u"btn_attachment_bottom")
|
||||
self.btn_attachment_bottom.setMinimumSize(QSize(40, 40))
|
||||
self.btn_attachment_bottom.setMaximumSize(QSize(40, 40))
|
||||
self.btn_attachment_bottom.setCursor(QCursor(Qt.PointingHandCursor))
|
||||
|
||||
self.horizontalLayout_2.addWidget(self.btn_attachment_bottom)
|
||||
|
||||
|
||||
self.verticalLayout.addWidget(self.bottom)
|
||||
|
||||
|
||||
self.retranslateUi(chat_page)
|
||||
|
||||
QMetaObject.connectSlotsByName(chat_page)
|
||||
# setupUi
|
||||
|
||||
def retranslateUi(self, chat_page):
|
||||
chat_page.setWindowTitle(QCoreApplication.translate("chat_page", u"Form", None))
|
||||
self.user_image.setText("")
|
||||
self.user_name.setText(QCoreApplication.translate("chat_page", u"User name", None))
|
||||
self.user_description.setText(QCoreApplication.translate("chat_page", u"User description", None))
|
||||
self.last_time_connected.setText(QCoreApplication.translate("chat_page", u"connected last time 24h ago", None))
|
||||
self.btn_attachment_top.setText("")
|
||||
self.btn_more_top.setText("")
|
||||
self.btn_emoticon.setText("")
|
||||
self.line_edit_message.setPlaceholderText(QCoreApplication.translate("chat_page", u"Message #user", None))
|
||||
self.btn_send_message.setText("")
|
||||
self.btn_attachment_bottom.setText("")
|
||||
# retranslateUi
|
||||
|
||||
134
app/uis/login/ui_login.py
Normal file
@@ -0,0 +1,134 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
################################################################################
|
||||
## Form generated from reading UI file 'loginexbKtc.ui'
|
||||
##
|
||||
## Created by: Qt User Interface Compiler version 6.0.2
|
||||
##
|
||||
## WARNING! All changes made in this file will be lost when recompiling UI file!
|
||||
################################################################################
|
||||
|
||||
from PySide6.QtCore import *
|
||||
from PySide6.QtGui import *
|
||||
from PySide6.QtWidgets import *
|
||||
|
||||
class Ui_Login(object):
|
||||
def setupUi(self, Login):
|
||||
if not Login.objectName():
|
||||
Login.setObjectName(u"Login")
|
||||
Login.resize(300, 420)
|
||||
Login.setMinimumSize(QSize(300, 420))
|
||||
Login.setMaximumSize(QSize(300, 420))
|
||||
Login.setStyleSheet(u"#bg {\n"
|
||||
" background-color: rgb(0, 0, 0);\n"
|
||||
" border-radius: 10px;\n"
|
||||
"}\n"
|
||||
"QLabel {\n"
|
||||
" color: rgb(121, 121, 121);\n"
|
||||
" padding-left: 10px;\n"
|
||||
" padding-top: 20px;\n"
|
||||
"}\n"
|
||||
".QLineEdit {\n"
|
||||
" border: 3px solid rgb(47, 48, 50);\n"
|
||||
" border-radius: 15px;\n"
|
||||
" background-color: rgb(47, 48, 50);\n"
|
||||
" color: rgb(121, 121, 121);\n"
|
||||
" padding-left: 10px;\n"
|
||||
" padding-right: 10px;\n"
|
||||
" background-repeat: none;\n"
|
||||
" background-position: left center;\n"
|
||||
"}\n"
|
||||
".QLineEdit:hover {\n"
|
||||
" color: rgb(230, 230, 230);\n"
|
||||
" border: 3px solid rgb(62, 63, 66);\n"
|
||||
"}\n"
|
||||
".QLineEdit:focus {\n"
|
||||
" color: rgb(230, 230, 230);\n"
|
||||
" border: 3px solid rgb(189, 255, 0);\n"
|
||||
" background-color: rgb(14, 14, 15);\n"
|
||||
"}")
|
||||
self.centralwidget = QWidget(Login)
|
||||
self.centralwidget.setObjectName(u"centralwidget")
|
||||
self.verticalLayout = QVBoxLayout(self.centralwidget)
|
||||
self.verticalLayout.setSpacing(0)
|
||||
self.verticalLayout.setObjectName(u"verticalLayout")
|
||||
self.verticalLayout.setContentsMargins(10, 10, 10, 10)
|
||||
self.bg = QFrame(self.centralwidget)
|
||||
self.bg.setObjectName(u"bg")
|
||||
self.bg.setFrameShape(QFrame.NoFrame)
|
||||
self.bg.setFrameShadow(QFrame.Raised)
|
||||
self.frame_widgets = QFrame(self.bg)
|
||||
self.frame_widgets.setObjectName(u"frame_widgets")
|
||||
self.frame_widgets.setGeometry(QRect(0, 70, 280, 720))
|
||||
self.frame_widgets.setMinimumSize(QSize(280, 720))
|
||||
self.frame_widgets.setFrameShape(QFrame.NoFrame)
|
||||
self.frame_widgets.setFrameShadow(QFrame.Raised)
|
||||
self.verticalLayout_2 = QVBoxLayout(self.frame_widgets)
|
||||
self.verticalLayout_2.setSpacing(5)
|
||||
self.verticalLayout_2.setObjectName(u"verticalLayout_2")
|
||||
self.verticalLayout_2.setContentsMargins(20, 10, 20, 10)
|
||||
self.preloader = QFrame(self.frame_widgets)
|
||||
self.preloader.setObjectName(u"preloader")
|
||||
self.preloader.setMinimumSize(QSize(240, 240))
|
||||
self.preloader.setMaximumSize(QSize(260, 260))
|
||||
self.preloader.setFrameShape(QFrame.NoFrame)
|
||||
self.preloader.setFrameShadow(QFrame.Raised)
|
||||
|
||||
self.verticalLayout_2.addWidget(self.preloader)
|
||||
|
||||
self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
|
||||
|
||||
self.verticalLayout_2.addItem(self.verticalSpacer)
|
||||
|
||||
self.logo = QFrame(self.frame_widgets)
|
||||
self.logo.setObjectName(u"logo")
|
||||
self.logo.setMinimumSize(QSize(0, 260))
|
||||
self.logo.setStyleSheet(u"#logo {\n"
|
||||
" border-radius: 10px;\n"
|
||||
" background-image: url(:/images_svg/images/images_svg/logo_home.svg);\n"
|
||||
" background-position: center;\n"
|
||||
" background-repeat: no-repeat;\n"
|
||||
"}")
|
||||
self.logo.setFrameShape(QFrame.NoFrame)
|
||||
self.logo.setFrameShadow(QFrame.Raised)
|
||||
|
||||
self.verticalLayout_2.addWidget(self.logo)
|
||||
|
||||
self.user_description = QLabel(self.frame_widgets)
|
||||
self.user_description.setObjectName(u"user_description")
|
||||
self.user_description.setStyleSheet(u"background: transparent;")
|
||||
|
||||
self.verticalLayout_2.addWidget(self.user_description)
|
||||
|
||||
self.username = QLineEdit(self.frame_widgets)
|
||||
self.username.setObjectName(u"username")
|
||||
self.username.setMinimumSize(QSize(0, 30))
|
||||
self.username.setMaximumSize(QSize(16777215, 40))
|
||||
|
||||
self.verticalLayout_2.addWidget(self.username)
|
||||
|
||||
self.password = QLineEdit(self.frame_widgets)
|
||||
self.password.setObjectName(u"password")
|
||||
self.password.setMinimumSize(QSize(0, 30))
|
||||
self.password.setMaximumSize(QSize(16777215, 40))
|
||||
self.password.setEchoMode(QLineEdit.Password)
|
||||
|
||||
self.verticalLayout_2.addWidget(self.password)
|
||||
|
||||
|
||||
self.verticalLayout.addWidget(self.bg)
|
||||
|
||||
Login.setCentralWidget(self.centralwidget)
|
||||
|
||||
self.retranslateUi(Login)
|
||||
|
||||
QMetaObject.connectSlotsByName(Login)
|
||||
# setupUi
|
||||
|
||||
def retranslateUi(self, Login):
|
||||
Login.setWindowTitle(QCoreApplication.translate("Login", u"Login. PyBlackBOX", None))
|
||||
self.user_description.setText(QCoreApplication.translate("Login", u"Login (pass: 123456):", None))
|
||||
self.username.setPlaceholderText(QCoreApplication.translate("Login", u"Username", None))
|
||||
self.password.setPlaceholderText(QCoreApplication.translate("Login", u"Password", None))
|
||||
# retranslateUi
|
||||
|
||||
6779
app/uis/main_window/resources_rc.py
Normal file
619
app/uis/main_window/ui_main.py
Normal file
@@ -0,0 +1,619 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
################################################################################
|
||||
## Form generated from reading UI file 'mainMcMyCG.ui'
|
||||
##
|
||||
## Created by: Qt User Interface Compiler version 6.0.2
|
||||
##
|
||||
## WARNING! All changes made in this file will be lost when recompiling UI file!
|
||||
################################################################################
|
||||
|
||||
from PySide6.QtCore import *
|
||||
from PySide6.QtGui import *
|
||||
from PySide6.QtWidgets import *
|
||||
|
||||
from . resources_rc import *
|
||||
|
||||
class Ui_MainWindow(object):
|
||||
def setupUi(self, MainWindow):
|
||||
if not MainWindow.objectName():
|
||||
MainWindow.setObjectName(u"MainWindow")
|
||||
MainWindow.resize(1200, 720)
|
||||
self.stylesheet = QWidget(MainWindow)
|
||||
self.stylesheet.setObjectName(u"stylesheet")
|
||||
self.stylesheet.setStyleSheet(u"/* DEFAULT */\n"
|
||||
"QWidget {\n"
|
||||
" font: 9pt \"Segoe UI\";\n"
|
||||
" color: rgb(230, 230, 230);\n"
|
||||
" selection-background-color: rgb(86, 115, 0);\n"
|
||||
"}\n"
|
||||
"/* Bg App */\n"
|
||||
"#bg_app { \n"
|
||||
" background-color: rgb(0, 0, 0);\n"
|
||||
" border: 2px solid rgb(30, 32, 33);\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"/* Left Menu */\n"
|
||||
"#left_menu {\n"
|
||||
" border-top-left-radius: 10px;\n"
|
||||
" border-bottom-left-radius: 10px;\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"/* Logo Top */\n"
|
||||
"#logo_top {\n"
|
||||
" background-image: url(:/images_svg/images/images_svg/logo_symbol_top.svg);\n"
|
||||
" background-position: center;\n"
|
||||
" background-repeat: no-repeat;\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"/* Buttons */\n"
|
||||
"#left_menu QPushButton {\n"
|
||||
" border: none; \n"
|
||||
" background-color: transparent;\n"
|
||||
" border-radius: 10px;\n"
|
||||
" background-repeat: none;\n"
|
||||
" background-position: center;\n"
|
||||
"}\n"
|
||||
"#left_menu QPushButton:hover {\n"
|
||||
" background-color: rgb(21, 22, 23);\n"
|
||||
"}\n"
|
||||
"#left_menu QPushButton:pressed {\n"
|
||||
" background-color: rgb(172, 229, 0);\n"
|
||||
"}\n"
|
||||
"#add_user_btn { \n"
|
||||
" background-image: url(:/icons_svg/images/icons_svg/ico"
|
||||
"n_add_user.svg);\n"
|
||||
"}\n"
|
||||
"#settings_btn { \n"
|
||||
" background-image: url(:/icons_svg/images/icons_svg/icon_settings.svg);\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"/* Left Messages */\n"
|
||||
"#left_messages {\n"
|
||||
" background-color: rgb(21, 22, 23);\n"
|
||||
" border: none;\n"
|
||||
" border-left: 3px solid rgb(30, 32, 33);\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"/* Top */\n"
|
||||
"#top_messages {\n"
|
||||
" border: none;\n"
|
||||
" border-bottom: 1px solid rgb(47, 48, 50);\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"/* Search Message */\n"
|
||||
"#search_sms_frame .QLineEdit {\n"
|
||||
" border: 2px solid rgb(47, 48, 50);\n"
|
||||
" border-radius: 15px;\n"
|
||||
" background-color: rgb(47, 48, 50);\n"
|
||||
" color: rgb(121, 121, 121);\n"
|
||||
" padding-left: 30px;\n"
|
||||
" padding-right: 10px;\n"
|
||||
" background-image: url(:/icons_svg/images/icons_svg/icon_search.svg);\n"
|
||||
" background-repeat: none;\n"
|
||||
" background-position: left center;\n"
|
||||
"}\n"
|
||||
"#search_sms_frame .QLineEdit:hover {\n"
|
||||
" color: rgb(230, 230, 230);\n"
|
||||
" border: 2px solid rgb(62, 63, 66);\n"
|
||||
"}\n"
|
||||
"#search_sms_frame .QLineEdit:focus {\n"
|
||||
" color: rgb(230, 230, 230);\n"
|
||||
" border: 2px solid rgb(53, 54"
|
||||
", 56);\n"
|
||||
" background-color: rgb(14, 14, 15);\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"/* Menus Scroll Area */\n"
|
||||
"#left_messages_scroll, #messages_scroll {\n"
|
||||
" background-color: transparent;\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"/* Bottom / Signal */\n"
|
||||
"#bottom_messages { \n"
|
||||
" background-color: rgb(30, 32, 33);\n"
|
||||
"}\n"
|
||||
"#signal_icon { \n"
|
||||
" background-image: url(:/icons_svg/images/icons_svg/icon_signal.svg);\n"
|
||||
" background-repeat: none;\n"
|
||||
" background-position: left center;\n"
|
||||
"}\n"
|
||||
"#label_top{ \n"
|
||||
" font: 800 10pt \"Segoe UI\";\n"
|
||||
" color: rgb(189, 255, 0);\n"
|
||||
"}\n"
|
||||
"#label_bottom { \n"
|
||||
" color: rgb(166, 166, 166);\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"/* Right Content */\n"
|
||||
"#right_content {\n"
|
||||
" border-top-right-radius: 10px;\n"
|
||||
" border-bottom-right-radius: 10px;\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"/* Top Bar */\n"
|
||||
"#top_bar {\n"
|
||||
" border-top-right-radius: 10px;\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"/* Title Bar */\n"
|
||||
"#title_bar {\n"
|
||||
" background-image: url(:/images_svg/images/images_svg/text_logo.svg);\n"
|
||||
" background-repeat: no-repeat;\n"
|
||||
" background-position: left center;\n"
|
||||
" border-left: 15px solid trans"
|
||||
"parent;\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"/* Top BTNs */\n"
|
||||
"#top_btns { }\n"
|
||||
"#top_btns .QPushButton { \n"
|
||||
" background-position: center;\n"
|
||||
" background-repeat: no-repeat;\n"
|
||||
" border: none;\n"
|
||||
" outline: none;\n"
|
||||
" border-radius: 8px;\n"
|
||||
" text-align: left;\n"
|
||||
"}\n"
|
||||
"#top_btns .QPushButton:hover { background-color: rgb(21, 22, 23); }\n"
|
||||
"#top_btns .QPushButton:pressed { background-color: rgb(172, 229, 0); }\n"
|
||||
"#top_btns #close_app_btn:hover { background-color: rgb(255, 0, 127); }\n"
|
||||
"#top_btns #close_app_btn:pressed { background-color: rgb(172, 229, 0); }\n"
|
||||
"\n"
|
||||
"/* Content / Pages */\n"
|
||||
"#app_pages {\n"
|
||||
" background-color: transparent;\n"
|
||||
"}\n"
|
||||
"/* /////////////////////////////////////////////////////////////////////////////////////////////////\n"
|
||||
"ScrollBars */\n"
|
||||
"QScrollBar:horizontal {\n"
|
||||
" border: none;\n"
|
||||
" background: rgb(52, 59, 72);\n"
|
||||
" height: 8px;\n"
|
||||
" margin: 0px 21px 0 21px;\n"
|
||||
" border-radius: 0px;\n"
|
||||
"}\n"
|
||||
"QScrollBar::handle:horizontal {\n"
|
||||
" background: rgb(47, 48, 50);\n"
|
||||
" min-widt"
|
||||
"h: 25px;\n"
|
||||
" border-radius: 4px\n"
|
||||
"}\n"
|
||||
"QScrollBar::add-line:horizontal {\n"
|
||||
" border: none;\n"
|
||||
" background: rgb(55, 63, 77);\n"
|
||||
" width: 20px;\n"
|
||||
" border-top-right-radius: 4px;\n"
|
||||
" border-bottom-right-radius: 4px;\n"
|
||||
" subcontrol-position: right;\n"
|
||||
" subcontrol-origin: margin;\n"
|
||||
"}\n"
|
||||
"QScrollBar::sub-line:horizontal {\n"
|
||||
" border: none;\n"
|
||||
" background: rgb(55, 63, 77);\n"
|
||||
" width: 20px;\n"
|
||||
" border-top-left-radius: 4px;\n"
|
||||
" border-bottom-left-radius: 4px;\n"
|
||||
" subcontrol-position: left;\n"
|
||||
" subcontrol-origin: margin;\n"
|
||||
"}\n"
|
||||
"QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal\n"
|
||||
"{\n"
|
||||
" background: none;\n"
|
||||
"}\n"
|
||||
"QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal\n"
|
||||
"{\n"
|
||||
" background: none;\n"
|
||||
"}\n"
|
||||
" QScrollBar:vertical {\n"
|
||||
" border: none;\n"
|
||||
" background: rgb(52, 59, 72);\n"
|
||||
" width: 8px;\n"
|
||||
" margin: 21px 0 21px 0;\n"
|
||||
" border-radius: 0px;\n"
|
||||
" }\n"
|
||||
" QScrollBar::handle:vertical { \n"
|
||||
" background: rgb(47, 48"
|
||||
", 50);\n"
|
||||
" min-height: 25px;\n"
|
||||
" border-radius: 4px\n"
|
||||
" }\n"
|
||||
" QScrollBar::add-line:vertical {\n"
|
||||
" border: none;\n"
|
||||
" background: transparent;\n"
|
||||
" height: 10px;\n"
|
||||
" border-radius: 4px;\n"
|
||||
" subcontrol-position: bottom;\n"
|
||||
" subcontrol-origin: margin;\n"
|
||||
" }\n"
|
||||
" QScrollBar::sub-line:vertical {\n"
|
||||
" border: none;\n"
|
||||
" background: transparent;\n"
|
||||
" height: 10px;\n"
|
||||
" border-radius: 4px;\n"
|
||||
" subcontrol-position: top;\n"
|
||||
" subcontrol-origin: margin;\n"
|
||||
" }\n"
|
||||
" QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical {\n"
|
||||
" background: none;\n"
|
||||
" }\n"
|
||||
"\n"
|
||||
" QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {\n"
|
||||
" background: none;\n"
|
||||
" }\n"
|
||||
"\n"
|
||||
"")
|
||||
self.margins_app = QVBoxLayout(self.stylesheet)
|
||||
self.margins_app.setSpacing(0)
|
||||
self.margins_app.setObjectName(u"margins_app")
|
||||
self.margins_app.setContentsMargins(10, 10, 10, 10)
|
||||
self.bg_app = QFrame(self.stylesheet)
|
||||
self.bg_app.setObjectName(u"bg_app")
|
||||
self.bg_app.setStyleSheet(u"#bg_app { border-radius: 10px; }")
|
||||
self.bg_app.setFrameShape(QFrame.NoFrame)
|
||||
self.bg_app.setFrameShadow(QFrame.Raised)
|
||||
self.bg_app.setLineWidth(0)
|
||||
self.base_Layout = QVBoxLayout(self.bg_app)
|
||||
self.base_Layout.setSpacing(0)
|
||||
self.base_Layout.setObjectName(u"base_Layout")
|
||||
self.base_Layout.setContentsMargins(0, 0, 0, 0)
|
||||
self.horizontal_Layout = QHBoxLayout()
|
||||
self.horizontal_Layout.setSpacing(0)
|
||||
self.horizontal_Layout.setObjectName(u"horizontal_Layout")
|
||||
self.left_menu = QFrame(self.bg_app)
|
||||
self.left_menu.setObjectName(u"left_menu")
|
||||
self.left_menu.setMinimumSize(QSize(50, 0))
|
||||
self.left_menu.setMaximumSize(QSize(50, 16777215))
|
||||
self.left_menu.setFrameShape(QFrame.NoFrame)
|
||||
self.left_menu.setFrameShadow(QFrame.Raised)
|
||||
self.left_menu.setLineWidth(0)
|
||||
self.vertical_left_menu_layout = QVBoxLayout(self.left_menu)
|
||||
self.vertical_left_menu_layout.setSpacing(0)
|
||||
self.vertical_left_menu_layout.setObjectName(u"vertical_left_menu_layout")
|
||||
self.vertical_left_menu_layout.setContentsMargins(0, 0, 0, 0)
|
||||
self.logo_top = QLabel(self.left_menu)
|
||||
self.logo_top.setObjectName(u"logo_top")
|
||||
self.logo_top.setMinimumSize(QSize(50, 50))
|
||||
self.logo_top.setMaximumSize(QSize(50, 50))
|
||||
|
||||
self.vertical_left_menu_layout.addWidget(self.logo_top)
|
||||
|
||||
self.top_menus = QFrame(self.left_menu)
|
||||
self.top_menus.setObjectName(u"top_menus")
|
||||
self.top_menus.setMinimumSize(QSize(0, 50))
|
||||
self.top_menus.setFrameShape(QFrame.NoFrame)
|
||||
self.top_menus.setFrameShadow(QFrame.Raised)
|
||||
self.top_menus_layout = QVBoxLayout(self.top_menus)
|
||||
self.top_menus_layout.setSpacing(5)
|
||||
self.top_menus_layout.setObjectName(u"top_menus_layout")
|
||||
self.top_menus_layout.setContentsMargins(5, 5, 5, 5)
|
||||
|
||||
self.vertical_left_menu_layout.addWidget(self.top_menus)
|
||||
|
||||
self.spacer_vertical_menu = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
|
||||
|
||||
self.vertical_left_menu_layout.addItem(self.spacer_vertical_menu)
|
||||
|
||||
self.bottom_menus = QFrame(self.left_menu)
|
||||
self.bottom_menus.setObjectName(u"bottom_menus")
|
||||
self.bottom_menus.setMinimumSize(QSize(0, 50))
|
||||
self.bottom_menus.setFrameShape(QFrame.NoFrame)
|
||||
self.bottom_menus.setFrameShadow(QFrame.Raised)
|
||||
self.bottom_menus_layout = QVBoxLayout(self.bottom_menus)
|
||||
self.bottom_menus_layout.setSpacing(5)
|
||||
self.bottom_menus_layout.setObjectName(u"bottom_menus_layout")
|
||||
self.bottom_menus_layout.setSizeConstraint(QLayout.SetMinAndMaxSize)
|
||||
self.bottom_menus_layout.setContentsMargins(5, 5, 5, 5)
|
||||
|
||||
self.vertical_left_menu_layout.addWidget(self.bottom_menus)
|
||||
|
||||
|
||||
self.horizontal_Layout.addWidget(self.left_menu)
|
||||
|
||||
self.left_messages = QFrame(self.bg_app)
|
||||
self.left_messages.setObjectName(u"left_messages")
|
||||
self.left_messages.setMinimumSize(QSize(243, 0))
|
||||
self.left_messages.setMaximumSize(QSize(243, 16777215))
|
||||
self.left_messages.setFrameShape(QFrame.NoFrame)
|
||||
self.left_messages.setFrameShadow(QFrame.Raised)
|
||||
self.left_messages.setLineWidth(0)
|
||||
self.left_box_layout = QVBoxLayout(self.left_messages)
|
||||
self.left_box_layout.setSpacing(0)
|
||||
self.left_box_layout.setObjectName(u"left_box_layout")
|
||||
self.left_box_layout.setContentsMargins(0, 0, 0, 0)
|
||||
self.top_messages = QFrame(self.left_messages)
|
||||
self.top_messages.setObjectName(u"top_messages")
|
||||
self.top_messages.setMinimumSize(QSize(0, 105))
|
||||
self.top_messages.setMaximumSize(QSize(16777215, 105))
|
||||
self.top_messages.setFrameShape(QFrame.NoFrame)
|
||||
self.top_messages.setFrameShadow(QFrame.Raised)
|
||||
self.top_messages_layout = QVBoxLayout(self.top_messages)
|
||||
self.top_messages_layout.setSpacing(0)
|
||||
self.top_messages_layout.setObjectName(u"top_messages_layout")
|
||||
self.top_messages_layout.setContentsMargins(0, 0, 0, 0)
|
||||
self.top_user_frame = QFrame(self.top_messages)
|
||||
self.top_user_frame.setObjectName(u"top_user_frame")
|
||||
self.top_user_frame.setMinimumSize(QSize(0, 60))
|
||||
self.top_user_frame.setMaximumSize(QSize(16777215, 60))
|
||||
self.top_user_frame.setFrameShape(QFrame.NoFrame)
|
||||
self.top_user_frame.setFrameShadow(QFrame.Raised)
|
||||
|
||||
self.top_messages_layout.addWidget(self.top_user_frame)
|
||||
|
||||
self.search_sms_frame = QFrame(self.top_messages)
|
||||
self.search_sms_frame.setObjectName(u"search_sms_frame")
|
||||
self.search_sms_frame.setMinimumSize(QSize(0, 40))
|
||||
self.search_sms_frame.setMaximumSize(QSize(16777215, 40))
|
||||
self.search_sms_frame.setFrameShape(QFrame.NoFrame)
|
||||
self.search_sms_frame.setFrameShadow(QFrame.Raised)
|
||||
self.verticalLayout_6 = QVBoxLayout(self.search_sms_frame)
|
||||
self.verticalLayout_6.setSpacing(0)
|
||||
self.verticalLayout_6.setObjectName(u"verticalLayout_6")
|
||||
self.verticalLayout_6.setContentsMargins(10, 0, 10, 0)
|
||||
self.search_line_edit = QLineEdit(self.search_sms_frame)
|
||||
self.search_line_edit.setObjectName(u"search_line_edit")
|
||||
self.search_line_edit.setMinimumSize(QSize(0, 30))
|
||||
self.search_line_edit.setMaximumSize(QSize(16777215, 40))
|
||||
|
||||
self.verticalLayout_6.addWidget(self.search_line_edit, 0, Qt.AlignVCenter)
|
||||
|
||||
|
||||
self.top_messages_layout.addWidget(self.search_sms_frame)
|
||||
|
||||
|
||||
self.left_box_layout.addWidget(self.top_messages)
|
||||
|
||||
self.left_messages_scroll = QScrollArea(self.left_messages)
|
||||
self.left_messages_scroll.setObjectName(u"left_messages_scroll")
|
||||
self.left_messages_scroll.setFrameShape(QFrame.NoFrame)
|
||||
self.left_messages_scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
|
||||
self.left_messages_scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
|
||||
self.left_messages_scroll.setWidgetResizable(True)
|
||||
self.messages_scroll = QWidget()
|
||||
self.messages_scroll.setObjectName(u"messages_scroll")
|
||||
self.messages_scroll.setGeometry(QRect(0, 0, 240, 524))
|
||||
self.messages_layout_base = QVBoxLayout(self.messages_scroll)
|
||||
self.messages_layout_base.setSpacing(0)
|
||||
self.messages_layout_base.setObjectName(u"messages_layout_base")
|
||||
self.messages_layout_base.setContentsMargins(0, 5, 0, 5)
|
||||
self.messages_frame = QFrame(self.messages_scroll)
|
||||
self.messages_frame.setObjectName(u"messages_frame")
|
||||
self.messages_frame.setFrameShape(QFrame.NoFrame)
|
||||
self.messages_frame.setFrameShadow(QFrame.Raised)
|
||||
self.messages_layout = QVBoxLayout(self.messages_frame)
|
||||
self.messages_layout.setSpacing(5)
|
||||
self.messages_layout.setObjectName(u"messages_layout")
|
||||
self.messages_layout.setContentsMargins(0, 0, 0, 0)
|
||||
|
||||
self.messages_layout_base.addWidget(self.messages_frame, 0, Qt.AlignTop)
|
||||
|
||||
self.left_messages_scroll.setWidget(self.messages_scroll)
|
||||
|
||||
self.left_box_layout.addWidget(self.left_messages_scroll)
|
||||
|
||||
self.bottom_messages = QFrame(self.left_messages)
|
||||
self.bottom_messages.setObjectName(u"bottom_messages")
|
||||
self.bottom_messages.setMinimumSize(QSize(0, 65))
|
||||
self.bottom_messages.setMaximumSize(QSize(16777215, 65))
|
||||
self.bottom_messages.setFrameShape(QFrame.NoFrame)
|
||||
self.bottom_messages.setFrameShadow(QFrame.Raised)
|
||||
self.verticalLayout_5 = QVBoxLayout(self.bottom_messages)
|
||||
self.verticalLayout_5.setSpacing(0)
|
||||
self.verticalLayout_5.setObjectName(u"verticalLayout_5")
|
||||
self.verticalLayout_5.setContentsMargins(15, 0, 10, 0)
|
||||
self.signal_frame = QFrame(self.bottom_messages)
|
||||
self.signal_frame.setObjectName(u"signal_frame")
|
||||
self.signal_frame.setMinimumSize(QSize(0, 35))
|
||||
self.signal_frame.setMaximumSize(QSize(16777215, 35))
|
||||
self.signal_frame.setFrameShape(QFrame.NoFrame)
|
||||
self.signal_frame.setFrameShadow(QFrame.Raised)
|
||||
self.horizontalLayout_2 = QHBoxLayout(self.signal_frame)
|
||||
self.horizontalLayout_2.setSpacing(10)
|
||||
self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
|
||||
self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
|
||||
self.signal_icon = QFrame(self.signal_frame)
|
||||
self.signal_icon.setObjectName(u"signal_icon")
|
||||
self.signal_icon.setMaximumSize(QSize(30, 16777215))
|
||||
self.signal_icon.setFrameShape(QFrame.NoFrame)
|
||||
self.signal_icon.setFrameShadow(QFrame.Raised)
|
||||
|
||||
self.horizontalLayout_2.addWidget(self.signal_icon)
|
||||
|
||||
self.signal_text = QFrame(self.signal_frame)
|
||||
self.signal_text.setObjectName(u"signal_text")
|
||||
self.signal_text.setFrameShape(QFrame.NoFrame)
|
||||
self.signal_text.setFrameShadow(QFrame.Raised)
|
||||
self.verticalLayout_7 = QVBoxLayout(self.signal_text)
|
||||
self.verticalLayout_7.setSpacing(0)
|
||||
self.verticalLayout_7.setObjectName(u"verticalLayout_7")
|
||||
self.verticalLayout_7.setContentsMargins(0, 2, 0, 2)
|
||||
self.label_top = QLabel(self.signal_text)
|
||||
self.label_top.setObjectName(u"label_top")
|
||||
|
||||
self.verticalLayout_7.addWidget(self.label_top)
|
||||
|
||||
self.label_bottom = QLabel(self.signal_text)
|
||||
self.label_bottom.setObjectName(u"label_bottom")
|
||||
|
||||
self.verticalLayout_7.addWidget(self.label_bottom)
|
||||
|
||||
|
||||
self.horizontalLayout_2.addWidget(self.signal_text)
|
||||
|
||||
|
||||
self.verticalLayout_5.addWidget(self.signal_frame, 0, Qt.AlignVCenter)
|
||||
|
||||
|
||||
self.left_box_layout.addWidget(self.bottom_messages)
|
||||
|
||||
|
||||
self.horizontal_Layout.addWidget(self.left_messages)
|
||||
|
||||
self.right_content = QFrame(self.bg_app)
|
||||
self.right_content.setObjectName(u"right_content")
|
||||
font = QFont()
|
||||
font.setFamily(u"Segoe UI")
|
||||
font.setPointSize(9)
|
||||
font.setBold(False)
|
||||
font.setItalic(False)
|
||||
font.setStyleStrategy(QFont.PreferAntialias)
|
||||
self.right_content.setFont(font)
|
||||
self.right_content.setFrameShape(QFrame.NoFrame)
|
||||
self.right_content.setFrameShadow(QFrame.Raised)
|
||||
self.right_content.setLineWidth(0)
|
||||
self.verticalLayout = QVBoxLayout(self.right_content)
|
||||
self.verticalLayout.setSpacing(0)
|
||||
self.verticalLayout.setObjectName(u"verticalLayout")
|
||||
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
|
||||
self.top_bar = QFrame(self.right_content)
|
||||
self.top_bar.setObjectName(u"top_bar")
|
||||
self.top_bar.setMinimumSize(QSize(0, 45))
|
||||
self.top_bar.setMaximumSize(QSize(16777215, 45))
|
||||
self.top_bar.setFrameShape(QFrame.NoFrame)
|
||||
self.top_bar.setFrameShadow(QFrame.Raised)
|
||||
self.top_bar.setLineWidth(0)
|
||||
self.horizontalLayout = QHBoxLayout(self.top_bar)
|
||||
self.horizontalLayout.setSpacing(0)
|
||||
self.horizontalLayout.setObjectName(u"horizontalLayout")
|
||||
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
|
||||
self.title_bar = QLabel(self.top_bar)
|
||||
self.title_bar.setObjectName(u"title_bar")
|
||||
self.title_bar.setLineWidth(0)
|
||||
|
||||
self.horizontalLayout.addWidget(self.title_bar)
|
||||
|
||||
self.top_btns = QFrame(self.top_bar)
|
||||
self.top_btns.setObjectName(u"top_btns")
|
||||
self.top_btns.setMaximumSize(QSize(100, 16777215))
|
||||
self.top_btns.setFrameShape(QFrame.NoFrame)
|
||||
self.top_btns.setFrameShadow(QFrame.Raised)
|
||||
self.top_btns.setLineWidth(0)
|
||||
self.top_btn_layout = QHBoxLayout(self.top_btns)
|
||||
self.top_btn_layout.setSpacing(4)
|
||||
self.top_btn_layout.setObjectName(u"top_btn_layout")
|
||||
self.top_btn_layout.setContentsMargins(0, 0, 0, 0)
|
||||
self.minimize_app_btn = QPushButton(self.top_btns)
|
||||
self.minimize_app_btn.setObjectName(u"minimize_app_btn")
|
||||
self.minimize_app_btn.setMinimumSize(QSize(28, 28))
|
||||
self.minimize_app_btn.setMaximumSize(QSize(28, 28))
|
||||
font1 = QFont()
|
||||
font1.setFamily(u"Segoe UI")
|
||||
font1.setPointSize(9)
|
||||
font1.setBold(False)
|
||||
font1.setItalic(False)
|
||||
font1.setStyleStrategy(QFont.NoAntialias)
|
||||
self.minimize_app_btn.setFont(font1)
|
||||
self.minimize_app_btn.setCursor(QCursor(Qt.PointingHandCursor))
|
||||
self.minimize_app_btn.setStyleSheet(u"background-image: url(:/icons_svg/images/icons_svg/icon_minimize.svg);")
|
||||
self.minimize_app_btn.setIconSize(QSize(20, 20))
|
||||
|
||||
self.top_btn_layout.addWidget(self.minimize_app_btn)
|
||||
|
||||
self.maximize_restore_app_btn = QPushButton(self.top_btns)
|
||||
self.maximize_restore_app_btn.setObjectName(u"maximize_restore_app_btn")
|
||||
self.maximize_restore_app_btn.setMinimumSize(QSize(28, 28))
|
||||
self.maximize_restore_app_btn.setMaximumSize(QSize(28, 28))
|
||||
font2 = QFont()
|
||||
font2.setFamily(u"Segoe UI")
|
||||
font2.setPointSize(9)
|
||||
font2.setBold(False)
|
||||
font2.setItalic(False)
|
||||
font2.setStyleStrategy(QFont.PreferDefault)
|
||||
self.maximize_restore_app_btn.setFont(font2)
|
||||
self.maximize_restore_app_btn.setCursor(QCursor(Qt.PointingHandCursor))
|
||||
self.maximize_restore_app_btn.setStyleSheet(u"background-image: url(:/icons_svg/images/icons_svg/icon_maximize.svg);")
|
||||
self.maximize_restore_app_btn.setIconSize(QSize(20, 20))
|
||||
|
||||
self.top_btn_layout.addWidget(self.maximize_restore_app_btn)
|
||||
|
||||
self.close_app_btn = QPushButton(self.top_btns)
|
||||
self.close_app_btn.setObjectName(u"close_app_btn")
|
||||
self.close_app_btn.setMinimumSize(QSize(28, 28))
|
||||
self.close_app_btn.setMaximumSize(QSize(28, 28))
|
||||
self.close_app_btn.setCursor(QCursor(Qt.PointingHandCursor))
|
||||
self.close_app_btn.setStyleSheet(u"background-image: url(:/icons_svg/images/icons_svg/icon_close.svg);")
|
||||
self.close_app_btn.setIconSize(QSize(20, 20))
|
||||
|
||||
self.top_btn_layout.addWidget(self.close_app_btn)
|
||||
|
||||
self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
|
||||
|
||||
self.top_btn_layout.addItem(self.horizontalSpacer)
|
||||
|
||||
|
||||
self.horizontalLayout.addWidget(self.top_btns)
|
||||
|
||||
|
||||
self.verticalLayout.addWidget(self.top_bar)
|
||||
|
||||
self.content = QFrame(self.right_content)
|
||||
self.content.setObjectName(u"content")
|
||||
self.content.setFrameShape(QFrame.NoFrame)
|
||||
self.content.setFrameShadow(QFrame.Raised)
|
||||
self.content.setLineWidth(0)
|
||||
self.verticalLayout_4 = QVBoxLayout(self.content)
|
||||
self.verticalLayout_4.setObjectName(u"verticalLayout_4")
|
||||
self.app_pages = QStackedWidget(self.content)
|
||||
self.app_pages.setObjectName(u"app_pages")
|
||||
self.app_pages.setStyleSheet(u"background-color: transparent;")
|
||||
self.home = QWidget()
|
||||
self.home.setObjectName(u"home")
|
||||
self.home.setStyleSheet(u"#home {\n"
|
||||
" background-position: center;\n"
|
||||
" background-repeat: no-repeat;\n"
|
||||
" background-image: url(:/images_svg/images/images_svg/logo_home.svg);\n"
|
||||
"}")
|
||||
self.app_pages.addWidget(self.home)
|
||||
self.chat = QWidget()
|
||||
self.chat.setObjectName(u"chat")
|
||||
self.chat_layout = QVBoxLayout(self.chat)
|
||||
self.chat_layout.setSpacing(0)
|
||||
self.chat_layout.setObjectName(u"chat_layout")
|
||||
self.chat_layout.setContentsMargins(0, 0, 0, 0)
|
||||
self.app_pages.addWidget(self.chat)
|
||||
|
||||
self.verticalLayout_4.addWidget(self.app_pages)
|
||||
|
||||
|
||||
self.verticalLayout.addWidget(self.content)
|
||||
|
||||
|
||||
self.horizontal_Layout.addWidget(self.right_content)
|
||||
|
||||
|
||||
self.base_Layout.addLayout(self.horizontal_Layout)
|
||||
|
||||
|
||||
self.margins_app.addWidget(self.bg_app)
|
||||
|
||||
MainWindow.setCentralWidget(self.stylesheet)
|
||||
|
||||
self.retranslateUi(MainWindow)
|
||||
|
||||
self.app_pages.setCurrentIndex(1)
|
||||
|
||||
|
||||
QMetaObject.connectSlotsByName(MainWindow)
|
||||
# setupUi
|
||||
|
||||
def retranslateUi(self, MainWindow):
|
||||
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
|
||||
self.search_line_edit.setPlaceholderText(QCoreApplication.translate("MainWindow", u"Search messages", None))
|
||||
self.label_top.setText(QCoreApplication.translate("MainWindow", u"Signal 80%", None))
|
||||
self.label_bottom.setText(QCoreApplication.translate("MainWindow", u"PyBlackBOX server signal", None))
|
||||
self.title_bar.setText("")
|
||||
#if QT_CONFIG(tooltip)
|
||||
self.minimize_app_btn.setToolTip(QCoreApplication.translate("MainWindow", u"Minimize", None))
|
||||
#endif // QT_CONFIG(tooltip)
|
||||
self.minimize_app_btn.setText("")
|
||||
#if QT_CONFIG(tooltip)
|
||||
self.maximize_restore_app_btn.setToolTip(QCoreApplication.translate("MainWindow", u"Maximize", None))
|
||||
#endif // QT_CONFIG(tooltip)
|
||||
self.maximize_restore_app_btn.setText("")
|
||||
#if QT_CONFIG(tooltip)
|
||||
self.close_app_btn.setToolTip(QCoreApplication.translate("MainWindow", u"Close", None))
|
||||
#endif // QT_CONFIG(tooltip)
|
||||
self.close_app_btn.setText("")
|
||||
# retranslateUi
|
||||
|
||||
61
images/icons_svg/icon_add_user.svg
Normal file
@@ -0,0 +1,61 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="20"
|
||||
height="14"
|
||||
viewBox="0 0 5.2916665 3.7041665"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
sodipodi:docname="icon_add_user.svg">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#3b3b3b"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="40.756193"
|
||||
inkscape:cx="10"
|
||||
inkscape:cy="8.0371081"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1027"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
sodipodi:nodetypes="cccccccccccccscccccsccsc"
|
||||
d="M 4.0555995,5.0833333e-7 V 0.75128476 H 3.2964916 V 1.2234565 H 4.0555995 V 1.9747407 H 4.5326882 V 1.2234565 h 0.758978 V 0.75128476 H 4.5326882 V 5.0833333e-7 Z M 2.0967948,0.13244095 c -0.4464888,0.002969 -0.8066677,0.36247431 -0.8066677,0.80437131 -7e-5,0.44429304 0.363829,0.80449994 0.8127478,0.80450984 0.4489187,-9.9e-6 0.8128077,-0.3602168 0.8127476,-0.80450984 -1e-5,-0.4442327 -0.3638889,-0.80435053 -0.8127476,-0.80437131 -0.002,-9.9e-6 -0.004,-9.9e-6 -0.006,0 z m -0.0278,1.91481445 C 0.25532983,2.0472554 5.354963e-7,3.7041662 5.354963e-7,3.7041662 H 4.1636992 c 0,0 -0.2810391,-1.6569108 -2.0947044,-1.6569108 z"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="path846" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.4 KiB |
78
images/icons_svg/icon_attachment.svg
Normal file
@@ -0,0 +1,78 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="13.5"
|
||||
height="15"
|
||||
viewBox="0 0 3.5718749 3.9687499"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
sodipodi:docname="icon_attachment.svg">
|
||||
<defs
|
||||
id="defs2">
|
||||
<inkscape:path-effect
|
||||
effect="fillet_chamfer"
|
||||
id="path-effect997"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
satellites_param="F,0,0,1,0,0.52916667,0,1 @ F,0,0,1,0,0.52916667,0,1 @ F,0,0,1,0,0.52916667,0,1 @ F,0,0,1,0,0.52916667,0,1 @ F,0,0,1,0,0.52916667,0,1 @ F,0,0,1,0,0.52916667,0,1"
|
||||
unit="px"
|
||||
method="auto"
|
||||
mode="F"
|
||||
radius="2"
|
||||
chamfer_steps="1"
|
||||
flexible="false"
|
||||
use_knot_distance="true"
|
||||
apply_no_radius="true"
|
||||
apply_with_radius="true"
|
||||
only_selected="false"
|
||||
hide_knots="false" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#3b3b3b"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="40.756193"
|
||||
inkscape:cx="10"
|
||||
inkscape:cy="6.0742163"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1027"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
style="fill:#b3b3b3;fill-opacity:1;stroke-width:0.0141266"
|
||||
d="M 1.9238942,3.6438512 C 1.4817394,4.0788611 0.77078579,4.0771313 0.33108571,3.6378512 -0.10849509,3.1987411 -0.11022428,2.4882011 0.325123,2.0463711 L 0.32462607,2.0461013 1.9239736,0.44804118 2.1239828,0.24826119 c 0.3312583,-0.33097001 0.8682002,-0.33097001 1.1994485,0 0.3312583,0.33096999 0.3312583,0.86755011 0,1.19864001 l -1.762994,1.7432803 -4.97e-4,-4.762e-4 C 1.3426791,3.3990211 0.99638489,3.397541 0.78170749,3.1837153 c -0.2146774,-0.2135399 -0.2160289,-0.55777 -0.005963,-0.77355 l -4.865e-4,-7.487e-4 0.1963024,-0.1949301 0.98157111,-0.97555 0.196183,0.19519 -1.17775411,1.1704801 c -0.1084518,0.10764 -0.1084518,0.2823701 0,0.39012 0.10845171,0.10775 0.28430191,0.10775 0.39262441,0 l 1.759178,-1.7482401 -4.995e-4,-3.704e-4 0.00696,-0.006 c 0.2208386,-0.22061 0.2208386,-0.5784901 0,-0.7990801 -0.2208489,-0.2206 -0.5787108,-0.22061 -0.7995596,0 l -0.00596,0.007 L 2.3238068,0.44775554 2.1239123,0.64740507 0.52446539,2.2454751 c -0.33124834,0.33098 -0.33124834,0.86755 0,1.1985199 0.3312583,0.3309702 0.86832941,0.3309702 1.19931941,0 L 3.1232424,2.0457051 3.3231322,1.8460551 3.523022,2.0457051 3.3231322,2.2454751 1.923933,3.643775 c 0,-1.98e-5 -2.484e-4,-2.91e-4 -2.484e-4,-2.91e-4 z"
|
||||
id="path1021" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.4 KiB |
60
images/icons_svg/icon_busy.svg
Normal file
@@ -0,0 +1,60 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="25"
|
||||
height="15"
|
||||
viewBox="0 0 6.6145831 3.9687499"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
sodipodi:docname="icon_busy.svg">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#3b3b3b"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="44.533333"
|
||||
inkscape:cx="15"
|
||||
inkscape:cy="7.5"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1027"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
d="M 6.6145833,1.984375 A 1.3229167,1.3229167 0 0 1 5.2916667,3.3072916 1.3229167,1.3229167 0 0 1 3.96875,1.984375 1.3229167,1.3229167 0 0 1 5.2916667,0.66145835 1.3229167,1.3229167 0 0 1 6.6145833,1.984375 Z"
|
||||
style="fill:#a02c2c;fill-opacity:1;stroke-width:0;stroke-linecap:round"
|
||||
id="path1396" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
61
images/icons_svg/icon_close.svg
Normal file
@@ -0,0 +1,61 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="10"
|
||||
height="10"
|
||||
viewBox="0 0 2.6458332 2.6458332"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
sodipodi:docname="icon_close.svg">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#3b3b3b"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="40.756193"
|
||||
inkscape:cx="10"
|
||||
inkscape:cy="10"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1027"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
class="ci-primary"
|
||||
d="M 1.3229167,1.148186 0.17473066,1.6666666e-8 -7.7304133e-6,0.17472292 1.148186,1.3229166 -7.7304133e-6,2.4711104 0.17473066,2.6458333 1.3229167,1.4976473 2.4711027,2.6458333 2.6458411,2.4711104 1.4976473,1.3229166 2.6458411,0.17472292 2.4711027,1.6666666e-8 Z"
|
||||
style="fill:#f9f9f9;stroke-width:0.00772222"
|
||||
id="polygon2" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
78
images/icons_svg/icon_emoticons.svg
Normal file
@@ -0,0 +1,78 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="15"
|
||||
height="15"
|
||||
viewBox="0 0 3.9687499 3.9687498"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
sodipodi:docname="icon_emoticons.svg">
|
||||
<defs
|
||||
id="defs2">
|
||||
<inkscape:path-effect
|
||||
hide_knots="false"
|
||||
only_selected="true"
|
||||
apply_with_radius="true"
|
||||
apply_no_radius="true"
|
||||
use_knot_distance="true"
|
||||
flexible="false"
|
||||
chamfer_steps="1"
|
||||
radius="1"
|
||||
mode="F"
|
||||
method="auto"
|
||||
unit="px"
|
||||
satellites_param="F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
|
||||
lpeversion="1"
|
||||
is_visible="true"
|
||||
id="path-effect1635"
|
||||
effect="fillet_chamfer" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#3b3b3b"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="40.756193"
|
||||
inkscape:cx="10"
|
||||
inkscape:cy="10"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1027"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
id="path1071"
|
||||
style="fill:#b3b3b3;fill-opacity:1;stroke:#ff0000;stroke-width:0;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none"
|
||||
d="M 1.97797,1.078855e-6 A 1.9843757,1.9843757 0 0 0 0,1.9843811 1.9843757,1.9843757 0 0 0 1.98437,3.9687512 1.9843757,1.9843757 0 0 0 3.96875,1.9843811 1.9843757,1.9843757 0 0 0 1.98437,1.078855e-6 a 1.9843757,1.9843757 0 0 0 -0.006,0 z M 3.31729,1.2627311 c 0.3474101,0 0.35041,2.5e-4 0.3702,0.0285 0.0401,0.0573 0.025699,0.12378 -0.0685,0.31668 -0.0486,0.0996 -0.0984,0.22263 -0.1107199,0.27348 -0.0306,0.1268 -0.0631,0.19181 -0.13521,0.27072 -0.1204198,0.13177 -0.3096199,0.19978 -0.55494,0.19951 -0.0812,-8e-5 -0.1711799,-0.008 -0.21004,-0.0182 -0.22576,-0.0601 -0.40065,-0.23559 -0.50618,-0.50795 -0.0923,-0.23812 -0.11792,-0.23794 -0.21687,0.001 -0.11412,0.27616 -0.2568,0.4237 -0.48265,0.49909 -0.0947,0.0316 -0.29736,0.0441 -0.41486,0.0255 -0.1202,-0.019 -0.23388,-0.0812 -0.33682,-0.1843 -0.1087,-0.10886 -0.16442,-0.20591 -0.23607,-0.41118 -0.0295,-0.0846 -0.0762,-0.19481 -0.10365,-0.24501 -0.0582,-0.1063 -0.0664,-0.18062 -0.0244,-0.22263 0.0243,-0.0242 0.0427,-0.0256 0.34272,-0.0256 0.46678,2e-5 0.70858,0.0301 1.08021,0.13438 0.13669,0.0384 0.17896,0.0447 0.2973,0.0448 0.12636,8e-5 0.15057,-0.004 0.28827,-0.0499 0.30888,-0.10278 0.5187101,-0.12934 1.02215,-0.12934 z m -2.2529,1.35121 c 0.0226,-9.393e-4 0.0688,0.0251 0.16018,0.0887 0.20103,0.1398199 0.58541,0.2512999 0.76378,0.2512999 0.26715,0 0.47516,-0.0812 0.7197501,-0.22445 C 2.87015,2.634591 2.91309,2.6157111 2.92973,2.632391 c 0.0323,0.0323 -0.10149,0.2286 -0.22356,0.3278499 -0.54731,0.3846801 -1.00529,0.30192 -1.43664,-0.006 -0.12288,-0.091 -0.25601,-0.2962 -0.21727,-0.33493 0.003,-0.003 0.007,-0.005 0.0121,-0.005 z" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.6 KiB |
60
images/icons_svg/icon_idle.svg
Normal file
@@ -0,0 +1,60 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="25"
|
||||
height="15"
|
||||
viewBox="0 0 6.6145831 3.9687499"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
sodipodi:docname="icon_idle.svg">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#3b3b3b"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="44.533333"
|
||||
inkscape:cx="15"
|
||||
inkscape:cy="7.5"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1027"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
d="M 6.6145833,1.984375 A 1.3229167,1.3229167 0 0 1 5.2916667,3.3072916 1.3229167,1.3229167 0 0 1 3.96875,1.984375 1.3229167,1.3229167 0 0 1 5.2916667,0.66145835 1.3229167,1.3229167 0 0 1 6.6145833,1.984375 Z"
|
||||
style="fill:#ff9955;fill-opacity:1;stroke-width:0;stroke-linecap:round"
|
||||
id="path1396" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
61
images/icons_svg/icon_invisible.svg
Normal file
@@ -0,0 +1,61 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="25"
|
||||
height="15"
|
||||
viewBox="0 0 6.6145831 3.9687499"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
sodipodi:docname="icon_invisible.svg">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#3b3b3b"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="44.533333"
|
||||
inkscape:cx="15"
|
||||
inkscape:cy="7.5"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1027"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
transform="scale(0.26458333)"
|
||||
d="M 20 2.5 A 5.0000001 5.0000001 0 0 0 15 7.5 A 5.0000001 5.0000001 0 0 0 20 12.5 A 5.0000001 5.0000001 0 0 0 25 7.5 A 5.0000001 5.0000001 0 0 0 20 2.5 z M 20 5.1054688 A 2.3952096 2.3952096 0 0 1 22.394531 7.5 A 2.3952096 2.3952096 0 0 1 20 9.8945312 A 2.3952096 2.3952096 0 0 1 17.605469 7.5 A 2.3952096 2.3952096 0 0 1 20 5.1054688 z "
|
||||
style="fill:#808080;fill-opacity:1;stroke-width:0;stroke-linecap:round"
|
||||
id="path1396" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.0 KiB |
61
images/icons_svg/icon_maximize.svg
Normal file
@@ -0,0 +1,61 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="icon_maximize.svg"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
id="svg8"
|
||||
version="1.1"
|
||||
viewBox="0 0 2.6458332 2.6458332"
|
||||
height="10"
|
||||
width="10">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-height="1027"
|
||||
inkscape:window-width="1920"
|
||||
units="px"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:cy="10"
|
||||
inkscape:cx="10"
|
||||
inkscape:zoom="39.690974"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#3b3b3b"
|
||||
id="base" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1">
|
||||
<path
|
||||
sodipodi:nodetypes="cccccccccc"
|
||||
id="rect835"
|
||||
style="fill:#f9f9f9;stroke-width:0.00635566"
|
||||
d="M -3.2833333e-6,1.6666666e-8 V 2.6458333 H 2.6458366 V 1.6666666e-8 Z M 0.22430672,0.22430932 H 2.4215167 V 2.4215241 H 0.22430672 Z" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
61
images/icons_svg/icon_minimize.svg
Normal file
@@ -0,0 +1,61 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="icon_minimize.svg"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
id="svg8"
|
||||
version="1.1"
|
||||
viewBox="0 0 2.6458332 0.26458332"
|
||||
height="1"
|
||||
width="10">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-height="1027"
|
||||
inkscape:window-width="1920"
|
||||
units="px"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:cy="2.9454995"
|
||||
inkscape:cx="10"
|
||||
inkscape:zoom="39.690974"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#3b3b3b"
|
||||
id="base" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1">
|
||||
<path
|
||||
class="ci-primary"
|
||||
d="M 0,0 H 2.64583 V 0.2645833 H 0 Z"
|
||||
style="fill:#f9f9f9;stroke-width:0.0072517"
|
||||
id="rect2" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
78
images/icons_svg/icon_more_options.svg
Normal file
@@ -0,0 +1,78 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="15"
|
||||
height="3.865"
|
||||
viewBox="0 0 3.9687499 1.0226145"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
sodipodi:docname="icon_more_options.svg">
|
||||
<defs
|
||||
id="defs2">
|
||||
<inkscape:path-effect
|
||||
hide_knots="false"
|
||||
only_selected="true"
|
||||
apply_with_radius="true"
|
||||
apply_no_radius="true"
|
||||
use_knot_distance="true"
|
||||
flexible="false"
|
||||
chamfer_steps="1"
|
||||
radius="1"
|
||||
mode="F"
|
||||
method="auto"
|
||||
unit="px"
|
||||
satellites_param="F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
|
||||
lpeversion="1"
|
||||
is_visible="true"
|
||||
id="path-effect1635"
|
||||
effect="fillet_chamfer" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#3b3b3b"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="40.756193"
|
||||
inkscape:cx="10"
|
||||
inkscape:cy="4.1113244"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1027"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
d="M 0.5072096,-5.0131521e-5 A 0.51136216,0.51136253 0 0 0 -5.0489022e-7,0.51131037 0.51136216,0.51136253 0 0 0 0.5113596,1.0226708 0.51136216,0.51136253 0 0 0 1.0227198,0.51131037 0.51136216,0.51136253 0 0 0 0.5113596,-5.0131521e-5 a 0.51136216,0.51136253 0 0 0 -0.004,0 z m 1.4730304,0 A 0.51136216,0.51136253 0 0 0 1.4730299,0.51131037 0.51136216,0.51136253 0 0 0 1.9844,1.0226708 0.51136216,0.51136253 0 0 0 2.4957601,0.51131037 0.51136216,0.51136253 0 0 0 1.9844,-5.0131521e-5 a 0.51136216,0.51136253 0 0 0 -0.005,0 z m 1.4730303,0 A 0.51136216,0.51136253 0 0 0 2.9460203,0.51131037 0.51136216,0.51136253 0 0 0 3.4573804,1.0226708 0.51136216,0.51136253 0 0 0 3.9687505,0.51131037 0.51136216,0.51136253 0 0 0 3.4573804,-5.0131521e-5 a 0.51136216,0.51136253 0 0 0 -0.004,0 z"
|
||||
style="fill:#b3b3b3;stroke:#ff0000;stroke-width:0;stroke-linecap:round"
|
||||
id="path1116-5" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.8 KiB |
60
images/icons_svg/icon_online.svg
Normal file
@@ -0,0 +1,60 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="25"
|
||||
height="15"
|
||||
viewBox="0 0 6.6145831 3.9687499"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
sodipodi:docname="icon_online.svg">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#3b3b3b"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="44.533333"
|
||||
inkscape:cx="15"
|
||||
inkscape:cy="7.5"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1027"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
d="M 6.6145833,1.984375 A 1.3229167,1.3229167 0 0 1 5.2916667,3.3072916 1.3229167,1.3229167 0 0 1 3.96875,1.984375 1.3229167,1.3229167 0 0 1 5.2916667,0.66145835 1.3229167,1.3229167 0 0 1 6.6145833,1.984375 Z"
|
||||
style="fill:#46b946;fill-opacity:1;stroke-width:0;stroke-linecap:round"
|
||||
id="path1396" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
60
images/icons_svg/icon_restore.svg
Normal file
@@ -0,0 +1,60 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="icon_restore.svg"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
id="svg8"
|
||||
version="1.1"
|
||||
viewBox="0 0 2.6458332 2.6458332"
|
||||
height="10"
|
||||
width="10">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-height="1027"
|
||||
inkscape:window-width="1920"
|
||||
units="px"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:cy="10"
|
||||
inkscape:cx="10"
|
||||
inkscape:zoom="39.690974"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#3b3b3b"
|
||||
id="base" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1">
|
||||
<path
|
||||
id="rect835"
|
||||
style="fill:#f9f9f9;stroke-width:0.00635566"
|
||||
d="M 0.52916668,-3.3333334e-8 V 0.52916667 H 1.6666666e-8 V 2.6458334 H 2.1166667 V 2.1166667 H 2.6458333 V -3.3333334e-8 Z M 0.75344238,0.22427577 H 2.4215577 V 1.892391 H 2.1166667 V 0.52916667 H 0.75344238 Z M 0.22427572,0.75344237 H 1.892391 V 2.4215577 H 0.22427572 Z" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
60
images/icons_svg/icon_search.svg
Normal file
@@ -0,0 +1,60 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="icon_search.svg"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
id="svg8"
|
||||
version="1.1"
|
||||
viewBox="0 0 6.6145832 3.9687499"
|
||||
height="15"
|
||||
width="25">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-height="1027"
|
||||
inkscape:window-width="1920"
|
||||
units="px"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:cy="10"
|
||||
inkscape:cx="10"
|
||||
inkscape:zoom="39.690974"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#3b3b3b"
|
||||
id="base" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1">
|
||||
<path
|
||||
id="path835"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e5e6e7;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.205309;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
|
||||
d="M 4.1830577,1.5e-8 C 3.7904164,1.5e-8 3.3967045,0.15241321 3.09781,0.45130858 2.7989074,0.75020428 2.6458333,1.1434324 2.6458333,1.5362093 c 0,0.3927766 0.1515131,0.7771147 0.4519767,1.0849006 0.2983156,0.2983156 0.6913607,0.4433467 1.0852477,0.4433467 0.306518,0 0.6112819,-0.087194 0.8640854,-0.2677681 L 5.1172271,2.7459848 6.3401238,3.96875 6.6145833,3.6946963 5.391686,2.4719306 5.440787,2.4023696 C 5.6223841,2.1408714 5.7102103,1.8345644 5.7102103,1.5362093 5.7102103,1.1421916 5.5645223,0.74962538 5.2662072,0.45130858 4.967312,0.15241261 4.5757072,1.5e-8 4.1830577,1.5e-8 Z m 0,0.384680865 c 0.2902663,0 0.5879952,0.1110113 0.8103686,0.3419386 0.2203605,0.2212072 0.3315335,0.51307362 0.3315335,0.80958982 0,0.2902 -0.1116652,0.5808497 -0.3315335,0.8091705 l -0.00167,0.00167 C 4.7694287,2.5693759 4.473365,2.6797729 4.1830603,2.6797729 c -0.2903047,0 -0.5884668,-0.110397 -0.8107883,-0.3327195 l -0.00168,-0.00167 C 3.1507277,2.117059 3.0390572,1.8264094 3.0390572,1.5362093 c 0,-0.297217 0.111814,-0.58944731 0.3332122,-0.81084691 0.2222091,-0.22982 0.5212062,-0.3406815 0.8107883,-0.34068151 z" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.0 KiB |
78
images/icons_svg/icon_send.svg
Normal file
@@ -0,0 +1,78 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="15"
|
||||
height="12"
|
||||
viewBox="0 0 3.9687499 3.1749999"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
sodipodi:docname="icon_send.svg">
|
||||
<defs
|
||||
id="defs2">
|
||||
<inkscape:path-effect
|
||||
effect="fillet_chamfer"
|
||||
id="path-effect997"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
satellites_param="F,0,0,1,0,0.52916667,0,1 @ F,0,0,1,0,0.52916667,0,1 @ F,0,0,1,0,0.52916667,0,1 @ F,0,0,1,0,0.52916667,0,1 @ F,0,0,1,0,0.52916667,0,1 @ F,0,0,1,0,0.52916667,0,1"
|
||||
unit="px"
|
||||
method="auto"
|
||||
mode="F"
|
||||
radius="2"
|
||||
chamfer_steps="1"
|
||||
flexible="false"
|
||||
use_knot_distance="true"
|
||||
apply_no_radius="true"
|
||||
apply_with_radius="true"
|
||||
only_selected="false"
|
||||
hide_knots="false" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#3b3b3b"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="40.756193"
|
||||
inkscape:cx="10"
|
||||
inkscape:cy="6.0742163"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1027"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
id="path995"
|
||||
style="fill:#b3b3b3;fill-opacity:1;stroke:#333333;stroke-width:0;stroke-linecap:round"
|
||||
d="m 5.1411346e-7,0.39646947 v 0.1171262 A 0.76441772,0.82668623 0 0 0 0.49522798,1.2873271 l 0.2430166,0.098884 a 0.19899043,0.21519994 0 0 1 -5.71e-5,0.4028531 l -0.2429024,0.098745 A 0.76416731,0.82641542 0 0 0 5.1411346e-7,2.6613765 V 2.7784931 A 0.36632052,0.39616052 0 0 0 0.49526068,3.1493014 L 3.8397924,1.789134 A 0.19900363,0.21521421 0 0 0 3.839809,1.3862574 L 0.49524418,0.02570877 A 0.36628567,0.39612284 0 0 0 5.1411346e-7,0.39646947 Z" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
78
images/icons_svg/icon_settings.svg
Normal file
@@ -0,0 +1,78 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="20"
|
||||
height="20"
|
||||
viewBox="0 0 5.2916665 5.2916664"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
sodipodi:docname="icon_settingsr.svg">
|
||||
<defs
|
||||
id="defs2">
|
||||
<inkscape:path-effect
|
||||
hide_knots="false"
|
||||
only_selected="true"
|
||||
apply_with_radius="true"
|
||||
apply_no_radius="true"
|
||||
use_knot_distance="true"
|
||||
flexible="false"
|
||||
chamfer_steps="1"
|
||||
radius="1"
|
||||
mode="F"
|
||||
method="auto"
|
||||
unit="px"
|
||||
satellites_param="F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
|
||||
lpeversion="1"
|
||||
is_visible="true"
|
||||
id="path-effect1635"
|
||||
effect="fillet_chamfer" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#3b3b3b"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="40.756193"
|
||||
inkscape:cx="10"
|
||||
inkscape:cy="10"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1027"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
id="path872"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#333333;stroke-width:0;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none"
|
||||
d="M 2.6280115,1.0798987e-5 C 2.5343304,6.4896755e-4 2.4408118,0.00626199 2.3478488,0.0168065 2.2027152,0.03326856 2.1300123,0.14971705 2.1299985,0.2662408 2.1299913,0.55113274 1.8990498,0.78208194 1.6141658,0.7820908 1.4986508,0.78213223 1.3893358,0.74363258 1.301207,0.67645227 1.1862838,0.58884666 1.04171,0.53671311 0.93050512,0.63141419 0.8008811,0.74180083 0.68221129,0.86444503 0.57615248,0.99763452 0.48516917,1.1118921 0.5160579,1.2456361 0.59841095,1.3280108 c 0.20144445,0.2014558 0.20144445,0.5280742 0,0.72953 C 0.5167524,2.1391767 0.41226067,2.1891924 0.30248397,2.2039744 0.15927027,2.223259 0.02017503,2.2885925 0.00848632,2.4341886 0.00283791,2.504546 4.2220498e-6,2.5751364 5.33293e-7,2.6457908 1.4369918e-5,2.7454853 0.00566259,2.8450284 0.01689451,2.9439466 0.03337385,3.0890782 0.14976109,3.1618227 0.2661931,3.1618109 c 0.284884,8.8e-6 0.51582547,0.230958 0.51583273,0.5158499 -4.99e-6,0.1154405 -0.038496,0.2246762 -0.10562929,0.3127518 -0.0876003,0.1149273 -0.13973456,0.2595082 -0.0450368,0.370716 0.1103825,0.129627 0.23302209,0.2482998 0.36620659,0.3543614 0.11425468,0.090987 0.24799488,0.060104 0.33036448,-0.022249 0.09462,-0.094613 0.2223009,-0.1487558 0.3560881,-0.1510001 0.1397958,-0.00236 0.2745597,0.052138 0.3734296,0.1510001 0.081631,0.081662 0.1316434,0.1861559 0.1464235,0.2959349 0.019282,0.1432143 0.084618,0.2823107 0.2302139,0.2939996 0.070406,0.00565 0.1410459,0.00849 0.2117494,0.00849 0.099638,-1.43e-5 0.1991239,-0.00566 0.2979864,-0.016878 0.1451323,-0.016472 0.2178695,-0.132855 0.2178472,-0.2492923 7.3e-6,-0.2848919 0.2309487,-0.515841 0.5158327,-0.5158499 0.1154582,-5.9e-6 0.2247125,0.03849 0.3127998,0.1056385 0.1149233,0.087606 0.259497,0.139739 0.3707018,0.045038 C 4.490627,4.5499307 4.6092965,4.4272866 4.7153551,4.2940973 4.8063383,4.1798397 4.7754501,4.0460955 4.6930975,3.9637209 4.491653,3.762265 4.491653,3.4356467 4.6930975,3.2341908 4.7877177,3.1395786 4.9153979,3.0854354 5.0491848,3.083191 5.1612886,3.0813088 5.2714914,3.0031493 5.2831802,2.8575533 5.2888329,2.7871428 5.2916667,2.7164989 5.2916661,2.6457911 5.2916467,2.5461468 5.2859985,2.4466539 5.2747723,2.3477854 5.258293,2.2026539 5.1418323,2.1299454 5.0253138,2.1299211 4.7404293,2.1299128 4.5094872,1.8989635 4.50948,1.6140711 4.5094739,1.4986126 4.5479665,1.3893577 4.61511,1.301269 4.7027106,1.1863419 4.754858,1.0417524 4.6601751,0.93053212 4.5497852,0.80086155 4.4271314,0.68214863 4.2939268,0.57605146 4.1796803,0.48505434 4.0459758,0.51601801 3.9635743,0.59845111 c -0.2014511,0.20145486 -0.5280659,0.20145486 -0.729517,0 C 3.1524224,0.51678717 3.1024087,0.41228854 3.0876298,0.30250541 3.0683503,0.15929076 3.0030158,0.02019523 2.8574199,0.00850627 2.7870664,0.00285804 2.71648,2.446499e-5 2.6458296,2.0798987e-5 c -0.00594,-2.000188233e-5 -0.011879,-2.000188233e-5 -0.017819,0 z M 2.645831,1.7805008 c 0.4778543,6.1e-6 0.8652305,0.3873924 0.8652373,0.86526 C 3.5111499,3.1236909 3.1237479,3.5111748 2.645831,3.5111809 2.167914,3.5111751 1.7805116,3.1236911 1.7805932,2.6457608 1.7806,2.167893 2.1679765,1.7805066 2.645831,1.7805008 Z" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 6.1 KiB |
78
images/icons_svg/icon_signal.svg
Normal file
@@ -0,0 +1,78 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="25"
|
||||
height="19"
|
||||
viewBox="0 0 6.6145831 5.0270831"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
sodipodi:docname="icon_signal.svg">
|
||||
<defs
|
||||
id="defs2">
|
||||
<inkscape:path-effect
|
||||
hide_knots="false"
|
||||
only_selected="true"
|
||||
apply_with_radius="true"
|
||||
apply_no_radius="true"
|
||||
use_knot_distance="true"
|
||||
flexible="false"
|
||||
chamfer_steps="1"
|
||||
radius="1"
|
||||
mode="F"
|
||||
method="auto"
|
||||
unit="px"
|
||||
satellites_param="F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,0.26458333,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
|
||||
lpeversion="1"
|
||||
is_visible="true"
|
||||
id="path-effect1635"
|
||||
effect="fillet_chamfer" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#3b3b3b"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="40.756193"
|
||||
inkscape:cx="10"
|
||||
inkscape:cy="10"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1027"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
d="M 5.4711558,-1.687739e-5 C 5.3272124,-0.00101688 5.189694,0.13687312 5.2069338,0.28555312 c 0.00306,0.0656 0.040087,0.12236 0.085064,0.16693 0.4703897,0.50085 0.7641067,1.16944008 0.8079604,1.85966008 0.061296,0.83082 -0.2469107,1.67698 -0.8168491,2.2762599 -0.1009117,0.0917 -0.09906,0.2699203 0.00454,0.3588602 0.085538,0.0968 0.2488174,0.10882 0.3421751,0.0171 C 6.3131002,4.2637832 6.6758827,3.2594931 6.6060723,2.2779132 6.5532903,1.4680432 6.2126992,0.68088312 5.6580915,0.09454312 c -0.037894,-0.0422 -0.085301,-0.0794 -0.1422129,-0.0893 -0.014857,-0.004 -0.029813,-0.004999997 -0.0447,-0.004999997 z m -4.3360953,2e-4 C 1.0798105,0.00218312 1.0255979,0.02248312 0.9847593,0.06278312 0.30147234,0.76336312 -0.06130916,1.7676632 0.00851395,2.7492431 c 0.052761,0.8098602 0.39336035,1.5970401 0.94795436,2.18338 0.0379038,0.0422 0.0853007,0.0794 0.14221259,0.0893 C 1.2572188,5.0573231 1.4266121,4.9056432 1.407603,4.7415232 1.404543,4.6759232 1.367516,4.6191733 1.322539,4.5746032 0.85214853,4.0737533 0.55847103,3.4051332 0.51460363,2.7149231 0.45330763,1.8840931 0.76150157,1.037933 1.3314526,0.43865302 c 0.1009118,-0.0917 0.099089,-0.26989 -0.00454,-0.35884 -0.048128,-0.0544 -0.1208613,-0.0821 -0.1919015,-0.0794999974 z M 1.8298776,0.65192312 c -0.053087,0.001 -0.1055496,0.0199 -0.1466066,0.0564 C 1.1524367,1.2405032 0.87860905,2.0213732 0.95941308,2.7733932 1.0177752,3.3491133 1.2751433,3.9026531 1.6797305,4.3119733 c 0.091257,0.0887 0.248845,0.081 0.3349943,-0.011401 C 2.1205116,4.2148733 2.1318491,4.0374532 2.0324073,3.9422133 1.6286795,3.5292032 1.4112659,2.9365632 1.4587982,2.3565231 c 0.034486,-0.47765 0.2451919,-0.93828 0.5770192,-1.2790001 0.092364,-0.0956 0.080944,-0.26534988 -0.020923,-0.34960998 -0.047437,-0.052 -0.1167508,-0.0779 -0.1850023,-0.076 z m 2.9355323,9.896e-4 c -0.061583,0.002 -0.1224991,0.0273 -0.1655703,0.0735 -0.1057994,0.0858 -0.1171243,0.26312 -0.017681,0.35835998 0.4037283,0.4130101 0.621141,1.0056601 0.5736088,1.5857 -0.034476,0.4776599 -0.2451908,0.9383101 -0.5770193,1.2790101 -0.092364,0.0956 -0.080934,0.2653498 0.020951,0.3496199 0.084323,0.0924 0.2377484,0.1027501 0.3315822,0.0196 C 5.4621159,3.7865328 5.7359435,3.0056526 5.6551395,2.2536327 5.5967774,1.6779129 5.3393956,1.1243828 4.9348211,0.71505282 c -0.045639,-0.0444 -0.1078503,-0.0647 -0.169421,-0.0623 z M 4.0881637,1.3041528 c -0.1271865,6.694e-4 -0.2570411,0.10528 -0.2663398,0.23949 -0.00938,0.0805 0.026711,0.15901 0.085449,0.21193 0.2103437,0.21515 0.3285418,0.5217 0.3072159,0.82468 -0.014383,0.26696 -0.1336933,0.52478 -0.3224605,0.7109199 -0.096641,0.094 -0.089697,0.2673401 0.013406,0.3538199 0.086022,0.0952 0.2460492,0.1057802 0.3390236,0.015301 0.3395274,-0.3302302 0.5190301,-0.8208603 0.4724768,-1.2954303 -0.037301,-0.38021 -0.2097559,-0.74917 -0.4880831,-1.00897 -0.041578,-0.0362 -0.090931,-0.052 -0.1406903,-0.0517 z m -1.5693615,6.694e-4 c -0.054519,0.002 -0.1080242,0.022601 -0.1486988,0.062201 -0.3395137,0.33023 -0.5190315,0.82085 -0.4724791,1.29543 0.037301,0.3802099 0.2097173,0.7491801 0.4880594,1.00898 0.1478217,0.1286399 0.3941169,-0.00101 0.4070539,-0.1877599 0.00938,-0.0805 -0.026711,-0.15903 -0.085449,-0.21194 C 2.4969579,3.0565932 2.378748,2.7500332 2.4000727,2.4470532 c 0.014383,-0.26695 0.1336678,-0.5248 0.3224347,-0.71095 0.096641,-0.094 0.089697,-0.26729 -0.013415,-0.35378 -0.048385,-0.0536 -0.1201855,-0.0804 -0.1902971,-0.0774 z m 0.8161002,0.65641 c -0.018591,-6.694e-4 -0.037291,10e-5 -0.05607,0.002 -0.3063486,0.0101 -0.5558318,0.32026 -0.5051373,0.62608 0.032639,0.2869299 0.3159851,0.5109701 0.5989562,0.47188 0.2695583,-0.024 0.4944017,-0.2783499 0.4850091,-0.55271 0.00612,-0.28611 -0.2439501,-0.53989 -0.5227587,-0.54713 z"
|
||||
style="fill:#b3b3b3;fill-opacity:1;stroke-width:0.0133103"
|
||||
id="path1240" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 6.6 KiB |
95
images/images_svg/logo_home.svg
Normal file
|
After Width: | Height: | Size: 14 KiB |
71
images/images_svg/logo_symbol_top.svg
Normal file
@@ -0,0 +1,71 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="50"
|
||||
height="40"
|
||||
viewBox="0 0 13.229166 10.583333"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
sodipodi:docname="logo_symbol_top.svg">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
inkscape:guide-bbox="true"
|
||||
showguides="true"
|
||||
id="base"
|
||||
pagecolor="#3b3b3b"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="6.9749962"
|
||||
inkscape:cx="-14.323446"
|
||||
inkscape:cy="-0.52146408"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-rotation="0"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1027"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<g
|
||||
transform="translate(-0.17625973,-2.2449627)"
|
||||
id="g3967">
|
||||
<path
|
||||
style="fill:#bdff00;fill-opacity:1;stroke:#333333;stroke-width:0;stroke-linecap:round"
|
||||
d="M 5.1822075,5.4334671 6.3222556,4.7699523 a 0.64143055,0.37331636 0 0 1 0.9071195,-1e-7 l 1.1400486,0.6635149 a 0.64143055,0.37331636 0 0 1 -3e-7,0.5279489 L 7.2293753,6.6249307 a 0.64143055,0.37331636 0 0 1 -0.9071195,2e-7 L 5.1822072,5.9614159 a 0.64143055,0.37331636 0 0 1 3e-7,-0.5279488 z"
|
||||
id="path1600" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccccscsccccccccccccccccccccccccccccccccccc"
|
||||
d="M 6.7692049,3.5678986 C 6.5869427,3.5690449 6.4081557,3.6178841 6.2506237,3.7095604 L 3.7399316,5.1707905 C 3.4149362,5.3599244 3.2155276,5.7080722 3.2168191,6.0840933 l 0.00501,1.4566449 5.939e-4,0.1798553 C 3.216803,8.0230316 3.175351,8.6556338 2.9440122,9.2035641 2.4975691,10.260974 1.8278192,10.291328 1.8278192,10.291328 c 0,0 0.9747131,0.425866 1.6613694,0.135242 0.5681241,-0.240457 1.1546427,0.0078 1.2950232,0.07995 l 0.032097,0.01861 1.4481215,0.839451 c 0.3249645,0.188382 0.7260743,0.187681 1.050379,-0.0018 L 9.8194637,9.8991955 C 10.144275,9.7093775 10.343674,9.3611844 10.343008,8.9849757 l -0.0051,-2.9008821 C 10.33728,5.7077761 10.13694,5.3600824 9.8116956,5.1707908 L 7.3010034,3.7095607 C 7.139597,3.6156292 6.9559507,3.566709 6.7692054,3.5678989 Z m -0.00108,0.6618612 c 0.1871107,-0.00138 0.371155,0.047543 0.5328768,0.1416618 l 1.5349036,0.9011178 c 0.2343517,0.136391 0.2343517,0.4749232 0,0.6113142 L 7.3010017,6.7471952 c -0.3246347,0.1889471 -0.7257444,0.1889471 -1.0503791,0 L 4.7672576,5.8838536 c -0.2343517,-0.136391 -0.2343517,-0.4749232 0,-0.6113142 L 6.2506226,4.3714216 C 6.4078375,4.2799262 6.586229,4.2310931 6.7681249,4.2297598 Z m 2.5540226,2.1669346 c 0.1939395,-0.00137 0.3518909,0.1554625 0.3518884,0.3494071 v 1.9001333 c 6.2e-6,0.3757206 -0.2015095,0.7225769 -0.5279108,0.9086634 L 7.3180487,10.59391 c -0.3275802,0.186783 -0.7290569,0.18836 -1.0580935,0.0042 L 4.3968993,9.5611106 C 4.0694808,9.3777972 3.8666995,9.0318432 3.8667199,8.656601 V 6.7397443 c 3.3e-6,-0.2695124 0.2922254,-0.4375512 0.5251625,-0.3019885 l 1.8587402,1.0818357 c 0.3246339,0.1889505 0.7257453,0.1889505 1.0503791,0 L 9.1488196,6.4441129 c 0.052653,-0.030647 0.1124059,-0.046994 0.1733279,-0.047419 z"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:#333333;stroke-width:0;stroke-linecap:round"
|
||||
id="path1604" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.0 KiB |
60
images/images_svg/text_logo.svg
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
images/users/cat.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
images/users/cat_150px.png
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
BIN
images/users/me.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
images/users/me_150px.png
Normal file
|
After Width: | Height: | Size: 4.4 KiB |
BIN
images/users/mouse.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
images/users/mouse_150px.png
Normal file
|
After Width: | Height: | Size: 8.2 KiB |
241
login.ui
Normal file
@@ -0,0 +1,241 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>Login</class>
|
||||
<widget class="QMainWindow" name="Login">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>300</width>
|
||||
<height>420</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>300</width>
|
||||
<height>420</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>300</width>
|
||||
<height>420</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Login. PyBlackBOX</string>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">#bg {
|
||||
background-color: rgb(0, 0, 0);
|
||||
border-radius: 10px;
|
||||
}
|
||||
QLabel {
|
||||
color: rgb(121, 121, 121);
|
||||
padding-left: 10px;
|
||||
padding-top: 20px;
|
||||
}
|
||||
.QLineEdit {
|
||||
border: 3px solid rgb(47, 48, 50);
|
||||
border-radius: 15px;
|
||||
background-color: rgb(47, 48, 50);
|
||||
color: rgb(121, 121, 121);
|
||||
padding-left: 10px;
|
||||
padding-right: 10px;
|
||||
background-repeat: none;
|
||||
background-position: left center;
|
||||
}
|
||||
.QLineEdit:hover {
|
||||
color: rgb(230, 230, 230);
|
||||
border: 3px solid rgb(62, 63, 66);
|
||||
}
|
||||
.QLineEdit:focus {
|
||||
color: rgb(230, 230, 230);
|
||||
border: 3px solid rgb(189, 255, 0);
|
||||
background-color: rgb(14, 14, 15);
|
||||
}</string>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QFrame" name="bg">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<widget class="QFrame" name="frame_widgets">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>70</y>
|
||||
<width>280</width>
|
||||
<height>720</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>280</width>
|
||||
<height>720</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<property name="spacing">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>20</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>20</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QFrame" name="preloader">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>240</width>
|
||||
<height>240</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>260</width>
|
||||
<height>260</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QFrame" name="logo">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>260</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">#logo {
|
||||
border-radius: 10px;
|
||||
background-image: url(:/images_svg/images/images_svg/logo_home.svg);
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
}</string>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="user_description">
|
||||
<property name="styleSheet">
|
||||
<string notr="true">background: transparent;</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Login (pass: 123456):</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="username">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>30</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="placeholderText">
|
||||
<string>Username</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="password">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>30</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="echoMode">
|
||||
<enum>QLineEdit::Password</enum>
|
||||
</property>
|
||||
<property name="placeholderText">
|
||||
<string>Password</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
<resources>
|
||||
<include location="resources.qrc"/>
|
||||
</resources>
|
||||
<connections/>
|
||||
</ui>
|
||||
349
main.py
Normal file
@@ -0,0 +1,349 @@
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
#
|
||||
# BY: WANDERSON M.PIMENTA
|
||||
# PROJECT MADE WITH: Qt Designer and PySide6
|
||||
# V: 1.0.0
|
||||
#
|
||||
# This project can be used freely for all uses, as long as they maintain the
|
||||
# respective credits only in the Python scripts, any information in the visual
|
||||
# interface (GUI) can be modified without any implication.
|
||||
#
|
||||
# There are limitations on Qt licenses if you want to use your products
|
||||
# commercially, I recommend reading them on the official website:
|
||||
# https://doc.qt.io/qtforpython/licenses.html
|
||||
#
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
|
||||
# DEFAULT PACKAGES
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
import sys
|
||||
import os
|
||||
|
||||
# IMPORT / GUI, SETTINGS AND WIDGETS
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
# Packages
|
||||
from app.packages.pyside_or_pyqt import * # Qt
|
||||
from app.packages.widgets import * # Widgets
|
||||
# GUIs
|
||||
from app.uis.login.ui_login import Ui_Login # Login / Splash Screen
|
||||
from app.uis.main_window.ui_main import Ui_MainWindow # MainWindow
|
||||
from app.uis.chat.page_messages import Chat # Chat Widget
|
||||
# Modules
|
||||
import app.modules.ui_functions.functions as ui_functions
|
||||
from app.modules.app_settings.settings import *
|
||||
|
||||
# GLOBALS
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
counter = 0
|
||||
|
||||
# LOGIN
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
class LoginWindow(QMainWindow):
|
||||
|
||||
def __init__(self):
|
||||
QMainWindow.__init__(self)
|
||||
# GET WIDGETS FROM "ui_login.py"
|
||||
# Load widgets inside LoginWindow
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.ui = Ui_Login()
|
||||
self.ui.setupUi(self)
|
||||
|
||||
# REMOVE TITLE BAR
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.setWindowFlag(Qt.FramelessWindowHint)
|
||||
self.setAttribute(Qt.WA_TranslucentBackground)
|
||||
|
||||
# IMPORT CIRCULAR PROGRESS
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.progress = CircularProgress()
|
||||
self.progress.width = 240
|
||||
self.progress.height = 240
|
||||
self.progress.value = 0
|
||||
self.progress.setFixedSize(self.progress.width, self.progress.height)
|
||||
self.progress.font_size = 20
|
||||
self.progress.add_shadow(True)
|
||||
self.progress.progress_width = 4
|
||||
self.progress.progress_color = QColor("#bdff00")
|
||||
self.progress.text_color = QColor("#E6E6E6")
|
||||
self.progress.bg_color = QColor("#222222")
|
||||
self.progress.setParent(self.ui.preloader)
|
||||
self.progress.show()
|
||||
|
||||
# ADD DROP SHADOW
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.shadow = QGraphicsDropShadowEffect(self)
|
||||
self.shadow.setBlurRadius(15)
|
||||
self.shadow.setXOffset(0)
|
||||
self.shadow.setYOffset(0)
|
||||
self.shadow.setColor(QColor(0, 0, 0, 80))
|
||||
self.ui.bg.setGraphicsEffect(self.shadow)
|
||||
|
||||
# QTIMER
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.timer = QTimer()
|
||||
self.timer.timeout.connect(self.update)
|
||||
self.timer.start(30)
|
||||
|
||||
# KEY PRESS EVENT
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.ui.username.keyReleaseEvent = self.check_login
|
||||
self.ui.password.keyReleaseEvent = self.check_login
|
||||
|
||||
self.show()
|
||||
|
||||
# CHECK LOGIN
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def check_login(self, event):
|
||||
if event.key() == Qt.Key_Return or event.key() == Qt.Key_Enter:
|
||||
username = self.ui.username.text()
|
||||
password = self.ui.password.text()
|
||||
|
||||
def open_main():
|
||||
# SHOW MAIN WINDOW
|
||||
self.main = MainWindow()
|
||||
self.main.top_user.label_user.setText(username.capitalize())
|
||||
self.main.show()
|
||||
self.close()
|
||||
|
||||
if username and password == "123456":
|
||||
self.ui.user_description.setText(f"Welcome {username}!")
|
||||
self.ui.user_description.setStyleSheet("#user_description { color: #bdff00 }")
|
||||
self.ui.username.setStyleSheet("#username:focus { border: 3px solid #bdff00; }")
|
||||
self.ui.password.setStyleSheet("#password:focus { border: 3px solid #bdff00; }")
|
||||
QTimer.singleShot(1200, lambda: open_main())
|
||||
else:
|
||||
# SET STYLESHEET
|
||||
self.ui.username.setStyleSheet("#username:focus { border: 3px solid rgb(255, 0, 127); }")
|
||||
self.ui.password.setStyleSheet("#password:focus { border: 3px solid rgb(255, 0, 127); }")
|
||||
self.shacke_window()
|
||||
|
||||
|
||||
def shacke_window(self):
|
||||
# SHACKE WINDOW
|
||||
actual_pos = self.pos()
|
||||
QTimer.singleShot(0, lambda: self.move(actual_pos.x() + 1, actual_pos.y()))
|
||||
QTimer.singleShot(50, lambda: self.move(actual_pos.x() + -2, actual_pos.y()))
|
||||
QTimer.singleShot(100, lambda: self.move(actual_pos.x() + 4, actual_pos.y()))
|
||||
QTimer.singleShot(150, lambda: self.move(actual_pos.x() + -5, actual_pos.y()))
|
||||
QTimer.singleShot(200, lambda: self.move(actual_pos.x() + 4, actual_pos.y()))
|
||||
QTimer.singleShot(250, lambda: self.move(actual_pos.x() + -2, actual_pos.y()))
|
||||
QTimer.singleShot(300, lambda: self.move(actual_pos.x(), actual_pos.y()))
|
||||
|
||||
# UPDATE PROGRESS BAR
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def update(self):
|
||||
global counter
|
||||
|
||||
# SET VALUE TO PROGRESS BAR
|
||||
self.progress.set_value(counter)
|
||||
|
||||
# CLOSE SPLASH SCREEN AND OPEN MAIN APP
|
||||
if counter >= 100:
|
||||
# STOP TIMER
|
||||
self.timer.stop()
|
||||
self.animation_login()
|
||||
|
||||
# INCREASE COUNTER
|
||||
counter += 1
|
||||
|
||||
# START ANIMATION TO LOGIN
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def animation_login(self):
|
||||
# ANIMATION
|
||||
self.animation = QPropertyAnimation(self.ui.frame_widgets, b"geometry")
|
||||
self.animation.setDuration(1500)
|
||||
self.animation.setStartValue(QRect(0, 70, self.ui.frame_widgets.width(), self.ui.frame_widgets.height()))
|
||||
self.animation.setEndValue(QRect(0, -325, self.ui.frame_widgets.width(), self.ui.frame_widgets.height()))
|
||||
self.animation.setEasingCurve(QEasingCurve.InOutQuart)
|
||||
self.animation.start()
|
||||
|
||||
# MAIN WINDOW
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
class MainWindow(QMainWindow):
|
||||
def __init__(self):
|
||||
QMainWindow.__init__(self)
|
||||
# GET WIDGETS FROM "ui_main.py"
|
||||
# Load widgets inside MainWindow
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.ui = Ui_MainWindow()
|
||||
self.ui.setupUi(self)
|
||||
|
||||
# SET DEFAULT PAGE
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.ui.app_pages.setCurrentWidget(self.ui.home)
|
||||
|
||||
# LOAD DICT SETTINGS FROM "settings.json" FILE
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.settings = Settings()
|
||||
|
||||
self.custom_btn_top = LeftMenuButton(
|
||||
self,
|
||||
"custom_btn_top",
|
||||
"images/icons_svg/icon_add_user.svg",
|
||||
"Add new friend"
|
||||
)
|
||||
self.custom_btn_bottom_1 = LeftMenuButton(
|
||||
self,
|
||||
"custom_btn_bottom_1",
|
||||
"images/icons_svg/icon_more_options.svg",
|
||||
"More options, test with many words"
|
||||
)
|
||||
self.custom_btn_bottom_2 = LeftMenuButton(
|
||||
self,
|
||||
"custom_btn_bottom_2",
|
||||
"images/icons_svg/icon_settings.svg",
|
||||
"Open settings"
|
||||
)
|
||||
self.ui.top_menus_layout.addWidget(self.custom_btn_top)
|
||||
self.ui.bottom_menus_layout.addWidget(self.custom_btn_bottom_1)
|
||||
self.ui.bottom_menus_layout.addWidget(self.custom_btn_bottom_2)
|
||||
|
||||
# DEBUG
|
||||
self.custom_btn_top.clicked.connect(lambda: print(f"{self.settings['app_name']}: clicked"))
|
||||
self.custom_btn_top.released.connect(lambda: print(f"{self.custom_btn_top.objectName()}: released"))
|
||||
self.custom_btn_bottom_1.clicked.connect(lambda: print(f"{self.custom_btn_bottom_1.objectName()}: clicked"))
|
||||
self.custom_btn_bottom_1.released.connect(lambda: print(f"{self.custom_btn_bottom_1.objectName()}: released"))
|
||||
|
||||
|
||||
# TOP USER BOX
|
||||
# Add widget to App
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.top_user = TopUserInfo(self.ui.left_messages, 8, 64, "wanderson", "Writing python codes")
|
||||
self.top_user.setParent(self.ui.top_user_frame)
|
||||
self.top_user.status.connect(self.status_change)
|
||||
|
||||
# SET UI DEFINITIONS
|
||||
# Run set_ui_definitions() in the ui_functions.py
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
ui_functions.UiFunctions.set_ui_definitions(self)
|
||||
|
||||
# ADD MESSAGE BTNS / FRIEND MENUS
|
||||
# Add btns to page
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
add_user = [
|
||||
{
|
||||
"user_image" : "images/users/cat.png",
|
||||
"user_name" : "Tom",
|
||||
"user_description" : "Did you see a mouse?",
|
||||
"user_status" : "online",
|
||||
"unread_messages" : 2,
|
||||
"is_active" : False
|
||||
},
|
||||
{
|
||||
"user_image" : "images/users/mouse.png",
|
||||
"user_name" : "Jerry",
|
||||
"user_description" : "I think I saw a cat...",
|
||||
"user_status" : "busy",
|
||||
"unread_messages" : 1,
|
||||
"is_active" : False
|
||||
},
|
||||
{
|
||||
"user_image" : "images/users/me.png",
|
||||
"user_name" : "Me From The Future",
|
||||
"user_description" : "Lottery result...",
|
||||
"user_status" : "invisible",
|
||||
"unread_messages" : 0,
|
||||
"is_active" : False
|
||||
}
|
||||
]
|
||||
self.menu = FriendMessageButton
|
||||
def add_menus(self, parameters):
|
||||
id = 0
|
||||
for parameter in parameters:
|
||||
|
||||
user_image = parameter['user_image']
|
||||
user_name = parameter['user_name']
|
||||
user_description = parameter['user_description']
|
||||
user_status = parameter['user_status']
|
||||
unread_messages = parameter['unread_messages']
|
||||
is_active = parameter['is_active']
|
||||
|
||||
self.menu = FriendMessageButton(
|
||||
id, user_image, user_name, user_description, user_status, unread_messages, is_active
|
||||
)
|
||||
self.menu.clicked.connect(self.btn_clicked)
|
||||
self.menu.released.connect(self.btn_released)
|
||||
self.ui.messages_layout.addWidget(self.menu)
|
||||
id += 1
|
||||
|
||||
add_menus(self, add_user)
|
||||
|
||||
|
||||
# SHOW MAIN WINDOW
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
self.show()
|
||||
|
||||
# SET USERNAME TO MAIN WINDOW
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def set_user_and_description(self, username):
|
||||
self.top_user.user_name = username
|
||||
print(f"User: {username} are logged!")
|
||||
|
||||
# PRINT STATUS
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def status_change(self, status):
|
||||
print(f"send signal: {status}")
|
||||
|
||||
# GET BTN CLICKED
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def btn_clicked(self):
|
||||
# GET BT CLICKED
|
||||
btn = self.sender()
|
||||
|
||||
# UNSELECT CHATS
|
||||
ui_functions.UiFunctions.deselect_chat_message(self, btn.objectName())
|
||||
|
||||
# SELECT CLICKED
|
||||
if btn.objectName():
|
||||
btn.reset_unread_message()
|
||||
ui_functions.UiFunctions.select_chat_message(self, btn.objectName())
|
||||
|
||||
# LOAD CHAT PAGE
|
||||
if btn.objectName():
|
||||
# REMOVE CHAT
|
||||
for chat in reversed(range(self.ui.chat_layout.count())):
|
||||
self.ui.chat_layout.itemAt(chat).widget().deleteLater()
|
||||
self.chat = None
|
||||
|
||||
# SET CHAT WIDGET
|
||||
self.chat = Chat(btn.user_image, btn.user_name, btn.user_description, btn.objectName(), self.top_user.user_name)
|
||||
|
||||
# ADD WIDGET TO LAYOUT
|
||||
self.ui.chat_layout.addWidget(self.chat)
|
||||
|
||||
# JUMP TO CHAT PAGE
|
||||
self.ui.app_pages.setCurrentWidget(self.ui.chat)
|
||||
|
||||
# DEBUG
|
||||
print(f"Button {btn.objectName()}, clicked!")
|
||||
|
||||
# GET BTN RELEASED
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def btn_released(self):
|
||||
# GET BT CLICKED
|
||||
btn = self.sender()
|
||||
print(F"Button {btn.objectName()}, released!")
|
||||
|
||||
|
||||
# RESIZE EVENT
|
||||
# Whenever the window is resized, this event will be triggered
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def resizeEvent(self, event):
|
||||
ui_functions.UiFunctions.resize_grips(self)
|
||||
|
||||
# MOUSE CLICK EVENTS
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
def mousePressEvent(self, event):
|
||||
# SET DRAG POS WINDOW
|
||||
self.dragPos = event.globalPos()
|
||||
|
||||
|
||||
# SETTINGS WHEN TO START
|
||||
# Set the initial class and also additional parameters of the "QApplication" class
|
||||
# ///////////////////////////////////////////////////////////////
|
||||
if __name__ == "__main__":
|
||||
# APPLICATION
|
||||
app = QApplication(sys.argv)
|
||||
app.setWindowIcon(QIcon("icon.ico"))
|
||||
window = LoginWindow()
|
||||
sys.exit(app.exec_())
|
||||
515
page_messages.ui
Normal file
@@ -0,0 +1,515 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>chat_page</class>
|
||||
<widget class="QWidget" name="chat_page">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>880</width>
|
||||
<height>616</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">QWidget { color: rgb(165, 165, 165); }
|
||||
#chat_page{
|
||||
background-color: rgb(0, 0, 0);
|
||||
}
|
||||
/* TOP */
|
||||
#top {
|
||||
background-color: rgb(30, 32, 33);
|
||||
border-radius: 10px;
|
||||
}
|
||||
#user_name {
|
||||
color: rgb(179, 179, 179);
|
||||
font: 600 12pt "Segoe UI";
|
||||
}
|
||||
#user_image {
|
||||
border: 1px solid rgb(30, 32, 33);
|
||||
background-color: rgb(47, 48, 50);
|
||||
border-radius: 20px;
|
||||
}
|
||||
#top QPushButton {
|
||||
background-color: rgb(47, 48, 50);
|
||||
border-radius: 20px;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
}
|
||||
#top QPushButton:hover {
|
||||
background-color: rgb(61, 62, 65);
|
||||
}
|
||||
#top QPushButton:pressed {
|
||||
background-color: rgb(16, 17, 18);
|
||||
}
|
||||
#btn_attachment_top {
|
||||
background-image: url(:/icons_svg/images/icons_svg/icon_attachment.svg);
|
||||
}
|
||||
#btn_more_top {
|
||||
background-image: url(:/icons_svg/images/icons_svg/icon_more_options.svg);
|
||||
}
|
||||
/* BOTTOM */
|
||||
#bottom QPushButton {
|
||||
background-color: rgb(47, 48, 50);
|
||||
border-radius: 20px;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
}
|
||||
#bottom QPushButton:hover {
|
||||
background-color: rgb(61, 62, 65);
|
||||
}
|
||||
#bottom QPushButton:pressed {
|
||||
background-color: rgb(16, 17, 18);
|
||||
}
|
||||
#send_message_frame {
|
||||
background-color: rgb(47, 48, 50);
|
||||
border-radius: 20px;
|
||||
}
|
||||
#send_message_frame QPushButton {
|
||||
background-color: rgb(76, 77, 80);
|
||||
border-radius: 15px;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
}
|
||||
#send_message_frame QPushButton:hover {
|
||||
background-color: rgb(81, 82, 86);
|
||||
}
|
||||
#send_message_frame QPushButton:pressed {
|
||||
background-color: rgb(16, 17, 18);
|
||||
}
|
||||
#line_edit_message {
|
||||
background-color: transparent;
|
||||
selection-color: rgb(255, 255, 255);
|
||||
selection-background-color: rgb(149, 199, 0);
|
||||
border: none;
|
||||
padding-left: 15px;
|
||||
padding-right: 15px;
|
||||
background-repeat: none;
|
||||
background-position: left center;
|
||||
font: 10pt "Segoe UI";
|
||||
color: rgb(94, 96, 100);
|
||||
}
|
||||
#line_edit_message:focus {
|
||||
color: rgb(165, 165, 165);
|
||||
}
|
||||
#btn_emoticon{
|
||||
background-image: url(:/icons_svg/images/icons_svg/icon_emoticons.svg);
|
||||
}
|
||||
#btn_send_message{
|
||||
background-image: url(:/icons_svg/images/icons_svg/icon_send.svg);
|
||||
}
|
||||
#btn_attachment_bottom{
|
||||
|
||||
background-image: url(:/icons_svg/images/icons_svg/icon_more_options.svg);
|
||||
}</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QFrame" name="top">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>60</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>60</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="user_image">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QFrame" name="user_information_frame">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="user_name">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>User name</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="user_description">
|
||||
<property name="styleSheet">
|
||||
<string notr="true">background: transparent;</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>User description</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="last_time_connected">
|
||||
<property name="text">
|
||||
<string>connected last time 24h ago</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="btn_attachment_top">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="cursor">
|
||||
<cursorShape>PointingHandCursor</cursorShape>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="btn_more_top">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="cursor">
|
||||
<cursorShape>PointingHandCursor</cursorShape>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QScrollArea" name="chat_messages">
|
||||
<property name="styleSheet">
|
||||
<string notr="true">background: transparent</string>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<property name="horizontalScrollBarPolicy">
|
||||
<enum>Qt::ScrollBarAlwaysOff</enum>
|
||||
</property>
|
||||
<property name="widgetResizable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
|
||||
</property>
|
||||
<widget class="QWidget" name="messages_widget">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>862</width>
|
||||
<height>486</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">background: transparent</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="chat_layout">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QFrame" name="messages_frame">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="chat_messages_layout">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QFrame" name="bottom">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<property name="spacing">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QFrame" name="send_message_frame">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::StyledPanel</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QPushButton" name="btn_emoticon">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>30</width>
|
||||
<height>30</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>30</width>
|
||||
<height>30</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="cursor">
|
||||
<cursorShape>PointingHandCursor</cursorShape>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="line_edit_message">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="placeholderText">
|
||||
<string>Message #user</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="btn_send_message">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>30</width>
|
||||
<height>30</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>30</width>
|
||||
<height>30</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="cursor">
|
||||
<cursorShape>PointingHandCursor</cursorShape>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="btn_attachment_bottom">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="cursor">
|
||||
<cursorShape>PointingHandCursor</cursorShape>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources>
|
||||
<include location="resources.qrc"/>
|
||||
</resources>
|
||||
<connections/>
|
||||
</ui>
|
||||
33
resources.qrc
Normal file
@@ -0,0 +1,33 @@
|
||||
<RCC>
|
||||
<qresource prefix="images_svg">
|
||||
<file>images/images_svg/logo_home.svg</file>
|
||||
<file>images/images_svg/logo_symbol_top.svg</file>
|
||||
<file>images/images_svg/text_logo.svg</file>
|
||||
</qresource>
|
||||
<qresource prefix="icons_svg">
|
||||
<file>images/icons_svg/icon_busy.svg</file>
|
||||
<file>images/icons_svg/icon_idle.svg</file>
|
||||
<file>images/icons_svg/icon_invisible.svg</file>
|
||||
<file>images/icons_svg/icon_online.svg</file>
|
||||
<file>images/icons_svg/icon_search.svg</file>
|
||||
<file>images/icons_svg/icon_add_user.svg</file>
|
||||
<file>images/icons_svg/icon_attachment.svg</file>
|
||||
<file>images/icons_svg/icon_close.svg</file>
|
||||
<file>images/icons_svg/icon_emoticons.svg</file>
|
||||
<file>images/icons_svg/icon_maximize.svg</file>
|
||||
<file>images/icons_svg/icon_minimize.svg</file>
|
||||
<file>images/icons_svg/icon_more_options.svg</file>
|
||||
<file>images/icons_svg/icon_restore.svg</file>
|
||||
<file>images/icons_svg/icon_send.svg</file>
|
||||
<file>images/icons_svg/icon_settings.svg</file>
|
||||
<file>images/icons_svg/icon_signal.svg</file>
|
||||
</qresource>
|
||||
<qresource prefix="users">
|
||||
<file>images/users/cat.png</file>
|
||||
<file>images/users/cat_150px.png</file>
|
||||
<file>images/users/me.png</file>
|
||||
<file>images/users/me_150px.png</file>
|
||||
<file>images/users/mouse.png</file>
|
||||
<file>images/users/mouse_150px.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
19
settings.json
Normal file
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"app_name": "PyBlackBOX - Free GUI 2",
|
||||
"custom_title_bar": true,
|
||||
"startup_size": [
|
||||
1400,
|
||||
800
|
||||
],
|
||||
"minimum_size": [
|
||||
960,
|
||||
540
|
||||
],
|
||||
"left_menu": {
|
||||
"color": "#FF000000",
|
||||
"color_hover": "#151617",
|
||||
"color_pressed": "#ACE500",
|
||||
"icon_color": "#E6E6E6",
|
||||
"icon_color_pressed": "#151617"
|
||||
}
|
||||
}
|
||||
33
setup.py
Normal file
@@ -0,0 +1,33 @@
|
||||
import sys
|
||||
import os
|
||||
from cx_Freeze import setup, Executable
|
||||
# Packages
|
||||
from app.packages.pyside_or_pyqt import * # Qt
|
||||
from app.packages.widgets import * # Widgets
|
||||
# GUIs
|
||||
from app.uis.login.ui_login import Ui_Login # Login / Splash Screen
|
||||
from app.uis.main_window.ui_main import Ui_MainWindow # MainWindow
|
||||
from app.uis.chat.page_messages import Chat # Chat Widget
|
||||
# Modules
|
||||
import app.modules.ui_functions.functions as ui_functions
|
||||
import app.modules.app_settings.settings as app_settings
|
||||
|
||||
# ADD FILES/FOLDERS
|
||||
files = ['icon.ico', 'settings.json','images/']
|
||||
|
||||
# TARGET
|
||||
target = Executable(
|
||||
script="main.py",
|
||||
base="Win32GUI",
|
||||
icon="icon.ico"
|
||||
)
|
||||
|
||||
# SETUP CX FREEZE
|
||||
setup(
|
||||
name = "PyBlackBOX",
|
||||
version = "1.0",
|
||||
description = "Modern GUI for desktop chat",
|
||||
author = "Wanderson M. Pimenta",
|
||||
options = {'build_exe' : {'include_files' : files}},
|
||||
executables = [target]
|
||||
)
|
||||