From 43b720724a065c3828901770a14994f85cd9d347 Mon Sep 17 00:00:00 2001 From: itdominator <1itdominator@gmail.com> Date: Tue, 25 Apr 2023 16:12:30 -0500 Subject: [PATCH] Added zooms, 1:1, and scal to container --- src/new-src/core/widgets/button_controls.py | 100 ++++++++++++---- src/new-src/core/widgets/image_view.py | 111 +++++++++++++----- src/new-src/utils/settings/settings.py | 2 + .../{mirage_blank.png => blank-image.png} | Bin .../share/mirage2/icons/flip-horizontal.png | Bin 0 -> 5719 bytes .../usr/share/mirage2/icons/flip-virtical.png | Bin 0 -> 5605 bytes .../{mirage2.png => icons/mirage2-64x64.png} | Bin .../usr/share/mirage2/icons/rotate-left.png | Bin 0 -> 5608 bytes .../usr/share/mirage2/icons/rotate-right.png | Bin 0 -> 5612 bytes .../usr/share/mirage2/icons/zoom-fit.png | Bin 0 -> 5405 bytes .../usr/share/mirage2/icons/zoom-in.png | Bin 0 -> 5068 bytes .../usr/share/mirage2/icons/zoom-original.png | Bin 0 -> 5128 bytes .../usr/share/mirage2/icons/zoom-out.png | Bin 0 -> 5071 bytes 13 files changed, 160 insertions(+), 53 deletions(-) rename user_config/usr/share/mirage2/icons/{mirage_blank.png => blank-image.png} (100%) create mode 100644 user_config/usr/share/mirage2/icons/flip-horizontal.png create mode 100644 user_config/usr/share/mirage2/icons/flip-virtical.png rename user_config/usr/share/mirage2/{mirage2.png => icons/mirage2-64x64.png} (100%) create mode 100644 user_config/usr/share/mirage2/icons/rotate-left.png create mode 100644 user_config/usr/share/mirage2/icons/rotate-right.png create mode 100644 user_config/usr/share/mirage2/icons/zoom-fit.png create mode 100644 user_config/usr/share/mirage2/icons/zoom-in.png create mode 100644 user_config/usr/share/mirage2/icons/zoom-original.png create mode 100644 user_config/usr/share/mirage2/icons/zoom-out.png diff --git a/src/new-src/core/widgets/button_controls.py b/src/new-src/core/widgets/button_controls.py index 1f12881..517615d 100644 --- a/src/new-src/core/widgets/button_controls.py +++ b/src/new-src/core/widgets/button_controls.py @@ -13,6 +13,9 @@ class ButtonControls(Gtk.ButtonBox): def __init__(self): super(ButtonControls, self).__init__() + self.one2one_button = None + self.fit_button = None + self._setup_styling() self._setup_signals() self._load_widgets() @@ -27,49 +30,96 @@ class ButtonControls(Gtk.ButtonBox): ... def _load_widgets(self): + icons_path = settings.get_icons_path() center_widget = Gtk.ButtonBox() - lrotate_button = Gtk.Button(label = "Rotate Left") - vflip_button = Gtk.Button(label = "Flip Vertical") - one2one_button = Gtk.ToggleButton(label = "1:1") - fit_button = Gtk.ToggleButton(label = "Fit") - hflip_button = Gtk.Button(label = "Flip Horizontal") - rrotate_button = Gtk.Button(label = "Rotate Right") - - center_widget.add(lrotate_button) - center_widget.add(vflip_button) - center_widget.add(one2one_button) - center_widget.add(fit_button) - center_widget.add(hflip_button) - center_widget.add(rrotate_button) - - lrotate_button.set_image( Gtk.Image.new_from_icon_name("gtk-undelete", 4) ) - vflip_button.set_image( Gtk.Image.new_from_icon_name("gtk-orientation-reverse-portrait", 4) ) - one2one_button.set_image( Gtk.Image.new_from_icon_name("gtk-zoom-100", 4) ) - fit_button.set_image( Gtk.Image.new_from_icon_name("gtk-zoom-fit", 4) ) - hflip_button.set_image( Gtk.Image.new_from_icon_name("gtk-orientation-reverse-landscape", 4) ) - rrotate_button.set_image( Gtk.Image.new_from_icon_name("object-rotate-right", 4) ) + zoomout_button = Gtk.Button() + lrotate_button = Gtk.Button() + vflip_button = Gtk.Button() + self.one2one_button = Gtk.ToggleButton() + self.fit_button = Gtk.ToggleButton() + hflip_button = Gtk.Button() + rrotate_button = Gtk.Button() + zoomin_button = Gtk.Button() # TODO: add if check against settings pull to set 1:1 or fit - one2one_button.set_active(True) + self.one2one_button.set_active(True) + self.fit_button.set_active(False) + zoomout_button.set_tooltip_text("Zoom Out") + lrotate_button.set_tooltip_text("Rotate Left") + vflip_button.set_tooltip_text("Flip Vertical") + self.one2one_button.set_tooltip_text("Zoom 1:1") + self.fit_button.set_tooltip_text("Zoom Fit") + hflip_button.set_tooltip_text("Flip Horizontal") + rrotate_button.set_tooltip_text("Rotate Right") + zoomin_button.set_tooltip_text("Zoom In") + + zoomout_button.set_image( Gtk.Image.new_from_file(f"{icons_path}/zoom-out.png") ) + lrotate_button.set_image( Gtk.Image.new_from_file(f"{icons_path}/rotate-left.png") ) + vflip_button.set_image( Gtk.Image.new_from_file(f"{icons_path}/flip-virtical.png") ) + self.one2one_button.set_image( Gtk.Image.new_from_file(f"{icons_path}/zoom-original.png") ) + self.fit_button.set_image( Gtk.Image.new_from_file(f"{icons_path}/zoom-fit.png") ) + hflip_button.set_image( Gtk.Image.new_from_file(f"{icons_path}/flip-horizontal.png") ) + rrotate_button.set_image( Gtk.Image.new_from_file(f"{icons_path}/rotate-right.png") ) + zoomin_button.set_image( Gtk.Image.new_from_file(f"{icons_path}/zoom-in.png") ) + + zoomout_button.set_always_show_image(True) + lrotate_button.set_always_show_image(True) + vflip_button.set_always_show_image(True) + self.one2one_button.set_always_show_image(True) + self.fit_button.set_always_show_image(True) + hflip_button.set_always_show_image(True) + rrotate_button.set_always_show_image(True) + zoomin_button.set_always_show_image(True) + + zoomout_button.connect("clicked", self._zoom_out) lrotate_button.connect("clicked", self._rotate_left) vflip_button.connect("clicked", self._vertical_flip) - one2one_button.connect("clicked", self._scale_1_two_1) - fit_button.connect("clicked", self._fit_to_container) + self.one2one_button.connect("button-release-event", self._scale_1_two_1) + self.fit_button.connect("button-release-event", self._fit_to_container) hflip_button.connect("clicked", self._horizontal_flip) rrotate_button.connect("clicked", self._rotate_right) + zoomin_button.connect("clicked", self._zoom_in) + + center_widget.add(zoomout_button) + center_widget.add(lrotate_button) + center_widget.add(vflip_button) + center_widget.add(self.one2one_button) + center_widget.add(self.fit_button) + center_widget.add(hflip_button) + center_widget.add(rrotate_button) + center_widget.add(zoomin_button) self.set_center_widget(center_widget) + def _zoom_out(self, widget = None, eve = None): + event_system.emit("zoom_out") + def _rotate_left(self, widget = None, eve = None): event_system.emit("rotate_left") + def _vertical_flip(self, widget = None, eve = None): event_system.emit("vertical_flip") + def _scale_1_two_1(self, widget = None, eve = None): - event_system.emit("scale_1_two_1") + if eve.button == 1: + self.fit_button.set_active(False) + self.one2one_button.set_active(True) + + event_system.emit("scale_1_two_1") + def _fit_to_container(self, widget = None, eve = None): - event_system.emit("fit_to_container") + if eve.button == 1: + self.one2one_button.set_active(False) + self.fit_button.set_active(True) + + event_system.emit("fit_to_container") + def _horizontal_flip(self, widget = None, eve = None): event_system.emit("horizontal_flip") + def _rotate_right(self, widget = None, eve = None): event_system.emit("rotate_right") + + def _zoom_in(self, widget = None, eve = None): + event_system.emit("zoom_in") diff --git a/src/new-src/core/widgets/image_view.py b/src/new-src/core/widgets/image_view.py index 12e44a7..7919f42 100644 --- a/src/new-src/core/widgets/image_view.py +++ b/src/new-src/core/widgets/image_view.py @@ -16,9 +16,10 @@ class ImageView(Gtk.Image): def __init__(self): super(ImageView, self).__init__() - self.bak_pixbuf = None - self.pixbuf = None - self.animation = None + self.pixbuf = None + self.work_pixbuf = None + self.animation = None + self.fit_to_win = False self._setup_styling() self._setup_signals() @@ -36,6 +37,7 @@ class ImageView(Gtk.Image): ... def _subscribe_to_events(self): + event_system.subscribe("zoom_out", self._zoom_out) event_system.subscribe("handle_file_from_dnd", self._handle_file_from_dnd) event_system.subscribe("vertical_flip", self._vertical_flip) event_system.subscribe("rotate_left", self._rotate_left) @@ -43,6 +45,7 @@ class ImageView(Gtk.Image): event_system.subscribe("fit_to_container", self._fit_to_container) event_system.subscribe("horizontal_flip", self._horizontal_flip) event_system.subscribe("rotate_right", self._rotate_right) + event_system.subscribe("zoom_in", self._zoom_in) def _load_widgets(self): ... @@ -55,9 +58,9 @@ class ImageView(Gtk.Image): logger.debug("Start animation stub...") def load_path(self, path): - self.bak_pixbuf = None - self.pixbuf = None - self.animation = None + self.pixbuf = None + self.work_pixbuf = None + self.animation = None if path.endswith(".gif"): try: @@ -68,40 +71,92 @@ class ImageView(Gtk.Image): return try: - self.pixbuf = Gtk.Image.new_from_file(path).get_pixbuf() + self.work_pixbuf = Gtk.Image.new_from_file(path).get_pixbuf() except Exception: - self.pixbuf = Gtk.Image.new_from_resource(path).get_pixbuf() + self.work_pixbuf = Gtk.Image.new_from_resource(path).get_pixbuf() + + self.pixbuf = self.work_pixbuf + self.set_from_pixbuf(self.work_pixbuf) + + if self.fit_to_win: + self._fit_to_container() - self.bak_pixbuf = self.pixbuf - self.set_from_pixbuf(self.pixbuf) event_system.emit("update_path_label", (path,)) + + def _zoom_out(self): + if self.work_pixbuf: + # TODO: Setup scale factor setting to pull from settings... + stepx = self.work_pixbuf.get_width() * 0.05 + stepy = self.work_pixbuf.get_height() * 0.05 + + w = self.work_pixbuf.get_width() - stepx + h = self.work_pixbuf.get_height() - stepy + + self.work_pixbuf = self.pixbuf.scale_simple(w, h, 2) # 2 = BILINEAR and is best by default + self.set_from_pixbuf(self.work_pixbuf) + def _rotate_left(self): - if self.pixbuf: - self.pixbuf = self.pixbuf.rotate_simple(GdkPixbuf.PixbufRotation.COUNTERCLOCKWISE) - self.set_from_pixbuf(self.pixbuf) + if self.work_pixbuf: + self.work_pixbuf = self.work_pixbuf.rotate_simple(GdkPixbuf.PixbufRotation.COUNTERCLOCKWISE) + self.pixbuf = self.pixbuf.rotate_simple(GdkPixbuf.PixbufRotation.COUNTERCLOCKWISE) + self.set_from_pixbuf(self.work_pixbuf) def _vertical_flip(self): - if self.pixbuf: - self.pixbuf = self.pixbuf.flip(False) - self.set_from_pixbuf(self.pixbuf) + if self.work_pixbuf: + self.work_pixbuf = self.work_pixbuf.flip(False) + self.set_from_pixbuf(self.work_pixbuf) def _scale_1_two_1(self): - if self.pixbuf: - ... - ... + self.fit_to_win = False + if self.work_pixbuf: + self.work_pixbuf = self.pixbuf + self.set_from_pixbuf(self.work_pixbuf) def _fit_to_container(self): - if self.pixbuf: - ... - ... + self.fit_to_win = True + if self.work_pixbuf: + parent_aloc = self.get_parent().get_parent().get_allocation() + pw = parent_aloc.width + ph = parent_aloc.height + iw = self.pixbuf.get_width() + ih = self.pixbuf.get_height() + w = 0 + h = 0 + + if iw == 0 or ih == 0: + return + + w = pw; + h = ((ih * w) / iw + 0.5) + + if h > ph: + h = ph + w = (iw * h) / ih + 0.5 + + + self.work_pixbuf = self.pixbuf.scale_simple(w, h, 2) # 2 = BILINEAR and is best by default + self.set_from_pixbuf(self.work_pixbuf) def _horizontal_flip(self): - if self.pixbuf: - self.pixbuf = self.pixbuf.flip(True) - self.set_from_pixbuf(self.pixbuf) + if self.work_pixbuf: + self.work_pixbuf = self.work_pixbuf.flip(True) + self.set_from_pixbuf(self.work_pixbuf) def _rotate_right(self): - if self.pixbuf: - self.pixbuf = self.pixbuf.rotate_simple(GdkPixbuf.PixbufRotation.CLOCKWISE) - self.set_from_pixbuf(self.pixbuf) + if self.work_pixbuf: + self.work_pixbuf = self.work_pixbuf.rotate_simple(GdkPixbuf.PixbufRotation.CLOCKWISE) + self.pixbuf = self.pixbuf.rotate_simple(GdkPixbuf.PixbufRotation.CLOCKWISE) + self.set_from_pixbuf(self.work_pixbuf) + + def _zoom_in(self): + if self.work_pixbuf: + # TODO: Setup scale factor setting to pull from settings... + stepx = self.work_pixbuf.get_width() * 0.05 + stepy = self.work_pixbuf.get_height() * 0.05 + + w = self.work_pixbuf.get_width() + stepx + h = self.work_pixbuf.get_height() + stepy + + self.work_pixbuf = self.pixbuf.scale_simple(w, h, 2) # 2 = BILINEAR and is best by default + self.set_from_pixbuf(self.work_pixbuf) diff --git a/src/new-src/utils/settings/settings.py b/src/new-src/utils/settings/settings.py index fed522c..279282e 100644 --- a/src/new-src/utils/settings/settings.py +++ b/src/new-src/utils/settings/settings.py @@ -143,6 +143,8 @@ class Settings(StartCheckMixin, Singleton): def get_window_icon(self) -> str: return self._WINDOW_ICON def get_home_path(self) -> str: return self._USER_HOME + + def get_icons_path(self) -> str: return self._DEFAULT_ICONS def get_thumbnail_with(self) -> int: return self._config["thumbnail_with"] def get_thumbnail_height(self) -> int: return self._config["thumbnail_height"] def get_max_ring_thumbnail_list(self) -> int: return self._config["max_ring_thumbnail_list"] diff --git a/user_config/usr/share/mirage2/icons/mirage_blank.png b/user_config/usr/share/mirage2/icons/blank-image.png similarity index 100% rename from user_config/usr/share/mirage2/icons/mirage_blank.png rename to user_config/usr/share/mirage2/icons/blank-image.png diff --git a/user_config/usr/share/mirage2/icons/flip-horizontal.png b/user_config/usr/share/mirage2/icons/flip-horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..0ad31b57bbe1ce93419754345f2b9ae32af7db2e GIT binary patch literal 5719 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 J6}yDQ{|Efdmj(a; literal 0 HcmV?d00001 diff --git a/user_config/usr/share/mirage2/mirage2.png b/user_config/usr/share/mirage2/icons/mirage2-64x64.png similarity index 100% rename from user_config/usr/share/mirage2/mirage2.png rename to user_config/usr/share/mirage2/icons/mirage2-64x64.png diff --git a/user_config/usr/share/mirage2/icons/rotate-left.png b/user_config/usr/share/mirage2/icons/rotate-left.png new file mode 100644 index 0000000000000000000000000000000000000000..8afe1939f50a433358b890ce39ab2f5437242d7d GIT binary patch literal 5608 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 G`u_r)yrUZc literal 0 HcmV?d00001 diff --git a/user_config/usr/share/mirage2/icons/rotate-right.png b/user_config/usr/share/mirage2/icons/rotate-right.png new file mode 100644 index 0000000000000000000000000000000000000000..8b9683cfa41d7d0ca98b36ea77b659b90f7bbdbd GIT binary patch literal 5612 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 SG#H8+=IZF_P_|@U{C@xr@1M*7 literal 0 HcmV?d00001 diff --git a/user_config/usr/share/mirage2/icons/zoom-fit.png b/user_config/usr/share/mirage2/icons/zoom-fit.png new file mode 100644 index 0000000000000000000000000000000000000000..60929a4254e27e94d91e33adc55138b7ea778d1b GIT binary patch literal 5405 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 L26z-Nh)nq}7>^}0 literal 0 HcmV?d00001 diff --git a/user_config/usr/share/mirage2/icons/zoom-in.png b/user_config/usr/share/mirage2/icons/zoom-in.png new file mode 100644 index 0000000000000000000000000000000000000000..9b70554360eba4484c79a86509437f195ec93d63 GIT binary patch literal 5068 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 literal 0 HcmV?d00001 diff --git a/user_config/usr/share/mirage2/icons/zoom-out.png b/user_config/usr/share/mirage2/icons/zoom-out.png new file mode 100644 index 0000000000000000000000000000000000000000..6d1dcdeeecab3bf07980a38720e52dcc6319bc7f GIT binary patch literal 5071 zcmeHKc~leU77s-Nq9~}PfTAI`0_tQBBq2d)fRI8o1zPsjVP=3KE6G5@;#P2hY8C7L zK%rnuTLBS8e6$FHQqflHa#R+ZK3Z{CiWO0*?@K_6r#~p{a*&1wMSyRL`LZK}Pknaw0}{#FlpPgAM8F1$R;NkEl^BJ{(qa_M zh$oXs#?Go}#kpRu$xqLCKeXGHA24g}+Alk2-tIr#@=0G<@y?U2pTFjkf1z@V0F&y+;fQXh0xd)+C_KRmJX^g_&zz{#FAo^5T-e=rj&jEnd8jf!&S#T&O9ZA6W2Xnd2^3_ zPp$63^`V9w^wa>2I(6|B$rGZx$Upo$c$hIXOITF^cg`xcxjuQFhuH6(x0yj1!CnXV(rordP|1lULT<+eyhOFve%y+mhMUqa!BR9#TRdw;qK-KO%J#yQPlHu7}8zKKI`qKF`E&y8CnQt;8)U zS$m%7A9(RUwel}AZo9E2_?tlCxA=|X!GhL(UfykeZ3sDW)1#tW2To~p3xO*Aw~%vWJMZ*kT-wNtlk%C~cU zZ;O1*YOg9c?|Bgi=M3DR%KzidBdBg`^LMo??W00Jne%k&a)aWUr)PJCe6n5B<%jKd zXKN>M(&~qoDZ4gIZ+ z7|diN4rXtREL?zSR5TdXBw;k8N(*K)i6mTP)WV1YBPdB&3a%DW?=>E!QgBp6jpoW2 zGOZX(#Y3}oSY-C%C?s2f@KNd_e|w=(002}N0aJ`BrCKjAil`P`0k}7d=~RkEg;0p7 zF)}$ttkGc<4vj-&K*2^llSTEnrwDauvLGTTWE28CiKwXrp%u{S27`fSVAC|Z6grd7 z=hGQ1I*SDX4M?A*CSW6^*3UIVj9>&|dPIk730$M5m@(lbO$H&NQo%aqd3-9ZOg09u z){n9P_@EnMEuBeY&{Zn>cndudoC!ci1NvJFeH8c!qeozRO@Va403oa#6nS9K`OhF2+(pszl*)M1kc=DfQy%3vu#gfkWK!Eue z?hD$_bGIl1EtyOZq(L&w;You;RI`5pszGp6V7c{4hPeor$%0S@8-_SAiwD6;OkW80 z;W1fEn8)EGjB!v>wVr_02xf)?;4~cIusOac?8{1meAs*x;&8aW5YLClfP66&!7zm9 zi*n&{5KDA8s7hElJ}NU53ZRleCoYJCR`9Gmx`z?+DPCQiChU2$-qEF4ae0P#y?e~a1|Cwz-Bg? zK0FqPp2_2~eAqnph$D;j`(If4T>jc{V#2E z^H78%TONw*f&VOvXr!YevGkFrkw+zNX(bB9(i8$18A(A8XJV)&PJlJCgrvgi6bwv{ z(QpUFocl+R#89EJ}If>BUcFvo|3usEnMf{u_hhOXBn69!m^1*QNV z0au_rEnHE&EF0zhVl0MK%)ASLFo?l{{z@2qG-0}VW<1YWNdF5bLW{zl@Q=wAGjE+~{&PF{-NS9HCi>!lcYDdkty^@^^SV&J8eUsc!tjV}8? zk5iZ${0lOG!_w6^e{2H>Epk$rB#0Dfe&3EvFaXI!ZD_2XM4B|+d|8op6}teTEg_W! z+xAUxb>iBbZER)&QGzrmFe;`MS?Y3QrBh<_q14}3#Kko<(ziH$VV$bt`$!n)x^#qu z;Xt^#WHeV=hqyCtlAI$>sUxh)re$*M$t&DSGa$a3P5BhdI=R~_?+b(_Ppo^FM9PbC W+u3^c*L>iIBn@61RQ>kSkNykzvWE)* literal 0 HcmV?d00001