diff --git a/data/io.github.dubstar_04.design.data.gresource.xml b/data/io.github.dubstar_04.design.data.gresource.xml
index 330fdd9..66d3d44 100644
--- a/data/io.github.dubstar_04.design.data.gresource.xml
+++ b/data/io.github.dubstar_04.design.data.gresource.xml
@@ -6,6 +6,7 @@
ui/preferences.ui
ui/preferencePageSettings.ui
ui/preferencePageDimensionStyle.ui
+ ui/preferencePageLineType.ui
ui/preferencePageTextStyle.ui
ui/layers.ui
ui/properties.ui
diff --git a/data/io.github.dubstar_04.design.metainfo.xml b/data/io.github.dubstar_04.design.metainfo.xml
index d54c2e1..22af001 100644
--- a/data/io.github.dubstar_04.design.metainfo.xml
+++ b/data/io.github.dubstar_04.design.metainfo.xml
@@ -42,6 +42,9 @@
Change text styles, vertical and horizontal alignment from the properties window
Highlight design entities on mouse hover
Fix opening files as arguments e.g. 'open with' from file browser
+ Add line styles selection to preferences window
+ Add line styles selection to layers window
+ Add line styles selection to properties window
diff --git a/data/meson.build b/data/meson.build
index 8f0b122..5b0fee3 100644
--- a/data/meson.build
+++ b/data/meson.build
@@ -23,6 +23,7 @@ blueprints = custom_target('blueprints',
'ui/preferences.blp',
'ui/preferencePageSettings.blp',
'ui/preferencePageDimensionStyle.blp',
+ 'ui/preferencePageLineType.blp',
'ui/preferencePageTextStyle.blp',
'ui/layers.blp',
'ui/properties.blp',
diff --git a/data/screenshots/screenshot1.png b/data/screenshots/screenshot1.png
index 819cdae..6996ef9 100644
Binary files a/data/screenshots/screenshot1.png and b/data/screenshots/screenshot1.png differ
diff --git a/data/screenshots/screenshot3.png b/data/screenshots/screenshot3.png
index 14a1d3f..4cf2e6d 100644
Binary files a/data/screenshots/screenshot3.png and b/data/screenshots/screenshot3.png differ
diff --git a/data/ui/layers.blp b/data/ui/layers.blp
index bbab394..33d59cd 100644
--- a/data/ui/layers.blp
+++ b/data/ui/layers.blp
@@ -113,8 +113,8 @@ template $LayersWindow : Adw.ApplicationWindow {
Adw.EntryRow nameEntry{
title: _("Name");
- show-apply-button: true;
- notify::active => $onLayerUpdate();
+ //show-apply-button: true;
+ entry-activated => $onLayerUpdate();
}
Adw.ActionRow {
@@ -141,11 +141,12 @@ template $LayersWindow : Adw.ApplicationWindow {
Adw.ActionRow {
title: _("Line Type");
- subtitle: _("Line type for the selected layer. Not implimented");
+ subtitle: _("Line type for the selected layer");
[suffix]
- Label lineTypeLabel{
+ DropDown lineType{
valign: center;
+ notify::selected-item => $onLayerUpdate();
}
}
diff --git a/data/ui/preferencePageLineType.blp b/data/ui/preferencePageLineType.blp
new file mode 100644
index 0000000..e66cba1
--- /dev/null
+++ b/data/ui/preferencePageLineType.blp
@@ -0,0 +1,31 @@
+using Gtk 4.0;
+using Adw 1;
+
+template $PreferencePageLineType : Adw.PreferencesPage {
+ icon-name: "function-linear-symbolic";
+ title: _("Line Type");
+
+ ScrolledWindow {
+ child: Adw.Clamp {
+ child: Box {
+ orientation: vertical;
+ margin-top: 24;
+ margin-bottom: 24;
+ margin-start: 12;
+ margin-end: 12;
+ spacing: 6;
+
+ Box {
+ orientation: vertical;
+ spacing: 6;
+
+ ListBox stylesList{
+ selection-mode: none;
+ styles ["boxed-list"]
+ }
+ }
+
+ }; //Box
+ }; //Clamp
+ } //ScrolledWindow
+}
diff --git a/src/Design-Core b/src/Design-Core
index 780756c..1fc1272 160000
--- a/src/Design-Core
+++ b/src/Design-Core
@@ -1 +1 @@
-Subproject commit 780756c4134671a47f1a77a9e345383d63265f7c
+Subproject commit 1fc1272c43295bfe840784dd88e28e89f626ad1c
diff --git a/src/Design/layersWindow.js b/src/Design/layersWindow.js
index 72a091d..6813f86 100644
--- a/src/Design/layersWindow.js
+++ b/src/Design/layersWindow.js
@@ -29,7 +29,7 @@ import {DesignCore} from '../Design-Core/core/designCore.js';
export const LayersWindow = GObject.registerClass({
GTypeName: 'LayersWindow',
Template: 'resource:///io/github/dubstar_04/design/ui/layers.ui',
- InternalChildren: ['layerList', 'stack', 'backButton', 'nameEntry', 'frozenSwitch', 'lockedSwitch', 'lineTypeLabel', 'lineWeightLabel', 'plottingSwitch'],
+ InternalChildren: ['layerList', 'stack', 'backButton', 'nameEntry', 'frozenSwitch', 'lockedSwitch', 'lineType', 'lineWeightLabel', 'plottingSwitch'],
}, class LayersWindow extends Adw.ApplicationWindow {
constructor() {
super({});
@@ -68,21 +68,21 @@ export const LayersWindow = GObject.registerClass({
onEditAction(simpleAction, parameters) {
const layerName = parameters.deep_unpack();
- this.selected_layer = DesignCore.LayerManager.getLayerByName(layerName);
+ this.selected_layer = DesignCore.LayerManager.getStyleByName(layerName);
this.onEditLayer();
}
onDeleteAction(simpleAction, parameters) {
// console.log("delete action")
const layerName = parameters.deep_unpack();
- this.selected_layer = DesignCore.LayerManager.getLayerByName(layerName);
+ this.selected_layer = DesignCore.LayerManager.getStyleByName(layerName);
this.onLayerDelete();
}
onCurrentAction(simpleAction, parameters) {
// console.log("current action")
const layerName = parameters.deep_unpack();
- DesignCore.LayerManager.setCLayer(layerName);
+ DesignCore.LayerManager.setCstyle(layerName);
this.reload();
}
@@ -96,6 +96,12 @@ export const LayersWindow = GObject.registerClass({
return rgba;
}
+ getLineTypes() {
+ const lineStyles = DesignCore.LTypeManager.getStyles();
+ const lineStyleNames = lineStyles.map((style) => style.name);
+ return lineStyleNames;
+ }
+
reload() {
this.clearList();
this.loadLayers();
@@ -113,8 +119,8 @@ export const LayersWindow = GObject.registerClass({
}
loadLayers() {
- const layers = DesignCore.LayerManager.getLayers();
- const clayer = DesignCore.LayerManager.getCLayer();
+ const layers = DesignCore.LayerManager.getStyles();
+ const clayer = DesignCore.LayerManager.getCstyle();
for (let i = 0; i < layers.length; i++) {
const colourButton = new Gtk.ColorButton({'valign': Gtk.Align.CENTER, 'rgba': this.toRgba(layers[i].colour)});
@@ -149,7 +155,7 @@ export const LayersWindow = GObject.registerClass({
onColourChange(colourButton) {
const row = colourButton.get_ancestor(Adw.ActionRow);
- const layer = DesignCore.LayerManager.getLayerByName(row.title);
+ const layer = DesignCore.LayerManager.getStyleByName(row.title);
const rgba = colourButton.rgba.to_string();
const rgb = rgba.substr(4).split(')')[0].split(',');
// log(rgb)
@@ -163,7 +169,7 @@ export const LayersWindow = GObject.registerClass({
// Get the row of the switch
const row = toggle.get_ancestor(Adw.ActionRow);
// get the layer reference from the layer manager
- const layer = DesignCore.LayerManager.getLayerByName(row.title);
+ const layer = DesignCore.LayerManager.getStyleByName(row.title);
// change the layer state
layer.on = state;
// redraw
@@ -178,14 +184,14 @@ export const LayersWindow = GObject.registerClass({
onNewClicked() {
// console.log("new clicked")
- DesignCore.LayerManager.newLayer();
+ DesignCore.LayerManager.newStyle();
this.reload();
}
onLayerSelected(row) {
if (row) {
this._layerList.unselect_row(row);
- this.selected_layer = DesignCore.LayerManager.getLayerByName(row.title);
+ this.selected_layer = DesignCore.LayerManager.getStyleByName(row.title);
this.onEditLayer();
}
}
@@ -194,7 +200,16 @@ export const LayersWindow = GObject.registerClass({
this._nameEntry.text = this.selected_layer.name;
this._frozenSwitch.active = this.selected_layer.frozen;
this._lockedSwitch.active = this.selected_layer.locked;
- this._lineTypeLabel.label = this.selected_layer.lineType;
+
+ // set line type model and current index
+ const lineTypeNames = this.getLineTypes();
+ this._lineType.set_model(Gtk.StringList.new(lineTypeNames));
+ const selectedIndex = lineTypeNames.indexOf(this.selected_layer.lineType);
+
+ if (selectedIndex >= 0) {
+ this._lineType.set_selected(selectedIndex);
+ }
+
this._lineWeightLabel.label = this.selected_layer.lineWeight.toString();
this._plottingSwitch.active = this.selected_layer.plotting;
@@ -203,12 +218,13 @@ export const LayersWindow = GObject.registerClass({
}
onLayerUpdate() {
- // console.log("update layer")
- this.selected_layer.name = this._nameEntry.text;
+ const layerIndex = DesignCore.LayerManager.getStyleIndex(this.selected_layer.name);
+ DesignCore.LayerManager.renameStyle(layerIndex, this._nameEntry.text);
this.selected_layer.frozen = this._frozenSwitch.active;
this.selected_layer.locked = this._lockedSwitch.active;
- // this.selected_layer.lineType = this._lineTypeLabel.label;
- // this.selected_layer.lineWeight = this._lineWeightLabel.label;
+ const selectedLineType = this._lineType.get_selected_item().get_string();
+ this.selected_layer.lineType = selectedLineType;
+
this.selected_layer.plotting = this._plottingSwitch.active;
this.get_transient_for().getActiveCanvas().queue_draw();
}
@@ -229,14 +245,14 @@ export const LayersWindow = GObject.registerClass({
onConfirmDialog(dialog, response) {
// console.log("delete dialog callback")
if (response === 'delete') {
- this.deleteLayer(this.selected_layer.name);
+ this.deleteStyle(this.selected_layer.name);
this.onBackClicked();
}
}
- deleteLayer(layerName) {
+ deleteStyle(layerName) {
// console.log("delete layer")
- DesignCore.LayerManager.deleteLayerName(layerName);
+ DesignCore.LayerManager.deleteStyle(DesignCore.LayerManager.getStyleIndex(layerName));
this.get_transient_for().getActiveCanvas().queue_draw();
}
}, // window
diff --git a/src/Design/preferencePageLineType.js b/src/Design/preferencePageLineType.js
new file mode 100644
index 0000000..72160a7
--- /dev/null
+++ b/src/Design/preferencePageLineType.js
@@ -0,0 +1,83 @@
+/* preferencesWindow.js
+ *
+ * Copyright 2024 Daniel Wood
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+import GObject from 'gi://GObject';
+import Adw from 'gi://Adw?version=1';
+import Gtk from 'gi://Gtk';
+
+import {DesignCore} from '../Design-Core/core/designCore.js';
+
+export const PreferencePageLineType = GObject.registerClass({
+ GTypeName: 'PreferencePageLineType',
+ Template: 'resource:///io/github/dubstar_04/design/ui/preferencePageLineType.ui',
+ InternalChildren: ['stylesList'],
+}, class PreferencePageLineType extends Adw.PreferencesPage {
+ constructor() {
+ super({});
+ this.reload();
+ }
+
+ reload() {
+ this.clearStyleList();
+ this.load();
+ }
+
+ clearStyleList() {
+ // delete all current children
+ let child = this._stylesList.get_first_child();
+ while (child) {
+ const next = child.get_next_sibling();
+ this._stylesList.remove(child);
+ child = next;
+ }
+ }
+
+ load() {
+ const optionalStyles = DesignCore.LTypeManager.getOptionalStyles();
+
+ optionalStyles.forEach((style, index) => {
+ const row = new Adw.ActionRow(
+ {
+ title: style.name,
+ subtitle: style.description,
+ });
+
+ const styleLoaded = DesignCore.LTypeManager.styleExists(style.name);
+ const indelibleStyle = DesignCore.LTypeManager.indelibleStyles.some((iStyle) => iStyle.toUpperCase() === style.name);
+
+ const checkBox = new Gtk.CheckButton({active: styleLoaded, sensitive: !(styleLoaded||indelibleStyle)});
+ checkBox.connect('toggled', this.styleChecked.bind(this, row));
+ row.id = index;
+
+ row.add_prefix(checkBox);
+ this._stylesList.append(row);
+ });
+ }
+
+
+ styleChecked(row, checkBox) {
+ if (row) {
+ const optionalStyles = DesignCore.LTypeManager.getOptionalStyles();
+ DesignCore.LTypeManager.addStyle(optionalStyles[row.id]);
+ this.reload();
+ }
+ }
+},
+);
+
+
diff --git a/src/Design/preferencesWindow.js b/src/Design/preferencesWindow.js
index 14fdb9c..4caa6a5 100644
--- a/src/Design/preferencesWindow.js
+++ b/src/Design/preferencesWindow.js
@@ -23,6 +23,7 @@ import Adw from 'gi://Adw?version=1';
import {PreferencePageSettings} from './preferencePageSettings.js';
import {PreferencePageTextStyle} from './preferencePageTextStyle.js';
// import {PreferencePageDimensionStyle} from './preferencePageDimensionStyle.js';
+import {PreferencePageLineType} from './preferencePageLineType.js';
export const PreferencesWindow = GObject.registerClass({
GTypeName: 'PreferencesWindow',
@@ -35,6 +36,7 @@ export const PreferencesWindow = GObject.registerClass({
this.add(new PreferencePageSettings(settings));
this.add(new PreferencePageTextStyle());
+ this.add(new PreferencePageLineType());
// this.add(new PreferencePageDimensionStyle());
}
},
diff --git a/src/Design/propertiesWindow.js b/src/Design/propertiesWindow.js
index c7e3cdd..ad98aef 100644
--- a/src/Design/propertiesWindow.js
+++ b/src/Design/propertiesWindow.js
@@ -176,6 +176,7 @@ export const PropertiesWindow = GObject.registerClass({
break;
case 'layer':
case 'styleName':
+ case 'lineType':
const model = this.getModel(property);
suffixWidget = Gtk.DropDown.new_from_strings(model);
suffixWidget.width_request = widgetWidth;
@@ -248,12 +249,11 @@ export const PropertiesWindow = GObject.registerClass({
switch (property) {
case 'layer':
model = [];
- for (const layer of DesignCore.LayerManager.getLayers()) {
+ for (const layer of DesignCore.LayerManager.getStyles()) {
model.push(layer.name);
}
break;
case 'styleName':
- // TODO: build model for styles
const styles = DesignCore.StyleManager.getStyles();
const styleNames = styles.map((style) => style.name);
model = styleNames;
@@ -266,6 +266,10 @@ export const PropertiesWindow = GObject.registerClass({
// TODO: build human readable model for alignment
model = ['Baseline', 'Bottom', 'Middle', 'Top'];
break;
+ case 'lineType':
+ const lineStyles = DesignCore.LTypeManager.getStyles();
+ const lineStyleNames = lineStyles.map((style) => style.name);
+ model = lineStyleNames;
}
return model;
}
diff --git a/src/io.github.dubstar_04.design.src.gresource.xml b/src/io.github.dubstar_04.design.src.gresource.xml
index a71888f..29d645a 100644
--- a/src/io.github.dubstar_04.design.src.gresource.xml
+++ b/src/io.github.dubstar_04.design.src.gresource.xml
@@ -8,6 +8,7 @@
Design/preferencePageSettings.js
Design/preferencePageDimensionStyle.js
Design/preferencePageTextStyle.js
+ Design/preferencePageLineType.js
Design/layersWindow.js
Design/exportWindow.js
Design/propertiesWindow.js
@@ -81,8 +82,8 @@
Design-Core/core/tools/trim.js
Design-Core/core/tools/tool.js
- Design-Core/core/layers/layer.js
- Design-Core/core/layers/layerManager.js
+ Design-Core/core/styles/layer.js
+ Design-Core/core/styles/layerManager.js
Design-Core/core/styles/ltype.js
Design-Core/core/styles/ltypeManager.js
Design-Core/core/styles/styleManagerBase.js