Skip to content

Commit 2b24db2

Browse files
committed
feat: move Remote Dev below Flash, add SSH terminal button, enlarge tab font
- Reorder NAV_ITEMS: remote moved to index 1 (below flash) - Update stack widget order and lazy-load indices accordingly - Add "Open Terminal" button in Remote page, enabled after SSH connect - Linux: tries gnome-terminal / konsole / xfce4-terminal / xterm - Windows: opens cmd with ssh command - Increase tab filter button font-size from 11px to 14px (theme.py + skills/page.py)
1 parent c9e857f commit 2b24db2

5 files changed

Lines changed: 64 additions & 20 deletions

File tree

seeed_jetson_develop/gui/main_window_v2.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -246,10 +246,10 @@ def pixel_art(x, y, pattern, palette):
246246

247247
NAV_ITEMS = [
248248
("flash", "main.nav.flash"),
249+
("remote", "main.nav.remote"),
249250
("devices", "main.nav.devices"),
250251
("apps", "main.nav.apps"),
251252
("skills", "main.nav.skills"),
252-
("remote", "main.nav.remote"),
253253
("community", "main.nav.community"),
254254
]
255255

@@ -394,20 +394,20 @@ def _init_ui(self):
394394
from seeed_jetson_develop.modules.devices.page import build_page as _devices_page
395395
from seeed_jetson_develop.modules.community.page import build_page as _community_page
396396
from seeed_jetson_develop.modules.remote.page import build_page as _remote_page
397-
# 顺序必须与 NAV_ITEMS 一致: flash, devices, apps, skills, remote, community
397+
# 顺序必须与 NAV_ITEMS 一致: flash, remote, devices, apps, skills, community
398398
self.stack.addWidget(_flash_page()) # 0
399-
self.stack.addWidget(_devices_page()) # 1
399+
self.stack.addWidget(_remote_page()) # 1
400+
self.stack.addWidget(_devices_page()) # 2
400401
# Apps 页面延迟加载(placeholder 占位,首次访问时替换)
401402
self._apps_placeholder = QWidget()
402403
self._apps_placeholder.setStyleSheet(f"background:{C_BG};")
403404
self._apps_built = False
404-
self.stack.addWidget(self._apps_placeholder) # 2: apps
405+
self.stack.addWidget(self._apps_placeholder) # 3: apps
405406
# Skills 页面延迟加载
406407
self._skills_placeholder = QWidget()
407408
self._skills_placeholder.setStyleSheet(f"background:{C_BG};")
408409
self._skills_built = False
409-
self.stack.addWidget(self._skills_placeholder) # 3: skills
410-
self.stack.addWidget(_remote_page()) # 4: remote
410+
self.stack.addWidget(self._skills_placeholder) # 4: skills
411411
self.stack.addWidget(_community_page(self.products, self.product_images)) # 5: community
412412
content_layout.addWidget(self.stack)
413413

@@ -425,13 +425,13 @@ def resizeEvent(self, event):
425425
def _build_titlebar(self):
426426
bar = QFrame()
427427
bar.setFixedHeight(pt(64))
428-
bar.setStyleSheet(f"""
429-
QFrame {{
430-
background: qlineargradient(x1:0,y1:0,x2:0,y2:1,
431-
stop:0 #0E1620, stop:1 {C_BG_DEEP});
432-
border: none;
433-
}}
434-
""")
428+
bar.setStyleSheet(f"""
429+
QFrame {{
430+
background: qlineargradient(x1:0,y1:0,x2:0,y2:1,
431+
stop:0 #0E1620, stop:1 {C_BG_DEEP});
432+
border: none;
433+
}}
434+
""")
435435
bar.installEventFilter(self)
436436

437437
lay = QHBoxLayout(bar)
@@ -682,7 +682,7 @@ def _build_sidebar(self):
682682
brand_lay.addWidget(self._brand_label)
683683
lay.addWidget(brand_container)
684684

685-
lay.addSpacing(0)
685+
lay.addSpacing(0)
686686

687687
# 导航按钮
688688
for idx, (key, label_key) in enumerate(NAV_ITEMS):
@@ -707,8 +707,8 @@ def _build_sidebar(self):
707707
return sidebar
708708

709709
def _set_page(self, idx):
710-
# Apps 页面(index=2)首次访问时懒加载
711-
if idx == 2 and not self._apps_built:
710+
# Apps 页面(index=3)首次访问时懒加载
711+
if idx == 3 and not self._apps_built:
712712
try:
713713
from seeed_jetson_develop.modules.apps.page import build_page as _apps_page
714714
real_page = _apps_page()
@@ -728,8 +728,8 @@ def _set_page(self, idx):
728728
if self._lang == "en":
729729
from .runtime_i18n import apply_language
730730
apply_language(real_page, "en")
731-
# Skills 页面(index=3)首次访问时懒加载
732-
if idx == 3 and not self._skills_built:
731+
# Skills 页面(index=4)首次访问时懒加载
732+
if idx == 4 and not self._skills_built:
733733
try:
734734
from seeed_jetson_develop.modules.skills.page import build_page as _skills_page
735735
real_page = _skills_page()

seeed_jetson_develop/gui/theme.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ def make_tab_button(text: str, active: bool = False) -> "QPushButton":
323323
border: none;
324324
border-radius: 0px;
325325
padding: 0px {pt(18)}px;
326-
font-size: {pt(11)}px;
326+
font-size: {pt(14)}px;
327327
font-weight: {weight};
328328
min-height: {pt(36)}px;
329329
text-align: center;

seeed_jetson_develop/locales/en/remote.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
"remote.conn.warn.ip_required": "Please enter device IP or hostname first.",
5959
"remote.conn.btn.connect": "Connect",
6060
"remote.conn.btn.connecting": "Connecting...",
61+
"remote.conn.btn.terminal": "Open Terminal",
6162
"remote.conn.btn.scan": "Scan LAN",
6263
"remote.conn.btn.scanning": "Scanning...",
6364
"remote.scan.scanning_lan": "Scanning LAN...",

seeed_jetson_develop/modules/remote/page.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,10 +602,13 @@ def _refresh_api_status():
602602
ip_input.setFixedHeight(_pt(44))
603603
ssh_btn = _btn(_tt("remote.conn.btn.connect"), primary=True, small=True)
604604
scan_btn = _btn(_tt("remote.conn.btn.scan"), small=True)
605+
terminal_btn = _btn(_tt("remote.conn.btn.terminal"), small=True)
606+
terminal_btn.setEnabled(False)
605607
ip_row = QHBoxLayout()
606608
ip_row.addWidget(ip_label)
607609
ip_row.addWidget(ip_input, 1)
608610
ip_row.addWidget(ssh_btn)
611+
ip_row.addWidget(terminal_btn)
609612
ip_row.addWidget(scan_btn)
610613
conn_lay.addLayout(ip_row)
611614

@@ -707,12 +710,14 @@ def _ssh_done(ok: bool, err: str):
707710
_save_conn()
708711
set_runner(SSHRunner(ip, username=user, password=pwd, sudo_password=sudo_input.text().strip() or pwd))
709712
bus.device_connected.emit({"ip": ip, "name": "Jetson", "model": ""})
713+
terminal_btn.setEnabled(True)
710714
else:
711715
conn_status.setText(_tt("remote.conn.status.failed"))
712716
conn_status.setStyleSheet(f"color:{C_RED}; font-size:{_pt(11)}px; background:transparent; font-weight:700;")
713717
conn_status.setToolTip(err)
714718
set_runner(None)
715719
bus.device_disconnected.emit(ip)
720+
terminal_btn.setEnabled(False)
716721

717722
def _do_ssh():
718723
ip = ip_input.text().strip()
@@ -730,6 +735,44 @@ def _do_ssh():
730735

731736
ssh_btn.clicked.connect(_do_ssh)
732737

738+
def _open_ssh_terminal():
739+
import platform
740+
import subprocess
741+
742+
ip = ip_input.text().strip()
743+
user = user_input.text().strip() or "seeed"
744+
745+
if not ip:
746+
_show_warning_message(page, _tt("common.notice"), _tt("remote.conn.warn.ip_required"))
747+
return
748+
749+
ssh_cmd = f"ssh {user}@{ip}"
750+
751+
try:
752+
system = platform.system()
753+
if system == "Linux":
754+
# Try common Linux terminals
755+
terminals = [
756+
("gnome-terminal", ["gnome-terminal", "--", "bash", "-c", f"{ssh_cmd}; exec bash"]),
757+
("konsole", ["konsole", "-e", "bash", "-c", f"{ssh_cmd}; exec bash"]),
758+
("xfce4-terminal", ["xfce4-terminal", "-e", f"bash -c '{ssh_cmd}; exec bash'"]),
759+
("xterm", ["xterm", "-e", f"bash -c '{ssh_cmd}; exec bash'"]),
760+
]
761+
for term_name, cmd in terminals:
762+
if shutil.which(term_name):
763+
subprocess.Popen(cmd)
764+
return
765+
_show_warning_message(page, _tt("common.notice"), "No terminal emulator found. Please install gnome-terminal, konsole, xfce4-terminal, or xterm.")
766+
elif system == "Windows":
767+
# Windows: use cmd or PowerShell
768+
subprocess.Popen(["cmd", "/c", "start", "cmd", "/k", ssh_cmd])
769+
else:
770+
_show_warning_message(page, _tt("common.notice"), f"Unsupported platform: {system}")
771+
except Exception as e:
772+
_show_error_message(page, _tt("common.error"), f"Failed to open terminal: {str(e)}")
773+
774+
terminal_btn.clicked.connect(_open_ssh_terminal)
775+
733776
init_card = _card(12)
734777
init_lay = QVBoxLayout(init_card)
735778
init_lay.setContentsMargins(24, 20, 24, 20)

seeed_jetson_develop/modules/skills/page.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -610,7 +610,7 @@ def _tab_style(self, active: bool) -> str:
610610
return (
611611
f"QPushButton {{ background:{'rgba(122,179,23,0.15)' if active else 'transparent'};"
612612
f"border:none; border-radius:0px; color:{C_GREEN if active else C_TEXT2};"
613-
f"font-size:{_pt(11)}px; font-weight:{'600' if active else '400'};"
613+
f"font-size:{_pt(14)}px; font-weight:{'600' if active else '400'};"
614614
f"padding:6px 16px; min-height:{_pt(32)}px; }}"
615615
f"QPushButton:hover {{ background:rgba(255,255,255,0.06); color:{C_TEXT}; }}"
616616
)

0 commit comments

Comments
 (0)