#pragma once

// Note: this class is called Dialog, but it can also handle a tab under the following conditions:
// - isTabRoot is 0
// - backgroundImage is the tab's background
// - closable is 0
// - title is ""
// - marginTop is
// - intendedHeight ends up to be the tab's actual height, or at least close
// - titleFontSize is 0
// - marginTop cancels out as much of titleHeight as needed (that is, it should be actualMarginTop - titleHeight)
// To ensure the latter, you best create all tabs FIRST and insert the tabbed
// control to your dialog THEN - with the right height
//
// a subclass may help with using this as a tab

#include "inputcontainer.qh"
CLASS(Dialog, InputContainer)
	METHOD(Dialog, configureDialog, void(entity)); // no runtime configuration, all parameters are given in the code!
	METHOD(Dialog, fill, void(entity));            // to be overridden by user to fill the dialog with controls
	METHOD(Dialog, keyDown, float(entity, float, float, float));
	METHOD(Dialog, close, void(entity));
	METHOD(Dialog, addItemSimple, void(entity, float, float, float, float, entity, vector));

	METHOD(Dialog, TD, void(entity, float, float, entity));
	METHOD(Dialog, TDNoMargin, void(entity, float, float, entity, vector));
	METHOD(Dialog, TDempty, void(entity, float));
	METHOD(Dialog, setFirstColumn, void(entity, float));
	METHOD(Dialog, TR, void(entity));
	METHOD(Dialog, gotoRC, void(entity, float, float));

	ATTRIB(Dialog, isTabRoot, bool, true);
	ATTRIB(Dialog, closeButton, entity);
	ATTRIB(Dialog, intendedHeight, float, 0);
	ATTRIB(Dialog, itemOrigin, vector, '0 0 0');
	ATTRIB(Dialog, itemSize, vector, '0 0 0');
	ATTRIB(Dialog, itemSpacing, vector, '0 0 0');
	ATTRIB(Dialog, currentRow, float, 0);
	ATTRIB(Dialog, currentColumn, float, 0);
	ATTRIB(Dialog, firstColumn, float, 0);

	// to be customized
	ATTRIB(Dialog, closable, bool, true);
	ATTRIB(Dialog, title, string, "Form1");
	ATTRIB(Dialog, name, string, ""); // if set to a string without spaces this dialog can be opened via menu_cmd directmenu
	ATTRIB(Dialog, color, vector, '1 0.5 1');
	ATTRIB(Dialog, intendedWidth, float, 0);
	ATTRIB(Dialog, rows, float, 3);
	ATTRIB(Dialog, columns, float, 2);

	ATTRIB(Dialog, marginTop, float, 0);     // pixels
	ATTRIB(Dialog, marginBottom, float, 0);  // pixels
	ATTRIB(Dialog, marginLeft, float, 0);    // pixels
	ATTRIB(Dialog, marginRight, float, 0);   // pixels
	ATTRIB(Dialog, columnSpacing, float, 0); // pixels
	ATTRIB(Dialog, rowSpacing, float, 0);    // pixels
	ATTRIB(Dialog, rowHeight, float, 0);     // pixels
	ATTRIB(Dialog, titleHeight, float, 0);   // pixels
	ATTRIB(Dialog, titleFontSize, float, 0); // pixels; if 0, title causes no margin
	ATTRIB(Dialog, zoomedOutTitleBarPosition, float, 0);
	ATTRIB(Dialog, zoomedOutTitleBar, bool, false);

	ATTRIB(Dialog, requiresConnection, bool, false);  // set to true if the dialog requires a connection to be opened

	ATTRIB(Dialog, backgroundImage, string);
	ATTRIB(Dialog, borderLines, float, 1);
	ATTRIB(Dialog, closeButtonImage, string);

	ATTRIB(Dialog, border, entity);
ENDCLASS(Dialog)

void Dialog_Close(entity button, entity me);

.bool hideMenuOnClose;
