Passed
Push — master ( 63399a...705b0f )
by Yoshihiro
02:57
created

NovelEditor.SP   A

Complexity

Total Complexity 22

Size/Duplication

Total Lines 206
Duplicated Lines 0 %

Test Coverage

Coverage 93.51%

Importance

Changes 0
Metric Value
eloc 100
dl 0
loc 206
ccs 72
cts 77
cp 0.9351
rs 10
c 0
b 0
f 0
wmc 22

9 Methods

Rating   Name   Duplication   Size   Complexity  
A SubfunctionProcessingClass.print_gif() 0 16 2
A SubfunctionProcessingClass.mouse_y_scroll() 0 13 3
A SubfunctionProcessingClass.update_line_numbers() 0 33 3
A SubfunctionProcessingClass.__init__() 0 3 1
A SubfunctionProcessingClass.mouse_image_scroll() 0 32 4
A SubfunctionProcessingClass.clear_btn_click() 0 15 2
A SubfunctionProcessingClass.change_setting() 0 14 1
A SubfunctionProcessingClass.btn_click() 0 28 2
A SubfunctionProcessingClass.resize_gif() 0 22 4
1
#!/usr/bin/env python3
2 1
import os
3 1
import shutil
4 1
import tkinter as tk
5 1
import tkinter.filedialog as filedialog
6
7 1
from PIL import Image, ImageTk
8
9
10 1
class SubfunctionProcessingClass():
11
    """補助機能のクラス.
12
13
    ・補助機能があるプログラム群
14
15
    Args:
16
        app (instance): MainProcessingClass のインスタンス
17
        tree_folder (list): ツリーフォルダの配列
18
    """
19 1
    def __init__(self, app, tree_folder):
20 1
        self.zoom = 0
21 1
        self.APP = app
22
23 1
    def mouse_y_scroll(self, event=None):
24
        """マウスホイール移動の設定.
25
26
        ・イメージキャンバスでマウスホイールを回したときにイメージキャンバス
27
        をスクロールする。
28
29
        Args:
30
            event (instance): tkinter.Event のインスタンス
31
        """
32 1
        if event.delta > 0:
33 1
            self.APP.image_space.yview_scroll(-1, 'units')
34 1
        elif event.delta < 0:
35 1
            self.APP.image_space.yview_scroll(1, 'units')
36
37 1
    def mouse_image_scroll(self, event=None):
38
        """Ctrl+マウスホイールの拡大縮小設定.
39
40
        ・イメージキャンバスでCtrl+マウスホイールを回したときに画像を
41
        拡大縮小する。
42
43
        Args:
44
            event (instance): tkinter.Event のインスタンス
45
        """
46 1
        curItem = self.APP.tree.focus()
47 1
        self.APP.lmc.select_list_item = self.APP.tree.item(curItem)["text"]
48 1
        title = "./data/image/{0}.txt".format(
49
            self.APP.lmc.select_list_item
50
        )
51 1
        f = open(title, 'r', encoding='utf-8')
52 1
        zoom = f.read()
53 1
        self.zoom = int(zoom)
54 1
        f.close()
55 1
        if event.delta > 0:
56 1
            self.zoom -= 5
57 1
            if self.zoom < 10:
58
                self.zoom = 10
59 1
        elif event.delta < 0:
60 1
            self.zoom += 5
61
62 1
        f = open(title, 'w', encoding='utf-8')
63 1
        f.write(str(self.zoom))
64 1
        f.close()
65 1
        self.APP.lmc.path_read_image(
66
                    'data/image',
67
                    self.APP.lmc.select_list_item,
68
                    self.zoom
69
                )
70
71 1
    def btn_click(self, event=None):
72
        """似顔絵ボタンを押したとき.
73
74
        ・似顔絵ボタンを押したときに画像イメージを似顔絵フレームに
75
        貼り付ける。
76
77
        Args:
78
            event (instance): tkinter.Event のインスタンス
79
        """
80 1
        fTyp = [(u"gif画像", ".gif")]
81 1
        iDir = os.path.abspath(os.path.dirname(__file__))
82 1
        self.APP.filepath = filedialog.askopenfilename(
83
            filetypes=fTyp,
84
            initialdir=iDir
85
        )
86 1
        if not self.APP.filepath == "":
87 1
            path, ___ = os.path.splitext(
88
                os.path.basename(self.APP.fmc.now_path)
89
            )
90 1
            ____, ext = os.path.splitext(os.path.basename(self.APP.filepath))
91 1
            title = shutil.copyfile(
92
                self.APP.filepath,
93
                "./data/character/{0}{1}".format(
94
                    path,
95
                    ext
96
                )
97
            )
98 1
            self.print_gif(title)
99
100 1
    def clear_btn_click(self, event=None):
101
        """消去ボタンをクリックしたとき.
102
103
        ・消去ボタンをクリックしたときに画像イメージから画像を
104
        削除する。
105
106
        Args:
107
            event (instance): tkinter.Event のインスタンス
108
        """
109 1
        files = "./data/character/{0}.gif".format(
110
            self.APP.lmc.select_list_item
111
        )
112 1
        if os.path.isfile(files):
113 1
            os.remove(files)
114 1
            self.APP.cv.delete("all")
115
116 1
    def resize_gif(self, im):
117
        """画像をリサイズ.
118
119
        ・イメージファイルを縦が長いときは縦を、横が長いときは横を、
120
        同じときは両方を150pxに設定する。
121
122
        Args:
123
            im (instance): イメージインスタンス
124
125
        Returns:
126
            instance: イメージインスタンス
127
        """
128 1
        resized_image = ""
129 1
        if im.size[0] == im.size[1]:
130
            resized_image = im.resize((150, 150))
131 1
        elif im.size[0] > im.size[1]:
132 1
            zoom = int(im.size[1] * 150 / im.size[0])
133 1
            resized_image = im.resize((150, zoom))
134
        elif im.size[0] < im.size[1]:
135
            zoom = int(im.size[0] * 200 / im.size[1])
136
            resized_image = im.resize((zoom, 200))
137 1
        return resized_image
138
139 1
    def print_gif(self, title):
140
        """gifを表示.
141
142
        ・似顔絵キャンバスに画像を張り付ける。
143
144
        Args:
145
            title (str): タイトル
146
        """
147
148 1
        if not title == "":
149 1
            giffile = Image.open(title)
150 1
            self.APP.cv.photo = ImageTk.PhotoImage(self.resize_gif(giffile))
151 1
            giffile.close()
152 1
            self.APP.cv.itemconfig(
153
                self.APP.image_on_canvas,
154
                image=self.APP.cv.photo
155
            )
156
157 1
    def change_setting(self, event=None):
158
        """テキストの変更時.
159
160
        ・テキストを変更したときに行番号とハイライトを変更する。
161
162
        Args:
163
            event (instance): tkinter.Event のインスタンス
164
        """
165 1
        self.update_line_numbers()
166
        # その行のハイライトを行う
167 1
        self.APP.hpc.line_highlight(
168
            self.APP.fpc.replacement_check,
169
            self.APP.fpc.find_text,
170
            self.APP.fpc.next_pos
171
        )
172
173 1
    def update_line_numbers(self, event=None):
174
        """行番号の描画.
175
176
        ・行番号をつけて表示する。
177
178
        Args:
179
            event (instance): tkinter.Event のインスタンス
180
        """
181
        # 現在の行番号を全て消す
182 1
        self.APP.line_numbers.delete(tk.ALL)
183
184
        # Textの0, 0座標、つまり一番左上が何行目にあたるかを取得
185 1
        i = self.APP.text.index("@0,0")
186 1
        while True:
187
            # dlineinfoは、その行がどの位置にあり、どんなサイズか、を返す
188
            # (3, 705, 197, 13, 18) のように帰る(x,y,width,height,baseline)
189 1
            dline = self.APP.text.dlineinfo(i)
190
            # dlineinfoに、存在しない行や、スクロールしないと見えない行を渡すとNoneが帰る
191 1
            if dline is None:
192 1
                break
193
            else:
194 1
                y = dline[1]  # y座標を取得
195
196
            # (x座標, y座標, 方向, 表示テキスト)を渡して行番号のテキストを作成
197 1
            linenum = str(i).split(".")[0]
198 1
            self.APP.line_numbers.create_text(
199
                3,
200
                y,
201
                anchor=tk.NW,
202
                text=linenum,
203
                font=("", 12)
204
            )
205
            i = self.APP.text.index("%s+1line" % i)
206