From e028fa9be0ad9db6b0f7b5aab039864f84b0b9ae Mon Sep 17 00:00:00 2001 From: Nick Tiskov Date: Thu, 18 Jul 2013 19:55:51 +0400 Subject: [PATCH 1/4] Add auto resizable input dialog class --- src/autoexpandabledialog.cpp | 89 ++++++++++++++++++++++++++ src/autoexpandabledialog.h | 57 +++++++++++++++++ src/autoexpandabledialog.ui | 120 +++++++++++++++++++++++++++++++++++ src/src.pro | 9 ++- 4 files changed, 272 insertions(+), 3 deletions(-) create mode 100644 src/autoexpandabledialog.cpp create mode 100644 src/autoexpandabledialog.h create mode 100644 src/autoexpandabledialog.ui diff --git a/src/autoexpandabledialog.cpp b/src/autoexpandabledialog.cpp new file mode 100644 index 000000000..30e39416a --- /dev/null +++ b/src/autoexpandabledialog.cpp @@ -0,0 +1,89 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2013 Nick Tiskov + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : daymansmail@gmail.com + */ + +#include + +#include "autoexpandabledialog.h" +#include "ui_autoexpandabledialog.h" + +AutoExpandableDialog::AutoExpandableDialog(QWidget *parent) : QDialog(parent), ui(new Ui::AutoExpandableDialog) { + ui->setupUi(this); +} + +AutoExpandableDialog::~AutoExpandableDialog() { + delete ui; +} + +QString AutoExpandableDialog::getText(QWidget *parent, const QString &title, const QString &label, + QLineEdit::EchoMode mode, const QString &text, bool *ok, + Qt::InputMethodHints inputMethodHints) { + + AutoExpandableDialog d(parent); + d.setWindowTitle(title); + d.ui->textLabel->setText(label); + d.ui->textEdit->setText(text); + d.ui->textEdit->setEchoMode(mode); + d.ui->textEdit->setInputMethodHints(inputMethodHints); + + int textW = d.ui->textEdit->fontMetrics().width(text) + 4; + int screenW = QApplication::desktop()->width() / 4; + int wd = textW; + + if (!title.isEmpty()) { + int _w = d.fontMetrics().width(title); + if (_w > wd) + wd = _w; + } + + if (!label.isEmpty()) { + int _w = d.ui->textLabel->fontMetrics().width(label); + if (_w > wd) + wd = _w; + } + + + // Now resize the dialog to fit the contents + // Maximum value is whichever is smaller: + // 1. screen width / 4 + // 2. max width of text from either of: label, title, textedit + // If the value is less than dialog default size default size is used + wd = textW < screenW ? textW : screenW; + if (wd > d.width()) + d.resize(d.width() - d.ui->horizontalLayout->sizeHint().width() + wd, d.height()); + + bool res = d.exec(); + if (ok) + *ok = res; + + if (!res) + return QString(); + + return d.ui->textEdit->text(); +} diff --git a/src/autoexpandabledialog.h b/src/autoexpandabledialog.h new file mode 100644 index 000000000..87863d1f8 --- /dev/null +++ b/src/autoexpandabledialog.h @@ -0,0 +1,57 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2013 Nick Tiskov + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : daymansmail@gmail.com + */ + +#ifndef AUTOEXPANDABLEDIALOG_H +#define AUTOEXPANDABLEDIALOG_H + +#include +#include +#include + +namespace Ui { +class AutoExpandableDialog; +} + +class AutoExpandableDialog : public QDialog { + Q_OBJECT + +public: + explicit AutoExpandableDialog(QWidget *parent = 0); + ~AutoExpandableDialog(); + + static QString getText(QWidget *parent, const QString& title, const QString& label, + QLineEdit::EchoMode mode = QLineEdit::Normal, const QString & text = QString(), + bool * ok = 0, Qt::InputMethodHints inputMethodHints = Qt::ImhNone); + +private: + Ui::AutoExpandableDialog *ui; +}; + +#endif // AUTOEXPANDABLEDIALOG_H diff --git a/src/autoexpandabledialog.ui b/src/autoexpandabledialog.ui new file mode 100644 index 000000000..d0778846e --- /dev/null +++ b/src/autoexpandabledialog.ui @@ -0,0 +1,120 @@ + + + AutoExpandableDialog + + + + 0 + 0 + 222 + 94 + + + + + 0 + 0 + + + + Dialog + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + buttonBox + accepted() + AutoExpandableDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + AutoExpandableDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/src.pro b/src/src.pro index d40590e68..253f7b01f 100644 --- a/src/src.pro +++ b/src/src.pro @@ -148,7 +148,8 @@ nox { iconprovider.h \ updownratiodlg.h \ loglistwidget.h \ - addnewtorrentdialog.h + addnewtorrentdialog.h \ + autoexpandabledialog.h SOURCES += mainwindow.cpp \ ico.cpp \ @@ -165,7 +166,8 @@ nox { iconprovider.cpp \ updownratiodlg.cpp \ loglistwidget.cpp \ - addnewtorrentdialog.cpp + addnewtorrentdialog.cpp \ + autoexpandabledialog.cpp win32 { HEADERS += programupdater.h @@ -190,7 +192,8 @@ nox { confirmdeletiondlg.ui \ torrentimportdlg.ui \ executionlog.ui \ - addnewtorrentdialog.ui + addnewtorrentdialog.ui \ + autoexpandabledialog.ui } DESTDIR = . From fd8a2e05a4fb4cae96187f8c5babda8c304530e2 Mon Sep 17 00:00:00 2001 From: Nick Tiskov Date: Mon, 22 Jul 2013 15:46:10 +0400 Subject: [PATCH 2/4] Use AutoExpandableDialog instead of QInputDialog wherever possible --- src/addnewtorrentdialog.cpp | 4 ++-- src/mainwindow.cpp | 9 ++++++--- src/preferences/options_imp.cpp | 1 - src/properties/propertieswidget.cpp | 8 ++++---- src/properties/trackerlist.cpp | 17 +++++------------ src/rss/automatedrssdownloader.cpp | 6 +++--- src/rss/rss_imp.cpp | 8 ++++---- src/searchengine/engineselectdlg.cpp | 4 ++-- src/torrentcreator/torrentcreatordlg.cpp | 1 - src/transferlistfilterswidget.h | 4 ++-- src/transferlistwidget.cpp | 6 +++--- 11 files changed, 31 insertions(+), 37 deletions(-) diff --git a/src/addnewtorrentdialog.cpp b/src/addnewtorrentdialog.cpp index ab2c1e480..2f11e67b9 100644 --- a/src/addnewtorrentdialog.cpp +++ b/src/addnewtorrentdialog.cpp @@ -39,10 +39,10 @@ #include "qbtsession.h" #include "iconprovider.h" #include "fs_utils.h" +#include "autoexpandabledialog.h" #include #include -#include #include #include #include @@ -394,7 +394,7 @@ void AddNewTorrentDialog::renameSelectedFile() const QModelIndex &index = selectedIndexes.first(); // Ask for new name bool ok; - const QString new_name_last = QInputDialog::getText(this, tr("Rename the file"), + const QString new_name_last = AutoExpandableDialog::getText(this, tr("Rename the file"), tr("New name:"), QLineEdit::Normal, index.data().toString(), &ok).trimmed(); if (ok && !new_name_last.isEmpty()) { diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index fc1caaefc..95300524a 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -72,6 +72,9 @@ #include "torrentmodel.h" #include "executionlog.h" #include "iconprovider.h" +#ifndef DISABLE_GUI +#include "autoexpandabledialog.h" +#endif #ifdef Q_WS_MAC #include "qmacapplication.h" void qt_mac_set_dock_menu(QMenu *menu); @@ -397,7 +400,7 @@ void MainWindow::defineUILockPassword() { QString old_pass_md5 = Preferences().getUILockPasswordMD5(); if (old_pass_md5.isNull()) old_pass_md5 = ""; bool ok = false; - QString new_clear_password = QInputDialog::getText(this, tr("UI lock password"), tr("Please type the UI lock password:"), QLineEdit::Password, old_pass_md5, &ok); + QString new_clear_password = AutoExpandableDialog::getText(this, tr("UI lock password"), tr("Please type the UI lock password:"), QLineEdit::Password, old_pass_md5, &ok); if (ok) { new_clear_password = new_clear_password.trimmed(); if (new_clear_password.size() < 3) { @@ -417,7 +420,7 @@ void MainWindow::on_actionLock_qBittorrent_triggered() { if (pref.getUILockPasswordMD5().isEmpty()) { // Ask for a password bool ok = false; - QString clear_password = QInputDialog::getText(this, tr("UI lock password"), tr("Please type the UI lock password:"), QLineEdit::Password, "", &ok); + QString clear_password = AutoExpandableDialog::getText(this, tr("UI lock password"), tr("Please type the UI lock password:"), QLineEdit::Password, "", &ok); if (!ok) return; pref.setUILockPassword(clear_password); } @@ -687,7 +690,7 @@ void MainWindow::setTabText(int index, QString text) const { bool MainWindow::unlockUI() { bool ok = false; - QString clear_password = QInputDialog::getText(this, tr("UI lock password"), tr("Please type the UI lock password:"), QLineEdit::Password, "", &ok); + QString clear_password = AutoExpandableDialog::getText(this, tr("UI lock password"), tr("Please type the UI lock password:"), QLineEdit::Password, "", &ok); if (!ok) return false; Preferences pref; QString real_pass_md5 = pref.getUILockPasswordMD5(); diff --git a/src/preferences/options_imp.cpp b/src/preferences/options_imp.cpp index 00834ae80..42495f62c 100755 --- a/src/preferences/options_imp.cpp +++ b/src/preferences/options_imp.cpp @@ -30,7 +30,6 @@ #include #include #include -#include #include #include #include diff --git a/src/properties/propertieswidget.cpp b/src/properties/propertieswidget.cpp index 95554036c..8dcfed08b 100644 --- a/src/properties/propertieswidget.cpp +++ b/src/properties/propertieswidget.cpp @@ -39,7 +39,6 @@ #include #include #include -#include #include #include "propertieswidget.h" #include "transferlistwidget.h" @@ -58,6 +57,7 @@ #include "iconprovider.h" #include "lineedit.h" #include "fs_utils.h" +#include "autoexpandabledialog.h" using namespace libtorrent; @@ -523,7 +523,7 @@ void PropertiesWidget::renameSelectedFile() { const QModelIndex index = selectedIndexes.first(); // Ask for new name bool ok; - QString new_name_last = QInputDialog::getText(this, tr("Rename the file"), + QString new_name_last = AutoExpandableDialog::getText(this, tr("Rename the file"), tr("New name:"), QLineEdit::Normal, index.data().toString(), &ok).trimmed(); if (ok && !new_name_last.isEmpty()) { @@ -636,7 +636,7 @@ void PropertiesWidget::renameSelectedFile() { void PropertiesWidget::askWebSeed() { bool ok; // Ask user for a new url seed - const QString url_seed = QInputDialog::getText(this, tr("New url seed", "New HTTP source"), + const QString url_seed = AutoExpandableDialog::getText(this, tr("New url seed", "New HTTP source"), tr("New url seed:"), QLineEdit::Normal, QString::fromUtf8("http://www."), &ok); if (!ok) return; @@ -689,7 +689,7 @@ void PropertiesWidget::editWebSeed() { const QListWidgetItem *selected_item = selected_items.last(); const QString old_seed = selected_item->text(); bool result; - const QString new_seed = QInputDialog::getText(this, tr("Web seed editing"), + const QString new_seed = AutoExpandableDialog::getText(this, tr("Web seed editing"), tr("Web seed URL:"), QLineEdit::Normal, old_seed, &result); if (!result) diff --git a/src/properties/trackerlist.cpp b/src/properties/trackerlist.cpp index e9c1132b3..358c70f89 100644 --- a/src/properties/trackerlist.cpp +++ b/src/properties/trackerlist.cpp @@ -35,7 +35,6 @@ #include #include #include -#include #include #include #include @@ -46,6 +45,7 @@ #include "qbtsession.h" #include "qinisettings.h" #include "misc.h" +#include "autoexpandabledialog.h" using namespace libtorrent; @@ -355,19 +355,12 @@ void TrackerList::editSelectedTracker() { // During multi-select only process item selected last QUrl tracker_url = selected_items.last()->text(COL_URL); - QInputDialog editDlg(this); - editDlg.setInputMode(QInputDialog::TextInput); - editDlg.setLabelText(tr("Tracker URL:")); - editDlg.setWindowTitle(tr("Tracker editing")); - editDlg.setTextValue(tracker_url.toString()); - QSize dlgSize = editDlg.size(); - dlgSize.setWidth(350); - editDlg.resize(dlgSize); - - if(!editDlg.exec()) + bool ok; + QUrl new_tracker_url = AutoExpandableDialog::getText(this, tr("Tracker editing"), tr("Tracker URL:"), + QLineEdit::Normal, tracker_url.toString(), &ok).trimmed(); + if (!ok) return; - QUrl new_tracker_url = editDlg.textValue().trimmed(); if (!new_tracker_url.isValid()) { QMessageBox::warning(this, tr("Tracker editing failed"), tr("The tracker URL entered is invalid.")); return; diff --git a/src/rss/automatedrssdownloader.cpp b/src/rss/automatedrssdownloader.cpp index f34c1d7a6..8e1bfd2bd 100644 --- a/src/rss/automatedrssdownloader.cpp +++ b/src/rss/automatedrssdownloader.cpp @@ -28,7 +28,6 @@ * Contact : chris@qbittorrent.org */ -#include #include #include #include @@ -44,6 +43,7 @@ #include "rssmanager.h" #include "rssfeed.h" #include "iconprovider.h" +#include "autoexpandabledialog.h" AutomatedRssDownloader::AutomatedRssDownloader(const QWeakPointer& manager, QWidget *parent) : QDialog(parent), @@ -309,7 +309,7 @@ void AutomatedRssDownloader::saveEditedRule() void AutomatedRssDownloader::on_addRuleBtn_clicked() { // Ask for a rule name - const QString rule_name = QInputDialog::getText(this, tr("New rule name"), tr("Please type the name of the new download rule.")); + const QString rule_name = AutoExpandableDialog::getText(this, tr("New rule name"), tr("Please type the name of the new download rule.")); if (rule_name.isEmpty()) return; // Check if this rule name already exists if (m_editableRuleList->getRule(rule_name)) { @@ -424,7 +424,7 @@ void AutomatedRssDownloader::renameSelectedRule() QListWidgetItem *item = ui->listRules->currentItem(); if (!item) return; forever { - QString new_name = QInputDialog::getText(this, tr("Rule renaming"), tr("Please type the new rule name"), QLineEdit::Normal, item->text()); + QString new_name = AutoExpandableDialog::getText(this, tr("Rule renaming"), tr("Please type the new rule name"), QLineEdit::Normal, item->text()); new_name = new_name.trimmed(); if (new_name.isEmpty()) return; if (m_editableRuleList->ruleNames().contains(new_name, Qt::CaseInsensitive)) { diff --git a/src/rss/rss_imp.cpp b/src/rss/rss_imp.cpp index 0c0982915..bec601765 100644 --- a/src/rss/rss_imp.cpp +++ b/src/rss/rss_imp.cpp @@ -29,7 +29,6 @@ */ #include -#include #include #include #include @@ -51,6 +50,7 @@ #include "rsssettings.h" #include "automatedrssdownloader.h" #include "iconprovider.h" +#include "autoexpandabledialog.h" namespace Article { enum ArticleRoles { @@ -150,7 +150,7 @@ void RSSImp::askNewFolder() rss_parent = m_rssManager; } bool ok; - QString new_name = QInputDialog::getText(this, tr("Please choose a folder name"), tr("Folder name:"), QLineEdit::Normal, tr("New folder"), &ok); + QString new_name = AutoExpandableDialog::getText(this, tr("Please choose a folder name"), tr("Folder name:"), QLineEdit::Normal, tr("New folder"), &ok); if (!ok) return; @@ -197,7 +197,7 @@ void RSSImp::on_newFeedButton_clicked() if (clip_txt.startsWith("http://", Qt::CaseInsensitive) || clip_txt.startsWith("https://", Qt::CaseInsensitive) || clip_txt.startsWith("ftp://", Qt::CaseInsensitive)) default_url = clip_txt; - QString newUrl = QInputDialog::getText(this, tr("Please type a rss stream url"), tr("Stream URL:"), QLineEdit::Normal, default_url, &ok); + QString newUrl = AutoExpandableDialog::getText(this, tr("Please type a rss stream url"), tr("Stream URL:"), QLineEdit::Normal, default_url, &ok); if (!ok) return; @@ -372,7 +372,7 @@ void RSSImp::renameSelectedRssFile() bool ok; QString newName; do { - newName = QInputDialog::getText(this, tr("Please choose a new name for this RSS feed"), tr("New feed name:"), QLineEdit::Normal, m_feedList->getRSSItem(item)->displayName(), &ok); + newName = AutoExpandableDialog::getText(this, tr("Please choose a new name for this RSS feed"), tr("New feed name:"), QLineEdit::Normal, m_feedList->getRSSItem(item)->displayName(), &ok); // Check if name is already taken if (ok) { if (rss_item->parent()->hasChild(newName)) { diff --git a/src/searchengine/engineselectdlg.cpp b/src/searchengine/engineselectdlg.cpp index 47715b9bf..5b4b24e7e 100644 --- a/src/searchengine/engineselectdlg.cpp +++ b/src/searchengine/engineselectdlg.cpp @@ -36,13 +36,13 @@ #include "searchengine.h" #include "pluginsource.h" #include "iconprovider.h" +#include "autoexpandabledialog.h" #include #include #include #include #include #include -#include #include enum EngineColumns {ENGINE_NAME, ENGINE_URL, ENGINE_STATE, ENGINE_ID}; @@ -327,7 +327,7 @@ void engineSelectDlg::on_installButton_clicked() { void engineSelectDlg::askForPluginUrl() { bool ok; - QString url = QInputDialog::getText(this, tr("New search engine plugin URL"), + QString url = AutoExpandableDialog::getText(this, tr("New search engine plugin URL"), tr("URL:"), QLineEdit::Normal, "http://", &ok); if (ok && !url.isEmpty()) { diff --git a/src/torrentcreator/torrentcreatordlg.cpp b/src/torrentcreator/torrentcreatordlg.cpp index 68f84f2ad..727c78086 100644 --- a/src/torrentcreator/torrentcreatordlg.cpp +++ b/src/torrentcreator/torrentcreatordlg.cpp @@ -30,7 +30,6 @@ #include #include -#include #include "torrentpersistentdata.h" #include "torrentcreatordlg.h" diff --git a/src/transferlistfilterswidget.h b/src/transferlistfilterswidget.h index 8a66462a7..74d17adef 100644 --- a/src/transferlistfilterswidget.h +++ b/src/transferlistfilterswidget.h @@ -37,7 +37,6 @@ #include #include #include -#include #include #include #include @@ -51,6 +50,7 @@ #include "torrentmodel.h" #include "iconprovider.h" #include "fs_utils.h" +#include "autoexpandabledialog.h" class LabelFiltersList: public QListWidget { Q_OBJECT @@ -368,7 +368,7 @@ protected slots: bool invalid; do { invalid = false; - label = QInputDialog::getText(this, tr("New Label"), tr("Label:"), QLineEdit::Normal, label, &ok); + label = AutoExpandableDialog::getText(this, tr("New Label"), tr("Label:"), QLineEdit::Normal, label, &ok); if (ok && !label.isEmpty()) { if (fsutils::isValidFileSystemName(label)) { addLabel(label); diff --git a/src/transferlistwidget.cpp b/src/transferlistwidget.cpp index 9d30991c5..f1e734385 100644 --- a/src/transferlistwidget.cpp +++ b/src/transferlistwidget.cpp @@ -33,7 +33,6 @@ #include #include #include -#include #include #include #include @@ -61,6 +60,7 @@ #include "qinisettings.h" #include "iconprovider.h" #include "fs_utils.h" +#include "autoexpandabledialog.h" using namespace libtorrent; @@ -602,7 +602,7 @@ void TransferListWidget::askNewLabelForSelection() { bool invalid; do { invalid = false; - const QString label = QInputDialog::getText(this, tr("New Label"), tr("Label:"), QLineEdit::Normal, "", &ok).trimmed(); + const QString label = AutoExpandableDialog::getText(this, tr("New Label"), tr("Label:"), QLineEdit::Normal, "", &ok).trimmed(); if (ok && !label.isEmpty()) { if (fsutils::isValidFileSystemName(label)) { setSelectionLabel(label); @@ -624,7 +624,7 @@ void TransferListWidget::renameSelectedTorrent() { if (!h.is_valid()) return; // Ask for a new Name bool ok; - QString name = QInputDialog::getText(this, tr("Rename"), tr("New name:"), QLineEdit::Normal, h.name(), &ok); + QString name = AutoExpandableDialog::getText(this, tr("Rename"), tr("New name:"), QLineEdit::Normal, h.name(), &ok); if (ok && !name.isEmpty()) { name.replace(QRegExp("\r?\n|\r"), " "); // Rename the torrent From de3108e1e5e3560f715e1ddd344b28a9e66cc0c7 Mon Sep 17 00:00:00 2001 From: Nick Tiskov Date: Mon, 22 Jul 2013 17:11:54 +0400 Subject: [PATCH 3/4] Move textBox geometry updates into showEvent: 1. Makes QFontMetrics more accurate (~50%) for custom DPI systems 2. Makes it possible to have fixed dialog size yet again (like in old dialog box) and still allow to autoexpand the textBox --- src/autoexpandabledialog.cpp | 47 +++++++++++++++++++++++++----------- src/autoexpandabledialog.h | 3 +++ 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/src/autoexpandabledialog.cpp b/src/autoexpandabledialog.cpp index 30e39416a..2190b67a3 100644 --- a/src/autoexpandabledialog.cpp +++ b/src/autoexpandabledialog.cpp @@ -52,18 +52,36 @@ QString AutoExpandableDialog::getText(QWidget *parent, const QString &title, con d.ui->textEdit->setEchoMode(mode); d.ui->textEdit->setInputMethodHints(inputMethodHints); - int textW = d.ui->textEdit->fontMetrics().width(text) + 4; + bool res = d.exec(); + if (ok) + *ok = res; + + if (!res) + return QString(); + + return d.ui->textEdit->text(); +} + +void AutoExpandableDialog::showEvent(QShowEvent *e) { + // Overriding showEvent is required for consistent UI with fixed size under custom DPI + // Show dialog + QDialog::showEvent(e); + // and resize textbox to fit the text + + // NOTE: For some strange reason QFontMetrics gets more accurate + // when called from showEvent. Only 6 symbols off instead of 11 symbols off. + int textW = ui->textEdit->fontMetrics().width(ui->textEdit->text()) + 4; int screenW = QApplication::desktop()->width() / 4; int wd = textW; - if (!title.isEmpty()) { - int _w = d.fontMetrics().width(title); + if (!windowTitle().isEmpty()) { + int _w = fontMetrics().width(windowTitle()); if (_w > wd) wd = _w; } - if (!label.isEmpty()) { - int _w = d.ui->textLabel->fontMetrics().width(label); + if (!ui->textLabel->text().isEmpty()) { + int _w = ui->textLabel->fontMetrics().width(ui->textLabel->text()); if (_w > wd) wd = _w; } @@ -75,15 +93,16 @@ QString AutoExpandableDialog::getText(QWidget *parent, const QString &title, con // 2. max width of text from either of: label, title, textedit // If the value is less than dialog default size default size is used wd = textW < screenW ? textW : screenW; - if (wd > d.width()) - d.resize(d.width() - d.ui->horizontalLayout->sizeHint().width() + wd, d.height()); + if (wd > width()) + resize(width() - ui->horizontalLayout->sizeHint().width() + wd, height()); - bool res = d.exec(); - if (ok) - *ok = res; + // Use old dialog behavior: prohibit resizing the dialog + setFixedHeight(height()); - if (!res) - return QString(); - - return d.ui->textEdit->text(); + // Update geometry: center on screen + int sx = QApplication::desktop()->width(); + int sy = QApplication::desktop()->height(); + QRect geom = geometry(); + geom.moveCenter(QPoint(sx / 2, sy / 2)); + setGeometry(geom); } diff --git a/src/autoexpandabledialog.h b/src/autoexpandabledialog.h index 87863d1f8..6391418e5 100644 --- a/src/autoexpandabledialog.h +++ b/src/autoexpandabledialog.h @@ -49,6 +49,9 @@ public: static QString getText(QWidget *parent, const QString& title, const QString& label, QLineEdit::EchoMode mode = QLineEdit::Normal, const QString & text = QString(), bool * ok = 0, Qt::InputMethodHints inputMethodHints = Qt::ImhNone); + +protected: + void showEvent(QShowEvent *e); private: Ui::AutoExpandableDialog *ui; From cc04ebd45f7b670b0d7c6331c691f731fa182b2a Mon Sep 17 00:00:00 2001 From: Nick Tiskov Date: Sat, 27 Jul 2013 22:57:33 +0400 Subject: [PATCH 4/4] Try to center AutoExpandableDialog on the same screen as main window If main window is unavailable use the screen, where the mouse cursor is. --- src/autoexpandabledialog.cpp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/autoexpandabledialog.cpp b/src/autoexpandabledialog.cpp index 2190b67a3..ae8724b73 100644 --- a/src/autoexpandabledialog.cpp +++ b/src/autoexpandabledialog.cpp @@ -30,6 +30,7 @@ #include +#include "mainwindow.h" #include "autoexpandabledialog.h" #include "ui_autoexpandabledialog.h" @@ -100,9 +101,21 @@ void AutoExpandableDialog::showEvent(QShowEvent *e) { setFixedHeight(height()); // Update geometry: center on screen - int sx = QApplication::desktop()->width(); - int sy = QApplication::desktop()->height(); + QDesktopWidget *desk = QApplication::desktop(); + MainWindow *wnd = qobject_cast(QApplication::activeWindow()); + QPoint p = QCursor::pos(); + + int screenNum = 0; + if (wnd == 0) + screenNum = desk->screenNumber(p); + else if (!wnd->isHidden()) + screenNum = desk->screenNumber(wnd); + else + screenNum = desk->screenNumber(p); + + QRect screenRes = desk->screenGeometry(screenNum); + QRect geom = geometry(); - geom.moveCenter(QPoint(sx / 2, sy / 2)); + geom.moveCenter(QPoint(screenRes.width() / 2, screenRes.height() / 2)); setGeometry(geom); }