1 module armos.app.window;
2 
3 import armos.events;
4 import armos.math;
5 import armos.app;
6 
7 /++
8 armosで用いるWindowsの雛形となるinterfaceです.新たにWindowを実装する際はこのinterfaceを継承することでrunnerから実行できます.
9 +/
10 interface Window{
11     public{
12         enum bool hasRenderer = false;
13         /++
14             Windowsが実行するイベントを表すプロパティです.
15         +/
16         // CoreEvents events();
17 
18         /++
19             サイズのプロパティです
20         +/
21         void size(Vector2i size);
22 
23         /++
24             サイズのプロパティです.
25         +/
26         Vector2i size()const;
27 
28         /++
29             サイズのプロパティです.
30         +/
31         Vector2i frameBufferSize()const;
32 
33         /++
34             イベントが発生している場合,登録されたイベントを実行します
35         +/
36         void pollEvents();
37 
38         /++
39             Windowを更新します.
40         +/
41         void update();
42 
43         /++
44             Windowを閉じます.
45         +/
46         void close();
47 
48         /++
49             Windowがフレームの最後に閉じる場合trueになります.
50         +/
51         bool shouldClose();
52 
53         /++
54             Windowのアスペクト比を表します
55         +/
56         float aspect();
57 
58         /++
59             Windowのタイトル文字列のプロパティです.
60         +/
61         string name();
62 
63         /++
64             Windowのタイトル文字列のプロパティです.
65         +/
66         void name(in string str);
67         
68         ///
69         // void initEvents(BaseApp, CoreEvents);
70         void select();
71 
72         /// VerticalSync
73         void verticalSync(in bool);
74 
75         float pixelScreenCoordScale()const;
76     }//public
77 }
78 
79 mixin template BaseWindow(){
80     public{
81         /++
82         +/
83         bool shouldClose(){return _shouldClose;}
84 
85         /++
86         +/
87         string name(){return _name;}
88 
89         /++
90         +/
91         void name(in string str){_name = str;}
92 
93         /++
94         +/
95         // CoreEvents events(){
96         //     assert(_coreEvents);
97         //     return _coreEvents;
98         // }
99 
100         /++
101         +/
102         float aspect(){
103             if(size[1]==0){
104                 return 0;
105             }else{
106                 return cast(float)size[0]/cast(float)size[1];
107             }
108 
109         }
110         
111     }//public
112 
113     protected{
114         bool _shouldClose = false;
115         string _name = "";
116         Vector2f _windowSize;
117         
118     }//protected
119 }
120 
121 /++
122     現在のWindowを返す関数です.
123 +/
124 Window currentWindow(){
125     return mainLoop.window;
126 }
127 
128 /++
129     現在のWindowの大きさを変更する関数です.
130 +/
131 void windowSize(Vector2i size){
132     currentWindow.size(size);
133 }
134 
135 /++
136     現在のWindowの大きさを返す関数です.
137 +/
138 Vector2i windowSize(){
139     return currentWindow.size;
140 }
141 
142 /++
143     現在のWindowのアスペクト比を返す関数です.
144 +/
145 float windowAspect(){
146     return currentWindow.aspect;
147 }
148 
149 /++
150 +/
151 void windowTitle(in string str){
152     currentWindow.name = str;
153 }
154 
155 /++
156 +/
157 string windowTitle(){
158     return currentWindow.name;
159 }
160 
161 ///
162 void verticalSync(in bool f){
163     currentWindow.verticalSync = f;
164 }