X-Git-Url: https://git.phdru.name/?a=blobdiff_plain;f=m_librarian%2Fwx%2FListBooks.py;h=c3dc7cb347fbec9e2e42d4409792a6d863fd7bb3;hb=9f269c21f91b1865ffe2c8bfdab4974d26c97295;hp=63d2b7ca2bb5817375204215bb21ec2a1592900a;hpb=9305df13fd2c3a935b2de82a28eea4cb6989e8e8;p=m_librarian.git diff --git a/m_librarian/wx/ListBooks.py b/m_librarian/wx/ListBooks.py index 63d2b7c..c3dc7cb 100644 --- a/m_librarian/wx/ListBooks.py +++ b/m_librarian/wx/ListBooks.py @@ -2,6 +2,7 @@ import wx, wx.grid # noqa: E401 multiple imports on one line from ..compat import string_type, unicode_type +from ..download import download from ..translations import translations from .Grids import GridWindow, GridPanel @@ -15,7 +16,7 @@ class BooksDataTable(wx.grid.GridTableBase): self.rows_count = rows_count self.column_names = column_names self.data = [] - for row in range(rows_count): + for row in range(rows_count + 1): row_data = [] self.data.append(row_data) for col in range(len(column_names)): @@ -86,7 +87,10 @@ class ListBooksPanel(GridPanel): series = {book.series for book in books} total_rows += len(books) + len(series) + 1 grid = self.grid - grid.SetTable(BooksDataTable(total_rows, columns), takeOwnership=True) + grid.SetTable( + BooksDataTable(total_rows+1, columns), + takeOwnership=True, + ) grid.EnableEditing(False) for col, col_name in enumerate(columns): grid.AutoSizeColLabelSize(col) @@ -99,10 +103,17 @@ class ListBooksPanel(GridPanel): cell_attr.SetAlignment(wx.ALIGN_RIGHT, wx. ALIGN_CENTRE) grid.SetColAttr(col, cell_attr) row = 0 + grid.SetCellAlignment(row, 1, wx.ALIGN_CENTRE, wx. ALIGN_CENTRE) + grid.SetCellSize(row, 1, 1, len(columns)-1) + row = 1 + self.book_by_row = book_by_row = {} # map {row: book} + self.toggle_rows = toggle_rows = {} # map {row: [list of subrows]} for author in sorted(books_by_author): grid.SetCellAlignment(row, 1, wx.ALIGN_LEFT, wx. ALIGN_CENTRE) grid.SetCellSize(row, 1, 1, len(columns)-1) grid.SetCellValue(row, 1, u'%s' % (author,)) + author_row = row + toggle_rows[author_row] = [] row += 1 books = books_by_author[author] series = None @@ -117,6 +128,9 @@ class ListBooksPanel(GridPanel): grid.SetCellSize(row, 1, 1, len(columns)-1) grid.SetCellValue(row, 1, u'%s — %s' % (book.author1, value)) + series_row = row + toggle_rows[author_row].append(row) + toggle_rows[series_row] = [] row += 1 series = book.series for col, col_name in enumerate(columns[1:]): @@ -126,11 +140,19 @@ class ListBooksPanel(GridPanel): elif not isinstance(value, (string_type, unicode_type)): value = str(value) grid.SetCellValue(row, col+1, value) + book_by_row[row] = book + toggle_rows[author_row].append(row) + toggle_rows[series_row].append(row) row += 1 + toggle_rows[0] = [row_ for row_ in range(1, row)] grid.AutoSizeColumns() grid.AutoSizeRows() grid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnClick) + search_button = wx.Button(self, label=u'Скачать') + self.GetSizer().Add(search_button, 0, wx.ALIGN_CENTER, 0) + search_button.Bind(wx.EVT_BUTTON, self.Download) + def toggleCB(self, row): value = self.grid.GetCellValue(row, 0) if value: @@ -138,18 +160,20 @@ class ListBooksPanel(GridPanel): else: value = '1' self.grid.SetCellValue(row, 0, value) + toggle_rows = self.toggle_rows + if row in toggle_rows: + for row_ in toggle_rows[row]: + self.grid.SetCellValue(row_, 0, value) def OnClick(self, event): if event.GetCol() > 0: return - row = event.GetRow() - self.toggleCB(row) + self.toggleCB(event.GetRow()) def OnDClick(self, event): if event.GetCol() == 0: return - row = event.GetRow() - self.toggleCB(row) + self.toggleCB(event.GetRow()) def OnKeyDown(self, event): if event.GetKeyCode() == wx.WXK_ESCAPE: @@ -157,9 +181,48 @@ class ListBooksPanel(GridPanel): else: event.Skip() + def Download(self, event=None): + book_by_row = self.book_by_row + found_books = False + try: + for row in self.toggle_rows[0]: + value = self.grid.GetCellValue(row, 0) + if value and row in book_by_row: + found_books = True + download(book_by_row[row]) + except Exception as e: + self.report_error(str(e)) + else: + if found_books: + self.report_success(u'Книги сохранены.') + else: + self.report_error(u'Не выбрано книг для сохранения.') + + def report_success(self, message): + wx.MessageBox( + message, caption='m_Librarian download finished', + style=wx.OK, parent=self.Parent) + + def report_error(self, error): + wx.MessageBox( + error, caption='m_Librarian download error', + style=wx.OK | wx.ICON_ERROR, parent=self.Parent) + class ListBooksWindow(GridWindow): session_config_section_name = 'list_books' window_title = u"m_Librarian: Список книг" GridPanelClass = ListBooksPanel + + def InitMenu(self): + GridWindow.InitMenu(self) + + download_menu = wx.Menu() + download = download_menu.Append(wx.ID_SAVE, + u"&Скачать", u"Скачать") + self.Bind(wx.EVT_MENU, self.OnDownload, download) + self.GetMenuBar().Append(download_menu, u"&Скачать") + + def OnDownload(self, event): + self.panel.Download()