View difference between Paste ID: XZ92dsXC and WYBWGX64
SHOW: | | - or go back to the newest paste.
1
using DSDCG.Models;
2
using System;
3
using System.Collections.Generic;
4
using System.Linq;
5
using System.Text;
6
using System.Threading.Tasks;
7
using System.Windows;
8
using System.Windows.Controls;
9
using System.Windows.Data;
10
using System.Windows.Documents;
11
using System.Windows.Input;
12
using System.Windows.Media;
13
using System.Windows.Media.Imaging;
14
using System.Windows.Navigation;
15
using System.Windows.Shapes;
16
using System.IO;
17
using System.Reflection;
18
using System.Threading;
19
20
21
namespace DSDCG
22
{
23
    /// <summary>
24
    /// Interaction logic for MainWindow.xaml
25
    /// </summary>
26
    public partial class MainWindow : Window
27
    {
28
        public MediaItem _activeItem;
29
        public Container _activeContainer;
30-
        public int currentCID = 0; //storyboard má 1, další kontejnery maj 2 a furt nahoru...
30+
31
        public int currentCID = 1; //storyboard má 1, další kontejnery maj 2 a furt nahoru...
32
        public int currentMID = 1; //není žádný rootitem takže první přidělujeme jedničku...
33
        public MainWindow()
34
        {
35-
            Storyboard = new Container("Storyboard", new TimeSpan(0, 0, 0));
35+
36-
            Storyboard.cid = currentCID;
36+
            Storyboard = new Container(currentCID, "Storyboard", new TimeSpan(0, 0, 0));
37
            currentCID++;
38-
            _activeContainer = new Container("Prázdný kontejner...", new TimeSpan(0, 0, 30));
38+
            _activeContainer = new Container(currentCID, "Kontejner 1", new TimeSpan(0, 0, 30));
39
            currentCID++;
40
            LoadActiveContainer(_activeContainer);
41
        }
42
43
        #region obsluha formu
44
        private void Button_Click_1(object sender, RoutedEventArgs e) //opensinglefiledialog
45
        {
46
            Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
47
            dlg.Filter = "Obrázky |*.jpg;*.jpeg;*.png;*.bmp;*.gif"; // Filter files by extension 
48
            Nullable<bool> result = dlg.ShowDialog();
49
50
            // Process open file dialog box results 
51
            if (result == true)
52
            {
53
                // Open document 
54
                _activeItem = new MediaItem(currentMID, dlg.SafeFileName, System.IO.Path.GetDirectoryName(dlg.FileName), MediaItemType.image, string.Empty, string.Empty, new TimeSpan(0, 0, 10));
55
                currentMID++;
56
                LoadActiveItem(_activeItem);
57
            }
58
        }
59
        private void saveitembutton_Click(object sender, RoutedEventArgs e)
60
        {
61
            SaveActiveItem();
62
        } //uloží změny z formu do activeitemu
63
        private void discarditemchangesbutton_Click(object sender, RoutedEventArgs e)
64
        {
65
            LoadActiveItem(_activeItem);
66
        } //odmaže změny - vrátí co je v _activeitemu
67
        private void discardcontainerchanges_Click(object sender, RoutedEventArgs e)
68
        {
69
            LoadActiveContainer(_activeContainer);
70
        } //odmaže změny - vrátí co je v activecontaineru
71
        private void savecontainer_Click(object sender, RoutedEventArgs e)
72
        {
73
            SaveActiveContainer();
74
        }
75
        private void addtocontainer_Click(object sender, RoutedEventArgs e)
76
        {
77
            //changedvalues keep/discard dialog here...
78
            _activeContainer.mediaItems.Add(new MediaItem(_activeItem.MID, _activeItem.name, _activeItem.path, _activeItem.type.Value, _activeItem.title, _activeItem.text, _activeItem.duration));
79
        } //přidá do aktivního kontejneru aktivní media item...
80
        private void CreateInActiveButton_Click(object sender, RoutedEventArgs e)
81
        {
82-
            _activeContainer = new Container("Nový kontejner", new TimeSpan(0, 0, 30));
82+
            Container newcont = new Container();
83
            newcont.name = this.containername.Text;
84-
        } //přidání nového kontejneru...
84+
            newcont.cid = currentCID;
85
            currentCID++;
86
            if (newcont.behaviour == null || newcont.behaviour.Count < 1)
87
            {
88
                if (this.containerbehaviour.SelectedItem != null)
89
                {
90
                    newcont.behaviour.Add((Behaviour)this.containerbehaviour.SelectedItem);
91
                }
92
                else
93
                {
94
                    //default behaviour setting?
95
                }
96
            }
97
            else
98
            {
99
                newcont.behaviour[0] = (Behaviour)this.containerbehaviour.SelectedItem;
100
            }
101
102
            try
103
            {
104
                newcont.duration = TimeSpan.Parse(this.containerduration.Text);
105
                _activeContainer.containers.Add(newcont);
106
            }
107
            catch
108
            {
109
                MessageBox.Show("Čas se nepodařilo rozparsovat, uveďte jej prosím ve správném formátu");
110
                LoadActiveContainer(newcont);
111-
            MessageBox.Show(Storygrid.Children.Count.ToString());
111+
112
113
        } //vytvoří z dat ve formu kontejner do aktivního kontejneru
114
        private void DeleteActiveContainer_Click(object sender, RoutedEventArgs e)
115
        {
116
            DeleteContainer(_activeContainer.cid);
117
        } //odmaže aktivní kontejner a všechny subkontejnery
118
        private void newcontainerbutton_Click(object sender, RoutedEventArgs e)
119
        {
120
            _activeContainer = new Container(currentCID, "Nový kontejner", new TimeSpan(0, 0, 30));
121
            currentCID++;
122
            LoadActiveContainer(_activeContainer);
123
        } //přidání nového kontejneru... prakticky asi useless...
124
        private void AddContToSTB_Click(object sender, RoutedEventArgs e)
125-
            BoardGrid testgrid = new BoardGrid();
125+
126-
            testgrid = sender as BoardGrid;
126+
127-
            _activeContainer = testgrid.RelatedContainer;
127+
128-
            LoadActiveContainer(testgrid.RelatedContainer);
128+
129-
            //vyřešit naming systém name/caption u kontejnerů...
129+
130-
            //jak uložit a pracovat s datama?
130+
131-
            //dodělat form
131+
132
                    SaveActiveContainer();
133
                    Storyboard.containers.Add(_activeContainer);
134
                    break;
135
                case MessageBoxResult.No:
136
                    Storyboard.containers.Add(_activeContainer); //ano i ne dělá to stejný, akorát "ano" ještě uloží poslední úpravy z formuláře, škoda, že nemám databinding...
137
                    break;
138
                case MessageBoxResult.Cancel:
139
                    // User pressed Cancel button 
140
                    // ... 
141
                    break;
142
            }
143
            //dialog asking about changes...
144
145
        } //tlačítko na přídání aktivního kontejneru do storyboardu? To jako vážně?
146
147
        private void redraw_Click(object sender, RoutedEventArgs e)
148
        {
149
            Storygrid.Children.Clear();
150
            //(re)draw storyboard
151
            this.Storygrid.Children.Add(DrawSomething(Storyboard));
152
        } //znovuvykreslovací tlačítko boardu.
153
        void itembtn_Click(object sender, RoutedEventArgs e)
154
        {
155
            ItemButton clickeditem = sender as ItemButton;
156
            _activeItem = clickeditem.RelatedMediaItem;
157
            LoadActiveItem(_activeItem);
158
        } //co se stane když někdo klikne na mediaitembutton
159
        void congrid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
160
        {
161
            e.Handled = true;
162
            BoardGrid contgrid = new BoardGrid();
163
            contgrid = sender as BoardGrid;
164
            contgrid.RelatedContainer.contbrush = contgrid.Background;
165
            _activeContainer = contgrid.RelatedContainer;
166
            LoadActiveContainer(contgrid.RelatedContainer);
167
        } //selektor kontejnerů na kliknutí...
168
169
        private void exit_Click(object sender, RoutedEventArgs e)
170
        {
171
            Application.Current.Shutdown();
172
        } //exitovací tlačítko :)
173
        #endregion
174
175
        #region methods
176
        private void LoadActiveItem(MediaItem ItemToBeLoaded) //načte _activeitem do formu...
177
        {
178
            this.filename.Text = ItemToBeLoaded.name;
179
            this.filepath.Text = ItemToBeLoaded.path;
180
            this.filetype.SelectedItem = ItemToBeLoaded.type;
181
            try
182
            {
183
                this.title.Text = _activeItem.title;
184
            }
185
            catch (Exception)
186
            {
187
                this.title.Text = string.Empty;
188
            }
189
            try
190
            {
191
                this.text.Text = _activeItem.text;
192
            }
193
            catch (Exception)
194
            {
195
                this.text.Text = string.Empty;
196
            }
197
            try
198
            {
199
                this.duration.Text = _activeItem.duration.ToString();
200
            }
201
            catch (Exception)
202
            {
203
                this.duration.Text = new TimeSpan(0, 13, 37).ToString();
204
            }
205
        }
206
        private void SaveActiveItem() //savne data z formu do _activeitem
207
        {
208
            _activeItem.name = this.filename.Text;
209
            _activeItem.path = this.filepath.Text;
210
            _activeItem.type = (MediaItemType)this.filetype.SelectedItem;
211
            _activeItem.title = this.title.Text;
212
            _activeItem.text = this.text.Text;
213
            try
214
            {
215
                _activeItem.duration = TimeSpan.Parse(this.duration.Text);
216
            }
217
            catch
218
            {
219
                MessageBox.Show("Čas se nepodařilo rozparsovat, uveďte jej prosím ve správném formátu");
220
                LoadActiveItem(_activeItem);
221
            }
222
        }
223
        private void LoadActiveContainer(Container ContainerToBeLoaded) //načte _activecontainer do formu
224
        {
225
            this.containername.Text = ContainerToBeLoaded.name;
226
            this.ActiveContainerNameLabel.Content = ContainerToBeLoaded.name;
227
            try
228
            {
229
                this.containerbehaviour.SelectedItem = ContainerToBeLoaded.behaviour[0];
230
            }
231
            catch
232
            {
233
            }
234
            if (ContainerToBeLoaded.contbrush != null)
235
            {
236
                ActiveContainerBorder.BorderBrush = ContainerToBeLoaded.contbrush;
237
            }
238
            else
239
            {
240
                ActiveContainerBorder.BorderBrush = Brushes.Transparent;
241
            }
242
            if (_activeContainer.duration != null)
243
            {
244
                this.containerduration.Text = _activeContainer.duration.ToString();
245-
                ContainerToUpdate = searchContainerByID(cid, Storyboard);
245+
246
            if (_activeContainer.duration == null)
247
            {
248
                this.containerduration.Text = new TimeSpan(0, 0, 20).ToString();
249
            }
250
        }
251
        private void SaveActiveContainer() //načte data z formu do _activecontainer
252
        {
253
            _activeContainer.name = this.containername.Text;
254-
        private Container searchContainerByID(int cid, Container startcont) //rekurzivní procházecí funkce kontejnerů, používám ji abych mohl editovat storyboard
254+
255
            {
256
                if (this.containerbehaviour.SelectedItem != null)
257-
            if (startcont.cid == cid)
257+
258
                    _activeContainer.behaviour.Add((Behaviour)this.containerbehaviour.SelectedItem);
259-
                return startcont;
259+
260
                else
261
                {
262
                    //default behaviour setting?
263
                }
264
            }
265-
                    searchContainerByID(cid, cont);
265+
266
            {
267
                _activeContainer.behaviour[0] = (Behaviour)this.containerbehaviour.SelectedItem;
268
            }
269
270
            try
271
            {
272
                _activeContainer.duration = TimeSpan.Parse(this.containerduration.Text);
273
            }
274
            catch
275
            {
276
                MessageBox.Show("Čas se nepodařilo rozparsovat, uveďte jej prosím ve správném formátu");
277
                LoadActiveContainer(_activeContainer);
278
            }
279
        }
280
        private void UpdateContainer(int cid, Container newcont) //první část rekurzivního procházení kontejnerů...
281
        {
282
            if (cid == 1)
283
            {
284
                Storyboard = newcont;
285
            }
286
            else
287
            {
288
                Container ContainerToUpdate = new Container();
289
                ContainerToUpdate = searchContainerByID(cid, Storyboard, false);
290
                if (ContainerToUpdate != null || ContainerToUpdate.cid != 0)
291
                {
292
                    ContainerToUpdate = newcont;
293
                }
294
            }
295
296
297
        }
298
        private Container searchContainerByID(int cid, Container startcont, bool returnParent) //rekurzivní procházecí funkce kontejnerů, používám ji abych mohl editovat storyboard
299
        {
300
            //Storyboard.containers.Find(delegate(Container c) { return c.cid == cid; }); alternativní vyhledávací metoda
301
            if (!returnParent)
302
            {
303
                if (startcont.cid == cid)
304
                {
305
                    return startcont;
306
                }
307
                else
308
                {
309
                    foreach (Container cont in startcont.containers)
310
                    {
311
                        return (searchContainerByID(cid, cont, returnParent));
312
                    }
313-
            congrid.Name = CTD.name;
313+
                    return null;
314
                }
315
            }
316
            else
317
            {
318
                foreach (Container cont in startcont.containers)
319
                {
320
321
                    if (cont.cid == cid)
322
                    {
323
                        return startcont;
324
                    }
325
                    else
326
                    {
327
                        return (searchContainerByID(cid, cont, true));
328
                    }
329
                }
330
                return null;
331
            }
332
333
334
        }
335
        public TextBlock GenerateGridTextBlock(string text, int fontsize, Thickness paddingThickness, int row, int col)
336
        {
337
            TextBlock newblock = new TextBlock();
338
            newblock.Text = text;
339
            newblock.FontSize = fontsize;
340
            newblock.Padding = paddingThickness;
341
            Grid.SetRow(newblock, row);
342
            Grid.SetColumn(newblock, col);
343
            return newblock;
344
        } //šikovná věcička, ušetřila mi spoustu řádků textblocků
345
        private Brush PickRandomBrush()
346
        {
347
            Brush result = Brushes.Transparent;
348
            Thread.Sleep(3);
349
            Random rnd = new Random();
350
351
            Type brushesType = typeof(Brushes);
352
353
            PropertyInfo[] properties = brushesType.GetProperties();
354
355
            int random = rnd.Next(properties.Length);
356
            result = (Brush)properties[random].GetValue(null, null);
357
358
            return result;
359
        }//funkce nějakýho toníka ze stackoverflow, mrknout na credits "pickbrush()"
360
        public Border DrawSomething(Container CTD)
361
        {
362
            CTD.cid = currentCID;
363
            currentCID++;
364
365
            Border br1 = new Border();
366
            br1.BorderBrush = Brushes.Black;
367
            br1.BorderThickness = new Thickness(1);
368
            br1.Padding = new Thickness(1);
369
370
            Border br2 = new Border();
371
            br2.BorderBrush = PickRandomBrush();
372
            br2.BorderThickness = new Thickness(1);
373
            br2.Padding = new Thickness(1);
374
375
            BoardGrid congrid = new BoardGrid();
376
            congrid.RelatedContainer = CTD;
377
            congrid.Background = PickRandomBrush();
378
            congrid.HorizontalAlignment = HorizontalAlignment.Left;
379
            congrid.VerticalAlignment = VerticalAlignment.Center;
380
            congrid.HorizontalAlignment = HorizontalAlignment.Right;
381
            congrid.ShowGridLines = false;
382
            congrid.MouseLeftButtonDown += congrid_MouseLeftButtonDown;
383
384
            ColumnDefinition gridCol1 = new ColumnDefinition();
385
            gridCol1.Width = new GridLength();
386
            ColumnDefinition gridCol2 = new ColumnDefinition();
387
            gridCol2.Width = new GridLength();
388
            RowDefinition gridRow1 = new RowDefinition();
389
            gridRow1.Height = new GridLength();
390
            RowDefinition gridRow2 = new RowDefinition();
391
            gridRow2.Height = new GridLength();
392
            RowDefinition gridRow3 = new RowDefinition();
393
            gridRow3.Height = new GridLength();
394
395
            RowDefinition gridRow4 = new RowDefinition();
396
            gridRow4.Height = new GridLength();
397
398
            for (int z = 0; z < CTD.containers.Count; z++)
399
            {
400
                RowDefinition rowDef1 = new RowDefinition();
401
                rowDef1.Height = new GridLength();
402
                congrid.RowDefinitions.Add(rowDef1);
403
            }
404
405
406
            StackPanel mediastackpanel = new StackPanel();
407
            mediastackpanel.Orientation = Orientation.Horizontal;
408
            Grid.SetRow(mediastackpanel, 3);
409
            Grid.SetColumn(mediastackpanel, 1);
410
            foreach (MediaItem item in CTD.mediaItems)
411
            {
412
                ItemButton itembtn = new ItemButton();
413
                itembtn.RelatedMediaItem = item;
414
                itembtn.Content = item.name;
415
                itembtn.ToolTip = "Cesta: " + item.path + "\nTyp: " + item.type.ToString() + "\nTrvání: " + item.duration.ToString();
416
                itembtn.Click += itembtn_Click;
417
                mediastackpanel.Children.Add(itembtn);
418
            }
419
420
421
            int i = 0;
422
            foreach (Container container in CTD.containers)
423
            {
424
                Border brx = DrawSomething(container);
425
                int col = Convert.ToInt32(i % 2);
426
                Grid.SetColumn(brx, col);
427
                int row = Convert.ToInt32(4 + (Math.Truncate((double)i / 2)));
428
                Grid.SetRow(brx, row);
429
                congrid.Children.Add(brx);
430
                i++;
431
            }
432
433
434
            congrid.Children.Add(GenerateGridTextBlock("Jméno kontejneru", 14, new Thickness(2), 0, 0));
435
            congrid.Children.Add(GenerateGridTextBlock("Chování kontejneru", 14, new Thickness(2), 1, 0));
436
            congrid.Children.Add(GenerateGridTextBlock("Trvání kontejneru", 14, new Thickness(2), 2, 0));
437
            congrid.Children.Add(GenerateGridTextBlock("Mediální položky", 14, new Thickness(2), 3, 0));
438
            congrid.Children.Add(GenerateGridTextBlock(CTD.name, 14, new Thickness(2), 0, 1));
439
            string behaviour = string.Empty;
440
            try
441
            {
442
                behaviour = CTD.behaviour[0].ToString();
443
            }
444
            catch (Exception)
445
            {
446
                behaviour = Behaviour.sequence.ToString();
447
            }
448
            finally
449
            {
450
                congrid.Children.Add(GenerateGridTextBlock(behaviour, 14, new Thickness(2), 1, 1));
451
            }
452
            congrid.Children.Add(GenerateGridTextBlock(CTD.duration.ToString(), 14, new Thickness(2), 2, 1));
453
            congrid.Children.Add(mediastackpanel);
454
            congrid.ColumnDefinitions.Add(gridCol1);
455
            congrid.ColumnDefinitions.Add(gridCol2);
456
            congrid.RowDefinitions.Add(gridRow1);
457
            congrid.RowDefinitions.Add(gridRow2);
458
            congrid.RowDefinitions.Add(gridRow3);
459
            congrid.RowDefinitions.Add(gridRow4);
460
            br1.Child = congrid;
461
            br2.Child = br1;
462
            br2.VerticalAlignment = System.Windows.VerticalAlignment.Bottom;
463
            br2.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
464
465
            return br2;
466
        } //vykreslovací srdce všeho... rekurzivně vykresluje kontejnery od storyboardu dolu...
467
        private void DeleteContainer(int cid)
468
        {
469
            Container contToDelete = searchContainerByID(cid, Storyboard, false);
470
            Container parentcont = searchContainerByID(cid, Storyboard, true);
471
            parentcont.containers.Remove(contToDelete);
472
        } //odmaže kontejner s daným CID
473
        #endregion
474
    }
475
}