Main Window Py 7n
Main Window Py 7n
import json
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("NVivo Clone")
self.resize(1000, 700)
self.is_dark_mode = False
self.setup_ui()
self.create_menu()
self.load_tags()
self.start_auto_save()
def setup_ui(self):
# Document tabs
self.tabs = QTabWidget()
self.tabs.setTabsClosable(True)
self.tabs.tabCloseRequested.connect(self.close_tab)
self.add_new_tab()
# Tagging panel
self.tag_list = QListWidget()
self.tag_list.itemClicked.connect(self.apply_tag)
self.tag_input = QLineEdit()
self.add_tag_btn.clicked.connect(self.add_tag)
self.search_bar = QLineEdit()
self.search_bar.setPlaceholderText("Search tags...")
self.search_bar.textChanged.connect(self.filter_tags)
tag_layout = QVBoxLayout()
tag_layout.addWidget(self.search_bar)
tag_layout.addWidget(self.tag_list)
tag_layout.addWidget(self.tag_input)
tag_layout.addWidget(self.add_tag_btn)
main_layout = QHBoxLayout()
main_layout.addLayout(tag_layout, 1)
main_layout.addWidget(self.tabs, 3)
container = QWidget()
container.setLayout(main_layout)
self.setCentralWidget(container)
self.home_tab = QWidget()
self.init_home_tab()
self.tabs.addTab(self.home_tab, "Home")
def create_menu(self):
menubar = self.menuBar()
file_menu = menubar.addMenu("File")
open_action.triggered.connect(self.open_file)
save_action.triggered.connect(self.save_file)
new_tab_action.triggered.connect(self.add_new_tab)
export_action.triggered.connect(self.export_tags)
file_menu.addAction(new_tab_action)
file_menu.addAction(open_action)
file_menu.addAction(save_action)
file_menu.addAction(export_action)
view_menu = menubar.addMenu("View")
theme_action.triggered.connect(self.toggle_theme)
view_menu.addAction(theme_action)
help_menu = menubar.addMenu("Help")
about_action.triggered.connect(self.show_about)
help_menu.addAction(about_action)
def load_tags(self):
self.tag_list.clear()
tags = session.query(Tag).all()
self.tag_list.addItem(tag.name)
def add_tag(self):
tag_name = self.tag_input.text().strip()
if tag_name:
if not session.query(Tag).filter_by(name=tag_name).first():
new_tag = Tag(name=tag_name)
session.add(new_tag)
session.commit()
self.tag_list.addItem(tag_name)
self.tag_input.clear()
else:
QMessageBox.information(self, "Tag Exists", "This tag already
exists.")
editor = self.current_editor()
if editor:
cursor = editor.textCursor()
selected_text = cursor.selectedText()
if selected_text:
tagged_text = f"[{item.text()}:{selected_text}]"
cursor.insertText(tagged_text)
else:
item = self.tag_list.item(index)
def open_file(self):
if path:
content = file.read()
self.add_new_tab(content, os.path.basename(path))
def save_file(self):
editor = self.current_editor()
if editor:
if path:
file.write(editor.toPlainText())
def export_tags(self):
if path:
json.dump(tags, file)
def toggle_theme(self):
if self.is_dark_mode:
self.setStyleSheet("""
""")
else:
self.setStyleSheet("")
def show_about(self):
def start_auto_save(self):
self.auto_save_timer = QTimer(self)
self.auto_save_timer.timeout.connect(self.auto_save)
self.auto_save_timer.start(60000) # 60 seconds
def auto_save(self):
editor = self.tabs.widget(index).findChild(QTextEdit)
if editor:
file_path = f'autosave_tab_{index}.txt'
file.write(editor.toPlainText())
def current_editor(self):
current_widget = self.tabs.currentWidget()
editor = QTextEdit()
editor.setText(content)
tab = QWidget()
layout = QVBoxLayout()
layout.addWidget(editor)
tab.setLayout(layout)
self.tabs.addTab(tab, title)
self.tabs.setCurrentWidget(tab)
self.tabs.removeTab(index)
def init_home_tab(self):
layout = QVBoxLayout()
# Welcome Header
layout.addWidget(welcome_label)
# Project Stats
project_count = self.session.query(Project).count()
doc_count = self.session.query(Document).count()
tag_count = self.session.query(Tag).count()
layout.addWidget(stats_label)
# Action Buttons
btn_layout = QHBoxLayout()
create_btn.clicked.connect(self.create_project)
btn_layout.addWidget(create_btn)
open_btn.clicked.connect(self.open_project)
btn_layout.addWidget(open_btn)
layout.addLayout(btn_layout)
# Recent Projects
layout.addWidget(recent_label)
recent_projects =
self.session.query(Project).order_by(Project.id.desc()).limit(5).all()
doc_total = len(project.documents)
layout.addWidget(proj_label)
if recent_projects:
ax.set_ylabel("Documents")
ax.set_xlabel("Projects")
ax.tick_params(axis='x', rotation=45)
canvas = FigureCanvas(fig)
layout.addWidget(canvas)
tags = self.session.query(Tag).all()
tag_names = []
tag_counts = []
count =
self.session.query(Document).filter(Document.content.contains(tag.name)).c
ount()
if count > 0:
tag_names.append(tag.name)
tag_counts.append(count)
if tag_names:
ax2.set_title("Tag Usage")
canvas2 = FigureCanvas(fig2)
layout.addWidget(canvas2)
layout.addWidget(search_label)
self.search_input = QLineEdit()
self.search_input.textChanged.connect(self.filter_projects)
layout.addWidget(self.search_input)
self.search_results = QListWidget()
layout.addWidget(self.search_results)
layout.addStretch()
self.home_tab.setLayout(layout)
self.search_results.clear()
if text.strip():
results = self.session.query(Project).filter(Project.name.ilike(f"%
{text}%")).all()
self.search_results.addItem(project.name)