forked from aparoksha/adwaita-swift
Improve docc documentation
This commit is contained in:
parent
e5783e9049
commit
ab93cbc1bf
63
Sources/Adwaita/Adwaita.docc/Advanced/CreatingWidgets.md
Normal file
63
Sources/Adwaita/Adwaita.docc/Advanced/CreatingWidgets.md
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
# Creating widgets
|
||||||
|
|
||||||
|
Widgets are special views that do not provide a collection of other views as a content,
|
||||||
|
but have functions that are called when creating or updating the view.
|
||||||
|
Normally, a widget manages a GTK or Libadwaita widget using the C API.
|
||||||
|
|
||||||
|
## Recreate the Text widget
|
||||||
|
In this tutorial, we will recreate the ``Text`` widget.
|
||||||
|
A widget conforms to the ``Widget`` protocol:
|
||||||
|
```swift
|
||||||
|
struct CustomText: Widget { }
|
||||||
|
```
|
||||||
|
You can add properties to the widget:
|
||||||
|
```swift
|
||||||
|
struct CustomText: Widget {
|
||||||
|
|
||||||
|
var text: String
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
|
This widget can be called in a view body using `CustomText(text: "Hello, world!")`.
|
||||||
|
Now, add the two functions required by the protocol:
|
||||||
|
```swift
|
||||||
|
import CAdw
|
||||||
|
|
||||||
|
struct CustomText: Widget {
|
||||||
|
|
||||||
|
var text: String
|
||||||
|
|
||||||
|
public func container(modifiers: [(View) -> View]) -> ViewStorage { }
|
||||||
|
public func update(_ storage: ViewStorage, modifiers: [(View) -> View], updateProperties: Bool) { }
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Import CAdw which exposes the whole C Libadwaita and Gtk API to Swift.
|
||||||
|
|
||||||
|
## The `container(modifiers:)` function
|
||||||
|
This function initializes the widget when the widget appears for the first time.
|
||||||
|
It expects a ``ViewStorage`` as the return type.
|
||||||
|
In our case, this function is very simple:
|
||||||
|
```swift
|
||||||
|
func container(modifiers: [(View) -> View]) -> ViewStorage {
|
||||||
|
.init(gtk_label_new(text)?.opaque())
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## The `update(_:modifiers:updateProperties:)` function
|
||||||
|
Whenever a state of the app changes, the ``Widget/update(_:modifiers:updateProperties:)`` function of the widget gets called.
|
||||||
|
You get the view storage that you have previously initialized as a parameter.
|
||||||
|
Update the storage to reflect the current state of the widget:
|
||||||
|
```swift
|
||||||
|
func update(_ storage: ViewStorage, modifiers: [(View) -> View], updateProperties: Bool) {
|
||||||
|
if updateProperties {
|
||||||
|
gtk_label_set_label(storage.pointer, text)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Containers
|
||||||
|
Some widgets act as containers that accept other widgets as children.
|
||||||
|
In that case, use the ``ViewStorage``'s `content` property for storing their view storages.
|
||||||
|
In the ``Widget/update(_:modifiers:updateProperties:)`` function, update the children's storages.
|
||||||
|
Take a look at the code of the container widgets in this library as a reference.
|
||||||
48
Sources/Adwaita/Adwaita.docc/Advanced/PublishingApps.md
Normal file
48
Sources/Adwaita/Adwaita.docc/Advanced/PublishingApps.md
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
# Publishing apps
|
||||||
|
|
||||||
|
Learn how to publish your apps using Flatpak.
|
||||||
|
|
||||||
|
Once you feel ready to publish your app to [Flathub](https://flathub.org/), or
|
||||||
|
to a [self-hosted repository](https://docs.flatpak.org/en/latest/hosting-a-repository.html),
|
||||||
|
you can follow this step-by-step guide.
|
||||||
|
|
||||||
|
## Create a Flatpak manifest
|
||||||
|
You have to create a Flatpak manifest, similar to the one [here](https://github.com/flathub/io.github.david_swift.Flashcards/blob/master/io.github.david_swift.Flashcards.json).
|
||||||
|
Find detailed information in the [Flatpak documentation](https://docs.flatpak.org/en/latest/manifests.html).
|
||||||
|
This is the only code that should be submitted to Flathub.
|
||||||
|
There will be a new repository created under `flathub/app-id` that hosts the manifest.
|
||||||
|
|
||||||
|
### SDK Extension for Swift 5
|
||||||
|
I recommend using the SDK Extension for building the app.
|
||||||
|
Add the following snippet.
|
||||||
|
|
||||||
|
```json
|
||||||
|
"sdk-extensions": [
|
||||||
|
"org.freedesktop.Sdk.Extension.swift5"
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Generate sources for the Swift Package Manager
|
||||||
|
You cannot access the web while building the app.
|
||||||
|
Therefore, you need to add all the dependencies as modules to the manifest file.
|
||||||
|
This can be automated using the [Flatpak builder tool for SPM](https://github.com/flatpak/flatpak-builder-tools/tree/master/spm).
|
||||||
|
|
||||||
|
## MetaInfo file
|
||||||
|
In the Flatpak Manifest file, under the build commands, you should add the [code to install the app's
|
||||||
|
MetaInfo file](https://github.com/flathub/io.github.david_swift.Flashcards/blob/c5c0421ffb5589641ddb44a269a6e7e07d430581/io.github.david_swift.Flashcards.json#L49).
|
||||||
|
The MetaInfo file is located in the app's main repository (not in the Flathub repository).
|
||||||
|
Take a look at the example [here](https://github.com/david-swift/Memorize/blob/main/data/io.github.david_swift.Flashcards.metainfo.xml).
|
||||||
|
|
||||||
|
## Desktop entry file
|
||||||
|
[This line](https://github.com/flathub/io.github.david_swift.Flashcards/blob/c5c0421ffb5589641ddb44a269a6e7e07d430581/io.github.david_swift.Flashcards.json#L50) in the example installs the Desktop Entry file.
|
||||||
|
It is located in the [main repository](https://github.com/david-swift/Memorize/blob/main/data/io.github.david_swift.Flashcards.desktop).
|
||||||
|
|
||||||
|
## Check the requirements
|
||||||
|
Before submitting an app to Flathub, make sure to check the [requirements](https://docs.flathub.org/docs/for-app-authors/requirements),
|
||||||
|
[MetaInfo guidelines](https://docs.flathub.org/docs/for-app-authors/metainfo-guidelines/), and [quality guidelines](https://docs.flathub.org/docs/for-app-authors/metainfo-guidelines/quality-guidelines).
|
||||||
|
Then, test and submit the app following the [submission instructions](https://docs.flathub.org/docs/for-app-authors/submission).
|
||||||
|
|
||||||
|
## Get the badges
|
||||||
|
Use the [Flathub badges](https://flathub.org/badges) to inform users about the simple installation option.
|
||||||
|
Even more assets are available [here](https://github.com/flathub-infra/assets).
|
||||||
|
|
||||||
@ -81,3 +81,14 @@ Find more information in the [template repository](https://github.com/AparokshaU
|
|||||||
### Tutorials
|
### Tutorials
|
||||||
|
|
||||||
- <doc:Table-of-Contents>
|
- <doc:Table-of-Contents>
|
||||||
|
|
||||||
|
### Basics
|
||||||
|
|
||||||
|
- <doc:CreatingViews>
|
||||||
|
- <doc:Windows>
|
||||||
|
- <doc:KeyboardShortcuts>
|
||||||
|
|
||||||
|
### Advanced
|
||||||
|
|
||||||
|
- <doc:CreatingWidgets>
|
||||||
|
- <doc:PublishingApps>
|
||||||
|
|||||||
@ -30,7 +30,7 @@ In this example, the widgets ``HeaderBar`` and ``Text`` are used.
|
|||||||
`padding` is a view modifier, a function that modifies a view, which adds some padding around the text.
|
`padding` is a view modifier, a function that modifies a view, which adds some padding around the text.
|
||||||
|
|
||||||
## Create custom views
|
## Create custom views
|
||||||
While directly adding widgets into the `Window`'s body might work for very simple apps,
|
While directly adding widgets into the ``Window``'s body might work for very simple apps,
|
||||||
it can get messy very quickly.
|
it can get messy very quickly.
|
||||||
Create custom views by declaring types that conform to the ``View`` protocol:
|
Create custom views by declaring types that conform to the ``View`` protocol:
|
||||||
```swift
|
```swift
|
||||||
@ -32,7 +32,7 @@ struct HelloWorld: App {
|
|||||||
```
|
```
|
||||||
|
|
||||||
## Showing windows
|
## Showing windows
|
||||||
Every app contains the property `app`.
|
Every app contains the property ``App/app``.
|
||||||
You can use this property for running functions that affect the whole app, e.g. quitting the app.
|
You can use this property for running functions that affect the whole app, e.g. quitting the app.
|
||||||
Another use case is showing a window:
|
Another use case is showing a window:
|
||||||
```swift
|
```swift
|
||||||
@ -66,7 +66,7 @@ It should be used for opening windows that cannot be presented more than once
|
|||||||
and for moving a window that is already open into the foreground.
|
and for moving a window that is already open into the foreground.
|
||||||
|
|
||||||
## Adding windows
|
## Adding windows
|
||||||
You can call the `addWindow(_:parent:)` function instead of `showWindow(_:)`
|
You can call the ``GTUIApp/addWindow(_:parent:)`` function instead of ``GTUIApp/showWindow(_:)``
|
||||||
if you want to add and focus another instance of a window type:
|
if you want to add and focus another instance of a window type:
|
||||||
```swift
|
```swift
|
||||||
@main
|
@main
|
||||||
Loading…
x
Reference in New Issue
Block a user