source: 2012/23/RamiP/YAG2DSSBase/YAG2DSS/YAG2DSS/GUI/AListBox.cs @ 2811

Revision 2811, 18.2 KB checked in by ramipasa, 9 years ago (diff)
Line 
1// Avaruuslaatikko Graphical User Interface
2// Written by Rami "Rampastring" Pasanen, 2010
3
4using System;
5using System.Collections.Generic;
6using System.Linq;
7using Microsoft.Xna.Framework;
8using Microsoft.Xna.Framework.Audio;
9using Microsoft.Xna.Framework.Content;
10using Microsoft.Xna.Framework.GamerServices;
11using Microsoft.Xna.Framework.Graphics;
12using Microsoft.Xna.Framework.Input;
13using Microsoft.Xna.Framework.Media;
14using Microsoft.Xna.Framework.Net;
15using Microsoft.Xna.Framework.Storage;
16
17
18namespace ALTK.GUI
19{
20    public class AVector2
21    {
22        public AVector2(int x, int y)
23        {
24            X = x;
25            Y = y;
26        }
27
28        public int aX;
29        public int aY;
30
31        public int X
32        {
33            get { return aX; }
34            set { aX = value; }
35        }
36
37        public int Y
38        {
39            get { return aY; }
40            set { aY = value; }
41        }
42    }
43
44    /// <summary>
45    /// This is a game component that implements IUpdateable.
46    /// </summary>
47    public class AListBox : DrawableGameComponent
48    {
49        public delegate void SelectedObjectChangedEventHandler(object sender);
50
51        TimeSpan elapsedTime = TimeSpan.Zero;
52        TimeSpan time = TimeSpan.FromMilliseconds(30);
53
54        ContentManager content;
55        SpriteBatch spriteBatch;
56        SpriteFont spriteFont;
57        public bool UseListBoxFont = true;
58
59        public int SelectedItemIndex = -1;
60        public int ItemIdOnCursor = -1;
61
62        public int Width = 200;
63        public int Height = 30;
64
65        public string FontPath = "aMainFont";
66
67        public Texture2D Texture;
68
69        //public double Width;
70        //public double Height;
71
72        public AVector2 Position = new AVector2(0, 0);
73
74        public Color TextColor = Color.Red;
75        public Color TextColorPressed = Color.Green;
76        public Color TextColorCurrent = Color.Red;
77        public Color BackgroundColor = new Color(new Vector4(255, 180, 180, 75));
78
79        public string Action;
80
81        public bool Locked = false;
82        public bool MousePressed = false;
83
84        public int StartFromItem = 0;
85
86        public event SelectedObjectChangedEventHandler SelectedIndexChanged;
87
88        public List<AListBoxItem> ItemsList = new List<AListBoxItem>();
89
90        public int Spacing;
91
92        public AListBox(Game game)
93            : base(game)
94        {
95            content = new ContentManager(game.Services);
96        }
97
98        # region Add/Remove Item functions
99        /// <summary>
100        /// Adds an item to the Listbox. Returns true if succesful, otherwise returns false.
101        /// </summary>
102        /// <param name="ItemText">The item's text.</param>
103        /// <param name="ItemTextColor">The item's text color when idle.</param>
104        /// <param name="HoverItemTextColor">The item's text color when the cursor is over it (but the item isn't selected).</param>
105        /// <param name="SelectedItemTextColor">The item's text color it is the currently selected item.</param>
106        /// <param name="ItemTexture">The item's texture when the item isn't selected.</param>
107        /// <param name="SelectedItemTexture">The item's texture when the item is currently selected.</param>
108        /// <param name="ItemHeight">The item's height.</param>
109        /// <param name="ItemWidthAdd">The item's width spacing addition, in pixels.</param>
110        /// <returns>Returns true if succesful, otherwise returns false.</returns>
111        public bool AddItem(string ItemText, Color ItemTextColor, Color HoverItemTextColor, Color SelectedItemTextColor, Texture2D ItemTexture, Texture2D SelectedItemTexture, int ItemHeight, int ItemWidthAdd)
112        {
113            AListBoxItem item = new AListBoxItem();
114
115            TextParseReturnValue fixedForm = korjaaTeksti(ItemText);
116
117            item.Text = fixedForm.text;
118            item.TextColor = ItemTextColor;
119            item.TextColorIdle = ItemTextColor;
120            item.HoverTextColor = HoverItemTextColor;
121            item.SelectedTextColor = SelectedItemTextColor;
122            item.Texture = ItemTexture;
123            item.IdleTexture = ItemTexture;
124            item.SelectedTexture = SelectedItemTexture;
125            item.Height = ItemHeight * fixedForm.lineAmount;
126
127            item.WidthAdd = ItemWidthAdd;
128
129            ItemsList.Add(item);
130
131            // Scroll the listbox down if there are too many items in the list that should be displayed
132            if (shouldBeScrolled())
133                StartFromItem++;
134
135            //NumberofItems = NumberofItems + 1;
136            return true;
137        }
138
139        public bool shouldBeScrolled()
140        {
141            // Scroll the listbox down if there are too many items in the list that should be displayed
142            int heightDistance = 0;
143            bool isLongerThanHeight = false;
144
145            for (int itemId = StartFromItem; itemId < ItemsList.Count; itemId++)
146            {
147                if ((heightDistance + ItemsList[itemId].Height) > Height)
148                {
149                    isLongerThanHeight = true;
150                    break;
151                }
152
153                heightDistance = heightDistance + ItemsList[itemId].Height + Spacing;
154            }
155
156            if (isLongerThanHeight)
157                return true;
158
159            return false;
160        }
161
162        TextParseReturnValue korjaaTeksti(string text)
163        {
164            string rivi = String.Empty;
165            TextParseReturnValue palautusarvo = new TextParseReturnValue();
166            palautusarvo.text = String.Empty;
167            string[] wordArray = text.Split(' ');
168
169            foreach (string sana in wordArray)
170            {
171                if (spriteFont.MeasureString(rivi + sana).Length() > Width)
172                {
173                    palautusarvo.text = palautusarvo.text + rivi + '\n';
174                    palautusarvo.lineAmount = palautusarvo.lineAmount + 1;
175                    rivi = String.Empty;
176                }
177
178                rivi = rivi + sana + " ";
179            }
180
181            palautusarvo.text = palautusarvo.text + rivi;
182            return palautusarvo;
183        }
184
185        public void RemoveItem(int ItemIndex)
186        {
187            // New clean, rewritten removal routine (2.) =)
188
189            ItemsList.RemoveAt(ItemIndex);
190        }
191        #endregion
192
193        protected virtual void IndexChanged(EventArgs e)
194        {
195            if (SelectedIndexChanged != null)
196                SelectedIndexChanged(this);
197        }
198
199        protected override void LoadContent()
200        {
201            spriteBatch = new SpriteBatch(GraphicsDevice);
202
203            spriteFont = ALTKHandler.Loader.loadFont(FontPath);
204
205            base.LoadContent();
206        }
207
208        public override void Initialize()
209        {
210            base.Initialize();
211        }
212
213        public void UpdateFont(string Modpath)
214        {
215            spriteFont = ALTKHandler.Loader.loadFont(FontPath);
216        }
217
218        bool Clicked;
219
220        public override void Update(GameTime gameTime)
221        {
222            int mpX = Cursor.PosX;
223            int mpY = Cursor.PosY;
224
225            if (!Locked)
226            {
227                // Käsittele hiiren rullan syöttö
228
229                if (Cursor.PosX > Position.X && Cursor.PosY > Position.Y &&
230                    Cursor.PosX < (Position.X + Width) && Cursor.PosY < (Position.Y + Height))
231                {
232                    if (Cursor.ScrollWheelValue > 0)
233                    {
234                        if (shouldBeScrolled())
235                            StartFromItem = StartFromItem + Cursor.ScrollWheelValue;
236                    }
237                    else
238                        StartFromItem = StartFromItem + Cursor.ScrollWheelValue;
239
240                    if (StartFromItem < 0)
241                        StartFromItem = 0;
242
243                    if (StartFromItem >= ItemsList.Count && ItemsList.Count > 0)
244                        StartFromItem = ItemsList.Count - 1;
245                }
246
247                int heightDistance = Position.Y;
248
249                int itemId = 0;
250                for (itemId = StartFromItem; itemId < ItemsList.Count; itemId++)
251                {
252                    if (mpX > Position.X && mpX < Position.X + Width &&
253                        mpY > heightDistance && mpY < heightDistance + ItemsList[itemId].Height)
254                    {
255                        if ((heightDistance + ItemsList[itemId].Height) - Position.Y > Height)
256                            break;
257
258                        ItemIdOnCursor = itemId;
259
260                        if (SelectedItemIndex != itemId)
261                            ItemsList[itemId].TextColor = ItemsList[itemId].HoverTextColor;
262
263                        if (Clicked == true && !Cursor.leftPressed)
264                        {
265                            SelectItem(itemId);
266                            Clicked = false;
267                        }
268
269                        if (Cursor.leftPressed)
270                            Clicked = true;
271                    }
272                    else
273                    {
274                        if (SelectedItemIndex != itemId)
275                            ItemsList[itemId].TextColor = ItemsList[itemId].TextColorIdle;
276                    }
277
278                    heightDistance = heightDistance + ItemsList[itemId].Height + Spacing;
279                }
280            }
281        }
282
283        public void Update(GameTime gameTime, int baseY, int baseX)
284        {
285            int mpX = Cursor.SecPosX;
286            int mpY = Cursor.SecPosY;
287
288            if (!Locked)
289            {
290                // Käsittele hiiren rullan syöttö
291
292                if (Cursor.SecPosX > Position.X + baseX && Cursor.SecPosY > Position.Y + baseY &&
293                    Cursor.SecPosX < (Position.X + Width + baseX) && Cursor.SecPosY < (Position.Y + Height + baseY))
294                {
295                    if (Cursor.ScrollWheelValue > 0)
296                    {
297                        if (shouldBeScrolled())
298                            StartFromItem = StartFromItem + Cursor.ScrollWheelValue;
299                    }
300                    else
301                        StartFromItem = StartFromItem + Cursor.ScrollWheelValue;
302
303                    if (StartFromItem < 0)
304                        StartFromItem = 0;
305                    else if (StartFromItem >= ItemsList.Count && ItemsList.Count > 0)
306                        StartFromItem = ItemsList.Count - 1;
307                }
308
309                int heightDistance = Position.Y;
310
311                int itemId = 0;
312                for (itemId = StartFromItem; itemId < ItemsList.Count; itemId++)
313                {
314                    if (mpX > Position.X + baseX && mpX < Position.X + Width + baseX &&
315                        mpY > heightDistance + baseY && mpY < heightDistance + ItemsList[itemId].Height + baseY)
316                    {
317                        if ((heightDistance + ItemsList[itemId].Height) - Position.Y > Height)
318                            break;
319
320                        ItemIdOnCursor = itemId;
321
322                        if (SelectedItemIndex != itemId)
323                            ItemsList[itemId].TextColor = ItemsList[itemId].HoverTextColor;
324
325                        if (Clicked == true && !Cursor.SecLeftPressed)
326                        {
327                            SelectItem(itemId);
328                            Clicked = false;
329                        }
330
331                        if (Cursor.SecLeftPressed)
332                            Clicked = true;
333                    }
334                    else
335                    {
336                        if (SelectedItemIndex != itemId)
337                            ItemsList[itemId].TextColor = ItemsList[itemId].TextColorIdle;
338                    }
339
340                    heightDistance = heightDistance + ItemsList[itemId].Height + Spacing;
341                }
342            }
343        }
344
345        public void SelectItem(int ItemNumber)
346        {
347            if (ItemNumber >= ItemsList.Count)
348                return;
349            else
350            {
351                if (SelectedItemIndex > -1)
352                {
353                    ItemsList[SelectedItemIndex].TextColor = ItemsList[SelectedItemIndex].TextColorIdle;
354                    if (ItemsList[SelectedItemIndex].IdleTexture != null)
355                    {
356                        ItemsList[SelectedItemIndex].Texture = ItemsList[SelectedItemIndex].IdleTexture;
357                    }
358                }
359
360                SelectedItemIndex = ItemNumber;
361                ItemsList[ItemNumber].TextColor = ItemsList[ItemNumber].SelectedTextColor;
362                if (ItemsList[ItemNumber].Texture != null)
363                {
364                    ItemsList[ItemNumber].Texture = ItemsList[ItemNumber].SelectedTexture;
365                }
366                IndexChanged(EventArgs.Empty);
367            }
368        }
369
370        public override void Draw(GameTime gameTime)
371        {
372            //try
373            //{
374                spriteBatch.Begin();
375                if (Texture != null)
376                {
377                    spriteBatch.Draw(Texture, new Rectangle(Position.X, Position.Y, Width, Height), BackgroundColor);
378                }
379
380                int heightDistance = Position.Y;
381
382                for (int itemId = StartFromItem; itemId < ItemsList.Count; itemId++)
383                {
384                    if ((heightDistance + ItemsList[itemId].Height) - Position.Y > Height)
385                        break;
386
387                    spriteBatch.DrawString(spriteFont, ItemsList[itemId].Text,
388                        new Vector2(Position.X + ItemsList[itemId].WidthAdd + 4, heightDistance + 1), Color.Black);
389
390                    spriteBatch.DrawString(spriteFont, ItemsList[itemId].Text,
391                        new Vector2(Position.X + ItemsList[itemId].WidthAdd + 3, heightDistance), ItemsList[itemId].TextColor);
392
393                    if (ItemsList[itemId].Texture != null)
394                        spriteBatch.Draw(ItemsList[itemId].Texture,
395                            new Rectangle(Position.X + ItemsList[itemId].WidthAdd, heightDistance, Width, ItemsList[itemId].Height), Color.White);
396
397                    heightDistance = heightDistance + ItemsList[itemId].Height + Spacing;
398                }
399                spriteBatch.End();
400            //}
401            //catch
402            //{
403
404            //}
405        }
406
407        public void Draw(GameTime gameTime, int baseX, int baseY)
408        {
409            spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.NonPremultiplied);
410
411            if (Texture != null)
412            {
413                spriteBatch.Draw(Texture, new Rectangle(Position.X + baseX, Position.Y + baseY, Width, Height), BackgroundColor);
414            }
415
416            spriteBatch.End();
417
418            int heightDistance = Position.Y + baseY;
419
420            spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend);
421            for (int itemId = StartFromItem; itemId < ItemsList.Count; itemId++)
422            {
423                if ((heightDistance + ItemsList[itemId].Height) - Position.Y > Height + baseY)
424                    break;
425
426                spriteBatch.DrawString(spriteFont, ItemsList[itemId].Text,
427                    new Vector2(Position.X + ItemsList[itemId].WidthAdd + baseX + 4, heightDistance + 1), Color.Black);
428
429                spriteBatch.DrawString(spriteFont, ItemsList[itemId].Text,
430                    new Vector2(Position.X + ItemsList[itemId].WidthAdd + baseX + 3, heightDistance), ItemsList[itemId].TextColor);
431
432                if (ItemsList[itemId].Texture != null)
433                    spriteBatch.Draw(ItemsList[itemId].Texture,
434                        new Rectangle(Position.X + ItemsList[itemId].WidthAdd + baseX, heightDistance, Width, ItemsList[itemId].Height), Color.White);
435
436                heightDistance = heightDistance + ItemsList[itemId].Height + Spacing;
437            }
438
439            spriteBatch.End();
440        }
441    }
442
443    public class AListBoxItem
444    {
445        public AListBoxItem()
446        {
447        }
448
449        public AListBoxItem(Color TextColor, string text)
450        {
451            aTextColorIdle = TextColor;
452            aTextColor = TextColor;
453            aText = text;
454        }
455
456        int aHeight = 20;
457        int aWidthAdd = 0;
458        public string aText = "";
459        Color aTextColor = Color.Red;
460        Color ASelectedTextColor = Color.White;
461        Color AHoverTextColor = Color.Purple;
462        Color aTextColorIdle = Color.Red;
463        Texture2D aTexture2D;
464        Texture2D aSelectedTexture2D;
465        Texture2D aIdleTexture2D;
466        SpriteFont aSpriteFont;
467
468        public Texture2D IdleTexture
469        {
470            get { return aIdleTexture2D; }
471            set { aIdleTexture2D = value; }
472        }
473
474        public Color TextColorIdle
475        {
476            get { return aTextColorIdle; }
477            set { aTextColorIdle = value; }
478        }
479
480        public Color HoverTextColor
481        {
482            get { return AHoverTextColor; }
483            set { AHoverTextColor = value; }
484        }
485
486        public int Height
487        {
488            get { return aHeight; }
489            set { aHeight = value; }
490        }
491
492        public int WidthAdd
493        {
494            get { return aWidthAdd; }
495            set { aWidthAdd = value; }
496        }
497
498        public string Text
499        {
500            get { return aText; }
501            set { aText = value; }
502        }
503
504        public Color TextColor
505        {
506            get { return aTextColor; }
507            set { aTextColor = value; }
508        }
509
510        public Color SelectedTextColor
511        {
512            get { return ASelectedTextColor; }
513            set { ASelectedTextColor = value; }
514        }
515
516        public Texture2D Texture
517        {
518            get { return aTexture2D; }
519            set { aTexture2D = value; }
520        }
521
522        public Texture2D SelectedTexture
523        {
524            get { return aSelectedTexture2D; }
525            set { aSelectedTexture2D = value; }
526        }
527
528        public SpriteFont SpriteFont
529        {
530            get { return aSpriteFont; }
531            set { aSpriteFont = value; }
532        }
533    }
534
535    public class TextParseReturnValue
536    {
537        public int lineAmount = 1;
538        public string text;
539    }
540
541}
Note: See TracBrowser for help on using the repository browser.