Test Failed
Push — master ( 705b0f...728f1f )
by Yoshihiro
03:24
created

neditor.sp   A

Complexity

Total Complexity 22

Size/Duplication

Total Lines 204
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 99
dl 0
loc 204
rs 10
c 0
b 0
f 0
wmc 22

9 Methods

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