Beispiel #1
0
class MainWindowModel(QtCore.QObject):
    _ORIGINAL_FIT = 'action_original_fit'
    _VERTICAL_FIT = 'action_vertical_fit'
    _HORIZONTAL_FIT = 'action_horizontal_fit'
    _BEST_FIT = 'action_best_fit'

    load_progress = QtCore.Signal(int)
    load_done = QtCore.Signal()

    def __init__(self):
        QtCore.QObject.__init__(self)
        self.comic = None
        self.settings_manager = SettingsManager()
        self.rotate_angle = 0
        self.scroll_area_size = None
        self.fit_type = self.load_view_adjust(MainWindowModel._ORIGINAL_FIT)
        self.current_directory = self.load_current_directory()

        ext_list = ["*.cbr", "*.cbz", "*.rar", "*.zip", "*.tar", "*.cbt"]
        self.path_file_filter = PathFileFilter(ext_list)

    def save_recent_files(self, recent_files_list):
        self.settings_manager.save_recent_files(recent_files_list)

    def load_recent_files(self):
        return self.settings_manager.load_recent_files()

    def save_view_adjust(self, object_name):
        self.settings_manager.save_view_adjust(object_name)

    def load_view_adjust(self, default_object_name):
        return self.settings_manager.load_view_adjust(default_object_name)

    def save_current_directory(self, current_directory):
        self.settings_manager.save_current_directory(current_directory)

    def load_current_directory(self):
        return self.settings_manager.load_current_directory()

    def load(self, filename, initial_page=0):

        image_extensions = [
            '.bmp', '.jpg', '.jpeg', '.gif', '.png', '.pbm', '.pgm', '.ppm',
            '.tiff', '.xbm', '.xpm', '.webp'
        ]

        ld = LoaderFactory.create_loader(Utility.get_file_extension(filename),
                                         set(image_extensions))

        ld.progress.connect(self.load_progressbar_value)

        try:
            ld.load(filename)
        except NoDataFindException as excp:
            # Caso nao exista nenhuma imagem, carregamos a imagem indicando
            # erro
            from page import Page
            print excp.message
            q_file = QtCore.QFile(":/icons/notCover.png")
            q_file.open(QtCore.QIODevice.ReadOnly)
            ld.data.append(Page(q_file.readAll(), 'exit_red_1.png', 0))

        self.comic = Comic(Utility.get_base_name(filename),
                           Utility.get_dir_name(filename), initial_page)

        self.comic.pages = ld.data
        self.current_directory = Utility.get_dir_name(filename)
        self.path_file_filter.parse(filename)

    def save_current_page_image(self, file_name):
        self.get_current_page().save(file_name)

    def next_page(self):
        if self.comic:
            self.comic.go_next_page()

    def previous_page(self):
        if self.comic:
            self.comic.go_previous_page()

    def first_page(self):
        if self.comic:
            self.comic.go_first_page()

    def last_page(self):
        if self.comic:
            self.comic.go_last_page()

    def next_comic(self):
        return self.path_file_filter.next_path.decode('utf-8')

    def previous_comic(self):
        return self.path_file_filter.previous_path.decode('utf-8')

    def rotate_left(self):
        self.rotate_angle = (self.rotate_angle - 90) % 360

    def rotate_right(self):
        self.rotate_angle = (self.rotate_angle + 90) % 360

    def get_comic_name(self):
        return self.comic.name if self.comic else ''

    def get_comic_title(self):
        return self.comic.name + ' - Pynocchio Comic Reader'

    def get_current_page(self):
        if self.comic:
            pix_map = self.comic.get_current_page().pixmap
            pix_map = self._rotate_page(pix_map)
            pix_map = self._resize_page(pix_map)
            return pix_map

        return None

    def get_current_page_title(self):
        return self.comic.get_current_page_title() if self.comic else ''

    def set_current_page_index(self, idx):
        if self.comic:
            self.comic.set_current_page_index(idx)

    def get_current_page_index(self):
        return self.comic.current_page_index if self.comic else -1

    def is_first_page(self):
        if self.comic and self.comic.current_page_index == 0:
            return True
        return False

    def is_last_page(self):
        if self.comic and self.comic.current_page_index + 1 == \
                self.comic.get_number_of_pages():
            return True
        return False

    def is_firts_comic(self):
        return self.path_file_filter.is_first_file()

    def is_last_comic(self):
        return self.path_file_filter.is_last_file()

    def _rotate_page(self, pix_map):
        if self.rotate_angle != 0:
            trans = QtGui.QTransform().rotate(self.rotate_angle)
            pix_map = QtGui.QPixmap(pix_map.transformed(trans))
        return pix_map

    def _resize_page(self, pix_map):

        if self.fit_type == MainWindowModel._VERTICAL_FIT:
            pix_map = pix_map.scaledToHeight(self.scroll_area_size.height(),
                                             QtCore.Qt.SmoothTransformation)

        elif self.fit_type == MainWindowModel._HORIZONTAL_FIT:
            pix_map = pix_map.scaledToWidth(self.scroll_area_size.width(),
                                            QtCore.Qt.SmoothTransformation)

        elif self.fit_type == MainWindowModel._BEST_FIT:
            pix_map = pix_map.scaledToWidth(
                self.scroll_area_size.width() * 0.8,
                QtCore.Qt.SmoothTransformation)

        return pix_map

    def original_fit(self):
        self.fit_type = MainWindowModel._ORIGINAL_FIT

    def vertical_fit(self):
        self.fit_type = MainWindowModel._VERTICAL_FIT

    def horizontal_fit(self):
        self.fit_type = MainWindowModel._HORIZONTAL_FIT

    def best_fit(self):
        self.fit_type = MainWindowModel._BEST_FIT

    @QtCore.Slot(int)
    def load_progressbar_value(self, percent):
        self.load_progress.emit(percent)

    @QtCore.Slot()
    def load_progressbar_done(self):
        self.load_done.emit()

    def save_settings(self):
        self.save_view_adjust(self.fit_type)
        self.save_current_directory(self.current_directory)

    @staticmethod
    def get_bookmark_list(n):
        BookmarkManager.connect()
        bookmark_list = BookmarkManager.get_bookmarks(n)
        BookmarkManager.close()
        return bookmark_list

    def is_bookmark(self):
        BookmarkManager.connect()
        is_bookmark = BookmarkManager.is_bookmark(self.comic.get_path())
        BookmarkManager.close()
        return is_bookmark

    @staticmethod
    def get_bookmark_from_path(path):
        BookmarkManager.connect()
        bk = BookmarkManager.get_bookmark_by_path(path)
        BookmarkManager.close()
        return bk

    def add_bookmark(self):
        if self.comic:
            BookmarkManager.connect()
            BookmarkManager.add_bookmark(self.comic.name,
                                         self.comic.get_path(),
                                         self.comic.get_current_page_number(),
                                         self.comic.get_current_page().data)
            BookmarkManager.close()

    def remove_bookmark(self):
        if self.comic:
            BookmarkManager.connect()
            BookmarkManager.remove_bookmark(self.comic.get_path())
            BookmarkManager.close()
class MainWindowModel(QtCore.QObject):
    _ORIGINAL_FIT = 'action_original_fit'
    _VERTICAL_FIT = 'action_vertical_fit'
    _HORIZONTAL_FIT = 'action_horizontal_fit'
    _BEST_FIT = 'action_best_fit'

    load_progress = QtCore.Signal(int)
    load_done = QtCore.Signal()

    def __init__(self):
        QtCore.QObject.__init__(self)
        self.comic = None
        self.settings_manager = SettingsManager()
        self.rotate_angle = 0
        self.scroll_area_size = None
        self.fit_type = self.load_view_adjust(MainWindowModel._ORIGINAL_FIT)
        self.current_directory = self.load_current_directory()

        ext_list = ["*.cbr", "*.cbz", "*.rar", "*.zip", "*.tar", "*.cbt"]
        self.path_file_filter = PathFileFilter(ext_list)

    def save_recent_files(self, recent_files_list):
        self.settings_manager.save_recent_files(recent_files_list)

    def load_recent_files(self):
        return self.settings_manager.load_recent_files()

    def save_view_adjust(self, object_name):
        self.settings_manager.save_view_adjust(object_name)

    def load_view_adjust(self, default_object_name):
        return self.settings_manager.load_view_adjust(default_object_name)

    def save_current_directory(self, current_directory):
        self.settings_manager.save_current_directory(current_directory)

    def load_current_directory(self):
        return self.settings_manager.load_current_directory()

    def load(self, filename, initial_page=0):

        image_extensions = ['.bmp', '.jpg', '.jpeg', '.gif', '.png', '.pbm',
                            '.pgm', '.ppm', '.tiff', '.xbm', '.xpm', '.webp']

        loader = LoaderFactory.create_loader(
            Utility.get_file_extension(filename), set(image_extensions))

        loader.progress.connect(self.load_progressbar_value)

        try:
            loader.load(filename)
        except NoDataFindException as excp:
            # Caso nao exista nenhuma imagem, carregamos a imagem indicando
            # erro
            from page import Page
            print excp.message
            q_file = QtCore.QFile(":/icons/notCover.png")
            q_file.open(QtCore.QIODevice.ReadOnly)
            loader.data.append(Page(q_file.readAll(), 'exit_red_1.png', 0))

        self.comic = Comic(Utility.get_base_name(filename),
                           Utility.get_dir_name(filename), initial_page)

        self.comic.pages = loader.data
        self.current_directory = Utility.get_dir_name(filename)
        self.path_file_filter.parse(filename)

    def save_current_page_image(self, file_name):
        self.get_current_page().save(file_name)

    def next_page(self):
        if self.comic:
            self.comic.go_next_page()

    def previous_page(self):
        if self.comic:
            self.comic.go_previous_page()

    def first_page(self):
        if self.comic:
            self.comic.go_first_page()

    def last_page(self):
        if self.comic:
            self.comic.go_last_page()

    def next_comic(self):
        return self.path_file_filter.next_path.decode('utf-8')

    def previous_comic(self):
        return self.path_file_filter.previous_path.decode('utf-8')

    def rotate_left(self):
        self.rotate_angle = (self.rotate_angle - 90) % 360

    def rotate_right(self):
        self.rotate_angle = (self.rotate_angle + 90) % 360

    def get_comic_name(self):
        return self.comic.name if self.comic else ''

    def get_comic_title(self):
        return self.comic.name + ' - Pynocchio Comic Reader'

    def get_current_page(self):
        if self.comic:
            pix_map = self.comic.get_current_page().pixmap
            pix_map = self._rotate_page(pix_map)
            pix_map = self._resize_page(pix_map)
            return pix_map

        return None

    def get_current_page_title(self):
        return self.comic.get_current_page_title() if self.comic else ''

    def set_current_page_index(self, idx):
        if self.comic:
            self.comic.set_current_page_index(idx)

    def get_current_page_index(self):
        return self.comic.current_page_index if self.comic else -1

    def is_first_page(self):
        if self.comic and self.comic.current_page_index == 0:
            return True
        return False

    def is_last_page(self):
        if self.comic and self.comic.current_page_index + 1 == \
                self.comic.get_number_of_pages():
            return True
        return False

    def is_firts_comic(self):
        return self.path_file_filter.is_first_file()

    def is_last_comic(self):
        return self.path_file_filter.is_last_file()

    def _rotate_page(self, pix_map):
        if self.rotate_angle != 0:
            trans = QtGui.QTransform().rotate(self.rotate_angle)
            pix_map = QtGui.QPixmap(pix_map.transformed(trans))
        return pix_map

    def _resize_page(self, pix_map):

        if self.fit_type == MainWindowModel._VERTICAL_FIT:
            pix_map = pix_map.scaledToHeight(
                self.scroll_area_size.height(),
                QtCore.Qt.SmoothTransformation)

        elif self.fit_type == MainWindowModel._HORIZONTAL_FIT:
            pix_map = pix_map.scaledToWidth(
                self.scroll_area_size.width(),
                QtCore.Qt.SmoothTransformation)

        elif self.fit_type == MainWindowModel._BEST_FIT:
            pix_map = pix_map.scaledToWidth(
                self.scroll_area_size.width() * 0.8,
                QtCore.Qt.SmoothTransformation)

        return pix_map

    def original_fit(self):
        self.fit_type = MainWindowModel._ORIGINAL_FIT

    def vertical_fit(self):
        self.fit_type = MainWindowModel._VERTICAL_FIT

    def horizontal_fit(self):
        self.fit_type = MainWindowModel._HORIZONTAL_FIT

    def best_fit(self):
        self.fit_type = MainWindowModel._BEST_FIT

    @QtCore.Slot(int)
    def load_progressbar_value(self, percent):
        self.load_progress.emit(percent)

    @QtCore.Slot()
    def load_progressbar_done(self):
        self.load_done.emit()

    def save_settings(self):
        self.save_view_adjust(self.fit_type)
        self.save_current_directory(self.current_directory)

    @staticmethod
    def get_bookmark_list(qty):
        BookmarkManager.connect()
        bookmark_list = BookmarkManager.get_bookmarks(qty)
        BookmarkManager.close()
        return bookmark_list

    def is_bookmark(self):
        BookmarkManager.connect()
        is_bookmark = BookmarkManager.is_bookmark(self.comic.get_path())
        BookmarkManager.close()
        return is_bookmark

    @staticmethod
    def get_bookmark_from_path(path):
        BookmarkManager.connect()
        bookmark = BookmarkManager.get_bookmark_by_path(path)
        BookmarkManager.close()
        return bookmark

    def add_bookmark(self):
        if self.comic:
            BookmarkManager.connect()
            BookmarkManager.add_bookmark(self.comic.name,
                                         self.comic.get_path(),
                                         self.comic.get_current_page_number(),
                                         self.comic.get_current_page().data)
            BookmarkManager.close()

    def remove_bookmark(self):
        if self.comic:
            BookmarkManager.connect()
            BookmarkManager.remove_bookmark(self.comic.get_path())
            BookmarkManager.close()