Skip to content

Commit 1c36764

Browse files
authored
add card big picture (Fluorohydride#2307)
1 parent d1c09cb commit 1c36764

File tree

8 files changed

+174
-2
lines changed

8 files changed

+174
-2
lines changed

gframe/deck_con.cpp

Lines changed: 92 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,52 @@ static bool check_set_code(const CardDataC& data, int set_code) {
5858
return res;
5959
}
6060

61+
inline void ShowBigCard(int code, float zoom) {
62+
mainGame->deckBuilder.bigcard_code = code;
63+
mainGame->deckBuilder.bigcard_zoom = zoom;
64+
ITexture* img = imageManager.GetBigPicture(code, zoom);
65+
mainGame->imgBigCard->setImage(img);
66+
auto size = img->getSize();
67+
s32 left = mainGame->window_size.Width / 2 - size.Width / 2;
68+
s32 top = mainGame->window_size.Height / 2 - size.Height / 2;
69+
mainGame->imgBigCard->setRelativePosition(recti(0, 0, size.Width, size.Height));
70+
mainGame->wBigCard->setRelativePosition(recti(left, top, left + size.Width, top + size.Height));
71+
mainGame->gMutex.lock();
72+
mainGame->btnBigCardOriginalSize->setVisible(true);
73+
mainGame->btnBigCardZoomIn->setVisible(true);
74+
mainGame->btnBigCardZoomOut->setVisible(true);
75+
mainGame->btnBigCardClose->setVisible(true);
76+
mainGame->ShowElement(mainGame->wBigCard);
77+
mainGame->env->getRootGUIElement()->bringToFront(mainGame->wBigCard);
78+
mainGame->gMutex.unlock();
79+
}
80+
inline void ZoomBigCard(s32 centerx = -1, s32 centery = -1) {
81+
if(mainGame->deckBuilder.bigcard_zoom >= 4)
82+
mainGame->deckBuilder.bigcard_zoom = 4;
83+
if(mainGame->deckBuilder.bigcard_zoom <= 0.2)
84+
mainGame->deckBuilder.bigcard_zoom = 0.2;
85+
ITexture* img = imageManager.GetBigPicture(mainGame->deckBuilder.bigcard_code, mainGame->deckBuilder.bigcard_zoom);
86+
mainGame->imgBigCard->setImage(img);
87+
auto size = img->getSize();
88+
auto pos = mainGame->wBigCard->getRelativePosition();
89+
if(centerx == -1) {
90+
centerx = pos.UpperLeftCorner.X + pos.getWidth() / 2;
91+
centery = pos.UpperLeftCorner.Y + pos.getHeight() * 0.444f;
92+
}
93+
float posx = (float)(centerx - pos.UpperLeftCorner.X) / pos.getWidth();
94+
float posy = (float)(centery - pos.UpperLeftCorner.Y) / pos.getHeight();
95+
s32 left = centerx - size.Width * posx;
96+
s32 top = centery - size.Height * posy;
97+
mainGame->imgBigCard->setRelativePosition(recti(0, 0, size.Width, size.Height));
98+
mainGame->wBigCard->setRelativePosition(recti(left, top, left + size.Width, top + size.Height));
99+
}
100+
inline void CloseBigCard() {
101+
mainGame->HideElement(mainGame->wBigCard);
102+
mainGame->btnBigCardOriginalSize->setVisible(false);
103+
mainGame->btnBigCardZoomIn->setVisible(false);
104+
mainGame->btnBigCardZoomOut->setVisible(false);
105+
mainGame->btnBigCardClose->setVisible(false);
106+
}
61107
void DeckBuilder::Initialize() {
62108
mainGame->is_building = true;
63109
mainGame->is_siding = false;
@@ -99,6 +145,11 @@ void DeckBuilder::Terminate() {
99145
mainGame->wCardImg->setVisible(false);
100146
mainGame->wInfos->setVisible(false);
101147
mainGame->btnLeaveGame->setVisible(false);
148+
mainGame->wBigCard->setVisible(false);
149+
mainGame->btnBigCardOriginalSize->setVisible(false);
150+
mainGame->btnBigCardZoomIn->setVisible(false);
151+
mainGame->btnBigCardZoomOut->setVisible(false);
152+
mainGame->btnBigCardClose->setVisible(false);
102153
mainGame->PopupElement(mainGame->wMainMenu);
103154
mainGame->device->setEventReceiver(&mainGame->menuHandler);
104155
mainGame->wACMessage->setVisible(false);
@@ -254,6 +305,24 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
254305
deckManager.LoadDeck(mainGame->cbDeckSelect->getItem(mainGame->cbDeckSelect->getSelected()));
255306
break;
256307
}
308+
case BUTTON_BIG_CARD_ORIG_SIZE: {
309+
ShowBigCard(bigcard_code, 1);
310+
break;
311+
}
312+
case BUTTON_BIG_CARD_ZOOM_IN: {
313+
bigcard_zoom += 0.2;
314+
ZoomBigCard();
315+
break;
316+
}
317+
case BUTTON_BIG_CARD_ZOOM_OUT: {
318+
bigcard_zoom -= 0.2;
319+
ZoomBigCard();
320+
break;
321+
}
322+
case BUTTON_BIG_CARD_CLOSE: {
323+
CloseBigCard();
324+
break;
325+
}
257326
case BUTTON_MSG_OK: {
258327
mainGame->HideElement(mainGame->wMessage);
259328
mainGame->actionSignal.Set();
@@ -531,6 +600,11 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
531600
}
532601
case irr::EMIE_LMOUSE_LEFT_UP: {
533602
is_starting_dragging = false;
603+
irr::gui::IGUIElement* root = mainGame->env->getRootGUIElement();
604+
if(!is_draging && !mainGame->is_siding && root->getElementFromPoint(mouse_pos) == mainGame->imgCard) {
605+
ShowBigCard(mainGame->showingcode, 1);
606+
break;
607+
}
534608
if(!is_draging)
535609
break;
536610
soundManager.PlaySoundEffect(SOUND_CARD_DROP);
@@ -554,6 +628,14 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
554628
is_draging = false;
555629
break;
556630
}
631+
case irr::EMIE_LMOUSE_DOUBLE_CLICK: {
632+
irr::gui::IGUIElement* root = mainGame->env->getRootGUIElement();
633+
if(!is_draging && !mainGame->is_siding && root->getElementFromPoint(mouse_pos) == root && hovered_code) {
634+
ShowBigCard(hovered_code, 1);
635+
break;
636+
}
637+
break;
638+
}
557639
case irr::EMIE_RMOUSE_LEFT_UP: {
558640
if(mainGame->is_siding) {
559641
if(is_draging)
@@ -576,6 +658,10 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
576658
}
577659
break;
578660
}
661+
if(mainGame->wBigCard->isVisible()) {
662+
CloseBigCard();
663+
break;
664+
}
579665
if(mainGame->wCategories->isVisible() || mainGame->wQuery->isVisible())
580666
break;
581667
if(!is_draging) {
@@ -658,11 +744,16 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
658744
break;
659745
}
660746
case irr::EMIE_MOUSE_WHEEL: {
747+
irr::gui::IGUIElement* root = mainGame->env->getRootGUIElement();
748+
if(root->getElementFromPoint(mouse_pos) == mainGame->imgBigCard) {
749+
bigcard_zoom += 0.1f * event.MouseInput.Wheel;
750+
ZoomBigCard(mouse_pos.X, mouse_pos.Y);
751+
break;
752+
}
661753
if(!mainGame->scrFilter->isVisible())
662754
break;
663755
if(mainGame->env->hasFocus(mainGame->scrFilter))
664756
break;
665-
irr::gui::IGUIElement* root = mainGame->env->getRootGUIElement();
666757
if(root->getElementFromPoint(mouse_pos) != root)
667758
break;
668759
if(event.MouseInput.Wheel < 0) {

gframe/deck_con.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ class DeckBuilder: public irr::IEventReceiver {
5656
bool is_starting_dragging;
5757
int dragx;
5858
int dragy;
59+
int bigcard_code;
60+
float bigcard_zoom;
5961
size_t pre_mainc;
6062
size_t pre_extrac;
6163
size_t pre_sidec;

gframe/event_handler.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1794,10 +1794,14 @@ bool ClientField::OnCommonEvent(const irr::SEvent& event) {
17941794
mainGame->SetCursor(event.GUIEvent.Caller->isEnabled() ? ECI_IBEAM : ECI_NORMAL);
17951795
return true;
17961796
}
1797+
if(event.GUIEvent.Caller == mainGame->imgCard && mainGame->is_building && !mainGame->is_siding) {
1798+
mainGame->SetCursor(ECI_HAND);
1799+
return true;
1800+
}
17971801
break;
17981802
}
17991803
case irr::gui::EGET_ELEMENT_LEFT: {
1800-
if(event.GUIEvent.Caller->getType() == EGUIET_EDIT_BOX) {
1804+
if(event.GUIEvent.Caller->getType() == EGUIET_EDIT_BOX || event.GUIEvent.Caller == mainGame->imgCard) {
18011805
mainGame->SetCursor(ECI_NORMAL);
18021806
return true;
18031807
}

gframe/game.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -731,6 +731,23 @@ bool Game::Initialize() {
731731
//cancel or finish
732732
btnCancelOrFinish = env->addButton(rect<s32>(205, 230, 295, 265), 0, BUTTON_CANCEL_OR_FINISH, dataManager.GetSysString(1295));
733733
btnCancelOrFinish->setVisible(false);
734+
//big picture
735+
wBigCard = env->addWindow(rect<s32>(0, 0, 0, 0), false, L"");
736+
wBigCard->getCloseButton()->setVisible(false);
737+
wBigCard->setDrawTitlebar(false);
738+
wBigCard->setDrawBackground(false);
739+
wBigCard->setVisible(false);
740+
imgBigCard = env->addImage(rect<s32>(0, 0, 0, 0), wBigCard);
741+
imgBigCard->setScaleImage(false);
742+
imgBigCard->setUseAlphaChannel(true);
743+
btnBigCardOriginalSize = env->addButton(rect<s32>(205, 100, 295, 135), 0, BUTTON_BIG_CARD_ORIG_SIZE, dataManager.GetSysString(1443));
744+
btnBigCardZoomIn = env->addButton(rect<s32>(205, 140, 295, 175), 0, BUTTON_BIG_CARD_ZOOM_IN, dataManager.GetSysString(1441));
745+
btnBigCardZoomOut = env->addButton(rect<s32>(205, 180, 295, 215), 0, BUTTON_BIG_CARD_ZOOM_OUT, dataManager.GetSysString(1442));
746+
btnBigCardClose = env->addButton(rect<s32>(205, 230, 295, 265), 0, BUTTON_BIG_CARD_CLOSE, dataManager.GetSysString(1440));
747+
btnBigCardOriginalSize->setVisible(false);
748+
btnBigCardZoomIn->setVisible(false);
749+
btnBigCardZoomOut->setVisible(false);
750+
btnBigCardClose->setVisible(false);
734751
//leave/surrender/exit
735752
btnLeaveGame = env->addButton(rect<s32>(205, 5, 295, 80), 0, BUTTON_LEAVE_GAME, L"");
736753
btnLeaveGame->setVisible(false);
@@ -1723,6 +1740,11 @@ void Game::OnResize() {
17231740
btnChainWhenAvail->setRelativePosition(Resize(205, 180, 295, 215));
17241741
btnShuffle->setRelativePosition(Resize(205, 230, 295, 265));
17251742
btnCancelOrFinish->setRelativePosition(Resize(205, 230, 295, 265));
1743+
1744+
btnBigCardOriginalSize->setRelativePosition(Resize(205, 100, 295, 135));
1745+
btnBigCardZoomIn->setRelativePosition(Resize(205, 140, 295, 175));
1746+
btnBigCardZoomOut->setRelativePosition(Resize(205, 180, 295, 215));
1747+
btnBigCardClose->setRelativePosition(Resize(205, 230, 295, 265));
17261748
}
17271749
recti Game::Resize(s32 x, s32 y, s32 x2, s32 y2) {
17281750
x = x * xScale;

gframe/game.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,13 @@ class Game {
540540
irr::gui::IGUIButton* btnChainWhenAvail;
541541
//cancel or finish
542542
irr::gui::IGUIButton* btnCancelOrFinish;
543+
//big picture
544+
irr::gui::IGUIWindow* wBigCard;
545+
irr::gui::IGUIImage* imgBigCard;
546+
irr::gui::IGUIButton* btnBigCardOriginalSize;
547+
irr::gui::IGUIButton* btnBigCardZoomIn;
548+
irr::gui::IGUIButton* btnBigCardZoomOut;
549+
irr::gui::IGUIButton* btnBigCardClose;
543550
};
544551

545552
extern Game* mainGame;
@@ -728,6 +735,10 @@ extern Game* mainGame;
728735
#define CHECKBOX_MULTI_KEYWORDS 372
729736
#define CHECKBOX_PREFER_EXPANSION 373
730737
#define CHECKBOX_DRAW_SINGLE_CHAIN 374
738+
#define BUTTON_BIG_CARD_CLOSE 380
739+
#define BUTTON_BIG_CARD_ZOOM_IN 381
740+
#define BUTTON_BIG_CARD_ZOOM_OUT 382
741+
#define BUTTON_BIG_CARD_ORIG_SIZE 383
731742

732743
#define DEFAULT_DUEL_RULE 5
733744

gframe/image_manager.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ bool ImageManager::Initial() {
1515
tUnknown = NULL;
1616
tUnknownFit = NULL;
1717
tUnknownThumb = NULL;
18+
tBigPicture = NULL;
1819
tLoading = NULL;
1920
tThumbLoadingThreadRunning = false;
2021
tAct = driver->getTexture("textures/act.png");
@@ -60,6 +61,10 @@ void ImageManager::ClearTexture() {
6061
if(tit->second && tit->second != tLoading)
6162
driver->removeTexture(tit->second);
6263
}
64+
if(tBigPicture != NULL) {
65+
driver->removeTexture(tBigPicture);
66+
tBigPicture = NULL;
67+
}
6368
tMap[0].clear();
6469
tMap[1].clear();
6570
tThumb.clear();
@@ -246,6 +251,37 @@ irr::video::ITexture* ImageManager::GetTexture(int code, bool fit) {
246251
else
247252
return mainGame->gameConf.use_image_scale ? (fit ? tUnknownFit : tUnknown) : GetTextureThumb(code);
248253
}
254+
irr::video::ITexture* ImageManager::GetBigPicture(int code, float zoom) {
255+
if(code == 0)
256+
return tUnknown;
257+
if(tBigPicture != NULL) {
258+
driver->removeTexture(tBigPicture);
259+
tBigPicture = NULL;
260+
}
261+
irr::video::ITexture* texture;
262+
char file[256];
263+
sprintf(file, "expansions/pics/%d.jpg", code);
264+
irr::video::IImage* srcimg = driver->createImageFromFile(file);
265+
if(srcimg == NULL) {
266+
sprintf(file, "pics/%d.jpg", code);
267+
srcimg = driver->createImageFromFile(file);
268+
}
269+
if(srcimg == NULL) {
270+
return tUnknown;
271+
}
272+
if(zoom == 1) {
273+
texture = driver->addTexture(file, srcimg);
274+
} else {
275+
auto origsize = srcimg->getDimension();
276+
video::IImage* destimg = driver->createImage(srcimg->getColorFormat(), irr::core::dimension2d<u32>(origsize.Width * zoom, origsize.Height * zoom));
277+
imageScaleNNAA(srcimg, destimg);
278+
texture = driver->addTexture(file, destimg);
279+
destimg->drop();
280+
}
281+
srcimg->drop();
282+
tBigPicture = texture;
283+
return texture;
284+
}
249285
int ImageManager::LoadThumbThread() {
250286
while(true) {
251287
imageManager.tThumbLoadingMutex.lock();

gframe/image_manager.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class ImageManager {
1717
void ResizeTexture();
1818
irr::video::ITexture* GetTextureFromFile(const char* file, s32 width, s32 height);
1919
irr::video::ITexture* GetTexture(int code, bool fit = false);
20+
irr::video::ITexture* GetBigPicture(int code, float zoom);
2021
irr::video::ITexture* GetTextureThumb(int code);
2122
irr::video::ITexture* GetTextureField(int code);
2223
static int LoadThumbThread();
@@ -34,6 +35,7 @@ class ImageManager {
3435
irr::video::ITexture* tUnknown;
3536
irr::video::ITexture* tUnknownFit;
3637
irr::video::ITexture* tUnknownThumb;
38+
irr::video::ITexture* tBigPicture;
3739
irr::video::ITexture* tLoading;
3840
irr::video::ITexture* tAct;
3941
irr::video::ITexture* tAttack;

strings.conf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,10 @@
456456
!system 1429 选择的位置不符合条件。
457457
!system 1430 选择的表示形式不符合条件。
458458
!system 1431 选择的指示物不符合条件。
459+
!system 1440 关闭大图
460+
!system 1441 放大
461+
!system 1442 缩小
462+
!system 1443 原始尺寸
459463
!system 1500 决斗结束。
460464
!system 1501 录像结束。
461465
!system 1502 连接已断开。

0 commit comments

Comments
 (0)