Mercurial > hg > Feedworm
annotate MainWindow.py @ 241:e0e7459556bc
use Qt to open the selected article in the system browser
author | Dirk Olmes <dirk@xanthippe.ping.de> |
---|---|
date | Tue, 28 Apr 2015 02:50:57 +0200 |
parents | 9faa1f84e8c9 |
children | f08fa6dcb86f |
rev | line source |
---|---|
217
bb3c851b18b1
add source file endcoding header
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
216
diff
changeset
|
1 # -*- coding: utf-8 -*- |
218
699d8f1cebd4
unify imports, especially Qt imports. Use consistent super syntax
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
217
diff
changeset
|
2 import subprocess |
121
510a5d00e98a
re-enabled AddFeed - does not work yet
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
120
diff
changeset
|
3 from AddFeed import AddFeed |
226
016c89dfd488
use our generic PyQtLib instead of custom Qt models in this project
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
218
diff
changeset
|
4 from PyQtLib.GenericListModel import GenericListModel |
228
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
5 from PyQtLib.GenericTableModel import GenericTableModel |
55
0f9b3e57cff0
pull out FeedEntryItemDelegate into its own file
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
53
diff
changeset
|
6 from FeedEntryItemDelegate import FeedEntryItemDelegate |
48 | 7 from FeedSettings import FeedSettings |
120
e830fa1cc7a2
re-enabled PreferencesDialog
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
119
diff
changeset
|
8 from PreferencesDialog import PreferencesDialog |
21
c8bb3cee7935
pull out DisplayModel into its own file, add the scaffolding for the add feed menu entry
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
19
diff
changeset
|
9 from PyQt4.QtCore import QUrl |
241
e0e7459556bc
use Qt to open the selected article in the system browser
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
230
diff
changeset
|
10 from PyQt4.QtGui import QApplication, QDesktopServices, QMainWindow, QWidget |
14 | 11 from Ui_MainWindow import Ui_MainWindow |
12 | |
50
4b0d686493fb
better error handling while adding feeds: data is only saved if a feed could be created and entries could be retrieved. MainWindow displays feedback in the status bar if an exception occurred while adding a feed.
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
49
diff
changeset
|
13 STATUS_MESSAGE_DISPLAY_MILLIS = 20000 |
4b0d686493fb
better error handling while adding feeds: data is only saved if a feed could be created and entries could be retrieved. MainWindow displays feedback in the status bar if an exception occurred while adding a feed.
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
49
diff
changeset
|
14 |
90
a1066e5a8f88
save pending changes when quitting the app
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
89
diff
changeset
|
15 class MainWindow(QMainWindow): |
119
04a730f9d07d
move all sqlalchemy related classes to the respective sub-package. use a backend to abstract from access to the data
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
115
diff
changeset
|
16 def __init__(self, backend=None): |
90
a1066e5a8f88
save pending changes when quitting the app
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
89
diff
changeset
|
17 QWidget.__init__(self, None) |
119
04a730f9d07d
move all sqlalchemy related classes to the respective sub-package. use a backend to abstract from access to the data
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
115
diff
changeset
|
18 self.backend = backend |
04a730f9d07d
move all sqlalchemy related classes to the respective sub-package. use a backend to abstract from access to the data
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
115
diff
changeset
|
19 self.preferences = backend.preferences() |
14 | 20 self.ui = Ui_MainWindow() |
21 self.ui.setupUi(self) | |
27
bdd1296a4b8c
implemented adding a feed
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
24
diff
changeset
|
22 self.updateFeedList() |
228
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
23 self.initFeedEntryTable() |
89
2eddb44920d1
When selecting a new feed, scroll its first entry to visible
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
84
diff
changeset
|
24 |
71
228da10cc98b
MainWindow relies on FeedList to get the feeds to display now. FeedList has two inner/private classes: one for returning all known feeds and one to return only feeds with unread entries.
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
61
diff
changeset
|
25 def updateFeedList(self): |
151
bca9341dc67f
move the selected feed into the backend - sqlalchemy backend works, couchdb backend currently broken
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
150
diff
changeset
|
26 allFeeds = self.backend.getFeeds() |
226
016c89dfd488
use our generic PyQtLib instead of custom Qt models in this project
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
218
diff
changeset
|
27 feedModel = GenericListModel(self, allFeeds, 'title') |
15
b1aeb98824c1
Add a list view displaying all feeds
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
14
diff
changeset
|
28 self.ui.feedList.setModel(feedModel) |
27
bdd1296a4b8c
implemented adding a feed
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
24
diff
changeset
|
29 self.ui.feedList.update() |
230
9faa1f84e8c9
display the number of feeds and articles above the table
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
228
diff
changeset
|
30 self.__updateFeedCountLabel(allFeeds) |
241
e0e7459556bc
use Qt to open the selected article in the system browser
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
230
diff
changeset
|
31 |
230
9faa1f84e8c9
display the number of feeds and articles above the table
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
228
diff
changeset
|
32 def __updateFeedCountLabel(self, feeds): |
9faa1f84e8c9
display the number of feeds and articles above the table
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
228
diff
changeset
|
33 feedCount = len(feeds) |
9faa1f84e8c9
display the number of feeds and articles above the table
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
228
diff
changeset
|
34 text = '%d feed' % feedCount |
9faa1f84e8c9
display the number of feeds and articles above the table
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
228
diff
changeset
|
35 if feedCount > 1: |
9faa1f84e8c9
display the number of feeds and articles above the table
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
228
diff
changeset
|
36 text = text + 's' |
9faa1f84e8c9
display the number of feeds and articles above the table
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
228
diff
changeset
|
37 self.ui.feedCountLabel.setText(text) |
241
e0e7459556bc
use Qt to open the selected article in the system browser
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
230
diff
changeset
|
38 |
228
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
39 def initFeedEntryTable(self): |
97
11036eabbc46
use a smaller default row height
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
93
diff
changeset
|
40 # setup the default row height. This must be called before a table model is set |
228
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
41 self.ui.feedEntryTable.verticalHeader().setDefaultSectionSize(20) |
97
11036eabbc46
use a smaller default row height
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
93
diff
changeset
|
42 |
228
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
43 self.ui.feedEntryTable.setItemDelegate(FeedEntryItemDelegate()) |
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
44 model = self.__buildFeedEntryTableModel() |
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
45 self.ui.feedEntryTable.setModel(model) |
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
46 self.ui.feedEntryTable.horizontalHeader().setStretchLastSection(True) |
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
47 |
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
48 def __buildFeedEntryTableModel(self): |
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
49 model = GenericTableModel(self, []) |
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
50 titleDisplay = lambda feedEntry: feedEntry.title |
241
e0e7459556bc
use Qt to open the selected article in the system browser
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
230
diff
changeset
|
51 model.defineColumn('Title', titleDisplay) |
228
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
52 dateDisplay = lambda feedEntry: feedEntry.updated.strftime('%d.%m.%Y') |
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
53 model.defineColumn('Date', dateDisplay) |
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
54 return model |
31
5bb57caa8f66
display a feed's entries sorted by their update date
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
27
diff
changeset
|
55 |
17
5fda8bd94fa8
make the model used to display feeds generic (so it can be used to display FeedEntries, too)
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
16
diff
changeset
|
56 def feedSelected(self, index): |
151
bca9341dc67f
move the selected feed into the backend - sqlalchemy backend works, couchdb backend currently broken
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
150
diff
changeset
|
57 self.backend.selectFeed(index.row()) |
61
db35ab7753f0
add a preference to hide read feed entries
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
60
diff
changeset
|
58 self.enableFeedRelatedWidgets() |
db35ab7753f0
add a preference to hide read feed entries
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
60
diff
changeset
|
59 self.setupFeedEntries() |
53
8cca4585eb33
the feed settings menu item starts out disabled and gets enabled once a feed is selected
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
50
diff
changeset
|
60 |
61
db35ab7753f0
add a preference to hide read feed entries
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
60
diff
changeset
|
61 def enableFeedRelatedWidgets(self): |
53
8cca4585eb33
the feed settings menu item starts out disabled and gets enabled once a feed is selected
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
50
diff
changeset
|
62 self.ui.actionFeedSettings.setEnabled(True) |
56
c82f5538733c
add a menu item to mark all entries in a feed as read
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
55
diff
changeset
|
63 self.ui.actionMarkFeedRead.setEnabled(True) |
193
c345a26febc2
add a toolbar icon for marking selected entries as read
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
155
diff
changeset
|
64 self.ui.actionMarkSelectedEntriesRead.setEnabled(True) |
103
063581d8594e
implement deleting a feed from the GUI
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
97
diff
changeset
|
65 self.ui.actionDeleteFeed.setEnabled(True) |
61
db35ab7753f0
add a preference to hide read feed entries
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
60
diff
changeset
|
66 |
db35ab7753f0
add a preference to hide read feed entries
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
60
diff
changeset
|
67 def setupFeedEntries(self): |
230
9faa1f84e8c9
display the number of feeds and articles above the table
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
228
diff
changeset
|
68 feedEntries = self.backend.entriesForSelectedFeed() |
9faa1f84e8c9
display the number of feeds and articles above the table
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
228
diff
changeset
|
69 self.setupFeedEntriesTableModel(feedEntries) |
228
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
70 self.ui.feedEntryTable.update() |
152 | 71 self.setupFeedEntriesTableHeaderWidths() |
72 self.scrollFirstRowInFeedEntriesTableToVisible() | |
230
9faa1f84e8c9
display the number of feeds and articles above the table
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
228
diff
changeset
|
73 self.__updateFeedEntryCountLabel(feedEntries) |
93
e030c6bd2d81
when selecting a feed, set the title column width to 80% of the total width
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
91
diff
changeset
|
74 |
230
9faa1f84e8c9
display the number of feeds and articles above the table
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
228
diff
changeset
|
75 def setupFeedEntriesTableModel(self, feedEntries): |
228
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
76 model = self.ui.feedEntryTable.model() |
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
77 model.setDisplayedObjects(feedEntries) |
91
e5d5fc34ff2e
convert feed list to a table view. TODO: proper resizing for columns
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
90
diff
changeset
|
78 |
152 | 79 def setupFeedEntriesTableHeaderWidths(self): |
228
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
80 width = self.ui.feedEntryTable.width() |
93
e030c6bd2d81
when selecting a feed, set the title column width to 80% of the total width
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
91
diff
changeset
|
81 firstColumnWidth = int(width * 0.8) |
228
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
82 self.ui.feedEntryTable.setColumnWidth(0, firstColumnWidth) |
93
e030c6bd2d81
when selecting a feed, set the title column width to 80% of the total width
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
91
diff
changeset
|
83 |
152 | 84 def scrollFirstRowInFeedEntriesTableToVisible(self): |
228
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
85 model = self.ui.feedEntryTable.model() |
89
2eddb44920d1
When selecting a new feed, scroll its first entry to visible
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
84
diff
changeset
|
86 visibleIndex = model.createIndex(0, 0) |
228
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
87 self.ui.feedEntryTable.scrollTo(visibleIndex) |
89
2eddb44920d1
When selecting a new feed, scroll its first entry to visible
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
84
diff
changeset
|
88 |
230
9faa1f84e8c9
display the number of feeds and articles above the table
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
228
diff
changeset
|
89 def __updateFeedEntryCountLabel(self, feedEntries): |
9faa1f84e8c9
display the number of feeds and articles above the table
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
228
diff
changeset
|
90 count = len(feedEntries) |
9faa1f84e8c9
display the number of feeds and articles above the table
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
228
diff
changeset
|
91 text = '%d Article' % count |
9faa1f84e8c9
display the number of feeds and articles above the table
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
228
diff
changeset
|
92 if count > 1: |
9faa1f84e8c9
display the number of feeds and articles above the table
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
228
diff
changeset
|
93 text = text + 's' |
9faa1f84e8c9
display the number of feeds and articles above the table
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
228
diff
changeset
|
94 self.ui.feedEntryCountLabel.setText(text) |
241
e0e7459556bc
use Qt to open the selected article in the system browser
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
230
diff
changeset
|
95 |
19
6f7003fc6e6d
display the summary of the selected feed entry
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
18
diff
changeset
|
96 def feedEntrySelected(self, index): |
207 | 97 self.ui.webView.setZoomFactor(1.0) |
39
0c2578196643
Disable the article menu by default, enable it when the first article is selected
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
37
diff
changeset
|
98 self.ui.menuArticle.setEnabled(True) |
115
e9145e8dd698
add a toolbar with actions
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
113
diff
changeset
|
99 self.ui.actionOpenLink.setEnabled(True) |
89
2eddb44920d1
When selecting a new feed, scroll its first entry to visible
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
84
diff
changeset
|
100 |
19
6f7003fc6e6d
display the summary of the selected feed entry
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
18
diff
changeset
|
101 row = index.row() |
155
a05719a6175e
move common functionality into an abstract backend class, have both backends inherit from it. Implement enough of the couchdb backend that reading feeds (and marking feed entries as read) is possible
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
153
diff
changeset
|
102 self.backend.selectFeedEntry(row) |
89
2eddb44920d1
When selecting a new feed, scroll its first entry to visible
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
84
diff
changeset
|
103 |
155
a05719a6175e
move common functionality into an abstract backend class, have both backends inherit from it. Implement enough of the couchdb backend that reading feeds (and marking feed entries as read) is possible
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
153
diff
changeset
|
104 if self.backend.selectedFeed.auto_load_entry_link: |
47
a8442c3487b5
add an option to Feed that allows loading an entry's link right away instead of displaying a feed's summary
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
42
diff
changeset
|
105 self.openLinkFromSelectedEntry() |
a8442c3487b5
add an option to Feed that allows loading an entry's link right away instead of displaying a feed's summary
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
42
diff
changeset
|
106 else: |
a8442c3487b5
add an option to Feed that allows loading an entry's link right away instead of displaying a feed's summary
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
42
diff
changeset
|
107 self.openSummaryFromSelectedEntry() |
89
2eddb44920d1
When selecting a new feed, scroll its first entry to visible
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
84
diff
changeset
|
108 |
104
4f87be5399ff
double clicking a feed entry opens it in the external browser
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
103
diff
changeset
|
109 def feedEntryDoubleClicked(self, index): |
4f87be5399ff
double clicking a feed entry opens it in the external browser
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
103
diff
changeset
|
110 self.ui.menuArticle.setEnabled(True) |
4f87be5399ff
double clicking a feed entry opens it in the external browser
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
103
diff
changeset
|
111 self.openSelectedEntryInBrowser() |
4f87be5399ff
double clicking a feed entry opens it in the external browser
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
103
diff
changeset
|
112 |
47
a8442c3487b5
add an option to Feed that allows loading an entry's link right away instead of displaying a feed's summary
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
42
diff
changeset
|
113 def openSummaryFromSelectedEntry(self): |
213
524cbf9e413c
use correct TODO tags so they show up in the tasks view in Eclipse
dirk
parents:
207
diff
changeset
|
114 # TODO: this is the wrong base url, figure out the correct one |
153
65c4bb6d5add
move management of the selected feed entry into the backend - sqlachemy backend works, couchdb backend currently broken
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
152
diff
changeset
|
115 feedEntry = self.backend.selectedFeedEntry |
65c4bb6d5add
move management of the selected feed entry into the backend - sqlachemy backend works, couchdb backend currently broken
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
152
diff
changeset
|
116 baseUrl = QUrl(feedEntry.link) |
65c4bb6d5add
move management of the selected feed entry into the backend - sqlachemy backend works, couchdb backend currently broken
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
152
diff
changeset
|
117 self.ui.webView.setHtml(feedEntry.summary, baseUrl) |
47
a8442c3487b5
add an option to Feed that allows loading an entry's link right away instead of displaying a feed's summary
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
42
diff
changeset
|
118 |
a8442c3487b5
add an option to Feed that allows loading an entry's link right away instead of displaying a feed's summary
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
42
diff
changeset
|
119 def openLinkFromSelectedEntry(self): |
155
a05719a6175e
move common functionality into an abstract backend class, have both backends inherit from it. Implement enough of the couchdb backend that reading feeds (and marking feed entries as read) is possible
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
153
diff
changeset
|
120 if self.backend.selectedFeed.always_open_in_browser: |
77
d292ab61ed6f
Add another setting to feed: when opening a feed entry in browser, you can force opening it in an external browser now. This is because some sites just crash the QWebView.
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
75
diff
changeset
|
121 self.openSelectedEntryInBrowser() |
d292ab61ed6f
Add another setting to feed: when opening a feed entry in browser, you can force opening it in an external browser now. This is because some sites just crash the QWebView.
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
75
diff
changeset
|
122 else: |
d292ab61ed6f
Add another setting to feed: when opening a feed entry in browser, you can force opening it in an external browser now. This is because some sites just crash the QWebView.
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
75
diff
changeset
|
123 self.openSelectedEntryInWebView() |
89
2eddb44920d1
When selecting a new feed, scroll its first entry to visible
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
84
diff
changeset
|
124 |
77
d292ab61ed6f
Add another setting to feed: when opening a feed entry in browser, you can force opening it in an external browser now. This is because some sites just crash the QWebView.
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
75
diff
changeset
|
125 def openSelectedEntryInWebView(self): |
153
65c4bb6d5add
move management of the selected feed entry into the backend - sqlachemy backend works, couchdb backend currently broken
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
152
diff
changeset
|
126 feedEntry = self.backend.selectedFeedEntry |
65c4bb6d5add
move management of the selected feed entry into the backend - sqlachemy backend works, couchdb backend currently broken
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
152
diff
changeset
|
127 message = "Open %s ..." % (feedEntry.title) |
82
2dd6e6894772
update the status bar when opening a feed's rss url via WebView or external browser
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
77
diff
changeset
|
128 self._updateStatusBar(message) |
153
65c4bb6d5add
move management of the selected feed entry into the backend - sqlachemy backend works, couchdb backend currently broken
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
152
diff
changeset
|
129 url = QUrl(feedEntry.link) |
47
a8442c3487b5
add an option to Feed that allows loading an entry's link right away instead of displaying a feed's summary
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
42
diff
changeset
|
130 self.ui.webView.load(url) |
a8442c3487b5
add an option to Feed that allows loading an entry's link right away instead of displaying a feed's summary
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
42
diff
changeset
|
131 self.ui.webView.show() |
77
d292ab61ed6f
Add another setting to feed: when opening a feed entry in browser, you can force opening it in an external browser now. This is because some sites just crash the QWebView.
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
75
diff
changeset
|
132 |
d292ab61ed6f
Add another setting to feed: when opening a feed entry in browser, you can force opening it in an external browser now. This is because some sites just crash the QWebView.
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
75
diff
changeset
|
133 def openSelectedEntryInBrowser(self): |
241
e0e7459556bc
use Qt to open the selected article in the system browser
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
230
diff
changeset
|
134 article = self.backend.selectedFeedEntry |
e0e7459556bc
use Qt to open the selected article in the system browser
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
230
diff
changeset
|
135 message = "Open %s in external browser" % (article.title) |
82
2dd6e6894772
update the status bar when opening a feed's rss url via WebView or external browser
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
77
diff
changeset
|
136 self._updateStatusBar(message) |
241
e0e7459556bc
use Qt to open the selected article in the system browser
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
230
diff
changeset
|
137 url = QUrl(article.link) |
e0e7459556bc
use Qt to open the selected article in the system browser
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
230
diff
changeset
|
138 QDesktopServices.openUrl(url) |
77
d292ab61ed6f
Add another setting to feed: when opening a feed entry in browser, you can force opening it in an external browser now. This is because some sites just crash the QWebView.
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
75
diff
changeset
|
139 |
33
f371d02fa09d
mark unread feed entries bold. Add a menu item to toggle between read/unread
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
31
diff
changeset
|
140 def toggleReadOnSelectedEntry(self): |
153
65c4bb6d5add
move management of the selected feed entry into the backend - sqlachemy backend works, couchdb backend currently broken
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
152
diff
changeset
|
141 self.backend.toggleSelectedFeedEntryRead() |
228
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
142 self.ui.feedEntryTable.doItemsLayout() |
89
2eddb44920d1
When selecting a new feed, scroll its first entry to visible
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
84
diff
changeset
|
143 |
59
daa2731967fe
Marking all articles in a feed as read doesn't toggle any more ... it marks all articles as read.
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
56
diff
changeset
|
144 def markSelectedFeedRead(self): |
151
bca9341dc67f
move the selected feed into the backend - sqlalchemy backend works, couchdb backend currently broken
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
150
diff
changeset
|
145 self.backend.markSelectedFeedAsRead() |
228
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
146 self.ui.feedEntryTable.doItemsLayout() |
89
2eddb44920d1
When selecting a new feed, scroll its first entry to visible
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
84
diff
changeset
|
147 |
105
d372b3ee7bd8
add marking the entire current selection as read
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
104
diff
changeset
|
148 def markSelectedEntriesRead(self): |
153
65c4bb6d5add
move management of the selected feed entry into the backend - sqlachemy backend works, couchdb backend currently broken
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
152
diff
changeset
|
149 indexes = [] |
228
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
150 selectedIndexes = self.ui.feedEntryTable.selectedIndexes() |
105
d372b3ee7bd8
add marking the entire current selection as read
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
104
diff
changeset
|
151 for index in selectedIndexes: |
d372b3ee7bd8
add marking the entire current selection as read
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
104
diff
changeset
|
152 # selectedIndexes returns one QModelIndex instance per row/column combo. |
d372b3ee7bd8
add marking the entire current selection as read
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
104
diff
changeset
|
153 # We are only interested in the rows here so just operate on the first |
d372b3ee7bd8
add marking the entire current selection as read
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
104
diff
changeset
|
154 # column |
d372b3ee7bd8
add marking the entire current selection as read
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
104
diff
changeset
|
155 if index.column() == 0: |
d372b3ee7bd8
add marking the entire current selection as read
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
104
diff
changeset
|
156 row = index.row() |
153
65c4bb6d5add
move management of the selected feed entry into the backend - sqlachemy backend works, couchdb backend currently broken
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
152
diff
changeset
|
157 indexes.append(row) |
65c4bb6d5add
move management of the selected feed entry into the backend - sqlachemy backend works, couchdb backend currently broken
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
152
diff
changeset
|
158 self.backend.markFeedEntriesAsRead(indexes) |
228
94a902de5266
use GenericTableModel instead of FeedEntryTableModel
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
226
diff
changeset
|
159 self.ui.feedEntryTable.doItemsLayout() |
105
d372b3ee7bd8
add marking the entire current selection as read
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
104
diff
changeset
|
160 |
21
c8bb3cee7935
pull out DisplayModel into its own file, add the scaffolding for the add feed menu entry
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
19
diff
changeset
|
161 def addFeed(self): |
121
510a5d00e98a
re-enabled AddFeed - does not work yet
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
120
diff
changeset
|
162 addFeed = AddFeed(self.backend) |
510a5d00e98a
re-enabled AddFeed - does not work yet
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
120
diff
changeset
|
163 success = addFeed.exec_() |
510a5d00e98a
re-enabled AddFeed - does not work yet
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
120
diff
changeset
|
164 if not success: |
510a5d00e98a
re-enabled AddFeed - does not work yet
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
120
diff
changeset
|
165 return |
510a5d00e98a
re-enabled AddFeed - does not work yet
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
120
diff
changeset
|
166 |
510a5d00e98a
re-enabled AddFeed - does not work yet
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
120
diff
changeset
|
167 if addFeed.exception is not None: |
510a5d00e98a
re-enabled AddFeed - does not work yet
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
120
diff
changeset
|
168 message = "Error while adding feed: " + str(addFeed.exception) |
510a5d00e98a
re-enabled AddFeed - does not work yet
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
120
diff
changeset
|
169 self._updateStatusBar(message) |
510a5d00e98a
re-enabled AddFeed - does not work yet
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
120
diff
changeset
|
170 else: |
510a5d00e98a
re-enabled AddFeed - does not work yet
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
120
diff
changeset
|
171 self.updateFeedList() |
89
2eddb44920d1
When selecting a new feed, scroll its first entry to visible
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
84
diff
changeset
|
172 |
103
063581d8594e
implement deleting a feed from the GUI
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
97
diff
changeset
|
173 def deleteFeed(self): |
063581d8594e
implement deleting a feed from the GUI
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
97
diff
changeset
|
174 try: |
151
bca9341dc67f
move the selected feed into the backend - sqlalchemy backend works, couchdb backend currently broken
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
150
diff
changeset
|
175 self.backend.deleteSelectedFeed() |
103
063581d8594e
implement deleting a feed from the GUI
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
97
diff
changeset
|
176 self.updateFeedList() |
063581d8594e
implement deleting a feed from the GUI
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
97
diff
changeset
|
177 except Exception as exception: |
063581d8594e
implement deleting a feed from the GUI
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
97
diff
changeset
|
178 message = "Error while deleting feed: " + str(exception) |
063581d8594e
implement deleting a feed from the GUI
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
97
diff
changeset
|
179 self._updateStatusBar(message) |
063581d8594e
implement deleting a feed from the GUI
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
97
diff
changeset
|
180 |
40 | 181 def showPreferences(self): |
120
e830fa1cc7a2
re-enabled PreferencesDialog
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
119
diff
changeset
|
182 preferences = PreferencesDialog(self.backend) |
e830fa1cc7a2
re-enabled PreferencesDialog
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
119
diff
changeset
|
183 preferences.exec_() |
89
2eddb44920d1
When selecting a new feed, scroll its first entry to visible
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
84
diff
changeset
|
184 |
48 | 185 def showFeedSettings(self): |
151
bca9341dc67f
move the selected feed into the backend - sqlalchemy backend works, couchdb backend currently broken
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
150
diff
changeset
|
186 feedSettings = FeedSettings(self.backend) |
48 | 187 feedSettings.exec_() |
89
2eddb44920d1
When selecting a new feed, scroll its first entry to visible
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
84
diff
changeset
|
188 |
82
2dd6e6894772
update the status bar when opening a feed's rss url via WebView or external browser
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
77
diff
changeset
|
189 def _updateStatusBar(self, message): |
2dd6e6894772
update the status bar when opening a feed's rss url via WebView or external browser
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
77
diff
changeset
|
190 self.ui.statusbar.showMessage(message, STATUS_MESSAGE_DISPLAY_MILLIS) |
37
22214d79ed41
database URL must be given as commandline argument now, no need for creating complicated config files. Add a menu entry for opening the selected article in browser.
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
33
diff
changeset
|
191 |
90
a1066e5a8f88
save pending changes when quitting the app
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
89
diff
changeset
|
192 def close(self): |
119
04a730f9d07d
move all sqlalchemy related classes to the respective sub-package. use a backend to abstract from access to the data
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
115
diff
changeset
|
193 self.backend.dispose() |
90
a1066e5a8f88
save pending changes when quitting the app
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
89
diff
changeset
|
194 QMainWindow.close(self) |
113
04f8cf1558c1
Add a menu item to copy the selected article's link to the clipboard
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
107
diff
changeset
|
195 |
04f8cf1558c1
Add a menu item to copy the selected article's link to the clipboard
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
107
diff
changeset
|
196 def copyArticleURLToClipboard(self): |
04f8cf1558c1
Add a menu item to copy the selected article's link to the clipboard
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
107
diff
changeset
|
197 clipboard = QApplication.clipboard() |
153
65c4bb6d5add
move management of the selected feed entry into the backend - sqlachemy backend works, couchdb backend currently broken
Dirk Olmes <dirk@xanthippe.ping.de>
parents:
152
diff
changeset
|
198 clipboard.setText(self.backend.selectedFeedEntry.link) |
207 | 199 |
200 def zoomIn(self): | |
201 zoom = self.ui.webView.zoomFactor() + 0.1 | |
202 self.ui.webView.setZoomFactor(zoom) | |
203 | |
204 def zoomOut(self): | |
205 zoom = self.ui.webView.zoomFactor() - 0.1 | |
206 self.ui.webView.setZoomFactor(zoom) |