From: Oleg Broytman Date: Thu, 28 Dec 2023 11:27:08 +0000 (+0300) Subject: Merge branch 'master' into wx X-Git-Tag: 0.3.0~9^2~33 X-Git-Url: https://git.phdru.name/?a=commitdiff_plain;h=dd0f2aeb4085d1784f151615844bf00726e44f44;hp=9b160b43ffd08bcc0190f866208e3f148148b08e;p=m_librarian.git Merge branch 'master' into wx * master: Docs(install): Describe `web` extra [skip ci] --- diff --git a/.gitattributes b/.gitattributes index b7dbfd2..cf217cc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,5 @@ .git* export-ignore /README.rus.txt encoding=utf-8 +*.py encoding=utf-8 *.rst encoding=utf-8 *.txt text diff --git a/m_librarian/config.py b/m_librarian/config.py index b4a7b60..a6b88f0 100755 --- a/m_librarian/config.py +++ b/m_librarian/config.py @@ -29,11 +29,11 @@ def find_config_dirs(): return None -def find_config_file(config_dirs=None): +def find_config_file(config_dirs=None, config_filename='m_librarian.conf'): if config_dirs is None: config_dirs = find_config_dirs() for d in config_dirs: - ml_conf_file = os.path.join(d, 'm_librarian.conf') + ml_conf_file = os.path.join(d, config_filename) if os.path.exists(ml_conf_file): return ml_conf_file else: diff --git a/m_librarian/wx/Application.py b/m_librarian/wx/Application.py new file mode 100644 index 0000000..bebaa27 --- /dev/null +++ b/m_librarian/wx/Application.py @@ -0,0 +1,66 @@ +# coding: utf-8 + +import wx, wx.adv +from ..__version__ import __version__ +from .session_config import get_session_config + + +class MainWindow(wx.Frame): + + def __init__(self): + session_config = get_session_config() + width = session_config.getint('main_window', 'width', 600) + height = session_config.getint('main_window', 'height', 400) + super(wx.Frame, self).__init__( + parent=None, id=-1, title=u"m_Librarian", + size=wx.Size(width=width, height=height), + ) + self.InitMenu() + self.Show(True) + self.Bind(wx.EVT_SIZE, self.OnSize) + + def InitMenu(self): + MenuBar = wx.MenuBar() + self.SetMenuBar(MenuBar) + + file_menu = wx.Menu() + exit = file_menu.Append(wx.ID_EXIT, u"&Выход", u"Выйти из программы") + self.Bind(wx.EVT_MENU, self.OnQuit, exit) + MenuBar.Append(file_menu, u"&Файл") + + about_menu = wx.Menu() + about = about_menu.Append(wx.ID_ABOUT, + u"&О m_Librarian", u"О m_Librarian") + self.Bind(wx.EVT_MENU, self.OnAbout, about) + MenuBar.Append(about_menu, u"&О программе") + + def OnQuit(self, event): + self.Close(True) + + def OnAbout(self, event): + aboutInfo = wx.adv.AboutDialogInfo() + aboutInfo.SetName(u'm_Librarian') + aboutInfo.SetVersion(__version__) + aboutInfo.SetDescription( + u'Библиотекарь для библиотек LibRusEc/Flibusta') + aboutInfo.AddDeveloper(u'Олег Бройтман') + aboutInfo.SetWebSite(u'https://phdru.name/Software/Python/m_librarian/') + aboutInfo.SetCopyright(u'(C) 2023 Олег Бройтман') + aboutInfo.SetLicense(u'GPL') + wx.adv.AboutBox(aboutInfo) + + def OnSize(self, event): + """Save window size in the session config""" + size = event.GetSize() + session_config = get_session_config() + session_config.set('main_window', 'width', str(size.width)) + session_config.set('main_window', 'height', str(size.height)) + session_config.save() + event.Skip() # Call other handlers + +class Application(wx.App): + + def OnInit(self): + frame = MainWindow() + self.SetTopWindow(frame) + return True diff --git a/m_librarian/wx/__init__.py b/m_librarian/wx/__init__.py new file mode 100644 index 0000000..792d600 --- /dev/null +++ b/m_librarian/wx/__init__.py @@ -0,0 +1 @@ +# diff --git a/m_librarian/wx/session_config.py b/m_librarian/wx/session_config.py new file mode 100755 index 0000000..93b725c --- /dev/null +++ b/m_librarian/wx/session_config.py @@ -0,0 +1,73 @@ +#! /usr/bin/env python + +from __future__ import print_function +import os + +from ..config import RawConfigParser, ConfigWrapper, find_config_file + + +__all__ = ['get_session_config'] + + +def _find_config_dirs_posix(): + config_dirs = [] + if 'XDG_CACHE_HOME' in os.environ: + config_dirs.append(os.environ['XDG_CACHE_HOME']) + home_cache = os.path.expanduser('~/.cache') + if home_cache not in config_dirs: + config_dirs.append(home_cache) + return config_dirs + + +def _find_config_dirs(): + if os.name == 'posix': + return _find_config_dirs_posix() + return None + + +_ml_session_config = None + + +class SessionConfigWrapper(ConfigWrapper): + def __init__(self, config, config_path): + ConfigWrapper.__init__(self, config) + self.config_path = config_path + + def set(self, section, option, value): + if not self.config.has_section(section): + self.config.add_section(section) + super(SessionConfigWrapper, self).set(section, option, value) + + def save(self): + if self.config_path is None: + config_dirs = _find_config_dirs() + self.config_path = \ + os.path.join(config_dirs[0], 'm_librarian_session.conf') + with open(self.config_path, 'wt') as fp: + self.config.write(fp) + + +def get_session_config(config_path=None): + global _ml_session_config + if _ml_session_config is None: + _ml_session_config = RawConfigParser() + if config_path is None: + config_dirs = _find_config_dirs() + config_path = \ + find_config_file(config_dirs, 'm_librarian_session.conf') + if config_path is not None: + _ml_session_config.read(config_path) + _ml_session_config = \ + SessionConfigWrapper(_ml_session_config, config_path) + return _ml_session_config + + +def _test(): + config_dirs = _find_config_dirs() + print("Config dirs:", config_dirs) + print("Config file:", + find_config_file(config_dirs, 'm_librarian_session.conf')) + + +if __name__ == '__main__': + _test() diff --git a/scripts/ml-wx.py b/scripts/ml-wx.py new file mode 100755 index 0000000..a482068 --- /dev/null +++ b/scripts/ml-wx.py @@ -0,0 +1,15 @@ +#! /usr/bin/env python + +import sys +from m_librarian.wx.Application import Application + + +def main(): + if len(sys.argv) > 1: + sys.exit("This program doesn't accept any arguments") + app = Application() + app.MainLoop() + + +if __name__ == '__main__': + main() diff --git a/setup.py b/setup.py index 2dc274f..8670397 100755 --- a/setup.py +++ b/setup.py @@ -79,5 +79,6 @@ setup( extras_require={ 'pbar': ['m_lib>=3.1'], 'web': ['bottle', 'CT3'], + 'wx': ['wxPython'], }, )