[ui] feature: themes

This commit is contained in:
Vinicius Moreira
2020-11-27 15:52:57 -03:00
parent 813c812030
commit 60228eec97
176 changed files with 11941 additions and 2985 deletions

View File

@@ -5,11 +5,51 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## [0.9.9]
### Features
- Themes (stylesheets)
- new settings property "theme": it points to a file defining a set of customizations over the current style (QT). In other words, a stylesheet file. At the moment 3 will come bundled with bauh:
- [Light](https://raw.githubusercontent.com/vinifmor/bauh-files/master/pictures/releases/0.9.9/light.png): default light theme
- [Darcula](https://raw.githubusercontent.com/vinifmor/bauh-files/master/pictures/releases/0.9.9/darcula.png): dark based on JetBrain's Darcula theme
- [Sublime](https://raw.githubusercontent.com/vinifmor/bauh-files/master/pictures/releases/0.9.9/sublime.png): dark based on Sublime Text's editor theme
- the theme can be changed through the new lower bar button:
<p align="center">
<img src="https://raw.githubusercontent.com/vinifmor/bauh-files/master/pictures/releases/0.9.9/bt_themes.png">
</p>
- you can provide custom themes by putting the required files at **~/.local/share/bauh/themes**. There are 2 required and 1 optional file for each theme (all files related to a theme must share the same name):
- **my_theme.qss**: file with the qss rules. Example: [light.qss](https://raw.githubusercontent.com/vinifmor/bauh/qss/bauh/view/resources/style/light/light.qss)
- **my_theme.meta**: file defining the data about the theme (display name, description, version, ...). Example: [light.meta](https://raw.githubusercontent.com/vinifmor/bauh/qss/bauh/view/resources/style/light/light.meta)
- **my_theme.vars**: optional file defining `key=value` variables that will be available for the .qss file through the symbol '@' (e.g: @my_var). Example: [light.vars](https://raw.githubusercontent.com/vinifmor/bauh/qss/bauh/view/resources/style/light/light.vars)
- common theme variables available:
- **style_dir**: path to the .qss file directory. Example: @style_dir/my_icon.svg
- **images**: path to bauh's icons (gem icons are not available through this variable). Example: @images/logo.svg
### Improvements
- UI
- root dialog design and behavior
- tooltip for the label displaying the number of applications on the table/available [#138](https://github.com/vinifmor/bauh/issues/138)
- screenshots dialog resizing behavior
- "name filter" now requires ENTER or click to be triggered
- some app actions icons are now displayed with a different picture when disabled to prevent confusion (e.g: launch, screenshots) [#138](https://github.com/vinifmor/bauh/issues/138)
- suggestions button moved to the lower bar (label removed)
<p align="center">
<img src="https://raw.githubusercontent.com/vinifmor/bauh-files/master/pictures/releases/0.9.9/suggestions.png">
</p>
- Settings
- new property **system_theme** (UI -> System theme): merges the system's theme/stylesheet with bauh's (default: false)
- property **style** renamed to **qt_style** and its default value now is **fusion**. If this property is set to **null**, **fusion** will be considered as well. Fusion is the default style that all default themes (stylesheets) are based on, so if you change this property the final style may not look like as expected.
- **Applications displayed** property (Interface) tooltip now informs that 0 (zero) can be used for no limit [#138](https://github.com/vinifmor/bauh/issues/138)
- Parameters
- new parameter **--offline**: it assumes the internet connection is off. Useful if the connection is bad/unstable and you just want to check your installed packages.
### Fixes
- Arch:
- search: not able to find installed packages that were renamed on the repositories (e.g: xapps -> xapp)
- not able to replace an installed package for a new one that replaces it during conflict resolutions (e.g: xapp replaces xapps)
- AUR: not able to find some repository dependencies when their names are not an exact match (e.g: sc-controller [0.4.7-1] relies on "pylibacl". This dependency now is called "python-pylibacl")
- UI
- wrong tooltips
### i18n
- French translations by [KINFOO](https://github.com/KINFOO): [#143](https://github.com/vinifmor/bauh/pull/143)

View File

@@ -275,6 +275,7 @@ You can change some application settings via environment variables or arguments
- `--settings`: it displays only the settings window.
- `--reset`: it cleans all configurations and cached data stored in the HOME directory.
- `--logs`: it enables logs (for debugging purposes).
- `--offline`: it assumes the internet connection is off.
#### General configuration file (**~/.config/bauh/config.yml**)
```
@@ -295,15 +296,17 @@ system:
notifications: true # if system popup should be displayed for some events. e.g: when there are updates, bauh will display a system popup
single_dependency_checking: false # if bauh should check only once if for the available technologies on the system.
ui:
style: null # the current QT style set. A null value will map to 'Fusion', 'Breeze' or 'Oxygen' (depending on what is installed)
qt_style: fusion # defines the Qt style. A null value will map to 'fusion' as well.
table:
max_displayed: 50 # defines the maximum number of displayed applications on the table.
max_displayed: 50 # defines the maximum number of displayed applications on the table. Use 0 for no limit.
tray: # system tray settings
default_icon: null # defines a path to a custom icon
updates_icon: null # defines a path to a custom icon indicating updates
hdpi: true # enables HDPI rendering improvements. Use 'false' to disable them if you think the interface looks strange
auto_scale: false # activates Qt auto screen scale factor (QT_AUTO_SCREEN_SCALE_FACTOR). It fixes scaling issues for some desktop environments (like Gnome)
scale_factor: 1.0 # defines the interface display scaling factor (Qt). Raise the value to raise the interface size. The settings window display this value as a percentage (e.g: 1.0 -> 100%).
theme: defines the path to the theme/stylesheet file with a .qss extension (e.g: /path/to/my/theme.qss). For themes provided by bauh, only a string key is needed (e.g: light). Default: light
system_theme: merges the system's theme/stylesheet with bauh's. Default: false.
updates:
check_interval: 30 # the updates checking interval in SECONDS
ask_for_reboot: true # if a dialog asking for a system reboot should be displayed after a successful upgrade

View File

@@ -3,4 +3,4 @@ __app_name__ = 'bauh'
import os
ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
LOGS_PATH = '/tmp/{}/logs'.format(__app_name__)
LOGS_PATH = '/tmp/{}/logs'.format(__app_name__)

View File

@@ -5,6 +5,7 @@ from bauh.api.abstract.cache import MemoryCacheFactory
from bauh.api.abstract.disk import DiskCacheLoaderFactory
from bauh.api.abstract.download import FileDownloader
from bauh.api.http import HttpClient
from bauh.commons.internet import InternetChecker
from bauh.view.util.translation import I18n
@@ -12,7 +13,8 @@ class ApplicationContext:
def __init__(self, download_icons: bool, http_client: HttpClient, app_root_dir: str, i18n: I18n,
cache_factory: MemoryCacheFactory, disk_loader_factory: DiskCacheLoaderFactory,
logger: logging.Logger, file_downloader: FileDownloader, distro: str, app_name: str):
logger: logging.Logger, file_downloader: FileDownloader, distro: str, app_name: str,
internet_checker: InternetChecker):
"""
:param download_icons: if packages icons should be downloaded
:param http_client: a shared instance of http client
@@ -24,7 +26,7 @@ class ApplicationContext:
:param file_downloader
:param distro
:param app_name
:param root_password
:param internet_checker
"""
self.download_icons = download_icons
self.http_client = http_client
@@ -40,9 +42,13 @@ class ApplicationContext:
'Graphics', 'Network', 'Office', 'Science', 'Settings', 'System', 'Utility')
self.app_name = app_name
self.root_password = None
self.internet_checker = internet_checker
def is_system_x86_64(self):
return self.arch_x86_64
def get_view_path(self):
return self.app_root_dir + '/view'
def is_internet_available(self) -> bool:
return self.internet_checker.is_available()

View File

@@ -52,7 +52,7 @@ class UpgradeRequirement:
class UpgradeRequirements:
def __init__(self, to_install: List[UpgradeRequirement], to_remove: List[UpgradeRequirement],
def __init__(self, to_install: Optional[List[UpgradeRequirement]], to_remove: Optional[List[UpgradeRequirement]],
to_upgrade: List[UpgradeRequirement], cannot_upgrade: List[UpgradeRequirement]):
"""
:param to_install: additional packages that must be installed with the upgrade
@@ -264,7 +264,7 @@ class SoftwareManager(ABC):
f.write(icon_bytes)
@abstractmethod
def requires_root(self, action: str, pkg: SoftwarePackage):
def requires_root(self, action: str, pkg: Optional[SoftwarePackage]):
"""
if a given action requires root privileges to be executed. Current actions are: 'install', 'uninstall', 'downgrade', 'search', 'refresh', 'prepare'
:param action:
@@ -274,11 +274,12 @@ class SoftwareManager(ABC):
pass
@abstractmethod
def prepare(self, task_manager: TaskManager, root_password: str, internet_available: bool):
def prepare(self, task_manager: Optional[TaskManager], root_password: Optional[str], internet_available: Optional[bool]):
"""
It prepares the manager to start working. It will be called by GUI. Do not call it within.
:param task_manager: a task manager instance used to register ongoing tasks during prepare
:param root_password
:param internet_available: if there is internet connection available
:return:
"""
pass

View File

@@ -77,10 +77,10 @@ class ProcessWatcher:
:return: if the use requested to stop the process.
"""
def request_root_password(self) -> Tuple[str, bool]:
def request_root_password(self) -> Tuple[bool, str]:
"""
asks the root password for the user
:return: a tuple with the typed password and if it is valid
:return: a tuple informing if the password is valid and its text
"""

View File

@@ -3,7 +3,7 @@ from enum import Enum
from typing import List, Set, Optional
class MessageType:
class MessageType(Enum):
INFO = 0
WARNING = 1
ERROR = 2
@@ -19,7 +19,7 @@ class ViewComponent(ABC):
"""
Represents a GUI component
"""
def __init__(self, id_: str, observers: List[ViewObserver] = None):
def __init__(self, id_: Optional[str], observers: Optional[List[ViewObserver]] = None):
self.id = id_
self.observers = observers if observers else []
@@ -56,12 +56,15 @@ class InputOption:
Represents a select component option.
"""
def __init__(self, label: str, value: object, tooltip: str = None, icon_path: str = None, read_only: bool = False, id_: str = None):
def __init__(self, label: str, value: object, tooltip: Optional[str] = None,
icon_path: Optional[str] = None, read_only: bool = False, id_: Optional[str] = None,
invalid: bool = False):
"""
:param label: the string that will be shown to the user
:param value: the option value (not shown)
:param tooltip: an optional tooltip
:param icon_path: an optional icon path
:param invalid: if this option is considered invalid
"""
if not label:
raise Exception("'label' must be a not blank string")
@@ -72,6 +75,7 @@ class InputOption:
self.tooltip = tooltip
self.icon_path = icon_path
self.read_only = read_only
self.invalid = invalid
def __hash__(self):
return hash(self.label) + hash(self.value)
@@ -155,9 +159,10 @@ class TextInputType(Enum):
class TextInputComponent(ViewComponent):
def __init__(self, label: str, value: str = '', placeholder: str = None, tooltip: str = None, read_only: bool =False,
id_: str = None, only_int: bool = False, max_width: int = -1, type_: TextInputType = TextInputType.SINGLE_LINE,
capitalize_label: bool = True, min_width: int = -1, min_height: int = -1):
def __init__(self, label: str, value: str = '', placeholder: Optional[str] = None, tooltip: Optional[str] = None,
read_only: bool = False, id_: Optional[str] = None, only_int: bool = False, max_width: int = -1,
type_: TextInputType = TextInputType.SINGLE_LINE, capitalize_label: bool = True, min_width: int = -1,
min_height: int = -1):
super(TextInputComponent, self).__init__(id_=id_)
self.label = label
self.value = value
@@ -216,9 +221,9 @@ class FormComponent(ViewComponent):
class FileChooserComponent(ViewComponent):
def __init__(self, allowed_extensions: Set[str] = None, label: str = None, tooltip: str = None,
file_path: str = None, max_width: int = -1, id_: str = None, search_path: str = None, capitalize_label: bool = True,
directory: bool = False):
def __init__(self, allowed_extensions: Optional[Set[str]] = None, label: Optional[str] = None, tooltip: Optional[str] = None,
file_path: Optional[str] = None, max_width: int = -1, id_: Optional[str] = None,
search_path: Optional[str] = None, capitalize_label: bool = True, directory: bool = False):
super(FileChooserComponent, self).__init__(id_=id_)
self.label = label
self.allowed_extensions = allowed_extensions
@@ -229,7 +234,7 @@ class FileChooserComponent(ViewComponent):
self.capitalize_label = capitalize_label
self.directory = directory
def set_file_path(self, fpath: str):
def set_file_path(self, fpath: Optional[str]):
self.file_path = fpath
if self.observers:

View File

@@ -3,5 +3,6 @@ from pathlib import Path
CACHE_PATH = '{}/.cache/bauh'.format(str(Path.home()))
CONFIG_PATH = '{}/.config/bauh'.format(str(Path.home()))
USER_THEMES_PATH = '{}/.local/share/bauh/themes'.format(str(Path.home()))
DESKTOP_ENTRIES_DIR = '{}/.local/share/applications'.format(str(Path.home()))
TEMP_DIR = '/tmp/bauh{}'.format('_root' if os.getuid() == 0 else '')

View File

@@ -22,6 +22,9 @@ def main(tray: bool = False):
logger = logs.new_logger(__app_name__, bool(args.logs))
if args.offline:
logger.warning("offline mode activated")
app_config = config.read_config(update_file=True)
if bool(app_config['ui']['auto_scale']):

View File

@@ -8,6 +8,7 @@ def read() -> Namespace:
parser = argparse.ArgumentParser(prog=__app_name__, description="GUI for Linux software management")
parser.add_argument('-v', '--version', action='version', version='%(prog)s {}'.format(__version__))
parser.add_argument('--logs', action="store_true", help='It activates {} logs.'.format(__app_name__))
parser.add_argument('--offline', action="store_true", help='It assumes the internet connection is off')
exclusive_args = parser.add_mutually_exclusive_group()
exclusive_args.add_argument('--tray', action="store_true", help='If {} should be attached to the system tray.'.format(__app_name__))

View File

@@ -7,6 +7,7 @@ from bauh.api.abstract.context import ApplicationContext
from bauh.api.http import HttpClient
from bauh.cli import __app_name__, cli_args
from bauh.cli.controller import CLIManager
from bauh.commons.internet import InternetChecker
from bauh.context import generate_i18n, DEFAULT_I18N_KEY
from bauh.view.core import config, gems
from bauh.view.core.controller import GenericSoftwareManager
@@ -42,7 +43,8 @@ def main():
distro=util.get_distro(),
file_downloader=AdaptableFileDownloader(logger, bool(app_config['download']['multithreaded']),
i18n, http_client, app_config['download']['multithreaded_client']),
app_name=__app_name__)
app_name=__app_name__,
internet_checker=InternetChecker(offline=False))
managers = gems.load_managers(context=context, locale=i18n.current_key, config=app_config, default_locale=DEFAULT_I18N_KEY)

View File

@@ -1,12 +1,20 @@
import http.client as http_client
def is_available() -> bool:
conn = http_client.HTTPConnection("www.google.com", timeout=5)
try:
conn.request("HEAD", "/")
conn.close()
return True
except:
conn.close()
return False
class InternetChecker:
def __init__(self, offline: bool):
self.offline = offline
def is_available(self) -> bool:
if self.offline:
return False
conn = http_client.HTTPConnection("www.google.com", timeout=5)
try:
conn.request("HEAD", "/")
conn.close()
return True
except:
conn.close()
return False

View File

@@ -1,27 +1,39 @@
import os
import sys
from logging import Logger
from typing import Tuple
from PyQt5.QtCore import QCoreApplication
from PyQt5.QtWidgets import QApplication
from bauh import __app_name__, __version__
from bauh.stylesheet import process_theme, read_default_themes, read_user_themes, read_theme_metada
from bauh.view.util import util, translation
from bauh.view.util.translation import I18n
DEFAULT_I18N_KEY = 'en'
PROPERTY_HARDCODED_STYLESHEET = 'hcqss'
def new_qt_application(app_config: dict, quit_on_last_closed: bool = False, name: str = None) -> QApplication:
def new_qt_application(app_config: dict, logger: Logger, quit_on_last_closed: bool = False, name: str = None) -> QApplication:
app = QApplication(sys.argv)
app.setQuitOnLastWindowClosed(quit_on_last_closed) # otherwise windows opened through the tray icon kill the application when closed
app.setApplicationName(name if name else __app_name__)
app.setApplicationVersion(__version__)
app.setWindowIcon(util.get_default_icon()[1])
if app_config['ui']['style']:
app.setStyle(str(app_config['ui']['style']))
if app_config['ui']['qt_style']:
app.setStyle(str(app_config['ui']['qt_style']))
else:
if app.style().objectName().lower() not in {'fusion', 'breeze', 'oxygen'}:
app.setStyle('Fusion')
app.setStyle('fusion')
app.setProperty('qt_style', app.style().objectName().lower())
theme_key = app_config['ui']['theme'].strip() if app_config['ui']['theme'] else None
set_theme(theme_key=theme_key, app=app, logger=logger)
if not app_config['ui']['system_theme']:
app.setPalette(app.style().standardPalette())
return app
@@ -44,3 +56,49 @@ def update_i18n(app_config, locale_dir: str, i18n: I18n) -> I18n:
i18n.default.update(def_dict)
return i18n
def set_theme(theme_key: str, app: QCoreApplication, logger: Logger):
if not theme_key:
logger.warning("config: no theme defined")
else:
available_themes = {}
default_themes = read_default_themes()
available_themes.update(default_themes)
theme_file = None
if '/' in theme_key:
if os.path.isfile(theme_key):
user_sheets = read_user_themes()
if user_sheets:
available_themes.update(user_sheets)
if theme_key in user_sheets:
theme_file = theme_key
else:
theme_file = default_themes.get(theme_key)
if theme_file:
with open(theme_file) as f:
theme_str = f.read()
if not theme_str:
logger.warning("theme file '{}' has no content".format(theme_file))
else:
base_metadata = read_theme_metada(key=theme_key, file_path=theme_file)
if base_metadata.abstract:
logger.warning("theme file '{}' is abstract (abstract = true) and cannot be loaded".format(theme_file))
else:
processed = process_theme(file_path=theme_file,
metadata=base_metadata,
theme_str=theme_str,
available_themes=available_themes)
if processed:
app.setStyleSheet(processed[0])
logger.info("theme file '{}' loaded".format(theme_file))
else:
logger.warning("theme file '{}' could not be interpreted and processed".format(theme_file))

View File

@@ -590,7 +590,8 @@ class AppImageManager(SoftwareManager):
updater = DatabaseUpdater(task_man=task_manager,
i18n=self.context.i18n,
http_client=self.context.http_client, logger=self.context.logger,
db_locks=self.db_locks, interval=interval)
db_locks=self.db_locks, interval=interval,
internet_checker=self.context.internet_checker)
if local_config['db_updater']['enabled']:
updater.start()
elif internet_available:

31
bauh/gems/appimage/resources/img/upgrade.svg Normal file → Executable file
View File

@@ -8,13 +8,13 @@
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
viewBox="0 0 47.810421 48"
viewBox="0 0 512 512"
enable-background="new 0 0 26 26"
id="svg8"
sodipodi:docname="upgrade.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
width="47.810421"
height="48">
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
width="512"
height="512">
<metadata
id="metadata14">
<rdf:RDF>
@@ -42,10 +42,10 @@
inkscape:window-height="739"
id="namedview10"
showgrid="false"
showborder="false"
inkscape:zoom="3.2091769"
inkscape:cx="-13.285588"
inkscape:cy="-0.030460959"
showborder="true"
inkscape:zoom="0.80229424"
inkscape:cx="65.887412"
inkscape:cy="257.44157"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
@@ -53,24 +53,21 @@
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
fit-margin-bottom="0"
inkscape:document-rotation="0" />
<g
id="g6"
transform="matrix(1.7476186,0,0,1.8929335,1.1861681,-0.60813528)"
style="fill:none;fill-opacity:1;stroke:#91a069;stroke-width:1.35746789;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
transform="matrix(19.334486,0,0,20.945696,4.651682,-16.294048)"
style="fill:#59a869;fill-opacity:1;stroke:none;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none">
<path
d="m 25,17 h -2 c -0.6,0 -1,0.4 -1,1 v 2.5 C 22,20.8 21.8,21 21.5,21 H 4.5 C 4.2,21 4,20.8 4,20.5 V 18 C 4,17.4 3.6,17 3,17 H 1 c -0.6,0 -1,0.4 -1,1 v 6 c 0,0.6 0.4,1 1,1 h 24 c 0.6,0 1,-0.4 1,-1 v -6 c 0,-0.6 -0.4,-1 -1,-1 z"
id="path2"
inkscape:connector-curvature="0"
style="fill:none;fill-opacity:1;stroke:#91a069;stroke-width:1.35746789;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:#59a869;fill-opacity:1;stroke:none;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none" />
<path
d="m 12.3,16.7 c 0.2,0.2 0.5,0.3 0.7,0.3 0.2,0 0.5,-0.1 0.7,-0.3 l 6,-6 C 19.9,10.5 20,10.3 20,10 20,9.7 19.9,9.5 19.7,9.3 L 18.3,7.9 C 18.1,7.7 17.9,7.6 17.6,7.6 c -0.3,0 -0.5,0.1 -0.7,0.3 l -1,1 C 15.6,9.2 15,9 15,8.5 V 2 C 15,1.4 14.6,1 14,1 H 12 C 11.4,1 11,1.4 11,2 V 8.6 C 11,9 10.5,9.3 10.1,9 L 9.1,8 C 8.9,7.8 8.7,7.7 8.4,7.7 8.1,7.7 7.9,7.8 7.7,8 L 6.3,9.4 C 6.1,9.6 6,9.8 6,10.1 c 0,0.3 0.1,0.5 0.3,0.7 z"
id="path4"
inkscape:connector-curvature="0"
style="fill:none;fill-opacity:1;stroke:#91a069;stroke-width:1.35746789;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:#59a869;fill-opacity:1;stroke:none;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none" />
</g>
<g
transform="matrix(3.7795276,0,0,3.7795276,669.63626,-482.15866)"
id="layer1"
inkscape:label="Layer 1" />
</svg>

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -12,7 +12,7 @@ import requests
from bauh.api.abstract.handler import TaskManager, ProcessWatcher
from bauh.api.http import HttpClient
from bauh.commons import internet
from bauh.commons.internet import InternetChecker
from bauh.gems.appimage import LOCAL_PATH, get_icon_path, INSTALLATION_PATH, SYMLINKS_DIR, util
from bauh.gems.appimage.model import AppImage
from bauh.view.util.translation import I18n
@@ -22,7 +22,9 @@ class DatabaseUpdater(Thread):
URL_DB = 'https://raw.githubusercontent.com/vinifmor/bauh-files/master/appimage/dbs.tar.gz'
COMPRESS_FILE_PATH = LOCAL_PATH + '/db.tar.gz'
def __init__(self, task_man: TaskManager, i18n: I18n, http_client: HttpClient, logger: logging.Logger, db_locks: dict, interval: int):
def __init__(self, task_man: TaskManager, i18n: I18n, http_client: HttpClient,
logger: logging.Logger, db_locks: dict, interval: int,
internet_checker: InternetChecker):
super(DatabaseUpdater, self).__init__(daemon=True)
self.http_client = http_client
self.logger = logger
@@ -31,6 +33,7 @@ class DatabaseUpdater(Thread):
self.i18n = i18n
self.task_man = task_man
self.task_id = 'appim_db'
self.internet_checker = internet_checker
def _finish_task(self):
if self.task_man:
@@ -44,7 +47,7 @@ class DatabaseUpdater(Thread):
self.task_man.update_progress(self.task_id, 10, None)
try:
if not internet.is_available():
if not self.internet_checker.is_available():
self._finish_task()
return
except requests.exceptions.ConnectionError:

View File

@@ -25,7 +25,7 @@ from bauh.api.abstract.view import MessageType, FormComponent, InputOption, Sing
ViewComponent, PanelComponent, MultipleSelectComponent, TextInputComponent, TextInputType, \
FileChooserComponent, TextComponent
from bauh.api.constants import TEMP_DIR
from bauh.commons import user, internet, system
from bauh.commons import user, system
from bauh.commons.category import CategoriesDownloader
from bauh.commons.config import save_config
from bauh.commons.html import bold
@@ -1175,7 +1175,7 @@ class ArchManager(SoftwareManager):
def _uninstall(self, context: TransactionContext, names: Set[str], remove_unneeded: bool = False, disk_loader: Optional[DiskCacheLoader] = None, skip_requirements: bool = False):
self._update_progress(context, 10)
net_available = internet.is_available() if disk_loader else True
net_available = self.context.internet_checker.is_available() if disk_loader else True
hard_requirements = set()
@@ -2830,7 +2830,8 @@ class ArchManager(SoftwareManager):
def upgrade_system(self, root_password: str, watcher: ProcessWatcher) -> bool:
# repo_map = pacman.map_repositories()
installed = self.read_installed(limit=-1, only_apps=False, pkg_types=None, internet_available=internet.is_available(), disk_loader=None).installed
net_available = self.context.internet_checker.is_available()
installed = self.read_installed(limit=-1, only_apps=False, pkg_types=None, internet_available=net_available, disk_loader=None).installed
if not installed:
watcher.show_message(title=self.i18n['arch.custom_action.upgrade_system'],
@@ -3077,7 +3078,7 @@ class ArchManager(SoftwareManager):
confirmation_label=self.i18n['proceed'].capitalize(),
deny_label=self.i18n['cancel'].capitalize()):
pwd, valid_pwd = watcher.request_root_password()
valid_pwd, pwd = watcher.request_root_password()
if valid_pwd:
handler = ProcessHandler(watcher)

View File

@@ -7,12 +7,12 @@
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"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
height="23.999998"
width="24.000002"
sodipodi:docname="edit_pkgbuild.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
height="512"
width="512"
sodipodi:docname="mark_pkgbuild.svg"
xml:space="preserve"
viewBox="0 0 24.000003 23.999999"
viewBox="0 0 512.00002 512.00002"
y="0px"
x="0px"
id="Capa_1"
@@ -25,9 +25,9 @@
inkscape:window-maximized="1"
inkscape:window-y="0"
inkscape:window-x="0"
inkscape:cy="-9.5853392"
inkscape:cx="75.093443"
inkscape:zoom="3.2847783"
inkscape:cy="176.38591"
inkscape:cx="96.230087"
inkscape:zoom="0.58067225"
fit-margin-bottom="0"
fit-margin-right="0"
fit-margin-left="0"
@@ -43,17 +43,18 @@
objecttolerance="10"
borderopacity="1"
bordercolor="#666666"
pagecolor="#ffffff" />
pagecolor="#ffffff"
inkscape:document-rotation="0" />
<g
style="fill:#91a069;fill-opacity:1;stroke-width:1.00086;stroke-miterlimit:4;stroke-dasharray:none"
transform="matrix(0.06909101,0,0,0.06879136,-0.05230155,-1.8775432e-7)"
style="fill:#59a869;fill-opacity:1;stroke-width:1.00086;stroke-miterlimit:4;stroke-dasharray:none"
transform="matrix(1.4532091,0,0,1.4469064,2.5008013,3.6009241)"
id="g1157">
<path
style="fill:#91a069;fill-opacity:1;stroke-width:1.00086;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#59a869;fill-opacity:1;stroke-width:1.00086;stroke-miterlimit:4;stroke-dasharray:none"
id="path1153"
d="m 333.988,11.758 -0.42,-0.383 C 325.538,4.04 315.129,0 304.258,0 292.071,0 280.37,5.159 272.154,14.153 L 116.803,184.231 c -1.416,1.55 -2.49,3.379 -3.154,5.37 l -18.267,54.762 c -2.112,6.331 -1.052,13.333 2.835,18.729 3.918,5.438 10.23,8.685 16.886,8.685 0,0 0.001,0 0.001,0 2.879,0 5.693,-0.592 8.362,-1.76 l 52.89,-23.138 c 1.923,-0.841 3.648,-2.076 5.063,-3.626 L 336.771,73.176 C 352.937,55.479 351.69,27.929 333.988,11.758 Z m -203.607,222.489 10.719,-32.134 0.904,-0.99 20.316,18.556 -0.904,0.99 z M 314.621,52.943 182.553,197.53 162.237,178.974 294.305,34.386 c 2.583,-2.828 6.118,-4.386 9.954,-4.386 3.365,0 6.588,1.252 9.082,3.53 l 0.419,0.383 c 5.484,5.009 5.87,13.546 0.861,19.03 z" />
<path
style="fill:#91a069;fill-opacity:1;stroke-width:1.00086;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#59a869;fill-opacity:1;stroke-width:1.00086;stroke-miterlimit:4;stroke-dasharray:none"
id="path1155"
d="m 303.85,138.388 c -8.284,0 -15,6.716 -15,15 v 127.347 c 0,21.034 -17.113,38.147 -38.147,38.147 H 68.904 c -21.035,0 -38.147,-17.113 -38.147,-38.147 V 100.413 c 0,-21.034 17.113,-38.147 38.147,-38.147 h 131.587 c 8.284,0 15,-6.716 15,-15 0,-8.284 -6.716,-15 -15,-15 H 68.904 c -37.577,0 -68.147,30.571 -68.147,68.147 v 180.321 c 0,37.576 30.571,68.147 68.147,68.147 h 181.798 c 37.576,0 68.147,-30.571 68.147,-68.147 V 153.388 c 0.001,-8.284 -6.715,-15 -14.999,-15 z" />
</g>

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -11,16 +11,19 @@
id="Capa_1"
x="0px"
y="0px"
viewBox="0 0 24.000003 23.999999"
viewBox="0 0 512.00002 512.00002"
xml:space="preserve"
sodipodi:docname="unmark_pkgbuild.svg"
width="24.000002"
height="23.999998"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"><metadata
width="512"
height="512"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"><metadata
id="metadata1194"><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><defs
id="defs1192" /><sodipodi:namedview
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs1192">
</defs><sodipodi:namedview
inkscape:document-rotation="0"
pagecolor="#ffffff"
bordercolor="#666666"
@@ -38,26 +41,14 @@
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="3.2847783"
inkscape:cx="75.093443"
inkscape:cy="-9.5853392"
inkscape:zoom="0.58067225"
inkscape:cx="203.118"
inkscape:cy="164.43767"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1" />
<g
id="g1157"
transform="matrix(0.06909101,0,0,0.06879136,-0.05230155,-1.8775432e-7)"
style="fill:#91a069;fill-opacity:1;stroke-width:1.00086;stroke-miterlimit:4;stroke-dasharray:none">
<path
d="m 333.988,11.758 -0.42,-0.383 C 325.538,4.04 315.129,0 304.258,0 292.071,0 280.37,5.159 272.154,14.153 L 116.803,184.231 c -1.416,1.55 -2.49,3.379 -3.154,5.37 l -18.267,54.762 c -2.112,6.331 -1.052,13.333 2.835,18.729 3.918,5.438 10.23,8.685 16.886,8.685 0,0 0.001,0 0.001,0 2.879,0 5.693,-0.592 8.362,-1.76 l 52.89,-23.138 c 1.923,-0.841 3.648,-2.076 5.063,-3.626 L 336.771,73.176 C 352.937,55.479 351.69,27.929 333.988,11.758 Z m -203.607,222.489 10.719,-32.134 0.904,-0.99 20.316,18.556 -0.904,0.99 z M 314.621,52.943 182.553,197.53 162.237,178.974 294.305,34.386 c 2.583,-2.828 6.118,-4.386 9.954,-4.386 3.365,0 6.588,1.252 9.082,3.53 l 0.419,0.383 c 5.484,5.009 5.87,13.546 0.861,19.03 z"
id="path1153"
style="fill:#91a069;fill-opacity:1;stroke-width:1.00086;stroke-miterlimit:4;stroke-dasharray:none" />
<path
d="m 303.85,138.388 c -8.284,0 -15,6.716 -15,15 v 127.347 c 0,21.034 -17.113,38.147 -38.147,38.147 H 68.904 c -21.035,0 -38.147,-17.113 -38.147,-38.147 V 100.413 c 0,-21.034 17.113,-38.147 38.147,-38.147 h 131.587 c 8.284,0 15,-6.716 15,-15 0,-8.284 -6.716,-15 -15,-15 H 68.904 c -37.577,0 -68.147,30.571 -68.147,68.147 v 180.321 c 0,37.576 30.571,68.147 68.147,68.147 h 181.798 c 37.576,0 68.147,-30.571 68.147,-68.147 V 153.388 c 0.001,-8.284 -6.715,-15 -14.999,-15 z"
id="path1155"
style="fill:#91a069;fill-opacity:1;stroke-width:1.00086;stroke-miterlimit:4;stroke-dasharray:none" />
</g>
<g
id="g1159"
transform="translate(-0.757)">
@@ -119,11 +110,13 @@
transform="translate(-0.757)">
</g>
<g
transform="matrix(-0.05511385,0,0,0.05511385,23.757631,0.24239608)"
style="fill:#ff0000"
id="g940"><g
style="fill:#ff0000"
id="g938"><path
style="fill:#ff0000"
id="path936"
d="M 213.333,0 C 95.467,0 0,95.467 0,213.333 0,331.199 95.467,426.666 213.333,426.666 331.199,426.666 426.667,331.2 426.667,213.333 426.667,95.466 331.2,0 213.333,0 Z M 42.667,213.333 c 0,-94.293 76.373,-170.667 170.667,-170.667 39.467,0 75.627,13.547 104.533,35.947 L 78.613,317.867 C 56.213,288.96 42.667,252.8 42.667,213.333 Z M 213.333,384 C 173.866,384 137.706,370.453 108.8,348.053 L 348.053,108.8 C 370.453,137.707 384,173.867 384,213.333 384,307.627 307.627,384 213.333,384 Z" /></g></g></svg>
id="g13014"><path
d="M 488.31349,20.148378 487.7019,19.593117 C 476.0096,8.9590807 460.85324,3.1020243 445.02418,3.1020243 c -17.74526,0 -34.78287,7.4793447 -46.74605,20.5185437 L 172.07443,270.19395 c -2.06182,2.24712 -3.62564,4.89876 -4.59248,7.78522 L 140.8837,357.3713 c -3.07524,9.17847 -1.5318,19.32972 4.12799,27.15267 5.70494,7.88383 14.89571,12.59122 24.5874,12.59122 0,0 0.001,0 0.001,0 4.19206,0 8.28947,-0.85817 12.17575,-2.5516 L 258.788,361.01891 c 2.80004,-1.21918 5.31179,-3.00972 7.37212,-5.25684 L 492.36576,109.19013 C 515.90477,83.533616 514.08904,43.59255 488.31349,20.148378 Z M 191.8451,342.70547 l 15.60774,-46.58681 1.31629,-1.43519 29.58175,26.90185 -1.31633,1.4352 z M 460.11355,79.857008 267.8118,289.47438 238.23004,262.57253 430.5318,52.953692 c 3.76106,-4.099938 8.90831,-6.358676 14.49383,-6.358676 4.89971,0 9.59268,1.815112 13.22415,5.117676 l 0.61012,0.555259 c 7.98514,7.26188 8.54719,19.638537 1.25373,27.589055 z"
id="path1153"
style="fill:#59a869;fill-opacity:1;stroke-width:1.45417;stroke-miterlimit:4;stroke-dasharray:none" /><path
d="m 444.4301,203.7323 c -12.06218,0 -21.84121,9.73663 -21.84121,21.7465 v 184.62339 c 0,30.4944 -24.91794,55.30424 -55.54515,55.30424 H 102.32958 c -30.628676,0 -55.545143,-24.80984 -55.545143,-55.30424 V 148.67742 c 0,-30.49439 24.917923,-55.30424 55.545143,-55.30424 h 191.60139 c 12.06218,0 21.84122,-9.73663 21.84122,-21.746496 0,-12.009866 -9.77904,-21.746497 -21.84122,-21.746497 H 102.32958 c -54.715176,0 -99.227587,44.32081 -99.227587,98.797233 v 261.42332 c 0,54.47644 44.513867,98.79724 99.227587,98.79724 h 264.71271 c 54.71372,0 99.22758,-44.3208 99.22758,-98.79724 V 225.4788 c 10e-4,-12.00987 -9.77759,-21.7465 -21.83977,-21.7465 z"
id="path1155"
style="fill:#59a869;fill-opacity:1;stroke-width:1.45417;stroke-miterlimit:4;stroke-dasharray:none" /><path
style="fill:#db5860;stroke-width:1.16152;fill-opacity:1"
id="path936"
d="m 256.00057,8.2104852 c 136.90315,0 247.78952,110.8863748 247.78952,247.7895248 0,136.90315 -110.88637,247.78952 -247.78952,247.78952 C 119.09742,503.78953 8.2098842,392.90432 8.2098842,256.00001 8.2098842,119.0957 119.09626,8.2104852 256.00057,8.2104852 Z M 454.23172,256.00001 c 0,-109.52276 -88.7084,-198.232317 -198.23231,-198.232317 -45.84152,0 -87.84191,15.735046 -121.41667,41.752987 L 412.4799,377.41784 c 26.01794,-33.57592 41.75182,-75.57631 41.75182,-121.41783 z M 256.00057,454.23232 c 45.84152,0 87.84191,-15.73504 121.41667,-41.75298 l -277.896,-277.896 c -26.01794,33.57592 -41.752987,75.57631 -41.752987,121.41667 0,109.52391 88.708397,198.23231 198.232317,198.23231 z" /></g></svg>

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@@ -258,4 +258,4 @@ gem.arch.info=Software packages available for distributions based on Arch Linux
gem.arch.label=Arch
gem.arch.type.arch_repo.label=Arch - Repository
gem.arch.type.aur.label=Arch - AUR
gem.aur.install.warning=AUR packages are maintained by an independent user community. There is no warranty that they will work or not harm your system.
gem.aur.install.warning=AUR packages are maintained by an independent user community. There is no warranty they will work or not harm your system.

View File

@@ -15,7 +15,7 @@ from bauh.api.abstract.model import PackageHistory, PackageUpdate, SoftwarePacka
SuggestionPriority, PackageStatus
from bauh.api.abstract.view import MessageType, FormComponent, SingleSelectComponent, InputOption, SelectViewType, \
ViewComponent, PanelComponent
from bauh.commons import user, internet
from bauh.commons import user
from bauh.commons.config import save_config
from bauh.commons.html import strip_html, bold
from bauh.commons.system import ProcessHandler
@@ -364,7 +364,7 @@ class FlatpakManager(SoftwareManager):
if user.is_root():
handler.handle_simple(flatpak.set_default_remotes('system'))
else:
user_password, valid = watcher.request_root_password()
valid, user_password = watcher.request_root_password()
if not valid:
watcher.print('Operation aborted')
return TransactionResult(success=False, installed=[], removed=[])
@@ -424,7 +424,7 @@ class FlatpakManager(SoftwareManager):
if current_installed_by_level and (not installed_by_level or len(current_installed_by_level) > len(installed_by_level) + 1):
pkg_key = '{}:{}:{}'.format(pkg.id, pkg.name, pkg.branch)
net_available = internet.is_available()
net_available = self.context.is_internet_available()
for p in current_installed_by_level:
current_key = '{}:{}:{}'.format(p['id'], p['name'], p['branch'])
if current_key != pkg_key and (not installed_by_level or current_key not in installed_by_level):

View File

@@ -13,14 +13,14 @@ from bauh.api.abstract.model import SoftwarePackage, PackageHistory, PackageUpda
from bauh.api.abstract.view import SingleSelectComponent, SelectViewType, InputOption, ViewComponent, PanelComponent, \
FormComponent
from bauh.api.exception import NoInternetException
from bauh.commons import resource, internet
from bauh.commons import resource
from bauh.commons.category import CategoriesDownloader
from bauh.commons.config import save_config
from bauh.commons.html import bold
from bauh.commons.system import SystemProcess, ProcessHandler, new_root_subprocess, get_human_size_str
from bauh.commons.view_utils import new_select
from bauh.gems.snap import snap, URL_CATEGORIES_FILE, SNAP_CACHE_PATH, CATEGORIES_FILE_PATH, SUGGESTIONS_FILE, \
get_icon_path, snapd, CONFIG_FILE
get_icon_path, snapd, CONFIG_FILE, ROOT_DIR
from bauh.gems.snap.config import read_config
from bauh.gems.snap.model import SnapApplication
from bauh.gems.snap.snapd import SnapdClient
@@ -45,14 +45,14 @@ class SnapManager(SoftwareManager):
self.custom_actions = [
CustomSoftwareAction(i18n_status_key='snap.action.refresh.status',
i18n_label_key='snap.action.refresh.label',
icon_path=resource.get_path('img/refresh.svg', context.get_view_path()),
icon_path=resource.get_path('img/refresh.svg', ROOT_DIR),
manager_method='refresh',
requires_root=True,
i18n_confirm_key='snap.action.refresh.confirm'),
CustomSoftwareAction(i18n_status_key='snap.action.channel.status',
i18n_label_key='snap.action.channel.label',
i18n_confirm_key='snap.action.channel.confirm',
icon_path=resource.get_path('img/refresh.svg', context.get_view_path()),
icon_path=resource.get_path('img/refresh.svg', ROOT_DIR),
manager_method='change_channel',
requires_root=True)
]
@@ -230,7 +230,8 @@ class SnapManager(SoftwareManager):
if success:
new_installed = []
try:
current_installed = self.read_installed(disk_loader=disk_loader, internet_available=internet.is_available()).installed
net_available = self.context.internet_checker.is_available()
current_installed = self.read_installed(disk_loader=disk_loader, internet_available=net_available).installed
except:
new_installed = [pkg]
traceback.print_exc()
@@ -261,7 +262,7 @@ class SnapManager(SoftwareManager):
return ProcessHandler(watcher).handle_simple(snap.refresh_and_stream(pkg.name, root_password))[0]
def change_channel(self, pkg: SnapApplication, root_password: str, watcher: ProcessWatcher) -> bool:
if not internet.is_available():
if not self.context.internet_checker.is_available():
raise NoInternetException()
try:

View File

@@ -0,0 +1,128 @@
<?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"
width="512"
height="512"
viewBox="0 0 511.99998 512"
xml:space="preserve"
sodipodi:docname="refresh.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"><metadata
id="metadata45"><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><defs
id="defs43" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="739"
id="namedview41"
showgrid="false"
showborder="true"
inkscape:zoom="0.48437083"
inkscape:cx="133.71431"
inkscape:cy="289.92474"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:document-rotation="0" />
<g
id="g8"
transform="matrix(1.0938971,0,0,1.0217723,-10.489433,7.0809411)"
style="fill:#3991e9;fill-opacity:1;stroke:none;stroke-width:39.2413;stroke-miterlimit:4;stroke-dasharray:none">
<g
id="g6"
style="fill:#3991e9;fill-opacity:1;stroke:none;stroke-width:39.2413;stroke-miterlimit:4;stroke-dasharray:none">
<path
d="m 55.323,203.641 c 15.664,0 29.813,-9.405 35.872,-23.854 25.017,-59.604 83.842,-101.61 152.42,-101.61 37.797,0 72.449,12.955 100.23,34.442 l -21.775,3.371 c -7.438,1.153 -13.224,7.054 -14.232,14.512 -1.01,7.454 3.008,14.686 9.867,17.768 l 119.746,53.872 c 5.249,2.357 11.33,1.904 16.168,-1.205 4.83,-3.114 7.764,-8.458 7.796,-14.208 l 0.621,-131.943 c 0.042,-7.506 -4.851,-14.144 -12.024,-16.332 -7.185,-2.188 -14.947,0.589 -19.104,6.837 L 414.403,70.096 C 370.398,26.778 310.1,0 243.615,0 142.806,0 56.133,61.562 19.167,149.06 c -5.134,12.128 -3.84,26.015 3.429,36.987 7.269,10.976 19.556,17.594 32.727,17.594 z"
id="path2"
inkscape:connector-curvature="0"
style="fill:#3991e9;fill-opacity:1;stroke:none;stroke-width:39.2413;stroke-miterlimit:4;stroke-dasharray:none" />
<path
d="m 464.635,301.184 c -7.27,-10.977 -19.558,-17.594 -32.728,-17.594 -15.664,0 -29.813,9.405 -35.872,23.854 -25.018,59.604 -83.843,101.61 -152.42,101.61 -37.798,0 -72.45,-12.955 -100.232,-34.442 l 21.776,-3.369 c 7.437,-1.153 13.223,-7.055 14.233,-14.514 1.009,-7.453 -3.008,-14.686 -9.867,-17.768 L 49.779,285.089 c -5.25,-2.356 -11.33,-1.905 -16.169,1.205 -4.829,3.114 -7.764,8.458 -7.795,14.207 l -0.622,131.943 c -0.042,7.506 4.85,14.144 12.024,16.332 7.185,2.188 14.948,-0.59 19.104,-6.839 l 16.505,-24.805 c 44.004,43.32 104.303,70.098 170.788,70.098 100.811,0 187.481,-61.561 224.446,-149.059 5.137,-12.128 3.843,-26.014 -3.425,-36.987 z"
id="path4"
inkscape:connector-curvature="0"
style="fill:#3991e9;fill-opacity:1;stroke:none;stroke-width:39.2413;stroke-miterlimit:4;stroke-dasharray:none" />
</g>
</g>
<g
id="g10"
transform="translate(-15.027876,-464.19647)">
</g>
<g
id="g12"
transform="translate(-15.027876,-464.19647)">
</g>
<g
id="g14"
transform="translate(-15.027876,-464.19647)">
</g>
<g
id="g16"
transform="translate(-15.027876,-464.19647)">
</g>
<g
id="g18"
transform="translate(-15.027876,-464.19647)">
</g>
<g
id="g20"
transform="translate(-15.027876,-464.19647)">
</g>
<g
id="g22"
transform="translate(-15.027876,-464.19647)">
</g>
<g
id="g24"
transform="translate(-15.027876,-464.19647)">
</g>
<g
id="g26"
transform="translate(-15.027876,-464.19647)">
</g>
<g
id="g28"
transform="translate(-15.027876,-464.19647)">
</g>
<g
id="g30"
transform="translate(-15.027876,-464.19647)">
</g>
<g
id="g32"
transform="translate(-15.027876,-464.19647)">
</g>
<g
id="g34"
transform="translate(-15.027876,-464.19647)">
</g>
<g
id="g36"
transform="translate(-15.027876,-464.19647)">
</g>
<g
id="g38"
transform="translate(-15.027876,-464.19647)">
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@@ -7,6 +7,7 @@ from PyQt5.QtWidgets import QApplication, QWidget
from bauh import ROOT_DIR, __app_name__
from bauh.api.abstract.context import ApplicationContext
from bauh.api.http import HttpClient
from bauh.commons.internet import InternetChecker
from bauh.context import generate_i18n, DEFAULT_I18N_KEY, new_qt_application
from bauh.view.core import gems
from bauh.view.core.controller import GenericSoftwareManager
@@ -39,7 +40,8 @@ def new_manage_panel(app_args: Namespace, app_config: dict, logger: logging.Logg
distro=util.get_distro(),
file_downloader=AdaptableFileDownloader(logger, bool(app_config['download']['multithreaded']),
i18n, http_client, app_config['download']['multithreaded_client']),
app_name=__app_name__)
app_name=__app_name__,
internet_checker=InternetChecker(offline=app_args.offline))
managers = gems.load_managers(context=context, locale=i18n.current_key, config=app_config, default_locale=DEFAULT_I18N_KEY)
@@ -49,7 +51,7 @@ def new_manage_panel(app_args: Namespace, app_config: dict, logger: logging.Logg
manager = GenericSoftwareManager(managers, context=context, config=app_config)
app = new_qt_application(app_config, quit_on_last_closed=True)
app = new_qt_application(app_config=app_config, logger=logger, quit_on_last_closed=True)
if app_args.settings: # only settings window
manager.cache_available_managers()

259
bauh/stylesheet.py Normal file
View File

@@ -0,0 +1,259 @@
import glob
import os
import re
import traceback
from typing import Optional, Dict, Tuple, Set
from PyQt5.QtWidgets import QApplication
from bauh.api.constants import USER_THEMES_PATH
from bauh.view.util import resource
from bauh.view.util.translation import I18n
RE_WIDTH_PERCENT = re.compile(r'[\d\\.]+%w')
RE_HEIGHT_PERCENT = re.compile(r'[\d\\.]+%h')
RE_META_I18N_FIELDS = re.compile(r'((name|description)(\[\w+])?)')
RE_VAR_PATTERN = re.compile(r'^@[\w.\-_]+')
RE_QSS_EXT = re.compile(r'\.qss$')
class ThemeMetadata:
def __init__(self, file_path: str, default: bool, default_name: Optional[str] = None,
default_description: Optional[str] = None, version: Optional[str] = None,
root_sheet: Optional[str] = None, abstract: bool = False):
self.names = {}
self.default_name = default_name
self.descriptions = {}
self.default_description = default_description
self.root_sheet = root_sheet
self.version = version
self.file_path = file_path
self.file_dir = '/'.join(file_path.split('/')[0:-1])
self.default = default
self.key = self.file_path.split('/')[-1].split('.')[0] if self.default else self.file_path
self.abstract = abstract
def __eq__(self, other) -> bool:
if isinstance(other, ThemeMetadata):
return self.file_path == other.file_path
return False
def __hash__(self):
return self.file_path.__hash__()
def __repr__(self):
return self.file_path if self.file_path else ''
def get_i18n_name(self, i18n: I18n) -> str:
if self.names:
name = self.names.get(i18n.current_key, self.names.get(i18n.default_key))
if name:
return name
if self.default_name:
return self.default_name
else:
return self.file_path.split('/')[-1]
def get_i18n_description(self, i18n: I18n) -> Optional[str]:
if self.descriptions:
des = self.descriptions.get(i18n.current_key, self.descriptions.get(i18n.default_key))
if des:
return des
return self.default_description
def read_theme_metada(key: str, file_path: str) -> ThemeMetadata:
meta_file = RE_QSS_EXT.sub('.meta', file_path)
meta_obj = ThemeMetadata(file_path=file_path, default_name=key, default=not key.startswith('/'))
if os.path.exists(meta_file):
meta_dict = {}
with open(meta_file) as f:
for line in f.readlines():
if line:
field_split = line.split('=')
if len(field_split) > 1:
meta_dict[field_split[0].strip()] = field_split[1].strip()
if meta_dict:
for field, val in meta_dict.items():
if field == 'version':
meta_obj.version = val
elif field == 'root_sheet':
meta_obj.root_sheet = val
elif field == 'name':
meta_obj.default_name = val
elif field == 'description':
meta_obj.default_description = val
elif field == 'abstract':
boolean = val.lower()
if boolean == 'true':
meta_obj.abstract = True
elif boolean == 'false':
meta_obj.abstract = False
else:
i18n_field = RE_META_I18N_FIELDS.findall(field)
if i18n_field:
if i18n_field[0][1] == 'name':
meta_obj.names[i18n_field[0][2][1:-1]] = val
else:
meta_obj.descriptions[i18n_field[0][2][1:-1]] = val
return meta_obj
def read_default_themes() -> Dict[str, str]:
return {f.split('/')[-1].split('.')[0].lower(): f for f in glob.glob(resource.get_path('style/**/*.qss'))}
def read_user_themes() -> Dict[str, str]:
return {f: f for f in glob.glob('{}/**/*.qss'.format(USER_THEMES_PATH))}
def read_all_themes_metadata() -> Set[ThemeMetadata]:
themes = set()
for key, file_path in read_default_themes().items():
themes.add(read_theme_metada(key=key, file_path=file_path))
for key, file_path in read_user_themes().items():
themes.add(read_theme_metada(key=key, file_path=file_path))
return themes
def process_theme(file_path: str, theme_str: str, metadata: ThemeMetadata,
available_themes: Optional[Dict[str, str]]) -> Optional[Tuple[str, ThemeMetadata]]:
if theme_str and metadata:
root_theme = None
if metadata.root_sheet and metadata.root_sheet in available_themes:
root_file = available_themes[metadata.root_sheet]
if os.path.isfile(root_file):
with open(root_file) as f:
root_theme_str = f.read()
if root_theme_str:
root_metadata = read_theme_metada(key=metadata.root_sheet, file_path=root_file)
root_theme = process_theme(file_path=root_file,
theme_str=root_theme_str,
metadata=root_metadata,
available_themes=available_themes)
var_map = _read_var_file(file_path)
var_map['images'] = resource.get_path('img')
var_map['style_dir'] = metadata.file_dir
if var_map:
var_list = [*var_map.keys()]
var_list.sort(key=_by_str_len, reverse=True)
for var in var_list:
theme_str = theme_str.replace('@' + var, var_map[var])
screen_size = QApplication.primaryScreen().size()
theme_str = process_width_percent_measures(theme_str, screen_size.width())
theme_str = process_height_percent_measures(theme_str, screen_size.height())
return theme_str if not root_theme else '{}\n{}'.format(root_theme[0], theme_str), metadata
def _by_str_len(string: str) -> int:
return len(string)
def process_width_percent_measures(theme: str, screen_width: int) -> str:
width_measures = RE_WIDTH_PERCENT.findall(theme)
final_theme = theme
if width_measures:
for m in width_measures:
try:
percent = float(m.split('%')[0])
final_theme = final_theme.replace(m, '{}px'.format(round(screen_width * percent)))
except ValueError:
traceback.print_exc()
return final_theme
def process_height_percent_measures(theme: str, screen_height: int) -> str:
width_measures = RE_HEIGHT_PERCENT.findall(theme)
final_sheet = theme
if width_measures:
for m in width_measures:
try:
percent = float(m.split('%')[0])
final_sheet = final_sheet.replace(m, '{}px'.format(round(screen_height * percent)))
except ValueError:
traceback.print_exc()
return final_sheet
def _read_var_file(theme_file: str) -> dict:
vars_file = theme_file.replace('.qss', '.vars')
var_map = {}
if os.path.isfile(vars_file):
with open(vars_file) as f:
for line in f.readlines():
if line:
line_strip = line.strip()
if line_strip:
var_value = line_strip.split('=')
if var_value and len(var_value) == 2:
var, value = var_value[0].strip(), var_value[1].strip()
if var and value:
var_map[var] = value
if var_map:
process_var_of_vars(var_map) # mapping keys that point to others
return var_map
def process_var_of_vars(var_map: dict):
while True:
pending_vars, invalid = {}, set()
for k, v in var_map.items():
var_match = RE_VAR_PATTERN.match(v)
if var_match:
var_name = var_match.group()[1:]
if var_name not in var_map or var_name == k:
invalid.add(k)
else:
pending_vars[k] = var_name
for key in invalid:
del var_map[key]
if not pending_vars:
break
resolved = 0
for key, val in pending_vars.items():
real_val = var_map[val]
if not RE_VAR_PATTERN.match(real_val):
var_map[key] = real_val
resolved += 1
if resolved == len(pending_vars):
break

View File

@@ -1,14 +1,15 @@
import logging
from logging import Logger
from typing import Tuple
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtCore import QObject
from PyQt5.QtWidgets import QApplication
from bauh.context import new_qt_application
from bauh.view.qt.systray import TrayIcon
def new_tray_icon(app_config: dict, logger: logging.Logger) -> Tuple[QApplication, QWidget]:
app = new_qt_application(app_config, quit_on_last_closed=True)
def new_tray_icon(app_config: dict, logger: Logger) -> Tuple[QApplication, QObject]:
app = new_qt_application(app_config=app_config, logger=logger, quit_on_last_closed=True)
tray_icon = TrayIcon(screen_size=app.primaryScreen().size(), config=app_config, logger=logger)
tray_icon.show()

View File

@@ -37,10 +37,12 @@ def read_config(update_file: bool = False) -> dict:
'default_icon': None,
'updates_icon': None
},
'style': None,
'qt_style': 'fusion',
'hdpi': True,
"auto_scale": False,
"scale_factor": 1.0
"scale_factor": 1.0,
'theme': 'light',
'system_theme': False
},
'download': {

View File

@@ -1,4 +1,4 @@
import operator
import re
import re
import time
import traceback
@@ -14,7 +14,6 @@ from bauh.api.abstract.model import SoftwarePackage, PackageUpdate, PackageHisto
CustomSoftwareAction
from bauh.api.abstract.view import ViewComponent, TabGroupComponent, MessageType
from bauh.api.exception import NoInternetException
from bauh.commons import internet
from bauh.commons.html import bold
from bauh.commons.system import run_cmd
from bauh.view.core.config import read_config
@@ -158,7 +157,7 @@ class GenericSoftwareManager(SoftwareManager):
res = SearchResult([], [], 0)
if internet.is_available():
if self.context.is_internet_available():
norm_word = word.strip().lower()
url_words = RE_IS_URL.match(norm_word)
@@ -211,7 +210,7 @@ class GenericSoftwareManager(SoftwareManager):
disk_loader = None
net_available = internet.is_available()
net_available = self.context.is_internet_available()
if not pkg_types: # any type
for man in self.managers:
if self._can_work(man):
@@ -402,7 +401,7 @@ class GenericSoftwareManager(SoftwareManager):
def prepare(self, task_manager: TaskManager, root_password: str, internet_available: bool):
if self.managers:
internet_on = internet.is_available()
internet_on = self.context.is_internet_available()
taskman = task_manager if task_manager else TaskManager() # empty task manager to prevent null pointers
for man in self.managers:
if man not in self._already_prepared and self._can_work(man):
@@ -420,7 +419,7 @@ class GenericSoftwareManager(SoftwareManager):
updates = []
if self.managers:
net_available = internet.is_available()
net_available = self.context.is_internet_available()
for man in self.managers:
if self._can_work(man):
@@ -433,7 +432,7 @@ class GenericSoftwareManager(SoftwareManager):
def list_warnings(self, internet_available: bool = None) -> List[str]:
warnings = []
int_available = internet.is_available()
int_available = self.context.is_internet_available()
if int_available:
updates_msg = check_for_update(self.logger, self.http_client, self.i18n)
@@ -469,7 +468,7 @@ class GenericSoftwareManager(SoftwareManager):
def list_suggestions(self, limit: int, filter_installed: bool) -> List[PackageSuggestion]:
if bool(self.config['suggestions']['enabled']):
if self.managers and internet.is_available():
if self.managers and self.context.is_internet_available():
suggestions, threads = [], []
for man in self.managers:
t = Thread(target=self._fill_suggestions, args=(suggestions, man, int(self.config['suggestions']['by_type']), filter_installed))

View File

@@ -2,11 +2,11 @@ import logging
import os
import traceback
from math import floor
from typing import List, Tuple
from typing import List, Tuple, Optional
from PyQt5.QtWidgets import QApplication, QStyleFactory
from bauh import ROOT_DIR
from bauh import ROOT_DIR, __app_name__
from bauh.api.abstract.controller import SoftwareManager
from bauh.api.abstract.download import FileDownloader
from bauh.api.abstract.view import ViewComponent, TabComponent, InputOption, TextComponent, MultipleSelectComponent, \
@@ -102,13 +102,13 @@ class GenericSettingsManager:
id_="icon_exp")
select_trim_up = new_select(label=self.i18n['core.config.trim.after_upgrade'],
tip=self.i18n['core.config.trim.after_upgrade.tip'],
value=core_config['disk']['trim']['after_upgrade'],
max_width=default_width,
opts=[(self.i18n['yes'].capitalize(), True, None),
(self.i18n['no'].capitalize(), False, None),
(self.i18n['ask'].capitalize(), None, None)],
id_='trim_after_upgrade')
tip=self.i18n['core.config.trim.after_upgrade.tip'],
value=core_config['disk']['trim']['after_upgrade'],
max_width=default_width,
opts=[(self.i18n['yes'].capitalize(), True, None),
(self.i18n['no'].capitalize(), False, None),
(self.i18n['ask'].capitalize(), None, None)],
id_='trim_after_upgrade')
select_dep_check = self._gen_bool_component(label=self.i18n['core.config.system.dep_checking'],
tooltip=self.i18n['core.config.system.dep_checking.tip'],
@@ -178,7 +178,7 @@ class GenericSettingsManager:
return TabComponent(self.i18n['core.config.tab.tray'].capitalize(), PanelComponent(sub_comps), None, 'core.tray')
def _gen_ui_settings(self, core_config: dict, screen_width: int, screen_height: int) -> TabComponent:
default_width = floor(0.11 * screen_width)
default_width = floor(0.15 * screen_width)
select_hdpi = self._gen_bool_component(label=self.i18n['core.config.ui.hdpi'],
tooltip=self.i18n['core.config.ui.hdpi.tip'],
@@ -205,9 +205,9 @@ class GenericSettingsManager:
min_value=100, max_value=400, step_value=5, value=scale * 100,
max_width=default_width)
cur_style = QApplication.instance().style().objectName().lower() if not core_config['ui']['style'] else core_config['ui']['style']
style_opts = [InputOption(label=self.i18n['core.config.ui.style.default'].capitalize(), value=None)]
style_opts.extend([InputOption(label=s.capitalize(), value=s.lower()) for s in QStyleFactory.keys()])
cur_style = QApplication.instance().property('qt_style') if not core_config['ui']['qt_style'] else core_config['ui']['qt_style']
style_opts = [InputOption(label=s.capitalize(), value=s.lower()) for s in QStyleFactory.keys()]
default_style = [o for o in style_opts if o.value == cur_style]
@@ -221,14 +221,21 @@ class GenericSettingsManager:
default_style = default_style[0]
select_style = SingleSelectComponent(label=self.i18n['style'].capitalize(),
tooltip=self.i18n['core.config.ui.qt_style.tooltip'],
options=style_opts,
default_option=default_style,
type_=SelectViewType.COMBO,
max_width=default_width,
id_="style")
input_maxd = TextInputComponent(label=self.i18n['core.config.ui.max_displayed'].capitalize(),
tooltip=self.i18n['core.config.ui.max_displayed.tip'].capitalize(),
select_system_theme = self._gen_bool_component(label=self.i18n['core.config.ui.system_theme'],
tooltip=self.i18n['core.config.ui.system_theme.tip'].format(app=__app_name__),
value=bool(core_config['ui']['system_theme']),
max_width=default_width,
id_='system_theme')
input_maxd = TextInputComponent(label=self.i18n['core.config.ui.max_displayed'],
tooltip=self.i18n['core.config.ui.max_displayed.tip'],
only_int=True,
id_="table_max",
max_width=default_width,
@@ -240,11 +247,14 @@ class GenericSettingsManager:
max_width=default_width,
value=core_config['download']['icons'])
sub_comps = [FormComponent([select_hdpi, select_ascale, select_scale, select_dicons, select_style, input_maxd], spaces=False)]
sub_comps = [FormComponent([select_hdpi, select_ascale, select_scale,
select_dicons, select_system_theme,
select_style, input_maxd], spaces=False)]
return TabComponent(self.i18n['core.config.tab.ui'].capitalize(), PanelComponent(sub_comps), None, 'core.ui')
def _gen_general_settings(self, core_config: dict, screen_width: int, screen_height: int) -> TabComponent:
default_width = floor(0.11 * screen_width)
default_width = floor(0.15 * screen_width)
locale_opts = [InputOption(label=self.i18n['locale.{}'.format(k)].capitalize(), value=k) for k in translation.get_available_keys()]
@@ -295,11 +305,12 @@ class GenericSettingsManager:
id_="sugs_by_type")
inp_reboot = new_select(label=self.i18n['core.config.updates.reboot'],
tip=self.i18n['core.config.updates.reboot.tip'],
id_='ask_for_reboot',
max_width=default_width,
value=bool(core_config['updates']['ask_for_reboot']),
opts=[(self.i18n['ask'].capitalize(), True, None), (self.i18n['no'].capitalize(), False, None)])
tip=self.i18n['core.config.updates.reboot.tip'],
id_='ask_for_reboot',
max_width=default_width,
value=bool(core_config['updates']['ask_for_reboot']),
opts=[(self.i18n['ask'].capitalize(), True, None),
(self.i18n['no'].capitalize(), False, None)])
sub_comps = [FormComponent([select_locale, select_store_pwd, select_sysnotify, select_sugs, inp_sugs, inp_reboot], spaces=False)]
return TabComponent(self.i18n['core.config.tab.general'].capitalize(), PanelComponent(sub_comps), None, 'core.gen')
@@ -322,7 +333,7 @@ class GenericSettingsManager:
backup: PanelComponent,
ui: PanelComponent,
tray: PanelComponent,
gems_panel: PanelComponent) -> Tuple[bool, List[str]]:
gems_panel: PanelComponent) -> Tuple[bool, Optional[List[str]]]:
core_config = config.read_config()
# general
@@ -407,9 +418,12 @@ class GenericSettingsManager:
style = ui_form.get_component('style').get_selected()
cur_style = core_config['ui']['style'] if core_config['ui']['style'] else QApplication.instance().style().objectName().lower()
cur_style = core_config['ui']['qt_style'] if core_config['ui']['qt_style'] else QApplication.instance().property('qt_style')
if style != cur_style:
core_config['ui']['style'] = style
core_config['ui']['qt_style'] = style
QApplication.instance().setProperty('qt_style', style)
core_config['ui']['system_theme'] = ui_form.get_component('system_theme').get_selected()
# gems
checked_gems = gems_panel.components[1].get_component('gems').get_selected_values()

View File

@@ -1,8 +1,7 @@
from glob import glob
from PyQt5.QtCore import Qt, QSize
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QVBoxLayout, QDialog, QLabel, QWidget, QHBoxLayout
from PyQt5.QtWidgets import QVBoxLayout, QDialog, QLabel, QWidget, QHBoxLayout, QSizePolicy, QApplication
from bauh import __version__, __app_name__, ROOT_DIR
from bauh.context import generate_i18n
@@ -21,28 +20,29 @@ class AboutDialog(QDialog):
layout = QVBoxLayout()
self.setLayout(layout)
logo_container = QWidget()
logo_container.setObjectName('logo_container')
logo_container.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)
logo_container.setLayout(QHBoxLayout())
label_logo = QLabel()
icon = QIcon(resource.get_path('img/logo.svg')).pixmap(64, 64)
label_logo.setPixmap(icon)
label_logo.setAlignment(Qt.AlignCenter)
layout.addWidget(label_logo)
label_logo.setObjectName('logo')
logo_container.layout().addWidget(label_logo)
layout.addWidget(logo_container)
label_name = QLabel(__app_name__)
label_name.setStyleSheet('font-weight: bold; font-size: 14px')
label_name.setAlignment(Qt.AlignCenter)
label_name.setObjectName('app_name')
layout.addWidget(label_name)
label_version = QLabel(i18n['about.version'].lower() + ' ' + __version__)
label_version.setStyleSheet('QLabel { font-size: 11px; font-weight: bold }')
label_version.setAlignment(Qt.AlignCenter)
label_version.setObjectName('app_version')
layout.addWidget(label_version)
layout.addWidget(QLabel(''))
line_desc = QLabel(i18n['about.info.desc'])
line_desc.setStyleSheet('font-size: 12px; font-weight: bold;')
line_desc.setAlignment(Qt.AlignCenter)
line_desc.setMinimumWidth(400)
line_desc.setObjectName('app_description')
layout.addWidget(line_desc)
layout.addWidget(QLabel(''))
@@ -54,54 +54,52 @@ class AboutDialog(QDialog):
gems_widget.setLayout(QHBoxLayout())
gems_widget.layout().addWidget(QLabel())
gem_logo_size = int(0.032552083 * QApplication.primaryScreen().size().height())
for gem_path in available_gems:
icon = QLabel()
icon.setObjectName('gem_logo')
icon_path = gem_path + '/resources/img/{}.svg'.format(gem_path.split('/')[-1])
icon.setPixmap(QIcon(icon_path).pixmap(QSize(25, 25)))
icon.setPixmap(QIcon(icon_path).pixmap(gem_logo_size, gem_logo_size))
gems_widget.layout().addWidget(icon)
gems_widget.layout().addWidget(QLabel())
layout.addWidget(gems_widget)
layout.addWidget(QLabel(''))
label_more_info = QLabel()
label_more_info.setStyleSheet('font-size: 11px;')
label_more_info.setObjectName('app_more_information')
label_more_info.setText(i18n['about.info.link'] + " <a href='{url}'>{url}</a>".format(url=PROJECT_URL))
label_more_info.setOpenExternalLinks(True)
label_more_info.setAlignment(Qt.AlignCenter)
layout.addWidget(label_more_info)
label_license = QLabel()
label_license.setStyleSheet('font-size: 11px;')
label_license.setObjectName('app_license')
label_license.setText("<a href='{}'>{}</a>".format(LICENSE_URL, i18n['about.info.license']))
label_license.setOpenExternalLinks(True)
label_license.setAlignment(Qt.AlignCenter)
layout.addWidget(label_license)
layout.addWidget(QLabel(''))
label_trouble_question = QLabel(i18n['about.info.trouble.question'])
label_trouble_question.setStyleSheet('font-size: 10px; font-weight: bold')
label_trouble_question.setAlignment(Qt.AlignCenter)
label_trouble_question.setObjectName('app_trouble_question')
layout.addWidget(label_trouble_question)
label_trouble_answer = QLabel(i18n['about.info.trouble.answer'])
label_trouble_answer.setStyleSheet('font-size: 10px;')
label_trouble_answer.setAlignment(Qt.AlignCenter)
label_trouble_answer.setObjectName('app_trouble_answer')
layout.addWidget(label_trouble_answer)
layout.addWidget(QLabel(''))
label_rate_question = QLabel(i18n['about.info.rate.question'])
label_rate_question.setStyleSheet('font-size: 10px; font-weight: bold;')
label_rate_question.setAlignment(Qt.AlignCenter)
label_rate_question.setObjectName('app_rate_question')
layout.addWidget(label_rate_question)
label_rate_answer = QLabel(i18n['about.info.rate.answer'])
label_rate_answer.setStyleSheet('font-size: 10px;')
label_rate_answer.setAlignment(Qt.AlignCenter)
label_rate_answer.setObjectName('app_rate_answer')
layout.addWidget(label_rate_answer)
layout.addWidget(QLabel(''))

View File

@@ -2,22 +2,21 @@ import operator
import os
from functools import reduce
from threading import Lock
from typing import List
from typing import List, Optional
from PyQt5.QtCore import Qt, QUrl, QSize
from PyQt5.QtGui import QPixmap, QIcon, QCursor
from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply
from PyQt5.QtWidgets import QTableWidget, QTableView, QMenu, QAction, QTableWidgetItem, QToolButton, QWidget, \
from PyQt5.QtWidgets import QTableWidget, QTableView, QMenu, QToolButton, QWidget, \
QHeaderView, QLabel, QHBoxLayout, QToolBar, QSizePolicy
from bauh.api.abstract.cache import MemoryCache
from bauh.api.abstract.model import PackageStatus, CustomSoftwareAction
from bauh.commons.html import strip_html, bold
from bauh.view.qt import dialog
from bauh.view.qt.colors import GREEN, BROWN
from bauh.view.qt.components import IconButton
from bauh.view.qt.components import IconButton, QCustomMenuAction, QCustomToolbar
from bauh.view.qt.dialog import ConfirmationDialog
from bauh.view.qt.qt_utils import measure_based_on_height
from bauh.view.qt.view_model import PackageView
from bauh.view.util import resource
from bauh.view.util.translation import I18n
NAME_MAX_SIZE = 30
@@ -25,45 +24,32 @@ DESC_MAX_SIZE = 40
PUBLISHER_MAX_SIZE = 25
class UpdateToggleButton(QWidget):
class UpgradeToggleButton(QToolButton):
STYLE_DEFAULT = 'QToolButton { background: ' + GREEN + ' } QToolButton:checked { background: gray } '
STYLE_UNCHECKED = 'QToolButton:disabled { background: #d69003 }'
def __init__(self, pkg: PackageView, root: QWidget, i18n: I18n, checked: bool = True, clickable: bool = True):
super(UpdateToggleButton, self).__init__()
self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)
def __init__(self, pkg: Optional[PackageView], root: QWidget, i18n: I18n, checked: bool = True,
clickable: bool = True):
super(UpgradeToggleButton, self).__init__()
self.app_view = pkg
self.root = root
layout = QHBoxLayout()
layout.setContentsMargins(0, 0, 0, 0)
layout.setAlignment(Qt.AlignCenter)
self.setLayout(layout)
self.bt = QToolButton()
self.bt.setCursor(QCursor(Qt.PointingHandCursor))
self.bt.setCheckable(True)
self.bt.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)
self.setCursor(QCursor(Qt.PointingHandCursor))
self.setCheckable(True)
if clickable:
self.bt.clicked.connect(self.change_state)
self.clicked.connect(self.change_state)
self.bt.setStyleSheet(self.STYLE_DEFAULT + (self.STYLE_UNCHECKED if not clickable and not checked else ''))
layout.addWidget(self.bt)
if not clickable and not checked:
self.setProperty('enabled', 'false')
if not checked:
self.bt.click()
self.click()
if clickable:
self.bt.setIcon(QIcon(resource.get_path('img/app_update.svg')))
self.setToolTip('{} {}'.format(i18n['manage_window.apps_table.upgrade_toggle.tooltip'],
i18n['manage_window.apps_table.upgrade_toggle.enabled.tooltip']))
else:
if not checked:
self.bt.setIcon(QIcon(resource.get_path('img/exclamation.svg')))
self.bt.setEnabled(False)
self.setEnabled(False)
tooltip = i18n['{}.update.disabled.tooltip'.format(pkg.model.gem_name)]
@@ -73,22 +59,22 @@ class UpdateToggleButton(QWidget):
self.setToolTip('{} {}'.format(i18n['manage_window.apps_table.upgrade_toggle.tooltip'],
i18n['manage_window.apps_table.upgrade_toggle.disabled.tooltip']))
else:
self.bt.setIcon(QIcon(resource.get_path('img/app_update.svg')))
self.bt.setCheckable(False)
self.setCheckable(False)
def change_state(self, not_checked: bool):
self.app_view.update_checked = not not_checked
self.setProperty('toggled', str(self.app_view.update_checked).lower())
self.root.update_bt_upgrade()
self.style().unpolish(self)
self.style().polish(self)
class AppsTable(QTableWidget):
COL_NUMBER = 8
STYLE_BT_INSTALL = 'background: {b}; color: white; font-size: 10px; font-weight: bold'.format(b=GREEN)
STYLE_BT_UNINSTALL = 'color: {c}; font-size: 10px; font-weight: bold;'.format(c=BROWN)
class PackagesTable(QTableWidget):
COL_NUMBER = 9
def __init__(self, parent: QWidget, icon_cache: MemoryCache, download_icons: bool):
super(AppsTable, self).__init__()
super(PackagesTable, self).__init__()
self.setObjectName('table_packages')
self.setParent(parent)
self.window = parent
self.download_icons = download_icons
@@ -102,8 +88,8 @@ class AppsTable(QTableWidget):
self.setHorizontalHeaderLabels(['' for _ in range(self.columnCount())])
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)
self.icon_logo = QIcon(resource.get_path('img/logo.svg'))
self.pixmap_verified = QIcon(resource.get_path('img/verified.svg')).pixmap(QSize(10, 10))
self.horizontalScrollBar().setCursor(QCursor(Qt.PointingHandCursor))
self.verticalScrollBar().setCursor(QCursor(Qt.PointingHandCursor))
self.network_man = QNetworkAccessManager()
self.network_man.finished.connect(self._load_icon_and_cache)
@@ -114,6 +100,10 @@ class AppsTable(QTableWidget):
self.cache_type_icon = {}
self.i18n = self.window.i18n
def icon_size(self) -> QSize:
pixels = measure_based_on_height(0.02083)
return QSize(pixels, pixels)
def has_any_settings(self, pkg: PackageView):
return pkg.model.has_history() or \
pkg.model.can_be_downgraded() or \
@@ -122,77 +112,77 @@ class AppsTable(QTableWidget):
def show_pkg_actions(self, pkg: PackageView):
menu_row = QMenu()
menu_row.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred)
menu_row.setObjectName('app_actions')
menu_row.setCursor(QCursor(Qt.PointingHandCursor))
if pkg.model.installed:
if pkg.model.has_history():
action_history = QAction(self.i18n["manage_window.apps_table.row.actions.history"])
action_history.setIcon(QIcon(resource.get_path('img/history.svg')))
def show_history():
self.window.begin_show_history(pkg)
action_history.triggered.connect(show_history)
menu_row.addAction(action_history)
menu_row.addAction(QCustomMenuAction(parent=menu_row,
label=self.i18n["manage_window.apps_table.row.actions.history"],
action=show_history,
button_name='app_history'))
if pkg.model.can_be_downgraded():
action_downgrade = QAction(self.i18n["manage_window.apps_table.row.actions.downgrade"])
def downgrade():
if dialog.ask_confirmation(
title=self.i18n['manage_window.apps_table.row.actions.downgrade'],
body=self._parag(self.i18n['manage_window.apps_table.row.actions.downgrade.popup.body'].format(self._bold(str(pkg)))),
i18n=self.i18n):
if ConfirmationDialog(title=self.i18n['manage_window.apps_table.row.actions.downgrade'],
body=self._parag(self.i18n[
'manage_window.apps_table.row.actions.downgrade.popup.body'].format(
self._bold(str(pkg)))),
i18n=self.i18n).ask():
self.window.begin_downgrade(pkg)
action_downgrade.triggered.connect(downgrade)
action_downgrade.setIcon(QIcon(resource.get_path('img/downgrade.svg')))
menu_row.addAction(action_downgrade)
menu_row.addAction(QCustomMenuAction(parent=menu_row,
label=self.i18n["manage_window.apps_table.row.actions.downgrade"],
action=downgrade,
button_name='app_downgrade'))
if pkg.model.supports_ignored_updates():
if pkg.model.is_update_ignored():
action_ignore_updates = QAction(
self.i18n["manage_window.apps_table.row.actions.ignore_updates_reverse"])
action_ignore_updates.setIcon(QIcon(resource.get_path('img/revert_update_ignored.svg')))
action_label = self.i18n["manage_window.apps_table.row.actions.ignore_updates_reverse"]
button_name = 'revert_ignore_updates'
else:
action_ignore_updates = QAction(self.i18n["manage_window.apps_table.row.actions.ignore_updates"])
action_ignore_updates.setIcon(QIcon(resource.get_path('img/ignore_update.svg')))
action_label = self.i18n["manage_window.apps_table.row.actions.ignore_updates"]
button_name = 'ignore_updates'
def ignore_updates():
self.window.begin_ignore_updates(pkg)
action_ignore_updates.triggered.connect(ignore_updates)
menu_row.addAction(action_ignore_updates)
menu_row.addAction(QCustomMenuAction(parent=menu_row,
label=action_label,
button_name=button_name,
action=ignore_updates))
if bool(pkg.model.get_custom_supported_actions()):
actions = [self._map_custom_action(pkg, a) for a in pkg.model.get_custom_supported_actions()]
actions = [self._map_custom_action(pkg, a, menu_row) for a in pkg.model.get_custom_supported_actions()]
menu_row.addActions(actions)
menu_row.adjustSize()
menu_row.popup(QCursor.pos())
menu_row.exec_()
def _map_custom_action(self, pkg: PackageView, action: CustomSoftwareAction) -> QAction:
item = QAction(self.i18n[action.i18n_label_key])
if action.icon_path:
item.setIcon(QIcon(action.icon_path))
def _map_custom_action(self, pkg: PackageView, action: CustomSoftwareAction, parent: QWidget) -> QCustomMenuAction:
def custom_action():
if action.i18n_confirm_key:
body = self.i18n[action.i18n_confirm_key].format(bold(pkg.model.name))
else:
body = '{} ?'.format(self.i18n[action.i18n_label_key])
if dialog.ask_confirmation(
title=self.i18n[action.i18n_label_key],
body=self._parag(body),
i18n=self.i18n):
if ConfirmationDialog(icon=QIcon(pkg.model.get_type_icon_path()),
title=self.i18n[action.i18n_label_key],
body=self._parag(body),
i18n=self.i18n).ask():
self.window.begin_execute_custom_action(pkg, action)
item.triggered.connect(custom_action)
return item
return QCustomMenuAction(parent=parent,
label=self.i18n[action.i18n_label_key],
icon=QIcon(action.icon_path) if action.icon_path else None,
action=custom_action)
def refresh(self, pkg: PackageView):
self._update_row(pkg, update_check_enabled=False, change_update_col=False)
@@ -206,9 +196,11 @@ class AppsTable(QTableWidget):
self._update_row(pkg, change_update_col=change_update_col)
def _uninstall(self, pkg: PackageView):
if dialog.ask_confirmation(title=self.i18n['manage_window.apps_table.row.actions.uninstall.popup.title'],
body=self._parag(self.i18n['manage_window.apps_table.row.actions.uninstall.popup.body'].format(self._bold(str(pkg)))),
i18n=self.i18n):
if ConfirmationDialog(title=self.i18n['manage_window.apps_table.row.actions.uninstall.popup.title'],
body=self._parag(
self.i18n['manage_window.apps_table.row.actions.uninstall.popup.body'].format(
self._bold(str(pkg)))),
i18n=self.i18n).ask():
self.window.begin_uninstall(pkg)
def _bold(self, text: str) -> str:
@@ -224,13 +216,12 @@ class AppsTable(QTableWidget):
warning = self.i18n.get('gem.{}.install.warning'.format(pkgv.model.get_type().lower()))
if warning:
body += '<br/><br/> {}'.format('<br/>'.join(('{}.'.format(phrase) for phrase in warning.split('.') if phrase)))
if dialog.ask_confirmation(
title=self.i18n['manage_window.apps_table.row.actions.install.popup.title'],
body=self._parag(body),
i18n=self.i18n):
body += '<br/><br/> {}'.format(
'<br/>'.join(('{}.'.format(phrase) for phrase in warning.split('.') if phrase)))
if ConfirmationDialog(title=self.i18n['manage_window.apps_table.row.actions.install.popup.title'],
body=self._parag(body),
i18n=self.i18n).ask():
self.window.install(pkgv)
def _load_icon_and_cache(self, http_response: QNetworkReply):
@@ -257,18 +248,19 @@ class AppsTable(QTableWidget):
if icon_data:
for idx, app in enumerate(self.window.pkgs):
if app.model.icon_url == icon_url:
col_name = self.item(idx, 0)
col_name.setIcon(icon_data['icon'])
self._update_icon(self.cellWidget(idx, 0), icon_data['icon'])
if app.model.supports_disk_cache() and app.model.get_disk_icon_path() and icon_data['bytes']:
if not icon_was_cached or not os.path.exists(app.model.get_disk_icon_path()):
self.window.manager.cache_to_disk(pkg=app.model, icon_bytes=icon_data['bytes'], only_icon=True)
self.window.manager.cache_to_disk(pkg=app.model, icon_bytes=icon_data['bytes'],
only_icon=True)
def update_packages(self, pkgs: List[PackageView], update_check_enabled: bool = True):
self.setRowCount(0) # removes the overwrite effect when updates the table
self.setEnabled(True)
if pkgs:
self.setColumnCount(self.COL_NUMBER if update_check_enabled else self.COL_NUMBER - 1)
self.setRowCount(len(pkgs))
for idx, pkg in enumerate(pkgs):
@@ -284,59 +276,49 @@ class AppsTable(QTableWidget):
self.scrollToTop()
def _update_row(self, pkg: PackageView, update_check_enabled: bool = True, change_update_col: bool = True):
self._set_col_name(0, pkg)
self._set_col_version(1, pkg)
self._set_col_description(2, pkg)
self._set_col_publisher(3, pkg)
self._set_col_type(4, pkg)
self._set_col_installed(5, pkg)
self._set_col_actions(6, pkg)
self._set_col_icon(0, pkg)
self._set_col_name(1, pkg)
self._set_col_version(2, pkg)
self._set_col_description(3, pkg)
self._set_col_publisher(4, pkg)
self._set_col_type(5, pkg)
self._set_col_installed(6, pkg)
self._set_col_actions(7, pkg)
if change_update_col:
col_update = None
if change_update_col and update_check_enabled:
if pkg.model.installed and not pkg.model.is_update_ignored() and pkg.model.update:
col_update = QCustomToolbar()
col_update.add_space()
col_update.add_widget(UpgradeToggleButton(pkg=pkg,
root=self.window,
i18n=self.i18n,
checked=pkg.update_checked if pkg.model.can_be_updated() else False,
clickable=pkg.model.can_be_updated()))
col_update.add_space()
else:
col_update = QLabel()
if update_check_enabled and pkg.model.installed and not pkg.model.is_update_ignored() and pkg.model.update:
col_update = QToolBar()
col_update.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)
col_update.addWidget(UpdateToggleButton(pkg=pkg,
root=self.window,
i18n=self.i18n,
checked=pkg.update_checked if pkg.model.can_be_updated() else False,
clickable=pkg.model.can_be_updated()))
self.setCellWidget(pkg.table_index, 7, col_update)
def _gen_row_button(self, text: str, style: str, callback) -> QWidget:
col = QWidget()
col.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
self.setCellWidget(pkg.table_index, 8, col_update)
def _gen_row_button(self, text: str, name: str, callback) -> QToolButton:
col_bt = QToolButton()
col_bt.setProperty('text_only', 'true')
col_bt.setObjectName(name)
col_bt.setCursor(QCursor(Qt.PointingHandCursor))
col_bt.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
col_bt.setText(text)
col_bt.setStyleSheet('QToolButton { ' + style + '}')
col_bt.setMinimumWidth(80)
col_bt.clicked.connect(callback)
layout = QHBoxLayout()
layout.setContentsMargins(0, 0, 0, 0)
layout.setAlignment(Qt.AlignCenter)
layout.addWidget(col_bt)
col.setLayout(layout)
return col
return col_bt
def _set_col_installed(self, col: int, pkg: PackageView):
toolbar = QToolBar()
toolbar.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)
toolbar = QCustomToolbar()
toolbar.add_space()
if pkg.model.installed:
if pkg.model.can_be_uninstalled():
def uninstall():
self._uninstall(pkg)
item = self._gen_row_button(self.i18n['uninstall'].capitalize(), self.STYLE_BT_UNINSTALL, uninstall)
item = self._gen_row_button(self.i18n['uninstall'].capitalize(), 'bt_uninstall', uninstall)
else:
item = None
@@ -344,34 +326,39 @@ class AppsTable(QTableWidget):
def install():
self._install_app(pkg)
item = self._gen_row_button(self.i18n['install'].capitalize(), self.STYLE_BT_INSTALL, install)
item = self._gen_row_button(self.i18n['install'].capitalize(), 'bt_install', install)
else:
item = None
toolbar.addWidget(item)
toolbar.add_widget(item)
toolbar.add_space()
self.setCellWidget(pkg.table_index, col, toolbar)
def _set_col_type(self, col: int, pkg: PackageView):
icon_data = self.cache_type_icon.get(pkg.model.get_type())
if icon_data is None:
pixmap = QIcon(pkg.model.get_type_icon_path()).pixmap(QSize(16, 16))
pixmap = QIcon(pkg.model.get_type_icon_path()).pixmap(self.icon_size())
icon_data = {'px': pixmap, 'tip': '{}: {}'.format(self.i18n['type'], pkg.get_type_label())}
self.cache_type_icon[pkg.model.get_type()] = icon_data
item = QLabel()
item.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred)
item.setPixmap(icon_data['px'])
item.setAlignment(Qt.AlignCenter)
item.setToolTip(icon_data['tip'])
self.setCellWidget(pkg.table_index, col, item)
col_type_icon = QLabel()
col_type_icon.setCursor(QCursor(Qt.WhatsThisCursor))
col_type_icon.setObjectName('app_type')
col_type_icon.setProperty('icon', 'true')
col_type_icon.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred)
col_type_icon.setPixmap(icon_data['px'])
col_type_icon.setToolTip(icon_data['tip'])
self.setCellWidget(pkg.table_index, col, col_type_icon)
def _set_col_version(self, col: int, pkg: PackageView):
label_version = QLabel(str(pkg.model.version if pkg.model.version else '?'))
label_version.setObjectName('app_version')
label_version.setAlignment(Qt.AlignCenter)
item = QWidget()
item.setProperty('container', 'true')
item.setCursor(QCursor(Qt.WhatsThisCursor))
item.setLayout(QHBoxLayout())
item.layout().addWidget(label_version)
@@ -381,11 +368,11 @@ class AppsTable(QTableWidget):
tooltip = self.i18n['version.unknown']
if pkg.model.update and not pkg.model.is_update_ignored():
label_version.setStyleSheet("color: {}; font-weight: bold".format(GREEN))
label_version.setProperty('update', 'true')
tooltip = self.i18n['version.installed_outdated']
if pkg.model.is_update_ignored():
label_version.setStyleSheet("color: {}; font-weight: bold".format(BROWN))
label_version.setProperty('ignored', 'true')
tooltip = self.i18n['version.updates_ignored']
if pkg.model.installed and pkg.model.update and not pkg.model.is_update_ignored() and pkg.model.version and pkg.model.latest_version and pkg.model.version != pkg.model.latest_version:
@@ -395,25 +382,7 @@ class AppsTable(QTableWidget):
item.setToolTip(tooltip)
self.setCellWidget(pkg.table_index, col, item)
def _set_col_name(self, col: int, pkg: PackageView):
item = QTableWidgetItem()
item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
name = pkg.model.get_display_name()
if name:
item.setToolTip('{}: {}'.format(self.i18n['app.name'].lower(), pkg.model.get_name_tooltip()))
else:
name = '...'
item.setToolTip(self.i18n['app.name'].lower())
if len(name) > NAME_MAX_SIZE:
name = name[0:NAME_MAX_SIZE - 3] + '...'
if len(name) < NAME_MAX_SIZE:
name = name + ' ' * (NAME_MAX_SIZE-len(name))
item.setText(name)
def _set_col_icon(self, col: int, pkg: PackageView):
icon_path = pkg.model.get_disk_icon_path()
if pkg.model.installed and pkg.model.supports_disk_cache() and icon_path:
if icon_path.startswith('/'):
@@ -444,11 +413,42 @@ class AppsTable(QTableWidget):
icon_data = self.icon_cache.get(pkg.model.icon_url)
icon = icon_data['icon'] if icon_data else QIcon(pkg.model.get_default_icon_path())
item.setIcon(icon)
self.setItem(pkg.table_index, col, item)
col_icon = QLabel()
col_icon.setObjectName('app_icon')
col_icon.setProperty('icon', 'true')
col_icon.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred)
self._update_icon(col_icon, icon)
self.setCellWidget(pkg.table_index, col, col_icon)
def _set_col_name(self, col: int, pkg: PackageView):
col_name = QLabel()
col_name.setObjectName('app_name')
col_name.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred)
col_name.setCursor(QCursor(Qt.WhatsThisCursor))
name = pkg.model.get_display_name()
if name:
col_name.setToolTip('{}: {}'.format(self.i18n['app.name'].lower(), pkg.model.get_name_tooltip()))
else:
name = '...'
col_name.setToolTip(self.i18n['app.name'].lower())
if len(name) > NAME_MAX_SIZE:
name = name[0:NAME_MAX_SIZE - 3] + '...'
if len(name) < NAME_MAX_SIZE:
name = name + ' ' * (NAME_MAX_SIZE - len(name))
col_name.setText(name)
self.setCellWidget(pkg.table_index, col, col_name)
def _update_icon(self, label: QLabel, icon: QIcon):
label.setPixmap(icon.pixmap(QSize(self.icon_size())))
def _set_col_description(self, col: int, pkg: PackageView):
item = QLabel()
item.setObjectName('app_description')
item.setCursor(QCursor(Qt.WhatsThisCursor))
if pkg.model.description is not None or not pkg.model.is_application() or pkg.model.status == PackageStatus.READY:
desc = pkg.model.description.split('\n')[0] if pkg.model.description else pkg.model.description
@@ -478,21 +478,27 @@ class AppsTable(QTableWidget):
if len(publisher) > PUBLISHER_MAX_SIZE:
publisher = full_publisher[0: PUBLISHER_MAX_SIZE - 3] + '...'
lb_name = QLabel()
lb_name.setObjectName('app_publisher')
lb_name.setCursor(QCursor(Qt.WhatsThisCursor))
if not publisher:
if not pkg.model.installed:
item.setStyleSheet('QLabel { color: red; }')
lb_name.setProperty('publisher_known', 'false')
publisher = self.i18n['unknown']
lb_name = QLabel(' {}'.format(publisher))
lb_name.setText(' {}'.format(publisher))
item.addWidget(lb_name)
if publisher and full_publisher:
lb_name.setToolTip(self.i18n['publisher'].capitalize() + ((': ' + full_publisher) if full_publisher else ''))
lb_name.setToolTip(
self.i18n['publisher'].capitalize() + ((': ' + full_publisher) if full_publisher else ''))
if pkg.model.is_trustable():
lb_verified = QLabel()
lb_verified.setPixmap(self.pixmap_verified)
lb_verified.setObjectName('icon_publisher_verified')
lb_verified.setCursor(QCursor(Qt.WhatsThisCursor))
lb_verified.setToolTip(self.i18n['publisher.verified'].capitalize())
item.addWidget(lb_verified)
else:
@@ -501,49 +507,63 @@ class AppsTable(QTableWidget):
self.setCellWidget(pkg.table_index, col, item)
def _set_col_actions(self, col: int, pkg: PackageView):
item = QToolBar()
item.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)
toolbar = QCustomToolbar()
toolbar.setObjectName('app_actions')
toolbar.add_space()
if pkg.model.installed:
def run():
self.window.begin_launch_package(pkg)
bt = IconButton(QIcon(resource.get_path('img/app_play.svg')), i18n=self.i18n, action=run, tooltip=self.i18n['action.run.tooltip'])
bt.setEnabled(pkg.model.can_be_run())
item.addWidget(bt)
bt = IconButton(i18n=self.i18n, action=run, tooltip=self.i18n['action.run.tooltip'])
bt.setObjectName('app_run')
def handle_click():
self.show_pkg_actions(pkg)
if not pkg.model.can_be_run():
bt.setEnabled(False)
bt.setProperty('_enabled', 'false')
toolbar.layout().addWidget(bt)
settings = self.has_any_settings(pkg)
if pkg.model.installed:
bt = IconButton(QIcon(resource.get_path('img/app_actions.svg')), i18n=self.i18n, action=handle_click, tooltip=self.i18n['action.settings.tooltip'])
def handle_custom_actions():
self.show_pkg_actions(pkg)
bt = IconButton(i18n=self.i18n, action=handle_custom_actions, tooltip=self.i18n['action.settings.tooltip'])
bt.setObjectName('app_actions')
bt.setEnabled(bool(settings))
item.addWidget(bt)
toolbar.layout().addWidget(bt)
if not pkg.model.installed:
def show_screenshots():
self.window.begin_show_screenshots(pkg)
bt = IconButton(QIcon(resource.get_path('img/camera.svg')), i18n=self.i18n, action=show_screenshots,
bt = IconButton(i18n=self.i18n, action=show_screenshots,
tooltip=self.i18n['action.screenshots.tooltip'])
bt.setEnabled(bool(pkg.model.has_screenshots()))
item.addWidget(bt)
bt.setObjectName('app_screenshots')
if not pkg.model.has_screenshots():
bt.setEnabled(False)
bt.setProperty('_enabled', 'false')
toolbar.layout().addWidget(bt)
def show_info():
self.window.begin_show_info(pkg)
bt = IconButton(QIcon(resource.get_path('img/app_info.svg')), i18n=self.i18n, action=show_info, tooltip=self.i18n['action.info.tooltip'])
bt = IconButton(i18n=self.i18n, action=show_info, tooltip=self.i18n['action.info.tooltip'])
bt.setObjectName('app_info')
bt.setEnabled(bool(pkg.model.has_info()))
item.addWidget(bt)
toolbar.layout().addWidget(bt)
self.setCellWidget(pkg.table_index, col, item)
self.setCellWidget(pkg.table_index, col, toolbar)
def change_headers_policy(self, policy: QHeaderView = QHeaderView.ResizeToContents, maximized: bool = False):
header_horizontal = self.horizontalHeader()
for i in range(self.columnCount()):
if maximized:
if i not in (3, 4, 7):
if i not in (4, 5, 8):
header_horizontal.setSectionResizeMode(i, QHeaderView.ResizeToContents)
else:
header_horizontal.setSectionResizeMode(i, QHeaderView.Stretch)

View File

@@ -1,4 +1,3 @@
GREEN = '#91a069'
ORANGE = '#ECB03E'
BROWN = '#B47C3E'
RED = '#FF614E'

View File

@@ -47,6 +47,16 @@ def apply_filters(pkg: PackageView, filters: dict, info: dict, limit: bool = Tru
info['pkgs_displayed'].append(pkg)
def sum_updates_displayed(info: dict) -> int:
updates = 0
if info['pkgs_displayed']:
for p in info['pkgs_displayed']:
if p.model.update and not p.model.is_update_ignored():
updates += 1
return updates
def is_package_hidden(pkg: PackageView, filters: dict) -> bool:
hidden = filters['only_apps'] and pkg.model.installed and not pkg.model.is_application()

View File

@@ -3,18 +3,15 @@ import traceback
from pathlib import Path
from typing import Tuple, Dict, Optional, Set
from PyQt5.QtCore import Qt, QSize, QTimer
from PyQt5.QtGui import QIcon, QPixmap, QIntValidator, QCursor
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtGui import QIcon, QIntValidator, QCursor, QFocusEvent
from PyQt5.QtWidgets import QRadioButton, QGroupBox, QCheckBox, QComboBox, QGridLayout, QWidget, \
QLabel, QSizePolicy, QLineEdit, QToolButton, QHBoxLayout, QFormLayout, QFileDialog, QTabWidget, QVBoxLayout, \
QSlider, QScrollArea, QFrame, QAction, QSpinBox, QPlainTextEdit
QSlider, QScrollArea, QFrame, QAction, QSpinBox, QPlainTextEdit, QWidgetAction, QPushButton, QMenu
from bauh.api.abstract.view import SingleSelectComponent, InputOption, MultipleSelectComponent, SelectViewType, \
TextInputComponent, FormComponent, FileChooserComponent, ViewComponent, TabGroupComponent, PanelComponent, \
TwoStateButtonComponent, TextComponent, SpacerComponent, RangeInputComponent, ViewObserver, TextInputType
from bauh.view.qt import css
from bauh.view.qt.colors import RED
from bauh.view.util import resource
from bauh.view.util.translation import I18n
@@ -26,7 +23,7 @@ class QtComponentsManager:
self.group_of_groups = {}
self._saved_states = {}
def register_component(self, component_id: int, instance: QWidget, action: QAction = None):
def register_component(self, component_id: int, instance: QWidget, action: Optional[QAction] = None):
comp = (instance, action, {'v': True, 'e': True, 'r': False})
self.components[component_id] = comp
self._save_state(comp)
@@ -339,6 +336,8 @@ class FormComboBoxQt(QComboBox):
def __init__(self, model: SingleSelectComponent):
super(FormComboBoxQt, self).__init__()
self.model = model
self.setCursor(QCursor(Qt.PointingHandCursor))
self.view().setCursor(QCursor(Qt.PointingHandCursor))
if model.max_width > 0:
self.setMaximumWidth(model.max_width)
@@ -401,8 +400,10 @@ class RadioSelectQt(QGroupBox):
def __init__(self, model: SingleSelectComponent):
super(RadioSelectQt, self).__init__(model.label + ' :' if model.label else None)
if not model.label:
self.setObjectName('radio_select_notitle')
self.model = model
self.setStyleSheet("QGroupBox { font-weight: bold }")
grid = QGridLayout()
self.setLayout(grid)
@@ -431,10 +432,10 @@ class ComboSelectQt(QGroupBox):
def __init__(self, model: SingleSelectComponent):
super(ComboSelectQt, self).__init__()
self.model = model
self.setLayout(QGridLayout())
self.setStyleSheet('QGridLayout {margin-left: 0} QLabel { font-weight: bold}')
self.layout().addWidget(QLabel(model.label + ' :' if model.label else ''), 0, 0)
self.layout().addWidget(FormComboBoxQt(model), 0, 1)
self._layout = QGridLayout()
self.setLayout(self._layout)
self._layout.addWidget(QLabel(model.label + ' :' if model.label else ''), 0, 0)
self._layout.addWidget(FormComboBoxQt(model), 0, 1)
class QLineEditObserver(QLineEdit, ViewObserver):
@@ -469,9 +470,6 @@ class TextInputQt(QGroupBox):
super(TextInputQt, self).__init__()
self.model = model
self.setLayout(QGridLayout())
self.setStyleSheet('QGridLayout {margin-left: 0} QLabel { font-weight: bold}')
self.layout().addWidget(QLabel(model.get_label()), 0, 0)
if self.model.max_width > 0:
self.setMaximumWidth(self.model.max_width)
@@ -511,7 +509,6 @@ class MultipleSelectQt(QGroupBox):
def __init__(self, model: MultipleSelectComponent, callback):
super(MultipleSelectQt, self).__init__(model.label if model.label else None)
self.setStyleSheet(css.GROUP_BOX)
self.model = model
self._layout = QGridLayout()
self.setLayout(self._layout)
@@ -531,17 +528,6 @@ class MultipleSelectQt(QGroupBox):
col = 0
pixmap_help = QPixmap()
for op in model.options: # loads the help icon if at least one option has a tooltip
if op.tooltip:
try:
pixmap_help = QIcon(resource.get_path('img/about.svg')).pixmap(QSize(16, 16))
except:
traceback.print_exc()
break
for op in model.options:
comp = CheckboxQt(op, model, callback)
@@ -555,7 +541,8 @@ class MultipleSelectQt(QGroupBox):
if op.tooltip:
help_icon = QLabel()
help_icon.setPixmap(pixmap_help)
help_icon.setProperty('help_icon', 'true')
help_icon.setCursor(QCursor(Qt.WhatsThisCursor))
help_icon.setToolTip(op.tooltip)
widget.layout().addWidget(help_icon)
@@ -590,23 +577,12 @@ class FormMultipleSelectQt(QWidget):
if model.label:
line = 1
self.layout().addWidget(QLabel(), 0, 1)
self._layout.addWidget(QLabel(), 0, 1)
else:
line = 0
col = 0
pixmap_help = QPixmap()
for op in model.options: # loads the help icon if at least one option has a tooltip
if op.tooltip:
try:
pixmap_help = QIcon(resource.get_path('img/about.svg')).pixmap(QSize(16, 16))
except:
traceback.print_exc()
break
for op in model.options:
comp = CheckboxQt(op, model, None)
@@ -620,9 +596,9 @@ class FormMultipleSelectQt(QWidget):
if op.tooltip:
help_icon = QLabel()
help_icon.setPixmap(pixmap_help)
help_icon.setProperty('help_icon', 'true')
help_icon.setToolTip(op.tooltip)
help_icon.setCursor(QCursor(Qt.PointingHandCursor))
help_icon.setCursor(QCursor(Qt.WhatsThisCursor))
widget.layout().addWidget(help_icon)
self._layout.addWidget(widget, line, col)
@@ -669,40 +645,26 @@ class InputFilter(QLineEdit):
self.last_text = p_str
class IconButton(QWidget):
class IconButton(QToolButton):
def __init__(self, icon: QIcon, action, i18n: I18n, background: str = None, align: int = Qt.AlignCenter, tooltip: str = None, expanding: bool = False):
def __init__(self, action, i18n: I18n, align: int = Qt.AlignCenter, tooltip: str = None, expanding: bool = False):
super(IconButton, self).__init__()
self.bt = QToolButton()
self.bt.setCursor(QCursor(Qt.PointingHandCursor))
self.bt.setIcon(icon)
self.bt.clicked.connect(action)
self.setCursor(QCursor(Qt.PointingHandCursor))
self.clicked.connect(action)
self.i18n = i18n
self.default_tootip = tooltip
self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)
self.bt.setSizePolicy(QSizePolicy.Expanding if expanding else QSizePolicy.Minimum, QSizePolicy.Minimum)
if background:
style = 'QToolButton { color: white; background: ' + background + '} '
style += 'QToolButton:disabled { color: white; background: blue }'
self.bt.setStyleSheet(style)
self.setSizePolicy(QSizePolicy.Expanding if expanding else QSizePolicy.Minimum, QSizePolicy.Minimum)
if tooltip:
self.bt.setToolTip(tooltip)
layout = QHBoxLayout()
layout.setContentsMargins(0, 0, 0, 0)
layout.setAlignment(align)
layout.addWidget(self.bt)
self.setLayout(layout)
self.setToolTip(tooltip)
def setEnabled(self, enabled):
super(IconButton, self).setEnabled(enabled)
if not enabled:
self.bt.setToolTip(self.i18n['icon_button.tooltip.disabled'])
self.setToolTip(self.i18n['icon_button.tooltip.disabled'])
else:
self.bt.setToolTip(self.default_tootip)
self.setToolTip(self.default_tootip)
class PanelQt(QWidget):
@@ -726,7 +688,6 @@ class FormQt(QGroupBox):
self.model = model
self.i18n = i18n
self.setLayout(QFormLayout())
self.setStyleSheet(css.GROUP_BOX)
if model.spaces:
self.layout().addRow(QLabel(), QLabel())
@@ -787,7 +748,7 @@ class FormQt(QGroupBox):
if hasattr(comp, 'get_label'):
text = comp.get_label()
else:
attr = 'label' if hasattr(comp,'label') else 'value'
attr = 'label' if hasattr(comp, 'label') else 'value'
text = getattr(comp, attr)
if text:
@@ -803,13 +764,8 @@ class FormQt(QGroupBox):
def gen_tip_icon(self, tip: str) -> QLabel:
tip_icon = QLabel()
tip_icon.setProperty('tip_icon', 'true')
tip_icon.setToolTip(tip.strip())
try:
tip_icon.setPixmap(QIcon(resource.get_path('img/about.svg')).pixmap(QSize(12, 12)))
except:
traceback.print_exc()
return tip_icon
def _new_text_input(self, c: TextInputComponent) -> Tuple[QLabel, QLineEdit]:
@@ -860,6 +816,7 @@ class FormQt(QGroupBox):
def _new_range_input(self, model: RangeInputComponent) -> QSpinBox:
spinner = QSpinBox()
spinner.setCursor(QCursor(Qt.PointingHandCursor))
spinner.setMinimum(model.min)
spinner.setMaximum(model.max)
spinner.setSingleStep(model.step)
@@ -929,13 +886,8 @@ class FormQt(QGroupBox):
label = self._new_label(c)
wrapped = self._wrap(chooser, c)
try:
icon = QIcon(resource.get_path('img/clean.svg'))
except:
traceback.print_exc()
icon = QIcon()
bt = IconButton(icon, i18n=self.i18n['clean'].capitalize(), action=clean_path, background=RED, tooltip=self.i18n['action.run.tooltip'])
bt = IconButton(i18n=self.i18n['clean'].capitalize(), action=clean_path, tooltip=self.i18n['clean'].capitalize())
bt.setObjectName('clean_field')
wrapped.layout().addWidget(bt)
return label, wrapped
@@ -962,6 +914,8 @@ class TabGroupQt(QTabWidget):
scroll.setWidget(to_widget(c.content, i18n))
self.addTab(scroll, icon, c.label)
self.tabBar().setCursor(QCursor(Qt.PointingHandCursor))
def new_single_select(model: SingleSelectComponent) -> QWidget:
if model.type == SelectViewType.RADIO:
@@ -974,6 +928,7 @@ def new_single_select(model: SingleSelectComponent) -> QWidget:
def new_spacer(min_width: int = None) -> QWidget:
spacer = QWidget()
spacer.setProperty('spacer', 'true')
if min_width:
spacer.setMinimumWidth(min_width)
@@ -1019,13 +974,13 @@ class RangeInputQt(QGroupBox):
super(RangeInputQt, self).__init__()
self.model = model
self.setLayout(QGridLayout())
self.setStyleSheet('QGridLayout {margin-left: 0} QLabel { font-weight: bold}')
self.layout().addWidget(QLabel(model.label.capitalize() + ' :' if model.label else ''), 0, 0)
if self.model.max_width > 0:
self.setMaximumWidth(self.model.max_width)
self.spinner = QSpinBox()
self.spinner.setCursor(QCursor(Qt.PointingHandCursor))
self.spinner.setMinimum(model.min)
self.spinner.setMaximum(model.max)
self.spinner.setSingleStep(model.step)
@@ -1040,3 +995,155 @@ class RangeInputQt(QGroupBox):
def _update_value(self):
self.model.value = self.spinner.value()
class QCustomLineEdit(QLineEdit):
def __init__(self, focus_in_callback, focus_out_callback, **kwargs):
super(QCustomLineEdit, self).__init__(**kwargs)
self.focus_in_callback = focus_in_callback
self.focus_out_callback = focus_out_callback
def focusInEvent(self, ev: QFocusEvent):
super(QCustomLineEdit, self).focusInEvent(ev)
if self.focus_in_callback:
self.focus_in_callback()
def focusOutEvent(self, ev: QFocusEvent):
super(QCustomLineEdit, self).focusOutEvent(ev)
if self.focus_out_callback:
self.focus_out_callback()
self.clearFocus()
class QSearchBar(QWidget):
def __init__(self, search_callback, parent: Optional[QWidget] = None):
super(QSearchBar, self).__init__(parent=parent)
self.setLayout(QHBoxLayout())
self.setContentsMargins(0, 0, 0, 0)
self.layout().setSpacing(0)
self.callback = search_callback
self.inp_search = QCustomLineEdit(focus_in_callback=self._set_focus_in,
focus_out_callback=self._set_focus_out)
self.inp_search.setObjectName('inp_search')
self.inp_search.setFrame(False)
self.inp_search.returnPressed.connect(search_callback)
search_background_color = self.inp_search.palette().color(self.inp_search.backgroundRole()).name()
self.search_left_corner = QLabel()
self.search_left_corner.setObjectName('lb_left_corner')
self.layout().addWidget(self.search_left_corner)
self.layout().addWidget(self.inp_search)
self.search_button = QPushButton()
self.search_button.setObjectName('search_button')
self.search_button.setCursor(QCursor(Qt.PointingHandCursor))
self.search_button.clicked.connect(search_callback)
self.layout().addWidget(self.search_button)
def clear(self):
self.inp_search.clear()
def text(self) -> str:
return self.inp_search.text()
def set_text(self, text: str):
self.inp_search.setText(text)
def setFocus(self):
self.inp_search.setFocus()
def set_tooltip(self, tip: str):
self.inp_search.setToolTip(tip)
def set_button_tooltip(self, tip: str):
self.search_button.setToolTip(tip)
def set_placeholder(self, placeholder: str):
self.inp_search.setPlaceholderText(placeholder)
def _set_focus_in(self):
self.search_button.setProperty('focused', 'true')
self.search_left_corner.setProperty('focused', 'true')
for c in (self.search_button, self.search_left_corner):
c.style().unpolish(c)
c.style().polish(c)
def _set_focus_out(self):
self.search_button.setProperty('focused', 'false')
self.search_left_corner.setProperty('focused', 'false')
for c in (self.search_button, self.search_left_corner):
c.style().unpolish(c)
c.style().polish(c)
class QCustomMenuAction(QWidgetAction):
def __init__(self, parent: QWidget, label: Optional[str] = None, action=None, button_name: Optional[str] = None,
icon: Optional[QIcon] = None, tooltip: Optional[str] = None):
super(QCustomMenuAction, self).__init__(parent)
self.button = QPushButton()
self.set_label(label)
self._action = None
self.set_action(action)
self.set_button_name(button_name)
self.set_icon(icon)
self.setDefaultWidget(self.button)
if tooltip:
self.button.setToolTip(tooltip)
def set_label(self, label: str):
self.button.setText(label)
def set_action(self, action):
self._action = action
self.button.clicked.connect(self._handle_action)
def _handle_action(self):
if self._action:
self._action()
if self.parent() and isinstance(self.parent(), QMenu):
self.parent().close()
def set_button_name(self, name: str):
if name:
self.button.setObjectName(name)
def set_icon(self, icon: QIcon):
if icon:
self.button.setIcon(icon)
def get_label(self) -> str:
return self.button.text()
class QCustomToolbar(QWidget):
def __init__(self, spacing: int = 2, parent: Optional[QWidget] = None, alignment: int = Qt.AlignRight):
super(QCustomToolbar, self).__init__(parent=parent)
self.setProperty('container', 'true')
self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)
self.setLayout(QHBoxLayout())
self.layout().setContentsMargins(0, 0, 0, 0)
self.layout().setSpacing(spacing)
self.layout().setAlignment(alignment)
def add_widget(self, widget: QWidget):
if widget:
self.layout().addWidget(widget)
def add_stretch(self, value: int = 0):
self.layout().addStretch(value)
def add_space(self, min_width: int = 0):
self.layout().addWidget(new_spacer(min_width))

View File

@@ -1,83 +0,0 @@
from typing import List
from PyQt5.QtCore import QSize, Qt
from PyQt5.QtGui import QCursor
from PyQt5.QtWidgets import QMessageBox, QVBoxLayout, QLabel, QWidget, QScrollArea, QFrame
from bauh.api.abstract.view import ViewComponent
from bauh.view.qt import css
from bauh.view.qt.components import to_widget
from bauh.view.util.translation import I18n
class ConfirmationDialog(QMessageBox):
def __init__(self, title: str, body: str, i18n: I18n, screen_size: QSize, components: List[ViewComponent] = None,
confirmation_label: str = None, deny_label: str = None, deny_button: bool = True, window_cancel: bool = True,
confirmation_button: bool = True):
super(ConfirmationDialog, self).__init__()
if not window_cancel:
self.setWindowFlags(Qt.CustomizeWindowHint | Qt.WindowTitleHint)
self.setWindowTitle(title)
self.setStyleSheet('QLabel { margin-right: 25px; }')
self.bt_yes = None
if confirmation_button:
self.bt_yes = self.addButton(i18n['popup.button.yes'] if not confirmation_label else confirmation_label.capitalize(), QMessageBox.YesRole)
self.bt_yes.setCursor(QCursor(Qt.PointingHandCursor))
self.bt_yes.setStyleSheet(css.OK_BUTTON)
self.setDefaultButton(self.bt_yes)
if deny_button:
self.bt_no = self.addButton(i18n['popup.button.no'] if not deny_label else deny_label.capitalize(), QMessageBox.NoRole)
self.bt_no.setCursor(QCursor(Qt.PointingHandCursor))
if not confirmation_button:
self.bt_no.setStyleSheet(css.OK_BUTTON)
self.setDefaultButton(self.bt_no)
label = None
if body:
if not components:
self.setIcon(QMessageBox.Question)
label = QLabel(body)
self.layout().addWidget(label, 0, 1)
width = 0
if components:
scroll = QScrollArea(self)
scroll.setFrameShape(QFrame.NoFrame)
scroll.setWidgetResizable(True)
comps_container = QWidget()
comps_container.setLayout(QVBoxLayout())
scroll.setWidget(comps_container)
height = 0
for idx, comp in enumerate(components):
inst = to_widget(comp, i18n)
height += inst.sizeHint().height()
if inst.sizeHint().width() > width:
width = inst.sizeHint().width()
comps_container.layout().addWidget(inst)
height = height if height < int(screen_size.height() / 2.5) else int(screen_size.height() / 2.5)
scroll.setFixedHeight(height)
self.layout().addWidget(scroll, 1 if body else 0, 1)
if label and comps_container.sizeHint().width() > label.sizeHint().width():
label.setText(label.text() + (' ' * int(comps_container.sizeHint().width() - label.sizeHint().width())))
if not body and width > 0:
self.layout().addWidget(QLabel(' ' * int(width / 2)), 1, 1)
self.exec_()
def is_confirmed(self) -> bool:
return bool(self.bt_yes and self.clickedButton() == self.bt_yes)

View File

@@ -1,19 +0,0 @@
from bauh.view.qt.colors import GREEN
OK_BUTTON = """QPushButton { background: %s; color: white; font-weight: bold}
QPushButton:disabled { background-color: gray; }""" % GREEN
GROUP_BOX = """
QGroupBox {
font-weight: bold;
font-size: 12px;
border: 1px solid silver;
border-radius: 6px;
margin-top: 6px;
}
QGroupBox::title {
subcontrol-origin: margin;
left: 7px;
padding: 0px 5px 0px 5px;
}
"""

View File

@@ -1,11 +1,12 @@
from typing import List
from typing import List, Optional
from PyQt5.QtCore import Qt
from PyQt5.QtCore import Qt, QSize, QMargins
from PyQt5.QtGui import QIcon, QCursor
from PyQt5.QtWidgets import QMessageBox, QLabel, QWidget, QHBoxLayout
from PyQt5.QtWidgets import QMessageBox, QLabel, QWidget, QHBoxLayout, QDialog, QVBoxLayout, QSizePolicy, QApplication, \
QStyle, QPushButton, QScrollArea, QFrame
from bauh.api.abstract.view import MessageType
from bauh.view.qt import css
from bauh.view.qt.components import new_spacer
from bauh.view.util import resource
from bauh.view.util.translation import I18n
@@ -28,34 +29,96 @@ def show_message(title: str, body: str, type_: MessageType, icon: QIcon = QIcon(
popup.exec_()
def ask_confirmation(title: str, body: str, i18n: I18n, icon: QIcon = QIcon(resource.get_path('img/logo.svg')), widgets: List[QWidget] = None):
diag = QMessageBox()
diag.setIcon(QMessageBox.Question)
diag.setWindowTitle(title)
diag.setStyleSheet('QLabel { margin-right: 25px; }')
diag.setWindowFlags(Qt.CustomizeWindowHint | Qt.WindowTitleHint)
class ConfirmationDialog(QDialog):
wbody = QWidget()
wbody.setLayout(QHBoxLayout())
wbody.layout().addWidget(QLabel(body))
def __init__(self, title: str, body: Optional[str], i18n: I18n, icon: QIcon = QIcon(resource.get_path('img/logo.svg')),
widgets: Optional[List[QWidget]] = None, confirmation_button: bool = True, deny_button: bool = True,
window_cancel: bool = False, confirmation_label: Optional[str] = None, deny_label: Optional[str] = None):
super(ConfirmationDialog, self).__init__()
if widgets:
for w in widgets:
wbody.layout().addWidget(w)
if not window_cancel:
self.setWindowFlags(Qt.CustomizeWindowHint | Qt.WindowTitleHint)
diag.layout().addWidget(wbody, 0, 1)
self.setLayout(QVBoxLayout())
self.setWindowTitle(title)
self.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred)
self.setMinimumWidth(250)
self.confirmed = False
bt_yes = diag.addButton(i18n['popup.button.yes'], QMessageBox.YesRole)
bt_yes.setStyleSheet(css.OK_BUTTON)
bt_yes.setCursor(QCursor(Qt.PointingHandCursor))
diag.setDefaultButton(bt_yes)
if icon:
self.setWindowIcon(icon)
bt_no = diag.addButton(i18n['popup.button.no'], QMessageBox.NoRole)
bt_no.setCursor(QCursor(Qt.PointingHandCursor))
container_body = QWidget()
container_body.setObjectName('confirm_container_body')
container_body.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred)
if icon:
diag.setWindowIcon(icon)
if widgets:
container_body.setLayout(QVBoxLayout())
scroll = QScrollArea(self)
scroll.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred)
scroll.setFrameShape(QFrame.NoFrame)
scroll.setWidgetResizable(True)
scroll.setWidget(container_body)
self.layout().addWidget(scroll)
else:
container_body.setLayout(QHBoxLayout())
self.layout().addWidget(container_body)
diag.exec_()
lb_icon = QLabel()
lb_icon.setObjectName('confirm_icon')
lb_icon.setPixmap(QApplication.style().standardIcon(QStyle.SP_MessageBoxQuestion).pixmap(QSize(48, 48)))
container_body.layout().addWidget(lb_icon)
return diag.clickedButton() == bt_yes
if body:
lb_msg = QLabel(body)
lb_msg.setObjectName('confirm_msg')
container_body.layout().addWidget(lb_msg)
if widgets:
for w in widgets:
container_body.layout().addWidget(w)
else:
container_body.layout().addWidget(new_spacer())
container_bottom = QWidget()
container_bottom.setObjectName('confirm_container_bottom')
container_bottom.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred)
container_bottom.setLayout(QHBoxLayout())
self.layout().addWidget(container_bottom)
container_bottom.layout().addWidget(new_spacer())
if confirmation_button:
bt_confirm = QPushButton(confirmation_label.capitalize() if confirmation_label else i18n['popup.button.yes'])
bt_confirm.setObjectName('ok')
bt_confirm.setCursor(QCursor(Qt.PointingHandCursor))
bt_confirm.setDefault(True)
bt_confirm.setAutoDefault(True)
bt_confirm.clicked.connect(self.confirm)
container_bottom.layout().addWidget(bt_confirm)
if deny_button:
bt_cancel = QPushButton(deny_label.capitalize() if deny_label else i18n['popup.button.no'])
bt_cancel.setObjectName('bt_cancel')
bt_cancel.setCursor(QCursor(Qt.PointingHandCursor))
bt_cancel.clicked.connect(self.close)
container_bottom.layout().addWidget(bt_cancel)
if not confirmation_button:
bt_cancel.setDefault(True)
bt_cancel.setAutoDefault(True)
def confirm(self):
self.confirmed = True
self.close()
def ask(self) -> bool:
self.exec_()
return self.confirmed
def ask_confirmation(title: str, body: str, i18n: I18n, icon: QIcon = QIcon(resource.get_path('img/logo.svg')),
widgets: List[QWidget] = None) -> bool:
popup = ConfirmationDialog(title=title, body=body, i18n=i18n, icon=icon, widgets=widgets)
popup.exec_()
return popup.confirmed

View File

@@ -1,103 +0,0 @@
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QWidget, QLabel, QGridLayout, QPushButton
from bauh import ROOT_DIR
from bauh.api.abstract.view import MultipleSelectComponent, InputOption
from bauh.view.core.config import save
from bauh.view.core.controller import GenericSoftwareManager
from bauh.view.util import resource
from bauh.view.qt import qt_utils, css
from bauh.view.qt.components import MultipleSelectQt, CheckboxQt, new_spacer
from bauh.view.util.translation import I18n
class GemSelectorPanel(QWidget):
def __init__(self, window: QWidget, manager: GenericSoftwareManager, i18n: I18n, config: dict, show_panel_after_restart: bool = False):
super(GemSelectorPanel, self).__init__()
self.window = window
self.manager = manager
self.config = config
self.setLayout(QGridLayout())
self.setWindowIcon(QIcon(resource.get_path('img/logo.svg')))
self.setWindowTitle(i18n['gem_selector.title'])
self.resize(400, 400)
self.show_panel_after_restart = show_panel_after_restart
self.label_question = QLabel(i18n['gem_selector.question'])
self.label_question.setStyleSheet('QLabel { font-weight: bold}')
self.layout().addWidget(self.label_question, 0, 1, Qt.AlignHCenter)
self.bt_proceed = QPushButton(i18n['change'].capitalize())
self.bt_proceed.setStyleSheet(css.OK_BUTTON)
self.bt_proceed.clicked.connect(self.save)
self.bt_exit = QPushButton(i18n['close'].capitalize())
self.bt_exit.clicked.connect(self.exit)
self.gem_map = {}
gem_options = []
default = set()
managers = [*manager.managers]
managers.sort(key=lambda c: c.__class__.__name__)
for m in managers:
if m.can_work():
modname = m.__module__.split('.')[-2]
op = InputOption(label=i18n.get('gem.{}.label'.format(modname), modname.capitalize()),
tooltip=i18n.get('gem.{}.info'.format(modname)),
value=modname,
icon_path='{r}/gems/{n}/resources/img/{n}.svg'.format(r=ROOT_DIR, n=modname))
gem_options.append(op)
self.gem_map[modname] = m
if m.is_enabled() and m in manager.working_managers:
default.add(op)
if self.config['gems']:
default_ops = {o for o in gem_options if o.value in self.config['gems']}
else:
default_ops = default
self.bt_proceed.setEnabled(bool(default_ops))
self.gem_select_model = MultipleSelectComponent(label='', options=gem_options, default_options=default_ops, max_per_line=1)
self.gem_select = MultipleSelectQt(self.gem_select_model, self.check_state)
self.layout().addWidget(self.gem_select, 1, 1)
self.layout().addWidget(new_spacer(), 2, 1)
self.layout().addWidget(self.bt_proceed, 3, 1, Qt.AlignRight)
self.layout().addWidget(self.bt_exit, 3, 1, Qt.AlignLeft)
self.adjustSize()
self.setFixedSize(self.size())
qt_utils.centralize(self)
def check_state(self, model: CheckboxQt, checked: bool):
if self.isVisible():
self.bt_proceed.setEnabled(bool(self.gem_select_model.values))
def save(self):
enabled_gems = [op.value for op in self.gem_select_model.values]
for module, man in self.gem_map.items():
enabled = module in enabled_gems
man.set_enabled(enabled)
self.config['gems'] = enabled_gems
save(self.config)
self.manager.reset_cache()
self.manager.prepare()
self.window.verify_warnings()
self.window.types_changed = True
self.window.begin_refresh_packages()
self.close()
def exit(self):
self.close()

View File

@@ -2,8 +2,8 @@ import operator
from functools import reduce
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QColor, QIcon
from PyQt5.QtWidgets import QDialog, QVBoxLayout, QTableWidget, QTableWidgetItem, QHeaderView
from PyQt5.QtGui import QColor, QIcon, QCursor
from PyQt5.QtWidgets import QDialog, QVBoxLayout, QTableWidget, QTableWidgetItem, QHeaderView, QLabel
from bauh.api.abstract.cache import MemoryCache
from bauh.api.abstract.model import PackageHistory
@@ -40,16 +40,19 @@ class HistoryDialog(QDialog):
current_status = history.pkg_status_idx == row
for col, key in enumerate(sorted(data.keys())):
item = QTableWidgetItem()
item = QLabel()
item.setProperty('even', row % 2 == 0)
item.setText(str(data[key]))
if current_status:
item.setBackground(QColor(ORANGE if row != 0 else GREEN))
item.setCursor(QCursor(Qt.WhatsThisCursor))
item.setProperty('outdated', str(row != 0).lower())
tip = '{}. {}.'.format(i18n['popup.history.selected.tooltip'], i18n['version.{}'.format('updated'if row == 0 else 'outdated')].capitalize())
item.setToolTip(tip)
table_history.setItem(row, col, item)
table_history.setCellWidget(row, col, item)
layout.addWidget(table_history)

View File

@@ -1,7 +1,8 @@
from PyQt5.QtCore import QSize, Qt
from PyQt5.QtGui import QIcon, QCursor
from PyQt5.QtWidgets import QDialog, QVBoxLayout, QGroupBox, \
QLineEdit, QLabel, QGridLayout, QPushButton, QPlainTextEdit, QToolBar, QScrollArea, QFrame, QWidget
QLineEdit, QLabel, QGridLayout, QPushButton, QPlainTextEdit, QScrollArea, QFrame, QWidget, QSizePolicy, \
QHBoxLayout
from bauh.api.abstract.cache import MemoryCache
from bauh.view.qt.components import new_spacer
@@ -13,7 +14,7 @@ IGNORED_ATTRS = {'name', '__app__'}
class InfoDialog(QDialog):
def __init__(self, pkg_info: dict, icon_cache: MemoryCache, i18n: I18n, screen_size: QSize):
super(InfoDialog, self).__init__(flags=Qt.CustomizeWindowHint | Qt.WindowTitleHint)
super(InfoDialog, self).__init__()
self.setWindowTitle(str(pkg_info['__app__']))
self.screen_size = screen_size
self.i18n = i18n
@@ -24,16 +25,19 @@ class InfoDialog(QDialog):
scroll.setFrameShape(QFrame.NoFrame)
scroll.setWidgetResizable(True)
comps_container = QWidget()
comps_container.setObjectName('root_container')
comps_container.setLayout(QVBoxLayout())
scroll.setWidget(comps_container)
# shows complete field string
self.text_field = QPlainTextEdit()
self.text_field.setObjectName('full_field')
self.text_field.setReadOnly(True)
comps_container.layout().addWidget(self.text_field)
self.text_field.hide()
self.gbox_info = QGroupBox()
self.gbox_info.setObjectName('fields')
self.gbox_info.setLayout(QGridLayout())
comps_container.layout().addWidget(self.gbox_info)
@@ -64,14 +68,14 @@ class InfoDialog(QDialog):
show_val = val
text = QLineEdit()
text.setObjectName('field_value')
text.setToolTip(show_val)
text.setText(val)
text.setCursorPosition(0)
text.setStyleSheet("width: 400px")
text.setReadOnly(True)
label = QLabel(i18n.get(i18n_key, i18n.get(attr.lower(), attr)).capitalize())
label.setStyleSheet("font-weight: bold")
label.setObjectName('field_name')
self.gbox_info.layout().addWidget(label, idx, 0)
self.gbox_info.layout().addWidget(text, idx, 1)
@@ -79,21 +83,27 @@ class InfoDialog(QDialog):
layout.addWidget(scroll)
lower_bar = QToolBar()
bt_back = QPushButton(self.i18n['back'].capitalize())
bt_back.setVisible(False)
bt_back.setCursor(QCursor(Qt.PointingHandCursor))
bt_back.clicked.connect(self.back_to_info)
lower_container = QWidget()
lower_container.setObjectName('lower_container')
lower_container.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
lower_container.setLayout(QHBoxLayout())
self.ref_bt_back = lower_bar.addWidget(bt_back)
lower_bar.addWidget(new_spacer())
self.bt_back = QPushButton('< {}'.format(self.i18n['back'].capitalize()))
self.bt_back.setObjectName('back')
self.bt_back.setVisible(False)
self.bt_back.setCursor(QCursor(Qt.PointingHandCursor))
self.bt_back.clicked.connect(self.back_to_info)
bt_close = QPushButton(self.i18n['close'].capitalize())
bt_close.setCursor(QCursor(Qt.PointingHandCursor))
bt_close.clicked.connect(self.close)
lower_container.layout().addWidget(self.bt_back)
lower_container.layout().addWidget(new_spacer())
lower_bar.addWidget(bt_close)
layout.addWidget(lower_bar)
self.bt_close = QPushButton(self.i18n['close'].capitalize())
self.bt_close.setObjectName('close')
self.bt_close.setCursor(QCursor(Qt.PointingHandCursor))
self.bt_close.clicked.connect(self.close)
lower_container.layout().addWidget(self.bt_close)
layout.addWidget(lower_container)
self.setMinimumWidth(self.gbox_info.sizeHint().width() * 1.2)
self.setMaximumHeight(screen_size.height() * 0.8)
self.adjustSize()
@@ -102,11 +112,12 @@ class InfoDialog(QDialog):
def show_full_field():
self.gbox_info.hide()
self.ref_bt_back.setVisible(True)
self.bt_back.setVisible(True)
self.text_field.show()
self.text_field.setPlainText(val)
bt_full_field = QPushButton(self.i18n['show'].capitalize())
bt_full_field.setObjectName('show')
bt_full_field.setCursor(QCursor(Qt.PointingHandCursor))
bt_full_field.clicked.connect(show_full_field)
self.gbox_info.layout().addWidget(bt_full_field, idx, 2)
@@ -115,4 +126,4 @@ class InfoDialog(QDialog):
self.text_field.setPlainText("")
self.text_field.hide()
self.gbox_info.show()
self.ref_bt_back.setVisible(False)
self.bt_back.setVisible(False)

View File

@@ -1,10 +1,10 @@
import datetime
import operator
from functools import reduce
from typing import Tuple
from typing import Tuple, Optional
from PyQt5.QtCore import QSize, Qt, QThread, pyqtSignal, QCoreApplication
from PyQt5.QtGui import QIcon, QCursor
from PyQt5.QtGui import QIcon, QCursor, QCloseEvent
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QSizePolicy, QTableWidget, QHeaderView, QPushButton, QToolBar, \
QProgressBar, QApplication, QPlainTextEdit, QToolButton, QHBoxLayout
@@ -12,10 +12,9 @@ from bauh import __app_name__
from bauh.api.abstract.context import ApplicationContext
from bauh.api.abstract.controller import SoftwareManager
from bauh.api.abstract.handler import TaskManager
from bauh.view.qt import root, styles
from bauh.view.qt.colors import GREEN
from bauh.view.qt.components import new_spacer
from bauh.view.qt.components import new_spacer, QCustomToolbar
from bauh.view.qt.qt_utils import centralize
from bauh.view.qt.root import RootDialog
from bauh.view.qt.thread import AnimateProgress
from bauh.view.util.translation import I18n
@@ -37,7 +36,7 @@ class Prepare(QThread, TaskManager):
self.password_response = None
self._registered = 0
def ask_password(self) -> Tuple[str, bool]:
def ask_password(self) -> Tuple[bool, Optional[str]]:
self.waiting_password = True
self.signal_ask_password.emit()
@@ -46,14 +45,14 @@ class Prepare(QThread, TaskManager):
return self.password_response
def set_password_reply(self, password: str, valid: bool):
self.password_response = password, valid
def set_password_reply(self, valid: bool, password: str):
self.password_response = valid, password
self.waiting_password = False
def run(self):
root_pwd = None
if self.manager.requires_root('prepare', None):
root_pwd, ok = self.ask_password()
ok, root_pwd = self.ask_password()
if not ok:
QCoreApplication.exit(1)
@@ -115,7 +114,7 @@ class EnableSkip(QThread):
class PreparePanel(QWidget, TaskManager):
signal_status = pyqtSignal(int)
signal_password_response = pyqtSignal(str, bool)
signal_password_response = pyqtSignal(bool, str)
def __init__(self, context: ApplicationContext, manager: SoftwareManager, screen_size: QSize, i18n: I18n, manage_window: QWidget):
super(PreparePanel, self).__init__(flags=Qt.CustomizeWindowHint | Qt.WindowTitleHint)
@@ -157,14 +156,14 @@ class PreparePanel(QWidget, TaskManager):
self.label_top = QLabel()
self.label_top.setCursor(QCursor(Qt.WaitCursor))
self.label_top.setText("{}...".format(self.i18n['prepare_panel.title.start'].capitalize()))
self.label_top.setObjectName('prepare_status')
self.label_top.setAlignment(Qt.AlignHCenter)
self.label_top.setStyleSheet("QLabel { font-size: 14px; font-weight: bold; }")
self.layout().addWidget(self.label_top)
self.layout().addWidget(QLabel())
self.table = QTableWidget()
self.table.setObjectName('tasks')
self.table.setCursor(QCursor(Qt.WaitCursor))
self.table.setStyleSheet("QTableWidget { background-color: transparent; }")
self.table.setFocusPolicy(Qt.NoFocus)
self.table.setShowGrid(False)
self.table.verticalHeader().setVisible(False)
@@ -172,58 +171,63 @@ class PreparePanel(QWidget, TaskManager):
self.table.horizontalHeader().setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred)
self.table.setColumnCount(4)
self.table.setHorizontalHeaderLabels(['' for _ in range(4)])
self.table.horizontalScrollBar().setCursor(QCursor(Qt.PointingHandCursor))
self.table.verticalScrollBar().setCursor(QCursor(Qt.PointingHandCursor))
self.layout().addWidget(self.table)
self.textarea_output = QPlainTextEdit(self)
self.textarea_output.resize(self.table.size())
self.textarea_output.setStyleSheet("background: black; color: white;")
self.layout().addWidget(self.textarea_output)
self.textarea_output.setVisible(False)
self.textarea_output.setReadOnly(True)
self.textarea_output.setMaximumHeight(100)
self.textarea_details = QPlainTextEdit(self)
self.textarea_details.setObjectName('task_details')
self.textarea_details.setProperty('console', 'true')
self.textarea_details.resize(self.table.size())
self.layout().addWidget(self.textarea_details)
self.textarea_details.setVisible(False)
self.textarea_details.setReadOnly(True)
self.textarea_details.setMaximumHeight(100)
self.current_output_task = None
self.bottom_widget = QWidget()
self.bottom_widget.setLayout(QHBoxLayout())
self.bottom_widget.layout().addStretch()
bt_hide_output = QPushButton(self.i18n['prepare.bt_hide_details'])
bt_hide_output.setStyleSheet('QPushButton { text-decoration: underline; border: 0px; background: none } ')
bt_hide_output.clicked.connect(self.hide_output)
bt_hide_output.setCursor(QCursor(Qt.PointingHandCursor))
self.bottom_widget.layout().addWidget(bt_hide_output)
bt_hide_details = QPushButton(self.i18n['prepare.bt_hide_details'])
bt_hide_details.setObjectName('bt_hide_details')
bt_hide_details.clicked.connect(self.hide_output)
bt_hide_details.setCursor(QCursor(Qt.PointingHandCursor))
self.bottom_widget.layout().addWidget(bt_hide_details)
self.bottom_widget.layout().addStretch()
self.layout().addWidget(self.bottom_widget)
self.bottom_widget.setVisible(False)
self.bt_bar = QToolBar()
self.bt_bar = QCustomToolbar()
self.bt_close = QPushButton(self.i18n['close'].capitalize())
self.bt_close.setObjectName('bt_cancel')
self.bt_close.setCursor(QCursor(Qt.PointingHandCursor))
self.bt_close.clicked.connect(self.close)
self.bt_close.setVisible(False)
self.ref_bt_close = self.bt_bar.addWidget(self.bt_close)
self.bt_bar.add_widget(self.bt_close)
self.bt_bar.add_widget(new_spacer())
self.bt_bar.addWidget(new_spacer())
self.progress_bar = QProgressBar()
self.progress_bar.setStyleSheet(styles.PROGRESS_BAR)
self.progress_bar.setObjectName('prepare_progress')
self.progress_bar.setMaximumHeight(10 if QApplication.instance().style().objectName().lower() == 'windows' else 4)
self.progress_bar.setTextVisible(False)
self.progress_bar.setVisible(False)
self.progress_bar.setCursor(QCursor(Qt.WaitCursor))
self.ref_progress_bar = self.bt_bar.addWidget(self.progress_bar)
self.bt_bar.addWidget(new_spacer())
self.bt_bar.add_widget(self.progress_bar)
self.bt_bar.add_widget(new_spacer())
self.bt_skip = QPushButton(self.i18n['prepare_panel.bt_skip.label'].capitalize())
self.bt_skip.clicked.connect(self.finish)
self.bt_skip.setEnabled(False)
self.bt_skip.setCursor(QCursor(Qt.WaitCursor))
self.bt_bar.addWidget(self.bt_skip)
self.bt_bar.add_widget(self.bt_skip)
self.layout().addWidget(self.bt_bar)
def hide_output(self):
self.current_output_task = None
self.textarea_output.setVisible(False)
self.textarea_output.clear()
self.textarea_details.setVisible(False)
self.textarea_details.clear()
self.bottom_widget.setVisible(False)
self._resize_columns()
self.setFocus(Qt.NoFocusReason)
@@ -232,8 +236,8 @@ class PreparePanel(QWidget, TaskManager):
self.bt_bar.setVisible(True)
def ask_root_password(self):
root_pwd, ok = root.ask_root_password(self.context, self.i18n)
self.signal_password_response.emit(root_pwd, ok)
valid, root_pwd = RootDialog.ask_password(self.context, self.i18n)
self.signal_password_response.emit(valid, root_pwd)
def _enable_skip_button(self):
self.bt_skip.setEnabled(True)
@@ -250,7 +254,7 @@ class PreparePanel(QWidget, TaskManager):
for i in range(self.table.columnCount()):
header_horizontal.setSectionResizeMode(i, QHeaderView.ResizeToContents)
self.resize(self.get_table_width() * 1.05, self.sizeHint().height())
self.resize(int(self.get_table_width() * 1.05), self.sizeHint().height())
def show(self):
super(PreparePanel, self).show()
@@ -264,10 +268,10 @@ class PreparePanel(QWidget, TaskManager):
self.progress_thread.start()
self.ref_bt_close.setVisible(True)
self.ref_progress_bar.setVisible(True)
self.bt_close.setVisible(True)
self.progress_bar.setVisible(True)
def closeEvent(self, QCloseEvent):
def closeEvent(self, ev: QCloseEvent):
if not self.self_close:
QCoreApplication.exit()
@@ -277,14 +281,15 @@ class PreparePanel(QWidget, TaskManager):
task_row = self.added_tasks - 1
icon_widget = QWidget()
icon_widget.setProperty('container', 'true')
icon_widget.setLayout(QHBoxLayout())
icon_widget.layout().setContentsMargins(10, 0, 10, 0)
bt_icon = QToolButton()
bt_icon.setObjectName('bt_task')
bt_icon.setCursor(QCursor(Qt.WaitCursor))
bt_icon.setEnabled(False)
bt_icon.setToolTip(self.i18n['prepare.bt_icon.no_output'])
bt_icon.setFixedSize(QSize(24, 24))
bt_icon.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)
if icon_path:
bt_icon.setIcon(QIcon(icon_path))
@@ -294,11 +299,11 @@ class PreparePanel(QWidget, TaskManager):
if lines:
self.current_output_task = id_
self.textarea_output.clear()
self.textarea_output.setVisible(True)
self.textarea_details.clear()
self.textarea_details.setVisible(True)
for l in lines:
self.textarea_output.appendPlainText(l)
self.textarea_details.appendPlainText(l)
self.bottom_widget.setVisible(True)
@@ -313,22 +318,27 @@ class PreparePanel(QWidget, TaskManager):
self.table.setCellWidget(task_row, 0, icon_widget)
lb_status = QLabel(label)
lb_status.setObjectName('task_status')
lb_status.setProperty('status', 'running')
lb_status.setCursor(Qt.WaitCursor)
lb_status.setMinimumWidth(50)
lb_status.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)
lb_status.setStyleSheet("QLabel { font-weight: bold; }")
self.table.setCellWidget(task_row, 1, lb_status)
lb_status_col = 1
self.table.setCellWidget(task_row, lb_status_col, lb_status)
lb_progress = QLabel('{0:.2f}'.format(0) + '%')
lb_progress.setObjectName('task_progress')
lb_progress.setProperty('status', 'running')
lb_progress.setCursor(Qt.WaitCursor)
lb_progress.setContentsMargins(10, 0, 10, 0)
lb_progress.setStyleSheet("QLabel { font-weight: bold; }")
lb_progress.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)
lb_progress_col = 2
self.table.setCellWidget(task_row, 2, lb_progress)
self.table.setCellWidget(task_row, lb_progress_col, lb_progress)
lb_sub = QLabel()
lb_status.setCursor(Qt.WaitCursor)
lb_sub.setObjectName('task_substatus')
lb_sub.setCursor(Qt.WaitCursor)
lb_sub.setContentsMargins(10, 0, 10, 0)
lb_sub.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)
lb_sub.setMinimumWidth(50)
@@ -336,10 +346,13 @@ class PreparePanel(QWidget, TaskManager):
self.tasks[id_] = {'bt_icon': bt_icon,
'lb_status': lb_status,
'lb_status_col': lb_status_col,
'lb_prog': lb_progress,
'lb_prog_col': lb_progress_col,
'progress': 0,
'lb_sub': lb_sub,
'finished': False}
'finished': False,
'row': task_row}
def update_progress(self, task_id: str, progress: float, substatus: str):
task = self.tasks[task_id]
@@ -369,14 +382,18 @@ class PreparePanel(QWidget, TaskManager):
full_output.append(output)
if self.current_output_task == task_id:
self.textarea_output.appendPlainText(output)
self.textarea_details.appendPlainText(output)
def finish_task(self, task_id: str):
task = self.tasks[task_id]
task['lb_sub'].setText('')
for key in ('lb_prog', 'lb_status'):
task[key].setStyleSheet('QLabel { color: %s; text-decoration: line-through; }' % GREEN)
label = task[key]
label.setProperty('status', 'done')
label.style().unpolish(label)
label.style().polish(label)
label.update()
task['finished'] = True
self._resize_columns()
@@ -389,7 +406,7 @@ class PreparePanel(QWidget, TaskManager):
def finish(self):
if self.isVisible():
self.manage_window.begin_refresh_packages()
self.manage_window.show()
self.manage_window.begin_refresh_packages()
self.self_close = True
self.close()

View File

@@ -19,3 +19,11 @@ def load_icon(path: str, width: int, height: int = None) -> QIcon:
def load_resource_icon(path: str, width: int, height: int = None) -> QIcon:
return load_icon(resource.get_path(path), width, height)
def measure_based_on_width(percent: float) -> int:
return round(percent * QApplication.primaryScreen().size().width())
def measure_based_on_height(percent: float) -> int:
return round(percent * QApplication.primaryScreen().size().height())

View File

@@ -1,100 +1,164 @@
import os
from typing import Tuple
import traceback
from typing import Tuple, Optional
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QCursor, QIcon
from PyQt5.QtWidgets import QInputDialog, QLineEdit, QDialogButtonBox, QApplication
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from PyQt5.QtGui import QCursor
from PyQt5.QtWidgets import QLineEdit, QApplication, QDialog, QPushButton, QVBoxLayout, \
QSizePolicy, QToolBar, QLabel
from bauh.api.abstract.context import ApplicationContext
from bauh.api.abstract.view import MessageType
from bauh.commons.system import new_subprocess
from bauh.view.core.config import read_config
from bauh.view.qt import css
from bauh.view.qt.components import QtComponentsManager
from bauh.view.qt.dialog import show_message
from bauh.view.qt.components import QtComponentsManager, new_spacer
from bauh.view.util import util
from bauh.view.util.translation import I18n
ACTION_ASK_ROOT = 99
class ValidatePassword(QThread):
signal_valid = pyqtSignal(bool)
def __init__(self, password: Optional[str] = None):
super(ValidatePassword, self).__init__()
self.password = password
def run(self):
if self.password is not None:
try:
valid = validate_password(self.password)
except:
traceback.print_exc()
valid = False
self.signal_valid.emit(valid)
class RootDialog(QDialog):
def __init__(self, i18n: I18n, max_tries: int = 3):
super(RootDialog, self).__init__(flags=Qt.CustomizeWindowHint | Qt.WindowTitleHint)
self.i18n = i18n
self.max_tries = max_tries
self.tries = 0
self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)
self.setWindowIcon(util.get_default_icon()[1])
self.setWindowTitle(i18n['popup.root.title'])
self.setLayout(QVBoxLayout())
self.setMinimumWidth(300)
self.label_msg = QLabel(i18n['popup.root.msg'])
self.label_msg.setObjectName('message')
self.layout().addWidget(self.label_msg)
self.input_password = QLineEdit()
self.input_password.setObjectName('password')
self.layout().addWidget(self.input_password)
self.label_error = QLabel()
self.label_error.setProperty('error', 'true')
self.layout().addWidget(self.label_error)
self.label_error.hide()
self.lower_bar = QToolBar()
self.layout().addWidget(self.lower_bar)
self.lower_bar.addWidget(new_spacer())
self.bt_ok = QPushButton(i18n['popup.root.continue'])
self.bt_ok.setDefault(True)
self.bt_ok.setAutoDefault(True)
self.bt_ok.setCursor(QCursor(Qt.PointingHandCursor))
self.bt_ok.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)
self.bt_ok.setObjectName('ok')
self.bt_ok.clicked.connect(self._validate_password)
self.lower_bar.addWidget(self.bt_ok)
self.bt_cancel = QPushButton()
self.bt_cancel.setText(i18n['popup.button.cancel'])
self.bt_cancel.setCursor(QCursor(Qt.PointingHandCursor))
self.bt_cancel.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)
self.bt_cancel.setObjectName('bt_cancel')
self.bt_cancel.clicked.connect(self.close)
self.lower_bar.addWidget(self.bt_cancel)
self.lower_bar.addWidget(new_spacer())
self.valid = False
self.password = None
self.validate_password = ValidatePassword()
self.validate_password.signal_valid.connect(self._handle_password_validated)
def _validate_password(self):
password = self.input_password.text().strip()
if password:
self.password = password
self.tries += 1
self.bt_ok.setEnabled(False)
self.bt_cancel.setEnabled(False)
self.input_password.setEnabled(False)
self.label_error.setText('')
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
self.validate_password.password = password
self.validate_password.start()
def _handle_password_validated(self, valid: bool):
self.valid = valid
QApplication.restoreOverrideCursor()
tries_ended = self.tries == self.max_tries
if not self.valid:
self.label_error.show()
self.bt_cancel.setEnabled(True)
if tries_ended:
self.bt_cancel.setText(self.i18n['close'].capitalize())
self.label_error.setText(self.i18n['popup.root.bad_password.last_try'])
self.bt_cancel.setFocus()
else:
self.label_error.setText(self.i18n['popup.root.bad_password.body'])
self.bt_ok.setEnabled(True)
self.input_password.setEnabled(True)
self.input_password.setFocus()
else:
self.close()
@staticmethod
def ask_password(context: ApplicationContext, i18n: I18n, app_config: Optional[dict] = None,
comp_manager: Optional[QtComponentsManager] = None, tries: int = 3) -> Tuple[bool, Optional[str]]:
current_config = read_config() if not app_config else app_config
store_password = bool(current_config['store_root_password'])
if store_password and context.root_password and validate_password(context.root_password):
return True, context.root_password
if comp_manager:
comp_manager.save_states(state_id=ACTION_ASK_ROOT, only_visible=True)
comp_manager.disable_visible()
diag = RootDialog(i18n=i18n, max_tries=tries)
diag.exec()
password = diag.password
if comp_manager:
comp_manager.restore_state(ACTION_ASK_ROOT)
if password is not None and store_password:
context.root_password = password
return (True, password) if diag.valid else (False, None)
def is_root():
return os.getuid() == 0
def ask_root_password(context: ApplicationContext, i18n: I18n,
app_config: dict = None,
comp_manager: QtComponentsManager = None) -> Tuple[str, bool]:
cur_config = read_config() if not app_config else app_config
store_password = bool(cur_config['store_root_password'])
if store_password and context.root_password and validate_password(context.root_password):
return context.root_password, True
diag = QInputDialog(flags=Qt.CustomizeWindowHint | Qt.WindowTitleHint)
diag.setStyleSheet("""QLineEdit { border-radius: 5px; font-size: 16px; border: 1px solid lightblue }""")
diag.setInputMode(QInputDialog.TextInput)
diag.setTextEchoMode(QLineEdit.Password)
diag.setWindowIcon(util.get_default_icon()[1])
diag.setWindowTitle(i18n['popup.root.title'])
diag.setLabelText('')
diag.setOkButtonText(i18n['popup.root.continue'].capitalize())
diag.setCancelButtonText(i18n['popup.button.cancel'].capitalize())
bt_box = [c for c in diag.children() if isinstance(c, QDialogButtonBox)][0]
for bt in bt_box.buttons():
if bt_box.buttonRole(bt) == QDialogButtonBox.AcceptRole:
bt.setStyleSheet(css.OK_BUTTON)
bt.setCursor(QCursor(Qt.PointingHandCursor))
bt.setIcon(QIcon())
diag.resize(400, 200)
if comp_manager:
comp_manager.save_states(state_id=ACTION_ASK_ROOT, only_visible=True)
comp_manager.disable_visible()
for attempt in range(3):
ok = diag.exec_()
if ok:
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
valid = validate_password(diag.textValue())
QApplication.restoreOverrideCursor()
if not valid:
body = i18n['popup.root.bad_password.body']
if attempt == 2:
body += '. ' + i18n['popup.root.bad_password.last_try']
show_message(title=i18n['popup.root.bad_password.title'],
body=body,
type_=MessageType.ERROR)
ok = False
diag.setTextValue('')
if ok:
if store_password:
context.root_password = diag.textValue()
if comp_manager:
comp_manager.restore_state(ACTION_ASK_ROOT)
return diag.textValue(), ok
else:
break
if comp_manager:
comp_manager.restore_state(ACTION_ASK_ROOT)
return '', False
def validate_password(password: str) -> bool:
clean = new_subprocess(['sudo', '-k']).stdout
echo = new_subprocess(['echo', password], stdin=clean).stdout

View File

@@ -4,11 +4,12 @@ from typing import List
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon, QPixmap, QCursor
from PyQt5.QtWidgets import QDialog, QLabel, QPushButton, QToolBar, QVBoxLayout, QProgressBar, QApplication
from PyQt5.QtWidgets import QDialog, QLabel, QPushButton, QVBoxLayout, QProgressBar, QApplication, QWidget, \
QSizePolicy, QHBoxLayout
from bauh.api.abstract.cache import MemoryCache
from bauh.api.http import HttpClient
from bauh.view.qt import qt_utils, styles
from bauh.view.qt import qt_utils
from bauh.view.qt.components import new_spacer
from bauh.view.qt.thread import AnimateProgress
from bauh.view.qt.view_model import PackageView
@@ -17,9 +18,6 @@ from bauh.view.util.translation import I18n
class ScreenshotsDialog(QDialog):
MAX_HEIGHT = 600
MAX_WIDTH = 800
def __init__(self, pkg: PackageView, http_client: HttpClient, icon_cache: MemoryCache, i18n: I18n, screenshots: List[QPixmap], logger: logging.Logger):
super(ScreenshotsDialog, self).__init__()
self.setWindowTitle(str(pkg))
@@ -27,12 +25,11 @@ class ScreenshotsDialog(QDialog):
self.logger = logger
self.loaded_imgs = []
self.download_threads = []
self.resize(1280, 720)
self.i18n = i18n
self.http_client = http_client
self.progress_bar = QProgressBar()
self.progress_bar.setObjectName('progress_screenshots')
self.progress_bar.setCursor(QCursor(Qt.WaitCursor))
self.progress_bar.setStyleSheet(styles.PROGRESS_BAR)
self.progress_bar.setMaximumHeight(10 if QApplication.instance().style().objectName().lower() == 'windows' else 6)
self.progress_bar.setTextVisible(False)
self.thread_progress = AnimateProgress()
@@ -50,39 +47,48 @@ class ScreenshotsDialog(QDialog):
self.setWindowIcon(QIcon(pkg.model.get_type_icon_path()))
self.setLayout(QVBoxLayout())
self.layout().addWidget(new_spacer())
self.img = QLabel()
self.img.setObjectName('image')
self.layout().addWidget(self.img)
self.layout().addWidget(new_spacer())
self.bottom_bar = QToolBar()
self.container_buttons = QWidget()
self.container_buttons.setObjectName('buttons_container')
self.container_buttons.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
self.container_buttons.setContentsMargins(0, 0, 0, 0)
self.container_buttons.setLayout(QHBoxLayout())
self.bt_back = QPushButton(' < ' + self.i18n['screenshots.bt_back.label'].capitalize())
self.bt_back.setObjectName('back')
self.bt_back.setCursor(QCursor(Qt.PointingHandCursor))
self.bt_back.clicked.connect(self.back)
self.ref_bt_back = self.bottom_bar.addWidget(self.bt_back)
self.bottom_bar.addWidget(new_spacer(50))
self.container_buttons.layout().addWidget(self.bt_back)
self.container_buttons.layout().addWidget(new_spacer())
self.img_label = QLabel()
self.img_label.setCursor(QCursor(Qt.WaitCursor))
self.img_label.setStyleSheet('QLabel { font-weight: bold; text-align: center }')
self.ref_img_label = self.bottom_bar.addWidget(self.img_label)
self.ref_img_label.setVisible(False)
self.ref_progress_bar = self.bottom_bar.addWidget(self.progress_bar)
self.bottom_bar.addWidget(new_spacer(50))
self.container_buttons.layout().addWidget(self.progress_bar)
self.container_buttons.layout().addWidget(new_spacer())
self.bt_next = QPushButton(self.i18n['screenshots.bt_next.label'].capitalize() + ' > ')
self.bt_next.setObjectName('next')
self.bt_next.setCursor(QCursor(Qt.PointingHandCursor))
self.bt_next.clicked.connect(self.next)
self.ref_bt_next = self.bottom_bar.addWidget(self.bt_next)
self.container_buttons.layout().addWidget(self.bt_next)
self.layout().addWidget(self.bottom_bar)
self.layout().addWidget(self.container_buttons)
self.img_idx = 0
screen_size = QApplication.primaryScreen().size()
self.max_img_width = int(screen_size.width() * 0.585651537)
self.max_img_height = int(screen_size.height() * 0.78125)
for idx, s in enumerate(self.screenshots):
t = Thread(target=self._download_img, args=(idx, s), daemon=True)
t.start()
self.resize(self.max_img_width, self.max_img_height)
self._load_img()
qt_utils.centralize(self)
def _update_progress(self, val: int):
self.progress_bar.setValue(val)
@@ -92,32 +98,28 @@ class ScreenshotsDialog(QDialog):
img = self.loaded_imgs[self.img_idx]
if isinstance(img, QPixmap):
self.img_label.setText('')
self.img.setText('')
self.img.setPixmap(img)
else:
self.img_label.setText(img)
self.img.setText(img)
self.img.setPixmap(QPixmap())
self.img.unsetCursor()
self.thread_progress.stop = True
self.ref_progress_bar.setVisible(False)
self.ref_img_label.setVisible(True)
self.progress_bar.setVisible(False)
else:
self.img.setPixmap(QPixmap())
self.img.setCursor(QCursor(Qt.WaitCursor))
self.ref_img_label.setVisible(False)
self.ref_progress_bar.setVisible(True)
self.img.setText('{}...'.format(self.i18n['screenshots.image.loading']))
self.progress_bar.setVisible(True)
self.thread_progress.start()
if len(self.screenshots) == 1:
self.ref_bt_back.setVisible(False)
self.ref_bt_next.setVisible(False)
self.bt_back.setVisible(False)
self.bt_next.setVisible(False)
else:
self.ref_bt_back.setEnabled(self.img_idx != 0)
self.ref_bt_next.setEnabled(self.img_idx != len(self.screenshots) - 1)
self.adjustSize()
qt_utils.centralize(self)
self.bt_back.setEnabled(self.img_idx != 0)
self.bt_next.setEnabled(self.img_idx != len(self.screenshots) - 1)
def _download_img(self, idx: int, url: str):
self.logger.info('Downloading image [{}] from {}'.format(idx, url))
@@ -133,8 +135,8 @@ class ScreenshotsDialog(QDialog):
pixmap = QPixmap()
pixmap.loadFromData(res.content)
if pixmap.size().height() > self.MAX_HEIGHT or pixmap.size().width() > self.MAX_WIDTH:
pixmap = pixmap.scaled(self.MAX_WIDTH, self.MAX_HEIGHT, Qt.KeepAspectRatio, Qt.SmoothTransformation)
if pixmap.size().height() > self.max_img_height or pixmap.size().width() > self.max_img_width:
pixmap = pixmap.scaled(self.max_img_width, self.max_img_height, Qt.KeepAspectRatio, Qt.SmoothTransformation)
self.loaded_imgs.append(pixmap)

View File

@@ -1,16 +1,18 @@
import gc
from io import StringIO
from typing import Optional
from PyQt5.QtCore import QSize, Qt, QCoreApplication
from PyQt5.QtGui import QCursor
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QToolBar, QSizePolicy, QPushButton
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QSizePolicy, QPushButton, QHBoxLayout
from bauh import __app_name__
from bauh.api.abstract.controller import SoftwareManager
from bauh.api.abstract.view import MessageType
from bauh.view.core.controller import GenericSoftwareManager
from bauh.view.qt import dialog, css
from bauh.view.qt import dialog
from bauh.view.qt.components import to_widget, new_spacer
from bauh.view.qt.dialog import ConfirmationDialog
from bauh.view.qt.qt_utils import centralize
from bauh.view.util import util
from bauh.view.util.translation import I18n
@@ -18,7 +20,7 @@ from bauh.view.util.translation import I18n
class SettingsWindow(QWidget):
def __init__(self, manager: SoftwareManager, i18n: I18n, screen_size: QSize, window: QWidget, parent: QWidget = None):
def __init__(self, manager: SoftwareManager, i18n: I18n, screen_size: QSize, window: QWidget, parent: Optional[QWidget] = None):
super(SettingsWindow, self).__init__(parent=parent, flags=Qt.CustomizeWindowHint | Qt.WindowTitleHint)
self.setWindowTitle('{} ({})'.format(i18n['settings'].capitalize(), __app_name__))
self.setLayout(QVBoxLayout())
@@ -30,28 +32,34 @@ class SettingsWindow(QWidget):
self.settings_model = self.manager.get_settings(screen_size.width(), screen_size.height())
tab_group = to_widget(self.settings_model, i18n)
tab_group.setMinimumWidth(int(screen_size.width() / 3))
tab_group.setObjectName('settings')
self.layout().addWidget(tab_group)
action_bar = QToolBar()
action_bar.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
lower_container = QWidget()
lower_container.setObjectName('lower_container')
lower_container.setProperty('container', 'true')
lower_container.setLayout(QHBoxLayout())
lower_container.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
bt_close = QPushButton()
bt_close.setObjectName('cancel')
bt_close.setAutoDefault(True)
bt_close.setCursor(QCursor(Qt.PointingHandCursor))
bt_close.setText(self.i18n['close'].capitalize())
bt_close.clicked.connect(lambda: self.close())
action_bar.addWidget(bt_close)
lower_container.layout().addWidget(bt_close)
action_bar.addWidget(new_spacer())
lower_container.layout().addWidget(new_spacer())
bt_change = QPushButton()
bt_change.setAutoDefault(True)
bt_change.setObjectName('ok')
bt_change.setCursor(QCursor(Qt.PointingHandCursor))
bt_change.setStyleSheet(css.OK_BUTTON)
bt_change.setText(self.i18n['change'].capitalize())
bt_change.clicked.connect(self._save_settings)
action_bar.addWidget(bt_change)
lower_container.layout().addWidget(bt_change)
self.layout().addWidget(action_bar)
self.layout().addWidget(lower_container)
def show(self):
super(SettingsWindow, self).show()
@@ -83,10 +91,10 @@ class SettingsWindow(QWidget):
body=self.i18n['settings.changed.success.warning'],
type_=MessageType.INFO)
QCoreApplication.exit()
elif dialog.ask_confirmation(title=self.i18n['warning'].capitalize(),
body="<p>{}</p><p>{}</p>".format(self.i18n['settings.changed.success.warning'],
self.i18n['settings.changed.success.reboot']),
i18n=self.i18n):
elif ConfirmationDialog(title=self.i18n['warning'].capitalize(),
body="<p>{}</p><p>{}</p>".format(self.i18n['settings.changed.success.warning'],
self.i18n['settings.changed.success.reboot']),
i18n=self.i18n).ask():
self.close()
util.restart_app()
else:
@@ -109,4 +117,4 @@ class SettingsWindow(QWidget):
msg.write('<p style="font-weight: bold">* ' + w + '</p><br/>')
msg.seek(0)
dialog.show_message(title="Warning", body=msg.read(), type_=MessageType.WARNING)
dialog.show_message(title=self.i18n['warning'].capitalize(), body=msg.read(), type_=MessageType.WARNING)

View File

@@ -1,3 +0,0 @@
from bauh.view.qt.colors import GREEN
PROGRESS_BAR = """QProgressBar::chunk { background-color: %s; }""" % GREEN

View File

@@ -5,11 +5,12 @@ import traceback
from datetime import datetime, timedelta
from io import StringIO
from pathlib import Path
from typing import List, Type, Set, Tuple
from typing import List, Type, Set, Tuple, Optional
import requests
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QWidget
from bauh import LOGS_PATH
from bauh.api.abstract.cache import MemoryCache
@@ -22,7 +23,7 @@ from bauh.api.exception import NoInternetException
from bauh.commons import user
from bauh.commons.html import bold
from bauh.commons.system import get_human_size_str, ProcessHandler, SimpleProcess
from bauh.view.core import timeshift
from bauh.view.core import timeshift, config
from bauh.view.core.config import read_config
from bauh.view.qt import commons
from bauh.view.qt.view_model import PackageView, PackageViewStatus
@@ -43,7 +44,7 @@ class AsyncAction(QThread, ProcessWatcher):
signal_root_password = pyqtSignal()
signal_progress_control = pyqtSignal(bool)
def __init__(self):
def __init__(self, root_password: Optional[Tuple[bool, str]] = None):
super(AsyncAction, self).__init__()
self.wait_confirmation = False
self.confirmation_res = None
@@ -62,7 +63,7 @@ class AsyncAction(QThread, ProcessWatcher):
self.wait_user()
return self.confirmation_res
def request_root_password(self) -> Tuple[str, bool]:
def request_root_password(self) -> Tuple[bool, Optional[str]]:
self.wait_confirmation = True
self.signal_root_password.emit()
self.wait_user()
@@ -74,8 +75,8 @@ class AsyncAction(QThread, ProcessWatcher):
self.confirmation_res = res
self.wait_confirmation = False
def set_root_password(self, password: str, valid: bool):
self.root_password = (password, valid)
def set_root_password(self, valid: bool, password: str):
self.root_password = (valid, password)
self.wait_confirmation = False
def wait_user(self):
@@ -286,9 +287,9 @@ class UpgradeSelected(AsyncAction):
return FormComponent(label=lb, components=comps), (required_size, extra_size)
def _request_password(self) -> Tuple[bool, str]:
def _request_password(self) -> Tuple[bool, Optional[str]]:
if not user.is_root():
pwd, success = self.request_root_password()
success, pwd = self.request_root_password()
if not success:
return False, None
@@ -1006,3 +1007,20 @@ class IgnorePackageUpdates(AsyncAction):
finally:
self.pkg = None
class SaveTheme(QThread):
def __init__(self, theme_key: Optional[str], parent: Optional[QWidget] = None):
super(SaveTheme, self).__init__(parent=parent)
self.theme_key = theme_key
def run(self):
if self.theme_key:
core_config = read_config()
core_config['ui']['theme'] = self.theme_key
try:
config.save(core_config)
except:
traceback.print_exc()

View File

@@ -1,16 +1,15 @@
import logging
import logging
import operator
import time
import traceback
from pathlib import Path
from typing import List, Type, Set, Tuple
from typing import List, Type, Set, Tuple, Optional
from PyQt5.QtCore import QEvent, Qt, QSize, pyqtSignal
from PyQt5.QtCore import QEvent, Qt, pyqtSignal
from PyQt5.QtGui import QIcon, QWindowStateChangeEvent, QCursor
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QCheckBox, QHeaderView, QToolBar, \
QLabel, QPlainTextEdit, QLineEdit, QProgressBar, QPushButton, QComboBox, QApplication, QListView, QSizePolicy, \
QMenu, QAction
QLabel, QPlainTextEdit, QProgressBar, QPushButton, QComboBox, QApplication, QListView, QSizePolicy, \
QMenu, QHBoxLayout
from bauh import LOGS_PATH
from bauh.api.abstract.cache import MemoryCache
@@ -21,16 +20,20 @@ from bauh.api.abstract.view import MessageType
from bauh.api.http import HttpClient
from bauh.commons import user
from bauh.commons.html import bold
from bauh.context import set_theme
from bauh.stylesheet import read_all_themes_metadata, ThemeMetadata
from bauh.view.core.config import read_config
from bauh.view.core.tray_client import notify_tray
from bauh.view.qt import dialog, commons, qt_utils, root, styles
from bauh.view.qt import dialog, commons, qt_utils
from bauh.view.qt.about import AboutDialog
from bauh.view.qt.apps_table import AppsTable, UpdateToggleButton
from bauh.view.qt.colors import GREEN
from bauh.view.qt.components import new_spacer, InputFilter, IconButton, QtComponentsManager
from bauh.view.qt.confirmation import ConfirmationDialog
from bauh.view.qt.apps_table import PackagesTable, UpgradeToggleButton
from bauh.view.qt.commons import sum_updates_displayed
from bauh.view.qt.components import new_spacer, IconButton, QtComponentsManager, to_widget, QSearchBar, \
QCustomMenuAction
from bauh.view.qt.dialog import ConfirmationDialog
from bauh.view.qt.history import HistoryDialog
from bauh.view.qt.info import InfoDialog
from bauh.view.qt.root import ask_root_password
from bauh.view.qt.root import RootDialog
from bauh.view.qt.screenshots import ScreenshotsDialog
from bauh.view.qt.settings import SettingsWindow
from bauh.view.qt.thread import UpgradeSelected, RefreshApps, UninstallPackage, DowngradePackage, ShowPackageInfo, \
@@ -38,7 +41,7 @@ from bauh.view.qt.thread import UpgradeSelected, RefreshApps, UninstallPackage,
ListWarnings, \
AsyncAction, LaunchPackage, ApplyFilters, CustomSoftwareAction, ShowScreenshots, CustomAction, \
NotifyInstalledLoaded, \
IgnorePackageUpdates
IgnorePackageUpdates, SaveTheme
from bauh.view.qt.view_model import PackageView, PackageViewStatus
from bauh.view.util import util, resource
from bauh.view.util.translation import I18n
@@ -46,19 +49,6 @@ from bauh.view.util.translation import I18n
DARK_ORANGE = '#FF4500'
def toolbar_button_style(bg: str = None, color: str = None):
style = 'QPushButton { font-weight: 500;'
if bg:
style += 'background: {};'.format(bg)
if color:
style += 'color: {};'.format(color)
style += ' }'
return style
# action ids
ACTION_APPLY_FILTERS = 1
ACTION_SEARCH = 2
@@ -84,10 +74,11 @@ CHECK_APPS = 7
COMBO_TYPES = 8
COMBO_CATEGORIES = 9
INP_NAME = 10
CHECK_CONSOLE = 11
CHECK_DETAILS = 11
BT_SETTINGS = 12
BT_CUSTOM_ACTIONS = 13
BT_ABOUT = 14
BT_THEMES = 15
# component groups ids
GROUP_FILTERS = 1
@@ -99,13 +90,14 @@ GROUP_LOWER_BTS = 5
class ManageWindow(QWidget):
signal_user_res = pyqtSignal(bool)
signal_root_password = pyqtSignal(str, bool)
signal_root_password = pyqtSignal(bool, str)
signal_table_update = pyqtSignal()
signal_stop_notifying = pyqtSignal()
def __init__(self, i18n: I18n, icon_cache: MemoryCache, manager: SoftwareManager, screen_size, config: dict,
context: ApplicationContext, http_client: HttpClient, logger: logging.Logger, icon: QIcon):
super(ManageWindow, self).__init__()
self.setObjectName('manage_window')
self.comp_manager = QtComponentsManager()
self.i18n = i18n
self.logger = logger
@@ -127,95 +119,56 @@ class ManageWindow(QWidget):
self.layout = QVBoxLayout()
self.setLayout(self.layout)
self.toolbar_top = QToolBar()
self.toolbar_top.addWidget(new_spacer())
self.toolbar_status = QToolBar()
self.toolbar_status.setObjectName('toolbar_status')
self.toolbar_status.addWidget(new_spacer())
self.label_status = QLabel()
self.label_status.setObjectName('label_status')
self.label_status.setText('')
self.label_status.setStyleSheet("font-weight: bold")
self.toolbar_top.addWidget(self.label_status)
self.toolbar_status.addWidget(self.label_status)
self.search_bar = QToolBar()
self.search_bar.setStyleSheet("spacing: 0px;")
self.search_bar.setContentsMargins(0, 0, 0, 0)
self.search_bar = QSearchBar(search_callback=self.search)
self.search_bar.set_placeholder(i18n['window_manage.search_bar.placeholder'] + "...")
self.search_bar.set_tooltip(i18n['window_manage.search_bar.tooltip'])
self.search_bar.set_button_tooltip(i18n['window_manage.search_bar.button_tooltip'])
self.comp_manager.register_component(SEARCH_BAR, self.search_bar, self.toolbar_status.addWidget(self.search_bar))
self.inp_search = QLineEdit()
self.inp_search.setFrame(False)
self.inp_search.setPlaceholderText(self.i18n['window_manage.input_search.placeholder'] + "...")
self.inp_search.setToolTip(self.i18n['window_manage.input_search.tooltip'])
self.inp_search.setStyleSheet("""QLineEdit {
color: grey;
spacing: 0;
height: 30px;
font-size: 12px;
width: 300px;
border-bottom: 1px solid lightgrey;
border-top: 1px solid lightgrey;
}
""")
self.inp_search.returnPressed.connect(self.search)
search_background_color = self.inp_search.palette().color(self.inp_search.backgroundRole()).name()
self.toolbar_status.addWidget(new_spacer())
self.layout.addWidget(self.toolbar_status)
label_pre_search = QLabel()
label_pre_search.setStyleSheet("""
border-top-left-radius: 5px;
border-bottom-left-radius: 5px;
border-left: 1px solid lightgrey;
border-top: 1px solid lightgrey;
border-bottom: 1px solid lightgrey;
background: %s;
""" % search_background_color)
self.search_bar.addWidget(label_pre_search)
self.search_bar.addWidget(self.inp_search)
label_pos_search = QLabel()
label_pos_search.setPixmap(QIcon(resource.get_path('img/search.svg')).pixmap(QSize(10, 10)))
label_pos_search.setStyleSheet("""
padding-right: 10px;
border-top-right-radius: 5px;
border-bottom-right-radius: 5px;
border-right: 1px solid lightgrey;
border-top: 1px solid lightgrey;
border-bottom: 1px solid lightgrey;
background: %s;
""" % search_background_color)
self.search_bar.addWidget(label_pos_search)
self.comp_manager.register_component(SEARCH_BAR, self.search_bar, self.toolbar_top.addWidget(self.search_bar))
self.toolbar_top.addWidget(new_spacer())
self.layout.addWidget(self.toolbar_top)
self.toolbar = QToolBar()
self.toolbar.setStyleSheet('QToolBar {spacing: 4px; margin-top: 15px;}')
self.toolbar.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
self.toolbar.setContentsMargins(0, 0, 0, 0)
self.toolbar_filters = QWidget()
self.toolbar_filters.setObjectName('table_filters')
self.toolbar_filters.setLayout(QHBoxLayout())
self.toolbar_filters.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
self.toolbar_filters.setContentsMargins(0, 0, 0, 0)
self.check_updates = QCheckBox()
self.check_updates.setObjectName('check_updates')
self.check_updates.setCursor(QCursor(Qt.PointingHandCursor))
self.check_updates.setText(self.i18n['updates'].capitalize())
self.check_updates.stateChanged.connect(self._handle_updates_filter)
self.check_updates.sizePolicy().setRetainSizeWhenHidden(True)
self.comp_manager.register_component(CHECK_UPDATES, self.check_updates, self.toolbar.addWidget(self.check_updates))
self.toolbar_filters.layout().addWidget(self.check_updates)
self.comp_manager.register_component(CHECK_UPDATES, self.check_updates)
self.check_apps = QCheckBox()
self.check_apps.setObjectName('check_apps')
self.check_apps.setCursor(QCursor(Qt.PointingHandCursor))
self.check_apps.setText(self.i18n['manage_window.checkbox.only_apps'])
self.check_apps.setChecked(True)
self.check_apps.stateChanged.connect(self._handle_filter_only_apps)
self.check_apps.sizePolicy().setRetainSizeWhenHidden(True)
self.comp_manager.register_component(CHECK_APPS, self.check_apps, self.toolbar.addWidget(self.check_apps))
self.toolbar_filters.layout().addWidget(self.check_apps)
self.comp_manager.register_component(CHECK_APPS, self.check_apps)
self.any_type_filter = 'any'
self.cache_type_filter_icons = {}
self.combo_filter_type = QComboBox()
self.combo_filter_type.setObjectName('combo_types')
self.combo_filter_type.setCursor(QCursor(Qt.PointingHandCursor))
self.combo_filter_type.setView(QListView())
self.combo_filter_type.setStyleSheet('QLineEdit { height: 2px; }')
self.combo_filter_type.setIconSize(QSize(14, 14))
self.combo_filter_type.view().setCursor(QCursor(Qt.PointingHandCursor))
self.combo_filter_type.setSizeAdjustPolicy(QComboBox.AdjustToContents)
self.combo_filter_type.setEditable(True)
self.combo_filter_type.lineEdit().setReadOnly(True)
@@ -223,78 +176,73 @@ class ManageWindow(QWidget):
self.combo_filter_type.activated.connect(self._handle_type_filter)
self.combo_filter_type.addItem('--- {} ---'.format(self.i18n['type'].capitalize()), self.any_type_filter)
self.combo_filter_type.sizePolicy().setRetainSizeWhenHidden(True)
self.comp_manager.register_component(COMBO_TYPES, self.combo_filter_type, self.toolbar.addWidget(self.combo_filter_type))
self.toolbar_filters.layout().addWidget(self.combo_filter_type)
self.comp_manager.register_component(COMBO_TYPES, self.combo_filter_type)
self.any_category_filter = 'any'
self.combo_categories = QComboBox()
self.combo_categories.setObjectName('combo_categories')
self.combo_categories.setCursor(QCursor(Qt.PointingHandCursor))
self.combo_categories.setStyleSheet('QLineEdit { height: 2px; }')
self.combo_categories.setSizeAdjustPolicy(QComboBox.AdjustToContents)
self.combo_categories.view().setCursor(QCursor(Qt.PointingHandCursor))
self.combo_categories.setEditable(True)
self.combo_categories.lineEdit().setReadOnly(True)
self.combo_categories.lineEdit().setAlignment(Qt.AlignCenter)
self.combo_categories.activated.connect(self._handle_category_filter)
self.combo_categories.sizePolicy().setRetainSizeWhenHidden(True)
self.combo_categories.addItem('--- {} ---'.format(self.i18n['category'].capitalize()), self.any_category_filter)
self.comp_manager.register_component(COMBO_CATEGORIES, self.combo_categories, self.toolbar.addWidget(self.combo_categories))
self.toolbar_filters.layout().addWidget(self.combo_categories)
self.comp_manager.register_component(COMBO_CATEGORIES, self.combo_categories)
self.input_name = InputFilter(self.begin_apply_filters)
self.input_name.setPlaceholderText(self.i18n['manage_window.name_filter.placeholder'] + '...')
self.input_name.setToolTip(self.i18n['manage_window.name_filter.tooltip'])
self.input_name.setStyleSheet("QLineEdit { color: grey; }")
self.input_name.setFixedWidth(130)
self.input_name = QSearchBar(search_callback=self.begin_apply_filters)
self.input_name.palette().swap(self.combo_categories.palette())
self.input_name.setObjectName('name_filter')
self.input_name.set_placeholder(self.i18n['manage_window.name_filter.placeholder'] + '...')
self.input_name.set_tooltip(self.i18n['manage_window.name_filter.tooltip'])
self.input_name.set_button_tooltip(self.i18n['manage_window.name_filter.button_tooltip'])
self.input_name.sizePolicy().setRetainSizeWhenHidden(True)
self.comp_manager.register_component(INP_NAME, self.input_name, self.toolbar.addWidget(self.input_name))
self.toolbar_filters.layout().addWidget(self.input_name)
self.comp_manager.register_component(INP_NAME, self.input_name)
self.toolbar.addWidget(new_spacer())
self.toolbar_filters.layout().addWidget(new_spacer())
toolbar_bts = []
if config['suggestions']['enabled']:
bt_sugs = QPushButton()
bt_sugs.setCursor(QCursor(Qt.PointingHandCursor))
bt_sugs.setToolTip(self.i18n['manage_window.bt.suggestions.tooltip'])
bt_sugs.setText(self.i18n['manage_window.bt.suggestions.text'].capitalize())
bt_sugs.setIcon(QIcon(resource.get_path('img/suggestions.svg')))
bt_sugs.setStyleSheet(toolbar_button_style())
bt_sugs.clicked.connect(lambda: self._begin_load_suggestions(filter_installed=True))
bt_sugs.sizePolicy().setRetainSizeWhenHidden(True)
ref_bt_sugs = self.toolbar.addWidget(bt_sugs)
toolbar_bts.append(bt_sugs)
self.comp_manager.register_component(BT_SUGGESTIONS, bt_sugs, ref_bt_sugs)
bt_inst = QPushButton()
bt_inst.setObjectName('bt_installed')
bt_inst.setProperty('root', 'true')
bt_inst.setCursor(QCursor(Qt.PointingHandCursor))
bt_inst.setToolTip(self.i18n['manage_window.bt.installed.tooltip'])
bt_inst.setIcon(QIcon(resource.get_path('img/disk.svg')))
bt_inst.setText(self.i18n['manage_window.bt.installed.text'].capitalize())
bt_inst.clicked.connect(self._begin_loading_installed)
bt_inst.setStyleSheet(toolbar_button_style())
bt_inst.sizePolicy().setRetainSizeWhenHidden(True)
toolbar_bts.append(bt_inst)
self.comp_manager.register_component(BT_INSTALLED, bt_inst, self.toolbar.addWidget(bt_inst))
self.toolbar_filters.layout().addWidget(bt_inst)
self.comp_manager.register_component(BT_INSTALLED, bt_inst)
bt_ref = QPushButton()
bt_ref.setObjectName('bt_refresh')
bt_ref.setProperty('root', 'true')
bt_ref.setCursor(QCursor(Qt.PointingHandCursor))
bt_ref.setToolTip(i18n['manage_window.bt.refresh.tooltip'])
bt_ref.setIcon(QIcon(resource.get_path('img/refresh.svg')))
bt_ref.setText(self.i18n['manage_window.bt.refresh.text'])
bt_ref.setStyleSheet(toolbar_button_style())
bt_ref.clicked.connect(self.begin_refresh_packages)
bt_ref.sizePolicy().setRetainSizeWhenHidden(True)
toolbar_bts.append(bt_ref)
self.comp_manager.register_component(BT_REFRESH, bt_ref, self.toolbar.addWidget(bt_ref))
self.toolbar_filters.layout().addWidget(bt_ref)
self.comp_manager.register_component(BT_REFRESH, bt_ref)
self.bt_upgrade = QPushButton()
self.bt_upgrade.setProperty('root', 'true')
self.bt_upgrade.setObjectName('bt_upgrade')
self.bt_upgrade.setCursor(QCursor(Qt.PointingHandCursor))
self.bt_upgrade.setToolTip(i18n['manage_window.bt.upgrade.tooltip'])
self.bt_upgrade.setIcon(QIcon(resource.get_path('img/app_update.svg')))
self.bt_upgrade.setText(i18n['manage_window.bt.upgrade.text'])
self.bt_upgrade.setStyleSheet(toolbar_button_style(GREEN, 'white'))
self.bt_upgrade.clicked.connect(self.upgrade_selected)
self.bt_upgrade.sizePolicy().setRetainSizeWhenHidden(True)
toolbar_bts.append(self.bt_upgrade)
self.comp_manager.register_component(BT_UPGRADE, self.bt_upgrade, self.toolbar.addWidget(self.bt_upgrade))
self.toolbar_filters.layout().addWidget(self.bt_upgrade)
self.comp_manager.register_component(BT_UPGRADE, self.bt_upgrade)
# setting all buttons to the same size:
bt_biggest_size = 0
@@ -308,44 +256,59 @@ class ManageWindow(QWidget):
if bt_biggest_size > bt_width:
bt.setFixedWidth(bt_biggest_size)
self.layout.addWidget(self.toolbar)
self.layout.addWidget(self.toolbar_filters)
self.table_container = QWidget()
self.table_container.setObjectName('table_container')
self.table_container.setContentsMargins(0, 0, 0, 0)
self.table_container.setLayout(QVBoxLayout())
self.table_container.layout().setContentsMargins(0, 0, 0, 0)
self.table_apps = AppsTable(self, self.icon_cache, download_icons=bool(self.config['download']['icons']))
self.table_apps = PackagesTable(self, self.icon_cache, download_icons=bool(self.config['download']['icons']))
self.table_apps.change_headers_policy()
self.table_container.layout().addWidget(self.table_apps)
self.layout.addWidget(self.table_container)
toolbar_console = QToolBar()
self.toolbar_console = QWidget()
self.toolbar_console.setObjectName('console_toolbar')
self.toolbar_console.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
self.toolbar_console.setLayout(QHBoxLayout())
self.toolbar_console.setContentsMargins(0, 0, 0, 0)
self.check_console = QCheckBox()
self.check_console.setCursor(QCursor(Qt.PointingHandCursor))
self.check_console.setText(self.i18n['manage_window.checkbox.show_details'])
self.check_console.stateChanged.connect(self._handle_console)
self.comp_manager.register_component(CHECK_CONSOLE, self.check_console, toolbar_console.addWidget(self.check_console))
self.check_details = QCheckBox()
self.check_details.setObjectName('check_details')
self.check_details.setCursor(QCursor(Qt.PointingHandCursor))
self.check_details.setText(self.i18n['manage_window.checkbox.show_details'])
self.check_details.stateChanged.connect(self._handle_console)
self.toolbar_console.layout().addWidget(self.check_details)
self.comp_manager.register_component(CHECK_DETAILS, self.check_details)
toolbar_console.addWidget(new_spacer())
self.toolbar_console.layout().addWidget(new_spacer())
self.label_displayed = QLabel()
toolbar_console.addWidget(self.label_displayed)
self.label_displayed.setObjectName('apps_displayed')
self.label_displayed.setCursor(QCursor(Qt.WhatsThisCursor))
self.label_displayed.setToolTip(self.i18n['manage_window.label.apps_displayed.tip'])
self.toolbar_console.layout().addWidget(self.label_displayed)
self.label_displayed.hide()
self.layout.addWidget(toolbar_console)
self.layout.addWidget(self.toolbar_console)
self.textarea_output = QPlainTextEdit(self)
self.textarea_output.resize(self.table_apps.size())
self.textarea_output.setStyleSheet("background: black; color: white;")
self.layout.addWidget(self.textarea_output)
self.textarea_output.setVisible(False)
self.textarea_output.setReadOnly(True)
self.textarea_details = QPlainTextEdit(self)
self.textarea_details.setObjectName('textarea_details')
self.textarea_details.setProperty('console', 'true')
self.textarea_details.resize(self.table_apps.size())
self.layout.addWidget(self.textarea_details)
self.textarea_details.setVisible(False)
self.textarea_details.setReadOnly(True)
self.toolbar_substatus = QToolBar()
self.toolbar_substatus.setObjectName('toolbar_substatus')
self.toolbar_substatus.addWidget(new_spacer())
self.label_substatus = QLabel()
self.label_substatus.setObjectName('label_substatus')
self.label_substatus.setCursor(QCursor(Qt.WaitCursor))
self.toolbar_substatus.addWidget(self.label_substatus)
self.toolbar_substatus.addWidget(new_spacer())
@@ -383,43 +346,65 @@ class ManageWindow(QWidget):
self.thread_ignore_updates = IgnorePackageUpdates(manager=self.manager)
self._bind_async_action(self.thread_ignore_updates, finished_call=self.finish_ignore_updates)
self.toolbar_bottom = QToolBar()
self.toolbar_bottom.setIconSize(QSize(16, 16))
self.toolbar_bottom.setStyleSheet('QToolBar { spacing: 3px }')
self.container_bottom = QWidget()
self.container_bottom.setObjectName('container_bottom')
self.container_bottom.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
self.container_bottom.setLayout(QHBoxLayout())
self.setContentsMargins(0, 0, 0, 0)
self.container_bottom.layout().setContentsMargins(0, 0, 0, 0)
self.toolbar_bottom.addWidget(new_spacer())
self.container_bottom.layout().addWidget(new_spacer())
self.progress_bar = QProgressBar()
self.progress_bar.setObjectName('progress_manage')
self.progress_bar.setCursor(QCursor(Qt.WaitCursor))
self.progress_bar.setStyleSheet(styles.PROGRESS_BAR)
self.progress_bar.setMaximumHeight(10 if QApplication.instance().style().objectName().lower() == 'windows' else 4)
self.progress_bar.setTextVisible(False)
self.ref_progress_bar = self.toolbar_bottom.addWidget(self.progress_bar)
self.container_bottom.layout().addWidget(self.progress_bar)
self.toolbar_bottom.addWidget(new_spacer())
self.container_bottom.layout().addWidget(new_spacer())
if config['suggestions']['enabled']:
bt_sugs = IconButton(action=lambda: self._begin_load_suggestions(filter_installed=True),
i18n=i18n,
tooltip=self.i18n['manage_window.bt.suggestions.tooltip'])
bt_sugs.setObjectName('suggestions')
self.container_bottom.layout().addWidget(bt_sugs)
self.comp_manager.register_component(BT_SUGGESTIONS, bt_sugs)
bt_themes = IconButton(self.show_themes,
i18n=self.i18n,
tooltip=self.i18n['manage_window.bt_themes.tip'])
bt_themes.setObjectName('themes')
self.container_bottom.layout().addWidget(bt_themes)
self.comp_manager.register_component(BT_THEMES, bt_themes)
self.custom_actions = manager.get_custom_actions()
bt_custom_actions = IconButton(QIcon(resource.get_path('img/custom_actions.svg')),
action=self.show_custom_actions,
bt_custom_actions = IconButton(action=self.show_custom_actions,
i18n=self.i18n,
tooltip=self.i18n['manage_window.bt_custom_actions.tip'])
bt_custom_actions.setVisible(bool(self.custom_actions))
self.comp_manager.register_component(BT_CUSTOM_ACTIONS, bt_custom_actions, self.toolbar_bottom.addWidget(bt_custom_actions))
bt_custom_actions.setObjectName('custom_actions')
bt_settings = IconButton(QIcon(resource.get_path('img/settings.svg')),
action=self.show_settings,
bt_custom_actions.setVisible(bool(self.custom_actions))
self.container_bottom.layout().addWidget(bt_custom_actions)
self.comp_manager.register_component(BT_CUSTOM_ACTIONS, bt_custom_actions)
bt_settings = IconButton(action=self.show_settings,
i18n=self.i18n,
tooltip=self.i18n['manage_window.bt_settings.tooltip'])
self.comp_manager.register_component(BT_SETTINGS, bt_settings, self.toolbar_bottom.addWidget(bt_settings))
bt_settings.setObjectName('settings')
self.container_bottom.layout().addWidget(bt_settings)
self.comp_manager.register_component(BT_SETTINGS, bt_settings)
bt_about = IconButton(QIcon(resource.get_path('img/info.svg')),
action=self._show_about,
bt_about = IconButton(action=self._show_about,
i18n=self.i18n,
tooltip=self.i18n['manage_window.settings.about'])
self.comp_manager.register_component(BT_ABOUT, bt_about, self.toolbar_bottom.addWidget(bt_about))
bt_about.setObjectName('about')
self.container_bottom.layout().addWidget(bt_about)
self.comp_manager.register_component(BT_ABOUT, bt_about)
self.layout.addWidget(self.toolbar_bottom)
self.layout.addWidget(self.container_bottom)
qt_utils.centralize(self)
@@ -442,6 +427,8 @@ class ManageWindow(QWidget):
self.settings_window = None
self.search_performed = False
self.thread_save_theme = SaveTheme(theme_key='')
self.thread_load_installed = NotifyInstalledLoaded()
self.thread_load_installed.signal_loaded.connect(self._finish_loading_installed)
self.setMinimumHeight(int(screen_size.height() * 0.5))
@@ -457,14 +444,14 @@ class ManageWindow(QWidget):
BT_INSTALLED, BT_SUGGESTIONS) # buttons
self.comp_manager.register_group(GROUP_VIEW_INSTALLED, False,
BT_SUGGESTIONS, BT_REFRESH, BT_UPGRADE, # buttons
BT_REFRESH, BT_UPGRADE, # buttons
*filters)
self.comp_manager.register_group(GROUP_UPPER_BAR, False,
CHECK_APPS, CHECK_UPDATES, COMBO_CATEGORIES, COMBO_TYPES, INP_NAME,
BT_INSTALLED, BT_SUGGESTIONS, BT_REFRESH, BT_UPGRADE)
self.comp_manager.register_group(GROUP_LOWER_BTS, False, BT_ABOUT, BT_SETTINGS, BT_CUSTOM_ACTIONS)
self.comp_manager.register_group(GROUP_LOWER_BTS, False, BT_SUGGESTIONS, BT_THEMES, BT_CUSTOM_ACTIONS, BT_SETTINGS, BT_ABOUT)
def update_custom_actions(self):
self.custom_actions = self.manager.get_custom_actions()
@@ -540,26 +527,27 @@ class ManageWindow(QWidget):
def _ask_confirmation(self, msg: dict):
self.thread_animate_progress.pause()
extra_widgets = [to_widget(comp=c, i18n=self.i18n) for c in msg['components']] if msg.get('components') else None
diag = ConfirmationDialog(title=msg['title'],
body=msg['body'],
i18n=self.i18n,
components=msg['components'],
widgets=extra_widgets,
confirmation_label=msg['confirmation_label'],
deny_label=msg['deny_label'],
deny_button=msg['deny_button'],
window_cancel=msg['window_cancel'],
confirmation_button=msg.get('confirmation_button', True),
screen_size=self.screen_size)
res = diag.is_confirmed()
confirmation_button=msg.get('confirmation_button', True))
diag.ask()
res = diag.confirmed
self.thread_animate_progress.animate()
self.signal_user_res.emit(res)
def _pause_and_ask_root_password(self):
self.thread_animate_progress.pause()
password, valid = root.ask_root_password(self.context, i18n=self.i18n, comp_manager=self.comp_manager)
valid, password = RootDialog.ask_password(self.context, i18n=self.i18n, comp_manager=self.comp_manager)
self.thread_animate_progress.animate()
self.signal_root_password.emit(password, valid)
self.signal_root_password.emit(valid, password)
def _show_message(self, msg: dict):
self.thread_animate_progress.pause()
@@ -582,8 +570,8 @@ class ManageWindow(QWidget):
self.thread_warnings.start()
def _begin_loading_installed(self):
self.inp_search.setText('')
self.input_name.setText('')
self.search_bar.clear()
self.input_name.set_text('')
self._begin_action(self.i18n['manage_window.status.installed'])
self._handle_console_option(False)
self.comp_manager.set_components_visible(False)
@@ -666,20 +654,20 @@ class ManageWindow(QWidget):
def _handle_console(self, checked: bool):
if checked:
self.textarea_output.show()
self.textarea_details.show()
else:
self.textarea_output.hide()
self.textarea_details.hide()
def _handle_console_option(self, enable: bool):
if enable:
self.textarea_output.clear()
self.textarea_details.clear()
self.comp_manager.set_component_visible(CHECK_CONSOLE, enable)
self.check_console.setChecked(False)
self.textarea_output.hide()
self.comp_manager.set_component_visible(CHECK_DETAILS, enable)
self.check_details.setChecked(False)
self.textarea_details.hide()
def begin_refresh_packages(self, pkg_types: Set[Type[SoftwarePackage]] = None):
self.inp_search.clear()
self.search_bar.clear()
self._begin_action(self.i18n['manage_window.status.refreshing'])
self.comp_manager.set_components_visible(False)
@@ -710,7 +698,7 @@ class ManageWindow(QWidget):
self.types_changed = False
def _begin_load_suggestions(self, filter_installed: bool):
self.inp_search.clear()
self.search_bar.clear()
self._begin_action(self.i18n['manage_window.status.suggestions'])
self._handle_console_option(False)
self.comp_manager.set_components_visible(False)
@@ -825,15 +813,21 @@ class ManageWindow(QWidget):
def _update_table(self, pkgs_info: dict, signal: bool = False):
self.pkgs = pkgs_info['pkgs_displayed']
self.table_apps.update_packages(self.pkgs, update_check_enabled=pkgs_info['not_installed'] == 0)
if pkgs_info['not_installed'] == 0:
update_check = sum_updates_displayed(pkgs_info) > 0
else:
update_check = False
self.table_apps.update_packages(self.pkgs, update_check_enabled=update_check)
if not self._maximized:
self.label_displayed.show()
self.table_apps.change_headers_policy(QHeaderView.Stretch)
self.table_apps.change_headers_policy()
self._resize(accept_lower_width=len(self.pkgs) > 0)
self.label_displayed.setText('{} / {}'.format(len(self.pkgs), len(self.pkgs_available)))
else:
self.label_displayed.setText('')
self.label_displayed.hide()
if signal:
self.signal_table_update.emit()
@@ -887,12 +881,12 @@ class ManageWindow(QWidget):
'type': self.type_filter,
'category': self.category_filter,
'updates': False if ignore_updates else self.filter_updates,
'name': self.input_name.get_text().lower() if self.input_name.get_text() else None,
'name': self.input_name.text().lower() if self.input_name.text() else None,
'display_limit': None if self.filter_updates else self.display_limit
}
def update_pkgs(self, new_pkgs: List[SoftwarePackage], as_installed: bool, types: Set[type] = None, ignore_updates: bool = False, keep_filters: bool = False) -> bool:
self.input_name.setText('')
self.input_name.set_text('')
pkgs_info = commons.new_pkgs_info()
filters = self._gen_filters(ignore_updates=ignore_updates)
@@ -1053,8 +1047,8 @@ class ManageWindow(QWidget):
def _resize(self, accept_lower_width: bool = True):
table_width = self.table_apps.get_width()
toolbar_width = self.toolbar.sizeHint().width()
topbar_width = self.toolbar_top.sizeHint().width()
toolbar_width = self.toolbar_filters.sizeHint().width()
topbar_width = self.toolbar_status.sizeHint().width()
new_width = max(table_width, toolbar_width, topbar_width)
new_width *= 1.05 # this extra size is not because of the toolbar button, but the table upgrade buttons
@@ -1066,13 +1060,14 @@ class ManageWindow(QWidget):
self.progress_controll_enabled = enabled
def upgrade_selected(self):
if dialog.ask_confirmation(title=self.i18n['manage_window.upgrade_all.popup.title'],
body=self.i18n['manage_window.upgrade_all.popup.body'],
i18n=self.i18n,
widgets=[UpdateToggleButton(pkg=None,
root=self,
i18n=self.i18n,
clickable=False)]):
body = QWidget()
body.setLayout(QHBoxLayout())
body.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred)
body.layout().addWidget(QLabel(self.i18n['manage_window.upgrade_all.popup.body']))
body.layout().addWidget(UpgradeToggleButton(pkg=None, root=self, i18n=self.i18n, clickable=False))
if ConfirmationDialog(title=self.i18n['manage_window.upgrade_all.popup.title'],
i18n=self.i18n, body=None,
widgets=[body]).ask():
self._begin_action(action_label=self.i18n['manage_window.status.upgrading'],
action_id=ACTION_UPGRADE)
@@ -1085,7 +1080,7 @@ class ManageWindow(QWidget):
self._finish_action()
if res.get('id'):
output = self.textarea_output.toPlainText()
output = self.textarea_details.toPlainText()
if output:
try:
@@ -1094,8 +1089,8 @@ class ManageWindow(QWidget):
with open(logs_path, 'w+') as f:
f.write(output)
self.textarea_output.appendPlainText('\n*Upgrade summary generated at: {}'.format(UpgradeSelected.SUMMARY_FILE.format(res['id'])))
self.textarea_output.appendPlainText('*Upgrade logs generated at: {}'.format(logs_path))
self.textarea_details.appendPlainText('\n*Upgrade summary generated at: {}'.format(UpgradeSelected.SUMMARY_FILE.format(res['id'])))
self.textarea_details.appendPlainText('*Upgrade logs generated at: {}'.format(logs_path))
except:
traceback.print_exc()
@@ -1118,19 +1113,19 @@ class ManageWindow(QWidget):
self.update_custom_actions()
def _show_console_errors(self):
if self.textarea_output.toPlainText():
self.check_console.setChecked(True)
if self.textarea_details.toPlainText():
self.check_details.setChecked(True)
else:
self._handle_console_option(False)
self.comp_manager.set_component_visible(CHECK_CONSOLE, False)
self.comp_manager.set_component_visible(CHECK_DETAILS, False)
def _update_action_output(self, output: str):
self.textarea_output.appendPlainText(output)
self.textarea_details.appendPlainText(output)
def _begin_action(self, action_label: str, action_id: int = None):
self.thread_animate_progress.stop = False
self.thread_animate_progress.start()
self.ref_progress_bar.setVisible(True)
self.progress_bar.setVisible(True)
if action_id is not None:
self.comp_manager.save_states(action_id, only_visible=True)
@@ -1149,7 +1144,7 @@ class ManageWindow(QWidget):
self.thread_animate_progress.stop = True
self.thread_animate_progress.wait(msecs=1000)
self.ref_progress_bar.setVisible(False)
self.progress_bar.setVisible(False)
self.progress_bar.setValue(0)
self.progress_bar.setTextVisible(False)
@@ -1246,8 +1241,8 @@ class ManageWindow(QWidget):
if res.get('error'):
self._handle_console_option(True)
self.textarea_output.appendPlainText(res['error'])
self.check_console.setChecked(True)
self.textarea_details.appendPlainText(res['error'])
self.check_details.setChecked(True)
elif not res['history'].history:
dialog.show_message(title=self.i18n['action.history.no_history.title'],
body=self.i18n['action.history.no_history.body'].format(bold(res['history'].pkg.name)),
@@ -1261,7 +1256,7 @@ class ManageWindow(QWidget):
self._begin_action('{} {}'.format(self.i18n['manage_window.status.searching'], word if word else ''), action_id=action_id)
def search(self):
word = self.inp_search.text().strip()
word = self.search_bar.text().strip()
if word:
self._handle_console(False)
self._begin_search(word, action_id=ACTION_SEARCH)
@@ -1284,13 +1279,13 @@ class ManageWindow(QWidget):
self.comp_manager.restore_state(ACTION_SEARCH)
dialog.show_message(title=self.i18n['warning'].capitalize(), body=self.i18n[res['error']], type_=MessageType.WARNING)
def _ask_root_password(self, action: str, pkg: PackageView) -> Tuple[str, bool]:
def _ask_root_password(self, action: str, pkg: PackageView) -> Tuple[Optional[str], bool]:
pwd = None
requires_root = self.manager.requires_root(action, pkg.model)
if not user.is_root() and requires_root:
pwd, ok = ask_root_password(self.context, i18n=self.i18n, comp_manager=self.comp_manager)
if not ok:
valid, pwd = RootDialog.ask_password(self.context, i18n=self.i18n, comp_manager=self.comp_manager)
if not valid:
return pwd, False
return pwd, True
@@ -1312,7 +1307,7 @@ class ManageWindow(QWidget):
def _finish_install(self, res: dict):
self._finish_action(action_id=ACTION_INSTALL)
console_output = self.textarea_output.toPlainText()
console_output = self.textarea_details.toPlainText()
if console_output:
log_path = '{}/install/{}/{}'.format(LOGS_PATH, res['pkg'].model.get_type(), res['pkg'].model.name)
@@ -1323,9 +1318,9 @@ class ManageWindow(QWidget):
with open(log_file, 'w+') as f:
f.write(console_output)
self.textarea_output.appendPlainText(self.i18n['console.install_logs.path'].format('"{}"'.format(log_file)))
self.textarea_details.appendPlainText(self.i18n['console.install_logs.path'].format('"{}"'.format(log_file)))
except:
self.textarea_output.appendPlainText("[warning] Could not write install log file to '{}'".format(log_path))
self.textarea_details.appendPlainText("[warning] Could not write install log file to '{}'".format(log_path))
if res['success']:
if self._can_notify_user():
@@ -1385,6 +1380,9 @@ class ManageWindow(QWidget):
self.pkgs_installed.insert(idx, PackageView(model, self.i18n))
self.update_custom_actions()
self.table_apps.change_headers_policy(policy=QHeaderView.Stretch, maximized=self._maximized)
self.table_apps.change_headers_policy(policy=QHeaderView.ResizeToContents, maximized=self._maximized)
self._resize(accept_lower_width=False)
else:
self._show_console_errors()
if self._can_notify_user():
@@ -1393,19 +1391,19 @@ class ManageWindow(QWidget):
def _update_progress(self, value: int):
self.progress_bar.setValue(value)
def begin_execute_custom_action(self, pkg: PackageView, action: CustomSoftwareAction):
if pkg is None and not dialog.ask_confirmation(title=self.i18n['confirmation'].capitalize(),
body=self.i18n['custom_action.proceed_with'].capitalize().format('"{}"'.format(self.i18n[action.i18n_label_key])),
icon=QIcon(action.icon_path) if action.icon_path else QIcon(resource.get_path('img/logo.svg')),
i18n=self.i18n):
def begin_execute_custom_action(self, pkg: Optional[PackageView], action: CustomSoftwareAction):
if pkg is None and not ConfirmationDialog(title=self.i18n['confirmation'].capitalize(),
body='<p>{}</p>'.format(self.i18n['custom_action.proceed_with'].capitalize().format(bold(self.i18n[action.i18n_label_key]))),
icon=QIcon(action.icon_path) if action.icon_path else QIcon(resource.get_path('img/logo.svg')),
i18n=self.i18n).ask():
return False
pwd = None
if not user.is_root() and action.requires_root:
pwd, ok = ask_root_password(self.context, i18n=self.i18n, comp_manager=self.comp_manager)
valid, pwd = RootDialog.ask_password(self.context, i18n=self.i18n, comp_manager=self.comp_manager)
if not ok:
if not valid:
return
self._begin_action(action_label='{}{}'.format(self.i18n[action.i18n_status_key], ' {}'.format(pkg.model.name) if pkg else ''),
@@ -1434,10 +1432,10 @@ class ManageWindow(QWidget):
self._show_console_errors()
def _show_console_checkbox_if_output(self):
if self.textarea_output.toPlainText():
self.comp_manager.set_component_visible(CHECK_CONSOLE, True)
if self.textarea_details.toPlainText():
self.comp_manager.set_component_visible(CHECK_DETAILS, True)
else:
self.comp_manager.set_component_visible(CHECK_CONSOLE, False)
self.comp_manager.set_component_visible(CHECK_DETAILS, False)
def show_settings(self):
if self.settings_window:
@@ -1450,8 +1448,7 @@ class ManageWindow(QWidget):
qt_utils.centralize(self.settings_window)
self.settings_window.show()
def _map_custom_action(self, action: CustomSoftwareAction) -> QAction:
custom_action = QAction(self.i18n[action.i18n_label_key])
def _map_custom_action(self, action: CustomSoftwareAction, parent: QWidget) -> QCustomMenuAction:
if action.icon_path:
try:
@@ -1459,20 +1456,21 @@ class ManageWindow(QWidget):
icon = QIcon(action.icon_path)
else:
icon = QIcon.fromTheme(action.icon_path)
custom_action.setIcon(icon)
except:
pass
icon = None
else:
icon = None
custom_action.triggered.connect(lambda: self.begin_execute_custom_action(None, action))
return custom_action
return QCustomMenuAction(parent=parent,
label=self.i18n[action.i18n_label_key],
action=lambda: self.begin_execute_custom_action(None, action),
icon=icon)
def show_custom_actions(self):
if self.custom_actions:
menu_row = QMenu()
menu_row.setCursor(QCursor(Qt.PointingHandCursor))
actions = [self._map_custom_action(a) for a in self.custom_actions]
actions = [self._map_custom_action(a, menu_row) for a in self.custom_actions]
menu_row.addActions(actions)
menu_row.adjustSize()
menu_row.popup(QCursor.pos())
@@ -1547,3 +1545,48 @@ class ManageWindow(QWidget):
self.__add_category(cat)
else:
self._update_categories(pkg_categories)
def _map_theme_action(self, theme: ThemeMetadata, menu: QMenu) -> QCustomMenuAction:
def _change_theme():
set_theme(theme_key=theme.key, app=QApplication.instance(), logger=self.context.logger)
self.thread_save_theme.theme_key = theme.key
self.thread_save_theme.start()
return QCustomMenuAction(label=theme.get_i18n_name(self.i18n),
action=_change_theme,
parent=menu,
tooltip=theme.get_i18n_description(self.i18n))
def show_themes(self):
menu_row = QMenu()
menu_row.setCursor(QCursor(Qt.PointingHandCursor))
menu_row.addActions(self._map_theme_actions(menu_row))
menu_row.adjustSize()
menu_row.popup(QCursor.pos())
menu_row.exec_()
def _map_theme_actions(self, menu: QMenu) -> List[QCustomMenuAction]:
core_config = read_config()
current_theme_key, current_action = core_config['ui']['theme'], None
actions = []
for t in read_all_themes_metadata():
if not t.abstract:
action = self._map_theme_action(t, menu)
if current_action is None and current_theme_key is not None and current_theme_key == t.key:
action.button.setProperty('current', 'true')
current_action = action
else:
actions.append(action)
if not current_action:
invalid_action = QCustomMenuAction(label=self.i18n['manage_window.bt_themes.option.invalid'], parent=menu)
invalid_action.button.setProperty('current', 'true')
current_action = invalid_action
actions.sort(key=lambda a: a.get_label())
actions.insert(0, current_action)
return actions

View File

@@ -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"
height="8.999999pt"
viewBox="0 0 9.000001 8.999999"
width="9.000001pt"
version="1.1"
id="svg5741"
sodipodi:docname="app_actions.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
<metadata
id="metadata5747">
<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>
<defs
id="defs5745" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="739"
id="namedview5743"
showgrid="false"
showborder="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="8.9398501"
inkscape:cx="-15.591871"
inkscape:cy="19.009452"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg5741"
showguides="false" />
<path
d="M 7.3555147,3.879237 H 5.2449172 c -0.068563,0 -0.1241526,-0.055592 -0.1241526,-0.1241528 V 1.644485 c 0,-0.3428152 -0.2779494,-0.6207628 -0.6207638,-0.6207628 -0.3428146,0 -0.6207639,0.2779476 -0.6207639,0.6207628 v 2.1105988 c 0,0.068567 -0.05559,0.1241527 -0.1241527,0.1241527 H 1.6444865 c -0.3428146,0 -0.6207641,0.2779476 -0.6207641,0.6207625 0,0.3428152 0.2779495,0.6207635 0.6207641,0.6207635 H 3.755084 c 0.068562,0 0.1241527,0.055591 0.1241527,0.1241527 v 2.1105991 c 0,0.342815 0.2779494,0.6207625 0.6207637,0.6207625 0.3428147,0 0.6207639,-0.2779475 0.6207639,-0.6207625 V 5.2449164 c 0,-0.068568 0.05559,-0.1241527 0.1241527,-0.1241527 h 2.1105975 c 0.3428142,0 0.620764,-0.2779486 0.620764,-0.6207637 0,-0.342815 -0.2779498,-0.6207625 -0.6207638,-0.620763 z m 0,0"
id="path5739"
style="fill:none;fill-opacity:1;stroke:#91a069;stroke-width:0.75;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
inkscape:connector-curvature="0" />
</svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -1,124 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<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 511.80277 512.00123"
xml:space="preserve"
sodipodi:docname="broom3.svg"
width="511.80276"
height="512.00122"
inkscape:version="0.92.4 5da689c313, 2019-01-14"><metadata
id="metadata937"><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="defs935" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1360"
inkscape:window-height="703"
id="namedview933"
showgrid="false"
showborder="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="0.12524439"
inkscape:cx="-1824.7804"
inkscape:cy="785.16823"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1" />
<g
id="g900"
transform="translate(-0.09847376,2.5000937e-4)"
style="fill:#ffffff">
<g
id="g898"
style="fill:#ffffff">
<path
d="m 496.89,15.011 c -20.015,-20.016 -52.582,-20.014 -72.596,0 l -137.534,137.532 -2.945,-2.945 c -25.577,-25.577 -66.359,-28.076 -94.866,-5.809 L 5.968,286.702 c -3.447,2.692 -5.574,6.734 -5.841,11.1 -0.267,4.366 1.35,8.637 4.443,11.73 l 197.996,197.996 c 2.872,2.872 6.76,4.473 10.795,4.473 0.31,0 0.622,-0.01 0.934,-0.029 4.366,-0.268 8.408,-2.395 11.1,-5.841 L 368.308,323.15 c 22.264,-28.506 19.766,-69.29 -5.81,-94.867 l -3.14,-3.14 L 496.89,87.608 c 20.015,-20.015 20.015,-52.582 0,-72.597 z m -284.936,458.716 -44.515,-44.515 54.73,-60.219 c 5.671,-6.241 5.21,-15.897 -1.03,-21.569 -6.241,-5.671 -15.898,-5.211 -21.569,1.03 l -53.749,59.14 -41.317,-41.317 59.14,-53.749 c 6.24,-5.672 6.701,-15.329 1.03,-21.569 -5.673,-6.239 -15.327,-6.702 -21.569,-1.03 l -60.219,54.73 -44.515,-44.515 144.466,-112.832 141.95,141.95 z M 344.24,304.35 l -0.517,0.663 -136.639,-136.64 0.663,-0.517 c 16.367,-12.785 39.788,-11.35 54.474,3.336 l 13.741,13.741 51.004,51.004 13.937,13.937 c 14.688,14.687 16.122,38.107 3.337,54.476 z M 475.297,66.014 337.764,203.547 308.353,174.136 445.886,36.604 c 8.109,-8.109 21.303,-8.107 29.41,0 8.109,8.109 8.109,21.301 0.001,29.41 z"
id="path896"
inkscape:connector-curvature="0"
style="fill:#ffffff" />
</g>
</g>
<g
id="g902"
transform="translate(-0.09847376,2.5000937e-4)">
</g>
<g
id="g904"
transform="translate(-0.09847376,2.5000937e-4)">
</g>
<g
id="g906"
transform="translate(-0.09847376,2.5000937e-4)">
</g>
<g
id="g908"
transform="translate(-0.09847376,2.5000937e-4)">
</g>
<g
id="g910"
transform="translate(-0.09847376,2.5000937e-4)">
</g>
<g
id="g912"
transform="translate(-0.09847376,2.5000937e-4)">
</g>
<g
id="g914"
transform="translate(-0.09847376,2.5000937e-4)">
</g>
<g
id="g916"
transform="translate(-0.09847376,2.5000937e-4)">
</g>
<g
id="g918"
transform="translate(-0.09847376,2.5000937e-4)">
</g>
<g
id="g920"
transform="translate(-0.09847376,2.5000937e-4)">
</g>
<g
id="g922"
transform="translate(-0.09847376,2.5000937e-4)">
</g>
<g
id="g924"
transform="translate(-0.09847376,2.5000937e-4)">
</g>
<g
id="g926"
transform="translate(-0.09847376,2.5000937e-4)">
</g>
<g
id="g928"
transform="translate(-0.09847376,2.5000937e-4)">
</g>
<g
id="g930"
transform="translate(-0.09847376,2.5000937e-4)">
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.1 KiB

View File

@@ -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"
height="8.999999pt"
viewBox="0 0 9.000001 8.999999"
width="9.000001pt"
version="1.1"
id="svg5741"
sodipodi:docname="custom_actions.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
<metadata
id="metadata5747">
<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>
<defs
id="defs5745" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="739"
id="namedview5743"
showgrid="false"
showborder="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="8.9398501"
inkscape:cx="-38.959936"
inkscape:cy="23.4838"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg5741"
showguides="false" />
<path
d="m 7.9266176,3.7550845 h -2.532717 c -0.082276,0 -0.1489831,-0.066711 -0.1489831,-0.1489834 v -2.532719 c 0,-0.41137817 -0.3335393,-0.74491533 -0.7449166,-0.74491533 -0.4113775,0 -0.7449167,0.33353716 -0.7449167,0.74491533 v 2.5327186 c 0,0.082281 -0.066708,0.1489832 -0.1489832,0.1489832 H 1.0733837 c -0.4113775,0 -0.74491684,0.3335371 -0.74491684,0.744915 0,0.4113782 0.33353934,0.7449162 0.74491684,0.7449162 h 2.532717 c 0.082274,0 0.1489833,0.066709 0.1489833,0.1489833 v 2.5327188 c 0,0.4113781 0.3335393,0.7449151 0.7449164,0.7449151 0.4113777,0 0.7449167,-0.333537 0.7449167,-0.7449151 V 5.3938998 c 0,-0.082281 0.066708,-0.1489833 0.1489832,-0.1489833 h 2.532717 c 0.4113771,0 0.7449168,-0.3335383 0.7449168,-0.7449164 0,-0.411378 -0.3335397,-0.744915 -0.7449165,-0.7449156 z m 0,0"
id="path5739"
style="fill:#000000;fill-opacity:0;stroke:#91a069;stroke-width:0.65693444;stroke-opacity:1"
inkscape:connector-curvature="0" />
</svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -1,130 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<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 24 24"
xml:space="preserve"
sodipodi:docname="disk.svg"
width="24"
height="24"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"><metadata
id="metadata858"><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="defs856">
</defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="731"
id="namedview854"
showgrid="false"
showborder="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="-0.3"
inkscape:zoom="4.5416668"
inkscape:cx="-3.1268656"
inkscape:cy="2.0635535"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1" />
<g
id="g823"
transform="translate(-8.2464375,-22.829711)">
</g>
<g
id="g825"
transform="translate(-8.2464375,-22.829711)">
</g>
<g
id="g827"
transform="translate(-8.2464375,-22.829711)">
</g>
<g
id="g829"
transform="translate(-8.2464375,-22.829711)">
</g>
<g
id="g831"
transform="translate(-8.2464375,-22.829711)">
</g>
<g
id="g833"
transform="translate(-8.2464375,-22.829711)">
</g>
<g
id="g835"
transform="translate(-8.2464375,-22.829711)">
</g>
<g
id="g837"
transform="translate(-8.2464375,-22.829711)">
</g>
<g
id="g839"
transform="translate(-8.2464375,-22.829711)">
</g>
<g
id="g841"
transform="translate(-8.2464375,-22.829711)">
</g>
<g
id="g843"
transform="translate(-8.2464375,-22.829711)">
</g>
<g
id="g845"
transform="translate(-8.2464375,-22.829711)">
</g>
<g
id="g847"
transform="translate(-8.2464375,-22.829711)">
</g>
<g
id="g849"
transform="translate(-8.2464375,-22.829711)">
</g>
<g
id="g851"
transform="translate(-8.2464375,-22.829711)">
</g>
<g
id="g1005"
transform="matrix(0.94044416,0,0,0.94044416,0.71467014,0.71467014)"
style="fill:none;stroke:#8d5fd3;stroke-width:2.07845044"><path
id="path920"
d="M 12,0.27929688 A 11.720572,11.720572 0 0 0 0.27929688,12 11.720572,11.720572 0 0 0 12,23.720703 11.720572,11.720572 0 0 0 23.720703,12 11.720572,11.720572 0 0 0 12,0.27929688 Z M 12,8.59375 A 3.4069197,3.4069195 0 0 1 15.40625,12 3.4069197,3.4069195 0 0 1 12,15.40625 3.4069197,3.4069195 0 0 1 8.59375,12 3.4069197,3.4069195 0 0 1 12,8.59375 Z"
style="fill:none;stroke:#8d5fd3;stroke-width:2.07845044;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.94117647"
inkscape:connector-curvature="0" /><ellipse
cy="12"
cx="12"
id="ellipse998"
style="fill:none;fill-opacity:0;stroke:#8d5fd3;stroke-width:2.07845044;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.94117647"
rx="3.4069197"
ry="3.4069195" /></g></svg>

Before

Width:  |  Height:  |  Size: 3.6 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 40 KiB

View File

@@ -1,134 +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 23.515307 24"
xml:space="preserve"
sodipodi:docname="ignore_update.svg"
width="23.515306"
height="24"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"><metadata
id="metadata977"><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><defs
id="defs975" /><sodipodi:namedview
inkscape:document-rotation="0"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="739"
id="namedview973"
showgrid="false"
showborder="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="9.4874926"
inkscape:cx="25.836555"
inkscape:cy="15.198259"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1" />
<g
id="g942"
transform="translate(-99.310818,-31.505501)">
</g>
<g
id="g944"
transform="translate(-99.310818,-31.505501)">
</g>
<g
id="g946"
transform="translate(-99.310818,-31.505501)">
</g>
<g
id="g948"
transform="translate(-99.310818,-31.505501)">
</g>
<g
id="g950"
transform="translate(-99.310818,-31.505501)">
</g>
<g
id="g952"
transform="translate(-99.310818,-31.505501)">
</g>
<g
id="g954"
transform="translate(-99.310818,-31.505501)">
</g>
<g
id="g956"
transform="translate(-99.310818,-31.505501)">
</g>
<g
id="g958"
transform="translate(-99.310818,-31.505501)">
</g>
<g
id="g960"
transform="translate(-99.310818,-31.505501)">
</g>
<g
id="g962"
transform="translate(-99.310818,-31.505501)">
</g>
<g
id="g964"
transform="translate(-99.310818,-31.505501)">
</g>
<g
id="g966"
transform="translate(-99.310818,-31.505501)">
</g>
<g
id="g968"
transform="translate(-99.310818,-31.505501)">
</g>
<g
id="g970"
transform="translate(-99.310818,-31.505501)">
</g>
<g
id="g982"><g
id="g6"
transform="matrix(0.90262437,0,0,0.97767784,0.02353571,-0.4674393)"
style="fill:#91a069;fill-opacity:1;stroke:#91a069;stroke-width:0.0521502;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"><path
d="m 25,17 h -2 c -0.6,0 -1,0.4 -1,1 v 2.5 C 22,20.8 21.8,21 21.5,21 H 4.5 C 4.2,21 4,20.8 4,20.5 V 18 C 4,17.4 3.6,17 3,17 H 1 c -0.6,0 -1,0.4 -1,1 v 6 c 0,0.6 0.4,1 1,1 h 24 c 0.6,0 1,-0.4 1,-1 v -6 c 0,-0.6 -0.4,-1 -1,-1 z"
id="path2"
inkscape:connector-curvature="0"
style="fill:#91a069;fill-opacity:1;stroke:#91a069;stroke-width:0.0521502;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /><path
d="m 12.3,16.7 c 0.2,0.2 0.5,0.3 0.7,0.3 0.2,0 0.5,-0.1 0.7,-0.3 l 6,-6 C 19.9,10.5 20,10.3 20,10 20,9.7 19.9,9.5 19.7,9.3 L 18.3,7.9 C 18.1,7.7 17.9,7.6 17.6,7.6 c -0.3,0 -0.5,0.1 -0.7,0.3 l -1,1 C 15.6,9.2 15,9 15,8.5 V 2 C 15,1.4 14.6,1 14,1 H 12 C 11.4,1 11,1.4 11,2 V 8.6 C 11,9 10.5,9.3 10.1,9 L 9.1,8 C 8.9,7.8 8.7,7.7 8.4,7.7 8.1,7.7 7.9,7.8 7.7,8 L 6.3,9.4 C 6.1,9.6 6,9.8 6,10.1 c 0,0.3 0.1,0.5 0.3,0.7 z"
id="path4"
inkscape:connector-curvature="0"
style="fill:#91a069;fill-opacity:1;stroke:#91a069;stroke-width:0.0521502;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /></g><g
transform="matrix(-0.05511385,0,0,0.05511385,23.515284,-1.6640481e-7)"
style="fill:#ff0000"
id="g940">
<g
style="fill:#ff0000"
id="g938">
<path
style="fill:#ff0000"
id="path936"
d="M 213.333,0 C 95.467,0 0,95.467 0,213.333 0,331.199 95.467,426.666 213.333,426.666 331.199,426.666 426.667,331.2 426.667,213.333 426.667,95.466 331.2,0 213.333,0 Z M 42.667,213.333 c 0,-94.293 76.373,-170.667 170.667,-170.667 39.467,0 75.627,13.547 104.533,35.947 L 78.613,317.867 C 56.213,288.96 42.667,252.8 42.667,213.333 Z M 213.333,384 C 173.866,384 137.706,370.453 108.8,348.053 L 348.053,108.8 C 370.453,137.707 384,173.867 384,213.333 384,307.627 307.627,384 213.333,384 Z" />
</g>
</g></g></svg>

Before

Width:  |  Height:  |  Size: 4.6 KiB

View File

@@ -1,120 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<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"
width="12"
height="12"
viewBox="0 0 12 12"
xml:space="preserve"
sodipodi:docname="install.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"><metadata
id="metadata135"><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><defs
id="defs133" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="739"
id="namedview131"
showgrid="false"
showborder="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="1.9124627"
inkscape:cx="-35.595135"
inkscape:cy="42.640588"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1" />
<g
id="g98"
transform="scale(0.034381)"
style="fill:#91a069;fill-opacity:1">
<path
d="m 349.03,141.226 v 66.579 c 0,5.012 -4.061,9.079 -9.079,9.079 H 216.884 v 123.067 c 0,5.019 -4.067,9.079 -9.079,9.079 h -66.579 c -5.009,0 -9.079,-4.061 -9.079,-9.079 V 216.884 H 9.079 C 4.063,216.884 0,212.817 0,207.805 v -66.579 c 0,-5.013 4.063,-9.079 9.079,-9.079 H 132.147 V 9.079 C 132.147,4.061 136.216,0 141.226,0 h 66.579 c 5.012,0 9.079,4.061 9.079,9.079 v 123.068 h 123.067 c 5.019,0 9.079,4.066 9.079,9.079 z"
id="path96"
inkscape:connector-curvature="0"
style="fill:#91a069;fill-opacity:1" />
</g>
<g
id="g100"
transform="translate(0,-337.03)">
</g>
<g
id="g102"
transform="translate(0,-337.03)">
</g>
<g
id="g104"
transform="translate(0,-337.03)">
</g>
<g
id="g106"
transform="translate(0,-337.03)">
</g>
<g
id="g108"
transform="translate(0,-337.03)">
</g>
<g
id="g110"
transform="translate(0,-337.03)">
</g>
<g
id="g112"
transform="translate(0,-337.03)">
</g>
<g
id="g114"
transform="translate(0,-337.03)">
</g>
<g
id="g116"
transform="translate(0,-337.03)">
</g>
<g
id="g118"
transform="translate(0,-337.03)">
</g>
<g
id="g120"
transform="translate(0,-337.03)">
</g>
<g
id="g122"
transform="translate(0,-337.03)">
</g>
<g
id="g124"
transform="translate(0,-337.03)">
</g>
<g
id="g126"
transform="translate(0,-337.03)">
</g>
<g
id="g128"
transform="translate(0,-337.03)">
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -1,127 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<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 20 24"
xml:space="preserve"
sodipodi:docname="lock.svg"
width="20"
height="24"
inkscape:version="0.92.4 5da689c313, 2019-01-14"><metadata
id="metadata937"><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="defs935">
</defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1360"
inkscape:window-height="703"
id="namedview933"
showgrid="false"
showborder="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="0.90509668"
inkscape:cx="-149.6013"
inkscape:cy="29.679244"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1" />
<path
style="fill:#ffffff;stroke:#ffffff;stroke-width:0.47244796"
inkscape:connector-curvature="0"
id="path939"
d="M 19.221328,9.0590556 H 17.594031 V 7.0984108 c 0,-3.7838458 -3.406592,-6.86218682 -7.5940312,-6.86218682 -4.1874394,0 -7.5940309,3.07834102 -7.5940309,6.86218682 V 9.0590556 H 0.77867292 c -0.29982928,0 -0.54244894,0.2192386 -0.54244894,0.4901724 v 12.25395 c 0,1.081301 0.97307212,1.960598 2.16974492,1.960598 H 17.594081 c 1.196623,0 2.169695,-0.879297 2.169695,-1.960645 V 9.549228 c 0,-0.2709338 -0.24262,-0.4901724 -0.542448,-0.4901724 z M 11.624143,19.298274 c 0.01694,0.138316 -0.03229,0.277138 -0.135066,0.381037 -0.102774,0.103851 -0.250044,0.163222 -0.404179,0.163222 H 8.9151528 c -0.1541362,0 -0.301406,-0.05937 -0.4041797,-0.163222 C 8.4081996,19.575458 8.3589226,19.436637 8.3759075,19.298274 L 8.718097,16.517704 C 8.1624267,16.152475 7.8303058,15.574718 7.8303058,14.940945 c 0,-1.081303 0.9730724,-1.960646 2.1697452,-1.960646 1.196672,0 2.169744,0.879297 2.169744,1.960646 0,0.633773 -0.33212,1.21153 -0.887792,1.576759 z M 14.339439,9.0590556 H 5.6605606 V 7.0984108 c 0,-2.1621453 1.946704,-3.9212433 4.3394392,-3.9212433 2.3927352,0 4.3394392,1.759098 4.3394392,3.9212433 z" /><path
d="M 19.221328,9.0590556 H 17.594031 V 7.0984108 c 0,-3.7838458 -3.406592,-6.86218682 -7.5940312,-6.86218682 -4.1874394,0 -7.5940309,3.07834102 -7.5940309,6.86218682 V 9.0590556 H 0.77867292 c -0.29982928,0 -0.54244894,0.2192386 -0.54244894,0.4901724 v 12.25395 c 0,1.081301 0.97307212,1.960598 2.16974492,1.960598 H 17.594081 c 1.196623,0 2.169695,-0.879297 2.169695,-1.960645 V 9.549228 c 0,-0.2709338 -0.24262,-0.4901724 -0.542448,-0.4901724 z M 11.624143,19.298274 c 0.01694,0.138316 -0.03229,0.277138 -0.135066,0.381037 -0.102774,0.103851 -0.250044,0.163222 -0.404179,0.163222 H 8.9151528 c -0.1541362,0 -0.301406,-0.05937 -0.4041797,-0.163222 C 8.4081996,19.575458 8.3589226,19.436637 8.3759075,19.298274 L 8.718097,16.517704 C 8.1624267,16.152475 7.8303058,15.574718 7.8303058,14.940945 c 0,-1.081303 0.9730724,-1.960646 2.1697452,-1.960646 1.196672,0 2.169744,0.879297 2.169744,1.960646 0,0.633773 -0.33212,1.21153 -0.887792,1.576759 z M 14.339439,9.0590556 H 5.6605606 V 7.0984108 c 0,-2.1621453 1.946704,-3.9212433 4.3394392,-3.9212433 2.3927352,0 4.3394392,1.759098 4.3394392,3.9212433 z"
id="path896"
inkscape:connector-curvature="0"
style="fill:#ffffff;stroke:#ffffff;stroke-width:0.04834057" />
<g
id="g902"
transform="translate(-236.96506,-257.22244)">
</g>
<g
id="g904"
transform="translate(-236.96506,-257.22244)">
</g>
<g
id="g906"
transform="translate(-236.96506,-257.22244)">
</g>
<g
id="g908"
transform="translate(-236.96506,-257.22244)">
</g>
<g
id="g910"
transform="translate(-236.96506,-257.22244)">
</g>
<g
id="g912"
transform="translate(-236.96506,-257.22244)">
</g>
<g
id="g914"
transform="translate(-236.96506,-257.22244)">
</g>
<g
id="g916"
transform="translate(-236.96506,-257.22244)">
</g>
<g
id="g918"
transform="translate(-236.96506,-257.22244)">
</g>
<g
id="g920"
transform="translate(-236.96506,-257.22244)">
</g>
<g
id="g922"
transform="translate(-236.96506,-257.22244)">
</g>
<g
id="g924"
transform="translate(-236.96506,-257.22244)">
</g>
<g
id="g926"
transform="translate(-236.96506,-257.22244)">
</g>
<g
id="g928"
transform="translate(-236.96506,-257.22244)">
</g>
<g
id="g930"
transform="translate(-236.96506,-257.22244)">
</g>
</svg>

Before

Width:  |  Height:  |  Size: 5.0 KiB

View File

@@ -1,115 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<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="Layer_1"
x="0px"
y="0px"
viewBox="0 0 12 12"
xml:space="preserve"
sodipodi:docname="cross_red.svg"
width="12"
height="12"
inkscape:version="0.92.3 (2405546, 2018-03-11)"><metadata
id="metadata1018"><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="defs1016" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="703"
id="namedview1014"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
showborder="false"
inkscape:zoom="1.7430481"
inkscape:cx="39.29923"
inkscape:cy="73.435604"
inkscape:window-x="0"
inkscape:window-y="260"
inkscape:window-maximized="1"
inkscape:current-layer="Layer_1" />
<path
id="XMLID_90_"
d="M 0.18530763,10.025545 1.9744745,11.814702 C 2.093058,11.933327 2.2540227,12 2.4217347,12 2.5894888,12 2.7504115,11.93333 2.8689948,11.814702 L 5.9999843,8.6837266 9.1309735,11.814702 C 9.2495992,11.933327 9.4105217,12 9.5782337,12 c 0.167754,0 0.3286768,-0.06667 0.4473023,-0.185298 l 1.789167,-1.789157 c 0.247034,-0.2470354 0.247034,-0.6475284 0,-0.8945604 L 8.6837558,6.0000066 11.814703,2.8689866 C 11.933371,2.7503616 12,2.5894836 12,2.4217286 c 0,-0.167795 -0.06663,-0.328675 -0.185297,-0.4473 L 10.025578,0.18526863 c -0.2469922,-0.247032 -0.6475697,-0.247032 -0.8945622,4.3e-5 L 6.0000263,3.3162466 2.8689948,0.18531163 c -0.2469925,-0.247035 -0.6475699,-0.247035 -0.8945624,0 L 0.18530763,1.9744286 C 0.0666399,2.0930536 1.054262e-5,2.2539336 1.054262e-5,2.4216866 c 0,0.167755 0.06662935738,0.328635 0.18529708738,0.44726 l 3.13094717,3.131018 -3.13094717,3.13102 c -0.24707684,0.247032 -0.24707684,0.647525 0,0.8945604 z"
inkscape:connector-curvature="0"
style="fill:#ff0000;stroke-width:0.0421704" />
<g
id="g983"
transform="translate(2.5e-4,-272.56001)">
</g>
<g
id="g985"
transform="translate(2.5e-4,-272.56001)">
</g>
<g
id="g987"
transform="translate(2.5e-4,-272.56001)">
</g>
<g
id="g989"
transform="translate(2.5e-4,-272.56001)">
</g>
<g
id="g991"
transform="translate(2.5e-4,-272.56001)">
</g>
<g
id="g993"
transform="translate(2.5e-4,-272.56001)">
</g>
<g
id="g995"
transform="translate(2.5e-4,-272.56001)">
</g>
<g
id="g997"
transform="translate(2.5e-4,-272.56001)">
</g>
<g
id="g999"
transform="translate(2.5e-4,-272.56001)">
</g>
<g
id="g1001"
transform="translate(2.5e-4,-272.56001)">
</g>
<g
id="g1003"
transform="translate(2.5e-4,-272.56001)">
</g>
<g
id="g1005"
transform="translate(2.5e-4,-272.56001)">
</g>
<g
id="g1007"
transform="translate(2.5e-4,-272.56001)">
</g>
<g
id="g1009"
transform="translate(2.5e-4,-272.56001)">
</g>
<g
id="g1011"
transform="translate(2.5e-4,-272.56001)">
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.6 KiB

View File

@@ -1,133 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<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="Layer_1"
x="0px"
y="0px"
viewBox="0 0 12 12"
xml:space="preserve"
sodipodi:docname="settings.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
width="12"
height="12"><metadata
id="metadata1620"><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><defs
id="defs1618" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="739"
id="namedview1616"
showgrid="false"
showborder="true"
inkscape:zoom="29.5"
inkscape:cx="4.1585718"
inkscape:cy="4.9615377"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Layer_1"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
<g
id="g1583"
transform="matrix(0.02354106,0,0,0.02294584,-0.02630954,0.12586496)"
style="fill:#b072d9;fill-opacity:1;stroke:#b072d9;stroke-width:10.97066879;stroke-opacity:1">
<g
id="g1581"
style="fill:#b072d9;fill-opacity:1;stroke:#b072d9;stroke-width:10.97066879;stroke-opacity:1">
<g
id="g1579"
style="fill:#b072d9;fill-opacity:1;stroke:#b072d9;stroke-width:10.97066879;stroke-opacity:1">
<path
d="m 496.659,312.128 -47.061,-36.8 c 0.619,-5.675 1.109,-12.309 1.109,-19.328 0,-7.019 -0.512,-13.653 -1.109,-19.328 l 47.104,-36.821 c 8.747,-6.912 11.157,-19.179 5.568,-29.397 L 453.331,85.782 C 447.976,76.033 435.966,71.574 425.022,75.606 L 369.491,97.899 C 358.867,90.219 347.71,83.734 336.168,78.55 L 327.72,19.649 C 326.334,8.448 316.606,0 305.107,0 h -98.133 c -11.499,0 -21.227,8.448 -22.592,19.435 l -8.469,59.115 c -11.179,5.056 -22.165,11.435 -33.28,19.371 L 86.953,75.564 C 76.308,71.404 64.19,75.799 58.857,85.569 l -49.003,84.8 c -5.781,9.771 -3.413,22.443 5.547,29.525 l 47.061,36.779 c -0.747,7.211 -1.109,13.461 -1.109,19.328 0,5.867 0.363,12.117 1.067,19.328 L 15.316,312.172 C 6.59,319.083 4.2,331.349 9.768,341.568 l 48.939,84.672 c 5.312,9.728 17.301,14.165 28.309,10.176 l 55.531,-22.293 c 10.624,7.659 21.803,14.144 33.344,19.349 l 8.448,58.88 c 1.387,11.2 11.115,19.648 22.613,19.648 h 98.133 c 11.499,0 21.227,-8.448 22.592,-19.435 l 8.469,-59.093 c 11.179,-5.056 22.165,-11.435 33.28,-19.371 l 55.68,22.357 c 10.603,4.117 22.763,-0.235 28.096,-10.005 l 49.195,-85.099 c 5.441,-9.983 3.051,-22.25 -5.738,-29.226 z m -12.907,18.773 -50.816,85.717 -61.077,-24.533 c -3.456,-1.387 -7.381,-0.853 -10.368,1.365 -13.227,9.899 -26.005,17.344 -39.104,22.699 -3.499,1.429 -5.995,4.608 -6.528,8.363 l -10.773,66.155 -99.563,-1.131 -9.323,-65.003 c -0.555,-3.755 -3.029,-6.933 -6.528,-8.363 -13.632,-5.589 -26.752,-13.205 -39.019,-22.635 -1.899,-1.472 -4.203,-2.219 -6.507,-2.219 -1.344,0 -2.688,0.235 -3.989,0.768 L 77.33,415.785 28.391,331.113 c -0.448,-0.832 -0.363,-1.792 0.149,-2.197 l 51.776,-40.469 c 2.944,-2.304 4.48,-6.016 4.011,-9.728 -1.131,-8.939 -1.643,-16.171 -1.643,-22.72 0,-6.549 0.533,-13.76 1.643,-22.72 0.469,-3.733 -1.067,-7.424 -4.011,-9.728 l -52.03,-42.431 50.816,-85.717 61.077,24.533 c 3.477,1.408 7.381,0.875 10.389,-1.365 13.205,-9.92 26.005,-17.344 39.104,-22.699 3.499,-1.451 5.973,-4.629 6.507,-8.363 l 10.795,-66.176 99.584,1.152 9.301,65.024 c 0.555,3.755 3.029,6.933 6.528,8.363 13.611,5.568 26.731,13.184 39.019,22.635 3.008,2.304 6.955,2.859 10.475,1.429 l 62.827,-23.701 48.939,84.672 c 0.448,0.832 0.363,1.771 -0.149,2.176 l -51.776,40.469 c -2.944,2.304 -4.48,5.995 -4.011,9.728 0.811,6.485 1.643,14.272 1.643,22.72 0,8.469 -0.832,16.235 -1.643,22.72 -0.469,3.712 1.067,7.424 4.011,9.728 l 51.712,40.448 c 0.553,0.448 0.66,1.408 0.318,2.005 z"
id="path1575"
inkscape:connector-curvature="0"
style="fill:#b072d9;fill-opacity:1;stroke:#b072d9;stroke-width:10.97066879;stroke-opacity:1" />
<path
d="m 256.019,149.333 c -58.816,0 -106.667,47.851 -106.667,106.667 0,58.816 47.851,106.667 106.667,106.667 58.816,0 106.667,-47.851 106.667,-106.667 0,-58.816 -47.851,-106.667 -106.667,-106.667 z m 0,192 c -47.061,0 -85.333,-38.272 -85.333,-85.333 0,-47.061 38.272,-85.333 85.333,-85.333 47.061,0 85.333,38.272 85.333,85.333 0,47.061 -38.272,85.333 -85.333,85.333 z"
id="path1577"
inkscape:connector-curvature="0"
style="fill:#b072d9;fill-opacity:1;stroke:#b072d9;stroke-width:10.97066879;stroke-opacity:1" />
</g>
</g>
</g>
<g
id="g1585"
transform="translate(-6.6814869,-500.02344)">
</g>
<g
id="g1587"
transform="translate(-6.6814869,-500.02344)">
</g>
<g
id="g1589"
transform="translate(-6.6814869,-500.02344)">
</g>
<g
id="g1591"
transform="translate(-6.6814869,-500.02344)">
</g>
<g
id="g1593"
transform="translate(-6.6814869,-500.02344)">
</g>
<g
id="g1595"
transform="translate(-6.6814869,-500.02344)">
</g>
<g
id="g1597"
transform="translate(-6.6814869,-500.02344)">
</g>
<g
id="g1599"
transform="translate(-6.6814869,-500.02344)">
</g>
<g
id="g1601"
transform="translate(-6.6814869,-500.02344)">
</g>
<g
id="g1603"
transform="translate(-6.6814869,-500.02344)">
</g>
<g
id="g1605"
transform="translate(-6.6814869,-500.02344)">
</g>
<g
id="g1607"
transform="translate(-6.6814869,-500.02344)">
</g>
<g
id="g1609"
transform="translate(-6.6814869,-500.02344)">
</g>
<g
id="g1611"
transform="translate(-6.6814869,-500.02344)">
</g>
<g
id="g1613"
transform="translate(-6.6814869,-500.02344)">
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.1 KiB

View File

@@ -1,160 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<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 24 24.000001"
xml:space="preserve"
sodipodi:docname="suggestions.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
width="24"
height="24"><metadata
id="metadata3871"><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="defs3869">
</defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="731"
id="namedview3867"
showgrid="false"
showborder="true"
inkscape:zoom="3.3752738"
inkscape:cx="-10.034104"
inkscape:cy="7.9414737"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
<g
id="g10054"
transform="matrix(0.5189189,0,0,0.5189189,1.0163982,0.00160744)"
style="fill:#d4aa00;stroke:#d4aa00"><path
style="fill:#d4aa00;stroke:#d4aa00;stroke-width:0.25"
d="m 21.203142,10.467879 c -7.143366,0 -12.9794492,5.550416 -12.9794492,12.344126 0,3.552267 1.6341034,6.971323 4.3887352,9.280296 2.054301,1.953747 1.867546,6.12766 1.820858,6.172064 0,0.222016 0.04669,0.39963 0.233443,0.577243 0.140066,0.13321 0.373509,0.222017 0.560264,0.222017 h 11.90561 c 0.233444,0 0.420198,-0.08881 0.560264,-0.222017 0.140066,-0.13321 0.233444,-0.355227 0.233444,-0.577243 0,-0.0444 -0.233444,-4.218317 1.820858,-6.172064 0.04669,-0.0444 0.09338,-0.08881 0.140066,-0.13321 2.707942,-2.353376 4.295357,-5.683626 4.295357,-9.147086 0,-6.79371 -5.836083,-12.344126 -12.97945,-12.344126 z m 7.470187,20.469936 c -0.04669,0.0444 -0.140066,0.13321 -0.140066,0.177613 -1.820858,1.86494 -2.147678,4.92877 -2.194367,6.39408 H 16.0207 c -0.04669,-1.46531 -0.373509,-4.66235 -2.334433,-6.571693 -2.474499,-2.042554 -3.9218482,-5.017577 -3.9218482,-8.170213 0,-5.99445 5.0890652,-10.834413 11.3920352,-10.834413 6.30297,0 11.392035,4.839963 11.392035,10.834413 0,3.152636 -1.40066,6.127659 -3.87516,8.170213 z"
id="path3812"
inkscape:connector-curvature="0" /><path
style="fill:#d4aa00;stroke:#d4aa00;stroke-width:0.25"
d="m 21.156454,13.620515 c -0.420198,0 -0.793708,0.355227 -0.793708,0.754857 0,0.39963 0.37351,0.754857 0.793708,0.754857 4.715555,0 8.497337,3.641073 8.497337,8.081406 0,0.39963 0.37351,0.754857 0.793708,0.754857 0.420198,0 0.793707,-0.355227 0.793707,-0.754857 0.04669,-5.283997 -4.482112,-9.59112 -10.084752,-9.59112 z"
id="path3814"
inkscape:connector-curvature="0" /><path
style="fill:#d4aa00;stroke:#d4aa00;stroke-width:0.25"
d="m 24.79817,42.392024 h -7.283432 c -1.07384,0 -1.960924,0.843664 -1.960924,1.86494 0,1.021277 0.887084,1.86494 1.960924,1.86494 h 7.283432 c 1.073839,0 1.960924,-0.843663 1.960924,-1.86494 0,-1.06568 -0.887085,-1.86494 -1.960924,-1.86494 z m 0,2.175764 h -7.283432 c -0.186755,0 -0.37351,-0.13321 -0.37351,-0.355227 0,-0.222017 0.140066,-0.355227 0.37351,-0.355227 h 7.283432 c 0.186755,0 0.373509,0.13321 0.373509,0.355227 0,0.222017 -0.186754,0.355227 -0.373509,0.355227 z"
id="path3818"
inkscape:connector-curvature="0" /><path
style="fill:#d4aa00;stroke:#d4aa00;stroke-width:0.25"
d="m 21.156454,6.7824021 c 0.466886,0 0.793707,-0.3552266 0.793707,-0.7548566 V 0.87675898 c 0,-0.39962998 -0.373509,-0.75485664 -0.793707,-0.75485664 -0.420198,0 -0.793708,0.35522666 -0.793708,0.75485664 V 6.0275455 c 0,0.39963 0.37351,0.7548566 0.793708,0.7548566 z"
id="path3820"
inkscape:connector-curvature="0" /><path
style="fill:#d4aa00;stroke:#d4aa00;stroke-width:0.25"
d="m 34.369347,3.9405889 c -0.373509,-0.26642 -0.840396,-0.13321 -1.07384,0.1776133 l -2.988074,4.2627199 c -0.280132,0.3552266 -0.186755,0.8436633 0.186754,1.06568 0.140066,0.088807 0.280132,0.13321 0.420198,0.13321 0.280132,0 0.513576,-0.13321 0.653642,-0.3552267 L 34.556102,4.9618655 C 34.836234,4.6510422 34.742856,4.1626056 34.369347,3.9405889 Z"
id="path3822"
inkscape:connector-curvature="0" /><path
style="fill:#d4aa00;stroke:#d4aa00;stroke-width:0.25"
d="m 11.678654,9.4021987 c 0.140066,0 0.280132,-0.044403 0.420198,-0.13321 0.37351,-0.2220166 0.466887,-0.7104533 0.233444,-1.0656799 L 9.4375981,3.8961856 C 9.2041548,3.5409589 8.6905795,3.4521522 8.3170701,3.6741689 7.9435608,3.8961856 7.8501834,4.3846222 8.0836268,4.7398489 l 2.8946972,4.3071232 c 0.186755,0.26642 0.420198,0.3552266 0.70033,0.3552266 z"
id="path3824"
inkscape:connector-curvature="0" /><path
style="fill:#d4aa00;stroke:#d4aa00;stroke-width:0.25"
d="M 6.0293254,14.108952 1.3137699,11.666769 c -0.37350933,-0.177614 -0.88708468,-0.0444 -1.07383935,0.310823 -0.23344334,0.355227 -0.0933773,0.843663 0.32682068,1.021277 l 4.71555547,2.442183 c 0.140066,0.0444 0.2334433,0.08881 0.3735093,0.08881 0.280132,0 0.5602641,-0.13321 0.7003301,-0.39963 0.1867546,-0.355227 0.046689,-0.843664 -0.3268207,-1.021277 z"
id="path3826"
inkscape:connector-curvature="0" /><path
style="fill:#d4aa00;stroke:#d4aa00;stroke-width:0.25"
d="m 42.119666,11.977592 c -0.186755,-0.355227 -0.70033,-0.488437 -1.07384,-0.310823 l -4.762244,2.442183 c -0.373509,0.177613 -0.513575,0.66605 -0.32682,1.021277 0.140066,0.26642 0.420198,0.39963 0.70033,0.39963 0.140066,0 0.280132,-0.0444 0.373509,-0.08881 l 4.762244,-2.442183 c 0.373509,-0.177614 0.513575,-0.66605 0.326821,-1.021277 z"
id="path3828"
inkscape:connector-curvature="0" /></g>
<g
id="g3836"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3838"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3840"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3842"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3844"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3846"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3848"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3850"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3852"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3854"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3856"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3858"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3860"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3862"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3864"
transform="translate(-38.804984,-406.525)">
</g>
</svg>

Before

Width:  |  Height:  |  Size: 7.2 KiB

View File

@@ -1,97 +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"
height="512.00006"
viewBox="0 0 383.99996 384.37057"
width="511.99994"
version="1.1"
id="svg4610"
sodipodi:docname="customer-support_2.svg"
inkscape:version="0.92.4 5da689c313, 2019-01-14">
<metadata
id="metadata4616">
<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="defs4614" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1360"
inkscape:window-height="703"
id="namedview4612"
showgrid="false"
showborder="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
units="px"
inkscape:zoom="0.16904657"
inkscape:cx="1544.1159"
inkscape:cy="-68.837126"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg4610" />
<g
id="g4636"
transform="matrix(0.71430651,0,0,0.75810267,1364.318,373.14432)">
<ellipse
ry="253.1329"
rx="268.67615"
cy="-238.69989"
cx="-1641.1974"
id="path4620"
style="fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0.75072366" />
<g
transform="matrix(0.86135478,0,0,0.86135478,-1800.0393,-561.71381)"
id="g4627">
<path
d="m 1.1190198,220.85955 25.6150732,44.82226 c 0.864022,1.51463 2.310204,2.61043 4.001367,3.03452 l 23.897568,5.97419 81.963492,81.9608 9.05642,-9.05349 -83.246353,-83.24098 c -0.81924,-0.82185 -1.846583,-1.40399 -2.971391,-1.68584 l -22.962422,-5.76083 -21.808639,-38.18427 18.697635,-18.69702 38.201336,21.82899 5.763655,22.96167 c 0.279227,1.1274 0.864022,2.15735 1.683262,2.97656 l 83.246357,83.24361 9.05378,-9.05612 -81.963491,-81.96079 -5.974392,-23.88361 c -0.424108,-1.69374 -1.51994,-3.14251 -3.034612,-4.00914 L 35.511286,186.51847 c -2.499867,-1.42243 -5.645115,-1.00097 -7.683995,1.02994 L 2.2148518,213.16264 c -2.05995369,2.02564 -2.50776946,5.17605 -1.095832,7.69691 z m 0,0"
id="path4600"
inkscape:connector-curvature="0"
style="stroke-width:0.67434704" />
<path
d="M 267.34562,311.82641 126.47061,452.6994 117.41419,443.64328 258.29183,302.77293 Z m 0,0"
id="path4602"
inkscape:connector-curvature="0"
style="stroke-width:0.67434704" />
<path
d="m 101.81439,457.68317 c -1.15905,-1.92818 -3.240078,-3.10563 -5.489695,-3.10563 H 57.904719 c -2.246982,0 -4.330644,1.17745 -5.487063,3.10563 l -19.211305,32.01515 c -1.21964,2.02827 -1.21964,4.56494 0,6.59585 l 19.211305,32.01515 c 1.156419,1.92554 3.240081,3.10563 5.487063,3.10563 h 38.419976 c 2.249617,0 4.330645,-1.18009 5.489695,-3.10563 l 19.20867,-32.01515 c 1.21964,-2.03091 1.21964,-4.56758 0,-6.59585 z m -9.111735,60.92467 H 61.529394 l -15.367991,-25.6116 15.367991,-25.61422 h 31.173261 l 15.367985,25.61422 z m 0,0"
id="path4604"
inkscape:connector-curvature="0"
style="stroke-width:0.67434704" />
<path
d="m 307.63852,339.31877 c 42.29226,0.14225 76.69507,-34.02762 76.83731,-76.31849 0.0211,-6.4378 -0.76919,-12.84926 -2.35235,-19.0895 -0.85348,-3.43227 -4.32801,-5.52113 -7.76038,-4.66767 -1.12745,0.28185 -2.15479,0.86399 -2.97666,1.6832 l -39.86089,39.83324 -31.62635,-10.53914 -10.54738,-31.6174 39.86089,-39.86747 c 2.49987,-2.50242 2.49723,-6.55634 -0.005,-9.05612 -0.82451,-0.82449 -1.86239,-1.40926 -2.99773,-1.68848 -41.01468,-10.38635 -82.68,14.44027 -93.0667,55.45096 -1.57789,6.2218 -2.36552,12.61746 -2.34445,19.03682 0.0158,5.04172 0.53475,10.06762 1.55682,15.00397 L 92.117859,417.71296 c -4.936512,-1.01941 -9.962588,-1.53833 -15.001835,-1.55677 -42.439783,0 -76.842586,34.40167 -76.842586,76.84005 0,42.43575 34.402803,76.83742 76.842586,76.83742 42.437146,0 76.839956,-34.40167 76.839956,-76.83742 -0.0158,-5.04171 -0.53738,-10.06762 -1.55682,-15.00397 l 33.57302,-33.57192 14.6831,14.68261 c 2.5025,2.49979 6.55392,2.49979 9.05642,0 l 3.20057,-3.2031 c 2.80807,-2.78953 7.34681,-2.78953 10.15488,0 2.80544,2.79744 2.81071,7.33868 0.0132,10.14402 -0.003,0.003 -0.008,0.008 -0.0132,0.0131 l -3.20056,3.20046 c -2.49987,2.49979 -2.49987,6.5537 0,9.05349 l 76.38686,76.38435 c 20.09114,20.27485 52.81331,20.42236 73.08884,0.33189 20.27289,-20.09046 20.42041,-52.8142 0.32927,-73.08642 -0.108,-0.11063 -0.21863,-0.22126 -0.32927,-0.3319 l -76.38687,-76.3817 c -2.49987,-2.49978 -6.55392,-2.49978 -9.05378,0 l -3.20057,3.20047 c -2.81071,2.79217 -7.34682,2.79217 -10.15752,0 -2.8028,-2.79744 -2.81071,-7.33868 -0.0132,-10.14138 0.005,-0.005 0.0105,-0.008 0.0132,-0.0131 l 3.2032,-3.2031 c 2.49987,-2.49978 2.49987,-6.5537 0,-9.05349 l -14.6831,-14.68261 33.57303,-33.57191 c 4.93651,1.0194 9.96259,1.54095 15.00184,1.55676 z m 25.15935,217.71041 c -4.65202,-0.008 -9.26452,-0.84819 -13.61887,-2.48398 l 50.0105,-50.01149 c 7.54702,20.07466 -2.60787,42.46472 -22.68319,50.01149 -4.3807,1.64633 -9.02481,2.48925 -13.70844,2.48398 z M 260.25432,390.60782 c -7.0913,8.45817 -5.97966,21.06509 2.47879,28.15352 7.43375,6.22971 18.26826,6.22443 25.6941,-0.0185 l 71.86129,71.92214 c 0.77973,0.78233 1.50941,1.60681 2.21538,2.44447 l -54.74946,54.74764 c -0.84031,-0.70331 -1.66482,-1.43296 -2.44718,-2.21529 l -71.91661,-71.91948 c 7.0913,-8.45817 5.97966,-21.06509 -2.4788,-28.15352 -7.43374,-6.23234 -18.27089,-6.22444 -25.69673,0.0158 l -10.24445,-10.24412 55.03658,-54.9531 z m 25.85742,-64.40172 -145.2636,145.22983 c -1.5937,1.59101 -2.23381,3.90114 -1.69116,6.08483 8.78509,34.49913 -12.06206,69.58831 -46.564962,78.37048 -34.50027,8.78481 -69.590603,-12.06166 -78.375698,-46.56343 -8.782462,-34.49912 12.064689,-69.5883 46.567592,-78.3731 10.436747,-2.6552 21.371359,-2.6552 31.808106,0 2.183761,0.53472 4.488696,-0.10537 6.085028,-1.68848 L 243.9064,284.03376 c 1.59106,-1.59101 2.23118,-3.90114 1.68326,-6.08219 -8.72451,-34.09611 11.84342,-68.80861 45.94065,-77.53546 6.44328,-1.64633 13.10784,-2.27852 19.74605,-1.86496 l -33.77849,33.79055 c -1.71487,1.71218 -2.31547,4.24884 -1.54892,6.54843 l 12.8049,38.42135 c 0.64012,1.90974 2.14162,3.41119 4.05405,4.04601 l 38.42262,12.80711 c 2.29703,0.76653 4.83377,0.16859 6.54864,-1.54359 l 33.7785,-33.77738 c 0.0764,1.22223 0.11591,2.4313 0.11591,3.63509 0.17912,35.184 -28.19661,63.85118 -63.38177,64.03294 -5.43965,0.0264 -10.86085,-0.64273 -16.12928,-1.9914 -2.18376,-0.54526 -4.49396,0.0922 -6.08503,1.6832 h 0.0342 z m 0,0"
id="path4606"
inkscape:connector-curvature="0"
style="stroke-width:0.67434704" />
<path
d="m 331.3833,507.67622 -9.05642,9.05612 -64.03242,-64.0303 9.05379,-9.05612 z m 0,0"
id="path4608"
inkscape:connector-curvature="0"
style="stroke-width:0.67434704" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 7.4 KiB

View File

@@ -1,96 +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"
height="24"
viewBox="-40 0 18 18.000056"
width="24"
version="1.1"
id="svg72"
sodipodi:docname="uninstall.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)">
<metadata
id="metadata78">
<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="defs76" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="703"
id="namedview74"
showgrid="false"
showborder="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="5.7611241"
inkscape:cx="40.648821"
inkscape:cy="17.781204"
inkscape:window-x="0"
inkscape:window-y="260"
inkscape:window-maximized="1"
inkscape:current-layer="svg72"
units="px" />
<g
id="g5907"
transform="matrix(0.50000001,0,0,0.49999997,-20.000045,0)">
<g
transform="matrix(0.10380557,0,0,0.08430914,-35.847729,0)"
id="g84">
<path
d="m 192.40098,154.70443 c -5.52344,0 -10,4.47657 -10,10 v 189 c 0,5.51954 4.47656,10 10,10 5.52343,0 10,-4.48046 10,-10 v -189 c 0,-5.52343 -4.47657,-10 -10,-10 z m 0,0"
id="path64"
inkscape:connector-curvature="0" />
<path
d="m 74.400978,154.70443 c -5.52344,0 -10,4.47657 -10,10 v 189 c 0,5.51954 4.47656,10 10,10 5.52344,0 10,-4.48046 10,-10 v -189 c 0,-5.52343 -4.47656,-10 -10,-10 z m 0,0"
id="path66"
inkscape:connector-curvature="0" />
<path
d="m -11.599024,127.1224 v 246.37891 c 0,14.5625 5.3398433,28.23828 14.6679683,38.05078 9.2851557,9.83984 22.2070317,15.42578 35.7304687,15.44922 H 228.00254 c 13.52734,-0.0234 26.44922,-5.60938 35.73047,-15.44922 9.32812,-9.8125 14.66797,-23.48828 14.66797,-38.05078 V 127.1224 C 296.94395,122.20053 308.95957,104.28647 306.4791,85.259126 303.99473,66.235689 287.7877,52.00522 268.6002,52.001314 h -51.19922 v -12.5 c 0.0586,-10.511719 -4.09766,-20.605469 -11.53907,-28.03125 -7.4414,-7.4218751 -17.55078,-11.55468758 -28.0625,-11.46875008 H 89.002538 C 78.490818,-0.08462358 68.381448,4.0481889 60.940038,11.470064 53.498632,18.895845 49.342382,28.989595 49.400976,39.501314 v 12.5 H -1.7982427 c -19.1875003,0.0039 -35.3945313,14.234375 -37.8789073,33.257812 -2.480468,19.027344 9.535157,36.941404 28.078126,41.863274 z M 228.00254,407.00131 H 38.799413 c -17.097656,0 -30.3984367,-14.6875 -30.3984367,-33.5 v -245.5 H 258.40098 v 245.5 c 0,18.8125 -13.30078,33.5 -30.39844,33.5 z M 69.400978,39.501314 c -0.0664,-5.207031 1.98047,-10.21875 5.67578,-13.894531 3.69141,-3.675781 8.71484,-5.695313 13.92578,-5.605469 h 88.796872 c 5.21094,-0.08984 10.23438,1.929688 13.92579,5.605469 3.69531,3.671875 5.74218,8.6875 5.67578,13.894531 v 12.5 H 69.400978 Z m -71.1992207,32.5 H 268.6002 c 9.9414,0 18,8.058594 18,18 0,9.941406 -8.0586,17.999996 -18,17.999996 H -1.7982427 c -9.9414073,0 -18.0000003,-8.05859 -18.0000003,-17.999996 0,-9.941406 8.058593,-18 18.0000003,-18 z m 0,0"
id="path68"
inkscape:connector-curvature="0" />
<path
d="m 133.40098,154.70443 c -5.52344,0 -10,4.47657 -10,10 v 189 c 0,5.51954 4.47656,10 10,10 5.52343,0 10,-4.48046 10,-10 v -189 c 0,-5.52343 -4.47657,-10 -10,-10 z m 0,0"
id="path70"
inkscape:connector-curvature="0" />
</g>
<path
inkscape:connector-curvature="0"
id="path3791"
d="m -32.347465,34.215765 c -1.136967,-0.263564 -1.85228,-0.770702 -2.285878,-1.620623 -0.244025,-0.478328 -0.252697,-0.85963 -0.252697,-11.110455 V 10.869559 h 12.888149 12.8881497 l -0.0028,10.577396 c -0.0027,10.017853 -0.01562,10.604942 -0.243951,11.098129 -0.295923,0.639162 -0.8228787,1.147628 -1.5106647,1.457656 -0.486498,0.219295 -1.201157,0.235997 -10.870308,0.254055 -5.692267,0.01062 -10.46674,-0.0078 -10.609942,-0.04103 z m 4.983091,-3.760996 0.289334,-0.202658 v -8.369266 c 0,-8.31107 -0.0019,-8.370969 -0.270765,-8.614305 -0.358608,-0.324535 -1.182796,-0.324535 -1.541404,0 -0.268882,0.243336 -0.270765,0.303235 -0.270765,8.614305 v 8.369266 l 0.289334,0.202658 c 0.159133,0.11146 0.497593,0.202656 0.752133,0.202656 0.25454,0 0.593,-0.0912 0.752133,-0.202656 z m 6.118617,0 0.289333,-0.202658 v -8.369266 c 0,-8.31107 -0.0019,-8.370969 -0.270764,-8.614305 -0.358608,-0.324535 -1.182797,-0.324535 -1.541404,0 -0.268883,0.243336 -0.270765,0.303235 -0.270765,8.614305 v 8.369266 l 0.289333,0.202658 c 0.159134,0.11146 0.497593,0.202656 0.752133,0.202656 0.25454,0 0.593001,-0.0912 0.752134,-0.202656 z m 6.118616,0 0.289334,-0.202658 v -8.369266 c 0,-8.31107 -0.0019,-8.370969 -0.270765,-8.614305 -0.358608,-0.324535 -1.182796,-0.324535 -1.541404,0 -0.268882,0.243336 -0.270765,0.303235 -0.270765,8.614305 v 8.369266 l 0.289334,0.202658 c 0.159132,0.11146 0.497593,0.202656 0.752133,0.202656 0.254539,0 0.593,-0.0912 0.752133,-0.202656 z"
style="fill:#b3b3b3;stroke-width:0.13018332" />
<path
inkscape:connector-curvature="0"
id="path3793"
d="m -36.877845,8.8644087 c -0.540224,-0.2384603 -0.844092,-0.6148864 -0.931583,-1.1540278 -0.06403,-0.3945707 -0.01083,-0.5268359 0.386094,-0.9599757 l 0.460354,-0.5023539 14.753284,-0.034506 c 10.894353,-0.025481 14.8480787,0.00467 15.1156987,0.115259 0.791461,0.3270622 1.121594,1.3085049 0.671312,1.9957216 -0.490508,0.7486088 0.06973,0.7229272 -15.6494407,0.7173712 -11.671083,-0.00413 -14.489515,-0.037913 -14.805719,-0.1774884 z"
style="fill:#b3b3b3;stroke-width:0.13018332" />
<path
inkscape:connector-curvature="0"
id="path3795"
d="m -28.586127,3.581076 c 0.04302,-0.5947544 0.131512,-0.8607897 0.373651,-1.1233362 0.63458,-0.6880588 0.750066,-0.7010134 6.249312,-0.7010134 4.435032,0 5.151954,0.027404 5.540514,0.2117885 0.718185,0.3408012 0.959962,0.7509159 0.959962,1.6283345 V 4.360393 h -6.589905 -6.589904 z"
style="fill:#b3b3b3;stroke-width:0.13018332" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.6 KiB

View File

@@ -230,10 +230,12 @@ core.config.ui.auto_scale.tip=It activates the auto screen scale factor ( {} ).
core.config.ui.hdpi=HDPI
core.config.ui.hdpi.tip=If improvements related to HDPI resolutions should be activated
core.config.ui.max_displayed=Applications displayed
core.config.ui.max_displayed.tip=Maximum number of applications displayed on the table
core.config.ui.max_displayed.tip=Maximum number of applications displayed on the table. Use 0 for no limit.
core.config.ui.qt_style.tooltip=QT style to be used. Requires restarting to take effect.
core.config.ui.scale_factor=Scale
core.config.ui.scale_factor.tip=It defines the interface display scaling factor (Qt). Raise the value to raise the interface size. Restart required.
core.config.ui.style.default=Default
core.config.ui.system_theme=System theme
core.config.ui.system_theme.tip=If the system's theme/stylesheet should be merged with {app}'s
core.config.ui.tray.default_icon=Default icon
core.config.ui.tray.default_icon.tip=The default icon for {app} displayed on the tray
core.config.ui.tray.updates_icon=Update icon
@@ -298,20 +300,23 @@ manage_window.bt.installed.text=instal·lada
manage_window.bt.installed.tooltip=Feu clic aquí per a mostrar les aplicacions instal·lades
manage_window.bt.refresh.text=Refresca
manage_window.bt.refresh.tooltip=Carrega novament les dades quant a les aplicacions instal·lades
manage_window.bt.suggestions.text=Suggeriments
manage_window.bt.suggestions.tooltip=Feu clic aquí per a mostrar alguns suggeriments daplicacions
manage_window.bt.upgrade.text=Actualitza
manage_window.bt.upgrade.tooltip=Actualitza totes les aplicacions marcades
manage_window.bt_custom_actions.tip=Click here to show more actions
manage_window.bt_settings.tooltip=Feu clic aquí per mostrar la configuració
manage_window.bt_themes.tip=Click here to choose a theme
manage_window.bt_themes.option.invalid=Invalid
manage_window.checkbox.only_apps=Aplicacions
manage_window.checkbox.show_details=Mostra detalls
manage_window.columns.installed=Installed
manage_window.columns.latest_version=Versió més recent
manage_window.columns.update=Voleu actualitzar?
manage_window.label.apps_displayed.tip=Applications displayed / available
manage_window.label.updates=Actualitzacions
manage_window.name_filter.placeholder=Filtra per nom
manage_window.name_filter.tooltip=Escriviu aquí per a filtrar aplicacions per nom
manage_window.name_filter.button_tooltip=Click here to filter apps by name
manage_window.name_filter.placeholder=Nom
manage_window.name_filter.tooltip=Type and press ENTER to filter apps by name
manage_window.settings.about=Quant a
manage_window.status.downgrading=Sestà revertint
manage_window.status.filtering=Sestà filtrant
@@ -352,9 +357,9 @@ popup.history.selected.tooltip=Versió actual
popup.history.title=Historial
popup.root.bad_password.body=La contrasenya és incorrecta
popup.root.bad_password.last_try=Shan acabat els intents. Sha cancel·lat loperació.
popup.root.bad_password.title=Error
popup.root.continue=continuar
popup.root.title=Requireix la vostra contrasenya per a continuar
popup.root.continue=Continuar
popup.root.msg=Requireix la vostra contrasenya per a continuar
popup.root.title=Autenticació
popup.screenshots.no_screenshot.body=no shan pogut recuperar captures de pantalla del {}
prepare.bt_hide_details=Hide details
prepare.bt_icon.no_output=There are no progress details for this task to be displayed
@@ -369,8 +374,7 @@ repository=dipòsit
screenshots.bt_back.label=anterior
screenshots.bt_next.label=següent
screenshots.download.no_content=No hi ha contingut a mostrar
screenshots.download.no_response=No sha trobat la imatge
screenshots.download.running=sestà baixant la imatge
screenshots.image.loading=Loading
settings=configuració
settings.changed.success.reboot=Restart now ?
settings.changed.success.warning=Settings successfully changed. Some of them will only take effect after a restart.
@@ -403,6 +407,7 @@ view.components.file_chooser.placeholder=Feu clic aquí per seleccionar
warning=avís
warning.update_available=There is a new {} version available ({}). Check out the news at {}.
welcome=us donem la benvinguda
window_manage.input_search.placeholder=Cerca
window_manage.input_search.tooltip=Escriviu i premeu Intro per a cercar aplicacions
window_manage.search_bar.button_tooltip=Click here to search for applications
window_manage.search_bar.placeholder=Cerca
window_manage.search_bar.tooltip=Escriviu i premeu Intro per a cercar aplicacions
yes=sí

View File

@@ -229,10 +229,12 @@ core.config.ui.auto_scale.tip=Aktiviert den automatischen Skalierungsfaktor ({})
core.config.ui.hdpi=HiDPI
core.config.ui.hdpi.tip=Falls aktiviert werden Optimierungen für hochauflösende Displays vorgenommen
core.config.ui.max_displayed=Anzahl der Anwendungen
core.config.ui.max_displayed.tip=Maximale Anzahl von Anwendungen, die in der Tabelle angezeigt werden
core.config.ui.max_displayed.tip=Maximale Anzahl von Anwendungen, die in der Tabelle angezeigt werden. Use 0 for no limit.
core.config.ui.qt_style.tooltip=QT style to be used. Requires restarting to take effect.
core.config.ui.scale_factor=Scale
core.config.ui.scale_factor.tip=It defines the interface display scaling factor (Qt). Raise the value to raise the interface size. Restart required.
core.config.ui.style.default=Default
core.config.ui.system_theme=System theme
core.config.ui.system_theme.tip=If the system's theme/stylesheet should be merged with {app}'s
core.config.ui.tray.default_icon=Anwendungs-Icon
core.config.ui.tray.default_icon.tip=The default icon for {app} displayed on the tray
core.config.ui.tray.updates_icon=Icon bei Updates
@@ -297,20 +299,23 @@ manage_window.bt.installed.text=installiert
manage_window.bt.installed.tooltip=Installierte Anwendungen anzeigen
manage_window.bt.refresh.text=Aktualisieren
manage_window.bt.refresh.tooltip=Informationen über installierte Anwendungen aktualisieren
manage_window.bt.suggestions.text=Vorschläge
manage_window.bt.suggestions.tooltip=Vorschläge für Apps anzeigen
manage_window.bt.upgrade.text=Upgraden
manage_window.bt.upgrade.tooltip=Alle ausgewählten Anwendungen upgraden
manage_window.bt_custom_actions.tip=Click here to show more actions
manage_window.bt_settings.tooltip=Einstellungen anpassen
manage_window.bt_themes.tip=Click here to choose a theme
manage_window.bt_themes.option.invalid=Invalid
manage_window.checkbox.only_apps=Apps
manage_window.checkbox.show_details=Details anzeigen
manage_window.columns.installed=Installed
manage_window.columns.latest_version=Neueste Version
manage_window.columns.update=Upgraden?
manage_window.label.apps_displayed.tip=Applications displayed / available
manage_window.label.updates=Updates
manage_window.name_filter.placeholder=Nach Name filtern
manage_window.name_filter.tooltip=Apps nach Name filtern
manage_window.name_filter.button_tooltip=Click here to filter apps by name
manage_window.name_filter.placeholder=Name
manage_window.name_filter.tooltip=Type and press ENTER to filter apps by name
manage_window.settings.about=Über
manage_window.status.downgrading=Downgraden
manage_window.status.filtering=Filtern
@@ -351,9 +356,9 @@ popup.history.selected.tooltip=Aktuelle Version
popup.history.title=Verlauf
popup.root.bad_password.body=Ungültiges Passwort
popup.root.bad_password.last_try=Zu viele Fehlversuche. Aktion abgebrochen.
popup.root.bad_password.title=Fehler
popup.root.continue=Fortfahren
popup.root.title=Zum Fortfahren wird das Passwort benötigt.
popup.root.msg=Zum Fortfahren wird das Passwort benötigt.
popup.root.title=Authentifizierung
popup.screenshots.no_screenshot.body={} Screenshots konnten nicht heruntergeladen werden.
prepare.bt_hide_details=Hide details
prepare.bt_icon.no_output=There are no progress details for this task to be displayed
@@ -369,7 +374,7 @@ screenshots.bt_back.label=Zurück
screenshots.bt_next.label=Fortfahren
screenshots.download.no_content=Kein Inhalt
screenshots.download.no_response=Screenshot nicht gefunden
screenshots.download.running=Screenshot herunterladen
screenshots.image.loading=Loading
settings=Einstellungen
settings.changed.success.reboot=Anwendung neustarten?
settings.changed.success.warning=Einstellungen gespeichert. Einige werden erst beim nächsten Anwedungsstart sichtbar.
@@ -402,6 +407,7 @@ view.components.file_chooser.placeholder=Auswählen
warning=Warnung
warning.update_available=There is a new {} version available ({}). Check out the news at {}.
welcome=Willkommen
window_manage.input_search.placeholder=Suchbegriff
window_manage.input_search.tooltip=Suchbegriff eingeben und Enter drücken, um zu suchen
window_manage.search_bar.button_tooltip=Click here to search for applications
window_manage.search_bar.placeholder=Suchbegriff
window_manage.search_bar.tooltip=Suchbegriff eingeben und Enter drücken, um zu suchen
yes=Ja

View File

@@ -228,11 +228,13 @@ core.config.ui.auto_scale.tip=It activates the auto screen scale factor ( {} ).
core.config.ui.auto_scale=Auto scale
core.config.ui.hdpi.tip=If improvements related to HDPI resolutions should be activated
core.config.ui.hdpi=HDPI
core.config.ui.max_displayed.tip=Maximum number of applications displayed on the table
core.config.ui.max_displayed.tip=Maximum number of applications displayed on the table. Use 0 for no limit.
core.config.ui.max_displayed=Applications displayed
core.config.ui.qt_style.tooltip=QT style to be used. Requires restarting to take effect.
core.config.ui.scale_factor=Scale
core.config.ui.scale_factor.tip=It defines the interface display scaling factor (Qt). Raise the value to raise the interface size. Restart required.
core.config.ui.style.default=Default
core.config.ui.system_theme=System theme
core.config.ui.system_theme.tip=If the system's theme/stylesheet should be merged with {app}'s
core.config.ui.tray.default_icon.tip=The default icon for {app} displayed on the tray
core.config.ui.tray.default_icon=Default icon
core.config.ui.tray.updates_icon.tip=The displayed icon when there are updates available
@@ -298,20 +300,23 @@ manage_window.bt.installed.text=installed
manage_window.bt.installed.tooltip=Click here to show the installed applications
manage_window.bt.refresh.text=Refresh
manage_window.bt.refresh.tooltip=Reload the data about installed applications
manage_window.bt.suggestions.text=Suggestions
manage_window.bt.suggestions.tooltip=Click here to show some applications suggestions
manage_window.bt.upgrade.text=Upgrade
manage_window.bt.upgrade.tooltip=Upgrade all checked applications
manage_window.bt_custom_actions.tip=Click here to show more actions
manage_window.bt_settings.tooltip=Click here to display the settings
manage_window.bt_themes.tip=Click here to choose a theme
manage_window.bt_themes.option.invalid=Invalid
manage_window.checkbox.only_apps=Apps
manage_window.checkbox.show_details=Show details
manage_window.columns.installed=Installed
manage_window.columns.latest_version=Latest Version
manage_window.columns.update=Upgrade ?
manage_window.label.apps_displayed.tip=Applications displayed / available
manage_window.label.updates=Updates
manage_window.name_filter.placeholder=Filter by name
manage_window.name_filter.tooltip=Type here to filter apps by name
manage_window.name_filter.button_tooltip=Click here to filter apps by name
manage_window.name_filter.placeholder=Name
manage_window.name_filter.tooltip=Type and press ENTER to filter apps by name
manage_window.settings.about=About
manage_window.status.downgrading=Downgrading
manage_window.status.filtering=Filtering
@@ -321,7 +326,7 @@ manage_window.status.ignore_updates_reverse=Reverting updates ignored from {}
manage_window.status.info=Retrieving information
manage_window.status.installed=Loading installed
manage_window.status.installing=Installing
manage_window.status.refreshing=Refreshing
manage_window.status.refreshing=Refreshing apps
manage_window.status.refreshing_app=Refreshing
manage_window.status.running_app=Launching {}
manage_window.status.screenshots=Retrieving {} screenshots
@@ -352,9 +357,9 @@ popup.history.selected.tooltip=Current version
popup.history.title=History
popup.root.bad_password.body=Wrong password
popup.root.bad_password.last_try=Attempts finished. Action cancelled.
popup.root.bad_password.title=Error
popup.root.continue=continue
popup.root.title=Requires your password to continue
popup.root.continue=Continue
popup.root.msg=Requires your password to continue
popup.root.title=Authentication
popup.screenshots.no_screenshot.body=it was not possible to retrieve {} screenshots
prepare.bt_hide_details=Hide details
prepare.bt_icon.no_output=There are no progress details for this task to be displayed
@@ -370,7 +375,7 @@ screenshots.bt_back.label=previous
screenshots.bt_next.label=next
screenshots.download.no_content=No content to display
screenshots.download.no_response=Image not found
screenshots.download.running=downloading image
screenshots.image.loading=Loading
settings.changed.success.reboot=Restart now ?
settings.changed.success.warning=Settings successfully changed. Some of them will only take effect after a restart.
settings.error=It was not possible to properly change all the settings
@@ -403,6 +408,7 @@ view.components.file_chooser.placeholder=Click here to select
warning=warning
welcome=welcome
warning.update_available=There is a new {} version available ({}). Check out the news at {}.
window_manage.input_search.placeholder=Search
window_manage.input_search.tooltip=Type and press ENTER to search for applications
window_manage.search_bar.button_tooltip=Click here to search for applications
window_manage.search_bar.placeholder=Search
window_manage.search_bar.tooltip=Type and press ENTER to search for applications
yes=yes

View File

@@ -98,7 +98,7 @@ amount=cantidad
and=y
any=cualquiera
app.name=nombre de la aplicación
applications=applications
applications=aplicaciones
ask=preguntar
ask.continue=¿Quiere continuar?
author=autor
@@ -230,10 +230,12 @@ core.config.ui.auto_scale.tip=Activa el factor de escala de pantalla automática
core.config.ui.hdpi=HDPI
core.config.ui.hdpi.tip=Si se deben activar las mejoras relacionadas con las resoluciones HDPI
core.config.ui.max_displayed=Aplicaciones mostradas
core.config.ui.max_displayed.tip=Número máximo de aplicaciones que se muestran en la tabla
core.config.ui.max_displayed.tip=Número máximo de aplicaciones que se muestran en la tabla. Utilice 0 para no tener límite.
core.config.ui.qt_style.tooltip=Estilo QT que se utilizará. Requiere reiniciar para que surta efecto.
core.config.ui.scale_factor=Escala
core.config.ui.scale_factor.tip=Define el factor de escala de visualización de la interfaz (Qt). Aumente el valor para aumentar el tamaño de la interfaz. Reinicio requerido.
core.config.ui.style.default=Predeterminado
core.config.ui.system_theme=Tema del sistema
core.config.ui.system_theme.tip=Si el tema/hoja de estilo del sistema debe fusionarse con de {app}
core.config.ui.tray.default_icon=Ícono predeterminado
core.config.ui.tray.default_icon.tip=El icono predeterminado que se muestra en la bandeja
core.config.ui.tray.updates_icon=Icono de actualización
@@ -274,6 +276,7 @@ locale.ca=catalán
locale.de=alemán
locale.en=inglés
locale.es=español
locale.fr=francés
locale.it=italiano
locale.pt=portugués
locale.ru=ruso
@@ -298,20 +301,23 @@ manage_window.bt.installed.text=instaladas
manage_window.bt.installed.tooltip=Pulse aquí para mostrar las aplicaciones instaladas
manage_window.bt.refresh.text=Recargar
manage_window.bt.refresh.tooltip=Recarga los datos sobre las aplicaciones instaladas
manage_window.bt.suggestions.text=Sugerencias
manage_window.bt.suggestions.tooltip=Pulse aquí para mostrar algunas sugerencias de aplicaciones
manage_window.bt.upgrade.text=Actualizar
manage_window.bt.upgrade.tooltip=Actualiza todas las aplicaciones marcadas
manage_window.bt_custom_actions.tip=Pulse aquí para mostrar más acciones
manage_window.bt_settings.tooltip=Pulse aquí para exhibir las configuraciones
manage_window.bt_themes.tip=Pulse aquí para elegir un tema
manage_window.bt_themes.option.invalid=Inválido
manage_window.checkbox.only_apps=Aplicaciones
manage_window.checkbox.show_details=Mostrar detalles
manage_window.columns.installed=Instaladas
manage_window.columns.latest_version=Versión más reciente
manage_window.columns.update=¿Quiere actualizar?
manage_window.label.apps_displayed.tip=Applicaciones mostradas / disponibles
manage_window.label.updates=Actualizaciones
manage_window.name_filter.placeholder=Filtrar por nombre
manage_window.name_filter.tooltip=Escriba aquí para filtrar aplicaciones por nombre
manage_window.name_filter.button_tooltip=Haga clic aquí para filtrar aplicaciones por nombre
manage_window.name_filter.placeholder=Nombre
manage_window.name_filter.tooltip=Escriba y oprima Intro para filtrar aplicaciones por nombre
manage_window.settings.about=Acerca de
manage_window.status.downgrading=Revirtiendo
manage_window.status.filtering=Filtrando
@@ -321,7 +327,7 @@ manage_window.status.ignore_updates_reverse=Revertir actualizaciones ignoradas d
manage_window.status.info=Obteniendo información
manage_window.status.installed=Cargando instalados
manage_window.status.installing=Instalando
manage_window.status.refreshing=Recargando
manage_window.status.refreshing=Cargando applicaciones
manage_window.status.refreshing_app=Actualizando
manage_window.status.running_app=Ejecutando {}
manage_window.status.screenshots=Obteniendo imágenes de {}
@@ -352,9 +358,9 @@ popup.history.selected.tooltip=Versión actual
popup.history.title=Histórico
popup.root.bad_password.body=Contraseña incorrecta
popup.root.bad_password.last_try=Intentos finalizados. Acción cancelada.
popup.root.bad_password.title=Error
popup.root.continue=continuar
popup.root.title=Proporcione su contraseña para continuar
popup.root.continue=Continuar
popup.root.msg=Proporcione su contraseña para continuar
popup.root.title=Autenticación
popup.screenshots.no_screenshot.body=No fue posible recuperar las fotos de {}
prepare.bt_hide_details=Ocultar detalles
prepare.bt_icon.no_output=No hay detalles del progreso de esta tarea para mostrar
@@ -371,7 +377,7 @@ screenshots.bt_back.label=anterior
screenshots.bt_next.label=siguiente
screenshots.download.no_content=No hay contenido para mostrar
screenshots.download.no_response=No se encontró la imagen
screenshots.download.running=descargando imagen
screenshots.image.loading=Cargando
settings=configuraciones
settings.changed.success.reboot=¿Reiniciar ahora?
settings.changed.success.warning=Las configuraciones se cambiaron con éxito. Algunas solo tendrán efecto después del reinicio.
@@ -404,6 +410,7 @@ view.components.file_chooser.placeholder=Pulse aquí para seleccionar
warning=aviso
warning.update_available=Hay una nueva versión de {} disponible ({}). Vea las novedades en {}.
welcome=bienvenido
window_manage.input_search.placeholder=Buscar
window_manage.input_search.tooltip=Escriba y oprima Intro para buscar aplicaciones
window_manage.search_bar.button_tooltip=Haga clic aquí para buscar aplicaciones
window_manage.search_bar.placeholder=Buscar
window_manage.search_bar.tooltip=Escriba y oprima Intro para buscar aplicaciones
yes=sí

View File

@@ -230,9 +230,9 @@ core.config.ui.hdpi.tip=Si les améliorations liées à HDPI doivent être activ
core.config.ui.hdpi=HDPI
core.config.ui.max_displayed.tip=Nombre maximal d'application affichées dans le tableau
core.config.ui.max_displayed=Applications affichées
core.config.ui.qt_style.tooltip=QT style to be used. Requires restarting to take effect.
core.config.ui.scale_factor=Mettre à l'échelle
core.config.ui.scale_factor.tip=Définit le facteur de mise à l'échelle (Qt). L'augmenter agrandit l'interface. Redémarrage nécessaire.
core.config.ui.style.default=Défaut
core.config.ui.tray.default_icon.tip=Icône par défaut pour {app} dans la barre système
core.config.ui.tray.default_icon=Icône par dafaut
core.config.ui.tray.updates_icon.tip=Icône affichée quand il y a des mises à jour disponibles
@@ -303,6 +303,8 @@ manage_window.bt.upgrade.text=Mettre à jour
manage_window.bt.upgrade.tooltip=Mettre à jour toutes les applications sélectionnées
manage_window.bt_custom_actions.tip=Cliquez ici pour plus d'actions
manage_window.bt_settings.tooltip=Cliquez ici pour afficher les paramètres
manage_window.bt_themes.tip=Click here to choose a theme
manage_window.bt_themes.option.invalid=Invalid
manage_window.checkbox.only_apps=Apps
manage_window.checkbox.show_details=Détails
manage_window.columns.installed=Installé

View File

@@ -230,10 +230,12 @@ core.config.ui.auto_scale.tip=It activates the auto screen scale factor ( {} ).
core.config.ui.hdpi=HDPI
core.config.ui.hdpi.tip=If improvements related to HDPI resolutions should be activated
core.config.ui.max_displayed=Applications displayed
core.config.ui.max_displayed.tip=Maximum number of applications displayed on the table
core.config.ui.max_displayed.tip=Maximum number of applications displayed on the table. Use 0 for no limit.
core.config.ui.qt_style.tooltip=QT style to be used. Requires restarting to take effect.
core.config.ui.scale_factor=Scale
core.config.ui.scale_factor.tip=It defines the interface display scaling factor (Qt). Raise the value to raise the interface size. Restart required.
core.config.ui.style.default=Default
core.config.ui.system_theme=System theme
core.config.ui.system_theme.tip=If the system's theme/stylesheet should be merged with {app}'s
core.config.ui.tray.default_icon=Default icon
core.config.ui.tray.default_icon.tip=The default icon for {app} displayed on the tray
core.config.ui.tray.updates_icon=Update icon
@@ -299,20 +301,23 @@ manage_window.bt.installed.text=installato
manage_window.bt.installed.tooltip=Clicca qui per mostrare le applicazioni installate
manage_window.bt.refresh.text=Refresh
manage_window.bt.refresh.tooltip=Ricarica i dati sulle applicazioni installate
manage_window.bt.suggestions.text=Suggerimenti
manage_window.bt.suggestions.tooltip=Clicca qui per mostrare alcuni suggerimenti sulle applicazioni
manage_window.bt.upgrade.text=Aggiorna
manage_window.bt.upgrade.tooltip=Aggiorna tutte le applicazioni controllate
manage_window.bt_custom_actions.tip=Click here to show more actions
manage_window.bt_settings.tooltip=Fai clic qui per visualizzare le impostazioni
manage_window.bt_themes.tip=Click here to choose a theme
manage_window.bt_themes.option.invalid=Invalid
manage_window.checkbox.only_apps=Apps
manage_window.checkbox.show_details=Mostra dettagli
manage_window.columns.installed=Installed
manage_window.columns.latest_version=Ultima Versione
manage_window.columns.update=Upgrade ?
manage_window.label.apps_displayed.tip=Applications displayed / available
manage_window.label.updates=Aggiornamenti
manage_window.name_filter.button_tooltip=Click here to filter apps by name
manage_window.name_filter.placeholder=Filtra per nome
manage_window.name_filter.tooltip=Digita qui per filtrare le app per nome
manage_window.name_filter.tooltip=Type and press ENTER to filter apps by name
manage_window.settings.about=Informazione su
manage_window.status.downgrading=Downgrading
manage_window.status.filtering=Filtraggio
@@ -353,9 +358,9 @@ popup.history.selected.tooltip=Version corrente
popup.history.title=Cronlogia
popup.root.bad_password.body=Password errata
popup.root.bad_password.last_try=Tentativi conclusi. Azione annullata.
popup.root.bad_password.title=Errore
popup.root.continue=continuare
popup.root.title=Richiede la tua password per continuare
popup.root.continue=Continuare
popup.root.msg=Richiede la tua password per continuare
popup.root.title=Autenticazione
popup.screenshots.no_screenshot.body=non è stato possibile recuperare {} schermate
prepar_panel.bt_skip.label=saltare
prepare.bt_hide_details=Hide details
@@ -372,7 +377,7 @@ screenshots.bt_back.label=precedente
screenshots.bt_next.label=prossimo
screenshots.download.no_content=Nessun contenuto da visualizzare
screenshots.download.no_response=Immagine non trovata
screenshots.download.running=scaricare l'immagine
screenshots.image.loading=Loading
settings=impostazioni
settings.changed.success.reboot=Restart now ?
settings.changed.success.warning=Settings successfully changed. Some of them will only take effect after a restart.
@@ -405,6 +410,7 @@ view.components.file_chooser.placeholder=Fai clic qui per selezionare
warning=Avviso
warning.update_available=There is a new {} version available ({}). Check out the news at {}.
welcome=benvenuto
window_manage.input_search.placeholder=Cerca
window_manage.input_search.tooltip=Digitare e premere INVIO per cercare applicazioni
window_manage.search_bar.button_tooltip=Click here to search for applications
window_manage.search_bar.placeholder=Cerca
window_manage.search_bar.tooltip=Digitare e premere INVIO per cercare applicazioni
yes=si

View File

@@ -228,11 +228,13 @@ core.config.ui.auto_scale.tip=Ativa o fator de escala automático ( {} ). Corrig
core.config.ui.auto_scale=Escala automática
core.config.ui.hdpi.tip=Se melhorias para resoluções HDPI devem ser ativadas
core.config.ui.hdpi=HDPI
core.config.ui.max_displayed.tip=Número máximo de aplicativos exibidos na tabela
core.config.ui.max_displayed.tip=Número máximo de aplicativos exibidos na tabela. Use 0 para não haver limite.
core.config.ui.max_displayed=Aplicativos exibidos
core.config.ui.qt_style.tooltip=Estilo QT a ser utilizado. Requer reinicialização para surtir efeito.
core.config.ui.scale_factor=Escala
core.config.ui.scale_factor.tip=Define o fator de escala de exibição da interface (Qt). Aumente o valor para aumentar o tamanho da interface. Reinicialização necessária.
core.config.ui.style.default=Padrão
core.config.ui.system_theme=Tema do sistema
core.config.ui.system_theme.tip=Se o tema/folha de estilo do sistema deve ser mesclado com o do {app}
core.config.ui.tray.default_icon.tip=O ícone padrão exibido na bandeja
core.config.ui.tray.default_icon=Ícone padrão
core.config.ui.tray.updates_icon.tip=O ícone exibido quando há atualizações disponíveis
@@ -273,6 +275,7 @@ locale.ca=catalão
locale.de=alemão
locale.en=inglês
locale.es=espanhol
locale.fr=francês
locale.it=italiano
locale.pt=português
locale.ru=russo
@@ -297,20 +300,23 @@ manage_window.bt.installed.text=instalados
manage_window.bt.installed.tooltip=Clique aqui para exibir os aplicativos instalados
manage_window.bt.refresh.text=Recarregar
manage_window.bt.refresh.tooltip=Recarrega os dados sobre os aplicativos instalados
manage_window.bt.suggestions.text=Sugestões
manage_window.bt.suggestions.tooltip=Clique aqui para exibir algumas sugestões de aplicativos
manage_window.bt.upgrade.text=Atualizar
manage_window.bt.upgrade.tooltip=Atualiza todos os aplicativos marcados
manage_window.bt_custom_actions.tip=Clique aqui para exibir mais ações
manage_window.bt_settings.tooltip=Clique aqui para exibir as configurações
manage_window.bt_themes.tip=Clique aqui para escolher um tema
manage_window.bt_themes.option.invalid=Inválido
manage_window.checkbox.only_apps=Aplicativos
manage_window.checkbox.show_details=Mostrar detalhes
manage_window.columns.installed=Instalado
manage_window.columns.latest_version=Última Versão
manage_window.columns.update=Atualizar ?
manage_window.label.apps_displayed.tip=Aplicações exibidas / disponíveis
manage_window.label.updates=Atualizações
manage_window.name_filter.button_tooltip=Clique aqui para filtrar aplicativos por nome
manage_window.name_filter.placeholder=Filtrar por nome
manage_window.name_filter.tooltip=Digite aqui para filtrar aplicativos pelo nome
manage_window.name_filter.tooltip=Digite e pressione ENTER para filtrar aplicativos pelo nome
manage_window.settings.about=Sobre
manage_window.status.downgrading=Revertendo
manage_window.status.filtering=Filtrando
@@ -320,7 +326,7 @@ manage_window.status.ignore_updates_reverse=Revertendo atualizações ignoradas
manage_window.status.info=Obtendo informação
manage_window.status.installed=Carregando instalados
manage_window.status.installing=Instalando
manage_window.status.refreshing=Recarregando
manage_window.status.refreshing=Carregando aplicativos
manage_window.status.refreshing_app=Atualizando
manage_window.status.running_app=Iniciando {}
manage_window.status.screenshots=Obtendo imagens de {}
@@ -351,9 +357,9 @@ popup.history.selected.tooltip=Versão atual
popup.history.title=Histórico
popup.root.bad_password.body=Senha incorreta
popup.root.bad_password.last_try=Tentativas finalizadas. Ação cancelada.
popup.root.bad_password.title=Erro
popup.root.continue=prosseguir
popup.root.title=Requer sua senha para prosseguir
popup.root.continue=Prosseguir
popup.root.msg=Requer sua senha para prosseguir
popup.root.title=Autenticação
popup.screenshots.no_screenshot.body=Não foi possível obter as fotos de {}
prepare.bt_hide_details=Ocultar detalhes
prepare.bt_icon.no_output=Não existe detalhes do progresso dessa tarefa para ser exibido
@@ -365,11 +371,11 @@ proceed=continuar
publisher.verified=verificado
publisher=publicador
repository=repositório
screenshots.download.running=baixando imagem
screenshots.bt_back.label=anterior
screenshots.bt_next.label=próxima
screenshots.download.no_content=Sem conteúdo para exibir
screenshots.download.no_response=Imagem não encontrada
screenshots.image.loading=Carregando
settings.changed.success.reboot=Reiniciar agora ?
settings.changed.success.warning=Configurações alteradas com sucesso ! Algumas delas só surtirão após a reinicialização.
settings.error=Não foi possível alterar todas as configurações adequadamente
@@ -402,6 +408,7 @@ view.components.file_chooser.placeholder=Clique aqui para selecionar
warning=aviso
warning.update_available=Há uma nova versão do {} disponível ({}). Confira as novidades em {}
welcome=bem vindo
window_manage.input_search.placeholder=Buscar
window_manage.input_search.tooltip=Digite e pressione ENTER para buscar aplicativos
window_manage.search_bar.button_tooltip=Clique aqui para buscar aplicativos
window_manage.search_bar.placeholder=Buscar
window_manage.search_bar.tooltip=Digite e pressione ENTER para buscar aplicativos
yes=sim

View File

@@ -229,10 +229,12 @@ core.config.ui.auto_scale.tip=Он активирует автоматическ
core.config.ui.hdpi=HDPI
core.config.ui.hdpi.tip=Если улучшения, связанные с разрешением HDPI должны быть активированы
core.config.ui.max_displayed=Отображаемые приложения
core.config.ui.max_displayed.tip=Максимальное количество приложений, отображаемых в таблице
core.config.ui.max_displayed.tip=Максимальное количество приложений, отображаемых в таблице. Use 0 for no limit.
core.config.ui.qt_style.tooltip=QT style to be used. Requires restarting to take effect.
core.config.ui.scale_factor=Scale
core.config.ui.scale_factor.tip=It defines the interface display scaling factor (Qt). Raise the value to raise the interface size. Restart required.
core.config.ui.style.default=Default
core.config.ui.system_theme=System theme
core.config.ui.system_theme.tip=If the system's theme/stylesheet should be merged with {app}'s
core.config.ui.tray.default_icon=Значок по умолчанию
core.config.ui.tray.default_icon.tip=Значок по умолчанию для {app}, отображаемый в трее
core.config.ui.tray.updates_icon=Значок обновления
@@ -297,20 +299,23 @@ manage_window.bt.installed.text=Установленные
manage_window.bt.installed.tooltip=Нажмите здесь, чтобы показать установленные приложения
manage_window.bt.refresh.text=Обновить список
manage_window.bt.refresh.tooltip=Перезагрузите данные об установленных приложениях
manage_window.bt.suggestions.text=Рекомендации
manage_window.bt.suggestions.tooltip=Нажмите здесь, чтобы показать некоторые рекомендаваные приложения
manage_window.bt.upgrade.text=Обновление
manage_window.bt.upgrade.tooltip=Обновить все выбранные приложения
manage_window.bt_custom_actions.tip=Нажмите здесь, чтобы показать больше действий
manage_window.bt_settings.tooltip=Нажмите здесь, чтобы отобразить настройки
manage_window.bt_themes.tip=Click here to choose a theme
manage_window.bt_themes.option.invalid=Invalid
manage_window.checkbox.only_apps=Приложения
manage_window.checkbox.show_details=Показать детали
manage_window.columns.installed=Installed
manage_window.columns.latest_version=Последняя версия
manage_window.columns.update=Обновить?
manage_window.label.apps_displayed.tip=Applications displayed / available
manage_window.label.updates=Обновления
manage_window.name_filter.button_tooltip=Click here to filter apps by name
manage_window.name_filter.placeholder=Фильтр по имени
manage_window.name_filter.tooltip=Введите здесь, чтобы фильтровать приложения по имени
manage_window.name_filter.tooltip=Type and press ENTER to filter apps by name
manage_window.settings.about=О программе
manage_window.status.downgrading=Откатить
manage_window.status.filtering=Фильтрация
@@ -351,9 +356,9 @@ popup.history.selected.tooltip=Текущая версия
popup.history.title=История версий
popup.root.bad_password.body=Неправильный пароль
popup.root.bad_password.last_try=Закончились попытки. Отмена действия.
popup.root.bad_password.title=Ошибка
popup.root.continue=Продолжить
popup.root.title=Требуется ваш пароль, чтобы продолжить
popup.root.msg=Требуется ваш пароль, чтобы продолжить
popup.root.title=Аутентификация
popup.screenshots.no_screenshot.body=не удалось получить скриншоты {}
prepare.bt_hide_details=Hide details
prepare.bt_icon.no_output=There are no progress details for this task to be displayed
@@ -369,7 +374,7 @@ screenshots.bt_back.label=Предыдущий
screenshots.bt_next.label=Следующий
screenshots.download.no_content=Нет материалов для отображени
screenshots.download.no_response=Изображение не найдено
screenshots.download.running=Загрузка изображения
screenshots.image.loading=Loading
settings=Настройки
settings.changed.success.reboot=Перезапустить сейчас?
settings.changed.success.warning=Настройки успешно изменены. Некоторые из них вступят в силу только после перезагрузки.
@@ -402,6 +407,7 @@ view.components.file_chooser.placeholder=Нажмите здесь, чтобы
warning=Предупреждение
warning.update_available=There is a new {} version available ({}). Check out the news at {}.
welcome=Добро пожаловать!
window_manage.input_search.placeholder=Поиск
window_manage.input_search.tooltip=Введите и нажмите ENTER для поиска приложений
window_manage.search_bar.button_tooltip=Click here to search for applications
window_manage.search_bar.placeholder=Поиск
window_manage.search_bar.tooltip=Введите и нажмите ENTER для поиска приложений
yes=Да

View File

@@ -228,11 +228,13 @@ core.config.ui.auto_scale.tip=Otomatik ekran ölçek faktörünü ( {} ) etkinle
core.config.ui.auto_scale=Oto ölçekleme
core.config.ui.hdpi.tip=HDPI çözünürlükleri ile ilgili iyileştirmeler etkinleştirilirse
core.config.ui.hdpi=HDPI
core.config.ui.max_displayed.tip=Tabloda görüntülenen azami uygulama sayısı
core.config.ui.max_displayed.tip=Tabloda görüntülenen azami uygulama sayısı. Use 0 for no limit.
core.config.ui.max_displayed=Görüntülenen uygulamalar
core.config.ui.qt_style.tooltip=QT style to be used. Requires restarting to take effect.
core.config.ui.scale_factor=Scale
core.config.ui.scale_factor.tip=It defines the interface display scaling factor (Qt). Raise the value to raise the interface size. Restart required.
core.config.ui.style.default=Default
core.config.ui.system_theme=System theme
core.config.ui.system_theme.tip=If the system's theme/stylesheet should be merged with {app}'s
core.config.ui.tray.default_icon.tip=Tepside görüntülenen {app} için varsayılan simge
core.config.ui.tray.default_icon=Varsayılan simge
core.config.ui.tray.updates_icon.tip=Güncelleme mevcut olduğunda görüntülenen simge
@@ -297,20 +299,23 @@ manage_window.bt.installed.text=yüklü
manage_window.bt.installed.tooltip=Yüklü uygulamaları görmek için burayı tıkla
manage_window.bt.refresh.text=Yenile
manage_window.bt.refresh.tooltip=Yüklü uygulamalar hakkındaki verileri yeniden yükle
manage_window.bt.suggestions.text=Önerilenler
manage_window.bt.suggestions.tooltip=Bazı uygulama önerileri için burayı tıkla
manage_window.bt.upgrade.text=Yükselt
manage_window.bt.upgrade.tooltip=İşaretli tüm uygulamaları yükseltin
manage_window.bt_custom_actions.tip=Daha fazla eylem için burayı tıkla
manage_window.bt_settings.tooltip=Görünüm ayarları için burayı tıkla
manage_window.bt_themes.tip=Click here to choose a theme
manage_window.bt_themes.option.invalid=Invalid
manage_window.checkbox.only_apps=Uygulamalar
manage_window.checkbox.show_details=Detayları göster
manage_window.columns.installed=Yüklü
manage_window.columns.latest_version=Son sürüm
manage_window.columns.update=Yükselt ?
manage_window.label.apps_displayed.tip=Applications displayed / available
manage_window.label.updates=Güncellemeler
manage_window.name_filter.button_tooltip=Click here to filter apps by name
manage_window.name_filter.placeholder=Filtre adı
manage_window.name_filter.tooltip=Uygulamaları ada göre filtrelemek için buraya yazın
manage_window.name_filter.tooltip=Type and press ENTER to filter apps by name
manage_window.settings.about=Hakkında
manage_window.status.downgrading=Düşürülüyor
manage_window.status.filtering=Filtreleniyor
@@ -351,9 +356,9 @@ popup.history.selected.tooltip=Mevcut sürüm
popup.history.title=Geçmiş
popup.root.bad_password.body=Yanlış şifre
popup.root.bad_password.last_try=Çok sayıda yanlış deneme. İşlem iptal edildi.
popup.root.bad_password.title=Hata
popup.root.continue=devam
popup.root.title=Devam etmek için şifre girmelisiniz
popup.root.msg=Devam etmek için şifre girmelisiniz
popup.root.title=Doğrulama
popup.screenshots.no_screenshot.body={} ekran görüntüsünü almak mümkün değildi
prepare.bt_hide_details=Hide details
prepare.bt_icon.no_output=There are no progress details for this task to be displayed
@@ -369,7 +374,7 @@ screenshots.bt_back.label=önceki
screenshots.bt_next.label=sonraki
screenshots.download.no_content=Görüntülenecek içerik yok
screenshots.download.no_response=İmaj bulunamadı
screenshots.download.running=imaj indiriliyor
screenshots.image.loading=Loading
settings.changed.success.reboot=Şimdi yeniden başlat ?
settings.changed.success.warning=Ayarlar başarıyla değiştirildi ancak yeniden başlattıktan sonra devreye girecek.
settings.error=Tüm ayarları düzgün bir şekilde değiştirmek mümkün olmadı
@@ -402,6 +407,7 @@ view.components.file_chooser.placeholder=Seçmek için buraya tıkla
warning=uyarı
welcome=hoşgeldinis
warning.update_available=Yeni bir {} sürümü var ({}). {} Adresindeki haberleri inceleyin.
window_manage.input_search.placeholder=Ara
window_manage.input_search.tooltip=Uygulama aramak için yazın ve ENTER tuşuna basın
window_manage.search_bar.button_tooltip=Click here to search for applications
window_manage.search_bar.placeholder=Ara
window_manage.search_bar.tooltip=Uygulama aramak için yazın ve ENTER tuşuna basın
yes=evet

View File

@@ -0,0 +1,6 @@
name=Darcula
description=Dark based on Darcula theme (JetBrains)
description[pt]=Escuro baseada no tema Darcula (JetBrains)
description[es]=Oscuro basado en el tema Darcula (JetBrains)
version=1.0
root_sheet=default

View File

@@ -0,0 +1,433 @@
QWidget, QWidget QToolTip {
background-color: @outer_widget.background.color;
color: @font.color;
selection-background-color: @tab.font.color;
}
QCheckBox::indicator:unchecked {
image: url("@style_dir/img/checkbox_unchecked.svg");
}
QCheckBox::indicator:unchecked:disabled {
image: url("@style_dir/img/checkbox_unchecked_disabled.svg");
}
QCheckBox::indicator:checked {
image: url("@style_dir/img/checkbox_checked.svg");
}
QCheckBox::indicator:checked:disabled {
image: url("@style_dir/img/checkbox_checked_disabled.svg");
}
QComboBox:focus, QSpinBox:focus, ManageWindow QComboBox:focus {
border-color: @focus.border.color;
color: @focus.border.color;
}
QLineEdit:focus {
border-color: @focus.border.color;
}
QPushButton {
border: 1px solid @pushbutton.border.color;
border-radius: 5px;
background-color: @pushbutton.background.color;
}
QPushButton:disabled {
background-color: @pushbutton.disabled.background.color;
color: @pushbutton.disabled.font.color;
}
QToolButton {
border: none;
}
QToolButton:hover {
background-color: @toolbutton.hover.background.color;
border-radius: 3px;
}
QLineEdit {
selection-color: @menu.item.selected.font.color;
selection-background-color: @menu.item.selected.background.color;
background-color: @lineedit.background.color;
border: 1px solid @lineedit.border.color;
border-radius: 5px;
padding: 3px;
}
QPlainTextEdit {
selection-color: @menu.item.selected.font.color;
selection-background-color: @menu.item.selected.background.color;
color: @font.color;
background-color: @inner_widget.background.color;
}
QScrollBar, QTableWidget QScrollBar {
background-color: @inner_widget.background.color;
}
QScrollBar::vertical{
max-width: 10px;
}
QScrollBar::handle {
background-color: @scrollbar.handle.background.color;
}
QScrollBar::add-line, QScrollBar::sub-line, QScrollBar::add-page, QScrollBar::sub-page {
height: 0px;
}
QComboBox, ManageWindow QComboBox, QSpinBox {
border-color: @combobox.border.color;
}
QComboxBox:!editable, QComboBox::drop-down {
border-left: 0;
}
QComboBox::down-arrow {
image: url("@style_dir/img/arrow_down.svg");
height: 10px;
width: 10px;
padding-right: 10px;
}
QSpinBox {
selection-color: @menu.item.selected.font.color;
selection-background-color: @menu.item.selected.background.color;
}
QSpinBox::down-arrow {
image: url("@style_dir/img/arrow_down.svg");
}
QSpinBox::up-arrow {
image: url("@style_dir/img/arrow_up.svg");
}
QSpinBox::up-arrow:disabled, QSpinBox::up-arrow:off, QSpinBox::down-arrow:disabled, QSpinBox::down-arrow:off {
image: none;
}
QTableWidget {
border: 1px solid @table.border.color;
background-color: @inner_widget.background.color;
selection-background-color: @table.selection.background.color;
}
QTableWidget * {
background-color: none;
color: @font.color;
}
QTableWidget QHeaderView {
background-color: @outer_widget.background.color;
font-weight: bold;
}
QTableWidget QToolButton:hover {
background-color: @table.button.hover.background.color;
}
QComboBox, QComboBox QAbstractItemView, QMenu QAbstractItemView {
selection-background-color: @menu.item.selected.background.color;
selection-color: @menu.item.selected.font.color;
color: @font.color;
}
QMenu QPushButton {
border-radius: 0px;
}
QMenu QPushButton[current = "true"] {
color: @color.yellow_dark;
}
QMenu QPushButton:hover {
background-color: @menu.item.selected.background.color;
color: @menu.item.selected.font.color;
}
QLabel[error = "true"] {
color: @error.color;
}
QPlainTextEdit[console = 'true'] {
background: @console.background.color;
color: @console.font.color;
}
QTabBar::tab:selected {
color: @tab.font.color;
border: 1px solid @inner_widget.background.color;
border-top-left-radius: 5px;
border-top-right-radius: 5px;
border-bottom: 2px solid @tab.underline.color;
background-color: @tab.highlight.color;
padding: 5px;
}
QProgressBar::chunk {
background-color: @progressbar.fill.color;
}
QSearchBar * {
background-color: @outer_widget.background.color;
}
QSearchBar QLabel#lb_left_corner {
border-left-color: @lineedit.border.color;
border-top-color: @lineedit.border.color;
border-bottom-color: @lineedit.border.color;
}
QSearchBar QLabel#lb_left_corner[focused = "true"] {
border-left-color: @focus.border.color;
border-top-color: @focus.border.color;
border-bottom-color: @focus.border.color;
}
QSearchBar QPushButton#search_button {
qproperty-icon: url("@style_dir/img/search.svg");
border-right-color: @lineedit.border.color;
border-top-color: @lineedit.border.color;
border-bottom-color: @lineedit.border.color;
}
QSearchBar QPushButton#search_button[focused = "true"] {
border-right-color: @focus.border.color;
border-top-color: @focus.border.color;
border-bottom-color: @focus.border.color;
qproperty-icon: url("@style_dir/img/search_focused.svg");
}
QSearchBar QLineEdit#inp_search {
border-bottom-color: @lineedit.border.color;
border-top-color: @lineedit.border.color;
}
QSearchBar QLineEdit#inp_search:focus {
border-bottom-color: @focus.border.color;
border-top-color: @focus.border.color;
}
QSearchBar#name_filter QPushButton#search_button {
qproperty-icon: url("@style_dir/img/filter.svg");
}
QSearchBar#name_filter QPushButton#search_button[focused = "true"] {
qproperty-icon: url("@style_dir/img/filter_focused.svg");
}
QPushButton#ok {
background-color: @button_ok.background.color;
color: @button_ok.font.color;
border-color: @button_ok.background.color;
font-weight: bold;
}
PreparePanel QTableWidget#tasks {
background-color: @inner_widget.background.color;
}
PreparePanel QLabel#task_status[status = "done"], QLabel#task_progress[status = "done"] {
color: @task.done.color;
}
ManageWindow QSearchBar#name_filter {
color: @font.color;
}
QPushButton#bt_upgrade {
qproperty-icon: url("@style_dir/img/update.svg");
border: 0.5px solid @upgrade.color;
background: @outer_widget.background.color;
color: @upgrade.color;
}
QPushButton#bt_upgrade:disabled {
color: @font.color;
border-color: @font.color;
}
PackagesTable UpgradeToggleButton:disabled {
color: @font.color;
border-color: @font.color;
}
PackagesTable QLabel#app_version[update = "true"] {
color: @table.app_version.update.color;
font-weight: @table.app_version.update.weight;
}
PackagesTable QLabel#app_version:disabled[update = "true"] {
color: @font.color;
}
PackagesTable QLabel#app_version[ignored = "true"] {
color: @table.app_version.update_ignored.color;
}
PackagesTable QLabel#app_version:disabled[ignored = "true"] {
color: @font.color;
}
PackagesTable UpgradeToggleButton, ConfirmationDialog UpgradeToggleButton {
qproperty-icon: url("@style_dir/img/update.svg");
border: 0.5px solid @upgrade.color;
border-radius: 2px;
background-color: @outer_widget.background.color;
}
PackagesTable UpgradeToggleButton[toggled = "false"] {
qproperty-icon: url("@style_dir/img/update_unchecked.svg");
background-color: @inner_widget.background.color;
border-color: @outer_widget.background.color;
}
PackagesTable UpgradeToggleButton[enabled = "false"] {
background: @table.update_check.disabled.color;
}
ManageWindow PackagesTable IconButton#app_info {
qproperty-icon: url("@style_dir/img/about.svg");
qproperty-iconSize: 13px 13px;
}
QPushButton#bt_refresh {
qproperty-icon: url("@style_dir/img/refresh.svg")
}
QPushButton#bt_installed {
qproperty-icon: url("@style_dir/img/installed.svg");
}
ManageWindow PackagesTable IconButton#app_run {
qproperty-icon: url("@style_dir/img/app_play.svg");
}
ManageWindow PackagesTable IconButton#app_run[_enabled = "false"] {
qproperty-icon: url("@style_dir/img/app_play_disabled.svg");
}
ManageWindow IconButton#suggestions {
qproperty-icon: url("@style_dir/img/suggestions.svg");
}
ManageWindow IconButton#themes {
qproperty-icon: url("@style_dir/img/themes.svg");
}
ManageWindow PackagesTable IconButton#app_actions {
qproperty-icon: url("@style_dir/img/menu.svg");
}
ManageWindow IconButton#settings {
qproperty-icon: url("@style_dir/img/settings.svg");
}
PackagesTable IconButton#app_screenshots {
qproperty-icon: url("@style_dir/img/camera.svg");
}
ManageWindow PackagesTable IconButton#app_screenshots[_enabled = "false"] {
qproperty-icon: url("@style_dir/img/camera_disabled.svg");
}
ManageWindow IconButton#custom_actions {
qproperty-icon: url("@style_dir/img/menu.svg");
qproperty-iconSize: 16px 16px;
}
ManageWindow IconButton#about {
qproperty-icon: url("@style_dir/img/about.svg");
qproperty-iconSize: 16px 16px;
}
QMenu#app_actions QPushButton#app_history {
qproperty-icon: url("@style_dir/img/history.svg");
}
QMenu#app_actions QPushButton#app_downgrade {
qproperty-icon: url("@style_dir/img/downgrade.svg");
}
QMenu#app_actions QPushButton#ignore_updates {
qproperty-icon: url("@style_dir/img/ignore_update.svg");
}
QMenu#app_actions QPushButton#revert_ignore_updates {
qproperty-icon: url("@style_dir/img/revert_update_ignored.svg");
}
PackagesTable QLabel[publisher_known = "false"]{
color: @table.app_publisher.unknown.font.color;
}
PackagesTable QLabel:disabled[publisher_known = "false"]{
color: @font.color;
}
PackagesTable QLabel#icon_publisher_verified {
qproperty-pixmap: url("@style_dir/img/verified.svg");
}
PackagesTable QToolButton#bt_install {
background-color: transparent;
color: @table.bt_install.font.color;
}
PackagesTable QToolButton#bt_install:hover, PackagesTable QToolButton#bt_uninstall:hover {
background-color: @table.button.hover.background.color;
}
PackagesTable QToolButton#bt_install:disabled {
color: @font.color;
}
PackagesTable QToolButton#bt_uninstall {
background-color: transparent;
color: @table.bt_uninstall.font.color;
}
PackagesTable QToolButton#bt_uninstall:disabled {
color: @font.color;
}
QLabel[help_icon = "true"] {
qproperty-pixmap: url("@style_dir/img/help.svg");
}
QLabel[tip_icon = "true"] {
qproperty-pixmap: url("@style_dir/img/help.svg");
}
FormQt IconButton#clean_field {
qproperty-icon: url("@style_dir/img/clean.svg");
}
PreparePanel QLabel#task_status[status = "running"], QLabel#task_progress[status = "running"], QLabel#task_substatus {
font-weight: normal;
}
HistoryDialog QTableWidget QLabel[even = "false"] {
background-color: @outer_widget.background.color;
}
HistoryDialog QTableWidget QLabel[outdated = "true"] {
background-color: @history.version.outdated;
color: @history.version.focus.color;
}
HistoryDialog QTableWidget QLabel[outdated = "false"] {
background-color: @history.version.updated;
color: @history.version.focus.color;
}
InfoDialog QPushButton#show {
height: 16px;
}

View File

@@ -0,0 +1,50 @@
button_ok.background.color=#365880
button_ok.background.color=#4C708C
button_ok.font.color=#BABBBB
color.blue_light=#3592C4
color.green_editor=#6A8759
color.green_light=#499C54
color.grey_blue=#A9B7C6
color.grey_editor=#2B2B2B
color.grey_panel=#3C3F41
color.orange=#CC752F
color.red=#FF6B68
color.warning=@color.yellow_dark
color.yellow_dark=#BE9117
combobox.border.color=#5E6060
console.background.color=@inner_widget.background.color
console.font.color=#BBBBA8
error.color=@color.red
focus.border.color=#6591B2
font.color=@color.grey_blue
history.version.focus.color=white;
history.version.outdated=@color.warning;
history.version.updated=@color.green_light;
inner_widget.background.color=@color.grey_editor
lineedit.background.color=#45494A
lineedit.border.color=#646464
outer_widget.background.color=@color.grey_panel
progressbar.fill.color=@color.blue_light
pushbutton.background.color=#4C5052
pushbutton.border.color=@combobox.border.color
pushbutton.disabled.background.color=@color.grey_panel
pushbutton.disabled.font.color=#737373
menu.item.selected.background.color=#2F65CA
menu.item.selected.font.color=white
scrollbar.handle.background.color=#4D4D4D
tab.font.color=@focus.border.color
tab.highlight.color=#4E5254
tab.underline.color=#4A88C7
table.app_publisher.unknown.font.color=@color.red
table.app_version.update.color=@color.yellow_dark
table.app_version.update.weight=normal
table.app_version.update_ignored.color=@color.yellow_dark
table.border.color=#555555
table.bt_install.font.color=@color.green_light
table.bt_uninstall.font.color=@color.red
table.update_check.disabled.color=@color.warning
table.selection.background.color=#0D293E
table.button.hover.background.color=#323232
task.done.color=@color.green_editor
toolbutton.hover.background.color=@pushbutton.background.color
upgrade.color=@color.green_light

View File

@@ -9,12 +9,12 @@
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="Capa_1"
enable-background="new 0 0 512 512"
height="12"
viewBox="0 0 12 12"
width="12"
height="512"
viewBox="0 0 512 512"
width="512"
version="1.1"
sodipodi:docname="info.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
sodipodi:docname="about.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)">
<metadata
id="metadata877">
<rdf:RDF>
@@ -43,9 +43,9 @@
id="namedview873"
showgrid="false"
showborder="true"
inkscape:zoom="11.335805"
inkscape:cx="23.192934"
inkscape:cy="10.264189"
inkscape:zoom="1.0019531"
inkscape:cx="197.9376"
inkscape:cy="236.73295"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
@@ -53,21 +53,22 @@
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
fit-margin-bottom="0"
inkscape:document-rotation="0" />
<g
id="g7850"
transform="matrix(0.49966773,0,0,0.47688398,2.2068848,0.02497908)"
style="stroke:#37abc8;stroke-width:1.53208435;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
transform="matrix(22.337858,0,0,21.3193,86.427173,-11.115837)"
style="fill:#8888c6;fill-opacity:1;stroke:none;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
<circle
cx="7.5912747"
cy="21.699696"
r="2.6452355"
id="circle866"
style="fill:none;stroke:#37abc8;stroke-width:1.53208435;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:#8888c6;fill-opacity:1;stroke:none;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="m 7.591275,0.71366244 c -3.7923421,0 -6.8776126,3.08527056 -6.8776126,6.87761256 V 8.2525839 H 6.0041336 V 7.591275 c 0,-0.8751762 0.7119652,-1.5871414 1.5871414,-1.5871414 0.8751762,0 1.5871413,0.7119652 1.5871413,1.5871414 0,0.466355 -0.2046971,0.9077567 -0.5616717,1.2111211 L 4.9460394,11.923201 v 4.75005 h 5.2904716 v -2.303912 l 1.806519,-1.535868 c 1.541643,-1.310009 2.425858,-3.2206629 2.425858,-5.242196 0,-3.792342 -3.085271,-6.87761256 -6.877613,-6.87761256 z"
id="path868"
style="fill:none;stroke:#37abc8;stroke-width:1.53208435;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:#8888c6;fill-opacity:1;stroke:none;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -1,6 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
@@ -13,12 +11,12 @@
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 12 12.000001"
viewBox="0 0 512 512"
xml:space="preserve"
sodipodi:docname="app_play.svg"
width="12"
height="12.000001"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"><metadata
width="512"
height="512"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"><metadata
id="metadata856"><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><defs
@@ -40,15 +38,16 @@
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="8.5156252"
inkscape:cx="-22.346746"
inkscape:cy="0.39055758"
inkscape:zoom="0.75268204"
inkscape:cx="17.928302"
inkscape:cy="262.90412"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Layer_1"
showguides="true"
inkscape:guide-bbox="true"><sodipodi:guide
inkscape:guide-bbox="true"
inkscape:document-rotation="0"><sodipodi:guide
position="-35.66195,21.221316"
orientation="0,1"
id="guide829"
@@ -83,11 +82,11 @@
inkscape:locked="false" /></sodipodi:namedview>
<g
id="g819"
transform="matrix(0.01280184,0,0,0.01280246,1.0874728,2.7151057)"
style="fill:none;fill-opacity:1;stroke:#91a069;stroke-width:97.6398468;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
transform="matrix(0.837209,0,0,0.83724953,-65.454588,41.15345)"
style="fill:#499c54;fill-opacity:1;stroke:none;stroke-width:7.81119;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
<path
style="fill:none;fill-opacity:1;stroke:#91a069;stroke-width:97.6398468;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:#499c54;fill-opacity:1;stroke:none;stroke-width:7.81119;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 557.49784,206.99848 C 556.02332,209.32745 299.06055,50.553292 184.31451,-1.6920377 154.70662,-15.172888 152.32141,8.7631987 152.154,44.419264 c -0.8137,173.309056 -0.17793,416.751146 0,425.492356 0.73587,36.15214 -4.3986,60.9816 32.16051,42.58838 96.93285,-48.76779 383.3103,-210.32654 375.2762,-204.82682 68.97152,-41.77019 82.39599,-46.93515 -2.09287,-100.6747 z"
id="path817"
inkscape:connector-curvature="0"
@@ -153,4 +152,4 @@
id="g849"
transform="translate(-156.96699,-497.23008)">
</g>
</svg>
</svg>

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@@ -0,0 +1,159 @@
<?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="Layer_1"
x="0px"
y="0px"
viewBox="0 0 512 512"
xml:space="preserve"
sodipodi:docname="app_play_disabled.svg"
width="512"
height="512"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"><metadata
id="metadata856"><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="defs854" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="739"
id="namedview852"
showgrid="false"
showborder="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="0.75268204"
inkscape:cx="17.928302"
inkscape:cy="262.90412"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Layer_1"
showguides="true"
inkscape:guide-bbox="true"
inkscape:document-rotation="0"><sodipodi:guide
position="-35.66195,21.221316"
orientation="0,1"
id="guide829"
inkscape:locked="false" /><sodipodi:guide
position="-36.043602,-2.7933623"
orientation="0,1"
id="guide831"
inkscape:locked="false" /><sodipodi:guide
position="-4.3371792,24.333243"
orientation="1,0"
id="guide833"
inkscape:locked="false" /><sodipodi:guide
position="11.662821,20.164435"
orientation="1,0"
id="guide835"
inkscape:locked="false" /><sodipodi:guide
position="-2.7812159,24.186454"
orientation="1,0"
id="guide947"
inkscape:locked="false" /><sodipodi:guide
position="-10.795895,-0.79703201"
orientation="0,1"
id="guide949"
inkscape:locked="false" /><sodipodi:guide
position="-17.107821,19.16627"
orientation="0,1"
id="guide951"
inkscape:locked="false" /><sodipodi:guide
position="19.706857,26.447004"
orientation="1,0"
id="guide836"
inkscape:locked="false" /></sodipodi:namedview>
<g
id="g3635"><g
id="g819"
transform="matrix(0.837209,0,0,0.83724953,-65.454588,41.15345)"
style="fill:#499c54;fill-opacity:1;stroke:none;stroke-width:7.81119;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
<path
style="fill:#499c54;fill-opacity:1;stroke:none;stroke-width:7.81119;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 557.49784,206.99848 C 556.02332,209.32745 299.06055,50.553292 184.31451,-1.6920377 154.70662,-15.172888 152.32141,8.7631987 152.154,44.419264 c -0.8137,173.309056 -0.17793,416.751146 0,425.492356 0.73587,36.15214 -4.3986,60.9816 32.16051,42.58838 96.93285,-48.76779 383.3103,-210.32654 375.2762,-204.82682 68.97152,-41.77019 82.39599,-46.93515 -2.09287,-100.6747 z"
id="path817"
inkscape:connector-curvature="0"
sodipodi:nodetypes="csssscc" />
</g><g
id="g821"
transform="translate(-156.96699,-497.23008)">
</g><g
id="g823"
transform="translate(-156.96699,-497.23008)">
</g><g
id="g825"
transform="translate(-156.96699,-497.23008)">
</g><g
id="g827"
transform="translate(-156.96699,-497.23008)">
</g><g
id="g829"
transform="translate(-156.96699,-497.23008)">
</g><g
id="g831"
transform="translate(-156.96699,-497.23008)">
</g><g
id="g833"
transform="translate(-156.96699,-497.23008)">
</g><g
id="g835"
transform="translate(-156.96699,-497.23008)">
</g><g
id="g837"
transform="translate(-156.96699,-497.23008)">
</g><g
id="g839"
transform="translate(-156.96699,-497.23008)">
</g><g
id="g841"
transform="translate(-156.96699,-497.23008)">
</g><g
id="g843"
transform="translate(-156.96699,-497.23008)">
</g><g
id="g845"
transform="translate(-156.96699,-497.23008)">
</g><g
id="g847"
transform="translate(-156.96699,-497.23008)">
</g><g
id="g849"
transform="translate(-156.96699,-497.23008)">
</g><path
style="fill:none;stroke:#ff6b68;stroke-width:71.9002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 56.555617,490.77868 368.65561,25.079795"
id="path2768" /></g></svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

@@ -0,0 +1,98 @@
<?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 512.00002 512.00002"
xml:space="preserve"
sodipodi:docname="arrow_down.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
width="512"
height="512"><metadata
id="metadata955"><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="defs953">
</defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="739"
id="namedview951"
showgrid="false"
inkscape:zoom="0.90156256"
inkscape:cx="279.80547"
inkscape:cy="222.5558"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1"
inkscape:document-rotation="0" />
<polygon
points="213.333,53.333 0,53.333 106.667,160 "
id="polygon914"
style="fill:#9a9da1;fill-opacity:1;stroke:none"
transform="matrix(2.3589386,0,0,2.7687329,4.3802758,-39.331048)" />
<g
id="g920">
</g>
<g
id="g922">
</g>
<g
id="g924">
</g>
<g
id="g926">
</g>
<g
id="g928">
</g>
<g
id="g930">
</g>
<g
id="g932">
</g>
<g
id="g934">
</g>
<g
id="g936">
</g>
<g
id="g938">
</g>
<g
id="g940">
</g>
<g
id="g942">
</g>
<g
id="g944">
</g>
<g
id="g946">
</g>
<g
id="g948">
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -0,0 +1,98 @@
<?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 512.00002 512.00002"
xml:space="preserve"
sodipodi:docname="arrow_up.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
width="512"
height="512"><metadata
id="metadata955"><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="defs953">
</defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="739"
id="namedview951"
showgrid="false"
inkscape:zoom="0.90156256"
inkscape:cx="279.80547"
inkscape:cy="222.5558"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1"
inkscape:document-rotation="0" />
<polygon
points="0,53.333 106.667,160 213.333,53.333 "
id="polygon914"
style="fill:#9a9da1;fill-opacity:1;stroke:none"
transform="matrix(2.3589386,0,0,-2.7687329,4.3802758,551.33105)" />
<g
id="g920">
</g>
<g
id="g922">
</g>
<g
id="g924">
</g>
<g
id="g926">
</g>
<g
id="g928">
</g>
<g
id="g930">
</g>
<g
id="g932">
</g>
<g
id="g934">
</g>
<g
id="g936">
</g>
<g
id="g938">
</g>
<g
id="g940">
</g>
<g
id="g942">
</g>
<g
id="g944">
</g>
<g
id="g946">
</g>
<g
id="g948">
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -0,0 +1,133 @@
<?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 512 512"
xml:space="preserve"
sodipodi:docname="camera.svg"
width="512"
height="512"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"><metadata
id="metadata945"><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="defs943">
</defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="739"
id="namedview941"
showgrid="false"
showborder="true"
fit-margin-top="0"
fit-margin-left="-0.3"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="0.70710681"
inkscape:cx="219.53194"
inkscape:cy="229.87388"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1"
showguides="true"
inkscape:guide-bbox="true"
inkscape:document-rotation="0"><sodipodi:guide
position="-51.953545,91.021149"
orientation="-0.70710678,0.70710678"
id="guide2797"
inkscape:locked="false" /></sodipodi:namedview>
<g
id="g11705"
style="fill:#8888c6;fill-opacity:1;stroke:#8888c6;stroke-opacity:1"
transform="matrix(43.147244,0,0,43.147244,-2.8834687,-2.883458)"><path
style="fill:#8888c6;fill-opacity:1;stroke:#8888c6;stroke-width:0.48546;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0"
id="path900"
d="m 0.36332022,3.9393295 v 5.7746849 c 0,0.8814256 0.6165838,1.5972526 1.37581018,1.5972526 h 8.5217406 c 0.759227,0 1.375809,-0.715827 1.375809,-1.5972526 V 3.9393295 c 0,-0.8386924 -0.586673,-1.5197948 -1.309089,-1.5197948 H 8.4962447 L 8.4525319,2.1978423 C 8.2753792,1.3084031 7.601278,0.68873272 6.8144437,0.68873272 H 5.183257 c -0.7845338,0 -1.4586347,0.61967038 -1.6380881,1.50910958 L 3.5014558,2.4195347 H 1.6724105 c -0.72241539,0 -1.30909028,0.6837749 -1.30909028,1.5197948 z M 3.7269231,3.0739286 c 0.1311388,0 0.2438725,-0.1041686 0.2737814,-0.2537458 L 4.0950326,2.3447471 C 4.214668,1.7544578 4.6610011,1.3431243 5.1832566,1.3431243 h 1.6311867 c 0.522255,0 0.9685884,0.4113335 1.0882243,1.0016228 l 0.094329,0.4754357 c 0.029907,0.1469049 0.1426426,0.2537458 0.2737816,0.2537458 H 10.32529 c 0.411822,0 0.745423,0.3872927 0.745423,0.8654009 v 5.7746849 c 0,0.5208416 -0.36351,0.9428586 -0.812143,0.9428586 H 1.7391304 c -0.4486338,0 -0.81214217,-0.422017 -0.81214217,-0.9428586 V 3.9393295 c 0,-0.4781082 0.33359947,-0.8654009 0.74542227,-0.8654009 z" /><path
style="fill:#8888c6;fill-opacity:1;stroke:#8888c6;stroke-width:0.467336;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0"
id="path904"
d="m 6.0000006,9.704335 c 1.4787617,0 2.6836788,-1.2963577 2.6836788,-2.8873384 0,-1.5909818 -1.2049171,-2.8873367 -2.6836788,-2.8873367 -1.478762,0 -2.6836789,1.2935499 -2.6836789,2.8873367 0,1.5937886 1.2049169,2.8873384 2.6836789,2.8873384 z m 0,-5.0872129 c 1.1266758,0 2.0447075,0.987698 2.0447075,2.1998745 0,1.2121784 -0.9180317,2.1998764 -2.0447075,2.1998764 -1.1266758,0 -2.0447076,-0.987698 -2.0447076,-2.1998764 0,-1.2121765 0.9180318,-2.1998745 2.0447076,-2.1998745 z" /></g>
<g
id="g910"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g912"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g914"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g916"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g918"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g920"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g922"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g924"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g926"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g928"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g930"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g932"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g934"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g936"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g938"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

@@ -0,0 +1,137 @@
<?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 512 512"
xml:space="preserve"
sodipodi:docname="camera_disabled.svg"
width="512"
height="512"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"><metadata
id="metadata945"><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><defs
id="defs943">
</defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="739"
id="namedview941"
showgrid="false"
showborder="true"
fit-margin-top="0"
fit-margin-left="-0.3"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="0.70710681"
inkscape:cx="219.53194"
inkscape:cy="229.87388"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1"
showguides="true"
inkscape:guide-bbox="true"
inkscape:document-rotation="0"><sodipodi:guide
position="-51.953545,91.021149"
orientation="-0.70710678,0.70710678"
id="guide2797"
inkscape:locked="false" /></sodipodi:namedview>
<g
id="g910"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g912"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g914"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g916"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g918"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g920"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g922"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g924"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g926"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g928"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g930"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g932"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g934"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g936"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g938"
transform="matrix(1.1013612,0,0,1.1013612,-0.37597036,-486.86991)">
</g>
<g
id="g4393"><g
id="g11705"
style="fill:#8888c6;fill-opacity:1;stroke:#8888c6;stroke-opacity:1"
transform="matrix(43.147244,0,0,43.147244,-2.8834687,-2.883458)"><path
style="fill:#8888c6;fill-opacity:1;stroke:#8888c6;stroke-width:0.48546;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0"
id="path900"
d="m 0.36332022,3.9393295 v 5.7746849 c 0,0.8814256 0.6165838,1.5972526 1.37581018,1.5972526 h 8.5217406 c 0.759227,0 1.375809,-0.715827 1.375809,-1.5972526 V 3.9393295 c 0,-0.8386924 -0.586673,-1.5197948 -1.309089,-1.5197948 H 8.4962447 L 8.4525319,2.1978423 C 8.2753792,1.3084031 7.601278,0.68873272 6.8144437,0.68873272 H 5.183257 c -0.7845338,0 -1.4586347,0.61967038 -1.6380881,1.50910958 L 3.5014558,2.4195347 H 1.6724105 c -0.72241539,0 -1.30909028,0.6837749 -1.30909028,1.5197948 z M 3.7269231,3.0739286 c 0.1311388,0 0.2438725,-0.1041686 0.2737814,-0.2537458 L 4.0950326,2.3447471 C 4.214668,1.7544578 4.6610011,1.3431243 5.1832566,1.3431243 h 1.6311867 c 0.522255,0 0.9685884,0.4113335 1.0882243,1.0016228 l 0.094329,0.4754357 c 0.029907,0.1469049 0.1426426,0.2537458 0.2737816,0.2537458 H 10.32529 c 0.411822,0 0.745423,0.3872927 0.745423,0.8654009 v 5.7746849 c 0,0.5208416 -0.36351,0.9428586 -0.812143,0.9428586 H 1.7391304 c -0.4486338,0 -0.81214217,-0.422017 -0.81214217,-0.9428586 V 3.9393295 c 0,-0.4781082 0.33359947,-0.8654009 0.74542227,-0.8654009 z" /><path
style="fill:#8888c6;fill-opacity:1;stroke:#8888c6;stroke-width:0.467336;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0"
id="path904"
d="m 6.0000006,9.704335 c 1.4787617,0 2.6836788,-1.2963577 2.6836788,-2.8873384 0,-1.5909818 -1.2049171,-2.8873367 -2.6836788,-2.8873367 -1.478762,0 -2.6836789,1.2935499 -2.6836789,2.8873367 0,1.5937886 1.2049169,2.8873384 2.6836789,2.8873384 z m 0,-5.0872129 c 1.1266758,0 2.0447075,0.987698 2.0447075,2.1998745 0,1.2121784 -0.9180317,2.1998764 -2.0447075,2.1998764 -1.1266758,0 -2.0447076,-0.987698 -2.0447076,-2.1998764 0,-1.2121765 0.9180318,-2.1998745 2.0447076,-2.1998745 z" /></g><path
style="fill:none;stroke:#ff6b68;stroke-width:63.1959;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 26.042137,488.70107 475.61523,42.196708"
id="path1254" /></g></svg>

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

@@ -0,0 +1,103 @@
<?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="512"
height="512"
viewBox="0 0 512 512.00002"
id="svg2"
version="1.1"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
inkscape:export-filename="/home/colin/checkbox_checked.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
sodipodi:docname="checkbox_checked.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.70710675"
inkscape:cx="161.94503"
inkscape:cy="162.11748"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:window-width="1366"
inkscape:window-height="739"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
showguides="true"
inkscape:guide-bbox="true"
inkscape:document-rotation="0"
inkscape:showpageshadow="false">
<inkscape:grid
type="xygrid"
id="grid4203"
enabled="false" />
<sodipodi:guide
position="-15,16"
orientation="0,1"
id="guide4205"
inkscape:locked="false" />
<sodipodi:guide
position="16,22.000001"
orientation="1,0"
id="guide4207"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata7">
<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"
transform="translate(0,-1020.3622)">
<g
id="g2109"
transform="matrix(17.973676,0,0,17.973676,-31.578816,-17350.876)">
<rect
style="opacity:1;fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#6591b2;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect3338"
width="26"
height="26"
x="3"
y="1023.3622"
ry="4"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<rect
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
style="opacity:1;fill:#6591b2;fill-opacity:1;stroke:#6591b2;stroke-width:1.29718;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4159"
width="14.702817"
height="14.702817"
x="8.648592"
y="1029.0107"
rx="0"
ry="2" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -0,0 +1,102 @@
<?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="512"
height="512"
viewBox="0 0 512 512.00002"
id="svg2"
version="1.1"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
inkscape:export-filename="/home/colin/checkbox_checked.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
sodipodi:docname="checkbox_checked_disabled.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.70710675"
inkscape:cx="161.94503"
inkscape:cy="162.11748"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:window-width="1366"
inkscape:window-height="739"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
showguides="true"
inkscape:guide-bbox="true"
inkscape:document-rotation="0"
inkscape:showpageshadow="false">
<inkscape:grid
type="xygrid"
id="grid4203"
enabled="false" />
<sodipodi:guide
position="-15,16"
orientation="0,1"
id="guide4205"
inkscape:locked="false" />
<sodipodi:guide
position="16,22.000001"
orientation="1,0"
id="guide4207"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata7">
<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"
transform="translate(0,-1020.3622)">
<g
id="g8210">
<rect
style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#a9b7c6;stroke-width:35.9474;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect3338"
width="467.31558"
height="467.31558"
x="22.342213"
y="1042.7043"
ry="71.894707"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<rect
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
style="fill:#a9b7c6;fill-opacity:1;stroke:#a9b7c6;stroke-width:23.3151;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4159"
width="264.26367"
height="264.26367"
x="123.86817"
y="1144.2297"
rx="0"
ry="35.947353" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -0,0 +1,88 @@
<?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="512"
height="512"
viewBox="0 0 512 512.00002"
id="svg2"
version="1.1"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
inkscape:export-filename="/home/colin/checkbox_checked.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
sodipodi:docname="checkbox_unchecked.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.70710675"
inkscape:cx="161.94503"
inkscape:cy="162.11748"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:window-width="1366"
inkscape:window-height="739"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
showguides="true"
inkscape:guide-bbox="true"
inkscape:document-rotation="0"
inkscape:showpageshadow="false">
<inkscape:grid
type="xygrid"
id="grid4203"
enabled="false" />
<sodipodi:guide
position="-15,16"
orientation="0,1"
id="guide4205"
inkscape:locked="false" />
<sodipodi:guide
position="16,22.000001"
orientation="1,0"
id="guide4207"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata7">
<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"
transform="translate(0,-1020.3622)">
<rect
style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#5e6060;stroke-width:35.9474;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect3338"
width="467.31558"
height="467.31558"
x="22.342213"
y="1042.7043"
ry="71.894707"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -0,0 +1,88 @@
<?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="512"
height="512"
viewBox="0 0 512 512.00002"
id="svg2"
version="1.1"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
inkscape:export-filename="/home/colin/checkbox_checked.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
sodipodi:docname="checkbox_unchecked_disabled.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.70710675"
inkscape:cx="161.94503"
inkscape:cy="162.11748"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:window-width="1366"
inkscape:window-height="739"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
showguides="true"
inkscape:guide-bbox="true"
inkscape:document-rotation="0"
inkscape:showpageshadow="false">
<inkscape:grid
type="xygrid"
id="grid4203"
enabled="false" />
<sodipodi:guide
position="-15,16"
orientation="0,1"
id="guide4205"
inkscape:locked="false" />
<sodipodi:guide
position="16,22.000001"
orientation="1,0"
id="guide4207"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata7">
<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"
transform="translate(0,-1020.3622)">
<rect
style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#a9b7c6;stroke-width:35.9474;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect3338"
width="467.31558"
height="467.31558"
x="22.342213"
y="1042.7043"
ry="71.894707"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -0,0 +1,158 @@
<?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 512 512"
style="enable-background:new 0 0 512 512;"
xml:space="preserve"
sodipodi:docname="clean.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"><metadata
id="metadata55"><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="defs53" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="739"
id="namedview51"
showgrid="false"
inkscape:zoom="0.79135193"
inkscape:cx="322.4361"
inkscape:cy="286.90481"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1"
inkscape:document-rotation="0" />
<g
id="g4221"><g
id="g6"
style="fill:#ff6b68;fill-opacity:1;stroke:none;stroke-opacity:1"
transform="matrix(0.98116917,0,0,0.98116917,4.8208209,4.8202575)">
<g
id="g4"
style="fill:#ff6b68;fill-opacity:1;stroke:none;stroke-opacity:1">
<path
d="m 496.89,15.011 c -20.015,-20.015 -52.583,-20.016 -72.598,0 L 308.353,130.95 380.951,203.548 496.89,87.609 c 20.015,-20.015 20.015,-52.583 0,-72.598 z"
id="path2"
style="fill:#ff6b68;fill-opacity:1;stroke:none;stroke-opacity:1" />
</g>
</g><g
id="g12"
style="fill:#ff6b68;fill-opacity:1;stroke:none;stroke-opacity:1"
transform="matrix(0.98116917,0,0,0.98116917,4.8208209,4.8202575)">
<g
id="g10"
style="fill:#ff6b68;fill-opacity:1;stroke:none;stroke-opacity:1">
<path
d="M 362.499,228.282 283.816,149.6 c -25.576,-25.576 -66.36,-28.074 -94.866,-5.81 l -3.621,2.828 180.151,180.151 2.828,-3.621 c 22.265,-28.505 19.766,-69.289 -5.809,-94.866 z"
id="path8"
style="fill:#ff6b68;fill-opacity:1;stroke:none;stroke-opacity:1" />
</g>
</g><g
id="g18"
style="fill:#ff6b68;fill-opacity:1;stroke:none;stroke-opacity:1"
transform="matrix(0.98116917,0,0,0.98116917,4.8208209,4.8202575)">
<g
id="g16"
style="fill:#ff6b68;fill-opacity:1;stroke:none;stroke-opacity:1">
<path
d="M 161.08,165.557 5.969,286.702 c -3.447,2.692 -5.574,6.734 -5.842,11.1 -0.267,4.367 1.351,8.637 4.444,11.731 l 49.873,49.873 82.911,-75.242 c 6.246,-5.667 15.921,-5.174 21.568,1.047 5.667,6.245 5.199,15.901 -1.046,21.568 l -81.815,74.247 55.012,55.012 74.247,-81.815 c 5.667,-6.245 15.324,-6.713 21.568,-1.046 6.247,5.692 6.713,15.324 1.046,21.568 l -75.242,82.911 49.873,49.873 c 3.093,3.093 7.364,4.711 11.731,4.444 4.366,-0.268 8.407,-2.395 11.1,-5.842 L 346.542,351.019 Z"
id="path14"
style="fill:#ff6b68;fill-opacity:1;stroke:none;stroke-opacity:1" />
</g>
</g><g
id="g20"
style="fill:#ff6b68;fill-opacity:1;stroke:none;stroke-opacity:1"
transform="matrix(0.98116917,0,0,0.98116917,4.8208209,4.8202575)">
</g><g
id="g22"
style="fill:#ff6b68;fill-opacity:1;stroke:none;stroke-opacity:1"
transform="matrix(0.98116917,0,0,0.98116917,4.8208209,4.8202575)">
</g><g
id="g24"
style="fill:#ff6b68;fill-opacity:1;stroke:none;stroke-opacity:1"
transform="matrix(0.98116917,0,0,0.98116917,4.8208209,4.8202575)">
</g><g
id="g26"
style="fill:#ff6b68;fill-opacity:1;stroke:none;stroke-opacity:1"
transform="matrix(0.98116917,0,0,0.98116917,4.8208209,4.8202575)">
</g><g
id="g28"
style="fill:#ff6b68;fill-opacity:1;stroke:none;stroke-opacity:1"
transform="matrix(0.98116917,0,0,0.98116917,4.8208209,4.8202575)">
</g><g
id="g30"
style="fill:#ff6b68;fill-opacity:1;stroke:none;stroke-opacity:1"
transform="matrix(0.98116917,0,0,0.98116917,4.8208209,4.8202575)">
</g><g
id="g32"
style="fill:#ff6b68;fill-opacity:1;stroke:none;stroke-opacity:1"
transform="matrix(0.98116917,0,0,0.98116917,4.8208209,4.8202575)">
</g><g
id="g34"
style="fill:#ff6b68;fill-opacity:1;stroke:none;stroke-opacity:1"
transform="matrix(0.98116917,0,0,0.98116917,4.8208209,4.8202575)">
</g><g
id="g36"
style="fill:#ff6b68;fill-opacity:1;stroke:none;stroke-opacity:1"
transform="matrix(0.98116917,0,0,0.98116917,4.8208209,4.8202575)">
</g><g
id="g38"
style="fill:#ff6b68;fill-opacity:1;stroke:none;stroke-opacity:1"
transform="matrix(0.98116917,0,0,0.98116917,4.8208209,4.8202575)">
</g><g
id="g40"
style="fill:#ff6b68;fill-opacity:1;stroke:none;stroke-opacity:1"
transform="matrix(0.98116917,0,0,0.98116917,4.8208209,4.8202575)">
</g><g
id="g42"
style="fill:#ff6b68;fill-opacity:1;stroke:none;stroke-opacity:1"
transform="matrix(0.98116917,0,0,0.98116917,4.8208209,4.8202575)">
</g><g
id="g44"
style="fill:#ff6b68;fill-opacity:1;stroke:none;stroke-opacity:1"
transform="matrix(0.98116917,0,0,0.98116917,4.8208209,4.8202575)">
</g><g
id="g46"
style="fill:#ff6b68;fill-opacity:1;stroke:none;stroke-opacity:1"
transform="matrix(0.98116917,0,0,0.98116917,4.8208209,4.8202575)">
</g><g
id="g48"
style="fill:#ff6b68;fill-opacity:1;stroke:none;stroke-opacity:1"
transform="matrix(0.98116917,0,0,0.98116917,4.8208209,4.8202575)">
</g></g>
</svg>

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

@@ -0,0 +1,77 @@
<?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"
viewBox="0 0 512 512"
enable-background="new 0 0 26 26"
id="svg8"
sodipodi:docname="downgrade.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
width="512"
height="512">
<metadata
id="metadata14">
<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>
<defs
id="defs12" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="739"
id="namedview10"
showgrid="false"
showborder="true"
inkscape:zoom="0.56730769"
inkscape:cx="154.91145"
inkscape:cy="139.84916"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg8"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:document-rotation="0" />
<g
id="g6"
transform="matrix(19.331463,0,0,20.93888,4.690981,-16.20544)"
style="fill:#be9117;fill-opacity:1;stroke:#be9117;stroke-width:0.0520416;stroke-opacity:1">
<path
d="m 25,17 h -2 c -0.6,0 -1,0.4 -1,1 v 2.5 C 22,20.8 21.8,21 21.5,21 H 4.5 C 4.2,21 4,20.8 4,20.5 V 18 C 4,17.4 3.6,17 3,17 H 1 c -0.6,0 -1,0.4 -1,1 v 6 c 0,0.6 0.4,1 1,1 h 24 c 0.6,0 1,-0.4 1,-1 v -6 c 0,-0.6 -0.4,-1 -1,-1 z"
id="path2"
inkscape:connector-curvature="0"
style="fill:#be9117;fill-opacity:1;stroke:#be9117;stroke-width:0.0520416;stroke-opacity:1" />
<path
d="m 12.3,16.7 c 0.2,0.2 0.5,0.3 0.7,0.3 0.2,0 0.5,-0.1 0.7,-0.3 l 6,-6 C 19.9,10.5 20,10.3 20,10 20,9.7 19.9,9.5 19.7,9.3 L 18.3,7.9 C 18.1,7.7 17.9,7.6 17.6,7.6 c -0.3,0 -0.5,0.1 -0.7,0.3 l -1,1 C 15.6,9.2 15,9 15,8.5 V 2 C 15,1.4 14.6,1 14,1 H 12 C 11.4,1 11,1.4 11,2 V 8.6 C 11,9 10.5,9.3 10.1,9 L 9.1,8 C 8.9,7.8 8.7,7.7 8.4,7.7 8.1,7.7 7.9,7.8 7.7,8 L 6.3,9.4 C 6.1,9.6 6,9.8 6,10.1 c 0,0.3 0.1,0.5 0.3,0.7 z"
id="path4"
inkscape:connector-curvature="0"
style="fill:#be9117;fill-opacity:1;stroke:#be9117;stroke-width:0.0520416;stroke-opacity:1" />
</g>
<g
transform="matrix(3.7795276,0,0,3.7795276,668.44512,-480.86859)"
id="layer1"
inkscape:label="Layer 1" />
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -0,0 +1,108 @@
<?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 512.00002 512.00002"
xml:space="preserve"
sodipodi:docname="filter.svg"
width="512"
height="512"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"><metadata
id="metadata1717"><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><defs
id="defs1715" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="739"
id="namedview1713"
showgrid="false"
inkscape:zoom="0.67994117"
inkscape:cx="416.65942"
inkscape:cy="286.29615"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1"
inkscape:document-rotation="0" />
<path
d="m 496.67267,76.836285 c 0,-24.97369 -25.79215,-43.560542 -78.85493,-56.826244 C 374.3748,9.1493067 316.90773,3.1681057 256.00119,3.1681057 c -60.9041,0 -118.3736,5.981201 -161.816529,16.8419353 C 41.121868,33.275743 15.32733,51.862595 15.32733,76.836285 c 0,9.240624 3.542636,17.605195 10.680722,25.151305 L 189.80713,300.66582 v 190.16485 c 0,6.22842 3.2186,12.01282 8.51098,15.29624 2.89698,1.79771 6.18761,2.70498 9.49023,2.70498 2.73138,0 5.46758,-0.62164 7.99495,-1.87212 l 96.18649,-47.67442 c 6.12041,-3.03381 9.99668,-9.27184 10.00628,-16.1051 l 0.1848,-142.50242 163.82069,-198.70225 c 7.13328,-7.543708 10.67112,-15.901074 10.67112,-25.139295 z M 111.03139,53.012277 c 39.6675,-8.926207 91.15097,-13.841734 144.9698,-13.841734 53.81885,0 105.30474,4.915527 144.96741,13.841734 43.80295,9.857468 56.11578,20.451778 59.06078,23.824008 -2.94738,3.37223 -15.25783,13.96654 -59.06078,23.824005 -39.66267,8.92622 -91.15096,13.84174 -144.96741,13.84174 -53.81643,0 -105.3023,-4.91552 -144.9698,-13.83933 C 67.230834,90.80523 54.915609,80.210909 51.970602,76.838689 54.915609,73.464055 67.230834,62.869745 111.03139,53.012277 Z M 290.30192,282.7534 c -2.65217,3.21862 -4.10668,7.25569 -4.11148,11.42719 l -0.18001,137.8005 -60.19847,29.83882 V 294.20458 c 0,-4.17868 -1.4521,-8.22776 -4.11148,-11.45118 L 99.909045,135.02822 c 42.708495,9.98948 97.811415,15.47865 156.092145,15.47865 58.28314,0 113.38367,-5.48917 156.09217,-15.47865 z"
id="path1680"
style="stroke-width:2.4;stroke-miterlimit:4;stroke-dasharray:none;fill:#afb1b3;fill-opacity:1" />
<g
id="g1682"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1684"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1686"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1688"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1690"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1692"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1694"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1696"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1698"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1700"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1702"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1704"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1706"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1708"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1710"
style="fill:#a9abac;fill-opacity:1">
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -0,0 +1,108 @@
<?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 512.00002 512.00002"
xml:space="preserve"
sodipodi:docname="filter_focused.svg"
width="512"
height="512"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"><metadata
id="metadata1717"><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="defs1715" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="739"
id="namedview1713"
showgrid="false"
inkscape:zoom="0.67994117"
inkscape:cx="416.65942"
inkscape:cy="286.29615"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1"
inkscape:document-rotation="0" />
<path
d="m 496.67267,76.836285 c 0,-24.97369 -25.79215,-43.560542 -78.85493,-56.826244 C 374.3748,9.1493067 316.90773,3.1681057 256.00119,3.1681057 c -60.9041,0 -118.3736,5.981201 -161.816529,16.8419353 C 41.121868,33.275743 15.32733,51.862595 15.32733,76.836285 c 0,9.240624 3.542636,17.605195 10.680722,25.151305 L 189.80713,300.66582 v 190.16485 c 0,6.22842 3.2186,12.01282 8.51098,15.29624 2.89698,1.79771 6.18761,2.70498 9.49023,2.70498 2.73138,0 5.46758,-0.62164 7.99495,-1.87212 l 96.18649,-47.67442 c 6.12041,-3.03381 9.99668,-9.27184 10.00628,-16.1051 l 0.1848,-142.50242 163.82069,-198.70225 c 7.13328,-7.543708 10.67112,-15.901074 10.67112,-25.139295 z M 111.03139,53.012277 c 39.6675,-8.926207 91.15097,-13.841734 144.9698,-13.841734 53.81885,0 105.30474,4.915527 144.96741,13.841734 43.80295,9.857468 56.11578,20.451778 59.06078,23.824008 -2.94738,3.37223 -15.25783,13.96654 -59.06078,23.824005 -39.66267,8.92622 -91.15096,13.84174 -144.96741,13.84174 -53.81643,0 -105.3023,-4.91552 -144.9698,-13.83933 C 67.230834,90.80523 54.915609,80.210909 51.970602,76.838689 54.915609,73.464055 67.230834,62.869745 111.03139,53.012277 Z M 290.30192,282.7534 c -2.65217,3.21862 -4.10668,7.25569 -4.11148,11.42719 l -0.18001,137.8005 -60.19847,29.83882 V 294.20458 c 0,-4.17868 -1.4521,-8.22776 -4.11148,-11.45118 L 99.909045,135.02822 c 42.708495,9.98948 97.811415,15.47865 156.092145,15.47865 58.28314,0 113.38367,-5.48917 156.09217,-15.47865 z"
id="path1680"
style="stroke-width:2.4;stroke-miterlimit:4;stroke-dasharray:none;fill:#6591b2;fill-opacity:1" />
<g
id="g1682"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1684"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1686"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1688"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1690"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1692"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1694"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1696"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1698"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1700"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1702"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1704"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1706"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1708"
style="fill:#a9abac;fill-opacity:1">
</g>
<g
id="g1710"
style="fill:#a9abac;fill-opacity:1">
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -1,6 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
@@ -13,15 +11,15 @@
id="Capa_1"
x="0px"
y="0px"
width="23.99629"
height="24.016451"
viewBox="0 0 23.99629 24.016451"
width="512"
height="512"
viewBox="0 0 512 512"
xml:space="preserve"
sodipodi:docname="about.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"><metadata
sodipodi:docname="help.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"><metadata
id="metadata933"><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><defs
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs931">
</defs><sodipodi:namedview
@@ -37,18 +35,19 @@
inkscape:window-height="739"
id="namedview929"
showgrid="false"
showborder="false"
showborder="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="8.0000001"
inkscape:cx="-11.089885"
inkscape:cy="21.17809"
inkscape:zoom="0.70710679"
inkscape:cx="406.89771"
inkscape:cy="275.80808"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1" />
inkscape:current-layer="Capa_1"
inkscape:document-rotation="0" />
<g
id="g898"
@@ -110,14 +109,7 @@
id="g926"
transform="translate(239.5083,-10.347359)">
</g>
<ellipse
style="fill:#37abc8;fill-opacity:1;stroke:#37abc8;stroke-width:0.089;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
<path
id="path939"
cx="11.998145"
cy="12.008225"
rx="11.953516"
ry="11.963586" /><path
style="fill:#ffffff;stroke-width:0.40259773"
inkscape:connector-curvature="0"
id="path894"
d="m 11.827314,5.6932365 c 2.182771,0 4.331738,1.0061128 4.331738,3.4126472 0,2.2192483 -2.540932,3.0727113 -3.086624,3.8746213 -0.409672,0.596498 -0.272847,1.434657 -1.398439,1.434657 -0.733224,0 -1.091385,-0.596901 -1.091385,-1.143054 0,-2.032363 2.983603,-2.492324 2.983603,-4.1658216 0,-0.9211286 -0.612496,-1.4672811 -1.636273,-1.4672811 -2.1827713,0 -1.330428,2.2522746 -2.9836036,2.2522746 -0.5968012,0 -1.1090924,-0.3584629 -1.1090924,-1.0407506 -4.024e-4,-1.6739009 1.9091198,-3.1572928 3.990076,-3.1572928 z m -0.08491,9.8299375 c 0.766224,0 1.398438,0.630735 1.398438,1.40002 0,0.769285 -0.631007,1.400019 -1.398438,1.400019 -0.767431,0 -1.398841,-0.629928 -1.398841,-1.400019 0,-0.768883 0.63141,-1.40002 1.398841,-1.40002 z" /></svg>
style="fill:#3592c4;fill-opacity:1;stroke:#3592c4;stroke-width:1.88256;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 255.87109 2.9414062 A 252.84608 253.05907 0 0 0 3.1542969 256 A 252.84608 253.05907 0 0 0 256 509.05859 A 252.84608 253.05907 0 0 0 508.8457 256 A 252.84608 253.05907 0 0 0 256 2.9414062 A 252.84608 253.05907 0 0 0 255.87109 2.9414062 z M 252.38672 122.42188 C 298.55766 122.42188 344.01367 143.70333 344.01367 194.60742 C 344.01367 241.54994 290.26733 259.60406 278.72461 276.56641 C 270.05905 289.1838 272.95161 306.91211 249.14258 306.91211 C 233.63311 306.91211 226.05859 294.28684 226.05859 282.73438 C 226.05859 239.74492 289.16797 230.01576 289.16797 194.61719 C 289.16797 175.13307 276.21203 163.58008 254.55664 163.58008 C 208.3857 163.58008 226.41598 211.2207 191.44727 211.2207 C 178.82347 211.2207 167.98633 203.63908 167.98633 189.20703 C 167.97733 153.79994 208.3694 122.42188 252.38672 122.42188 z M 250.58984 330.34961 C 266.79735 330.34961 280.16992 343.69063 280.16992 359.96289 C 280.16992 376.23515 266.82288 389.57812 250.58984 389.57812 C 234.35681 389.57812 221.00195 376.2522 221.00195 359.96289 C 221.00195 343.69914 234.35681 330.34961 250.58984 330.34961 z " /></svg>

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -0,0 +1,73 @@
<?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"
id="Capa_1"
enable-background="new 0 0 512 512"
height="512"
viewBox="0 0 512 512"
width="512"
version="1.1"
sodipodi:docname="history.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)">
<metadata
id="metadata17">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs15" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="739"
id="namedview13"
showgrid="false"
inkscape:zoom="0.79135193"
inkscape:cx="215.10201"
inkscape:cy="280.98293"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1"
inkscape:document-rotation="0" />
<g
id="g10"
transform="matrix(0.97954423,0,0,0.97954423,5.2366771,5.2366771)"
style="fill:#ffffff;fill-opacity:1">
<path
d="m 163.268,407.746 c -2.895,-0.211 -5.809,-0.317 -8.74,-0.317 h -101.801 -15 V 114.245 H 0 v 330.591 h 240.879 l -3.386,-3.345 c -20.156,-19.905 -46.244,-31.707 -74.225,-33.745 z"
id="path2"
style="fill:#ffffff;fill-opacity:1" />
<path
d="M 154.528,67.164 H 67.727 v 310.265 h 86.802 c 31.445,0 61.437,9.769 86.472,27.849 V 104.69 l -3.507,-3.464 C 215.252,79.262 185.788,67.164 154.528,67.164 Z m 34.394,240.079 h -69.117 v -30 h 69.117 z m 0,-67.469 h -69.117 v -30 h 69.117 z m 0,-67.469 h -69.117 v -30 h 69.117 z"
id="path4"
style="fill:#ffffff;fill-opacity:1" />
<path
d="M 444.273,377.429 V 67.164 h -86.802 c -31.26,0 -60.724,12.098 -82.966,34.063 L 271,104.69 v 300.587 c 25.035,-18.08 55.027,-27.849 86.472,-27.849 h 86.801 z M 323.078,142.305 h 69.117 v 30 h -69.117 z m 0,67.469 h 69.117 v 30 h -69.117 z m 0,67.469 h 69.117 v 30 h -69.117 z"
id="path6"
style="fill:#ffffff;fill-opacity:1" />
<path
d="M 474.273,114.245 V 407.429 H 357.472 c -31.26,0 -60.724,12.097 -82.966,34.063 l -3.385,3.344 H 512 V 114.245 Z"
id="path8"
style="fill:#ffffff;fill-opacity:1" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -0,0 +1,72 @@
<?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"
viewBox="0 0 512 512"
enable-background="new 0 0 26 26"
id="svg8"
sodipodi:docname="ignore_update.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
width="512"
height="512">
<metadata
id="metadata14">
<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="defs12" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="739"
id="namedview10"
showgrid="false"
showborder="true"
inkscape:zoom="0.80229424"
inkscape:cx="65.887412"
inkscape:cy="257.44157"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg8"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:document-rotation="0" />
<path
d="m 488.01383,339.78278 h -38.66897 c -11.60069,0 -19.33449,8.37828 -19.33449,20.9457 v 52.36424 c 0,6.28371 -3.86689,10.47285 -9.66724,10.47285 H 91.656869 c -5.800346,0 -9.667243,-4.18914 -9.667243,-10.47285 v -52.36424 c 0,-12.56742 -7.733794,-20.9457 -19.334486,-20.9457 H 23.986168 c -11.600692,0 -19.334486,8.37828 -19.334486,20.9457 v 125.67418 c 0,12.56741 7.733794,20.94569 19.334486,20.94569 H 488.01383 c 11.60069,0 19.33449,-8.37828 19.33449,-20.94569 V 360.72848 c 0,-12.56742 -7.7338,-20.9457 -19.33449,-20.9457 z"
id="path2"
inkscape:connector-curvature="0"
style="fill:#499c54;fill-opacity:1;stroke:none;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none" />
<path
d="m 242.46586,333.49908 c 3.8669,4.18913 9.66724,6.2837 13.53414,6.2837 3.8669,0 9.66724,-2.09457 13.53414,-6.2837 L 385.54106,207.8249 c 3.86689,-4.18914 5.80034,-8.37828 5.80034,-14.66199 0,-6.28371 -1.93345,-10.47285 -5.80034,-14.66199 l -27.06828,-29.32397 c -3.8669,-4.18914 -7.7338,-6.28371 -13.53414,-6.28371 -5.80035,0 -9.66725,2.09457 -13.53414,6.28371 l -19.33449,20.9457 c -5.80035,6.28371 -17.40104,2.09457 -17.40104,-8.37828 V 25.597344 c 0,-12.567418 -7.73379,-20.945696 -19.33448,-20.945696 h -38.66898 c -11.60069,0 -19.33448,8.378278 -19.33448,20.945696 V 163.83894 c 0,8.37828 -9.66725,14.66198 -17.40104,8.37828 l -19.33449,-20.9457 c -3.86689,-4.18914 -7.73379,-6.28371 -13.53414,-6.28371 -5.80034,0 -9.66724,2.09457 -13.53414,6.28371 l -27.06828,29.32397 c -3.86689,4.18914 -5.80034,8.37828 -5.80034,14.66199 0,6.28371 1.93345,10.47285 5.80034,14.66199 z"
id="path4"
inkscape:connector-curvature="0"
style="fill:#499c54;fill-opacity:1;stroke:none;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none" />
<path
style="fill:none;stroke:#ff6b68;stroke-width:84.1598;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 34.308581,477.05063 476.22097,34.098708"
id="path1411" />
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@@ -9,12 +9,12 @@
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="Capa_1"
enable-background="new 0 0 512 512"
height="12"
viewBox="0 0 12 12"
width="12"
height="512"
viewBox="0 0 512 512"
width="512"
version="1.1"
sodipodi:docname="app_info.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)">
<metadata
id="metadata877">
<rdf:RDF>
@@ -43,9 +43,9 @@
id="namedview873"
showgrid="false"
showborder="true"
inkscape:zoom="11.335805"
inkscape:cx="23.192934"
inkscape:cy="10.264189"
inkscape:zoom="0.70848781"
inkscape:cx="186.38588"
inkscape:cy="282.80121"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
@@ -53,21 +53,22 @@
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
fit-margin-bottom="0"
inkscape:document-rotation="0" />
<g
id="g7850"
transform="matrix(0.4246507,0,0,0.40528756,2.7763597,0.92203188)"
style="stroke:#37abc8;stroke-width:1.53208435;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
transform="matrix(21.043431,0,0,20.083897,96.253524,4.3628939)"
style="stroke:#3592c4;stroke-width:1.53208;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
<circle
cx="7.5912747"
cy="21.699696"
r="2.6452355"
id="circle866"
style="fill:none;stroke:#37abc8;stroke-width:1.53208435;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:#3592c4;stroke-width:1.53208;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="m 7.591275,0.71366244 c -3.7923421,0 -6.8776126,3.08527056 -6.8776126,6.87761256 V 8.2525839 H 6.0041336 V 7.591275 c 0,-0.8751762 0.7119652,-1.5871414 1.5871414,-1.5871414 0.8751762,0 1.5871413,0.7119652 1.5871413,1.5871414 0,0.466355 -0.2046971,0.9077567 -0.5616717,1.2111211 L 4.9460394,11.923201 v 4.75005 h 5.2904716 v -2.303912 l 1.806519,-1.535868 c 1.541643,-1.310009 2.425858,-3.2206629 2.425858,-5.242196 0,-3.792342 -3.085271,-6.87761256 -6.877613,-6.87761256 z"
id="path868"
style="fill:none;stroke:#37abc8;stroke-width:1.53208435;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#3592c4;stroke-width:1.53208;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="Layer_1"
enable-background="new 0 0 512 512"
height="512"
viewBox="0 0 512 512"
width="512"
version="1.1"
sodipodi:docname="installed.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)">
<metadata
id="metadata19">
<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="defs17" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="739"
id="namedview15"
showgrid="false"
inkscape:zoom="0.79135193"
inkscape:cx="136.26698"
inkscape:cy="280.61282"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Layer_1"
inkscape:document-rotation="0" />
<g
id="g12"
transform="matrix(0.99070052,0,0,0.99070052,2.3806669,2.3807133)"
style="fill:#8888c6;fill-opacity:1">
<path
d=""
style="fill:#8888c6;fill-opacity:1;stroke:#000000;stroke-width:32;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"
id="path2" />
<path
d=""
style="fill:#8888c6;fill-opacity:1;stroke:#000000;stroke-width:32;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"
id="path4" />
<path
d="M 236.94,237.109 6.94,140.267 C 3.645,138.879 0,141.299 0,144.875 v 258.899 c 0,6.542 3.983,12.426 10.058,14.855 l 223.085,89.234 c 3.284,1.314 6.857,-1.105 6.857,-4.642 V 241.717 c 0,-2.012 -1.206,-3.827 -3.06,-4.608 z"
id="path6"
style="fill:#8888c6;fill-opacity:1" />
<path
d="M 257.94,209.596 480.255,115.99 c 3.996,-1.682 4.103,-7.306 0.174,-9.139 L 262.766,5.275 c -4.289,-2.001 -9.243,-2.001 -13.532,0 L 31.571,106.851 c -3.929,1.833 -3.822,7.457 0.174,9.139 l 222.315,93.606 c 1.24,0.523 2.64,0.523 3.88,0 z"
id="path8"
style="fill:#8888c6;fill-opacity:1" />
<path
d="m 272,241.717 v 261.504 c 0,3.537 3.573,5.956 6.857,4.642 L 501.942,418.629 C 508.016,416.199 512,410.316 512,403.774 V 144.875 c 0,-3.576 -3.645,-5.996 -6.94,-4.608 l -230,96.842 c -1.854,0.781 -3.06,2.596 -3.06,4.608 z"
id="path10"
style="fill:#8888c6;fill-opacity:1" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -0,0 +1,67 @@
<?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"
height="512pt"
viewBox="0 -53 512 512"
width="512pt"
version="1.1"
id="svg3664"
sodipodi:docname="menu.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)">
<metadata
id="metadata3670">
<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="defs3668" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="739"
id="namedview3666"
showgrid="false"
inkscape:zoom="0.55957031"
inkscape:cx="316.76091"
inkscape:cy="367.53464"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg3664"
inkscape:document-rotation="0" />
<g
id="g1643">
<path
d="M 464.87025,61.99042 H 47.12974 c -10.481526,0 -18.988205,-14.107647 -18.988205,-31.490435 0,-17.382775 8.506679,-31.49042192 18.988205,-31.49042192 h 417.74051 c 10.48152,0 18.9882,14.10764692 18.9882,31.49042192 0,17.382788 -8.50668,31.490435 -18.9882,31.490435 z m 0,0"
id="path3660"
style="fill:#8888c6;fill-opacity:1;stroke-width:1.52831" />
<path
d="M 464.87025,234.49042 H 47.12974 c -10.481526,0 -18.988205,-14.10765 -18.988205,-31.49044 0,-17.38277 8.506679,-31.49042 18.988205,-31.49042 h 417.74051 c 10.48152,0 18.9882,14.10765 18.9882,31.49042 0,17.38279 -8.50668,31.49044 -18.9882,31.49044 z m 0,0"
id="path4046"
style="fill:#8888c6;fill-opacity:1;stroke-width:1.52831" />
<path
d="M 464.87025,406.99042 H 47.12974 c -10.481526,0 -18.988205,-14.10765 -18.988205,-31.49044 0,-17.38277 8.506679,-31.49042 18.988205,-31.49042 h 417.74051 c 10.48152,0 18.9882,14.10765 18.9882,31.49042 0,17.38279 -8.50668,31.49044 -18.9882,31.49044 z m 0,0"
id="path4048"
style="fill:#8888c6;fill-opacity:1;stroke-width:1.52831" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -1,6 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
@@ -13,12 +11,12 @@
id="Capa_1"
x="0px"
y="0px"
width="24"
height="24"
viewBox="0 0 23.999999 24"
width="512"
height="512"
viewBox="0 0 511.99998 512"
xml:space="preserve"
sodipodi:docname="refresh.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"><metadata
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"><metadata
id="metadata45"><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
@@ -32,13 +30,13 @@
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="731"
inkscape:window-height="739"
id="namedview41"
showgrid="false"
showborder="true"
inkscape:zoom="1.9374833"
inkscape:cx="-64.984391"
inkscape:cy="25.848163"
inkscape:zoom="0.48437083"
inkscape:cx="133.71431"
inkscape:cy="289.92474"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
@@ -46,24 +44,25 @@
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
fit-margin-bottom="0"
inkscape:document-rotation="0" />
<g
id="g8"
transform="matrix(0.0488044,0,0,0.04558654,0.11053708,0.89443506)"
style="fill:none;fill-opacity:1;stroke:#37abc8;stroke-width:39.24114227">
transform="matrix(1.0938971,0,0,1.0217723,-10.489433,7.0809411)"
style="fill:#3592c4;fill-opacity:1;stroke:none;stroke-width:39.2413;stroke-miterlimit:4;stroke-dasharray:none">
<g
id="g6"
style="fill:none;fill-opacity:1;stroke:#37abc8;stroke-width:39.24114227">
style="fill:#3592c4;fill-opacity:1;stroke:none;stroke-width:39.2413;stroke-miterlimit:4;stroke-dasharray:none">
<path
d="m 55.323,203.641 c 15.664,0 29.813,-9.405 35.872,-23.854 25.017,-59.604 83.842,-101.61 152.42,-101.61 37.797,0 72.449,12.955 100.23,34.442 l -21.775,3.371 c -7.438,1.153 -13.224,7.054 -14.232,14.512 -1.01,7.454 3.008,14.686 9.867,17.768 l 119.746,53.872 c 5.249,2.357 11.33,1.904 16.168,-1.205 4.83,-3.114 7.764,-8.458 7.796,-14.208 l 0.621,-131.943 c 0.042,-7.506 -4.851,-14.144 -12.024,-16.332 -7.185,-2.188 -14.947,0.589 -19.104,6.837 L 414.403,70.096 C 370.398,26.778 310.1,0 243.615,0 142.806,0 56.133,61.562 19.167,149.06 c -5.134,12.128 -3.84,26.015 3.429,36.987 7.269,10.976 19.556,17.594 32.727,17.594 z"
id="path2"
inkscape:connector-curvature="0"
style="fill:none;fill-opacity:1;stroke:#37abc8;stroke-width:39.24114227" />
style="fill:#3592c4;fill-opacity:1;stroke:none;stroke-width:39.2413;stroke-miterlimit:4;stroke-dasharray:none" />
<path
d="m 464.635,301.184 c -7.27,-10.977 -19.558,-17.594 -32.728,-17.594 -15.664,0 -29.813,9.405 -35.872,23.854 -25.018,59.604 -83.843,101.61 -152.42,101.61 -37.798,0 -72.45,-12.955 -100.232,-34.442 l 21.776,-3.369 c 7.437,-1.153 13.223,-7.055 14.233,-14.514 1.009,-7.453 -3.008,-14.686 -9.867,-17.768 L 49.779,285.089 c -5.25,-2.356 -11.33,-1.905 -16.169,1.205 -4.829,3.114 -7.764,8.458 -7.795,14.207 l -0.622,131.943 c -0.042,7.506 4.85,14.144 12.024,16.332 7.185,2.188 14.948,-0.59 19.104,-6.839 l 16.505,-24.805 c 44.004,43.32 104.303,70.098 170.788,70.098 100.811,0 187.481,-61.561 224.446,-149.059 5.137,-12.128 3.843,-26.014 -3.425,-36.987 z"
id="path4"
inkscape:connector-curvature="0"
style="fill:none;fill-opacity:1;stroke:#37abc8;stroke-width:39.24114227" />
style="fill:#3592c4;fill-opacity:1;stroke:none;stroke-width:39.2413;stroke-miterlimit:4;stroke-dasharray:none" />
</g>
</g>
<g
@@ -126,4 +125,4 @@
id="g38"
transform="translate(-15.027876,-464.19647)">
</g>
</svg>
</svg>

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@@ -11,12 +11,12 @@
id="Capa_1"
x="0px"
y="0px"
viewBox="0 0 23.515307 24"
viewBox="0 0 512.00001 512"
xml:space="preserve"
sodipodi:docname="revert_update_ignored.svg"
width="23.515306"
height="24"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"><metadata
width="512"
height="512"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"><metadata
id="metadata977"><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
@@ -30,8 +30,8 @@
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1600"
inkscape:window-height="871"
inkscape:window-width="1366"
inkscape:window-height="739"
id="namedview973"
showgrid="false"
showborder="true"
@@ -39,9 +39,9 @@
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="6.7086704"
inkscape:cx="48.469191"
inkscape:cy="14.670878"
inkscape:zoom="0.8385838"
inkscape:cx="183.99219"
inkscape:cy="298.52893"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
@@ -138,52 +138,52 @@
id="g1633" /><g
transform="matrix(0.0625,0,0,0.0625,5.3383307,-186.94071)"
id="g1635" /><g
style="fill:#91a069;fill-opacity:1;stroke:#447821;stroke-width:8.06072238;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#499c54;fill-opacity:1;stroke:#499c54;stroke-width:8.06072;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="g3479"
transform="matrix(0.04614971,0,0,0.04614971,-0.05664347,0.18569731)"><g
style="fill:#91a069;fill-opacity:1;stroke:#447821;stroke-width:8.06072238;stroke-miterlimit:4;stroke-dasharray:none"
transform="matrix(0.97444257,0,0,0.97444257,6.5433156,6.5431893)"><g
style="fill:#499c54;fill-opacity:1;stroke:#499c54;stroke-width:8.06072;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="g3455"><g
style="fill:#91a069;fill-opacity:1;stroke:#447821;stroke-width:8.06072238;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#499c54;fill-opacity:1;stroke:#499c54;stroke-width:8.06072;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="g2828"><g
style="fill:#91a069;fill-opacity:1;stroke:#447821;stroke-width:8.06072238;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#499c54;fill-opacity:1;stroke:#499c54;stroke-width:8.06072;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="g2826"><path
style="fill:#91a069;fill-opacity:1;stroke:#447821;stroke-width:8.06072238;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#499c54;fill-opacity:1;stroke:#499c54;stroke-width:8.06072;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 508.745,246.041 C 504.171,239.784 395.188,92.835 255.997,92.835 c -139.191,0 -248.179,146.949 -252.748,153.2 -4.332,5.936 -4.332,13.987 0,19.923 4.569,6.257 113.557,153.206 252.748,153.206 139.191,0 248.174,-146.95 252.748,-153.201 4.338,-5.935 4.338,-13.992 0,-19.922 z M 255.997,385.406 c -102.529,0 -191.33,-97.533 -217.617,-129.418 26.253,-31.913 114.868,-129.395 217.617,-129.395 102.524,0 191.319,97.516 217.617,129.418 -26.253,31.912 -114.868,129.395 -217.617,129.395 z"
id="path2824" /></g></g><g
style="fill:#91a069;fill-opacity:1;stroke:#447821;stroke-width:8.06072238;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#499c54;fill-opacity:1;stroke:#499c54;stroke-width:8.06072;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="g2834"><g
style="fill:#91a069;fill-opacity:1;stroke:#447821;stroke-width:8.06072238;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#499c54;fill-opacity:1;stroke:#499c54;stroke-width:8.06072;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="g2832"><path
style="fill:#91a069;fill-opacity:1;stroke:#447821;stroke-width:8.06072238;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#499c54;fill-opacity:1;stroke:#499c54;stroke-width:8.06072;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 255.997,154.725 c -55.842,0 -101.275,45.433 -101.275,101.275 0,55.842 45.433,101.275 101.275,101.275 55.842,0 101.275,-45.433 101.275,-101.275 0,-55.842 -45.433,-101.275 -101.275,-101.275 z m 0,168.791 c -37.23,0 -67.516,-30.287 -67.516,-67.516 0,-37.229 30.287,-67.516 67.516,-67.516 37.229,0 67.516,30.287 67.516,67.516 0,37.229 -30.286,67.516 -67.516,67.516 z"
id="path2830" /></g></g><g
style="fill:#91a069;fill-opacity:1;stroke:#447821;stroke-width:8.06072238;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#499c54;fill-opacity:1;stroke:#499c54;stroke-width:8.06072;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="g2836" /><g
style="fill:#91a069;fill-opacity:1;stroke:#447821;stroke-width:8.06072238;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#499c54;fill-opacity:1;stroke:#499c54;stroke-width:8.06072;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="g2838" /><g
style="fill:#91a069;fill-opacity:1;stroke:#447821;stroke-width:8.06072238;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#499c54;fill-opacity:1;stroke:#499c54;stroke-width:8.06072;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="g2840" /><g
style="fill:#91a069;fill-opacity:1;stroke:#447821;stroke-width:8.06072238;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#499c54;fill-opacity:1;stroke:#499c54;stroke-width:8.06072;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="g2842" /><g
style="fill:#91a069;fill-opacity:1;stroke:#447821;stroke-width:8.06072238;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#499c54;fill-opacity:1;stroke:#499c54;stroke-width:8.06072;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="g2844" /><g
style="fill:#91a069;fill-opacity:1;stroke:#447821;stroke-width:8.06072238;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#499c54;fill-opacity:1;stroke:#499c54;stroke-width:8.06072;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="g2846" /><g
style="fill:#91a069;fill-opacity:1;stroke:#447821;stroke-width:8.06072238;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#499c54;fill-opacity:1;stroke:#499c54;stroke-width:8.06072;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="g2848" /><g
style="fill:#91a069;fill-opacity:1;stroke:#447821;stroke-width:8.06072238;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#499c54;fill-opacity:1;stroke:#499c54;stroke-width:8.06072;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="g2850" /><g
style="fill:#91a069;fill-opacity:1;stroke:#447821;stroke-width:8.06072238;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#499c54;fill-opacity:1;stroke:#499c54;stroke-width:8.06072;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="g2852" /><g
style="fill:#91a069;fill-opacity:1;stroke:#447821;stroke-width:8.06072238;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#499c54;fill-opacity:1;stroke:#499c54;stroke-width:8.06072;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="g2854" /><g
style="fill:#91a069;fill-opacity:1;stroke:#447821;stroke-width:8.06072238;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#499c54;fill-opacity:1;stroke:#499c54;stroke-width:8.06072;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="g2856" /><g
style="fill:#91a069;fill-opacity:1;stroke:#447821;stroke-width:8.06072238;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#499c54;fill-opacity:1;stroke:#499c54;stroke-width:8.06072;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="g2858" /><g
style="fill:#91a069;fill-opacity:1;stroke:#447821;stroke-width:8.06072238;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#499c54;fill-opacity:1;stroke:#499c54;stroke-width:8.06072;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="g2860" /><g
style="fill:#91a069;fill-opacity:1;stroke:#447821;stroke-width:8.06072238;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#499c54;fill-opacity:1;stroke:#499c54;stroke-width:8.06072;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="g2862" /><g
style="fill:#91a069;fill-opacity:1;stroke:#447821;stroke-width:8.06072238;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#499c54;fill-opacity:1;stroke:#499c54;stroke-width:8.06072;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="g2864" /></g></g></svg>

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

@@ -0,0 +1,119 @@
<?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 512 512"
xml:space="preserve"
sodipodi:docname="search.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
width="512"
height="512"><metadata
id="metadata126"><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><defs
id="defs124" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="739"
id="namedview122"
showgrid="false"
showborder="true"
inkscape:zoom="0.45254834"
inkscape:cx="67.686957"
inkscape:cy="197.98638"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:document-rotation="0" />
<g
id="Search"
transform="matrix(2.0004545,0,0,2.0004545,5.6311166,5.6311166)"
style="fill:#afb1b3;fill-opacity:1">
<path
style="clip-rule:evenodd;fill:#afb1b3;fill-opacity:1;fill-rule:evenodd"
d="m 244.186,214.604 -54.379,-54.378 c -0.289,-0.289 -0.628,-0.491 -0.93,-0.76 10.7,-16.231 16.945,-35.66 16.945,-56.554 C 205.822,46.075 159.747,0 102.911,0 46.075,0 0,46.075 0,102.911 c 0,56.835 46.074,102.911 102.91,102.911 20.895,0 40.323,-6.245 56.554,-16.945 0.269,0.301 0.47,0.64 0.759,0.929 l 54.38,54.38 c 8.169,8.168 21.413,8.168 29.583,0 8.168,-8.169 8.168,-21.413 0,-29.582 z M 102.911,170.146 c -37.134,0 -67.236,-30.102 -67.236,-67.235 0,-37.134 30.103,-67.236 67.236,-67.236 37.132,0 67.235,30.103 67.235,67.236 0,37.133 -30.103,67.235 -67.235,67.235 z"
id="path88"
inkscape:connector-curvature="0" />
</g>
<g
id="g91"
transform="translate(0,-238.312)">
</g>
<g
id="g93"
transform="translate(0,-238.312)">
</g>
<g
id="g95"
transform="translate(0,-238.312)">
</g>
<g
id="g97"
transform="translate(0,-238.312)">
</g>
<g
id="g99"
transform="translate(0,-238.312)">
</g>
<g
id="g101"
transform="translate(0,-238.312)">
</g>
<g
id="g103"
transform="translate(0,-238.312)">
</g>
<g
id="g105"
transform="translate(0,-238.312)">
</g>
<g
id="g107"
transform="translate(0,-238.312)">
</g>
<g
id="g109"
transform="translate(0,-238.312)">
</g>
<g
id="g111"
transform="translate(0,-238.312)">
</g>
<g
id="g113"
transform="translate(0,-238.312)">
</g>
<g
id="g115"
transform="translate(0,-238.312)">
</g>
<g
id="g117"
transform="translate(0,-238.312)">
</g>
<g
id="g119"
transform="translate(0,-238.312)">
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@@ -1,6 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
@@ -13,12 +11,12 @@
id="Capa_1"
x="0px"
y="0px"
viewBox="0 0 12 12"
viewBox="0 0 512 512"
xml:space="preserve"
sodipodi:docname="search.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
width="12"
height="12"><metadata
sodipodi:docname="search_focused.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
width="512"
height="512"><metadata
id="metadata126"><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
@@ -35,24 +33,25 @@
inkscape:window-height="739"
id="namedview122"
showgrid="false"
showborder="false"
inkscape:zoom="0.53133476"
inkscape:cx="834.65593"
inkscape:cy="-101.88082"
showborder="true"
inkscape:zoom="0.45254834"
inkscape:cx="67.686957"
inkscape:cy="197.98638"
inkscape:window-x="0"
inkscape:window-y="260"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
fit-margin-bottom="0"
inkscape:document-rotation="0" />
<g
id="Search"
transform="scale(0.04794017)"
style="fill:#999999">
transform="matrix(2.0004545,0,0,2.0004545,5.6311166,5.6311166)"
style="fill:#6591b2;fill-opacity:1">
<path
style="clip-rule:evenodd;fill:#999999;fill-rule:evenodd"
style="clip-rule:evenodd;fill:#6591b2;fill-opacity:1;fill-rule:evenodd"
d="m 244.186,214.604 -54.379,-54.378 c -0.289,-0.289 -0.628,-0.491 -0.93,-0.76 10.7,-16.231 16.945,-35.66 16.945,-56.554 C 205.822,46.075 159.747,0 102.911,0 46.075,0 0,46.075 0,102.911 c 0,56.835 46.074,102.911 102.91,102.911 20.895,0 40.323,-6.245 56.554,-16.945 0.269,0.301 0.47,0.64 0.759,0.929 l 54.38,54.38 c 8.169,8.168 21.413,8.168 29.583,0 8.168,-8.169 8.168,-21.413 0,-29.582 z M 102.911,170.146 c -37.134,0 -67.236,-30.102 -67.236,-67.235 0,-37.134 30.103,-67.236 67.236,-67.236 37.132,0 67.235,30.103 67.235,67.236 0,37.133 -30.103,67.235 -67.235,67.235 z"
id="path88"
inkscape:connector-curvature="0" />
@@ -117,4 +116,4 @@
id="g119"
transform="translate(0,-238.312)">
</g>
</svg>
</svg>

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@@ -0,0 +1,102 @@
<?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 512.00001 512.00001"
xml:space="preserve"
sodipodi:docname="settings.svg"
width="512"
height="512"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"><metadata
id="metadata3467"><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="defs3465" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="739"
id="namedview3463"
showgrid="false"
inkscape:zoom="0.94962159"
inkscape:cx="386.84916"
inkscape:cy="274.17305"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1"
inkscape:document-rotation="0" />
<g
id="g3430"
style="fill:#8888c6;fill-opacity:1"
transform="matrix(1.1874452,0,0,1.1874452,2.6781594,2.6787531)">
<g
id="g3428"
style="fill:#8888c6;fill-opacity:1">
<path
d="m 416.8,269.44 -45.013,-35.307 c 0.853,-6.827 1.493,-13.76 1.493,-20.8 0,-7.04 -0.64,-13.973 -1.493,-20.8 l 45.12,-35.307 c 4.053,-3.2 5.227,-8.96 2.56,-13.653 L 376.8,69.653 c -2.667,-4.587 -8.213,-6.507 -13.013,-4.587 l -53.12,21.44 C 299.68,78.079 287.627,70.933 274.614,65.493 l -8,-56.533 C 265.653,3.947 261.28,0 255.947,0 h -85.333 c -5.333,0 -9.707,3.947 -10.56,8.96 l -8,56.533 c -13.013,5.44 -25.067,12.48 -36.053,21.013 l -53.12,-21.44 c -4.8,-1.813 -10.347,0 -13.013,4.587 L 7.2,143.573 c -2.667,4.587 -1.493,10.347 2.56,13.653 l 45.013,35.307 c -0.853,6.827 -1.493,13.76 -1.493,20.8 0,7.04 0.64,13.973 1.493,20.8 L 9.76,269.44 c -4.053,3.2 -5.227,8.96 -2.56,13.653 l 42.667,73.92 c 2.667,4.587 8.213,6.507 13.013,4.587 L 116,340.16 c 10.987,8.427 23.04,15.573 36.053,21.013 l 8,56.533 c 0.853,5.013 5.227,8.96 10.56,8.96 h 85.333 c 5.333,0 9.707,-3.947 10.56,-8.96 l 8,-56.533 c 13.013,-5.44 25.067,-12.48 36.053,-21.013 l 53.12,21.44 c 4.8,1.813 10.347,0 13.013,-4.587 l 42.667,-73.92 c 2.668,-4.586 1.494,-10.346 -2.559,-13.653 z M 213.28,288 c -41.28,0 -74.667,-33.387 -74.667,-74.667 0,-41.28 33.387,-74.666 74.667,-74.666 41.28,0 74.667,33.387 74.667,74.667 0,41.28 -33.387,74.666 -74.667,74.666 z"
id="path3426"
style="fill:#8888c6;fill-opacity:1" />
</g>
</g>
<g
id="g3432">
</g>
<g
id="g3434">
</g>
<g
id="g3436">
</g>
<g
id="g3438">
</g>
<g
id="g3440">
</g>
<g
id="g3442">
</g>
<g
id="g3444">
</g>
<g
id="g3446">
</g>
<g
id="g3448">
</g>
<g
id="g3450">
</g>
<g
id="g3452">
</g>
<g
id="g3454">
</g>
<g
id="g3456">
</g>
<g
id="g3458">
</g>
<g
id="g3460">
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@@ -0,0 +1,137 @@
<?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 512 512.00002"
xml:space="preserve"
sodipodi:docname="suggestions.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
width="512"
height="512"><metadata
id="metadata3871"><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="defs3869">
</defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="739"
id="namedview3867"
showgrid="false"
showborder="true"
inkscape:zoom="0.42190923"
inkscape:cx="312.48671"
inkscape:cy="404.82957"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:document-rotation="0" />
<g
id="g3836"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3838"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3840"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3842"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3844"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3846"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3848"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3850"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3852"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3854"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3856"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3858"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3860"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3862"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g3864"
transform="translate(-38.804984,-406.525)">
</g>
<g
id="g1560"><path
style="fill:#8888c6;fill-opacity:1;stroke:#8888c6;stroke-width:25;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 256.00003,16.916451 c -94.96346,0 -172.547989,73.786887 -172.547989,164.102049 0,47.2236 21.723669,92.67633 58.343579,123.37168 27.30975,25.97299 24.82703,81.46074 24.20637,82.05105 0,2.95145 0.62068,5.31264 3.10338,7.67382 1.86203,1.77075 4.9654,2.95149 7.44811,2.95149 h 158.27245 c 3.10338,0 5.58607,-1.18077 7.4481,-2.95149 1.86195,-1.77075 3.1034,-4.72237 3.1034,-7.67382 0,-0.59025 -3.1034,-56.07806 24.20636,-82.05105 0.62074,-0.59025 1.24147,-1.18076 1.86195,-1.77075 35.99923,-31.28563 57.10222,-75.55778 57.10222,-121.60081 0,-90.315153 -77.58454,-164.102041 -172.54801,-164.102041 z M 355.30824,289.0425 c -0.62073,0.59025 -1.86195,1.77101 -1.86195,2.36126 -24.20638,24.79241 -28.5511,65.52277 -29.17179,85.00251 H 187.10497 c -0.62069,-19.47982 -4.9654,-61.98105 -31.03381,-87.36377 -32.89583,-27.15359 -52.1368,-66.70333 -52.1368,-108.61431 0,-79.68983 67.65372,-144.031999 151.44501,-144.031999 83.79128,0 151.44499,64.342169 151.44499,144.031999 0,41.91098 -18.62028,81.46072 -51.51612,108.61431 z"
id="path3812"
inkscape:connector-curvature="0" /><path
style="fill:#6e6e6e;fill-opacity:1;stroke:#8888c6;stroke-width:25;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 303.79211,445.49876 h -96.82549 c -14.27556,0 -26.0684,11.21561 -26.0684,24.79241 0,13.57677 11.79284,24.79238 26.0684,24.79238 h 96.82549 c 14.27556,0 26.06841,-11.21561 26.06841,-24.79238 0,-14.1671 -11.79285,-24.79241 -26.06841,-24.79241 z m 0,28.92447 h -96.82549 c -2.48268,0 -4.96542,-1.77076 -4.96542,-4.72237 0,-2.95147 1.86203,-4.72236 4.96542,-4.72236 h 96.82549 c 2.48268,0 4.96541,1.77075 4.96541,4.72236 0,2.95149 -2.4827,4.72237 -4.96541,4.72237 z"
id="path3818"
inkscape:connector-curvature="0" /><path
style="fill:#8888c6;fill-opacity:1;stroke:#8888c6;stroke-width:13.356;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 229.00434,88.827447 c -4.96865,0 -9.38524,4.200401 -9.38524,8.925851 0,4.725452 4.41659,8.925862 9.38524,8.925862 55.7594,0 100.47733,43.05411 100.47733,95.55912 0,4.72545 4.4166,8.92585 9.38525,8.92585 4.96866,0 9.38526,-4.2004 9.38526,-8.92585 0.5521,-62.48097 -52.99905,-113.410833 -119.24784,-113.410833 z"
id="path3814"
inkscape:connector-curvature="0" /></g></svg>

After

Width:  |  Height:  |  Size: 5.0 KiB

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