コード例 #1
0
ファイル: RemindorQtWindow.py プロジェクト: eu21/remindor-qt
    def __init__(self, dbus_service = None, parent = None):
        super(RemindorQtWindow,self).__init__(parent)
        self.dbus_service = dbus_service
        helpers.setup_ui(self, "RemindorQtWindow.ui", True)
        self.resize(700, 300)

        self.action_add = self.findChild(QAction, "action_add")
        self.action_quick_add = self.findChild(QAction, "action_quick_add")
        self.action_edit = self.findChild(QAction, "action_edit")
        self.action_postpone = self.findChild(QAction, "action_postpone")
        self.action_delete = self.findChild(QAction, "action_delete")
        self.action_preferences = self.findChild(QAction, "action_preferences")
        self.action_news = self.findChild(QAction, "action_news")
        self.action_help = self.findChild(QAction, "action_help")
        self.action_close = self.findChild(QAction, "action_close")
        self.action_quit = self.findChild(QAction, "action_quit")
        self.action_refresh = self.findChild(QAction, "action_refresh")
        self.action_clear_icon = self.findChild(QAction, "action_clear_icon")
        self.action_bugs = self.findChild(QAction, "action_bugs")
        self.action_request = self.findChild(QAction, "action_request")
        self.action_translate = self.findChild(QAction, "action_translate")
        self.action_donate = self.findChild(QAction, "action_donate")
        self.action_ask = self.findChild(QAction, "action_ask")
        self.action_website = self.findChild(QAction, "action_website")
        self.action_about = self.findChild(QAction, "action_about")
        self.action_stop = self.findChild(QAction, "action_stop")

        self.translate()

        self.info = ManageWindowInfo(helpers.database_file())

        self.active_icon = QIcon(helpers.get_data_file("media", "remindor-qt-active.svg"))
        self.app_icon = QIcon(helpers.get_data_file("media", "remindor-qt.svg"))
        self.attention_icon = QIcon.fromTheme("remindor-qt-attention", QIcon(helpers.get_data_file("media", "remindor-qt-attention.svg")))
        self.tray_icons = [QIcon.fromTheme("remindor-qt-active", self.active_icon),
                        self.active_icon,
                        QIcon(helpers.get_data_file("media", "remindor-qt-active_dark.svg")),
                        QIcon.fromTheme("remindor-qt", self.app_icon)]

        self.reminder_tree = self.findChild(QTreeWidget, "reminder_tree")
        self.reminder_tree.setColumnWidth(0, 200)
        edit = QAction(QIcon.fromTheme("gtk-edit", QIcon(":/icons/edit.png")), _("Edit"), self)
        edit.triggered.connect(self.on_action_edit_triggered)
        self.reminder_tree.addAction(edit)
        postpone = QAction(QIcon.fromTheme("go-jump", QIcon(":/icons/postpone.png")), _("Postpone"), self)
        postpone.triggered.connect(self.on_action_postpone_triggered)
        self.reminder_tree.addAction(postpone)
        delete = QAction(QIcon.fromTheme("edit-delete", QIcon(":/icons/delete.png")), _("Delete"), self)
        delete.triggered.connect(self.on_action_delete_triggered)
        self.reminder_tree.addAction(delete)

        self.news_action = self.findChild(QAction, "action_news")

        self.tray_menu = QMenu()
        self.tray_menu.addAction(QIcon.fromTheme("add", QIcon(":/icons/add.png")), _("Add"), self, SLOT("on_action_add_triggered()"))
        self.tray_menu.addAction(QIcon.fromTheme("media-playback-start", QIcon(":/icons/wand.png")), _("Simple Add"), self, SLOT("on_action_simple_add_triggered()"))
        self.tray_menu.addAction(QIcon.fromTheme("media-skip-forward", QIcon(":/icons/quick.png")), _("Quick Add"), self, SLOT("on_action_quick_add_triggered()"))
        self.tray_menu.addAction(QIcon.fromTheme("media-playback-stop", QIcon(":/icons/delete.png")), _("Stop Sound"), self, SLOT("on_action_stop_triggered()"))
        self.tray_menu.addAction(QIcon.fromTheme("stock_properties", QIcon(":/icons/manage.png")), _("Manage"), self, SLOT("show()"))
        self.tray_menu.addAction(QIcon.fromTheme("exit", QIcon(":/icons/quit.png")), _("Quit"), self, SLOT("on_action_quit_triggered()")) #TODO: change this when reimplementing x-close button

        self.tray_icon = QSystemTrayIcon(self.tray_icons[self.info.indicator_icon], self)
        self.tray_icon.setContextMenu(self.tray_menu)
        self.tray_icon.show()
        self.tray_icon.activated.connect(self.tray_activated)

        self.scheduler = SchedulerQt(self.tray_icon, self.attention_icon, self.update_slot, helpers.database_file())
        if not self.dbus_service == None:
            self.scheduler.add_dbus_service(self.dbus_service)

        self.update()

        self.updater = QTimer(self)
        self.updater.setInterval(1000 * 60 * 60 * 6) #update everything every 1/4 day
        self.updater.timeout.connect(self.update_schedule)

        b = BlogReader(rssfeed, helpers.database_file())
        b.start()

        for reminder in self.info.missed_reminders:
            self.scheduler.run_alarm(reminder)
コード例 #2
0
    def __init__(self, dbus_service=None, parent=None):
        super(RemindorQtWindow, self).__init__(parent)
        self.dbus_service = dbus_service
        helpers.setup_ui(self, "RemindorQtWindow.ui", True)
        self.resize(700, 300)

        self.action_add = self.findChild(QAction, "action_add")
        self.action_quick_add = self.findChild(QAction, "action_quick_add")
        self.action_edit = self.findChild(QAction, "action_edit")
        self.action_postpone = self.findChild(QAction, "action_postpone")
        self.action_delete = self.findChild(QAction, "action_delete")
        self.action_preferences = self.findChild(QAction, "action_preferences")
        self.action_news = self.findChild(QAction, "action_news")
        self.action_help = self.findChild(QAction, "action_help")
        self.action_close = self.findChild(QAction, "action_close")
        self.action_quit = self.findChild(QAction, "action_quit")
        self.action_refresh = self.findChild(QAction, "action_refresh")
        self.action_clear_icon = self.findChild(QAction, "action_clear_icon")
        self.action_bugs = self.findChild(QAction, "action_bugs")
        self.action_request = self.findChild(QAction, "action_request")
        self.action_translate = self.findChild(QAction, "action_translate")
        self.action_donate = self.findChild(QAction, "action_donate")
        self.action_ask = self.findChild(QAction, "action_ask")
        self.action_website = self.findChild(QAction, "action_website")
        self.action_about = self.findChild(QAction, "action_about")
        self.action_stop = self.findChild(QAction, "action_stop")

        self.translate()

        self.info = ManageWindowInfo(helpers.database_file())

        self.active_icon = QIcon(
            helpers.get_data_file("media", "remindor-qt-active.svg"))
        self.app_icon = QIcon(helpers.get_data_file("media",
                                                    "remindor-qt.svg"))
        self.attention_icon = QIcon.fromTheme(
            "remindor-qt-attention",
            QIcon(helpers.get_data_file("media", "remindor-qt-attention.svg")))
        self.tray_icons = [
            QIcon.fromTheme("remindor-qt-active", self.active_icon),
            self.active_icon,
            QIcon(helpers.get_data_file("media",
                                        "remindor-qt-active_dark.svg")),
            QIcon.fromTheme("remindor-qt", self.app_icon)
        ]

        self.reminder_tree = self.findChild(QTreeWidget, "reminder_tree")
        self.reminder_tree.setColumnWidth(0, 200)
        edit = QAction(QIcon.fromTheme("gtk-edit", QIcon(":/icons/edit.png")),
                       _("Edit"), self)
        edit.triggered.connect(self.on_action_edit_triggered)
        self.reminder_tree.addAction(edit)
        postpone = QAction(
            QIcon.fromTheme("go-jump", QIcon(":/icons/postpone.png")),
            _("Postpone"), self)
        postpone.triggered.connect(self.on_action_postpone_triggered)
        self.reminder_tree.addAction(postpone)
        delete = QAction(
            QIcon.fromTheme("edit-delete", QIcon(":/icons/delete.png")),
            _("Delete"), self)
        delete.triggered.connect(self.on_action_delete_triggered)
        self.reminder_tree.addAction(delete)

        self.news_action = self.findChild(QAction, "action_news")

        self.tray_menu = QMenu()
        self.tray_menu.addAction(
            QIcon.fromTheme("add", QIcon(":/icons/add.png")), _("Add"), self,
            SLOT("on_action_add_triggered()"))
        self.tray_menu.addAction(
            QIcon.fromTheme("media-playback-start", QIcon(":/icons/wand.png")),
            _("Simple Add"), self, SLOT("on_action_simple_add_triggered()"))
        self.tray_menu.addAction(
            QIcon.fromTheme("media-skip-forward", QIcon(":/icons/quick.png")),
            _("Quick Add"), self, SLOT("on_action_quick_add_triggered()"))
        self.tray_menu.addAction(
            QIcon.fromTheme("media-playback-stop",
                            QIcon(":/icons/delete.png")), _("Stop Sound"),
            self, SLOT("on_action_stop_triggered()"))
        self.tray_menu.addAction(
            QIcon.fromTheme("stock_properties", QIcon(":/icons/manage.png")),
            _("Manage"), self, SLOT("show()"))
        self.tray_menu.addAction(
            QIcon.fromTheme("exit",
                            QIcon(":/icons/quit.png")), _("Quit"), self,
            SLOT("on_action_quit_triggered()")
        )  #TODO: change this when reimplementing x-close button

        self.tray_icon = QSystemTrayIcon(
            self.tray_icons[self.info.indicator_icon], self)
        self.tray_icon.setContextMenu(self.tray_menu)
        self.tray_icon.show()
        self.tray_icon.activated.connect(self.tray_activated)

        self.scheduler = SchedulerQt(self.tray_icon, self.attention_icon,
                                     self.update_slot, helpers.database_file())
        if not self.dbus_service == None:
            self.scheduler.add_dbus_service(self.dbus_service)

        self.update()

        self.updater = QTimer(self)
        self.updater.setInterval(1000 * 60 * 60 *
                                 6)  #update everything every 1/4 day
        self.updater.timeout.connect(self.update_schedule)

        b = BlogReader(rssfeed, helpers.database_file())
        b.start()

        for reminder in self.info.missed_reminders:
            self.scheduler.run_alarm(reminder)
コード例 #3
0
ファイル: RemindorQtWindow.py プロジェクト: eu21/remindor-qt
class RemindorQtWindow(QMainWindow): #TODO: add font awesome as fallback icons
    setup_schedule = True
    ok_to_close = False

    def __init__(self, dbus_service = None, parent = None):
        super(RemindorQtWindow,self).__init__(parent)
        self.dbus_service = dbus_service
        helpers.setup_ui(self, "RemindorQtWindow.ui", True)
        self.resize(700, 300)

        self.action_add = self.findChild(QAction, "action_add")
        self.action_quick_add = self.findChild(QAction, "action_quick_add")
        self.action_edit = self.findChild(QAction, "action_edit")
        self.action_postpone = self.findChild(QAction, "action_postpone")
        self.action_delete = self.findChild(QAction, "action_delete")
        self.action_preferences = self.findChild(QAction, "action_preferences")
        self.action_news = self.findChild(QAction, "action_news")
        self.action_help = self.findChild(QAction, "action_help")
        self.action_close = self.findChild(QAction, "action_close")
        self.action_quit = self.findChild(QAction, "action_quit")
        self.action_refresh = self.findChild(QAction, "action_refresh")
        self.action_clear_icon = self.findChild(QAction, "action_clear_icon")
        self.action_bugs = self.findChild(QAction, "action_bugs")
        self.action_request = self.findChild(QAction, "action_request")
        self.action_translate = self.findChild(QAction, "action_translate")
        self.action_donate = self.findChild(QAction, "action_donate")
        self.action_ask = self.findChild(QAction, "action_ask")
        self.action_website = self.findChild(QAction, "action_website")
        self.action_about = self.findChild(QAction, "action_about")
        self.action_stop = self.findChild(QAction, "action_stop")

        self.translate()

        self.info = ManageWindowInfo(helpers.database_file())

        self.active_icon = QIcon(helpers.get_data_file("media", "remindor-qt-active.svg"))
        self.app_icon = QIcon(helpers.get_data_file("media", "remindor-qt.svg"))
        self.attention_icon = QIcon.fromTheme("remindor-qt-attention", QIcon(helpers.get_data_file("media", "remindor-qt-attention.svg")))
        self.tray_icons = [QIcon.fromTheme("remindor-qt-active", self.active_icon),
                        self.active_icon,
                        QIcon(helpers.get_data_file("media", "remindor-qt-active_dark.svg")),
                        QIcon.fromTheme("remindor-qt", self.app_icon)]

        self.reminder_tree = self.findChild(QTreeWidget, "reminder_tree")
        self.reminder_tree.setColumnWidth(0, 200)
        edit = QAction(QIcon.fromTheme("gtk-edit", QIcon(":/icons/edit.png")), _("Edit"), self)
        edit.triggered.connect(self.on_action_edit_triggered)
        self.reminder_tree.addAction(edit)
        postpone = QAction(QIcon.fromTheme("go-jump", QIcon(":/icons/postpone.png")), _("Postpone"), self)
        postpone.triggered.connect(self.on_action_postpone_triggered)
        self.reminder_tree.addAction(postpone)
        delete = QAction(QIcon.fromTheme("edit-delete", QIcon(":/icons/delete.png")), _("Delete"), self)
        delete.triggered.connect(self.on_action_delete_triggered)
        self.reminder_tree.addAction(delete)

        self.news_action = self.findChild(QAction, "action_news")

        self.tray_menu = QMenu()
        self.tray_menu.addAction(QIcon.fromTheme("add", QIcon(":/icons/add.png")), _("Add"), self, SLOT("on_action_add_triggered()"))
        self.tray_menu.addAction(QIcon.fromTheme("media-playback-start", QIcon(":/icons/wand.png")), _("Simple Add"), self, SLOT("on_action_simple_add_triggered()"))
        self.tray_menu.addAction(QIcon.fromTheme("media-skip-forward", QIcon(":/icons/quick.png")), _("Quick Add"), self, SLOT("on_action_quick_add_triggered()"))
        self.tray_menu.addAction(QIcon.fromTheme("media-playback-stop", QIcon(":/icons/delete.png")), _("Stop Sound"), self, SLOT("on_action_stop_triggered()"))
        self.tray_menu.addAction(QIcon.fromTheme("stock_properties", QIcon(":/icons/manage.png")), _("Manage"), self, SLOT("show()"))
        self.tray_menu.addAction(QIcon.fromTheme("exit", QIcon(":/icons/quit.png")), _("Quit"), self, SLOT("on_action_quit_triggered()")) #TODO: change this when reimplementing x-close button

        self.tray_icon = QSystemTrayIcon(self.tray_icons[self.info.indicator_icon], self)
        self.tray_icon.setContextMenu(self.tray_menu)
        self.tray_icon.show()
        self.tray_icon.activated.connect(self.tray_activated)

        self.scheduler = SchedulerQt(self.tray_icon, self.attention_icon, self.update_slot, helpers.database_file())
        if not self.dbus_service == None:
            self.scheduler.add_dbus_service(self.dbus_service)

        self.update()

        self.updater = QTimer(self)
        self.updater.setInterval(1000 * 60 * 60 * 6) #update everything every 1/4 day
        self.updater.timeout.connect(self.update_schedule)

        b = BlogReader(rssfeed, helpers.database_file())
        b.start()

        for reminder in self.info.missed_reminders:
            self.scheduler.run_alarm(reminder)

    def translate(self):
        self.setWindowTitle("Manage Reminders")

        self.action_add.setText(_("Add"))
        self.action_quick_add.setText(_("Quick Add"))
        self.action_edit.setText(_("Edit"))
        self.action_postpone.setText(_("Postpone"))
        self.action_delete.setText(_("Delete"))
        self.action_preferences.setText(_("Preferences"))
        self.action_news.setText(_("News"))
        self.action_help.setText(_("Help"))
        self.action_close.setText(_("Close"))
        self.action_quit.setText(_("Quit"))
        self.action_refresh.setText(_("Refresh"))
        self.action_clear_icon.setText(_("Clear Icon"))
        self.action_bugs.setText(_("Submit Bugs"))
        self.action_request.setText(_("Request Feature"))
        self.action_translate.setText(_("Help Translate"))
        self.action_donate.setText(_("Donate"))
        self.action_ask.setText(_("Ask a Question"))
        self.action_website.setText(_("Website"))
        self.action_about.setText(_("About"))
        self.action_stop.setText(_("Stop Sound"))

    @Slot()
    def tray_activated(self, reason):
        self.tray_icon.setIcon(self.tray_icons[self.info.indicator_icon])

        if reason == QSystemTrayIcon.Trigger:
            self.show()
        elif reason == QSystemTrayIcon.MiddleClick:
            self.on_action_add_triggered()

    @Slot()
    def closeEvent(self, event):
        if self.ok_to_close:
            sys.exit(0)
            event.accept()
        else:
            event.ignore()
            self.hide()

    @Slot()
    def on_action_add_triggered(self):
        dialog = ReminderDialog(self)
        dialog.added.connect(self.add_to_schedule)
        dialog.exec_()

    @Slot()
    def on_action_quick_add_triggered(self):
        dialog = QuickDialog(self)
        dialog.added.connect(self.add_to_schedule)
        dialog.exec_()

    @Slot()
    def on_action_simple_add_triggered(self):
        dialog = SimpleDialog(self)
        dialog.added.connect(self.add_to_schedule)
        dialog.exec_()

    @Slot()
    def on_action_edit_triggered(self):
        (selected, is_parent) = self.get_selected()

        if not is_parent:
            dialog = ReminderDialog(self)
            dialog.edit(selected)
            dialog.added.connect(self.add_to_schedule)
            dialog.exec_()

    @Slot()
    def on_action_postpone_triggered(self):
        (selected, is_parent) = self.get_selected()
        if not is_parent:
            if self.info.postpone(selected):
                message = _("Sorry, you cannot postpone a repeating time.")
                QMessageBox.information(self, _("Postpone"), message, QMessageBox.Ok)

            self.update()

    @Slot()
    def on_action_delete_triggered(self):
        (selected, is_parent) = self.get_selected()
        if not is_parent:
            self.info.delete(selected)

            self.update()

    @Slot()
    def on_action_preferences_triggered(self):
        dialog = PreferencesDialog(self)
        dialog.update.connect(self.update)
        dialog.exec_()

    @Slot()
    def on_action_news_triggered(self):
        self.news_action.setText(_("News"))
        helpers.show_uri(blogsite)

    @Slot()
    def on_action_help_triggered(self):
        helpers.show_html_help("index")

    @Slot()
    def on_action_close_triggered(self):
        self.hide()

    @Slot()
    def on_action_quit_triggered(self):
        self.ok_to_close = True
        self.close()

    @Slot()
    def on_action_refresh_triggered(self):
        self.update_schedule()

    @Slot()
    def on_action_clear_icon_triggered(self):
        self.tray_icon.setIcon(self.tray_icons[self.info.indicator_icon])

        if self.dbus_service != None:
            logger.debug("emmiting dbus active signal")
            self.dbus_service.emitActive()

    @Slot()
    def on_action_bugs_triggered(self):
        helpers.show_uri(bugsite_qt)

    @Slot()
    def on_action_request_triggered(self):
        helpers.show_uri(featuresite_qt)

    @Slot()
    def on_action_translate_triggered(self):
        helpers.show_uri(translatesite)

    @Slot()
    def on_action_donate_triggered(self):
        helpers.show_uri(donatesite)

    @Slot()
    def on_action_ask_triggered(self):
        helpers.show_uri(questionsite_qt)

    @Slot()
    def on_action_website_triggered(self):
        helpers.show_uri(website_qt)

    @Slot()
    def on_action_about_triggered(self):
        dialog = AboutDialog(self)
        dialog.show()

    @Slot()
    def on_action_stop_triggered(self):
        logger.debug("stopping sound")
        self.scheduler.stop_sound()

        self.on_action_clear_icon_triggered()

    @Slot()
    def add_to_schedule(self, id):
        self.scheduler.add_reminder(id)
        self.update()

    @Slot()
    def update(self, update_icon = True):
        logger.debug("update")

        if self.setup_schedule:
            self.info.update(self.scheduler)
            self.setup_schedule = False
        else:
            self.info.update(None)

        if self.info.show_news == 1 and self.info.new_news == 1:
            self.news_action.setText(_("New News"))
        else:
            self.news_action.setText(_("News"))

        if self.info.hide_indicator:
            if self.tray_icon.isVisible():
                self.tray_icon.hide()
        else:
            if not self.tray_icon.isVisible():
                self.tray_icon.show()

        if update_icon:
            self.tray_icon.setIcon(self.tray_icons[self.info.indicator_icon])

        logger.debug("update: setting up headers")
        self.reminder_tree.clear()

        self.today = QTreeWidgetItem(self.reminder_tree, [_("Today's Reminders"), "", "", "", ""])
        today_brush = QBrush(Qt.SolidPattern)
        today_brush.setColor(QColor(self.info.today_color[0], self.info.today_color[1], self.info.today_color[2]))
        for i in range(4):
            self.today.setBackground(i, today_brush)
        self.reminder_tree.addTopLevelItem(self.today)

        self.future = QTreeWidgetItem(self.reminder_tree, [_("Future Reminders"), "", "", "", ""])
        future_brush = QBrush(Qt.SolidPattern)
        future_brush.setColor(QColor(self.info.future_color[0], self.info.future_color[1], self.info.future_color[2]))
        for i in range(4):
            self.future.setBackground(i, future_brush)
        self.reminder_tree.addTopLevelItem(self.future)

        self.past = QTreeWidgetItem(self.reminder_tree, [_("Past Reminders"), "", "", "", ""])
        past_brush = QBrush(Qt.SolidPattern)
        past_brush.setColor(QColor(self.info.past_color[0], self.info.past_color[1], self.info.past_color[2]))
        for i in range(4):
            self.past.setBackground(i, past_brush)
        self.reminder_tree.addTopLevelItem(self.past)

        for reminder in self.info.reminder_list:
            parent = self.past
            if reminder.parent == self.info.today:
                parent = self.today
            elif reminder.parent == self.info.future:
                parent = self.future

            temp = QTreeWidgetItem(parent, reminder.qt())
            for i in range(4):
                temp.setToolTip(i, reminder.tooltip)

        self.reminder_tree.expandAll()

        logger.debug("update: done setting up tree")

        return True

    @Slot()
    def update_slot(self):
        self.update(False)

        return True

    @Slot()
    def update_schedule(self):
        self.setup_schedule = True
        self.scheduler.clear_schedule()

        logger.debug("updating the whole schedule")
        self.update()
        return True

    def get_selected(self):
        selected_items = self.reminder_tree.selectedItems()
        selected = selected_items[0]

        is_parent = False
        text = selected.text(0)
        if text == self.today.text(0) or text == self.future.text(0) or text == self.past.text(0):
            if selected.text(4) == "": #id is "" only on the 3 parents
                is_parent = True

        if is_parent:
            return -1, is_parent
        else:
            return int(selected.text(4)), is_parent

    def dbus_receiver(self, command):
        logger.debug("received " + command + " signal from dbus")

        if command == "update":
            self.update_schedule()
        elif command == "stop":
            logger.debug("dbus: stopping sound...")
            self.on_action_stop_triggered()
        elif command == "manage":
            self.show()
        elif command == "close":
            self.ok_to_close = True
            self.close()
        elif command == "attention" or command == "active":
            pass #don't do anything, we probably sent this signal
        else:
            logger.debug("unrecognized dbus command: " + command)
コード例 #4
0
class RemindorQtWindow(QMainWindow):  #TODO: add font awesome as fallback icons
    setup_schedule = True
    ok_to_close = False

    def __init__(self, dbus_service=None, parent=None):
        super(RemindorQtWindow, self).__init__(parent)
        self.dbus_service = dbus_service
        helpers.setup_ui(self, "RemindorQtWindow.ui", True)
        self.resize(700, 300)

        self.action_add = self.findChild(QAction, "action_add")
        self.action_quick_add = self.findChild(QAction, "action_quick_add")
        self.action_edit = self.findChild(QAction, "action_edit")
        self.action_postpone = self.findChild(QAction, "action_postpone")
        self.action_delete = self.findChild(QAction, "action_delete")
        self.action_preferences = self.findChild(QAction, "action_preferences")
        self.action_news = self.findChild(QAction, "action_news")
        self.action_help = self.findChild(QAction, "action_help")
        self.action_close = self.findChild(QAction, "action_close")
        self.action_quit = self.findChild(QAction, "action_quit")
        self.action_refresh = self.findChild(QAction, "action_refresh")
        self.action_clear_icon = self.findChild(QAction, "action_clear_icon")
        self.action_bugs = self.findChild(QAction, "action_bugs")
        self.action_request = self.findChild(QAction, "action_request")
        self.action_translate = self.findChild(QAction, "action_translate")
        self.action_donate = self.findChild(QAction, "action_donate")
        self.action_ask = self.findChild(QAction, "action_ask")
        self.action_website = self.findChild(QAction, "action_website")
        self.action_about = self.findChild(QAction, "action_about")
        self.action_stop = self.findChild(QAction, "action_stop")

        self.translate()

        self.info = ManageWindowInfo(helpers.database_file())

        self.active_icon = QIcon(
            helpers.get_data_file("media", "remindor-qt-active.svg"))
        self.app_icon = QIcon(helpers.get_data_file("media",
                                                    "remindor-qt.svg"))
        self.attention_icon = QIcon.fromTheme(
            "remindor-qt-attention",
            QIcon(helpers.get_data_file("media", "remindor-qt-attention.svg")))
        self.tray_icons = [
            QIcon.fromTheme("remindor-qt-active", self.active_icon),
            self.active_icon,
            QIcon(helpers.get_data_file("media",
                                        "remindor-qt-active_dark.svg")),
            QIcon.fromTheme("remindor-qt", self.app_icon)
        ]

        self.reminder_tree = self.findChild(QTreeWidget, "reminder_tree")
        self.reminder_tree.setColumnWidth(0, 200)
        edit = QAction(QIcon.fromTheme("gtk-edit", QIcon(":/icons/edit.png")),
                       _("Edit"), self)
        edit.triggered.connect(self.on_action_edit_triggered)
        self.reminder_tree.addAction(edit)
        postpone = QAction(
            QIcon.fromTheme("go-jump", QIcon(":/icons/postpone.png")),
            _("Postpone"), self)
        postpone.triggered.connect(self.on_action_postpone_triggered)
        self.reminder_tree.addAction(postpone)
        delete = QAction(
            QIcon.fromTheme("edit-delete", QIcon(":/icons/delete.png")),
            _("Delete"), self)
        delete.triggered.connect(self.on_action_delete_triggered)
        self.reminder_tree.addAction(delete)

        self.news_action = self.findChild(QAction, "action_news")

        self.tray_menu = QMenu()
        self.tray_menu.addAction(
            QIcon.fromTheme("add", QIcon(":/icons/add.png")), _("Add"), self,
            SLOT("on_action_add_triggered()"))
        self.tray_menu.addAction(
            QIcon.fromTheme("media-playback-start", QIcon(":/icons/wand.png")),
            _("Simple Add"), self, SLOT("on_action_simple_add_triggered()"))
        self.tray_menu.addAction(
            QIcon.fromTheme("media-skip-forward", QIcon(":/icons/quick.png")),
            _("Quick Add"), self, SLOT("on_action_quick_add_triggered()"))
        self.tray_menu.addAction(
            QIcon.fromTheme("media-playback-stop",
                            QIcon(":/icons/delete.png")), _("Stop Sound"),
            self, SLOT("on_action_stop_triggered()"))
        self.tray_menu.addAction(
            QIcon.fromTheme("stock_properties", QIcon(":/icons/manage.png")),
            _("Manage"), self, SLOT("show()"))
        self.tray_menu.addAction(
            QIcon.fromTheme("exit",
                            QIcon(":/icons/quit.png")), _("Quit"), self,
            SLOT("on_action_quit_triggered()")
        )  #TODO: change this when reimplementing x-close button

        self.tray_icon = QSystemTrayIcon(
            self.tray_icons[self.info.indicator_icon], self)
        self.tray_icon.setContextMenu(self.tray_menu)
        self.tray_icon.show()
        self.tray_icon.activated.connect(self.tray_activated)

        self.scheduler = SchedulerQt(self.tray_icon, self.attention_icon,
                                     self.update_slot, helpers.database_file())
        if not self.dbus_service == None:
            self.scheduler.add_dbus_service(self.dbus_service)

        self.update()

        self.updater = QTimer(self)
        self.updater.setInterval(1000 * 60 * 60 *
                                 6)  #update everything every 1/4 day
        self.updater.timeout.connect(self.update_schedule)

        b = BlogReader(rssfeed, helpers.database_file())
        b.start()

        for reminder in self.info.missed_reminders:
            self.scheduler.run_alarm(reminder)

    def translate(self):
        self.setWindowTitle("Manage Reminders")

        self.action_add.setText(_("Add"))
        self.action_quick_add.setText(_("Quick Add"))
        self.action_edit.setText(_("Edit"))
        self.action_postpone.setText(_("Postpone"))
        self.action_delete.setText(_("Delete"))
        self.action_preferences.setText(_("Preferences"))
        self.action_news.setText(_("News"))
        self.action_help.setText(_("Help"))
        self.action_close.setText(_("Close"))
        self.action_quit.setText(_("Quit"))
        self.action_refresh.setText(_("Refresh"))
        self.action_clear_icon.setText(_("Clear Icon"))
        self.action_bugs.setText(_("Submit Bugs"))
        self.action_request.setText(_("Request Feature"))
        self.action_translate.setText(_("Help Translate"))
        self.action_donate.setText(_("Donate"))
        self.action_ask.setText(_("Ask a Question"))
        self.action_website.setText(_("Website"))
        self.action_about.setText(_("About"))
        self.action_stop.setText(_("Stop Sound"))

    @Slot()
    def tray_activated(self, reason):
        self.tray_icon.setIcon(self.tray_icons[self.info.indicator_icon])

        if reason == QSystemTrayIcon.Trigger:
            self.show()
        elif reason == QSystemTrayIcon.MiddleClick:
            self.on_action_add_triggered()

    @Slot()
    def closeEvent(self, event):
        if self.ok_to_close:
            sys.exit(0)
            event.accept()
        else:
            event.ignore()
            self.hide()

    @Slot()
    def on_action_add_triggered(self):
        dialog = ReminderDialog(self)
        dialog.added.connect(self.add_to_schedule)
        dialog.exec_()

    @Slot()
    def on_action_quick_add_triggered(self):
        dialog = QuickDialog(self)
        dialog.added.connect(self.add_to_schedule)
        dialog.exec_()

    @Slot()
    def on_action_simple_add_triggered(self):
        dialog = SimpleDialog(self)
        dialog.added.connect(self.add_to_schedule)
        dialog.exec_()

    @Slot()
    def on_action_edit_triggered(self):
        (selected, is_parent) = self.get_selected()

        if not is_parent:
            dialog = ReminderDialog(self)
            dialog.edit(selected)
            dialog.added.connect(self.add_to_schedule)
            dialog.exec_()

    @Slot()
    def on_action_postpone_triggered(self):
        (selected, is_parent) = self.get_selected()
        if not is_parent:
            if self.info.postpone(selected):
                message = _("Sorry, you cannot postpone a repeating time.")
                QMessageBox.information(self, _("Postpone"), message,
                                        QMessageBox.Ok)

            self.update()

    @Slot()
    def on_action_delete_triggered(self):
        (selected, is_parent) = self.get_selected()
        if not is_parent:
            self.info.delete(selected)

            self.update()

    @Slot()
    def on_action_preferences_triggered(self):
        dialog = PreferencesDialog(self)
        dialog.update.connect(self.update)
        dialog.exec_()

    @Slot()
    def on_action_news_triggered(self):
        self.news_action.setText(_("News"))
        helpers.show_uri(blogsite)

    @Slot()
    def on_action_help_triggered(self):
        helpers.show_html_help("index")

    @Slot()
    def on_action_close_triggered(self):
        self.hide()

    @Slot()
    def on_action_quit_triggered(self):
        self.ok_to_close = True
        self.close()

    @Slot()
    def on_action_refresh_triggered(self):
        self.update_schedule()

    @Slot()
    def on_action_clear_icon_triggered(self):
        self.tray_icon.setIcon(self.tray_icons[self.info.indicator_icon])

        if self.dbus_service != None:
            logger.debug("emmiting dbus active signal")
            self.dbus_service.emitActive()

    @Slot()
    def on_action_bugs_triggered(self):
        helpers.show_uri(bugsite_qt)

    @Slot()
    def on_action_request_triggered(self):
        helpers.show_uri(featuresite_qt)

    @Slot()
    def on_action_translate_triggered(self):
        helpers.show_uri(translatesite)

    @Slot()
    def on_action_donate_triggered(self):
        helpers.show_uri(donatesite)

    @Slot()
    def on_action_ask_triggered(self):
        helpers.show_uri(questionsite_qt)

    @Slot()
    def on_action_website_triggered(self):
        helpers.show_uri(website_qt)

    @Slot()
    def on_action_about_triggered(self):
        dialog = AboutDialog(self)
        dialog.show()

    @Slot()
    def on_action_stop_triggered(self):
        logger.debug("stopping sound")
        self.scheduler.stop_sound()

        self.on_action_clear_icon_triggered()

    @Slot()
    def add_to_schedule(self, id):
        self.scheduler.add_reminder(id)
        self.update()

    @Slot()
    def update(self, update_icon=True):
        logger.debug("update")

        if self.setup_schedule:
            self.info.update(self.scheduler)
            self.setup_schedule = False
        else:
            self.info.update(None)

        if self.info.show_news == 1 and self.info.new_news == 1:
            self.news_action.setText(_("New News"))
        else:
            self.news_action.setText(_("News"))

        if self.info.hide_indicator:
            if self.tray_icon.isVisible():
                self.tray_icon.hide()
        else:
            if not self.tray_icon.isVisible():
                self.tray_icon.show()

        if update_icon:
            self.tray_icon.setIcon(self.tray_icons[self.info.indicator_icon])

        logger.debug("update: setting up headers")
        self.reminder_tree.clear()

        self.today = QTreeWidgetItem(self.reminder_tree,
                                     [_("Today's Reminders"), "", "", "", ""])
        today_brush = QBrush(Qt.SolidPattern)
        today_brush.setColor(
            QColor(self.info.today_color[0], self.info.today_color[1],
                   self.info.today_color[2]))
        for i in range(4):
            self.today.setBackground(i, today_brush)
        self.reminder_tree.addTopLevelItem(self.today)

        self.future = QTreeWidgetItem(self.reminder_tree,
                                      [_("Future Reminders"), "", "", "", ""])
        future_brush = QBrush(Qt.SolidPattern)
        future_brush.setColor(
            QColor(self.info.future_color[0], self.info.future_color[1],
                   self.info.future_color[2]))
        for i in range(4):
            self.future.setBackground(i, future_brush)
        self.reminder_tree.addTopLevelItem(self.future)

        self.past = QTreeWidgetItem(self.reminder_tree,
                                    [_("Past Reminders"), "", "", "", ""])
        past_brush = QBrush(Qt.SolidPattern)
        past_brush.setColor(
            QColor(self.info.past_color[0], self.info.past_color[1],
                   self.info.past_color[2]))
        for i in range(4):
            self.past.setBackground(i, past_brush)
        self.reminder_tree.addTopLevelItem(self.past)

        for reminder in self.info.reminder_list:
            parent = self.past
            if reminder.parent == self.info.today:
                parent = self.today
            elif reminder.parent == self.info.future:
                parent = self.future

            temp = QTreeWidgetItem(parent, reminder.qt())
            for i in range(4):
                temp.setToolTip(i, reminder.tooltip)

        self.reminder_tree.expandAll()

        logger.debug("update: done setting up tree")

        return True

    @Slot()
    def update_slot(self):
        self.update(False)

        return True

    @Slot()
    def update_schedule(self):
        self.setup_schedule = True
        self.scheduler.clear_schedule()

        logger.debug("updating the whole schedule")
        self.update()
        return True

    def get_selected(self):
        selected_items = self.reminder_tree.selectedItems()
        selected = selected_items[0]

        is_parent = False
        text = selected.text(0)
        if text == self.today.text(0) or text == self.future.text(
                0) or text == self.past.text(0):
            if selected.text(4) == "":  #id is "" only on the 3 parents
                is_parent = True

        if is_parent:
            return -1, is_parent
        else:
            return int(selected.text(4)), is_parent

    def dbus_receiver(self, command):
        logger.debug("received " + command + " signal from dbus")

        if command == "update":
            self.update_schedule()
        elif command == "stop":
            logger.debug("dbus: stopping sound...")
            self.on_action_stop_triggered()
        elif command == "manage":
            self.show()
        elif command == "close":
            self.ok_to_close = True
            self.close()
        elif command == "attention" or command == "active":
            pass  #don't do anything, we probably sent this signal
        else:
            logger.debug("unrecognized dbus command: " + command)