Skip to content

Commit d604e33

Browse files
committed
Update version to 1.3.1 and adjust related resources
- Bumped version number in project files and metadata to 1.3.1. - Updated screenshot URLs in metainfo to reflect the new version. - Made minor UI adjustments in host editor and host list for improved functionality and user experience. - Added drag-and-drop reordering feature in the host list with undo capability.
1 parent dbab6d0 commit d604e33

12 files changed

+629
-40
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
name: Build AppImage (Linux)
2+
3+
on:
4+
push:
5+
branches: [ master ]
6+
tags: [ 'v*', '*.*.*' ]
7+
pull_request:
8+
branches: [ master ]
9+
10+
jobs:
11+
appimage:
12+
runs-on: ubuntu-22.04
13+
steps:
14+
- name: Checkout
15+
uses: actions/checkout@v4
16+
17+
- name: Set up Python
18+
uses: actions/setup-python@v5
19+
with:
20+
python-version: '3.x'
21+
22+
- name: Install AppImage Builder
23+
run: |
24+
sudo add-apt-repository -y ppa:appimagebuilder-team/stable
25+
sudo apt-get update
26+
sudo apt-get install -y appimage-builder
27+
28+
- name: Build AppImage
29+
run: |
30+
appimage-builder --recipe AppImageBuilder.yml --skip-test
31+
32+
- name: Upload artifact
33+
uses: actions/upload-artifact@v4
34+
with:
35+
name: SSH-Studio-AppImage
36+
path: '*.AppImage'
37+
38+
- name: Publish Release Asset
39+
if: startsWith(github.ref, 'refs/tags/')
40+
uses: softprops/action-gh-release@v2
41+
with:
42+
files: |
43+
*.AppImage
44+
*.zsync
45+
env:
46+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
47+

AppImageBuilder.yml

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
version: 1
2+
3+
AppDir:
4+
path: AppDir
5+
app_info:
6+
id: io.github.BuddySirJava.SSH-Studio
7+
name: SSH Studio
8+
icon: io.github.BuddySirJava.SSH-Studio
9+
version: 1.3.1
10+
exec: usr/bin/ssh-studio
11+
exec_args: "$@"
12+
13+
runtime:
14+
env:
15+
GSETTINGS_SCHEMA_DIR: usr/share/glib-2.0/schemas
16+
GI_TYPELIB_PATH: usr/lib/girepository-1.0:usr/lib/x86_64-linux-gnu/girepository-1.0
17+
LD_LIBRARY_PATH: usr/lib:usr/lib/x86_64-linux-gnu:${LD_LIBRARY_PATH}
18+
19+
apt:
20+
arch: amd64
21+
allow_unauthenticated: false
22+
sources:
23+
- sourceline: deb [arch=amd64] http://archive.ubuntu.com/ubuntu noble main universe
24+
- sourceline: deb [arch=amd64] http://archive.ubuntu.com/ubuntu noble-updates main universe
25+
- sourceline: deb [arch=amd64] http://security.ubuntu.com/ubuntu noble-security main universe
26+
include:
27+
- python3
28+
- python3-gi
29+
- gir1.2-gtk-4.0
30+
- gir1.2-adw-1
31+
- gir1.2-gtksource-5
32+
- libgtk-4-1
33+
- libadwaita-1-0
34+
- libgtksourceview-5-0
35+
- glib-networking
36+
- ca-certificates
37+
- libglib2.0-0
38+
- libpango-1.0-0
39+
- libgirepository-1.0-1
40+
exclude:
41+
- usr/share/doc
42+
- usr/share/man
43+
- usr/share/locale
44+
- usr/share/icons/hicolor/icon-theme.cache
45+
46+
files:
47+
include: []
48+
exclude:
49+
- usr/include
50+
- usr/lib/pkgconfig
51+
52+
script:
53+
- apt-get update
54+
- DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends git meson ninja-build python3-pip python3-setuptools python3-wheel ca-certificates
55+
- rm -rf /var/lib/apt/lists/*
56+
- git clone --depth=1 --branch v0.18.0 https://gitlab.gnome.org/GNOME/blueprint-compiler.git
57+
- cd blueprint-compiler && meson setup build && ninja -C build && meson install -C build --destdir ../AppDir && cd ..
58+
- export PATH="$PWD/AppDir/usr/bin:$PATH"
59+
- meson setup --prefix=/usr builddir
60+
- meson install -C builddir --destdir AppDir
61+
- glib-compile-schemas AppDir/usr/share/glib-2.0/schemas || true
62+
63+
AppImage:
64+
arch: x86_64
65+
update-information: None
66+
sign-key: None
67+

data/io.github.BuddySirJava.SSH-Studio.metainfo.xml

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,23 +27,31 @@
2727
<content_rating type="oars-1.1"/>
2828
<screenshots>
2929
<screenshot type="default">
30-
<image>https://raw.githubusercontent.com/BuddySirJava/SSH-Studio/refs/tags/1.3.0/assets/screenshots/ss1.png</image>
30+
<image>https://raw.githubusercontent.com/BuddySirJava/SSH-Studio/refs/tags/1.3.1/assets/screenshots/ss1.png</image>
3131
<caption>Host List and some shortcuts</caption>
3232
</screenshot>
3333
<screenshot>
34-
<image>https://raw.githubusercontent.com/BuddySirJava/SSH-Studio/refs/tags/1.3.0/assets/screenshots/ss2.png</image>
34+
<image>https://raw.githubusercontent.com/BuddySirJava/SSH-Studio/refs/tags/1.3.1/assets/screenshots/ss2.png</image>
3535
<caption>Host Editor</caption>
3636
</screenshot>
3737
<screenshot>
38-
<image>https://raw.githubusercontent.com/BuddySirJava/SSH-Studio/refs/tags/1.3.0/assets/screenshots/ss3.png</image>
38+
<image>https://raw.githubusercontent.com/BuddySirJava/SSH-Studio/refs/tags/1.3.1/assets/screenshots/ss3.png</image>
3939
<caption>Synchronizing Raw/Diff Mode and syntax highlighting</caption>
4040
</screenshot>
4141
<screenshot>
42-
<image>https://raw.githubusercontent.com/BuddySirJava/SSH-Studio/refs/tags/1.3.0/assets/screenshots/ss4.png</image>
42+
<image>https://raw.githubusercontent.com/BuddySirJava/SSH-Studio/refs/tags/1.3.1/assets/screenshots/ss4.png</image>
4343
<caption>SSH Key Management</caption>
4444
</screenshot>
4545
</screenshots>
4646
<releases>
47+
<release version="1.3.1" date="2025-09-26">
48+
<description>
49+
<p>Fixed many major UI bugs.</p>
50+
<p>Added Undo button to the header.</p>
51+
<p>Added Fresh new drag and drop reordering system for hosts.</p>
52+
<p>Added Keyboard Shortcuts to the host list.</p>
53+
</description>
54+
</release>
4755
<release version="1.3.0" date="2025-09-22">
4856
<description>
4957
<p>Support for GNOME 49.</p>

data/ui/host_editor.blp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ template $HostEditor: Gtk.Box {
5151
vexpand: true;
5252
hexpand: true;
5353

54-
54+
WindowHandle {
5555
Adw.HeaderBar {
5656
show-back-button: false;
5757
show-title: false;
@@ -73,6 +73,7 @@ template $HostEditor: Gtk.Box {
7373
margin-start: 20;
7474
}
7575
}
76+
}
7677
Overlay banner_overlay {
7778
child: Adw.Banner unsaved_banner {
7879
revealed: false;
@@ -151,12 +152,16 @@ template $HostEditor: Gtk.Box {
151152

152153
[suffix]
153154
Button identity_button {
155+
margin-top: 8;
156+
margin-bottom: 8;
154157
icon-name: "document-open-symbolic";
155158
tooltip-text: _("Choose Identity File");
156159
}
157160

158161
[suffix]
159162
Button identity_pick_button {
163+
margin-top: 8;
164+
margin-bottom: 8;
160165
icon-name: "dialog-password-symbolic";
161166
tooltip-text: _("Pick from existing SSH keys");
162167
}

data/ui/host_list.blp

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Gtk 4.0;
2+
using Adw 1;
23

34
template $HostList: Box {
45
orientation: vertical;
@@ -13,7 +14,7 @@ template $HostList: Box {
1314
Box {
1415
orientation: vertical;
1516
spacing: 0;
16-
17+
WindowHandle{
1718
Box {
1819
orientation: horizontal;
1920
spacing: 12;
@@ -25,6 +26,13 @@ template $HostList: Box {
2526
styles [ "flat", ]
2627
}
2728

29+
Button undo_button {
30+
icon-name: "edit-undo-symbolic";
31+
tooltip-text: _("Undo last change");
32+
sensitive: false;
33+
styles [ "flat", ]
34+
}
35+
2836
Label {
2937
label: _("SSH Studio");
3038
halign: center;
@@ -52,6 +60,7 @@ template $HostList: Box {
5260
}
5361

5462
}
63+
}
5564

5665
Box search_bar {
5766
orientation: horizontal;
@@ -83,15 +92,27 @@ template $HostList: Box {
8392
"host-list-scroll",
8493
]
8594

86-
ListBox list_box {
87-
selection-mode: single;
95+
Stack host_stack {
8896
hexpand: true;
8997
vexpand: true;
90-
margin-bottom: 12;
9198

92-
styles [
93-
"navigation-sidebar",
94-
]
99+
ListBox list_box {
100+
selection-mode: single;
101+
hexpand: true;
102+
vexpand: true;
103+
margin-bottom: 12;
104+
105+
styles [
106+
"navigation-sidebar",
107+
]
108+
}
109+
110+
Adw.StatusPage empty_page {
111+
visible: false;
112+
icon-name: "computer-symbolic";
113+
title: _("No hosts yet");
114+
description: _("Click the + button to add your first host");
115+
}
95116
}
96117
}
97118

io.github.BuddySirJava.SSH-Studio.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
{
5050
"type" : "git",
5151
"url" : "https://github.com/BuddySirJava/SSH-Studio.git",
52-
"tag" : "1.3.0",
52+
"tag" : "1.3.1",
5353
"commit" : "528e5c0e207c63b9ead2adf3f169316950ee81af",
5454
"x-checker-data" : {
5555
"type" : "git",

io.github.BuddySirJava.SSH-Studio.json~

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
{
4848
"type": "git",
4949
"url": "https://github.com/BuddySirJava/SSH-Studio.git",
50-
"tag": "1.3.0",
50+
"tag": "1.3.1",
5151
"commit": "528e5c0e207c63b9ead2adf3f169316950ee81af",
5252
"x-checker-data": {
5353
"type": "git",

meson.build

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
project('ssh-studio', 'c',
2-
version: '1.3.0',
2+
version: '1.3.1',
33
license: 'GPL-3.0-or-later',
44
meson_version: '>= 0.60.0',
55
default_options: ['warning_level=2',

po/en.po

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
msgid ""
22
msgstr ""
3-
"Project-Id-Version: ssh-studio 1.3.0\n"
3+
"Project-Id-Version: ssh-studio 1.3.1\n"
44
"Report-Msgid-Bugs-To: \n"
55
"POT-Creation-Date: 2025-09-05 00:28+0330\n"
66
"PO-Revision-Date: 2025-01-01 00:00+0000\n"

src/ui/host_editor.py

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,9 @@ def _connect_buttons(self):
404404
self.test_row.connect("activated", lambda r: self._on_test_connection(None))
405405
try:
406406
if getattr(self, "unsaved_banner", None) is not None:
407-
self.unsaved_banner.connect("button-clicked", lambda *_: self._on_save_clicked(None))
407+
self.unsaved_banner.connect(
408+
"button-clicked", lambda *_: self._on_save_clicked(None)
409+
)
408410
except Exception:
409411
pass
410412

@@ -426,7 +428,6 @@ def _connect_header_buttons(self):
426428
except Exception:
427429
pass
428430

429-
430431
def _on_add_clicked(self, button):
431432
"""Handle add host button click."""
432433
try:
@@ -601,9 +602,7 @@ def _safe_set_entry_text(row, text):
601602

602603
self.is_loading = False
603604
try:
604-
if getattr(self, "unsaved_banner", None):
605-
self.unsaved_banner.set_revealed(False)
606-
self.unsaved_banner.set_sensitive(False)
605+
self._update_button_sensitivity()
607606
except Exception:
608607
pass
609608

@@ -1363,6 +1362,7 @@ def _copy_text_to_clipboard(self, text: str) -> bool:
13631362
pass
13641363
try:
13651364
import subprocess as _sub
1365+
13661366
for cmd in [
13671367
["wl-copy"],
13681368
["xclip", "-selection", "clipboard"],
@@ -1691,6 +1691,10 @@ def _on_save_clicked(self, button):
16911691
)
16921692
except Exception:
16931693
pass
1694+
try:
1695+
self._update_button_sensitivity()
1696+
except Exception:
1697+
pass
16941698
try:
16951699
self._show_message(_(f"Configuration saved → {parser.config_path}"))
16961700
except Exception:
@@ -1713,10 +1717,18 @@ def _on_save_clicked(self, button):
17131717
except Exception:
17141718
pass
17151719

1716-
17171720
def _update_button_sensitivity(self):
1718-
"""Updates the sensitivity of banner based on dirty state and validity."""
1719-
is_dirty = self.is_host_dirty()
1721+
"""Updates the sensitivity of banner based on global dirty state and validity."""
1722+
is_dirty = False
1723+
try:
1724+
main = self.app or self.get_root()
1725+
parser = getattr(main, "parser", None)
1726+
if parser is not None and getattr(parser, "config", None) is not None:
1727+
is_dirty = bool(parser.config.is_dirty())
1728+
else:
1729+
is_dirty = self.is_host_dirty()
1730+
except Exception:
1731+
is_dirty = self.is_host_dirty()
17201732
field_errors = self._collect_field_errors()
17211733
is_valid = not bool(field_errors)
17221734
try:

0 commit comments

Comments
 (0)