Browse Source

Fix execution log lines selection and copying

adaptive-webui-19844
Christophe Dumez 13 years ago
parent
commit
6606cf60af
  1. 1
      Changelog
  2. 29
      src/executionlog.cpp
  3. 5
      src/executionlog.h
  4. 24
      src/executionlog.ui
  5. 89
      src/loglistwidget.cpp
  6. 60
      src/loglistwidget.h
  7. 7
      src/src.pro

1
Changelog

@ -5,6 +5,7 @@ @@ -5,6 +5,7 @@
- FEATURE: Add support for anonymous mode (libtorrent >= v0.16)
- FEATURE: Add quick "set as default save path" checkbox to torrent addition dialog (sledgehammer999)
- BUGFIX: Add tray menu entry for toggling window visibility
- BUGFIX: Fix execution log lines selection and copying
- COSMETIC: Display speed at the beginning of the Window title
- OTHER: Display libraries versions in about dialog (sledgehammer999)

29
src/executionlog.cpp

@ -34,14 +34,21 @@ @@ -34,14 +34,21 @@
#include "ui_executionlog.h"
#include "qbtsession.h"
#include "iconprovider.h"
#include "loglistwidget.h"
ExecutionLog::ExecutionLog(QWidget *parent) :
QWidget(parent),
ui(new Ui::ExecutionLog)
ui(new Ui::ExecutionLog),
m_logList(new LogListWidget(MAX_LOG_MESSAGES)),
m_banList(new LogListWidget(MAX_LOG_MESSAGES))
{
ui->setupUi(this);
ui->tabConsole->setTabIcon(0, IconProvider::instance()->getIcon("view-calendar-journal"));
ui->tabConsole->setTabIcon(1, IconProvider::instance()->getIcon("view-filter"));
ui->tabGeneral->layout()->addWidget(m_logList);
ui->tabBan->layout()->addWidget(m_banList);
const QStringList log_msgs = QBtSession::instance()->getConsoleMessages();
foreach(const QString& msg, log_msgs)
addLogMessage(msg);
@ -54,29 +61,17 @@ ExecutionLog::ExecutionLog(QWidget *parent) : @@ -54,29 +61,17 @@ ExecutionLog::ExecutionLog(QWidget *parent) :
ExecutionLog::~ExecutionLog()
{
delete m_logList;
delete m_banList;
delete ui;
}
void ExecutionLog::addLogMessage(const QString &msg)
{
QListWidgetItem *item = new QListWidgetItem;
QLabel *lbl = new QLabel(msg);
lbl->setContentsMargins(4, 2, 4, 2);
item->setSizeHint(lbl->sizeHint());
ui->logList->insertItem(0, item);
ui->logList->setItemWidget(item, lbl);
if(ui->logList->count() > MAX_LOG_MESSAGES)
delete ui->logList->takeItem(ui->logList->count()-1);
m_logList->appendLine(msg);
}
void ExecutionLog::addBanMessage(const QString &msg)
{
QListWidgetItem *item = new QListWidgetItem;
QLabel *lbl = new QLabel(msg);
lbl->setContentsMargins(4, 2, 4, 2);
item->setSizeHint(lbl->sizeHint());
ui->banList->insertItem(0, item);
ui->banList->setItemWidget(item, lbl);
if(ui->banList->count() > MAX_LOG_MESSAGES)
delete ui->banList->takeItem(ui->banList->count()-1);
m_banList->appendLine(msg);
}

5
src/executionlog.h

@ -37,6 +37,7 @@ QT_BEGIN_NAMESPACE @@ -37,6 +37,7 @@ QT_BEGIN_NAMESPACE
namespace Ui {
class ExecutionLog;
}
class LogListWidget;
QT_END_NAMESPACE
class ExecutionLog : public QWidget
@ -53,6 +54,10 @@ public slots: @@ -53,6 +54,10 @@ public slots:
private:
Ui::ExecutionLog *ui;
LogListWidget *m_logList;
LogListWidget *m_banList;
int m_maxLines;
};
#endif // EXECUTIONLOG_H

24
src/executionlog.ui

@ -22,33 +22,17 @@ @@ -22,33 +22,17 @@
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab">
<widget class="QWidget" name="tabGeneral">
<attribute name="title">
<string>General</string>
</attribute>
<layout class="QVBoxLayout">
<item>
<widget class="QListWidget" name="logList">
<property name="alternatingRowColors">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
<layout class="QVBoxLayout"/>
</widget>
<widget class="QWidget" name="tab_2">
<widget class="QWidget" name="tabBan">
<attribute name="title">
<string>Blocked IPs</string>
</attribute>
<layout class="QVBoxLayout" name="_2">
<item>
<widget class="QListWidget" name="banList">
<property name="alternatingRowColors">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
<layout class="QVBoxLayout" name="_2"/>
</widget>
</widget>
</item>

89
src/loglistwidget.cpp

@ -0,0 +1,89 @@ @@ -0,0 +1,89 @@
/*
* Bittorrent Client using Qt4 and libtorrent.
* Copyright (C) 2011 Christophe Dumez
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* In addition, as a special exception, the copyright holders give permission to
* link this program with the OpenSSL project's "OpenSSL" library (or with
* modified versions of it that use the same license as the "OpenSSL" library),
* and distribute the linked executables. You must obey the GNU General Public
* License in all respects for all of the code used other than "OpenSSL". If you
* modify file(s), you may extend this exception to your version of the file(s),
* but you are not obligated to do so. If you do not wish to do so, delete this
* exception statement from your version.
*
* Contact : chris@qbittorrent.org
*/
#include <QKeyEvent>
#include <QApplication>
#include <QClipboard>
#include <QListWidgetItem>
#include <QLabel>
#include <QRegExp>
#include <QAction>
#include "loglistwidget.h"
#include "iconprovider.h"
LogListWidget::LogListWidget(int max_lines, QWidget *parent) :
QListWidget(parent),
m_maxLines(max_lines)
{
// Allow multiple selections
setSelectionMode(QAbstractItemView::ExtendedSelection);
// Context menu
QAction *copyAct = new QAction(IconProvider::instance()->getIcon("edit-copy"), tr("Copy"), this);
connect(copyAct, SIGNAL(triggered()), SLOT(copySelection()));
addAction(copyAct);
setContextMenuPolicy(Qt::ActionsContextMenu);
}
void LogListWidget::keyPressEvent(QKeyEvent *event)
{
if (event->matches(QKeySequence::Copy)) {
copySelection();
return;
}
if (event->matches(QKeySequence::SelectAll)) {
selectAll();
return;
}
}
void LogListWidget::appendLine(const QString &line)
{
QListWidgetItem *item = new QListWidgetItem(this);
// We need to use QLabel here to support rich text
QLabel *lbl = new QLabel(line);
lbl->setContentsMargins(4, 2, 4, 2);
item->setSizeHint(lbl->sizeHint());
insertItem(0, item);
setItemWidget(item, lbl);
const int nbLines = count();
// Limit log size
if(nbLines > m_maxLines)
delete takeItem(nbLines - 1);
}
void LogListWidget::copySelection()
{
static QRegExp html_tag("<[^>]+>");
QList<QListWidgetItem*> items = selectedItems();
QStringList strings;
foreach(QListWidgetItem* it, items)
strings << static_cast<QLabel*>(itemWidget(it))->text().replace(html_tag, "");
QApplication::clipboard()->setText(strings.join("\n"));
}

60
src/loglistwidget.h

@ -0,0 +1,60 @@ @@ -0,0 +1,60 @@
/*
* Bittorrent Client using Qt4 and libtorrent.
* Copyright (C) 2011 Christophe Dumez
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* In addition, as a special exception, the copyright holders give permission to
* link this program with the OpenSSL project's "OpenSSL" library (or with
* modified versions of it that use the same license as the "OpenSSL" library),
* and distribute the linked executables. You must obey the GNU General Public
* License in all respects for all of the code used other than "OpenSSL". If you
* modify file(s), you may extend this exception to your version of the file(s),
* but you are not obligated to do so. If you do not wish to do so, delete this
* exception statement from your version.
*
* Contact : chris@qbittorrent.org
*/
#ifndef LOGLISTWIDGET_H
#define LOGLISTWIDGET_H
#include <QListWidget>
QT_BEGIN_NAMESPACE
class QKeyEvent;
QT_END_NAMESPACE
class LogListWidget : public QListWidget
{
Q_OBJECT
public:
explicit LogListWidget(int max_lines = 100, QWidget *parent = 0);
public slots:
void appendLine(const QString &line);
protected slots:
void copySelection();
protected:
void keyPressEvent(QKeyEvent *event);
private:
int m_maxLines;
};
#endif // LOGLISTWIDGET_H

7
src/src.pro

@ -104,6 +104,7 @@ HEADERS += misc.h \ @@ -104,6 +104,7 @@ HEADERS += misc.h \
smtp.h \
dnsupdater.h
SOURCES += main.cpp \
downloadthread.cpp \
scannedfoldersmodel.cpp \
@ -135,7 +136,8 @@ nox { @@ -135,7 +136,8 @@ nox {
torrentimportdlg.h \
executionlog.h \
iconprovider.h \
updownratiodlg.h
updownratiodlg.h \
loglistwidget.h
SOURCES += mainwindow.cpp \
ico.cpp \
@ -146,7 +148,8 @@ nox { @@ -146,7 +148,8 @@ nox {
executionlog.cpp \
previewselect.cpp \
iconprovider.cpp \
updownratiodlg.cpp
updownratiodlg.cpp \
loglistwidget.cpp
win32 {
HEADERS += programupdater.h

Loading…
Cancel
Save