first commit

This commit is contained in:
VFX - Visual Effects
2021-05-26 13:56:50 -03:00
commit bccd10fc77
59 changed files with 13333 additions and 0 deletions

17
.vscode/launch.json vendored Normal file
View 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
View File

@@ -0,0 +1,11 @@
{
"files.exclude": {
"**/.git": true,
"**/.svn": true,
"**/.hg": true,
"**/CVS": true,
"**/.DS_Store": true,
"**/*.pyc": {"when": "$(basename).py"},
"**/__pycache__": true
},
}

View 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")

View 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

View 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
View 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 *

View 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 *

View 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 *

View 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

View 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

View 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__()

View 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

View 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)

View 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

View File

@@ -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()

View 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

View 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)

View 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>

View 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

View 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
View 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)

View 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())

View 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
View 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

File diff suppressed because it is too large Load Diff

View 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

BIN
icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 14 KiB

View 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

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

BIN
images/users/cat.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
images/users/cat_150px.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

BIN
images/users/me.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
images/users/me_150px.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
images/users/mouse.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

241
login.ui Normal file
View 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
View 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_())

1119
main.ui Normal file

File diff suppressed because it is too large Load Diff

515
page_messages.ui Normal file
View 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 &quot;Segoe UI&quot;;
}
#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 &quot;Segoe UI&quot;;
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
View 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
View 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
View 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]
)