diff --git a/bauh/api/abstract/context.py b/bauh/api/abstract/context.py index 69e606de..4fcc5adb 100644 --- a/bauh/api/abstract/context.py +++ b/bauh/api/abstract/context.py @@ -12,7 +12,7 @@ class ApplicationContext: def __init__(self, disk_cache: bool, 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): + logger: logging.Logger, file_downloader: FileDownloader, distro: str, app_name: str): """ :param disk_cache: if package data should be cached to disk :param download_icons: if packages icons should be downloaded @@ -24,6 +24,7 @@ class ApplicationContext: :param logger: a logger instance :param file_downloader :param distro + :param app_name """ self.disk_cache = disk_cache self.download_icons = download_icons @@ -38,6 +39,7 @@ class ApplicationContext: self.distro = distro self.default_categories = ('AudioVideo', 'Audio', 'Video', 'Development', 'Education', 'Game', 'Graphics', 'Network', 'Office', 'Science', 'Settings', 'System', 'Utility') + self.app_name = app_name def is_system_x86_64(self): return self.arch_x86_64 diff --git a/bauh/app.py b/bauh/app.py index c8e4b61b..70e25aca 100755 --- a/bauh/app.py +++ b/bauh/app.py @@ -54,7 +54,8 @@ def main(): logger=logger, distro=util.get_distro(), file_downloader=AdaptableFileDownloader(logger, bool(local_config['download']['multithreaded']), - i18n, http_client)) + i18n, http_client), + app_name=__app_name__) managers = gems.load_managers(context=context, locale=i18n_key, config=local_config, default_locale=DEFAULT_I18N_KEY) diff --git a/bauh/gems/appimage/__init__.py b/bauh/gems/appimage/__init__.py index 341db84d..7bb34b63 100644 --- a/bauh/gems/appimage/__init__.py +++ b/bauh/gems/appimage/__init__.py @@ -1,7 +1,10 @@ import os from pathlib import Path +from bauh.api.constants import CONFIG_PATH + ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) LOCAL_PATH = '{}/.local/share/bauh/appimage'.format(Path.home()) INSTALLATION_PATH = LOCAL_PATH + '/installed/' -SUGGESTIONS_FILE = 'https://raw.githubusercontent.com/vinifmor/bauh-files/master/appimage/suggestions.txt' \ No newline at end of file +SUGGESTIONS_FILE = 'https://raw.githubusercontent.com/vinifmor/bauh-files/master/appimage/suggestions.txt' +CONFIG_FILE = '{}/appimage.yml'.format(CONFIG_PATH) diff --git a/bauh/gems/appimage/config.py b/bauh/gems/appimage/config.py index a19b2ef4..8ceefa84 100644 --- a/bauh/gems/appimage/config.py +++ b/bauh/gems/appimage/config.py @@ -1,5 +1,5 @@ -from bauh.api.constants import CONFIG_PATH from bauh.commons.config import read_config as read +from bauh.gems.appimage import CONFIG_FILE def read_config(update_file: bool = False) -> dict: @@ -9,4 +9,4 @@ def read_config(update_file: bool = False) -> dict: 'enabled': True } } - return read('{}/appimage.yml'.format(CONFIG_PATH), default, update_file=update_file) + return read(CONFIG_FILE, default, update_file=update_file) diff --git a/bauh/gems/appimage/controller.py b/bauh/gems/appimage/controller.py index a69e6ac6..1067248b 100644 --- a/bauh/gems/appimage/controller.py +++ b/bauh/gems/appimage/controller.py @@ -9,7 +9,7 @@ import traceback from datetime import datetime from pathlib import Path from threading import Lock, Thread -from typing import Set, Type, List +from typing import Set, Type, List, Tuple from colorama import Fore @@ -21,9 +21,10 @@ from bauh.api.abstract.model import SoftwarePackage, PackageHistory, PackageUpda SuggestionPriority from bauh.api.abstract.view import MessageType, ViewComponent, FormComponent, InputOption, SingleSelectComponent, \ SelectViewType, TextInputComponent, PanelComponent +from bauh.commons.config import save_config from bauh.commons.html import bold from bauh.commons.system import SystemProcess, new_subprocess, ProcessHandler, run_cmd, SimpleProcess -from bauh.gems.appimage import query, INSTALLATION_PATH, LOCAL_PATH, SUGGESTIONS_FILE +from bauh.gems.appimage import query, INSTALLATION_PATH, LOCAL_PATH, SUGGESTIONS_FILE, CONFIG_FILE from bauh.gems.appimage.config import read_config from bauh.gems.appimage.model import AppImage from bauh.gems.appimage.worker import DatabaseUpdater @@ -506,12 +507,30 @@ class AppImageManager(SoftwareManager): InputOption(label=self.i18n['no'].capitalize(), value=False)] updater_opts = [ - SingleSelectComponent(label='Enabled', + SingleSelectComponent(label=self.i18n['appimage.config.db_updates.activated'], options=enabled_opts, default_option=[o for o in enabled_opts if o.value == config['db_updater']['enabled']][0], max_per_line=len(enabled_opts), - type_=SelectViewType.RADIO), - TextInputComponent(label='Interval', value=str(config['db_updater']['interval']), tooltip="Update interval in SECONDS", only_int=True) + type_=SelectViewType.RADIO, + id_='up_enabled'), + TextInputComponent(label=self.i18n['interval'], + value=str(config['db_updater']['interval']), + tooltip=self.i18n['appimage.config.db_updates.interval.tip'], + only_int=True, + id_='up_int') ] - return PanelComponent([FormComponent(updater_opts, 'Database updates')]) + return PanelComponent([FormComponent(updater_opts, self.i18n['appimage.config.db_updates'])]) + + def save_settings(self, component: PanelComponent) -> Tuple[bool, List[str]]: + config = read_config() + + panel = component.components[0] + config['db_updater']['enabled'] = panel.get_component('up_enabled').get_selected() + config['db_updater']['interval'] = panel.get_component('up_int').get_int_value() + + try: + save_config(config, CONFIG_FILE) + return True, None + except: + return False, [traceback.format_exc()] diff --git a/bauh/gems/appimage/resources/locale/ca b/bauh/gems/appimage/resources/locale/ca index 072146b7..0637701b 100644 --- a/bauh/gems/appimage/resources/locale/ca +++ b/bauh/gems/appimage/resources/locale/ca @@ -17,3 +17,6 @@ appimage.downgrade.uninstall_current_version=No s’ha pogut desinstal·lar la v appimage.downgrade.install_version=No s’ha pogut instal·lar la versió {} ({}) appimage.install.download.error=No s’ha pogut baixar el fitxer {}. El servidor del fitxer pot estar inactiu. appimage.install.appimagelauncher.error = {appimgl} no permet la instal·lació de {app}. Desinstal·leu {appimgl}, reinicieu el sistema i torneu a provar d’instal·lar {app}. +appimage.config.db_updates=Actualització de la base de dades +appimage.config.db_updates.activated=activada +appimage.config.db_updates.interval.tip=Interval d'actualització a SECONDS \ No newline at end of file diff --git a/bauh/gems/appimage/resources/locale/de b/bauh/gems/appimage/resources/locale/de index b7d6df74..f87978e6 100644 --- a/bauh/gems/appimage/resources/locale/de +++ b/bauh/gems/appimage/resources/locale/de @@ -16,4 +16,7 @@ appimage.downgrade.first_version={} ist in der ersten veröffentlichten Version appimage.error.uninstall_current_version=Deinstallation der aktuellen Version von {} war nicht möglich appimage.downgrade.install_version=Die Installation der Version {} ({}) war nicht möglich appimage.install.download.error=Das Herunterladen der Datei {} ist fehlgeschlagen. Eventuell ist der Server nicht verfügbar -appimage.install.appimagelauncher.error={appimgl} verhindert die installation von {app}. Deinstalliere {appimgl}, starte deinen Computer neu und versuche die installation von {app} erneut. \ No newline at end of file +appimage.install.appimagelauncher.error={appimgl} verhindert die installation von {app}. Deinstalliere {appimgl}, starte deinen Computer neu und versuche die installation von {app} erneut. +appimage.config.db_updates=Datenbankaktualisierung +appimage.config.db_updates.activated=aktiviert +appimage.config.db_updates.interval.tip=Aktualisierungsintervall in SEKUNDEN \ No newline at end of file diff --git a/bauh/gems/appimage/resources/locale/en b/bauh/gems/appimage/resources/locale/en index 0a4c5a07..e50bc5f2 100644 --- a/bauh/gems/appimage/resources/locale/en +++ b/bauh/gems/appimage/resources/locale/en @@ -16,4 +16,7 @@ appimage.downgrade.first_version={} is in its first published version appimage.error.uninstall_current_version=It was not possible to uninstall the current version of {} appimage.downgrade.install_version=It was not possible to install the version {} ({}) appimage.install.download.error=It was not possible to download the file {}. The file server can be down. -appimage.install.appimagelauncher.error={appimgl} is not allowing {app} to be installed. Uninstall {appimgl}, reboot your system and try to install {app} again. \ No newline at end of file +appimage.install.appimagelauncher.error={appimgl} is not allowing {app} to be installed. Uninstall {appimgl}, reboot your system and try to install {app} again. +appimage.config.db_updates=Database update +appimage.config.db_updates.activated=activated +appimage.config.db_updates.interval.tip=Update interval in SECONDS \ No newline at end of file diff --git a/bauh/gems/appimage/resources/locale/es b/bauh/gems/appimage/resources/locale/es index 932e3fa1..4c0aec57 100644 --- a/bauh/gems/appimage/resources/locale/es +++ b/bauh/gems/appimage/resources/locale/es @@ -16,4 +16,7 @@ appimage.downgrade.first_version={} está en su primera versión publicada appimage.downgrade.uninstall_current_version=No fue posible desinstalar la versión actual de {} appimage.downgrade.install_version=No fue posible instalar la versión {} ({}) appimage.install.download.error=No fue posible descargar el archivo {}. El servidor del archivo puede estar inactivo. -appimage.install.appimagelauncher.error = {appimgl} no permite la instalación de {app}. Desinstale {appimgl}, reinicie su sistema e intente instalar {app} nuevamente. \ No newline at end of file +appimage.install.appimagelauncher.error={appimgl} no permite la instalación de {app}. Desinstale {appimgl}, reinicie su sistema e intente instalar {app} nuevamente. +appimage.config.db_updates=Actualización de la base de datos +appimage.config.db_updates.activated=activada +appimage.config.db_updates.interval.tip=Intervalo de actualización en SEGUNDOS \ No newline at end of file diff --git a/bauh/gems/appimage/resources/locale/it b/bauh/gems/appimage/resources/locale/it index 99e32538..869a7e8b 100644 --- a/bauh/gems/appimage/resources/locale/it +++ b/bauh/gems/appimage/resources/locale/it @@ -17,3 +17,7 @@ appimage.error.uninstall_current_version = Non è stato possibile disinstallare appimage.downgrade.install_version=Non è stato possibile installare la versione {} ({}) appimage.install.download.error=Non è stato possibile scaricare il file {}. Il file server può essere inattivo. appimage.install.appimagelauncher.error={appimgl} non consente l'installazione di {app}. Disinstallare {appimgl}, riavviare il sistema e provare a installare nuovamente {app}. +appimage.config.db_updates=Aggiornamento della banca dati +appimage.config.db_updates.activated=attivata +appimage.config.db_updates.interval.tip=Intervallo di aggiornamento in SECONDI + diff --git a/bauh/gems/appimage/resources/locale/pt b/bauh/gems/appimage/resources/locale/pt index 43ae6917..63f5bdac 100644 --- a/bauh/gems/appimage/resources/locale/pt +++ b/bauh/gems/appimage/resources/locale/pt @@ -16,4 +16,7 @@ appimage.downgrade.first_version={} se encontra em sua primeira versão publicad appimage.downgrade.uninstall_current_version=Não foi possível desinstalar a versão atual de {} appimage.downgrade.install_version=Não foi possivel instalar a versão {} ({}) appimage.install.download.error=Não foi possível baixar o arquivo {}. O servidor do arquivo pode estar fora do ar. -appimage.install.appimagelauncher.error={appimgl} não está permitindo que o {app} seja instalado. Desinstale o {appimgl}, reinicie o sistema e tente instalar o {app} novamente. \ No newline at end of file +appimage.install.appimagelauncher.error={appimgl} não está permitindo que o {app} seja instalado. Desinstale o {appimgl}, reinicie o sistema e tente instalar o {app} novamente. +appimage.config.db_updates=Atualização da base de dados +appimage.config.db_updates.activated=ativada +appimage.config.db_updates.interval.tip=Intervalo de atualização em SEGUNDOS \ No newline at end of file diff --git a/bauh/gems/arch/controller.py b/bauh/gems/arch/controller.py index 5106a69e..e03b9901 100644 --- a/bauh/gems/arch/controller.py +++ b/bauh/gems/arch/controller.py @@ -4,6 +4,7 @@ import re import shutil import subprocess import time +import traceback from pathlib import Path from threading import Thread from typing import List, Set, Type, Tuple, Dict @@ -18,11 +19,13 @@ from bauh.api.abstract.model import PackageUpdate, PackageHistory, SoftwarePacka from bauh.api.abstract.view import MessageType, FormComponent, InputOption, SingleSelectComponent, SelectViewType, \ ViewComponent, PanelComponent 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_subprocess, run_cmd, new_root_subprocess, \ SimpleProcess from bauh.gems.arch import BUILD_DIR, aur, pacman, makepkg, pkgbuild, message, confirmation, disk, git, \ - gpg, URL_CATEGORIES_FILE, CATEGORIES_CACHE_DIR, CATEGORIES_FILE_PATH, CUSTOM_MAKEPKG_FILE, SUGGESTIONS_FILE + gpg, URL_CATEGORIES_FILE, CATEGORIES_CACHE_DIR, CATEGORIES_FILE_PATH, CUSTOM_MAKEPKG_FILE, SUGGESTIONS_FILE, \ + CONFIG_FILE from bauh.gems.arch.aur import AURClient from bauh.gems.arch.config import read_config from bauh.gems.arch.depedencies import DependenciesAnalyser @@ -888,22 +891,37 @@ class ArchManager(SoftwareManager): def get_settings(self) -> ViewComponent: config = read_config() - optz_opts = [InputOption(label='on'.capitalize(), value=True), - InputOption(label='off'.capitalize(), value=False)] + optz_opts = [InputOption(label=self.i18n['yes'].capitalize(), value=True, tooltip=self.i18n['arch.config.optimize.true.tip']), + InputOption(label=self.i18n['no'].capitalize(), value=False, tooltip=self.i18n['arch.config.optimize.false.tip'])] - trans_check_opts = [InputOption(label='on'.capitalize(), value=True), - InputOption(label='off'.capitalize(), value=False)] + trans_check_opts = [InputOption(label=self.i18n['yes'].capitalize(), value=True, tooltip=self.i18n['arch.config.trans_dep_check.true.tip']), + InputOption(label=self.i18n['no'].capitalize(), value=False, tooltip=self.i18n['arch.config.trans_dep_check.false.tip'])] fields = [ - SingleSelectComponent(label='Optimizations', + SingleSelectComponent(label=self.i18n['arch.config.optimize'].capitalize(), options=optz_opts, default_option=[o for o in optz_opts if o.value == config['optimize']][0], max_per_line=len(optz_opts), - type_=SelectViewType.RADIO), - SingleSelectComponent(label='Transitive dependency checking', + type_=SelectViewType.RADIO, + id_='opts'), + SingleSelectComponent(label=self.i18n['arch.config.trans_dep_check'].capitalize(), options=trans_check_opts, - default_option=[o for o in trans_check_opts if o.value == config['optimize']][0], + default_option=[o for o in trans_check_opts if o.value == config['transitive_checking']][0], max_per_line=len(trans_check_opts), - type_=SelectViewType.RADIO)] + type_=SelectViewType.RADIO, + id_='dep_check')] - return PanelComponent([FormComponent(fields, label='Installation')]) + return PanelComponent([FormComponent(fields, label=self.i18n['installation'].capitalize())]) + + def save_settings(self, component: PanelComponent) -> Tuple[bool, List[str]]: + config = read_config() + + form_install = component.components[0] + config['optimize'] = form_install.get_component('opts').get_selected() + config['transitive_checking'] = form_install.get_component('dep_check').get_selected() + + try: + save_config(config, CONFIG_FILE) + return True, None + except: + return False, [traceback.format_exc()] diff --git a/bauh/gems/arch/resources/locale/ca b/bauh/gems/arch/resources/locale/ca index 67d1f3de..b49f2cf8 100644 --- a/bauh/gems/arch/resources/locale/ca +++ b/bauh/gems/arch/resources/locale/ca @@ -101,4 +101,10 @@ arch.aur.install.unknown_key.receive_error=No s’ha pogut rebre la clau públic arch.install.aur.unknown_key.body=Per a continuar amb la instal·lació de {} cal confiar en la clau pública següent {} arch.aur.install.validity_check.title=Problemes d’integritat arch.aur.install.validity_check.body=Alguns dels fitxers font necessaris per a la instal·lació de {} són malmesos. La instal·lació es cancel·larà per a evitar danys al vostre sistema. -arch.makepkg.optimizing=Optimitzant la recopilació \ No newline at end of file +arch.makepkg.optimizing=Optimitzant la recopilació +arch.config.optimize=optimitzar +arch.config.trans_dep_check=verificar dependències +arch.config.optimize.true.tip=La configuració optimitzada s'utilitzarà per fer més ràpida la instal·lació dels paquets +arch.config.optimize.false.tip=La configuració predeterminada del sistema s'utilitzarà per realitzar la instal·lació dels paquets +arch.config.trans_dep_check.true.tip=Si totes les dependències del paquet s’han de verificar abans de la instal·lació. +arch.config.trans_dep_check.false.tip=Si s'han de destapar les dependències del paquet durant la seva instal·lació \ No newline at end of file diff --git a/bauh/gems/arch/resources/locale/de b/bauh/gems/arch/resources/locale/de index ac287a6c..863c136c 100644 --- a/bauh/gems/arch/resources/locale/de +++ b/bauh/gems/arch/resources/locale/de @@ -101,4 +101,10 @@ aur.info.validpgpkeys=gültige PGP Schlüssel aur.info.options=Optionen aur.info.provides=stellt bereit aur.info.conflicts with=Konflikt mit -arch.makepkg.optimizing=Optimiert die Zusammenstellung \ No newline at end of file +arch.makepkg.optimizing=Optimiert die Zusammenstellung +arch.config.optimize=optimieren +arch.config.trans_dep_check=Um Abhängigkeiten zu verifizieren +arch.config.optimize.true.tip=Optimierte Einstellungen werden verwendet, um die Paketinstallation zu beschleunigen +arch.config.optimize.false.tip=Für die Installation der Pakete werden die Standardsystemeinstellungen verwendet +arch.config.trans_dep_check.true.tip=Wenn alle Paketabhängigkeiten überprüft werden sollen, bevor die Installation beginnt +arch.config.trans_dep_check.false.tip=Wenn die Paketabhängigkeiten bei der Installation aufgedeckt werden sollen \ No newline at end of file diff --git a/bauh/gems/arch/resources/locale/en b/bauh/gems/arch/resources/locale/en index 8bc34829..eaec2ece 100644 --- a/bauh/gems/arch/resources/locale/en +++ b/bauh/gems/arch/resources/locale/en @@ -101,4 +101,10 @@ aur.info.validpgpkeys=valid PGP keys aur.info.options=options aur.info.provides=provides aur.info.conflicts with=conflicts with -arch.makepkg.optimizing=Optimizing the compilation \ No newline at end of file +arch.makepkg.optimizing=Optimizing the compilation +arch.config.optimize=optimize +arch.config.trans_dep_check=check dependencies +arch.config.optimize.true.tip=Optimized settings will be used in order to make the packages installation faster +arch.config.optimize.false.tip=The default system settings will be used to perform the packages installation +arch.config.trans_dep_check.true.tip=If all the package dependencies should be verified before the installation starts +arch.config.trans_dep_check.false.tip=If the package dependencies should be uncovered during its installation \ No newline at end of file diff --git a/bauh/gems/arch/resources/locale/es b/bauh/gems/arch/resources/locale/es index 49d81205..f9a4d06f 100644 --- a/bauh/gems/arch/resources/locale/es +++ b/bauh/gems/arch/resources/locale/es @@ -101,4 +101,10 @@ arch.aur.install.unknown_key.receive_error=No fue posible recibir la clave públ arch.install.aur.unknown_key.body=Para continuar la instalación de {} es necesario confiar en la siguiente clave pública {} arch.aur.install.validity_check.title=Problemas de integridad arch.aur.install.validity_check.body=Algunos de los archivos fuente necesarios para la instalación de {} no están en buen estado. La instalación se cancelará para evitar daños a su sistema. -arch.makepkg.optimizing=Optimizando la compilación \ No newline at end of file +arch.makepkg.optimizing=Optimizando la compilación +arch.config.optimize=optimizar +arch.config.trans_dep_check=verificar dependencias +arch.config.optimize.true.tip=Se utilizará una configuración optimizada para acelerar la instalación de los paquetes +arch.config.optimize.false.tip=Se utilizará la configuración predeterminada del sistema para realizar la instalación de paquetes +arch.config.trans_dep_check.true.tip=Si todas las dependencias del paquete deben ser verificadas antes de que comience la instalación +arch.config.trans_dep_check.false.tip=Si las dependencias del paquete deben ser descubiertas durante su instalación \ No newline at end of file diff --git a/bauh/gems/arch/resources/locale/it b/bauh/gems/arch/resources/locale/it index 302b8bf0..1fb1763c 100644 --- a/bauh/gems/arch/resources/locale/it +++ b/bauh/gems/arch/resources/locale/it @@ -69,4 +69,10 @@ arch.aur.install.unknown_key.status=Ricezione della chiave pubblica {} arch.aur.install.unknown_key.receive_error=Impossibile ricevere la chiave pubblica {} arch.aur.install.validity_check.title=Problemi di integrità arch.aur.install.validity_check.body=Alcuni dei file di origine necessari per l'installazione di {} non sono integri. L'installazione verrà annullata per evitare danni al sistema. -arch.makepkg.optimizing=Ottimizzando la compilazione \ No newline at end of file +arch.makepkg.optimizing=Ottimizzando la compilazione +arch.config.optimize=ottimizzare +arch.config.trans_dep_check=verificare dipendenze +arch.config.optimize.true.tip=Le impostazioni ottimizzate verranno utilizzate per rendere l'installazione dei pacchetti più veloce +arch.config.optimize.false.tip=Le impostazioni di sistema predefinite verranno utilizzate per eseguire l'installazione dei pacchetti +arch.config.trans_dep_check.true.tip=Se tutte le dipendenze del pacchetto devono essere verificate prima dell'inizio dell'installazione +arch.config.trans_dep_check.false.tip=Se le dipendenze del pacchetto devono essere scoperte durante la sua installazione \ No newline at end of file diff --git a/bauh/gems/arch/resources/locale/pt b/bauh/gems/arch/resources/locale/pt index 471ce188..ec44c859 100644 --- a/bauh/gems/arch/resources/locale/pt +++ b/bauh/gems/arch/resources/locale/pt @@ -101,4 +101,10 @@ arch.aur.install.unknown_key.status=Recebendo a chave pública {} arch.aur.install.unknown_key.receive_error=Não fui possível receber a chave pública {} arch.aur.install.validity_check.title=Problemas de integridade arch.aur.install.validity_check.body=Alguns dos arquivos-fonte necessários para instalação de {} não estão íntegros. A instalação será cancelada para evitar danos no seu sistema. -arch.makepkg.optimizing=Otimizando a compilação \ No newline at end of file +arch.makepkg.optimizing=Otimizando a compilação +arch.config.optimize=otimizar +arch.config.trans_dep_check=verificar dependências +arch.config.optimize.true.tip=Utilizará configurações otimizadas para que a instalação de pacotes seja mais rápida +arch.config.optimize.false.tip=Utilizará as configurações padrões do sistema para realizar a instalação de pacotes +arch.config.trans_dep_check.true.tip=Se todas as dependências do pacote devem ser verificadas antes da instalação começar +arch.config.trans_dep_check.false.tip=Se as dependências do pacote devem ser descobertas durante a instalação \ No newline at end of file diff --git a/bauh/gems/flatpak/controller.py b/bauh/gems/flatpak/controller.py index ccd76e6b..372b8868 100644 --- a/bauh/gems/flatpak/controller.py +++ b/bauh/gems/flatpak/controller.py @@ -1,7 +1,7 @@ import traceback from datetime import datetime from threading import Thread -from typing import List, Set, Type +from typing import List, Set, Type, Tuple from bauh.api.abstract.controller import SearchResult, SoftwareManager, ApplicationContext from bauh.api.abstract.disk import DiskCacheLoader @@ -11,6 +11,7 @@ from bauh.api.abstract.model import PackageHistory, PackageUpdate, SoftwarePacka from bauh.api.abstract.view import MessageType, FormComponent, SingleSelectComponent, InputOption, SelectViewType, \ ViewComponent, PanelComponent 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 SystemProcess, ProcessHandler, SimpleProcess from bauh.gems.flatpak import flatpak, SUGGESTIONS_FILE, CONFIG_FILE @@ -422,13 +423,30 @@ class FlatpakManager(SoftwareManager): config = read_config() - install_opts = [InputOption(label='system'.capitalize(), value='system'), - InputOption(label='user'.capitalize(), value='user'), - InputOption(label='ask'.capitalize(), value=None)] - fields.append(SingleSelectComponent(label='Level', + install_opts = [InputOption(label=self.i18n['flatpak.config.install_level.system'].capitalize(), + value='system', + tooltip=self.i18n['flatpak.config.install_level.system.tip']), + InputOption(label=self.i18n['flatpak.config.install_level.user'].capitalize(), + value='user', + tooltip=self.i18n['flatpak.config.install_level.user.tip']), + InputOption(label=self.i18n['flatpak.config.install_level.ask'].capitalize(), + value=None, + tooltip=self.i18n['flatpak.config.install_level.ask.tip'].format(app=self.context.app_name))] + fields.append(SingleSelectComponent(label=self.i18n['flatpak.config.install_level'], options=install_opts, default_option=[o for o in install_opts if o.value == config['installation_level']][0], max_per_line=len(install_opts), type_=SelectViewType.RADIO)) - return PanelComponent([FormComponent(fields, 'Installation')]) + return PanelComponent([FormComponent(fields, self.i18n['installation'].capitalize())]) + + def save_settings(self, component: PanelComponent) -> Tuple[bool, List[str]]: + config = read_config() + config['installation_level'] = component.components[0].components[0].get_selected() + + try: + save_config(config, CONFIG_FILE) + return True, None + except: + return False, [traceback.format_exc()] + diff --git a/bauh/gems/flatpak/resources/locale/ca b/bauh/gems/flatpak/resources/locale/ca index 10f50234..ef2cd74f 100644 --- a/bauh/gems/flatpak/resources/locale/ca +++ b/bauh/gems/flatpak/resources/locale/ca @@ -45,4 +45,11 @@ flatpak.info.developername=desenvolupador flatpak.install.install_level.title=Tipus d'instal·lació flatpak.install.install_level.body=S'ha d'instal·lar {} per a tots els usuaris del dispositiu ( sistema ) ? flatpak.install.bad_install_level.body=Valor invàlid per a {field} al fitxer de configuració {file} -flatpak.remotes.system_flathub.error=No s'ha pogut afegir Flathub com a dipòsit del sistema ( remote ) \ No newline at end of file +flatpak.remotes.system_flathub.error=No s'ha pogut afegir Flathub com a dipòsit del sistema ( remote ) +flatpak.config.install_level.system=sistema +flatpak.config.install_level.system.tip=Les aplicacions s’instal·laran per a tots els usuaris del dispositiu +flatpak.config.install_level.user=usuari +flatpak.config.install_level.user.tip=L’aplicació s’instal·larà només per a l’usuari actual +flatpak.config.install_level.ask=preguntar +flatpak.config.install_level.ask.tip={app} demanarà el nivell que s'ha d'aplicar durant la instal·lació de l'aplicació +flatpak.config.install_level=nivell \ No newline at end of file diff --git a/bauh/gems/flatpak/resources/locale/de b/bauh/gems/flatpak/resources/locale/de index dc60e06b..1bd589f3 100644 --- a/bauh/gems/flatpak/resources/locale/de +++ b/bauh/gems/flatpak/resources/locale/de @@ -44,4 +44,11 @@ flatpak.history.commit=Commit flatpak.install.install_level.title=Installationstyp flatpak.install.install_level.body=Sollte {} für alle Gerätebenutzer installiert werden ( system ) ? flatpak.install.bad_install_level.body=Ungültiger Wert für {field} in der Konfigurationsdatei {file} -flatpak.remotes.system_flathub.error=Flathub konnte nicht als System-Repository ( remote ) hinzugefügt werden \ No newline at end of file +flatpak.remotes.system_flathub.error=Flathub konnte nicht als System-Repository ( remote ) hinzugefügt werden +flatpak.config.install_level.system=system +flatpak.config.install_level.system.tip=Anwendungen werden für alle Gerätebenutzer installiert +flatpak.config.install_level.user=Benutzer +flatpak.config.install_level.user.tip=Die Anwendung wird nur für den aktuellen Benutzer installiert +flatpak.config.install_level.ask=fragen +flatpak.config.install_level.ask.tip={app} fragt nach der Ebene, die während der App-Installation angewendet werden soll +flatpak.config.install_level=niveau \ No newline at end of file diff --git a/bauh/gems/flatpak/resources/locale/en b/bauh/gems/flatpak/resources/locale/en index 4176e3cf..eca20851 100644 --- a/bauh/gems/flatpak/resources/locale/en +++ b/bauh/gems/flatpak/resources/locale/en @@ -44,4 +44,11 @@ flatpak.history.commit=commit flatpak.install.install_level.title=Installation type flatpak.install.install_level.body=Should {} be installed for all the device users ( system ) ? flatpak.install.bad_install_level.body=Invalid value for {field} in the configuration file {file} -flatpak.remotes.system_flathub.error=It was not possible to add Flathub as a system repository ( remote ) \ No newline at end of file +flatpak.remotes.system_flathub.error=It was not possible to add Flathub as a system repository ( remote ) +flatpak.config.install_level.system=system +flatpak.config.install_level.system.tip=Applications will be installed for all the device users +flatpak.config.install_level.user=user +flatpak.config.install_level.user.tip=Application will be installed only for the current user +flatpak.config.install_level.ask=ask +flatpak.config.install_level.ask.tip={app} will ask the level that should be applied during the app installation +flatpak.config.install_level=level \ No newline at end of file diff --git a/bauh/gems/flatpak/resources/locale/es b/bauh/gems/flatpak/resources/locale/es index 2aaa0e92..65de1b2e 100644 --- a/bauh/gems/flatpak/resources/locale/es +++ b/bauh/gems/flatpak/resources/locale/es @@ -45,4 +45,11 @@ flatpak.info.developername=desarrollador flatpak.install.install_level.title=Tipo de instalación flatpak.install.install_level.body=¿Debería {} estar instalado para todos los usuarios del dispositivo ( sistema )? flatpak.install.bad_install_level.body=Valor inválido para {field} en el archivo de configuración {file} -flatpak.remotes.system_flathub.error=No fue posible agregar Flathub como repositorio del sistema ( remote ) \ No newline at end of file +flatpak.remotes.system_flathub.error=No fue posible agregar Flathub como repositorio del sistema ( remote ) +flatpak.config.install_level.system=sistema +flatpak.config.install_level.system.tip=Se instalarán aplicaciones para todos los usuarios del dispositivo +flatpak.config.install_level.user=usuario +flatpak.config.install_level.user.tip=La aplicación se instalará solo para el usuario actual +flatpak.config.install_level.ask=preguntar +flatpak.config.install_level.ask.tip={app} preguntará el nivel que debe aplicarse durante la instalación de la aplicación +flatpak.config.install_level=nivel \ No newline at end of file diff --git a/bauh/gems/flatpak/resources/locale/it b/bauh/gems/flatpak/resources/locale/it index 42521925..687b2309 100644 --- a/bauh/gems/flatpak/resources/locale/it +++ b/bauh/gems/flatpak/resources/locale/it @@ -24,4 +24,11 @@ flatpak.info.installation.system=sistema flatpak.install.install_level.title=Tipo di installazione flatpak.install.install_level.body={} deve essere installato per tutti gli utenti del dispositivo ( sistema ) ? flatpak.install.bad_install_level.body=Valore non valido per {field} nel file di configurazione {file} -flatpak.remotes.system_flathub.error=Non è stato possibile aggiungere Flathub come repository di sistema ( remote ) \ No newline at end of file +flatpak.remotes.system_flathub.error=Non è stato possibile aggiungere Flathub come repository di sistema ( remote ) +flatpak.config.install_level.system=sistema +flatpak.config.install_level.system.tip=Le applicazioni verranno installate per tutti gli utenti del dispositivo +flatpak.config.install_level.user=utente +flatpak.config.install_level.user.tip=L'applicazione verrà installata solo per l'utente corrente +flatpak.config.install_level.ask=chiedere +flatpak.config.install_level.ask.tip={app} chiederà il livello da applicare durante l'installazione dell'app +flatpak.config.install_level=livello \ No newline at end of file diff --git a/bauh/gems/flatpak/resources/locale/pt b/bauh/gems/flatpak/resources/locale/pt index bd1a5301..ed1f4345 100644 --- a/bauh/gems/flatpak/resources/locale/pt +++ b/bauh/gems/flatpak/resources/locale/pt @@ -45,4 +45,11 @@ flatpak.info.developername=desenvolvedor flatpak.install.install_level.title=Tipo de instalação flatpak.install.install_level.body={} deve ser instalado para todos os usuários desse dispositivo ( sistema ) ? flatpak.install.bad_install_level.body=Valor inválido para {field} no arquivo de configuração {file} -flatpak.remotes.system_flathub.error=Não foi possível adicionar o Flathub como um repositório do sistema ( remote ) \ No newline at end of file +flatpak.remotes.system_flathub.error=Não foi possível adicionar o Flathub como um repositório do sistema ( remote ) +flatpak.config.install_level.system=sistema +flatpak.config.install_level.system.tip=Os aplicativos serão instalados para todos os usuários do dispositivo +flatpak.config.install_level.user=usuário +flatpak.config.install_level.user.tip=Os aplicativos serão instalados somente para o usuário atual +flatpak.config.install_level.ask=perguntar +flatpak.config.install_level.ask.tip=O {app} perguntará qual o nível deverá ser aplicado durante a instalação do aplicativo +flatpak.config.install_level=nível \ No newline at end of file diff --git a/bauh/gems/web/controller.py b/bauh/gems/web/controller.py index 08eb762b..307f2e7d 100644 --- a/bauh/gems/web/controller.py +++ b/bauh/gems/web/controller.py @@ -894,14 +894,15 @@ class WebApplicationManager(SoftwareManager): def get_settings(self) -> ViewComponent: config = read_config() - input_electron = TextInputComponent(label="Custom Electron version", + input_electron = TextInputComponent(label=self.i18n['web.settings.electron.version.label'], value=config['environment']['electron']['version'], - tooltip="Electron version to render the applications", + tooltip=self.i18n['web.settings.electron.version.tooltip'], + placeholder='{}: 7.1.0'.format(self.i18n['example.short']), id_='electron_version') native_opts = [ - InputOption(label="Environment", value=False, tooltip="If a nativefier version from the isolated environment should be used to install the applications"), - InputOption(label="System", value=True, tooltip="If a nativefier installed on your system should be used to install the applications") + InputOption(label=self.i18n['web.settings.nativefier.env'].capitalize(), value=False, tooltip=self.i18n['web.settings.nativefier.env.tooltip'].format(app=self.context.app_name)), + InputOption(label=self.i18n['web.settings.nativefier.system'].capitalize(), value=True, tooltip=self.i18n['web.settings.nativefier.system.tooltip']) ] select_nativefier = SingleSelectComponent(label="Nativefier", @@ -910,7 +911,7 @@ class WebApplicationManager(SoftwareManager): type_=SelectViewType.COMBO, id_='nativefier') - form_env = FormComponent(label="Environment", components=[input_electron, select_nativefier]) + form_env = FormComponent(label=self.i18n['web.settings.nativefier.env'].capitalize(), components=[input_electron, select_nativefier]) return PanelComponent([form_env]) diff --git a/bauh/gems/web/resources/locale/en b/bauh/gems/web/resources/locale/en index a5c71ee8..80f9cef4 100644 --- a/bauh/gems/web/resources/locale/en +++ b/bauh/gems/web/resources/locale/en @@ -58,4 +58,10 @@ web.info.06_desktop_entry=shortcut web.info.07_exec_file=executable web.info.08_icon_path=icon web.info.09_size=size -web.info.10_config_dir=configuration dir \ No newline at end of file +web.info.10_config_dir=configuration dir +web.settings.electron.version.label=Electron version +web.settings.electron.version.tooltip=An alternative Electron version to render the new installed apps +web.settings.nativefier.env=environment +web.settings.nativefier.system=system +web.settings.nativefier.env.tooltip=The Nativefier version installed on the isolated {app} environment will be used to install applications +web.settings.nativefier.system.tooltip=The Nativefier version installed on your system will be used to install applications \ No newline at end of file diff --git a/bauh/gems/web/resources/locale/es b/bauh/gems/web/resources/locale/es index 7030c2f1..89517224 100644 --- a/bauh/gems/web/resources/locale/es +++ b/bauh/gems/web/resources/locale/es @@ -58,4 +58,10 @@ web.info.06_desktop_entry=atajo web.info.07_exec_file=ejecutable web.info.08_icon_path=icono web.info.09_size=tamaño -web.info.10_config_dir=directorio de configuración \ No newline at end of file +web.info.10_config_dir=directorio de configuración +web.settings.electron.version.label=Versión del Electron +web.settings.electron.version.tooltip=Una versión alternativa del Electron para renderizar las nuevas aplicaciones instaladas +web.settings.nativefier.env=ambiente +web.settings.nativefier.system=sistema +web.settings.nativefier.env.tooltip=Se utilizará la versión de Nativefier instalada en el ambiente aislado de {app} para instalar aplicaciones +web.settings.nativefier.system.tooltip=Se utilizará la versión de Nativefier instalada en su sistema para instalar aplicaciones \ No newline at end of file diff --git a/bauh/gems/web/resources/locale/pt b/bauh/gems/web/resources/locale/pt index fc9ce569..50140fa8 100644 --- a/bauh/gems/web/resources/locale/pt +++ b/bauh/gems/web/resources/locale/pt @@ -58,4 +58,10 @@ web.info.06_desktop_entry=atalho web.info.07_exec_file=executável web.info.08_icon_path=ícone web.info.09_size=tamanho -web.info.10_config_dir=diretório de configuração \ No newline at end of file +web.info.10_config_dir=diretório de configuração +web.settings.electron.version.label=Versão do Electron +web.settings.electron.version.tooltip=Uma versão alternativa do Electron para renderizar os novos aplicativos instalados +web.settings.nativefier.env=ambiente +web.settings.nativefier.system=sistema +web.settings.nativefier.env.tooltip=A versão do Nativefier instalada no ambiente isolado do {app} será utilizada para instalar aplicativos +web.settings.nativefier.system.tooltip=A versão do Nativefier instalada no seu sistema será utilizada para instalar aplicativos \ No newline at end of file diff --git a/bauh/view/core/controller.py b/bauh/view/core/controller.py index 34a5f78e..d55972a0 100755 --- a/bauh/view/core/controller.py +++ b/bauh/view/core/controller.py @@ -10,10 +10,13 @@ from bauh.api.abstract.disk import DiskCacheLoader from bauh.api.abstract.handler import ProcessWatcher from bauh.api.abstract.model import SoftwarePackage, PackageUpdate, PackageHistory, PackageSuggestion, PackageAction from bauh.api.abstract.view import FormComponent, ViewComponent, TabGroupComponent, TabComponent, SingleSelectComponent, \ - InputOption + InputOption, PanelComponent, SelectViewType from bauh.api.exception import NoInternetException from bauh.commons import internet +from bauh.commons.config import save_config from bauh.view.core import config +from bauh.view.core.config import read_config +from bauh.view.util import translation RE_IS_URL = re.compile(r'^https?://.+') @@ -403,8 +406,38 @@ class GenericSoftwareManager(SoftwareManager): def get_working_managers(self): return [m for m in self.managers if self._can_work(m)] + def _gen_settings_panel(self) -> TabComponent: + # core_config = read_config() + + current_locale = self.i18n.current_key + locale_opts = [InputOption(label=self.i18n['locale.{}'.format(k)].capitalize(), value=k) for k in translation.get_available_keys()] + select_locale = SingleSelectComponent(label=self.i18n['core.config.locale.label'], + options=locale_opts, + default_option=[l for l in locale_opts if l.value == current_locale][0], + type_=SelectViewType.COMBO, + id_='locale') + + return TabComponent(self.i18n['core.config.tab_label'].capitalize(), PanelComponent([FormComponent([select_locale])]), None, 'core') + + def _save_settings(self, panel: PanelComponent) -> Tuple[bool, List[str]]: + core_config = config.read_config() + + main_form = panel.components[0] + locale = main_form.get_component('locale').get_selected() + + if locale != self.i18n.current_key: + core_config['locale'] = locale + + try: + config.save(core_config) + return True, None + except: + return False, [traceback.format_exc()] + def get_settings(self) -> ViewComponent: - settings_forms = [] + tabs = [] + + tabs.append(self._gen_settings_panel()) for man in self.managers: if self._can_work(man): @@ -413,14 +446,22 @@ class GenericSoftwareManager(SoftwareManager): if man_comp: modname = man.__module__.split('.')[-2] icon_path = "{r}/gems/{n}/resources/img/{n}.svg".format(r=ROOT_DIR, n=modname) - settings_forms.append(TabComponent(None, man_comp, icon_path, modname)) + tabs.append(TabComponent(None, man_comp, icon_path, modname)) - return TabGroupComponent(settings_forms) + return TabGroupComponent(tabs) def save_settings(self, component: TabGroupComponent) -> Tuple[bool, List[str]]: saved, warnings = True, [] + success, errors = self._save_settings(component.get_tab('core').content) + + if not success: + saved = False + + if errors: + warnings.extend(errors) + for man in self.managers: if man: modname = man.__module__.split('.')[-2] @@ -429,12 +470,15 @@ class GenericSoftwareManager(SoftwareManager): if not tab: self.logger.warning("Tab for {} was not found".format(man.__class__.__name__)) else: - success, errors = man.save_settings(tab.content) + res = man.save_settings(tab.content) - if not success: - saved = False + if res: + success, errors = res[0], res[1] - if errors: - warnings.extend(errors) + if not success: + saved = False + + if errors: + warnings.extend(errors) return saved, warnings diff --git a/bauh/view/qt/components.py b/bauh/view/qt/components.py index f95488cc..de7a2280 100644 --- a/bauh/view/qt/components.py +++ b/bauh/view/qt/components.py @@ -88,6 +88,7 @@ class RadioBoxQt(QWidget): def __init__(self, model: SingleSelectComponent, parent: QWidget = None): super(RadioBoxQt, self).__init__(parent=parent) self.model = model + self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) grid = QGridLayout() self.setLayout(grid) @@ -95,6 +96,7 @@ class RadioBoxQt(QWidget): line, col = 0, 0 for op in model.options: comp = RadioButtonQt(op, model) + comp.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) comp.setText(op.label) comp.setToolTip(op.tooltip) @@ -411,7 +413,7 @@ class TabGroupQt(QTabWidget): self.setTabPosition(QTabWidget.North) for c in model.tabs: - icon = QIcon(c.icon_path) if c.icon_path else None + icon = QIcon(c.icon_path) if c.icon_path else QIcon() self.addTab(to_widget(c.content, i18n), icon, c.label) diff --git a/bauh/view/qt/settings.py b/bauh/view/qt/settings.py index 42139316..f9358a3e 100644 --- a/bauh/view/qt/settings.py +++ b/bauh/view/qt/settings.py @@ -4,7 +4,7 @@ from PyQt5.QtWidgets import QWidget, QVBoxLayout, QToolBar, QSizePolicy, QToolBu from bauh.api.abstract.controller import SoftwareManager from bauh.api.abstract.view import MessageType -from bauh.view.qt import dialog +from bauh.view.qt import dialog, css from bauh.view.qt.components import to_widget, new_spacer from bauh.view.util.translation import I18n @@ -13,7 +13,7 @@ class SettingsWindow(QWidget): def __init__(self, manager: SoftwareManager, i18n: I18n, parent: QWidget = None): super(SettingsWindow, self).__init__(parent=parent) - self.setWindowTitle('Settings') + self.setWindowTitle(i18n['settings'].capitalize()) self.setLayout(QVBoxLayout()) self.manager = manager self.i18n = i18n @@ -33,10 +33,11 @@ class SettingsWindow(QWidget): action_bar.addWidget(new_spacer()) - bt_save = QPushButton() - bt_save.setText(self.i18n['save'].capitalize()) - bt_save.clicked.connect(self._save_settings) - action_bar.addWidget(bt_save) + bt_change = QPushButton() + 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) self.layout().addWidget(action_bar) @@ -47,10 +48,10 @@ class SettingsWindow(QWidget): self.close() else: msg = StringIO() - msg.write("It was not possible to properly the settings\n") + msg.write("
It was not possible to properly save the settings
") for w in warnings: - msg.write(w + '\n') + msg.write('* ' + w + '