Account settings: add a button to show the context menu #3584

This commit is contained in:
Olivier Goffart 2015-08-13 12:33:20 +02:00
parent b49e9e8f30
commit f32c8d0570
3 changed files with 41 additions and 0 deletions

View file

@ -172,6 +172,14 @@ void AccountSettings::slotFolderActivated( const QModelIndex& indx )
slotAddFolder(); slotAddFolder();
return; return;
} }
if (_model->classify(indx) == FolderStatusModel::RootFolder) {
// tries to find if we clicked on the '...' button.
QTreeView *tv = ui->_folderList;
auto pos = tv->mapFromGlobal(QCursor::pos());
if (FolderStatusDelegate::optionsButtonRect(tv->visualRect(indx)).contains(pos)) {
slotCustomContextMenuRequested(pos);
}
}
} }
void AccountSettings::slotAddFolder() void AccountSettings::slotAddFolder()

View file

@ -323,6 +323,16 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
} }
painter->restore(); painter->restore();
{
QStyleOptionToolButton btnOpt;
btnOpt.text = QLatin1String("...");
btnOpt.state = option.state;
btnOpt.state &= ~(QStyle::State_Selected | QStyle::State_HasFocus);
btnOpt.state |= QStyle::State_Raised;
btnOpt.rect = optionsButtonRect(option.rect);
QApplication::style()->drawComplexControl( QStyle::CC_ToolButton, &btnOpt, painter );
}
} }
bool FolderStatusDelegate::editorEvent ( QEvent * event, QAbstractItemModel * model, bool FolderStatusDelegate::editorEvent ( QEvent * event, QAbstractItemModel * model,
@ -331,4 +341,21 @@ bool FolderStatusDelegate::editorEvent ( QEvent * event, QAbstractItemModel * mo
return QStyledItemDelegate::editorEvent(event, model, option, index); return QStyledItemDelegate::editorEvent(event, model, option, index);
} }
QRect FolderStatusDelegate::optionsButtonRect(const QRect &within)
{
QStyleOptionToolButton opt;
opt.text = QLatin1String("...");
QFontMetrics fm = QFontMetrics(QFont());
QSize textSize = fm.size(Qt::TextShowMnemonic, opt.text);
opt.rect.setSize(textSize);
QSize size = QApplication::style()->sizeFromContents(QStyle::CT_ToolButton, &opt, textSize).
expandedTo(QApplication::globalStrut());
int margin = QApplication::style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing);
return QRect(QPoint(within.right() - size.width() - margin,
within.top() + within.height()/2 - size.height()/2),
size);
}
} // namespace OCC } // namespace OCC

View file

@ -51,6 +51,12 @@ public:
QSize sizeHint( const QStyleOptionViewItem&, const QModelIndex& ) const Q_DECL_OVERRIDE; QSize sizeHint( const QStyleOptionViewItem&, const QModelIndex& ) const Q_DECL_OVERRIDE;
bool editorEvent( QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, bool editorEvent( QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option,
const QModelIndex& index ) Q_DECL_OVERRIDE; const QModelIndex& index ) Q_DECL_OVERRIDE;
/**
* return the position of the option button within the item
*/
static QRect optionsButtonRect(const QRect &within);
private: private:
static QString addFolderText(); static QString addFolderText();
}; };