aboutsummaryrefslogtreecommitdiffstats
path: root/src/ui/widgets
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/widgets')
-rw-r--r--src/ui/widgets/FilePage.cpp1
-rw-r--r--src/ui/widgets/FileTreeView.cpp53
-rw-r--r--src/ui/widgets/InfoBoardWidget.cpp1
-rw-r--r--src/ui/widgets/TextEdit.cpp57
-rw-r--r--src/ui/widgets/TextEdit.h22
-rw-r--r--src/ui/widgets/TextEditTabWidget.cpp32
-rw-r--r--src/ui/widgets/TextEditTabWidget.h14
7 files changed, 151 insertions, 29 deletions
diff --git a/src/ui/widgets/FilePage.cpp b/src/ui/widgets/FilePage.cpp
index 605ae1d2..95dbfac9 100644
--- a/src/ui/widgets/FilePage.cpp
+++ b/src/ui/widgets/FilePage.cpp
@@ -28,7 +28,6 @@
#include "ui/widgets/FilePage.h"
-#include "core/GpgModel.h"
#include "core/function/GlobalSettingStation.h"
#include "ui/UISignalStation.h"
#include "ui/main_window/MainWindow.h"
diff --git a/src/ui/widgets/FileTreeView.cpp b/src/ui/widgets/FileTreeView.cpp
index 86411d79..8ebd7274 100644
--- a/src/ui/widgets/FileTreeView.cpp
+++ b/src/ui/widgets/FileTreeView.cpp
@@ -36,17 +36,15 @@
namespace GpgFrontend::UI {
FileTreeView::FileTreeView(QWidget* parent, const QString& target_path)
- : QTreeView(parent) {
- dir_model_ = new QFileSystemModel(this);
- dir_model_->setRootPath(target_path.isEmpty() ? QDir::currentPath()
- : target_path);
+ : QTreeView(parent), dir_model_(new QFileSystemModel(this)) {
dir_model_->setFilter(QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot);
+ dir_model_->setRootPath(QDir::homePath());
+ current_path_ = dir_model_->rootPath();
this->setModel(dir_model_);
this->setColumnWidth(0, 320);
this->sortByColumn(0, Qt::AscendingOrder);
this->setSortingEnabled(true);
- current_path_ = dir_model_->rootPath();
slot_create_popup_menu();
this->setContextMenuPolicy(Qt::CustomContextMenu);
@@ -60,6 +58,43 @@ FileTreeView::FileTreeView(QWidget* parent, const QString& target_path)
&FileTreeView::slot_adjust_column_widths);
connect(dir_model_, &QFileSystemModel::dataChanged, this,
&FileTreeView::slot_adjust_column_widths);
+
+ LOG_D() << "try to open target path:" << target_path;
+
+ QFileInfo info(target_path);
+ QString effective_path;
+
+ if (info.exists()) {
+ effective_path =
+ info.isFile() ? info.absolutePath() : info.absoluteFilePath();
+ } else {
+ effective_path = QDir::currentPath();
+ }
+
+ LOG_D() << "effective path:" << effective_path;
+
+ dir_model_->setRootPath(effective_path);
+ current_path_ = dir_model_->rootPath();
+ QModelIndex root_index = dir_model_->index(current_path_);
+
+ if (root_index.isValid()) {
+ QPointer<FileTreeView> self(this);
+ this->setRootIndex(root_index);
+ QTimer::singleShot(200, [=]() {
+ if (self != nullptr && info.isFile()) {
+ self->setCurrentIndex(dir_model_->index(info.absoluteFilePath()));
+ self->expand(currentIndex().parent());
+ self->scrollTo(currentIndex(), QAbstractItemView::PositionAtCenter);
+ self->selectionModel()->select(
+ currentIndex(),
+ QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
+ }
+ });
+ } else {
+ LOG_W() << "invalid path, fallback to current dir.";
+ current_path_ = QDir::currentPath();
+ this->setRootIndex(dir_model_->index(current_path_));
+ }
}
void FileTreeView::selectionChanged(const QItemSelection& selected,
@@ -424,10 +459,10 @@ void FileTreeView::slot_compress_files() {}
void FileTreeView::paintEvent(QPaintEvent* event) {
QTreeView::paintEvent(event);
- if (!initial_resize_done_) {
- slot_adjust_column_widths();
- initial_resize_done_ = true;
- }
+ // if (!initial_resize_done_) {
+ // slot_adjust_column_widths();
+ // initial_resize_done_ = true;
+ // }
}
void FileTreeView::mousePressEvent(QMouseEvent* event) {
diff --git a/src/ui/widgets/InfoBoardWidget.cpp b/src/ui/widgets/InfoBoardWidget.cpp
index bb5b00bc..8bc2b1b1 100644
--- a/src/ui/widgets/InfoBoardWidget.cpp
+++ b/src/ui/widgets/InfoBoardWidget.cpp
@@ -28,7 +28,6 @@
#include "ui/widgets/InfoBoardWidget.h"
-#include "core/GpgModel.h"
#include "core/model/SettingsObject.h"
#include "ui/UISignalStation.h"
#include "ui/struct/settings_object/AppearanceSO.h"
diff --git a/src/ui/widgets/TextEdit.cpp b/src/ui/widgets/TextEdit.cpp
index 842bb9d6..5cb5d269 100644
--- a/src/ui/widgets/TextEdit.cpp
+++ b/src/ui/widgets/TextEdit.cpp
@@ -31,7 +31,7 @@
#include <QtPrintSupport>
#include <cstddef>
-#include "core/GpgModel.h"
+#include "core/function/CacheManager.h"
#include "ui/dialog/QuitDialog.h"
#include "ui/widgets/HelpPage.h"
#include "ui/widgets/TextEditTabWidget.h"
@@ -40,9 +40,6 @@ namespace GpgFrontend::UI {
TextEdit::TextEdit(QWidget* parent) : QWidget(parent) {
tab_widget_ = new TextEditTabWidget(this);
- tab_widget_->setMovable(true);
- tab_widget_->setTabsClosable(true);
- tab_widget_->setDocumentMode(true);
auto* layout = new QVBoxLayout;
layout->addWidget(tab_widget_);
@@ -52,8 +49,12 @@ TextEdit::TextEdit(QWidget* parent) : QWidget(parent) {
connect(tab_widget_, &QTabWidget::tabCloseRequested, this,
&TextEdit::slot_remove_tab);
- SlotNewTab();
+
setAcceptDrops(false);
+
+ SlotNewDefaultFileBrowserTab();
+
+ slot_restore_unsaved_tabs();
}
void TextEdit::SlotNewTab() { tab_widget_->SlotNewTab(); }
@@ -68,12 +69,22 @@ void TextEdit::SlotNewHelpTab(const QString& title, const QString& path) const {
tab_widget_->setCurrentIndex(tab_widget_->count() - 1);
}
+void TextEdit::SlotNewDefaultFileBrowserTab() {
+ tab_widget_->SlotOpenDefaultPath();
+}
+
void TextEdit::SlotNewFileBrowserTab() {
- auto const target_directory = QFileDialog::getExistingDirectory(
- this, tr("Open Directory"), QDir::home().path(),
- QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
- if (target_directory.isEmpty()) return;
- tab_widget_->SlotOpenDirectory(target_directory);
+ auto const target_path =
+ QFileDialog::getOpenFileUrl(this, tr("Open File"), QDir::home().path());
+ if (target_path.isEmpty()) return;
+ tab_widget_->SlotOpenPath(target_path.path());
+}
+
+void TextEdit::SlotNewFileBrowserTabWithDirectory() {
+ auto const target_path = QFileDialog::getExistingDirectory(
+ this, tr("Open File"), QDir::home().path());
+ if (target_path.isEmpty()) return;
+ tab_widget_->SlotOpenPath(target_path);
}
void TextEdit::SlotOpenFile(const QString& path) {
@@ -628,4 +639,30 @@ auto TextEdit::CurEMailPage() const -> EMailEditorPage* {
void TextEdit::SlotNewEMailTab() { tab_widget_->SlotNewEMailTab(); }
+void TextEdit::slot_restore_unsaved_tabs() {
+ auto json_data =
+ CacheManager::GetInstance().LoadDurableCache("editor_unsaved_pages");
+
+ if (json_data.isEmpty() || !json_data.isArray()) {
+ return;
+ }
+
+ auto unsaved_page_array = json_data.array();
+ for (const auto& value_ref : unsaved_page_array) {
+ if (!value_ref.isObject()) continue;
+ auto unsaved_page_json = value_ref.toObject();
+
+ if (!unsaved_page_json.contains("title") ||
+ !unsaved_page_json.contains("content")) {
+ continue;
+ }
+
+ auto title = unsaved_page_json["title"].toString();
+ auto content = unsaved_page_json["content"].toString();
+
+ LOG_D() << "restoring tab, title: " << title;
+
+ SlotNewTabWithContent(title, content);
+ }
+}
} // namespace GpgFrontend::UI
diff --git a/src/ui/widgets/TextEdit.h b/src/ui/widgets/TextEdit.h
index d37e01ce..f994cb1a 100644
--- a/src/ui/widgets/TextEdit.h
+++ b/src/ui/widgets/TextEdit.h
@@ -193,11 +193,23 @@ class TextEdit : public QWidget {
void SlotNewHelpTab(const QString& title, const QString& path) const;
/**
+ * @brief
+ *
+ */
+ void SlotNewDefaultFileBrowserTab();
+
+ /**
* New File Tab to do file operation
*/
void SlotNewFileBrowserTab();
/**
+ * @brief
+ *
+ */
+ void SlotNewFileBrowserTabWithDirectory();
+
+ /**
* @details put a * in front of current tabs title, if current textedit is
* modified
*/
@@ -312,7 +324,15 @@ class TextEdit : public QWidget {
*/
void slot_remove_tab(int index);
+ /**
+ * @brief
+ *
+ */
+ void slot_restore_unsaved_tabs();
+
private:
+ TextEditTabWidget* tab_widget_; ///< widget containing the tabs of the editor
+
/**
* @details return just a filename stripped of a whole path
*
@@ -327,8 +347,6 @@ class TextEdit : public QWidget {
* @param askToSave
*/
auto maybe_save_current_tab(bool askToSave) -> bool;
-
- TextEditTabWidget* tab_widget_; ///< widget containing the tabs of the editor
};
} // namespace GpgFrontend::UI
diff --git a/src/ui/widgets/TextEditTabWidget.cpp b/src/ui/widgets/TextEditTabWidget.cpp
index 11400f1f..f13d8392 100644
--- a/src/ui/widgets/TextEditTabWidget.cpp
+++ b/src/ui/widgets/TextEditTabWidget.cpp
@@ -39,6 +39,12 @@ namespace GpgFrontend::UI {
TextEditTabWidget::TextEditTabWidget(QWidget* parent) : QTabWidget(parent) {
setAcceptDrops(true);
+ setMovable(true);
+ setTabsClosable(true);
+ setDocumentMode(true);
+ setUsesScrollButtons(true);
+ setElideMode(Qt::ElideRight);
+ tabBar()->setExpanding(false);
}
void TextEditTabWidget::dragEnterEvent(QDragEnterEvent* event) {
@@ -97,7 +103,7 @@ void TextEditTabWidget::dropEvent(QDropEvent* event) {
.arg(file_info.fileName()));
continue;
}
- SlotOpenDirectory(file_info.absoluteFilePath());
+ SlotOpenPath(file_info.absoluteFilePath());
}
}
@@ -160,6 +166,8 @@ void TextEditTabWidget::SlotOpenEMLFile(const QString& path) {
}
void TextEditTabWidget::SlotShowModified() {
+ if (CurTextPage() == nullptr) return;
+
// get current tab
int index = this->currentIndex();
QString title = this->tabText(index).trimmed();
@@ -253,6 +261,7 @@ void TextEditTabWidget::SlotNewTab() {
auto* page = new PlainTextEditorPage();
auto index = this->addTab(page, header);
this->setTabIcon(index, QIcon(":/icons/file.png"));
+ this->setTabToolTip(index, header);
this->setCurrentIndex(this->count() - 1);
page->GetTextPage()->setFocus();
connect(page->GetTextPage()->document(), &QTextDocument::modificationChanged,
@@ -268,6 +277,7 @@ void TextEditTabWidget::SlotNewEMailTab() {
auto index = this->addTab(page, header);
this->setTabIcon(index, QIcon(":/icons/email.png"));
this->setCurrentIndex(this->count() - 1);
+ this->setTabToolTip(index, header);
page->GetTextPage()->setFocus();
connect(page->GetTextPage(), &QPlainTextEdit::textChanged, this,
@@ -291,7 +301,6 @@ void TextEditTabWidget::SlotNewTabWithContent(QString title,
auto* page = new PlainTextEditorPage();
auto index = this->addTab(page, header);
this->setTabIcon(index, QIcon(":/icons/file.png"));
- this->setCurrentIndex(this->count() - 1);
page->GetTextPage()->setFocus();
connect(page->GetTextPage()->document(), &QTextDocument::modificationChanged,
this, &TextEditTabWidget::SlotShowModified);
@@ -302,10 +311,21 @@ void TextEditTabWidget::SlotNewTabWithContent(QString title,
page->GetTextPage()->document()->setPlainText(content);
}
-void TextEditTabWidget::SlotOpenDirectory(const QString& target_directory) {
- auto* page = new FilePage(qobject_cast<QWidget*>(parent()), target_directory);
+void TextEditTabWidget::SlotOpenDefaultPath() {
+ auto* page =
+ new FilePage(qobject_cast<QWidget*>(parent()), QDir::currentPath());
+ auto index = this->addTab(page, QString());
+ this->setTabIcon(index, QIcon(":/icons/workspace.png"));
+ this->setTabText(index, tr("Default Workspace"));
+ this->setCurrentIndex(this->count() - 1);
+ page->SlotGoPath();
+}
+
+void TextEditTabWidget::SlotOpenPath(const QString& target_path) {
+ auto* page = new FilePage(qobject_cast<QWidget*>(parent()), target_path);
auto index = this->addTab(page, QString());
- this->setTabIcon(index, QIcon(":/icons/file-browser.png"));
+ this->setTabIcon(index, QIcon(":/icons/workspace.png"));
+ this->setTabToolTip(index, target_path);
this->setCurrentIndex(this->count() - 1);
connect(page, &FilePage::SignalPathChanged, this,
&TextEditTabWidget::slot_file_page_path_changed);
@@ -322,7 +342,9 @@ void TextEditTabWidget::slot_file_page_path_changed(const QString& path) {
} else {
m_path = t_path;
}
+
this->setTabText(index, m_path);
+ this->setTabToolTip(index, t_path);
emit UISignalStation::GetInstance() -> SignalMainWindowUpdateBasicOperaMenu(
0);
diff --git a/src/ui/widgets/TextEditTabWidget.h b/src/ui/widgets/TextEditTabWidget.h
index 9df2d6ab..ed6a0b50 100644
--- a/src/ui/widgets/TextEditTabWidget.h
+++ b/src/ui/widgets/TextEditTabWidget.h
@@ -90,6 +90,12 @@ class TextEditTabWidget : public QTabWidget {
void SlotNewTabWithContent(QString title, const QString& content);
/**
+ * @brief
+ *
+ */
+ void SlotOpenDefaultPath();
+
+ /**
* @details Adds a new tab with opening file by path
*/
void SlotOpenFile(const QString& path);
@@ -105,7 +111,7 @@ class TextEditTabWidget : public QTabWidget {
* @brief
*
*/
- void SlotOpenDirectory(const QString& target_directory);
+ void SlotOpenPath(const QString& target_path);
/**
* @details put a * in front of current tabs title, if current textedit is
@@ -146,6 +152,12 @@ class TextEditTabWidget : public QTabWidget {
int count_page_ = 0;
int text_page_data_modified_count_ = 0;
+ /**
+ * @brief
+ *
+ * @param full_file_name
+ * @return QString
+ */
static auto stripped_name(const QString& full_file_name) -> QString;
};