view MainWindow.py @ 53:8cca4585eb33

the feed settings menu item starts out disabled and gets enabled once a feed is selected
author Dirk Olmes <dirk@xanthippe.ping.de>
date Tue, 18 May 2010 02:58:31 +0200
parents 4b0d686493fb
children 0f9b3e57cff0
line wrap: on
line source


from AddFeed import AddFeed
from DisplayModel import DisplayModel
from Feed import Feed
from FeedEntry import FeedEntry
from FeedSettings import FeedSettings
from PreferencesDialog import PreferencesDialog
from PyQt4 import QtGui
from PyQt4.QtCore import QUrl
from PyQt4.QtGui import QFont
from Ui_MainWindow import Ui_MainWindow
import subprocess

STATUS_MESSAGE_DISPLAY_MILLIS = 20000

class MainWindow(QtGui.QMainWindow):
    def __init__(self, session=None):
        QtGui.QWidget.__init__(self, None)
        self.session = session
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.updateFeedList()
        self.initFeedEntryList()
        
    def updateFeedList(self):        
        self.allFeeds = Feed.all(self.session)
        feedModel = DisplayModel(self, self.allFeeds, Feed.userPresentableString)
        self.ui.feedList.setModel(feedModel)
        self.ui.feedList.update()

    def initFeedEntryList(self):
        self.ui.feedEntryList.setItemDelegate(FeedEntryItemDelegate())

    def feedSelected(self, index):
        self.selectedFeed = self.allFeeds[index.row()]

        self.ui.actionFeedSettings.setEnabled(True)
        
        self.sortedEntries = self.selectedFeed.entriesSortedByUpdateDate()
        model = DisplayModel(self, self.sortedEntries, FeedEntry.userPresentableString)
        self.ui.feedEntryList.setModel(model)
        self.ui.feedEntryList.itemDelegate().entries = self.sortedEntries
        self.ui.feedEntryList.update()
        
    def feedEntrySelected(self, index):
        self.ui.menuArticle.setEnabled(True)
        
        row = index.row()
        self.selectedEntry = self.sortedEntries[row]
        
        if self.selectedEntry.feed.auto_load_entry_link:
            self.openLinkFromSelectedEntry()
        else:
            self.openSummaryFromSelectedEntry()
            
    def openSummaryFromSelectedEntry(self):
        # TODO this is the wrong base url, figure out the correct one
        baseUrl = QUrl(self.selectedEntry.link)
        self.ui.webView.setHtml(self.selectedEntry.summary, baseUrl)

    def openLinkFromSelectedEntry(self):
        url = QUrl(self.selectedEntry.link)
        self.ui.webView.load(url)
        self.ui.webView.show()
    
    def toggleReadOnSelectedEntry(self):
        self.selectedEntry.toggleRead()
        self.session.commit()
        self.ui.feedList.update()
    
    def addFeed(self):
        addFeed = AddFeed(self.session)
        success = addFeed.exec_()
        if not success:
            return
        
        if addFeed.exception is not None:
            message = "Error while adding feed: " + str(addFeed.exception)
            self.ui.statusbar.showMessage(message, STATUS_MESSAGE_DISPLAY_MILLIS)
        else:
            self.session.commit()
            self.updateFeedList()

    def openSelectedEntryInBrowser(self):
        # TODO make browser configurable
        browser = "/usr/local/bin/opera"
        subprocess.Popen([browser, self.selectedEntry.link])
                
    def showPreferences(self):
        preferences = PreferencesDialog(self.session)
        preferences.exec_()
        
    def showFeedSettings(self):
        feedSettings = FeedSettings(self.session, self.selectedFeed)
        feedSettings.exec_()
        

class FeedEntryItemDelegate(QtGui.QStyledItemDelegate):
    def __init__(self):
        QtGui.QStyledItemDelegate.__init__(self, None)
    
    def paint(self, painter, style, index):
        row = index.row()
        entry = self.entries[row]
        if entry.read:
            style.font.setWeight(QFont.Normal)
        else:
            style.font.setWeight(QFont.Bold)
        QtGui.QStyledItemDelegate.paint(self, painter, style, index)