From da821bcefc4949459a0faa9f31441cad26bc5d73 Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Tue, 27 Jan 2015 13:56:42 +0300 Subject: [PATCH] new type of button - URL link; support opening of URL in external browser - for windows --- src/dlangui/core/stdaction.d | 2 ++ src/dlangui/core/types.d | 2 +- src/dlangui/platforms/common/platform.d | 14 ++++++++++ src/dlangui/widgets/controls.d | 33 +++++++++++++++++++---- src/dlangui/widgets/styles.d | 11 ++++++++ views/res/mdpi/applications-internet.png | Bin 0 -> 953 bytes views/standard_resources.list | 1 + 7 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 views/res/mdpi/applications-internet.png diff --git a/src/dlangui/core/stdaction.d b/src/dlangui/core/stdaction.d index 43b95875..7c166d65 100644 --- a/src/dlangui/core/stdaction.d +++ b/src/dlangui/core/stdaction.d @@ -31,6 +31,7 @@ enum StandardAction : int { Open, Save, DiscardChanges, + OpenUrl, } const Action ACTION_OK = new Action(StandardAction.Ok, "ACTION_OK"c); @@ -44,4 +45,5 @@ const Action ACTION_IGNORE = new Action(StandardAction.Ignore, "ACTION_IGNORE"c) const Action ACTION_OPEN = new Action(StandardAction.Open, "ACTION_OPEN"c); const Action ACTION_SAVE = new Action(StandardAction.Save, "ACTION_SAVE"c); const Action ACTION_DISCARD_CHANGES = new Action(StandardAction.DiscardChanges, "ACTION_DISCARD_CHANGES"c); +const Action ACTION_OPEN_URL = (new Action(StandardAction.OpenUrl)).iconId("applications-internet"); diff --git a/src/dlangui/core/types.d b/src/dlangui/core/types.d index b4b11b62..b38f12f4 100644 --- a/src/dlangui/core/types.d +++ b/src/dlangui/core/types.d @@ -394,7 +394,7 @@ wstring fromWStringz(const(wchar) * s) { /** widget state flags - bits */ enum State : uint { /// state not specified / normal - Normal = 4, // Normal is Enabled + Normal = 4 | 256, // Normal is Enabled /// pressed (e.g. clicked by mouse) Pressed = 1, /// widget has focus diff --git a/src/dlangui/platforms/common/platform.d b/src/dlangui/platforms/common/platform.d index b28b1e3d..b1eea6e7 100644 --- a/src/dlangui/platforms/common/platform.d +++ b/src/dlangui/platforms/common/platform.d @@ -30,6 +30,7 @@ import dlangui.dialogs.msgbox; private import dlangui.graphics.gldrawbuf; private import std.algorithm; private import core.sync.mutex; +private import std.string; // specify debug=DebugMouseEvents for logging mouse handling // specify debug=DebugRedraw for logging drawing and layouts handling @@ -846,6 +847,19 @@ class Platform { i18n.findTranslationsDir(dirs); return this; } + + /// override to support opening url in external browser + bool openURL(string url) { + Log.d("Platform.openURL(", url, ") is called"); + bool res = false; + version(Windows) { + import win32.shellapi; + ShellExecuteA(null, "open", url.toStringz, null, null, 1); + res = true; + } + // TODO: support other platforms + return res; + } } /// get current platform object instance diff --git a/src/dlangui/widgets/controls.d b/src/dlangui/widgets/controls.d index b34d192c..669e7e05 100644 --- a/src/dlangui/widgets/controls.d +++ b/src/dlangui/widgets/controls.d @@ -3,16 +3,19 @@ /** This module contains simple controls widgets implementation. -TextWidget +TextWidget - static text -ImageWidget +ImageWidget - image -Button +Button - button with only text -ImageButton +ImageButton - button with only image -ScrollBar +ImageTextButton - button with text and image +ScrollBar - scrollbar control + +UrlImageTextButton - URL link button Synopsis: @@ -29,9 +32,11 @@ module dlangui.widgets.controls; import dlangui.widgets.widget; import dlangui.widgets.layouts; +import dlangui.core.stdaction; private import std.algorithm; private import std.conv : to; +private import std.utf : toUTF32; /// vertical spacer to fill empty space in vertical layouts class VSpacer : Widget { @@ -282,6 +287,24 @@ class ImageTextButton : HorizontalLayout { } +/// button - url +class UrlImageTextButton : ImageTextButton { + this(string ID, dstring labelText, string url, string icon = "applications-internet") { + super(ID, icon, labelText); + Action a = ACTION_OPEN_URL.clone(); + a.label = labelText; + a.stringParam = url; + _action = a; + styleId = null; + //_icon.styleId = STYLE_BUTTON_IMAGE; + //_label.styleId = STYLE_BUTTON_LABEL; + //_label.textFlags(TextFlag.Underline); + _label.ownStyle.getOrCreateState(State.Hovered, State.Hovered).textFlags(TextFlag.Underline); + _label.textColor(0x000080); + padding(Rect(3,3,3,3)); + } +} + /// checkbox class CheckBox : ImageTextButton { this(string ID = null, string textResourceId = null) { diff --git a/src/dlangui/widgets/styles.d b/src/dlangui/widgets/styles.d index 07395aa5..cdcde587 100644 --- a/src/dlangui/widgets/styles.d +++ b/src/dlangui/widgets/styles.d @@ -746,6 +746,17 @@ class Style { return child; } + /// find exact existing state style or create new if no matched styles found + Style getOrCreateState(uint stateMask = 0, uint stateValue = 0) { + if (stateValue == State.Normal) + return this; + foreach(item; _substates) { + if ((item._stateMask == stateMask) && (item._stateValue == stateValue)) + return item; + } + return createState(stateMask, stateValue); + } + /// find substyle based on widget state (e.g. focused, pressed, ...) const(Style) forState(uint state) const { if (state == State.Normal) diff --git a/views/res/mdpi/applications-internet.png b/views/res/mdpi/applications-internet.png new file mode 100644 index 0000000000000000000000000000000000000000..670c0716f6b7ad8188916f43c4ce6607eb76dcbd GIT binary patch literal 953 zcmV;q14jIbP)@AEu!U{b6o>#4 z1W{1Yzz+x%G$0{Cnp9w02ni{Y1uYVPfr1u>B{`q0CI3_WlmbwM+?u5is{)=3PX9q z)X?ar%*;>Hies9wA`p^CZN=7sN06jA+1&esqsvuU=(9hZt_(XG$ul!!#2QirFJG_t(cLKJ`T=8Mn?*7TTU8VnT7FZw!L99r1LShU8fi0xi zNt79iQbX-5;JaUUs617sk%BKRRK_AZATd&)O-i35S=*=+)lSfD>3uyCmemPM(Mqg=>xspwLB)TY@8NE$xgh8Kqod0ocw(z;USmR}2W*0yMOx@^`v z?6*RO^EP9HS*jNY@DpeU5w_8^wpu1=#a}74v?c*sp7&*=*16l>IMq4VAy6sxcFcHx zhLN5mPEt~nAf&~~y}D^_H-C@(&SwBNfHA9)5I0`ao7`+4-Me}D+SB=?;Xbx{&8Kn7 zgZp*XZ$IRp@7JR6)L)G{?G~2?SfW3;00000NkvXXu0mjf7