mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-05 13:59:52 +08:00
TagIndicator/TagExplorer: support Navigation mode
This commit is contained in:
parent
7305706294
commit
927bb54502
@ -3,6 +3,7 @@
|
|||||||
#include <QtWidgets>
|
#include <QtWidgets>
|
||||||
|
|
||||||
#include "vtaglabel.h"
|
#include "vtaglabel.h"
|
||||||
|
#include "utils/vimnavigationforwidget.h"
|
||||||
|
|
||||||
VAllTagsPanel::VAllTagsPanel(QWidget *p_parent)
|
VAllTagsPanel::VAllTagsPanel(QWidget *p_parent)
|
||||||
: QWidget(p_parent)
|
: QWidget(p_parent)
|
||||||
@ -53,3 +54,19 @@ VTagLabel *VAllTagsPanel::addTag(const QString &p_text)
|
|||||||
m_list->setItemWidget(item, label);
|
m_list->setItemWidget(item, label);
|
||||||
return label;
|
return label;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VAllTagsPanel::showEvent(QShowEvent *p_event)
|
||||||
|
{
|
||||||
|
QWidget::showEvent(p_event);
|
||||||
|
|
||||||
|
m_list->setFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
void VAllTagsPanel::keyPressEvent(QKeyEvent *p_event)
|
||||||
|
{
|
||||||
|
if (VimNavigationForWidget::injectKeyPressEventForVim(m_list, p_event)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QWidget::keyPressEvent(p_event);
|
||||||
|
}
|
||||||
|
@ -20,6 +20,11 @@ public:
|
|||||||
signals:
|
signals:
|
||||||
void tagRemoved(const QString &p_text);
|
void tagRemoved(const QString &p_text);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void showEvent(QShowEvent *p_event) Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
|
void keyPressEvent(QKeyEvent *p_event) Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void removeItem(QListWidgetItem *p_item);
|
void removeItem(QListWidgetItem *p_item);
|
||||||
|
|
||||||
|
@ -77,6 +77,7 @@ public:
|
|||||||
void clearSearchedWordHighlight();
|
void clearSearchedWordHighlight();
|
||||||
void moveCurrentTabOneSplit(bool p_right);
|
void moveCurrentTabOneSplit(bool p_right);
|
||||||
void focusNextTab(bool p_right);
|
void focusNextTab(bool p_right);
|
||||||
|
|
||||||
// Return true if the file list is shown.
|
// Return true if the file list is shown.
|
||||||
bool showOpenedFileList();
|
bool showOpenedFileList();
|
||||||
|
|
||||||
|
@ -152,7 +152,13 @@ void VMainWindow::registerCaptainAndNavigationTargets()
|
|||||||
m_captain->registerNavigationTarget(m_dirTree);
|
m_captain->registerNavigationTarget(m_dirTree);
|
||||||
m_captain->registerNavigationTarget(m_fileList);
|
m_captain->registerNavigationTarget(m_fileList);
|
||||||
m_captain->registerNavigationTarget(m_historyList);
|
m_captain->registerNavigationTarget(m_historyList);
|
||||||
|
|
||||||
|
m_tagExplorer->registerNavigationTarget();
|
||||||
|
|
||||||
m_captain->registerNavigationTarget(m_editArea);
|
m_captain->registerNavigationTarget(m_editArea);
|
||||||
|
|
||||||
|
m_tabIndicator->registerNavigationTarget();
|
||||||
|
|
||||||
m_captain->registerNavigationTarget(m_toolBox);
|
m_captain->registerNavigationTarget(m_toolBox);
|
||||||
m_captain->registerNavigationTarget(outline);
|
m_captain->registerNavigationTarget(outline);
|
||||||
m_captain->registerNavigationTarget(m_snippetList);
|
m_captain->registerNavigationTarget(m_snippetList);
|
||||||
@ -3291,3 +3297,13 @@ void VMainWindow::stayOnTop(bool p_enabled)
|
|||||||
show();
|
show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VMainWindow::focusEditArea() const
|
||||||
|
{
|
||||||
|
QWidget *widget = m_editArea->getCurrentTab();
|
||||||
|
if (!widget) {
|
||||||
|
widget = m_editArea;
|
||||||
|
}
|
||||||
|
|
||||||
|
widget->setFocus();
|
||||||
|
}
|
||||||
|
@ -122,6 +122,8 @@ public:
|
|||||||
// Kick off timer to do things after start.
|
// Kick off timer to do things after start.
|
||||||
void kickOffStartUpTimer(const QStringList &p_files);
|
void kickOffStartUpTimer(const QStringList &p_files);
|
||||||
|
|
||||||
|
void focusEditArea() const;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
// Emit when editor related configurations were changed by user.
|
// Emit when editor related configurations were changed by user.
|
||||||
void editorConfigUpdated();
|
void editorConfigUpdated();
|
||||||
|
@ -12,7 +12,6 @@ class QListWidgetItem;
|
|||||||
class QTreeWidget;
|
class QTreeWidget;
|
||||||
class QTreeWidgetItem;
|
class QTreeWidgetItem;
|
||||||
|
|
||||||
|
|
||||||
// Interface class for Navigation Mode in Captain Mode.
|
// Interface class for Navigation Mode in Captain Mode.
|
||||||
class VNavigationMode
|
class VNavigationMode
|
||||||
{
|
{
|
||||||
@ -61,4 +60,34 @@ private:
|
|||||||
QList<QTreeWidgetItem *> getVisibleItems(const QTreeWidget *p_widget) const;
|
QList<QTreeWidgetItem *> getVisibleItems(const QTreeWidget *p_widget) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class VNavigationModeListWidgetWrapper : public QObject, public VNavigationMode
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit VNavigationModeListWidgetWrapper(QListWidget *p_widget, QObject *p_parent = nullptr)
|
||||||
|
: QObject(p_parent),
|
||||||
|
m_widget(p_widget)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// Implementations for VNavigationMode.
|
||||||
|
void showNavigation() Q_DECL_OVERRIDE
|
||||||
|
{
|
||||||
|
VNavigationMode::showNavigation(m_widget);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool handleKeyNavigation(int p_key, bool &p_succeed)
|
||||||
|
{
|
||||||
|
static bool secondKey = false;
|
||||||
|
|
||||||
|
return VNavigationMode::handleKeyNavigation(m_widget,
|
||||||
|
secondKey,
|
||||||
|
p_key,
|
||||||
|
p_succeed);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
QListWidget *m_widget;
|
||||||
|
};
|
||||||
#endif // VNAVIGATIONMODE_H
|
#endif // VNAVIGATIONMODE_H
|
||||||
|
@ -209,11 +209,12 @@ QVector<VNotebook *> &VNote::getNotebooks()
|
|||||||
return m_notebooks;
|
return m_notebooks;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString VNote::getNavigationLabelStyle(const QString &p_str) const
|
QString VNote::getNavigationLabelStyle(const QString &p_str, bool p_small) const
|
||||||
{
|
{
|
||||||
static int lastLen = -1;
|
static int lastLen = -1;
|
||||||
static int pxWidth = 24;
|
static int pxWidth = 24;
|
||||||
const int fontPt = 15;
|
static int pxHeight = 24;
|
||||||
|
const int fontPt = p_small ? 12 : 15;
|
||||||
|
|
||||||
QString fontFamily = getMonospacedFont();
|
QString fontFamily = getMonospacedFont();
|
||||||
|
|
||||||
@ -222,25 +223,36 @@ QString VNote::getNavigationLabelStyle(const QString &p_str) const
|
|||||||
font.setBold(true);
|
font.setBold(true);
|
||||||
QFontMetrics fm(font);
|
QFontMetrics fm(font);
|
||||||
pxWidth = fm.width(p_str);
|
pxWidth = fm.width(p_str);
|
||||||
|
pxHeight = fm.capHeight() + 5;
|
||||||
lastLen = p_str.size();
|
lastLen = p_str.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
QColor bg(g_palette->color("navigation_label_bg"));
|
QColor bg(g_palette->color("navigation_label_bg"));
|
||||||
bg.setAlpha(200);
|
bg.setAlpha(200);
|
||||||
|
|
||||||
return QString("background-color: %1;"
|
QString style = QString("background-color: %1;"
|
||||||
"color: %2;"
|
"color: %2;"
|
||||||
"font-size: %3pt;"
|
"font-size: %3pt;"
|
||||||
"font: bold;"
|
"font: bold;"
|
||||||
"font-family: %4;"
|
"font-family: %4;"
|
||||||
"border-radius: 3px;"
|
"border-radius: 3px;"
|
||||||
"min-width: %5px;"
|
"min-width: %5px;"
|
||||||
"max-width: %5px;")
|
"max-width: %5px;")
|
||||||
.arg(bg.name(QColor::HexArgb))
|
.arg(bg.name(QColor::HexArgb))
|
||||||
.arg(g_palette->color("navigation_label_fg"))
|
.arg(g_palette->color("navigation_label_fg"))
|
||||||
.arg(fontPt)
|
.arg(fontPt)
|
||||||
.arg(fontFamily)
|
.arg(fontFamily)
|
||||||
.arg(pxWidth);
|
.arg(pxWidth);
|
||||||
|
|
||||||
|
if (p_small) {
|
||||||
|
style += QString("margin: 0px;"
|
||||||
|
"padding: 0px;"
|
||||||
|
"min-height: %1px;"
|
||||||
|
"max-height: %1px;")
|
||||||
|
.arg(pxHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
return style;
|
||||||
}
|
}
|
||||||
|
|
||||||
const QString &VNote::getMonospacedFont() const
|
const QString &VNote::getMonospacedFont() const
|
||||||
|
@ -81,7 +81,7 @@ public:
|
|||||||
static const QString c_markdownGuideDocFile;
|
static const QString c_markdownGuideDocFile;
|
||||||
|
|
||||||
// Get the label style in Navigation mode.
|
// Get the label style in Navigation mode.
|
||||||
QString getNavigationLabelStyle(const QString &p_str) const;
|
QString getNavigationLabelStyle(const QString &p_str, bool p_small = false) const;
|
||||||
|
|
||||||
// Given the path of a file, first try to open it as note file,
|
// Given the path of a file, first try to open it as note file,
|
||||||
// then try to open it as orphan file.
|
// then try to open it as orphan file.
|
||||||
|
@ -575,6 +575,7 @@ void VNotebookSelector::showNavigation()
|
|||||||
m_naviLabel = new QLabel(m_majorKey, this);
|
m_naviLabel = new QLabel(m_majorKey, this);
|
||||||
m_naviLabel->setStyleSheet(g_vnote->getNavigationLabelStyle(m_majorKey));
|
m_naviLabel->setStyleSheet(g_vnote->getNavigationLabelStyle(m_majorKey));
|
||||||
m_naviLabel->show();
|
m_naviLabel->show();
|
||||||
|
m_naviLabel->move(rect().topRight() - QPoint(m_naviLabel->width() + 2, 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
void VNotebookSelector::hideNavigation()
|
void VNotebookSelector::hideNavigation()
|
||||||
|
@ -9,6 +9,10 @@
|
|||||||
#include "utils/vutils.h"
|
#include "utils/vutils.h"
|
||||||
#include "vtagpanel.h"
|
#include "vtagpanel.h"
|
||||||
#include "vnotefile.h"
|
#include "vnotefile.h"
|
||||||
|
#include "vmainwindow.h"
|
||||||
|
#include "vcaptain.h"
|
||||||
|
|
||||||
|
extern VMainWindow *g_mainWin;
|
||||||
|
|
||||||
VWordCountPanel::VWordCountPanel(QWidget *p_parent)
|
VWordCountPanel::VWordCountPanel(QWidget *p_parent)
|
||||||
: QWidget(p_parent)
|
: QWidget(p_parent)
|
||||||
@ -99,6 +103,11 @@ VTabIndicator::VTabIndicator(QWidget *p_parent)
|
|||||||
setupUI();
|
setupUI();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VTabIndicator::registerNavigationTarget()
|
||||||
|
{
|
||||||
|
g_mainWin->getCaptain()->registerNavigationTarget(m_tagPanel);
|
||||||
|
}
|
||||||
|
|
||||||
void VTabIndicator::setupUI()
|
void VTabIndicator::setupUI()
|
||||||
{
|
{
|
||||||
m_tagPanel = new VTagPanel(this);
|
m_tagPanel = new VTagPanel(this);
|
||||||
|
@ -47,6 +47,8 @@ public:
|
|||||||
// Update indicator.
|
// Update indicator.
|
||||||
void update(const VEditTabInfo &p_info);
|
void update(const VEditTabInfo &p_info);
|
||||||
|
|
||||||
|
void registerNavigationTarget();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void updateWordCountInfo(QWidget *p_widget);
|
void updateWordCountInfo(QWidget *p_widget);
|
||||||
|
|
||||||
|
@ -13,6 +13,8 @@
|
|||||||
#include "vhistorylist.h"
|
#include "vhistorylist.h"
|
||||||
#include "vnotefile.h"
|
#include "vnotefile.h"
|
||||||
#include "utils/vutils.h"
|
#include "utils/vutils.h"
|
||||||
|
#include "vnavigationmode.h"
|
||||||
|
#include "vcaptain.h"
|
||||||
|
|
||||||
extern VMainWindow *g_mainWin;
|
extern VMainWindow *g_mainWin;
|
||||||
|
|
||||||
@ -496,3 +498,14 @@ void VTagExplorer::promptToRemoveEmptyTag(const QString &p_tag)
|
|||||||
m_notebook->removeTag(p_tag);
|
m_notebook->removeTag(p_tag);
|
||||||
updateContent();
|
updateContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VTagExplorer::registerNavigationTarget()
|
||||||
|
{
|
||||||
|
setupUI();
|
||||||
|
|
||||||
|
VNavigationModeListWidgetWrapper *tagWrapper = new VNavigationModeListWidgetWrapper(m_tagList, this);
|
||||||
|
g_mainWin->getCaptain()->registerNavigationTarget(tagWrapper);
|
||||||
|
|
||||||
|
VNavigationModeListWidgetWrapper *fileWrapper = new VNavigationModeListWidgetWrapper(m_fileList, this);
|
||||||
|
g_mainWin->getCaptain()->registerNavigationTarget(fileWrapper);
|
||||||
|
}
|
||||||
|
@ -25,6 +25,8 @@ public:
|
|||||||
|
|
||||||
void saveStateAndGeometry();
|
void saveStateAndGeometry();
|
||||||
|
|
||||||
|
void registerNavigationTarget();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void showEvent(QShowEvent *p_event) Q_DECL_OVERRIDE;
|
void showEvent(QShowEvent *p_event) Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
|
@ -9,11 +9,14 @@
|
|||||||
#include "vtaglabel.h"
|
#include "vtaglabel.h"
|
||||||
#include "vlineedit.h"
|
#include "vlineedit.h"
|
||||||
#include "vmainwindow.h"
|
#include "vmainwindow.h"
|
||||||
|
#include "vnote.h"
|
||||||
|
|
||||||
extern VPalette *g_palette;
|
extern VPalette *g_palette;
|
||||||
|
|
||||||
extern VMainWindow *g_mainWin;
|
extern VMainWindow *g_mainWin;
|
||||||
|
|
||||||
|
extern VNote *g_vnote;
|
||||||
|
|
||||||
#define MAX_DISPLAY_LABEL 3
|
#define MAX_DISPLAY_LABEL 3
|
||||||
|
|
||||||
VTagPanel::VTagPanel(QWidget *parent)
|
VTagPanel::VTagPanel(QWidget *parent)
|
||||||
@ -210,3 +213,79 @@ void VTagPanel::updateCompleter()
|
|||||||
m_tagsModel->setStringList(m_notebookOfCompleter ? m_notebookOfCompleter->getTags()
|
m_tagsModel->setStringList(m_notebookOfCompleter ? m_notebookOfCompleter->getTags()
|
||||||
: QStringList());
|
: QStringList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VTagPanel::showNavigation()
|
||||||
|
{
|
||||||
|
if (!isVisible() || !m_file) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// View all tags.
|
||||||
|
if (isAllTagsPanelAvailable()) {
|
||||||
|
QChar key('a');
|
||||||
|
m_keyMap[key] = m_btn;
|
||||||
|
|
||||||
|
QString str = QString(m_majorKey) + key;
|
||||||
|
QLabel *label = new QLabel(str, this);
|
||||||
|
qDebug() << g_vnote->getNavigationLabelStyle(str, true);
|
||||||
|
label->setStyleSheet(g_vnote->getNavigationLabelStyle(str, true));
|
||||||
|
label->move(m_btn->geometry().topLeft());
|
||||||
|
label->show();
|
||||||
|
m_naviLabels.append(label);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add tag edit.
|
||||||
|
{
|
||||||
|
QChar key('b');
|
||||||
|
m_keyMap[key] = m_tagEdit;
|
||||||
|
|
||||||
|
QString str = QString(m_majorKey) + key;
|
||||||
|
QLabel *label = new QLabel(str, this);
|
||||||
|
label->setStyleSheet(g_vnote->getNavigationLabelStyle(str, true));
|
||||||
|
label->move(m_tagEdit->geometry().topLeft());
|
||||||
|
label->show();
|
||||||
|
m_naviLabels.append(label);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool VTagPanel::handleKeyNavigation(int p_key, bool &p_succeed)
|
||||||
|
{
|
||||||
|
static bool secondKey = false;
|
||||||
|
bool ret = false;
|
||||||
|
p_succeed = false;
|
||||||
|
QChar keyChar = VUtils::keyToChar(p_key);
|
||||||
|
if (secondKey && !keyChar.isNull()) {
|
||||||
|
secondKey = false;
|
||||||
|
p_succeed = true;
|
||||||
|
auto it = m_keyMap.find(keyChar);
|
||||||
|
if (it != m_keyMap.end()) {
|
||||||
|
ret = true;
|
||||||
|
|
||||||
|
if (*it == m_btn) {
|
||||||
|
// Show all tags panel.
|
||||||
|
// To avoid focus in VCaptain after hiding the menu.
|
||||||
|
g_mainWin->focusEditArea();
|
||||||
|
m_btn->showPopupWidget();
|
||||||
|
} else {
|
||||||
|
m_tagEdit->setFocus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (keyChar == m_majorKey) {
|
||||||
|
// Major key pressed.
|
||||||
|
// Need second key if m_keyMap is not empty.
|
||||||
|
if (m_keyMap.isEmpty()) {
|
||||||
|
p_succeed = true;
|
||||||
|
} else {
|
||||||
|
secondKey = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool VTagPanel::isAllTagsPanelAvailable() const
|
||||||
|
{
|
||||||
|
return m_btn->isVisible();
|
||||||
|
}
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
#define VTAGPANEL_H
|
#define VTAGPANEL_H
|
||||||
|
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
|
#include "vnavigationmode.h"
|
||||||
|
|
||||||
#include <QVector>
|
#include <QVector>
|
||||||
|
|
||||||
class VTagLabel;
|
class VTagLabel;
|
||||||
@ -12,7 +14,7 @@ class VLineEdit;
|
|||||||
class QStringListModel;
|
class QStringListModel;
|
||||||
class VNotebook;
|
class VNotebook;
|
||||||
|
|
||||||
class VTagPanel : public QWidget
|
class VTagPanel : public QWidget, public VNavigationMode
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
@ -20,6 +22,10 @@ public:
|
|||||||
|
|
||||||
void updateTags(VNoteFile *p_file);
|
void updateTags(VNoteFile *p_file);
|
||||||
|
|
||||||
|
// Implementations for VNavigationMode.
|
||||||
|
void showNavigation() Q_DECL_OVERRIDE;
|
||||||
|
bool handleKeyNavigation(int p_key, bool &p_succeed) Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool eventFilter(QObject *p_obj, QEvent *p_event) Q_DECL_OVERRIDE;
|
bool eventFilter(QObject *p_obj, QEvent *p_event) Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
@ -41,6 +47,8 @@ private:
|
|||||||
|
|
||||||
void updateCompleter();
|
void updateCompleter();
|
||||||
|
|
||||||
|
bool isAllTagsPanelAvailable() const;
|
||||||
|
|
||||||
QVector<VTagLabel *> m_labels;
|
QVector<VTagLabel *> m_labels;
|
||||||
|
|
||||||
VButtonWithWidget *m_btn;
|
VButtonWithWidget *m_btn;
|
||||||
@ -56,5 +64,4 @@ private:
|
|||||||
|
|
||||||
const VNotebook *m_notebookOfCompleter;
|
const VNotebook *m_notebookOfCompleter;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // VTAGPANEL_H
|
#endif // VTAGPANEL_H
|
||||||
|
Loading…
x
Reference in New Issue
Block a user