master
Peng_Lx 2 years ago
parent 7bef368a1a
commit 42660d8296

@ -0,0 +1,170 @@
import hashlib
class UserManager:
def __init__(self, db_connection):
self.db_connection = db_connection
self.logged_in_user = None
self.create_default_admin()
def create_default_admin(self):
cur = self.db_connection.cursor()
cur.execute('SELECT * FROM Account WHERE userID="admin"')
admin_account = cur.fetchone()
if not admin_account:
default_password = "admin" # 默认密码是admin实际情况下应该设置更复杂的密码
passwordHash = hashlib.sha256(default_password.encode()).hexdigest() # 使用SHA-256算法对密码进行哈希
cur.execute('INSERT INTO Account(userID, passwordHash, permission) VALUES(?, ?, ?)',
("admin", passwordHash, "Admin"))
self.db_connection.commit()
def login(self, userID, password):
cur = self.db_connection.cursor()
passwordHash = hashlib.sha256(password.encode()).hexdigest()
cur.execute('SELECT * FROM Account WHERE userID=? AND passwordHash=?', (userID, passwordHash))
user = cur.fetchone()
if user:
self.logged_in_user = user
print("Login successful")
return True
else:
print("Login failed")
return False
def logout(self):
self.logged_in_user = None
def add_user(self, userID, password, permission):
if self.logged_in_user and self.logged_in_user[2] == 'Admin':
cur = self.db_connection.cursor()
passwordHash = hashlib.sha256(password.encode()).hexdigest()
cur.execute('INSERT INTO Account(userID, passwordHash, permission) VALUES(?, ?, ?)', (userID, passwordHash, permission))
self.db_connection.commit()
else:
print("Permission denied")
def add_book_info(self,ISBN, author, summary, price, publicationDate, category):
if self.logged_in_user and self.logged_in_user[2] == 'Admin': # 检查当前登录的用户是否有Admin权限
cur = self.db_connection.cursor()
cur.execute('''
INSERT INTO BookInfo(ISBN, author, summary, price, publicationDate, category) VALUES(?, ?, ?, ?, ?, ?)
''', (ISBN, author, summary, price, publicationDate, category))
self.db_connection.commit()
else:
print("Only Admin can add books.")
def add_book(self, bookId, ISBN, location):
if self.logged_in_user and self.logged_in_user[2] == 'Admin': # 检查当前登录的用户是否有Admin权限
cur = self.db_connection.cursor()
cur.execute('''INSERT INTO MainBook(bookID, ISBN, borrowStatus) VALUES(?, ?, 'borrowed')''', bookId, ISBN)
cur.execute('''INSERT INTO BookLocation(bookID, location) VALUES(?, ?)''', bookId, location)
self.db_connection.commit()
else:
print("Only Admin can add books.")
def delete_book(self, bookID):
if self.logged_in_user and self.logged_in_user[2] == 'Admin': # 检查当前登录的用户是否有Admin权限
cur = self.db_connection.cursor()
cur.execute('DELETE FROM MainBook WHERE bookID=?', (bookID,))
cur.execute('DELETE FROM BookLocation WHERE bookID=?', (bookID,))
cur.execute('DELETE FROM BorrowRecord WHERE bookID=?', (bookID,))
cur.execute('DELETE FROM BookInfo WHERE ISBN=(SELECT ISBN FROM MainBook WHERE bookID=?)', (bookID,))
self.db_connection.commit()
else:
print("Only Admin can delete books.")
def change_book_location(self, bookID, new_location):
if self.logged_in_user and self.logged_in_user[2] == 'Admin': # 检查当前登录的用户是否有Admin权限
cur = self.db_connection.cursor()
cur.execute('UPDATE BookLocation SET location=? WHERE bookID=?', (new_location, bookID))
self.db_connection.commit()
else:
print("Only Admin can change book location.")
def check_borrower(self, bookID):
if self.logged_in_user and self.logged_in_user[2] == 'Admin': # 检查当前登录的用户是否有Admin权限
cur = self.db_connection.cursor()
cur.execute('SELECT borrowingUser FROM BorrowRecord WHERE bookID=? AND actualReturnTime IS NULL', (bookID,))
borrower = cur.fetchone()
if borrower:
print(f"The book {bookID} is currently borrowed by {borrower[0]}")
else:
print(f"The book {bookID} is currently not borrowed.")
else:
print("Only Admin can check borrower.")
def check_borrow_record(self, bookID):
if self.logged_in_user and self.logged_in_user[2] == 'Admin': # 检查当前登录的用户是否有Admin权限
cur = self.db_connection.cursor()
cur.execute('SELECT * FROM BorrowRecord WHERE bookID=?', (bookID,))
records = cur.fetchall()
for record in records:
print(record)
else:
print("Only Admin can check borrow record.")
def change_user_permission(self, userID, new_permission):
if self.logged_in_user and self.logged_in_user[2] == 'Admin': # 检查当前登录的用户是否有Admin权限
cur = self.db_connection.cursor()
cur.execute('UPDATE Account SET permission=? WHERE userID=?', (new_permission, userID))
self.db_connection.commit()
else:
print("Only Admin can change user permission.")
def borrow_book(self, bookID, expectedReturnTime):
if self.logged_in_user and self.logged_in_user[2] == 'User': # 检查当前登录的用户是否有User权限
cur = self.db_connection.cursor()
# 检查该图书是否可用
cur.execute('SELECT borrowStatus FROM MainBook WHERE bookID=?', (bookID,))
borrowStatus = cur.fetchone()[0]
if borrowStatus == 'available':
# 更新图书的借阅状态
cur.execute('UPDATE MainBook SET borrowStatus=? WHERE bookID=?', ('borrowed', bookID))
# 添加一条新的借阅记录
cur.execute('''
INSERT INTO BorrowRecord(bookID, borrowTime, expectedReturnTime, borrowingUser)
VALUES(?, datetime("now"), ?, ?)
''', (bookID, expectedReturnTime, self.logged_in_user[0]))
self.db_connection.commit()
print("You have successfully borrowed the book.")
else:
print("The book is currently not available.")
else:
print("Only User can borrow books.")
def return_book(self, bookID):
if self.logged_in_user and self.logged_in_user[2] == 'User': # 检查当前登录的用户是否有User权限
cur = self.db_connection.cursor()
# 检查该用户是否真的借阅了这本图书
cur.execute('SELECT * FROM BorrowRecord WHERE bookID=? AND borrowingUser=? AND actualReturnTime IS NULL',
(bookID, self.logged_in_user[0]))
if cur.fetchone():
# 更新图书的借阅状态
cur.execute('UPDATE MainBook SET borrowStatus=? WHERE bookID=?', ('available', bookID))
# 更新借阅记录中的实际归还时间
cur.execute(
'UPDATE BorrowRecord SET actualReturnTime=datetime("now") WHERE bookID=? AND borrowingUser=? AND actualReturnTime IS NULL',
(bookID, self.logged_in_user[0]))
self.db_connection.commit()
print("You have successfully returned the book.")
else:
print("You didn't borrow this book.")
else:
print("Only User can return books.")
def find_book(self, bookID):
# 检查用户是否有权限查找书籍
if self.logged_in_user and self.logged_in_user[2] in ['Admin', 'User']:
# 在数据库中查找书籍
cur = self.db_connection.cursor()
cur.execute('''
SELECT * FROM MainBook WHERE bookID = ?
''', (bookID,))
book = cur.fetchone()
if book is not None:
return book
else:
print("Book not found.")
return None
else:
print("Permission Denied: You do not have the required permissions to find books.")
return None

@ -0,0 +1,97 @@
class Database:
def __init__(self, db_connection):
self.db_connection = db_connection
def init(self):
cur = self.db_connection.cursor()
tables = [
("Account", '''
CREATE TABLE Account(
userID TEXT PRIMARY KEY,
passwordHash TEXT,
permission TEXT CHECK(permission IN ('Admin', 'User', 'Ban'))
)
'''),
("MainBook", '''
CREATE TABLE MainBook(
bookID TEXT PRIMARY KEY,
ISBN TEXT,
borrowStatus TEXT CHECK(borrowStatus IN ('borrowed', 'available'))
)
'''),
("BookLocation", '''
CREATE TABLE BookLocation(
bookID TEXT PRIMARY KEY,
location TEXT
)
'''),
("BorrowRecord", '''
CREATE TABLE BorrowRecord(
bookID TEXT,
borrowTime TEXT,
actualReturnTime TEXT,
expectedReturnTime TEXT,
borrowingUser TEXT
)
'''),
("BookInfo", '''
CREATE TABLE BookInfo(
ISBN TEXT PRIMARY KEY,
author TEXT,
summary TEXT,
price REAL,
publicationDate TEXT,
category TEXT
)
'''),
("BookCategory", '''
CREATE TABLE BookCategory(
category TEXT PRIMARY KEY
)
''')
]
# 创建表,只有当表不存在时才创建
for table_name, table_query in tables:
cur.execute(f"SELECT name FROM sqlite_master WHERE type='table' AND name='{table_name}'")
if not cur.fetchone():
cur.execute(table_query)
# 添加默认的图书类别
categories = [
'马克思主义、列宁主义、毛泽东思想、邓小平理论',
'哲学、宗教',
'社会科学总论',
'政治、法律',
'军事',
'经济',
'文化、科学、教育、体育',
'语言、文字',
'文学',
'艺术',
'历史、地理',
'自然科学总论',
'数理科学和化学',
'天文学、地球科学',
'生物科学',
'医学、卫生',
'农业科学',
'工业科学',
'交通运输',
'航空、航天',
'环境科学、劳动保护科学(安全科学)',
'综合性图书'
]
for category in categories:
cur.execute('SELECT * FROM BookCategory WHERE category="category"')
print(category)
if not cur.fetchone():
cur.execute('INSERT INTO BookCategory(category) VALUES(?)', (category,))

@ -0,0 +1,40 @@
from PySide6.QtWidgets import QDialog, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton
from core.usermanager import UserManager
class AddBook(QDialog):
def __init__(self, user_manager: UserManager):
super().__init__()
self.user_manager = user_manager
self.layout = QVBoxLayout()
self.setWindowTitle("添加图书")
self.isbn = QHBoxLayout()
self.isbn.addWidget(QLabel("ISBN"))
self.isbn_line_edit = QLineEdit()
self.isbn.addWidget(self.isbn_line_edit)
self.layout.addLayout(self.isbn)
self.book_id = QHBoxLayout()
self.book_id.addWidget(QLabel("BookID"))
self.book_id_line_edit = QLineEdit()
self.book_id.addWidget(self.book_id_line_edit)
self.layout.addLayout(self.book_id)
self.location = QHBoxLayout()
self.location.addWidget(QLabel("图书位置"))
self.location_line_edit = QLineEdit()
self.location.addWidget(self.location_line_edit)
self.layout.addLayout(self.location)
self.add_button = QPushButton("添加图书")
self.add_button.clicked.connect(self.add)
self.layout.addWidget(self.add_button)
self.setLayout(self.layout)
def add(self):
self.user_manager.add_book(self.book_id_line_edit.text(), self.isbn_line_edit.text(), self.location_line_edit.text())

@ -0,0 +1,64 @@
from PySide6.QtCore import QRegularExpression
from PySide6.QtGui import QRegularExpressionValidator
from PySide6.QtWidgets import QDialog, QVBoxLayout, QLineEdit, QHBoxLayout, QLabel, QPushButton
from core.usermanager import UserManager
class AddBookInformation(QDialog):
def __init__(self, user_manager: UserManager):
super().__init__()
self.user_manager = user_manager
self.layout = QVBoxLayout()
self.setWindowTitle("添加图书信息")
self.isbn = QHBoxLayout()
self.isbn.addWidget(QLabel("ISBN"))
self.isbn_line_edit = QLineEdit()
self.isbn.addWidget(self.isbn_line_edit)
self.layout.addLayout(self.isbn)
self.author_line_edit = QLineEdit()
self.author = QHBoxLayout()
self.author.addWidget(QLabel("作者"))
self.author.addWidget(self.author_line_edit)
self.layout.addLayout(self.author)
self.summary_line_edit = QLineEdit()
self.summary = QHBoxLayout()
self.summary.addWidget(QLabel("书名"))
self.summary.addWidget(self.summary_line_edit)
self.layout.addLayout(self.summary)
self.price_line_edit = QLineEdit()
reg = QRegularExpression('^[1-9]\d*\.\d+$|^0\.\d+$|^[1-9]\d*$|^0$')
validator = QRegularExpressionValidator(self)
validator.setRegularExpression(reg)
self.price_line_edit.setValidator(validator)
self.price = QHBoxLayout()
self.price.addWidget(QLabel("价格"))
self.price.addWidget(self.price_line_edit)
self.layout.addLayout(self.price)
self.date_line_edit = QLineEdit()
self.date = QHBoxLayout()
self.date.addWidget(QLabel("成书日期"))
self.date.addWidget(self.date_line_edit)
self.layout.addLayout(self.date)
self.category_line_edit = QLineEdit()
self.category = QHBoxLayout()
self.category.addWidget(QLabel("分类"))
self.category.addWidget(self.category_line_edit)
self.layout.addLayout(self.category)
self.add_button = QPushButton("添加图书")
self.add_button.clicked.connect(self.add)
self.layout.addWidget(self.add_button)
self.setLayout(self.layout)
def add(self):
self.user_manager.add_book_info(self.isbn_line_edit.text(), self.author_line_edit.text(), self.summary_line_edit.text(), self.price_line_edit.text(), self.date_line_edit.text(), self.category_line_edit.text())

@ -0,0 +1,40 @@
from PySide6.QtWidgets import QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QDialog, QPushButton
from core.usermanager import UserManager
class AddUser(QDialog):
def __init__(self, user_manager: UserManager):
super().__init__()
self.user_manager = user_manager
self.layout = QVBoxLayout()
self.setWindowTitle("添加用户")
self.user = QHBoxLayout()
self.user.addWidget(QLabel("账户"))
self.user_line_edit = QLineEdit()
self.user.addWidget(self.user_line_edit)
self.layout.addLayout(self.user)
self.password_line_edit = QLineEdit()
self.password = QHBoxLayout()
self.password.addWidget(QLabel("密码"))
self.password.addWidget(self.password_line_edit)
self.layout.addLayout(self.password)
self.permission_line_edit = QLineEdit()
self.permission = QHBoxLayout()
self.permission.addWidget(QLabel("权限"))
self.permission.addWidget(self.permission_line_edit)
self.layout.addLayout(self.permission)
self.add_button = QPushButton("添加用户")
self.add_button.clicked.connect(self.add)
self.layout.addWidget(self.add_button)
self.setLayout(self.layout)
def add(self):
self.user_manager.add_user(self.user_line_edit.text(), self.password_line_edit.text(), self.permission_line_edit.text())

@ -0,0 +1,27 @@
from PySide6.QtWidgets import QDialog, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton
class BorrowBook(QDialog):
def __init__(self, user_manager):
super().__init__()
self.user_manager = user_manager
self.layout = QVBoxLayout()
self.setWindowTitle("借阅图书")
self.book_id = QHBoxLayout()
self.book_id.addWidget(QLabel("BookID"))
self.book_id_line_edit = QLineEdit()
self.book_id.addWidget(self.book_id_line_edit)
self.layout.addLayout(self.book_id)
self.borrow_button = QPushButton("借阅")
self.borrow_button.clicked.connect(self.borrow)
self.layout.addWidget(self.borrow_button)
self.setLayout(self.layout)
def borrow(self):
pass

@ -0,0 +1,111 @@
from PySide6.QtGui import QPixmap, QAction
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QLabel, QLineEdit, \
QGridLayout, QGroupBox, QMessageBox, QListView, QAbstractItemView, QListWidgetItem, QHBoxLayout, QToolBar, \
QStatusBar, QTableView, QMenuBar, QMenu
from PySide6.QtCore import Qt
from core.usermanager import UserManager
from gui.AddBook import AddBook
from gui.AddBookInformation import AddBookInformation
from gui.AddUser import AddUser
from gui.BorrowBook import BorrowBook
from gui.RemoveBook import RemoveBook
from gui.RemoveBookInformation import RemoveBookInformation
from gui.RemoveUser import RemoveUser
from gui.ReturnBook import ReturnBook
class LibrarySystemUI(QMainWindow):
def __init__(self, user_manager: UserManager):
super().__init__()
self.user_manager = user_manager
self.setWindowTitle("图书信息管理系统")
self.tool_bar = QToolBar(self)
self.addToolBar(Qt.TopToolBarArea, self.tool_bar)
if user_manager.logged_in_user[2] == "Admin":
# 创建工具栏
self.add_info_action = QAction("添加图书信息", self)
self.tool_bar.addAction(self.add_info_action)
self.delete_info_action = QAction("删除图书信息", self)
self.tool_bar.addAction(self.delete_info_action)
self.add_action = QAction("添加图书", self)
self.tool_bar.addAction(self.add_action)
self.delete_action = QAction("删除图书", self)
self.tool_bar.addAction(self.delete_action)
self.add_user_action = QAction("添加用户", self)
self.tool_bar.addAction(self.add_user_action)
self.delete_user_action = QAction("移除用户", self)
self.tool_bar.addAction(self.delete_user_action)
self.book_status_action = QAction("查询图书状态", self)
self.tool_bar.addAction(self.book_status_action)
# 连接动作
self.add_info_action.triggered.connect(self.add_info_book)
self.delete_info_action.triggered.connect(self.delete_info_book)
self.add_action.triggered.connect(self.add_book)
self.delete_action.triggered.connect(self.remove_book)
self.add_user_action.triggered.connect(self.add_user)
self.delete_user_action.triggered.connect(self.delete_user)
self.book_status_action.triggered.connect(self.book_status)
else:
self.borrow_action = QAction("借阅图书", self)
self.tool_bar.addAction(self.borrow_action)
self.return_action = QAction("归还图书", self)
self.tool_bar.addAction(self.return_action)
#链接动作
self.borrow_action.triggered.connect(self.borrow_book)
self.return_action.triggered.connect(self.return_book)
# 创建状态栏
self.status_bar = QStatusBar(self)
self.setStatusBar(self.status_bar)
# 创建中心区域
self.table_view = QTableView(self)
self.setCentralWidget(self.table_view)
def add_info_book(self):
self.add_book_information = AddBookInformation(self.user_manager)
self.add_book_information.show()
def delete_info_book(self):
self.remove_book_information = RemoveBookInformation(self.user_manager)
self.remove_book_information.show()
def add_book(self):
self.add_book = AddBook(self.user_manager)
self.add_book.show()
def remove_book(self):
self.remove_book = RemoveBook(self.user_manager)
self.remove_book.show()
def add_user(self):
self.addUser = AddUser(self.user_manager)
self.addUser.show()
def delete_user(self):
self.removeUser = RemoveUser(self.user_manager)
self.removeUser.show()
def borrow_book(self):
self.borrow_book = BorrowBook(self.user_manager)
self.borrow_book.show()
def return_book(self):
self.return_book = ReturnBook(self.user_manager)
self.return_book.show()
def book_status(self):
pass

@ -0,0 +1,44 @@
from PySide6.QtWidgets import QApplication, QDialog, QVBoxLayout, QLabel, QLineEdit, QPushButton, QHBoxLayout, QTextEdit
from gui.LibrarySystemUI import LibrarySystemUI
class LoginDialog(QDialog):
def __init__(self, user_manager):
super().__init__()
self.user_manager = user_manager
self.layout = QVBoxLayout()
self.setWindowTitle("请登录")
self.label = QLabel("请输入您的用户名称和密码")
self.layout.addWidget(self.label)
self.userID_line_edit = QLineEdit()
self.userID = QHBoxLayout()
self.userID.addWidget(QLabel("账户"))
self.userID.addWidget(self.userID_line_edit)
self.layout.addLayout(self.userID)
self.password_line_edit = QLineEdit()
self.password = QHBoxLayout()
self.password.addWidget(QLabel("密码"))
self.password.addWidget(self.password_line_edit)
self.layout.addLayout(self.password)
self.login_button = QPushButton("登录")
self.login_button.clicked.connect(self.login)
self.layout.addWidget(self.login_button)
self.setLayout(self.layout)
def login(self):
userID = self.userID_line_edit.text()
password = self.password_line_edit.text()
login = self.user_manager.login(userID, password)
if login:
self.hide()
self.lsu = LibrarySystemUI(self.user_manager)
self.lsu.show()

@ -0,0 +1,28 @@
from PySide6.QtWidgets import QDialog, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton
from core.usermanager import UserManager
class RemoveBook(QDialog):
def __init__(self, user_manager: UserManager):
super().__init__()
self.user_manager = user_manager
self.layout = QVBoxLayout()
self.setWindowTitle("移除图书")
self.book_id = QHBoxLayout()
self.book_id.addWidget(QLabel("BookID"))
self.book_id_line_edit = QLineEdit()
self.book_id.addWidget(self.book_id_line_edit)
self.layout.addLayout(self.book_id)
self.remove_button = QPushButton("移除图书")
self.remove_button.clicked.connect(self.remove)
self.layout.addWidget(self.remove_button)
self.setLayout(self.layout)
def remove(self):
pass

@ -0,0 +1,28 @@
from PySide6.QtWidgets import QDialog, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton
from core.usermanager import UserManager
class RemoveBookInformation(QDialog):
def __init__(self, user_manager: UserManager):
super().__init__()
self.user_manager = user_manager
self.layout = QVBoxLayout()
self.setWindowTitle("移除图书信息")
self.isbn = QHBoxLayout()
self.isbn.addWidget(QLabel("ISBN"))
self.isbn_line_edit = QLineEdit()
self.isbn.addWidget(self.isbn_line_edit)
self.layout.addLayout(self.isbn)
self.remove_button = QPushButton("移除图书")
self.remove_button.clicked.connect(self.remove)
self.layout.addWidget(self.remove_button)
self.setLayout(self.layout)
def remove(self):
pass

@ -0,0 +1,28 @@
from PySide6.QtWidgets import QDialog, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton
from core.usermanager import UserManager
class RemoveUser(QDialog):
def __init__(self, user_manager: UserManager):
super().__init__()
self.user_manager = user_manager
self.layout = QVBoxLayout()
self.setWindowTitle("移除用户")
self.user = QHBoxLayout()
self.user.addWidget(QLabel("账户"))
self.user_line_edit = QLineEdit()
self.user.addWidget(self.user_line_edit)
self.layout.addLayout(self.user)
self.remove_button = QPushButton("移除用户")
self.remove_button.clicked.connect(self.remove)
self.layout.addWidget(self.remove_button)
self.setLayout(self.layout)
def remove(self):
pass

@ -0,0 +1,27 @@
from PySide6.QtWidgets import QDialog, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton
class ReturnBook(QDialog):
def __init__(self, user_manager):
super().__init__()
self.user_manager = user_manager
self.layout = QVBoxLayout()
self.setWindowTitle("归还图书")
self.book_id = QHBoxLayout()
self.book_id.addWidget(QLabel("BookID"))
self.book_id_line_edit = QLineEdit()
self.book_id.addWidget(self.book_id_line_edit)
self.layout.addLayout(self.book_id)
self.return_button = QPushButton("归还")
self.return_button.clicked.connect(self.return_book)
self.layout.addWidget(self.return_button)
self.setLayout(self.layout)
def return_book(self):
pass

Binary file not shown.

@ -1,8 +0,0 @@
from enum import Enum, unique
@unique
class Permission(Enum):
NONE = 0
USER = 1
ADMIN = 2

@ -1,39 +0,0 @@
from src.educoder.core.permission.permission import Permission
class Database(object):
def addBook(self, unique_id, isbn, state):
pass
def removeBook(self, unique_id):
pass
def addUser(self, user_id, userpass_word, permission: Permission, nick_name):
pass
def modifyUserPermission(self, user_id, permission: Permission):
pass
def removeUser(self, unique_id):
pass
def addBookInformation(self, isbn, author, description, price, made_time, image, category):
pass
def removeBookInformation(self, isbn):
pass
def brownBook(self, unique_id, brownuser):
pass
def stillBook(self, unique_id):
pass
def addCategory(self, category):
pass
def removeCategory(self, category):
pass
def login(self, user_id, password):
return True

@ -1,10 +0,0 @@
import database
import sqlite3
class DatabaseSQLite(database.Database):
conn = sqlite3.connect
def connection(self):
self.conn = sqlite3.connect("../../../data/lib_manager.db")

@ -1,50 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 AND MODULES
# ///////////////////////////////////////////////////////////////
import os
# APP FUNCTIONS
# ///////////////////////////////////////////////////////////////
class Functions:
# SET SVG ICON
# ///////////////////////////////////////////////////////////////
def set_svg_icon(icon_name):
app_path = os.path.abspath(os.getcwd())
folder = "gui/images/svg_icons/"
path = os.path.join(app_path, folder)
icon = os.path.normpath(os.path.join(path, icon_name))
return icon
# SET SVG IMAGE
# ///////////////////////////////////////////////////////////////
def set_svg_image(icon_name):
app_path = os.path.abspath(os.getcwd())
folder = "gui/images/svg_images/"
path = os.path.join(app_path, folder)
icon = os.path.normpath(os.path.join(path, icon_name))
return icon
# SET IMAGE
# ///////////////////////////////////////////////////////////////
def set_image(image_name):
app_path = os.path.abspath(os.getcwd())
folder = "gui/images/images/"
path = os.path.join(app_path, folder)
image = os.path.normpath(os.path.join(path, image_name))
return image

@ -1,58 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 AND MODULES
# ///////////////////////////////////////////////////////////////
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}")
# INIT SETTINGS
# ///////////////////////////////////////////////////////////////
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

@ -1,66 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 AND MODULES
# ///////////////////////////////////////////////////////////////
import json
import os
# IMPORT SETTINGS
# ///////////////////////////////////////////////////////////////
from src.educoder.gui.core.json_settings import Settings
# APP THEMES
# ///////////////////////////////////////////////////////////////
class Themes(object):
# LOAD SETTINGS
# ///////////////////////////////////////////////////////////////
setup_settings = Settings()
_settings = setup_settings.items
# APP PATH
# ///////////////////////////////////////////////////////////////
json_file = f"gui/themes/{_settings['theme_name']}.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: \"gui/themes/{_settings['theme_name']}.json\" not found! check in the folder {settings_path}")
# INIT SETTINGS
# ///////////////////////////////////////////////////////////////
def __init__(self):
super(Themes, self).__init__()
# DICTIONARY WITH SETTINGS
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

@ -1,79 +0,0 @@
<?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="5"
height="50"
viewBox="0 0 1.3229167 13.229167"
version="1.1"
id="svg1101"
sodipodi:docname="active_menu.svg"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)">
<defs
id="defs1095">
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect831"
is_visible="true"
lpeversion="1"
satellites_param="F,0,0,1,0,0,0,1 @ F,0,1,1,0,8.73125,0,1 @ F,0,1,1,0,8.73125,0,1 @ F,0,0,1,0,0,0,1"
unit="px"
method="auto"
mode="F"
radius="33"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="true"
hide_knots="false" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="3.3964091"
inkscape:cx="-44.262477"
inkscape:cy="-16.499375"
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="metadata1098">
<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 />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
id="rect1664"
style="fill:#000000;stroke:none;stroke-width:7.93274;stroke-linecap:round"
d="M 5 0 A 4.9999998 4.9999998 0 0 1 0 5 L 0 45 A 4.9999997 4.9999997 0 0 1 5 50 L 5 0 z "
transform="scale(0.26458333)" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.3 KiB

@ -1,61 +0,0 @@
<?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="18"
height="12.6"
viewBox="0 0 4.7624998 3.3337502"
version="1.1"
id="svg1123"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
sodipodi:docname="icon_add_user.svg">
<defs
id="defs1117" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="50.945244"
inkscape:cx="7.9999999"
inkscape:cy="7.9999999"
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="metadata1120">
<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="path835"
style="fill:#c3ccdf;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 3.6497773,1.1647547e-4 V 0.67623793 H 2.9666794 V 1.101212 H 3.6497773 V 1.7773335 H 4.0794021 V 1.101212 H 4.7624999 V 0.67623793 H 4.0794021 V 1.1647547e-4 Z M 1.8870942,0.11929524 c -0.4018392,0.0027 -0.7261184,0.32608639 -0.7261184,0.72379299 -6.3e-5,0.39986437 0.3273236,0.72436537 0.7313507,0.72437427 0.4040261,-8.9e-6 0.731986,-0.3245099 0.7319319,-0.72437427 -8.9e-6,-0.3998092 -0.3279598,-0.72377385 -0.7319319,-0.72379299 -0.0018,-8.96e-6 -0.00343,-8.96e-6 -0.00523,0 z m 0.00349,0.45229799 c 6.75e-4,-3.4e-6 0.00107,-3.4e-6 0.00174,0 0.1516867,7.2e-6 0.2749798,0.1213713 0.2749831,0.271495 2.04e-5,0.1501443 -0.1232761,0.27207297 -0.2749831,0.27207637 -0.1517074,-3.4e-6 -0.2744255,-0.12193207 -0.2744019,-0.27207637 0,-0.1493342 0.1217718,-0.2704812 0.2726578,-0.271495 z M 1.8620957,1.8424458 C 0.22979836,1.8424458 2.0111711e-7,3.3336336 2.0111711e-7,3.3336336 H 3.7474457 c 0,0 -0.2530506,-1.4911879 -1.88535,-1.4911878 z"
sodipodi:nodetypes="cccccccccccccsccccsssccccsssccs" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.8 KiB

@ -1,61 +0,0 @@
<?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="14"
height="14"
viewBox="0 0 3.7041666 3.7041667"
version="1.1"
id="svg1112"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
sodipodi:docname="icon_arrow_left.svg">
<defs
id="defs1106" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="23.434943"
inkscape:cx="-0.27228179"
inkscape:cy="9.2969808"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="false"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1057"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata1109">
<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="path1686"
style="fill:#c3ccdf;fill-opacity:1;stroke-width:0.014809"
d="M 0.74083338,1.8520834 2.5929167,3.7041667 2.9633333,3.3337501 1.4816666,1.8520834 2.9633333,0.37041667 2.5929167,0 Z"
sodipodi:nodetypes="ccccccc" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

@ -1,61 +0,0 @@
<?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="14"
height="14"
viewBox="0 0 3.7041666 3.7041667"
version="1.1"
id="svg1112"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
sodipodi:docname="icon_arrow_right.svg">
<defs
id="defs1106" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="23.434943"
inkscape:cx="-0.27228179"
inkscape:cy="9.2969808"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="false"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1057"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata1109">
<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="path1686"
style="fill:#c3ccdf;fill-opacity:1;stroke-width:0.014809"
d="M 2.9633333,1.8520834 1.11125,3.7041667 0.74083338,3.3337501 2.2225001,1.8520834 0.74083338,0.37041667 1.11125,0 Z"
sodipodi:nodetypes="ccccccc" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

@ -1,78 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 3.4 KiB

@ -1,60 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 1.9 KiB

@ -1,61 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 1.9 KiB

@ -1,78 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 4.6 KiB

@ -1,63 +0,0 @@
<?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="14.133"
height="16"
viewBox="0 0 3.7393562 4.2333335"
version="1.1"
id="svg1123"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
sodipodi:docname="icon_file.svg">
<defs
id="defs1117" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="50.945244"
inkscape:cx="7.9999999"
inkscape:cy="6.9571339"
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="metadata1120">
<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
fill="var(--ci-primary-color, currentColor)"
d="M 2.5278472,1.5e-7 H -4.3840544e-5 V 4.2333332 H 3.7394002 V 1.2115542 Z M 3.3117606,1.3284462 v 0.01211 H 2.3988452 V 0.40167229 h 0.01211 z M 0.42702697,3.8316611 V 0.40167229 H 1.9400447 V 1.7630023 h 1.3924898 v 2.0686588 z"
class="ci-primary"
id="path1797"
style="fill:#c3ccdf;fill-opacity:1;stroke-width:0.00881943"
sodipodi:nodetypes="ccccccccccccccccccc" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

@ -1,62 +0,0 @@
<?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="16"
height="16"
viewBox="0 0 4.2333332 4.2333335"
version="1.1"
id="svg1123"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
sodipodi:docname="icon_folder.svg">
<defs
id="defs1117" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="52.312503"
inkscape:cx="7.9999999"
inkscape:cy="7.9999999"
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="metadata1120">
<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
fill="var(--ci-primary-color, currentColor)"
d="M 4.0216672,4.0216668 H 0.21166717 A 0.21191363,0.21191363 0 0 1 1.6666667e-7,3.8100008 V 0.42333284 A 0.21191363,0.21191363 0 0 1 0.21166717,0.21166684 H 1.8579662 a 0.21109342,0.21109342 0 0 1 0.195386,0.130263 l 0.180905,0.434182 h 1.78741 a 0.21191363,0.21191363 0 0 1 0.211666,0.211666 V 3.8100008 a 0.21191363,0.21191363 0 0 1 -0.211666,0.211666 z M 0.28222217,3.7394448 H 3.9511112 V 1.0583338 H 2.0461122 L 1.8109242,0.49388884 H 0.28222217 Z"
class="ci-primary"
id="path1715"
style="stroke-width:0.00881943;fill:#c3ccdf;fill-opacity:1" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

@ -1,63 +0,0 @@
<?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="16"
height="12.979"
viewBox="0 0 4.2333332 3.4340272"
version="1.1"
id="svg1123"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
sodipodi:docname="icon_folder_open.svg">
<defs
id="defs1117" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="50.945244"
inkscape:cx="7.9999999"
inkscape:cy="7.9999999"
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="metadata1120">
<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
fill="var(--ci-primary-color, currentColor)"
d="m 4.1881781,1.2550782 c -0.040167,-0.05178 -0.1020848,-0.081993 -0.167617,-0.08179 H 3.4339851 V 0.7088652 C 3.4338533,0.59581999 3.3422423,0.504213 3.2291971,0.50408623 h -1.207708 l -0.157472,-0.378076 C 1.8323311,0.049613 1.7576995,-1.3404038e-4 1.6749921,1.222962e-5 H 0.20477805 C 0.09173634,1.4395962e-4 1.3078124e-4,0.09174952 -9.4815342e-7,0.20479123 V 3.4340152 H 3.7277421 l 0.499122,-1.996493 c 0.016088,-0.063523 0.0018,-0.1309155 -0.03869,-0.182441 z m -3.79557487,1.7915233 0,-2.61763371 H 1.5445818 l 0.209998,0.50407396 h 1.2296898 l 0,0.24024345 H 1.0773411 C 0.9797102,1.1731588 0.89457356,1.2396202 0.87100205,1.3343632 l -0.453994,1.7122383 c 0,0 0.0171431,0.00519 -0.0244048,0 z m 2.99950817,0 H 0.84430765 L 1.2417473,1.5555024 h 2.5062558 z"
class="ci-primary"
id="path1737"
style="fill:#c3ccdf;fill-opacity:1;stroke-width:0.00886065"
sodipodi:nodetypes="cccccccccccccccccccccccccccccc" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

@ -1,62 +0,0 @@
<?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="16"
height="16"
viewBox="0 0 4.2333332 4.2333335"
version="1.1"
id="svg1123"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
sodipodi:docname="icon_heart.svg">
<defs
id="defs1117" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="52.312503"
inkscape:cx="7.9999999"
inkscape:cy="7.9999999"
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="metadata1120">
<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
fill="var(--ci-primary-color, currentColor)"
d="m 3.8437761,0.55967259 a 1.124579,1.124579 0 0 0 -1.59099,5.97e-4 l -0.136276,0.137937 -0.135142,-0.137638 -8.79e-4,-8.79e-4 a 1.124579,1.124579 0 0 0 -1.59040098,0 l -0.06071,0.06071 a 1.124579,1.124579 0 0 0 0,1.59039201 l 1.60228798,1.602271 0.180943,0.189579 0.0043,-0.0043 0.0047,0.0047 0.16953,-0.178869 1.61335,-1.613367 a 1.1258705,1.1258705 0 0 0 0,-1.59039201 z m -0.13813,1.45229701 -1.588723,1.588758 -1.58875798,-1.588758 a 0.84343427,0.84343427 0 0 1 0,-1.19279201 l 0.06072,-0.06071 a 0.84343427,0.84343427 0 0 1 1.19234398,-4.48e-4 l 0.334676,0.34077401 0.336267,-0.34032601 a 0.84343427,0.84343427 0 0 1 1.1928,0 l 0.06071,0.0607 a 0.8444007,0.8444007 0 0 1 -3.3e-5,1.19280001 z"
class="ci-primary"
id="path1748"
style="stroke-width:0.00878576;fill:#c3ccdf;fill-opacity:1" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

@ -1,66 +0,0 @@
<?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="16"
height="16"
viewBox="0 0 4.2333332 4.2333335"
version="1.1"
id="svg1123"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
sodipodi:docname="icon_home.svg">
<defs
id="defs1117" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="52.312834"
inkscape:cx="8.0000001"
inkscape:cy="8"
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="metadata1120">
<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
inkscape:export-ydpi="288.13419"
inkscape:export-xdpi="288.13419"
inkscape:export-filename="E:\ESTUDOS\TUTORIAIS\NEW\Qt Widgets Projects\PyOneDark\Layout\Exports\Preview_01.png"
id="path924"
class="ci-primary"
d="m 2.2591467,0.08067382 c -0.12676,-0.110868 -0.32292,-0.106982 -0.44471,0.0088 -0.54091,0.514215 -1.08177003,1.02847098 -1.62268003,1.54268498 -0.1059,0.100686 -0.1917600033334,0.300754 -0.1917600033334,0.446879 v 1.889698 A 0.26458331,0.26458331 0 0 0 0.26458667,4.2333198 H 1.3985067 a 0.26458331,0.26458331 0 0 0 0.26459,-0.264584 v -1.018815 a 0.13229166,0.13229166 0 0 1 0.13229,-0.132292 h 0.64256 a 0.13229166,0.13229166 0 0 1 0.13229,0.132292 v 1.018815 a 0.26458331,0.26458331 0 0 0 0.26458,0.264584 h 1.13393 a 0.26458331,0.26458331 0 0 0 0.26459,-0.264584 v -1.896721 c 0,-0.146126 -0.0892,-0.34258 -0.19914,-0.438789 -0.59165,-0.517555 -1.18337,-1.03503798 -1.77505,-1.55255198 z m -0.21784,0.301963 c 1.2e-4,-0.0016 1.2e-4,-0.0016 1.2e-4,-0.0016 z m 1.5666,3.48136598 h -0.40055 a 0.26458331,0.26458331 0 0 1 -0.26458,-0.264584 v -0.875328 c 0,-0.158767 -0.13538,-0.287474 -0.30238,-0.287474 h -1.08254 c -0.167,0 -0.30238,0.128707 -0.30238,0.287474 v 0.875328 a 0.26458331,0.26458331 0 0 1 -0.26458003,0.264584 h -0.34208 a 0.26458331,0.26458331 0 0 1 -0.26459,-0.264584 v -1.307754 a 0.63429306,0.63429306 0 0 1 0.18802,-0.450739 L 1.9474167,0.47937082 c 0.0519,-0.0514 0.094,-0.09339 0.0942,-0.09339 l 1.63381,1.46450498 a 0.59248392,0.59248392 0 0 1 0.19702,0.441184 v 1.307755 a 0.26458331,0.26458331 0 0 1 -0.26458,0.264585 z"
fill="var(--ci-primary-color, currentColor)"
style="fill:#c3ccdf;fill-opacity:1;stroke-width:0.00921352"
sodipodi:nodetypes="cccccccccccscsccssssccccccc" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.3 KiB

@ -1,60 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 1.9 KiB

@ -1,78 +0,0 @@
<?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="18"
height="18"
viewBox="0 0 4.7624998 4.7625002"
version="1.1"
id="svg1123"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
sodipodi:docname="icon_info.svg">
<defs
id="defs1117">
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect845"
is_visible="true"
lpeversion="1"
satellites_param="F,0,1,1,0,0.26458333,0,1 @ F,0,1,1,0,0.26458333,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,0,1,0,0,0,1"
unit="px"
method="auto"
mode="F"
radius="1"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="true"
hide_knots="false" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="47.163271"
inkscape:cx="7.9999996"
inkscape:cy="11.367157"
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="metadata1120">
<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="path831"
style="fill:#c3ccdf;stroke-width:3.40858;stroke-linecap:round"
d="M 2.38125,0 A 2.3812499,2.3812499 0 0 0 0,2.38125 2.3812499,2.3812499 0 0 0 2.38125,4.7625 2.3812499,2.3812499 0 0 0 4.7625,2.38125 2.3812499,2.3812499 0 0 0 2.38125,0 Z m 0,0.67030791 c 0.2262168,0 0.4098587,0.18422327 0.4098587,0.41044009 0,0.2262168 -0.1836419,0.4098587 -0.4098587,0.4098587 -0.2262168,0 -0.4098587,-0.1836419 -0.4098587,-0.4098587 0,-0.22621682 0.1836419,-0.41044009 0.4098587,-0.41044009 z M 2.3254395,1.8016342 h 0.111621 A 0.29765625,0.29765625 0 0 1 2.7347168,2.0992905 V 3.7945359 A 0.29765625,0.29765625 0 0 1 2.4370605,4.0921921 H 2.3254395 A 0.29765625,0.29765625 0 0 1 2.0277832,3.7945359 V 2.0992905 A 0.29765625,0.29765625 0 0 1 2.3254395,1.8016342 Z" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.0 KiB

@ -1,61 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 2.0 KiB

@ -1,61 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 1.8 KiB

@ -1,63 +0,0 @@
<?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="18"
height="18"
viewBox="0 0 4.7624999 4.7625001"
version="1.1"
id="svg1112"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
sodipodi:docname="icon_menu.svg">
<defs
id="defs1106" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="46.5"
inkscape:cx="9"
inkscape:cy="10.72043"
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="metadata1109">
<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
inkscape:export-ydpi="288.13419"
inkscape:export-xdpi="288.13419"
inkscape:export-filename="E:\ESTUDOS\TUTORIAIS\NEW\Qt Widgets Projects\PyOneDark\Layout\Exports\Preview_01.png"
id="rect4"
style="fill:#c3ccdf;fill-opacity:1;stroke-width:0.0149578"
d="m 0,-0.0051675 v 0.529166 h 4.7625 v -0.529166 z m 0,2.121834 v 0.529167 h 4.7625 v -0.529167 z m 0,2.121834 v 0.529167 h 4.7625 v -0.529167 z" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

@ -1,61 +0,0 @@
<?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="18"
height="18"
viewBox="0 0 4.7624999 4.7625001"
version="1.1"
id="svg1112"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
sodipodi:docname="icon_menu_close.svg">
<defs
id="defs1106" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="46.5"
inkscape:cx="9"
inkscape:cy="9.8602151"
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="metadata1109">
<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="path1686"
style="fill:#c3ccdf;fill-opacity:1;stroke-width:0.0149578"
d="M 1.258838,2.3812501 3.1295248,4.2519368 3.503662,3.8777995 2.0071126,2.3812501 3.503662,0.88470059 3.1295248,0.51056322 Z"
sodipodi:nodetypes="ccccccc" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

@ -1,61 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 1.7 KiB

@ -1,78 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 3.8 KiB

@ -1,60 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 1.9 KiB

@ -1,60 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 1.9 KiB

@ -1,61 +0,0 @@
<?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="16"
height="16"
viewBox="0 0 4.2333332 4.2333335"
version="1.1"
id="svg1123"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
sodipodi:docname="icon_save.svg">
<defs
id="defs1117" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="50.945244"
inkscape:cx="7.9999999"
inkscape:cy="7.9999999"
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="metadata1120">
<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 />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
id="path1759"
style="fill:#c3ccdf;fill-opacity:1;stroke-width:0.0333333"
d="M 1.3339844 0 C 0.89237001 0.00051430825 0.53371744 0.35916689 0.53320312 0.80078125 L 0.53320312 15.199219 C 0.53371737 15.640833 0.89236979 15.999486 1.3339844 16 L 14.666016 16 C 15.10763 15.999486 15.466282 15.640833 15.466797 15.199219 L 15.466797 4.1113281 C 15.467385 3.8990566 15.382939 3.6946016 15.232422 3.5449219 L 11.921875 0.234375 C 11.772195 0.083857583 11.56774 -0.00058789361 11.355469 0 L 1.3339844 0 z M 2.1699219 1.5957031 L 4.2675781 1.5957031 L 4.2675781 5.3339844 L 11.199219 5.3339844 L 11.199219 1.5957031 L 11.246094 1.5957031 L 13.849609 4.2207031 L 13.849609 14.580078 L 2.1699219 14.580078 L 2.1699219 1.5957031 z M 5.765625 1.5957031 L 9.6230469 1.5957031 L 9.6230469 3.8945312 L 5.765625 3.8945312 L 5.765625 1.5957031 z M 7.8671875 6.9335938 C 5.1348907 6.9335938 3.7674272 10.236177 5.6992188 12.167969 C 7.63101 14.09976 10.933594 12.732297 10.933594 10 C 10.931757 8.3070891 9.5600984 6.9354309 7.8671875 6.9335938 z M 7.8652344 8.5234375 C 8.6813058 8.524323 9.3428645 9.1858818 9.34375 10.001953 C 9.34375 11.319063 7.7515363 11.9781 6.8203125 11.046875 C 5.8890879 10.115651 6.548125 8.5234375 7.8652344 8.5234375 z "
transform="scale(0.26458333)" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.8 KiB

@ -1,60 +0,0 @@
<?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="16"
height="16"
viewBox="0 0 4.2333332 4.2333335"
version="1.1"
id="svg1123"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
sodipodi:docname="icon_search.svg">
<defs
id="defs1117" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="52.312834"
inkscape:cx="8.0000001"
inkscape:cy="8"
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="metadata1120">
<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="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:#c3ccdf;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.218994;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 1.6396931,4.2071667e-5 C 1.2208792,4.2071667e-5 0.80092396,0.16261109 0.48210957,0.48143454 0.16327384,0.800258 0,1.2196884 0,1.6386495 0,2.0576106 0.16160985,2.4675692 0.48210957,2.7958645 0.80030529,3.1140693 1.2195565,3.2687664 1.6396931,3.2687664 c 0.326953,0 0.6520287,-0.093012 0.9216913,-0.2856184 l 0.074773,-0.054079 1.30442,1.3042642 0.2927559,-0.292317 -1.3044201,-1.3042749 0.052373,-0.074239 C 3.174992,2.2835717 3.2686768,1.956855 3.2686768,1.6386076 3.2686768,1.2183238 3.113275,0.79959737 2.7950686,0.48139258 2.4762542,0.16256913 2.0585389,1.0166667e-7 1.6397144,1.0166667e-7 Z m 0,0.410321188333 c 0.3096197,0 0.6271968,0.11840947 0.8643903,0.36473232 0.2350494,0.23595492 0.3536302,0.54726912 0.3536302,0.86355392 0,0.3095436 -0.1191034,0.6195671 -0.3536302,0.863106 l -0.00213,0.00213 C 2.2647992,2.7410351 1.9490035,2.8587833 1.6393517,2.8587833 c -0.3096624,0 -0.6276981,-0.1177482 -0.86483828,-0.3548871 l -0.002133,-0.00213 C 0.53785329,2.2582166 0.41873922,1.9481931 0.41873922,1.6386495 c 0,-0.3170314 0.11927406,-0.6287403 0.35542221,-0.8648979 C 1.0111842,0.52861273 1.330116,0.41036326 1.6389997,0.41036326 Z" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.0 KiB

@ -1,78 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 2.7 KiB

@ -1,78 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 6.1 KiB

@ -1,78 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 6.6 KiB

@ -1,101 +0,0 @@
<?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"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
viewBox="0 0 18 18"
xml:space="preserve"
sodipodi:docname="icon_widgets.svg"
width="18"
height="18"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"><metadata
id="metadata43"><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><defs
id="defs41" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1027"
id="namedview39"
showgrid="false"
inkscape:zoom="1.709928"
inkscape:cx="244.89999"
inkscape:cy="244.89999"
inkscape:window-x="1912"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1" />
<g
id="g6"
transform="matrix(0.03674969,0,0,0.03674969,9.19e-7,-1.3853197e-5)"
style="fill:#c3ccdf;fill-opacity:1">
<g
id="g4"
style="fill:#c3ccdf;fill-opacity:1">
<path
d="m 489.8,280.92 c 0,-13.9 -11.3,-25.2 -25.2,-25.2 h -74.1 c -62.1,0 -112.4,50.2 -112.7,112.2 -0.1,32.3 -23,61 -55,65 -38.4,4.8 -71.2,-25.2 -71.2,-62.6 v -56.4 c 57.6,-11.7 101,-62.6 101,-123.7 v -64 c 0,-9.1 -7.3,-16.4 -16.4,-16.4 h -31.3 v -79.1 c 0,-12.4 -9,-23.4 -21.3,-24.6 -14.1,-1.4 -26,9.7 -26,23.6 v 80.1 H 95.2 v -79.1 c 0,-12.4 -9,-23.4 -21.4,-24.6 -14.1,-1.3 -26,9.7 -26,23.6 v 80.1 H 16.4 c -9.1,0 -16.4,7.3 -16.4,16.4 v 64 c 0,61.1 43.4,112 101,123.7 v 53.5 c 0,61.5 47.7,114 109.2,116.3 64.6,2.4 118,-49.4 118,-113.5 v -0.9 c 0,-34.9 28.3,-63.1 63.1,-63.1 h 73.2 c 14,-0.1 25.3,-11.4 25.3,-25.3 z"
id="path2"
style="fill:#c3ccdf;fill-opacity:1" />
</g>
</g>
<g
id="g8">
</g>
<g
id="g10">
</g>
<g
id="g12">
</g>
<g
id="g14">
</g>
<g
id="g16">
</g>
<g
id="g18">
</g>
<g
id="g20">
</g>
<g
id="g22">
</g>
<g
id="g24">
</g>
<g
id="g26">
</g>
<g
id="g28">
</g>
<g
id="g30">
</g>
<g
id="g32">
</g>
<g
id="g34">
</g>
<g
id="g36">
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

@ -1,60 +0,0 @@
<?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="16"
height="16"
viewBox="0 0 4.2333332 4.2333335"
version="1.1"
id="svg1107"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
sodipodi:docname="no_icon.svg">
<defs
id="defs1101" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="26.156251"
inkscape:cx="3.3352559"
inkscape:cy="11.186469"
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="metadata1104">
<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="path1676"
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:#c3ccdf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.07085;stroke-linecap:round;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 1.1666666e-8,1.1666666e-8 V 0.28222226 4.2333333 H 4.2333333 V 1.1666666e-8 Z M 0.56665798,0.56665798 H 3.285952 L 0.56665798,3.285952 Z M 3.6666754,0.94738132 V 3.6666754 H 0.94738132 Z" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.1 KiB

@ -1,158 +0,0 @@
<?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="300"
height="70"
viewBox="0 0 79.374998 18.520833"
version="1.1"
id="svg1132"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
sodipodi:docname="logo_home.svg">
<defs
id="defs1126">
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect1836"
is_visible="true"
lpeversion="1"
satellites_param="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,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
unit="px"
method="auto"
mode="F"
radius="1"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="true"
hide_knots="false" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.3156936"
inkscape:cx="103.4558"
inkscape:cy="-63.038698"
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="metadata1129">
<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
id="g1811"
transform="matrix(3.0579283,0,0,3.0579283,-0.79418142,0.36057057)">
<g
id="g1822"
transform="matrix(0.37563903,0,0,0.37563903,-64.288753,-32.575173)">
<g
id="g1810">
<g
id="g1804">
<g
aria-label="PY"
id="g1800"
style="font-style:normal;font-weight:normal;font-size:2.85476px;line-height:1.25;font-family:sans-serif;fill:#dce1ec;fill-opacity:1;stroke:none;stroke-width:0.0713691"
transform="translate(-0.108475,-0.0784345)">
<path
d="m 196.06915,94.086075 c 0,-0.336862 -0.27406,-0.610919 -0.61092,-0.610919 h -0.80504 v 2.14107 h 0.34257 v -0.919233 h 0.46247 c 0.33686,0 0.61092,-0.274056 0.61092,-0.610918 z m -0.34257,0 c 0,0.171285 -0.11134,0.311169 -0.28262,0.311169 h -0.4482 v -0.622338 h 0.4482 c 0.17128,0 0.28262,0.139883 0.28262,0.311169 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Ano Bold';-inkscape-font-specification:'Ano Bold, ';fill:#dce1ec;fill-opacity:1;stroke-width:0.0713691"
id="path1796" />
<path
d="m 197.84548,93.475156 -0.61378,0.802188 -0.61091,-0.802188 h -0.41109 l 0.85072,1.113357 v 1.027713 h 0.34257 v -1.024859 l 0.85357,-1.116211 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Ano Bold';-inkscape-font-specification:'Ano Bold, ';fill:#dce1ec;fill-opacity:1;stroke-width:0.0713691"
id="path1798" />
</g>
<path
id="path1802"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.8299px;line-height:1.25;font-family:'Ano Regular';-inkscape-font-specification:'Ano Regular, ';letter-spacing:0px;word-spacing:0px;fill:#dce1ec;fill-opacity:1;stroke:none;stroke-width:0.25106"
d="m 200.31312,94.467255 c 0,-2.189227 -1.77749,-3.966719 -3.96672,-3.966719 -2.18923,0 -3.96672,1.777492 -3.96672,3.966719 0,2.18923 1.77749,3.966722 3.96672,3.966722 2.18923,0 3.96672,-1.777492 3.96672,-3.966722 z m -0.80338,0 c 0,1.797579 -1.41598,3.263759 -3.16334,3.263759 -1.74736,0 -3.16333,-1.46618 -3.16333,-3.263759 0,-1.797577 1.41597,-3.263756 3.16333,-3.263756 1.74736,0 3.16334,1.466179 3.16334,3.263756 z" />
</g>
<path
d="m 207.29882,90.701382 h -0.80339 V 96.8975 l -4.06714,-6.196118 h -0.80339 v 7.531748 h 0.80339 v -6.186075 l 4.06714,6.186075 h 0.80339 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.8299px;line-height:1.25;font-family:'Ano Regular';-inkscape-font-specification:'Ano Regular, ';letter-spacing:0px;word-spacing:0px;fill:#dce1ec;fill-opacity:1;stroke:none;stroke-width:0.25106"
id="path1806" />
<path
d="m 213.06923,97.530167 h -3.36418 v -2.711429 h 3.06291 v -0.702963 h -3.06291 v -2.71143 h 3.36418 v -0.702963 h -4.16757 v 7.531748 h 4.16757 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.8299px;line-height:1.25;font-family:'Ano Regular';-inkscape-font-specification:'Ano Regular, ';letter-spacing:0px;word-spacing:0px;fill:#dce1ec;fill-opacity:1;stroke:none;stroke-width:0.25106"
id="path1808" />
</g>
<g
id="g1820">
<path
d="m 220.63801,94.467255 c 0,-2.068719 -1.67707,-3.765873 -3.75582,-3.765873 h -2.61101 v 7.531748 h 2.61101 c 2.07875,0 3.75582,-1.687111 3.75582,-3.765875 z m -1.72728,0 c 0,1.174954 -0.94398,2.118932 -2.11893,2.118932 h -0.79335 v -4.237862 h 0.79335 c 1.17495,0 2.11893,0.954021 2.11893,2.11893 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.8299px;line-height:1.25;font-family:'Ano Black';-inkscape-font-specification:'Ano Black, ';letter-spacing:0px;word-spacing:0px;fill:#4f9fee;fill-opacity:1;stroke:none;stroke-width:0.25106"
id="path1812" />
<path
d="m 225.71316,90.701382 h -1.80763 l -2.86207,7.531748 h 1.83776 l 0.40169,-1.064486 h 3.04282 l 0.39166,1.064486 h 1.84778 z m -1.81766,4.830361 0.91384,-2.420202 0.90382,2.420202 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.8299px;line-height:1.25;font-family:'Ano Black';-inkscape-font-specification:'Ano Black, ';letter-spacing:0px;word-spacing:0px;fill:#4f9fee;fill-opacity:1;stroke:none;stroke-width:0.25106"
id="path1814" />
<path
d="m 232.31144,95.190303 c 0.93393,-0.281185 1.6168,-1.154867 1.6168,-2.189227 0,-1.265333 -1.02432,-2.299694 -2.28963,-2.299694 h -2.48047 v 7.531748 h 1.72728 v -2.118932 l 1.67708,2.118932 h 2.14905 z m -0.1105,-2.189227 c 0,0.411736 -0.25106,0.652752 -0.56238,0.652752 h -0.75317 v -1.305503 h 0.75317 c 0.31132,0 0.56238,0.241015 0.56238,0.652751 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.8299px;line-height:1.25;font-family:'Ano Black';-inkscape-font-specification:'Ano Black, ';letter-spacing:0px;word-spacing:0px;fill:#4f9fee;fill-opacity:1;stroke:none;stroke-width:0.25106"
id="path1816" />
<path
d="m 238.75845,90.701382 -2.00846,2.36999 v -2.36999 h -1.72729 v 7.531748 h 1.72729 v -2.339863 l 1.98839,2.339863 h 2.17918 l -3.19346,-3.755832 3.21354,-3.775916 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.8299px;line-height:1.25;font-family:'Ano Black';-inkscape-font-specification:'Ano Black, ';letter-spacing:0px;word-spacing:0px;fill:#4f9fee;fill-opacity:1;stroke:none;stroke-width:0.25106"
id="path1818" />
</g>
</g>
<g
id="g1790">
<path
id="path1824"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:1.25;font-family:'Ano Black';-inkscape-font-specification:'Ano Black, ';fill:#4f9fee;fill-opacity:1;stroke:none;stroke-width:0.171201"
d="m 6.0294424,2.568037 c 0,-1.4106927 -1.1436221,-2.568008872565 -2.56116,-2.568008872565 H 1.7851565 V 5.1360473 h 1.6831259 c 1.4175379,0 2.56116,-1.1504695 2.56116,-2.5680103 z m -1.1778576,0 c 0,0.8012186 -0.6437136,1.4449327 -1.4449349,1.4449327 H 2.3364893 v -2.889866 h 1.0701606 c 0.8012213,0 1.4449349,0.6505625 1.4449349,1.4449333 z"
sodipodi:nodetypes="ssccssssccss" />
<path
id="path1826"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:1.25;font-family:'Ano Black';-inkscape-font-specification:'Ano Black, ';fill:#3d8ad5;fill-opacity:1;stroke:none;stroke-width:0.171201"
d="M 2.0300435,1.255144e-5 1.6876461,0.00635735 V 1.0924146 C 1.876678,1.0921558 2.0300435,1.2454526 2.0300435,1.4344813 V 5.1360358 H 3.0666136 C 3.1729317,4.9320827 3.2265932,4.6974519 3.2080542,4.451231 V 4.0128603 H 2.3364893 V 1.1231724 H 3.2023729 C 3.1322897,0.52831193 2.6497261,0.04664426 2.0300435,2.3144399e-7 Z"
sodipodi:nodetypes="cccsccccccccc" />
<path
d="M 1.852148,1.255144e-5 1.6876461,0.00635735 V 1.0924146 C 1.876678,1.0921558 2.0300435,1.2454526 2.0300435,1.4344813 V 5.1360358 H 2.8887173 C 2.9950362,4.9320827 3.0486959,4.6974519 3.0301587,4.451231 V 4.0128603 H 2.1585938 V 1.1231724 H 3.0244775 C 2.9543925,0.52831193 2.4075378,2.3144399e-7 1.852148,2.3144399e-7 Z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:1.25;font-family:'Ano Black';-inkscape-font-specification:'Ano Black, ';fill:#2d7bc5;fill-opacity:1;stroke:none;stroke-width:0.171201"
id="path1828"
sodipodi:nodetypes="cccsccccccccc" />
<path
inkscape:original-d="M 1.6877949,2.2554433e-6 1.1470667,0.00944201 0.10799299,1.0937135 1.3453905,1.0924815 c 0.1890319,-2.581e-4 0.3424044,0.152908 0.3424044,0.3419373 V 5.8208335 C 2.3912578,5.7679015 2.9185985,5.1546923 2.8656498,4.4512261 V 1.3696243 C 2.9185792,0.66616151 2.3912578,0.05296662 1.6877949,1.5103439e-5 Z"
inkscape:path-effect="#path-effect1836"
sodipodi:nodetypes="ccccccccsc"
id="path1830"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:1.25;font-family:'Ano Black';-inkscape-font-specification:'Ano Black, ';fill:#dce1ec;fill-opacity:1;stroke:none;stroke-width:0.171201"
d="M 1.6877949,2.2554433e-6 1.4116097,0.00482375 A 0.63531929,0.63531929 156.39022 0 0 0.96400189,0.2004698 L 0.2910578,0.90268571 A 0.11275169,0.11275169 66.861767 0 0 0.37257619,1.0934501 L 1.3453905,1.0924815 c 0.1890319,-2.581e-4 0.3424044,0.152908 0.3424044,0.3419373 V 5.8208335 C 2.3912578,5.7679015 2.9185985,5.1546923 2.8656498,4.4512261 V 1.3696243 C 2.9185792,0.66616151 2.3912578,0.05296662 1.6877949,1.5103439e-5 Z" />
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 11 KiB

@ -1,157 +0,0 @@
<?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="100"
height="22"
viewBox="0 0 26.458333 5.8208334"
version="1.1"
id="svg1132"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
sodipodi:docname="logo_top_100x22.svg">
<defs
id="defs1126">
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect1836"
is_visible="true"
lpeversion="1"
satellites_param="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,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
unit="px"
method="auto"
mode="F"
radius="1"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="true"
hide_knots="false" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="4.7556835"
inkscape:cx="29.382824"
inkscape:cy="2.9469558"
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="metadata1129">
<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
id="g1811">
<g
id="g1822"
transform="matrix(0.37563903,0,0,0.37563903,-64.288753,-32.575173)">
<g
id="g1810">
<g
id="g1804">
<g
aria-label="PY"
id="g1800"
style="font-style:normal;font-weight:normal;font-size:2.85476px;line-height:1.25;font-family:sans-serif;fill:#dce1ec;fill-opacity:1;stroke:none;stroke-width:0.0713691"
transform="translate(-0.108475,-0.0784345)">
<path
d="m 196.06915,94.086075 c 0,-0.336862 -0.27406,-0.610919 -0.61092,-0.610919 h -0.80504 v 2.14107 h 0.34257 v -0.919233 h 0.46247 c 0.33686,0 0.61092,-0.274056 0.61092,-0.610918 z m -0.34257,0 c 0,0.171285 -0.11134,0.311169 -0.28262,0.311169 h -0.4482 v -0.622338 h 0.4482 c 0.17128,0 0.28262,0.139883 0.28262,0.311169 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Ano Bold';-inkscape-font-specification:'Ano Bold, ';fill:#dce1ec;fill-opacity:1;stroke-width:0.0713691"
id="path1796" />
<path
d="m 197.84548,93.475156 -0.61378,0.802188 -0.61091,-0.802188 h -0.41109 l 0.85072,1.113357 v 1.027713 h 0.34257 v -1.024859 l 0.85357,-1.116211 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Ano Bold';-inkscape-font-specification:'Ano Bold, ';fill:#dce1ec;fill-opacity:1;stroke-width:0.0713691"
id="path1798" />
</g>
<path
id="path1802"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.8299px;line-height:1.25;font-family:'Ano Regular';-inkscape-font-specification:'Ano Regular, ';letter-spacing:0px;word-spacing:0px;fill:#dce1ec;fill-opacity:1;stroke:none;stroke-width:0.25106"
d="m 200.31312,94.467255 c 0,-2.189227 -1.77749,-3.966719 -3.96672,-3.966719 -2.18923,0 -3.96672,1.777492 -3.96672,3.966719 0,2.18923 1.77749,3.966722 3.96672,3.966722 2.18923,0 3.96672,-1.777492 3.96672,-3.966722 z m -0.80338,0 c 0,1.797579 -1.41598,3.263759 -3.16334,3.263759 -1.74736,0 -3.16333,-1.46618 -3.16333,-3.263759 0,-1.797577 1.41597,-3.263756 3.16333,-3.263756 1.74736,0 3.16334,1.466179 3.16334,3.263756 z" />
</g>
<path
d="m 207.29882,90.701382 h -0.80339 V 96.8975 l -4.06714,-6.196118 h -0.80339 v 7.531748 h 0.80339 v -6.186075 l 4.06714,6.186075 h 0.80339 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.8299px;line-height:1.25;font-family:'Ano Regular';-inkscape-font-specification:'Ano Regular, ';letter-spacing:0px;word-spacing:0px;fill:#dce1ec;fill-opacity:1;stroke:none;stroke-width:0.25106"
id="path1806" />
<path
d="m 213.06923,97.530167 h -3.36418 v -2.711429 h 3.06291 v -0.702963 h -3.06291 v -2.71143 h 3.36418 v -0.702963 h -4.16757 v 7.531748 h 4.16757 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.8299px;line-height:1.25;font-family:'Ano Regular';-inkscape-font-specification:'Ano Regular, ';letter-spacing:0px;word-spacing:0px;fill:#dce1ec;fill-opacity:1;stroke:none;stroke-width:0.25106"
id="path1808" />
</g>
<g
id="g1820">
<path
d="m 220.63801,94.467255 c 0,-2.068719 -1.67707,-3.765873 -3.75582,-3.765873 h -2.61101 v 7.531748 h 2.61101 c 2.07875,0 3.75582,-1.687111 3.75582,-3.765875 z m -1.72728,0 c 0,1.174954 -0.94398,2.118932 -2.11893,2.118932 h -0.79335 v -4.237862 h 0.79335 c 1.17495,0 2.11893,0.954021 2.11893,2.11893 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.8299px;line-height:1.25;font-family:'Ano Black';-inkscape-font-specification:'Ano Black, ';letter-spacing:0px;word-spacing:0px;fill:#4f9fee;fill-opacity:1;stroke:none;stroke-width:0.25106"
id="path1812" />
<path
d="m 225.71316,90.701382 h -1.80763 l -2.86207,7.531748 h 1.83776 l 0.40169,-1.064486 h 3.04282 l 0.39166,1.064486 h 1.84778 z m -1.81766,4.830361 0.91384,-2.420202 0.90382,2.420202 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.8299px;line-height:1.25;font-family:'Ano Black';-inkscape-font-specification:'Ano Black, ';letter-spacing:0px;word-spacing:0px;fill:#4f9fee;fill-opacity:1;stroke:none;stroke-width:0.25106"
id="path1814" />
<path
d="m 232.31144,95.190303 c 0.93393,-0.281185 1.6168,-1.154867 1.6168,-2.189227 0,-1.265333 -1.02432,-2.299694 -2.28963,-2.299694 h -2.48047 v 7.531748 h 1.72728 v -2.118932 l 1.67708,2.118932 h 2.14905 z m -0.1105,-2.189227 c 0,0.411736 -0.25106,0.652752 -0.56238,0.652752 h -0.75317 v -1.305503 h 0.75317 c 0.31132,0 0.56238,0.241015 0.56238,0.652751 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.8299px;line-height:1.25;font-family:'Ano Black';-inkscape-font-specification:'Ano Black, ';letter-spacing:0px;word-spacing:0px;fill:#4f9fee;fill-opacity:1;stroke:none;stroke-width:0.25106"
id="path1816" />
<path
d="m 238.75845,90.701382 -2.00846,2.36999 v -2.36999 h -1.72729 v 7.531748 h 1.72729 v -2.339863 l 1.98839,2.339863 h 2.17918 l -3.19346,-3.755832 3.21354,-3.775916 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.8299px;line-height:1.25;font-family:'Ano Black';-inkscape-font-specification:'Ano Black, ';letter-spacing:0px;word-spacing:0px;fill:#4f9fee;fill-opacity:1;stroke:none;stroke-width:0.25106"
id="path1818" />
</g>
</g>
<g
id="g1790">
<path
id="path1824"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:1.25;font-family:'Ano Black';-inkscape-font-specification:'Ano Black, ';fill:#4f9fee;fill-opacity:1;stroke:none;stroke-width:0.171201"
d="m 6.0294424,2.568037 c 0,-1.4106927 -1.1436221,-2.568008872565 -2.56116,-2.568008872565 H 1.7851565 V 5.1360473 h 1.6831259 c 1.4175379,0 2.56116,-1.1504695 2.56116,-2.5680103 z m -1.1778576,0 c 0,0.8012186 -0.6437136,1.4449327 -1.4449349,1.4449327 H 2.3364893 v -2.889866 h 1.0701606 c 0.8012213,0 1.4449349,0.6505625 1.4449349,1.4449333 z"
sodipodi:nodetypes="ssccssssccss" />
<path
id="path1826"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:1.25;font-family:'Ano Black';-inkscape-font-specification:'Ano Black, ';fill:#3d8ad5;fill-opacity:1;stroke:none;stroke-width:0.171201"
d="M 2.0300435,1.255144e-5 1.6876461,0.00635735 V 1.0924146 C 1.876678,1.0921558 2.0300435,1.2454526 2.0300435,1.4344813 V 5.1360358 H 3.0666136 C 3.1729317,4.9320827 3.2265932,4.6974519 3.2080542,4.451231 V 4.0128603 H 2.3364893 V 1.1231724 H 3.2023729 C 3.1322897,0.52831193 2.6497261,0.04664426 2.0300435,2.3144399e-7 Z"
sodipodi:nodetypes="cccsccccccccc" />
<path
d="M 1.852148,1.255144e-5 1.6876461,0.00635735 V 1.0924146 C 1.876678,1.0921558 2.0300435,1.2454526 2.0300435,1.4344813 V 5.1360358 H 2.8887173 C 2.9950362,4.9320827 3.0486959,4.6974519 3.0301587,4.451231 V 4.0128603 H 2.1585938 V 1.1231724 H 3.0244775 C 2.9543925,0.52831193 2.4075378,2.3144399e-7 1.852148,2.3144399e-7 Z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:1.25;font-family:'Ano Black';-inkscape-font-specification:'Ano Black, ';fill:#2d7bc5;fill-opacity:1;stroke:none;stroke-width:0.171201"
id="path1828"
sodipodi:nodetypes="cccsccccccccc" />
<path
inkscape:original-d="M 1.6877949,2.2554433e-6 1.1470667,0.00944201 0.10799299,1.0937135 1.3453905,1.0924815 c 0.1890319,-2.581e-4 0.3424044,0.152908 0.3424044,0.3419373 V 5.8208335 C 2.3912578,5.7679015 2.9185985,5.1546923 2.8656498,4.4512261 V 1.3696243 C 2.9185792,0.66616151 2.3912578,0.05296662 1.6877949,1.5103439e-5 Z"
inkscape:path-effect="#path-effect1836"
sodipodi:nodetypes="ccccccccsc"
id="path1830"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:1.25;font-family:'Ano Black';-inkscape-font-specification:'Ano Black, ';fill:#dce1ec;fill-opacity:1;stroke:none;stroke-width:0.171201"
d="M 1.6877949,2.2554433e-6 1.4116097,0.00482375 A 0.63531929,0.63531929 156.39022 0 0 0.96400189,0.2004698 L 0.2910578,0.90268571 A 0.11275169,0.11275169 66.861767 0 0 0.37257619,1.0934501 L 1.3453905,1.0924815 c 0.1890319,-2.581e-4 0.3424044,0.152908 0.3424044,0.3419373 V 5.8208335 C 2.3912578,5.7679015 2.9185985,5.1546923 2.8656498,4.4512261 V 1.3696243 C 2.9185792,0.66616151 2.3912578,0.05296662 1.6877949,1.5103439e-5 Z" />
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 11 KiB

@ -1,28 +0,0 @@
{
"theme_name" : "Default",
"app_color" : {
"dark_one" : "#1b1e23",
"dark_two" : "#1e2229",
"dark_three" : "#21252d",
"dark_four" : "#272c36",
"bg_one" : "#D3E0F7",
"bg_two" : "#E2E9F7",
"bg_three" : "#EFF1F7",
"icon_color" : "#6C7C96",
"icon_hover" : "#8CB8FF",
"icon_pressed" : "#6c99f4",
"icon_active" : "#8CB8FF",
"context_color" : "#568af2",
"context_hover" : "#6c99f4",
"context_pressed" : "#4B5469",
"text_title" : "#606C85",
"text_foreground" : "#6B7894",
"text_description" : "#7887A6",
"text_active" : "#8797BA",
"white" : "#f5f6f9",
"pink" : "#ff007f",
"green" : "#00ff7f",
"red" : "#ff5555",
"yellow" : "#f1fa8c"
}
}

@ -1,28 +0,0 @@
{
"theme_name" : "Default",
"app_color" : {
"dark_one" : "#1b1e23",
"dark_two" : "#1e2229",
"dark_three" : "#21252d",
"dark_four" : "#272c36",
"bg_one" : "#2c313c",
"bg_two" : "#343b48",
"bg_three" : "#3c4454",
"icon_color" : "#c3ccdf",
"icon_hover" : "#dce1ec",
"icon_pressed" : "#6c99f4",
"icon_active" : "#f5f6f9",
"context_color" : "#568af2",
"context_hover" : "#6c99f4",
"context_pressed" : "#3f6fd1",
"text_title" : "#dce1ec",
"text_foreground" : "#8a95aa",
"text_description" : "#4f5b6e",
"text_active" : "#dce1ec",
"white" : "#f5f6f9",
"pink" : "#ff007f",
"green" : "#00ff7f",
"red" : "#ff5555",
"yellow" : "#f1fa8c"
}
}

@ -1,28 +0,0 @@
{
"theme_name" : "dracula",
"app_color" : {
"dark_one" : "#282a36",
"dark_two" : "#2B2E3B",
"dark_three" : "#333645",
"dark_four" : "#3C4052",
"bg_one" : "#44475a",
"bg_two" : "#4D5066",
"bg_three" : "#595D75",
"icon_color" : "#c3ccdf",
"icon_hover" : "#dce1ec",
"icon_pressed" : "#ff79c6",
"icon_active" : "#f5f6f9",
"context_color" : "#ff79c6",
"context_hover" : "#FF84D7",
"context_pressed" : "#FF90DD",
"text_title" : "#dce1ec",
"text_foreground" : "#f8f8f2",
"text_description" : "#979EC7",
"text_active" : "#dce1ec",
"white" : "#f5f6f9",
"pink" : "#ff79c6",
"green" : "#00ff7f",
"red" : "#ff5555",
"yellow" : "#f1fa8c"
}
}

@ -1,271 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>LeftColumn</class>
<widget class="QWidget" name="LeftColumn">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>240</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="main_pages_layout">
<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="QStackedWidget" name="menus">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="menu_1">
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>5</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="QWidget" name="btn_1_widget" native="true">
<property name="minimumSize">
<size>
<width>0</width>
<height>40</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>40</height>
</size>
</property>
<layout class="QVBoxLayout" name="btn_1_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>
<item>
<widget class="QWidget" name="btn_2_widget" native="true">
<property name="minimumSize">
<size>
<width>0</width>
<height>40</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>40</height>
</size>
</property>
<layout class="QVBoxLayout" name="btn_2_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>
<item>
<widget class="QWidget" name="btn_3_widget" native="true">
<property name="minimumSize">
<size>
<width>0</width>
<height>40</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>40</height>
</size>
</property>
<layout class="QVBoxLayout" name="btn_3_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>
<item>
<widget class="QLabel" name="label_1">
<property name="font">
<font>
<pointsize>16</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true">font-size: 16pt</string>
</property>
<property name="text">
<string>Menu 1 - Left Menu</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="menu_2">
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing">
<number>5</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="QWidget" name="btn_4_widget" native="true">
<property name="minimumSize">
<size>
<width>0</width>
<height>40</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>40</height>
</size>
</property>
<layout class="QVBoxLayout" name="btn_4_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>
<item>
<widget class="QLabel" name="label_2">
<property name="font">
<font>
<pointsize>16</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true">font-size: 16pt</string>
</property>
<property name="text">
<string>Menu 2 - Left Menu</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_3">
<property name="font">
<font>
<pointsize>9</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true">font-size: 9pt</string>
</property>
<property name="text">
<string>This is just an example menu.
Add Qt Widgets or your custom widgets here.</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

@ -1,117 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>RightColumn</class>
<widget class="QWidget" name="RightColumn">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>240</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="main_pages_layout">
<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="QStackedWidget" name="menus">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="menu_1">
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>5</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="label_1">
<property name="font">
<font>
<pointsize>16</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true">font-size: 16pt</string>
</property>
<property name="text">
<string>Menu 1 - Right Menu</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="menu_2">
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing">
<number>5</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="label_2">
<property name="font">
<font>
<pointsize>16</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true">font-size: 16pt</string>
</property>
<property name="text">
<string>Menu 2 - Right Menu</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

@ -1,138 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 QT CORE
# ///////////////////////////////////////////////////////////////
from src.educoder.qt_core import *
class Ui_LeftColumn(object):
def setupUi(self, LeftColumn):
if not LeftColumn.objectName():
LeftColumn.setObjectName(u"LeftColumn")
LeftColumn.resize(240, 600)
self.main_pages_layout = QVBoxLayout(LeftColumn)
self.main_pages_layout.setSpacing(0)
self.main_pages_layout.setObjectName(u"main_pages_layout")
self.main_pages_layout.setContentsMargins(5, 5, 5, 5)
self.menus = QStackedWidget(LeftColumn)
self.menus.setObjectName(u"menus")
self.menu_1 = QWidget()
self.menu_1.setObjectName(u"menu_1")
self.verticalLayout = QVBoxLayout(self.menu_1)
self.verticalLayout.setSpacing(5)
self.verticalLayout.setObjectName(u"verticalLayout")
self.verticalLayout.setContentsMargins(5, 5, 5, 5)
self.btn_1_widget = QWidget(self.menu_1)
self.btn_1_widget.setObjectName(u"btn_1_widget")
self.btn_1_widget.setMinimumSize(QSize(0, 40))
self.btn_1_widget.setMaximumSize(QSize(16777215, 40))
self.btn_1_layout = QVBoxLayout(self.btn_1_widget)
self.btn_1_layout.setSpacing(0)
self.btn_1_layout.setObjectName(u"btn_1_layout")
self.btn_1_layout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.addWidget(self.btn_1_widget)
self.btn_2_widget = QWidget(self.menu_1)
self.btn_2_widget.setObjectName(u"btn_2_widget")
self.btn_2_widget.setMinimumSize(QSize(0, 40))
self.btn_2_widget.setMaximumSize(QSize(16777215, 40))
self.btn_2_layout = QVBoxLayout(self.btn_2_widget)
self.btn_2_layout.setSpacing(0)
self.btn_2_layout.setObjectName(u"btn_2_layout")
self.btn_2_layout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.addWidget(self.btn_2_widget)
self.btn_3_widget = QWidget(self.menu_1)
self.btn_3_widget.setObjectName(u"btn_3_widget")
self.btn_3_widget.setMinimumSize(QSize(0, 40))
self.btn_3_widget.setMaximumSize(QSize(16777215, 40))
self.btn_3_layout = QVBoxLayout(self.btn_3_widget)
self.btn_3_layout.setSpacing(0)
self.btn_3_layout.setObjectName(u"btn_3_layout")
self.btn_3_layout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.addWidget(self.btn_3_widget)
self.label_1 = QLabel(self.menu_1)
self.label_1.setObjectName(u"label_1")
font = QFont()
font.setPointSize(16)
self.label_1.setFont(font)
self.label_1.setStyleSheet(u"font-size: 16pt")
self.label_1.setAlignment(Qt.AlignCenter)
self.verticalLayout.addWidget(self.label_1)
self.menus.addWidget(self.menu_1)
self.menu_2 = QWidget()
self.menu_2.setObjectName(u"menu_2")
self.verticalLayout_2 = QVBoxLayout(self.menu_2)
self.verticalLayout_2.setSpacing(5)
self.verticalLayout_2.setObjectName(u"verticalLayout_2")
self.verticalLayout_2.setContentsMargins(5, 5, 5, 5)
self.btn_4_widget = QWidget(self.menu_2)
self.btn_4_widget.setObjectName(u"btn_4_widget")
self.btn_4_widget.setMinimumSize(QSize(0, 40))
self.btn_4_widget.setMaximumSize(QSize(16777215, 40))
self.btn_4_layout = QVBoxLayout(self.btn_4_widget)
self.btn_4_layout.setSpacing(0)
self.btn_4_layout.setObjectName(u"btn_4_layout")
self.btn_4_layout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_2.addWidget(self.btn_4_widget)
self.label_2 = QLabel(self.menu_2)
self.label_2.setObjectName(u"label_2")
self.label_2.setFont(font)
self.label_2.setStyleSheet(u"font-size: 16pt")
self.label_2.setAlignment(Qt.AlignCenter)
self.verticalLayout_2.addWidget(self.label_2)
self.label_3 = QLabel(self.menu_2)
self.label_3.setObjectName(u"label_3")
font1 = QFont()
font1.setPointSize(9)
self.label_3.setFont(font1)
self.label_3.setStyleSheet(u"font-size: 9pt")
self.label_3.setAlignment(Qt.AlignCenter)
self.label_3.setWordWrap(True)
self.verticalLayout_2.addWidget(self.label_3)
self.menus.addWidget(self.menu_2)
self.main_pages_layout.addWidget(self.menus)
self.retranslateUi(LeftColumn)
self.menus.setCurrentIndex(0)
QMetaObject.connectSlotsByName(LeftColumn)
# setupUi
def retranslateUi(self, LeftColumn):
LeftColumn.setWindowTitle(QCoreApplication.translate("LeftColumn", u"Form", None))
self.label_1.setText(QCoreApplication.translate("LeftColumn", u"Menu 1 - Left Menu", None))
self.label_2.setText(QCoreApplication.translate("LeftColumn", u"Menu 2 - Left Menu", None))
self.label_3.setText(QCoreApplication.translate("LeftColumn", u"This is just an example menu.\n"
"Add Qt Widgets or your custom widgets here.", None))
# retranslateUi

@ -1,116 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 QT CORE
# ///////////////////////////////////////////////////////////////
from src.educoder.qt_core import *
class Ui_RightColumn(object):
def setupUi(self, RightColumn):
if not RightColumn.objectName():
RightColumn.setObjectName(u"RightColumn")
RightColumn.resize(240, 600)
self.main_pages_layout = QVBoxLayout(RightColumn)
self.main_pages_layout.setSpacing(0)
self.main_pages_layout.setObjectName(u"main_pages_layout")
self.main_pages_layout.setContentsMargins(5, 5, 5, 5)
self.menus = QStackedWidget(RightColumn)
self.menus.setObjectName(u"menus")
self.menu_1 = QWidget()
self.menu_1.setObjectName(u"menu_1")
self.verticalLayout = QVBoxLayout(self.menu_1)
self.verticalLayout.setSpacing(5)
self.verticalLayout.setObjectName(u"verticalLayout")
self.verticalLayout.setContentsMargins(5, 5, 5, 5)
self.btn_1_widget = QWidget(self.menu_1)
self.btn_1_widget.setObjectName(u"btn_1_widget")
self.btn_1_widget.setMinimumSize(QSize(0, 40))
self.btn_1_widget.setMaximumSize(QSize(16777215, 40))
self.btn_1_layout = QVBoxLayout(self.btn_1_widget)
self.btn_1_layout.setSpacing(0)
self.btn_1_layout.setObjectName(u"btn_1_layout")
self.btn_1_layout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.addWidget(self.btn_1_widget)
self.label_1 = QLabel(self.menu_1)
self.label_1.setObjectName(u"label_1")
font = QFont()
font.setPointSize(16)
self.label_1.setFont(font)
self.label_1.setStyleSheet(u"font-size: 16pt")
self.label_1.setAlignment(Qt.AlignCenter)
self.verticalLayout.addWidget(self.label_1)
self.menus.addWidget(self.menu_1)
self.menu_2 = QWidget()
self.menu_2.setObjectName(u"menu_2")
self.verticalLayout_2 = QVBoxLayout(self.menu_2)
self.verticalLayout_2.setSpacing(5)
self.verticalLayout_2.setObjectName(u"verticalLayout_2")
self.verticalLayout_2.setContentsMargins(5, 5, 5, 5)
self.btn_2_widget = QWidget(self.menu_2)
self.btn_2_widget.setObjectName(u"btn_2_widget")
self.btn_2_widget.setMinimumSize(QSize(0, 40))
self.btn_2_widget.setMaximumSize(QSize(16777215, 40))
self.btn_2_layout = QVBoxLayout(self.btn_2_widget)
self.btn_2_layout.setSpacing(0)
self.btn_2_layout.setObjectName(u"btn_2_layout")
self.btn_2_layout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_2.addWidget(self.btn_2_widget)
self.label_2 = QLabel(self.menu_2)
self.label_2.setObjectName(u"label_2")
self.label_2.setFont(font)
self.label_2.setStyleSheet(u"font-size: 16pt")
self.label_2.setAlignment(Qt.AlignCenter)
self.verticalLayout_2.addWidget(self.label_2)
self.label_3 = QLabel(self.menu_2)
self.label_3.setObjectName(u"label_3")
font1 = QFont()
font1.setPointSize(9)
self.label_3.setFont(font1)
self.label_3.setStyleSheet(u"font-size: 9pt")
self.label_3.setAlignment(Qt.AlignCenter)
self.label_3.setWordWrap(True)
self.verticalLayout_2.addWidget(self.label_3)
self.menus.addWidget(self.menu_2)
self.main_pages_layout.addWidget(self.menus)
self.retranslateUi(RightColumn)
self.menus.setCurrentIndex(1)
QMetaObject.connectSlotsByName(RightColumn)
# setupUi
def retranslateUi(self, RightColumn):
RightColumn.setWindowTitle(QCoreApplication.translate("RightColumn", u"Form", None))
self.label_1.setText(QCoreApplication.translate("RightColumn", u"Menu 1 - Right Menu", None))
self.label_2.setText(QCoreApplication.translate("RightColumn", u"Menu 2 - Right Menu", None))
self.label_3.setText(QCoreApplication.translate("RightColumn", u"This is just an example menu.\n"
"Add Qt Widgets or your custom widgets here.", None))
# retranslateUi

@ -1,298 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainPages</class>
<widget class="QWidget" name="MainPages">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>860</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="main_pages_layout">
<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="QStackedWidget" name="pages">
<property name="currentIndex">
<number>1</number>
</property>
<widget class="QWidget" name="page_1">
<property name="styleSheet">
<string notr="true">font-size: 14pt</string>
</property>
<layout class="QVBoxLayout" name="page_1_layout">
<property name="spacing">
<number>5</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 alignment="Qt::AlignHCenter">
<widget class="QFrame" name="welcome_base">
<property name="minimumSize">
<size>
<width>300</width>
<height>150</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>300</width>
<height>150</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QVBoxLayout" name="center_page_layout">
<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="logo">
<property name="minimumSize">
<size>
<width>300</width>
<height>120</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>300</width>
<height>120</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QVBoxLayout" name="logo_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>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Welcome To PyOneDark GUI</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_2">
<layout class="QVBoxLayout" name="page_2_layout">
<property name="spacing">
<number>5</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="QScrollArea" name="scroll_area">
<property name="styleSheet">
<string notr="true">background: transparent;</string>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="contents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>840</width>
<height>580</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">background: transparent;</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>15</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="title_label">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>40</height>
</size>
</property>
<property name="font">
<font>
<pointsize>16</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true">font-size: 16pt</string>
</property>
<property name="text">
<string>Custom Widgets Page</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="description_label">
<property name="text">
<string>Here will be all the custom widgets, they will be added over time on this page.
I will try to always record a new tutorial when adding a new Widget and updating the project on Patreon before launching on GitHub and GitHub after the public release.</string>
</property>
<property name="alignment">
<set>Qt::AlignHCenter|Qt::AlignTop</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="row_1_layout"/>
</item>
<item>
<layout class="QHBoxLayout" name="row_2_layout"/>
</item>
<item>
<layout class="QHBoxLayout" name="row_3_layout"/>
</item>
<item>
<layout class="QVBoxLayout" name="row_4_layout"/>
</item>
<item>
<layout class="QVBoxLayout" name="row_5_layout"/>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_3">
<property name="styleSheet">
<string notr="true">QFrame {
font-size: 16pt;
}</string>
</property>
<layout class="QVBoxLayout" name="page_3_layout">
<item>
<widget class="QLabel" name="empty_page_label">
<property name="font">
<font>
<pointsize>16</pointsize>
</font>
</property>
<property name="text">
<string>Empty Page</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

@ -1,176 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 QT CORE
# ///////////////////////////////////////////////////////////////
from src.educoder.qt_core import *
class Ui_MainPages(object):
def setupUi(self, MainPages):
if not MainPages.objectName():
MainPages.setObjectName(u"MainPages")
MainPages.resize(860, 600)
self.main_pages_layout = QVBoxLayout(MainPages)
self.main_pages_layout.setSpacing(0)
self.main_pages_layout.setObjectName(u"main_pages_layout")
self.main_pages_layout.setContentsMargins(5, 5, 5, 5)
self.pages = QStackedWidget(MainPages)
self.pages.setObjectName(u"pages")
self.page_1 = QWidget()
self.page_1.setObjectName(u"page_1")
self.page_1.setStyleSheet(u"font-size: 14pt")
self.page_1_layout = QVBoxLayout(self.page_1)
self.page_1_layout.setSpacing(5)
self.page_1_layout.setObjectName(u"page_1_layout")
self.page_1_layout.setContentsMargins(5, 5, 5, 5)
self.welcome_base = QFrame(self.page_1)
self.welcome_base.setObjectName(u"welcome_base")
self.welcome_base.setMinimumSize(QSize(300, 150))
self.welcome_base.setMaximumSize(QSize(300, 150))
self.welcome_base.setFrameShape(QFrame.NoFrame)
self.welcome_base.setFrameShadow(QFrame.Raised)
self.center_page_layout = QVBoxLayout(self.welcome_base)
self.center_page_layout.setSpacing(10)
self.center_page_layout.setObjectName(u"center_page_layout")
self.center_page_layout.setContentsMargins(0, 0, 0, 0)
self.logo = QFrame(self.welcome_base)
self.logo.setObjectName(u"logo")
self.logo.setMinimumSize(QSize(300, 120))
self.logo.setMaximumSize(QSize(300, 120))
self.logo.setFrameShape(QFrame.NoFrame)
self.logo.setFrameShadow(QFrame.Raised)
self.logo_layout = QVBoxLayout(self.logo)
self.logo_layout.setSpacing(0)
self.logo_layout.setObjectName(u"logo_layout")
self.logo_layout.setContentsMargins(0, 0, 0, 0)
self.center_page_layout.addWidget(self.logo)
self.label = QLabel(self.welcome_base)
self.label.setObjectName(u"label")
self.label.setAlignment(Qt.AlignCenter)
self.center_page_layout.addWidget(self.label)
self.page_1_layout.addWidget(self.welcome_base, 0, Qt.AlignHCenter)
self.pages.addWidget(self.page_1)
self.page_2 = QWidget()
self.page_2.setObjectName(u"page_2")
self.page_2_layout = QVBoxLayout(self.page_2)
self.page_2_layout.setSpacing(5)
self.page_2_layout.setObjectName(u"page_2_layout")
self.page_2_layout.setContentsMargins(5, 5, 5, 5)
self.scroll_area = QScrollArea(self.page_2)
self.scroll_area.setObjectName(u"scroll_area")
self.scroll_area.setStyleSheet(u"background: transparent;")
self.scroll_area.setFrameShape(QFrame.NoFrame)
self.scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.scroll_area.setWidgetResizable(True)
self.contents = QWidget()
self.contents.setObjectName(u"contents")
self.contents.setGeometry(QRect(0, 0, 840, 580))
self.contents.setStyleSheet(u"background: transparent;")
self.verticalLayout = QVBoxLayout(self.contents)
self.verticalLayout.setSpacing(15)
self.verticalLayout.setObjectName(u"verticalLayout")
self.verticalLayout.setContentsMargins(5, 5, 5, 5)
self.title_label = QLabel(self.contents)
self.title_label.setObjectName(u"title_label")
self.title_label.setMaximumSize(QSize(16777215, 40))
font = QFont()
font.setPointSize(16)
self.title_label.setFont(font)
self.title_label.setStyleSheet(u"font-size: 16pt")
self.title_label.setAlignment(Qt.AlignCenter)
self.verticalLayout.addWidget(self.title_label)
self.description_label = QLabel(self.contents)
self.description_label.setObjectName(u"description_label")
self.description_label.setAlignment(Qt.AlignHCenter|Qt.AlignTop)
self.description_label.setWordWrap(True)
self.verticalLayout.addWidget(self.description_label)
self.row_1_layout = QHBoxLayout()
self.row_1_layout.setObjectName(u"row_1_layout")
self.verticalLayout.addLayout(self.row_1_layout)
self.row_2_layout = QHBoxLayout()
self.row_2_layout.setObjectName(u"row_2_layout")
self.verticalLayout.addLayout(self.row_2_layout)
self.row_3_layout = QHBoxLayout()
self.row_3_layout.setObjectName(u"row_3_layout")
self.verticalLayout.addLayout(self.row_3_layout)
self.row_4_layout = QVBoxLayout()
self.row_4_layout.setObjectName(u"row_4_layout")
self.verticalLayout.addLayout(self.row_4_layout)
self.row_5_layout = QVBoxLayout()
self.row_5_layout.setObjectName(u"row_5_layout")
self.verticalLayout.addLayout(self.row_5_layout)
self.scroll_area.setWidget(self.contents)
self.page_2_layout.addWidget(self.scroll_area)
self.pages.addWidget(self.page_2)
self.page_3 = QWidget()
self.page_3.setObjectName(u"page_3")
self.page_3.setStyleSheet(u"QFrame {\n"
" font-size: 16pt;\n"
"}")
self.page_3_layout = QVBoxLayout(self.page_3)
self.page_3_layout.setObjectName(u"page_3_layout")
self.empty_page_label = QLabel(self.page_3)
self.empty_page_label.setObjectName(u"empty_page_label")
self.empty_page_label.setFont(font)
self.empty_page_label.setAlignment(Qt.AlignCenter)
self.page_3_layout.addWidget(self.empty_page_label)
self.pages.addWidget(self.page_3)
self.main_pages_layout.addWidget(self.pages)
self.retranslateUi(MainPages)
self.pages.setCurrentIndex(0)
QMetaObject.connectSlotsByName(MainPages)
# setupUi
def retranslateUi(self, MainPages):
MainPages.setWindowTitle(QCoreApplication.translate("MainPages", u"Form", None))
self.label.setText(QCoreApplication.translate("MainPages", u"Welcome To PyOneDark GUI", None))
self.title_label.setText(QCoreApplication.translate("MainPages", u"Custom Widgets Page", None))
self.description_label.setText(QCoreApplication.translate("MainPages", u"Here will be all the custom widgets, they will be added over time on this page.\n"
"I will try to always record a new tutorial when adding a new Widget and updating the project on Patreon before launching on GitHub and GitHub after the public release.", None))
self.empty_page_label.setText(QCoreApplication.translate("MainPages", u"Empty Page", None))
# retranslateUi

@ -1,23 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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
#
# ///////////////////////////////////////////////////////////////
# MAIN WINDOW
# ///////////////////////////////////////////////////////////////
from . ui_main import UI_MainWindow
# SETUP MAIN WINDOW
# ///////////////////////////////////////////////////////////////
from . setup_main_window import SetupMainWindow

@ -1,145 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 AND MODULES
# ///////////////////////////////////////////////////////////////
import sys
# IMPORT QT CORE
# ///////////////////////////////////////////////////////////////
from src.educoder.qt_core import *
# LOAD UI MAIN
# ///////////////////////////////////////////////////////////////
from . ui_main import *
# FUNCTIONS
class MainFunctions():
def __init__(self):
super().__init__()
# SETUP MAIN WINDOw
# Load widgets from "gui\uis\main_window\ui_main.py"
# ///////////////////////////////////////////////////////////////
self.ui = UI_MainWindow()
self.ui.setup_ui(self)
# SET MAIN WINDOW PAGES
# ///////////////////////////////////////////////////////////////
def set_page(self, page):
self.ui.load_pages.pages.setCurrentWidget(page)
# SET LEFT COLUMN PAGES
# ///////////////////////////////////////////////////////////////
def set_left_column_menu(
self,
menu,
title,
icon_path
):
self.ui.left_column.menus.menus.setCurrentWidget(menu)
self.ui.left_column.title_label.setText(title)
self.ui.left_column.icon.set_icon(icon_path)
# RETURN IF LEFT COLUMN IS VISIBLE
# ///////////////////////////////////////////////////////////////
def left_column_is_visible(self):
width = self.ui.left_column_frame.width()
if width == 0:
return False
else:
return True
# RETURN IF RIGHT COLUMN IS VISIBLE
# ///////////////////////////////////////////////////////////////
def right_column_is_visible(self):
width = self.ui.right_column_frame.width()
if width == 0:
return False
else:
return True
# SET RIGHT COLUMN PAGES
# ///////////////////////////////////////////////////////////////
def set_right_column_menu(self, menu):
self.ui.right_column.menus.setCurrentWidget(menu)
# GET TITLE BUTTON BY OBJECT NAME
# ///////////////////////////////////////////////////////////////
def get_title_bar_btn(self, object_name):
return self.ui.title_bar_frame.findChild(QPushButton, object_name)
# GET TITLE BUTTON BY OBJECT NAME
# ///////////////////////////////////////////////////////////////
def get_left_menu_btn(self, object_name):
return self.ui.left_menu.findChild(QPushButton, object_name)
# LEDT AND RIGHT COLUMNS / SHOW / HIDE
# ///////////////////////////////////////////////////////////////
def toggle_left_column(self):
# GET ACTUAL CLUMNS SIZE
width = self.ui.left_column_frame.width()
right_column_width = self.ui.right_column_frame.width()
MainFunctions.start_box_animation(self, width, right_column_width, "left")
def toggle_right_column(self):
# GET ACTUAL CLUMNS SIZE
left_column_width = self.ui.left_column_frame.width()
width = self.ui.right_column_frame.width()
MainFunctions.start_box_animation(self, left_column_width, width, "right")
def start_box_animation(self, left_box_width, right_box_width, direction):
right_width = 0
left_width = 0
time_animation = self.ui.settings["time_animation"]
minimum_left = self.ui.settings["left_column_size"]["minimum"]
maximum_left = self.ui.settings["left_column_size"]["maximum"]
minimum_right = self.ui.settings["right_column_size"]["minimum"]
maximum_right = self.ui.settings["right_column_size"]["maximum"]
# Check Left Values
if left_box_width == minimum_left and direction == "left":
left_width = maximum_left
else:
left_width = minimum_left
# Check Right values
if right_box_width == minimum_right and direction == "right":
right_width = maximum_right
else:
right_width = minimum_right
# ANIMATION LEFT BOX
self.left_box = QPropertyAnimation(self.ui.left_column_frame, b"minimumWidth")
self.left_box.setDuration(time_animation)
self.left_box.setStartValue(left_box_width)
self.left_box.setEndValue(left_width)
self.left_box.setEasingCurve(QEasingCurve.InOutQuart)
# ANIMATION RIGHT BOX
self.right_box = QPropertyAnimation(self.ui.right_column_frame, b"minimumWidth")
self.right_box.setDuration(time_animation)
self.right_box.setStartValue(right_box_width)
self.right_box.setEndValue(right_width)
self.right_box.setEasingCurve(QEasingCurve.InOutQuart)
# GROUP ANIMATION
self.group = QParallelAnimationGroup()
self.group.stop()
self.group.addAnimation(self.left_box)
self.group.addAnimation(self.right_box)
self.group.start()

@ -1,600 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 AND MODULES
# ///////////////////////////////////////////////////////////////
from gui.widgets.py_table_widget.py_table_widget import PyTableWidget
from . functions_main_window import *
import sys
import os
# IMPORT QT CORE
# ///////////////////////////////////////////////////////////////
from src.educoder.qt_core import *
# IMPORT SETTINGS
# ///////////////////////////////////////////////////////////////
from src.educoder.gui.core.json_settings import Settings
# IMPORT THEME COLORS
# ///////////////////////////////////////////////////////////////
from src.educoder.gui.core.json_themes import Themes
# IMPORT PY ONE DARK WIDGETS
# ///////////////////////////////////////////////////////////////
from src.educoder.gui.widgets import *
# LOAD UI MAIN
# ///////////////////////////////////////////////////////////////
from . ui_main import *
# MAIN FUNCTIONS
# ///////////////////////////////////////////////////////////////
from . functions_main_window import *
# PY WINDOW
# ///////////////////////////////////////////////////////////////
class SetupMainWindow:
def __init__(self):
super().__init__()
# SETUP MAIN WINDOw
# Load widgets from "gui\uis\main_window\ui_main.py"
# ///////////////////////////////////////////////////////////////
self.ui = UI_MainWindow()
self.ui.setup_ui(self)
# ADD LEFT MENUS
# ///////////////////////////////////////////////////////////////
add_left_menus = [
{
"btn_icon" : "icon_home.svg",
"btn_id" : "btn_home",
"btn_text" : "Home",
"btn_tooltip" : "Home page",
"show_top" : True,
"is_active" : True
},
{
"btn_icon" : "icon_widgets.svg",
"btn_id" : "btn_widgets",
"btn_text" : "Show Custom Widgets",
"btn_tooltip" : "Show custom widgets",
"show_top" : True,
"is_active" : False
},
{
"btn_icon" : "icon_add_user.svg",
"btn_id" : "btn_add_user",
"btn_text" : "Add Users",
"btn_tooltip" : "Add users",
"show_top" : True,
"is_active" : False
},
{
"btn_icon" : "icon_file.svg",
"btn_id" : "btn_new_file",
"btn_text" : "New File",
"btn_tooltip" : "Create new file",
"show_top" : True,
"is_active" : False
},
{
"btn_icon" : "icon_folder_open.svg",
"btn_id" : "btn_open_file",
"btn_text" : "Open File",
"btn_tooltip" : "Open file",
"show_top" : True,
"is_active" : False
},
{
"btn_icon" : "icon_save.svg",
"btn_id" : "btn_save",
"btn_text" : "Save File",
"btn_tooltip" : "Save file",
"show_top" : True,
"is_active" : False
},
{
"btn_icon" : "icon_info.svg",
"btn_id" : "btn_info",
"btn_text" : "Information",
"btn_tooltip" : "Open informations",
"show_top" : False,
"is_active" : False
},
{
"btn_icon" : "icon_settings.svg",
"btn_id" : "btn_settings",
"btn_text" : "Settings",
"btn_tooltip" : "Open settings",
"show_top" : False,
"is_active" : False
}
]
# ADD TITLE BAR MENUS
# ///////////////////////////////////////////////////////////////
add_title_bar_menus = [
{
"btn_icon" : "icon_search.svg",
"btn_id" : "btn_search",
"btn_tooltip" : "Search",
"is_active" : False
},
{
"btn_icon" : "icon_settings.svg",
"btn_id" : "btn_top_settings",
"btn_tooltip" : "Top settings",
"is_active" : False
}
]
# SETUP CUSTOM BTNs OF CUSTOM WIDGETS
# Get sender() function when btn is clicked
# ///////////////////////////////////////////////////////////////
def setup_btns(self):
if self.ui.title_bar.sender() != None:
return self.ui.title_bar.sender()
elif self.ui.left_menu.sender() != None:
return self.ui.left_menu.sender()
elif self.ui.left_column.sender() != None:
return self.ui.left_column.sender()
# SETUP MAIN WINDOW WITH CUSTOM PARAMETERS
# ///////////////////////////////////////////////////////////////
def setup_gui(self):
# APP TITLE
# ///////////////////////////////////////////////////////////////
self.setWindowTitle(self.settings["app_name"])
# REMOVE TITLE BAR
# ///////////////////////////////////////////////////////////////
if self.settings["custom_title_bar"]:
self.setWindowFlag(Qt.FramelessWindowHint)
self.setAttribute(Qt.WA_TranslucentBackground)
# ADD GRIPS
# ///////////////////////////////////////////////////////////////
if self.settings["custom_title_bar"]:
self.left_grip = PyGrips(self, "left", self.hide_grips)
self.right_grip = PyGrips(self, "right", self.hide_grips)
self.top_grip = PyGrips(self, "top", self.hide_grips)
self.bottom_grip = PyGrips(self, "bottom", self.hide_grips)
self.top_left_grip = PyGrips(self, "top_left", self.hide_grips)
self.top_right_grip = PyGrips(self, "top_right", self.hide_grips)
self.bottom_left_grip = PyGrips(self, "bottom_left", self.hide_grips)
self.bottom_right_grip = PyGrips(self, "bottom_right", self.hide_grips)
# LEFT MENUS / GET SIGNALS WHEN LEFT MENU BTN IS CLICKED / RELEASED
# ///////////////////////////////////////////////////////////////
# ADD MENUS
self.ui.left_menu.add_menus(SetupMainWindow.add_left_menus)
# SET SIGNALS
self.ui.left_menu.clicked.connect(self.btn_clicked)
self.ui.left_menu.released.connect(self.btn_released)
# TITLE BAR / ADD EXTRA BUTTONS
# ///////////////////////////////////////////////////////////////
# ADD MENUS
self.ui.title_bar.add_menus(SetupMainWindow.add_title_bar_menus)
# SET SIGNALS
self.ui.title_bar.clicked.connect(self.btn_clicked)
self.ui.title_bar.released.connect(self.btn_released)
# ADD Title
if self.settings["custom_title_bar"]:
self.ui.title_bar.set_title(self.settings["app_name"])
else:
self.ui.title_bar.set_title("Welcome to PyOneDark")
# LEFT COLUMN SET SIGNALS
# ///////////////////////////////////////////////////////////////
self.ui.left_column.clicked.connect(self.btn_clicked)
self.ui.left_column.released.connect(self.btn_released)
# SET INITIAL PAGE / SET LEFT AND RIGHT COLUMN MENUS
# ///////////////////////////////////////////////////////////////
MainFunctions.set_page(self, self.ui.load_pages.page_1)
MainFunctions.set_left_column_menu(
self,
menu = self.ui.left_column.menus.menu_1,
title = "Settings Left Column",
icon_path = Functions.set_svg_icon("icon_settings.svg")
)
MainFunctions.set_right_column_menu(self, self.ui.right_column.menu_1)
# ///////////////////////////////////////////////////////////////
# EXAMPLE CUSTOM WIDGETS
# Here are added the custom widgets to pages and columns that
# were created using Qt Designer.
# This is just an example and should be deleted when creating
# your application.
#
# OBJECTS FOR LOAD PAGES, LEFT AND RIGHT COLUMNS
# You can access objects inside Qt Designer projects using
# the objects below:
#
# <OBJECTS>
# LEFT COLUMN: self.ui.left_column.menus
# RIGHT COLUMN: self.ui.right_column
# LOAD PAGES: self.ui.load_pages
# </OBJECTS>
# ///////////////////////////////////////////////////////////////
# LOAD SETTINGS
# ///////////////////////////////////////////////////////////////
settings = Settings()
self.settings = settings.items
# LOAD THEME COLOR
# ///////////////////////////////////////////////////////////////
themes = Themes()
self.themes = themes.items
# LEFT COLUMN
# ///////////////////////////////////////////////////////////////
# BTN 1
self.left_btn_1 = PyPushButton(
text="Btn 1",
radius=8,
color=self.themes["app_color"]["text_foreground"],
bg_color=self.themes["app_color"]["dark_one"],
bg_color_hover=self.themes["app_color"]["dark_three"],
bg_color_pressed=self.themes["app_color"]["dark_four"]
)
self.left_btn_1.setMaximumHeight(40)
self.ui.left_column.menus.btn_1_layout.addWidget(self.left_btn_1)
# BTN 2
self.left_btn_2 = PyPushButton(
text="Btn With Icon",
radius=8,
color=self.themes["app_color"]["text_foreground"],
bg_color=self.themes["app_color"]["dark_one"],
bg_color_hover=self.themes["app_color"]["dark_three"],
bg_color_pressed=self.themes["app_color"]["dark_four"]
)
self.icon = QIcon(Functions.set_svg_icon("icon_settings.svg"))
self.left_btn_2.setIcon(self.icon)
self.left_btn_2.setMaximumHeight(40)
self.ui.left_column.menus.btn_2_layout.addWidget(self.left_btn_2)
# BTN 3 - Default QPushButton
self.left_btn_3 = QPushButton("Default QPushButton")
self.left_btn_3.setMaximumHeight(40)
self.ui.left_column.menus.btn_3_layout.addWidget(self.left_btn_3)
# PAGES
# ///////////////////////////////////////////////////////////////
# PAGE 1 - ADD LOGO TO MAIN PAGE
self.logo_svg = QSvgWidget(Functions.set_svg_image("logo_home.svg"))
self.ui.load_pages.logo_layout.addWidget(self.logo_svg, Qt.AlignCenter, Qt.AlignCenter)
# PAGE 2
# CIRCULAR PROGRESS 1
self.circular_progress_1 = PyCircularProgress(
value = 80,
progress_color = self.themes["app_color"]["context_color"],
text_color = self.themes["app_color"]["text_title"],
font_size = 14,
bg_color = self.themes["app_color"]["dark_four"]
)
self.circular_progress_1.setFixedSize(200,200)
# CIRCULAR PROGRESS 2
self.circular_progress_2 = PyCircularProgress(
value = 45,
progress_width = 4,
progress_color = self.themes["app_color"]["context_color"],
text_color = self.themes["app_color"]["context_color"],
font_size = 14,
bg_color = self.themes["app_color"]["bg_three"]
)
self.circular_progress_2.setFixedSize(160,160)
# CIRCULAR PROGRESS 3
self.circular_progress_3 = PyCircularProgress(
value = 75,
progress_width = 2,
progress_color = self.themes["app_color"]["pink"],
text_color = self.themes["app_color"]["white"],
font_size = 14,
bg_color = self.themes["app_color"]["bg_three"]
)
self.circular_progress_3.setFixedSize(140,140)
# PY SLIDER 1
self.vertical_slider_1 = PySlider(
margin=8,
bg_size=10,
bg_radius=5,
handle_margin=-3,
handle_size=16,
handle_radius=8,
bg_color = self.themes["app_color"]["dark_three"],
bg_color_hover = self.themes["app_color"]["dark_four"],
handle_color = self.themes["app_color"]["context_color"],
handle_color_hover = self.themes["app_color"]["context_hover"],
handle_color_pressed = self.themes["app_color"]["context_pressed"]
)
self.vertical_slider_1.setMinimumHeight(100)
# PY SLIDER 2
self.vertical_slider_2 = PySlider(
bg_color = self.themes["app_color"]["dark_three"],
bg_color_hover = self.themes["app_color"]["dark_three"],
handle_color = self.themes["app_color"]["context_color"],
handle_color_hover = self.themes["app_color"]["context_hover"],
handle_color_pressed = self.themes["app_color"]["context_pressed"]
)
self.vertical_slider_2.setMinimumHeight(100)
# PY SLIDER 3
self.vertical_slider_3 = PySlider(
margin=8,
bg_size=10,
bg_radius=5,
handle_margin=-3,
handle_size=16,
handle_radius=8,
bg_color = self.themes["app_color"]["dark_three"],
bg_color_hover = self.themes["app_color"]["dark_four"],
handle_color = self.themes["app_color"]["context_color"],
handle_color_hover = self.themes["app_color"]["context_hover"],
handle_color_pressed = self.themes["app_color"]["context_pressed"]
)
self.vertical_slider_3.setOrientation(Qt.Horizontal)
self.vertical_slider_3.setMaximumWidth(200)
# PY SLIDER 4
self.vertical_slider_4 = PySlider(
bg_color = self.themes["app_color"]["dark_three"],
bg_color_hover = self.themes["app_color"]["dark_three"],
handle_color = self.themes["app_color"]["context_color"],
handle_color_hover = self.themes["app_color"]["context_hover"],
handle_color_pressed = self.themes["app_color"]["context_pressed"]
)
self.vertical_slider_4.setOrientation(Qt.Horizontal)
self.vertical_slider_4.setMaximumWidth(200)
# ICON BUTTON 1
self.icon_button_1 = PyIconButton(
icon_path = Functions.set_svg_icon("icon_heart.svg"),
parent = self,
app_parent = self.ui.central_widget,
tooltip_text = "Icon button - Heart",
width = 40,
height = 40,
radius = 20,
dark_one = self.themes["app_color"]["dark_one"],
icon_color = self.themes["app_color"]["icon_color"],
icon_color_hover = self.themes["app_color"]["icon_hover"],
icon_color_pressed = self.themes["app_color"]["icon_active"],
icon_color_active = self.themes["app_color"]["icon_active"],
bg_color = self.themes["app_color"]["dark_one"],
bg_color_hover = self.themes["app_color"]["dark_three"],
bg_color_pressed = self.themes["app_color"]["pink"]
)
# ICON BUTTON 2
self.icon_button_2 = PyIconButton(
icon_path = Functions.set_svg_icon("icon_add_user.svg"),
parent = self,
app_parent = self.ui.central_widget,
tooltip_text = "BTN with tooltip",
width = 40,
height = 40,
radius = 8,
dark_one = self.themes["app_color"]["dark_one"],
icon_color = self.themes["app_color"]["icon_color"],
icon_color_hover = self.themes["app_color"]["icon_hover"],
icon_color_pressed = self.themes["app_color"]["white"],
icon_color_active = self.themes["app_color"]["icon_active"],
bg_color = self.themes["app_color"]["dark_one"],
bg_color_hover = self.themes["app_color"]["dark_three"],
bg_color_pressed = self.themes["app_color"]["green"],
)
# ICON BUTTON 3
self.icon_button_3 = PyIconButton(
icon_path = Functions.set_svg_icon("icon_add_user.svg"),
parent = self,
app_parent = self.ui.central_widget,
tooltip_text = "BTN actived! (is_actived = True)",
width = 40,
height = 40,
radius = 8,
dark_one = self.themes["app_color"]["dark_one"],
icon_color = self.themes["app_color"]["icon_color"],
icon_color_hover = self.themes["app_color"]["icon_hover"],
icon_color_pressed = self.themes["app_color"]["white"],
icon_color_active = self.themes["app_color"]["icon_active"],
bg_color = self.themes["app_color"]["dark_one"],
bg_color_hover = self.themes["app_color"]["dark_three"],
bg_color_pressed = self.themes["app_color"]["context_color"],
is_active = True
)
# PUSH BUTTON 1
self.push_button_1 = PyPushButton(
text = "Button Without Icon",
radius =8,
color = self.themes["app_color"]["text_foreground"],
bg_color = self.themes["app_color"]["dark_one"],
bg_color_hover = self.themes["app_color"]["dark_three"],
bg_color_pressed = self.themes["app_color"]["dark_four"]
)
self.push_button_1.setMinimumHeight(40)
# PUSH BUTTON 2
self.push_button_2 = PyPushButton(
text = "Button With Icon",
radius = 8,
color = self.themes["app_color"]["text_foreground"],
bg_color = self.themes["app_color"]["dark_one"],
bg_color_hover = self.themes["app_color"]["dark_three"],
bg_color_pressed = self.themes["app_color"]["dark_four"]
)
self.icon_2 = QIcon(Functions.set_svg_icon("icon_settings.svg"))
self.push_button_2.setMinimumHeight(40)
self.push_button_2.setIcon(self.icon_2)
# PY LINE EDIT
self.line_edit = PyLineEdit(
text = "",
place_holder_text = "Place holder text",
radius = 8,
border_size = 2,
color = self.themes["app_color"]["text_foreground"],
selection_color = self.themes["app_color"]["white"],
bg_color = self.themes["app_color"]["dark_one"],
bg_color_active = self.themes["app_color"]["dark_three"],
context_color = self.themes["app_color"]["context_color"]
)
self.line_edit.setMinimumHeight(30)
# TOGGLE BUTTON
self.toggle_button = PyToggle(
width = 50,
bg_color = self.themes["app_color"]["dark_two"],
circle_color = self.themes["app_color"]["icon_color"],
active_color = self.themes["app_color"]["context_color"]
)
# TABLE WIDGETS
self.table_widget = PyTableWidget(
radius = 8,
color = self.themes["app_color"]["text_foreground"],
selection_color = self.themes["app_color"]["context_color"],
bg_color = self.themes["app_color"]["bg_two"],
header_horizontal_color = self.themes["app_color"]["dark_two"],
header_vertical_color = self.themes["app_color"]["bg_three"],
bottom_line_color = self.themes["app_color"]["bg_three"],
grid_line_color = self.themes["app_color"]["bg_one"],
scroll_bar_bg_color = self.themes["app_color"]["bg_one"],
scroll_bar_btn_color = self.themes["app_color"]["dark_four"],
context_color = self.themes["app_color"]["context_color"]
)
self.table_widget.setColumnCount(3)
self.table_widget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.table_widget.setSelectionMode(QAbstractItemView.ExtendedSelection)
self.table_widget.setSelectionBehavior(QAbstractItemView.SelectRows)
# Columns / Header
self.column_1 = QTableWidgetItem()
self.column_1.setTextAlignment(Qt.AlignCenter)
self.column_1.setText("NAME")
self.column_2 = QTableWidgetItem()
self.column_2.setTextAlignment(Qt.AlignCenter)
self.column_2.setText("NICK")
self.column_3 = QTableWidgetItem()
self.column_3.setTextAlignment(Qt.AlignCenter)
self.column_3.setText("PASS")
# Set column
self.table_widget.setHorizontalHeaderItem(0, self.column_1)
self.table_widget.setHorizontalHeaderItem(1, self.column_2)
self.table_widget.setHorizontalHeaderItem(2, self.column_3)
for x in range(10):
row_number = self.table_widget.rowCount()
self.table_widget.insertRow(row_number) # Insert row
self.table_widget.setItem(row_number, 0, QTableWidgetItem(str("Wanderson"))) # Add name
self.table_widget.setItem(row_number, 1, QTableWidgetItem(str("vfx_on_fire_" + str(x)))) # Add nick
self.pass_text = QTableWidgetItem()
self.pass_text.setTextAlignment(Qt.AlignCenter)
self.pass_text.setText("12345" + str(x))
self.table_widget.setItem(row_number, 2, self.pass_text) # Add pass
self.table_widget.setRowHeight(row_number, 22)
# ADD WIDGETS
self.ui.load_pages.row_1_layout.addWidget(self.circular_progress_1)
self.ui.load_pages.row_1_layout.addWidget(self.circular_progress_2)
self.ui.load_pages.row_1_layout.addWidget(self.circular_progress_3)
self.ui.load_pages.row_2_layout.addWidget(self.vertical_slider_1)
self.ui.load_pages.row_2_layout.addWidget(self.vertical_slider_2)
self.ui.load_pages.row_2_layout.addWidget(self.vertical_slider_3)
self.ui.load_pages.row_2_layout.addWidget(self.vertical_slider_4)
self.ui.load_pages.row_3_layout.addWidget(self.icon_button_1)
self.ui.load_pages.row_3_layout.addWidget(self.icon_button_2)
self.ui.load_pages.row_3_layout.addWidget(self.icon_button_3)
self.ui.load_pages.row_3_layout.addWidget(self.push_button_1)
self.ui.load_pages.row_3_layout.addWidget(self.push_button_2)
self.ui.load_pages.row_3_layout.addWidget(self.toggle_button)
self.ui.load_pages.row_4_layout.addWidget(self.line_edit)
self.ui.load_pages.row_5_layout.addWidget(self.table_widget)
# RIGHT COLUMN
# ///////////////////////////////////////////////////////////////
# BTN 1
self.right_btn_1 = PyPushButton(
text="Show Menu 2",
radius=8,
color=self.themes["app_color"]["text_foreground"],
bg_color=self.themes["app_color"]["dark_one"],
bg_color_hover=self.themes["app_color"]["dark_three"],
bg_color_pressed=self.themes["app_color"]["dark_four"]
)
self.icon_right = QIcon(Functions.set_svg_icon("icon_arrow_right.svg"))
self.right_btn_1.setIcon(self.icon_right)
self.right_btn_1.setMaximumHeight(40)
self.right_btn_1.clicked.connect(lambda: MainFunctions.set_right_column_menu(
self,
self.ui.right_column.menu_2
))
self.ui.right_column.btn_1_layout.addWidget(self.right_btn_1)
# BTN 2
self.right_btn_2 = PyPushButton(
text="Show Menu 1",
radius=8,
color=self.themes["app_color"]["text_foreground"],
bg_color=self.themes["app_color"]["dark_one"],
bg_color_hover=self.themes["app_color"]["dark_three"],
bg_color_pressed=self.themes["app_color"]["dark_four"]
)
self.icon_left = QIcon(Functions.set_svg_icon("icon_arrow_left.svg"))
self.right_btn_2.setIcon(self.icon_left)
self.right_btn_2.setMaximumHeight(40)
self.right_btn_2.clicked.connect(lambda: MainFunctions.set_right_column_menu(
self,
self.ui.right_column.menu_1
))
self.ui.right_column.btn_2_layout.addWidget(self.right_btn_2)
# ///////////////////////////////////////////////////////////////
# END - EXAMPLE CUSTOM WIDGETS
# ///////////////////////////////////////////////////////////////
# RESIZE GRIPS AND CHANGE POSITION
# Resize or change position when window is resized
# ///////////////////////////////////////////////////////////////
def resize_grips(self):
if self.settings["custom_title_bar"]:
self.left_grip.setGeometry(5, 10, 10, self.height())
self.right_grip.setGeometry(self.width() - 15, 10, 10, self.height())
self.top_grip.setGeometry(5, 5, self.width() - 10, 10)
self.bottom_grip.setGeometry(5, self.height() - 15, self.width() - 10, 10)
self.top_right_grip.setGeometry(self.width() - 20, 5, 15, 15)
self.bottom_left_grip.setGeometry(5, self.height() - 20, 15, 15)
self.bottom_right_grip.setGeometry(self.width() - 20, self.height() - 20, 15, 15)

@ -1,305 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 AND MODULES
# ///////////////////////////////////////////////////////////////
from src.educoder.gui.core.functions import Functions
# IMPORT QT CORE
# ///////////////////////////////////////////////////////////////
from src.educoder.qt_core import *
# IMPORT SETTINGS
# ///////////////////////////////////////////////////////////////
from src.educoder.gui.core.json_settings import Settings
# IMPORT THEME COLORS
# ///////////////////////////////////////////////////////////////
from src.educoder.gui.core.json_themes import Themes
# IMPORT PY ONE DARK WIDGETS
# ///////////////////////////////////////////////////////////////
from src.educoder.gui.widgets import *
# IMPORT SETUP MAIN WINDOW
# ///////////////////////////////////////////////////////////////
from . setup_main_window import *
# IMPORT MAIN WINDOW PAGES / AND SIDE BOXES FOR APP
# ///////////////////////////////////////////////////////////////
from gui.uis.pages.ui_main_pages import Ui_MainPages
# RIGHT COLUMN
# ///////////////////////////////////////////////////////////////
from gui.uis.columns.ui_right_column import Ui_RightColumn
# CREDITS
# ///////////////////////////////////////////////////////////////
from gui.widgets.py_credits_bar.py_credits import PyCredits
# PY WINDOW
# ///////////////////////////////////////////////////////////////
class UI_MainWindow(object):
def setup_ui(self, parent):
if not parent.objectName():
parent.setObjectName("MainWindow")
# LOAD SETTINGS
# ///////////////////////////////////////////////////////////////
settings = Settings()
self.settings = settings.items
# LOAD THEME COLOR
# ///////////////////////////////////////////////////////////////
themes = Themes()
self.themes = themes.items
# SET INITIAL PARAMETERS
parent.resize(self.settings["startup_size"][0], self.settings["startup_size"][1])
parent.setMinimumSize(self.settings["minimum_size"][0], self.settings["minimum_size"][1])
# SET CENTRAL WIDGET
# Add central widget to app
# ///////////////////////////////////////////////////////////////
self.central_widget = QWidget()
self.central_widget.setStyleSheet(f'''
font: {self.settings["font"]["text_size"]}pt "{self.settings["font"]["family"]}";
color: {self.themes["app_color"]["text_foreground"]};
''')
self.central_widget_layout = QVBoxLayout(self.central_widget)
if self.settings["custom_title_bar"]:
self.central_widget_layout.setContentsMargins(10,10,10,10)
else:
self.central_widget_layout.setContentsMargins(0,0,0,0)
# LOAD PY WINDOW CUSTOM WIDGET
# Add inside PyWindow "layout" all Widgets
# ///////////////////////////////////////////////////////////////
self.window = PyWindow(
parent,
bg_color = self.themes["app_color"]["bg_one"],
border_color = self.themes["app_color"]["bg_two"],
text_color = self.themes["app_color"]["text_foreground"]
)
# If disable custom title bar
if not self.settings["custom_title_bar"]:
self.window.set_stylesheet(border_radius = 0, border_size = 0)
# ADD PY WINDOW TO CENTRAL WIDGET
self.central_widget_layout.addWidget(self.window)
# ADD FRAME LEFT MENU
# Add here the custom left menu bar
# ///////////////////////////////////////////////////////////////
left_menu_margin = self.settings["left_menu_content_margins"]
left_menu_minimum = self.settings["lef_menu_size"]["minimum"]
self.left_menu_frame = QFrame()
self.left_menu_frame.setMaximumSize(left_menu_minimum + (left_menu_margin * 2), 17280)
self.left_menu_frame.setMinimumSize(left_menu_minimum + (left_menu_margin * 2), 0)
# LEFT MENU LAYOUT
self.left_menu_layout = QHBoxLayout(self.left_menu_frame)
self.left_menu_layout.setContentsMargins(
left_menu_margin,
left_menu_margin,
left_menu_margin,
left_menu_margin
)
# ADD LEFT MENU
# Add custom left menu here
# ///////////////////////////////////////////////////////////////
self.left_menu = PyLeftMenu(
parent = self.left_menu_frame,
app_parent = self.central_widget, # For tooltip parent
dark_one = self.themes["app_color"]["dark_one"],
dark_three = self.themes["app_color"]["dark_three"],
dark_four = self.themes["app_color"]["dark_four"],
bg_one = self.themes["app_color"]["bg_one"],
icon_color = self.themes["app_color"]["icon_color"],
icon_color_hover = self.themes["app_color"]["icon_hover"],
icon_color_pressed = self.themes["app_color"]["icon_pressed"],
icon_color_active = self.themes["app_color"]["icon_active"],
context_color = self.themes["app_color"]["context_color"],
text_foreground = self.themes["app_color"]["text_foreground"],
text_active = self.themes["app_color"]["text_active"]
)
self.left_menu_layout.addWidget(self.left_menu)
# ADD LEFT COLUMN
# Add here the left column with Stacked Widgets
# ///////////////////////////////////////////////////////////////
self.left_column_frame = QFrame()
self.left_column_frame.setMaximumWidth(self.settings["left_column_size"]["minimum"])
self.left_column_frame.setMinimumWidth(self.settings["left_column_size"]["minimum"])
self.left_column_frame.setStyleSheet(f"background: {self.themes['app_color']['bg_two']}")
# ADD LAYOUT TO LEFT COLUMN
self.left_column_layout = QVBoxLayout(self.left_column_frame)
self.left_column_layout.setContentsMargins(0,0,0,0)
# ADD CUSTOM LEFT MENU WIDGET
self.left_column = PyLeftColumn(
parent,
app_parent = self.central_widget,
text_title = "Settings Left Frame",
text_title_size = self.settings["font"]["title_size"],
text_title_color = self.themes['app_color']['text_foreground'],
icon_path = Functions.set_svg_icon("icon_settings.svg"),
dark_one = self.themes['app_color']['dark_one'],
bg_color = self.themes['app_color']['bg_three'],
btn_color = self.themes['app_color']['bg_three'],
btn_color_hover = self.themes['app_color']['bg_two'],
btn_color_pressed = self.themes['app_color']['bg_one'],
icon_color = self.themes['app_color']['icon_color'],
icon_color_hover = self.themes['app_color']['icon_hover'],
context_color = self.themes['app_color']['context_color'],
icon_color_pressed = self.themes['app_color']['icon_pressed'],
icon_close_path = Functions.set_svg_icon("icon_close.svg")
)
self.left_column_layout.addWidget(self.left_column)
# ADD RIGHT WIDGETS
# Add here the right widgets
# ///////////////////////////////////////////////////////////////
self.right_app_frame = QFrame()
# ADD RIGHT APP LAYOUT
self.right_app_layout = QVBoxLayout(self.right_app_frame)
self.right_app_layout.setContentsMargins(3,3,3,3)
self.right_app_layout.setSpacing(6)
# ADD TITLE BAR FRAME
# ///////////////////////////////////////////////////////////////
self.title_bar_frame = QFrame()
self.title_bar_frame.setMinimumHeight(40)
self.title_bar_frame.setMaximumHeight(40)
self.title_bar_layout = QVBoxLayout(self.title_bar_frame)
self.title_bar_layout.setContentsMargins(0,0,0,0)
# ADD CUSTOM TITLE BAR TO LAYOUT
self.title_bar = PyTitleBar(
parent,
logo_width = 100,
app_parent = self.central_widget,
logo_image = "logo_top_100x22.svg",
bg_color = self.themes["app_color"]["bg_two"],
div_color = self.themes["app_color"]["bg_three"],
btn_bg_color = self.themes["app_color"]["bg_two"],
btn_bg_color_hover = self.themes["app_color"]["bg_three"],
btn_bg_color_pressed = self.themes["app_color"]["bg_one"],
icon_color = self.themes["app_color"]["icon_color"],
icon_color_hover = self.themes["app_color"]["icon_hover"],
icon_color_pressed = self.themes["app_color"]["icon_pressed"],
icon_color_active = self.themes["app_color"]["icon_active"],
context_color = self.themes["app_color"]["context_color"],
dark_one = self.themes["app_color"]["dark_one"],
text_foreground = self.themes["app_color"]["text_foreground"],
radius = 8,
font_family = self.settings["font"]["family"],
title_size = self.settings["font"]["title_size"],
is_custom_title_bar = self.settings["custom_title_bar"]
)
self.title_bar_layout.addWidget(self.title_bar)
# ADD CONTENT AREA
# ///////////////////////////////////////////////////////////////
self.content_area_frame = QFrame()
# CREATE LAYOUT
self.content_area_layout = QHBoxLayout(self.content_area_frame)
self.content_area_layout.setContentsMargins(0,0,0,0)
self.content_area_layout.setSpacing(0)
# LEFT CONTENT
self.content_area_left_frame = QFrame()
# IMPORT MAIN PAGES TO CONTENT AREA
self.load_pages = Ui_MainPages()
self.load_pages.setupUi(self.content_area_left_frame)
# RIGHT BAR
self.right_column_frame = QFrame()
self.right_column_frame.setMinimumWidth(self.settings["right_column_size"]["minimum"])
self.right_column_frame.setMaximumWidth(self.settings["right_column_size"]["minimum"])
# IMPORT RIGHT COLUMN
# ///////////////////////////////////////////////////////////////
self.content_area_right_layout = QVBoxLayout(self.right_column_frame)
self.content_area_right_layout.setContentsMargins(5,5,5,5)
self.content_area_right_layout.setSpacing(0)
# RIGHT BG
self.content_area_right_bg_frame = QFrame()
self.content_area_right_bg_frame.setObjectName("content_area_right_bg_frame")
self.content_area_right_bg_frame.setStyleSheet(f'''
#content_area_right_bg_frame {{
border-radius: 8px;
background-color: {self.themes["app_color"]["bg_two"]};
}}
''')
# ADD BG
self.content_area_right_layout.addWidget(self.content_area_right_bg_frame)
# ADD RIGHT PAGES TO RIGHT COLUMN
self.right_column = Ui_RightColumn()
self.right_column.setupUi(self.content_area_right_bg_frame)
# ADD TO LAYOUTS
self.content_area_layout.addWidget(self.content_area_left_frame)
self.content_area_layout.addWidget(self.right_column_frame)
# CREDITS / BOTTOM APP FRAME
# ///////////////////////////////////////////////////////////////
self.credits_frame = QFrame()
self.credits_frame.setMinimumHeight(26)
self.credits_frame.setMaximumHeight(26)
# CREATE LAYOUT
self.credits_layout = QVBoxLayout(self.credits_frame)
self.credits_layout.setContentsMargins(0,0,0,0)
# ADD CUSTOM WIDGET CREDITS
self.credits = PyCredits(
bg_two = self.themes["app_color"]["bg_two"],
copyright = self.settings["copyright"],
version = self.settings["version"],
font_family = self.settings["font"]["family"],
text_size = self.settings["font"]["text_size"],
text_description_color = self.themes["app_color"]["text_description"]
)
# ADD TO LAYOUT
self.credits_layout.addWidget(self.credits)
# ADD WIDGETS TO RIGHT LAYOUT
# ///////////////////////////////////////////////////////////////
self.right_app_layout.addWidget(self.title_bar_frame)
self.right_app_layout.addWidget(self.content_area_frame)
self.right_app_layout.addWidget(self.credits_frame)
# ADD WIDGETS TO "PyWindow"
# Add here your custom widgets or default widgets
# ///////////////////////////////////////////////////////////////
self.window.layout.addWidget(self.left_menu_frame)
self.window.layout.addWidget(self.left_column_frame)
self.window.layout.addWidget(self.right_app_frame)
# ADD CENTRAL WIDGET AND SET CONTENT MARGINS
# ///////////////////////////////////////////////////////////////
parent.setCentralWidget(self.central_widget)

@ -1,71 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 WIDGETS
# ADD here all custom widgets
# ///////////////////////////////////////////////////////////////
# PY WINDOW
# ///////////////////////////////////////////////////////////////
from . py_window import PyWindow
# RESIZE GRIP
# ///////////////////////////////////////////////////////////////
from . py_grips import PyGrips
# LEFT MENU
# ///////////////////////////////////////////////////////////////
from . py_left_menu import PyLeftMenu
# PY LEFT COLUMN
# ///////////////////////////////////////////////////////////////
from . py_left_column import PyLeftColumn
# PY TITLE BAR
# ///////////////////////////////////////////////////////////////
from . py_title_bar import PyTitleBar
# PY CREDITS
# ///////////////////////////////////////////////////////////////
from . py_credits_bar import PyCredits
# PY PUSH BUTTON
# ///////////////////////////////////////////////////////////////
from . py_push_button import PyPushButton
# PY TOGGLE
# ///////////////////////////////////////////////////////////////
from . py_toggle import PyToggle
# PY SLIDER
# ///////////////////////////////////////////////////////////////
from . py_slider import PySlider
# PY CIRCULAR PROGRESS
# ///////////////////////////////////////////////////////////////
from . py_circular_progress import PyCircularProgress
# PY ICON BUTTON
# ///////////////////////////////////////////////////////////////
from . py_icon_button import PyIconButton
# PY LINE EDIT
# ///////////////////////////////////////////////////////////////
from . py_line_edit import PyLineEdit
# PY TABLE WIDGET
# ///////////////////////////////////////////////////////////////
from . py_table_widget import PyTableWidget

@ -1,19 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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
#
# ///////////////////////////////////////////////////////////////
# PY TITLE BAR
# ///////////////////////////////////////////////////////////////
from . py_circular_progress import PyCircularProgress

@ -1,114 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 QT CORE
# ///////////////////////////////////////////////////////////////
from src.educoder.qt_core import *
class PyCircularProgress(QWidget):
def __init__(
self,
value = 0,
progress_width = 10,
is_rounded = True,
max_value = 100,
progress_color = "#ff79c6",
enable_text = True,
font_family = "Segoe UI",
font_size = 12,
suffix = "%",
text_color = "#ff79c6",
enable_bg = True,
bg_color = "#44475a"
):
QWidget.__init__(self)
# CUSTOM PROPERTIES
self.value = value
self.progress_width = progress_width
self.progress_rounded_cap = is_rounded
self.max_value = max_value
self.progress_color = progress_color
# Text
self.enable_text = enable_text
self.font_family = font_family
self.font_size = font_size
self.suffix = suffix
self.text_color = text_color
# BG
self.enable_bg = enable_bg
self.bg_color = bg_color
# 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)
# 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()

@ -1,19 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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
#
# ///////////////////////////////////////////////////////////////
# PY CREDITS
# ///////////////////////////////////////////////////////////////
from . py_credits import PyCredits

@ -1,95 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 QT CORE
# ///////////////////////////////////////////////////////////////
from src.educoder.qt_core import *
# PY CREDITS BAR AND VERSION
# ///////////////////////////////////////////////////////////////
class PyCredits(QWidget):
def __init__(
self,
copyright,
version,
bg_two,
font_family,
text_size,
text_description_color,
radius = 8,
padding = 10
):
super().__init__()
# PROPERTIES
self._copyright = copyright
self._version = version
self._bg_two = bg_two
self._font_family = font_family
self._text_size = text_size
self._text_description_color = text_description_color
self._radius = radius
self._padding = padding
# SETUP UI
self.setup_ui()
def setup_ui(self):
# ADD LAYOUT
self.widget_layout = QHBoxLayout(self)
self.widget_layout.setContentsMargins(0,0,0,0)
# BG STYLE
style = f"""
#bg_frame {{
border-radius: {self._radius}px;
background-color: {self._bg_two};
}}
.QLabel {{
font: {self._text_size}pt "{self._font_family}";
color: {self._text_description_color};
padding-left: {self._padding}px;
padding-right: {self._padding}px;
}}
"""
# BG FRAME
self.bg_frame = QFrame()
self.bg_frame.setObjectName("bg_frame")
self.bg_frame.setStyleSheet(style)
# ADD TO LAYOUT
self.widget_layout.addWidget(self.bg_frame)
# ADD BG LAYOUT
self.bg_layout = QHBoxLayout(self.bg_frame)
self.bg_layout.setContentsMargins(0,0,0,0)
# ADD COPYRIGHT TEXT
self.copyright_label = QLabel(self._copyright)
self.copyright_label.setAlignment(Qt.AlignVCenter)
# ADD VERSION TEXT
self.version_label = QLabel(self._version)
self.version_label.setAlignment(Qt.AlignVCenter)
# SEPARATOR
self.separator = QSpacerItem(20, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
# ADD TO LAYOUT
self.bg_layout.addWidget(self.copyright_label)
self.bg_layout.addSpacerItem(self.separator)
self.bg_layout.addWidget(self.version_label)

@ -1,17 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 . py_grips import PyGrips

@ -1,249 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 AND MODULES
# ///////////////////////////////////////////////////////////////
import sys
# IMPORT QT CORE
# ///////////////////////////////////////////////////////////////
from src.educoder.qt_core import *
# PY GRIPS
# ///////////////////////////////////////////////////////////////
class PyGrips(QWidget):
def __init__(self, parent, position, disable_color = False):
# SETUP UI
# ///////////////////////////////////////////////////////////////
super().__init__()
self.parent = parent
self.setParent(parent)
self.wi = Widgets()
# SHOW TOP LEFT GRIP
# ///////////////////////////////////////////////////////////////
if position == "top_left":
self.wi.top_left(self)
grip = QSizeGrip(self.wi.top_left_grip)
grip.setFixedSize(self.wi.top_left_grip.size())
self.setGeometry(5, 5, 15, 15)
# ENABLE COLOR
if disable_color:
self.wi.top_left_grip.setStyleSheet("background: transparent")
# SHOW TOP RIGHT GRIP
# ///////////////////////////////////////////////////////////////
if position == "top_right":
self.wi.top_right(self)
grip = QSizeGrip(self.wi.top_right_grip)
grip.setFixedSize(self.wi.top_right_grip.size())
self.setGeometry(self.parent.width() - 20, 5, 15, 15)
# ENABLE COLOR
if disable_color:
self.wi.top_right_grip.setStyleSheet("background: transparent")
# SHOW BOTTOM LEFT GRIP
# ///////////////////////////////////////////////////////////////
if position == "bottom_left":
self.wi.bottom_left(self)
grip = QSizeGrip(self.wi.bottom_left_grip)
grip.setFixedSize(self.wi.bottom_left_grip.size())
self.setGeometry(5, self.parent.height() - 20, 15, 15)
# ENABLE COLOR
if disable_color:
self.wi.bottom_left_grip.setStyleSheet("background: transparent")
# SHOW BOTTOM RIGHT GRIP
# ///////////////////////////////////////////////////////////////
if position == "bottom_right":
self.wi.bottom_right(self)
grip = QSizeGrip(self.wi.bottom_right_grip)
grip.setFixedSize(self.wi.bottom_right_grip.size())
self.setGeometry(self.parent.width() - 20, self.parent.height() - 20, 15, 15)
# ENABLE COLOR
if disable_color:
self.wi.bottom_right_grip.setStyleSheet("background: transparent")
# SHOW TOP GRIP
# ///////////////////////////////////////////////////////////////
if position == "top":
self.wi.top(self)
self.setGeometry(0, 5, self.parent.width(), 10)
self.setMaximumHeight(10)
# 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_grip.mouseMoveEvent = resize_top
# ENABLE COLOR
if disable_color:
self.wi.top_grip.setStyleSheet("background: transparent")
# SHOW BOTTOM GRIP
# ///////////////////////////////////////////////////////////////
elif position == "bottom":
self.wi.bottom(self)
self.setGeometry(0, self.parent.height() - 10, self.parent.width(), 10)
self.setMaximumHeight(10)
# 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_grip.mouseMoveEvent = resize_bottom
# ENABLE COLOR
if disable_color:
self.wi.bottom_grip.setStyleSheet("background: transparent")
# SHOW LEFT GRIP
# ///////////////////////////////////////////////////////////////
elif position == "left":
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.left_grip.mouseMoveEvent = resize_left
# ENABLE COLOR
if disable_color:
self.wi.left_grip.setStyleSheet("background: transparent")
# RESIZE RIGHT
# ///////////////////////////////////////////////////////////////
elif position == "right":
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.right_grip.mouseMoveEvent = resize_right
# ENABLE COLOR
if disable_color:
self.wi.right_grip.setStyleSheet("background: transparent")
# MOUSE RELEASE
# ///////////////////////////////////////////////////////////////
def mouseReleaseEvent(self, event):
self.mousePos = None
# RESIZE EVENT
# ///////////////////////////////////////////////////////////////
def resizeEvent(self, event):
if hasattr(self.wi, 'top_grip'):
self.wi.top_grip.setGeometry(0, 0, self.width(), 10)
elif hasattr(self.wi, 'bottom_grip'):
self.wi.bottom_grip.setGeometry(0, 0, self.width(), 10)
elif hasattr(self.wi, 'left_grip'):
self.wi.left_grip.setGeometry(0, 0, 10, self.height() - 20)
elif hasattr(self.wi, 'right_grip'):
self.wi.right_grip.setGeometry(0, 0, 10, self.height() - 20)
elif hasattr(self.wi, 'top_right_grip'):
self.wi.top_right_grip.setGeometry(self.width() - 15, 0, 15, 15)
elif hasattr(self.wi, 'bottom_left_grip'):
self.wi.bottom_left_grip.setGeometry(0, self.height() - 15, 15, 15)
elif hasattr(self.wi, 'bottom_right_grip'):
self.wi.bottom_right_grip.setGeometry(self.width() - 15, self.height() - 15, 15, 15)
# GRIP WIDGTES
# ///////////////////////////////////////////////////////////////
class Widgets(object):
def top_left(self, form):
self.top_left_grip = QFrame(form)
self.top_left_grip.setObjectName(u"top_left_grip")
self.top_left_grip.setFixedSize(15, 15)
self.top_left_grip.setStyleSheet(u"background-color: #333; border: 2px solid #55FF00;")
def top_right(self, form):
self.top_right_grip = QFrame(form)
self.top_right_grip.setObjectName(u"top_right_grip")
self.top_right_grip.setFixedSize(15, 15)
self.top_right_grip.setStyleSheet(u"background-color: #333; border: 2px solid #55FF00;")
def bottom_left(self, form):
self.bottom_left_grip = QFrame(form)
self.bottom_left_grip.setObjectName(u"bottom_left_grip")
self.bottom_left_grip.setFixedSize(15, 15)
self.bottom_left_grip.setStyleSheet(u"background-color: #333; border: 2px solid #55FF00;")
def bottom_right(self, form):
self.bottom_right_grip = QFrame(form)
self.bottom_right_grip.setObjectName(u"bottom_right_grip")
self.bottom_right_grip.setFixedSize(15, 15)
self.bottom_right_grip.setStyleSheet(u"background-color: #333; border: 2px solid #55FF00;")
def top(self, form):
self.top_grip = QFrame(form)
self.top_grip.setObjectName(u"top_grip")
self.top_grip.setGeometry(QRect(0, 0, 500, 10))
self.top_grip.setStyleSheet(u"background-color: rgb(85, 255, 255);")
self.top_grip.setCursor(QCursor(Qt.SizeVerCursor))
def bottom(self, form):
self.bottom_grip = QFrame(form)
self.bottom_grip.setObjectName(u"bottom_grip")
self.bottom_grip.setGeometry(QRect(0, 0, 500, 10))
self.bottom_grip.setStyleSheet(u"background-color: rgb(85, 170, 0);")
self.bottom_grip.setCursor(QCursor(Qt.SizeVerCursor))
def left(self, form):
self.left_grip = QFrame(form)
self.left_grip.setObjectName(u"left")
self.left_grip.setGeometry(QRect(0, 10, 10, 480))
self.left_grip.setMinimumSize(QSize(10, 0))
self.left_grip.setCursor(QCursor(Qt.SizeHorCursor))
self.left_grip.setStyleSheet(u"background-color: rgb(255, 121, 198);")
def right(self, form):
self.right_grip = QFrame(form)
self.right_grip.setObjectName(u"right")
self.right_grip.setGeometry(QRect(0, 0, 10, 500))
self.right_grip.setMinimumSize(QSize(10, 0))
self.right_grip.setCursor(QCursor(Qt.SizeHorCursor))
self.right_grip.setStyleSheet(u"background-color: rgb(255, 0, 127);")

@ -1,19 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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
#
# ///////////////////////////////////////////////////////////////
# PY ICON BUTTON
# ///////////////////////////////////////////////////////////////
from . py_icon_button import PyIconButton

@ -1,268 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 QT CORE
# ///////////////////////////////////////////////////////////////
from src.educoder.qt_core import *
# PY TITLE BUTTON
# ///////////////////////////////////////////////////////////////
class PyIconButton(QPushButton):
def __init__(
self,
icon_path = None,
parent = None,
app_parent = None,
tooltip_text = "",
btn_id = None,
width = 30,
height = 30,
radius = 8,
bg_color = "#343b48",
bg_color_hover = "#3c4454",
bg_color_pressed = "#2c313c",
icon_color = "#c3ccdf",
icon_color_hover = "#dce1ec",
icon_color_pressed = "#edf0f5",
icon_color_active = "#f5f6f9",
dark_one = "#1b1e23",
text_foreground = "#8a95aa",
context_color = "#568af2",
top_margin = 40,
is_active = False
):
super().__init__()
# SET DEFAULT PARAMETERS
self.setFixedSize(width, height)
self.setCursor(Qt.PointingHandCursor)
self.setObjectName(btn_id)
# PROPERTIES
self._bg_color = bg_color
self._bg_color_hover = bg_color_hover
self._bg_color_pressed = bg_color_pressed
self._icon_color = icon_color
self._icon_color_hover = icon_color_hover
self._icon_color_pressed = icon_color_pressed
self._icon_color_active = icon_color_active
self._context_color = context_color
self._top_margin = top_margin
self._is_active = is_active
# Set Parameters
self._set_bg_color = bg_color
self._set_icon_path = icon_path
self._set_icon_color = icon_color
self._set_border_radius = radius
# Parent
self._parent = parent
self._app_parent = app_parent
# TOOLTIP
self._tooltip_text = tooltip_text
self._tooltip = _ToolTip(
app_parent,
tooltip_text,
dark_one,
text_foreground
)
self._tooltip.hide()
# SET ACTIVE MENU
# ///////////////////////////////////////////////////////////////
def set_active(self, is_active):
self._is_active = is_active
self.repaint()
# RETURN IF IS ACTIVE MENU
# ///////////////////////////////////////////////////////////////
def is_active(self):
return self._is_active
# PAINT EVENT
# painting the button and the icon
# ///////////////////////////////////////////////////////////////
def paintEvent(self, event):
# PAINTER
paint = QPainter()
paint.begin(self)
paint.setRenderHint(QPainter.RenderHint.Antialiasing)
if self._is_active:
# BRUSH
brush = QBrush(QColor(self._context_color))
else:
# BRUSH
brush = QBrush(QColor(self._set_bg_color))
# CREATE RECTANGLE
rect = QRect(0, 0, self.width(), self.height())
paint.setPen(Qt.NoPen)
paint.setBrush(brush)
paint.drawRoundedRect(
rect,
self._set_border_radius,
self._set_border_radius
)
# DRAW ICONS
self.icon_paint(paint, self._set_icon_path, rect)
# END PAINTER
paint.end()
# CHANGE STYLES
# Functions with custom styles
# ///////////////////////////////////////////////////////////////
def change_style(self, event):
if event == QEvent.Enter:
self._set_bg_color = self._bg_color_hover
self._set_icon_color = self._icon_color_hover
self.repaint()
elif event == QEvent.Leave:
self._set_bg_color = self._bg_color
self._set_icon_color = self._icon_color
self.repaint()
elif event == QEvent.MouseButtonPress:
self._set_bg_color = self._bg_color_pressed
self._set_icon_color = self._icon_color_pressed
self.repaint()
elif event == QEvent.MouseButtonRelease:
self._set_bg_color = self._bg_color_hover
self._set_icon_color = self._icon_color_hover
self.repaint()
# 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)
# SET FOCUS
self.setFocus()
# EMIT SIGNAL
return self.clicked.emit()
# 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
return self.released.emit()
# DRAW ICON WITH COLORS
# ///////////////////////////////////////////////////////////////
def icon_paint(self, qp, image, rect):
icon = QPixmap(image)
painter = QPainter(icon)
painter.setCompositionMode(QPainter.CompositionMode_SourceIn)
if self._is_active:
painter.fillRect(icon.rect(), self._icon_color_active)
else:
painter.fillRect(icon.rect(), self._set_icon_color)
qp.drawPixmap(
(rect.width() - icon.width()) / 2,
(rect.height() - icon.height()) / 2,
icon
)
painter.end()
# SET ICON
# ///////////////////////////////////////////////////////////////
def set_icon(self, icon_path):
self._set_icon_path = icon_path
self.repaint()
# 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._tooltip.width() // 2)) + (self.width() // 2)
pos_y = pos.y() - self._top_margin
# SET POSITION TO WIDGET
# Move tooltip position
self._tooltip.move(pos_x, pos_y)
# TOOLTIP
# ///////////////////////////////////////////////////////////////
class _ToolTip(QLabel):
# TOOLTIP / LABEL StyleSheet
style_tooltip = """
QLabel {{
background-color: {_dark_one};
color: {_text_foreground};
padding-left: 10px;
padding-right: 10px;
border-radius: 17px;
border: 0px solid transparent;
font: 800 9pt "Segoe UI";
}}
"""
def __init__(
self,
parent,
tooltip,
dark_one,
text_foreground
):
QLabel.__init__(self)
# LABEL SETUP
style = self.style_tooltip.format(
_dark_one = dark_one,
_text_foreground = text_foreground
)
self.setObjectName(u"label_tooltip")
self.setStyleSheet(style)
self.setMinimumHeight(34)
self.setParent(parent)
self.setText(tooltip)
self.adjustSize()
# SET DROP SHADOW
self.shadow = QGraphicsDropShadowEffect(self)
self.shadow.setBlurRadius(30)
self.shadow.setXOffset(0)
self.shadow.setYOffset(0)
self.shadow.setColor(QColor(0, 0, 0, 80))
self.setGraphicsEffect(self.shadow)

@ -1,20 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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
#
# ///////////////////////////////////////////////////////////////
# PY LEFT COLUMN
# Left column with custom widgets
# ///////////////////////////////////////////////////////////////
from . py_left_column import PyLeftColumn

@ -1,70 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 QT CORE
# ///////////////////////////////////////////////////////////////
from src.educoder.qt_core import *
# PY ICON WITH CUSTOM COLORS
# ///////////////////////////////////////////////////////////////
class PyIcon(QWidget):
def __init__(
self,
icon_path,
icon_color
):
super().__init__()
# PROPERTIES
self._icon_path = icon_path
self._icon_color = icon_color
# SETUP UI
self.setup_ui()
def setup_ui(self):
# LAYOUT
self.layout = QVBoxLayout(self)
self.layout.setContentsMargins(0,0,0,0)
# LABEL
self.icon = QLabel()
self.icon.setAlignment(Qt.AlignCenter)
# PAINTER
self.set_icon(self._icon_path, self._icon_color)
# ADD TO LAYOUT
self.layout.addWidget(self.icon)
def set_icon(self, icon_path, icon_color = None):
# GET COLOR
color = ""
if icon_color != None:
color = icon_color
else:
color = self._icon_color
# PAINTER / PIXMAP
icon = QPixmap(icon_path)
painter = QPainter(icon)
painter.setCompositionMode(QPainter.CompositionMode_SourceIn)
painter.fillRect(icon.rect(), color)
painter.end()
# SET PIXMAP
self.icon.setPixmap(icon)

@ -1,271 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 QT CORE
# ///////////////////////////////////////////////////////////////
from src.educoder.qt_core import *
# PY TITLE BUTTON
# ///////////////////////////////////////////////////////////////
class PyLeftButton(QPushButton):
def __init__(
self,
parent,
app_parent = None,
tooltip_text = "",
btn_id = None,
width = 30,
height = 30,
radius = 8,
bg_color = "#343b48",
bg_color_hover = "#3c4454",
bg_color_pressed = "#2c313c",
icon_color = "#c3ccdf",
icon_color_hover = "#dce1ec",
icon_color_pressed = "#edf0f5",
icon_color_active = "#f5f6f9",
icon_path = "no_icon.svg",
dark_one = "#1b1e23",
context_color = "#568af2",
text_foreground = "#8a95aa",
is_active = False
):
super().__init__()
# SET DEFAULT PARAMETERS
self.setFixedSize(width, height)
self.setCursor(Qt.PointingHandCursor)
self.setObjectName(btn_id)
# PROPERTIES
self._bg_color = bg_color
self._bg_color_hover = bg_color_hover
self._bg_color_pressed = bg_color_pressed
self._icon_color = icon_color
self._icon_color_hover = icon_color_hover
self._icon_color_pressed = icon_color_pressed
self._icon_color_active = icon_color_active
self._context_color = context_color
self._top_margin = self.height() + 6
self._is_active = is_active
# Set Parameters
self._set_bg_color = bg_color
self._set_icon_path = icon_path
self._set_icon_color = icon_color
self._set_border_radius = radius
# Parent
self._parent = parent
self._app_parent = app_parent
# TOOLTIP
self._tooltip_text = tooltip_text
self._tooltip = _ToolTip(
app_parent,
tooltip_text,
dark_one,
context_color,
text_foreground
)
self._tooltip.hide()
# SET ACTIVE MENU
# ///////////////////////////////////////////////////////////////
def set_active(self, is_active):
self._is_active = is_active
self.repaint()
# RETURN IF IS ACTIVE MENU
# ///////////////////////////////////////////////////////////////
def is_active(self):
return self._is_active
# PAINT EVENT
# painting the button and the icon
# ///////////////////////////////////////////////////////////////
def paintEvent(self, event):
# PAINTER
paint = QPainter()
paint.begin(self)
paint.setRenderHint(QPainter.RenderHint.Antialiasing)
if self._is_active:
# BRUSH
brush = QBrush(QColor(self._bg_color_pressed))
else:
# BRUSH
brush = QBrush(QColor(self._set_bg_color))
# CREATE RECTANGLE
rect = QRect(0, 0, self.width(), self.height())
paint.setPen(Qt.NoPen)
paint.setBrush(brush)
paint.drawRoundedRect(
rect,
self._set_border_radius,
self._set_border_radius
)
# DRAW ICONS
self.icon_paint(paint, self._set_icon_path, rect)
# END PAINTER
paint.end()
# CHANGE STYLES
# Functions with custom styles
# ///////////////////////////////////////////////////////////////
def change_style(self, event):
if event == QEvent.Enter:
self._set_bg_color = self._bg_color_hover
self._set_icon_color = self._icon_color_hover
self.repaint()
elif event == QEvent.Leave:
self._set_bg_color = self._bg_color
self._set_icon_color = self._icon_color
self.repaint()
elif event == QEvent.MouseButtonPress:
self._set_bg_color = self._bg_color_pressed
self._set_icon_color = self._icon_color_pressed
self.repaint()
elif event == QEvent.MouseButtonRelease:
self._set_bg_color = self._bg_color_hover
self._set_icon_color = self._icon_color_hover
self.repaint()
# 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)
# SET FOCUS
self.setFocus()
# EMIT SIGNAL
return self.clicked.emit()
# 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
return self.released.emit()
# DRAW ICON WITH COLORS
# ///////////////////////////////////////////////////////////////
def icon_paint(self, qp, image, rect):
icon = QPixmap(image)
painter = QPainter(icon)
painter.setCompositionMode(QPainter.CompositionMode_SourceIn)
if self._is_active:
painter.fillRect(icon.rect(), self._context_color)
else:
painter.fillRect(icon.rect(), self._set_icon_color)
qp.drawPixmap(
(rect.width() - icon.width()) / 2,
(rect.height() - icon.height()) / 2,
icon
)
painter.end()
# SET ICON
# ///////////////////////////////////////////////////////////////
def set_icon(self, icon_path):
self._set_icon_path = icon_path
self.repaint()
# 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._tooltip.width()) + self.width() + 5
pos_y = pos.y() + self._top_margin
# SET POSITION TO WIDGET
# Move tooltip position
self._tooltip.move(pos_x, pos_y)
# TOOLTIP
# ///////////////////////////////////////////////////////////////
class _ToolTip(QLabel):
# TOOLTIP / LABEL StyleSheet
style_tooltip = """
QLabel {{
background-color: {_dark_one};
color: {_text_foreground};
padding-left: 10px;
padding-right: 10px;
border-radius: 17px;
border: 0px solid transparent;
border-right: 3px solid {_context_color};
font: 800 9pt "Segoe UI";
}}
"""
def __init__(
self,
parent,
tooltip,
dark_one,
context_color,
text_foreground
):
QLabel.__init__(self)
# LABEL SETUP
style = self.style_tooltip.format(
_dark_one = dark_one,
_context_color = context_color,
_text_foreground = text_foreground
)
self.setObjectName(u"label_tooltip")
self.setStyleSheet(style)
self.setMinimumHeight(34)
self.setParent(parent)
self.setText(tooltip)
self.adjustSize()
# SET DROP SHADOW
self.shadow = QGraphicsDropShadowEffect(self)
self.shadow.setBlurRadius(30)
self.shadow.setXOffset(0)
self.shadow.setYOffset(0)
self.shadow.setColor(QColor(0, 0, 0, 80))
self.setGraphicsEffect(self.shadow)

@ -1,194 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 QT CORE
# ///////////////////////////////////////////////////////////////
from src.educoder.qt_core import *
# IMPORT CLOSE BUTTON
# ///////////////////////////////////////////////////////////////
from . py_left_button import *
# IMPORT ICON
# ///////////////////////////////////////////////////////////////
from . py_icon import *
# IMPORT LEFT COLUMN
# ///////////////////////////////////////////////////////////////
from gui.uis.columns.ui_left_column import Ui_LeftColumn
class PyLeftColumn(QWidget):
# SIGNALS
clicked = Signal(object)
released = Signal(object)
def __init__(
self,
parent,
app_parent,
text_title,
text_title_size,
text_title_color,
dark_one,
bg_color,
btn_color,
btn_color_hover,
btn_color_pressed,
icon_path,
icon_color,
icon_color_hover,
icon_color_pressed,
context_color,
icon_close_path,
radius = 8
):
super().__init__()
# PARAMETERS
self._parent = parent
self._app_parent = app_parent
self._text_title = text_title
self._text_title_size = text_title_size
self._text_title_color = text_title_color
self._icon_path = icon_path
self._dark_one = dark_one
self._bg_color = bg_color
self._btn_color = btn_color
self._btn_color_hover = btn_color_hover
self._btn_color_pressed = btn_color_pressed
self._icon_color = icon_color
self._icon_color_hover = icon_color_hover
self._icon_color_pressed = icon_color_pressed
self._context_color = context_color
self._icon_close_path = icon_close_path
self._radius = radius
# SETUP UI
self.setup_ui()
# ADD LEFT COLUMN TO BG FRAME
self.menus = Ui_LeftColumn()
self.menus.setupUi(self.content_frame)
# CONNECT SIGNALS
self.btn_close.clicked.connect(self.btn_clicked)
self.btn_close.released.connect(self.btn_released)
# TITLE LEFT COLUMN EMIT SIGNALS
# ///////////////////////////////////////////////////////////////
def btn_clicked(self):
self.clicked.emit(self.btn_close)
def btn_released(self):
self.released.emit(self.btn_close)
# WIDGETS
# ///////////////////////////////////////////////////////////////
def setup_ui(self):
# BASE LAYOUT
self.base_layout = QVBoxLayout(self)
self.base_layout.setContentsMargins(0,0,0,0)
self.base_layout.setSpacing(0)
# TITLE FRAME
# ///////////////////////////////////////////////////////////////
self.title_frame = QFrame()
self.title_frame.setMaximumHeight(47)
self.title_frame.setMinimumHeight(47)
# TITLE BASE LAYOUT
self.title_base_layout = QVBoxLayout(self.title_frame)
self.title_base_layout.setContentsMargins(5,3,5,3)
# TITLE BG
self.title_bg_frame = QFrame()
self.title_bg_frame.setObjectName("title_bg_frame")
self.title_bg_frame.setStyleSheet(f'''
#title_bg_frame {{
background-color: {self._bg_color};
border-radius: {self._radius}px;
}}
''')
# LAYOUT TITLE BG
self.title_bg_layout = QHBoxLayout(self.title_bg_frame)
self.title_bg_layout.setContentsMargins(5,5,5,5)
self.title_bg_layout.setSpacing(3)
# ICON
self.icon_frame = QFrame()
self.icon_frame.setFixedSize(30,30)
self.icon_frame.setStyleSheet("background: none;")
self.icon_layout = QVBoxLayout(self.icon_frame)
self.icon_layout.setContentsMargins(0,0,0,0)
self.icon_layout.setSpacing(5)
self.icon = PyIcon(self._icon_path, self._icon_color)
self.icon_layout.addWidget(self.icon, Qt.AlignCenter, Qt.AlignCenter)
# LABEL
self.title_label = QLabel(self._text_title)
self.title_label.setObjectName("title_label")
self.title_label.setStyleSheet(f'''
#title_label {{
font-size: {self._text_title_size}pt;
color: {self._text_title_color};
padding-bottom: 2px;
background: none;
}}
''')
# BTN FRAME
self.btn_frame = QFrame()
self.btn_frame.setFixedSize(30,30)
self.btn_frame.setStyleSheet("background: none;")
# CLOSE BUTTON
self.btn_close = PyLeftButton(
self._parent,
self._app_parent,
tooltip_text = "Hide",
dark_one = self._dark_one,
bg_color = self._btn_color,
bg_color_hover = self._btn_color_hover,
bg_color_pressed = self._btn_color_pressed,
icon_color = self._icon_color,
icon_color_hover = self._icon_color_hover,
icon_color_pressed = self._icon_color_pressed,
icon_color_active = self._icon_color_pressed,
context_color = self._context_color,
text_foreground = self._text_title_color,
icon_path = self._icon_close_path,
radius = 6,
)
self.btn_close.setParent(self.btn_frame)
self.btn_close.setObjectName("btn_close_left_column")
# ADD TO TITLE LAYOUT
self.title_bg_layout.addWidget(self.icon_frame)
self.title_bg_layout.addWidget(self.title_label)
self.title_bg_layout.addWidget(self.btn_frame)
# ADD TITLE BG TO LAYOUT
self.title_base_layout.addWidget(self.title_bg_frame)
# CONTENT FRAME
# ///////////////////////////////////////////////////////////////
self.content_frame = QFrame()
self.content_frame.setStyleSheet("background: none")
# ADD TO LAYOUT
# ///////////////////////////////////////////////////////////////
self.base_layout.addWidget(self.title_frame)
self.base_layout.addWidget(self.content_frame)

@ -1,20 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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
#
# ///////////////////////////////////////////////////////////////
# PY LEFT MENU
# Left menu bar
# ///////////////////////////////////////////////////////////////
from . py_left_menu import PyLeftMenu

@ -1,34 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 QT CORE
# ///////////////////////////////////////////////////////////////
from src.educoder.qt_core import *
# CUSTOM LEFT MENU
# ///////////////////////////////////////////////////////////////
class PyDiv(QWidget):
def __init__(self, color):
super().__init__()
self.layout = QHBoxLayout(self)
self.layout.setContentsMargins(5,0,5,0)
self.frame_line = QFrame()
self.frame_line.setStyleSheet(f"background: {color};")
self.frame_line.setMaximumHeight(1)
self.frame_line.setMinimumHeight(1)
self.layout.addWidget(self.frame_line)
self.setMaximumHeight(1)

@ -1,266 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 QT CORE
# ///////////////////////////////////////////////////////////////
from src.educoder.qt_core import *
# IMPORT BUTTON AND DIV
# ///////////////////////////////////////////////////////////////
from . py_left_menu_button import PyLeftMenuButton
from . py_div import PyDiv
# IMPORT FUNCTIONS
# ///////////////////////////////////////////////////////////////
from gui.core.functions import *
# PY LEFT MENU
# ///////////////////////////////////////////////////////////////
class PyLeftMenu(QWidget):
# SIGNALS
clicked = Signal(object)
released = Signal(object)
def __init__(
self,
parent = None,
app_parent = None,
dark_one = "#1b1e23",
dark_three = "#21252d",
dark_four = "#272c36",
bg_one = "#2c313c",
icon_color = "#c3ccdf",
icon_color_hover = "#dce1ec",
icon_color_pressed = "#edf0f5",
icon_color_active = "#f5f6f9",
context_color = "#568af2",
text_foreground = "#8a95aa",
text_active = "#dce1ec",
duration_time = 500,
radius = 8,
minimum_width = 50,
maximum_width = 240,
icon_path = "icon_menu.svg",
icon_path_close = "icon_menu_close.svg",
toggle_text = "Hide Menu",
toggle_tooltip = "Show menu"
):
super().__init__()
# PROPERTIES
# ///////////////////////////////////////////////////////////////
self._dark_one = dark_one
self._dark_three = dark_three
self._dark_four = dark_four
self._bg_one = bg_one
self._icon_color = icon_color
self._icon_color_hover = icon_color_hover
self._icon_color_pressed = icon_color_pressed
self._icon_color_active = icon_color_active
self._context_color = context_color
self._text_foreground = text_foreground
self._text_active = text_active
self._duration_time = duration_time
self._radius = radius
self._minimum_width = minimum_width
self._maximum_width = maximum_width
self._icon_path = Functions.set_svg_icon(icon_path)
self._icon_path_close = Functions.set_svg_icon(icon_path_close)
# SET PARENT
self._parent = parent
self._app_parent = app_parent
# SETUP WIDGETS
self.setup_ui()
# SET BG COLOR
self.bg.setStyleSheet(f"background: {dark_one}; border-radius: {radius};")
# TOGGLE BUTTON AND DIV MENUS
# ///////////////////////////////////////////////////////////////
self.toggle_button = PyLeftMenuButton(
app_parent,
text = toggle_text,
tooltip_text = toggle_tooltip,
dark_one = self._dark_one,
dark_three = self._dark_three,
dark_four = self._dark_four,
bg_one = self._bg_one,
icon_color = self._icon_color,
icon_color_hover = self._icon_color_active,
icon_color_pressed = self._icon_color_pressed,
icon_color_active = self._icon_color_active,
context_color = self._context_color,
text_foreground = self._text_foreground,
text_active = self._text_active,
icon_path = icon_path
)
self.toggle_button.clicked.connect(self.toggle_animation)
self.div_top = PyDiv(dark_four)
# ADD TO TOP LAYOUT
# ///////////////////////////////////////////////////////////////
self.top_layout.addWidget(self.toggle_button)
self.top_layout.addWidget(self.div_top)
# ADD TO BOTTOM LAYOUT
# ///////////////////////////////////////////////////////////////
self.div_bottom = PyDiv(dark_four)
self.div_bottom.hide()
self.bottom_layout.addWidget(self.div_bottom)
# ADD BUTTONS TO LEFT MENU
# Add btns and emit signals
# ///////////////////////////////////////////////////////////////
def add_menus(self, parameters):
if parameters != None:
for parameter in parameters:
_btn_icon = parameter['btn_icon']
_btn_id = parameter['btn_id']
_btn_text = parameter['btn_text']
_btn_tooltip = parameter['btn_tooltip']
_show_top = parameter['show_top']
_is_active = parameter['is_active']
self.menu = PyLeftMenuButton(
self._app_parent,
text = _btn_text,
btn_id = _btn_id,
tooltip_text = _btn_tooltip,
dark_one = self._dark_one,
dark_three = self._dark_three,
dark_four = self._dark_four,
bg_one = self._bg_one,
icon_color = self._icon_color,
icon_color_hover = self._icon_color_active,
icon_color_pressed = self._icon_color_pressed,
icon_color_active = self._icon_color_active,
context_color = self._context_color,
text_foreground = self._text_foreground,
text_active = self._text_active,
icon_path = _btn_icon,
is_active = _is_active
)
self.menu.clicked.connect(self.btn_clicked)
self.menu.released.connect(self.btn_released)
# ADD TO LAYOUT
if _show_top:
self.top_layout.addWidget(self.menu)
else:
self.div_bottom.show()
self.bottom_layout.addWidget(self.menu)
# LEFT MENU EMIT SIGNALS
# ///////////////////////////////////////////////////////////////
def btn_clicked(self):
self.clicked.emit(self.menu)
def btn_released(self):
self.released.emit(self.menu)
# EXPAND / RETRACT LEF MENU
# ///////////////////////////////////////////////////////////////
def toggle_animation(self):
# CREATE ANIMATION
self.animation = QPropertyAnimation(self._parent, b"minimumWidth")
self.animation.stop()
if self.width() == self._minimum_width:
self.animation.setStartValue(self.width())
self.animation.setEndValue(self._maximum_width)
self.toggle_button.set_active_toggle(True)
self.toggle_button.set_icon(self._icon_path_close)
else:
self.animation.setStartValue(self.width())
self.animation.setEndValue(self._minimum_width)
self.toggle_button.set_active_toggle(False)
self.toggle_button.set_icon(self._icon_path)
self.animation.setEasingCurve(QEasingCurve.InOutCubic)
self.animation.setDuration(self._duration_time)
self.animation.start()
# SELECT ONLY ONE BTN
# ///////////////////////////////////////////////////////////////
def select_only_one(self, widget: str):
for btn in self.findChildren(QPushButton):
if btn.objectName() == widget:
btn.set_active(True)
else:
btn.set_active(False)
# SELECT ONLY ONE TAB BTN
# ///////////////////////////////////////////////////////////////
def select_only_one_tab(self, widget: str):
for btn in self.findChildren(QPushButton):
if btn.objectName() == widget:
btn.set_active_tab(True)
else:
btn.set_active_tab(False)
# DESELECT ALL BTNs
# ///////////////////////////////////////////////////////////////
def deselect_all(self):
for btn in self.findChildren(QPushButton):
btn.set_active(False)
# DESELECT ALL TAB BTNs
# ///////////////////////////////////////////////////////////////
def deselect_all_tab(self):
for btn in self.findChildren(QPushButton):
btn.set_active_tab(False)
# SETUP APP
# ///////////////////////////////////////////////////////////////
def setup_ui(self):
# ADD MENU LAYOUT
self.left_menu_layout = QVBoxLayout(self)
self.left_menu_layout.setContentsMargins(0,0,0,0)
# ADD BG
self.bg = QFrame()
# TOP FRAME
self.top_frame = QFrame()
# BOTTOM FRAME
self.bottom_frame = QFrame()
# ADD LAYOUTS
self._layout = QVBoxLayout(self.bg)
self._layout.setContentsMargins(0,0,0,0)
# TOP LAYOUT
self.top_layout = QVBoxLayout(self.top_frame)
self.top_layout.setContentsMargins(0,0,0,0)
self.top_layout.setSpacing(1)
# BOTTOM LAYOUT
self.bottom_layout = QVBoxLayout(self.bottom_frame)
self.bottom_layout.setContentsMargins(0,0,0,8)
self.bottom_layout.setSpacing(1)
# ADD TOP AND BOTTOM FRAME
self._layout.addWidget(self.top_frame, 0, Qt.AlignTop)
self._layout.addWidget(self.bottom_frame, 0, Qt.AlignBottom)
# ADD BG TO LAYOUT
self.left_menu_layout.addWidget(self.bg)

@ -1,380 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 AND MODULES
# ///////////////////////////////////////////////////////////////
import os
# IMPORT QT CORE
# ///////////////////////////////////////////////////////////////
from src.educoder.qt_core import *
# IMPORT FUNCTIONS
# ///////////////////////////////////////////////////////////////
from src.educoder.gui.core.functions import *
# CUSTOM LEFT MENU
# ///////////////////////////////////////////////////////////////
class PyLeftMenuButton(QPushButton):
def __init__(
self,
app_parent,
text,
btn_id = None,
tooltip_text = "",
margin = 4,
dark_one = "#1b1e23",
dark_three = "#21252d",
dark_four = "#272c36",
bg_one = "#2c313c",
icon_color = "#c3ccdf",
icon_color_hover = "#dce1ec",
icon_color_pressed = "#edf0f5",
icon_color_active = "#f5f6f9",
context_color = "#568af2",
text_foreground = "#8a95aa",
text_active = "#dce1ec",
icon_path = "icon_add_user.svg",
icon_active_menu = "active_menu.svg",
is_active = False,
is_active_tab = False,
is_toggle_active = False
):
super().__init__()
self.setText(text)
self.setCursor(Qt.PointingHandCursor)
self.setMaximumHeight(50)
self.setMinimumHeight(50)
self.setObjectName(btn_id)
# APP PATH
self._icon_path = Functions.set_svg_icon(icon_path)
self._icon_active_menu = Functions.set_svg_icon(icon_active_menu)
# PROPERTIES
self._margin = margin
self._dark_one = dark_one
self._dark_three = dark_three
self._dark_four = dark_four
self._bg_one = bg_one
self._context_color = context_color
self._icon_color = icon_color
self._icon_color_hover = icon_color_hover
self._icon_color_pressed = icon_color_pressed
self._icon_color_active = icon_color_active
self._set_icon_color = self._icon_color # Set icon color
self._set_bg_color = self._dark_one # Set BG color
self._set_text_foreground = text_foreground
self._set_text_active = text_active
self._parent = app_parent
self._is_active = is_active
self._is_active_tab = is_active_tab
self._is_toggle_active = is_toggle_active
# TOOLTIP
self._tooltip_text = tooltip_text
self.tooltip = _ToolTip(
app_parent,
tooltip_text,
dark_one,
context_color,
text_foreground
)
self.tooltip.hide()
# PAINT EVENT
# ///////////////////////////////////////////////////////////////
def paintEvent(self, event):
# PAINTER
p = QPainter()
p.begin(self)
p.setRenderHint(QPainter.Antialiasing)
p.setPen(Qt.NoPen)
p.setFont(self.font())
# RECTANGLES
rect = QRect(4, 5, self.width(), self.height() - 10)
rect_inside = QRect(4, 5, self.width() - 8, self.height() - 10)
rect_icon = QRect(0, 0, 50, self.height())
rect_blue = QRect(4, 5, 20, self.height() - 10)
rect_inside_active = QRect(7, 5, self.width(), self.height() - 10)
rect_text = QRect(45, 0, self.width() - 50, self.height())
if self._is_active:
# DRAW BG BLUE
p.setBrush(QColor(self._context_color))
p.drawRoundedRect(rect_blue, 8, 8)
# BG INSIDE
p.setBrush(QColor(self._bg_one))
p.drawRoundedRect(rect_inside_active, 8, 8)
# DRAW ACTIVE
icon_path = self._icon_active_menu
app_path = os.path.abspath(os.getcwd())
icon_path = os.path.normpath(os.path.join(app_path, icon_path))
self._set_icon_color = self._icon_color_active
self.icon_active(p, icon_path, self.width())
# DRAW TEXT
p.setPen(QColor(self._set_text_active))
p.drawText(rect_text, Qt.AlignVCenter, self.text())
# DRAW ICONS
self.icon_paint(p, self._icon_path, rect_icon, self._set_icon_color)
elif self._is_active_tab:
# DRAW BG BLUE
p.setBrush(QColor(self._dark_four))
p.drawRoundedRect(rect_blue, 8, 8)
# BG INSIDE
p.setBrush(QColor(self._bg_one))
p.drawRoundedRect(rect_inside_active, 8, 8)
# DRAW ACTIVE
icon_path = self._icon_active_menu
app_path = os.path.abspath(os.getcwd())
icon_path = os.path.normpath(os.path.join(app_path, icon_path))
self._set_icon_color = self._icon_color_active
self.icon_active(p, icon_path, self.width())
# DRAW TEXT
p.setPen(QColor(self._set_text_active))
p.drawText(rect_text, Qt.AlignVCenter, self.text())
# DRAW ICONS
self.icon_paint(p, self._icon_path, rect_icon, self._set_icon_color)
# NORMAL BG
else:
if self._is_toggle_active:
# BG INSIDE
p.setBrush(QColor(self._dark_three))
p.drawRoundedRect(rect_inside, 8, 8)
# DRAW TEXT
p.setPen(QColor(self._set_text_foreground))
p.drawText(rect_text, Qt.AlignVCenter, self.text())
# DRAW ICONS
if self._is_toggle_active:
self.icon_paint(p, self._icon_path, rect_icon, self._context_color)
else:
self.icon_paint(p, self._icon_path, rect_icon, self._set_icon_color)
else:
# BG INSIDE
p.setBrush(QColor(self._set_bg_color))
p.drawRoundedRect(rect_inside, 8, 8)
# DRAW TEXT
p.setPen(QColor(self._set_text_foreground))
p.drawText(rect_text, Qt.AlignVCenter, self.text())
# DRAW ICONS
self.icon_paint(p, self._icon_path, rect_icon, self._set_icon_color)
p.end()
# SET ACTIVE MENU
# ///////////////////////////////////////////////////////////////
def set_active(self, is_active):
self._is_active = is_active
if not is_active:
self._set_icon_color = self._icon_color
self._set_bg_color = self._dark_one
self.repaint()
# SET ACTIVE TAB MENU
# ///////////////////////////////////////////////////////////////
def set_active_tab(self, is_active):
self._is_active_tab = is_active
if not is_active:
self._set_icon_color = self._icon_color
self._set_bg_color = self._dark_one
self.repaint()
# RETURN IF IS ACTIVE MENU
# ///////////////////////////////////////////////////////////////
def is_active(self):
return self._is_active
# RETURN IF IS ACTIVE TAB MENU
# ///////////////////////////////////////////////////////////////
def is_active_tab(self):
return self._is_active_tab
# SET ACTIVE TOGGLE
# ///////////////////////////////////////////////////////////////
def set_active_toggle(self, is_active):
self._is_toggle_active = is_active
# SET ICON
# ///////////////////////////////////////////////////////////////
def set_icon(self, icon_path):
self._icon_path = icon_path
self.repaint()
# DRAW ICON WITH COLORS
# ///////////////////////////////////////////////////////////////
def icon_paint(self, qp, image, rect, color):
icon = QPixmap(image)
painter = QPainter(icon)
painter.setCompositionMode(QPainter.CompositionMode_SourceIn)
painter.fillRect(icon.rect(), color)
qp.drawPixmap(
(rect.width() - icon.width()) / 2,
(rect.height() - icon.height()) / 2,
icon
)
painter.end()
# DRAW ACTIVE ICON / RIGHT SIDE
# ///////////////////////////////////////////////////////////////
def icon_active(self, qp, image, width):
icon = QPixmap(image)
painter = QPainter(icon)
painter.setCompositionMode(QPainter.CompositionMode_SourceIn)
painter.fillRect(icon.rect(), self._bg_one)
qp.drawPixmap(width - 5, 0, icon)
painter.end()
# CHANGE STYLES
# Functions with custom styles
# ///////////////////////////////////////////////////////////////
def change_style(self, event):
if event == QEvent.Enter:
if not self._is_active:
self._set_icon_color = self._icon_color_hover
self._set_bg_color = self._dark_three
self.repaint()
elif event == QEvent.Leave:
if not self._is_active:
self._set_icon_color = self._icon_color
self._set_bg_color = self._dark_one
self.repaint()
elif event == QEvent.MouseButtonPress:
if not self._is_active:
self._set_icon_color = self._context_color
self._set_bg_color = self._dark_four
self.repaint()
elif event == QEvent.MouseButtonRelease:
if not self._is_active:
self._set_icon_color = self._icon_color_hover
self._set_bg_color = self._dark_three
self.repaint()
# MOUSE OVER
# Event triggered when the mouse is over the BTN
# ///////////////////////////////////////////////////////////////
def enterEvent(self, event):
self.change_style(QEvent.Enter)
if self.width() == 50 and self._tooltip_text:
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.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)
self.tooltip.hide()
return self.clicked.emit()
# MOUSE RELEASED
# Event triggered after the mouse button is released
# ///////////////////////////////////////////////////////////////
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
self.change_style(QEvent.MouseButtonRelease)
return self.released.emit()
# 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() + 5
pos_y = pos.y() + (self.width() - self.tooltip.height()) // 2
# SET POSITION TO WIDGET
# Move tooltip position
self.tooltip.move(pos_x, pos_y)
class _ToolTip(QLabel):
# TOOLTIP / LABEL StyleSheet
style_tooltip = """
QLabel {{
background-color: {_dark_one};
color: {_text_foreground};
padding-left: 10px;
padding-right: 10px;
border-radius: 17px;
border: 0px solid transparent;
border-left: 3px solid {_context_color};
font: 800 9pt "Segoe UI";
}}
"""
def __init__(
self,
parent,
tooltip,
dark_one,
context_color,
text_foreground
):
QLabel.__init__(self)
# LABEL SETUP
style = self.style_tooltip.format(
_dark_one = dark_one,
_context_color = context_color,
_text_foreground = text_foreground
)
self.setObjectName(u"label_tooltip")
self.setStyleSheet(style)
self.setMinimumHeight(34)
self.setParent(parent)
self.setText(tooltip)
self.adjustSize()
# SET DROP SHADOW
self.shadow = QGraphicsDropShadowEffect(self)
self.shadow.setBlurRadius(30)
self.shadow.setXOffset(0)
self.shadow.setYOffset(0)
self.shadow.setColor(QColor(0, 0, 0, 80))
self.setGraphicsEffect(self.shadow)

@ -1,19 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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
#
# ///////////////////////////////////////////////////////////////
# PY LINE EDIT
# ///////////////////////////////////////////////////////////////
from . py_line_edit import PyLineEdit

@ -1,95 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 QT CORE
# ///////////////////////////////////////////////////////////////
from src.educoder.qt_core import *
# STYLE
# ///////////////////////////////////////////////////////////////
style = '''
QLineEdit {{
background-color: {_bg_color};
border-radius: {_radius}px;
border: {_border_size}px solid transparent;
padding-left: 10px;
padding-right: 10px;
selection-color: {_selection_color};
selection-background-color: {_context_color};
color: {_color};
}}
QLineEdit:focus {{
border: {_border_size}px solid {_context_color};
background-color: {_bg_color_active};
}}
'''
# PY PUSH BUTTON
# ///////////////////////////////////////////////////////////////
class PyLineEdit(QLineEdit):
def __init__(
self,
text = "",
place_holder_text = "",
radius = 8,
border_size = 2,
color = "#FFF",
selection_color = "#FFF",
bg_color = "#333",
bg_color_active = "#222",
context_color = "#00ABE8"
):
super().__init__()
# PARAMETERS
if text:
self.setText(text)
if place_holder_text:
self.setPlaceholderText(place_holder_text)
# SET STYLESHEET
self.set_stylesheet(
radius,
border_size,
color,
selection_color,
bg_color,
bg_color_active,
context_color
)
# SET STYLESHEET
def set_stylesheet(
self,
radius,
border_size,
color,
selection_color,
bg_color,
bg_color_active,
context_color
):
# APPLY STYLESHEET
style_format = style.format(
_radius = radius,
_border_size = border_size,
_color = color,
_selection_color = selection_color,
_bg_color = bg_color,
_bg_color_active = bg_color_active,
_context_color = context_color
)
self.setStyleSheet(style_format)

@ -1,19 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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
#
# ///////////////////////////////////////////////////////////////
# PY PUSH BUTTON
# ///////////////////////////////////////////////////////////////
from . py_push_button import PyPushButton

@ -1,71 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 QT CORE
# ///////////////////////////////////////////////////////////////
from src.educoder.qt_core import *
# STYLE
# ///////////////////////////////////////////////////////////////
style = '''
QPushButton {{
border: none;
padding-left: 10px;
padding-right: 5px;
color: {_color};
border-radius: {_radius};
background-color: {_bg_color};
}}
QPushButton:hover {{
background-color: {_bg_color_hover};
}}
QPushButton:pressed {{
background-color: {_bg_color_pressed};
}}
'''
# PY PUSH BUTTON
# ///////////////////////////////////////////////////////////////
class PyPushButton(QPushButton):
def __init__(
self,
text,
radius,
color,
bg_color,
bg_color_hover,
bg_color_pressed,
parent = None,
):
super().__init__()
# SET PARAMETRES
self.setText(text)
if parent != None:
self.setParent(parent)
self.setCursor(Qt.PointingHandCursor)
# SET STYLESHEET
custom_style = style.format(
_color = color,
_radius = radius,
_bg_color = bg_color,
_bg_color_hover = bg_color_hover,
_bg_color_pressed = bg_color_pressed
)
self.setStyleSheet(custom_style)

@ -1,19 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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
#
# ///////////////////////////////////////////////////////////////
# PY SLIDER
# ///////////////////////////////////////////////////////////////
from . py_slider import PySlider

@ -1,97 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 QT CORE
# ///////////////////////////////////////////////////////////////
from src.educoder.qt_core import *
style = """
/* HORIZONTAL */
QSlider {{ margin: {_margin}px; }}
QSlider::groove:horizontal {{
border-radius: {_bg_radius}px;
height: {_bg_size}px;
margin: 0px;
background-color: {_bg_color};
}}
QSlider::groove:horizontal:hover {{ background-color: {_bg_color_hover}; }}
QSlider::handle:horizontal {{
border: none;
height: {_handle_size}px;
width: {_handle_size}px;
margin: {_handle_margin}px;
border-radius: {_handle_radius}px;
background-color: {_handle_color};
}}
QSlider::handle:horizontal:hover {{ background-color: {_handle_color_hover}; }}
QSlider::handle:horizontal:pressed {{ background-color: {_handle_color_pressed}; }}
/* VERTICAL */
QSlider::groove:vertical {{
border-radius: {_bg_radius}px;
width: {_bg_size}px;
margin: 0px;
background-color: {_bg_color};
}}
QSlider::groove:vertical:hover {{ background-color: {_bg_color_hover}; }}
QSlider::handle:vertical {{
border: none;
height: {_handle_size}px;
width: {_handle_size}px;
margin: {_handle_margin}px;
border-radius: {_handle_radius}px;
background-color: {_handle_color};
}}
QSlider::handle:vertical:hover {{ background-color: {_handle_color_hover}; }}
QSlider::handle:vertical:pressed {{ background-color: {_handle_color_pressed}; }}
"""
class PySlider(QSlider):
def __init__(
self,
margin = 0,
bg_size = 20,
bg_radius = 10,
bg_color = "#1b1e23",
bg_color_hover = "#1e2229",
handle_margin = 2,
handle_size = 16,
handle_radius = 8,
handle_color = "#568af2",
handle_color_hover = "#6c99f4",
handle_color_pressed = "#3f6fd1"
):
super(PySlider, self).__init__()
# FORMAT STYLE
# ///////////////////////////////////////////////////////////////
adjust_style = style.format(
_margin = margin,
_bg_size = bg_size,
_bg_radius = bg_radius,
_bg_color = bg_color,
_bg_color_hover = bg_color_hover,
_handle_margin = handle_margin,
_handle_size = handle_size,
_handle_radius = handle_radius,
_handle_color = handle_color,
_handle_color_hover = handle_color_hover,
_handle_color_pressed = handle_color_pressed
)
# APPLY CUSTOM STYLE
# ///////////////////////////////////////////////////////////////
self.setStyleSheet(adjust_style)

@ -1,19 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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
#
# ///////////////////////////////////////////////////////////////
# PY TABLE WIDGET
# ///////////////////////////////////////////////////////////////
from . py_table_widget import PyTableWidget

@ -1,90 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 QT CORE
# ///////////////////////////////////////////////////////////////
from src.educoder.qt_core import *
# IMPORT STYLE
# ///////////////////////////////////////////////////////////////
from . style import *
# PY PUSH BUTTON
# ///////////////////////////////////////////////////////////////
class PyTableWidget(QTableWidget):
def __init__(
self,
radius = 8,
color = "#FFF",
bg_color = "#444",
selection_color = "#FFF",
header_horizontal_color = "#333",
header_vertical_color = "#444",
bottom_line_color = "#555",
grid_line_color = "#555",
scroll_bar_bg_color = "#FFF",
scroll_bar_btn_color = "#3333",
context_color = "#00ABE8"
):
super().__init__()
# PARAMETERS
# SET STYLESHEET
self.set_stylesheet(
radius,
color,
bg_color,
header_horizontal_color,
header_vertical_color,
selection_color,
bottom_line_color,
grid_line_color,
scroll_bar_bg_color,
scroll_bar_btn_color,
context_color
)
# SET STYLESHEET
def set_stylesheet(
self,
radius,
color,
bg_color,
header_horizontal_color,
header_vertical_color,
selection_color,
bottom_line_color,
grid_line_color,
scroll_bar_bg_color,
scroll_bar_btn_color,
context_color
):
# APPLY STYLESHEET
style_format = style.format(
_radius = radius,
_color = color,
_bg_color = bg_color,
_header_horizontal_color = header_horizontal_color,
_header_vertical_color = header_vertical_color,
_selection_color = selection_color,
_bottom_line_color = bottom_line_color,
_grid_line_color = grid_line_color,
_scroll_bar_bg_color = scroll_bar_bg_color,
_scroll_bar_btn_color = scroll_bar_btn_color,
_context_color = context_color
)
self.setStyleSheet(style_format)

@ -1,135 +0,0 @@
# STYLE
# ///////////////////////////////////////////////////////////////
style = '''
/* /////////////////////////////////////////////////////////////////////////////////////////////////
QTableWidget */
QTableWidget {{
background-color: {_bg_color};
padding: 5px;
border-radius: {_radius}px;
gridline-color: {_grid_line_color};
color: {_color};
}}
QTableWidget::item{{
border-color: none;
padding-left: 5px;
padding-right: 5px;
gridline-color: rgb(44, 49, 60);
border-bottom: 1px solid {_bottom_line_color};
}}
QTableWidget::item:selected{{
background-color: {_selection_color};
}}
QHeaderView::section{{
background-color: rgb(33, 37, 43);
max-width: 30px;
border: 1px solid rgb(44, 49, 58);
border-style: none;
border-bottom: 1px solid rgb(44, 49, 60);
border-right: 1px solid rgb(44, 49, 60);
}}
QTableWidget::horizontalHeader {{
background-color: rgb(33, 37, 43);
}}
QTableWidget QTableCornerButton::section {{
border: none;
background-color: {_header_horizontal_color};
padding: 3px;
border-top-left-radius: {_radius}px;
}}
QHeaderView::section:horizontal
{{
border: none;
background-color: {_header_horizontal_color};
padding: 3px;
}}
QHeaderView::section:vertical
{{
border: none;
background-color: {_header_vertical_color};
padding-left: 5px;
padding-right: 5px;
border-bottom: 1px solid {_bottom_line_color};
margin-bottom: 1px;
}}
/* /////////////////////////////////////////////////////////////////////////////////////////////////
ScrollBars */
QScrollBar:horizontal {{
border: none;
background: {_scroll_bar_bg_color};
height: 8px;
margin: 0px 21px 0 21px;
border-radius: 0px;
}}
QScrollBar::handle:horizontal {{
background: {_context_color};
min-width: 25px;
border-radius: 4px
}}
QScrollBar::add-line:horizontal {{
border: none;
background: {_scroll_bar_btn_color};
width: 20px;
border-top-right-radius: 4px;
border-bottom-right-radius: 4px;
subcontrol-position: right;
subcontrol-origin: margin;
}}
QScrollBar::sub-line:horizontal {{
border: none;
background: {_scroll_bar_btn_color};
width: 20px;
border-top-left-radius: 4px;
border-bottom-left-radius: 4px;
subcontrol-position: left;
subcontrol-origin: margin;
}}
QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal
{{
background: none;
}}
QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal
{{
background: none;
}}
QScrollBar:vertical {{
border: none;
background: {_scroll_bar_bg_color};
width: 8px;
margin: 21px 0 21px 0;
border-radius: 0px;
}}
QScrollBar::handle:vertical {{
background: {_context_color};
min-height: 25px;
border-radius: 4px
}}
QScrollBar::add-line:vertical {{
border: none;
background: {_scroll_bar_btn_color};
height: 20px;
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
subcontrol-position: bottom;
subcontrol-origin: margin;
}}
QScrollBar::sub-line:vertical {{
border: none;
background: {_scroll_bar_btn_color};
height: 20px;
border-top-left-radius: 4px;
border-top-right-radius: 4px;
subcontrol-position: top;
subcontrol-origin: margin;
}}
QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical {{
background: none;
}}
QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {{
background: none;
}}
'''

@ -1,21 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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
#
# ///////////////////////////////////////////////////////////////
# PY TITLE BAR
# Top bar with move application, maximize, restore, minimize,
# close buttons and extra buttons
# ///////////////////////////////////////////////////////////////
from . py_title_bar import PyTitleBar

@ -1,35 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 QT CORE
# ///////////////////////////////////////////////////////////////
from src.educoder.qt_core import *
# CUSTOM LEFT MENU
# ///////////////////////////////////////////////////////////////
class PyDiv(QWidget):
def __init__(self, color):
super().__init__()
self.layout = QHBoxLayout(self)
self.layout.setContentsMargins(0,5,0,5)
self.frame_line = QFrame()
self.frame_line.setStyleSheet(f"background: {color};")
self.frame_line.setMaximumWidth(1)
self.frame_line.setMinimumWidth(1)
self.layout.addWidget(self.frame_line)
self.setMaximumWidth(20)
self.setMinimumWidth(20)

@ -1,346 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 QT CORE
# ///////////////////////////////////////////////////////////////
from src.educoder.qt_core import *
# IMPORT FUNCTIONS
# ///////////////////////////////////////////////////////////////
from src.educoder.gui.core.functions import *
# IMPORT SETTINGS
# ///////////////////////////////////////////////////////////////
from src.educoder.gui.core.json_settings import Settings
# IMPORT DIV
# ///////////////////////////////////////////////////////////////
from . py_div import PyDiv
# IMPORT BUTTON
# ///////////////////////////////////////////////////////////////
from . py_title_button import PyTitleButton
# GLOBALS
# ///////////////////////////////////////////////////////////////
_is_maximized = False
_old_size = QSize()
# PY TITLE BAR
# Top bar with move application, maximize, restore, minimize,
# close buttons and extra buttons
# ///////////////////////////////////////////////////////////////
class PyTitleBar(QWidget):
# SIGNALS
clicked = Signal(object)
released = Signal(object)
def __init__(
self,
parent,
app_parent,
logo_image = "logo_top_100x22.svg",
logo_width = 100,
buttons = None,
dark_one = "#1b1e23",
bg_color = "#343b48",
div_color = "#3c4454",
btn_bg_color = "#343b48",
btn_bg_color_hover = "#3c4454",
btn_bg_color_pressed = "#2c313c",
icon_color = "#c3ccdf",
icon_color_hover = "#dce1ec",
icon_color_pressed = "#edf0f5",
icon_color_active = "#f5f6f9",
context_color = "#6c99f4",
text_foreground = "#8a95aa",
radius = 8,
font_family = "Segoe UI",
title_size = 10,
is_custom_title_bar = True,
):
super().__init__()
settings = Settings()
self.settings = settings.items
# PARAMETERS
self._logo_image = logo_image
self._dark_one = dark_one
self._bg_color = bg_color
self._div_color = div_color
self._parent = parent
self._app_parent = app_parent
self._btn_bg_color = btn_bg_color
self._btn_bg_color_hover = btn_bg_color_hover
self._btn_bg_color_pressed = btn_bg_color_pressed
self._context_color = context_color
self._icon_color = icon_color
self._icon_color_hover = icon_color_hover
self._icon_color_pressed = icon_color_pressed
self._icon_color_active = icon_color_active
self._font_family = font_family
self._title_size = title_size
self._text_foreground = text_foreground
self._is_custom_title_bar = is_custom_title_bar
# SETUP UI
self.setup_ui()
# ADD BG COLOR
self.bg.setStyleSheet(f"background-color: {bg_color}; border-radius: {radius}px;")
# SET LOGO AND WIDTH
self.top_logo.setMinimumWidth(logo_width)
self.top_logo.setMaximumWidth(logo_width)
#self.top_logo.setPixmap(Functions.set_svg_image(logo_image))
# MOVE WINDOW / MAXIMIZE / RESTORE
# ///////////////////////////////////////////////////////////////
def moveWindow(event):
# IF MAXIMIZED CHANGE TO NORMAL
if parent.isMaximized():
self.maximize_restore()
#self.resize(_old_size)
curso_x = parent.pos().x()
curso_y = event.globalPos().y() - QCursor.pos().y()
parent.move(curso_x, curso_y)
# MOVE WINDOW
if event.buttons() == Qt.LeftButton:
parent.move(parent.pos() + event.globalPos() - parent.dragPos)
parent.dragPos = event.globalPos()
event.accept()
# MOVE APP WIDGETS
if is_custom_title_bar:
self.top_logo.mouseMoveEvent = moveWindow
self.div_1.mouseMoveEvent = moveWindow
self.title_label.mouseMoveEvent = moveWindow
self.div_2.mouseMoveEvent = moveWindow
self.div_3.mouseMoveEvent = moveWindow
# MAXIMIZE / RESTORE
if is_custom_title_bar:
self.top_logo.mouseDoubleClickEvent = self.maximize_restore
self.div_1.mouseDoubleClickEvent = self.maximize_restore
self.title_label.mouseDoubleClickEvent = self.maximize_restore
self.div_2.mouseDoubleClickEvent = self.maximize_restore
# ADD WIDGETS TO TITLE BAR
# ///////////////////////////////////////////////////////////////
self.bg_layout.addWidget(self.top_logo)
self.bg_layout.addWidget(self.div_1)
self.bg_layout.addWidget(self.title_label)
self.bg_layout.addWidget(self.div_2)
# ADD BUTTONS BUTTONS
# ///////////////////////////////////////////////////////////////
# Functions
self.minimize_button.released.connect(lambda: parent.showMinimized())
self.maximize_restore_button.released.connect(lambda: self.maximize_restore())
self.close_button.released.connect(lambda: parent.close())
# Extra BTNs layout
self.bg_layout.addLayout(self.custom_buttons_layout)
# ADD Buttons
if is_custom_title_bar:
self.bg_layout.addWidget(self.minimize_button)
self.bg_layout.addWidget(self.maximize_restore_button)
self.bg_layout.addWidget(self.close_button)
# ADD BUTTONS TO TITLE BAR
# Add btns and emit signals
# ///////////////////////////////////////////////////////////////
def add_menus(self, parameters):
if parameters != None and len(parameters) > 0:
for parameter in parameters:
_btn_icon = Functions.set_svg_icon(parameter['btn_icon'])
_btn_id = parameter['btn_id']
_btn_tooltip = parameter['btn_tooltip']
_is_active = parameter['is_active']
self.menu = PyTitleButton(
self._parent,
self._app_parent,
btn_id = _btn_id,
tooltip_text = _btn_tooltip,
dark_one = self._dark_one,
bg_color = self._bg_color,
bg_color_hover = self._btn_bg_color_hover,
bg_color_pressed = self._btn_bg_color_pressed,
icon_color = self._icon_color,
icon_color_hover = self._icon_color_active,
icon_color_pressed = self._icon_color_pressed,
icon_color_active = self._icon_color_active,
context_color = self._context_color,
text_foreground = self._text_foreground,
icon_path = _btn_icon,
is_active = _is_active
)
self.menu.clicked.connect(self.btn_clicked)
self.menu.released.connect(self.btn_released)
# ADD TO LAYOUT
self.custom_buttons_layout.addWidget(self.menu)
# ADD DIV
if self._is_custom_title_bar:
self.custom_buttons_layout.addWidget(self.div_3)
# TITLE BAR MENU EMIT SIGNALS
# ///////////////////////////////////////////////////////////////
def btn_clicked(self):
self.clicked.emit(self.menu)
def btn_released(self):
self.released.emit(self.menu)
# SET TITLE BAR TEXT
# ///////////////////////////////////////////////////////////////
def set_title(self, title):
self.title_label.setText(title)
# MAXIMIZE / RESTORE
# maximize and restore parent window
# ///////////////////////////////////////////////////////////////
def maximize_restore(self, e = None):
global _is_maximized
global _old_size
# CHANGE UI AND RESIZE GRIP
def change_ui():
if _is_maximized:
self._parent.ui.central_widget_layout.setContentsMargins(0,0,0,0)
self._parent.ui.window.set_stylesheet(border_radius = 0, border_size = 0)
self.maximize_restore_button.set_icon(
Functions.set_svg_icon("icon_restore.svg")
)
else:
self._parent.ui.central_widget_layout.setContentsMargins(10,10,10,10)
self._parent.ui.window.set_stylesheet(border_radius = 10, border_size = 2)
self.maximize_restore_button.set_icon(
Functions.set_svg_icon("icon_maximize.svg")
)
# CHECK EVENT
if self._parent.isMaximized():
_is_maximized = False
self._parent.showNormal()
change_ui()
else:
_is_maximized = True
_old_size = QSize(self._parent.width(), self._parent.height())
self._parent.showMaximized()
change_ui()
# SETUP APP
# ///////////////////////////////////////////////////////////////
def setup_ui(self):
# ADD MENU LAYOUT
self.title_bar_layout = QVBoxLayout(self)
self.title_bar_layout.setContentsMargins(0,0,0,0)
# ADD BG
self.bg = QFrame()
# ADD BG LAYOUT
self.bg_layout = QHBoxLayout(self.bg)
self.bg_layout.setContentsMargins(10,0,5,0)
self.bg_layout.setSpacing(0)
# DIVS
self.div_1 = PyDiv(self._div_color)
self.div_2 = PyDiv(self._div_color)
self.div_3 = PyDiv(self._div_color)
# LEFT FRAME WITH MOVE APP
self.top_logo = QLabel()
self.top_logo_layout = QVBoxLayout(self.top_logo)
self.top_logo_layout.setContentsMargins(0,0,0,0)
self.logo_svg = QSvgWidget()
self.logo_svg.load(Functions.set_svg_image(self._logo_image))
self.top_logo_layout.addWidget(self.logo_svg, Qt.AlignCenter, Qt.AlignCenter)
# TITLE LABEL
self.title_label = QLabel()
self.title_label.setAlignment(Qt.AlignVCenter)
self.title_label.setStyleSheet(f'font: {self._title_size}pt "{self._font_family}"')
# CUSTOM BUTTONS LAYOUT
self.custom_buttons_layout = QHBoxLayout()
self.custom_buttons_layout.setContentsMargins(0,0,0,0)
self.custom_buttons_layout.setSpacing(3)
# MINIMIZE BUTTON
self.minimize_button = PyTitleButton(
self._parent,
self._app_parent,
tooltip_text = "Close app",
dark_one = self._dark_one,
bg_color = self._btn_bg_color,
bg_color_hover = self._btn_bg_color_hover,
bg_color_pressed = self._btn_bg_color_pressed,
icon_color = self._icon_color,
icon_color_hover = self._icon_color_hover,
icon_color_pressed = self._icon_color_pressed,
icon_color_active = self._icon_color_active,
context_color = self._context_color,
text_foreground = self._text_foreground,
radius = 6,
icon_path = Functions.set_svg_icon("icon_minimize.svg")
)
# MAXIMIZE / RESTORE BUTTON
self.maximize_restore_button = PyTitleButton(
self._parent,
self._app_parent,
tooltip_text = "Maximize app",
dark_one = self._dark_one,
bg_color = self._btn_bg_color,
bg_color_hover = self._btn_bg_color_hover,
bg_color_pressed = self._btn_bg_color_pressed,
icon_color = self._icon_color,
icon_color_hover = self._icon_color_hover,
icon_color_pressed = self._icon_color_pressed,
icon_color_active = self._icon_color_active,
context_color = self._context_color,
text_foreground = self._text_foreground,
radius = 6,
icon_path = Functions.set_svg_icon("icon_maximize.svg")
)
# CLOSE BUTTON
self.close_button = PyTitleButton(
self._parent,
self._app_parent,
tooltip_text = "Close app",
dark_one = self._dark_one,
bg_color = self._btn_bg_color,
bg_color_hover = self._btn_bg_color_hover,
bg_color_pressed = self._context_color,
icon_color = self._icon_color,
icon_color_hover = self._icon_color_hover,
icon_color_pressed = self._icon_color_active,
icon_color_active = self._icon_color_active,
context_color = self._context_color,
text_foreground = self._text_foreground,
radius = 6,
icon_path = Functions.set_svg_icon("icon_close.svg")
)
# ADD TO LAYOUT
self.title_bar_layout.addWidget(self.bg)

@ -1,271 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 QT CORE
# ///////////////////////////////////////////////////////////////
from src.educoder.qt_core import *
# PY TITLE BUTTON
# ///////////////////////////////////////////////////////////////
class PyTitleButton(QPushButton):
def __init__(
self,
parent,
app_parent = None,
tooltip_text = "",
btn_id = None,
width = 30,
height = 30,
radius = 8,
bg_color = "#343b48",
bg_color_hover = "#3c4454",
bg_color_pressed = "#2c313c",
icon_color = "#c3ccdf",
icon_color_hover = "#dce1ec",
icon_color_pressed = "#edf0f5",
icon_color_active = "#f5f6f9",
icon_path = "no_icon.svg",
dark_one = "#1b1e23",
context_color = "#568af2",
text_foreground = "#8a95aa",
is_active = False
):
super().__init__()
# SET DEFAULT PARAMETERS
self.setFixedSize(width, height)
self.setCursor(Qt.PointingHandCursor)
self.setObjectName(btn_id)
# PROPERTIES
self._bg_color = bg_color
self._bg_color_hover = bg_color_hover
self._bg_color_pressed = bg_color_pressed
self._icon_color = icon_color
self._icon_color_hover = icon_color_hover
self._icon_color_pressed = icon_color_pressed
self._icon_color_active = icon_color_active
self._context_color = context_color
self._top_margin = self.height() + 6
self._is_active = is_active
# Set Parameters
self._set_bg_color = bg_color
self._set_icon_path = icon_path
self._set_icon_color = icon_color
self._set_border_radius = radius
# Parent
self._parent = parent
self._app_parent = app_parent
# TOOLTIP
self._tooltip_text = tooltip_text
self._tooltip = _ToolTip(
app_parent,
tooltip_text,
dark_one,
context_color,
text_foreground
)
self._tooltip.hide()
# SET ACTIVE MENU
# ///////////////////////////////////////////////////////////////
def set_active(self, is_active):
self._is_active = is_active
self.repaint()
# RETURN IF IS ACTIVE MENU
# ///////////////////////////////////////////////////////////////
def is_active(self):
return self._is_active
# PAINT EVENT
# painting the button and the icon
# ///////////////////////////////////////////////////////////////
def paintEvent(self, event):
# PAINTER
paint = QPainter()
paint.begin(self)
paint.setRenderHint(QPainter.RenderHint.Antialiasing)
if self._is_active:
# BRUSH
brush = QBrush(QColor(self._context_color))
else:
# BRUSH
brush = QBrush(QColor(self._set_bg_color))
# CREATE RECTANGLE
rect = QRect(0, 0, self.width(), self.height())
paint.setPen(Qt.NoPen)
paint.setBrush(brush)
paint.drawRoundedRect(
rect,
self._set_border_radius,
self._set_border_radius
)
# DRAW ICONS
self.icon_paint(paint, self._set_icon_path, rect)
# END PAINTER
paint.end()
# CHANGE STYLES
# Functions with custom styles
# ///////////////////////////////////////////////////////////////
def change_style(self, event):
if event == QEvent.Enter:
self._set_bg_color = self._bg_color_hover
self._set_icon_color = self._icon_color_hover
self.repaint()
elif event == QEvent.Leave:
self._set_bg_color = self._bg_color
self._set_icon_color = self._icon_color
self.repaint()
elif event == QEvent.MouseButtonPress:
self._set_bg_color = self._bg_color_pressed
self._set_icon_color = self._icon_color_pressed
self.repaint()
elif event == QEvent.MouseButtonRelease:
self._set_bg_color = self._bg_color_hover
self._set_icon_color = self._icon_color_hover
self.repaint()
# 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)
# SET FOCUS
self.setFocus()
# EMIT SIGNAL
return self.clicked.emit()
# 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
return self.released.emit()
# DRAW ICON WITH COLORS
# ///////////////////////////////////////////////////////////////
def icon_paint(self, qp, image, rect):
icon = QPixmap(image)
painter = QPainter(icon)
painter.setCompositionMode(QPainter.CompositionMode_SourceIn)
if self._is_active:
painter.fillRect(icon.rect(), self._icon_color_active)
else:
painter.fillRect(icon.rect(), self._set_icon_color)
qp.drawPixmap(
(rect.width() - icon.width()) / 2,
(rect.height() - icon.height()) / 2,
icon
)
painter.end()
# SET ICON
# ///////////////////////////////////////////////////////////////
def set_icon(self, icon_path):
self._set_icon_path = icon_path
self.repaint()
# 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._tooltip.width()) + self.width() + 5
pos_y = pos.y() + self._top_margin
# SET POSITION TO WIDGET
# Move tooltip position
self._tooltip.move(pos_x, pos_y)
# TOOLTIP
# ///////////////////////////////////////////////////////////////
class _ToolTip(QLabel):
# TOOLTIP / LABEL StyleSheet
style_tooltip = """
QLabel {{
background-color: {_dark_one};
color: {_text_foreground};
padding-left: 10px;
padding-right: 10px;
border-radius: 17px;
border: 0px solid transparent;
border-right: 3px solid {_context_color};
font: 800 9pt "Segoe UI";
}}
"""
def __init__(
self,
parent,
tooltip,
dark_one,
context_color,
text_foreground
):
QLabel.__init__(self)
# LABEL SETUP
style = self.style_tooltip.format(
_dark_one = dark_one,
_context_color = context_color,
_text_foreground = text_foreground
)
self.setObjectName(u"label_tooltip")
self.setStyleSheet(style)
self.setMinimumHeight(34)
self.setParent(parent)
self.setText(tooltip)
self.adjustSize()
# SET DROP SHADOW
self.shadow = QGraphicsDropShadowEffect(self)
self.shadow.setBlurRadius(30)
self.shadow.setXOffset(0)
self.shadow.setYOffset(0)
self.shadow.setColor(QColor(0, 0, 0, 80))
self.setGraphicsEffect(self.shadow)

@ -1,19 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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
#
# ///////////////////////////////////////////////////////////////
# PY PUSH BUTTON
# ///////////////////////////////////////////////////////////////
from . py_toggle import PyToggle

@ -1,88 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 QT CORE
# ///////////////////////////////////////////////////////////////
from src.educoder.qt_core import *
class PyToggle(QCheckBox):
def __init__(
self,
width = 50,
bg_color = "#777",
circle_color = "#DDD",
active_color = "#00BCFF",
animation_curve = QEasingCurve.OutBounce
):
QCheckBox.__init__(self)
self.setFixedSize(width, 28)
self.setCursor(Qt.PointingHandCursor)
# COLORS
self._bg_color = bg_color
self._circle_color = circle_color
self._active_color = active_color
self._position = 3
self.animation = QPropertyAnimation(self, b"position")
self.animation.setEasingCurve(animation_curve)
self.animation.setDuration(500)
self.stateChanged.connect(self.setup_animation)
@Property(float)
def position(self):
return self._position
@position.setter
def position(self, pos):
self._position = pos
self.update()
# START STOP ANIMATION
def setup_animation(self, value):
self.animation.stop()
if value:
self.animation.setEndValue(self.width() - 26)
else:
self.animation.setEndValue(4)
self.animation.start()
def hitButton(self, pos: QPoint):
return self.contentsRect().contains(pos)
def paintEvent(self, e):
p = QPainter(self)
p.setRenderHint(QPainter.Antialiasing)
p.setFont(QFont("Segoe UI", 9))
# SET PEN
p.setPen(Qt.NoPen)
# DRAW RECT
rect = QRect(0, 0, self.width(), self.height())
if not self.isChecked():
p.setBrush(QColor(self._bg_color))
p.drawRoundedRect(0,0,rect.width(), 28, 14, 14)
p.setBrush(QColor(self._circle_color))
p.drawEllipse(self._position, 3, 22, 22)
else:
p.setBrush(QColor(self._active_color))
p.drawRoundedRect(0,0,rect.width(), 28, 14, 14)
p.setBrush(QColor(self._circle_color))
p.drawEllipse(self._position, 3, 22, 22)
p.end()

@ -1,19 +0,0 @@
# ///////////////////////////////////////////////////////////////
#
# 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 WIDGETS
# ///////////////////////////////////////////////////////////////
from . py_window import PyWindow

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save