Find/replace tool bar wasn't usable in very small width editors.

E.g. in split editors with small main window. We now have line edits
with a minimum size and use a flow layout for the replace buttons (which
will reduce width when necessary by laying out vertically).

Flow layout is taken from the Qt examples.

Task-number: QTCREATORBUG-3279
Change-Id: Ic07d4d3e75e3d928d6b53534adb42481ce26256b
Reviewed-on: http://codereview.qt.nokia.com/666
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Leandro T. C. Melo <leandro.melo@nokia.com>
This commit is contained in:
con
2011-06-23 14:35:45 +02:00
committed by Eike Ziller
parent fbce58bf8c
commit 78fa1bb0aa
6 changed files with 300 additions and 150 deletions

View File

@@ -35,18 +35,18 @@
#include <QtCore/QRect> #include <QtCore/QRect>
#include <QtGui/QWidgetItem> #include <QtGui/QWidgetItem>
using namespace Core::Internal; using namespace Utils;
FlowLayout::FlowLayout(QWidget *parent, int margin, int spacing) FlowLayout::FlowLayout(QWidget *parent, int margin, int hSpacing, int vSpacing)
: QLayout(parent) : QLayout(parent), m_hSpace(hSpacing), m_vSpace(vSpacing)
{ {
setMargin(margin); setContentsMargins(margin, margin, margin, margin);
setSpacing(spacing);
} }
FlowLayout::FlowLayout(int spacing) FlowLayout::FlowLayout(int margin, int hSpacing, int vSpacing)
: m_hSpace(hSpacing), m_vSpace(vSpacing)
{ {
setSpacing(spacing); setContentsMargins(margin, margin, margin, margin);
} }
FlowLayout::~FlowLayout() FlowLayout::~FlowLayout()
@@ -61,6 +61,24 @@ void FlowLayout::addItem(QLayoutItem *item)
itemList.append(item); itemList.append(item);
} }
int FlowLayout::horizontalSpacing() const
{
if (m_hSpace >= 0) {
return m_hSpace;
} else {
return smartSpacing(QStyle::PM_LayoutHorizontalSpacing);
}
}
int FlowLayout::verticalSpacing() const
{
if (m_vSpace >= 0) {
return m_vSpace;
} else {
return smartSpacing(QStyle::PM_LayoutVerticalSpacing);
}
}
int FlowLayout::count() const int FlowLayout::count() const
{ {
return itemList.size(); return itemList.size();
@@ -109,25 +127,39 @@ QSize FlowLayout::sizeHint() const
QSize FlowLayout::minimumSize() const QSize FlowLayout::minimumSize() const
{ {
QSize size; QSize size;
foreach (QLayoutItem *item, itemList) QLayoutItem *item;
foreach (item, itemList)
size = size.expandedTo(item->minimumSize()); size = size.expandedTo(item->minimumSize());
size += QSize(2 * margin(), 2 * margin()); size += QSize(2*margin(), 2*margin());
return size; return size;
} }
int FlowLayout::doLayout(const QRect &rect, bool testOnly) const int FlowLayout::doLayout(const QRect &rect, bool testOnly) const
{ {
int x = rect.x(); int left, top, right, bottom;
int y = rect.y(); getContentsMargins(&left, &top, &right, &bottom);
QRect effectiveRect = rect.adjusted(+left, +top, -right, -bottom);
int x = effectiveRect.x();
int y = effectiveRect.y();
int lineHeight = 0; int lineHeight = 0;
foreach (QLayoutItem *item, itemList) { QLayoutItem *item;
int nextX = x + item->sizeHint().width() + spacing(); foreach (item, itemList) {
if (nextX - spacing() > rect.right() && lineHeight > 0) { QWidget *wid = item->widget();
x = rect.x(); int spaceX = horizontalSpacing();
y = y + lineHeight + spacing(); if (spaceX == -1)
nextX = x + item->sizeHint().width() + spacing(); spaceX = wid->style()->layoutSpacing(
QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Horizontal);
int spaceY = verticalSpacing();
if (spaceY == -1)
spaceY = wid->style()->layoutSpacing(
QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Vertical);
int nextX = x + item->sizeHint().width() + spaceX;
if (nextX - spaceX > effectiveRect.right() && lineHeight > 0) {
x = effectiveRect.x();
y = y + lineHeight + spaceY;
nextX = x + item->sizeHint().width() + spaceX;
lineHeight = 0; lineHeight = 0;
} }
@@ -137,5 +169,17 @@ int FlowLayout::doLayout(const QRect &rect, bool testOnly) const
x = nextX; x = nextX;
lineHeight = qMax(lineHeight, item->sizeHint().height()); lineHeight = qMax(lineHeight, item->sizeHint().height());
} }
return y + lineHeight - rect.y() + margin(); return y + lineHeight - rect.y() + bottom;
}
int FlowLayout::smartSpacing(QStyle::PixelMetric pm) const
{
QObject *parent = this->parent();
if (!parent) {
return -1;
} else if (parent->isWidgetType()) {
QWidget *pw = static_cast<QWidget *>(parent);
return pw->style()->pixelMetric(pm, 0, pw);
} else {
return static_cast<QLayout *>(parent)->spacing();
}
} }

View File

@@ -33,19 +33,24 @@
#ifndef FLOWLAYOUT_H #ifndef FLOWLAYOUT_H
#define FLOWLAYOUT_H #define FLOWLAYOUT_H
#include "utils_global.h"
#include <QtGui/QLayout> #include <QtGui/QLayout>
#include <QtGui/QWidget>
#include <QtGui/QStyle>
namespace Core { namespace Utils {
namespace Internal {
class FlowLayout : public QLayout class QTCREATOR_UTILS_EXPORT FlowLayout : public QLayout
{ {
public: public:
explicit FlowLayout(QWidget *parent, int margin = 0, int spacing = -1); explicit FlowLayout(QWidget *parent, int margin = -1, int hSpacing = -1, int vSpacing = -1);
FlowLayout(int spacing = -1); FlowLayout(int margin = -1, int hSpacing = -1, int vSpacing = -1);
~FlowLayout(); ~FlowLayout();
void addItem(QLayoutItem *item); void addItem(QLayoutItem *item);
int horizontalSpacing() const;
int verticalSpacing() const;
Qt::Orientations expandingDirections() const; Qt::Orientations expandingDirections() const;
bool hasHeightForWidth() const; bool hasHeightForWidth() const;
int heightForWidth(int) const; int heightForWidth(int) const;
@@ -58,11 +63,13 @@ public:
private: private:
int doLayout(const QRect &rect, bool testOnly) const; int doLayout(const QRect &rect, bool testOnly) const;
int smartSpacing(QStyle::PixelMetric pm) const;
QList<QLayoutItem *> itemList; QList<QLayoutItem *> itemList;
int m_hSpace;
int m_vSpace;
}; };
} // namespace Internal } // namespace Utils
} // namespace Core
#endif // FLOWLAYOUT_H #endif // FLOWLAYOUT_H

View File

@@ -87,7 +87,8 @@ SOURCES += $$PWD/environment.cpp \
$$PWD/ssh/sftpchannel.cpp \ $$PWD/ssh/sftpchannel.cpp \
$$PWD/ssh/sshremoteprocessrunner.cpp \ $$PWD/ssh/sshremoteprocessrunner.cpp \
$$PWD/ssh/sshconnectionmanager.cpp \ $$PWD/ssh/sshconnectionmanager.cpp \
$$PWD/outputformatter.cpp $$PWD/outputformatter.cpp \
$$PWD/flowlayout.cpp
win32 { win32 {
SOURCES += \ SOURCES += \
@@ -187,7 +188,8 @@ HEADERS += $$PWD/environment.h \
$$PWD/ssh/sshpseudoterminal.h \ $$PWD/ssh/sshpseudoterminal.h \
$$PWD/statuslabel.h \ $$PWD/statuslabel.h \
$$PWD/outputformatter.h \ $$PWD/outputformatter.h \
$$PWD/outputformat.h $$PWD/outputformat.h \
$$PWD/flowlayout.h
FORMS += $$PWD/filewizardpage.ui \ FORMS += $$PWD/filewizardpage.ui \
$$PWD/projectintropage.ui \ $$PWD/projectintropage.ui \

View File

@@ -20,7 +20,6 @@ SOURCES += mainwindow.cpp \
tabpositionindicator.cpp \ tabpositionindicator.cpp \
fancyactionbar.cpp \ fancyactionbar.cpp \
fancytabwidget.cpp \ fancytabwidget.cpp \
flowlayout.cpp \
generalsettings.cpp \ generalsettings.cpp \
filemanager.cpp \ filemanager.cpp \
uniqueidmanager.cpp \ uniqueidmanager.cpp \
@@ -99,7 +98,6 @@ HEADERS += mainwindow.h \
tabpositionindicator.h \ tabpositionindicator.h \
fancyactionbar.h \ fancyactionbar.h \
fancytabwidget.h \ fancytabwidget.h \
flowlayout.h \
generalsettings.h \ generalsettings.h \
filemanager.h \ filemanager.h \
uniqueidmanager.h \ uniqueidmanager.h \

View File

@@ -46,6 +46,7 @@
#include <extensionsystem/pluginmanager.h> #include <extensionsystem/pluginmanager.h>
#include <utils/stylehelper.h> #include <utils/stylehelper.h>
#include <utils/flowlayout.h>
#include <QtCore/QDebug> #include <QtCore/QDebug>
#include <QtCore/QSettings> #include <QtCore/QSettings>
@@ -87,6 +88,14 @@ FindToolBar::FindToolBar(FindPlugin *plugin, CurrentDocumentFind *currentDocumen
{ {
//setup ui //setup ui
m_ui.setupUi(this); m_ui.setupUi(this);
// compensate for a vertically expanding spacer below the label
m_ui.replaceLabel->setMinimumHeight(m_ui.replaceEdit->sizeHint().height());
delete m_ui.replaceButtonsWidget->layout();
Utils::FlowLayout *flowlayout = new Utils::FlowLayout(m_ui.replaceButtonsWidget, 0, 3, 3);
flowlayout->addWidget(m_ui.replaceButton);
flowlayout->addWidget(m_ui.replaceNextButton);
flowlayout->addWidget(m_ui.replaceAllButton);
m_ui.replaceButtonsWidget->setLayout(flowlayout);
setFocusProxy(m_ui.findEdit); setFocusProxy(m_ui.findEdit);
setProperty("topBorder", true); setProperty("topBorder", true);
setSingleRow(false); setSingleRow(false);
@@ -348,9 +357,7 @@ void FindToolBar::updateToolBar()
m_ui.replaceLabel->setEnabled(replaceEnabled); m_ui.replaceLabel->setEnabled(replaceEnabled);
m_ui.replaceEdit->setVisible(replaceEnabled); m_ui.replaceEdit->setVisible(replaceEnabled);
m_ui.replaceLabel->setVisible(replaceEnabled); m_ui.replaceLabel->setVisible(replaceEnabled);
m_ui.replaceButton->setVisible(replaceEnabled); m_ui.replaceButtonsWidget->setVisible(replaceEnabled);
m_ui.replaceNextButton->setVisible(replaceEnabled);
m_ui.replaceAllButton->setVisible(replaceEnabled);
m_ui.advancedButton->setVisible(replaceEnabled); m_ui.advancedButton->setVisible(replaceEnabled);
layout()->invalidate(); layout()->invalidate();

View File

@@ -6,14 +6,14 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>603</width> <width>681</width>
<height>90</height> <height>88</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Find</string> <string>Find</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout_2">
<property name="leftMargin"> <property name="leftMargin">
<number>5</number> <number>5</number>
</property> </property>
@@ -27,7 +27,7 @@
<number>2</number> <number>2</number>
</property> </property>
<property name="horizontalSpacing"> <property name="horizontalSpacing">
<number>5</number> <number>3</number>
</property> </property>
<property name="verticalSpacing"> <property name="verticalSpacing">
<number>0</number> <number>0</number>
@@ -40,152 +40,244 @@
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="Utils::FilterLineEdit" name="findEdit"/> <widget class="Utils::FilterLineEdit" name="findEdit">
</item> <property name="minimumSize">
<item row="0" column="2"> <size>
<layout class="QHBoxLayout" name="horizontalLayout_2"> <width>100</width>
<property name="spacing"> <height>0</height>
<number>3</number> </size>
</property>
<item>
<widget class="QToolButton" name="findPreviousButton">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="arrowType">
<enum>Qt::LeftArrow</enum>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="findNextButton">
<property name="font">
<font/>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="arrowType">
<enum>Qt::RightArrow</enum>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="close">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QLabel" name="replaceLabel">
<property name="text">
<string>Replace with:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1"> <item row="0" column="2">
<widget class="Utils::FilterLineEdit" name="replaceEdit"/> <widget class="QWidget" name="findButtonsWidget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="spacing">
<number>3</number>
</property>
<property name="margin">
<number>0</number>
</property>
<item>
<widget class="QToolButton" name="findPreviousButton">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="arrowType">
<enum>Qt::LeftArrow</enum>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="findNextButton">
<property name="font">
<font/>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="arrowType">
<enum>Qt::RightArrow</enum>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="close">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</widget>
</item> </item>
<item row="1" column="2"> <item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing"> <property name="spacing">
<number>3</number> <number>0</number>
</property> </property>
<item> <item>
<widget class="QToolButton" name="replaceButton"> <widget class="QLabel" name="replaceLabel">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text"> <property name="text">
<string>Replace</string> <string>Replace with:</string>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextOnly</enum>
</property>
<property name="arrowType">
<enum>Qt::LeftArrow</enum>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QToolButton" name="replaceNextButton"> <spacer name="verticalSpacer_2">
<property name="font">
<font/>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>Replace &amp;&amp; Find</string>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextOnly</enum>
</property>
<property name="arrowType">
<enum>Qt::RightArrow</enum>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="replaceAllButton">
<property name="font">
<font/>
</property>
<property name="text">
<string>Replace All</string>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextOnly</enum>
</property>
</widget>
</item>
<item>
<spacer name="replaceSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>40</width> <width>0</width>
<height>0</height> <height>0</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout>
</item>
<item row="1" column="1">
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>0</number>
</property>
<item> <item>
<widget class="QToolButton" name="advancedButton"> <widget class="Utils::FilterLineEdit" name="replaceEdit">
<property name="text"> <property name="minimumSize">
<string>Advanced...</string> <size>
</property> <width>100</width>
<property name="toolButtonStyle"> <height>0</height>
<enum>Qt::ToolButtonTextOnly</enum> </size>
</property> </property>
</widget> </widget>
</item> </item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="1" column="2">
<layout class="QGridLayout" name="gridLayout">
<property name="horizontalSpacing">
<number>3</number>
</property>
<property name="verticalSpacing">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QWidget" name="replaceButtonsWidget" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QHBoxLayout" name="replaceButtonsLayout">
<property name="spacing">
<number>3</number>
</property>
<property name="margin">
<number>0</number>
</property>
<item>
<widget class="QToolButton" name="replaceButton">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>Replace</string>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextOnly</enum>
</property>
<property name="arrowType">
<enum>Qt::LeftArrow</enum>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="replaceNextButton">
<property name="font">
<font/>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text">
<string>Replace &amp;&amp; Find</string>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextOnly</enum>
</property>
<property name="arrowType">
<enum>Qt::RightArrow</enum>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="replaceAllButton">
<property name="font">
<font/>
</property>
<property name="text">
<string>Replace All</string>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextOnly</enum>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="0" column="1">
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="spacing">
<number>0</number>
</property>
<item>
<widget class="QToolButton" name="advancedButton">
<property name="text">
<string>Advanced...</string>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextOnly</enum>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout> </layout>
</item> </item>
</layout> </layout>
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget> <customwidget>
<class>Utils::FilterLineEdit</class> <class>Utils::FancyLineEdit</class>
<extends>QLineEdit</extends> <extends>QLineEdit</extends>
<header location="global">utils/fancylineedit.h</header>
</customwidget>
<customwidget>
<class>Utils::FilterLineEdit</class>
<extends>Utils::FancyLineEdit</extends>
<header location="global">utils/filterlineedit.h</header> <header location="global">utils/filterlineedit.h</header>
</customwidget> </customwidget>
</customwidgets> </customwidgets>