[ui][settings] supported types working

This commit is contained in:
Vinícius Moreira
2020-01-24 18:17:52 -03:00
parent f37e66a63c
commit b530cbe0fc
40 changed files with 379 additions and 80 deletions

View File

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

View File

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

View File

@@ -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'
SUGGESTIONS_FILE = 'https://raw.githubusercontent.com/vinifmor/bauh-files/master/appimage/suggestions.txt'
CONFIG_FILE = '{}/appimage.yml'.format(CONFIG_PATH)

View File

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

View File

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

View File

@@ -17,3 +17,6 @@ appimage.downgrade.uninstall_current_version=No sha pogut desinstal·lar la v
appimage.downgrade.install_version=No sha pogut instal·lar la versió {} ({})
appimage.install.download.error=No sha 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 dinstal·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

View File

@@ -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.
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

View File

@@ -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.
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

View File

@@ -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.
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

View File

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

View File

@@ -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.
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

View File

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

View File

@@ -101,4 +101,10 @@ arch.aur.install.unknown_key.receive_error=No sha 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 dintegritat
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ó
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 shan 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ó

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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 )
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 sinstal·laran per a tots els usuaris del dispositiu
flatpak.config.install_level.user=usuari
flatpak.config.install_level.user.tip=Laplicació sinstal·larà només per a lusuari 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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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("<p>It was not possible to properly save the settings</p>")
for w in warnings:
msg.write(w + '\n')
msg.write('<p style="font-weight: bold">* ' + w + '</p><br/>')
msg.seek(0)

View File

@@ -1183,7 +1183,7 @@ class ManageWindow(QWidget):
action_gems.triggered.connect(self.show_gems_selector)
menu_row.addAction(action_gems)
action_settings = QAction('Settings') # TODO
action_settings = QAction(self.i18n['settings'].capitalize())
action_settings.triggered.connect(self.show_settings_window)
menu_row.addAction(action_settings)

View File

@@ -219,4 +219,15 @@ file_chooser.title=Selector de fitxers
message.file.not_exist=Fitxer no existeix
message.file.not_exist.body=El fitxer {} sembla no existir
icon_button.tooltip.disabled=Aquesta acció no està disponible
user=usuari
user=usuari
example.short=ex
core.config.tab_label=general
core.config.locale.label=idioma
locale.en=anglès
locale.es=castellà
locale.pt=portuguès
locale.ca=català
locale.de=alemany
locale.it=italià
interval=interval
installation=instal·lació

View File

@@ -174,4 +174,15 @@ message.file.not_exist=Datei existiert nicht
message.file.not_exist.body=Die Datei {} scheint nicht zu existieren
development=Entwicklung
icon_button.tooltip.disabled=Diese Aktion ist nicht verfügbar
user=Benutzer
user=Benutzer
example.short=z.B
core.config.tab_label=Allgemeines
core.config.locale.label=Sprache
locale.en=englisch
locale.es=spanisch
locale.pt=portugiesisch
locale.ca=Katalanisch
locale.de=deutsch
locale.it=italienisch
interval=intervall
installation=Installation

View File

@@ -178,4 +178,15 @@ message.file.not_exist=File does not exist
message.file.not_exist.body=The file {} seems not to exist
development=development
icon_button.tooltip.disabled=This action is unavailable
user=user
user=user
example.short=e.g
core.config.tab_label=general
core.config.locale.label=language
locale.en=english
locale.es=spanish
locale.pt=portuguese
locale.ca=catalan
locale.de=german
locale.it=italian
interval=interval
installation=installation

View File

@@ -218,4 +218,15 @@ file_chooser.title=Selector de archivos
message.file.not_exist=Archivo no existe
message.file.not_exist.body=El archivo {} parece no existir
icon_button.tooltip.disabled=This action is unavailable
user=usuario
user=usuario
example.short=p.ej
core.config.tab_label=general
core.config.locale.label=idioma
locale.es=inglés
locale.es=español
locale.pt=portugués
locale.ca=catalán
locale.de=alemán
locale.it=italiano
interval=intervalo
installation=instalación

View File

@@ -175,4 +175,15 @@ message.file.not_exist=File non esiste
message.file.not_exist.body=Il file {} sembra non esistere
development=sviluppo
icon_button.tooltip.disabled=Questa azione non è disponibile
user=utente
user=utente
core.config.tab_label=generale
core.config.locale.label=idioma
example.short=es
locale.en=inglese
locale.es=spagnolo
locale.pt=portoghese
locale.ca=catalan
locale.de=tedesco
locale.it=italiano
interval=intervallo
installation=installazione

View File

@@ -221,4 +221,15 @@ file_chooser.title=Seletor arquivos
message.file.not_exist=Arquivo não existe
message.file.not_exist.body=O arquivo {} parece não existir
icon_button.tooltip.disabled=Esta ação está indisponível
user=usuário
user=usuário
example.short=ex
core.config.tab_label=geral
core.config.locale.label=idioma
locale.en=inglês
locale.es=espanhol
locale.pt=português
locale.ca=catalão
locale.de=alemão
locale.it=italiano
interval=intervalo
installation=instalação

View File

@@ -1,6 +1,9 @@
import glob
import locale
from typing import Tuple
import traceback
from typing import Tuple, Set
from colorama import Fore
from bauh.view.util import resource
@@ -38,6 +41,11 @@ class I18n(dict):
return res
def get_available_keys() -> Set[str]:
locale_dir = resource.get_path('locale')
return {file.split('/')[-1] for file in glob.glob(locale_dir + '/*')}
def get_locale_keys(key: str = None, locale_dir: str = resource.get_path('locale')) -> Tuple[str, dict]:
locale_path = None
@@ -65,8 +73,9 @@ def get_locale_keys(key: str = None, locale_dir: str = resource.get_path('locale
locale_obj = {}
for line in locale_keys:
if line:
keyval = line.strip().split('=')
line_strip = line.strip()
if line_strip:
keyval = line_strip.split('=')
locale_obj[keyval[0].strip()] = keyval[1].strip()
return locale_path.split('/')[-1], locale_obj