Add main menu with information about the programm
parent
112eb9b441
commit
19c1c2bc09
|
@ -0,0 +1 @@
|
||||||
|
models/dop/authors.json
|
5
dub.json
5
dub.json
|
@ -6,8 +6,11 @@
|
||||||
"description": "Take notes with touchscreen input.",
|
"description": "Take notes with touchscreen input.",
|
||||||
"license": "AGPL-3.0/proprietary",
|
"license": "AGPL-3.0/proprietary",
|
||||||
"name": "drawofpages",
|
"name": "drawofpages",
|
||||||
"targetType": "sourceLibrary",
|
"targetType": "library",
|
||||||
"subPackages": [
|
"subPackages": [
|
||||||
"versGTK3"
|
"versGTK3"
|
||||||
|
],
|
||||||
|
"stringImportPaths": [
|
||||||
|
"models"
|
||||||
]
|
]
|
||||||
}
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
{
|
||||||
|
"authors": [
|
||||||
|
"Marko Semet (Marko10_000)"
|
||||||
|
], "translators": [
|
||||||
|
""
|
||||||
|
], "artists": [
|
||||||
|
""
|
||||||
|
], "documenters": [
|
||||||
|
"Marko Semet (Marko10_000)"
|
||||||
|
],
|
||||||
|
"copyright_infos": "",
|
||||||
|
"version": "0.2.0-dev"
|
||||||
|
}
|
|
@ -0,0 +1,105 @@
|
||||||
|
/* DrawOfPages: Take notes with touchscreen input.
|
||||||
|
* Copyright (C) 2019 Marko Semet
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
module dop.authorship;
|
||||||
|
|
||||||
|
private
|
||||||
|
{
|
||||||
|
import std.algorithm;
|
||||||
|
import std.array;
|
||||||
|
import std.json;
|
||||||
|
|
||||||
|
struct __DataLoader
|
||||||
|
{
|
||||||
|
string[] authors;
|
||||||
|
string[] translators;
|
||||||
|
string[] artists;
|
||||||
|
string[] documenters;
|
||||||
|
string copyright_infos;
|
||||||
|
string prog_version;
|
||||||
|
|
||||||
|
/++
|
||||||
|
+ Loads a string list out of a json
|
||||||
|
+ Params:
|
||||||
|
+ data = The source json list
|
||||||
|
+ Returns: The read list of strings. When empty null.
|
||||||
|
+/
|
||||||
|
static string[] loadArray(JSONValue[] data)
|
||||||
|
{
|
||||||
|
auto result = data.map!((x) => x.str).filter!((x) => x.length != 0).array;
|
||||||
|
if(result.length == 0)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/++
|
||||||
|
+ Load the base input from resource file "authors.json"
|
||||||
|
+ Returns: The loaded values
|
||||||
|
+/
|
||||||
|
static __DataLoader load()
|
||||||
|
{
|
||||||
|
__DataLoader result;
|
||||||
|
auto data = parseJSON(import("dop/authors.json")).object;
|
||||||
|
assert(data["authors"].type == JSONType.array);
|
||||||
|
result.authors = loadArray(data["authors"].array);
|
||||||
|
assert(data["translators"].type == JSONType.array);
|
||||||
|
result.translators = loadArray(data["translators"].array);
|
||||||
|
assert(data["artists"].type == JSONType.array);
|
||||||
|
result.artists = loadArray(data["artists"].array);
|
||||||
|
assert(data["documenters"].type == JSONType.array);
|
||||||
|
result.documenters = loadArray(data["documenters"].array);
|
||||||
|
assert(data["copyright_infos"].type == JSONType.string);
|
||||||
|
result.copyright_infos = data["copyright_infos"].str;
|
||||||
|
assert(data["version"].type == JSONType.string);
|
||||||
|
result.prog_version = data["version"].str;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
enum __DataLoader __loader = __DataLoader.load();
|
||||||
|
}
|
||||||
|
|
||||||
|
public
|
||||||
|
{
|
||||||
|
/++
|
||||||
|
+ List of the developers.
|
||||||
|
+/
|
||||||
|
enum string[] authorship_authors = __loader.authors;
|
||||||
|
/++
|
||||||
|
+ List of the translators.
|
||||||
|
+/
|
||||||
|
enum string[] authorship_translators = __loader.translators;
|
||||||
|
/++
|
||||||
|
+ List of the artists.
|
||||||
|
+/
|
||||||
|
enum string[] authorship_artists = __loader.artists;
|
||||||
|
/++
|
||||||
|
+ List of the documenters.
|
||||||
|
+/
|
||||||
|
enum string[] authorship_documenters = __loader.documenters;
|
||||||
|
/++
|
||||||
|
+ Additional copyright informations.
|
||||||
|
+/
|
||||||
|
enum string authorship_copyright_infos = __loader.copyright_infos;
|
||||||
|
/++
|
||||||
|
+ The current programm version.
|
||||||
|
+/
|
||||||
|
enum string programm_version = __loader.prog_version;
|
||||||
|
}
|
|
@ -40,6 +40,11 @@ public
|
||||||
+ size = The new brush size
|
+ size = The new brush size
|
||||||
+/
|
+/
|
||||||
shared void setCurrentSize(float size);
|
shared void setCurrentSize(float size);
|
||||||
|
|
||||||
|
/++
|
||||||
|
+ Quit the application
|
||||||
|
+/
|
||||||
|
shared void quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
/++
|
/++
|
||||||
|
@ -128,6 +133,14 @@ public
|
||||||
this.__callbacks.setCurrentSize(size);
|
this.__callbacks.setCurrentSize(size);
|
||||||
return this.__currentSize;
|
return this.__currentSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/++
|
||||||
|
+ Quit the application
|
||||||
|
+/
|
||||||
|
shared void quit()
|
||||||
|
{
|
||||||
|
this.__callbacks.quit();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -13,6 +13,35 @@
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
<object class="GtkMenu" id="_mainMenu">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="reserve_toggle_size">False</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImageMenuItem" id="MenuInfo">
|
||||||
|
<property name="label">gtk-info</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="use_underline">True</property>
|
||||||
|
<property name="use_stock">True</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkSeparatorMenuItem">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImageMenuItem" id="MenuQuit">
|
||||||
|
<property name="label">gtk-quit</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="use_underline">True</property>
|
||||||
|
<property name="use_stock">True</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
<object class="GtkAdjustment" id="_sizeMover">
|
<object class="GtkAdjustment" id="_sizeMover">
|
||||||
<property name="lower">0.01</property>
|
<property name="lower">0.01</property>
|
||||||
<property name="upper">9.9900000000000002</property>
|
<property name="upper">9.9900000000000002</property>
|
||||||
|
@ -73,6 +102,22 @@
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="title" translatable="yes">DrawOfPages</property>
|
<property name="title" translatable="yes">DrawOfPages</property>
|
||||||
<property name="show_close_button">True</property>
|
<property name="show_close_button">True</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkMenuButton">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="receives_default">True</property>
|
||||||
|
<property name="popup">_mainMenu</property>
|
||||||
|
<property name="direction">none</property>
|
||||||
|
<property name="use_popover">False</property>
|
||||||
|
<child>
|
||||||
|
<placeholder/>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkButtonBox">
|
<object class="GtkButtonBox">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
|
@ -174,6 +219,7 @@
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="pack_type">end</property>
|
<property name="pack_type">end</property>
|
||||||
|
<property name="position">1</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
@ -182,4 +228,49 @@
|
||||||
<placeholder/>
|
<placeholder/>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
<object class="GtkAboutDialog" id="AboutDialog">
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="type_hint">dialog</property>
|
||||||
|
<property name="attached_to">MainApplication</property>
|
||||||
|
<property name="program_name">DrawOfPages</property>
|
||||||
|
<property name="version">--REPLACE--</property>
|
||||||
|
<property name="copyright" translatable="yes">--GET-REPLACED--</property>
|
||||||
|
<property name="website">https://marko10-000.de/projects/drawofpages</property>
|
||||||
|
<property name="authors">--GET-REPLACED--</property>
|
||||||
|
<property name="documenters">--GET-REPLACED--</property>
|
||||||
|
<property name="translator_credits" translatable="yes">--GET-REPLACED--</property>
|
||||||
|
<property name="artists">--GET-REPLACED--</property>
|
||||||
|
<property name="logo_icon_name">image-missing</property>
|
||||||
|
<property name="license_type">agpl-3-0-only</property>
|
||||||
|
<child>
|
||||||
|
<placeholder/>
|
||||||
|
</child>
|
||||||
|
<child internal-child="vbox">
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
<property name="spacing">2</property>
|
||||||
|
<child internal-child="action_area">
|
||||||
|
<object class="GtkButtonBox">
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="layout_style">end</property>
|
||||||
|
<child>
|
||||||
|
<placeholder/>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<placeholder/>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<placeholder/>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
</interface>
|
</interface>
|
||||||
|
|
|
@ -21,6 +21,7 @@ import dop.structures.base;
|
||||||
import gdk.Threads;
|
import gdk.Threads;
|
||||||
import gio.Application: GioApplication = Application;
|
import gio.Application: GioApplication = Application;
|
||||||
import gtk.Application;
|
import gtk.Application;
|
||||||
|
import gtk.Main;
|
||||||
|
|
||||||
private
|
private
|
||||||
{
|
{
|
||||||
|
@ -28,12 +29,12 @@ private
|
||||||
{
|
{
|
||||||
private
|
private
|
||||||
{
|
{
|
||||||
void delegate(void delegate(DOP_MainWindow)) __runWithMainWindow;
|
void delegate(void delegate(DOP_MainWindow, Application)) __runWithMainWindow;
|
||||||
}
|
}
|
||||||
|
|
||||||
public
|
public
|
||||||
{
|
{
|
||||||
shared this(void delegate(void delegate(DOP_MainWindow)) func)
|
shared this(void delegate(void delegate(DOP_MainWindow, Application)) func)
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
assert(func !is null);
|
assert(func !is null);
|
||||||
|
@ -45,16 +46,23 @@ private
|
||||||
|
|
||||||
shared void setCurrentColor(ColorRGBA color)
|
shared void setCurrentColor(ColorRGBA color)
|
||||||
{
|
{
|
||||||
this.__runWithMainWindow(delegate void(DOP_MainWindow mw) {
|
this.__runWithMainWindow(delegate void(DOP_MainWindow mw, Application app) {
|
||||||
mw.updateColor();
|
mw.updateColor();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
shared void setCurrentSize(float size)
|
shared void setCurrentSize(float size)
|
||||||
{
|
{
|
||||||
this.__runWithMainWindow(delegate void(DOP_MainWindow mw) {
|
this.__runWithMainWindow(delegate void(DOP_MainWindow mw, Application app) {
|
||||||
mw.updateSize(size);
|
mw.updateSize(size);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
shared void quit()
|
||||||
|
{
|
||||||
|
this.__runWithMainWindow(delegate void(DOP_MainWindow mw, Application app) {
|
||||||
|
app.quit();
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -70,9 +78,9 @@ int main(string[] args)
|
||||||
DOP_MainWindow mainWindow = new DOP_MainWindow(app);
|
DOP_MainWindow mainWindow = new DOP_MainWindow(app);
|
||||||
|
|
||||||
// Create main system
|
// Create main system
|
||||||
baseCB = new shared Callbacks(delegate void(void delegate(DOP_MainWindow) func) {
|
baseCB = new shared Callbacks(delegate void(void delegate(DOP_MainWindow, Application) func) {
|
||||||
threadsEnter();
|
threadsEnter();
|
||||||
func(mainWindow);
|
func(mainWindow, app);
|
||||||
threadsLeave();
|
threadsLeave();
|
||||||
});
|
});
|
||||||
ms = new shared MainSystem(baseCB);
|
ms = new shared MainSystem(baseCB);
|
||||||
|
@ -80,7 +88,6 @@ int main(string[] args)
|
||||||
|
|
||||||
// Finalize main system init
|
// Finalize main system init
|
||||||
ms.finalizeInit();
|
ms.finalizeInit();
|
||||||
mainWindow.updateColor(); // Fix sizing render bug
|
|
||||||
});
|
});
|
||||||
|
|
||||||
{ // Finalize
|
{ // Finalize
|
||||||
|
|
|
@ -20,11 +20,13 @@ private
|
||||||
{
|
{
|
||||||
import cairo.Context;
|
import cairo.Context;
|
||||||
|
|
||||||
|
import dop.authorship;
|
||||||
import dop.processing.mainsystem;
|
import dop.processing.mainsystem;
|
||||||
import dop.structures.base;
|
import dop.structures.base;
|
||||||
|
|
||||||
import gdk.RGBA;
|
import gdk.RGBA;
|
||||||
|
|
||||||
|
import gtk.AboutDialog;
|
||||||
import gtk.Application;
|
import gtk.Application;
|
||||||
import gtk.ApplicationWindow;
|
import gtk.ApplicationWindow;
|
||||||
import gtk.Builder;
|
import gtk.Builder;
|
||||||
|
@ -34,6 +36,7 @@ private
|
||||||
import gtk.Image;
|
import gtk.Image;
|
||||||
import gtk.Label;
|
import gtk.Label;
|
||||||
import gtk.MenuButton;
|
import gtk.MenuButton;
|
||||||
|
import gtk.MenuItem;
|
||||||
import gtk.Range;
|
import gtk.Range;
|
||||||
import gtk.Scale;
|
import gtk.Scale;
|
||||||
import gtk.SpinButton;
|
import gtk.SpinButton;
|
||||||
|
@ -72,6 +75,10 @@ public
|
||||||
Label __sizeInfo;
|
Label __sizeInfo;
|
||||||
MenuButton __sizeHelper;
|
MenuButton __sizeHelper;
|
||||||
|
|
||||||
|
AboutDialog __menuAboutDialog;
|
||||||
|
MenuItem __menuAbout;
|
||||||
|
MenuItem __menuQuit;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Colors
|
// Colors
|
||||||
//
|
//
|
||||||
|
@ -233,6 +240,57 @@ public
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{ // Manage menu entries
|
||||||
|
this.__menuAboutDialog = cast(AboutDialog) this.__builder.getObject("AboutDialog");
|
||||||
|
assert(this.__menuAboutDialog !is null);
|
||||||
|
this.__menuAbout = cast(MenuItem) this.__builder.getObject("MenuInfo");
|
||||||
|
assert(this.__menuAbout !is null);
|
||||||
|
this.__menuQuit = cast(MenuItem) this.__builder.getObject("MenuQuit");
|
||||||
|
assert(this.__menuQuit !is null);
|
||||||
|
|
||||||
|
// Set infos
|
||||||
|
this.__menuAboutDialog.setArtists(authorship_artists);
|
||||||
|
this.__menuAboutDialog.setAuthors(authorship_authors);
|
||||||
|
this.__menuAboutDialog.setDocumenters(authorship_documenters);
|
||||||
|
{
|
||||||
|
string trans = format!("%(%s\n%)")(authorship_translators);
|
||||||
|
if(trans.length == 0)
|
||||||
|
{
|
||||||
|
this.__menuAboutDialog.setTranslatorCredits(null);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.__menuAboutDialog.setTranslatorCredits(trans[0..$-1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
string copyright = authorship_copyright_infos;
|
||||||
|
if(copyright.length > 0)
|
||||||
|
{
|
||||||
|
copyright ~= "\n\n";
|
||||||
|
}
|
||||||
|
copyright ~= "Used library: GtkD(http://gtkd.org)";
|
||||||
|
this.__menuAboutDialog.setCopyright(copyright);
|
||||||
|
}
|
||||||
|
this.__menuAboutDialog.setVersion(programm_version);
|
||||||
|
|
||||||
|
// About
|
||||||
|
this.__menuAbout.addOnActivate(delegate void(MenuItem mi) {
|
||||||
|
if(mi == this.__menuAbout)
|
||||||
|
{
|
||||||
|
this.__menuAboutDialog.showAll();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Quit
|
||||||
|
this.__menuQuit.addOnActivate(delegate void(MenuItem mi) {
|
||||||
|
if(mi == this.__menuQuit)
|
||||||
|
{
|
||||||
|
this.__mainSystem.quit();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/++
|
/++
|
||||||
|
|
Loading…
Reference in New Issue