From e028fa9be0ad9db6b0f7b5aab039864f84b0b9ae Mon Sep 17 00:00:00 2001 From: Nick Tiskov Date: Thu, 18 Jul 2013 19:55:51 +0400 Subject: [PATCH] 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 = .