annotate src/squeezedlabel.cpp @ 545:3944da037ab8 fswatcher

stderr -> stdErr to avoid name conflicts with possible stderr macro in system headers
author Chris Cannam
date Tue, 14 Feb 2012 17:41:43 +0000
parents d869e6a18f63
children 533519ebc0cb
rev   line source
Chris@523 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@523 2
Chris@523 3 /*
Chris@523 4 EasyMercurial
Chris@523 5
Chris@523 6 Based on HgExplorer by Jari Korhonen
Chris@523 7 Copyright (c) 2010 Jari Korhonen
Chris@523 8 Copyright (c) 2011 Chris Cannam
Chris@523 9 Copyright (c) 2011 Queen Mary, University of London
Chris@523 10
Chris@523 11 This program is free software; you can redistribute it and/or
Chris@523 12 modify it under the terms of the GNU General Public License as
Chris@523 13 published by the Free Software Foundation; either version 2 of the
Chris@523 14 License, or (at your option) any later version. See the file
Chris@523 15 COPYING included with this distribution for more information.
Chris@523 16 */
Chris@523 17
Chris@523 18 /*
Chris@523 19 This file adapted from Rosegarden, a sequencer and musical
Chris@523 20 notation editor. Copyright 2000-2011 the Rosegarden development
Chris@523 21 team.
Chris@523 22
Chris@523 23 Adapted from KDE 4.2.0, this code originally Copyright (c) 2000
Chris@523 24 Ronny Standtke.
Chris@523 25 */
Chris@523 26
Chris@523 27 #include "squeezedlabel.h"
Chris@523 28
Chris@523 29 #include <iostream>
Chris@523 30
Chris@523 31 #include <QContextMenuEvent>
Chris@523 32 #include <QAction>
Chris@523 33 #include <QMenu>
Chris@523 34 #include <QClipboard>
Chris@523 35 #include <QApplication>
Chris@523 36 #include <QMimeData>
Chris@523 37 #include <QDesktopWidget>
Chris@523 38
Chris@523 39
Chris@523 40 class SqueezedLabelPrivate
Chris@523 41 {
Chris@523 42 public:
Chris@523 43 };
Chris@523 44
Chris@523 45 void SqueezedLabel::_k_copyFullText()
Chris@523 46 {
Chris@523 47 QMimeData* data = new QMimeData;
Chris@523 48 data->setText(fullText);
Chris@523 49 QApplication::clipboard()->setMimeData(data);
Chris@523 50 }
Chris@523 51
Chris@523 52 SqueezedLabel::SqueezedLabel(const QString &text , QWidget *parent)
Chris@523 53 : QLabel (parent)
Chris@523 54 {
Chris@523 55 setObjectName("SQUEEZED");
Chris@523 56 setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
Chris@523 57 fullText = text;
Chris@523 58 elideMode = Qt::ElideMiddle;
Chris@523 59 squeezeTextToLabel();
Chris@523 60 }
Chris@523 61
Chris@523 62 SqueezedLabel::SqueezedLabel(QWidget *parent)
Chris@523 63 : QLabel (parent)
Chris@523 64 {
Chris@523 65 setObjectName("SQUEEZED");
Chris@523 66 setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
Chris@523 67 elideMode = Qt::ElideMiddle;
Chris@523 68 }
Chris@523 69
Chris@523 70 SqueezedLabel::~SqueezedLabel()
Chris@523 71 {
Chris@523 72 }
Chris@523 73
Chris@523 74 void SqueezedLabel::resizeEvent(QResizeEvent *)
Chris@523 75 {
Chris@523 76 squeezeTextToLabel();
Chris@523 77 }
Chris@523 78
Chris@523 79 QSize SqueezedLabel::minimumSizeHint() const
Chris@523 80 {
Chris@523 81 QSize sh = QLabel::minimumSizeHint();
Chris@523 82 sh.setWidth(-1);
Chris@523 83 return sh;
Chris@523 84 }
Chris@523 85
Chris@523 86 QSize SqueezedLabel::sizeHint() const
Chris@523 87 {
Chris@523 88 int dw = QApplication::desktop()->availableGeometry(QPoint(0, 0)).width();
Chris@523 89 int maxWidth = dw * 3 / 4;
Chris@523 90 QFontMetrics fm(fontMetrics());
Chris@523 91 int textWidth = fm.width(fullText);
Chris@523 92 if (textWidth > maxWidth) {
Chris@523 93 textWidth = maxWidth;
Chris@523 94 }
Chris@523 95 return QSize(textWidth, QLabel::sizeHint().height());
Chris@523 96 }
Chris@523 97
Chris@523 98 void SqueezedLabel::setText(const QString &text)
Chris@523 99 {
Chris@523 100 fullText = text;
Chris@523 101 squeezeTextToLabel();
Chris@523 102 }
Chris@523 103
Chris@523 104 void SqueezedLabel::clear() {
Chris@523 105 fullText.clear();
Chris@523 106 QLabel::clear();
Chris@523 107 }
Chris@523 108
Chris@523 109 void SqueezedLabel::squeezeTextToLabel() {
Chris@523 110 QFontMetrics fm(fontMetrics());
Chris@523 111 int labelWidth = size().width();
Chris@523 112 QStringList squeezedLines;
Chris@523 113 bool squeezed = false;
Chris@523 114 Q_FOREACH(const QString& line, fullText.split('\n')) {
Chris@523 115 int lineWidth = fm.width(line);
Chris@523 116 if (lineWidth > labelWidth) {
Chris@523 117 squeezed = true;
Chris@523 118 squeezedLines << fm.elidedText(line, elideMode, labelWidth);
Chris@523 119 } else {
Chris@523 120 squeezedLines << line;
Chris@523 121 }
Chris@523 122 }
Chris@523 123
Chris@523 124 if (squeezed) {
Chris@523 125 QLabel::setText(squeezedLines.join("\n"));
Chris@523 126 setToolTip(fullText);
Chris@523 127 } else {
Chris@523 128 QLabel::setText(fullText);
Chris@523 129 setToolTip(QString());
Chris@523 130 }
Chris@523 131 }
Chris@523 132
Chris@523 133 void SqueezedLabel::setAlignment(Qt::Alignment alignment)
Chris@523 134 {
Chris@523 135 // save fullText and restore it
Chris@523 136 QString tmpFull(fullText);
Chris@523 137 QLabel::setAlignment(alignment);
Chris@523 138 fullText = tmpFull;
Chris@523 139 }
Chris@523 140
Chris@523 141 Qt::TextElideMode SqueezedLabel::textElideMode() const
Chris@523 142 {
Chris@523 143 return elideMode;
Chris@523 144 }
Chris@523 145
Chris@523 146 void SqueezedLabel::setTextElideMode(Qt::TextElideMode mode)
Chris@523 147 {
Chris@523 148 elideMode = mode;
Chris@523 149 squeezeTextToLabel();
Chris@523 150 }
Chris@523 151
Chris@523 152 void SqueezedLabel::contextMenuEvent(QContextMenuEvent* ev)
Chris@523 153 {
Chris@523 154 // "We" means the KDE team here.
Chris@523 155 //
Chris@523 156 // We want to reimplement "Copy" to include the elided text.
Chris@523 157 // But this means reimplementing the full popup menu, so no more
Chris@523 158 // copy-link-address or copy-selection support anymore, since we
Chris@523 159 // have no access to the QTextDocument.
Chris@523 160 // Maybe we should have a boolean flag in SqueezedLabel itself for
Chris@523 161 // whether to show the "Copy Full Text" custom popup?
Chris@523 162 // For now I chose to show it when the text is squeezed; when it's not, the
Chris@523 163 // standard popup menu can do the job (select all, copy).
Chris@523 164
Chris@523 165 const bool squeezed = text() != fullText;
Chris@523 166 const bool showCustomPopup = squeezed;
Chris@523 167 if (showCustomPopup) {
Chris@523 168 QMenu menu(this);
Chris@523 169
Chris@523 170 QAction* act = new QAction(tr("&Copy Full Text"), this);
Chris@523 171 connect(act, SIGNAL(triggered()), this, SLOT(_k_copyFullText()));
Chris@523 172 menu.addAction(act);
Chris@523 173
Chris@523 174 ev->accept();
Chris@523 175 menu.exec(ev->globalPos());
Chris@523 176 } else {
Chris@523 177 QLabel::contextMenuEvent(ev);
Chris@523 178 }
Chris@523 179 }
Chris@523 180