00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "elements/CEGUIPopupMenu.h"
00027 #include "elements/CEGUIMenuItem.h"
00028
00029
00030 namespace CEGUI
00031 {
00032
00033
00034
00035
00036 PopupMenuProperties::FadeInTime PopupMenu::d_fadeInTimeProperty;
00037 PopupMenuProperties::FadeOutTime PopupMenu::d_fadeOutTimeProperty;
00038
00039
00040
00041
00042
00043 const String PopupMenu::EventNamespace("PopupMenu");
00044
00045
00046
00047
00048
00049 PopupMenu::PopupMenu(const String& type, const String& name)
00050 : MenuBase(type, name),
00051 d_origAlpha(d_alpha),
00052 d_fadeOutTime(0),
00053 d_fadeInTime(0),
00054 d_fading(false),
00055 d_fadingOut(false)
00056 {
00057 d_itemSpacing = 2;
00058 d_horzPadding = 10;
00059 d_vertPadding = 2;
00060 d_borderWidth = 0;
00061
00062 addPopupMenuProperties();
00063
00064
00065 d_autoResize = true;
00066
00067
00068 setClippedByParent(false);
00069
00070
00071 hide();
00072 }
00073
00074
00075
00076
00077
00078 PopupMenu::~PopupMenu(void)
00079 {
00080 }
00081
00082
00083
00084
00085
00086 void PopupMenu::openPopupMenu(void)
00087 {
00088
00089 if (d_fading)
00090 {
00091
00092 if (!d_fadingOut)
00093 {
00094
00095 return;
00096 }
00097
00098 else
00099 {
00100
00101 if (d_fadeInTime>0.0f&&d_fadeOutTime>0.0f)
00102 {
00103
00104 d_fadeElapsed = ((d_fadeOutTime-d_fadeElapsed)/d_fadeOutTime)*d_fadeInTime;
00105 }
00106 else
00107 {
00108
00109 d_fadeElapsed = 0;
00110 }
00111
00112 d_fadingOut=false;
00113 }
00114
00115 }
00116
00117 else if (d_fadeInTime>0.0f)
00118 {
00119 d_fading = true;
00120 d_fadingOut=false;
00121 setAlpha(0.0f);
00122 d_fadeElapsed = 0;
00123 }
00124
00125 else
00126 {
00127 d_fading = false;
00128 setAlpha(d_origAlpha);
00129 }
00130
00131 show();
00132 moveToFront();
00133 }
00134
00135
00136
00137
00138
00139 void PopupMenu::closePopupMenu(void)
00140 {
00141
00142 if (d_fading)
00143 {
00144
00145 if (d_fadingOut)
00146 {
00147
00148 return;
00149 }
00150
00151 else
00152 {
00153
00154 if (d_fadeInTime>0.0f&&d_fadeOutTime>0.0f)
00155 {
00156
00157 d_fadeElapsed = ((d_fadeInTime-d_fadeElapsed)/d_fadeInTime)*d_fadeOutTime;
00158 }
00159 else
00160 {
00161
00162 d_fadeElapsed = 0;
00163 }
00164
00165 d_fadingOut=true;
00166 }
00167
00168 }
00169
00170 else if (d_fadeOutTime>0.0f)
00171 {
00172 d_fading = true;
00173 d_fadingOut=true;
00174 setAlpha(d_origAlpha);
00175 d_fadeElapsed = 0;
00176 }
00177
00178 else
00179 {
00180 d_fading = false;
00181 hide();
00182 }
00183
00184 }
00185
00186
00187
00188
00189
00190 void PopupMenu::updateSelf(float elapsed)
00191 {
00192 ItemListBase::updateSelf(elapsed);
00193
00194
00195 if (d_fading)
00196 {
00197 d_fadeElapsed+=elapsed;
00198
00199
00200 if (d_fadingOut)
00201 {
00202 if (d_fadeElapsed>=d_fadeOutTime)
00203 {
00204 hide();
00205 d_fading=false;
00206 }
00207 else
00208 {
00209 setAlpha(d_origAlpha*(d_fadeOutTime-d_fadeElapsed)/d_fadeOutTime);
00210 }
00211
00212 }
00213
00214
00215 else
00216 {
00217 if (d_fadeElapsed>=d_fadeInTime)
00218 {
00219 d_fading=false;
00220 setAlpha(d_origAlpha);
00221 }
00222 else
00223 {
00224 setAlpha(d_origAlpha*d_fadeElapsed/d_fadeInTime);
00225 }
00226
00227 }
00228
00229 }
00230
00231 }
00232
00233
00234
00235
00236
00237 void PopupMenu::layoutItemWidgets()
00238 {
00239
00240 Rect render_rect = getItemRenderArea();
00241
00242
00243 const float x0 = render_rect.d_left+d_borderWidth;
00244 float y0 = render_rect.d_top+d_borderWidth;
00245
00246 Rect rect;
00247 Size sz(render_rect.getWidth()-d_borderWidth-d_borderWidth,0);
00248
00249
00250 ItemEntryList::iterator item = d_listItems.begin();
00251 while ( item != d_listItems.end() )
00252 {
00253
00254 sz.d_height = (*item)->getItemPixelSize().d_height;
00255 sz.d_height += d_vertPadding+d_vertPadding;
00256
00257
00258 rect.setPosition( Point(x0, y0) );
00259 rect.setSize( sz );
00260 (*item)->setRect(Absolute,rect);
00261
00262
00263 y0 += sz.d_height + d_itemSpacing;
00264
00265 item++;
00266 }
00267 }
00268
00269
00270
00271
00272
00273 Size PopupMenu::getContentSize()
00274 {
00275
00276 float widest = 0;
00277 float total_height = 0;
00278
00279 size_t count = 0;
00280 size_t max = d_listItems.size();
00281 while (count < max)
00282 {
00283 const Size sz = d_listItems[count]->getItemPixelSize();
00284 if (sz.d_width > widest)
00285 widest = sz.d_width;
00286 total_height += sz.d_height;
00287
00288 count++;
00289 }
00290
00291 const float dbl_border = d_borderWidth+d_borderWidth;
00292
00293
00294 total_height += 2.0f*count*d_vertPadding;
00295
00296 total_height += (count-1)*d_itemSpacing;
00297
00298 total_height += dbl_border;
00299
00300
00301 widest += d_horzPadding+d_horzPadding;
00302
00303 widest += dbl_border;
00304
00305
00306 return Size( widest, total_height );
00307 }
00308
00309
00310
00311
00312
00313 void PopupMenu::onAlphaChanged(WindowEventArgs& e)
00314 {
00315 ItemListBase::onAlphaChanged(e);
00316
00317
00318 if (!d_fading)
00319 {
00320 d_origAlpha = d_alpha;
00321 }
00322 }
00323
00324
00325
00326
00327
00328 void PopupMenu::addPopupMenuProperties(void)
00329 {
00330 addProperty(&d_fadeInTimeProperty);
00331 addProperty(&d_fadeOutTimeProperty);
00332 }
00333
00334 }