Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,8 @@ MainWindow::MainWindow(QTranslator* startupTranslator, QWidget* parent)
// remove this override — see settingsdialog.cpp buildUi.
m_settings.xMinimizesApp = false;
m_settings.launchOnStartup = m_persist.value("window/launchOnStartup", false).toBool();
m_settings.minimalWidth = m_persist.value("window/minimalWidth", false).toBool();
m_settings.minimalWidthPx = m_persist.value("window/minimalWidthPx", 0).toInt();
m_settings.audioFeedback = m_persist.value("audio/enabled", false).toBool();
m_settings.showClickIndicator = m_persist.value("visual/clickIndicator", AppSettings{}.showClickIndicator).toBool();
m_settings.audioClickEnabled = m_persist.value("audioClick/enabled", false).toBool();
Expand Down Expand Up @@ -1130,6 +1132,16 @@ void MainWindow::rebuildButtons()
lay->activate();

adjustSize();

// Minimal width with an explicit pixel limit overrides the natural
// (sizeHint-driven) width computed by adjustSize() above. Floored to the
// title bar's own minimum so its controls (settings/exit/status dot)
// never become unreachable — that floor is the one clipping guarantee
// that survives a user-chosen limit; button/label text is not protected.
if (m_settings.minimalWidth && m_settings.minimalWidthPx > 0) {
const int floorPx = m_titleBar ? m_titleBar->minimumSizeHint().width() : 0;
resize(qMax(m_settings.minimalWidthPx, floorPx), height());
}
}

ClickButton* MainWindow::makeButton(const QString& label, const QString& tooltip, ClickType type, const QString& iconName)
Expand Down Expand Up @@ -1295,6 +1307,13 @@ MainWindow::ResizeEdge MainWindow::edgeAt(QPoint p) const
const bool onR = p.x() >= r.width() - m;
const bool onT = p.y() <= m;
const bool onB = p.y() >= r.height() - m;
if (m_settings.minimalWidth) {
// Width is locked to its natural minimum: offer vertical-only resize,
// never the horizontal (or diagonal) edges/corners.
if (onT) return ResizeEdge::Top;
if (onB) return ResizeEdge::Bottom;
return ResizeEdge::None;
}
if (onT && onL) return ResizeEdge::TopLeft;
if (onT && onR) return ResizeEdge::TopRight;
if (onB && onL) return ResizeEdge::BottomLeft;
Expand Down Expand Up @@ -1998,6 +2017,8 @@ void MainWindow::applySettings(const AppSettings& s)
m_persist.setValue("window/startMin", s.startMinimized);
m_persist.setValue("window/xMinimizesApp", s.xMinimizesApp);
m_persist.setValue("window/launchOnStartup", s.launchOnStartup);
m_persist.setValue("window/minimalWidth", s.minimalWidth);
m_persist.setValue("window/minimalWidthPx", s.minimalWidthPx);
// Reconcile unconditionally: the registry/autostart entry must match the
// setting even when it is unchanged here but was lost externally, never
// written by an older build, or points at a stale executable path.
Expand Down
23 changes: 23 additions & 0 deletions settingsdialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -650,6 +650,9 @@ void SettingsDialog::retranslateUi()
m_chkStartMinimized->setText(tr("Start minimized to tray"));
m_chkXMinimizesApp->setText(tr("Top X minimizes app"));
m_chkLaunchOnStartup->setText(tr("Launch on system startup (Windows)"));
m_chkMinimalWidth->setText(tr("Minimal width"));
m_lblMinimalWidthPx->setText(tr("Width limit (px):"));
m_spinMinimalWidthPx->setSpecialValueText(tr("Auto (fit content)"));
m_chkAudio->setText(tr("Audio feedback on click"));
m_chkClickIndicator->setText(tr("Show click indicator ring (Windows)"));
m_chkShowLabels->setText(tr("Show button labels"));
Expand Down Expand Up @@ -1045,6 +1048,18 @@ void SettingsDialog::buildUi()
m_chkStartMinimized = new QCheckBox(tr("Start minimized to tray"));
m_chkXMinimizesApp = new QCheckBox(tr("Top X minimizes app"));
m_chkLaunchOnStartup= new QCheckBox(tr("Launch on system startup (Windows)"));
m_chkMinimalWidth = new QCheckBox(tr("Minimal width"));
m_lblMinimalWidthPx = new QLabel(tr("Width limit (px):"));
m_spinMinimalWidthPx = new QSpinBox;
m_spinMinimalWidthPx->setRange(0, 2000);
m_spinMinimalWidthPx->setSingleStep(10);
m_spinMinimalWidthPx->setSpecialValueText(tr("Auto (fit content)"));
m_lblMinimalWidthPx->setEnabled(false);
m_spinMinimalWidthPx->setEnabled(false);
connect(m_chkMinimalWidth, &QCheckBox::toggled, this, [this](bool on){
m_lblMinimalWidthPx->setEnabled(on);
m_spinMinimalWidthPx->setEnabled(on);
});

behForm->addRow(m_lblEdgeLock, m_cmbEdgeLock);
behForm->addRow(m_chkEdgeHide);
Expand All @@ -1054,6 +1069,8 @@ void SettingsDialog::buildUi()
// (load/save/retranslate refs) but are hidden from the UI — the top X always
// quits. To restore the option, add it back to the layout here.
behForm->addRow(m_chkLaunchOnStartup);
behForm->addRow(m_chkMinimalWidth);
behForm->addRow(m_lblMinimalWidthPx, m_spinMinimalWidthPx);
winCol->addWidget(m_grpWinBehavior);

// ── Section: Button Controls ──────────────────────────────
Expand Down Expand Up @@ -1632,6 +1649,10 @@ void SettingsDialog::loadFrom(const AppSettings& s)
// Top X minimizes app is intentionally left read-only and unchecked (see
// buildUi); don't drive it from settings. Restore this line to re-enable.
m_chkLaunchOnStartup->setChecked(s.launchOnStartup);
m_chkMinimalWidth->setChecked(s.minimalWidth);
m_spinMinimalWidthPx->setValue(s.minimalWidthPx);
m_lblMinimalWidthPx->setEnabled(s.minimalWidth);
m_spinMinimalWidthPx->setEnabled(s.minimalWidth);
m_chkAudio->setChecked(s.audioFeedback);
m_chkClickIndicator->setChecked(s.showClickIndicator);
m_chkShowLabels->setChecked(!s.iconsOnly); // checked = labels shown
Expand Down Expand Up @@ -1695,6 +1716,8 @@ AppSettings SettingsDialog::readUi() const
s.startMinimized = m_chkStartMinimized->isChecked();
s.xMinimizesApp = m_chkXMinimizesApp->isChecked();
s.launchOnStartup = m_chkLaunchOnStartup->isChecked();
s.minimalWidth = m_chkMinimalWidth->isChecked();
s.minimalWidthPx = m_spinMinimalWidthPx->value();
s.audioFeedback = m_chkAudio->isChecked();
s.showClickIndicator = m_chkClickIndicator->isChecked();
s.iconsOnly = !m_chkShowLabels->isChecked(); // unchecked = icons only
Expand Down
10 changes: 10 additions & 0 deletions settingsdialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,13 @@ struct AppSettings {
bool startMinimized = false;
bool xMinimizesApp = false;
bool launchOnStartup = false;
// Locks the window width and disables horizontal edge/corner resizing.
// minimalWidthPx == 0 means "auto": fit the natural content width
// (sizeHint) with no clipping. A positive value forces that exact width
// instead — the user's explicit choice, so unlike the auto case it is not
// guaranteed clip-free (only floored to keep the title bar controls usable).
bool minimalWidth = false;
int minimalWidthPx = 0;

// Audio feedback
bool audioFeedback = false;
Expand Down Expand Up @@ -243,6 +250,9 @@ class SettingsDialog : public QDialog
QCheckBox* m_chkStartMinimized;
QCheckBox* m_chkXMinimizesApp;
QCheckBox* m_chkLaunchOnStartup;
QCheckBox* m_chkMinimalWidth;
QLabel* m_lblMinimalWidthPx = nullptr;
QSpinBox* m_spinMinimalWidthPx = nullptr;
QCheckBox* m_chkAudio;
QCheckBox* m_chkClickIndicator;
// "Show button labels" — the inverse of AppSettings::iconsOnly (checked =
Expand Down
3 changes: 3 additions & 0 deletions translations/trackclick_ar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,9 @@
<message><source>Top X minimizes app</source><translation>زر X العلوي يصغّر التطبيق</translation></message>
<message><source>Close application</source><translation>إغلاق التطبيق</translation></message>
<message><source>Launch on system startup (Windows)</source><translation>التشغيل عند بدء تشغيل النظام (Windows)</translation></message>
<message><source>Minimal width</source><translation>الحد الأدنى للعرض</translation></message>
<message><source>Width limit (px):</source><translation>حد العرض (بكسل):</translation></message>
<message><source>Auto (fit content)</source><translation>تلقائي (يلائم المحتوى)</translation></message>
<message><source>Audio feedback on click</source><translation>ردود فعل صوتية عند النقر</translation></message>
<message><source>Icons only (hide button labels)</source><translation>أيقونات فقط (إخفاء تسميات الأزرار)</translation></message>
<message><source>Large buttons</source><translation>أزرار كبيرة</translation></message>
Expand Down
3 changes: 3 additions & 0 deletions translations/trackclick_bn.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,9 @@
<message><source>Top X minimizes app</source><translation>উপরের X অ্যাপ ছোট করে</translation></message>
<message><source>Close application</source><translation>অ্যাপ্লিকেশন বন্ধ করুন</translation></message>
<message><source>Launch on system startup (Windows)</source><translation>সিস্টেম স্টার্টআপে চালু করুন (Windows)</translation></message>
<message><source>Minimal width</source><translation>সর্বনিম্ন প্রস্থ</translation></message>
<message><source>Width limit (px):</source><translation>প্রস্থের সীমা (px):</translation></message>
<message><source>Auto (fit content)</source><translation>স্বয়ংক্রিয় (বিষয়বস্তু অনুযায়ী)</translation></message>
<message><source>Audio feedback on click</source><translation>ক্লিকে অডিও ফিডব্যাক</translation></message>
<message><source>Icons only (hide button labels)</source><translation>শুধু আইকন (বোতামের লেবেল লুকান)</translation></message>
<message><source>Large buttons</source><translation>বড় বোতাম</translation></message>
Expand Down
3 changes: 3 additions & 0 deletions translations/trackclick_cs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,9 @@
<message><source>Scroll repeat:</source><translation>Opakování rolování:</translation></message>
<message><source>Repeat click:</source><translation>Opakovat kliknutí:</translation></message>
<message><source>Launch on system startup (Windows)</source><translation>Spustit při startu systému (Windows)</translation></message>
<message><source>Minimal width</source><translation>Minimální šířka</translation></message>
<message><source>Width limit (px):</source><translation>Omezení šířky (px):</translation></message>
<message><source>Auto (fit content)</source><translation>Automaticky (podle obsahu)</translation></message>
<message><source>Open On-Screen Keyboard</source><translation>Otevřít klávesnici na obrazovce</translation></message>
<message><source>No on-screen keyboard was found.
Please install 'onboard' or 'florence'.</source><translation>Klávesnice na obrazovce nebyla nalezena.
Expand Down
3 changes: 3 additions & 0 deletions translations/trackclick_es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,9 @@
<message><source>Scroll repeat:</source><translation>Repetición de desplazamiento:</translation></message>
<message><source>Repeat click:</source><translation>Repetir clic:</translation></message>
<message><source>Launch on system startup (Windows)</source><translation>Iniciar con el sistema (Windows)</translation></message>
<message><source>Minimal width</source><translation>Ancho mínimo</translation></message>
<message><source>Width limit (px):</source><translation>Límite de ancho (px):</translation></message>
<message><source>Auto (fit content)</source><translation>Automático (ajustar al contenido)</translation></message>
<message><source>Open On-Screen Keyboard</source><translation>Abrir teclado en pantalla</translation></message>
<message><source>No on-screen keyboard was found.
Please install 'onboard' or 'florence'.</source><translation>No se encontró ningún teclado en pantalla.
Expand Down
3 changes: 3 additions & 0 deletions translations/trackclick_fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,9 @@
<message><source>Scroll repeat:</source><translation>Répétition du défilement :</translation></message>
<message><source>Repeat click:</source><translation>Répétition du clic :</translation></message>
<message><source>Launch on system startup (Windows)</source><translation>Lancer au démarrage du système (Windows)</translation></message>
<message><source>Minimal width</source><translation>Largeur minimale</translation></message>
<message><source>Width limit (px):</source><translation>Largeur limite (px) :</translation></message>
<message><source>Auto (fit content)</source><translation>Auto (ajusté au contenu)</translation></message>
<message><source>Open On-Screen Keyboard</source><translation>Ouvrir le clavier virtuel</translation></message>
<message><source>No on-screen keyboard was found.
Please install 'onboard' or 'florence'.</source><translation>Aucun clavier virtuel trouvé.
Expand Down
3 changes: 3 additions & 0 deletions translations/trackclick_hi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,9 @@
<message><source>Top X minimizes app</source><translation>ऊपरी X एप्प को छोटा करता है</translation></message>
<message><source>Close application</source><translation>एप्लिकेशन बंद करें</translation></message>
<message><source>Launch on system startup (Windows)</source><translation>सिस्टम स्टार्टअप पर लॉन्च करें (Windows)</translation></message>
<message><source>Minimal width</source><translation>न्यूनतम चौड़ाई</translation></message>
<message><source>Width limit (px):</source><translation>चौड़ाई सीमा (px):</translation></message>
<message><source>Auto (fit content)</source><translation>स्वतः (सामग्री के अनुरूप)</translation></message>
<message><source>Audio feedback on click</source><translation>क्लिक पर ऑडियो फीडबैक</translation></message>
<message><source>Icons only (hide button labels)</source><translation>केवल आइकन (बटन लेबल छुपाएं)</translation></message>
<message><source>Large buttons</source><translation>बड़े बटन</translation></message>
Expand Down
3 changes: 3 additions & 0 deletions translations/trackclick_ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,9 @@
<message><source>Scroll repeat:</source><translation>スクロール繰り返し:</translation></message>
<message><source>Repeat click:</source><translation>クリック繰り返し:</translation></message>
<message><source>Launch on system startup (Windows)</source><translation>システム起動時に起動 (Windows)</translation></message>
<message><source>Minimal width</source><translation>最小幅</translation></message>
<message><source>Width limit (px):</source><translation>幅の上限 (px):</translation></message>
<message><source>Auto (fit content)</source><translation>自動(内容に合わせる)</translation></message>
<message><source>Open On-Screen Keyboard</source><translation>スクリーンキーボードを開く</translation></message>
<message><source>No on-screen keyboard was found.
Please install 'onboard' or 'florence'.</source><translation>スクリーンキーボードが見つかりませんでした。
Expand Down
3 changes: 3 additions & 0 deletions translations/trackclick_ko.ts
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,9 @@
<message><source>Scroll repeat:</source><translation>스크롤 반복:</translation></message>
<message><source>Repeat click:</source><translation>클릭 반복:</translation></message>
<message><source>Launch on system startup (Windows)</source><translation>시스템 시작 시 실행 (Windows)</translation></message>
<message><source>Minimal width</source><translation>최소 너비</translation></message>
<message><source>Width limit (px):</source><translation>너비 제한 (px):</translation></message>
<message><source>Auto (fit content)</source><translation>자동 (내용에 맞춤)</translation></message>
<message><source>Open On-Screen Keyboard</source><translation>화상 키보드 열기</translation></message>
<message><source>No on-screen keyboard was found.
Please install 'onboard' or 'florence'.</source><translation>화상 키보드를 찾을 수 없습니다.
Expand Down
3 changes: 3 additions & 0 deletions translations/trackclick_pt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,9 @@
<message><source>Top X minimizes app</source><translation>X superior minimiza o app</translation></message>
<message><source>Close application</source><translation>Fechar aplicação</translation></message>
<message><source>Launch on system startup (Windows)</source><translation>Iniciar com o sistema (Windows)</translation></message>
<message><source>Minimal width</source><translation>Largura mínima</translation></message>
<message><source>Width limit (px):</source><translation>Limite de largura (px):</translation></message>
<message><source>Auto (fit content)</source><translation>Automático (ajustar ao conteúdo)</translation></message>
<message><source>Audio feedback on click</source><translation>Feedback de áudio ao clicar</translation></message>
<message><source>Icons only (hide button labels)</source><translation>Apenas ícones (ocultar rótulos)</translation></message>
<message><source>Large buttons</source><translation>Botões grandes</translation></message>
Expand Down
3 changes: 3 additions & 0 deletions translations/trackclick_ru.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,9 @@
<message><source>Top X minimizes app</source><translation>Крестик сворачивает приложение</translation></message>
<message><source>Close application</source><translation>Закрыть приложение</translation></message>
<message><source>Launch on system startup (Windows)</source><translation>Запускать при старте системы (Windows)</translation></message>
<message><source>Minimal width</source><translation>Минимальная ширина</translation></message>
<message><source>Width limit (px):</source><translation>Ограничение ширины (px):</translation></message>
<message><source>Auto (fit content)</source><translation>Авто (по содержимому)</translation></message>
<message><source>Audio feedback on click</source><translation>Звуковой отклик при нажатии</translation></message>
<message><source>Icons only (hide button labels)</source><translation>Только иконки (скрыть надписи кнопок)</translation></message>
<message><source>Large buttons</source><translation>Крупные кнопки</translation></message>
Expand Down
3 changes: 3 additions & 0 deletions translations/trackclick_ur.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,9 @@
<message><source>Top X minimizes app</source><translation>اوپر X ایپ کو چھوٹا کرتا ہے</translation></message>
<message><source>Close application</source><translation>ایپلیکیشن بند کریں</translation></message>
<message><source>Launch on system startup (Windows)</source><translation>سسٹم اسٹارٹ پر لانچ کریں (Windows)</translation></message>
<message><source>Minimal width</source><translation>کم از کم چوڑائی</translation></message>
<message><source>Width limit (px):</source><translation>چوڑائی کی حد (px):</translation></message>
<message><source>Auto (fit content)</source><translation>خودکار (مواد کے مطابق)</translation></message>
<message><source>Audio feedback on click</source><translation>کلک پر آڈیو فیڈبیک</translation></message>
<message><source>Icons only (hide button labels)</source><translation>صرف آئیکن (بٹن لیبل چھپائیں)</translation></message>
<message><source>Large buttons</source><translation>بڑے بٹن</translation></message>
Expand Down
Loading
Loading