summaryrefslogtreecommitdiff
path: root/src/ui/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/util.c')
-rw-r--r--src/ui/util.c158
1 files changed, 116 insertions, 42 deletions
diff --git a/src/ui/util.c b/src/ui/util.c
index ff6f8822..c341a11d 100644
--- a/src/ui/util.c
+++ b/src/ui/util.c
@@ -471,6 +471,19 @@ iWidget *removeTabPage_Widget(iWidget *tabs, size_t index) {
471 return page; 471 return page;
472} 472}
473 473
474void resizeToLargestPage_Widget(iWidget *tabs) {
475 arrange_Widget(tabs);
476 iInt2 largest = zero_I2();
477 iWidget *pages = findChild_Widget(tabs, "tabs.pages");
478 iConstForEach(ObjectList, i, children_Widget(pages)) {
479 largest = max_I2(largest, ((const iWidget *) i.object)->rect.size);
480 }
481 iForEach(ObjectList, j, children_Widget(pages)) {
482 setSize_Widget(j.object, largest);
483 }
484 setSize_Widget(tabs, addY_I2(largest, height_Widget(findChild_Widget(tabs, "tabs.buttons"))));
485}
486
474iLabelWidget *tabButtonForPage_Widget_(iWidget *tabs, const iWidget *page) { 487iLabelWidget *tabButtonForPage_Widget_(iWidget *tabs, const iWidget *page) {
475 iWidget *buttons = findChild_Widget(tabs, "tabs.buttons"); 488 iWidget *buttons = findChild_Widget(tabs, "tabs.buttons");
476 iForEach(ObjectList, i, buttons->children) { 489 iForEach(ObjectList, i, buttons->children) {
@@ -591,18 +604,18 @@ iWidget *makeSheet_Widget(const char *id) {
591 setBackgroundColor_Widget(sheet, uiBackground_ColorId); 604 setBackgroundColor_Widget(sheet, uiBackground_ColorId);
592 setFlags_Widget(sheet, 605 setFlags_Widget(sheet,
593 mouseModal_WidgetFlag | keepOnTop_WidgetFlag | arrangeVertical_WidgetFlag | 606 mouseModal_WidgetFlag | keepOnTop_WidgetFlag | arrangeVertical_WidgetFlag |
594 arrangeSize_WidgetFlag, 607 arrangeSize_WidgetFlag | centerHorizontal_WidgetFlag,
595 iTrue); 608 iTrue);
596 return sheet; 609 return sheet;
597} 610}
598 611
599void centerSheet_Widget(iWidget *sheet) { 612void centerSheet_Widget(iWidget *sheet) {
600 arrange_Widget(sheet); 613 arrange_Widget(sheet->parent);
601 const iInt2 rootSize = rootSize_Window(get_Window()); 614// const iInt2 rootSize = rootSize_Window(get_Window());
602 const iInt2 orig = localCoord_Widget( 615// const iInt2 orig = localCoord_Widget(
603 sheet->parent, 616// sheet->parent,
604 init_I2(rootSize.x / 2 - sheet->rect.size.x / 2, bounds_Widget(sheet).pos.y)); 617// init_I2(rootSize.x / 2 - sheet->rect.size.x / 2, bounds_Widget(sheet).pos.y));
605 sheet->rect.pos = orig; 618// sheet->rect.pos = orig;
606 postRefresh_App(); 619 postRefresh_App();
607} 620}
608 621
@@ -803,49 +816,110 @@ iWidget *makeToggle_Widget(const char *id) {
803 return toggle; 816 return toggle;
804} 817}
805 818
819static iWidget *appendTwoColumnPage_(iWidget *tabs, const char *title, iWidget **headings,
820 iWidget **values) {
821 iWidget *page = new_Widget();
822 setFlags_Widget(page, arrangeVertical_WidgetFlag | arrangeSize_WidgetFlag |
823 resizeHeightOfChildren_WidgetFlag, iTrue);
824 addChildFlags_Widget(page, iClob(new_Widget()), expand_WidgetFlag);
825 iWidget *columns = new_Widget();
826 addChildFlags_Widget(page, iClob(columns), arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag);
827 *headings = addChildFlags_Widget(
828 columns, iClob(new_Widget()), arrangeVertical_WidgetFlag | arrangeSize_WidgetFlag);
829 *values = addChildFlags_Widget(
830 columns, iClob(new_Widget()), arrangeVertical_WidgetFlag | arrangeSize_WidgetFlag);
831 addChildFlags_Widget(page, iClob(new_Widget()), expand_WidgetFlag);
832 appendTabPage_Widget(tabs, page, title, 0, 0);
833 return page;
834}
835
836static void makeTwoColumnHeading_(const char *title, iWidget *headings, iWidget *values) {
837 addChild_Widget(headings,
838 iClob(makeHeading_Widget(format_CStr(uiHeading_ColorEscape "%s", title))));
839 addChild_Widget(values, iClob(makeHeading_Widget("")));
840}
841
842static void expandInputFieldWidth_(iInputWidget *input) {
843 iWidget *page = as_Widget(input)->parent->parent->parent->parent; /* tabs > page > values > input */
844 as_Widget(input)->rect.size.x =
845 right_Rect(bounds_Widget(page)) - left_Rect(bounds_Widget(constAs_Widget(input)));
846}
847
806iWidget *makePreferences_Widget(void) { 848iWidget *makePreferences_Widget(void) {
807 iWidget *dlg = makeSheet_Widget("prefs"); 849 iWidget *dlg = makeSheet_Widget("prefs");
808 addChildFlags_Widget(dlg, 850 addChildFlags_Widget(dlg,
809 iClob(new_LabelWidget(uiHeading_ColorEscape "PREFERENCES", 0, 0, NULL)), 851 iClob(new_LabelWidget(uiHeading_ColorEscape "PREFERENCES", 0, 0, NULL)),
810 frameless_WidgetFlag); 852 frameless_WidgetFlag);
811 iWidget *page = new_Widget(); 853 iWidget *tabs = makeTabs_Widget(dlg);
812 addChild_Widget(dlg, iClob(page)); 854 iWidget *headings, *values;
813 setFlags_Widget(page, arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag, iTrue); 855 /* General preferences. */ {
814 iWidget *headings = addChildFlags_Widget( 856 appendTwoColumnPage_(tabs, "General", &headings, &values);
815 page, iClob(new_Widget()), arrangeVertical_WidgetFlag | arrangeSize_WidgetFlag); 857 addChild_Widget(headings, iClob(makeHeading_Widget("Downloads folder:")));
816 iWidget *values = addChildFlags_Widget( 858 setId_Widget(addChild_Widget(values, iClob(new_InputWidget(0))), "prefs.downloads");
817 page, iClob(new_Widget()), arrangeVertical_WidgetFlag | arrangeSize_WidgetFlag); 859 makeTwoColumnHeading_("WINDOW", headings, values);
818 addChild_Widget(headings, iClob(makeHeading_Widget("Downloads folder:")));
819 setId_Widget(addChild_Widget(values, iClob(new_InputWidget(0))), "prefs.downloads");
820#if defined (iPlatformApple) || defined (iPlatformMSys) 860#if defined (iPlatformApple) || defined (iPlatformMSys)
821 addChild_Widget(headings, iClob(makeHeading_Widget("Use system theme:"))); 861 addChild_Widget(headings, iClob(makeHeading_Widget("Use system theme:")));
822 addChild_Widget(values, iClob(makeToggle_Widget("prefs.ostheme"))); 862 addChild_Widget(values, iClob(makeToggle_Widget("prefs.ostheme")));
823#endif 863#endif
824 addChild_Widget(headings, iClob(makeHeading_Widget("Theme:"))); 864 addChild_Widget(headings, iClob(makeHeading_Widget("Theme:")));
825 iWidget *themes = new_Widget(); 865 iWidget *themes = new_Widget();
826 /* Themes. */ { 866 /* Themes. */ {
827 setId_Widget(addChild_Widget(themes, iClob(new_LabelWidget("Pure Black", 0, 0, "theme.set arg:0"))), "prefs.theme.0"); 867 setId_Widget(addChild_Widget(themes, iClob(new_LabelWidget("Pure Black", 0, 0, "theme.set arg:0"))), "prefs.theme.0");
828 setId_Widget(addChild_Widget(themes, iClob(new_LabelWidget("Dark", 0, 0, "theme.set arg:1"))), "prefs.theme.1"); 868 setId_Widget(addChild_Widget(themes, iClob(new_LabelWidget("Dark", 0, 0, "theme.set arg:1"))), "prefs.theme.1");
829 setId_Widget(addChild_Widget(themes, iClob(new_LabelWidget("Light", 0, 0, "theme.set arg:2"))), "prefs.theme.2"); 869 setId_Widget(addChild_Widget(themes, iClob(new_LabelWidget("Light", 0, 0, "theme.set arg:2"))), "prefs.theme.2");
830 setId_Widget(addChild_Widget(themes, iClob(new_LabelWidget("Pure White", 0, 0, "theme.set arg:3"))), "prefs.theme.3"); 870 setId_Widget(addChild_Widget(themes, iClob(new_LabelWidget("Pure White", 0, 0, "theme.set arg:3"))), "prefs.theme.3");
831 } 871 }
832 addChildFlags_Widget(values, iClob(themes), arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag); 872 addChildFlags_Widget(values, iClob(themes), arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag);
833 addChild_Widget(headings, iClob(makeHeading_Widget("Retain window size:"))); 873 addChild_Widget(headings, iClob(makeHeading_Widget("Retain window size:")));
834 addChild_Widget(values, iClob(makeToggle_Widget("prefs.retainwindow"))); 874 addChild_Widget(values, iClob(makeToggle_Widget("prefs.retainwindow")));
835 addChild_Widget(headings, iClob(makeHeading_Widget("UI scale factor:"))); 875 addChild_Widget(headings, iClob(makeHeading_Widget("UI scale factor:")));
836 setId_Widget(addChild_Widget(values, iClob(new_InputWidget(8))), "prefs.uiscale"); 876 setId_Widget(addChild_Widget(values, iClob(new_InputWidget(8))), "prefs.uiscale");
837 addChild_Widget(headings, iClob(makeHeading_Widget(uiHeading_ColorEscape "Proxies"))); 877 }
838 addChild_Widget(values, iClob(makeHeading_Widget(""))); 878 /* Layout. */ {
839 addChild_Widget(headings, iClob(makeHeading_Widget("Gopher proxy:"))); 879 appendTwoColumnPage_(tabs, "Layout", &headings, &values);
840 setId_Widget(addChild_Widget(values, iClob(new_InputWidget(0))), "prefs.proxy.gopher"); 880 addChild_Widget(headings, iClob(makeHeading_Widget("Line width:")));
841 addChild_Widget(headings, iClob(makeHeading_Widget("HTTP proxy:"))); 881 iWidget *widths = new_Widget();
842 setId_Widget(addChild_Widget(values, iClob(new_InputWidget(0))), "prefs.proxy.http"); 882 /* Line widths. */ {
883 addChild_Widget(widths, iClob(new_LabelWidget("\u20132", 0, 0, "linewidth.set arg:-2")));
884 addChild_Widget(widths, iClob(new_LabelWidget("\u20131", 0, 0, "linewidth.set arg:-1")));
885 addChild_Widget(widths, iClob(new_LabelWidget("Normal", 0, 0, "linewidth.set arg:0")));
886 addChild_Widget(widths, iClob(new_LabelWidget("+1", 0, 0, "linewidth.set arg:1")));
887 addChild_Widget(widths, iClob(new_LabelWidget("+2", 0, 0, "linewidth.set arg:2")));
888 addChild_Widget(widths, iClob(new_LabelWidget("Window", 0, 0, "linewidth.set arg:1000")));
889 }
890 addChildFlags_Widget(values, iClob(widths), arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag);
891 addChild_Widget(headings, iClob(makeHeading_Widget("Big 1st paragaph:")));
892 addChild_Widget(values, iClob(makeToggle_Widget("prefs.biglede")));
893 }
894 /* Colors. */ {
895 appendTwoColumnPage_(tabs, "Colors", &headings, &values);
896 addChild_Widget(headings, iClob(makeHeading_Widget("Dark theme:")));
897 addChild_Widget(values, iClob(new_LabelWidget("Colorful", 0, 0, 0)));
898 addChild_Widget(headings, iClob(makeHeading_Widget("Light theme:")));
899 addChild_Widget(values, iClob(new_LabelWidget("White", 0, 0, 0)));
900 addChild_Widget(headings, iClob(makeHeading_Widget("Saturation:")));
901 iWidget *sats = new_Widget();
902 /* Saturation levels. */ {
903 addChild_Widget(sats, iClob(new_LabelWidget("Full", 0, 0, "saturation.set arg:100")));
904 addChild_Widget(sats, iClob(new_LabelWidget("Reduced", 0, 0, "saturation.set arg:66")));
905 addChild_Widget(sats, iClob(new_LabelWidget("Minimal", 0, 0, "saturation.set arg:33")));
906 addChild_Widget(sats, iClob(new_LabelWidget("Monochrome", 0, 0, "saturation.set arg:0")));
907 }
908 addChildFlags_Widget(values, iClob(sats), arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag);
909 }
910 /* Proxies. */ {
911 appendTwoColumnPage_(tabs, "Proxies", &headings, &values);
912 addChild_Widget(headings, iClob(makeHeading_Widget("Gopher proxy:")));
913 setId_Widget(addChild_Widget(values, iClob(new_InputWidget(0))), "prefs.proxy.gopher");
914 addChild_Widget(headings, iClob(makeHeading_Widget("HTTP proxy:")));
915 setId_Widget(addChild_Widget(values, iClob(new_InputWidget(0))), "prefs.proxy.http");
916 }
917 resizeToLargestPage_Widget(tabs);
843 arrange_Widget(dlg); 918 arrange_Widget(dlg);
844 /* Set text input widths. */ { 919 /* Set input field sizes. */ {
845 const int inputWidth = width_Rect(page->rect) - width_Rect(headings->rect); 920 expandInputFieldWidth_(findChild_Widget(tabs, "prefs.downloads"));
846 as_Widget(findChild_Widget(values, "prefs.downloads"))->rect.size.x = inputWidth; 921 expandInputFieldWidth_(findChild_Widget(tabs, "prefs.proxy.http"));
847 as_Widget(findChild_Widget(values, "prefs.proxy.http"))->rect.size.x = inputWidth; 922 expandInputFieldWidth_(findChild_Widget(tabs, "prefs.proxy.gopher"));
848 as_Widget(findChild_Widget(values, "prefs.proxy.gopher"))->rect.size.x = inputWidth;
849 } 923 }
850 iWidget *div = new_Widget(); { 924 iWidget *div = new_Widget(); {
851 setFlags_Widget(div, arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag, iTrue); 925 setFlags_Widget(div, arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag, iTrue);