header()->hideSection(1);
expandAll();
+ setAnimated(true);
+
setDragEnabled(true);
setAcceptDrops(true);
setDropIndicatorShown(true);
BufferViewFilter *filter = new BufferViewFilter(model, mode, nets);
setModel(filter);
connect(this, SIGNAL(eventDropped(QDropEvent *)), filter, SLOT(dropEvent(QDropEvent *)));
- //connect(this, SIGNAL(dragEnter()), filter, SLOT(enterDrag()));
- //connect(this, SIGNAL(dragLeave()), filter, SLOT(leaveDrag()));
+ connect(this, SIGNAL(removeBuffer(const QModelIndex &)), filter, SLOT(removeBuffer(const QModelIndex &)));
}
void BufferView::setModel(QAbstractItemModel *model) {
}
void BufferView::dropEvent(QDropEvent *event) {
- if(event->source() == this) {
- // this is either a merge or a sort operation...
- // currently only merges are supported
- } else {
+ if(event->source() != this) {
+ // another view(?) or widget is the source. maybe it's a drag 'n drop
+ // view customization -> we tell our friend the filter:
emit eventDropped(event);
}
+ // in the case that the filter did not accept the event or if it's a merge
QTreeView::dropEvent(event);
-
}
-/*
- done prettier now..
-// dragEnterEvent and dragLeaveEvent are needed to keep track of the active
-// view when customizing them via drag and drop
-void BufferView::dragEnterEvent(QDragEnterEvent *event) {
- emit dragEnter();
- QTreeView::dragEnterEvent(event);
-}
-
-void BufferView::dragLeaveEvent(QDragLeaveEvent *event) {
- emit dragLeave();
- QTreeView::dragLeaveEvent(event);
+void BufferView::keyPressEvent(QKeyEvent *event) {
+ if(event->key() == Qt::Key_Backspace || event->key() == Qt::Key_Delete) {
+ event->accept();
+ QModelIndex index = selectionModel()->selectedIndexes().first();
+ if(index.isValid()) {
+ emit removeBuffer(index);
+ }
+ }
+ QTreeView::keyPressEvent(event);
}
-*/
// ensure that newly inserted network nodes are expanded per default
void BufferView::rowsInserted(const QModelIndex & parent, int start, int end) {
- if(parent.parent() == QModelIndex()) setExpanded(parent, true);
+ if(parent == QModelIndex())
+ setExpanded(model()->index(start, 0, parent), true);
QTreeView::rowsInserted(parent, start, end);
}
void setModel(QAbstractItemModel *model);
void setFilteredModel(QAbstractItemModel *model, BufferViewFilter::Modes mode, QStringList nets);
- //void dragEnterEvent(QDragEnterEvent *);
- //void dragLeaveEvent(QDragLeaveEvent *);
-
public slots:
void select(const QModelIndex &);
signals:
void eventDropped(QDropEvent *);
+ void removeBuffer(const QModelIndex &);
void selectionChanged(const QModelIndex &, QItemSelectionModel::SelectionFlags);
- //void dragEnter();
- //void dragLeave();
protected:
void dropEvent(QDropEvent *);
+ void keyPressEvent(QKeyEvent *);
void rowsInserted (const QModelIndex & parent, int start, int end);
};
emit doubleClicked(mapToSource(clicked));
}
-/*
-void BufferViewFilter::enterDrag() {
- connect(sourceModel(), SIGNAL(addBuffer(const uint &, const QString &)),
- this, SLOT(addBuffer(const uint &, const QString &)));
-}
-
-void BufferViewFilter::leaveDrag() {
- disconnect(sourceModel(), SIGNAL(addBuffer(const uint &, const QString &)),
- this, SLOT(addBuffer(const uint &, const QString &)));
-}
-*/
-
void BufferViewFilter::dropEvent(QDropEvent *event) {
const QMimeData *data = event->mimeData();
+ if(!(mode & FullCustom))
+ return; // only custom buffers can be customized... obviously... :)
+
if(!(data->hasFormat("application/Quassel/BufferItem/row")
&& data->hasFormat("application/Quassel/BufferItem/network")
&& data->hasFormat("application/Quassel/BufferItem/bufferId")))
return; // whatever the drop is... it's not a buffer...
event->accept();
- uint bufferid = data->data("application/Quassel/BufferItem/bufferId").toUInt();
- QString network = QString::fromUtf8(data->data("application/Quassel/BufferItem/network"));
- addBuffer(bufferid, network);
+ uint bufferuid = data->data("application/Quassel/BufferItem/bufferId").toUInt();
+ QString networkname = QString::fromUtf8("application/Quassel/BufferItem/network");
+
+ for(int rowid = 0; rowid < rowCount(); rowid++) {
+ QModelIndex networkindex = index(rowid, 0);
+ if(networkindex.data(Qt::DisplayRole) == networkname) {
+ addBuffer(bufferuid);
+ return;
+ }
+ }
+ beginInsertRows(QModelIndex(), rowCount(), rowCount());
+ addBuffer(bufferuid);
+ endInsertRows();
}
-void BufferViewFilter::addBuffer(const uint &bufferuid, const QString &network) {
- if(!networks.contains(network)) {
- networks << network;
- }
-
+void BufferViewFilter::addBuffer(const uint &bufferuid) {
if(!customBuffers.contains(bufferuid)) {
customBuffers << bufferuid;
invalidateFilter();
}
+}
+
+void BufferViewFilter::removeBuffer(const QModelIndex &index) {
+ if(!(mode & FullCustom))
+ return; // only custom buffers can be customized... obviously... :)
+
+ if(index.parent() == QModelIndex())
+ return; // only child elements can be deleted
+
+ uint bufferuid = index.data(BufferTreeModel::BufferIdRole).toUInt();
+ if(customBuffers.contains(bufferuid)) {
+ beginRemoveRows(index.parent(), index.row(), index.row());
+ customBuffers.removeAt(customBuffers.indexOf(bufferuid));
+ endRemoveRows();
+ invalidateFilter();
+ }
}
+
bool BufferViewFilter::filterAcceptBuffer(const QModelIndex &source_bufferIndex) const {
Buffer::Type bufferType = (Buffer::Type) source_bufferIndex.data(BufferTreeModel::BufferTypeRole).toInt();
if((mode & NoChannels) && bufferType == Buffer::ChannelBuffer) return false;
bool BufferViewFilter::filterAcceptNetwork(const QModelIndex &source_index) const {
QString net = source_index.data(Qt::DisplayRole).toString();
- if((mode & SomeNets) && !networks.contains(net))
+ if((mode & SomeNets) && !networks.contains(net)) {
return false;
- else
+ } else if(mode & FullCustom) {
+ // let's check if we got a child that want's to show off
+ int childcount = sourceModel()->rowCount(source_index);
+ for(int rowid = 0; rowid < childcount; rowid++) {
+ QModelIndex child = sourceModel()->index(rowid, 0, source_index);
+ uint bufferuid = child.data(BufferTreeModel::BufferIdRole).toUInt();
+ if(customBuffers.contains(bufferuid))
+ return true;
+ }
+ return false;
+ } else {
return true;
+ }
}
bool BufferViewFilter::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const {
}
bool BufferViewFilter::lessThan(const QModelIndex &left, const QModelIndex &right) {
+ // pretty interesting stuff here, eh?
return QSortFilterProxyModel::lessThan(left, right);
}
void changeCurrent(const QModelIndex &, const QModelIndex &);
void doubleClickReceived(const QModelIndex &);
void select(const QModelIndex &);
- //void enterDrag();
- //void leaveDrag();
void dropEvent(QDropEvent *);
+ void removeBuffer(const QModelIndex &);
+
signals:
void currentChanged(const QModelIndex &, const QModelIndex &);
bool filterAcceptNetwork(const QModelIndex &) const;
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;
bool lessThan(const QModelIndex &, const QModelIndex &);
- void addBuffer(const uint &, const QString &);
+ void addBuffer(const uint &);
Modes mode;
QStringList networks;
public:
BufferViewWidget(QWidget *parent = 0);
virtual QSize sizeHint () const;
- BufferView *treeView() { return ui.treeView; }
+ BufferView *treeView(){ return ui.treeView; }
private:
Ui::BufferViewWidget ui;
MainWin::MainWin() : QMainWindow() {
ui.setupUi(this);
+
//widget = 0;
//qDebug() << "Available DB drivers: " << QSqlDatabase::drivers ();
setWindowTitle("Quassel IRC");
//workspace = new QWorkspace(this);
//setCentralWidget(workspace);
statusBar()->showMessage(tr("Waiting for core..."));
+
}
void MainWin::init() {
BufferTreeModel *model = Client::bufferModel(); // FIXME Where is the delete for that? :p
connect(model, SIGNAL(bufferSelected(Buffer *)), this, SLOT(showBuffer(Buffer *)));
- //connect(this, SIGNAL(bufferSelected(Buffer *)), model, SLOT(selectBuffer(Buffer *)));
- //connect(this, SIGNAL(bufferUpdated(Buffer *)), model, SLOT(bufferUpdated(Buffer *)));
- //connect(this, SIGNAL(bufferActivity(Buffer::ActivityLevel, Buffer *)), model, SLOT(bufferActivity(Buffer::ActivityLevel, Buffer *)));
- BufferViewDock *all = new BufferViewDock(model, tr("All Buffers"), BufferViewFilter::AllNets, QStringList(), this);
- registerBufferViewDock(all);
+ addBufferView(tr("All Buffers"), model, BufferViewFilter::AllNets, QStringList());
+ addBufferView(tr("All Channels"), model, BufferViewFilter::AllNets|BufferViewFilter::NoQueries|BufferViewFilter::NoServers, QStringList());
+ addBufferView(tr("All Queries"), model, BufferViewFilter::AllNets|BufferViewFilter::NoChannels|BufferViewFilter::NoServers, QStringList());
+ addBufferView(tr("All Networks"), model, BufferViewFilter::AllNets|BufferViewFilter::NoChannels|BufferViewFilter::NoQueries, QStringList());
+ addBufferView(tr("Full Custom"), model, BufferViewFilter::FullCustom, QStringList());
- BufferViewDock *allchans = new BufferViewDock(model, tr("All Channels"), BufferViewFilter::AllNets|BufferViewFilter::NoQueries|BufferViewFilter::NoServers, QStringList(), this);
- registerBufferViewDock(allchans);
-
- BufferViewDock *allqrys = new BufferViewDock(model, tr("All Queries"), BufferViewFilter::AllNets|BufferViewFilter::NoChannels|BufferViewFilter::NoServers, QStringList(), this);
- registerBufferViewDock(allqrys);
-
-
- BufferViewDock *allnets = new BufferViewDock(model, tr("All Networks"), BufferViewFilter::AllNets|BufferViewFilter::NoChannels|BufferViewFilter::NoQueries, QStringList(), this);
- registerBufferViewDock(allnets);
-
- BufferViewDock *fullCustom = new BufferViewDock(model, tr("Full Custom"), BufferViewFilter::FullCustom|BufferViewFilter::SomeNets, QStringList(), this);
- registerBufferViewDock(fullCustom);
-
ui.menuViews->addSeparator();
}
-void MainWin::registerBufferViewDock(BufferViewDock *dock) {
- addDockWidget(Qt::LeftDockWidgetArea, dock);
+void MainWin::addBufferView(const QString &viewname, QAbstractItemModel *model, const BufferViewFilter::Modes &mode, const QStringList &nets) {
+ QDockWidget *dock = new QDockWidget(viewname, this);
+ dock->setObjectName(QString("ViewDock-" + viewname)); // should be unique for mainwindow state!
dock->setAllowedAreas(Qt::RightDockWidgetArea|Qt::LeftDockWidgetArea);
- netViews.append(dock);
+ //dock->setContentsMargins(4,4,4,4);
+
+ //create the view and initialize it's filter
+ BufferView *view = new BufferView(dock);
+ view->setFilteredModel(model, mode, nets);
+ dock->setWidget(view);
+
+ addDockWidget(Qt::LeftDockWidgetArea, dock);
ui.menuViews->addAction(dock->toggleViewAction());
- /*
- connect(this, SIGNAL(bufferSelected(Buffer *)), view, SLOT(selectBuffer(Buffer *)));
- connect(this, SIGNAL(bufferDestroyed(Buffer *)), view, SLOT(bufferDestroyed(Buffer *)));
- connect(view, SIGNAL(bufferSelected(Buffer *)), this, SLOT(showBuffer(Buffer *)));
- view->setBuffers(buffers.values());
- */
+ netViews.append(dock);
}
AbstractUiMsg *MainWin::layoutMsg(const Message &msg) {
currentBuffer = b->bufferId().groupId();
//emit bufferSelected(b);
//qApp->processEvents();
+
ui.bufferWidget->setBuffer(b);
//emit bufferSelected(b);
}
#include "message.h"
#include "chatwidget.h"
#include "bufferviewfilter.h"
-#include "bufferviewwidget.h"
+#include "bufferview.h"
class ServerListDlg;
class CoreConnectDlg;
-//class BufferViewDock;
class Buffer;
-class BufferWidget;
class SettingsDlg;
//!\brief The main window and central object of Quassel GUI.
virtual ~MainWin();
void init();
- void registerBufferViewDock(BufferViewDock *);
+ void addBufferView(const QString &, QAbstractItemModel *, const BufferViewFilter::Modes &, const QStringList &);
AbstractUiMsg *layoutMsg(const Message &);
uint currentBuffer;
- QList<BufferViewDock *> netViews;
+ QList<QDockWidget *> netViews;
};