Changeset View
Changeset View
Standalone View
Standalone View
src/klineedit.cpp
Show First 20 Lines • Show All 379 Lines • ▼ Show 20 Line(s) | |||||
380 | { | 380 | { | ||
381 | Q_Q(KLineEdit); | 381 | Q_Q(KLineEdit); | ||
382 | squeezedStart = 0; | 382 | squeezedStart = 0; | ||
383 | squeezedEnd = 0; | 383 | squeezedEnd = 0; | ||
384 | const QString fullText = squeezedText; | 384 | const QString fullText = squeezedText; | ||
385 | const int fullLength = fullText.length(); | 385 | const int fullLength = fullText.length(); | ||
386 | const QFontMetrics fm(q->fontMetrics()); | 386 | const QFontMetrics fm(q->fontMetrics()); | ||
387 | const int labelWidth = q->size().width() - 2 * q->style()->pixelMetric(QStyle::PM_DefaultFrameWidth) - 2; | 387 | const int labelWidth = q->size().width() - 2 * q->style()->pixelMetric(QStyle::PM_DefaultFrameWidth) - 2; | ||
388 | const int textWidth = fm.width(fullText); | 388 | const int textWidth = fm.boundingRect(fullText).width(); | ||
389 | 389 | | |||
390 | // TODO: investigate use of QFontMetrics::elidedText for this | 390 | // TODO: investigate use of QFontMetrics::elidedText for this | ||
391 | if (textWidth > labelWidth) { | 391 | if (textWidth > labelWidth) { | ||
392 | // TODO: better would be "…" char (0x2026), but for that one would need to ensure it's from the main font, | 392 | // TODO: better would be "…" char (0x2026), but for that one would need to ensure it's from the main font, | ||
393 | // otherwise if resulting in use of a new fallback font this can affect the metrics of the complete text, | 393 | // otherwise if resulting in use of a new fallback font this can affect the metrics of the complete text, | ||
394 | // resulting in shifted characters | 394 | // resulting in shifted characters | ||
395 | const QString ellipsisText = QStringLiteral("..."); | 395 | const QString ellipsisText = QStringLiteral("..."); | ||
396 | // start with the dots only | 396 | // start with the dots only | ||
397 | QString squeezedText = ellipsisText; | 397 | QString squeezedText = ellipsisText; | ||
398 | int squeezedWidth = fm.width(squeezedText); | 398 | int squeezedWidth = fm.boundingRect(squeezedText).width(); | ||
399 | 399 | | |||
400 | // estimate how many letters we can add to the dots on both sides | 400 | // estimate how many letters we can add to the dots on both sides | ||
401 | int letters = fullText.length() * (labelWidth - squeezedWidth) / textWidth / 2; | 401 | int letters = fullText.length() * (labelWidth - squeezedWidth) / textWidth / 2; | ||
402 | squeezedText = fullText.leftRef(letters) + ellipsisText + fullText.rightRef(letters); | 402 | squeezedText = fullText.leftRef(letters) + ellipsisText + fullText.rightRef(letters); | ||
403 | squeezedWidth = fm.width(squeezedText); | 403 | squeezedWidth = fm.boundingRect(squeezedText).width(); | ||
404 | 404 | | |||
405 | if (squeezedWidth < labelWidth) { | 405 | if (squeezedWidth < labelWidth) { | ||
406 | // we estimated too short | 406 | // we estimated too short | ||
407 | // add letters while text < label | 407 | // add letters while text < label | ||
408 | do { | 408 | do { | ||
409 | letters++; | 409 | letters++; | ||
410 | squeezedText = fullText.leftRef(letters) + ellipsisText + fullText.rightRef(letters); | 410 | squeezedText = fullText.leftRef(letters) + ellipsisText + fullText.rightRef(letters); | ||
411 | squeezedWidth = fm.width(squeezedText); | 411 | squeezedWidth = fm.boundingRect(squeezedText).width(); | ||
412 | } while (squeezedWidth < labelWidth && letters <= fullLength / 2); | 412 | } while (squeezedWidth < labelWidth && letters <= fullLength / 2); | ||
413 | letters--; | 413 | letters--; | ||
414 | squeezedText = fullText.leftRef(letters) + ellipsisText + fullText.rightRef(letters); | 414 | squeezedText = fullText.leftRef(letters) + ellipsisText + fullText.rightRef(letters); | ||
415 | } else if (squeezedWidth > labelWidth) { | 415 | } else if (squeezedWidth > labelWidth) { | ||
416 | // we estimated too long | 416 | // we estimated too long | ||
417 | // remove letters while text > label | 417 | // remove letters while text > label | ||
418 | do { | 418 | do { | ||
419 | letters--; | 419 | letters--; | ||
420 | squeezedText = fullText.leftRef(letters) + ellipsisText + fullText.rightRef(letters); | 420 | squeezedText = fullText.leftRef(letters) + ellipsisText + fullText.rightRef(letters); | ||
421 | squeezedWidth = fm.width(squeezedText); | 421 | squeezedWidth = fm.boundingRect(squeezedText).width(); | ||
422 | } while (squeezedWidth > labelWidth && letters >= 5); | 422 | } while (squeezedWidth > labelWidth && letters >= 5); | ||
423 | } | 423 | } | ||
424 | 424 | | |||
425 | if (letters < 5) { | 425 | if (letters < 5) { | ||
426 | // too few letters added -> we give up squeezing | 426 | // too few letters added -> we give up squeezing | ||
427 | q->QLineEdit::setText(fullText); | 427 | q->QLineEdit::setText(fullText); | ||
428 | } else { | 428 | } else { | ||
429 | q->QLineEdit::setText(squeezedText); | 429 | q->QLineEdit::setText(squeezedText); | ||
▲ Show 20 Lines • Show All 1055 Lines • Show Last 20 Lines |