[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-core-devel
Subject: Re: PATCH: Default progress dialog
From: Waldo Bastian <bastian () kde ! org>
Date: 2002-08-09 21:41:29
[Download RAW message or body]
On Thursday 08 August 2002 06:08 pm, Waldo Bastian wrote:
> On Thursday 08 August 2002 05:04 pm, Dawit A. wrote:
> > On Wednesday 07 August 2002 16:29, Martijn Klingens wrote:
> > > On Wednesday 07 August 2002 07:27, Dawit A. wrote:
> > > > The attached patch changes the squeezed labels to read-only lineedit
> > > > in the progress dialog so that one can copy either URL as needed.
> > > > See attached screenshot.
> > >
> > > Doesn't the active label that e.g. KMessageBox uses look nicer (less
> > > full of widgets, because of all borders). Apart from that, nice
> > > feature! :)
> >
> > The active label is a multiline label box. It would be an over kill to
> > use it here. The frame on the line edit can be changed to look like a
> > label, but then the user would not be able to distinguish this from any
> > normal label.
>
> I think it looks nice in your screenshot.
>
> Although I think it would look nicer if it was squeezed but in such a way
> that selecting the text would select the original URL instead of the
> squeezed one.
>
> I can make that I think.
Yay... aply patch and use setSqueezedText() instead of setText()
It sets a tooltip with the full text and selecting the thing also selects the
full text instead of the "..." part. It adjusts accordingly when resized.
Cheers,
Waldo
--
bastian@kde.org | SuSE Labs KDE Developer | bastian@suse.com
["klineedit_squeeze.diff" (text/x-diff)]
Index: klineedit.cpp
===================================================================
RCS file: /home/kde/kdelibs/kdeui/klineedit.cpp,v
retrieving revision 1.146
diff -u -p -r1.146 klineedit.cpp
--- klineedit.cpp 2002/06/19 17:55:54 1.146
+++ klineedit.cpp 2002/08/09 21:37:41
@@ -27,7 +27,7 @@
#include <qclipboard.h>
#include <qtimer.h>
-
+#include <qtooltip.h>
#include <kcursor.h>
#include <klocale.h>
#include <kstdaccel.h>
@@ -59,6 +59,9 @@ public:
bool grabReturnKeyEvents;
bool handleURLDrops;
KCompletionBox *completionBox;
+ QString squeezedText;
+ int squeezedStart;
+ int squeezedEnd;
};
@@ -187,6 +190,112 @@ void KLineEdit::setReadOnly(bool readOnl
setPalette(p);
QLineEdit::setReadOnly (readOnly);
+}
+
+void KLineEdit::setSqueezedText( const QString &text)
+{
+ d->squeezedText = text;
+ d->squeezedStart = 0;
+ d->squeezedEnd = 0;
+ if (isVisible())
+ {
+ QResizeEvent ev(size(), size());
+ resizeEvent(&ev);
+ }
+}
+
+void KLineEdit::copy() const
+{
+ if (!d->squeezedText.isEmpty() && d->squeezedStart)
+ {
+ int start, end;
+ KLineEdit *that = const_cast<KLineEdit *>(this);
+ if (!that->getSelection(&start, &end))
+ return;
+ if (start >= d->squeezedStart+3)
+ start = start - 3 - d->squeezedStart + d->squeezedEnd;
+ else if (start > d->squeezedStart)
+ start = d->squeezedStart;
+ if (end >= d->squeezedStart+3)
+ end = end - 3 - d->squeezedStart + d->squeezedEnd;
+ else if (end > d->squeezedStart)
+ end = d->squeezedEnd;
+ if (start == end)
+ return;
+ QString t = d->squeezedText;
+ t = t.mid(start, end - start);
+ disconnect( QApplication::clipboard(), SIGNAL(selectionChanged()), this, 0);
+ QApplication::clipboard()->setText( t );
+ connect( QApplication::clipboard(), SIGNAL(selectionChanged()),
+ this, SLOT(clipboardChanged()) );
+ }
+ else
+ {
+ QLineEdit::copy();
+ }
+}
+
+void KLineEdit::resizeEvent( QResizeEvent * ev )
+{
+ if (!d->squeezedText.isEmpty())
+ {
+ d->squeezedStart = 0;
+ d->squeezedEnd = 0;
+ QString fullText = d->squeezedText;
+ QFontMetrics fm(fontMetrics());
+ int labelWidth = size().width() - 2*frameWidth() - 2;
+ int textWidth = fm.width(fullText);
+ if (textWidth > labelWidth) {
+ // start with the dots only
+ QString squeezedText = "...";
+ int squeezedWidth = fm.width(squeezedText);
+
+ // estimate how many letters we can add to the dots on both sides
+ int letters = fullText.length() * (labelWidth - squeezedWidth) / textWidth / 2;
+ squeezedText = fullText.left(letters) + "..." + fullText.right(letters);
+ squeezedWidth = fm.width(squeezedText);
+
+ if (squeezedWidth < labelWidth) {
+ // we estimated too short
+ // add letters while text < label
+ do {
+ letters++;
+ squeezedText = fullText.left(letters) + "..." + fullText.right(letters);
+ squeezedWidth = fm.width(squeezedText);
+ } while (squeezedWidth < labelWidth);
+ letters--;
+ squeezedText = fullText.left(letters) + "..." + fullText.right(letters);
+ } else if (squeezedWidth > labelWidth) {
+ // we estimated too long
+ // remove letters while text > label
+ do {
+ letters--;
+ squeezedText = fullText.left(letters) + "..." + fullText.right(letters);
+ squeezedWidth = fm.width(squeezedText);
+ } while (squeezedWidth > labelWidth);
+ }
+
+ if (letters < 5) {
+ // too few letters added -> we give up squeezing
+ setText(fullText);
+ } else {
+ setText(squeezedText);
+ d->squeezedStart = letters;
+ d->squeezedEnd = fullText.length() - letters;
+ }
+
+ QToolTip::remove( this );
+ QToolTip::add( this, fullText );
+
+ } else {
+ setText(fullText);
+
+ QToolTip::remove( this );
+ QToolTip::hide();
+ }
+ setCursorPosition(0);
+ }
+ QLineEdit::resizeEvent(ev);
}
void KLineEdit::keyPressEvent( QKeyEvent *e )
Index: klineedit.h
===================================================================
RCS file: /home/kde/kdelibs/kdeui/klineedit.h,v
retrieving revision 1.93
diff -u -p -r1.93 klineedit.h
--- klineedit.h 2002/08/01 14:19:52 1.93
+++ klineedit.h 2002/08/09 21:37:41
@@ -271,6 +271,10 @@ public:
*/
virtual void setCompletionObject( KCompletion *, bool hsig = true );
+ /**
+ * Reimplemented for internal reasons, the API is not affected.
+ */
+ virtual void copy() const;
signals:
@@ -370,6 +374,12 @@ public slots:
* (changing the clipboard to the text we just had in the lineedit)
*/
virtual void clear();
+
+ /**
+ * Squeezes @p text into the line edit.
+ * This can only be used with read-only line-edits.
+ */
+ void setSqueezedText( const QString &text);
protected slots:
@@ -390,6 +400,13 @@ protected slots:
void slotCancelled() {}
protected:
+
+ /**
+ * Re-implemented for internal reasons. API not affected.
+ *
+ * See @ref QLineEdit::resizeEvent().
+ */
+ virtual void resizeEvent( QResizeEvent * );
/**
* Re-implemented for internal reasons. API not affected.
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic