1 /*
2  * Copyright (C) 2015-2019, by Laszlo Szeremi under the Boost license.
3  *
4  * Pixel Perfect Engine, concrete.interfaces module
5  */
6 
7 module pixelperfectengine.concrete.interfaces;
8 
9 public import pixelperfectengine.graphics.fontsets;
10 public import pixelperfectengine.graphics.bitmap;
11 public import pixelperfectengine.graphics.common;
12 public import pixelperfectengine.graphics.text;
13 
14 public import pixelperfectengine.concrete.elements.base;
15 public import pixelperfectengine.concrete.popup.base;
16 
17 public import pixelperfectengine.system.input.types;
18 
19 /+/**
20  * Checkbox interface.
21  */
22 public interface ICheckBox {
23 	///Returns whether the object is checked.
24 	public @property bool isChecked() @safe pure @nogc nothrow const;
25 	///Sets the object to checked position and returns the new state.
26 	public bool check() @trusted;
27 	///Sets the object to unchecked position and returns the new state.
28 	public bool unCheck() @trusted;
29 }+/
30 /**
31  * Radio button interface. Can be used to implement radio button style behavior on almost any component that implements this interface.
32  */
33 public interface IRadioButton {
34 	/**
35 	 * If the radio button is pressed, then it sets to unpressed. Does nothing otherwise.
36 	 */
37 	public void latchOff() @trusted;
38 	/**
39 	 * Sets the radio button into its pressed state.
40 	 */
41 	public void latchOn() @trusted;
42 	/**
43 	 * Sets the group of the radio button.
44 	 */
45 	public void setGroup(IRadioButtonGroup group) @safe @property;
46 	/**
47 	 * Workaround the stupid issue of object.opEquals having to be `@system inpure throw`.
48 	 * The @gc would be fine still.
49 	 *
50 	 * Hey DLang foundation! Don't be cowards and commit to some meaningful changes!
51 	 */
52 	public bool equals(IRadioButton rhs) @safe pure @nogc nothrow const;
53 	/**
54 	 * Returns the assigned value of the radio button.
55 	 */
56 	public string value() @property @safe @nogc pure nothrow const;
57 }
58 /**
59  * Implements the basis of a radio button group.
60  */
61 public interface IRadioButtonGroup {
62 	/**
63 	 * Adds a radio button to the group.
64 	 */
65 	public void add(IRadioButton rg) @safe;
66 	/**
67 	 * Removes a radio button from the group.
68 	 */
69 	public void remove(IRadioButton rg) @safe;
70 	/**
71 	 * Groups receive latch signals here.
72 	 */
73 	public void latch(IRadioButton sender) @safe;
74 }
75 /**
76  * Implements the frontend of a drawable canvas, primarily for GUI elements.
77  * Used to avoid using individual bitmaps for each elements.
78  * Colors are mostly limited to 256 by the `ubyte` type. However certain window types will enable more.
79  */
80 public interface Canvas {
81 	///Draws a line.
82 	public void drawLine(Point from, Point to, ubyte color) @trusted;
83 	///Draws a line pattern.
84 	public void drawLinePattern(Point from, Point to, ubyte[] pattern) @trusted;
85 	///Draws an empty rectangle.
86 	public void drawBox(Box target, ubyte color) @trusted;
87 	///Draws an empty rectangle with line patterns.
88 	public void drawBoxPattern(Box target, ubyte[] pattern) @trusted;
89 	///Draws a filled rectangle with a specified color.
90 	public void drawFilledBox(Box target, ubyte color) @trusted;
91 	///Pastes a bitmap to the given point using blitter, which threats color #0 as transparency.
92 	public void bitBLT(Point target, ABitmap source) @trusted;
93 	///Pastes a slice of a bitmap to the given point using blitter, which threats color #0 as transparency.
94 	public void bitBLT(Point target, ABitmap source, Box slice) @trusted;
95 	///Pastes a repeated bitmap pattern over the specified area.
96 	public void bitBLTPattern(Box target, ABitmap pattern) @trusted;
97 	///XOR blits a repeated bitmap pattern over the specified area.
98 	public void xorBitBLT(Box target, ABitmap pattern) @trusted;
99 	///XOR blits a color index over a specified area.
100 	public void xorBitBLT(Box target, ubyte color) @trusted;
101 	///Fills an area with the specified color.
102 	public void fill(Point target, ubyte color, ubyte background = 0) @trusted;
103 	///Draws a single line text within the given prelimiter.
104 	public void drawTextSL(Box target, Text text, Point offset) @trusted;
105 	///Draws a multi line text within the given prelimiter.
106 	public void drawTextML(Box target, Text text, Point offset) @trusted;
107 	///Clears the area within the target
108 	public void clearArea(Box target) @trusted;
109 }
110 /**
111  * TODO: Use this for implement tabbing and etc.
112  */
113 public interface Focusable {
114 	///Called when an object receives focus.
115 	public void focusGiven();
116 	///Called when an object loses focus.
117 	public void focusTaken();
118 	///Cycles the focus on a single element.
119 	///Returns -1 if end is reached, or the number of remaining elements that
120 	///are cycleable in the direction.
121 	public int cycleFocus(int direction);
122 	///Passes key events to the focused element when not in text editing mode.
123 	public void passKey(uint keyCode, ubyte mod);
124 }
125 /**
126  * Implements the 
127  */
128 public interface ElementContainer : PopUpHandler, Canvas {
129 	/**
130 	 * Returns the absolute position of the element.
131 	 */
132 	public Box getAbsolutePosition(WindowElement sender);
133 	/**
134 	 * Gives focus to the element if applicable
135 	 */
136 	public void requestFocus(WindowElement sender);
137 	/**
138 	 * Sets the cursor to the given type on request.
139 	 */
140 	public void requestCursor(CursorType type);
141 }
142 /**
143  * Implemented by any object that can store stylesheets.
144  */
145 public interface StyleSheetContainer {
146 	/**
147 	 * Returns the stylesheet stored by the object.
148 	 */
149 	public StyleSheet getStyleSheet();
150 	public int[2] getRasterSizes();
151 }
152 /**
153  * Implements mouse event passing.
154  */
155 public interface MouseEventReceptor {
156 	///Passes mouse click event
157 	public void passMCE(MouseEventCommons mec, MouseClickEvent mce);
158 	///Passes mouse move event
159 	public void passMME(MouseEventCommons mec, MouseMotionEvent mme);
160 	///Passes mouse scroll event
161 	public void passMWE(MouseEventCommons mec, MouseWheelEvent mwe);
162 }
163 /**
164  * Implements identification of small buttons.
165  */
166 public interface ISmallButton {
167 	///Returns true if element is in small button capable and is the supplied height.
168 	public bool isSmallButtonHeight(int height);
169 	///Returns true if left side justified, false otherwise.
170 	public bool isLeftSide() @nogc @safe pure nothrow const;
171 	///Sets the small button to the left side if true.
172 	public bool isLeftSide(bool val) @nogc @safe pure nothrow;
173 }
174 /**
175  * Defines functions for pop up handling.
176  */
177 public interface PopUpHandler : StyleSheetContainer {
178 	/**
179 	 * Puts a PopUpElement on the GUI.
180 	 */
181 	public void addPopUpElement(PopUpElement p);
182 	/**
183 	 * Puts a PopUpElement on the GUI at the given position.
184 	 */
185 	public void addPopUpElement(PopUpElement p, int x, int y);
186 	/** 
187 	 * Ends the popup session and closes all popups.
188 	 */
189 	public void endPopUpSession(PopUpElement p);
190 	/**
191 	 * Closes a single popup element.
192 	 */
193 	public void closePopUp(PopUpElement p);
194 }