From 4a5e8052fcd5f6ba6fb28a539baecc31bf89019a Mon Sep 17 00:00:00 2001 From: haru-s Date: Sun, 31 Mar 2024 21:44:56 +0900 Subject: [PATCH] Add dfl.chart module with TableRenderer class and its example --- README.md | 28 +- examples/tablerenderer/.gitignore | 16 + examples/tablerenderer/.vscode/launch.json | 13 + examples/tablerenderer/.vscode/tasks.json | 20 ++ examples/tablerenderer/README.md | 2 + examples/tablerenderer/dub.json | 16 + examples/tablerenderer/image/screenshot.png | Bin 0 -> 17742 bytes examples/tablerenderer/shell.bat | 3 + .../source/tablerenderer_sample.d | 67 ++++ .../tablerenderer.code-workspace | 12 + makecoff.bat | 4 +- makelib.bat | 4 +- source/dfl/chart.d | 332 ++++++++++++++++++ source/dfl/package.d | 2 +- 14 files changed, 504 insertions(+), 15 deletions(-) create mode 100644 examples/tablerenderer/.gitignore create mode 100644 examples/tablerenderer/.vscode/launch.json create mode 100644 examples/tablerenderer/.vscode/tasks.json create mode 100644 examples/tablerenderer/README.md create mode 100644 examples/tablerenderer/dub.json create mode 100644 examples/tablerenderer/image/screenshot.png create mode 100644 examples/tablerenderer/shell.bat create mode 100644 examples/tablerenderer/source/tablerenderer_sample.d create mode 100644 examples/tablerenderer/tablerenderer.code-workspace create mode 100644 source/dfl/chart.d diff --git a/README.md b/README.md index d19ff10..98c8f43 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,23 @@ This unofficial project is a migration of [D Forms Library (DFL)](http://wiki.dprogramming.com/Dfl/HomePage "D Forms Library (DFL)") that is managed on SVN. DFL is a Win32 windowing library for the D language. +## Recent major features +- **Module "dfl.chart" is now comming.** + - **TableRenderer (with example)** + - ~LineGraphRenderer~ + - ~TimeChartRenderer~ +- **Add simple clock "Dclock" as an example of DFL application.** +- Module "dfl.printing" is now comming. + - PrintDialog + - PrintSetupDialog + - PrintPreviewDialog +- DUB is available for DFL. +- Remove dflexe. +- Remove GTK-based DFL. +- Remove some bundled libraries such as user32_dfl.lib etc... (From now on, use dmd-bundled libraries such as the MinGW platform library and so on.) + +## Screen shots + ![screen shot](./examples/buttons/image/screenshot.png "screen shot") ![screen shot](./examples/tabcontrol/image/screenshot.png "screen shot") ![screen shot](./examples/listview/image/screenshot.png "screen shot") @@ -22,16 +39,7 @@ DFL is a Win32 windowing library for the D language. ![screen shot](./examples/toolbar/image/screenshot.png "screen shot") ![screen shot](./examples/richtextbox/image/screenshot.png "screen shot") ![screen shot](./examples/dclock/image/screenshot.png "screen shot") - -## Recent major features -- **Module "dfl.printing" is now comming.** - - **PrintDialog** - - **PrintSetupDialog** - - **PrintPreviewDialog** -- DUB is available for DFL. -- Remove dflexe. -- Remove GTK-based DFL. -- Remove some bundled libraries such as user32_dfl.lib etc... (From now on, use dmd-bundled libraries such as the MinGW platform library and so on.) +![screen shot](./examples/tablerenderer/image/screenshot.png "screen shot") ## Build and Install (dfl.lib and dfl_debug.lib) ### 1. Set environment variables diff --git a/examples/tablerenderer/.gitignore b/examples/tablerenderer/.gitignore new file mode 100644 index 0000000..60a5f2a --- /dev/null +++ b/examples/tablerenderer/.gitignore @@ -0,0 +1,16 @@ +.dub +docs.json +__dummy.html +docs/ +/hello_dfl +hello_dfl.so +hello_dfl.dylib +hello_dfl.dll +hello_dfl.a +hello_dfl.lib +hello_dfl-test-* +*.exe +*.pdb +*.o +*.obj +*.lst diff --git a/examples/tablerenderer/.vscode/launch.json b/examples/tablerenderer/.vscode/launch.json new file mode 100644 index 0000000..4443f19 --- /dev/null +++ b/examples/tablerenderer/.vscode/launch.json @@ -0,0 +1,13 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "C++ Launch (Windows) tablerenderer", + "type": "cppvsdbg", + "request": "launch", + "cwd": "${workspaceRoot}", + "program": "./bin/tablerenderer.exe", + "console": "internalConsole" + } + ] +} \ No newline at end of file diff --git a/examples/tablerenderer/.vscode/tasks.json b/examples/tablerenderer/.vscode/tasks.json new file mode 100644 index 0000000..0bc5912 --- /dev/null +++ b/examples/tablerenderer/.vscode/tasks.json @@ -0,0 +1,20 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "dub", + "run": false, + "cwd": ".", + "compiler": "$current", + "archType": "$current", + "buildType": "$current", + "configuration": "$current", + "problemMatcher": [ + "$dmd" + ], + "group": "build", + "label": "dub: Build tablerenderer_sample", + "detail": "dub build --compiler=dmd.EXE -a=x86_64 -b=debug -c=application" + } + ] +} \ No newline at end of file diff --git a/examples/tablerenderer/README.md b/examples/tablerenderer/README.md new file mode 100644 index 0000000..b1a86ca --- /dev/null +++ b/examples/tablerenderer/README.md @@ -0,0 +1,2 @@ +# Screen Shot +![screen shot](./image/screenshot.png "screen shot") diff --git a/examples/tablerenderer/dub.json b/examples/tablerenderer/dub.json new file mode 100644 index 0000000..40f975c --- /dev/null +++ b/examples/tablerenderer/dub.json @@ -0,0 +1,16 @@ +{ + "authors": ["haru-s"], + "copyright": "Copyright (C) 2024 haru-s", + "description": "DFL sample code.", + "name": "tablerenderer", + "targetType": "executable", + "targetPath": "bin", + "dependencies": { + "dfl": { + "path": "../../../dfl" + } + }, + "lflags-windows-x86_omf-dmd": ["/exet:nt/su:windows:6.0"], + "lflags-windows-x86_mscoff-dmd": ["/SUBSYSTEM:WINDOWS", "/ENTRY:mainCRTStartup"], + "lflags-windows-x86_64-dmd": ["/SUBSYSTEM:WINDOWS", "/ENTRY:mainCRTStartup"] +} \ No newline at end of file diff --git a/examples/tablerenderer/image/screenshot.png b/examples/tablerenderer/image/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..e1bdb7a07bbee4e9628b01613b6a73d42598d228 GIT binary patch literal 17742 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 R??8bV=$L31UAy)0{{j3iA+P`d literal 0 HcmV?d00001 diff --git a/examples/tablerenderer/shell.bat b/examples/tablerenderer/shell.bat new file mode 100644 index 0000000..49ab56b --- /dev/null +++ b/examples/tablerenderer/shell.bat @@ -0,0 +1,3 @@ +set dmd_path=c:\d\dmd2\windows +set dmc_path=c:\dmc\dm +cmd diff --git a/examples/tablerenderer/source/tablerenderer_sample.d b/examples/tablerenderer/source/tablerenderer_sample.d new file mode 100644 index 0000000..fd9fe0e --- /dev/null +++ b/examples/tablerenderer/source/tablerenderer_sample.d @@ -0,0 +1,67 @@ +import dfl; + +version(Have_dfl) // For DUB. +{ +} +else +{ + pragma(lib, "dfl.lib"); +} + +class MainForm : Form +{ + alias CustomTableRenderer = TableRenderer!(string, string, string); + CustomTableRenderer _table; + + public this() + { + this.text = "TableRenderer example"; + this.size = Size(450, 450); + string csv = + "ID,Name,Value\n" ~ + "1,Kyoto,100\n" ~ + "2,Osaka,50\n" ~ + "3,Tokyo,20\n" ~ + "4,Aomori,10\n"; + _table = new CustomTableRenderer(csv); + _table.height = 40; + _table.width[0] = 50; + _table.width[1] = 80; + _table.width[2] = 150; + _table.paddingX = 10; + _table.paddingY = 12; + _table.margin = Point(20, 20); + _table.hasHeader = true; // true : 1st line is header. + _table.showHeader = true; + _table.firstRecord = 0; + _table.lastRecord = 3; + _table.textColor = Color.black; + _table.backColor = Color.white; + _table.lineColor = Color.lightGray; + _table.headerLine = true; + _table.topSideLine = true; + _table.leftSideLine = true; + _table.bottomSideLine = true; + _table.rightSideLine = true; + _table.verticalLine = true; + _table.horizontalLine = true; + _table.headerFont = new Font("MS Gothic", 16f, FontStyle.BOLD); + _table.recordFont = new Font("MS Gothic", 12f, FontStyle.REGULAR); + } + + protected override void onPaint(PaintEventArgs e) + { + if (_table) + _table.draw(e.graphics); + } +} + +static this() +{ + Application.enableVisualStyles(); +} + +void main() +{ + Application.run(new MainForm()); +} diff --git a/examples/tablerenderer/tablerenderer.code-workspace b/examples/tablerenderer/tablerenderer.code-workspace new file mode 100644 index 0000000..7e696bc --- /dev/null +++ b/examples/tablerenderer/tablerenderer.code-workspace @@ -0,0 +1,12 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": { + "d.projectImportPaths": [ + "..\\..\\..\\dfl\\source" + ] + } +} \ No newline at end of file diff --git a/makecoff.bat b/makecoff.bat index 8d74716..06f445a 100644 --- a/makecoff.bat +++ b/makecoff.bat @@ -67,9 +67,9 @@ set VCCOMMON="%VCINSTALLDIR%\bin" @set PATH=%VCCOMMON%;%PATH% -set dfl_files=package.d all.d base.d application.d internal/dlib.d internal/clib.d internal/utf.d internal/com.d control.d clippingform.d form.d registry.d drawing.d menu.d notifyicon.d commondialog.d filedialog.d folderdialog.d panel.d textboxbase.d textbox.d richtextbox.d picturebox.d listbox.d groupbox.d splitter.d usercontrol.d button.d label.d collections.d internal/winapi.d internal/wincom.d event.d socket.d timer.d environment.d messagebox.d tooltip.d combobox.d treeview.d tabcontrol.d colordialog.d listview.d data.d clipboard.d fontdialog.d progressbar.d resources.d statusbar.d imagelist.d toolbar.d trackbar.d sharedcontrol.d printing.d %_stdcwindowsd% +set dfl_files=package.d all.d base.d application.d internal/dlib.d internal/clib.d internal/utf.d internal/com.d control.d clippingform.d form.d registry.d drawing.d menu.d notifyicon.d commondialog.d filedialog.d folderdialog.d panel.d textboxbase.d textbox.d richtextbox.d picturebox.d listbox.d groupbox.d splitter.d usercontrol.d button.d label.d collections.d internal/winapi.d internal/wincom.d event.d socket.d timer.d environment.d messagebox.d tooltip.d combobox.d treeview.d tabcontrol.d colordialog.d listview.d data.d clipboard.d fontdialog.d progressbar.d resources.d statusbar.d imagelist.d toolbar.d trackbar.d sharedcontrol.d printing.d chart.d %_stdcwindowsd% -set dfl_objs=package.obj all.obj base.obj application.obj dlib.obj clib.obj utf.obj com.obj control.obj clippingform.obj form.obj registry.obj drawing.obj menu.obj notifyicon.obj commondialog.obj filedialog.obj folderdialog.obj panel.obj textboxbase.obj textbox.obj richtextbox.obj picturebox.obj listbox.obj groupbox.obj splitter.obj usercontrol.obj button.obj label.obj collections.obj winapi.obj wincom.obj event.obj socket.obj timer.obj environment.obj messagebox.obj tooltip.obj combobox.obj treeview.obj tabcontrol.obj colordialog.obj listview.obj data.obj clipboard.obj fontdialog.obj progressbar.obj resources.obj statusbar.obj imagelist.obj toolbar.obj trackbar.obj sharedcontrol.obj printing.obj %_stdcwindowsobj% +set dfl_objs=package.obj all.obj base.obj application.obj dlib.obj clib.obj utf.obj com.obj control.obj clippingform.obj form.obj registry.obj drawing.obj menu.obj notifyicon.obj commondialog.obj filedialog.obj folderdialog.obj panel.obj textboxbase.obj textbox.obj richtextbox.obj picturebox.obj listbox.obj groupbox.obj splitter.obj usercontrol.obj button.obj label.obj collections.obj winapi.obj wincom.obj event.obj socket.obj timer.obj environment.obj messagebox.obj tooltip.obj combobox.obj treeview.obj tabcontrol.obj colordialog.obj listview.obj data.obj clipboard.obj fontdialog.obj progressbar.obj resources.obj statusbar.obj imagelist.obj toolbar.obj trackbar.obj sharedcontrol.obj printing.obj chart.obj %_stdcwindowsobj% @rem Also update link pragmas for build. if "%MODEL%" == "64" ( diff --git a/makelib.bat b/makelib.bat index 77e0525..40a6459 100644 --- a/makelib.bat +++ b/makelib.bat @@ -59,9 +59,9 @@ set _stdcwindowsd=internal/_stdcwindows.d set _stdcwindowsobj=_stdcwindows.obj :dfl_not_tango_files -set dfl_files=package.d all.d base.d application.d internal/dlib.d internal/clib.d internal/utf.d internal/com.d control.d clippingform.d form.d registry.d drawing.d menu.d notifyicon.d commondialog.d filedialog.d folderdialog.d panel.d textboxbase.d textbox.d richtextbox.d picturebox.d listbox.d groupbox.d splitter.d usercontrol.d button.d label.d collections.d internal/winapi.d internal/wincom.d event.d socket.d timer.d environment.d messagebox.d tooltip.d combobox.d treeview.d tabcontrol.d colordialog.d listview.d data.d clipboard.d fontdialog.d progressbar.d resources.d statusbar.d imagelist.d toolbar.d trackbar.d sharedcontrol.d printing.d %_stdcwindowsd% +set dfl_files=package.d all.d base.d application.d internal/dlib.d internal/clib.d internal/utf.d internal/com.d control.d clippingform.d form.d registry.d drawing.d menu.d notifyicon.d commondialog.d filedialog.d folderdialog.d panel.d textboxbase.d textbox.d richtextbox.d picturebox.d listbox.d groupbox.d splitter.d usercontrol.d button.d label.d collections.d internal/winapi.d internal/wincom.d event.d socket.d timer.d environment.d messagebox.d tooltip.d combobox.d treeview.d tabcontrol.d colordialog.d listview.d data.d clipboard.d fontdialog.d progressbar.d resources.d statusbar.d imagelist.d toolbar.d trackbar.d sharedcontrol.d printing.d chart.d %_stdcwindowsd% -set dfl_objs=package.obj all.obj base.obj application.obj dlib.obj clib.obj utf.obj com.obj control.obj clippingform.obj form.obj registry.obj drawing.obj menu.obj notifyicon.obj commondialog.obj filedialog.obj folderdialog.obj panel.obj textboxbase.obj textbox.obj richtextbox.obj picturebox.obj listbox.obj groupbox.obj splitter.obj usercontrol.obj button.obj label.obj collections.obj winapi.obj wincom.obj event.obj socket.obj timer.obj environment.obj messagebox.obj tooltip.obj combobox.obj treeview.obj tabcontrol.obj colordialog.obj listview.obj data.obj clipboard.obj fontdialog.obj progressbar.obj resources.obj statusbar.obj imagelist.obj toolbar.obj trackbar.obj sharedcontrol.obj printing.obj %_stdcwindowsobj% +set dfl_objs=package.obj all.obj base.obj application.obj dlib.obj clib.obj utf.obj com.obj control.obj clippingform.obj form.obj registry.obj drawing.obj menu.obj notifyicon.obj commondialog.obj filedialog.obj folderdialog.obj panel.obj textboxbase.obj textbox.obj richtextbox.obj picturebox.obj listbox.obj groupbox.obj splitter.obj usercontrol.obj button.obj label.obj collections.obj winapi.obj wincom.obj event.obj socket.obj timer.obj environment.obj messagebox.obj tooltip.obj combobox.obj treeview.obj tabcontrol.obj colordialog.obj listview.obj data.obj clipboard.obj fontdialog.obj progressbar.obj resources.obj statusbar.obj imagelist.obj toolbar.obj trackbar.obj sharedcontrol.obj printing.obj chart.obj %_stdcwindowsobj% @rem Also update link pragmas for build. set dfl_libs_dfl=%dmd_path%\lib\user32.lib %dmd_path%\lib\shell32.lib %dmd_path%\lib\oleaut32.lib %dmd_path%\lib\undead.lib diff --git a/source/dfl/chart.d b/source/dfl/chart.d new file mode 100644 index 0000000..d2e846a --- /dev/null +++ b/source/dfl/chart.d @@ -0,0 +1,332 @@ +// chart.d +// +// Written by haru-s/Rayerd in 2024. + +/// +module dfl.chart; + +private import dfl.base; +private import dfl.drawing; + +private import std.csv; +private import std.typecons; +private import std.conv; +private import std.algorithm; + +/// +class TableRenderer(T...) +{ + enum DEFAULT_HEIGHT = 25; /// + enum DEFAULT_WIDTH = 100; /// + enum DEFAULT_PADDING_X = 5; /// + enum DEFAULT_PADDING_Y = 5; /// + + /// + this(string csv) + { + _csv = csv; + _columns = T.length; + height = DEFAULT_HEIGHT; + for (int i; i < columns; i++) + _width ~= DEFAULT_WIDTH; + _headerFont = new Font("MS Gothic", 12f, FontStyle.BOLD); + _recordFont = new Font("MS Gothic", 12f, FontStyle.REGULAR); + _paddingX = DEFAULT_PADDING_X; + _paddingY = DEFAULT_PADDING_Y; + _textColor = Color.black; + _backColor = Color.white; + _lineColor = Color.black; + } + + /// Draw records from first record to last record. + void draw(Graphics g) + { + // Draw background. + g.fillRectangle(new SolidBrush(_backColor), bounds); + // Draw top side line. + if (_topSideLine) + g.drawLine(new Pen(_lineColor), Point(margin.x, margin.y), Point(bounds.right, margin.y)); + // Draw header line. + if (_showHeader && _hasHeader && _headerLine) + g.drawLine(new Pen(_lineColor), Point(margin.x, margin.y + height), Point(bounds.right, margin.y + height)); + // Draw header and records. + int row; // -row- is line number in CSV. + int viewLine; // -viewLine- is line number on display. + foreach (record; csvReader!(Tuple!T)(_csv)) + { + // Draw header. + if (row == 0) + { + if (_showHeader) + { + int y = margin.y + viewLine * height + _paddingY; + foreach (int col, value; record) + { + int x = margin.x + sum(_width[0..col]) + _paddingX; + g.drawText(to!string(value), _headerFont, _textColor, Rect(x, y, bounds.right, bounds.bottom)); + } + row++; + viewLine++; + continue; + } + else + { + row++; + // Do not increment -viewLine- here. + continue; + } + } + // Draw record. + if (firstRecord + (_hasHeader?1:0) <= row && row <= lastRecord + (_hasHeader?1:0)) + { + int y = margin.y + viewLine * height + _paddingY; + foreach (int col, value; record) + { + int x = margin.x + sum(_width[0..col]) + _paddingX; + g.drawText(to!string(value), _recordFont, _textColor, Rect(x, y, bounds.right, bounds.bottom)); + } + // Draw horizontal line. + if (_horizontalLine && viewLine < lastRecord - firstRecord + (_showHeader?1:0)) + { + int y2 = margin.y + height * (viewLine + 1); + g.drawLine(new Pen(_lineColor), Point(margin.x, y2), Point(bounds.right, y2)); + } + row++; + viewLine++; + } + else + { + row++; + // Do not increment -viewLine- here. + } + } + // Draw left side line. + if (_leftSideLine) + g.drawLine(new Pen(_lineColor), Point(margin.x, margin.y), Point(margin.x, margin.y + height * viewLine)); + // Draw right side line. + if (_rightSideLine) + g.drawLine(new Pen(_lineColor), Point(bounds.right, margin.y), Point(bounds.right, margin.y + height * viewLine)); + // Draw vertical line. + if (_verticalLine) + { + for (int i; i < _columns - 1; i++) + { + int w = sum(_width[0..i+1]); + g.drawLine(new Pen(_lineColor), Point(margin.x + w, margin.y), Point(margin.x + w, margin.y + height * viewLine)); + } + } + // Draw bottom side line. + if (_bottomSideLine) + g.drawLine(new Pen(_lineColor), Point(margin.x, margin.y + height * viewLine), Point(bounds.right, margin.y + height * viewLine)); + } + + /// + void hasHeader(bool byes) + { + _hasHeader = byes; + } + + /// + void showHeader(bool byes) + { + if (!_hasHeader) + throw new DflException("DFL: showHeader is failure because do not have header."); + _showHeader = byes; + } + + /// + void headerLine(bool byes) + { + _headerLine = byes; + } + + /// + void topSideLine(bool byes) + { + _topSideLine = byes; + } + + /// + void leftSideLine(bool byes) + { + _leftSideLine = byes; + } + + /// + void bottomSideLine(bool byes) + { + _bottomSideLine = byes; + } + + /// + void rightSideLine(bool byes) + { + _rightSideLine = byes; + } + + /// + void verticalLine(bool byes) + { + _verticalLine = byes; + } + + /// + void horizontalLine(bool byes) + { + _horizontalLine = byes; + } + + /// + Rect bounds() const + { + int rows = (_showHeader?1:0) + lastRecord - firstRecord + 1; + return Rect(_margin.x, _margin.y, sum(_width), height * rows); + } + + /// Left and Top margins. + void margin(Point pt) + { + _margin.x = pt.x; + _margin.y = pt.y; + } + /// ditto + Point margin() const + { + return _margin; + } + + /// + void paddingX(int px) + { + _paddingX = px; + } + + /// + void paddingY(int py) + { + _paddingY = py; + } + + /// + void firstRecord(int r) + { + _firstRecord = r; + } + /// + int firstRecord() const + { + return _firstRecord; + } + + /// + void lastRecord(int r) + { + _lastRecord = r; + } + /// + int lastRecord() const + { + return _lastRecord; + } + + /// + int columns() const + { + return _columns; + } + + /// + void height(int h) + { + _height = h; + } + /// ditto + int height() const + { + return _height; + } + + /// + struct WidthObject // Internal struct. + { + /// + this(ref int[] w) + { + _arr = w; + } + + /// + void opIndexAssign(int value, size_t i) + { + _arr[i] = value; + } + + /// + int opIndex(size_t i) + { + return _arr[i]; + } + + private: + int[] _arr; + } + + /// + WidthObject width() + { + return WidthObject(_width); + } + + /// + void textColor(Color c) + { + _textColor = c; + } + + /// + void backColor(Color c) + { + _backColor = c; + } + + /// + void lineColor(Color c) + { + _lineColor = c; + } + + void headerFont(Font f) + { + _headerFont = f; + } + + void recordFont(Font f) + { + _recordFont = f; + } + +private: + string _csv; + Point _margin; + int _paddingX; + int _paddingY; + int _columns; + int _height; + int[] _width; + int _firstRecord; + int _lastRecord; + Color _textColor; + Color _backColor; + Color _lineColor; + bool _hasHeader; + bool _showHeader; + bool _headerLine; + bool _topSideLine; + bool _leftSideLine; + bool _bottomSideLine; + bool _rightSideLine; + bool _verticalLine; + bool _horizontalLine; + Font _headerFont; + Font _recordFont; +} diff --git a/source/dfl/package.d b/source/dfl/package.d index c21e5d7..a80aa58 100644 --- a/source/dfl/package.d +++ b/source/dfl/package.d @@ -15,4 +15,4 @@ public import dfl.base, dfl.menu, dfl.control, dfl.usercontrol, dfl.combobox, dfl.treeview, dfl.picturebox, dfl.tabcontrol, dfl.listview, dfl.statusbar, dfl.progressbar, dfl.resources, dfl.imagelist, dfl.toolbar, dfl.trackbar, dfl.sharedcontrol, - dfl.printing; + dfl.printing, dfl.chart;