viewgit/index.php:465 Only variables should be passed by reference [2048]

viewgit/index.php:466 Non-static method GeSHi::get_language_name_from_extension() should not be called statically [2048]

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include "editfeeddialog.h"
  4. #include "editcategorydialog.h"
  5. #include "unreadcountitemdelegate.h"
  6. #include <QDebug>
  7. #include <QtGui>
  8.  
  9. using namespace Larss;
  10.  
  11. MainWindow::MainWindow(QWidget *parent) :
  12. QMainWindow(parent),
  13. ui(new Ui::MainWindow)
  14. {
  15. ui->setupUi(this);
  16.  
  17. // Don't show the progressbar by default, it will be shown only if really useful
  18. hideProgressBar();
  19.  
  20. // Open the database, and create the directories for the data
  21. // storage if they are not yet present in the filesystem.
  22. QString location = QDesktopServices::storageLocation(QDesktopServices::DataLocation);
  23. if (!QFile::exists(location))
  24. QDir().mkpath(location);
  25. db = QSqlDatabase::addDatabase("QSQLITE");
  26. db.setDatabaseName(location + "/larss.db");
  27. db.open();
  28.  
  29. // Load feedModel that will wrap the SQLite database
  30. feedModel = new FeedModel(db, this);
  31. rssParser = new RssParser(db, feedModel, this);
  32.  
  33. // Create the delegate that counts unread posts.
  34. ui->feedTreeView->setModel(feedModel);
  35. ui->feedTreeView->setItemDelegate (new UnReadCountItemDelegate(feedModel, rssParser));
  36.  
  37. // Load the RSSParser, hiding the unnecessary columns and applying
  38. // some custom style :)
  39. ui->newsTableView->setModel(rssParser);
  40. ui->newsTableView->setColumnHidden(0, true); // ID
  41. ui->newsTableView->setColumnHidden(1, true); // Feed ID
  42. ui->newsTableView->setColumnHidden(3, true); // Link
  43. ui->newsTableView->setColumnHidden(4, true); // Description
  44. ui->newsTableView->setColumnHidden(5, true); // Content
  45. ui->newsTableView->setColumnHidden(7, true); // Read state
  46. ui->newsTableView->horizontalHeader()->setResizeMode(2, QHeaderView::Stretch);
  47. ui->newsTableView->horizontalHeader()->setResizeMode(6, QHeaderView::ResizeToContents);
  48. ui->newsTableView->setAlternatingRowColors(true);
  49.  
  50. // Show nothing for now.
  51. rssParser->setFilter("1 = 0");
  52.  
  53. poller = new FeedPoller (this, rssParser, feedModel);
  54. poller->connect(poller, SIGNAL(startLoadingFeed(QString)), this,
  55. SLOT(loadingFeedStart(QString)));
  56. poller->start();
  57.  
  58. // Install event filter to handle particular events, such as mouseclicks that
  59. // triggers original article loading.
  60. ui->webViewTitleLabel->installEventFilter(this);
  61. loadedNews = "";
  62.  
  63. // Give the window the right size, if present in the
  64. // settings.
  65. QSettings settings;
  66. if (settings.contains("width") && settings.contains("height"))
  67. {
  68. resize (settings.value("width").toInt(),
  69. settings.value("height").toInt());
  70. }
  71.  
  72. // Expand all the categories. This is will be like this until we do
  73. // not implement a decent method to store open/close categories on close.
  74. QStandardItem *rootItem = feedModel->invisibleRootItem();
  75. for(qint32 i = 0; i < rootItem->rowCount(); i++)
  76. {
  77. QModelIndex index = rootItem->child(i, 0)->index();
  78. ui->feedTreeView->expand(index);
  79. }
  80.  
  81. // Create the systray icon
  82. QIcon larssIcon(":larss32.png");
  83. systrayIcon = new QSystemTrayIcon (larssIcon);
  84. systrayIcon->show();
  85.  
  86. // Set the icon for the window.
  87. poller->connect(poller, SIGNAL(newElementsNotification(QString,QString)),
  88. this, SLOT(showNewElement(QString,QString)));
  89. }
  90.  
  91. MainWindow::~MainWindow()
  92. {
  93. db.close();
  94. delete systrayIcon;
  95. delete ui;
  96. delete feedModel;
  97. delete rssParser;
  98. delete poller;
  99. }
  100.  
  101. void
  102. MainWindow::loadingFeedStart(QString feedName)
  103. {
  104. ui->statusBar->showMessage(tr("Updating feed '%1'...").arg(feedName), 2000);
  105. }
  106.  
  107. void
  108. MainWindow::showNewElement(QString title, QString body)
  109. {
  110. systrayIcon->showMessage(title, body);
  111. }
  112.  
  113. void MainWindow::closeEvent(QCloseEvent *event)
  114. {
  115. Q_UNUSED(event);
  116. do_exit();
  117. }
  118.  
  119. void MainWindow::do_exit()
  120. {
  121. // Kill the poller
  122. poller->stopPolling();
  123. poller->wait();
  124.  
  125. // Save window size
  126. QSettings settings;
  127. settings.setValue("width", width());
  128. settings.setValue("height", height());
  129.  
  130. QApplication::exit();
  131. }
  132.  
  133. void MainWindow::on_actionExit_activated()
  134. {
  135. // Exit the application
  136. do_exit();
  137. }
  138.  
  139. void Larss::MainWindow::on_feedTreeView_clicked(const QModelIndex &index)
  140. {
  141. // Set the active filter
  142. quint64 feed_id;
  143. if ((feed_id = rssParser->getFeed (index)))
  144. {
  145. rssParser->selectActiveFeed(feed_id);
  146.  
  147. // Reset the title
  148. ui->webViewTitleLabel->setText("");
  149. }
  150.  
  151.  
  152. }
  153.  
  154. void Larss::MainWindow::on_newsTableView_clicked(const QModelIndex &index)
  155. {
  156. // A row got activated, so open it in the webview.
  157. loadFeed(index);
  158. }
  159.  
  160. void Larss::MainWindow::on_newsTableView_activated(const QModelIndex &index)
  161. {
  162. on_newsTableView_clicked(index);
  163. }
  164.  
  165. void Larss::MainWindow::on_actionAdd_Feed_triggered()
  166. {
  167. Larss::EditFeedDialog dialog(this, feedModel);
  168. if (dialog.exec() == QDialog::Accepted)
  169. {
  170. feedModel->addFeed(dialog.getFeedName(),
  171. dialog.getFeedUrl(), dialog.getCategory());
  172. }
  173. }
  174.  
  175. void Larss::MainWindow::on_actionAdd_Category_triggered()
  176. {
  177. Larss::EditCategoryDialog dialog(this);
  178. if (dialog.exec() == QDialog::Accepted)
  179. {
  180. feedModel->addCategory(dialog.getCategoryName());
  181. }
  182. }
  183.  
  184. bool Larss::MainWindow::eventFilter(QObject *object, QEvent *event)
  185. {
  186. if (object == ui->webViewTitleLabel)
  187. {
  188. if (event->type() == QEvent::MouseButtonPress)
  189. {
  190. QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
  191. if (mouseEvent->button() == Qt::LeftButton && loadedNews != "")
  192. {
  193. ui->webView->load(QUrl(loadedNews));
  194. }
  195. return true;
  196. }
  197. else
  198. return false;
  199. }
  200. else
  201. return QMainWindow::eventFilter(object, event);
  202.  
  203. }
  204.  
  205. void Larss::MainWindow::loadFeed(const QModelIndex& index)
  206. {
  207. quint64 rowNumber = index.row();
  208. loadedNews = rssParser->getLink(index);
  209. ui->webView->setHtml(rssParser->getContent(index));
  210.  
  211. // Select the right title
  212. ui->webViewTitleLabel->setText(QString("<b>%1</b>").arg(rssParser->getTitle (index)));
  213.  
  214. // And then mark it as read
  215. rssParser->setReadStatus(index, true);
  216. ui->newsTableView->selectRow(rowNumber);
  217. }
  218.  
  219. void Larss::MainWindow::on_actionNext_unread_news_triggered()
  220. {
  221. QModelIndex index = ui->newsTableView->selectionModel()->currentIndex();
  222. QItemSelection startingFeedSelection = ui->feedTreeView->selectionModel()->selection();
  223. int startingNewsRow = ui->newsTableView->currentIndex().row();
  224. QModelIndex feedIndex = ui->feedTreeView->currentIndex();
  225. QModelIndex categoryIndex;
  226. int startingCategoryRow;
  227. int nextUnread;
  228.  
  229. // Store the category or the index that is selected now, to be sure that after
  230. // a complete round searching for new items we don't begin one time more.
  231. FeedNode *selectedNode = feedModel->itemFromIndex(feedIndex);
  232. int categoriesNumber = feedModel->rowCount();
  233.  
  234. if (selectedNode->type() == FeedNode::Category)
  235. {
  236. startingCategoryRow = feedIndex.row();
  237.  
  238. // Search for a feed, not a category
  239. while (feedModel->rowCount(feedIndex) == 0)
  240. {
  241. // Step to the next category, since this is empty
  242. if (feedIndex.row() == categoriesNumber - 1)
  243. feedIndex = feedModel->index(0, 0);
  244. else
  245. feedIndex = feedModel->index(feedIndex.row() + 1, 0);
  246.  
  247. // Check if that was the starting category, in that case they are all empty
  248. // so simply do nothing
  249. if (feedIndex.row() == startingCategoryRow)
  250. {
  251. ui->feedTreeView->selectionModel()->select(startingFeedSelection, QItemSelectionModel::SelectCurrent);
  252. on_feedTreeView_clicked(ui->feedTreeView->currentIndex());
  253. ui->newsTableView->selectRow(startingNewsRow);
  254. loadFeed (ui->newsTableView->selectionModel()->currentIndex());
  255. return;
  256. }
  257. }
  258.  
  259. // Now we have a category with at least one child, so select id
  260. categoryIndex = feedIndex;
  261. feedIndex = feedIndex.child(0, 0);
  262. }
  263. else
  264. categoryIndex = feedIndex.parent();
  265.  
  266. // Store the row of the starting catogory
  267. startingCategoryRow = categoryIndex.row();
  268.  
  269. while ((nextUnread = rssParser->getNextUnread(index)) <= 0)
  270. {
  271. // If we have an invalid feedIndex return
  272. if (!feedIndex.isValid())
  273. {
  274. ui->feedTreeView->selectionModel()->select(startingFeedSelection, QItemSelectionModel::SelectCurrent);
  275. on_feedTreeView_clicked(ui->feedTreeView->currentIndex());
  276. ui->newsTableView->selectRow(startingNewsRow);
  277. loadFeed (ui->newsTableView->selectionModel()->currentIndex());
  278. return;
  279. }
  280.  
  281. // Check if there is a category next in which to step, if there
  282. // are no more feeds in this.
  283. if (feedIndex.row() == feedModel->rowCount(categoryIndex) - 1)
  284. {
  285. // Continue to iterate over categories while we found a non
  286. // empty one OR we arrive to the starting one.
  287. do
  288. {
  289. if (categoryIndex.row() < feedModel->rowCount())
  290. categoryIndex = feedModel->index(categoryIndex.row() + 1, 0);
  291. else
  292. categoryIndex = feedModel->index(0, 0);
  293. } while (feedModel->rowCount(categoryIndex) == 0 &&
  294. categoryIndex.row() != startingCategoryRow);
  295.  
  296. // We have done a complete round
  297. if (categoryIndex.row() == startingCategoryRow)
  298. {
  299. ui->feedTreeView->selectionModel()->select(startingFeedSelection, QItemSelectionModel::SelectCurrent);
  300. on_feedTreeView_clicked(ui->feedTreeView->currentIndex());
  301. ui->newsTableView->selectRow(startingNewsRow);
  302. loadFeed (ui->newsTableView->selectionModel()->currentIndex());
  303. return;
  304. }
  305.  
  306. // Got the Feed and select the first element.
  307. feedIndex = categoryIndex.child(0, 0);
  308. }
  309. else
  310. {
  311. // Otherwise step to the next feed
  312. feedIndex = categoryIndex.child(feedIndex.row() + 1, 0);
  313. }
  314.  
  315. ui->feedTreeView->selectionModel()->select(QItemSelection(feedIndex, feedIndex), QItemSelectionModel::SelectCurrent);
  316. on_feedTreeView_clicked(feedIndex);
  317. index = rssParser->index(0, 0);
  318.  
  319. // This feed may be unread, so in that case, read it.
  320. if (rssParser->record(index.row()).value("read").toInt() == 0)
  321. {
  322. ui->newsTableView->selectRow(0);
  323. loadFeed(index);
  324. return;
  325. }
  326. }
  327.  
  328. // Selec the next unread news in the feed.
  329. if (nextUnread > 0)
  330. {
  331. ui->newsTableView->selectRow(nextUnread);
  332. loadFeed (ui->newsTableView->selectionModel()->currentIndex());
  333. }
  334. }
  335.  
  336.  
  337. void Larss::MainWindow::on_actionUpdate_this_feed_triggered()
  338. {
  339. QModelIndex index = ui->feedTreeView->selectionModel()->currentIndex();
  340. if (index.isValid())
  341. {
  342. poller->queueWork(index);
  343. }
  344. }
  345.  
  346. void Larss::MainWindow::on_feedTreeView_customContextMenuRequested(const QPoint &pos)
  347. {
  348. QModelIndex index = ui->feedTreeView->indexAt(pos);
  349. if (index.isValid())
  350. {
  351. // Check if this is a category or not.
  352. FeedNode *node = feedModel->itemFromIndex(index);
  353.  
  354. QMenu popupMenu (this);
  355.  
  356. if (node->type() == FeedNode::Feed)
  357. {
  358. popupMenu.addAction(tr("Update"), this, SLOT(on_actionUpdate_this_feed_triggered()));
  359. popupMenu.addAction(tr("Remove"), this,
  360. SLOT(removeSelectedFeed()));
  361. }
  362. else if (node->type() == FeedNode::Category)
  363. {
  364. popupMenu.addAction(tr("Remove"), this,
  365. SLOT(removeSelectedCategory()));
  366. }
  367.  
  368. popupMenu.exec(ui->feedTreeView->mapToGlobal(pos));
  369. }
  370. }
  371.  
  372. void Larss::MainWindow::removeSelectedFeed()
  373. {
  374. QModelIndex index = ui->feedTreeView->currentIndex();
  375.  
  376. // We need to remove all the feeds from that category
  377. rssParser->removeNewsForFeed(index);
  378.  
  379. // And then remove the feed itself.
  380. feedModel->removeElement(index.row(), index.parent());
  381. }
  382.  
  383. void Larss::MainWindow::removeSelectedCategory()
  384. {
  385. // Check that the category is empty before removing it
  386. QModelIndex index = ui->feedTreeView->currentIndex();
  387. if (feedModel->rowCount(index) > 0)
  388. {
  389. QMessageBox messageBox;
  390. messageBox.setText("Impossible to remove category");
  391. messageBox.setInformativeText("Please remove feeds in this category before trying to remove it.");
  392.  
  393. messageBox.exec ();
  394. }
  395. else
  396. {
  397. feedModel->removeElement(index.row());
  398. }
  399. }
  400.  
  401. void Larss::MainWindow::hideProgressBar()
  402. {
  403. ui->webProgressBar->setHidden(true);
  404. }
  405.  
  406. void Larss::MainWindow::showProgressBar()
  407. {
  408. ui->webProgressBar->setHidden(false);
  409. return;
  410. }
  411.  
  412. void Larss::MainWindow::on_webView_loadFinished(bool arg1)
  413. {
  414. Q_UNUSED(arg1);
  415.  
  416. hideProgressBar();
  417. ui->webProgressBar->setValue(0);
  418. }
  419.  
  420. void Larss::MainWindow::on_webView_loadStarted()
  421. {
  422. showProgressBar();
  423. }