# 右键菜单功能说明

## 功能概述

TopHub数据查看器的右键菜单功能允许用户通过右键点击表格中的项目，快速执行常用操作，提高操作效率。

## 新增功能

### 1. 标记为感兴趣
- **功能描述**：将选中的项目标记为感兴趣状态
- **数据库操作**：将对应记录的`is_interested`字段设置为1
- **界面显示**：在"感兴趣"列显示为"是"，使用绿色粗体字体

### 2. 标记为不感兴趣
- **功能描述**：将选中的项目标记为不感兴趣状态
- **数据库操作**：将对应记录的`is_interested`字段设置为0
- **界面显示**：在"感兴趣"列显示为"否"，使用普通字体和颜色

### 3. 删除选中项
- **功能描述**：删除选中的项目
- **数据库操作**：从数据库中删除对应记录
- **界面显示**：从表格中移除对应行

## 使用方法

1. 打开TopHub数据查看器
2. 在表格中右键点击任意项目
3. 在弹出的右键菜单中选择所需操作：
   - 点击"标记为感兴趣"将项目标记为感兴趣
   - 点击"标记为不感兴趣"将项目标记为不感兴趣
   - 点击"删除选中项"删除选中的项目

## 技术实现

### 右键菜单实现
```python
# 启用右键菜单
self.table.setContextMenuPolicy(Qt.CustomContextMenu)
self.table.customContextMenuRequested.connect(self.show_context_menu)

def show_context_menu(self, position):
    """显示右键菜单"""
    # 获取点击位置的行
    row = self.table.rowAt(position.y())
    if row < 0:
        return
        
    # 选中该行
    self.table.selectRow(row)
    
    # 创建右键菜单
    menu = QMenu(self)
    
    # 添加"标记为感兴趣"动作
    mark_action = QAction("标记为感兴趣", self)
    mark_action.triggered.connect(self.mark_as_interested)
    menu.addAction(mark_action)
    
    # 添加"标记为不感兴趣"动作
    unmark_action = QAction("标记为不感兴趣", self)
    unmark_action.triggered.connect(self.mark_as_not_interested)
    menu.addAction(unmark_action)
    
    # 添加分隔线
    menu.addSeparator()
    
    # 添加"删除"动作
    delete_action = QAction("删除选中项", self)
    delete_action.triggered.connect(self.delete_selected_items)
    menu.addAction(delete_action)
    
    # 显示菜单
    menu.exec_(self.table.mapToGlobal(position))
```

### 标记为不感兴趣方法实现
```python
def mark_as_not_interested(self):
    """将选中的项目标记为不感兴趣"""
    # 获取选中的行
    selected_rows = set()
    for item in self.table.selectedItems():
        selected_rows.add(item.row())
        
    # 如果没有选中的行，直接返回
    if not selected_rows:
        QMessageBox.information(self, "提示", "请先选中要标记的行")
        return
        
    # 弹出确认对话框
    reply = QMessageBox.question(
        self, 
        "确认标记", 
        f"确定要将选中的 {len(selected_rows)} 行标记为不感兴趣吗？",
        QMessageBox.Yes | QMessageBox.No,
        QMessageBox.Yes
    )
    
    if reply == QMessageBox.No:
        return
        
    try:
        # 连接数据库
        conn = sqlite3.connect(self.db_path)
        cursor = conn.cursor()
        
        # 更新选中的行
        updated_count = 0
        for row in selected_rows:
            # 获取ID
            id_item = self.table.item(row, 0)
            if id_item:
                article_id = id_item.text()
                # 更新数据库中的is_interested字段
                cursor.execute("UPDATE articles SET is_interested = 0 WHERE id = ?", (article_id,))
                
                # 更新表格中的显示
                interested_item = QTableWidgetItem("否")
                # 不感兴趣项使用普通字体和颜色
                self.table.setItem(row, 5, interested_item)
                
                updated_count += 1
                
        # 提交更改
        conn.commit()
        conn.close()
        
        # 更新状态栏
        self.status_bar.showMessage(f"已标记 {updated_count} 行为不感兴趣")
        
    except sqlite3.Error as e:
        logger.error(f"标记数据时出错: {str(e)}")
        QMessageBox.critical(self, "数据库错误", f"标记数据时出错: {str(e)}")
        self.status_bar.showMessage("标记失败")
    except Exception as e:
        logger.error(f"标记数据时出错: {str(e)}")
        QMessageBox.critical(self, "错误", f"标记数据时出错: {str(e)}")
        self.status_bar.showMessage("标记失败")
```

## 测试

测试脚本`test_mark_not_interested.py`验证了"标记为不感兴趣"功能的正确性。测试结果显示功能正常工作，能够正确地将项目标记为不感兴趣，并更新数据库和界面显示。

## 注意事项

1. 右键菜单操作前必须先选中要操作的项目
2. 删除操作不可撤销，请谨慎使用
3. 标记操作会直接更新数据库，确保操作前已确认选择
4. 批量操作时，所有选中的项目都会被同时处理

## 更新记录

- 2023-11-07：添加"标记为不感兴趣"功能到右键菜单
- 2023-11-07：完成功能测试和文档编写