home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 January / maximum-cd-2011-01.iso / DiscContents / calibre-0.7.26.msi / file_1245 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-10-31  |  11.5 KB  |  302 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. __license__ = 'GPL v3'
  5. __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
  6. __docformat__ = 'restructuredtext en'
  7. import sys
  8. import os
  9. import time
  10. from PyQt4.Qt import QImage, QSizePolicy, QTimer, QDialog, Qt, QSize, QStackedLayout, QLabel, QByteArray, pyqtSignal
  11. from calibre import plugins
  12. from calibre.gui2 import config, available_height, available_width, gprefs
  13. (pictureflow, pictureflowerror) = plugins['pictureflow']
  14. if pictureflow is not None:
  15.     
  16.     class EmptyImageList(pictureflow.FlowImages):
  17.         
  18.         def __init__(self):
  19.             pictureflow.FlowImages.__init__(self)
  20.  
  21.  
  22.     
  23.     class FileSystemImages(pictureflow.FlowImages):
  24.         
  25.         def __init__(self, dirpath):
  26.             pictureflow.FlowImages.__init__(self)
  27.             self.images = []
  28.             self.captions = []
  29.             for f in os.listdir(dirpath):
  30.                 f = os.path.join(dirpath, f)
  31.                 img = QImage(f)
  32.                 if not img.isNull():
  33.                     self.images.append(img)
  34.                     self.captions.append(os.path.basename(f))
  35.                     continue
  36.             
  37.  
  38.         
  39.         def count(self):
  40.             return len(self.images)
  41.  
  42.         
  43.         def image(self, index):
  44.             return self.images[index]
  45.  
  46.         
  47.         def caption(self, index):
  48.             return self.captions[index]
  49.  
  50.         
  51.         def currentChanged(self, index):
  52.             print 'current changed:', index
  53.  
  54.  
  55.     
  56.     class DatabaseImages(pictureflow.FlowImages):
  57.         
  58.         def __init__(self, model, buffer = 20):
  59.             pictureflow.FlowImages.__init__(self)
  60.             self.model = model
  61.             self.model.modelReset.connect(self.reset)
  62.  
  63.         
  64.         def count(self):
  65.             return self.model.count()
  66.  
  67.         
  68.         def caption(self, index):
  69.             
  70.             try:
  71.                 ans = self.model.title(index)
  72.                 if not ans:
  73.                     ans = ''
  74.             except:
  75.                 ans = ''
  76.  
  77.             return ans
  78.  
  79.         
  80.         def subtitle(self, index):
  81.             
  82.             try:
  83.                 return u'Γÿà' * self.model.rating(index)
  84.             except:
  85.                 pass
  86.  
  87.             return ''
  88.  
  89.         
  90.         def reset(self):
  91.             self.dataChanged.emit()
  92.  
  93.         
  94.         def image(self, index):
  95.             return self.model.cover(index)
  96.  
  97.  
  98.     
  99.     class CoverFlow(pictureflow.PictureFlow):
  100.         
  101.         def __init__(self, parent = None):
  102.             pictureflow.PictureFlow.__init__(self, parent, config['cover_flow_queue_length'] + 1)
  103.             self.setMinimumSize(QSize(300, 150))
  104.             self.setFocusPolicy(Qt.WheelFocus)
  105.             self.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding))
  106.  
  107.         
  108.         def sizeHint(self):
  109.             return self.minimumSize()
  110.  
  111.         
  112.         def wheelEvent(self, ev):
  113.             ev.accept()
  114.             if ev.delta() < 0:
  115.                 self.showNext()
  116.             elif ev.delta() > 0:
  117.                 self.showPrevious()
  118.             
  119.  
  120.  
  121. else:
  122.     CoverFlow = None
  123.     DatabaseImages = None
  124.     FileSystemImages = None
  125.  
  126. class CBDialog(QDialog):
  127.     closed = pyqtSignal()
  128.     
  129.     def __init__(self, parent, cover_flow):
  130.         QDialog.__init__(self, parent)
  131.         self._layout = QStackedLayout()
  132.         self.setLayout(self._layout)
  133.         self.setWindowTitle(_('Browse by covers'))
  134.         self.layout().addWidget(cover_flow)
  135.         geom = gprefs.get('cover_browser_dialog_geometry', bytearray(''))
  136.         geom = QByteArray(geom)
  137.         if not self.restoreGeometry(geom):
  138.             h = available_height() - 60
  139.             w = int(available_width() / 1.5)
  140.             self.resize(w, h)
  141.         
  142.  
  143.     
  144.     def closeEvent(self, *args):
  145.         geom = bytearray(self.saveGeometry())
  146.         gprefs['cover_browser_dialog_geometry'] = geom
  147.         self.closed.emit()
  148.  
  149.  
  150.  
  151. class CoverFlowMixin(object):
  152.     
  153.     def __init__(self):
  154.         self.cover_flow = None
  155.         if CoverFlow is not None:
  156.             self.cf_last_updated_at = None
  157.             self.cover_flow_sync_timer = QTimer(self)
  158.             self.cover_flow_sync_timer.timeout.connect(self.cover_flow_do_sync)
  159.             self.cover_flow_sync_flag = True
  160.             self.cover_flow = CoverFlow(parent = self)
  161.             self.cover_flow.currentChanged.connect(self.sync_listview_to_cf)
  162.             self.library_view.selectionModel().currentRowChanged.connect(self.sync_cf_to_listview)
  163.             self.db_images = DatabaseImages(self.library_view.model())
  164.             self.cover_flow.setImages(self.db_images)
  165.             self.cover_flow.itemActivated.connect(self.iactions['View'].view_specific_book)
  166.         else:
  167.             self.cover_flow = QLabel('<p>' + _('Cover browser could not be loaded') + '<br>' + pictureflowerror)
  168.             self.cover_flow.setWordWrap(True)
  169.         if config['separate_cover_flow']:
  170.             self.cb_splitter.button.clicked.connect(self.toggle_cover_browser)
  171.             self.cb_splitter.button.set_state_to_show()
  172.             self.cb_splitter.action_toggle.triggered.connect(self.toggle_cover_browser)
  173.             if CoverFlow is not None:
  174.                 self.cover_flow.stop.connect(self.hide_cover_browser)
  175.             
  176.             self.cover_flow.setVisible(False)
  177.         else:
  178.             self.cb_splitter.insertWidget(self.cb_splitter.side_index, self.cover_flow)
  179.             if CoverFlow is not None:
  180.                 self.cover_flow.stop.connect(self.cb_splitter.hide_side_pane)
  181.             
  182.         self.cb_splitter.button.toggled.connect(self.cover_browser_toggled)
  183.  
  184.     
  185.     def toggle_cover_browser(self, *args):
  186.         cbd = getattr(self, 'cb_dialog', None)
  187.         if cbd is not None:
  188.             self.hide_cover_browser()
  189.         else:
  190.             self.show_cover_browser()
  191.  
  192.     
  193.     def cover_browser_toggled(self, *args):
  194.         if self.cb_splitter.button.isChecked():
  195.             self.cover_browser_shown()
  196.         else:
  197.             self.cover_browser_hidden()
  198.  
  199.     
  200.     def cover_browser_shown(self):
  201.         self.cover_flow.setFocus(Qt.OtherFocusReason)
  202.         if CoverFlow is not None:
  203.             self.cover_flow.setCurrentSlide(self.library_view.currentIndex().row())
  204.             self.cover_flow_sync_timer.start(500)
  205.         
  206.         self.library_view.setCurrentIndex(self.library_view.currentIndex())
  207.         self.library_view.scroll_to_row(self.library_view.currentIndex().row())
  208.  
  209.     
  210.     def cover_browser_hidden(self):
  211.         if CoverFlow is not None:
  212.             self.cover_flow_sync_timer.stop()
  213.             idx = self.library_view.model().index(self.cover_flow.currentSlide(), 0)
  214.             if idx.isValid():
  215.                 sm = self.library_view.selectionModel()
  216.                 sm.select(idx, sm.ClearAndSelect | sm.Rows)
  217.                 self.library_view.setCurrentIndex(idx)
  218.                 self.library_view.scroll_to_row(idx.row())
  219.             
  220.         
  221.  
  222.     
  223.     def show_cover_browser(self):
  224.         d = CBDialog(self, self.cover_flow)
  225.         d.addAction(self.cb_splitter.action_toggle)
  226.         self.cover_flow.setVisible(True)
  227.         self.cover_flow.setFocus(Qt.OtherFocusReason)
  228.         d.show()
  229.         self.cb_splitter.button.set_state_to_hide()
  230.         d.closed.connect(self.cover_browser_closed)
  231.         self.cb_dialog = d
  232.         self.cb_splitter.button.set_state_to_hide()
  233.  
  234.     
  235.     def cover_browser_closed(self, *args):
  236.         self.cb_dialog = None
  237.         self.cb_splitter.button.set_state_to_show()
  238.  
  239.     
  240.     def hide_cover_browser(self, *args):
  241.         cbd = getattr(self, 'cb_dialog', None)
  242.         if cbd is not None:
  243.             cbd.accept()
  244.             self.cb_dialog = None
  245.         
  246.         self.cb_splitter.button.set_state_to_show()
  247.  
  248.     
  249.     def sync_cf_to_listview(self, current, previous):
  250.         if self.cover_flow_sync_flag and self.cover_flow.isVisible() and self.cover_flow.currentSlide() != current.row():
  251.             self.cover_flow.setCurrentSlide(current.row())
  252.         
  253.         self.cover_flow_sync_flag = True
  254.  
  255.     
  256.     def cover_flow_do_sync(self):
  257.         self.cover_flow_sync_flag = True
  258.         
  259.         try:
  260.             if self.cover_flow.isVisible() and self.cf_last_updated_at is not None and time.time() - self.cf_last_updated_at > 0.5:
  261.                 self.cf_last_updated_at = None
  262.                 row = self.cover_flow.currentSlide()
  263.                 m = self.library_view.model()
  264.                 index = m.index(row, 0)
  265.                 if self.library_view.currentIndex().row() != row and index.isValid():
  266.                     self.cover_flow_sync_flag = False
  267.                     self.library_view.scroll_to_row(index.row())
  268.                     sm = self.library_view.selectionModel()
  269.                     sm.select(index, sm.ClearAndSelect | sm.Rows)
  270.                     self.library_view.setCurrentIndex(index)
  271.                 
  272.         except:
  273.             import traceback
  274.             traceback.print_exc()
  275.  
  276.  
  277.     
  278.     def sync_listview_to_cf(self, row):
  279.         self.cf_last_updated_at = time.time()
  280.  
  281.  
  282.  
  283. def main(args = sys.argv):
  284.     return 0
  285.  
  286. if __name__ == '__main__':
  287.     from PyQt4.QtGui import QApplication, QMainWindow
  288.     app = QApplication([])
  289.     w = QMainWindow()
  290.     cf = CoverFlow()
  291.     cf.resize(int(available_width() / 1.5), available_height() - 60)
  292.     w.resize(cf.size() + QSize(30, 20))
  293.     path = sys.argv[1]
  294.     model = FileSystemImages(sys.argv[1])
  295.     cf.currentChanged[int].connect(model.currentChanged)
  296.     cf.setImages(model)
  297.     w.setCentralWidget(cf)
  298.     w.show()
  299.     cf.setFocus(Qt.OtherFocusReason)
  300.     sys.exit(app.exec_())
  301.  
  302.