milsko/examples/basic/periodic.c

326 lines
8.8 KiB
C
Raw Permalink Normal View History

2026-03-27 15:25:02 +09:00
#include <Mw/Milsko.h>
2026-03-27 16:16:30 +09:00
#include <stdarg.h>
2026-03-27 17:26:14 +09:00
#define Columns 5
2026-03-27 15:25:02 +09:00
#define Padding 20
2026-03-27 16:16:30 +09:00
#define PaddingContent 2
2026-03-27 15:25:02 +09:00
2026-05-14 21:10:22 +09:00
MwWidget window, menu, table;
2026-03-29 09:42:34 +09:00
MwMenu e;
2026-03-27 15:25:02 +09:00
2026-04-22 12:05:49 +09:00
static void MWAPI resize(MwWidget handle, void* user, void* call) {
2026-03-27 15:25:02 +09:00
int w = MwGetInteger(window, MwNwidth);
int h = MwGetInteger(window, MwNheight);
2026-05-14 21:10:22 +09:00
MwVaApply(table,
2026-03-27 16:16:30 +09:00
MwNx, Padding,
MwNy, MwGetInteger(menu, MwNheight) + Padding,
MwNwidth, w - Padding * 2,
MwNheight, h - MwGetInteger(menu, MwNheight) - Padding * 2,
NULL);
2026-03-27 15:25:02 +09:00
}
2026-04-22 12:05:49 +09:00
static void MWAPI resize_content(MwWidget handle, void* user, void* call) {
2026-03-27 16:16:30 +09:00
MwWidget* ws = MwGetChildren(handle);
if(ws != NULL) {
int pw = MwGetInteger(ws[0], "IpWidth");
int ph = MwGetInteger(ws[0], "IpHeight");
if(pw < 0) {
pw += MwGetInteger(handle, MwNwidth);
} else if(pw == 0) {
pw = MwGetInteger(handle, MwNwidth);
}
if(ph < 0) {
ph += MwGetInteger(handle, MwNheight);
} else if(ph == 0) {
ph = MwGetInteger(handle, MwNheight);
}
MwVaApply(ws[0],
MwNx, (MwGetInteger(handle, MwNwidth) - pw) / 2,
MwNy, (MwGetInteger(handle, MwNheight) - ph) / 2,
MwNwidth, pw,
MwNheight, ph,
NULL);
free(ws);
}
}
2026-04-22 12:05:49 +09:00
static void MWAPI resize_frame(MwWidget handle, void* user, void* call) {
2026-03-27 16:16:30 +09:00
MwWidget* ws = MwGetChildren(handle);
if(ws != NULL) {
int w = MwGetInteger(handle, MwNwidth);
int h = MwGetInteger(handle, MwNheight);
if(ws[0] != NULL) {
MwVaApply(ws[0],
MwNx, MwDefaultBorderWidth(handle) + PaddingContent,
MwNy, MwDefaultBorderWidth(handle) + PaddingContent,
MwNwidth, w - (MwDefaultBorderWidth(handle) + PaddingContent) * 2,
MwNheight, h - (MwDefaultBorderWidth(handle) + PaddingContent) * 2,
NULL);
}
free(ws);
}
}
static MwWidget frame(const char* name, int width, int height, MwClass cl, ...) {
2026-05-14 21:10:22 +09:00
MwWidget f = MwVaCreateWidget(MwFrameClass, "frame", table, 0, 0, 0, 0,
2026-03-27 16:16:30 +09:00
MwNhasBorder, 1,
MwNinverted, 1,
NULL);
2026-05-14 21:10:22 +09:00
MwWidget table = MwVaCreateWidget(MwBoxClass, "table", f, 0, 0, 0, 0,
2026-03-27 16:16:30 +09:00
MwNorientation, MwVERTICAL,
NULL);
2026-05-14 21:10:22 +09:00
MwWidget label = MwVaCreateWidget(MwLabelClass, "label", table, 0, 0, 0, 0,
2026-03-27 16:16:30 +09:00
MwNtext, name,
MwNalignment, MwALIGNMENT_BEGINNING,
MwNfixedSize, 20,
NULL);
va_list va;
if(cl != NULL) {
2026-05-14 21:10:22 +09:00
MwWidget frame = MwCreateWidget(MwFrameClass, "frame", table, 0, 0, 0, 0);
2026-03-27 16:16:30 +09:00
MwWidget w;
va_start(va, cl);
w = MwVaListCreateWidget(cl, "widget", frame, 0, 0, 0, 0, va);
va_end(va);
MwVaApply(w,
"IpWidth", width,
"IpHeight", height,
NULL);
MwAddUserHandler(frame, MwNresizeHandler, resize_content, NULL);
MwVaApply(f,
"VhandledWidget", w,
2026-05-14 21:10:22 +09:00
MwNcolumnSpan, MwGetInteger(w, MwNcolumnSpan),
MwNrowSpan, MwGetInteger(w, MwNrowSpan),
2026-03-27 16:16:30 +09:00
NULL);
}
MwAddUserHandler(f, MwNresizeHandler, resize_frame, NULL);
resize_frame(f, NULL, NULL);
2026-03-27 15:25:02 +09:00
return f;
}
2026-03-27 16:16:30 +09:00
static MwWidget child(MwWidget w) {
return MwGetVoid(w, "VhandledWidget");
}
2026-04-22 12:05:49 +09:00
static void MWAPI menu_handler(MwWidget handle, void* user, void* call) {
2026-03-27 17:26:14 +09:00
if(call == e) MwDestroyWidget(window);
}
2026-03-27 16:16:30 +09:00
int main() {
2026-04-24 02:23:25 +09:00
int i, j;
MwWidget f, w, b;
MwLLPixmap px;
int index;
MwMenu m, m2;
void* v;
2026-04-29 03:41:00 +09:00
MwRect rc;
2026-03-27 15:31:51 +09:00
2026-03-27 15:25:02 +09:00
MwLibraryInit();
2026-03-27 16:16:30 +09:00
2026-03-27 15:25:02 +09:00
window = MwVaCreateWidget(MwWindowClass, "window", NULL, MwDEFAULT, MwDEFAULT, 800, 800,
2026-03-27 16:16:30 +09:00
MwNtitle, "Milsko Periodic Table",
NULL);
2026-03-27 15:25:02 +09:00
2026-04-29 03:41:00 +09:00
MwGetScreenSize(window, &rc);
if(rc.height < 800) {
MwVaApply(window,
MwNx, (rc.width - (rc.height - 64)) / 2,
MwNy, (rc.height - (rc.height - 64)) / 2,
MwNwidth, rc.height - 64,
MwNheight, rc.height - 64,
NULL);
}
2026-04-24 02:23:25 +09:00
px = MwLoadIcon(window, MwIconError);
2026-03-27 15:25:02 +09:00
menu = MwCreateWidget(MwMenuClass, "menu", window, 0, 0, 0, 0);
2026-03-27 16:16:30 +09:00
2026-03-27 17:26:14 +09:00
m = MwMenuAdd(menu, NULL, "File");
MwMenuAdd(menu, m, "New");
MwMenuAdd(menu, m, "Open");
MwMenuAdd(menu, m, "Save");
MwMenuAdd(menu, m, "Save As");
MwMenuAdd(menu, m, "Print");
e = MwMenuAdd(menu, m, "Exit");
m = MwMenuAdd(menu, NULL, "Edit");
MwMenuAdd(menu, m, "Undo");
MwMenuAdd(menu, m, "----");
MwMenuAdd(menu, m, "Cut");
MwMenuAdd(menu, m, "Copy");
MwMenuAdd(menu, m, "Paste");
MwMenuAdd(menu, m, "----");
MwMenuAdd(menu, m, "Clear");
MwMenuAdd(menu, m, "Delete");
m = MwMenuAdd(menu, NULL, "View");
MwMenuAdd(menu, m, "Stack");
MwMenuAdd(menu, m, "Tile");
MwMenuAdd(menu, m, "----");
MwMenuAdd(menu, m, "Day");
MwMenuAdd(menu, m, "Week");
MwMenuAdd(menu, m, "Month");
MwMenuAdd(menu, m, "Year");
2026-03-29 09:42:34 +09:00
m = MwMenuAdd(menu, NULL, "Options");
2026-03-27 17:26:14 +09:00
m2 = MwMenuAdd(menu, m, "Font");
MwMenuAdd(menu, m2, "Small");
MwMenuAdd(menu, m2, "Medium");
MwMenuAdd(menu, m2, "Large");
m2 = MwMenuAdd(menu, m, "Direction");
MwMenuAdd(menu, m2, "Up");
MwMenuAdd(menu, m2, "Down");
MwMenuAdd(menu, m2, "Left");
MwMenuAdd(menu, m2, "Right");
MwMenuAdd(menu, m, "Case Sensitive");
MwMenuAdd(menu, m, "Word Wrap");
2026-03-28 02:40:12 +09:00
m = MwMenuAdd(menu, NULL, "?Help");
2026-03-27 17:26:14 +09:00
MwMenuAdd(menu, m, "On Context");
MwMenuAdd(menu, m, "On Window");
MwMenuAdd(menu, m, "Tutorial");
MwMenuAdd(menu, m, "On Version");
MwAddUserHandler(menu, MwNmenuHandler, menu_handler, NULL);
2026-05-14 21:10:22 +09:00
table = MwVaCreateWidget(MwTableClass, "table", window, 0, 0, 0, 0,
MwNwaitLayout, 1,
MwNcolumns, 5,
NULL);
2026-03-27 15:25:02 +09:00
2026-05-22 11:41:08 -07:00
f = frame("Button", -PaddingContent, -PaddingContent, MwBoxClass,
MwNorientation, MwVERTICAL,
2026-03-27 16:16:30 +09:00
NULL);
2026-05-22 11:41:08 -07:00
b = MwVaCreateWidget(MwButtonClass, "btn", child(f), 0, 0, 0, 0,
MwNtext, "Press me",
NULL);
b = MwVaCreateWidget(MwButtonClass, "btn_disabled", child(f), 0, 0, 0, 0,
MwNtext, "Cannot press me",
MwNdisabled, 1,
NULL);
2026-03-27 15:25:02 +09:00
2026-05-14 21:10:22 +09:00
MwVaCreateWidget(MwLabelClass, "label", table, 0, 0, 0, 0,
MwNbold, 1,
MwNtext, "The Periodic Table of Milsko Widgets",
MwNcolumnSpan, Columns - 2,
NULL);
2026-03-27 15:25:02 +09:00
for(i = 0; i < 2; i++) {
f = frame(i == 0 ? "CheckBox" : "RadioBox", -PaddingContent, -PaddingContent, MwBoxClass,
MwNmargin, PaddingContent,
NULL);
w = child(f);
2026-05-14 21:10:22 +09:00
b = MwVaCreateWidget(MwBoxClass, "table1", w, 0, 0, 0, 0,
MwNorientation, MwVERTICAL,
MwNfixedSize, 16,
NULL);
2026-05-22 11:41:08 -07:00
for(j = 0; j < 6; j++) MwVaCreateWidget(i == 0 ? MwCheckBoxClass : MwRadioBoxClass, i == 0 ? "cb" : "rb", b, 0, 0, 0, 0, MwNdisabled, (j == 5) ? 1 : 0, NULL);
2026-05-14 21:10:22 +09:00
b = MwVaCreateWidget(MwBoxClass, "table1", w, 0, 0, 0, 0,
MwNorientation, MwVERTICAL,
NULL);
2026-05-22 11:41:08 -07:00
for(j = 0; j < 6; j++) {
char buf[32];
sprintf(buf, "%sBox %d", i == 0 ? "Check" : "Radio", j + 1);
MwVaCreateWidget(MwLabelClass, "label", b, 0, 0, 0, 0,
MwNtext, buf,
MwNalignment, MwALIGNMENT_BEGINNING,
NULL);
}
}
2026-05-06 00:12:06 +09:00
f = frame("Calendar", -PaddingContent, -PaddingContent, MwCalendarClass,
2026-05-06 06:10:45 +09:00
MwNscale, 1,
2026-05-06 00:12:06 +09:00
NULL);
2026-03-27 16:16:30 +09:00
f = frame("ComboBox", -PaddingContent, 24, MwComboBoxClass, NULL);
w = child(f);
MwComboBoxAdd(w, -1, "Hello!");
2026-03-27 15:25:02 +09:00
2026-03-27 16:31:28 +09:00
f = frame("Entry", -PaddingContent, 24, MwEntryClass, NULL);
2026-04-24 02:23:25 +09:00
f = frame("Image", -PaddingContent, -PaddingContent, MwImageClass,
MwNpixmap, px,
NULL);
2026-03-27 16:31:28 +09:00
f = frame("Label", -PaddingContent, -PaddingContent, MwLabelClass,
2026-04-27 04:04:04 +09:00
MwNtext, "Epic text\nNewline can be used too!",
2026-03-27 16:31:28 +09:00
NULL);
f = frame("ListBox", -PaddingContent, -PaddingContent, MwListBoxClass,
MwNhasHeading, 1,
NULL);
w = child(f);
2026-04-18 21:52:02 +09:00
index = MwListBoxSet(w, -1, 0, "Epic title...");
index = MwListBoxSet(w, -1, 0, "Hello");
2026-03-27 16:31:28 +09:00
2026-03-27 17:26:14 +09:00
f = frame("NumberEntry", -PaddingContent, 24, MwNumberEntryClass, NULL);
f = frame("ProgressBar", -PaddingContent, 24, MwProgressBarClass,
2026-03-29 09:42:34 +09:00
MwNvalue, 25,
NULL);
2026-03-27 17:26:14 +09:00
f = frame("ScrollBar", -PaddingContent, 16, MwScrollBarClass,
2026-03-29 09:42:34 +09:00
MwNorientation, MwHORIZONTAL,
NULL);
2026-03-27 17:26:14 +09:00
2026-03-27 16:16:30 +09:00
f = frame("Separator", -PaddingContent, -PaddingContent, MwSeparatorClass, NULL);
2026-03-27 15:31:51 +09:00
2026-04-29 15:14:38 +09:00
f = frame("SubWindow", -PaddingContent, -PaddingContent, MwViewportClass,
2026-05-14 21:10:22 +09:00
MwNcolumnSpan, 2,
2026-04-29 15:14:38 +09:00
NULL);
w = child(f);
MwViewportSetSize(w, 512, 512);
2026-04-30 14:28:56 +09:00
MwVaCreateWidget(MwSubWindowClass, "swnd", MwViewportGetViewport(w), 32, 32, 256, 128,
2026-04-30 12:35:42 +09:00
MwNtitle, "Sub window",
NULL);
2026-05-02 00:22:00 +09:00
MwVaCreateWidget(MwSubWindowClass, "swnd", MwViewportGetViewport(w), 64, 64, 256, 128,
2026-05-02 02:00:51 +09:00
MwNtitle, "Sub window 2",
2026-05-02 00:22:00 +09:00
NULL);
2026-04-29 15:14:38 +09:00
2026-05-07 18:30:24 +09:00
f = frame("Tab", -PaddingContent, -PaddingContent, MwTabClass,
2026-05-14 21:10:22 +09:00
MwNcolumnSpan, 2,
2026-05-07 18:30:24 +09:00
NULL);
w = child(f);
MwSetText(MwTabAdd(w, "ABC"), MwNbackground, "#f00");
MwSetText(MwTabAdd(w, "DEF"), MwNbackground, "#0f0");
MwSetText(MwTabAdd(w, "GHI"), MwNbackground, "#00f");
2026-03-27 17:26:14 +09:00
f = frame("TreeView", -PaddingContent, -PaddingContent, MwTreeViewClass, NULL);
w = child(f);
v = MwTreeViewAdd(w, NULL, NULL, "abc");
v = MwTreeViewAdd(w, v, NULL, "def");
v = MwTreeViewAdd(w, v, NULL, "ghi");
2026-04-24 02:23:25 +09:00
f = frame("Viewport", -PaddingContent, -PaddingContent, MwViewportClass, NULL);
w = child(f);
MwViewportSetSize(w, 256, 256);
MwVaCreateWidget(MwButtonClass, "btn", MwViewportGetViewport(w), 64, 64, 128, 128,
MwNtext, "Thing",
NULL);
2026-03-27 16:16:30 +09:00
MwAddUserHandler(window, MwNresizeHandler, resize, NULL);
2026-03-27 15:31:51 +09:00
2026-03-27 15:25:02 +09:00
resize(window, NULL, NULL);
2026-05-14 21:10:22 +09:00
MwVaApply(table,
2026-05-06 00:12:06 +09:00
MwNwaitLayout, 0,
NULL);
2026-03-27 15:25:02 +09:00
MwLoop(window);
2026-04-24 02:23:25 +09:00
MwLLDestroyPixmap(px);
2026-03-27 15:25:02 +09:00
}