[Companion][MixersListWidget] Enable multiple selection capability on Inputs and Mixes editors (closes #5029); Fix bug with custom style propagation; cosmetics.

This commit is contained in:
Max Paperno
2018-06-05 03:34:42 -04:00
parent 5302254462
commit 0a4ca595ed
2 changed files with 19 additions and 12 deletions
+15 -9
View File
@@ -20,6 +20,14 @@
#include "mixerslistwidget.h"
#include <QAbstractTextDocumentLayout>
#include <QAction>
#include <QApplication>
#include <QDropEvent>
#include <QMimeData>
#include <QPainter>
#include <QTextFrame>
#define GRP_IS_PARENT 0x01
#define GRP_HAS_SIBLING 0x02
#define GRP_HAS_DATA 0x04
@@ -44,14 +52,14 @@ MixersListWidget::MixersListWidget(QWidget * parent, bool expo) :
setFont(defaultFont);
setContextMenuPolicy(Qt::CustomContextMenu);
setSelectionMode(QAbstractItemView::SingleSelection);
setSelectionMode(QAbstractItemView::ExtendedSelection);
setSelectionBehavior(QAbstractItemView::SelectRows);
setDragEnabled(true);
setAcceptDrops(true);
setDragDropMode(QAbstractItemView::DragDrop);
setDropIndicatorShown(true);
setItemDelegate(new MixersDelegate(this)); // set custom paint handler
setStyle(new MixerItemViewProxyStyle(style())); // custom element style painter
setStyle(new MixerItemViewProxyStyle()); // custom element style painter
itemMimeFmt = (expo ? "application/x-companion-expo-item" : "application/x-companion-mix-item");
@@ -186,8 +194,7 @@ void MixersDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option
options.text.clear();
QAbstractTextDocumentLayout::PaintContext ctx;
if (options.widget)
ctx.palette = options.widget->palette();
ctx.palette = (options.widget ? options.widget->palette() : QApplication::palette("QListWidgetItem"));
QBrush brush = ((index.data(GroupIdRole).toUInt() % 2) ? ctx.palette.base() : ctx.palette.alternateBase());
options.backgroundBrush = brush;
@@ -206,17 +213,16 @@ void MixersDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option
QStyle * style = (options.widget ? options.widget->style() : QApplication::style());
style->drawControl(QStyle::CE_ItemViewItem, &options, painter, options.widget);
QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &options);
QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &options, options.widget);
#ifdef Q_OS_LINUX
// Workaround for buggy Linux native styles (https://github.com/opentx/opentx/issues/5633)
if (options.widget && textRect.width() < options.widget->geometry().width() * 0.75f)
if (options.widget && textRect.width() < options.widget->geometry().width() / 2)
textRect.setWidth(options.widget->geometry().width());
#endif
QRectF clipRect = textRect.translated(-textRect.topLeft());
ctx.clip = clipRect;
ctx.clip = textRect.translated(-textRect.topLeft());
painter->save();
painter->translate(textRect.topLeft());
painter->setClipRect(clipRect);
painter->setClipRect(ctx.clip);
doc.documentLayout()->draw(painter, ctx);
painter->restore();
}
+4 -3
View File
@@ -21,10 +21,11 @@
#ifndef _MIXERSLISTWIDGET_H_
#define _MIXERSLISTWIDGET_H_
#include <QtWidgets>
#include <QListWidget>
#include <QProxyStyle>
#include <QStyleOption>
#include <QStyledItemDelegate>
#include <QTextDocument>
class MixersListWidget : public QListWidget
{
@@ -78,9 +79,9 @@ class MixersDelegate : public QStyledItemDelegate
class MixerItemViewProxyStyle: public QProxyStyle
{
public:
explicit MixerItemViewProxyStyle(QStyle * style = 0) : QProxyStyle(style) {}
explicit MixerItemViewProxyStyle(QStyle * style = nullptr) : QProxyStyle(style) {}
void drawPrimitive(PrimitiveElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget = 0) const;
virtual void drawPrimitive(PrimitiveElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget = nullptr) const override;
};
#endif // _MIXERSLISTWIDGET_H_