diff options
Diffstat (limited to 'src/ui/widgets')
-rw-r--r-- | src/ui/widgets/FilePage.cpp | 1 | ||||
-rw-r--r-- | src/ui/widgets/FileTreeView.cpp | 53 | ||||
-rw-r--r-- | src/ui/widgets/InfoBoardWidget.cpp | 1 | ||||
-rw-r--r-- | src/ui/widgets/TextEdit.cpp | 57 | ||||
-rw-r--r-- | src/ui/widgets/TextEdit.h | 22 | ||||
-rw-r--r-- | src/ui/widgets/TextEditTabWidget.cpp | 32 | ||||
-rw-r--r-- | src/ui/widgets/TextEditTabWidget.h | 14 |
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; }; |