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