]> git.phdru.name Git - m_librarian.git/commitdiff
Merge branch 'master' into wx
authorOleg Broytman <phd@phdru.name>
Tue, 2 Jan 2024 01:43:15 +0000 (04:43 +0300)
committerOleg Broytman <phd@phdru.name>
Tue, 2 Jan 2024 01:43:15 +0000 (04:43 +0300)
* master:
  Build(GHActions): Use `checkout@v4` instead of outdated `v2`

.gitattributes
docs/install.rst
m_librarian/config.py
m_librarian/wx/Application.py [new file with mode: 0644]
m_librarian/wx/__init__.py [new file with mode: 0644]
m_librarian/wx/session_config.py [new file with mode: 0755]
scripts/ml-wx.py [new file with mode: 0755]
setup.py

index b7dbfd264a36d61dcdf6eced5b20d09c7100f36c..cf217cc2e689e4abbfea4c2f7a9d975bff0c0ae5 100644 (file)
@@ -1,4 +1,5 @@
 .git* export-ignore
 /README.rus.txt encoding=utf-8
+*.py encoding=utf-8
 *.rst encoding=utf-8
 *.txt text
index 7fbe8d090f3fca4011ac52b881eca7fd272bc555..7e4a26ec5b72148bf75396487469b893b470d847 100644 (file)
@@ -35,6 +35,9 @@ Other extras
 
 ``pip install m_librarian[web]`` installs libraries needed for web-ui.
 
+``pip install m_librarian[wx]`` installs a library needed for wx GUI
+(``wxPython``).
+
 Installation from sources
 =========================
 
index b4a7b603d23d0fe06c4c693fb5081f0b29f9b6ad..a6b88f01091dc0539053089c72d3aed2bb1f0e8b 100755 (executable)
@@ -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 (file)
index 0000000..03821fc
--- /dev/null
@@ -0,0 +1,68 @@
+# coding: utf-8
+
+import wx, wx.adv  # noqa: E401 multiple imports on one line
+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, 2024 Олег Бройтман')
+        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 (file)
index 0000000..792d600
--- /dev/null
@@ -0,0 +1 @@
+#
diff --git a/m_librarian/wx/session_config.py b/m_librarian/wx/session_config.py
new file mode 100755 (executable)
index 0000000..93b725c
--- /dev/null
@@ -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 (executable)
index 0000000..a482068
--- /dev/null
@@ -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()
index 2dc274f0984b0d4d80153ad8ef7a5c492508116a..867039761f1d0ae2eaf3b655c4735572e461bf3c 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -79,5 +79,6 @@ setup(
     extras_require={
         'pbar': ['m_lib>=3.1'],
         'web': ['bottle', 'CT3'],
+        'wx': ['wxPython'],
     },
 )