From 383ed798dd7f781ea7ca0089961a2ee3325553c4 Mon Sep 17 00:00:00 2001
From: con <qtc-committer@nokia.com>
Date: Mon, 18 Jan 2010 12:48:27 +0100
Subject: [PATCH] Add widget for selecting settings for a specific target.

---
 .../images/targetbuildselected.png            | Bin 0 -> 1359 bytes
 .../images/targetrunselected.png              | Bin 0 -> 1305 bytes
 .../images/targetseparatorbackground.png      | Bin 0 -> 393 bytes
 .../images/targetunselected.png               | Bin 0 -> 1060 bytes
 .../projectexplorer/projectexplorer.pro       |  11 +-
 .../projectexplorer/projectexplorer.qrc       |   6 +-
 .../projectexplorer/targetselector.cpp        | 129 ++++++++++++++++++
 src/plugins/projectexplorer/targetselector.h  |  48 +++++++
 .../projectexplorer/targetsettingswidget.cpp  |  83 +++++++++++
 .../projectexplorer/targetsettingswidget.h    |  49 +++++++
 .../projectexplorer/targetsettingswidget.ui   |  67 +++++++++
 11 files changed, 389 insertions(+), 4 deletions(-)
 create mode 100644 src/plugins/projectexplorer/images/targetbuildselected.png
 create mode 100644 src/plugins/projectexplorer/images/targetrunselected.png
 create mode 100644 src/plugins/projectexplorer/images/targetseparatorbackground.png
 create mode 100644 src/plugins/projectexplorer/images/targetunselected.png
 create mode 100644 src/plugins/projectexplorer/targetselector.cpp
 create mode 100644 src/plugins/projectexplorer/targetselector.h
 create mode 100644 src/plugins/projectexplorer/targetsettingswidget.cpp
 create mode 100644 src/plugins/projectexplorer/targetsettingswidget.h
 create mode 100644 src/plugins/projectexplorer/targetsettingswidget.ui

diff --git a/src/plugins/projectexplorer/images/targetbuildselected.png b/src/plugins/projectexplorer/images/targetbuildselected.png
new file mode 100644
index 0000000000000000000000000000000000000000..f1cf44c08b97cd29655a9af67f07e772a195060a
GIT binary patch
literal 1359
zcmV-V1+e;wP)<h;3K|Lk000e1NJLTq003<O001ip1^@s6a`^@)00001b5ch_0Itp)
z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_000EyNkl<Zc-rk;
zO)N8A7(I%%I^$KQg!l_d>o=l)61uP<79|!oT{CtPx)z}e7IrL%%}BcJ#!eTSSTrT+
zMy*8J*ib1#gwD{a<bJD4nZEt1yqM&k<ffTBGk4}br_VXh+%}VEu~-PhFeof61cfqC
zpwsE_=g%K#G#VNWrI1!wSO|?q1Fcp|qoEYi0DuqzLI{n9Qb<b@MoCi+R5S!M(<mru
z6jUB*^+-YGk>X>dC9{o!W*P<cGzwZhQhB7Hq)|}PXdyyDGmV0hMoFWfo<{MVnby|U
zhMt}t)YsReuC5L$)$e~MUtV5T3<>dg9PxM@qA23&>FIN%Ra8`9VqyZ#&CQDYHWET`
zdU~ped(~((&}cN!>-8utEyeZqH4=$LX3~<AOoh>Cgxzij!!U}J5G6@|EEYp77Q_Ah
zJ@k4#s;jFJi9`^K#j^Lbii!%%&dw^9uvFrdhP%5vyu7@iva%B4a5!zorIp9Y$w@E_
z^S_f`T3UkF>wVK_v)RD&e8%%cQN;B0GyuTqbV3jWxLhvqJP(`ACOdX~d>kyxVtaf0
z+cIr%a1f)Tqp#cN=jU)bow&Wd{pZ9zJUl?9QlY%O92XZCvi+)5(g-1FX=(Yehw(g*
z-Q8UnjYha!F1X$9Un7s7X~AF+cDo&Ob8`TI(b3T_88@4DcXtOu2(((QY@aOCdV70w
z4pdiH7eb*BqS0u^<5-r3)9L)xo|YOHNs<r<1klvf^sSN`jYh#R3?3gJGkaQldwb3o
zIXpZ>RaF&6Mn>RrxgZF_t6ZjT+ibRslIQh$AqWB@kqB6p{n0{%5CV?lV6j+maBu)Z
z2y8YR3<d+%*Vh36LqkJoYHGsz`ueNva~ubQ!GN=~Gi+>Z$O4}YBuPR^Nr`M8GI``U
z?!$u%f`H-SVT3{<SgqEa1D*7+)zwu1!1newrlzKTOd?Gt6V}$&u&}Uz{r!D-Jf1fJ
ze6Lc;&zhPVY;A49;c$TCIP~}T=XCu<B7uT}0$IQ8Df#*N`NP3UdYaX0g&+tJ1R>`@
zd%a$Wq6o9u43=d-{U!Jeg25nWW@Zo!20!HUM@L6EKR?Iq?Ja`AAPfe>m)@5uodJHv
z(~>f&^g<+c3_%c3Q&WS^&Q1_Q@c8)n=2)Fh_t$YGNy_;i^7HeNNF?N$_P*oz`1n(v
zmL$(;G`{Hzg+f`4VK$oq0D(XNqA0@cc0&}!AE_Rb<4BSOkH>?tv9Z_f+S*!h90!xh
z1dGKYdoFzMskvOgsHi9{>8kew`u+Z#J<aWQ!)mpH=XrE>bzxv&0HII_!^6W_2fnJR
z3U<34kw^sN<Kx)b+4-@OKehRMKIn8h3=Ivz=kwv_<^~Rj13b^;<mBX^l>IErA{vd#
z`t!QGy9vWEP^;Ci6JA_gL~CoSqE|!a=jXG|?%#;g(o!%CgK#)3_q22;Y;JBsk|a?4
z42p}3QC3!ltE;Q*3K2pGE-x>!va*tsm;A;>V<k1cUjMp$_5A#tzCfw0taPZ=YT0jO
zH#ax%`~7HWX!!Dy^*gY)xA!gUgkJ%zRttt<U@#b<R;zJwae;U|{@3I4%w{uTSvKQ)
zL^?V;(AU?8#>Pf8Ha058)0Bc(EQWYIj%YNR)yhep*=(jSe^D6dfB6-N{{Ua_?~j`_
RoFD)I002ovPDHLkV1iEsg~|W`

literal 0
HcmV?d00001

diff --git a/src/plugins/projectexplorer/images/targetrunselected.png b/src/plugins/projectexplorer/images/targetrunselected.png
new file mode 100644
index 0000000000000000000000000000000000000000..228287b3e102ade477734619d48d60bb15fe0427
GIT binary patch
literal 1305
zcmV+!1?KvRP)<h;3K|Lk000e1NJLTq003<O001ip1^@s6a`^@)00001b5ch_0Itp)
z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_000E6Nkl<Zc-rk;
zNl5!n7=5*^X_Hn(QR;FKT&SQ25upeg#03OBdGM|WkDjZ=1*M7?Zz_U#@*sE<6c;Rs
z2Ngs`a6v^}C~i=fq@pc2|5J;aR_oed{>+1cPG&NhZ(iQ_eVK-6N=ixy$8pf>^`KA(
zbS%pvE-nrX!_d`G3u$`29t^|4U@*|tPzz}QKnMXLgsz5KNDB}~NmCDE=n_z+QBcw-
zsC%T@BL#Jj6rUq4pf(DsGzuEiC}{Rb-6I7hje?R!6A=okGzv-@C5?i{G>X4en$c*4
z$z%e<FsgcMtF5i=pP%FN^D|CQPjPZ`g0;0ZY;SLWk2JkrkCc=Y5JDi!GVbo~@bvVg
z3c|9ovQ#n8n3x!3W@aKYGZQ?|V{dN{V`F2uy1EK~&dXi?mxW;%q^GAtmSwozZrt77
z;qmcN(eGa_YJ}BlMSFWYva_?p+7%OuFr7{Zi^YQL>ucQH+^CAE|3iG{I1Vi>El5sI
z4ryCR_n4fV43Ecy`}_NM2QM!#2ha1bj!jHVV0U--!-+LFH)DT)A1;?GIF29)aJgKH
zzMY+&VcWvtJLL8B^k8agDp;?ptAoSg_;cbK8ynHv+Z)<FzAOfV0fdl<6c)hf=qNfm
zIv@xF8X6jqkdP4Zxo;QtqrQKow)psXtgf!Y>2yLAMfCLaM8#F+<>h^>G>+pSNz$i{
zCWPSP;sO9*Hk;w`c;4+lG&B@;ocFHrnfd$#Dk>_lyu1ui6r<uQi;IgD8KvSm&1f_R
zRrXoZEEWsS&(Cpue2mJ<%Am_zSXfZhySuxCzu%5iSy_qP++3ulrb3qGsFF54Jq=M5
zQC3zKbe*CoVs36uQ4gpwKyX=E*|*(lety2f7KPGuIvxCe|EG*@YHE7rDnq%vaP?4a
zMMXuBBnb|O165U3!MOR?35LyP0|3<4)<(Seq9~%dxfv|WVqjnZPNx&Ct*u|4LsC+b
z!tNjW=X!K>6b^?2f*_!&sR;!I1z#Sks;UYmlL`C#`v8FX`T19B`%A2>tf02GHe%Np
zP-K05J!)!df)CH%fzRjrI1%yt{m^Q)pAPhd5G*Y%0RSu(%a@h*UIrMAw7;~p6aX+X
zG7^;=CsabHAkFLb!e}&piL`)$7Z(?pnVA6qq@|^S5CV-x6A@{%v$Ftz+}vCcLQq{@
z4U@?fHPU#VM|pWUCMPEW09vg!*fu^sj>W~rUnOm4XGfVmzP+O*NkU>`B5rSQzZBC1
zLBQtbCNvri1VI4L^Kd$ySYKa{IHtWk@8IAds)+~y*zI<>TrTwW^}%kpV`F0jHk%DB
z%ff24;_&eB*GOAkT~*kkDJm)=9LFIxHa2)LBO?P|uNOBrH>%xL$jQlx%Cpr^tE{W5
zOBvHbb-uj3L}Fqh%w{tvq64qji{atn$andDJ|Em}H`3D5pw((stvEG8mSyz!_XjsC
zLXs9L20T1G;N;{47K;Te%R-VQJUu<(@$pd=hO2escyDhHgM))%2@CFsgoEGj$JyB#
zSeAv^Y({*1JpBs7FW~6t2uDXpSXo)Y*4EaC{WXP!h4kYuDg%9&UxoM&yRk)yHE&3_
P00000NkvXXu0mjfQ4LR}

literal 0
HcmV?d00001

diff --git a/src/plugins/projectexplorer/images/targetseparatorbackground.png b/src/plugins/projectexplorer/images/targetseparatorbackground.png
new file mode 100644
index 0000000000000000000000000000000000000000..ff14f0d6737a1e08d2ea6444a34d76aaf7a12511
GIT binary patch
literal 393
zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-#^NA%Cx&(BWL^R}Y)RhkE)4%c
zaKYZ?lYt_f1s;*b3=G`DAk4@xYmNj^i;Sm>V@Srmx3j$aS`Bzuq_qvd+Y6L8u?BI-
zpYQVdWc0f-w>9;oH23toPClnM-7xWGU@$&hIj_U8sn?UY=v=HI_hhLRS>Z<x9dQ<B
zP>`EtVBFEJR&;KE-wesV#|^8RCbpjUyWif+d$awG^Ebuc6aL0WbQqc$hws-@Q<F2B
zw#use<9n{v-8UkBWSbjTJ$k;$xIg&p61LAa<*qt9Hs_tIt+Sq)AKP3NbV<L#sJQ1$
zcu#rp&B)^`(;6%1983NG>U11)n*S_`^KUw5pVnLBSF`DX;=C!R=LNk=>+9wGeM@&!
zb;hF3k7wc~cb`7Dr|YP*jpU~KrEjj6mb&)ny!n0aM*aPA@pBRp5!bgiObG&d<IuKT
ip!??TvoAN?C|^?dJnZVhPw#<&$KdJe=d#Wzp$PyK<)z*L

literal 0
HcmV?d00001

diff --git a/src/plugins/projectexplorer/images/targetunselected.png b/src/plugins/projectexplorer/images/targetunselected.png
new file mode 100644
index 0000000000000000000000000000000000000000..2df56444182b87e036c7c3343e73e183663d4bf7
GIT binary patch
literal 1060
zcmV+<1l#+GP)<h;3K|Lk000e1NJLTq003<O001ip1^@s6a`^@)00001b5ch_0Itp)
z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_000BGNkl<Zc-rlo
zze^)Q9K}C(IVCGL(L!)zmrbda1{;%*E?C%TVG|Gx{sR{21r35=6-Y`8K~Mw*ZN%6}
zu#BBsniMJ4D%lN@>|B*4#vgZ@aJYN(U|^Q)clf^f?t3#kY<>tK1QM>ouXejlyWN&E
z;S%_KK7Ij6vAIlXLI_zj7eNTYPdN=PRGPF$X^#^Bz#gU2q|zj$(j=tPq|zj$(j-2i
zG$91GZOhq^_9!9kQ9>$BDosLeL?r%Wdu+8@3=a=Wdvp_;%_c)bLsDsOf@N8Zj*fa)
zX<l5@8jS|y<Ky1lh<H(HjYh+hygY4>^?Kd2uQHys$9lc)NnX+(|5tl_cz7U}%Q@Fm
zQ&Xf;sXuN4j*gB1SXo(NYio-{BEkIp{HyzNxg6nem_#D+PwnyQ>WcI8^H1|~#d}&O
zc5iPF%d*Jja@^kDvbebTVchca@{9OC<?-1ZP1EdKY2k2~jg1Y5*V)+_sZ`4SO6#6<
zzu!+V7{oA)FOB(L%vT<)ev8)2Yi4E!UDv;b<@UW1>5#B(8^bWrb)94~iEZ2L?CcPU
zM2N@Z0Oa#|G)*HOkH6@5;%(bT*L9AMk1-5`U@(YfS%gBNPv>ZwX5YLzb7L3=rBaDV
zB!X?*PJZch8i4ETYjj;FolcX_=K*+ndU80V(`gh%`92$wPVDC9CIG=;kU${tLLI&1
zcVBnkXPPDl2M5ICabmF;x~@|w6uxAS&1SQ2Rp`3z@Jc3=#A30(;#H|sSYKafWMqW>
z{e4QM60ulpU`6}cJ#k-c0NHGoY&MIksuT)^S8LT<Ygcdo@$nIWXf%otf>0=grfFZw
zsnu%r%}diXve_(}ra9L5)&tjD#Odj2R8=Jq2%u@2vs?_K0sI`qAl(F_(I}Q>VHk#E
z37y|e(|og7?^)AZF@M{hpP&2Y)#<OUu2QK~D3{C58rPfSd*k%pJBT(grFHt{av4QY
z2m}I*jg2`(i^U?<YV|{<O-@c?Sr)}&5g`O8CnqmrzM50Ny!?JY(P)&5iwlGhD2hV0
zT6Na&ySuv&ZGRBCbdNW%H7%3L0HCTWYinx=Ay`;g;PCK}OeTY>s;H{^VbT14KTAtX
zoSvR?d3pI}%pi87pWQtI%+Ahob8|znSY&Q)j{Ez2c6WDC6opVIgk@Q;iZrNPddK-u
ztJOrUR`cA+!S?pH^B{Q%6B85O{zgO|W67d@uTy?mG<R{5|G9Rf(xg4QuxLJ?&$FMJ
ed6AdT=i@itU6H9!o51A&0000<MNUMnLSTY0UG^gY

literal 0
HcmV?d00001

diff --git a/src/plugins/projectexplorer/projectexplorer.pro b/src/plugins/projectexplorer/projectexplorer.pro
index da492ea272d..981a42da11a 100644
--- a/src/plugins/projectexplorer/projectexplorer.pro
+++ b/src/plugins/projectexplorer/projectexplorer.pro
@@ -66,7 +66,9 @@ HEADERS += projectexplorer.h \
     projectexplorersettingspage.h \
     projectwelcomepage.h \
     projectwelcomepagewidget.h \
-    baseprojectwizarddialog.h
+    baseprojectwizarddialog.h \
+    targetselector.h \
+    targetsettingswidget.h
 SOURCES += projectexplorer.cpp \
     projectwindow.cpp \
     buildmanager.cpp \
@@ -120,7 +122,9 @@ SOURCES += projectexplorer.cpp \
     projectwelcomepage.cpp \
     projectwelcomepagewidget.cpp \
     corelistenercheckingforrunningbuild.cpp \
-    baseprojectwizarddialog.cpp
+    baseprojectwizarddialog.cpp \
+    targetselector.cpp \
+    targetsettingswidget.cpp
 FORMS += processstep.ui \
     editorsettingspropertiespage.ui \
     runsettingspropertiespage.ui \
@@ -128,7 +132,8 @@ FORMS += processstep.ui \
     projectwizardpage.ui \
     removefiledialog.ui \
     projectexplorersettingspage.ui \
-    projectwelcomepagewidget.ui
+    projectwelcomepagewidget.ui \
+    targetsettingswidget.ui
 
 win32 { 
     SOURCES += applicationlauncher_win.cpp \
diff --git a/src/plugins/projectexplorer/projectexplorer.qrc b/src/plugins/projectexplorer/projectexplorer.qrc
index a9e1b3488ef..2c1f8f1683e 100644
--- a/src/plugins/projectexplorer/projectexplorer.qrc
+++ b/src/plugins/projectexplorer/projectexplorer.qrc
@@ -1,5 +1,5 @@
 <RCC>
-    <qresource prefix="/projectexplorer" >
+    <qresource prefix="/projectexplorer">
         <file>images/build.png</file>
         <file>images/build_small.png</file>
         <file>images/clean.png</file>
@@ -19,5 +19,9 @@
         <file>images/run_small.png</file>
         <file>images/session.png</file>
         <file>images/stop.png</file>
+        <file>images/targetbuildselected.png</file>
+        <file>images/targetrunselected.png</file>
+        <file>images/targetseparatorbackground.png</file>
+        <file>images/targetunselected.png</file>
     </qresource>
 </RCC>
diff --git a/src/plugins/projectexplorer/targetselector.cpp b/src/plugins/projectexplorer/targetselector.cpp
new file mode 100644
index 00000000000..1a14de2e3ee
--- /dev/null
+++ b/src/plugins/projectexplorer/targetselector.cpp
@@ -0,0 +1,129 @@
+#include "targetselector.h"
+
+#include <QtGui/QPainter>
+#include <QtGui/QMouseEvent>
+#include <QtGui/QFontMetrics>
+
+static const int TARGET_WIDTH = 109;
+static const int TARGET_HEIGHT = 43;
+static const int ADDBUTTON_WIDTH = 27;
+
+using namespace ProjectExplorer::Internal;
+
+TargetSelector::TargetSelector(QWidget *parent) :
+    QWidget(parent),
+    m_currentTargetIndex(-1)
+{
+        QFont f = font();
+        f.setPixelSize(10);
+        f.setBold(true);
+        setFont(f);
+}
+
+void TargetSelector::addTarget(const QString &name)
+{
+    Target target;
+    target.name = name;
+    target.currentSubIndex = 0;
+    m_targets.append(target);
+    if (m_currentTargetIndex == -1)
+        m_currentTargetIndex = m_targets.size() - 1;
+    update();
+}
+
+void TargetSelector::removeTarget(int index)
+{
+    m_targets.removeAt(index);
+    update();
+}
+
+TargetSelector::Target TargetSelector::targetAt(int index) const
+{
+    return m_targets.at(index);
+}
+
+QSize TargetSelector::minimumSizeHint() const
+{
+    return QSize((TARGET_WIDTH + 1) * m_targets.size() + ADDBUTTON_WIDTH + 2, TARGET_HEIGHT + 2);
+}
+
+void TargetSelector::mousePressEvent(QMouseEvent *event)
+{
+    if (event->x() > (TARGET_WIDTH + 1) * m_targets.size()) {
+        // check for add button
+        event->accept();
+        emit addButtonClicked();
+    } else {
+        // find the clicked target button
+        int x = 1;
+        int index;
+        for (index = 0; index < m_targets.size(); ++index) {
+            if (event->x() <= x) {
+                break;
+            }
+            x += TARGET_WIDTH + 1;
+        }
+        --index;
+        if (index >= 0 && index < m_targets.size()) {
+            // handle clicked target
+            // check if user clicked on Build or Run
+            if (event->y() > TARGET_HEIGHT * 3/5) {
+                if ((event->x() - (TARGET_WIDTH + 1) * index) - 2 > TARGET_WIDTH / 2) {
+                    m_targets[index].currentSubIndex = 1;
+                } else {
+                    m_targets[index].currentSubIndex = 0;
+                }
+            }
+            m_currentTargetIndex = index;
+            //TODO don't emit if nothing changed!
+            update();
+            emit currentIndexChanged(m_currentTargetIndex, m_targets.at(m_currentTargetIndex).currentSubIndex);
+        } else {
+            event->ignore();
+        }
+    }
+}
+
+void TargetSelector::paintEvent(QPaintEvent *event)
+{
+    static QPixmap unselected(":/projectexplorer/targetunselected.png");
+    static QPixmap runselected(":/projectexplorer/targetrunselected.png");
+    static QPixmap buildselected(":/projectexplorer/targetbuildselected.png");
+    static QPixmap targetaddbutton(":/projectexplorer/targetaddbutton.png");
+    Q_UNUSED(event)
+
+    QPainter p(this);
+    p.setPen(QColor(89, 89, 89));
+    QSize size = minimumSizeHint();
+    //draw frame
+    p.drawLine(1, 0, size.width() - 2, 0);
+    p.drawLine(1, size.height() - 1, size.width() - 2, size.height() - 1);
+    p.drawLine(0, 1, 0, size.height() - 2);
+    p.drawLine(size.width() - 1, 1, size.width() - 1, size.height() - 2);
+    //draw targets
+    int x = 1;
+    int index = 0;
+    QFontMetrics fm(font());
+    foreach (const Target &target, m_targets) {
+        QPixmap *pixmap = &unselected;
+        if (index == m_currentTargetIndex) {
+            p.setPen(QColor(255, 255, 255));
+            if (target.currentSubIndex == 0) {
+                pixmap = &buildselected;
+            } else {
+                pixmap = &runselected;
+            }
+        } else {
+            p.setPen(QColor(0, 0, 0));
+        }
+        p.drawPixmap(x, 1, *pixmap);
+        p.drawText(x + (TARGET_WIDTH - fm.width(target.name))/2 + 1, 7 + fm.ascent(),
+            target.name);
+        x += TARGET_WIDTH;
+        p.drawLine(x, 1, x, TARGET_HEIGHT);
+        ++x;
+        ++index;
+    }
+    // draw add button
+    p.drawPixmap(x, 1, targetaddbutton);
+}
diff --git a/src/plugins/projectexplorer/targetselector.h b/src/plugins/projectexplorer/targetselector.h
new file mode 100644
index 00000000000..212f2594968
--- /dev/null
+++ b/src/plugins/projectexplorer/targetselector.h
@@ -0,0 +1,48 @@
+#ifndef TARGETSELECTOR_H
+#define TARGETSELECTOR_H
+
+#include <QWidget>
+
+namespace ProjectExplorer {
+namespace Internal {
+
+class TargetSelector : public QWidget
+{
+Q_OBJECT
+public:
+    struct Target {
+        QString name;
+        int currentSubIndex;
+    };
+
+    explicit TargetSelector(QWidget *parent = 0);
+
+    QSize minimumSizeHint() const;
+
+    Target targetAt(int index) const;
+    int targetCount() const { return m_targets.size(); }
+    int currentIndex() const { return m_currentTargetIndex; }
+    int currentSubIndex() const { return m_targets.at(m_currentTargetIndex).currentSubIndex; }
+
+public slots:
+    void addTarget(const QString &name);
+    void removeTarget(int index);
+
+signals:
+    void addButtonClicked();
+    void currentIndexChanged(int targetIndex, int subIndex);
+
+protected:
+    void paintEvent(QPaintEvent *event);
+    void mousePressEvent(QMouseEvent *event);
+
+private:
+    QList<Target> m_targets;
+
+    int m_currentTargetIndex;
+};
+
+} // namespace Internal
+} // namespace ProjectExplorer
+
+#endif // TARGETSELECTOR_H
diff --git a/src/plugins/projectexplorer/targetsettingswidget.cpp b/src/plugins/projectexplorer/targetsettingswidget.cpp
new file mode 100644
index 00000000000..6a45a4f9ed4
--- /dev/null
+++ b/src/plugins/projectexplorer/targetsettingswidget.cpp
@@ -0,0 +1,83 @@
+#include "targetsettingswidget.h"
+#include "ui_targetsettingswidget.h"
+
+static int WIDTH = 750;
+
+using namespace ProjectExplorer::Internal;
+
+TargetSettingsWidget::TargetSettingsWidget(QWidget *parent) :
+    QWidget(parent),
+    ui(new Ui::TargetSettingsWidget),
+    m_targetSelector(new TargetSelector(this))
+{
+    ui->setupUi(this);
+    ui->separator->setStyleSheet(QLatin1String("* { "
+        "background-image: url(:/projectexplorer/images/targetseparatorbackground.png);"
+        "}"));
+    m_targetSelector->raise();
+    connect(m_targetSelector, SIGNAL(addButtonClicked()),
+            this, SIGNAL(addButtonClicked()));
+    connect(m_targetSelector, SIGNAL(currentIndexChanged(int,int)),
+            this, SIGNAL(currentIndexChanged(int,int)));
+    updateTargetSelector();
+}
+
+TargetSettingsWidget::~TargetSettingsWidget()
+{
+    delete ui;
+}
+
+void TargetSettingsWidget::addTarget(const QString &name)
+{
+    m_targetSelector->addTarget(name);
+    updateTargetSelector();
+}
+
+void TargetSettingsWidget::removeTarget(int index)
+{
+    m_targetSelector->removeTarget(index);
+}
+
+QString TargetSettingsWidget::targetNameAt(int index) const
+{
+    return m_targetSelector->targetAt(index).name;
+}
+
+void TargetSettingsWidget::setCentralWidget(QWidget *widget)
+{
+    ui->scrollArea->setWidget(widget);
+}
+
+int TargetSettingsWidget::targetCount() const
+{
+    return m_targetSelector->targetCount();
+}
+
+int TargetSettingsWidget::currentIndex() const
+{
+    return m_targetSelector->currentIndex();
+}
+
+int TargetSettingsWidget::currentSubIndex() const
+{
+    return m_targetSelector->currentSubIndex();
+}
+
+void TargetSettingsWidget::updateTargetSelector()
+{
+    m_targetSelector->setGeometry((WIDTH-m_targetSelector->minimumSizeHint().width())/2, 12,
+        m_targetSelector->minimumSizeHint().width(),
+        m_targetSelector->minimumSizeHint().height());
+}
+
+void TargetSettingsWidget::changeEvent(QEvent *e)
+{
+    QWidget::changeEvent(e);
+    switch (e->type()) {
+    case QEvent::LanguageChange:
+        ui->retranslateUi(this);
+        break;
+    default:
+        break;
+    }
+}
diff --git a/src/plugins/projectexplorer/targetsettingswidget.h b/src/plugins/projectexplorer/targetsettingswidget.h
new file mode 100644
index 00000000000..ca4d8b26eaa
--- /dev/null
+++ b/src/plugins/projectexplorer/targetsettingswidget.h
@@ -0,0 +1,49 @@
+#ifndef TARGETSETTINGSWIDGET_H
+#define TARGETSETTINGSWIDGET_H
+
+#include "targetselector.h"
+
+#include <QWidget>
+
+namespace ProjectExplorer {
+namespace Internal {
+
+namespace Ui {
+    class TargetSettingsWidget;
+}
+
+class TargetSettingsWidget : public QWidget {
+    Q_OBJECT
+public:
+    explicit TargetSettingsWidget(QWidget *parent = 0);
+    ~TargetSettingsWidget();
+
+    void setCentralWidget(QWidget *widget);
+
+    QString targetNameAt(int index) const;
+    int targetCount() const;
+    int currentIndex() const;
+    int currentSubIndex() const;
+
+public slots:
+    void addTarget(const QString &name);
+    void removeTarget(int index);
+
+signals:
+    void addButtonClicked();
+    void currentIndexChanged(int targetIndex, int subIndex);
+
+protected:
+    void changeEvent(QEvent *e);
+
+private:
+    void updateTargetSelector();
+    Ui::TargetSettingsWidget *ui;
+
+    TargetSelector *m_targetSelector;
+};
+
+} // namespace Internal
+} // namespace ProjectExplorer
+
+#endif // TARGETSETTINGSWIDGET_H
diff --git a/src/plugins/projectexplorer/targetsettingswidget.ui b/src/plugins/projectexplorer/targetsettingswidget.ui
new file mode 100644
index 00000000000..64f25f70a96
--- /dev/null
+++ b/src/plugins/projectexplorer/targetsettingswidget.ui
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ProjectExplorer::Internal::TargetSettingsWidget</class>
+ <widget class="QWidget" name="ProjectExplorer::Internal::TargetSettingsWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>618</width>
+    <height>454</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>TargetSettingsWidget</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="spacing">
+    <number>0</number>
+   </property>
+   <property name="margin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="QWidget" name="separator" native="true">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="minimumSize">
+      <size>
+       <width>0</width>
+       <height>50</height>
+      </size>
+     </property>
+     <property name="maximumSize">
+      <size>
+       <width>16777215</width>
+       <height>50</height>
+      </size>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QScrollArea" name="scrollArea">
+     <property name="widgetResizable">
+      <bool>true</bool>
+     </property>
+     <widget class="QWidget" name="scrollAreaWidgetContents">
+      <property name="geometry">
+       <rect>
+        <x>0</x>
+        <y>0</y>
+        <width>614</width>
+        <height>400</height>
+       </rect>
+      </property>
+     </widget>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <resources/>
+ <connections/>
+</ui>
-- 
GitLab