mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-05 13:59:52 +08:00
support locating current note
Support locating the notebook and directory of current note. Signed-off-by: Le Tan <tamlokveer@gmail.com>
This commit is contained in:
parent
b14d15e266
commit
1aa264adc8
16
src/resources/icons/locate_note.svg
Normal file
16
src/resources/icons/locate_note.svg
Normal file
@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
|
||||
<g id="Icon">
|
||||
<g>
|
||||
<path d="M256,176c-44.004,0-80.001,36-80.001,80c0,44.004,35.997,80,80.001,80c44.005,0,79.999-35.996,79.999-80
|
||||
C335.999,212,300.005,176,256,176z M446.938,234.667c-9.605-88.531-81.074-160-169.605-169.599V32h-42.666v33.067
|
||||
c-88.531,9.599-160,81.068-169.604,169.599H32v42.667h33.062c9.604,88.531,81.072,160,169.604,169.604V480h42.666v-33.062
|
||||
c88.531-9.604,160-81.073,169.605-169.604H480v-42.667H446.938z M256,405.333c-82.137,0-149.334-67.198-149.334-149.333
|
||||
c0-82.136,67.197-149.333,149.334-149.333c82.135,0,149.332,67.198,149.332,149.333C405.332,338.135,338.135,405.333,256,405.333z
|
||||
"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.1 KiB |
@ -51,10 +51,12 @@ public:
|
||||
inline bool isOpened() const;
|
||||
inline VDirectory *getParentDirectory();
|
||||
inline const VDirectory *getParentDirectory() const;
|
||||
inline VNotebook *getNotebook();
|
||||
inline const VNotebook *getNotebook() const;
|
||||
inline const QVector<VFile *> &getFiles() const;
|
||||
inline QString retrivePath() const;
|
||||
inline QString retriveRelativePath() const;
|
||||
inline QString getNotebook() const;
|
||||
inline QString getNotebookName() const;
|
||||
inline bool isExpanded() const;
|
||||
void setExpanded(bool p_expanded);
|
||||
|
||||
@ -114,11 +116,21 @@ inline const QVector<VFile *> &VDirectory::getFiles() const
|
||||
return m_files;
|
||||
}
|
||||
|
||||
inline QString VDirectory::getNotebook() const
|
||||
inline QString VDirectory::getNotebookName() const
|
||||
{
|
||||
return m_notebook->getName();
|
||||
}
|
||||
|
||||
inline VNotebook *VDirectory::getNotebook()
|
||||
{
|
||||
return m_notebook;
|
||||
}
|
||||
|
||||
inline const VNotebook *VDirectory::getNotebook() const
|
||||
{
|
||||
return m_notebook;
|
||||
}
|
||||
|
||||
inline QString VDirectory::retrivePath() const
|
||||
{
|
||||
return retrivePath(this);
|
||||
|
@ -428,7 +428,7 @@ void VDirectoryTree::copySelectedDirectories(bool p_cut)
|
||||
for (int i = 0; i < items.size(); ++i) {
|
||||
VDirectory *dir = getVDirectory(items[i]);
|
||||
QJsonObject dirJson;
|
||||
dirJson["notebook"] = dir->getNotebook();
|
||||
dirJson["notebook"] = dir->getNotebookName();
|
||||
dirJson["path"] = dir->retrivePath();
|
||||
dirs.append(dirJson);
|
||||
|
||||
@ -561,7 +561,7 @@ QTreeWidgetItem *VDirectoryTree::findVDirectory(const VDirectory *p_dir, bool &p
|
||||
p_widget = false;
|
||||
if (!p_dir) {
|
||||
return NULL;
|
||||
} else if (p_dir->getNotebook() != m_notebook->getName()) {
|
||||
} else if (p_dir->getNotebookName() != m_notebook->getName()) {
|
||||
return NULL;
|
||||
} else if (p_dir == m_notebook->getRootDir()) {
|
||||
p_widget = true;
|
||||
@ -591,3 +591,56 @@ QTreeWidgetItem *VDirectoryTree::findVDirectory(const VDirectory *p_dir, bool &p
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool VDirectoryTree::locateDirectory(const VDirectory *p_directory)
|
||||
{
|
||||
if (p_directory) {
|
||||
qDebug() << "locate directory" << p_directory->retrivePath()
|
||||
<< "in" << m_notebook->getName();
|
||||
if (p_directory->getNotebook() != m_notebook) {
|
||||
return false;
|
||||
}
|
||||
QTreeWidgetItem *item = expandToVDirectory(p_directory);
|
||||
if (item) {
|
||||
setCurrentItem(item);
|
||||
}
|
||||
return item;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
QTreeWidgetItem *VDirectoryTree::expandToVDirectory(const VDirectory *p_directory)
|
||||
{
|
||||
if (!p_directory || p_directory->getNotebook() != m_notebook
|
||||
|| p_directory == m_notebook->getRootDir()) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (p_directory->getParentDirectory() == m_notebook->getRootDir()) {
|
||||
// Top-level items.
|
||||
int nrChild = topLevelItemCount();
|
||||
for (int i = 0; i < nrChild; ++i) {
|
||||
QTreeWidgetItem *item = topLevelItem(i);
|
||||
if (getVDirectory(item) == p_directory) {
|
||||
return item;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
QTreeWidgetItem *pItem = expandToVDirectory(p_directory->getParentDirectory());
|
||||
if (!pItem) {
|
||||
return NULL;
|
||||
}
|
||||
int nrChild = pItem->childCount();
|
||||
if (nrChild == 0) {
|
||||
updateDirectoryTreeOne(pItem, 1);
|
||||
}
|
||||
nrChild = pItem->childCount();
|
||||
for (int i = 0; i < nrChild; ++i) {
|
||||
QTreeWidgetItem *item = pItem->child(i);
|
||||
if (getVDirectory(item) == p_directory) {
|
||||
return item;
|
||||
}
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
@ -17,6 +17,8 @@ class VDirectoryTree : public QTreeWidget
|
||||
public:
|
||||
explicit VDirectoryTree(VNote *vnote, QWidget *parent = 0);
|
||||
inline void setEditArea(VEditArea *p_editArea);
|
||||
bool locateDirectory(const VDirectory *p_directory);
|
||||
inline const VNotebook *currentNotebook() const;
|
||||
|
||||
signals:
|
||||
void currentDirectoryChanged(VDirectory *p_directory);
|
||||
@ -59,6 +61,8 @@ private:
|
||||
bool copyDirectory(VDirectory *p_destDir, const QString &p_destName,
|
||||
VDirectory *p_srcDir, bool p_cut);
|
||||
void updateChildren(QTreeWidgetItem *p_item);
|
||||
// Expand/create the directory tree nodes to @p_directory.
|
||||
QTreeWidgetItem *expandToVDirectory(const VDirectory *p_directory);
|
||||
|
||||
VNote *vnote;
|
||||
QPointer<VNotebook> m_notebook;
|
||||
@ -87,4 +91,9 @@ inline void VDirectoryTree::setEditArea(VEditArea *p_editArea)
|
||||
m_editArea = p_editArea;
|
||||
}
|
||||
|
||||
inline const VNotebook *VDirectoryTree::currentNotebook() const
|
||||
{
|
||||
return m_notebook;
|
||||
}
|
||||
|
||||
#endif // VDIRECTORYTREE_H
|
||||
|
@ -6,19 +6,26 @@
|
||||
#include "vconfigmanager.h"
|
||||
#include "utils/vutils.h"
|
||||
#include "vfile.h"
|
||||
#include "vmainwindow.h"
|
||||
|
||||
extern VConfigManager vconfig;
|
||||
|
||||
VEditWindow::VEditWindow(VNote *vnote, QWidget *parent)
|
||||
: QTabWidget(parent), vnote(vnote)
|
||||
{
|
||||
initTabActions();
|
||||
setupCornerWidget();
|
||||
|
||||
setTabsClosable(true);
|
||||
setMovable(true);
|
||||
setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
|
||||
tabBar()->installEventFilter(this);
|
||||
QTabBar *bar = tabBar();
|
||||
bar->installEventFilter(this);
|
||||
bar->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(bar, &QTabBar::customContextMenuRequested,
|
||||
this, &VEditWindow::tabbarContextMenuRequested);
|
||||
|
||||
|
||||
connect(this, &VEditWindow::tabCloseRequested,
|
||||
this, &VEditWindow::handleTabCloseRequest);
|
||||
@ -28,6 +35,15 @@ VEditWindow::VEditWindow(VNote *vnote, QWidget *parent)
|
||||
this, &VEditWindow::contextMenuRequested);
|
||||
}
|
||||
|
||||
void VEditWindow::initTabActions()
|
||||
{
|
||||
locateAct = new QAction(QIcon(":/resources/icons/locate_note.svg"),
|
||||
tr("Locate"), this);
|
||||
locateAct->setStatusTip(tr("Locate the directory of current note"));
|
||||
connect(locateAct, &QAction::triggered,
|
||||
this, &VEditWindow::handleLocateAct);
|
||||
}
|
||||
|
||||
void VEditWindow::setupCornerWidget()
|
||||
{
|
||||
// Right corner button
|
||||
@ -361,6 +377,20 @@ void VEditWindow::contextMenuRequested(QPoint pos)
|
||||
}
|
||||
}
|
||||
|
||||
void VEditWindow::tabbarContextMenuRequested(QPoint p_pos)
|
||||
{
|
||||
QMenu menu(this);
|
||||
|
||||
QTabBar *bar = tabBar();
|
||||
int tab = bar->tabAt(p_pos);
|
||||
if (tab == -1) {
|
||||
return;
|
||||
}
|
||||
locateAct->setData(tab);
|
||||
menu.addAction(locateAct);
|
||||
menu.exec(mapToGlobal(p_pos));
|
||||
}
|
||||
|
||||
void VEditWindow::tabListJump(QAction *action)
|
||||
{
|
||||
if (!action) {
|
||||
@ -563,3 +593,12 @@ VEditTab *VEditWindow::currentEditTab()
|
||||
}
|
||||
return getTab(idx);
|
||||
}
|
||||
|
||||
void VEditWindow::handleLocateAct()
|
||||
{
|
||||
int tab = locateAct->data().toInt();
|
||||
qDebug() << "context menu of tab" << tab;
|
||||
VEditTab *editor = getTab(tab);
|
||||
QPointer<VFile> file = editor->getFile();
|
||||
vnote->getMainWindow()->locateFile(file);
|
||||
}
|
||||
|
@ -66,8 +66,11 @@ private slots:
|
||||
void handleTabStatusChanged();
|
||||
void updateTabListMenu();
|
||||
void updateSplitMenu();
|
||||
void tabbarContextMenuRequested(QPoint p_pos);
|
||||
void handleLocateAct();
|
||||
|
||||
private:
|
||||
void initTabActions();
|
||||
void setupCornerWidget();
|
||||
void removeEditTab(int p_index);
|
||||
int insertEditTab(int p_index, VFile *p_file, QWidget *p_page);
|
||||
@ -79,7 +82,7 @@ private:
|
||||
inline QString generateTooltip(const VFile *p_file) const;
|
||||
inline QString generateTabText(const QString &p_name, bool p_modified) const;
|
||||
bool canRemoveSplit();
|
||||
// If the scroller of the tabBar() is visible.
|
||||
// If the scroller of the tabBar() is visible
|
||||
bool scrollerVisible() const;
|
||||
void setLeftCornerWidgetVisible(bool p_visible);
|
||||
|
||||
@ -93,6 +96,8 @@ private:
|
||||
QAction *splitAct;
|
||||
QAction *removeSplitAct;
|
||||
QActionGroup *tabListAct;
|
||||
// Locate current note in the directory and file list
|
||||
QAction *locateAct;
|
||||
};
|
||||
|
||||
inline VEditTab* VEditWindow::getTab(int tabIndex) const
|
||||
@ -106,7 +111,7 @@ inline QString VEditWindow::generateTooltip(const VFile *p_file) const
|
||||
return "";
|
||||
}
|
||||
// [Notebook]path
|
||||
return QString("[%1] %2").arg(p_file->getNotebook()).arg(p_file->retrivePath());
|
||||
return QString("[%1] %2").arg(p_file->getNotebookName()).arg(p_file->retrivePath());
|
||||
}
|
||||
|
||||
inline QString VEditWindow::generateTabText(const QString &p_name, bool p_modified) const
|
||||
|
12
src/vfile.h
12
src/vfile.h
@ -7,6 +7,8 @@
|
||||
#include "vdirectory.h"
|
||||
#include "vconstants.h"
|
||||
|
||||
class VNotebook;
|
||||
|
||||
class VFile : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
@ -25,7 +27,8 @@ public:
|
||||
inline DocType getDocType() const;
|
||||
inline QString &getContent();
|
||||
inline void setContent(const QString &p_content);
|
||||
inline QString getNotebook() const;
|
||||
inline VNotebook *getNotebook();
|
||||
inline QString getNotebookName() const;
|
||||
inline QString retrivePath() const;
|
||||
inline QString retriveRelativePath() const;
|
||||
inline QString retriveBasePath() const;
|
||||
@ -80,7 +83,12 @@ inline QString &VFile::getContent()
|
||||
return m_content;
|
||||
}
|
||||
|
||||
inline QString VFile::getNotebook() const
|
||||
inline QString VFile::getNotebookName() const
|
||||
{
|
||||
return getDirectory()->getNotebookName();
|
||||
}
|
||||
|
||||
inline VNotebook *VFile::getNotebook()
|
||||
{
|
||||
return getDirectory()->getNotebook();
|
||||
}
|
||||
|
@ -348,7 +348,7 @@ void VFileList::copySelectedFiles(bool p_isCut)
|
||||
for (int i = 0; i < items.size(); ++i) {
|
||||
VFile *file = getVFile(items[i]);
|
||||
QJsonObject fileJson;
|
||||
fileJson["notebook"] = file->getNotebook();
|
||||
fileJson["notebook"] = file->getNotebookName();
|
||||
fileJson["path"] = file->retrivePath();
|
||||
files.append(fileJson);
|
||||
|
||||
@ -455,3 +455,17 @@ void VFileList::keyPressEvent(QKeyEvent *event)
|
||||
}
|
||||
QWidget::keyPressEvent(event);
|
||||
}
|
||||
|
||||
bool VFileList::locateFile(const VFile *p_file)
|
||||
{
|
||||
if (p_file) {
|
||||
if (p_file->getDirectory() != m_directory) {
|
||||
return false;
|
||||
}
|
||||
QListWidgetItem *item = findItem(p_file);
|
||||
if (item) {
|
||||
fileList->setCurrentItem(item);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -27,6 +27,8 @@ public:
|
||||
inline void setEditArea(VEditArea *editArea);
|
||||
void fileInfo(VFile *p_file);
|
||||
void deleteFile(VFile *p_file);
|
||||
bool locateFile(const VFile *p_file);
|
||||
inline const VDirectory *currentDirectory() const;
|
||||
|
||||
signals:
|
||||
void fileClicked(VFile *p_file, OpenFileMode mode = OpenFileMode::Read);
|
||||
@ -89,4 +91,9 @@ inline QPointer<VFile> VFileList::getVFile(QListWidgetItem *p_item)
|
||||
return p_item->data(Qt::UserRole).value<VFile *>();
|
||||
}
|
||||
|
||||
inline const VDirectory *VFileList::currentDirectory() const
|
||||
{
|
||||
return m_directory;
|
||||
}
|
||||
|
||||
#endif // VFILELIST_H
|
||||
|
@ -575,7 +575,7 @@ void VMainWindow::handleCurTabStatusChanged(const VFile *p_file, const VEditTab
|
||||
|
||||
QString title;
|
||||
if (p_file) {
|
||||
title = QString("[%1] %2").arg(p_file->getNotebook()).arg(p_file->retrivePath());
|
||||
title = QString("[%1] %2").arg(p_file->getNotebookName()).arg(p_file->retrivePath());
|
||||
if (p_file->isModified()) {
|
||||
title.append('*');
|
||||
}
|
||||
@ -726,3 +726,25 @@ void VMainWindow::insertImage()
|
||||
Q_ASSERT(m_curTab == editArea->currentEditTab());
|
||||
m_curTab->insertImage();
|
||||
}
|
||||
|
||||
void VMainWindow::locateFile(VFile *p_file) const
|
||||
{
|
||||
if (!p_file) {
|
||||
return;
|
||||
}
|
||||
qDebug() << "locate file" << p_file->retrivePath();
|
||||
VNotebook *notebook = p_file->getNotebook();
|
||||
if (notebookSelector->locateNotebook(notebook)) {
|
||||
while (directoryTree->currentNotebook() != notebook) {
|
||||
QCoreApplication::sendPostedEvents();
|
||||
}
|
||||
VDirectory *dir = p_file->getDirectory();
|
||||
if (directoryTree->locateDirectory(dir)) {
|
||||
while (fileList->currentDirectory() != dir) {
|
||||
QCoreApplication::sendPostedEvents();
|
||||
}
|
||||
fileList->locateFile(p_file);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -35,6 +35,7 @@ class VMainWindow : public QMainWindow
|
||||
public:
|
||||
VMainWindow(QWidget *parent = 0);
|
||||
const QVector<QPair<QString, QString> > &getPalette() const;
|
||||
void locateFile(VFile *p_file) const;
|
||||
|
||||
private slots:
|
||||
void importNoteFromFile();
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include "vnote.h"
|
||||
#include "utils/vutils.h"
|
||||
#include "vconfigmanager.h"
|
||||
#include "vmainwindow.h"
|
||||
|
||||
VConfigManager vconfig;
|
||||
|
||||
@ -14,7 +15,7 @@ QString VNote::preTemplateHtml;
|
||||
QString VNote::postTemplateHtml;
|
||||
|
||||
VNote::VNote(QObject *parent)
|
||||
: QObject(parent)
|
||||
: QObject(parent), m_mainWindow(dynamic_cast<VMainWindow *>(parent))
|
||||
{
|
||||
vconfig.initialize();
|
||||
initTemplate();
|
||||
|
@ -12,6 +12,8 @@
|
||||
#include "vnotebook.h"
|
||||
#include "vconstants.h"
|
||||
|
||||
class VMainWindow;
|
||||
|
||||
class VNote : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
@ -33,6 +35,7 @@ public:
|
||||
inline const QVector<QPair<QString, QString> > &getPalette() const;
|
||||
void initPalette(QPalette palette);
|
||||
QString getColorFromPalette(const QString &p_name) const;
|
||||
inline VMainWindow *getMainWindow() const;
|
||||
|
||||
public slots:
|
||||
void updateTemplate();
|
||||
@ -41,6 +44,7 @@ private:
|
||||
// Maintain all the notebooks. Other holder should use QPointer.
|
||||
QVector<VNotebook *> m_notebooks;
|
||||
QVector<QPair<QString, QString> > m_palette;
|
||||
VMainWindow *m_mainWindow;
|
||||
};
|
||||
|
||||
inline const QVector<QPair<QString, QString> >& VNote::getPalette() const
|
||||
@ -48,4 +52,9 @@ inline const QVector<QPair<QString, QString> >& VNote::getPalette() const
|
||||
return m_palette;
|
||||
}
|
||||
|
||||
inline VMainWindow *VNote::getMainWindow() const
|
||||
{
|
||||
return m_mainWindow;
|
||||
}
|
||||
|
||||
#endif // VNOTE_H
|
||||
|
@ -76,5 +76,6 @@
|
||||
<file>resources/icons/import_note.svg</file>
|
||||
<file>resources/icons/editing.svg</file>
|
||||
<file>resources/icons/reading.svg</file>
|
||||
<file>resources/icons/locate_note.svg</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
@ -343,3 +343,16 @@ int VNotebookSelector::indexOfListItem(const QListWidgetItem *p_item)
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
bool VNotebookSelector::locateNotebook(const VNotebook *p_notebook)
|
||||
{
|
||||
if (p_notebook) {
|
||||
for (int i = 0; i < m_notebooks.size(); ++i) {
|
||||
if (m_notebooks[i] == p_notebook) {
|
||||
setCurrentIndexNotebook(i);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -19,6 +19,8 @@ public:
|
||||
explicit VNotebookSelector(VNote *vnote, QWidget *p_parent = 0);
|
||||
void update();
|
||||
inline void setEditArea(VEditArea *p_editArea);
|
||||
// Select notebook @p_notebook.
|
||||
bool locateNotebook(const VNotebook *p_notebook);
|
||||
|
||||
signals:
|
||||
void curNotebookChanged(VNotebook *p_notebook);
|
||||
|
Loading…
x
Reference in New Issue
Block a user