kapstok / NHL-DePa2 (public) (License: Unspecified) (since 2018-11-09) (hash sha1)
Design Patterns school project; a GUI using multiple Design Patterns.
List of commits:
Subject Hash Author Date (UTC)
Add UML documentation. e37ae39102f0dd4d182c5aeb947872e6a55de9e5 Jan Allersma 2018-11-15 14:01:01
Encapsulate MenuItems from Menubar. 6567cad3cb84761e2ccec2213e33365bf707b70a Jan Allersma 2018-11-14 16:57:20
Improve Quality of Code. 9e0c9d1b640bfbee558b3d2b85b481bd311cdf46 Jan Allersma 2018-11-14 11:19:23
Fix colour of subgroups. 8e16f02cbc7ef08943a1642e8f986c6eb90f10a3 Jan Allersma 2018-11-14 10:51:01
Fix File I/O for EntityOrnaments. e38712e53a13ba2bbb0a0b792688cfff29689826 Jan Allersma 2018-11-13 17:46:45
Allow multiple Ornaments to be aligned at the same Entity. b01673996a5b4a589b8e6c6d9dee0dc9b3c1cc60 Jan Allersma 2018-11-09 21:46:01
Allow multiple Ornaments to be added to an Entity. db1ce677fbcbba757c18ea645b76bb1688594d04 Jan Allersma 2018-11-09 17:23:02
Change Entity.group as variable into a property. bbda7fe1dd4528b9396bff03fcb669e4c6ff2ad5 Jan Allersma 2018-11-08 16:37:41
Load nested Entities with Ornaments properly. 8da015e6fd4f43cc873a5ae330caefab73b8f5fc Jan Allersma 2018-11-08 13:56:36
Save nested Entities with Ornaments properly. 645cf4ae287fd2511b4c1404d0d9559372e5e10b Jan Allersma 2018-11-08 12:04:40
Fix bug: activate group after movement with cloning. 482c53ecab43cdee03590949669c22227d104475 Jan Allersma 2018-11-08 10:35:27
Include Groups in Commands, removing dp.groups.groups. 699f767ac316edd481630a943f7a1884c5bc16f2 Jan Allersma 2018-11-07 11:27:15
Fix ability to nest in Groups. fd546a42ef54bdf5d2966eb7facbbf21a6b72e1b Jan Allersma 2018-11-06 17:49:11
Fix file I/O for single entities. 093b7d31a215067212927b1d92bdbbee306ea345 Jan Allersma 2018-11-06 16:49:55
Fix file I/O issue. 25c0b40db223c806eb3ea8bd28238dedc38ca8b5 Jan Allersma 2018-11-02 16:22:59
Cleanup commenting. 445aea4a5115c9110a097bfc7ac9f7d5ad48a9e7 Jan Allersma 2018-11-02 14:33:08
Show Ornaments on Canvas. d8456f15d69550c4cb0aa615cccb96b45a77f6a6 Jan Allersma 2018-11-02 14:08:47
Support Entities for Create & Destruct commands. cc900579eedf9c6288ce1c1883122856794e05a0 Jan Allersma 2018-11-02 13:25:43
Use entities instead of shapes when constructing ornaments. 13f08847624489f60a37db55c2aedbba6b021f98 Jan Allersma 2018-11-01 17:02:47
Remove obsolete 'calcBounds' function. 475ec330736b5800d12d091415480b163dd244e2 Jan Allersma 2018-11-01 14:28:29
Commit e37ae39102f0dd4d182c5aeb947872e6a55de9e5 - Add UML documentation.
Author: Jan Allersma
Author date (UTC): 2018-11-15 14:01
Committer name: Jan Allersma
Committer date (UTC): 2018-11-15 14:01
Parent(s): 6567cad3cb84761e2ccec2213e33365bf707b70a
Signing key:
Tree: 4310573f9abb7c003785cd23c7236c8802577004
File Lines added Lines deleted
source/entities/group.d 0 13
source/frontend/ornamentDialog.d 7 7
source/frontend/resizeDialog.d 3 3
source/frontend/shapeOptions.d 2 1
uml/Command.pdf 0 0
uml/Composite.pdf 0 0
uml/DePa2.xml 1 0
uml/File.pdf 0 0
uml/Strategy-Singleton.pdf 0 0
uml/Visitor-Decorator.pdf 0 0
uml/frontend.pdf 0 0
File source/entities/group.d changed (mode: 100644) (index 01b7bb8..93be150)
... ... class Group : Entity {
101 101 return index; return index;
102 102 } }
103 103
104 // Redundant
105 public void remove(size_t index) {
106 entities[index].group = null;
107
108 entities.length++;
109
110 for(size_t i = index; i < entities.length; i++) {
111 entities[i] = entities[i+1];
112 }
113
114 entities.length--;
115 }
116
117 104 public Entity get(size_t index) { public Entity get(size_t index) {
118 105 return entities[index]; return entities[index];
119 106 } }
File source/frontend/ornamentDialog.d changed (mode: 100644) (index 82d238f..7c20ed8)
... ... import dp.command.create;
16 16 import Global = dp.global; import Global = dp.global;
17 17
18 18 class OrnamentDialog : Dialog { class OrnamentDialog : Dialog {
19 Entity _entity;
19 Entity entity;
20 20 Entry factorEntry; Entry factorEntry;
21 21 RadioButton topRd, bottomRd, leftRd, rightRd; RadioButton topRd, bottomRd, leftRd, rightRd;
22 22 string position = "Top"; // Default value since 'topRd' is mnemonic. string position = "Top"; // Default value since 'topRd' is mnemonic.
 
... ... class OrnamentDialog : Dialog {
24 24 this(Entity e) { this(Entity e) {
25 25 super(); super();
26 26 setTitle("Attach ornament"); setTitle("Attach ornament");
27 _entity = e;
27 entity = e;
28 28
29 29 Box box = new Box(Orientation.VERTICAL, 50); Box box = new Box(Orientation.VERTICAL, 50);
30 30
 
... ... class OrnamentDialog : Dialog {
53 53
54 54 Box btnBox = new Box(Orientation.HORIZONTAL, 30); Box btnBox = new Box(Orientation.HORIZONTAL, 30);
55 55 Button cancelBtn = new Button("Cancel", &cancelCallback); Button cancelBtn = new Button("Cancel", &cancelCallback);
56 Button confirmBtn = new Button("Add ornament to shape/group", &clickCallback);
56 Button confirmBtn = new Button("Add ornament to shape/group", &confirmCallback);
57 57
58 58 btnBox.add(cancelBtn); btnBox.add(cancelBtn);
59 59 btnBox.add(confirmBtn); btnBox.add(confirmBtn);
 
... ... class OrnamentDialog : Dialog {
72 72 showAll(); showAll();
73 73 } }
74 74
75 private void clickCallback(Button button) {
75 private void confirmCallback(Button button) {
76 76 string input = factorEntry.getText(); string input = factorEntry.getText();
77 77
78 if(_entity is null) this.close();
78 if(entity is null) this.close();
79 79
80 EntityOrnament eo = new EntityOrnament(_entity);
81 _entity.partOfEo = true; // Should be moved to eo contructor?
80 EntityOrnament eo = new EntityOrnament(entity);
81 entity.partOfEo = true; // Should be moved to eo contructor?
82 82
83 83 if(input != "") { if(input != "") {
84 84 Ornament o = new Ornament(eo, position, input, Global.canvas.newContext); Ornament o = new Ornament(eo, position, input, Global.canvas.newContext);
File source/frontend/resizeDialog.d changed (mode: 100644) (index 3553e17..66c3adc)
... ... class ResizeDialog : Dialog {
26 26 factorEntry = new Entry(); factorEntry = new Entry();
27 27 factorEntry.setPlaceholderText("amount"); factorEntry.setPlaceholderText("amount");
28 28
29 Button confirmBtn = new Button("Resize!", &clickCallback);
29 Button confirmBtn = new Button("Resize!", &confirmCallback);
30 30
31 31 // Content area, containing non-interactable GTK objects. // Content area, containing non-interactable GTK objects.
32 32 getContentArea().add(new Label("By what amount should the shape be resized?")); getContentArea().add(new Label("By what amount should the shape be resized?"));
 
... ... class ResizeDialog : Dialog {
47 47 factorEntry = new Entry(); factorEntry = new Entry();
48 48 factorEntry.setPlaceholderText("amount"); factorEntry.setPlaceholderText("amount");
49 49
50 Button confirmBtn = new Button("Resize!", &clickCallback);
50 Button confirmBtn = new Button("Resize!", &confirmCallback);
51 51
52 52 // Content area, containing non-interactable GTK objects. // Content area, containing non-interactable GTK objects.
53 53 getContentArea().add(new Label("By what amount should the group be resized?")); getContentArea().add(new Label("By what amount should the group be resized?"));
 
... ... class ResizeDialog : Dialog {
60 60 showAll(); showAll();
61 61 } }
62 62
63 void clickCallback (Button button) {
63 private void confirmCallback (Button button) {
64 64 int amount = 1; int amount = 1;
65 65 string input = factorEntry.getText(); string input = factorEntry.getText();
66 66
File source/frontend/shapeOptions.d changed (mode: 100644) (index 36a94cd..2132025)
... ... public class ShapeOptions : Menu {
24 24 this.append(new AddOrnament()); this.append(new AddOrnament());
25 25 } }
26 26
27 public void selectShape (Shape shape) { // Shows options for param shape.
27 // Shows options for param shape.
28 public void selectShape (Shape shape) {
28 29 s = shape; s = shape;
29 30 this.showAll(); this.showAll();
30 31 this.popup(0, 0); this.popup(0, 0);
File uml/Command.pdf added (mode: 100644) (index 0000000..ac46ddf)
File uml/Composite.pdf added (mode: 100644) (index 0000000..0995bfc)
File uml/DePa2.xml added (mode: 100644) (index 0000000..ff9398c)
1 <mxfile userAgent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/9.3.1 Chrome/66.0.3359.181 Electron/3.0.6 Safari/537.36" version="9.4.3" editor="www.draw.io" type="device"><diagram id="17b4e77c-8acc-e0ee-e416-b07d6fb09399" name="Command">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</diagram><diagram id="35b94abb-ddb8-e890-35f1-e3b7e4b9a9fe" name="Composite">7VlNc6M4EP01rsocJoUAfx1jJ5M9ZGpTm63dmVNKBhm0kREl5MSeX78taIEx2MYxNSenXGXUan31e928yANvvto8KprG32XIxMB1ws3Aux+4LiHOCL6MZVtYJh4aIsVDdKoML/wXQ6OD1jUPWVZz1FIKzdO6MZBJwgJds1Gl5EfdbSlFfdWURqxheAmoaFr/5aGO7blG06rjD8ajGJeeuOOiY0GDt0jJdYLrDVxvmf8V3Stq58KDZjEN5ceOyXsYeHMlpS6eVps5Eya2NmzFuG8Hest9K5boTgMmuA+9tWdnIYQCm1LpWEYyoeKhss7y8zEzgwOtWK8EPBJ4ZBuufxjz7RBbP9EJtqO2RZc/9a3B9JJbxyHW8MwUXzHNFA77j2m9RXrQtZZgqrb0JGVqF07COwM7NBdCBm+F6RsXAidqxgVDlcm1CvDkyFFNVcSsF+JqgrIzDoP5yCTsVm3BQTFBNX+v84ciDaPSr4ICHhCNdmRwM+9UrHHSl5imrAFX9sFXgiYGl6VMtEXORIUKHiXwHMChTUhn70xpDiy/ww5tAjgLYi7CJ7qVa3PoTAOFbWsWS8V/wbTUQgzdSiMisMddjxczEuOtWAY+zzbeZM/0nW5qjk8002gIpBA0zfiiPMYK8ODJTGotV6fgNCdkm6NI2d4ppiCWKH+C7Y8q4cs0jXdy3XWcy9EdN9D9Cs1XqGewfVjoDlpzbBgqeMQcO/dZmOzLCpdQrk2chjN3MLy3X3v+WQ7Wjne9P9OK4oIv5pFF2/0ZTEFLC5fH/LHqb9Cx2D7QRMk3NpdCmlROZMFPyMc9k6WoYEt9kKBZSgOeRE+5z71fWf5CVIxJwtilyEtAzMOQJXmh0lTTgklmt6nkic5RG87gAzjOTakyMZtDm1Rt+Bh3pQEEEyGe84wBTT+YoWoLA0edGYiMsyNOEW7iX863SYNvDeQEzxEpkLNvPfIp2FYAQP6mQJz+zgv1V9LA0mti6bXgJuiCiWeZcc2lmV8Vvnt4/gbICOlYJCaXQzZtgWxmXk8xz27M4YCz4G0fymoxr2XyvMz7L7W0HQm9850qabI6Qht+O8WCaRn4O1ywUWjOms8UpB8HKtLZE/3sY6ITZfda5C7JmEnHjHEvTxky/V1q9oTc7KpbO8lSW3P606A49Fnm1cMqolIB2feTvyd0CmGMo/ZQKbfRDSinUdxQWVzVbS/qduScVrdk1JKGZNyDuiWkAa8ttAKIvaddvaZohYPDK4ehyn0wrS2+489Tt1ft2qmsl/l4iXht5dOoB/FK3Kt67QW0acci0IN6Jd4x+fppLSpYEsHWoXlI9hkvGoY3RdH4UrqaQvGqG67wQrspuipXrDfXStEP6ZoCsJV04z4EoN9gnQWzm7DwrsLiuLDw9q7N3OntZOhOfULGI3/sjEgT7EkL2CWPLkJ7eKDGwAn1n8sHWaTzQkrRLBFBoZRbHa7Zbunhd+bHEV3QRgC/D13QvCO/6oLPgDZu0QVtoPWhC5o332cJAC1fIQwQ2erFjs3PCQq9TVkf8xy+lb/gcquPu62j/wAVlTBgqb75hwMRpapU0LsEzPadg5gFb7P8rLU7yBPDgJwhUzdHvK4l9/PZ2yKw2rKXeOcrLGhWP0YXFz3VL/7ew/8=</diagram><diagram id="9f72014d-906d-a17d-0e16-2b8de888929a" name="Visitor/Decorator">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</diagram><diagram id="7297d303-d1fe-9c9e-93a5-7683770b8e42" name="Strategy/Singleton">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</diagram><diagram id="e7d64ebb-efdb-a361-71eb-71c4a3631018" name="Frontend">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</diagram><diagram id="6d1d39e6-b811-04aa-ca80-fc2ea2f9f15f" name="File IO">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</diagram></mxfile>
File uml/File.pdf added (mode: 100644) (index 0000000..a1698c1)
File uml/Strategy-Singleton.pdf added (mode: 100644) (index 0000000..26d25ee)
File uml/Visitor-Decorator.pdf added (mode: 100644) (index 0000000..ce2df6c)
File uml/frontend.pdf added (mode: 100644) (index 0000000..72ae935)
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/kapstok/NHL-DePa2

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/kapstok/NHL-DePa2

Clone this repository using git:
git clone git://git.rocketgit.com/user/kapstok/NHL-DePa2

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main