diff --git a/sgbackup/commands/help.py b/sgbackup/commands/help.py index b8969e0..512f0fc 100644 --- a/sgbackup/commands/help.py +++ b/sgbackup/commands/help.py @@ -16,8 +16,14 @@ # along with this program. If not, see . # ############################################################################### +import os,sys from sgbackup import __version__ as VERSION +from ..settings import settings from ..command import Command +from .. import commands +from gi.repository import GLib +from io import StringIO +from subprocess import run import logging logger = logging.getLogger(__name__) @@ -57,7 +63,7 @@ class SynopsisCommand(Command): for i in argv: try: - print(COMMANDS[i].get_synopsis()) + print(commands.COMMANDS[i].get_synopsis()) except: self.logger.error("No such command {command}".foramt(command=i)) error_code = 4 @@ -65,10 +71,47 @@ class SynopsisCommand(Command): return error_code -__synopsis = SynopsisCommand() +class HelpCommand(Command): + def __init__(self): + super().__init__('help','Help', 'Show help for commands.') + + def get_synopsis(self): + return "sgbackup help [COMMAND]" + + def get_sgbackup_help(self): + return commands.COMMANDS['synopsis'].get_sgbackup_synopsis() + + def get_help(self): + return self.get_synopsis() + + def execute(self,argv): + if (len(argv) < 1): + message = self.get_sgbackup_help() + else: + try: + message = commands.COMMANDS[argv[0]].get_help() + except: + logger.error("No such command \"{}\"!".format(argv[0])) + return 2 + if (sys.stdout.isatty() and settings.cli_pager is not None): + r,w = os.pipe() + with os.fdopen(w,'w',encoding="utf-8") as wr_stdin: + wr_stdin.write(message) + + with os.fdopen(r,'r') as rd_stdin: + proc = run([settings.cli_pager],stdin=rd_stdin,shell=True,encoding="utf-8") + return proc.returncode + + print(message) + + return 0 + +__synopsis = SynopsisCommand() + COMMANDS = { 'version':VersionCommand(), 'synopsis': __synopsis, - 'usage': __synopsis + 'usage': __synopsis, + 'help': HelpCommand(), } diff --git a/sgbackup/gui/_app.py b/sgbackup/gui/_app.py index 9529633..d7264a0 100644 --- a/sgbackup/gui/_app.py +++ b/sgbackup/gui/_app.py @@ -398,12 +398,10 @@ class GameView(Gtk.Box): for name,match,pos in result: self._liststore.get_item(pos).fuzzy_match = match - print("-"*80) self.__filter_model.set_filter(GameViewMatchFilter()) self.__sort_model.set_sorter(GameViewMatchSorter()) def _on_search_entry_icon_release(self,entry,icon_pos): - #TODO############################################### if icon_pos == Gtk.EntryIconPosition.PRIMARY: search_name=entry.get_text() if len(search_name) == 0: @@ -417,7 +415,6 @@ class GameView(Gtk.Box): self.__sort_model.set_sorter(self.columnview.get_sorter()) def _on_search_entry_changed(self,entry): - #TODO############################################### search_name = entry.get_text() if len(search_name) == 0: self.__filter_model.set_filter(None) diff --git a/sgbackup/gui/_settingsdialog.py b/sgbackup/gui/_settingsdialog.py index 21bd52f..ff87d36 100644 --- a/sgbackup/gui/_settingsdialog.py +++ b/sgbackup/gui/_settingsdialog.py @@ -267,6 +267,19 @@ class SettingsDialog(Gtk.Dialog): gui_frame.set_child(gui_grid) vbox.append(gui_frame) + ### CLI Settings + cli_frame = self.create_frame("Command Line Interface") + cli_grid = self.create_grid() + label = self.create_label("Pager:") + page.cli_pager_entry = Gtk.Entry() + page.cli_pager_entry.set_hexpand(True) + page.cli_pager_entry.set_text(settings.cli_pager if settings.cli_pager else "") + cli_grid.attach(label,0,0,1,1) + cli_grid.attach(page.cli_pager_entry,1,0,1,1) + + cli_frame.set_child(cli_grid) + vbox.append(cli_frame) + page.set_child(vbox) self.add_page(page,"general","Generic settings") return page diff --git a/sgbackup/settings.py b/sgbackup/settings.py index 43367d4..1371830 100644 --- a/sgbackup/settings.py +++ b/sgbackup/settings.py @@ -26,6 +26,7 @@ from threading import RLock from .utility import sanitize_path + ZIPFILE_COMPRESSION_STR = { zipfile.ZIP_STORED: "stored", zipfile.ZIP_DEFLATED: "deflated", @@ -416,6 +417,36 @@ class Settings(GObject.GObject): @steam_installpath.setter def steam_installpath(self,path:str): self.set_string('steam','installpath',path) + + @GObject.Property + def cli_pager(self)->str: + pager = self.get_string('cli','pager',None) + if pager is None: + if PLATFORM_WINDOWS: + for prg in ['less.exe','more.com']: + pager = GLib.find_program_in_path(prg) + if pager is not None: + return pager + return "" + else: + for prg in ['less','more']: + pager = GLib.find_program_in_path(prg) + if pager is not None: + return pager + return None + return pager + + @cli_pager.setter + def cli_pager(self,pager:str): + value = None + if not os.path.isabs(pager): + value = GLib.find_program_in_path(pager) + elif os.path.isfile(pager): + value = pager + if value is not None: + self.set_string('cli','pager',value) + else: + self.remove_key('cli','pager') def add_variable(self,name:str,value:str): self.set_string('variables',name,value)